From a4361c5733aba566a32b9ee13e9369aa5bc086b5 Mon Sep 17 00:00:00 2001 From: vasilito Date: Tue, 30 Jun 2026 14:31:04 +0300 Subject: [PATCH] Add GUI source: Qt5, GTK3 with premium branding (#2d8e57) --- src/gui/Core/hiperiso_crc32.c | 299 + src/gui/Core/hiperiso_define.h | 190 + src/gui/Core/hiperiso_disk.c | 779 + src/gui/Core/hiperiso_disk.h | 145 + src/gui/Core/hiperiso_json.c | 718 + src/gui/Core/hiperiso_json.h | 268 + src/gui/Core/hiperiso_log.c | 145 + src/gui/Core/hiperiso_md5.c | 167 + src/gui/Core/hiperiso_util.c | 646 + src/gui/Core/hiperiso_util.h | 57 + src/gui/GTK/hiperiso_gtk.c | 1510 ++ src/gui/GTK/hiperiso_gtk.h | 70 + src/gui/GTK/refresh_icon_data.c | 300 + src/gui/GTK/secure_icon_data.c | 91 + src/gui/GTK/window_icon_data.c | 7633 +++++++++ src/gui/Include/Hiperiso2Disk.h | 26 + src/gui/Lib/exfat/buidexfat.sh | 30 + src/gui/Lib/exfat/exfat-1.3.0.zip | Bin 0 -> 90929 bytes src/gui/Lib/exfat/src/libexfat/byteorder.h | 68 + src/gui/Lib/exfat/src/libexfat/cluster.c | 491 + src/gui/Lib/exfat/src/libexfat/compiler.h | 66 + src/gui/Lib/exfat/src/libexfat/config.h | 40 + src/gui/Lib/exfat/src/libexfat/exfat.h | 255 + src/gui/Lib/exfat/src/libexfat/exfatfs.h | 180 + src/gui/Lib/exfat/src/libexfat/io.c | 511 + src/gui/Lib/exfat/src/libexfat/lookup.c | 224 + src/gui/Lib/exfat/src/libexfat/mount.c | 389 + src/gui/Lib/exfat/src/libexfat/node.c | 1226 ++ src/gui/Lib/exfat/src/libexfat/platform.h | 63 + src/gui/Lib/exfat/src/libexfat/repair.c | 103 + src/gui/Lib/exfat/src/libexfat/time.c | 164 + src/gui/Lib/exfat/src/libexfat/utf.c | 245 + src/gui/Lib/exfat/src/libexfat/utils.c | 180 + src/gui/Lib/exfat/src/mkfs/cbm.c | 79 + src/gui/Lib/exfat/src/mkfs/cbm.h | 30 + src/gui/Lib/exfat/src/mkfs/fat.c | 88 + src/gui/Lib/exfat/src/mkfs/fat.h | 30 + src/gui/Lib/exfat/src/mkfs/mkexfat.c | 167 + src/gui/Lib/exfat/src/mkfs/mkexfat.h | 49 + src/gui/Lib/exfat/src/mkfs/mkexfat_main.c | 268 + src/gui/Lib/exfat/src/mkfs/rootdir.c | 102 + src/gui/Lib/exfat/src/mkfs/rootdir.h | 30 + src/gui/Lib/exfat/src/mkfs/uct.c | 52 + src/gui/Lib/exfat/src/mkfs/uct.h | 30 + src/gui/Lib/exfat/src/mkfs/uctc.c | 757 + src/gui/Lib/exfat/src/mkfs/uctc.h | 30 + src/gui/Lib/exfat/src/mkfs/vbr.c | 148 + src/gui/Lib/exfat/src/mkfs/vbr.h | 30 + src/gui/Lib/fat_io_lib/API.txt | 22 + src/gui/Lib/fat_io_lib/COPYRIGHT.txt | 345 + src/gui/Lib/fat_io_lib/Configuration.txt | 53 + src/gui/Lib/fat_io_lib/History.txt | 24 + src/gui/Lib/fat_io_lib/License.txt | 10 + src/gui/Lib/fat_io_lib/Media Access API.txt | 40 + src/gui/Lib/fat_io_lib/fat_access.c | 904 ++ src/gui/Lib/fat_io_lib/fat_access.h | 133 + src/gui/Lib/fat_io_lib/fat_cache.c | 91 + src/gui/Lib/fat_io_lib/fat_cache.h | 13 + src/gui/Lib/fat_io_lib/fat_defs.h | 128 + src/gui/Lib/fat_io_lib/fat_filelib.c | 1603 ++ src/gui/Lib/fat_io_lib/fat_filelib.h | 146 + src/gui/Lib/fat_io_lib/fat_format.c | 532 + src/gui/Lib/fat_io_lib/fat_format.h | 15 + src/gui/Lib/fat_io_lib/fat_list.h | 161 + src/gui/Lib/fat_io_lib/fat_misc.c | 505 + src/gui/Lib/fat_io_lib/fat_misc.h | 63 + src/gui/Lib/fat_io_lib/fat_opts.h | 83 + src/gui/Lib/fat_io_lib/fat_string.c | 514 + src/gui/Lib/fat_io_lib/fat_string.h | 20 + src/gui/Lib/fat_io_lib/fat_table.c | 478 + src/gui/Lib/fat_io_lib/fat_table.h | 20 + src/gui/Lib/fat_io_lib/fat_types.h | 69 + src/gui/Lib/fat_io_lib/fat_write.c | 373 + src/gui/Lib/fat_io_lib/fat_write.h | 14 + src/gui/Lib/fat_io_lib/version.txt | 1 + src/gui/Lib/libhttp/buildlib.sh | 46 + src/gui/Lib/libhttp/include/civetweb.c | 13145 ++++++++++++++++ src/gui/Lib/libhttp/include/civetweb.h | 1024 ++ src/gui/Lib/libhttp/include/handle_form.inl | 793 + src/gui/Lib/libhttp/include/md5.inl | 468 + src/gui/Lib/libhttp/include/mod_duktape.inl | 250 + src/gui/Lib/libhttp/include/mod_lua.inl | 1840 +++ src/gui/Lib/libhttp/include/timer.inl | 150 + src/gui/Lib/xz-embedded/COPYING | 10 + src/gui/Lib/xz-embedded/README | 163 + .../xz-embedded/linux/Documentation/xz.txt | 122 + .../linux/include/linux/decompress/unxz.h | 19 + .../Lib/xz-embedded/linux/include/linux/xz.h | 304 + .../xz-embedded/linux/lib/decompress_unxz.c | 397 + src/gui/Lib/xz-embedded/linux/lib/xz/Kconfig | 57 + src/gui/Lib/xz-embedded/linux/lib/xz/Makefile | 5 + .../Lib/xz-embedded/linux/lib/xz/xz_crc32.c | 59 + .../Lib/xz-embedded/linux/lib/xz/xz_crc64.c | 50 + .../Lib/xz-embedded/linux/lib/xz/xz_dec_bcj.c | 574 + .../xz-embedded/linux/lib/xz/xz_dec_lzma2.c | 1171 ++ .../xz-embedded/linux/lib/xz/xz_dec_stream.c | 847 + .../xz-embedded/linux/lib/xz/xz_dec_syms.c | 26 + .../xz-embedded/linux/lib/xz/xz_dec_test.c | 220 + .../Lib/xz-embedded/linux/lib/xz/xz_lzma2.h | 204 + .../Lib/xz-embedded/linux/lib/xz/xz_private.h | 156 + .../Lib/xz-embedded/linux/lib/xz/xz_stream.h | 62 + .../Lib/xz-embedded/linux/scripts/xz_wrap.sh | 23 + src/gui/Lib/xz-embedded/userspace/boottest.c | 96 + src/gui/Lib/xz-embedded/userspace/buftest.c | 48 + src/gui/Lib/xz-embedded/userspace/bytetest.c | 135 + src/gui/Lib/xz-embedded/userspace/xz_config.h | 124 + src/gui/Lib/xz-embedded/userspace/xzminidec.c | 135 + src/gui/QT/.qmake.stash | 20 + src/gui/QT/Hiperiso2Disk | Bin 0 -> 268640 bytes src/gui/QT/Hiperiso2Disk.pro | 138 + src/gui/QT/Hiperiso2Disk.pro.user | 338 + src/gui/QT/Makefile | 1081 ++ src/gui/QT/build_output/.qmake.stash | 20 + src/gui/QT/build_output/Hiperiso2Disk | Bin 0 -> 232512 bytes src/gui/QT/build_output/Makefile | 1081 ++ .../build_output/moc_hiperiso2diskwindow.cpp | 312 + src/gui/QT/build_output/moc_partcfgdialog.cpp | 129 + src/gui/QT/build_output/moc_predefs.h | 446 + .../QT/build_output/ui_hiperiso2diskwindow.h | 212 + src/gui/QT/build_output/ui_partcfgdialog.h | 146 + src/gui/QT/hiperiso.qss | 348 + src/gui/QT/hiperiso2diskwindow.cpp | 1131 ++ src/gui/QT/hiperiso2diskwindow.h | 117 + src/gui/QT/hiperiso2diskwindow.ui | 341 + src/gui/QT/hiperiso_qt.h | 47 + src/gui/QT/hiperiso_qt_stub.c | 600 + src/gui/QT/main.cpp | 467 + src/gui/QT/moc_hiperiso2diskwindow.cpp | 312 + src/gui/QT/moc_partcfgdialog.cpp | 129 + src/gui/QT/moc_predefs.h | 446 + src/gui/QT/partcfgdialog.cpp | 144 + src/gui/QT/partcfgdialog.h | 48 + src/gui/QT/partcfgdialog.ui | 253 + src/gui/QT/refresh_icon_data.c | 300 + src/gui/QT/secure_icon_data.c | 91 + src/gui/QT/ui_hiperiso2diskwindow.h | 212 + src/gui/QT/ui_partcfgdialog.h | 146 + src/gui/Web/hiperiso_http.c | 1700 ++ src/gui/Web/hiperiso_http.h | 82 + src/gui/hiperiso_gui.c | 1376 ++ src/gui/main_gtk.c | 249 + src/gui/main_webui.c | 101 + 142 files changed, 60815 insertions(+) create mode 100644 src/gui/Core/hiperiso_crc32.c create mode 100644 src/gui/Core/hiperiso_define.h create mode 100644 src/gui/Core/hiperiso_disk.c create mode 100644 src/gui/Core/hiperiso_disk.h create mode 100644 src/gui/Core/hiperiso_json.c create mode 100644 src/gui/Core/hiperiso_json.h create mode 100644 src/gui/Core/hiperiso_log.c create mode 100644 src/gui/Core/hiperiso_md5.c create mode 100644 src/gui/Core/hiperiso_util.c create mode 100644 src/gui/Core/hiperiso_util.h create mode 100644 src/gui/GTK/hiperiso_gtk.c create mode 100644 src/gui/GTK/hiperiso_gtk.h create mode 100644 src/gui/GTK/refresh_icon_data.c create mode 100644 src/gui/GTK/secure_icon_data.c create mode 100644 src/gui/GTK/window_icon_data.c create mode 100644 src/gui/Include/Hiperiso2Disk.h create mode 100644 src/gui/Lib/exfat/buidexfat.sh create mode 100644 src/gui/Lib/exfat/exfat-1.3.0.zip create mode 100644 src/gui/Lib/exfat/src/libexfat/byteorder.h create mode 100644 src/gui/Lib/exfat/src/libexfat/cluster.c create mode 100644 src/gui/Lib/exfat/src/libexfat/compiler.h create mode 100644 src/gui/Lib/exfat/src/libexfat/config.h create mode 100644 src/gui/Lib/exfat/src/libexfat/exfat.h create mode 100644 src/gui/Lib/exfat/src/libexfat/exfatfs.h create mode 100644 src/gui/Lib/exfat/src/libexfat/io.c create mode 100644 src/gui/Lib/exfat/src/libexfat/lookup.c create mode 100644 src/gui/Lib/exfat/src/libexfat/mount.c create mode 100644 src/gui/Lib/exfat/src/libexfat/node.c create mode 100644 src/gui/Lib/exfat/src/libexfat/platform.h create mode 100644 src/gui/Lib/exfat/src/libexfat/repair.c create mode 100644 src/gui/Lib/exfat/src/libexfat/time.c create mode 100644 src/gui/Lib/exfat/src/libexfat/utf.c create mode 100644 src/gui/Lib/exfat/src/libexfat/utils.c create mode 100644 src/gui/Lib/exfat/src/mkfs/cbm.c create mode 100644 src/gui/Lib/exfat/src/mkfs/cbm.h create mode 100644 src/gui/Lib/exfat/src/mkfs/fat.c create mode 100644 src/gui/Lib/exfat/src/mkfs/fat.h create mode 100644 src/gui/Lib/exfat/src/mkfs/mkexfat.c create mode 100644 src/gui/Lib/exfat/src/mkfs/mkexfat.h create mode 100644 src/gui/Lib/exfat/src/mkfs/mkexfat_main.c create mode 100644 src/gui/Lib/exfat/src/mkfs/rootdir.c create mode 100644 src/gui/Lib/exfat/src/mkfs/rootdir.h create mode 100644 src/gui/Lib/exfat/src/mkfs/uct.c create mode 100644 src/gui/Lib/exfat/src/mkfs/uct.h create mode 100644 src/gui/Lib/exfat/src/mkfs/uctc.c create mode 100644 src/gui/Lib/exfat/src/mkfs/uctc.h create mode 100644 src/gui/Lib/exfat/src/mkfs/vbr.c create mode 100644 src/gui/Lib/exfat/src/mkfs/vbr.h create mode 100644 src/gui/Lib/fat_io_lib/API.txt create mode 100644 src/gui/Lib/fat_io_lib/COPYRIGHT.txt create mode 100644 src/gui/Lib/fat_io_lib/Configuration.txt create mode 100644 src/gui/Lib/fat_io_lib/History.txt create mode 100644 src/gui/Lib/fat_io_lib/License.txt create mode 100644 src/gui/Lib/fat_io_lib/Media Access API.txt create mode 100644 src/gui/Lib/fat_io_lib/fat_access.c create mode 100644 src/gui/Lib/fat_io_lib/fat_access.h create mode 100644 src/gui/Lib/fat_io_lib/fat_cache.c create mode 100644 src/gui/Lib/fat_io_lib/fat_cache.h create mode 100644 src/gui/Lib/fat_io_lib/fat_defs.h create mode 100644 src/gui/Lib/fat_io_lib/fat_filelib.c create mode 100644 src/gui/Lib/fat_io_lib/fat_filelib.h create mode 100644 src/gui/Lib/fat_io_lib/fat_format.c create mode 100644 src/gui/Lib/fat_io_lib/fat_format.h create mode 100644 src/gui/Lib/fat_io_lib/fat_list.h create mode 100644 src/gui/Lib/fat_io_lib/fat_misc.c create mode 100644 src/gui/Lib/fat_io_lib/fat_misc.h create mode 100644 src/gui/Lib/fat_io_lib/fat_opts.h create mode 100644 src/gui/Lib/fat_io_lib/fat_string.c create mode 100644 src/gui/Lib/fat_io_lib/fat_string.h create mode 100644 src/gui/Lib/fat_io_lib/fat_table.c create mode 100644 src/gui/Lib/fat_io_lib/fat_table.h create mode 100644 src/gui/Lib/fat_io_lib/fat_types.h create mode 100644 src/gui/Lib/fat_io_lib/fat_write.c create mode 100644 src/gui/Lib/fat_io_lib/fat_write.h create mode 100644 src/gui/Lib/fat_io_lib/version.txt create mode 100644 src/gui/Lib/libhttp/buildlib.sh create mode 100644 src/gui/Lib/libhttp/include/civetweb.c create mode 100644 src/gui/Lib/libhttp/include/civetweb.h create mode 100644 src/gui/Lib/libhttp/include/handle_form.inl create mode 100644 src/gui/Lib/libhttp/include/md5.inl create mode 100644 src/gui/Lib/libhttp/include/mod_duktape.inl create mode 100644 src/gui/Lib/libhttp/include/mod_lua.inl create mode 100644 src/gui/Lib/libhttp/include/timer.inl create mode 100644 src/gui/Lib/xz-embedded/COPYING create mode 100644 src/gui/Lib/xz-embedded/README create mode 100644 src/gui/Lib/xz-embedded/linux/Documentation/xz.txt create mode 100644 src/gui/Lib/xz-embedded/linux/include/linux/decompress/unxz.h create mode 100644 src/gui/Lib/xz-embedded/linux/include/linux/xz.h create mode 100644 src/gui/Lib/xz-embedded/linux/lib/decompress_unxz.c create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/Kconfig create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/Makefile create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_crc32.c create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_crc64.c create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_dec_bcj.c create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_dec_lzma2.c create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_dec_stream.c create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_dec_syms.c create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_dec_test.c create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_lzma2.h create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_private.h create mode 100644 src/gui/Lib/xz-embedded/linux/lib/xz/xz_stream.h create mode 100644 src/gui/Lib/xz-embedded/linux/scripts/xz_wrap.sh create mode 100644 src/gui/Lib/xz-embedded/userspace/boottest.c create mode 100644 src/gui/Lib/xz-embedded/userspace/buftest.c create mode 100644 src/gui/Lib/xz-embedded/userspace/bytetest.c create mode 100644 src/gui/Lib/xz-embedded/userspace/xz_config.h create mode 100644 src/gui/Lib/xz-embedded/userspace/xzminidec.c create mode 100644 src/gui/QT/.qmake.stash create mode 100755 src/gui/QT/Hiperiso2Disk create mode 100644 src/gui/QT/Hiperiso2Disk.pro create mode 100644 src/gui/QT/Hiperiso2Disk.pro.user create mode 100644 src/gui/QT/Makefile create mode 100644 src/gui/QT/build_output/.qmake.stash create mode 100755 src/gui/QT/build_output/Hiperiso2Disk create mode 100644 src/gui/QT/build_output/Makefile create mode 100644 src/gui/QT/build_output/moc_hiperiso2diskwindow.cpp create mode 100644 src/gui/QT/build_output/moc_partcfgdialog.cpp create mode 100644 src/gui/QT/build_output/moc_predefs.h create mode 100644 src/gui/QT/build_output/ui_hiperiso2diskwindow.h create mode 100644 src/gui/QT/build_output/ui_partcfgdialog.h create mode 100644 src/gui/QT/hiperiso.qss create mode 100644 src/gui/QT/hiperiso2diskwindow.cpp create mode 100644 src/gui/QT/hiperiso2diskwindow.h create mode 100644 src/gui/QT/hiperiso2diskwindow.ui create mode 100644 src/gui/QT/hiperiso_qt.h create mode 100644 src/gui/QT/hiperiso_qt_stub.c create mode 100644 src/gui/QT/main.cpp create mode 100644 src/gui/QT/moc_hiperiso2diskwindow.cpp create mode 100644 src/gui/QT/moc_partcfgdialog.cpp create mode 100644 src/gui/QT/moc_predefs.h create mode 100644 src/gui/QT/partcfgdialog.cpp create mode 100644 src/gui/QT/partcfgdialog.h create mode 100644 src/gui/QT/partcfgdialog.ui create mode 100644 src/gui/QT/refresh_icon_data.c create mode 100644 src/gui/QT/secure_icon_data.c create mode 100644 src/gui/QT/ui_hiperiso2diskwindow.h create mode 100644 src/gui/QT/ui_partcfgdialog.h create mode 100644 src/gui/Web/hiperiso_http.c create mode 100644 src/gui/Web/hiperiso_http.h create mode 100644 src/gui/hiperiso_gui.c create mode 100644 src/gui/main_gtk.c create mode 100644 src/gui/main_webui.c diff --git a/src/gui/Core/hiperiso_crc32.c b/src/gui/Core/hiperiso_crc32.c new file mode 100644 index 0000000..d5a5cfc --- /dev/null +++ b/src/gui/Core/hiperiso_crc32.c @@ -0,0 +1,299 @@ +/****************************************************************************** + * crc32.c ---- hiperiso crc32 + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include + +static uint32_t g_crc_table[256] = { + 0x00000000, + 0x77073096, + 0xEE0E612C, + 0x990951BA, + 0x076DC419, + 0x706AF48F, + 0xE963A535, + 0x9E6495A3, + 0x0EDB8832, + 0x79DCB8A4, + 0xE0D5E91E, + 0x97D2D988, + 0x09B64C2B, + 0x7EB17CBD, + 0xE7B82D07, + 0x90BF1D91, + 0x1DB71064, + 0x6AB020F2, + 0xF3B97148, + 0x84BE41DE, + 0x1ADAD47D, + 0x6DDDE4EB, + 0xF4D4B551, + 0x83D385C7, + 0x136C9856, + 0x646BA8C0, + 0xFD62F97A, + 0x8A65C9EC, + 0x14015C4F, + 0x63066CD9, + 0xFA0F3D63, + 0x8D080DF5, + 0x3B6E20C8, + 0x4C69105E, + 0xD56041E4, + 0xA2677172, + 0x3C03E4D1, + 0x4B04D447, + 0xD20D85FD, + 0xA50AB56B, + 0x35B5A8FA, + 0x42B2986C, + 0xDBBBC9D6, + 0xACBCF940, + 0x32D86CE3, + 0x45DF5C75, + 0xDCD60DCF, + 0xABD13D59, + 0x26D930AC, + 0x51DE003A, + 0xC8D75180, + 0xBFD06116, + 0x21B4F4B5, + 0x56B3C423, + 0xCFBA9599, + 0xB8BDA50F, + 0x2802B89E, + 0x5F058808, + 0xC60CD9B2, + 0xB10BE924, + 0x2F6F7C87, + 0x58684C11, + 0xC1611DAB, + 0xB6662D3D, + 0x76DC4190, + 0x01DB7106, + 0x98D220BC, + 0xEFD5102A, + 0x71B18589, + 0x06B6B51F, + 0x9FBFE4A5, + 0xE8B8D433, + 0x7807C9A2, + 0x0F00F934, + 0x9609A88E, + 0xE10E9818, + 0x7F6A0DBB, + 0x086D3D2D, + 0x91646C97, + 0xE6635C01, + 0x6B6B51F4, + 0x1C6C6162, + 0x856530D8, + 0xF262004E, + 0x6C0695ED, + 0x1B01A57B, + 0x8208F4C1, + 0xF50FC457, + 0x65B0D9C6, + 0x12B7E950, + 0x8BBEB8EA, + 0xFCB9887C, + 0x62DD1DDF, + 0x15DA2D49, + 0x8CD37CF3, + 0xFBD44C65, + 0x4DB26158, + 0x3AB551CE, + 0xA3BC0074, + 0xD4BB30E2, + 0x4ADFA541, + 0x3DD895D7, + 0xA4D1C46D, + 0xD3D6F4FB, + 0x4369E96A, + 0x346ED9FC, + 0xAD678846, + 0xDA60B8D0, + 0x44042D73, + 0x33031DE5, + 0xAA0A4C5F, + 0xDD0D7CC9, + 0x5005713C, + 0x270241AA, + 0xBE0B1010, + 0xC90C2086, + 0x5768B525, + 0x206F85B3, + 0xB966D409, + 0xCE61E49F, + 0x5EDEF90E, + 0x29D9C998, + 0xB0D09822, + 0xC7D7A8B4, + 0x59B33D17, + 0x2EB40D81, + 0xB7BD5C3B, + 0xC0BA6CAD, + 0xEDB88320, + 0x9ABFB3B6, + 0x03B6E20C, + 0x74B1D29A, + 0xEAD54739, + 0x9DD277AF, + 0x04DB2615, + 0x73DC1683, + 0xE3630B12, + 0x94643B84, + 0x0D6D6A3E, + 0x7A6A5AA8, + 0xE40ECF0B, + 0x9309FF9D, + 0x0A00AE27, + 0x7D079EB1, + 0xF00F9344, + 0x8708A3D2, + 0x1E01F268, + 0x6906C2FE, + 0xF762575D, + 0x806567CB, + 0x196C3671, + 0x6E6B06E7, + 0xFED41B76, + 0x89D32BE0, + 0x10DA7A5A, + 0x67DD4ACC, + 0xF9B9DF6F, + 0x8EBEEFF9, + 0x17B7BE43, + 0x60B08ED5, + 0xD6D6A3E8, + 0xA1D1937E, + 0x38D8C2C4, + 0x4FDFF252, + 0xD1BB67F1, + 0xA6BC5767, + 0x3FB506DD, + 0x48B2364B, + 0xD80D2BDA, + 0xAF0A1B4C, + 0x36034AF6, + 0x41047A60, + 0xDF60EFC3, + 0xA867DF55, + 0x316E8EEF, + 0x4669BE79, + 0xCB61B38C, + 0xBC66831A, + 0x256FD2A0, + 0x5268E236, + 0xCC0C7795, + 0xBB0B4703, + 0x220216B9, + 0x5505262F, + 0xC5BA3BBE, + 0xB2BD0B28, + 0x2BB45A92, + 0x5CB36A04, + 0xC2D7FFA7, + 0xB5D0CF31, + 0x2CD99E8B, + 0x5BDEAE1D, + 0x9B64C2B0, + 0xEC63F226, + 0x756AA39C, + 0x026D930A, + 0x9C0906A9, + 0xEB0E363F, + 0x72076785, + 0x05005713, + 0x95BF4A82, + 0xE2B87A14, + 0x7BB12BAE, + 0x0CB61B38, + 0x92D28E9B, + 0xE5D5BE0D, + 0x7CDCEFB7, + 0x0BDBDF21, + 0x86D3D2D4, + 0xF1D4E242, + 0x68DDB3F8, + 0x1FDA836E, + 0x81BE16CD, + 0xF6B9265B, + 0x6FB077E1, + 0x18B74777, + 0x88085AE6, + 0xFF0F6A70, + 0x66063BCA, + 0x11010B5C, + 0x8F659EFF, + 0xF862AE69, + 0x616BFFD3, + 0x166CCF45, + 0xA00AE278, + 0xD70DD2EE, + 0x4E048354, + 0x3903B3C2, + 0xA7672661, + 0xD06016F7, + 0x4969474D, + 0x3E6E77DB, + 0xAED16A4A, + 0xD9D65ADC, + 0x40DF0B66, + 0x37D83BF0, + 0xA9BCAE53, + 0xDEBB9EC5, + 0x47B2CF7F, + 0x30B5FFE9, + 0xBDBDF21C, + 0xCABAC28A, + 0x53B39330, + 0x24B4A3A6, + 0xBAD03605, + 0xCDD70693, + 0x54DE5729, + 0x23D967BF, + 0xB3667A2E, + 0xC4614AB8, + 0x5D681B02, + 0x2A6F2B94, + 0xB40BBE37, + 0xC30C8EA1, + 0x5A05DF1B, + 0x2D02EF8D +}; + +uint32_t hiperiso_crc32(void *Buffer, uint32_t Length) +{ + uint32_t i; + uint8_t *Ptr = Buffer; + uint32_t Crc = 0xFFFFFFFF; + + for (i = 0; i < Length; i++, Ptr++) + { + Crc = (Crc >> 8) ^ g_crc_table[(uint8_t) Crc ^ *Ptr]; + } + + return Crc ^ 0xffffffff; +} + diff --git a/src/gui/Core/hiperiso_define.h b/src/gui/Core/hiperiso_define.h new file mode 100644 index 0000000..ac9cca0 --- /dev/null +++ b/src/gui/Core/hiperiso_define.h @@ -0,0 +1,190 @@ +/****************************************************************************** + * hiperiso_define.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_DEFINE_H__ +#define __HIPERISO_DEFINE_H__ + +#define MAX_DISK_NUM 256 + +#define SIZE_1MB 1048576 +#define SIZE_1GB 1073741824 + +#define HISOIMG_PART_START_BYTES (1024 * 1024) +#define HISOIMG_PART_START_SECTOR 2048 + +#define HISOEFI_PART_BYTES (32 * 1024 * 1024) +#define HISOEFI_PART_SECTORS 65536 + +#pragma pack(1) + +typedef struct hiso_guid +{ + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +}hiso_guid; + +typedef struct PART_TABLE +{ + uint8_t Active; // 0x00 0x80 + + uint8_t StartHead; + uint16_t StartSector : 6; + uint16_t StartCylinder : 10; + + uint8_t FsFlag; + + uint8_t EndHead; + uint16_t EndSector : 6; + uint16_t EndCylinder : 10; + + uint32_t StartSectorId; + uint32_t SectorCount; +}PART_TABLE; + +typedef struct MBR_HEAD +{ + uint8_t BootCode[446]; + PART_TABLE PartTbl[4]; + uint8_t Byte55; + uint8_t ByteAA; +}MBR_HEAD; + +typedef struct HISO_GPT_HDR +{ + char Signature[8]; /* EFI PART */ + uint8_t Version[4]; + uint32_t Length; + uint32_t Crc; + uint8_t Reserved1[4]; + uint64_t EfiStartLBA; + uint64_t EfiBackupLBA; + uint64_t PartAreaStartLBA; + uint64_t PartAreaEndLBA; + hiso_guid DiskGuid; + uint64_t PartTblStartLBA; + uint32_t PartTblTotNum; + uint32_t PartTblEntryLen; + uint32_t PartTblCrc; + uint8_t Reserved2[420]; +}HISO_GPT_HDR; + +typedef struct HISO_GPT_PART_TBL +{ + hiso_guid PartType; + hiso_guid PartGuid; + uint64_t StartLBA; + uint64_t LastLBA; + uint64_t Attr; + uint16_t Name[36]; +}HISO_GPT_PART_TBL; + +typedef struct HISO_GPT_INFO +{ + MBR_HEAD MBR; + HISO_GPT_HDR Head; + HISO_GPT_PART_TBL PartTbl[128]; +}HISO_GPT_INFO; +#pragma pack() + + +#define MBR_PART_STYLE 0 +#define GPT_PART_STYLE 1 + +typedef struct disk_hiperiso_data +{ + int hiperiso_valid; + + char hiperiso_ver[32]; // 1.0.33 ... + int secure_boot_flag; + uint64_t preserved_space; + + uint64_t part2_start_sector; + + int partition_style; // MBR_PART_STYLE/GPT_PART_STYLE + HISO_GPT_INFO gptinfo; + uint8_t rsvdata[4096]; +}disk_hiperiso_data; + + +typedef struct hiperiso_disk +{ + char disk_name[32]; // sda + char disk_path[64]; // /dev/sda + + char part1_name[32]; // sda1 + char part1_path[64]; // /dev/sda1 + char part2_name[32]; // sda2 + char part2_path[64]; // /dev/sda2 + + char disk_model[256]; // Sandisk/Kingston ... + char human_readable_size[32]; + + int is4kn; + int major; + int minor; + int type; + int partstyle; + uint64_t size_in_byte; + + disk_hiperiso_data hisodata; +}hiperiso_disk; + +#pragma pack(1) +typedef struct hiperiso_guid +{ + uint32_t data1; + uint16_t data2; + uint16_t data3; + uint8_t data4[8]; +}hiperiso_guid; +#pragma pack() + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#define VLOG_LOG 1 +#define VLOG_DEBUG 2 + +#define ulong unsigned long +#define _ll long long +#define _ull unsigned long long +#define strlcpy(dst, src) strncpy(dst, src, sizeof(dst) - 1) +#define scnprintf(dst, fmt, args...) snprintf(dst, sizeof(dst) - 1, fmt, ##args) + +#define vlog(fmt, args...) hiperiso_syslog(VLOG_LOG, fmt, ##args) +#define vdebug(fmt, args...) hiperiso_syslog(VLOG_DEBUG, fmt, ##args) + +void hiperiso_syslog(int level, const char *Fmt, ...); +void hiperiso_set_loglevel(int level); +uint32_t hiperiso_crc32(void *Buffer, uint32_t Length); + + +static inline void * zalloc(size_t n) +{ + void *p = malloc(n); + if (p) memset(p, 0, n); + return p; +} + + +#endif /* __HIPERISO_DEFINE_H__ */ + diff --git a/src/gui/Core/hiperiso_disk.c b/src/gui/Core/hiperiso_disk.c new file mode 100644 index 0000000..ea5d97d --- /dev/null +++ b/src/gui/Core/hiperiso_disk.c @@ -0,0 +1,779 @@ +/****************************************************************************** + * hiperiso_disk.c ---- hiperiso disk + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int g_disk_num = 0; +static int g_fatlib_media_fd = 0; +static uint64_t g_fatlib_media_offset = 0; +hiperiso_disk *g_disk_list = NULL; + +static const char *g_hiperiso_dev_type_str[HISO_DEVICE_END] = +{ + "unknown", "scsi", "USB", "ide", "dac960", + "cpqarray", "file", "ataraid", "i2o", + "ubd", "dasd", "viodasd", "sx8", "dm", + "xvd", "sd/mmc", "virtblk", "aoe", + "md", "loopback", "nvme", "brd", "pmem" +}; + +static const char * hiperiso_get_dev_type_name(hiperiso_dev_type type) +{ + return (type < HISO_DEVICE_END) ? g_hiperiso_dev_type_str[type] : "unknown"; +} + +static int hiperiso_check_blk_major(int major, const char *type) +{ + int flag = 0; + int valid = 0; + int devnum = 0; + int len = 0; + char line[64]; + char *pos = NULL; + FILE *fp = NULL; + + fp = fopen("/proc/devices", "r"); + if (!fp) + { + return 0; + } + + len = (int)strlen(type); + while (fgets(line, sizeof(line), fp)) + { + if (flag) + { + pos = strchr(line, ' '); + if (pos) + { + devnum = (int)strtol(line, NULL, 10); + if (devnum == major) + { + if (strncmp(pos + 1, type, len) == 0) + { + valid = 1; + } + break; + } + } + } + else if (strncmp(line, "Block devices:", 14) == 0) + { + flag = 1; + } + } + + fclose(fp); + return valid; +} + +static int hiperiso_get_disk_devnum(const char *name, int *major, int* minor) +{ + int rc; + char *pos; + char devnum[16] = {0}; + + rc = hiperiso_get_sys_file_line(devnum, sizeof(devnum), "/sys/block/%s/dev", name); + if (rc) + { + return 1; + } + + pos = strstr(devnum, ":"); + if (!pos) + { + return 1; + } + + *major = (int)strtol(devnum, NULL, 10); + *minor = (int)strtol(pos + 1, NULL, 10); + + return 0; +} + +static hiperiso_dev_type hiperiso_get_dev_type(const char *name, int major, int minor) +{ + int rc; + char syspath[128]; + char dstpath[256]; + + memset(syspath, 0, sizeof(syspath)); + memset(dstpath, 0, sizeof(dstpath)); + + scnprintf(syspath, "/sys/block/%s", name); + rc = readlink(syspath, dstpath, sizeof(dstpath) - 1); + if (rc > 0 && strstr(dstpath, "/usb")) + { + return HISO_DEVICE_USB; + } + + if (SCSI_BLK_MAJOR(major) && (minor % 0x10 == 0)) + { + return HISO_DEVICE_SCSI; + } + else if (IDE_BLK_MAJOR(major) && (minor % 0x40 == 0)) + { + return HISO_DEVICE_IDE; + } + else if (major == DAC960_MAJOR && (minor % 0x8 == 0)) + { + return HISO_DEVICE_DAC960; + } + else if (major == ATARAID_MAJOR && (minor % 0x10 == 0)) + { + return HISO_DEVICE_ATARAID; + } + else if (major == AOE_MAJOR && (minor % 0x10 == 0)) + { + return HISO_DEVICE_AOE; + } + else if (major == DASD_MAJOR && (minor % 0x4 == 0)) + { + return HISO_DEVICE_DASD; + } + else if (major == VIODASD_MAJOR && (minor % 0x8 == 0)) + { + return HISO_DEVICE_VIODASD; + } + else if (SX8_BLK_MAJOR(major) && (minor % 0x20 == 0)) + { + return HISO_DEVICE_SX8; + } + else if (I2O_BLK_MAJOR(major) && (minor % 0x10 == 0)) + { + return HISO_DEVICE_I2O; + } + else if (CPQARRAY_BLK_MAJOR(major) && (minor % 0x10 == 0)) + { + return HISO_DEVICE_CPQARRAY; + } + else if (UBD_MAJOR == major && (minor % 0x10 == 0)) + { + return HISO_DEVICE_UBD; + } + else if (XVD_MAJOR == major && (minor % 0x10 == 0)) + { + return HISO_DEVICE_XVD; + } + else if (SDMMC_MAJOR == major && (minor % 0x8 == 0)) + { + return HISO_DEVICE_SDMMC; + } + else if (hiperiso_check_blk_major(major, "virtblk")) + { + return HISO_DEVICE_VIRTBLK; + } + else if (major == LOOP_MAJOR) + { + return HISO_DEVICE_LOOP; + } + else if (major == MD_MAJOR) + { + return HISO_DEVICE_MD; + } + else if (major == RAM_MAJOR) + { + return HISO_DEVICE_RAM; + } + else if (strstr(name, "nvme") && hiperiso_check_blk_major(major, "blkext")) + { + return HISO_DEVICE_NVME; + } + else if (strstr(name, "pmem") && hiperiso_check_blk_major(major, "blkext")) + { + return HISO_DEVICE_PMEM; + } + + return HISO_DEVICE_END; +} + +static int hiperiso_is_possible_blkdev(const char *name) +{ + if (name[0] == '.') + { + return 0; + } + + /* /dev/ramX */ + if (name[0] == 'r' && name[1] == 'a' && name[2] == 'm') + { + return 0; + } + + /* /dev/zramX */ + if (name[0] == 'z' && name[1] == 'r' && name[2] == 'a' && name[3] == 'm') + { + return 0; + } + + /* /dev/loopX */ + if (name[0] == 'l' && name[1] == 'o' && name[2] == 'o' && name[3] == 'p') + { + return 0; + } + + /* /dev/dm-X */ + if (name[0] == 'd' && name[1] == 'm' && name[2] == '-' && isdigit(name[3])) + { + return 0; + } + + /* /dev/srX */ + if (name[0] == 's' && name[1] == 'r' && isdigit(name[2])) + { + return 0; + } + + return 1; +} + +int hiperiso_is_disk_4k_native(const char *disk) +{ + int fd; + int rc = 0; + int logsector = 0; + int physector = 0; + char diskpath[256] = {0}; + + snprintf(diskpath, sizeof(diskpath) - 1, "/dev/%s", disk); + + fd = open(diskpath, O_RDONLY | O_BINARY); + if (fd >= 0) + { + ioctl(fd, BLKSSZGET, &logsector); + ioctl(fd, BLKPBSZGET, &physector); + + if (logsector == 4096 && physector == 4096) + { + rc = 1; + } + close(fd); + } + + vdebug("is 4k native disk <%s> <%d>\n", disk, rc); + return rc; +} + +uint64_t hiperiso_get_disk_size_in_byte(const char *disk) +{ + int fd; + int rc; + unsigned long long size = 0; + char diskpath[256] = {0}; + char sizebuf[64] = {0}; + + // Try 1: get size from sysfs + snprintf(diskpath, sizeof(diskpath) - 1, "/sys/block/%s/size", disk); + if (access(diskpath, F_OK) >= 0) + { + vdebug("get disk size from sysfs for %s\n", disk); + + fd = open(diskpath, O_RDONLY | O_BINARY); + if (fd >= 0) + { + read(fd, sizebuf, sizeof(sizebuf)); + size = strtoull(sizebuf, NULL, 10); + close(fd); + return (uint64_t)(size * 512); + } + } + else + { + vdebug("%s not exist \n", diskpath); + } + + // Try 2: get size from ioctl + snprintf(diskpath, sizeof(diskpath) - 1, "/dev/%s", disk); + fd = open(diskpath, O_RDONLY); + if (fd >= 0) + { + vdebug("get disk size from ioctl for %s\n", disk); + rc = ioctl(fd, BLKGETSIZE64, &size); + if (rc == -1) + { + size = 0; + vdebug("failed to ioctl %d\n", rc); + } + close(fd); + } + else + { + vdebug("failed to open %s %d\n", diskpath, errno); + } + + vdebug("disk %s size %llu bytes\n", disk, size); + return size; +} + +int hiperiso_get_disk_vendor(const char *name, char *vendorbuf, int bufsize) +{ + return hiperiso_get_sys_file_line(vendorbuf, bufsize, "/sys/block/%s/device/vendor", name); +} + +int hiperiso_get_disk_model(const char *name, char *modelbuf, int bufsize) +{ + return hiperiso_get_sys_file_line(modelbuf, bufsize, "/sys/block/%s/device/model", name); +} + +static int fatlib_media_sector_read(uint32 sector, uint8 *buffer, uint32 sector_count) +{ + lseek(g_fatlib_media_fd, (sector + g_fatlib_media_offset) * 512ULL, SEEK_SET); + read(g_fatlib_media_fd, buffer, sector_count * 512); + + return 1; +} + +static int fatlib_is_secure_boot_enable(void) +{ + void *flfile = NULL; + + flfile = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + if (flfile) + { + vlog("/EFI/BOOT/grubx64_real.efi find, secure boot in enabled\n"); + fl_fclose(flfile); + return 1; + } + else + { + vlog("/EFI/BOOT/grubx64_real.efi not exist\n"); + } + + return 0; +} + +static int fatlib_get_hiperiso_version(char *verbuf, int bufsize) +{ + int rc = 1; + int size = 0; + char *buf = NULL; + char *pos = NULL; + char *end = NULL; + void *flfile = NULL; + + flfile = fl_fopen("/grub/grub.cfg", "rb"); + if (flfile) + { + fl_fseek(flfile, 0, SEEK_END); + size = (int)fl_ftell(flfile); + + fl_fseek(flfile, 0, SEEK_SET); + + buf = malloc(size + 1); + if (buf) + { + fl_fread(buf, 1, size, flfile); + buf[size] = 0; + + pos = strstr(buf, "HIPERISO_VERSION="); + if (pos) + { + pos += strlen("HIPERISO_VERSION="); + if (*pos == '"') + { + pos++; + } + + end = pos; + while (*end != 0 && *end != '"' && *end != '\r' && *end != '\n') + { + end++; + } + + *end = 0; + + snprintf(verbuf, bufsize - 1, "%s", pos); + rc = 0; + } + free(buf); + } + + fl_fclose(flfile); + } + else + { + vdebug("No grub.cfg found\n"); + } + + return rc; +} + +int hiperiso_get_hiso_data(hiperiso_disk *info, int *ppartstyle) +{ + int i; + int fd; + int len; + int rc = 1; + int ret = 1; + int part_style; + uint64_t part1_start_sector; + uint64_t part1_sector_count; + uint64_t part2_start_sector; + uint64_t part2_sector_count; + uint64_t preserved_space; + char name[64] = {0}; + disk_hiperiso_data *hiso = NULL; + HISO_GPT_INFO *gpt = NULL; + + hiso = &(info->hisodata); + gpt = &(hiso->gptinfo); + memset(hiso, 0, sizeof(disk_hiperiso_data)); + + vdebug("hiperiso_get_hiso_data %s\n", info->disk_path); + + if (info->size_in_byte < (2 * HISOEFI_PART_BYTES)) + { + vdebug("disk %s is too small %llu\n", info->disk_path, (_ull)info->size_in_byte); + return 1; + } + + fd = open(info->disk_path, O_RDONLY | O_BINARY); + if (fd < 0) + { + vdebug("failed to open %s %d\n", info->disk_path, errno); + return 1; + } + + len = (int)read(fd, &(hiso->gptinfo), sizeof(HISO_GPT_INFO)); + if (len != sizeof(HISO_GPT_INFO)) + { + vdebug("failed to read %s %d\n", info->disk_path, errno); + goto end; + } + + if (gpt->MBR.Byte55 != 0x55 || gpt->MBR.ByteAA != 0xAA) + { + vdebug("Invalid mbr magic 0x%x 0x%x\n", gpt->MBR.Byte55, gpt->MBR.ByteAA); + goto end; + } + + if (gpt->MBR.PartTbl[0].FsFlag == 0xEE && strncmp(gpt->Head.Signature, "EFI PART", 8) == 0) + { + part_style = GPT_PART_STYLE; + if (ppartstyle) + { + *ppartstyle = part_style; + } + + if (gpt->PartTbl[0].StartLBA == 0 || gpt->PartTbl[1].StartLBA == 0) + { + vdebug("NO hiperiso efi part layout <%llu %llu>\n", + (_ull)gpt->PartTbl[0].StartLBA, + (_ull)gpt->PartTbl[1].StartLBA); + goto end; + } + + for (i = 0; i < 36; i++) + { + name[i] = (char)(gpt->PartTbl[1].Name[i]); + } + if (strcmp(name, "HISOEFI")) + { + vdebug("Invalid efi part2 name <%s>\n", name); + goto end; + } + + part1_start_sector = gpt->PartTbl[0].StartLBA; + part1_sector_count = gpt->PartTbl[0].LastLBA - part1_start_sector + 1; + part2_start_sector = gpt->PartTbl[1].StartLBA; + part2_sector_count = gpt->PartTbl[1].LastLBA - part2_start_sector + 1; + + preserved_space = info->size_in_byte - (part2_start_sector + part2_sector_count + 33) * 512; + } + else + { + part_style = MBR_PART_STYLE; + if (ppartstyle) + { + *ppartstyle = part_style; + } + + part1_start_sector = gpt->MBR.PartTbl[0].StartSectorId; + part1_sector_count = gpt->MBR.PartTbl[0].SectorCount; + part2_start_sector = gpt->MBR.PartTbl[1].StartSectorId; + part2_sector_count = gpt->MBR.PartTbl[1].SectorCount; + + preserved_space = info->size_in_byte - (part2_start_sector + part2_sector_count) * 512; + } + + if (part1_start_sector != HISOIMG_PART_START_SECTOR || + part2_sector_count != HISOEFI_PART_SECTORS || + (part1_start_sector + part1_sector_count) != part2_start_sector) + { + vdebug("Not valid hiperiso partition layout [%llu %llu] [%llu %llu]\n", + part1_start_sector, part1_sector_count, part2_start_sector, part2_sector_count); + goto end; + } + + vdebug("hiperiso partition layout check OK: [%llu %llu] [%llu %llu]\n", + part1_start_sector, part1_sector_count, part2_start_sector, part2_sector_count); + + hiso->hiperiso_valid = 1; + + vdebug("now check secure boot for %s ...\n", info->disk_path); + + g_fatlib_media_fd = fd; + g_fatlib_media_offset = part2_start_sector; + fl_init(); + + if (0 == fl_attach_media(fatlib_media_sector_read, NULL)) + { + ret = fatlib_get_hiperiso_version(hiso->hiperiso_ver, sizeof(hiso->hiperiso_ver)); + if (ret == 0 && hiso->hiperiso_ver[0]) + { + hiso->secure_boot_flag = fatlib_is_secure_boot_enable(); + } + else + { + vdebug("fatlib_get_hiperiso_version failed %d\n", ret); + } + } + else + { + vdebug("fl_attach_media failed\n"); + } + + fl_shutdown(); + g_fatlib_media_fd = -1; + g_fatlib_media_offset = 0; + + if (hiso->hiperiso_ver[0] == 0) + { + hiso->hiperiso_ver[0] = '?'; + } + + if (0 == hiso->hiperiso_valid) + { + goto end; + } + + lseek(fd, 2040 * 512, SEEK_SET); + read(fd, hiso->rsvdata, sizeof(hiso->rsvdata)); + + hiso->preserved_space = preserved_space; + hiso->partition_style = part_style; + hiso->part2_start_sector = part2_start_sector; + + rc = 0; +end: + hiso_safe_close_fd(fd); + return rc; +} + +int hiperiso_get_disk_info(const char *name, hiperiso_disk *info) +{ + char vendor[64] = {0}; + char model[128] = {0}; + + vdebug("get disk info %s\n", name); + + strlcpy(info->disk_name, name); + scnprintf(info->disk_path, "/dev/%s", name); + + if (strstr(name, "nvme") || strstr(name, "mmc") || strstr(name, "nbd")) + { + scnprintf(info->part1_name, "%sp1", name); + scnprintf(info->part1_path, "/dev/%sp1", name); + scnprintf(info->part2_name, "%sp2", name); + scnprintf(info->part2_path, "/dev/%sp2", name); + } + else + { + scnprintf(info->part1_name, "%s1", name); + scnprintf(info->part1_path, "/dev/%s1", name); + scnprintf(info->part2_name, "%s2", name); + scnprintf(info->part2_path, "/dev/%s2", name); + } + + info->is4kn = hiperiso_is_disk_4k_native(name); + info->size_in_byte = hiperiso_get_disk_size_in_byte(name); + + hiperiso_get_disk_devnum(name, &info->major, &info->minor); + info->type = hiperiso_get_dev_type(name, info->major, info->minor); + hiperiso_get_disk_vendor(name, vendor, sizeof(vendor)); + hiperiso_get_disk_model(name, model, sizeof(model)); + + scnprintf(info->human_readable_size, "%llu GB", (_ull)hiperiso_get_human_readable_gb(info->size_in_byte)); + scnprintf(info->disk_model, "%s %s (%s)", vendor, model, hiperiso_get_dev_type_name(info->type)); + + hiperiso_get_hiso_data(info, &(info->partstyle)); + + vdebug("disk:<%s %d:%d> model:<%s> size:%llu (%s)\n", + info->disk_path, info->major, info->minor, info->disk_model, info->size_in_byte, info->human_readable_size); + + if (info->hisodata.hiperiso_valid) + { + vdebug("%s Hiperiso:<%s> %s secureboot:%d preserve:%llu\n", info->disk_path, info->hisodata.hiperiso_ver, + info->hisodata.partition_style == MBR_PART_STYLE ? "MBR" : "GPT", + info->hisodata.secure_boot_flag, (_ull)(info->hisodata.preserved_space)); + } + else + { + vdebug("%s NO Hiperiso detected\n", info->disk_path); + } + + return 0; +} + +static int hiperiso_disk_compare(const hiperiso_disk *disk1, const hiperiso_disk *disk2) +{ + if (disk1->type == HISO_DEVICE_USB && disk2->type == HISO_DEVICE_USB) + { + return strcmp(disk1->disk_name, disk2->disk_name); + } + else if (disk1->type == HISO_DEVICE_USB) + { + return -1; + } + else if (disk2->type == HISO_DEVICE_USB) + { + return 1; + } + else + { + return strcmp(disk1->disk_name, disk2->disk_name); + } +} + +static int hiperiso_disk_sort(void) +{ + int i, j; + hiperiso_disk *tmp; + + tmp = malloc(sizeof(hiperiso_disk)); + if (!tmp) + { + return 1; + } + + for (i = 0; i < g_disk_num; i++) + for (j = i + 1; j < g_disk_num; j++) + { + if (hiperiso_disk_compare(g_disk_list + i, g_disk_list + j) > 0) + { + memcpy(tmp, g_disk_list + i, sizeof(hiperiso_disk)); + memcpy(g_disk_list + i, g_disk_list + j, sizeof(hiperiso_disk)); + memcpy(g_disk_list + j, tmp, sizeof(hiperiso_disk)); + } + } + + free(tmp); + return 0; +} + +int hiperiso_disk_enumerate_all(void) +{ + int rc = 0; + DIR* dir = NULL; + struct dirent* p = NULL; + + vdebug("hiperiso_disk_enumerate_all\n"); + + dir = opendir("/sys/block"); + if (!dir) + { + vlog("Failed to open /sys/block %d\n", errno); + return 1; + } + + while (((p = readdir(dir)) != NULL) && (g_disk_num < MAX_DISK_NUM)) + { + if (hiperiso_is_possible_blkdev(p->d_name)) + { + memset(g_disk_list + g_disk_num, 0, sizeof(hiperiso_disk)); + if (0 == hiperiso_get_disk_info(p->d_name, g_disk_list + g_disk_num)) + { + g_disk_num++; + } + } + } + closedir(dir); + + hiperiso_disk_sort(); + + return rc; +} + +void hiperiso_disk_dump(hiperiso_disk *cur) +{ + if (cur->hisodata.hiperiso_valid) + { + vdebug("%s [%s] %s\tHiperiso: %s %s secureboot:%d preserve:%llu\n", + cur->disk_path, cur->human_readable_size, cur->disk_model, + cur->hisodata.hiperiso_ver, cur->hisodata.partition_style == MBR_PART_STYLE ? "MBR" : "GPT", + cur->hisodata.secure_boot_flag, (_ull)(cur->hisodata.preserved_space)); + } + else + { + vdebug("%s [%s] %s\tHiperiso: NA\n", cur->disk_path, cur->human_readable_size, cur->disk_model); + } +} + +void hiperiso_disk_dump_all(void) +{ + int i; + + vdebug("============= DISK DUMP ============\n"); + for (i = 0; i < g_disk_num; i++) + { + hiperiso_disk_dump(g_disk_list + i); + } +} + +int hiperiso_disk_install(hiperiso_disk *disk, void *efipartimg) +{ + return 0; +} + + +int hiperiso_disk_init(void) +{ + g_disk_list = malloc(sizeof(hiperiso_disk) * MAX_DISK_NUM); + + hiperiso_disk_enumerate_all(); + hiperiso_disk_dump_all(); + + return 0; +} + +void hiperiso_disk_exit(void) +{ + check_free(g_disk_list); + g_disk_list = NULL; + g_disk_num = 0; +} + + diff --git a/src/gui/Core/hiperiso_disk.h b/src/gui/Core/hiperiso_disk.h new file mode 100644 index 0000000..b2f94a9 --- /dev/null +++ b/src/gui/Core/hiperiso_disk.h @@ -0,0 +1,145 @@ +/****************************************************************************** + * hiperiso_disk.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_DISK_H__ +#define __HIPERISO_DISK_H__ + +typedef enum +{ + HISO_DEVICE_UNKNOWN = 0, + HISO_DEVICE_SCSI, + HISO_DEVICE_USB, + HISO_DEVICE_IDE, + HISO_DEVICE_DAC960, + HISO_DEVICE_CPQARRAY, + HISO_DEVICE_FILE, + HISO_DEVICE_ATARAID, + HISO_DEVICE_I2O, + HISO_DEVICE_UBD, + HISO_DEVICE_DASD, + HISO_DEVICE_VIODASD, + HISO_DEVICE_SX8, + HISO_DEVICE_DM, + HISO_DEVICE_XVD, + HISO_DEVICE_SDMMC, + HISO_DEVICE_VIRTBLK, + HISO_DEVICE_AOE, + HISO_DEVICE_MD, + HISO_DEVICE_LOOP, + HISO_DEVICE_NVME, + HISO_DEVICE_RAM, + HISO_DEVICE_PMEM, + + HISO_DEVICE_END +}hiperiso_dev_type; + +/* from */ +#define IDE0_MAJOR 3 +#define IDE1_MAJOR 22 +#define IDE2_MAJOR 33 +#define IDE3_MAJOR 34 +#define IDE4_MAJOR 56 +#define IDE5_MAJOR 57 +#define SCSI_CDROM_MAJOR 11 +#define SCSI_DISK0_MAJOR 8 +#define SCSI_DISK1_MAJOR 65 +#define SCSI_DISK2_MAJOR 66 +#define SCSI_DISK3_MAJOR 67 +#define SCSI_DISK4_MAJOR 68 +#define SCSI_DISK5_MAJOR 69 +#define SCSI_DISK6_MAJOR 70 +#define SCSI_DISK7_MAJOR 71 +#define SCSI_DISK8_MAJOR 128 +#define SCSI_DISK9_MAJOR 129 +#define SCSI_DISK10_MAJOR 130 +#define SCSI_DISK11_MAJOR 131 +#define SCSI_DISK12_MAJOR 132 +#define SCSI_DISK13_MAJOR 133 +#define SCSI_DISK14_MAJOR 134 +#define SCSI_DISK15_MAJOR 135 +#define COMPAQ_SMART2_MAJOR 72 +#define COMPAQ_SMART2_MAJOR1 73 +#define COMPAQ_SMART2_MAJOR2 74 +#define COMPAQ_SMART2_MAJOR3 75 +#define COMPAQ_SMART2_MAJOR4 76 +#define COMPAQ_SMART2_MAJOR5 77 +#define COMPAQ_SMART2_MAJOR6 78 +#define COMPAQ_SMART2_MAJOR7 79 +#define COMPAQ_SMART_MAJOR 104 +#define COMPAQ_SMART_MAJOR1 105 +#define COMPAQ_SMART_MAJOR2 106 +#define COMPAQ_SMART_MAJOR3 107 +#define COMPAQ_SMART_MAJOR4 108 +#define COMPAQ_SMART_MAJOR5 109 +#define COMPAQ_SMART_MAJOR6 110 +#define COMPAQ_SMART_MAJOR7 111 +#define DAC960_MAJOR 48 +#define ATARAID_MAJOR 114 +#define I2O_MAJOR1 80 +#define I2O_MAJOR2 81 +#define I2O_MAJOR3 82 +#define I2O_MAJOR4 83 +#define I2O_MAJOR5 84 +#define I2O_MAJOR6 85 +#define I2O_MAJOR7 86 +#define I2O_MAJOR8 87 +#define UBD_MAJOR 98 +#define DASD_MAJOR 94 +#define VIODASD_MAJOR 112 +#define AOE_MAJOR 152 +#define SX8_MAJOR1 160 +#define SX8_MAJOR2 161 +#define XVD_MAJOR 202 +#define SDMMC_MAJOR 179 +#define LOOP_MAJOR 7 +#define MD_MAJOR 9 +#define BLKEXT_MAJOR 259 +#define RAM_MAJOR 1 + +#define SCSI_BLK_MAJOR(M) ( \ + (M) == SCSI_DISK0_MAJOR \ + || (M) == SCSI_CDROM_MAJOR \ + || ((M) >= SCSI_DISK1_MAJOR && (M) <= SCSI_DISK7_MAJOR) \ + || ((M) >= SCSI_DISK8_MAJOR && (M) <= SCSI_DISK15_MAJOR)) + +#define IDE_BLK_MAJOR(M) \ + ((M) == IDE0_MAJOR || \ + (M) == IDE1_MAJOR || \ + (M) == IDE2_MAJOR || \ + (M) == IDE3_MAJOR || \ + (M) == IDE4_MAJOR || \ + (M) == IDE5_MAJOR) + +#define SX8_BLK_MAJOR(M) ((M) >= SX8_MAJOR1 && (M) <= SX8_MAJOR2) +#define I2O_BLK_MAJOR(M) ((M) >= I2O_MAJOR1 && (M) <= I2O_MAJOR8) +#define CPQARRAY_BLK_MAJOR(M) \ + (((M) >= COMPAQ_SMART2_MAJOR && (M) <= COMPAQ_SMART2_MAJOR7) || \ + (COMPAQ_SMART_MAJOR <= (M) && (M) <= COMPAQ_SMART_MAJOR7)) + +#define HIPERISO_FILE_STG1_IMG "boot/core.img.xz" +#define HIPERISO_FILE_DISK_IMG "hiperiso/hiperiso.disk.img.xz" + +extern int g_disk_num; +extern hiperiso_disk *g_disk_list; +int hiperiso_disk_enumerate_all(void); +int hiperiso_disk_init(void); +void hiperiso_disk_exit(void); + +#endif /* __HIPERISO_DISK_H__ */ + diff --git a/src/gui/Core/hiperiso_json.c b/src/gui/Core/hiperiso_json.c new file mode 100644 index 0000000..a60fd11 --- /dev/null +++ b/src/gui/Core/hiperiso_json.c @@ -0,0 +1,718 @@ +/****************************************************************************** + * hiperiso_json.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static void hiso_json_free(HISO_JSON *pstJsonHead) +{ + HISO_JSON *pstNext = NULL; + + while (NULL != pstJsonHead) + { + pstNext = pstJsonHead->pstNext; + if ((pstJsonHead->enDataType < JSON_TYPE_BUTT) && (NULL != pstJsonHead->pstChild)) + { + hiso_json_free(pstJsonHead->pstChild); + } + + free(pstJsonHead); + pstJsonHead = pstNext; + } + + return; +} + +static char *hiso_json_skip(const char *pcData) +{ + while ((NULL != pcData) && ('\0' != *pcData) && (*pcData <= 32)) + { + pcData++; + } + + return (char *)pcData; +} + +HISO_JSON *hiso_json_find_item +( + HISO_JSON *pstJson, + JSON_TYPE enDataType, + const char *szKey +) +{ + while (NULL != pstJson) + { + if ((enDataType == pstJson->enDataType) && + (0 == strcmp(szKey, pstJson->pcName))) + { + return pstJson; + } + pstJson = pstJson->pstNext; + } + + return NULL; +} + +static int hiso_json_parse_number +( + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + unsigned long Value; + + Value = strtoul(pcData, (char **)ppcEnd, 10); + if (*ppcEnd == pcData) + { + vdebug("Failed to parse json number %s.\n", pcData); + return JSON_FAILED; + } + + pstJson->enDataType = JSON_TYPE_NUMBER; + pstJson->unData.lValue = Value; + + return JSON_SUCCESS; +} + +static int hiso_json_parse_string +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + uint32_t uiLen = 0; + const char *pcPos = NULL; + const char *pcTmp = pcData + 1; + + *ppcEnd = pcData; + + if ('\"' != *pcData) + { + return JSON_FAILED; + } + + pcPos = strchr(pcTmp, '\"'); + if ((NULL == pcPos) || (pcPos < pcTmp)) + { + vdebug("Invalid string %s.\n", pcData); + return JSON_FAILED; + } + + *ppcEnd = pcPos + 1; + uiLen = (uint32_t)(unsigned long)(pcPos - pcTmp); + + pstJson->enDataType = JSON_TYPE_STRING; + pstJson->unData.pcStrVal = pcNewStart + (pcTmp - pcRawStart); + pstJson->unData.pcStrVal[uiLen] = '\0'; + + return JSON_SUCCESS; +} + +static int hiso_json_parse_array +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + int Ret = JSON_SUCCESS; + HISO_JSON *pstJsonChild = NULL; + HISO_JSON *pstJsonItem = NULL; + const char *pcTmp = pcData + 1; + + *ppcEnd = pcData; + pstJson->enDataType = JSON_TYPE_ARRAY; + + if ('[' != *pcData) + { + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(pcTmp); + + if (']' == *pcTmp) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + + JSON_NEW_ITEM(pstJson->pstChild, JSON_FAILED); + + Ret = hiso_json_parse_value(pcNewStart, pcRawStart, pstJson->pstChild, pcTmp, ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pstJsonChild = pstJson->pstChild; + pcTmp = hiso_json_skip(*ppcEnd); + while ((NULL != pcTmp) && (',' == *pcTmp)) + { + JSON_NEW_ITEM(pstJsonItem, JSON_FAILED); + pstJsonChild->pstNext = pstJsonItem; + pstJsonItem->pstPrev = pstJsonChild; + pstJsonChild = pstJsonItem; + + Ret = hiso_json_parse_value(pcNewStart, pcRawStart, pstJsonChild, hiso_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + pcTmp = hiso_json_skip(*ppcEnd); + } + + if ((NULL != pcTmp) && (']' == *pcTmp)) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + else + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } +} + +static int hiso_json_parse_object +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + int Ret = JSON_SUCCESS; + HISO_JSON *pstJsonChild = NULL; + HISO_JSON *pstJsonItem = NULL; + const char *pcTmp = pcData + 1; + + *ppcEnd = pcData; + pstJson->enDataType = JSON_TYPE_OBJECT; + + if ('{' != *pcData) + { + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(pcTmp); + if ('}' == *pcTmp) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + + JSON_NEW_ITEM(pstJson->pstChild, JSON_FAILED); + + Ret = hiso_json_parse_string(pcNewStart, pcRawStart, pstJson->pstChild, pcTmp, ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pstJsonChild = pstJson->pstChild; + pstJsonChild->pcName = pstJsonChild->unData.pcStrVal; + pstJsonChild->unData.pcStrVal = NULL; + + pcTmp = hiso_json_skip(*ppcEnd); + if ((NULL == pcTmp) || (':' != *pcTmp)) + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } + + Ret = hiso_json_parse_value(pcNewStart, pcRawStart, pstJsonChild, hiso_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(*ppcEnd); + while ((NULL != pcTmp) && (',' == *pcTmp)) + { + JSON_NEW_ITEM(pstJsonItem, JSON_FAILED); + pstJsonChild->pstNext = pstJsonItem; + pstJsonItem->pstPrev = pstJsonChild; + pstJsonChild = pstJsonItem; + + Ret = hiso_json_parse_string(pcNewStart, pcRawStart, pstJsonChild, hiso_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(*ppcEnd); + pstJsonChild->pcName = pstJsonChild->unData.pcStrVal; + pstJsonChild->unData.pcStrVal = NULL; + if ((NULL == pcTmp) || (':' != *pcTmp)) + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } + + Ret = hiso_json_parse_value(pcNewStart, pcRawStart, pstJsonChild, hiso_json_skip(pcTmp + 1), ppcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse array child.\n"); + return JSON_FAILED; + } + + pcTmp = hiso_json_skip(*ppcEnd); + } + + if ((NULL != pcTmp) && ('}' == *pcTmp)) + { + *ppcEnd = pcTmp + 1; + return JSON_SUCCESS; + } + else + { + *ppcEnd = pcTmp; + return JSON_FAILED; + } +} + +int hiso_json_parse_value +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +) +{ + pcData = hiso_json_skip(pcData); + + switch (*pcData) + { + case 'n': + { + if (0 == strncmp(pcData, "null", 4)) + { + pstJson->enDataType = JSON_TYPE_NULL; + *ppcEnd = pcData + 4; + return JSON_SUCCESS; + } + break; + } + case 'f': + { + if (0 == strncmp(pcData, "false", 5)) + { + pstJson->enDataType = JSON_TYPE_BOOL; + pstJson->unData.lValue = 0; + *ppcEnd = pcData + 5; + return JSON_SUCCESS; + } + break; + } + case 't': + { + if (0 == strncmp(pcData, "true", 4)) + { + pstJson->enDataType = JSON_TYPE_BOOL; + pstJson->unData.lValue = 1; + *ppcEnd = pcData + 4; + return JSON_SUCCESS; + } + break; + } + case '\"': + { + return hiso_json_parse_string(pcNewStart, pcRawStart, pstJson, pcData, ppcEnd); + } + case '[': + { + return hiso_json_parse_array(pcNewStart, pcRawStart, pstJson, pcData, ppcEnd); + } + case '{': + { + return hiso_json_parse_object(pcNewStart, pcRawStart, pstJson, pcData, ppcEnd); + } + case '-': + { + return hiso_json_parse_number(pstJson, pcData, ppcEnd); + } + default : + { + if (*pcData >= '0' && *pcData <= '9') + { + return hiso_json_parse_number(pstJson, pcData, ppcEnd); + } + } + } + + *ppcEnd = pcData; + vdebug("Invalid json data %u.\n", (uint8_t)(*pcData)); + return JSON_FAILED; +} + +HISO_JSON * hiso_json_create(void) +{ + HISO_JSON *pstJson = NULL; + + pstJson = (HISO_JSON *)zalloc(sizeof(HISO_JSON)); + if (NULL == pstJson) + { + return NULL; + } + + return pstJson; +} + +int hiso_json_parse(HISO_JSON *pstJson, const char *szJsonData) +{ + uint32_t uiMemSize = 0; + int Ret = JSON_SUCCESS; + char *pcNewBuf = NULL; + const char *pcEnd = NULL; + + uiMemSize = strlen(szJsonData) + 1; + pcNewBuf = (char *)malloc(uiMemSize); + if (NULL == pcNewBuf) + { + vdebug("Failed to alloc new buf.\n"); + return JSON_FAILED; + } + memcpy(pcNewBuf, szJsonData, uiMemSize); + pcNewBuf[uiMemSize - 1] = 0; + + Ret = hiso_json_parse_value(pcNewBuf, (char *)szJsonData, pstJson, szJsonData, &pcEnd); + if (JSON_SUCCESS != Ret) + { + vdebug("Failed to parse json data %s start=%p, end=%p:%s.\n", + szJsonData, szJsonData, pcEnd, pcEnd); + return JSON_FAILED; + } + + return JSON_SUCCESS; +} + +int hiso_json_scan_parse +( + const HISO_JSON *pstJson, + uint32_t uiParseNum, + HISO_JSON_PARSE_S *pstJsonParse +) +{ + uint32_t i = 0; + const HISO_JSON *pstJsonCur = NULL; + HISO_JSON_PARSE_S *pstCurParse = NULL; + + for (pstJsonCur = pstJson; NULL != pstJsonCur; pstJsonCur = pstJsonCur->pstNext) + { + if ((JSON_TYPE_OBJECT == pstJsonCur->enDataType) || + (JSON_TYPE_ARRAY == pstJsonCur->enDataType)) + { + continue; + } + + for (i = 0, pstCurParse = NULL; i < uiParseNum; i++) + { + if (0 == strcmp(pstJsonParse[i].pcKey, pstJsonCur->pcName)) + { + pstCurParse = pstJsonParse + i; + break; + } + } + + if (NULL == pstCurParse) + { + continue; + } + + switch (pstJsonCur->enDataType) + { + case JSON_TYPE_NUMBER: + { + if (sizeof(uint32_t) == pstCurParse->uiBufSize) + { + *(uint32_t *)(pstCurParse->pDataBuf) = (uint32_t)pstJsonCur->unData.lValue; + } + else if (sizeof(uint16_t) == pstCurParse->uiBufSize) + { + *(uint16_t *)(pstCurParse->pDataBuf) = (uint16_t)pstJsonCur->unData.lValue; + } + else if (sizeof(uint8_t) == pstCurParse->uiBufSize) + { + *(uint8_t *)(pstCurParse->pDataBuf) = (uint8_t)pstJsonCur->unData.lValue; + } + else if ((pstCurParse->uiBufSize > sizeof(uint64_t))) + { + snprintf((char *)pstCurParse->pDataBuf, pstCurParse->uiBufSize, "%llu", + (unsigned long long)(pstJsonCur->unData.lValue)); + } + else + { + vdebug("Invalid number data buf size %u.\n", pstCurParse->uiBufSize); + } + break; + } + case JSON_TYPE_STRING: + { + strncpy((char *)pstCurParse->pDataBuf, pstJsonCur->unData.pcStrVal, pstCurParse->uiBufSize); + break; + } + case JSON_TYPE_BOOL: + { + *(uint8_t *)(pstCurParse->pDataBuf) = (pstJsonCur->unData.lValue) > 0 ? 1 : 0; + break; + } + default : + { + break; + } + } + } + + return JSON_SUCCESS; +} + +int hiso_json_scan_array +( + HISO_JSON *pstJson, + const char *szKey, + HISO_JSON **ppstArrayItem +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_ARRAY, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *ppstArrayItem = pstJsonItem; + + return JSON_SUCCESS; +} + +int hiso_json_scan_array_ex +( + HISO_JSON *pstJson, + const char *szKey, + HISO_JSON **ppstArrayItem +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_ARRAY, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *ppstArrayItem = pstJsonItem->pstChild; + + return JSON_SUCCESS; +} + +int hiso_json_scan_object +( + HISO_JSON *pstJson, + const char *szKey, + HISO_JSON **ppstObjectItem +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_OBJECT, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *ppstObjectItem = pstJsonItem; + + return JSON_SUCCESS; +} + +int hiso_json_get_int +( + HISO_JSON *pstJson, + const char *szKey, + int *piValue +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_NUMBER, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *piValue = (int)pstJsonItem->unData.lValue; + + return JSON_SUCCESS; +} + +int hiso_json_get_uint +( + HISO_JSON *pstJson, + const char *szKey, + uint32_t *puiValue +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_NUMBER, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *puiValue = (uint32_t)pstJsonItem->unData.lValue; + + return JSON_SUCCESS; +} + +int hiso_json_get_uint64 +( + HISO_JSON *pstJson, + const char *szKey, + uint64_t *pui64Value +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_NUMBER, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *pui64Value = (uint64_t)pstJsonItem->unData.lValue; + + return JSON_SUCCESS; +} + +int hiso_json_get_bool +( + HISO_JSON *pstJson, + const char *szKey, + uint8_t *pbValue +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_BOOL, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + *pbValue = pstJsonItem->unData.lValue > 0 ? 1 : 0; + + return JSON_SUCCESS; +} + +int hiso_json_get_string +( + HISO_JSON *pstJson, + const char *szKey, + uint32_t uiBufLen, + char *pcBuf +) +{ + HISO_JSON *pstJsonItem = NULL; + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_STRING, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return JSON_NOT_FOUND; + } + + strncpy(pcBuf, pstJsonItem->unData.pcStrVal, uiBufLen); + + return JSON_SUCCESS; +} + +const char * hiso_json_get_string_ex(HISO_JSON *pstJson, const char *szKey) +{ + HISO_JSON *pstJsonItem = NULL; + + if ((NULL == pstJson) || (NULL == szKey)) + { + return NULL; + } + + pstJsonItem = hiso_json_find_item(pstJson, JSON_TYPE_STRING, szKey); + if (NULL == pstJsonItem) + { + vdebug("Key %s is not found in json data.\n", szKey); + return NULL; + } + + return pstJsonItem->unData.pcStrVal; +} + +int hiso_json_destroy(HISO_JSON *pstJson) +{ + if (NULL == pstJson) + { + return JSON_SUCCESS; + } + + if (NULL != pstJson->pstChild) + { + hiso_json_free(pstJson->pstChild); + } + + if (NULL != pstJson->pstNext) + { + hiso_json_free(pstJson->pstNext); + } + + free(pstJson); + + return JSON_SUCCESS; +} + diff --git a/src/gui/Core/hiperiso_json.h b/src/gui/Core/hiperiso_json.h new file mode 100644 index 0000000..5b727a3 --- /dev/null +++ b/src/gui/Core/hiperiso_json.h @@ -0,0 +1,268 @@ +/****************************************************************************** + * hiperiso_json.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_JSON_H__ +#define __HIPERISO_JSON_H__ + +#define JSON_NEW_ITEM(pstJson, ret) \ +{ \ + (pstJson) = (HISO_JSON *)zalloc(sizeof(HISO_JSON)); \ + if (NULL == (pstJson)) \ + { \ + vdebug("Failed to alloc memory for json."); \ + return (ret); \ + } \ +} + +#define ssprintf(curpos, buf, len, fmt, args...) \ + curpos += snprintf(buf + curpos, len - curpos, fmt, ##args) + +#define HISO_JSON_IS_SKIPABLE(c) (((c) <= 32) ? 1 : 0) + +#define HISO_JSON_PRINT_PREFIX(uiDepth, args...) \ +{ \ + uint32_t _uiLoop = 0; \ + for (_uiLoop = 0; _uiLoop < (uiDepth); _uiLoop++) \ + { \ + ssprintf(uiCurPos, pcBuf, uiBufLen, " "); \ + } \ + ssprintf(uiCurPos, pcBuf, uiBufLen, ##args); \ +} + +#define HISO_JSON_SUCCESS_RET "{ \"result\" : \"success\" }" +#define HISO_JSON_FAILED_RET "{ \"result\" : \"failed\" }" +#define HISO_JSON_INVALID_RET "{ \"result\" : \"invalidfmt\" }" +#define HISO_JSON_TOKEN_ERR_RET "{ \"result\" : \"tokenerror\" }" +#define HISO_JSON_EXIST_RET "{ \"result\" : \"exist\" }" +#define HISO_JSON_TIMEOUT_RET "{ \"result\" : \"timeout\" }" +#define HISO_JSON_BUSY_RET "{ \"result\" : \"busy\" }" +#define HISO_JSON_INUSE_RET "{ \"result\" : \"inuse\" }" +#define HISO_JSON_NOTFOUND_RET "{ \"result\" : \"notfound\" }" +#define HISO_JSON_NOTRUNNING_RET "{ \"result\" : \"notrunning\" }" +#define HISO_JSON_NOT_READY_RET "{ \"result\" : \"notready\" }" +#define HISO_JSON_NOT_SUPPORT_RET "{ \"result\" : \"notsupport\" }" +#define HISO_JSON_MBR_2TB_RET "{ \"result\" : \"mbr2tb\" }" +#define HISO_JSON_4KN_RET "{ \"result\" : \"4kn\" }" +#define HISO_JSON_INVALID_RSV_RET "{ \"result\" : \"reserve_invalid\" }" +#define HISO_JSON_FILE_NOT_FOUND_RET "{ \"result\" : \"file_not_found\" }" + +typedef enum tagJSON_TYPE +{ + JSON_TYPE_NUMBER = 0, + JSON_TYPE_STRING, + JSON_TYPE_BOOL, + JSON_TYPE_ARRAY, + JSON_TYPE_OBJECT, + JSON_TYPE_NULL, + JSON_TYPE_BUTT +}JSON_TYPE; + +typedef struct tagHISO_JSON +{ + struct tagHISO_JSON *pstPrev; + struct tagHISO_JSON *pstNext; + struct tagHISO_JSON *pstChild; + + JSON_TYPE enDataType; + union + { + char *pcStrVal; + int iNumVal; + uint64_t lValue; + }unData; + + char *pcName; +}HISO_JSON; + +#define HISO_JSON_FMT_BEGIN(uiCurPos, pcBuf, uiBufLen) \ +{\ + uint32_t __uiCurPos = (uiCurPos);\ + uint32_t __uiBufLen = (uiBufLen);\ + char *__pcBuf = (pcBuf); + +#define HISO_JSON_FMT_END(uiCurPos) \ + (uiCurPos) = __uiCurPos;\ +} + +#define HISO_JSON_FMT_OBJ_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "{") + +#define HISO_JSON_FMT_OBJ_END() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\ +} + +#define HISO_JSON_FMT_OBJ_ENDEX() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "},");\ +} + +#define HISO_JSON_FMT_KEY(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":", (Key)) + +#define HISO_JSON_FMT_ITEM(Item) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\",", (Item)) + +#define HISO_JSON_FMT_COMA() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ","); + +#define HISO_JSON_FMT_APPEND_BEGIN() \ +{ \ + if ('}' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, ",");\ +} + +#define HISO_JSON_FMT_APPEND_END() \ +{ \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "}");\ +} + +#define HISO_JSON_FMT_ARY_BEGIN() ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "[") + +#define HISO_JSON_FMT_ARY_END() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "]");\ +} + +#define HISO_JSON_FMT_ARY_ENDEX() \ +{\ + if (',' == *(__pcBuf + (__uiCurPos - 1)))\ + {\ + __uiCurPos -= 1;\ + }\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "],");\ +} + +#define HISO_JSON_FMT_UINT64(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%llu,", Key, (_ull)Val) + +#define HISO_JSON_FMT_ULONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%lu,", Key, Val) +#define HISO_JSON_FMT_LONG(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%ld,", Key, Val) + +#define HISO_JSON_FMT_UINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%u,", Key, Val) + +#define HISO_JSON_FMT_STRINT(Key, Val) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":\"%u\",", Key, Val) + +#define HISO_JSON_FMT_STRINT64(Key, Val) \ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":\"%llu\",", Key, Val) + +#define HISO_JSON_FMT_SINT(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%d,", Key, Val) + +#define HISO_JSON_FMT_DUBL(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%.1lf,", Key, Val) +#define HISO_JSON_FMT_DUBL2(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":%10.02lf,", Key, Val) + +#define HISO_JSON_FMT_STRN(Key, Val) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":\"%s\",", Key, Val) + +#define HISO_JSON_FMT_NULL(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":null,", Key) + +#define HISO_JSON_FMT_TRUE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":true,", (Key)) +#define HISO_JSON_FMT_FALSE(Key) ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":false,", (Key)) + +#define HISO_JSON_FMT_BOOL(Key, Val) \ +{\ + if (0 == (Val))\ + {\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":false,", (Key));\ + }\ + else \ + {\ + ssprintf(__uiCurPos, __pcBuf, __uiBufLen, "\"%s\":true,", (Key));\ + }\ +} + +typedef struct tagHISO_JSON_PARSE +{ + char *pcKey; + void *pDataBuf; + uint32_t uiBufSize; +}HISO_JSON_PARSE_S; + +#define JSON_SUCCESS 0 +#define JSON_FAILED 1 +#define JSON_NOT_FOUND 2 + +int hiso_json_parse_value +( + char *pcNewStart, + char *pcRawStart, + HISO_JSON *pstJson, + const char *pcData, + const char **ppcEnd +); +HISO_JSON * hiso_json_create(void); +int hiso_json_parse(HISO_JSON *pstJson, const char *szJsonData); +int hiso_json_destroy(HISO_JSON *pstJson); +HISO_JSON *hiso_json_find_item +( + HISO_JSON *pstJson, + JSON_TYPE enDataType, + const char *szKey +); +int hiso_json_scan_parse +( + const HISO_JSON *pstJson, + uint32_t uiParseNum, + HISO_JSON_PARSE_S *pstJsonParse +); +int hiso_json_get_int +( + HISO_JSON *pstJson, + const char *szKey, + int *piValue +); +int hiso_json_get_uint +( + HISO_JSON *pstJson, + const char *szKey, + uint32_t *puiValue +); +int hiso_json_get_uint64 +( + HISO_JSON *pstJson, + const char *szKey, + uint64_t *pui64Value +); +int hiso_json_get_bool +( + HISO_JSON *pstJson, + const char *szKey, + uint8_t *pbValue +); +int hiso_json_get_string +( + HISO_JSON *pstJson, + const char *szKey, + uint32_t uiBufLen, + char *pcBuf +); +const char * hiso_json_get_string_ex(HISO_JSON *pstJson, const char *szKey); + +#endif /* __HIPERISO_JSON_H__ */ + diff --git a/src/gui/Core/hiperiso_log.c b/src/gui/Core/hiperiso_log.c new file mode 100644 index 0000000..f74f8fe --- /dev/null +++ b/src/gui/Core/hiperiso_log.c @@ -0,0 +1,145 @@ +/****************************************************************************** + * hiperiso_log.c ---- hiperiso log + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern char g_log_file[PATH_MAX]; +static int g_hiperiso_log_level = VLOG_DEBUG; +static pthread_mutex_t g_log_mutex; + +int hiperiso_log_init(void) +{ + pthread_mutex_init(&g_log_mutex, NULL); + return 0; +} + +void hiperiso_log_exit(void) +{ + pthread_mutex_destroy(&g_log_mutex); +} + +void hiperiso_set_loglevel(int level) +{ + g_hiperiso_log_level = level; +} + +void hiperiso_syslog_newline(int level, const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + if (level > g_hiperiso_log_level) + { + return; + } + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); + vsnprintf(log, 512, Fmt, arg); + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); + fp = fopen(g_log_file, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s\n", + ttm.tm_year, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + } + pthread_mutex_unlock(&g_log_mutex); +} + +void hiperiso_syslog_printf(const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); + vsnprintf(log, 512, Fmt, arg); + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); + fp = fopen(g_log_file, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + } + pthread_mutex_unlock(&g_log_mutex); +} + +void hiperiso_syslog(int level, const char *Fmt, ...) +{ + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + if (level > g_hiperiso_log_level) + { + return; + } + + time(&stamp); + localtime_r(&stamp, &ttm); + + va_start(arg, Fmt); + vsnprintf(log, 512, Fmt, arg); + va_end(arg); + + pthread_mutex_lock(&g_log_mutex); + fp = fopen(g_log_file, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + log); + fclose(fp); + } + pthread_mutex_unlock(&g_log_mutex); +} + diff --git a/src/gui/Core/hiperiso_md5.c b/src/gui/Core/hiperiso_md5.c new file mode 100644 index 0000000..bf0aa2b --- /dev/null +++ b/src/gui/Core/hiperiso_md5.c @@ -0,0 +1,167 @@ +/****************************************************************************** + * hiperiso_md5.c ---- hiperiso md5 + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include + +const static uint32_t k[64] = +{ + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 +}; + +const static uint32_t r[] = +{ + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 +}; + +#define LEFTROTATE(x, c) (((x) << (c)) | ((x) >> (32 - (c)))) +#define to_bytes(val, bytes) *((uint32_t *)(bytes)) = (val) + +#define ROTATE_CALC() \ +{\ + temp = d; \ + d = c; \ + c = b; \ + b = b + LEFTROTATE((a + f + k[i] + w[g]), r[i]); \ + a = temp; \ +} + +void hiperiso_md5(const void *data, uint32_t len, uint8_t *md5) +{ + uint32_t h0, h1, h2, h3; + uint32_t w[16]; + uint32_t a, b, c, d, i, f, g, temp; + uint32_t offset, mod, delta; + uint8_t postbuf[128] = {0}; + + // Initialize variables - simple count in nibbles: + h0 = 0x67452301; + h1 = 0xefcdab89; + h2 = 0x98badcfe; + h3 = 0x10325476; + + //Pre-processing: + //append "1" bit to message + //append "0" bits until message length in bits ≡ 448 (mod 512) + //append length mod (2^64) to message + + mod = len % 64; + if (mod) + { + memcpy(postbuf, (const uint8_t *)data + len - mod, mod); + } + + postbuf[mod] = 0x80; + if (mod < 56) + { + to_bytes(len * 8, postbuf + 56); + to_bytes(len >> 29, postbuf + 60); + delta = 64; + } + else + { + to_bytes(len * 8, postbuf + 120); + to_bytes(len >> 29, postbuf + 124); + delta = 128; + } + + len -= mod; + + for (offset = 0; offset < len + delta; offset += 64) + { + if (offset < len) + { + memcpy(w, (const uint8_t *)data + offset, 64); + } + else + { + memcpy(w, postbuf + offset - len, 64); + } + + // Initialize hash value for this chunk: + a = h0; + b = h1; + c = h2; + d = h3; + + // Main loop: + for (i = 0; i < 16; i++) + { + f = (b & c) | ((~b) & d); + g = i; + ROTATE_CALC(); + } + + for (i = 16; i < 32; i++) + { + f = (d & b) | ((~d) & c); + g = (5 * i + 1) % 16; + ROTATE_CALC(); + } + + for (i = 32; i < 48; i++) + { + f = b ^ c ^ d; + g = (3 * i + 5) % 16; + ROTATE_CALC(); + } + + for (i = 48; i < 64; i++) + { + f = c ^ (b | (~d)); + g = (7 * i) % 16; + ROTATE_CALC(); + } + + // Add this chunk's hash to result so far: + h0 += a; + h1 += b; + h2 += c; + h3 += d; + } + + //var char md5[16] := h0 append h1 append h2 append h3 //(Output is in little-endian) + to_bytes(h0, md5); + to_bytes(h1, md5 + 4); + to_bytes(h2, md5 + 8); + to_bytes(h3, md5 + 12); +} + diff --git a/src/gui/Core/hiperiso_util.c b/src/gui/Core/hiperiso_util.c new file mode 100644 index 0000000..d8fc90c --- /dev/null +++ b/src/gui/Core/hiperiso_util.c @@ -0,0 +1,646 @@ +/****************************************************************************** + * hiperiso_util.c ---- hiperiso util + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +uint8_t g_mbr_template[512]; + +void hiperiso_gen_preudo_uuid(void *uuid) +{ + int i; + int fd; + + fd = open("/dev/urandom", O_RDONLY | O_BINARY); + if (fd < 0) + { + srand(time(NULL)); + for (i = 0; i < 8; i++) + { + *((uint16_t *)uuid + i) = (uint16_t)(rand() & 0xFFFF); + } + } + else + { + read(fd, uuid, 16); + close(fd); + } +} + +uint64_t hiperiso_get_human_readable_gb(uint64_t SizeBytes) +{ + int i; + int Pow2 = 1; + double Delta; + double GB = SizeBytes * 1.0 / 1000 / 1000 / 1000; + + if ((SizeBytes % SIZE_1GB) == 0) + { + return (uint64_t)(SizeBytes / SIZE_1GB); + } + + for (i = 0; i < 12; i++) + { + if (Pow2 > GB) + { + Delta = (Pow2 - GB) / Pow2; + } + else + { + Delta = (GB - Pow2) / Pow2; + } + + if (Delta < 0.05) + { + return Pow2; + } + + Pow2 <<= 1; + } + + return (uint64_t)GB; +} + + +int hiperiso_get_sys_file_line(char *buffer, int buflen, const char *fmt, ...) +{ + int len; + char c; + char path[256]; + va_list arg; + + va_start(arg, fmt); + vsnprintf(path, 256, fmt, arg); + va_end(arg); + + if (access(path, F_OK) >= 0) + { + FILE *fp = fopen(path, "r"); + memset(buffer, 0, buflen); + len = (int)fread(buffer, 1, buflen - 1, fp); + fclose(fp); + + while (len > 0) + { + c = buffer[len - 1]; + if (c == '\r' || c == '\n' || c == ' ' || c == '\t') + { + buffer[len - 1] = 0; + len--; + } + else + { + break; + } + } + + return 0; + } + else + { + vdebug("%s not exist \n", path); + return 1; + } +} + +int hiperiso_is_disk_mounted(const char *devpath) +{ + int len; + int mount = 0; + char line[512]; + FILE *fp = NULL; + + fp = fopen("/proc/mounts", "r"); + if (!fp) + { + return 0; + } + + len = (int)strlen(devpath); + while (fgets(line, sizeof(line), fp)) + { + if (strncmp(line, devpath, len) == 0) + { + mount = 1; + vdebug("%s mounted <%s>\n", devpath, line); + goto end; + } + } + +end: + fclose(fp); + return mount; +} + +static int hiperiso_mount_path_escape(char *src, char *dst, int len) +{ + int i = 0; + int n = 0; + + dst[len - 1] = 0; + + for (i = 0; i < len - 1; i++) + { + if (src[i] == '\\' && src[i + 1] == '0' && src[i + 2] == '4' && src[i + 3] == '0') + { + dst[n++] = ' '; + i += 3; + } + else + { + dst[n++] = src[i]; + } + + if (src[i] == 0) + { + break; + } + } + + return 0; +} + +int hiperiso_try_umount_disk(const char *devpath) +{ + int rc; + int len; + char line[1024]; + char mntpt[1024]; + char *pos1 = NULL; + char *pos2 = NULL; + FILE *fp = NULL; + + fp = fopen("/proc/mounts", "r"); + if (!fp) + { + return 0; + } + + len = (int)strlen(devpath); + while (fgets(line, sizeof(line), fp)) + { + if (strncmp(line, devpath, len) == 0) + { + pos1 = strchr(line, ' '); + if (pos1) + { + pos2 = strchr(pos1 + 1, ' '); + if (pos2) + { + *pos2 = 0; + } + + hiperiso_mount_path_escape(pos1 + 1, mntpt, sizeof(mntpt)); + rc = umount(mntpt); + if (rc) + { + vdebug("umount <%s> <%s> [ failed ] error:%d\n", devpath, mntpt, errno); + } + else + { + vdebug("umount <%s> <%s> [ success ]\n", devpath, mntpt); + } + } + } + } + + fclose(fp); + return 0; +} + +int hiperiso_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen) +{ + int FileSize; + FILE *fp = NULL; + void *Data = NULL; + + fp = fopen(FileName, "rb"); + if (fp == NULL) + { + vlog("Failed to open file %s", FileName); + return 1; + } + + fseek(fp, 0, SEEK_END); + FileSize = (int)ftell(fp); + + Data = malloc(FileSize + ExtLen); + if (!Data) + { + fclose(fp); + return 1; + } + + fseek(fp, 0, SEEK_SET); + fread(Data, 1, FileSize, fp); + + fclose(fp); + + *Bufer = Data; + *BufLen = FileSize; + + return 0; +} + +const char * hiperiso_get_local_version(void) +{ + int rc; + int FileSize; + char *Pos = NULL; + char *Buf = NULL; + static char LocalVersion[64] = { 0 }; + + if (LocalVersion[0] == 0) + { + rc = hiperiso_read_file_to_buf("hiperiso/version", 1, (void **)&Buf, &FileSize); + if (rc) + { + return ""; + } + Buf[FileSize] = 0; + + for (Pos = Buf; *Pos; Pos++) + { + if (*Pos == '\r' || *Pos == '\n') + { + *Pos = 0; + break; + } + } + + scnprintf(LocalVersion, "%s", Buf); + free(Buf); + } + + return LocalVersion; +} + +int HiperisoGetLocalBootImg(MBR_HEAD *pMBR) +{ + memcpy(pMBR, g_mbr_template, 512); + return 0; +} + +static int HiperisoFillProtectMBR(uint64_t DiskSizeBytes, MBR_HEAD *pMBR) +{ + hiperiso_guid Guid; + uint32_t DiskSignature; + uint64_t DiskSectorCount; + + HiperisoGetLocalBootImg(pMBR); + + hiperiso_gen_preudo_uuid(&Guid); + + memcpy(&DiskSignature, &Guid, sizeof(uint32_t)); + + vdebug("Disk signature: 0x%08x\n", DiskSignature); + + memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4); + memcpy(pMBR->BootCode + 0x180, &Guid, 16); + + DiskSectorCount = DiskSizeBytes / 512 - 1; + if (DiskSectorCount > 0xFFFFFFFF) + { + DiskSectorCount = 0xFFFFFFFF; + } + + memset(pMBR->PartTbl, 0, sizeof(pMBR->PartTbl)); + + pMBR->PartTbl[0].Active = 0x00; + pMBR->PartTbl[0].FsFlag = 0xee; // EE + + pMBR->PartTbl[0].StartHead = 0; + pMBR->PartTbl[0].StartSector = 1; + pMBR->PartTbl[0].StartCylinder = 0; + pMBR->PartTbl[0].EndHead = 254; + pMBR->PartTbl[0].EndSector = 63; + pMBR->PartTbl[0].EndCylinder = 1023; + + pMBR->PartTbl[0].StartSectorId = 1; + pMBR->PartTbl[0].SectorCount = (uint32_t)DiskSectorCount; + + pMBR->Byte55 = 0x55; + pMBR->ByteAA = 0xAA; + + pMBR->BootCode[92] = 0x22; + + return 0; +} + +static int hiperiso_fill_gpt_partname(uint16_t Name[36], const char *asciiName) +{ + int i; + int len; + + memset(Name, 0, 36 * sizeof(uint16_t)); + len = (int)strlen(asciiName); + for (i = 0; i < 36 && i < len; i++) + { + Name[i] = asciiName[i]; + } + + return 0; +} + +int hiperiso_fill_gpt(uint64_t size, uint64_t reserve, int align4k, HISO_GPT_INFO *gpt) +{ + uint64_t ReservedSector = 33; + uint64_t ModSectorCount = 0; + uint64_t Part1SectorCount = 0; + uint64_t DiskSectorCount = size / 512; + HISO_GPT_HDR *Head = &gpt->Head; + HISO_GPT_PART_TBL *Table = gpt->PartTbl; + hiperiso_guid WindowsDataPartType = { 0xebd0a0a2, 0xb9e5, 0x4433, { 0x87, 0xc0, 0x68, 0xb6, 0xb7, 0x26, 0x99, 0xc7 } }; + //hiperiso_guid EspPartType = { 0xc12a7328, 0xf81f, 0x11d2, { 0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b } }; + //hiperiso_guid BiosGrubPartType = { 0x21686148, 0x6449, 0x6e6f, { 0x74, 0x4e, 0x65, 0x65, 0x64, 0x45, 0x46, 0x49 } }; + + HiperisoFillProtectMBR(size, &gpt->MBR); + + if (reserve > 0) + { + ReservedSector += reserve / 512; + } + + Part1SectorCount = DiskSectorCount - ReservedSector - (HISOEFI_PART_BYTES / 512) - 2048; + + ModSectorCount = (Part1SectorCount % 8); + if (ModSectorCount) + { + vlog("Part1SectorCount:%llu is not aligned by 4KB (%llu)\n", (_ull)Part1SectorCount, (_ull)ModSectorCount); + } + + // check aligned with 4KB + if (align4k) + { + if (ModSectorCount) + { + vdebug("Disk need to align with 4KB %u\n", (uint32_t)ModSectorCount); + Part1SectorCount -= ModSectorCount; + } + else + { + vdebug("no need to align with 4KB\n"); + } + } + + memcpy(Head->Signature, "EFI PART", 8); + Head->Version[2] = 0x01; + Head->Length = 92; + Head->Crc = 0; + Head->EfiStartLBA = 1; + Head->EfiBackupLBA = DiskSectorCount - 1; + Head->PartAreaStartLBA = 34; + Head->PartAreaEndLBA = DiskSectorCount - 34; + hiperiso_gen_preudo_uuid(&Head->DiskGuid); + Head->PartTblStartLBA = 2; + Head->PartTblTotNum = 128; + Head->PartTblEntryLen = 128; + + + memcpy(&(Table[0].PartType), &WindowsDataPartType, sizeof(hiperiso_guid)); + hiperiso_gen_preudo_uuid(&(Table[0].PartGuid)); + Table[0].StartLBA = 2048; + Table[0].LastLBA = 2048 + Part1SectorCount - 1; + Table[0].Attr = 0; + hiperiso_fill_gpt_partname(Table[0].Name, "Hiperiso"); + + // to fix windows issue + //memcpy(&(Table[1].PartType), &EspPartType, sizeof(GUID)); + memcpy(&(Table[1].PartType), &WindowsDataPartType, sizeof(hiperiso_guid)); + hiperiso_gen_preudo_uuid(&(Table[1].PartGuid)); + Table[1].StartLBA = Table[0].LastLBA + 1; + Table[1].LastLBA = Table[1].StartLBA + HISOEFI_PART_BYTES / 512 - 1; + Table[1].Attr = 0x8000000000000000ULL; + hiperiso_fill_gpt_partname(Table[1].Name, "HISOEFI"); + +#if 0 + memcpy(&(Table[2].PartType), &BiosGrubPartType, sizeof(hiperiso_guid)); + hiperiso_gen_preudo_uuid(&(Table[2].PartGuid)); + Table[2].StartLBA = 34; + Table[2].LastLBA = 2047; + Table[2].Attr = 0; +#endif + + //Update CRC + Head->PartTblCrc = hiperiso_crc32(Table, sizeof(gpt->PartTbl)); + Head->Crc = hiperiso_crc32(Head, Head->Length); + + return 0; +} + +int HiperisoFillMBRLocation(uint64_t DiskSizeInBytes, uint32_t StartSectorId, uint32_t SectorCount, PART_TABLE *Table) +{ + uint8_t Head; + uint8_t Sector; + uint8_t nSector = 63; + uint8_t nHead = 8; + uint32_t Cylinder; + uint32_t EndSectorId; + + while (nHead != 0 && (DiskSizeInBytes / 512 / nSector / nHead) > 1024) + { + nHead = (uint8_t)nHead * 2; + } + + if (nHead == 0) + { + nHead = 255; + } + + Cylinder = StartSectorId / nSector / nHead; + Head = StartSectorId / nSector % nHead; + Sector = StartSectorId % nSector + 1; + + Table->StartHead = Head; + Table->StartSector = Sector; + Table->StartCylinder = Cylinder; + + EndSectorId = StartSectorId + SectorCount - 1; + Cylinder = EndSectorId / nSector / nHead; + Head = EndSectorId / nSector % nHead; + Sector = EndSectorId % nSector + 1; + + Table->EndHead = Head; + Table->EndSector = Sector; + Table->EndCylinder = Cylinder; + + Table->StartSectorId = StartSectorId; + Table->SectorCount = SectorCount; + + return 0; +} + +int hiperiso_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR) +{ + hiperiso_guid Guid; + uint32_t DiskSignature; + uint32_t DiskSectorCount; + uint32_t PartSectorCount; + uint32_t PartStartSector; + uint32_t ReservedSector; + + HiperisoGetLocalBootImg(pMBR); + + hiperiso_gen_preudo_uuid(&Guid); + + memcpy(&DiskSignature, &Guid, sizeof(uint32_t)); + + vdebug("Disk signature: 0x%08x\n", DiskSignature); + + memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4); + memcpy(pMBR->BootCode + 0x180, &Guid, 16); + + if (size / 512 > 0xFFFFFFFF) + { + DiskSectorCount = 0xFFFFFFFF; + } + else + { + DiskSectorCount = (uint32_t)(size / 512); + } + + if (reserve <= 0) + { + ReservedSector = 0; + } + else + { + ReservedSector = (uint32_t)(reserve / 512); + } + + // check aligned with 4KB + if (align4k) + { + uint64_t sectors = size / 512; + if (sectors % 8) + { + vlog("Disk need to align with 4KB %u\n", (uint32_t)(sectors % 8)); + ReservedSector += (uint32_t)(sectors % 8); + } + else + { + vdebug("no need to align with 4KB\n"); + } + } + + vlog("ReservedSector: %u\n", ReservedSector); + + //Part1 + PartStartSector = HISOIMG_PART_START_SECTOR; + PartSectorCount = DiskSectorCount - ReservedSector - HISOEFI_PART_BYTES / 512 - PartStartSector; + HiperisoFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl); + + pMBR->PartTbl[0].Active = 0x80; // bootable + pMBR->PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS + + //Part2 + PartStartSector += PartSectorCount; + PartSectorCount = HISOEFI_PART_BYTES / 512; + HiperisoFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl + 1); + + pMBR->PartTbl[1].Active = 0x00; + pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition + + pMBR->Byte55 = 0x55; + pMBR->ByteAA = 0xAA; + + return 0; +} + +int hiperiso_fill_mbr_4k(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR) +{ + hiperiso_guid Guid; + uint32_t DiskSignature; + uint32_t DiskSectorCount; + uint32_t PartSectorCount; + uint32_t PartStartSector; + uint32_t ReservedSector; + + HiperisoGetLocalBootImg(pMBR); + + hiperiso_gen_preudo_uuid(&Guid); + + memcpy(&DiskSignature, &Guid, sizeof(uint32_t)); + + vdebug("Disk signature: 0x%08x\n", DiskSignature); + + memcpy(pMBR->BootCode + 0x1B8, &DiskSignature, 4); + memcpy(pMBR->BootCode + 0x180, &Guid, 16); + + if (size / 4096 > 0xFFFFFFFF) + { + DiskSectorCount = 0xFFFFFFFF; + } + else + { + DiskSectorCount = (uint32_t)(size / 4096); + } + + if (reserve <= 0) + { + ReservedSector = 0; + } + else + { + ReservedSector = (uint32_t)(reserve / 4096); + } + + // check aligned with 4KB + vdebug("no need to align with 4KB for 4K native disk\n"); + + vlog("ReservedSector: %u\n", ReservedSector); + + //Part1 + PartStartSector = HISOIMG_PART_START_SECTOR >> 3; + PartSectorCount = DiskSectorCount - ReservedSector - HISOEFI_PART_BYTES / 4096 - PartStartSector; + HiperisoFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl); + + pMBR->PartTbl[0].Active = 0x80; // bootable + pMBR->PartTbl[0].FsFlag = 0x07; // exFAT/NTFS/HPFS + + //Part2 + PartStartSector += PartSectorCount; + PartSectorCount = HISOEFI_PART_BYTES / 4096; + HiperisoFillMBRLocation(size, PartStartSector, PartSectorCount, pMBR->PartTbl + 1); + + pMBR->PartTbl[1].Active = 0x00; + pMBR->PartTbl[1].FsFlag = 0xEF; // EFI System Partition + + pMBR->Byte55 = 0x55; + pMBR->ByteAA = 0xAA; + + return 0; +} + diff --git a/src/gui/Core/hiperiso_util.h b/src/gui/Core/hiperiso_util.h new file mode 100644 index 0000000..0872557 --- /dev/null +++ b/src/gui/Core/hiperiso_util.h @@ -0,0 +1,57 @@ +/****************************************************************************** + * hiperiso_util.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_UTIL_H__ +#define __HIPERISO_UTIL_H__ + +extern char g_log_file[PATH_MAX]; +extern char g_ini_file[PATH_MAX]; + +#define check_free(p) if (p) free(p) +#define hiso_safe_close_fd(fd) \ +{\ + if ((fd) >= 0) \ + { \ + close(fd); \ + (fd) = -1; \ + }\ +} + +extern uint8_t g_mbr_template[512]; +void hiperiso_gen_preudo_uuid(void *uuid); +int hiperiso_get_disk_part_name(const char *dev, int part, char *partbuf, int bufsize); +int hiperiso_get_sys_file_line(char *buffer, int buflen, const char *fmt, ...); +uint64_t hiperiso_get_human_readable_gb(uint64_t SizeBytes); +void hiperiso_md5(const void *data, uint32_t len, uint8_t *md5); +int hiperiso_is_disk_mounted(const char *devpath); +int hiperiso_try_umount_disk(const char *devpath); +int unxz(unsigned char *in, int in_size, + int (*fill)(void *dest, unsigned int size), + int (*flush)(void *src, unsigned int size), + unsigned char *out, int *in_used, + void (*error)(char *x)); +int hiperiso_read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen); +const char * hiperiso_get_local_version(void); +int hiperiso_fill_gpt(uint64_t size, uint64_t reserve, int align4k, HISO_GPT_INFO *gpt); +int hiperiso_fill_mbr(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR); +int HiperisoGetLocalBootImg(MBR_HEAD *pMBR); +int hiperiso_fill_mbr_4k(uint64_t size, uint64_t reserve, int align4k, MBR_HEAD *pMBR); + +#endif /* __HIPERISO_UTIL_H__ */ + diff --git a/src/gui/GTK/hiperiso_gtk.c b/src/gui/GTK/hiperiso_gtk.c new file mode 100644 index 0000000..c2348b4 --- /dev/null +++ b/src/gui/GTK/hiperiso_gtk.c @@ -0,0 +1,1510 @@ +/****************************************************************************** + * hiperiso_gtk.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include "hiperiso_gtk.h" + +int g_secure_boot_support = 0; +GtkWidget *g_topWindow = NULL; +GtkWidget *g_partCfgWindow = NULL; +GtkBuilder *g_pXmlBuilder = NULL; +GtkComboBoxText *g_dev_combobox = NULL; +GtkButton *g_refresh_button = NULL; +GtkButton *g_install_button = NULL; +GtkButton *g_update_button = NULL; +GtkMenu *g_lang_menu = NULL;; +GtkCheckMenuItem *g_menu_item_secure_boot = NULL; +GtkCheckMenuItem *g_menu_item_mbr = NULL; +GtkCheckMenuItem *g_menu_item_gpt = NULL; +GtkCheckMenuItem *g_menu_item_show_all = NULL; +GtkLabel *g_device_title = NULL; +GtkLabel *g_label_local_part_style = NULL; +GtkLabel *g_label_dev_part_style = NULL; +GtkLabel *g_label_local_ver = NULL; +GtkLabel *g_label_disk_ver = NULL; +GtkLabel *g_label_status = NULL; +GtkImage *g_image_secure_local = NULL; +GtkImage *g_image_secure_device = NULL; +GtkToggleButton *g_part_align_checkbox = NULL; +GtkToggleButton *g_part_preserve_checkbox = NULL; +GtkEntry *g_part_reserve_space_value = NULL; +GtkComboBoxText *g_part_space_unit_combox = NULL; +GtkComboBoxText *g_part_fs_type_combox = NULL; +GtkEntry *g_part_cluster_size_value = NULL; +GtkProgressBar *g_progress_bar = NULL; +HISO_JSON *g_languages_json = NULL; +int g_languages_toggled_proc = 0; +int g_dev_changed_proc = 0; +gboolean g_align_part_with_4k = TRUE; +gboolean g_preserve_space_check = FALSE; +int g_preserve_space_unit = 1; +int g_preserve_space_number = 0; +int g_fs_type = 0; +int g_cluster_size = 0; +gboolean g_thread_run = FALSE; + +typedef struct gtk_worker_ctx +{ + int op_type; + int index; + int ret; + char disk_name[32]; +} gtk_worker_ctx; + +#define GTK_OP_INSTALL 1 +#define GTK_OP_UPDATE 2 +#define GTK_OP_INSTALL_NONDESTR 3 + +const char *language_string(const char *id) +{ + const char *pName = NULL; + HISO_JSON *node = NULL; + const char *pCurLang = hiperiso_code_get_cur_language(); + + for (node = g_languages_json->pstChild; node; node = node->pstNext) + { + pName = hiso_json_get_string_ex(node->pstChild, "name"); + if (0 == g_strcmp0(pName, pCurLang)) + { + break; + } + } + + if (NULL == node) + { + return "xxx"; + } + + return hiso_json_get_string_ex(node->pstChild, id); +} + +int msgbox(GtkMessageType type, GtkButtonsType buttons, const char *strid) +{ + int ret; + GtkWidget *pMsgBox = NULL; + + pMsgBox = gtk_message_dialog_new(GTK_WINDOW(g_topWindow), GTK_DIALOG_MODAL, type, buttons, "%s", language_string(strid)); + + ret = gtk_dialog_run(GTK_DIALOG(pMsgBox)); + gtk_widget_destroy(pMsgBox); + + return ret; +} + + +static void set_item_visible(const char *id, int visible) +{ + GtkWidget *pWidget = NULL; + + pWidget = GTK_WIDGET(gtk_builder_get_object(g_pXmlBuilder, id)); + if (visible) + { + gtk_widget_show(pWidget); + } + else + { + gtk_widget_hide(pWidget); + } +} + +static void init_part_style_menu(void) +{ + int style; + + style = hiperiso_code_get_cur_part_style(); + gtk_check_menu_item_set_active(g_menu_item_mbr, (0 == style)); + gtk_check_menu_item_set_active(g_menu_item_gpt, (1 == style)); + gtk_label_set_text(g_label_local_part_style, style ? "GPT" : "MBR"); +} + +static void select_language(const char *lang) +{ + const char *pName = NULL; + const char *pPos = NULL; + const char *pDevice = NULL; + HISO_JSON *node = NULL; + char device[256]; + + for (node = g_languages_json->pstChild; node; node = node->pstNext) + { + pName = hiso_json_get_string_ex(node->pstChild, "name"); + if (0 == g_strcmp0(pName, lang)) + { + break; + } + } + + if (NULL == node) + { + return; + } + + pDevice = gtk_label_get_text(g_device_title); + if (pDevice && (pPos = strchr(pDevice, '[')) != NULL) + { + g_snprintf(device, sizeof(device), "%s %s", hiso_json_get_string_ex(node->pstChild, "STR_DEVICE"), pPos); + gtk_label_set_text(g_device_title, device); + } + else + { + gtk_label_set_text(g_device_title, hiso_json_get_string_ex(node->pstChild, "STR_DEVICE")); + } + + LANG_LABEL_TEXT("label_local_ver", "STR_LOCAL_VER"); + LANG_LABEL_TEXT("label_device_ver", "STR_DISK_VER"); + + LANG_LABEL_TEXT("label_status", "STR_STATUS"); + + LANG_BUTTON_TEXT("button_install", "STR_INSTALL"); + LANG_BUTTON_TEXT("button_update", "STR_UPDATE"); + + LANG_MENU_ITEM_TEXT("menu_option", "STR_MENU_OPTION"); + LANG_MENU_ITEM_TEXT("menu_item_secure", "STR_MENU_SECURE_BOOT"); + LANG_MENU_ITEM_TEXT("menu_part_style", "STR_MENU_PART_STYLE"); + LANG_MENU_ITEM_TEXT("menu_item_part_cfg", "STR_MENU_PART_CFG"); + LANG_MENU_ITEM_TEXT("menu_item_clear", "STR_MENU_CLEAR"); + LANG_MENU_ITEM_TEXT("menu_item_part_resize", "STR_MENU_PART_RESIZE"); + LANG_MENU_ITEM_TEXT("menu_item_show_all", "STR_SHOW_ALL_DEV"); + LANG_MENU_ITEM_TEXT("menu_help", "STR_MENU_HELP"); + LANG_MENU_ITEM_TEXT("menu_item_about", "STR_ABOUT"); + + LANG_BUTTON_TEXT("space_check_btn", "STR_PRESERVE_SPACE"); + LANG_BUTTON_TEXT("space_align_btn", "STR_PART_ALIGN_4KB"); + LANG_LABEL_TEXT("label_fs_type", "STR_FS_TYPE"); + LANG_LABEL_TEXT("label_cluster_size", "STR_CLUSTER_SIZE"); + LANG_BUTTON_TEXT("button_partcfg_ok", "STR_BTN_OK"); + LANG_BUTTON_TEXT("button_partcfg_cancel", "STR_BTN_CANCEL"); + + gtk_window_set_title(GTK_WINDOW(g_partCfgWindow), hiso_json_get_string_ex(node->pstChild, "STR_MENU_PART_CFG")); + + gtk_widget_queue_draw(g_topWindow); +} + + +void on_secure_boot_toggled(GtkMenuItem *menuItem, gpointer data) +{ + g_secure_boot_support = 1 - g_secure_boot_support; + + if (g_secure_boot_support) + { + gtk_widget_show((GtkWidget *)g_image_secure_local); + } + else + { + gtk_widget_hide((GtkWidget *)g_image_secure_local); + } +} + +void on_devlist_changed(GtkWidget *widget, gpointer data) +{ + int active; + hiperiso_disk *cur = NULL; + char version[512]; + + if (g_dev_changed_proc == 0) + { + return; + } + + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE); + + gtk_widget_hide((GtkWidget *)g_image_secure_device); + gtk_label_set_markup(g_label_disk_ver, ""); + gtk_label_set_text(g_label_dev_part_style, ""); + + active = gtk_combo_box_get_active((GtkComboBox *)g_dev_combobox); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + cur = g_disk_list + active; + if (cur->hisodata.hiperiso_valid) + { + if (cur->hisodata.secure_boot_flag) + { + gtk_widget_show((GtkWidget *)g_image_secure_device); + } + else + { + gtk_widget_hide((GtkWidget *)g_image_secure_device); + } + + if (g_secure_boot_support != cur->hisodata.secure_boot_flag) + { + gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support); + } + + g_snprintf(version, sizeof(version), HISO_VER_FMT, cur->hisodata.hiperiso_ver); + gtk_label_set_markup(g_label_disk_ver, version); + gtk_label_set_text(g_label_dev_part_style, cur->hisodata.partition_style ? "GPT" : "MBR"); + + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + } + else + { + if (!g_secure_boot_support) + { + gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support); + } + } +} + + +void on_language_toggled(GtkMenuItem *menuItem, gpointer data) +{ + const char *cur_lang = NULL; + + if (g_languages_toggled_proc == 0) + { + return; + } + + cur_lang = hiperiso_code_get_cur_language(); + if (g_strcmp0(cur_lang, (char *)data) != 0) + { + hiperiso_code_set_cur_language((char *)data); + select_language((char *)data); + } +} + +void on_part_style_toggled(GtkMenuItem *menuItem, gpointer data) +{ + int style; + + style = hiperiso_code_get_cur_part_style(); + hiperiso_code_set_cur_part_style(1 - style); + style = hiperiso_code_get_cur_part_style(); + + gtk_label_set_text(g_label_local_part_style, style ? "GPT" : "MBR"); +} + +static hiperiso_disk *select_active_dev(const char *select, int *activeid) +{ + int i; + int alldev; + hiperiso_disk *cur = NULL; + + alldev = hiperiso_code_get_cur_show_all(); + + /* find the match one */ + if (select) + { + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (strcmp(cur->disk_name, select) == 0) + { + *activeid = i; + return cur; + } + } + } + + /* find the first one that installed with Hiperiso */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (cur->hisodata.hiperiso_valid) + { + *activeid = i; + return cur; + } + } + + /* find the first USB interface device */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (cur->type == HISO_DEVICE_USB) + { + *activeid = i; + return cur; + } + } + + /* use the first one */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + *activeid = i; + return cur; + } + + return NULL; +} + +static void fill_dev_list(const char *select) +{ + int i; + int alldev; + int activeid; + int count = 0; + char line[512]; + hiperiso_disk *cur = NULL; + hiperiso_disk *active = NULL; + GtkListStore *store = NULL; + + g_dev_changed_proc = 0; + + alldev = hiperiso_code_get_cur_show_all(); + + vlog("fill_dev_list total disk: %d showall:%d\n", g_disk_num, alldev); + + /* gtk_combo_box_text_remove_all */ + store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(g_dev_combobox))); + gtk_list_store_clear(store); + + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + g_snprintf(line, sizeof(line), "%s [%s] %s", cur->disk_name, cur->human_readable_size, cur->disk_model); + { + char idbuf[16]; + g_snprintf(idbuf, sizeof(idbuf), "%d", i); + gtk_combo_box_text_append(g_dev_combobox, idbuf, line); + } + count++; + } + + active = select_active_dev(select, &activeid); + if (active) + { + char idbuf[16]; + vlog("combox count:%d, active:%s id:%d\n", count, active->disk_name, activeid); + g_snprintf(idbuf, sizeof(idbuf), "%d", activeid); + gtk_combo_box_set_active_id((GtkComboBox *)g_dev_combobox, idbuf); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), active->hisodata.hiperiso_valid); + } + else + { + vlog("combox count:%d, no active id\n", count); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE); + } + + g_dev_changed_proc = 1; + on_devlist_changed(NULL, NULL); +} + + +void on_show_all_toggled(GtkMenuItem *menuItem, gpointer data) +{ + int show_all = hiperiso_code_get_cur_show_all(); + + hiperiso_code_set_cur_show_all(1 - show_all); + fill_dev_list(NULL); +} + +void on_button_refresh_clicked(GtkWidget *widget, gpointer data) +{ + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + hiperiso_code_refresh_device(); + fill_dev_list(NULL); +} + +static void set_progress_bar_percent(int percent) +{ + const char *text = NULL; + char tmp[128]; + + gtk_progress_bar_set_fraction(g_progress_bar, percent * 1.0 / 100); + vlog("set percent %d\n", percent); + + text = language_string("STR_STATUS"); + if (percent == 0) + { + gtk_label_set_text(g_label_status, text); + } + else + { + g_snprintf(tmp, sizeof(tmp), "%s %d%%", text, percent); + gtk_label_set_text(g_label_status, tmp); + } +} + +static gboolean gtk_progress_idle(gpointer data) +{ + set_progress_bar_percent(GPOINTER_TO_INT(data)); + return FALSE; +} + +static gboolean gtk_finish_worker_idle(gpointer data) +{ + gtk_worker_ctx *ctx = (gtk_worker_ctx *)data; + + if (ctx->op_type == GTK_OP_INSTALL || ctx->op_type == GTK_OP_INSTALL_NONDESTR) + { + if (ctx->ret) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_INSTALL_FAILED"); + } + else + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_INSTALL_SUCCESS"); + } + } + else + { + if (ctx->ret) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_UPDATE_FAILED"); + } + else + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_UPDATE_SUCCESS"); + } + } + + set_progress_bar_percent(0); + gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + fill_dev_list(ctx->disk_name); + g_thread_run = FALSE; + g_free(ctx); + return FALSE; +} + +void on_about(GtkMenuItem *menuItem, gpointer data) +{ + GtkWidget *pDlg = NULL; + char *markup = NULL; + + pDlg = gtk_message_dialog_new(GTK_WINDOW(g_topWindow), GTK_DIALOG_MODAL, + GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "%s", ""); + gtk_window_set_title(GTK_WINDOW(pDlg), "About Hiperiso"); + + markup = g_markup_printf_escaped( + "Hiperiso v%s\n\n" + "A hypervisor-based ISO boot tool with full boot logging.\n" + "Based on the Ventoy project.\n\n" + "%s", + hiperiso_get_local_version(), + "https://github.com/hiperiso/hiperiso"); + + gtk_message_dialog_set_markup(GTK_MESSAGE_DIALOG(pDlg), markup); + g_free(markup); + + gtk_dialog_run(GTK_DIALOG(pDlg)); + gtk_widget_destroy(pDlg); +} + +void on_clear_hiperiso(GtkMenuItem *menuItem, gpointer data) +{ + int ret; + int active; + char *active_id = NULL; + char buf[1024]; + char out[256]; + char disk_name[32]; + hiperiso_disk *cur = NULL; + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active_id = gtk_combo_box_get_active_id((GtkComboBox *)g_dev_combobox); + active = active_id ? atoi(active_id) : -1; + g_free(active_id); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP")) + { + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP2")) + { + return; + } + + gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE); + g_thread_run = TRUE; + + + cur = g_disk_list + active; + g_snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + g_snprintf(buf, sizeof(buf), "{\"method\":\"clean\",\"disk\":\"%s\"}", disk_name); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler clean <%s>\n", out); + + if (strstr(out, "success")) + { + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + if (ret == 0) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_CLEAR_SUCCESS"); + } + else + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_CLEAR_FAILED"); + } + + set_progress_bar_percent(0); + gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), TRUE); + + fill_dev_list(disk_name); + g_thread_run = FALSE; +} + +static int install_proc(hiperiso_disk *cur, char *disk_name, size_t disk_name_len) +{ + int ret = 0; + int pos = 0; + int buflen = 0; + int percent = 0; + char buf[1024]; + char dec[64]; + char out[256]; + long long space; + + vlog("install_thread ...\n"); + + g_snprintf(disk_name, disk_name_len, "%s", cur->disk_name); + + buflen = sizeof(buf); + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("method", "install"); + HISO_JSON_FMT_STRN("disk", disk_name); + + if (g_preserve_space_check) + { + space = g_preserve_space_number; + if (g_preserve_space_unit == 1) + { + space = space * 1024 * 1024 * 1024LL; + } + else + { + space = space * 1024 * 1024LL; + } + + snprintf(dec, sizeof(dec), "%lld", space); + HISO_JSON_FMT_STRN("reserve_space", dec); + } + else + { + HISO_JSON_FMT_STRN("reserve_space", "0"); + } + + HISO_JSON_FMT_UINT("partstyle", hiperiso_code_get_cur_part_style()); + HISO_JSON_FMT_UINT("secure_boot", g_secure_boot_support); + HISO_JSON_FMT_UINT("align_4kb", g_align_part_with_4k); + HISO_JSON_FMT_UINT("fs_type", g_fs_type); + HISO_JSON_FMT_UINT("cluster_sectors", g_cluster_size); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler install <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = hiperiso_code_get_percent(); + g_idle_add(gtk_progress_idle, GINT_TO_POINTER(percent)); + usleep(50 * 1000); + } + + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + return 0; +} + +static gpointer gtk_install_thread(gpointer data) +{ + gtk_worker_ctx *ctx = (gtk_worker_ctx *)data; + ctx->ret = install_proc(g_disk_list + ctx->index, ctx->disk_name, sizeof(ctx->disk_name)); + g_idle_add(gtk_finish_worker_idle, ctx); + return NULL; +} + +void on_button_install_clicked(GtkWidget *widget, gpointer data) +{ + int active; + long long size; + long long space; + char *active_id = NULL; + hiperiso_disk *cur = NULL; + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active_id = gtk_combo_box_get_active_id((GtkComboBox *)g_dev_combobox); + active = active_id ? atoi(active_id) : -1; + g_free(active_id); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + cur = g_disk_list + active; + + if (cur->is4kn) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_4KN_UNSUPPORTED"); + return; + } + + if (hiperiso_code_get_cur_part_style() == 0 && cur->size_in_byte > 2199023255552ULL) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_DISK_2TB_MBR_ERROR"); + return; + } + + if (g_preserve_space_check) + { + space = g_preserve_space_number; + if (g_preserve_space_unit == 1) + { + space = space * 1024; + } + else + { + space = space; + } + + size = cur->size_in_byte / SIZE_1MB; + if (size <= space || (size - space) <= (HISOEFI_PART_BYTES / SIZE_1MB)) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + vlog("reserved space value too big ...\n"); + return; + } + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP")) + { + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_INSTALL_TIP2")) + { + return; + } + + gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE); + + g_thread_run = TRUE; + + { + gtk_worker_ctx *ctx = g_new0(gtk_worker_ctx, 1); + ctx->op_type = GTK_OP_INSTALL; + ctx->index = active; + g_thread_new("hiperiso-install", gtk_install_thread, ctx); + } +} + + +static int update_proc(hiperiso_disk *cur, char *disk_name, size_t disk_name_len) +{ + int ret = 0; + int percent = 0; + char buf[1024]; + char out[256]; + + g_snprintf(disk_name, disk_name_len, "%s", cur->disk_name); + g_snprintf(buf, sizeof(buf), "{\"method\":\"update\",\"disk\":\"%s\",\"secure_boot\":%d}", + disk_name, g_secure_boot_support); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler update <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = hiperiso_code_get_percent(); + g_idle_add(gtk_progress_idle, GINT_TO_POINTER(percent)); + usleep(50 * 1000); + } + + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + return 0; +} + +static gpointer gtk_update_thread(gpointer data) +{ + gtk_worker_ctx *ctx = (gtk_worker_ctx *)data; + ctx->ret = update_proc(g_disk_list + ctx->index, ctx->disk_name, sizeof(ctx->disk_name)); + g_idle_add(gtk_finish_worker_idle, ctx); + return NULL; +} + + +static int part_resize_proc(hiperiso_disk *cur, char *disk_name, size_t disk_name_len) +{ + int ret = 0; + char cmd[512]; + char buf[256]; + + g_snprintf(disk_name, disk_name_len, "%s", cur->disk_name); + g_snprintf(cmd, sizeof(cmd), "echo y | sh ./tool/HiperisoWorker.sh -i -n %s 2>&1", disk_name); + + FILE *fp = popen(cmd, "r"); + if (!fp) + { + return 1; + } + + while (fgets(buf, sizeof(buf), fp)) + { + vlog("%s", buf); + } + + ret = pclose(fp); + ret = WEXITSTATUS(ret); + + hiperiso_code_refresh_device(); + return ret; +} + +static gpointer gtk_install_nondestr_thread(gpointer data) +{ + gtk_worker_ctx *ctx = (gtk_worker_ctx *)data; + ctx->ret = part_resize_proc(g_disk_list + ctx->index, ctx->disk_name, sizeof(ctx->disk_name)); + g_idle_add(gtk_finish_worker_idle, ctx); + return NULL; +} + +void on_menu_part_resize(GtkMenuItem *menuItem, gpointer data) +{ + int active; + char *active_id = NULL; + hiperiso_disk *cur = NULL; + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active_id = gtk_combo_box_get_active_id((GtkComboBox *)g_dev_combobox); + active = active_id ? atoi(active_id) : -1; + g_free(active_id); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + + cur = g_disk_list + active; + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_WARNING, GTK_BUTTONS_OK_CANCEL, "STR_PART_RESIZE_TIP")) + { + return; + } + + gtk_widget_set_sensitive(GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive(GTK_WIDGET(g_update_button), FALSE); + + g_thread_run = TRUE; + + { + gtk_worker_ctx *ctx = g_new0(gtk_worker_ctx, 1); + ctx->op_type = GTK_OP_INSTALL_NONDESTR; + ctx->index = active; + g_thread_new("hiperiso-nondestr", gtk_install_nondestr_thread, ctx); + } +} + + +void on_button_update_clicked(GtkWidget *widget, gpointer data) +{ + int active; + char *active_id = NULL; + hiperiso_disk *cur = NULL; + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return; + } + + active_id = gtk_combo_box_get_active_id((GtkComboBox *)g_dev_combobox); + active = active_id ? atoi(active_id) : -1; + g_free(active_id); + if (active < 0 || active >= g_disk_num) + { + vlog("invalid active combox id %d\n", active); + return; + } + cur = g_disk_list + active; + + if (cur->hisodata.hiperiso_valid == 0) + { + vlog("invalid hiperiso version.\n"); + return; + } + + if (GTK_RESPONSE_OK != msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK_CANCEL, "STR_UPDATE_TIP")) + { + return; + } + + gtk_widget_set_sensitive (GTK_WIDGET(g_refresh_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_install_button), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_update_button), FALSE); + + g_thread_run = TRUE; + + { + gtk_worker_ctx *ctx = g_new0(gtk_worker_ctx, 1); + ctx->op_type = GTK_OP_UPDATE; + ctx->index = active; + g_thread_new("hiperiso-update", gtk_update_thread, ctx); + } +} + +static gint lang_compare(gconstpointer a, gconstpointer b) +{ + const char *name1 = (const char *)a; + const char *name2 = (const char *)b; + + if (strncmp(name1, "Chinese Simplified", 18) == 0) + { + return -1; + } + else if (strncmp(name2, "Chinese Simplified", 18) == 0) + { + return 1; + } + else + { + return g_strcmp0(name1, name2); + } +} + +static int load_languages(void) +{ + int size = 0; + char *pBuf = NULL; + char *pCur = NULL; + const char *pCurLang = NULL; + const char *pName = NULL; + HISO_JSON *json = NULL; + HISO_JSON *node = NULL; + HISO_JSON *lang = NULL; + GSList *pGroup = NULL; + GList *pNameNode = NULL; + GList *pNameList = NULL; + GtkRadioMenuItem *pItem = NULL; + + vlog("load_languages ...\n"); + + pCurLang = hiperiso_code_get_cur_language(); + if (pCurLang[0] == 0) + { + pName = getenv("LANG"); + if (pName && strncmp(pName, "zh_CN", 5) == 0) + { + hiperiso_code_set_cur_language("Chinese Simplified (简体中文)"); + } + else + { + hiperiso_code_set_cur_language("English (English)"); + } + pCurLang = hiperiso_code_get_cur_language(); + } + + vlog("current language <%s>\n", pCurLang); + + if (hiperiso_read_file_to_buf("./tool/languages.json", 1, (void **)&pBuf, &size) != 0 || !pBuf || size <= 0) + { + vlog("load_languages: ./tool/languages.json missing or empty\n"); + return 1; + } + + json = hiso_json_create(); + if (hiso_json_parse(json, pBuf) != JSON_SUCCESS) + { + vlog("load_languages: failed to parse languages.json\n"); + free(pBuf); + hiso_json_destroy(json); + return 1; + } + g_languages_json = json; + + for (node = json->pstChild; node; node = node->pstNext) + { + pName = hiso_json_get_string_ex(node->pstChild, "name"); + if (pName) + { + pNameList = g_list_append(pNameList, (gpointer)pName); + } + + for (lang = node->pstChild; lang; lang = lang->pstNext) + { + if (lang->enDataType == JSON_TYPE_STRING) + { + pCur = lang->unData.pcStrVal; + while (*pCur) + { + if (*pCur == '#') + { + *pCur = '\r'; + } + else if (*pCur == '@') + { + *pCur = '\n'; + } + pCur++; + } + } + } + } + + if (NULL == pNameList) + { + vlog("load_languages: no language entries found\n"); + free(pBuf); + hiso_json_destroy(json); + g_languages_json = NULL; + return 1; + } + + pNameList = g_list_sort(pNameList, lang_compare); + + for (pNameNode = g_list_first(pNameList); pNameNode; pNameNode = g_list_next(pNameNode)) + { + pName = (char *)(pNameNode->data); + pItem = (GtkRadioMenuItem *)gtk_radio_menu_item_new_with_label(pGroup, pName); + pGroup = gtk_radio_menu_item_get_group(pItem); + + if (strcmp(pCurLang, pName) == 0) + { + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(pItem), TRUE); + } + + g_signal_connect(pItem, "toggled", G_CALLBACK(on_language_toggled), (gpointer)pName); + gtk_widget_show((GtkWidget *)pItem); + gtk_menu_shell_append(GTK_MENU_SHELL(g_lang_menu), (GtkWidget *)pItem); + } + + g_list_free(pNameList); + free(pBuf); + + select_language(pCurLang); + g_languages_toggled_proc = 1; + + return 0; +} + +void on_part_cfg_ok(GtkWidget *widget, gpointer data) +{ + const char *pos = NULL; + const char *input = NULL; + const char *cinput = NULL; + char device[256]; + gboolean checked = gtk_toggle_button_get_active(g_part_preserve_checkbox); + + if (checked) + { + input = gtk_entry_get_text(g_part_reserve_space_value); + if (input == NULL || input[0] == 0) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + + for (pos = input; *pos; pos++) + { + if (*pos < '0' || *pos > '9') + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + } + + g_preserve_space_unit = gtk_combo_box_get_active((GtkComboBox *)g_part_space_unit_combox); + g_preserve_space_number = (int)strtol(input, NULL, 10); + + g_snprintf(device, sizeof(device), "%s [ -%d%s ]", + language_string("STR_DEVICE"), g_preserve_space_number, + g_preserve_space_unit ? "GB" : "MB"); + gtk_label_set_text(g_device_title, device); + } + else + { + gtk_label_set_text(g_device_title, language_string("STR_DEVICE")); + } + + g_preserve_space_check = checked; + g_align_part_with_4k = gtk_toggle_button_get_active(g_part_align_checkbox); + + g_fs_type = gtk_combo_box_get_active((GtkComboBox *)g_part_fs_type_combox); + + cinput = gtk_entry_get_text(g_part_cluster_size_value); + if (cinput == NULL || cinput[0] == 0) + { + g_cluster_size = 0; + } + else + { + for (pos = cinput; *pos; pos++) + { + if (*pos < '0' || *pos > '9') + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + } + + g_cluster_size = (int)strtol(cinput, NULL, 10); + if (g_cluster_size <= 0) + { + msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "STR_SPACE_VAL_INVALID"); + return; + } + } + + gtk_widget_hide(g_partCfgWindow); +} + +void on_part_cfg_cancel(GtkWidget *widget, gpointer data) +{ + gtk_widget_hide(g_partCfgWindow); +} + +int on_part_cfg_close(GtkWidget *widget, gpointer data) +{ + gtk_widget_hide(g_partCfgWindow); + return TRUE; +} + +void on_part_config(GtkMenuItem *menuItem, gpointer data) +{ + char value[64]; + + gtk_toggle_button_set_active(g_part_align_checkbox, g_align_part_with_4k); + gtk_toggle_button_set_active(g_part_preserve_checkbox, g_preserve_space_check); + gtk_widget_set_sensitive(GTK_WIDGET(g_part_reserve_space_value), g_preserve_space_check); + gtk_widget_set_sensitive(GTK_WIDGET(g_part_space_unit_combox), g_preserve_space_check); + + if (g_preserve_space_check) + { + g_snprintf(value, sizeof(value), "%d", g_preserve_space_number); + gtk_entry_set_text(g_part_reserve_space_value, value); + gtk_combo_box_set_active((GtkComboBox *)g_part_space_unit_combox, g_preserve_space_unit); + } + + gtk_combo_box_set_active((GtkComboBox *)g_part_fs_type_combox, g_fs_type); + + if (g_cluster_size > 0) + { + g_snprintf(value, sizeof(value), "%d", g_cluster_size); + gtk_entry_set_text(g_part_cluster_size_value, value); + } + else + { + gtk_entry_set_text(g_part_cluster_size_value, ""); + } + + gtk_widget_show_all(g_partCfgWindow); +} + +void on_reserve_space_toggled(GtkMenuItem *menuItem, gpointer data) +{ + gboolean checked = gtk_toggle_button_get_active(g_part_preserve_checkbox); + + gtk_widget_set_sensitive(GTK_WIDGET(g_part_reserve_space_value), checked); + gtk_widget_set_sensitive(GTK_WIDGET(g_part_space_unit_combox), checked); +} + +static void init_part_cfg_window(GtkBuilder *pBuilder) +{ +#if GTK_CHECK_VERSION(3, 0, 0) + GtkWidget *pHeader = NULL; + + pHeader = gtk_header_bar_new(); + gtk_header_bar_set_show_close_button(GTK_HEADER_BAR(pHeader), FALSE); + gtk_window_set_titlebar (GTK_WINDOW(g_partCfgWindow), pHeader); + gtk_window_set_title(GTK_WINDOW(g_partCfgWindow), "Partition Configuration"); +#endif + + gtk_combo_box_set_active((GtkComboBox *)g_part_space_unit_combox, g_preserve_space_unit); + gtk_combo_box_set_active((GtkComboBox *)g_part_fs_type_combox, g_fs_type); + gtk_widget_set_sensitive (GTK_WIDGET(g_part_reserve_space_value), FALSE); + gtk_widget_set_sensitive (GTK_WIDGET(g_part_space_unit_combox), FALSE); + + SIGNAL("space_check_btn", "toggled", on_reserve_space_toggled); + + SIGNAL("button_partcfg_ok", "clicked", on_part_cfg_ok); + SIGNAL("button_partcfg_cancel", "clicked", on_part_cfg_cancel); + SIGNAL("part_cfg_dlg", "delete_event", on_part_cfg_close); +} + +static void add_accelerator(GtkAccelGroup *agMain, void *widget, const char *signal, guint accel_key) +{ + gtk_widget_add_accelerator(GTK_WIDGET(widget), signal, agMain, accel_key, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); + gtk_widget_add_accelerator(GTK_WIDGET(widget), signal, agMain, accel_key, GDK_SHIFT_MASK | GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); +} + +/* Attached screen-wide so both the main window and the part-config dialog inherit it. */ +static const char *g_premium_css = + "window {" + " background-color: #f5f5f5;" + " color: #2b2b2b;" + "}" + "frame {" + " border-radius: 6px;" + "}" + "frame > border {" + " border: 1px solid #dddddd;" + " border-radius: 6px;" + "}" + "label {" + " color: #2b2b2b;" + "}" + "progressbar trough {" + " background-color: #e2e2e2;" + " border: 1px solid #d0d0d0;" + " border-radius: 7px;" + " min-height: 18px;" + "}" + "progressbar progress {" + " background-color: #2d8e57;" + " border: none;" + " border-radius: 6px;" + "}" + "progressbar text {" + " color: #ffffff;" + " font-weight: bold;" + "}" + "button {" + " padding: 6px 16px;" + " border-radius: 4px;" + " border: 1px solid #c4c4c4;" + " background-image: linear-gradient(to bottom, #fafafa, #e9e9e9);" + " color: #2b2b2b;" + " outline: none;" + "}" + "button:hover {" + " background-image: linear-gradient(to bottom, #ffffff, #dcdcdc);" + " border-color: #a0a0a0;" + "}" + "button:active," + "button:checked {" + " background-image: linear-gradient(to bottom, #d6d6d6, #c4c4c4);" + "}" + "button.suggested-action {" + " background-image: linear-gradient(to bottom, #34a067, #2d8e57);" + " border: 1px solid #256b44;" + " color: #ffffff;" + " font-weight: bold;" + "}" + "button.suggested-action:hover {" + " background-image: linear-gradient(to bottom, #3cb578, #2f9a5d);" + " border-color: #256b44;" + "}" + "button.suggested-action:active," + "button.suggested-action:checked {" + " background-image: linear-gradient(to bottom, #2d8e57, #256b44);" + "}" + "entry {" + " border-radius: 4px;" + " border: 1px solid #c4c4c4;" + " padding: 4px 6px;" + " background-color: #ffffff;" + "}" + "entry:focus {" + " border-color: #2d8e57;" + "}" + "combobox entry," + "combobox button {" + " border-radius: 4px;" + "}" + "checkbutton {" + " padding: 2px 4px;" + " spacing: 6px;" + "}" + "checkbutton check {" + " border-radius: 3px;" + " border: 2px solid #c4c4c4;" + " background-color: #ffffff;" + " min-width: 14px;" + " min-height: 14px;" + "}" + "checkbutton check:checked {" + " border-color: #2d8e57;" + " background-color: #2d8e57;" + "}" + "menubar {" + " background-color: #ffffff;" + " border-bottom: 1px solid #dddddd;" + " padding: 2px;" + "}" + "menuitem {" + " padding: 5px 12px;" + "}" + "menuitem:hover," + "menuitem:focus {" + " background-color: #2d8e57;" + " color: #ffffff;" + "}" + "menu {" + " background-color: #ffffff;" + " border: 1px solid #dddddd;" + " border-radius: 4px;" + " padding: 4px;" + "}" + "separator {" + " background-color: #e2e2e2;" + " min-height: 1px;" + "}" + "dialog {" + " background-color: #f5f5f5;" + "}"; + +static void apply_premium_theme(void) +{ + GtkCssProvider *pProvider = NULL; + GdkScreen *pScreen = NULL; + GError *pErr = NULL; + + pProvider = gtk_css_provider_new(); + if (!gtk_css_provider_load_from_data(pProvider, g_premium_css, -1, &pErr)) + { + vlog("apply_premium_theme: failed to load CSS: %s\n", pErr ? pErr->message : "(null)"); + if (pErr) + { + g_error_free(pErr); + } + g_object_unref(pProvider); + return; + } + + pScreen = gdk_screen_get_default(); + gtk_style_context_add_provider_for_screen(pScreen, + GTK_STYLE_PROVIDER(pProvider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); +} + +void on_init_window(GtkBuilder *pBuilder) +{ + GSList *pGroup = NULL; + GtkAccelGroup *agMain = NULL; + char version[512]; + + vlog("on_init_window ...\n"); + + g_pXmlBuilder = pBuilder; + g_topWindow = BUILDER_ITEM(GtkWidget, "window"); + g_partCfgWindow = BUILDER_ITEM(GtkWidget, "part_cfg_dlg"); + + apply_premium_theme(); + + g_dev_combobox = BUILDER_ITEM(GtkComboBoxText, "combobox_devlist"); + g_refresh_button = BUILDER_ITEM(GtkButton, "button_refresh"); + g_install_button = BUILDER_ITEM(GtkButton, "button_install"); + g_update_button = BUILDER_ITEM(GtkButton, "button_update"); + + gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(g_install_button)), "suggested-action"); + gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(g_update_button)), "suggested-action"); + + g_lang_menu = BUILDER_ITEM(GtkMenu, "submenu_language"); + g_menu_item_secure_boot = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_secure"); + g_menu_item_mbr = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_mbr"); + g_menu_item_gpt = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_gpt"); + g_menu_item_show_all = BUILDER_ITEM(GtkCheckMenuItem, "menu_item_show_all"); + + g_device_title = BUILDER_ITEM(GtkLabel, "label_device"); + g_label_local_part_style = BUILDER_ITEM(GtkLabel, "label_local_part_style"); + g_label_dev_part_style = BUILDER_ITEM(GtkLabel, "label_dev_part_style"); + + g_label_local_ver = BUILDER_ITEM(GtkLabel, "label_local_ver_value"); + g_label_disk_ver = BUILDER_ITEM(GtkLabel, "label_dev_ver_value"); + + g_label_status = BUILDER_ITEM(GtkLabel, "label_status"); + + g_image_secure_local = BUILDER_ITEM(GtkImage, "image_secure_local"); + g_image_secure_device = BUILDER_ITEM(GtkImage, "image_secure_dev"); + + g_part_preserve_checkbox = BUILDER_ITEM(GtkToggleButton, "space_check_btn"); + g_part_align_checkbox = BUILDER_ITEM(GtkToggleButton, "space_align_btn"); + + g_part_reserve_space_value = BUILDER_ITEM(GtkEntry, "entry_reserve_space"); + g_part_space_unit_combox = BUILDER_ITEM(GtkComboBoxText, "comboboxtext_unit"); + g_part_fs_type_combox = BUILDER_ITEM(GtkComboBoxText, "comboboxtext_fs_type"); + g_part_cluster_size_value = BUILDER_ITEM(GtkEntry, "entry_cluster_size"); + + g_progress_bar = BUILDER_ITEM(GtkProgressBar, "progressbar1"); + + init_part_cfg_window(pBuilder); + + /* for gtk2 */ + gtk_frame_set_shadow_type(BUILDER_ITEM(GtkFrame, "frame_dummy1"), GTK_SHADOW_NONE); + gtk_frame_set_shadow_type(BUILDER_ITEM(GtkFrame, "frame_dummy2"), GTK_SHADOW_NONE); + + /* join group */ + pGroup = gtk_radio_menu_item_get_group((GtkRadioMenuItem *)g_menu_item_mbr); + gtk_radio_menu_item_set_group((GtkRadioMenuItem *)g_menu_item_gpt, pGroup); + + gtk_widget_hide((GtkWidget *)g_image_secure_local); + gtk_widget_hide((GtkWidget *)g_image_secure_device); + + g_snprintf(version, sizeof(version), HISO_VER_FMT, hiperiso_get_local_version()); + gtk_label_set_markup(g_label_local_ver, version); + + init_part_style_menu(); + gtk_check_menu_item_set_active(g_menu_item_show_all, hiperiso_code_get_cur_show_all()); + + load_languages(); + + SIGNAL("combobox_devlist", "changed", on_devlist_changed); + + SIGNAL("button_refresh", "clicked", on_button_refresh_clicked); + SIGNAL("button_install", "clicked", on_button_install_clicked); + SIGNAL("button_update", "clicked", on_button_update_clicked); + + SIGNAL("menu_item_secure", "toggled", on_secure_boot_toggled); + SIGNAL("menu_item_mbr", "toggled", on_part_style_toggled); + SIGNAL("menu_item_show_all", "toggled", on_show_all_toggled); + + SIGNAL("menu_item_part_cfg", "activate", on_part_config); + SIGNAL("menu_item_clear", "activate", on_clear_hiperiso); + SIGNAL("menu_item_part_resize", "activate", on_menu_part_resize); + SIGNAL("menu_item_about", "activate", on_about); + + agMain = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(g_topWindow), agMain); + add_accelerator(agMain, g_dev_combobox, "popup", GDK_KEY_d); + add_accelerator(agMain, g_install_button, "clicked", GDK_KEY_i); + add_accelerator(agMain, g_update_button, "clicked", GDK_KEY_u); + add_accelerator(agMain, g_refresh_button, "clicked", GDK_KEY_r); + + gtk_check_menu_item_set_active(g_menu_item_secure_boot, 1 - g_secure_boot_support); + + fill_dev_list(NULL); + + return; +} + +int on_exit_window(GtkWidget *widget, gpointer data) +{ + vlog("on_exit_window ...\n"); + + if (g_thread_run || hiperiso_code_is_busy()) + { + msgbox(GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "STR_WAIT_PROCESS"); + return TRUE; + } + + hiperiso_code_save_cfg(); + return FALSE; +} diff --git a/src/gui/GTK/hiperiso_gtk.h b/src/gui/GTK/hiperiso_gtk.h new file mode 100644 index 0000000..07eef91 --- /dev/null +++ b/src/gui/GTK/hiperiso_gtk.h @@ -0,0 +1,70 @@ +/****************************************************************************** + * hiperiso_gtk.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_GTK_H__ +#define __HIPERISO_GTK_H__ + +int hiperiso_disk_init(void); +void hiperiso_disk_exit(void); +int hiperiso_http_init(void); +void hiperiso_http_exit(void); +int hiperiso_log_init(void); +void hiperiso_log_exit(void); +void *get_refresh_icon_raw_data(int *len); +void *get_secure_icon_raw_data(int *len); +void *get_window_icon_raw_data(int *len); +int hiperiso_func_handler(const char *jsonstr, char *jsonbuf, int buflen); +const char * hiperiso_code_get_cur_language(void); +int hiperiso_code_get_cur_part_style(void); +void hiperiso_code_set_cur_part_style(int style); +int hiperiso_code_get_cur_show_all(void); +void hiperiso_code_set_cur_show_all(int show_all); +void hiperiso_code_set_cur_language(const char *lang); +void hiperiso_code_save_cfg(void); +void on_init_window(GtkBuilder *pBuilder); +int on_exit_window(GtkWidget *widget, gpointer data) ; +void hiperiso_code_refresh_device(void); +int hiperiso_code_is_busy(void); +int hiperiso_code_get_percent(void); +int hiperiso_code_get_result(void); +int msgbox(GtkMessageType type, GtkButtonsType buttons, const char *strid); + +#define HISO_VER_FMT "%s" + +#define LANG_LABEL_TEXT(id, str) \ + gtk_label_set_text(BUILDER_ITEM(GtkLabel, id), hiso_json_get_string_ex(node->pstChild, str)) + +#define LANG_BUTTON_TEXT(id, str) \ + gtk_button_set_label(BUILDER_ITEM(GtkButton, id), hiso_json_get_string_ex(node->pstChild, str)) + +#define LANG_MENU_ITEM_TEXT(id, str) \ + gtk_menu_item_set_label(BUILDER_ITEM(GtkMenuItem, id), hiso_json_get_string_ex(node->pstChild, str)) + +#define LANG_CHKBTN_TEXT(id, str) \ + gtk_check_button_set_label(BUILDER_ITEM(GtkCheckButton, id), hiso_json_get_string_ex(node->pstChild, str)) + +#define BUILDER_ITEM(type, id) (type *)gtk_builder_get_object(g_pXmlBuilder, id) + +#define SIGNAL(id, act, func) \ + g_signal_connect(gtk_builder_get_object(g_pXmlBuilder, id), act, G_CALLBACK(func), NULL) + +#define GTK_MSG_ITERATION() while (gtk_events_pending ()) gtk_main_iteration() + +#endif /* __HIPERISO_GTK_H__ */ + diff --git a/src/gui/GTK/refresh_icon_data.c b/src/gui/GTK/refresh_icon_data.c new file mode 100644 index 0000000..838371d --- /dev/null +++ b/src/gui/GTK/refresh_icon_data.c @@ -0,0 +1,300 @@ +/****************************************************************************** + * refresh_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char refresh_icon_hexData[4286] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xA8, 0x10, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x27, + 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xD9, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBE, + 0x31, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xB7, 0xCA, 0x59, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC0, 0xD1, + 0x6E, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xAF, 0xC5, 0x48, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xD4, 0xE0, + 0x9D, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFD, 0xFE, + 0xFB, 0xFF, 0xFB, 0xFC, 0xF5, 0xFF, 0xF2, 0xF6, 0xE1, 0xFF, 0xDD, 0xE6, 0xB1, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA8, 0xC0, 0x37, 0xFF, 0xCB, 0xD9, 0x87, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFB, + 0xF4, 0xFF, 0xD9, 0xE4, 0xA8, 0xFF, 0xAF, 0xC4, 0x46, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xD5, 0xE0, 0x9D, 0xFF, 0xFD, 0xFE, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, + 0xFD, 0xFF, 0xEE, 0xF3, 0xD9, 0xFF, 0xD9, 0xE3, 0xA8, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xE6, 0xEC, 0xC4, 0xFF, 0xFA, 0xFB, 0xF3, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xED, 0xC7, 0xFF, 0xB1, 0xC6, 0x4C, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xCD, 0xDB, + 0x8C, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xF7, 0xE7, 0xFF, 0xCB, 0xD9, + 0x87, 0xFF, 0xAE, 0xC3, 0x43, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xBD, 0xCF, 0x66, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xAD, 0xC3, + 0x41, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBC, 0x2D, 0xFF, 0xB8, 0xCB, 0x5C, 0xFF, 0xF6, 0xF9, + 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF5, 0xDF, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAE, 0xC4, + 0x44, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD6, + 0x7E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA9, 0xC0, + 0x39, 0xFF, 0xC8, 0xD7, 0x80, 0xFF, 0xD0, 0xDC, 0x92, 0xFF, 0xE7, 0xEE, 0xC8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xB0, 0xC5, + 0x49, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB0, 0xC6, 0x4A, 0xFF, 0xE3, 0xEA, 0xBE, 0xFF, 0xEA, 0xEF, 0xCE, 0xFF, 0xB8, 0xCB, + 0x5C, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA8, 0xC0, + 0x37, 0xFF, 0xE0, 0xE8, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF6, 0xE3, 0xFF, 0xB3, 0xC7, + 0x4F, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB6, 0xCA, 0x58, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xC9, 0xD8, 0x84, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xFE, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xBB, 0xCE, 0x63, 0xFF, 0xA7, 0xBF, + 0x35, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xF7, 0xF9, 0xEC, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xBB, 0xCD, 0x63, 0xFF, 0xF6, 0xF8, + 0xEA, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xAC, 0xC2, 0x40, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xBA, 0xCD, + 0x60, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, + 0x3A, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xCF, 0xDC, 0x90, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xC9, 0xD8, + 0x84, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xB8, 0xCB, 0x5B, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xA8, 0xBF, 0x37, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB2, 0xC7, 0x4F, 0xFF, 0xF2, 0xF6, + 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xE4, 0xEB, + 0xC1, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEF, + 0xCD, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xC7, 0xD6, 0x7E, 0xFF, 0xA9, 0xC0, 0x39, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xC6, 0xD6, 0x7C, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xB5, 0xC9, + 0x55, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xBC, 0xCE, + 0x65, 0xFF, 0xA4, 0xBC, 0x2C, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAE, 0xC4, 0x44, 0xFF, 0xE6, 0xED, + 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xB9, 0xCC, + 0x5E, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xC5, 0xD5, 0x79, 0xFF, 0xF1, 0xF5, + 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xA7, 0xBE, + 0x33, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB3, 0xC8, + 0x51, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xE1, 0xE9, 0xBA, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xC4, 0xD4, 0x78, 0xFF, 0xC6, 0xD6, + 0x7C, 0xFF, 0xD3, 0xDF, 0x9A, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFC, 0xFD, 0xF9, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xDB, 0xE4, 0xAB, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB1, 0xC6, 0x4B, 0xFF, 0xDD, 0xE6, 0xB2, 0xFF, 0xFC, 0xFD, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xD1, 0xDE, 0x96, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xC1, 0xD2, 0x71, 0xFF, 0xE2, 0xEA, + 0xBC, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFB, 0xFC, 0xF7, 0xFF, 0xF2, 0xF5, 0xE1, 0xFF, 0xDB, 0xE5, 0xAC, 0xFF, 0xB9, 0xCC, + 0x5F, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA8, 0xBF, + 0x36, 0xFF, 0xB3, 0xC7, 0x4F, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC5, 0xD5, 0x7A, 0xFF, 0xC4, 0xD4, + 0x78, 0xFF, 0xBC, 0xCE, 0x64, 0xFF, 0xB0, 0xC5, 0x48, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, 0x31, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0xFF +}; + +void *get_refresh_icon_raw_data(int *len) +{ + *len = (int)sizeof(refresh_icon_hexData); + return refresh_icon_hexData; +} + diff --git a/src/gui/GTK/secure_icon_data.c b/src/gui/GTK/secure_icon_data.c new file mode 100644 index 0000000..b3f8b7e --- /dev/null +++ b/src/gui/GTK/secure_icon_data.c @@ -0,0 +1,91 @@ +/****************************************************************************** + * secure_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char secure_icon_hexData[958] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x03, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x46, 0x5C, + 0x00, 0x00, 0x46, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x6C, 0xC4, 0xFF, 0x00, 0x7C, + 0xDF, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x7D, + 0xE1, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0xD4, 0x01, 0x8B, 0xF9, 0xF7, 0x03, 0x89, + 0xF3, 0xFF, 0x01, 0x8B, 0xF8, 0xF8, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, + 0xFB, 0xF4, 0x01, 0x8B, 0xF8, 0xF8, 0x03, 0x89, 0xF3, 0xFF, 0x01, 0x8B, 0xF9, 0xF7, 0x00, 0x8C, + 0xFB, 0xD4, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x93, 0xFF, 0x1E, 0x1D, 0x6B, + 0xA9, 0x6B, 0x32, 0x54, 0x6F, 0xF6, 0x22, 0x65, 0x9A, 0x7D, 0x00, 0x90, 0xFF, 0x39, 0x00, 0x8C, + 0xFB, 0x3C, 0x00, 0x90, 0xFF, 0x39, 0x22, 0x65, 0x9A, 0x7D, 0x32, 0x54, 0x6F, 0xF6, 0x1D, 0x6B, + 0xA9, 0x6B, 0x00, 0x93, 0xFF, 0x1E, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x2A, 0x5D, + 0x85, 0x00, 0x46, 0x3D, 0x36, 0x3A, 0x43, 0x41, 0x3F, 0xF3, 0x45, 0x3F, 0x3A, 0x58, 0x26, 0x62, + 0x91, 0x00, 0x00, 0x8D, 0xFD, 0x00, 0x26, 0x62, 0x91, 0x00, 0x45, 0x3F, 0x3A, 0x58, 0x43, 0x41, + 0x3F, 0xF3, 0x46, 0x3D, 0x36, 0x3A, 0x2A, 0x5D, 0x85, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x96, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x8E, 0x42, 0x42, 0x42, 0x53, 0x42, 0x42, + 0x42, 0x8E, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0xF3, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x31, 0x42, 0x42, 0x42, 0x4B, 0x42, 0x42, 0x42, 0x31, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, + 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00 +}; + +void *get_secure_icon_raw_data(int *len) +{ + *len = (int)sizeof(secure_icon_hexData); + return secure_icon_hexData; +} diff --git a/src/gui/GTK/window_icon_data.c b/src/gui/GTK/window_icon_data.c new file mode 100644 index 0000000..17b6ac8 --- /dev/null +++ b/src/gui/GTK/window_icon_data.c @@ -0,0 +1,7633 @@ +/****************************************************************************** + * window_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char window_icon_hexData[] = +{ + 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x68, 0x05, + 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x28, 0x08, + 0x01, 0x00, 0xCE, 0x05, 0x00, 0x00, 0x48, 0x48, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x88, 0x54, + 0x00, 0x00, 0xF6, 0x0D, 0x01, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x28, 0x42, + 0x00, 0x00, 0x7E, 0x62, 0x01, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x25, + 0x00, 0x00, 0xA6, 0xA4, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x10, + 0x00, 0x00, 0x4E, 0xCA, 0x01, 0x00, 0x28, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x5E, 0x0E, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x69, 0x1E, + 0x00, 0x00, 0x6A, 0x23, 0x00, 0x00, 0x6A, 0x32, 0x0B, 0x00, 0x70, 0x37, 0x0F, 0x00, 0x74, 0x3A, + 0x0D, 0x00, 0x6C, 0x37, 0x13, 0x00, 0x7C, 0x41, 0x12, 0x00, 0x7E, 0x45, 0x18, 0x00, 0x78, 0x49, + 0x2A, 0x00, 0x7D, 0x4C, 0x28, 0x00, 0x7D, 0x4F, 0x30, 0x00, 0x80, 0x40, 0x05, 0x00, 0x81, 0x42, + 0x09, 0x00, 0x82, 0x44, 0x0B, 0x00, 0x86, 0x46, 0x0A, 0x00, 0x82, 0x44, 0x0C, 0x00, 0x84, 0x44, + 0x0E, 0x00, 0x88, 0x48, 0x0C, 0x00, 0x8C, 0x4E, 0x0E, 0x00, 0x90, 0x4F, 0x0E, 0x00, 0x84, 0x47, + 0x10, 0x00, 0x85, 0x49, 0x12, 0x00, 0x87, 0x4B, 0x14, 0x00, 0x87, 0x4C, 0x17, 0x00, 0x8A, 0x4C, + 0x13, 0x00, 0x81, 0x47, 0x18, 0x00, 0x87, 0x4D, 0x18, 0x00, 0x88, 0x4D, 0x18, 0x00, 0x84, 0x51, + 0x1F, 0x00, 0x8D, 0x53, 0x1E, 0x00, 0x94, 0x53, 0x13, 0x00, 0x96, 0x56, 0x13, 0x00, 0x91, 0x52, + 0x14, 0x00, 0x98, 0x57, 0x11, 0x00, 0x99, 0x58, 0x13, 0x00, 0x94, 0x5A, 0x1A, 0x00, 0xA1, 0x61, + 0x17, 0x00, 0xA1, 0x62, 0x1A, 0x00, 0xA4, 0x66, 0x1D, 0x00, 0x85, 0x4E, 0x21, 0x00, 0x81, 0x4F, + 0x2B, 0x00, 0x86, 0x50, 0x23, 0x00, 0x85, 0x53, 0x27, 0x00, 0x88, 0x51, 0x21, 0x00, 0x8A, 0x54, + 0x26, 0x00, 0x87, 0x54, 0x2B, 0x00, 0x89, 0x55, 0x2A, 0x00, 0x89, 0x56, 0x2C, 0x00, 0x80, 0x54, + 0x30, 0x00, 0x82, 0x55, 0x36, 0x00, 0x8D, 0x5B, 0x32, 0x00, 0x8A, 0x5A, 0x36, 0x00, 0x89, 0x5B, + 0x3A, 0x00, 0x91, 0x5D, 0x31, 0x00, 0x99, 0x60, 0x2B, 0x00, 0x8D, 0x62, 0x33, 0x00, 0x97, 0x63, + 0x37, 0x00, 0x98, 0x62, 0x30, 0x00, 0x9D, 0x69, 0x32, 0x00, 0x9E, 0x6D, 0x31, 0x00, 0x9A, 0x67, + 0x3A, 0x00, 0xA4, 0x69, 0x28, 0x00, 0xA9, 0x6C, 0x28, 0x00, 0xB1, 0x76, 0x2D, 0x00, 0xA7, 0x6D, + 0x34, 0x00, 0xA5, 0x72, 0x3E, 0x00, 0xB2, 0x78, 0x34, 0x00, 0xD1, 0x55, 0x00, 0x00, 0x94, 0x68, + 0x45, 0x00, 0x9D, 0x6F, 0x48, 0x00, 0x9E, 0x73, 0x4F, 0x00, 0x99, 0x79, 0x50, 0x00, 0xA2, 0x74, + 0x4B, 0x00, 0xA2, 0x76, 0x51, 0x00, 0x9B, 0x7F, 0x64, 0x00, 0xBA, 0x81, 0x3B, 0x00, 0xBF, 0x86, + 0x3B, 0x00, 0xBF, 0x87, 0x3D, 0x00, 0xE6, 0xA6, 0x3E, 0x00, 0xBB, 0x87, 0x4E, 0x00, 0xBB, 0x8B, + 0x49, 0x00, 0xAB, 0x84, 0x50, 0x00, 0xAA, 0x81, 0x5C, 0x00, 0xAD, 0x83, 0x5D, 0x00, 0xB8, 0x91, + 0x62, 0x00, 0xA8, 0x93, 0x73, 0x00, 0xB9, 0x96, 0x79, 0x00, 0xC2, 0x8D, 0x47, 0x00, 0xC2, 0x8F, + 0x4D, 0x00, 0xC9, 0x93, 0x4E, 0x00, 0xCC, 0x97, 0x4D, 0x00, 0xCE, 0x99, 0x50, 0x00, 0xC8, 0x9B, + 0x5F, 0x00, 0xCC, 0x9C, 0x64, 0x00, 0xC5, 0x9B, 0x6A, 0x00, 0xC1, 0x99, 0x6F, 0x00, 0xC7, 0xA4, + 0x6F, 0x00, 0xD2, 0xA2, 0x63, 0x00, 0xD9, 0xA7, 0x64, 0x00, 0xD9, 0xAA, 0x63, 0x00, 0xDC, 0xAC, + 0x65, 0x00, 0xD6, 0xAA, 0x6E, 0x00, 0xDA, 0xAD, 0x74, 0x00, 0xD9, 0xB0, 0x78, 0x00, 0xDC, 0xB2, + 0x7D, 0x00, 0xE6, 0xB9, 0x75, 0x00, 0xEA, 0xBB, 0x76, 0x00, 0xE0, 0xB7, 0x7C, 0x00, 0xE5, 0xBA, + 0x7E, 0x00, 0xEC, 0xBF, 0x78, 0x00, 0xE8, 0xBE, 0x7C, 0x00, 0xB6, 0x99, 0x85, 0x00, 0xB1, 0xA3, + 0x90, 0x00, 0xB7, 0xAB, 0x94, 0x00, 0xBB, 0xB1, 0xA3, 0x00, 0xC2, 0xA7, 0x83, 0x00, 0xC1, 0xA3, + 0x89, 0x00, 0xD3, 0xAD, 0x80, 0x00, 0xD9, 0xB5, 0x82, 0x00, 0xCB, 0xB0, 0x97, 0x00, 0xD5, 0xB6, + 0x95, 0x00, 0xDD, 0xBF, 0x99, 0x00, 0xE4, 0xBE, 0x8B, 0x00, 0xC9, 0xBE, 0xAB, 0x00, 0xC8, 0xBF, + 0xAE, 0x00, 0xD3, 0xBC, 0xA4, 0x00, 0xC5, 0xBF, 0xB4, 0x00, 0xE7, 0xC2, 0x87, 0x00, 0xE5, 0xC1, + 0x8B, 0x00, 0xE6, 0xC3, 0x8F, 0x00, 0xEF, 0xC8, 0x89, 0x00, 0xF0, 0xCB, 0x8B, 0x00, 0xF5, 0xCE, + 0x8C, 0x00, 0xE6, 0xC4, 0x91, 0x00, 0xE7, 0xC4, 0x95, 0x00, 0xEC, 0xC7, 0x90, 0x00, 0xEA, 0xC8, + 0x93, 0x00, 0xE6, 0xC9, 0x9D, 0x00, 0xEB, 0xCB, 0x99, 0x00, 0xEF, 0xCD, 0x99, 0x00, 0xEE, 0xCF, + 0x9C, 0x00, 0xF0, 0xCB, 0x91, 0x00, 0xF2, 0xD1, 0x99, 0x00, 0xF5, 0xD3, 0x98, 0x00, 0xF5, 0xD4, + 0x9A, 0x00, 0xF5, 0xD4, 0x9D, 0x00, 0xD5, 0xC4, 0xAD, 0x00, 0xDF, 0xC7, 0xA9, 0x00, 0xDE, 0xCB, + 0xA9, 0x00, 0xC8, 0xC0, 0xB3, 0x00, 0xC9, 0xC4, 0xB9, 0x00, 0xD0, 0xC5, 0xBC, 0x00, 0xE8, 0xCA, + 0xA1, 0x00, 0xE7, 0xD1, 0xAE, 0x00, 0xEE, 0xD6, 0xAE, 0x00, 0xF5, 0xD6, 0xA0, 0x00, 0xF0, 0xD3, + 0xA5, 0x00, 0xF0, 0xD4, 0xA6, 0x00, 0xF7, 0xD8, 0xA0, 0x00, 0xF9, 0xDB, 0xA7, 0x00, 0xF4, 0xD9, + 0xA9, 0x00, 0xF9, 0xDE, 0xAD, 0x00, 0xF1, 0xD8, 0xB0, 0x00, 0xF5, 0xDB, 0xB0, 0x00, 0xF6, 0xDF, + 0xB6, 0x00, 0xF4, 0xDF, 0xB9, 0x00, 0xF0, 0xDE, 0xBF, 0x00, 0xFB, 0xE1, 0xB3, 0x00, 0xF9, 0xE1, + 0xB6, 0x00, 0xF6, 0xE0, 0xB8, 0x00, 0xF6, 0xE1, 0xBE, 0x00, 0xFC, 0xE5, 0xBC, 0x00, 0xD2, 0xCD, + 0xC2, 0x00, 0xD6, 0xD3, 0xCD, 0x00, 0xD8, 0xD5, 0xCF, 0x00, 0xD7, 0xD6, 0xD5, 0x00, 0xD8, 0xD6, + 0xD2, 0x00, 0xDF, 0xDA, 0xD1, 0x00, 0xDE, 0xDB, 0xD4, 0x00, 0xDF, 0xDD, 0xD8, 0x00, 0xE0, 0xD4, + 0xC1, 0x00, 0xE0, 0xD8, 0xCE, 0x00, 0xE1, 0xDE, 0xDA, 0x00, 0xFA, 0xE5, 0xC1, 0x00, 0xFB, 0xE7, + 0xC4, 0x00, 0xF1, 0xE4, 0xCE, 0x00, 0xE1, 0xE0, 0xDE, 0x00, 0xEF, 0xE7, 0xDA, 0x00, 0xF1, 0xE8, + 0xD8, 0x00, 0xE6, 0xE6, 0xE6, 0x00, 0xE8, 0xE9, 0xE9, 0x00, 0xEE, 0xEE, 0xEC, 0x00, 0xFB, 0xF2, + 0xE1, 0x00, 0xF0, 0xF0, 0xEE, 0x00, 0xEF, 0xF0, 0xF0, 0x00, 0xF2, 0xF1, 0xF0, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x13, 0x0F, 0x0F, 0x0F, 0x0F, 0x13, 0x13, 0x13, 0x13, 0x13, 0x04, 0x13, 0x13, + 0x13, 0x13, 0x13, 0x1A, 0x30, 0x33, 0x33, 0x30, 0x1A, 0x13, 0x0F, 0x13, 0x13, 0x1A, 0x0F, 0x1A, + 0x13, 0x1A, 0x30, 0x0D, 0x0D, 0x0D, 0x0E, 0x35, 0x38, 0x36, 0x1E, 0x13, 0x13, 0x1A, 0x02, 0x73, + 0x4C, 0x2C, 0x09, 0x06, 0x08, 0x0A, 0x1D, 0x2B, 0x31, 0x36, 0x48, 0x49, 0x01, 0x57, 0x7B, 0x00, + 0x36, 0x09, 0x31, 0x4E, 0x30, 0x13, 0x13, 0x16, 0x1C, 0x30, 0x39, 0x4A, 0x78, 0x5A, 0x49, 0x4D, + 0x1D, 0x30, 0x9B, 0xBE, 0x74, 0x3B, 0x16, 0x17, 0x17, 0x17, 0x22, 0x3E, 0x57, 0x40, 0x05, 0x3C, + 0x13, 0x3E, 0xB4, 0xC6, 0xC1, 0x76, 0x4B, 0x27, 0x26, 0x26, 0x26, 0x22, 0x45, 0x81, 0xC4, 0x3E, + 0x22, 0x2A, 0x58, 0xBA, 0xC1, 0xBE, 0x82, 0x59, 0x3E, 0x2A, 0x2A, 0x28, 0x42, 0x62, 0x7C, 0x44, + 0x42, 0x43, 0x43, 0x77, 0xB3, 0x99, 0xB0, 0x9B, 0x75, 0x55, 0x43, 0x43, 0x46, 0x62, 0x97, 0x53, + 0x4F, 0x4F, 0x5B, 0x60, 0x96, 0xB2, 0x7F, 0xB1, 0xB4, 0x7F, 0x54, 0x4F, 0x5B, 0x79, 0x03, 0x61, + 0x5E, 0x5F, 0x69, 0x6C, 0x7A, 0xB8, 0xB4, 0xBA, 0xC3, 0xB4, 0x64, 0x5F, 0x65, 0x7D, 0x6A, 0x6C, + 0x66, 0x66, 0x84, 0x8A, 0x84, 0x8D, 0xBF, 0xC7, 0xC7, 0xC7, 0x98, 0x66, 0x6F, 0x47, 0x8A, 0x9C, + 0x70, 0x6E, 0x8E, 0xA0, 0xA0, 0xA0, 0xA8, 0xA9, 0xBD, 0xC0, 0x83, 0x72, 0x8E, 0x8C, 0x7E, 0x8A, + 0x8E, 0x87, 0x95, 0xA8, 0xAE, 0xAE, 0xA8, 0xA8, 0xAE, 0xA8, 0x88, 0x95, 0x72, 0xFF, 0x9D, 0x6E, + 0x91, 0xA0, 0x95, 0xA5, 0xBC, 0xBC, 0xBC, 0xBC, 0xAB, 0xA4, 0x95, 0x52, 0xAE, 0x9D, 0x00, 0xA8, + 0x88, 0x95, 0xAB, 0xA3, 0xAB, 0xAF, 0xAF, 0xAF, 0xA5, 0xA5, 0x95, 0xAF, 0xA8, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x1A, 0x82, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1B, 0x82, 0x45, + 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1C, 0x82, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, + 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, + 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, + 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x01, 0x82, 0x45, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x82, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, + 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x25, 0x82, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x28, 0x82, 0x45, + 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, + 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x34, 0x82, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x33, 0x82, 0x45, + 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x32, 0x82, 0x45, 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, + 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x01, 0x82, 0x45, 0x0C, 0x01, 0x82, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, + 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, + 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, + 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, + 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x42, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, + 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x38, 0x83, 0x45, + 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, + 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, + 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0C, 0x02, 0x82, 0x45, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, + 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x33, 0x82, 0x45, + 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x37, 0x82, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, + 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x42, 0x83, 0x45, + 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, + 0x0C, 0x49, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4E, 0x82, 0x45, 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x4F, 0x82, 0x45, + 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x50, 0x82, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x51, 0x82, 0x45, + 0x0C, 0x51, 0x82, 0x45, 0x0C, 0x51, 0x82, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x51, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x52, 0x82, 0x45, 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x51, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x52, 0x82, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x52, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x50, 0x82, 0x45, 0x0C, 0x50, 0x83, 0x45, 0x0C, 0x4E, 0x82, 0x45, + 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x4D, 0x82, 0x45, 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4B, 0x82, 0x45, + 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x49, 0x82, 0x45, 0x0C, 0x48, 0x83, 0x45, 0x0C, 0x47, 0x82, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x45, 0x82, 0x45, 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, + 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x82, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, + 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, + 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, + 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x37, 0x83, 0x45, + 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x42, 0x83, 0x45, + 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, 0x0C, 0x4B, 0x83, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, + 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, 0x0D, 0x57, 0x83, 0x45, 0x0C, 0x59, 0x83, 0x45, + 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x5F, 0x82, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x5F, 0x82, 0x45, + 0x0C, 0x60, 0x82, 0x45, 0x0C, 0x60, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, + 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x61, 0x82, 0x45, + 0x0C, 0x61, 0x82, 0x45, 0x0C, 0x62, 0x82, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x61, 0x82, 0x45, + 0x0C, 0x61, 0x83, 0x45, 0x0C, 0x61, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, + 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x61, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x5E, 0x82, 0x45, 0x0C, 0x5D, 0x83, 0x45, 0x0C, 0x5C, 0x82, 0x45, + 0x0C, 0x5B, 0x83, 0x45, 0x0C, 0x5A, 0x82, 0x45, 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x58, 0x82, 0x45, + 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x50, 0x83, 0x45, + 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x3F, 0x83, 0x45, + 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x81, 0x44, + 0x0B, 0x02, 0x81, 0x44, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0C, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, + 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, + 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x3B, 0x82, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x43, 0x82, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, + 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, + 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x65, 0x82, 0x45, 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x67, 0x82, 0x45, + 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x69, 0x82, 0x45, 0x0C, 0x6B, 0x83, 0x45, 0x0C, 0x6C, 0x82, 0x45, + 0x0C, 0x6D, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, + 0x0C, 0x70, 0x83, 0x45, 0x0C, 0x71, 0x82, 0x45, 0x0C, 0x72, 0x83, 0x44, 0x0C, 0x72, 0x82, 0x45, + 0x0C, 0x72, 0x83, 0x44, 0x0C, 0x72, 0x82, 0x45, 0x0C, 0x72, 0x83, 0x44, 0x0C, 0x72, 0x82, 0x45, + 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, + 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, + 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6E, 0x82, 0x45, + 0x0C, 0x6E, 0x83, 0x45, 0x0C, 0x6D, 0x82, 0x45, 0x0C, 0x6C, 0x83, 0x45, 0x0C, 0x6B, 0x82, 0x45, + 0x0C, 0x6A, 0x83, 0x45, 0x0C, 0x69, 0x82, 0x45, 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x67, 0x82, 0x45, + 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x64, 0x82, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x60, 0x82, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x5C, 0x82, 0x45, 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x57, 0x82, 0x45, + 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, + 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0C, 0x41, 0x83, 0x45, + 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x38, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x13, 0x82, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0B, 0x03, 0x81, 0x44, + 0x0A, 0x03, 0x82, 0x44, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x09, 0x01, 0x82, 0x44, 0x0A, 0x01, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, + 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x29, 0x83, 0x45, + 0x0C, 0x2F, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, + 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, + 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x6A, 0x83, 0x45, + 0x0D, 0x6D, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, + 0x0C, 0x74, 0x83, 0x45, 0x0C, 0x76, 0x82, 0x45, 0x0C, 0x77, 0x82, 0x45, 0x0C, 0x77, 0x82, 0x45, + 0x0C, 0x78, 0x82, 0x45, 0x0C, 0x79, 0x82, 0x45, 0x0D, 0x7A, 0x82, 0x45, 0x0D, 0x7B, 0x83, 0x45, + 0x0D, 0x7D, 0x84, 0x46, 0x0D, 0x7D, 0x84, 0x46, 0x0D, 0x7E, 0x84, 0x46, 0x0C, 0x7F, 0x84, 0x46, + 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x45, + 0x0B, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x45, 0x0B, 0x82, 0x83, 0x44, 0x0B, 0x83, 0x83, 0x44, + 0x0B, 0x83, 0x83, 0x44, 0x0B, 0x83, 0x83, 0x44, 0x0B, 0x83, 0x83, 0x44, 0x0B, 0x82, 0x83, 0x45, + 0x0C, 0x81, 0x84, 0x46, 0x0C, 0x81, 0x84, 0x45, 0x0C, 0x80, 0x84, 0x46, 0x0C, 0x80, 0x83, 0x46, + 0x0D, 0x7F, 0x83, 0x46, 0x0D, 0x7E, 0x83, 0x45, 0x0C, 0x7E, 0x83, 0x45, 0x0D, 0x7D, 0x83, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0D, 0x7C, 0x83, 0x45, 0x0C, 0x7B, 0x83, 0x45, 0x0C, 0x7A, 0x83, 0x45, + 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x79, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, + 0x0C, 0x75, 0x83, 0x45, 0x0C, 0x74, 0x83, 0x45, 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x71, 0x82, 0x45, + 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6D, 0x82, 0x45, 0x0C, 0x6A, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, + 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, + 0x0C, 0x5A, 0x83, 0x45, 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x4F, 0x83, 0x45, + 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x42, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, + 0x0C, 0x37, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, + 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x06, 0x82, 0x45, 0x0C, 0x05, 0x81, 0x44, + 0x0A, 0x03, 0x83, 0x45, 0x0D, 0x02, 0x8C, 0x53, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x09, 0x01, 0x81, 0x43, 0x0A, 0x02, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, + 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, + 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x31, 0x83, 0x45, + 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x4C, 0x82, 0x45, + 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x57, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, 0x0C, 0x6C, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, + 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x78, 0x82, 0x45, + 0x0C, 0x7B, 0x83, 0x45, 0x0C, 0x7D, 0x82, 0x45, 0x0C, 0x7F, 0x82, 0x45, 0x0C, 0x81, 0x82, 0x45, + 0x0C, 0x83, 0x83, 0x45, 0x0D, 0x84, 0x82, 0x45, 0x0C, 0x86, 0x83, 0x45, 0x0C, 0x86, 0x83, 0x45, + 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, + 0x0C, 0x8B, 0x83, 0x45, 0x0C, 0x8C, 0x83, 0x45, 0x0C, 0x8D, 0x83, 0x44, 0x0B, 0x8E, 0x82, 0x45, + 0x0B, 0x8F, 0x83, 0x45, 0x0B, 0x90, 0x83, 0x45, 0x0B, 0x8F, 0x84, 0x45, 0x0B, 0x90, 0x84, 0x45, + 0x0B, 0x8F, 0x84, 0x45, 0x0B, 0x90, 0x84, 0x45, 0x0A, 0x91, 0x84, 0x44, 0x0A, 0x91, 0x84, 0x45, + 0x0B, 0x92, 0x84, 0x44, 0x0A, 0x92, 0x83, 0x45, 0x0B, 0x93, 0x83, 0x44, 0x0A, 0x92, 0x82, 0x45, + 0x0B, 0x93, 0x83, 0x45, 0x0B, 0x92, 0x83, 0x45, 0x0B, 0x92, 0x84, 0x45, 0x0B, 0x91, 0x83, 0x46, + 0x0C, 0x90, 0x84, 0x46, 0x0D, 0x8F, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8E, 0x83, 0x45, + 0x0C, 0x8D, 0x83, 0x45, 0x0C, 0x8B, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x89, 0x83, 0x45, + 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x85, 0x83, 0x45, + 0x0C, 0x84, 0x83, 0x45, 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x7F, 0x82, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0C, 0x7B, 0x82, 0x45, 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x78, 0x82, 0x45, + 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x72, 0x82, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x6C, 0x83, 0x45, + 0x0C, 0x69, 0x83, 0x45, 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x5D, 0x83, 0x45, + 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, + 0x0C, 0x42, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x2D, 0x83, 0x45, + 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x1F, 0x82, 0x45, 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x14, 0x82, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x06, 0x82, 0x44, + 0x0B, 0x04, 0x84, 0x46, 0x0F, 0x03, 0x8C, 0x53, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x09, 0x01, 0x81, 0x43, 0x09, 0x02, 0x82, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, + 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x3B, 0x83, 0x45, + 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x4B, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x59, 0x83, 0x45, + 0x0C, 0x60, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x6B, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, + 0x0C, 0x74, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x7F, 0x83, 0x45, + 0x0C, 0x81, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x88, 0x82, 0x45, + 0x0C, 0x8A, 0x82, 0x45, 0x0C, 0x8C, 0x82, 0x44, 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x8E, 0x83, 0x45, + 0x0D, 0x8F, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, 0x0C, 0x92, 0x83, 0x45, 0x0B, 0x95, 0x83, 0x45, + 0x0B, 0x96, 0x83, 0x45, 0x0B, 0x98, 0x83, 0x45, 0x0C, 0x99, 0x82, 0x44, 0x0A, 0x99, 0x82, 0x45, + 0x0B, 0x99, 0x81, 0x44, 0x0B, 0x9A, 0x81, 0x42, 0x09, 0x9B, 0x83, 0x45, 0x0B, 0x9C, 0x84, 0x46, + 0x0C, 0x9C, 0x85, 0x48, 0x0F, 0x9E, 0x86, 0x49, 0x10, 0xA1, 0x87, 0x4A, 0x12, 0xA1, 0x86, 0x4A, + 0x13, 0xA2, 0x86, 0x4A, 0x13, 0xA2, 0x87, 0x49, 0x13, 0xA3, 0x86, 0x4A, 0x14, 0xA4, 0x86, 0x49, + 0x13, 0xA4, 0x86, 0x49, 0x13, 0xA2, 0x84, 0x48, 0x12, 0xA1, 0x84, 0x47, 0x11, 0xA0, 0x83, 0x46, + 0x10, 0x9F, 0x82, 0x45, 0x0E, 0xA0, 0x80, 0x43, 0x0B, 0x9F, 0x81, 0x42, 0x0B, 0x9E, 0x82, 0x44, + 0x0C, 0x9D, 0x83, 0x45, 0x0D, 0x9D, 0x83, 0x45, 0x0D, 0x9D, 0x83, 0x44, 0x0C, 0x9C, 0x83, 0x44, + 0x0B, 0x9A, 0x82, 0x43, 0x0A, 0x99, 0x83, 0x45, 0x0B, 0x97, 0x83, 0x45, 0x0B, 0x96, 0x83, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, 0x0C, 0x94, 0x83, 0x45, 0x0C, 0x93, 0x83, 0x45, + 0x0C, 0x92, 0x83, 0x45, 0x0D, 0x91, 0x83, 0x45, 0x0C, 0x90, 0x83, 0x45, 0x0C, 0x8E, 0x83, 0x45, + 0x0C, 0x8C, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x86, 0x82, 0x45, + 0x0C, 0x85, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x7F, 0x83, 0x45, 0x0C, 0x7C, 0x83, 0x45, + 0x0C, 0x78, 0x83, 0x45, 0x0C, 0x75, 0x83, 0x45, 0x0C, 0x70, 0x83, 0x45, 0x0C, 0x6D, 0x83, 0x45, + 0x0C, 0x67, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x5B, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x46, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, + 0x0C, 0x2D, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, 0x0C, 0x1E, 0x83, 0x45, 0x0C, 0x18, 0x82, 0x45, + 0x0C, 0x12, 0x82, 0x45, 0x0C, 0x0E, 0x82, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x81, 0x45, 0x0E, 0x02, 0x85, 0x49, 0x14, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x0A, 0x01, 0x82, 0x43, 0x0A, 0x02, 0x82, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x0A, 0x82, 0x45, + 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x43, 0x82, 0x45, + 0x0C, 0x4C, 0x83, 0x45, 0x0C, 0x54, 0x82, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x63, 0x83, 0x45, + 0x0C, 0x6B, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x7B, 0x83, 0x45, + 0x0C, 0x7F, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0C, 0x87, 0x83, 0x45, 0x0C, 0x8A, 0x82, 0x45, + 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x8F, 0x82, 0x45, 0x0C, 0x92, 0x83, 0x45, 0x0C, 0x94, 0x82, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x98, 0x82, 0x45, 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x46, + 0x0D, 0x9C, 0x83, 0x45, 0x0D, 0x9D, 0x82, 0x45, 0x0C, 0x9E, 0x83, 0x45, 0x0C, 0x9F, 0x82, 0x44, + 0x0B, 0xA1, 0x83, 0x44, 0x0B, 0xA1, 0x82, 0x44, 0x0A, 0xA3, 0x82, 0x46, 0x0C, 0xA6, 0x85, 0x49, + 0x0F, 0xA8, 0x89, 0x4C, 0x14, 0xAA, 0x8D, 0x52, 0x1B, 0xAD, 0x8F, 0x56, 0x22, 0xAE, 0x91, 0x5B, + 0x28, 0xB2, 0x93, 0x5F, 0x30, 0xB6, 0x95, 0x62, 0x36, 0xBA, 0x96, 0x64, 0x3B, 0xBD, 0x97, 0x65, + 0x3C, 0xBF, 0x97, 0x66, 0x3D, 0xC0, 0x96, 0x67, 0x3C, 0xC2, 0x97, 0x68, 0x3C, 0xC0, 0x97, 0x69, + 0x3C, 0xC0, 0x97, 0x68, 0x3C, 0xBE, 0x98, 0x67, 0x3B, 0xBE, 0x97, 0x64, 0x38, 0xBC, 0x96, 0x63, + 0x35, 0xBA, 0x93, 0x5E, 0x2E, 0xB6, 0x8F, 0x59, 0x27, 0xB3, 0x8A, 0x51, 0x1C, 0xAF, 0x88, 0x4B, + 0x15, 0xAC, 0x84, 0x46, 0x10, 0xA9, 0x82, 0x44, 0x0C, 0xA9, 0x82, 0x43, 0x0B, 0xA8, 0x82, 0x43, + 0x0A, 0xA8, 0x83, 0x43, 0x0A, 0xA5, 0x82, 0x44, 0x0C, 0xA4, 0x82, 0x44, 0x0A, 0xA3, 0x83, 0x45, + 0x0B, 0xA2, 0x84, 0x45, 0x0C, 0xA1, 0x84, 0x46, 0x0C, 0xA0, 0x83, 0x45, 0x0C, 0x9E, 0x83, 0x45, + 0x0C, 0x9E, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x99, 0x82, 0x45, + 0x0C, 0x98, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, 0x0C, 0x93, 0x83, 0x45, 0x0C, 0x91, 0x82, 0x45, + 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x8B, 0x83, 0x45, 0x0C, 0x87, 0x82, 0x45, + 0x0C, 0x84, 0x83, 0x45, 0x0C, 0x80, 0x82, 0x45, 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, + 0x0C, 0x73, 0x83, 0x45, 0x0C, 0x6D, 0x83, 0x45, 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x5E, 0x83, 0x45, + 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, + 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x2B, 0x82, 0x45, 0x0C, 0x23, 0x83, 0x45, 0x0C, 0x1C, 0x82, 0x45, + 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x10, 0x82, 0x45, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x05, 0x83, 0x45, 0x0D, 0x04, 0x83, 0x45, 0x0D, 0x03, 0x83, 0x46, 0x0D, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x46, 0x0E, 0x01, 0x84, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, + 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, + 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x6D, 0x83, 0x45, + 0x0C, 0x75, 0x83, 0x45, 0x0C, 0x7B, 0x83, 0x45, 0x0D, 0x81, 0x83, 0x45, 0x0C, 0x85, 0x83, 0x45, + 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x8E, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, + 0x0C, 0x97, 0x82, 0x45, 0x0C, 0x9A, 0x82, 0x44, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x9E, 0x84, 0x45, + 0x0D, 0xA0, 0x84, 0x45, 0x0C, 0xA3, 0x84, 0x45, 0x0B, 0xA4, 0x83, 0x45, 0x0C, 0xA6, 0x83, 0x46, + 0x0D, 0xA7, 0x83, 0x45, 0x0C, 0xA8, 0x83, 0x44, 0x0C, 0xAA, 0x84, 0x47, 0x0F, 0xAA, 0x88, 0x4B, + 0x14, 0xAC, 0x8B, 0x50, 0x1C, 0xB3, 0x91, 0x59, 0x2A, 0xB9, 0x98, 0x63, 0x39, 0xC0, 0x9D, 0x6A, + 0x42, 0xC7, 0x9E, 0x6F, 0x4C, 0xCC, 0xA0, 0x74, 0x52, 0xD2, 0xA0, 0x77, 0x57, 0xD9, 0x9F, 0x77, + 0x5A, 0xE1, 0x9D, 0x77, 0x5B, 0xE7, 0x9C, 0x76, 0x5A, 0xED, 0x9B, 0x74, 0x5A, 0xF0, 0x9A, 0x74, + 0x5A, 0xF3, 0x9A, 0x74, 0x5A, 0xF3, 0x9B, 0x75, 0x5A, 0xF4, 0x9B, 0x75, 0x5B, 0xF3, 0x9C, 0x77, + 0x5C, 0xF2, 0x9C, 0x77, 0x5C, 0xF2, 0x9D, 0x78, 0x5E, 0xF1, 0x9E, 0x78, 0x5E, 0xEE, 0x9E, 0x78, + 0x5D, 0xE9, 0xA1, 0x78, 0x5C, 0xE2, 0x9F, 0x78, 0x59, 0xDC, 0x9F, 0x76, 0x54, 0xD5, 0x9D, 0x71, + 0x4C, 0xD1, 0x9D, 0x6C, 0x43, 0xCA, 0x98, 0x66, 0x3B, 0xC6, 0x94, 0x5E, 0x2E, 0xBF, 0x8D, 0x54, + 0x22, 0xB8, 0x87, 0x4C, 0x16, 0xB5, 0x84, 0x47, 0x11, 0xAF, 0x83, 0x45, 0x0E, 0xAC, 0x82, 0x45, + 0x0D, 0xAB, 0x83, 0x45, 0x0C, 0xAB, 0x84, 0x45, 0x0C, 0xAA, 0x83, 0x44, 0x0C, 0xA8, 0x84, 0x45, + 0x0C, 0xA7, 0x83, 0x45, 0x0C, 0xA6, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x45, 0x0C, 0xA3, 0x83, 0x45, + 0x0C, 0xA1, 0x83, 0x45, 0x0D, 0xA0, 0x83, 0x45, 0x0C, 0x9E, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, + 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x97, 0x83, 0x45, 0x0C, 0x95, 0x83, 0x45, 0x0C, 0x92, 0x82, 0x45, + 0x0C, 0x8E, 0x83, 0x45, 0x0C, 0x8A, 0x83, 0x45, 0x0C, 0x86, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x68, 0x83, 0x45, + 0x0C, 0x5E, 0x83, 0x45, 0x0C, 0x56, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, 0x0C, 0x43, 0x83, 0x45, + 0x0C, 0x39, 0x83, 0x45, 0x0C, 0x30, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, 0x0C, 0x1F, 0x82, 0x45, + 0x0C, 0x18, 0x82, 0x45, 0x0C, 0x12, 0x82, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0D, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x47, 0x0F, 0x02, 0x84, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0D, 0x82, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x82, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x3A, 0x82, 0x45, 0x0C, 0x44, 0x83, 0x45, 0x0C, 0x4E, 0x83, 0x45, + 0x0C, 0x59, 0x83, 0x45, 0x0C, 0x62, 0x83, 0x45, 0x0C, 0x6C, 0x83, 0x45, 0x0C, 0x74, 0x83, 0x45, + 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x8D, 0x82, 0x45, + 0x0C, 0x92, 0x83, 0x45, 0x0C, 0x95, 0x82, 0x45, 0x0C, 0x99, 0x83, 0x45, 0x0D, 0x9C, 0x82, 0x45, + 0x0C, 0x9F, 0x83, 0x45, 0x0D, 0xA1, 0x83, 0x45, 0x0C, 0xA3, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x45, + 0x0C, 0xA7, 0x83, 0x44, 0x0B, 0xA9, 0x83, 0x45, 0x0B, 0xAA, 0x84, 0x46, 0x0C, 0xAB, 0x84, 0x47, + 0x0B, 0xAE, 0x8A, 0x4C, 0x13, 0xB2, 0x8E, 0x54, 0x21, 0xB9, 0x95, 0x5F, 0x32, 0xC3, 0x98, 0x69, + 0x42, 0xCD, 0x9E, 0x72, 0x50, 0xD6, 0xA1, 0x78, 0x59, 0xDF, 0xA0, 0x78, 0x5A, 0xE7, 0x9E, 0x77, + 0x59, 0xEF, 0x9B, 0x75, 0x58, 0xF6, 0x99, 0x73, 0x56, 0xFA, 0x98, 0x72, 0x57, 0xFC, 0x99, 0x73, + 0x58, 0xFE, 0x9B, 0x74, 0x59, 0xFF, 0x9B, 0x74, 0x5A, 0xFF, 0x9B, 0x75, 0x5B, 0xFF, 0x9B, 0x75, + 0x5B, 0xFE, 0x9B, 0x74, 0x5B, 0xFF, 0x9A, 0x74, 0x5B, 0xFF, 0x9A, 0x74, 0x5B, 0xFF, 0x99, 0x74, + 0x5B, 0xFF, 0x99, 0x74, 0x5B, 0xFE, 0x99, 0x75, 0x5C, 0xFF, 0x9B, 0x76, 0x5D, 0xFE, 0x9C, 0x77, + 0x5D, 0xFF, 0x9D, 0x77, 0x5D, 0xFD, 0x9D, 0x77, 0x5C, 0xFD, 0x9F, 0x79, 0x5D, 0xFA, 0xA1, 0x7B, + 0x5F, 0xF8, 0xA4, 0x7C, 0x62, 0xF2, 0xA5, 0x7F, 0x63, 0xEE, 0xA5, 0x7D, 0x61, 0xE5, 0xA2, 0x7A, + 0x59, 0xDC, 0x9D, 0x70, 0x4C, 0xD1, 0x97, 0x65, 0x39, 0xCA, 0x8F, 0x57, 0x25, 0xC1, 0x89, 0x4D, + 0x18, 0xB9, 0x84, 0x47, 0x10, 0xB4, 0x83, 0x44, 0x0C, 0xB2, 0x83, 0x43, 0x0B, 0xAE, 0x83, 0x45, + 0x0C, 0xAD, 0x83, 0x45, 0x0B, 0xAC, 0x84, 0x46, 0x0C, 0xAB, 0x84, 0x45, 0x0C, 0xA9, 0x83, 0x45, + 0x0D, 0xA9, 0x83, 0x45, 0x0C, 0xA8, 0x83, 0x45, 0x0C, 0xA7, 0x83, 0x45, 0x0C, 0xA5, 0x82, 0x45, + 0x0C, 0xA2, 0x83, 0x45, 0x0C, 0x9F, 0x83, 0x45, 0x0C, 0x9D, 0x83, 0x45, 0x0C, 0x9A, 0x82, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x93, 0x82, 0x45, 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8B, 0x82, 0x45, + 0x0C, 0x85, 0x83, 0x45, 0x0C, 0x7E, 0x83, 0x45, 0x0C, 0x76, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, + 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x5B, 0x83, 0x45, 0x0C, 0x52, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, + 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x33, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x21, 0x82, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x44, 0x0B, 0x03, 0x83, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x47, 0x0F, 0x02, 0x84, 0x46, 0x0F, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x83, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x28, 0x83, 0x45, + 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, + 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0D, 0x70, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, + 0x0D, 0x80, 0x83, 0x45, 0x0C, 0x86, 0x83, 0x45, 0x0C, 0x8D, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, + 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x99, 0x83, 0x44, 0x0C, 0x9D, 0x83, 0x45, 0x0C, 0x9F, 0x83, 0x45, + 0x0D, 0xA2, 0x83, 0x45, 0x0C, 0xA4, 0x83, 0x45, 0x0C, 0xA6, 0x83, 0x45, 0x0C, 0xA9, 0x84, 0x45, + 0x0D, 0xAC, 0x84, 0x45, 0x0E, 0xAE, 0x88, 0x4A, 0x13, 0xB1, 0x8E, 0x54, 0x21, 0xBA, 0x99, 0x62, + 0x37, 0xC4, 0x9E, 0x6F, 0x4C, 0xD0, 0xA2, 0x77, 0x58, 0xDE, 0xA1, 0x7A, 0x5E, 0xE9, 0x9F, 0x78, + 0x5E, 0xF3, 0x9A, 0x75, 0x5B, 0xFA, 0x96, 0x71, 0x57, 0xFD, 0x92, 0x6C, 0x52, 0xFF, 0x8F, 0x68, + 0x4E, 0xFF, 0x8B, 0x65, 0x4A, 0xFF, 0x8A, 0x63, 0x47, 0xFF, 0x87, 0x5F, 0x44, 0xFF, 0x87, 0x5D, + 0x42, 0xFF, 0x85, 0x5B, 0x41, 0xFF, 0x83, 0x5A, 0x3F, 0xFF, 0x82, 0x59, 0x3E, 0xFF, 0x83, 0x57, + 0x3C, 0xFF, 0x82, 0x57, 0x3C, 0xFF, 0x82, 0x56, 0x3B, 0xFF, 0x81, 0x56, 0x3B, 0xFF, 0x82, 0x57, + 0x3D, 0xFF, 0x83, 0x59, 0x3F, 0xFF, 0x84, 0x5B, 0x41, 0xFF, 0x86, 0x5E, 0x43, 0xFF, 0x88, 0x60, + 0x45, 0xFF, 0x8A, 0x62, 0x48, 0xFF, 0x8C, 0x65, 0x4A, 0xFF, 0x8F, 0x69, 0x4E, 0xFF, 0x92, 0x6D, + 0x52, 0xFF, 0x95, 0x70, 0x55, 0xFF, 0x97, 0x72, 0x58, 0xFE, 0x99, 0x74, 0x5A, 0xFD, 0x9B, 0x78, + 0x5E, 0xFA, 0xA0, 0x7B, 0x61, 0xF6, 0xA0, 0x7D, 0x61, 0xEF, 0xA3, 0x7C, 0x5D, 0xE4, 0xA0, 0x78, + 0x54, 0xD8, 0x9C, 0x6C, 0x41, 0xCC, 0x92, 0x5B, 0x2C, 0xC1, 0x89, 0x4D, 0x17, 0xB9, 0x83, 0x45, + 0x0E, 0xB3, 0x84, 0x45, 0x0C, 0xB0, 0x83, 0x45, 0x0C, 0xAE, 0x83, 0x45, 0x0C, 0xAD, 0x84, 0x45, + 0x0D, 0xAC, 0x83, 0x45, 0x0C, 0xAB, 0x84, 0x45, 0x0C, 0xAA, 0x83, 0x45, 0x0D, 0xA9, 0x83, 0x45, + 0x0C, 0xA6, 0x83, 0x45, 0x0D, 0xA4, 0x83, 0x45, 0x0C, 0xA1, 0x83, 0x45, 0x0C, 0x9F, 0x83, 0x45, + 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x97, 0x82, 0x45, 0x0C, 0x93, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, + 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x72, 0x83, 0x45, + 0x0C, 0x69, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x22, 0x82, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, + 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x44, 0x0B, 0x02, 0x83, 0x44, 0x0C, 0x01, 0x87, 0x49, + 0x12, 0x01, 0x88, 0x4C, 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x47, 0x0F, 0x01, 0x83, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x82, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x18, 0x82, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x28, 0x82, 0x45, + 0x0C, 0x32, 0x83, 0x45, 0x0C, 0x3C, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x51, 0x83, 0x45, + 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x65, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, + 0x0C, 0x80, 0x83, 0x45, 0x0C, 0x86, 0x82, 0x45, 0x0C, 0x8C, 0x83, 0x45, 0x0C, 0x91, 0x83, 0x45, + 0x0C, 0x95, 0x83, 0x44, 0x0D, 0x99, 0x83, 0x45, 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0xA0, 0x83, 0x45, + 0x0C, 0xA3, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x46, 0x0C, 0xA8, 0x86, 0x48, 0x0F, 0xAB, 0x88, 0x4D, + 0x14, 0xB1, 0x93, 0x5C, 0x29, 0xBC, 0x9A, 0x6B, 0x42, 0xCB, 0x9F, 0x75, 0x54, 0xDD, 0x9F, 0x79, + 0x59, 0xEB, 0x9C, 0x76, 0x59, 0xF5, 0x96, 0x6F, 0x53, 0xFC, 0x92, 0x6A, 0x4E, 0xFF, 0x8F, 0x66, + 0x4B, 0xFF, 0x8A, 0x60, 0x44, 0xFF, 0x87, 0x5B, 0x40, 0xFF, 0x84, 0x57, 0x3C, 0xFF, 0x80, 0x53, + 0x37, 0xFF, 0x7B, 0x4E, 0x33, 0xFF, 0x77, 0x4A, 0x2F, 0xFF, 0x76, 0x48, 0x2D, 0xFF, 0x74, 0x45, + 0x2C, 0xFF, 0x72, 0x44, 0x2A, 0xFF, 0x71, 0x44, 0x2A, 0xFF, 0x71, 0x43, 0x2A, 0xFF, 0x70, 0x43, + 0x2A, 0xFF, 0x71, 0x43, 0x2B, 0xFF, 0x71, 0x44, 0x2B, 0xFF, 0x71, 0x45, 0x2C, 0xFF, 0x71, 0x45, + 0x2C, 0xFF, 0x72, 0x46, 0x2D, 0xFF, 0x72, 0x47, 0x2D, 0xFF, 0x75, 0x49, 0x2F, 0xFF, 0x76, 0x4A, + 0x31, 0xFF, 0x79, 0x4D, 0x34, 0xFF, 0x7B, 0x50, 0x37, 0xFF, 0x7E, 0x52, 0x3A, 0xFF, 0x81, 0x55, + 0x3D, 0xFF, 0x85, 0x5A, 0x42, 0xFF, 0x88, 0x5E, 0x46, 0xFF, 0x8E, 0x66, 0x4D, 0xFF, 0x92, 0x6B, + 0x52, 0xFF, 0x97, 0x70, 0x57, 0xFF, 0x9A, 0x75, 0x5B, 0xFF, 0x9F, 0x79, 0x5D, 0xFE, 0xA2, 0x7B, + 0x60, 0xFB, 0xA5, 0x7E, 0x62, 0xF2, 0xA4, 0x7D, 0x5F, 0xE5, 0xA0, 0x75, 0x53, 0xD5, 0x97, 0x65, + 0x38, 0xC8, 0x8B, 0x52, 0x1D, 0xBC, 0x85, 0x46, 0x0E, 0xB3, 0x83, 0x43, 0x0B, 0xAF, 0x83, 0x46, + 0x0D, 0xAE, 0x83, 0x45, 0x0C, 0xAD, 0x84, 0x46, 0x0C, 0xAC, 0x84, 0x45, 0x0C, 0xA9, 0x83, 0x45, + 0x0D, 0xA7, 0x83, 0x45, 0x0C, 0xA5, 0x83, 0x45, 0x0C, 0xA3, 0x83, 0x45, 0x0C, 0xA0, 0x83, 0x45, + 0x0C, 0x9C, 0x83, 0x45, 0x0C, 0x98, 0x82, 0x45, 0x0C, 0x94, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, + 0x0C, 0x88, 0x83, 0x45, 0x0C, 0x82, 0x82, 0x45, 0x0C, 0x7A, 0x83, 0x45, 0x0C, 0x73, 0x82, 0x45, + 0x0C, 0x69, 0x83, 0x45, 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, + 0x0C, 0x40, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, + 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x15, 0x82, 0x45, 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, + 0x0C, 0x06, 0x83, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0B, 0x02, 0x83, 0x44, 0x0C, 0x01, 0x87, 0x4A, + 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x46, 0x0F, 0x02, 0x84, 0x46, 0x0E, 0x03, 0x83, 0x45, + 0x0D, 0x04, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x27, 0x83, 0x45, + 0x0C, 0x31, 0x83, 0x45, 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x45, 0x83, 0x45, 0x0D, 0x4F, 0x83, 0x45, + 0x0D, 0x5A, 0x83, 0x45, 0x0D, 0x63, 0x82, 0x45, 0x0C, 0x6D, 0x83, 0x45, 0x0C, 0x74, 0x83, 0x45, + 0x0C, 0x7D, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x8D, 0x84, 0x45, + 0x0C, 0x93, 0x84, 0x45, 0x0C, 0x97, 0x83, 0x45, 0x0C, 0x9A, 0x83, 0x45, 0x0C, 0x9E, 0x84, 0x45, + 0x0D, 0xA0, 0x85, 0x47, 0x11, 0xA3, 0x8F, 0x52, 0x1F, 0xAC, 0x99, 0x64, 0x39, 0xBC, 0xA1, 0x75, + 0x50, 0xD2, 0xA2, 0x7B, 0x5D, 0xE3, 0x9F, 0x78, 0x5C, 0xF3, 0x98, 0x72, 0x56, 0xFA, 0x90, 0x6B, + 0x4F, 0xFD, 0x8B, 0x64, 0x47, 0xFF, 0x86, 0x5C, 0x40, 0xFF, 0x80, 0x55, 0x38, 0xFF, 0x7C, 0x4E, + 0x33, 0xFF, 0x77, 0x49, 0x2E, 0xFF, 0x74, 0x46, 0x2C, 0xFF, 0x71, 0x43, 0x29, 0xFF, 0x70, 0x43, + 0x29, 0xFF, 0x6F, 0x41, 0x27, 0xFF, 0x6F, 0x42, 0x27, 0xFF, 0x6E, 0x41, 0x26, 0xFF, 0x6F, 0x41, + 0x27, 0xFF, 0x6F, 0x42, 0x27, 0xFF, 0x70, 0x42, 0x28, 0xFF, 0x70, 0x42, 0x28, 0xFF, 0x71, 0x43, + 0x29, 0xFF, 0x71, 0x43, 0x29, 0xFF, 0x72, 0x44, 0x2A, 0xFF, 0x72, 0x44, 0x2A, 0xFF, 0x72, 0x46, + 0x2B, 0xFF, 0x72, 0x46, 0x2B, 0xFF, 0x73, 0x47, 0x2C, 0xFF, 0x74, 0x47, 0x2D, 0xFF, 0x75, 0x48, + 0x2E, 0xFF, 0x75, 0x49, 0x2F, 0xFF, 0x76, 0x4B, 0x31, 0xFF, 0x77, 0x4B, 0x32, 0xFF, 0x78, 0x4C, + 0x32, 0xFF, 0x7A, 0x4D, 0x34, 0xFF, 0x7B, 0x4F, 0x35, 0xFF, 0x7D, 0x51, 0x38, 0xFF, 0x81, 0x56, + 0x3C, 0xFF, 0x84, 0x5A, 0x40, 0xFF, 0x88, 0x5F, 0x45, 0xFF, 0x8D, 0x66, 0x4C, 0xFF, 0x91, 0x6C, + 0x52, 0xFF, 0x96, 0x71, 0x56, 0xFE, 0x9C, 0x77, 0x5C, 0xFD, 0xA1, 0x7C, 0x61, 0xF8, 0xA3, 0x7F, + 0x63, 0xEC, 0xA4, 0x7A, 0x59, 0xDA, 0x9C, 0x6D, 0x44, 0xC6, 0x90, 0x57, 0x25, 0xB8, 0x86, 0x48, + 0x11, 0xAF, 0x84, 0x45, 0x0D, 0xA9, 0x84, 0x46, 0x0C, 0xA5, 0x83, 0x45, 0x0D, 0xA3, 0x83, 0x45, + 0x0C, 0xA2, 0x83, 0x44, 0x0C, 0xA0, 0x83, 0x45, 0x0C, 0x9E, 0x83, 0x45, 0x0D, 0x9B, 0x83, 0x45, + 0x0C, 0x97, 0x83, 0x45, 0x0D, 0x93, 0x83, 0x45, 0x0C, 0x8F, 0x83, 0x45, 0x0C, 0x8B, 0x83, 0x45, + 0x0C, 0x84, 0x83, 0x45, 0x0C, 0x7E, 0x83, 0x45, 0x0C, 0x77, 0x83, 0x45, 0x0C, 0x6F, 0x83, 0x45, + 0x0C, 0x66, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x53, 0x83, 0x45, 0x0C, 0x49, 0x83, 0x45, + 0x0C, 0x3F, 0x83, 0x45, 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x2A, 0x83, 0x45, 0x0C, 0x21, 0x83, 0x45, + 0x0C, 0x19, 0x83, 0x45, 0x0C, 0x13, 0x82, 0x45, 0x0C, 0x0E, 0x82, 0x45, 0x0C, 0x0A, 0x82, 0x45, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x04, 0x83, 0x44, 0x0B, 0x02, 0x83, 0x44, 0x0B, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0D, 0x01, 0x83, 0x45, 0x0D, 0x02, 0x83, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x83, 0x45, 0x0C, 0x0C, 0x82, 0x45, + 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x16, 0x83, 0x45, 0x0C, 0x1D, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, + 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x37, 0x82, 0x45, 0x0C, 0x41, 0x83, 0x45, 0x0C, 0x4A, 0x83, 0x45, + 0x0C, 0x54, 0x83, 0x45, 0x0C, 0x5D, 0x82, 0x45, 0x0C, 0x66, 0x82, 0x45, 0x0C, 0x6E, 0x82, 0x45, + 0x0C, 0x77, 0x83, 0x44, 0x0C, 0x7C, 0x83, 0x45, 0x0C, 0x82, 0x83, 0x45, 0x0C, 0x85, 0x84, 0x45, + 0x0B, 0x8B, 0x84, 0x45, 0x0C, 0x8F, 0x84, 0x46, 0x0C, 0x92, 0x84, 0x47, 0x0F, 0x97, 0x89, 0x4E, + 0x19, 0xA1, 0x96, 0x60, 0x33, 0xB1, 0x9F, 0x73, 0x4F, 0xCB, 0xA0, 0x79, 0x5A, 0xE5, 0x9B, 0x74, + 0x56, 0xF4, 0x93, 0x6B, 0x4F, 0xFD, 0x8E, 0x64, 0x49, 0xFF, 0x87, 0x5C, 0x41, 0xFF, 0x7E, 0x52, + 0x37, 0xFE, 0x77, 0x49, 0x2E, 0xFF, 0x70, 0x42, 0x27, 0xFF, 0x6F, 0x3F, 0x23, 0xFF, 0x6D, 0x3E, + 0x22, 0xFF, 0x6C, 0x3D, 0x22, 0xFF, 0x6C, 0x3E, 0x23, 0xFF, 0x6C, 0x3E, 0x23, 0xFF, 0x6C, 0x3F, + 0x24, 0xFF, 0x6D, 0x3F, 0x24, 0xFF, 0x6E, 0x40, 0x25, 0xFF, 0x6E, 0x40, 0x25, 0xFF, 0x6F, 0x41, + 0x26, 0xFF, 0x70, 0x42, 0x26, 0xFF, 0x71, 0x43, 0x27, 0xFF, 0x72, 0x43, 0x28, 0xFF, 0x72, 0x44, + 0x29, 0xFF, 0x73, 0x44, 0x29, 0xFF, 0x74, 0x45, 0x2A, 0xFF, 0x74, 0x46, 0x2A, 0xFF, 0x74, 0x46, + 0x2B, 0xFF, 0x74, 0x47, 0x2B, 0xFF, 0x75, 0x48, 0x2C, 0xFF, 0x76, 0x49, 0x2D, 0xFF, 0x76, 0x49, + 0x2E, 0xFF, 0x77, 0x4A, 0x2F, 0xFF, 0x77, 0x4B, 0x30, 0xFF, 0x78, 0x4B, 0x30, 0xFF, 0x78, 0x4B, + 0x31, 0xFF, 0x79, 0x4B, 0x31, 0xFF, 0x78, 0x4C, 0x31, 0xFF, 0x79, 0x4C, 0x32, 0xFF, 0x7A, 0x4D, + 0x34, 0xFF, 0x7C, 0x4F, 0x36, 0xFF, 0x7F, 0x52, 0x38, 0xFF, 0x82, 0x55, 0x3B, 0xFF, 0x86, 0x5B, + 0x41, 0xFF, 0x8C, 0x63, 0x4A, 0xFF, 0x91, 0x69, 0x4F, 0xFF, 0x96, 0x70, 0x55, 0xFF, 0x9E, 0x77, + 0x5B, 0xFF, 0xA4, 0x7D, 0x61, 0xFC, 0xA7, 0x81, 0x65, 0xF1, 0xA7, 0x7E, 0x60, 0xDB, 0x9D, 0x6E, + 0x46, 0xC2, 0x8E, 0x56, 0x23, 0xB0, 0x84, 0x45, 0x0E, 0xA3, 0x82, 0x43, 0x0A, 0x9D, 0x83, 0x45, + 0x0C, 0x9B, 0x83, 0x44, 0x0B, 0x98, 0x84, 0x46, 0x0C, 0x96, 0x83, 0x45, 0x0C, 0x93, 0x83, 0x45, + 0x0D, 0x90, 0x83, 0x45, 0x0C, 0x8D, 0x82, 0x45, 0x0C, 0x89, 0x83, 0x45, 0x0C, 0x84, 0x83, 0x45, + 0x0C, 0x7E, 0x83, 0x45, 0x0C, 0x78, 0x83, 0x45, 0x0C, 0x71, 0x83, 0x45, 0x0C, 0x69, 0x83, 0x45, + 0x0C, 0x5F, 0x83, 0x45, 0x0C, 0x57, 0x82, 0x45, 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x44, 0x83, 0x45, + 0x0C, 0x3A, 0x83, 0x45, 0x0C, 0x31, 0x82, 0x45, 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x17, 0x83, 0x45, 0x0C, 0x12, 0x83, 0x45, 0x0C, 0x0D, 0x82, 0x45, 0x0C, 0x09, 0x82, 0x45, + 0x0C, 0x06, 0x82, 0x44, 0x0D, 0x04, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x0A, 0x01, 0x81, 0x44, 0x0B, 0x02, 0x82, 0x45, + 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x1B, 0x83, 0x45, 0x0C, 0x22, 0x83, 0x45, + 0x0C, 0x2A, 0x83, 0x45, 0x0D, 0x32, 0x83, 0x45, 0x0D, 0x3B, 0x83, 0x45, 0x0C, 0x44, 0x82, 0x45, + 0x0C, 0x4D, 0x83, 0x45, 0x0C, 0x54, 0x83, 0x45, 0x0D, 0x5D, 0x82, 0x44, 0x0C, 0x65, 0x82, 0x44, + 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x71, 0x83, 0x45, 0x0B, 0x76, 0x84, 0x45, 0x0B, 0x7B, 0x83, 0x44, + 0x0C, 0x80, 0x82, 0x43, 0x0C, 0x84, 0x8B, 0x4E, 0x1A, 0x8E, 0x99, 0x64, 0x39, 0xA4, 0xA3, 0x77, + 0x53, 0xC5, 0xA2, 0x7A, 0x5D, 0xE0, 0x9A, 0x73, 0x57, 0xF3, 0x93, 0x6B, 0x4E, 0xFB, 0x8B, 0x5F, + 0x42, 0xFE, 0x82, 0x55, 0x38, 0xFF, 0x7A, 0x4C, 0x30, 0xFF, 0x73, 0x45, 0x28, 0xFF, 0x6F, 0x40, + 0x25, 0xFF, 0x6D, 0x3D, 0x21, 0xFF, 0x6C, 0x3C, 0x1F, 0xFF, 0x6C, 0x3C, 0x1F, 0xFF, 0x6C, 0x3C, + 0x1F, 0xFF, 0x6C, 0x3C, 0x1F, 0xFF, 0x6C, 0x3D, 0x20, 0xFF, 0x6D, 0x3E, 0x20, 0xFF, 0x6E, 0x3F, + 0x21, 0xFF, 0x6F, 0x3F, 0x22, 0xFF, 0x6F, 0x40, 0x23, 0xFF, 0x70, 0x41, 0x23, 0xFF, 0x71, 0x42, + 0x24, 0xFF, 0x72, 0x43, 0x25, 0xFF, 0x73, 0x43, 0x26, 0xFF, 0x74, 0x44, 0x26, 0xFF, 0x75, 0x45, + 0x27, 0xFF, 0x75, 0x46, 0x28, 0xFF, 0x76, 0x46, 0x29, 0xFF, 0x76, 0x47, 0x29, 0xFF, 0x76, 0x47, + 0x2A, 0xFF, 0x77, 0x48, 0x2A, 0xFF, 0x77, 0x48, 0x2A, 0xFF, 0x78, 0x49, 0x2B, 0xFF, 0x78, 0x49, + 0x2C, 0xFF, 0x79, 0x4A, 0x2C, 0xFF, 0x79, 0x4A, 0x2D, 0xFF, 0x79, 0x4B, 0x2D, 0xFF, 0x79, 0x4B, + 0x2E, 0xFF, 0x79, 0x4C, 0x2E, 0xFF, 0x79, 0x4C, 0x2F, 0xFF, 0x79, 0x4C, 0x30, 0xFF, 0x79, 0x4C, + 0x31, 0xFF, 0x7A, 0x4C, 0x31, 0xFF, 0x7B, 0x4E, 0x33, 0xFF, 0x7D, 0x4F, 0x34, 0xFF, 0x7E, 0x51, + 0x36, 0xFF, 0x80, 0x53, 0x39, 0xFF, 0x83, 0x58, 0x3D, 0xFF, 0x88, 0x5E, 0x44, 0xFF, 0x8F, 0x66, + 0x4C, 0xFF, 0x95, 0x6D, 0x53, 0xFF, 0x9A, 0x74, 0x5A, 0xFF, 0x9E, 0x79, 0x60, 0xFD, 0xA4, 0x80, + 0x66, 0xEE, 0xA7, 0x7F, 0x60, 0xD4, 0x9E, 0x6F, 0x47, 0xB6, 0x8D, 0x52, 0x1F, 0xA1, 0x84, 0x45, + 0x0D, 0x93, 0x83, 0x44, 0x0A, 0x8C, 0x84, 0x45, 0x0B, 0x88, 0x84, 0x45, 0x0C, 0x86, 0x83, 0x45, + 0x0C, 0x85, 0x83, 0x45, 0x0C, 0x83, 0x83, 0x45, 0x0D, 0x7E, 0x83, 0x45, 0x0D, 0x79, 0x83, 0x45, + 0x0C, 0x74, 0x83, 0x45, 0x0D, 0x6E, 0x83, 0x45, 0x0C, 0x67, 0x83, 0x45, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x58, 0x83, 0x45, 0x0C, 0x50, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x3E, 0x82, 0x45, + 0x0C, 0x34, 0x83, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x24, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, + 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, 0x0C, 0x0C, 0x82, 0x45, 0x0C, 0x08, 0x82, 0x45, + 0x0C, 0x05, 0x82, 0x44, 0x0D, 0x03, 0x82, 0x44, 0x0E, 0x02, 0x83, 0x45, 0x0E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x09, 0x01, 0x81, 0x43, 0x0A, 0x02, 0x82, 0x44, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x06, 0x83, 0x45, 0x0C, 0x09, 0x83, 0x45, + 0x0C, 0x0C, 0x83, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x17, 0x83, 0x45, 0x0D, 0x1D, 0x83, 0x45, + 0x0D, 0x25, 0x83, 0x45, 0x0D, 0x2C, 0x83, 0x45, 0x0D, 0x34, 0x83, 0x45, 0x0C, 0x3C, 0x82, 0x45, + 0x0B, 0x45, 0x83, 0x45, 0x0C, 0x4C, 0x83, 0x45, 0x0D, 0x53, 0x83, 0x45, 0x0C, 0x5A, 0x83, 0x45, + 0x0C, 0x60, 0x83, 0x45, 0x0D, 0x65, 0x85, 0x47, 0x0D, 0x6B, 0x83, 0x44, 0x0A, 0x71, 0x82, 0x46, + 0x0C, 0x77, 0x91, 0x5C, 0x2A, 0x89, 0xA1, 0x74, 0x4E, 0xAC, 0xA3, 0x7B, 0x5C, 0xD4, 0x9E, 0x74, + 0x57, 0xED, 0x93, 0x68, 0x4C, 0xFA, 0x87, 0x5C, 0x41, 0xFF, 0x7E, 0x51, 0x35, 0xFF, 0x75, 0x46, + 0x2A, 0xFF, 0x6F, 0x40, 0x23, 0xFF, 0x6B, 0x3D, 0x1F, 0xFF, 0x6A, 0x3A, 0x1D, 0xFF, 0x69, 0x3A, + 0x1D, 0xFF, 0x69, 0x39, 0x1D, 0xFF, 0x6A, 0x3A, 0x1D, 0xFF, 0x6B, 0x3A, 0x1D, 0xFF, 0x6C, 0x3B, + 0x1E, 0xFF, 0x6C, 0x3B, 0x1E, 0xFF, 0x6D, 0x3D, 0x1F, 0xFF, 0x6E, 0x3E, 0x1F, 0xFF, 0x6F, 0x3F, + 0x20, 0xFF, 0x70, 0x40, 0x21, 0xFF, 0x71, 0x41, 0x21, 0xFF, 0x72, 0x42, 0x22, 0xFF, 0x73, 0x43, + 0x23, 0xFF, 0x74, 0x44, 0x24, 0xFF, 0x75, 0x44, 0x24, 0xFF, 0x76, 0x45, 0x25, 0xFF, 0x77, 0x46, + 0x26, 0xFF, 0x77, 0x47, 0x27, 0xFF, 0x78, 0x47, 0x28, 0xFF, 0x78, 0x47, 0x28, 0xFF, 0x78, 0x48, + 0x29, 0xFF, 0x79, 0x49, 0x29, 0xFF, 0x79, 0x49, 0x2A, 0xFF, 0x7A, 0x49, 0x2A, 0xFF, 0x7A, 0x4A, + 0x2A, 0xFF, 0x7B, 0x4A, 0x2B, 0xFF, 0x7A, 0x4B, 0x2B, 0xFF, 0x7B, 0x4B, 0x2C, 0xFF, 0x7A, 0x4C, + 0x2C, 0xFF, 0x7B, 0x4C, 0x2D, 0xFF, 0x7B, 0x4C, 0x2E, 0xFF, 0x7B, 0x4C, 0x2F, 0xFF, 0x7B, 0x4D, + 0x2F, 0xFF, 0x7B, 0x4D, 0x30, 0xFF, 0x7C, 0x4E, 0x31, 0xFF, 0x7C, 0x4E, 0x32, 0xFF, 0x7D, 0x4F, + 0x33, 0xFF, 0x7E, 0x50, 0x34, 0xFF, 0x7E, 0x51, 0x35, 0xFF, 0x80, 0x53, 0x38, 0xFF, 0x83, 0x57, + 0x3C, 0xFF, 0x88, 0x5E, 0x43, 0xFF, 0x8E, 0x65, 0x4B, 0xFF, 0x96, 0x6E, 0x54, 0xFF, 0x9E, 0x77, + 0x5D, 0xFF, 0xA4, 0x7E, 0x62, 0xF9, 0xA7, 0x83, 0x65, 0xE6, 0xA8, 0x7F, 0x5E, 0xC5, 0x9A, 0x68, + 0x3A, 0xA1, 0x8A, 0x4F, 0x18, 0x8C, 0x81, 0x42, 0x09, 0x80, 0x82, 0x43, 0x0A, 0x7B, 0x84, 0x46, + 0x0C, 0x79, 0x84, 0x45, 0x0B, 0x76, 0x84, 0x45, 0x0C, 0x72, 0x83, 0x45, 0x0C, 0x6E, 0x83, 0x45, + 0x0D, 0x68, 0x83, 0x45, 0x0C, 0x63, 0x83, 0x45, 0x0C, 0x5C, 0x83, 0x45, 0x0C, 0x55, 0x83, 0x45, + 0x0C, 0x4E, 0x83, 0x45, 0x0C, 0x47, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, 0x0C, 0x36, 0x82, 0x45, + 0x0C, 0x2E, 0x83, 0x45, 0x0C, 0x26, 0x82, 0x45, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x19, 0x82, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x0E, 0x83, 0x45, 0x0C, 0x0A, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x03, 0x82, 0x45, 0x0E, 0x02, 0x85, 0x48, 0x12, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x09, 0x01, 0x81, 0x43, 0x0A, 0x02, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x08, 0x82, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0D, 0x0F, 0x83, 0x45, 0x0D, 0x14, 0x83, 0x45, 0x0D, 0x19, 0x83, 0x45, + 0x0C, 0x1F, 0x83, 0x45, 0x0C, 0x25, 0x83, 0x45, 0x0C, 0x2B, 0x83, 0x45, 0x0C, 0x32, 0x83, 0x45, + 0x0C, 0x3B, 0x83, 0x45, 0x0C, 0x40, 0x83, 0x44, 0x0B, 0x46, 0x84, 0x45, 0x0B, 0x4D, 0x84, 0x46, + 0x0E, 0x53, 0x83, 0x44, 0x0B, 0x59, 0x84, 0x45, 0x0A, 0x61, 0x8F, 0x57, 0x24, 0x6E, 0xA4, 0x76, + 0x4E, 0x91, 0xA4, 0x7C, 0x5E, 0xBC, 0x9D, 0x75, 0x58, 0xE4, 0x95, 0x6B, 0x4D, 0xF7, 0x89, 0x5D, + 0x3E, 0xFD, 0x7E, 0x50, 0x32, 0xFE, 0x76, 0x46, 0x2B, 0xFF, 0x6E, 0x3E, 0x21, 0xFF, 0x6A, 0x3A, + 0x1D, 0xFF, 0x69, 0x38, 0x1A, 0xFF, 0x68, 0x38, 0x1A, 0xFF, 0x69, 0x38, 0x1A, 0xFF, 0x69, 0x39, + 0x1A, 0xFF, 0x6A, 0x39, 0x1B, 0xFF, 0x6B, 0x3A, 0x1B, 0xFF, 0x6C, 0x3A, 0x1C, 0xFF, 0x6E, 0x3B, + 0x1D, 0xFF, 0x6F, 0x3C, 0x1D, 0xFF, 0x6F, 0x3E, 0x1E, 0xFF, 0x70, 0x3F, 0x1F, 0xFF, 0x72, 0x40, + 0x20, 0xFF, 0x73, 0x41, 0x20, 0xFF, 0x74, 0x42, 0x21, 0xFF, 0x75, 0x43, 0x22, 0xFF, 0x76, 0x45, + 0x23, 0xFF, 0x77, 0x45, 0x24, 0xFF, 0x78, 0x46, 0x24, 0xFF, 0x79, 0x47, 0x25, 0xFF, 0x79, 0x47, + 0x25, 0xFF, 0x7A, 0x48, 0x26, 0xFF, 0x7B, 0x49, 0x27, 0xFF, 0x7B, 0x49, 0x27, 0xFF, 0x7C, 0x4A, + 0x28, 0xFF, 0x7C, 0x4B, 0x28, 0xFF, 0x7C, 0x4B, 0x29, 0xFF, 0x7D, 0x4C, 0x2A, 0xFF, 0x7D, 0x4D, + 0x2A, 0xFF, 0x7E, 0x4D, 0x2B, 0xFF, 0x7D, 0x4D, 0x2B, 0xFF, 0x7E, 0x4D, 0x2C, 0xFF, 0x7E, 0x4E, + 0x2C, 0xFF, 0x7E, 0x4E, 0x2D, 0xFF, 0x7E, 0x4E, 0x2D, 0xFF, 0x7E, 0x4E, 0x2E, 0xFF, 0x7D, 0x4F, + 0x2E, 0xFF, 0x7D, 0x4E, 0x2F, 0xFF, 0x7D, 0x4E, 0x2F, 0xFF, 0x7D, 0x4E, 0x30, 0xFF, 0x7D, 0x4F, + 0x31, 0xFF, 0x7E, 0x4F, 0x31, 0xFF, 0x7E, 0x50, 0x32, 0xFF, 0x7E, 0x51, 0x33, 0xFF, 0x7F, 0x52, + 0x35, 0xFF, 0x80, 0x54, 0x37, 0xFF, 0x83, 0x57, 0x3C, 0xFF, 0x89, 0x5E, 0x44, 0xFF, 0x91, 0x68, + 0x4D, 0xFF, 0x97, 0x6F, 0x53, 0xFE, 0x9D, 0x77, 0x5C, 0xFD, 0xA2, 0x7D, 0x63, 0xF3, 0xA7, 0x83, + 0x67, 0xD5, 0xA7, 0x7D, 0x5A, 0xAD, 0x98, 0x63, 0x36, 0x8A, 0x85, 0x47, 0x10, 0x74, 0x81, 0x42, + 0x09, 0x67, 0x83, 0x44, 0x0B, 0x64, 0x84, 0x45, 0x0B, 0x62, 0x83, 0x44, 0x0C, 0x60, 0x83, 0x45, + 0x0C, 0x5A, 0x83, 0x46, 0x0D, 0x56, 0x83, 0x45, 0x0C, 0x50, 0x84, 0x45, 0x0D, 0x4A, 0x83, 0x45, + 0x0C, 0x43, 0x83, 0x45, 0x0C, 0x3D, 0x83, 0x45, 0x0C, 0x35, 0x83, 0x45, 0x0C, 0x2E, 0x83, 0x45, + 0x0C, 0x27, 0x83, 0x45, 0x0C, 0x20, 0x82, 0x45, 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x14, 0x82, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x0B, 0x83, 0x45, 0x0D, 0x08, 0x83, 0x45, 0x0C, 0x05, 0x82, 0x44, + 0x0A, 0x04, 0x81, 0x44, 0x0B, 0x03, 0x83, 0x48, 0x12, 0x01, 0x8C, 0x53, 0x1E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x43, 0x09, 0x01, 0x81, 0x44, 0x0A, 0x01, 0x82, 0x45, + 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x02, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x07, 0x83, 0x45, + 0x0D, 0x09, 0x83, 0x45, 0x0D, 0x0C, 0x82, 0x45, 0x0D, 0x10, 0x83, 0x45, 0x0D, 0x14, 0x83, 0x45, + 0x0D, 0x19, 0x83, 0x45, 0x0C, 0x1E, 0x82, 0x45, 0x0C, 0x24, 0x84, 0x44, 0x0C, 0x29, 0x84, 0x46, + 0x0D, 0x2F, 0x84, 0x45, 0x0C, 0x34, 0x84, 0x45, 0x0B, 0x3A, 0x83, 0x44, 0x0B, 0x40, 0x7F, 0x40, + 0x05, 0x46, 0x85, 0x47, 0x0F, 0x52, 0x99, 0x69, 0x3E, 0x68, 0xAB, 0x81, 0x62, 0x98, 0xA3, 0x7A, + 0x5B, 0xD4, 0x97, 0x6D, 0x50, 0xF5, 0x8B, 0x60, 0x44, 0xFF, 0x81, 0x54, 0x37, 0xFF, 0x76, 0x46, + 0x29, 0xFF, 0x6F, 0x3E, 0x21, 0xFE, 0x69, 0x39, 0x1C, 0xFF, 0x67, 0x36, 0x18, 0xFF, 0x66, 0x35, + 0x18, 0xFF, 0x67, 0x35, 0x18, 0xFF, 0x67, 0x36, 0x18, 0xFF, 0x68, 0x37, 0x18, 0xFF, 0x69, 0x38, + 0x19, 0xFF, 0x6B, 0x39, 0x1A, 0xFF, 0x6C, 0x3A, 0x1B, 0xFF, 0x6E, 0x3C, 0x1C, 0xFF, 0x70, 0x3D, + 0x1D, 0xFF, 0x72, 0x3E, 0x1D, 0xFF, 0x73, 0x40, 0x1E, 0xFF, 0x74, 0x42, 0x1F, 0xFF, 0x75, 0x43, + 0x20, 0xFF, 0x76, 0x44, 0x21, 0xFF, 0x77, 0x45, 0x21, 0xFF, 0x78, 0x45, 0x22, 0xFF, 0x79, 0x47, + 0x23, 0xFF, 0x7A, 0x48, 0x24, 0xFF, 0x7B, 0x49, 0x24, 0xFF, 0x7C, 0x4A, 0x25, 0xFF, 0x7C, 0x4A, + 0x25, 0xFF, 0x7D, 0x4A, 0x25, 0xFF, 0x7E, 0x4B, 0x27, 0xFF, 0x7F, 0x4C, 0x27, 0xFF, 0x7F, 0x4D, + 0x28, 0xFF, 0x7F, 0x4D, 0x28, 0xFF, 0x7F, 0x4E, 0x29, 0xFF, 0x80, 0x4E, 0x29, 0xFF, 0x80, 0x4F, + 0x2A, 0xFF, 0x81, 0x4F, 0x2B, 0xFF, 0x80, 0x4F, 0x2B, 0xFF, 0x81, 0x4F, 0x2B, 0xFF, 0x81, 0x50, + 0x2C, 0xFF, 0x81, 0x50, 0x2D, 0xFF, 0x81, 0x50, 0x2D, 0xFF, 0x81, 0x50, 0x2D, 0xFF, 0x80, 0x51, + 0x2E, 0xFF, 0x80, 0x50, 0x2E, 0xFF, 0x80, 0x50, 0x2F, 0xFF, 0x7F, 0x4F, 0x2F, 0xFF, 0x7F, 0x4F, + 0x30, 0xFF, 0x7F, 0x4F, 0x30, 0xFF, 0x7F, 0x50, 0x31, 0xFF, 0x7F, 0x51, 0x32, 0xFF, 0x7F, 0x51, + 0x33, 0xFF, 0x7F, 0x52, 0x34, 0xFF, 0x80, 0x52, 0x35, 0xFF, 0x81, 0x55, 0x39, 0xFF, 0x85, 0x59, + 0x3E, 0xFF, 0x8B, 0x62, 0x46, 0xFF, 0x92, 0x6B, 0x4F, 0xFF, 0x9A, 0x73, 0x57, 0xFF, 0xA3, 0x7C, + 0x60, 0xFA, 0xA7, 0x81, 0x65, 0xE6, 0xAA, 0x86, 0x68, 0xBA, 0xA3, 0x76, 0x50, 0x8A, 0x8C, 0x52, + 0x1F, 0x67, 0x83, 0x43, 0x0A, 0x58, 0x82, 0x42, 0x0A, 0x53, 0x83, 0x45, 0x0B, 0x4F, 0x84, 0x46, + 0x0B, 0x4B, 0x83, 0x45, 0x0C, 0x48, 0x83, 0x45, 0x0D, 0x43, 0x83, 0x45, 0x0C, 0x3E, 0x83, 0x45, + 0x0D, 0x38, 0x83, 0x45, 0x0C, 0x31, 0x82, 0x45, 0x0C, 0x2C, 0x83, 0x45, 0x0C, 0x26, 0x83, 0x45, + 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x1A, 0x82, 0x45, 0x0C, 0x15, 0x83, 0x45, 0x0C, 0x11, 0x82, 0x45, + 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0A, 0x82, 0x45, 0x0C, 0x07, 0x83, 0x44, 0x0B, 0x05, 0x82, 0x44, + 0x0A, 0x03, 0x81, 0x44, 0x0D, 0x02, 0x8D, 0x55, 0x23, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x45, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x83, 0x45, 0x0D, 0x04, 0x83, 0x45, 0x0D, 0x05, 0x82, 0x45, + 0x0D, 0x07, 0x82, 0x45, 0x0C, 0x0A, 0x82, 0x45, 0x0C, 0x0C, 0x82, 0x45, 0x0D, 0x10, 0x83, 0x45, + 0x0E, 0x13, 0x83, 0x45, 0x0E, 0x18, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0B, 0x21, 0x83, 0x44, + 0x0A, 0x24, 0x87, 0x46, 0x0D, 0x2A, 0x83, 0x41, 0x09, 0x31, 0x7C, 0x3D, 0x04, 0x35, 0x91, 0x57, + 0x24, 0x45, 0xAA, 0x80, 0x5C, 0x6A, 0xAC, 0x86, 0x69, 0xAA, 0x9E, 0x75, 0x57, 0xE5, 0x90, 0x66, + 0x48, 0xFC, 0x85, 0x59, 0x3B, 0xFF, 0x7D, 0x4D, 0x2F, 0xFF, 0x71, 0x3F, 0x21, 0xFF, 0x6B, 0x39, + 0x1B, 0xFF, 0x68, 0x36, 0x17, 0xFF, 0x66, 0x34, 0x15, 0xFF, 0x66, 0x34, 0x15, 0xFF, 0x67, 0x34, + 0x15, 0xFF, 0x69, 0x35, 0x16, 0xFF, 0x6A, 0x36, 0x16, 0xFF, 0x6B, 0x36, 0x17, 0xFF, 0x6C, 0x38, + 0x17, 0xFF, 0x6D, 0x39, 0x18, 0xFF, 0x6E, 0x3B, 0x19, 0xFF, 0x6F, 0x3C, 0x1A, 0xFF, 0x71, 0x3E, + 0x1B, 0xFF, 0x73, 0x3F, 0x1C, 0xFF, 0x74, 0x41, 0x1C, 0xFF, 0x76, 0x42, 0x1D, 0xFF, 0x77, 0x43, + 0x1E, 0xFF, 0x79, 0x45, 0x1F, 0xFF, 0x7A, 0x46, 0x21, 0xFF, 0x7B, 0x47, 0x21, 0xFF, 0x7C, 0x48, + 0x22, 0xFF, 0x7D, 0x49, 0x24, 0xFF, 0x7E, 0x4B, 0x25, 0xFF, 0x7F, 0x4C, 0x25, 0xFF, 0x7F, 0x4C, + 0x25, 0xFF, 0x80, 0x4D, 0x26, 0xFF, 0x80, 0x4D, 0x26, 0xFF, 0x81, 0x4D, 0x27, 0xFF, 0x81, 0x4E, + 0x28, 0xFF, 0x82, 0x4E, 0x28, 0xFF, 0x82, 0x4F, 0x29, 0xFF, 0x82, 0x4F, 0x29, 0xFF, 0x82, 0x50, + 0x2A, 0xFF, 0x83, 0x51, 0x2B, 0xFF, 0x83, 0x51, 0x2B, 0xFF, 0x84, 0x51, 0x2C, 0xFF, 0x83, 0x51, + 0x2C, 0xFF, 0x84, 0x51, 0x2D, 0xFF, 0x84, 0x51, 0x2D, 0xFF, 0x83, 0x51, 0x2E, 0xFF, 0x83, 0x52, + 0x2E, 0xFF, 0x82, 0x52, 0x2F, 0xFF, 0x82, 0x52, 0x2F, 0xFF, 0x82, 0x52, 0x2F, 0xFF, 0x81, 0x52, + 0x30, 0xFF, 0x81, 0x51, 0x30, 0xFF, 0x81, 0x51, 0x30, 0xFF, 0x81, 0x51, 0x31, 0xFF, 0x81, 0x51, + 0x31, 0xFF, 0x81, 0x51, 0x32, 0xFF, 0x81, 0x52, 0x33, 0xFF, 0x81, 0x52, 0x34, 0xFF, 0x82, 0x54, + 0x37, 0xFF, 0x84, 0x57, 0x3A, 0xFF, 0x88, 0x5D, 0x40, 0xFF, 0x8F, 0x66, 0x49, 0xFF, 0x98, 0x70, + 0x55, 0xFF, 0x9F, 0x78, 0x5C, 0xFE, 0xA5, 0x80, 0x63, 0xF2, 0xAC, 0x87, 0x6B, 0xCC, 0xAE, 0x87, + 0x66, 0x93, 0x9A, 0x66, 0x3A, 0x62, 0x86, 0x46, 0x0D, 0x47, 0x81, 0x3F, 0x05, 0x3F, 0x84, 0x44, + 0x0B, 0x3B, 0x84, 0x46, 0x0C, 0x38, 0x83, 0x45, 0x0C, 0x36, 0x83, 0x45, 0x0D, 0x32, 0x83, 0x45, + 0x0C, 0x2C, 0x84, 0x46, 0x0D, 0x27, 0x83, 0x45, 0x0C, 0x24, 0x82, 0x45, 0x0C, 0x1F, 0x83, 0x45, + 0x0C, 0x1A, 0x83, 0x45, 0x0C, 0x15, 0x82, 0x45, 0x0C, 0x11, 0x83, 0x45, 0x0C, 0x0D, 0x82, 0x45, + 0x0C, 0x0B, 0x83, 0x45, 0x0C, 0x08, 0x82, 0x45, 0x0C, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x82, 0x45, + 0x0C, 0x02, 0x85, 0x49, 0x12, 0x01, 0xA3, 0x71, 0x44, 0x01, 0x9F, 0x71, 0x4C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0C, 0x01, 0x83, 0x45, 0x0D, 0x03, 0x83, 0x45, 0x0C, 0x04, 0x81, 0x44, + 0x0B, 0x05, 0x82, 0x45, 0x0C, 0x07, 0x82, 0x46, 0x0C, 0x09, 0x83, 0x46, 0x0C, 0x0C, 0x82, 0x45, + 0x0C, 0x0F, 0x83, 0x45, 0x0C, 0x11, 0x84, 0x46, 0x0C, 0x16, 0x84, 0x45, 0x0D, 0x19, 0x86, 0x47, + 0x09, 0x1D, 0x78, 0x37, 0x00, 0x21, 0x7E, 0x42, 0x07, 0x27, 0x9D, 0x6B, 0x3A, 0x3A, 0xB0, 0x8A, + 0x6A, 0x6E, 0xA7, 0x82, 0x67, 0xBC, 0x97, 0x6E, 0x51, 0xED, 0x88, 0x5C, 0x3E, 0xFD, 0x7C, 0x4E, + 0x30, 0xFF, 0x73, 0x42, 0x24, 0xFF, 0x68, 0x35, 0x16, 0xFF, 0x63, 0x2F, 0x10, 0xFF, 0x61, 0x2E, + 0x0F, 0xFF, 0x60, 0x2D, 0x0E, 0xFF, 0x61, 0x2D, 0x0D, 0xFF, 0x63, 0x2E, 0x0D, 0xFF, 0x65, 0x2F, + 0x0E, 0xFF, 0x66, 0x30, 0x0F, 0xFF, 0x68, 0x31, 0x10, 0xFF, 0x6A, 0x32, 0x10, 0xFF, 0x6B, 0x34, + 0x10, 0xFF, 0x6C, 0x36, 0x11, 0xFF, 0x6E, 0x37, 0x12, 0xFF, 0x6F, 0x39, 0x13, 0xFF, 0x71, 0x3B, + 0x14, 0xFF, 0x73, 0x3C, 0x16, 0xFF, 0x74, 0x3E, 0x17, 0xFF, 0x76, 0x3F, 0x18, 0xFF, 0x77, 0x41, + 0x18, 0xFF, 0x79, 0x42, 0x1A, 0xFF, 0x7A, 0x44, 0x1C, 0xFF, 0x7C, 0x46, 0x1E, 0xFF, 0x7C, 0x47, + 0x1E, 0xFF, 0x7D, 0x48, 0x20, 0xFF, 0x7E, 0x4A, 0x22, 0xFF, 0x80, 0x4B, 0x23, 0xFF, 0x80, 0x4D, + 0x24, 0xFF, 0x81, 0x4D, 0x24, 0xFF, 0x81, 0x4E, 0x25, 0xFF, 0x82, 0x4E, 0x26, 0xFF, 0x82, 0x4F, + 0x27, 0xFF, 0x84, 0x4F, 0x28, 0xFF, 0x84, 0x50, 0x29, 0xFF, 0x85, 0x51, 0x29, 0xFF, 0x85, 0x52, + 0x2A, 0xFF, 0x85, 0x52, 0x2A, 0xFF, 0x85, 0x53, 0x2B, 0xFF, 0x86, 0x53, 0x2B, 0xFF, 0x85, 0x53, + 0x2C, 0xFF, 0x86, 0x53, 0x2C, 0xFF, 0x86, 0x53, 0x2D, 0xFF, 0x86, 0x53, 0x2E, 0xFF, 0x85, 0x54, + 0x2E, 0xFF, 0x85, 0x54, 0x2F, 0xFF, 0x85, 0x54, 0x2F, 0xFF, 0x85, 0x54, 0x2F, 0xFF, 0x84, 0x54, + 0x2F, 0xFF, 0x84, 0x54, 0x30, 0xFF, 0x84, 0x53, 0x30, 0xFF, 0x84, 0x52, 0x30, 0xFF, 0x83, 0x52, + 0x31, 0xFF, 0x82, 0x52, 0x31, 0xFF, 0x82, 0x53, 0x32, 0xFF, 0x82, 0x52, 0x33, 0xFF, 0x81, 0x53, + 0x34, 0xFF, 0x82, 0x54, 0x35, 0xFF, 0x82, 0x55, 0x36, 0xFF, 0x84, 0x59, 0x3B, 0xFF, 0x8A, 0x60, + 0x44, 0xFF, 0x95, 0x6D, 0x51, 0xFF, 0x9F, 0x78, 0x5C, 0xFF, 0xA4, 0x7E, 0x62, 0xF7, 0xAB, 0x85, + 0x69, 0xDA, 0xB3, 0x8C, 0x6F, 0x9B, 0xA8, 0x7B, 0x57, 0x58, 0x89, 0x4E, 0x18, 0x39, 0x7A, 0x38, + 0x00, 0x30, 0x82, 0x41, 0x07, 0x2C, 0x84, 0x47, 0x0B, 0x28, 0x84, 0x46, 0x0D, 0x25, 0x83, 0x45, + 0x0C, 0x21, 0x83, 0x44, 0x0C, 0x20, 0x83, 0x45, 0x0C, 0x1C, 0x83, 0x45, 0x0C, 0x17, 0x82, 0x45, + 0x0C, 0x13, 0x83, 0x45, 0x0C, 0x10, 0x82, 0x45, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0B, 0x82, 0x45, + 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x06, 0x82, 0x44, 0x0B, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x82, 0x45, + 0x0C, 0x01, 0x87, 0x49, 0x12, 0x01, 0x9B, 0x69, 0x3A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x48, + 0x10, 0x01, 0x84, 0x47, 0x0F, 0x02, 0x83, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0A, 0x03, 0x81, 0x44, + 0x0A, 0x03, 0x81, 0x45, 0x0B, 0x04, 0x82, 0x46, 0x0B, 0x06, 0x82, 0x46, 0x0A, 0x08, 0x83, 0x47, + 0x0B, 0x0A, 0x84, 0x47, 0x0A, 0x0C, 0x7F, 0x3F, 0x08, 0x0E, 0x80, 0x3F, 0x04, 0x12, 0x77, 0x36, + 0x00, 0x17, 0x8C, 0x52, 0x1C, 0x1B, 0xB2, 0x89, 0x63, 0x37, 0xB0, 0x8C, 0x6F, 0x79, 0x9F, 0x78, + 0x5D, 0xCB, 0x96, 0x6A, 0x4C, 0xF3, 0x86, 0x58, 0x38, 0xFD, 0x75, 0x45, 0x25, 0xFF, 0x6B, 0x38, + 0x18, 0xFF, 0x63, 0x2E, 0x0D, 0xFF, 0x61, 0x2A, 0x0A, 0xFF, 0x61, 0x2A, 0x09, 0xFF, 0x5F, 0x29, + 0x08, 0xFF, 0x60, 0x2A, 0x07, 0xFF, 0x61, 0x2A, 0x07, 0xFF, 0x63, 0x2A, 0x07, 0xFF, 0x64, 0x2B, + 0x08, 0xFF, 0x65, 0x2C, 0x08, 0xFF, 0x67, 0x2E, 0x09, 0xFF, 0x68, 0x2F, 0x09, 0xFF, 0x6A, 0x31, + 0x09, 0xFF, 0x6B, 0x32, 0x09, 0xFF, 0x6C, 0x33, 0x0A, 0xFF, 0x6D, 0x34, 0x0B, 0xFF, 0x6F, 0x35, + 0x0B, 0xFF, 0x70, 0x36, 0x0C, 0xFF, 0x71, 0x37, 0x0D, 0xFF, 0x72, 0x38, 0x0D, 0xFF, 0x74, 0x3A, + 0x0E, 0xFF, 0x75, 0x3B, 0x0E, 0xFF, 0x76, 0x3C, 0x10, 0xFF, 0x77, 0x3D, 0x11, 0xFF, 0x78, 0x40, + 0x13, 0xFF, 0x7A, 0x41, 0x16, 0xFF, 0x7B, 0x43, 0x18, 0xFF, 0x7D, 0x45, 0x1B, 0xFF, 0x7F, 0x48, + 0x1D, 0xFF, 0x81, 0x4B, 0x20, 0xFF, 0x81, 0x4D, 0x21, 0xFF, 0x83, 0x4E, 0x24, 0xFF, 0x83, 0x4F, + 0x25, 0xFF, 0x85, 0x51, 0x27, 0xFF, 0x86, 0x52, 0x28, 0xFF, 0x88, 0x53, 0x29, 0xFF, 0x87, 0x53, + 0x2A, 0xFF, 0x88, 0x53, 0x2A, 0xFF, 0x88, 0x54, 0x2A, 0xFF, 0x88, 0x54, 0x2B, 0xFF, 0x88, 0x55, + 0x2B, 0xFF, 0x88, 0x55, 0x2C, 0xFF, 0x88, 0x55, 0x2C, 0xFF, 0x88, 0x55, 0x2D, 0xFF, 0x88, 0x55, + 0x2D, 0xFF, 0x88, 0x55, 0x2E, 0xFF, 0x88, 0x55, 0x2E, 0xFF, 0x88, 0x55, 0x2F, 0xFF, 0x88, 0x55, + 0x2F, 0xFF, 0x87, 0x55, 0x30, 0xFF, 0x87, 0x55, 0x30, 0xFF, 0x86, 0x55, 0x31, 0xFF, 0x86, 0x55, + 0x31, 0xFF, 0x85, 0x54, 0x31, 0xFF, 0x84, 0x54, 0x31, 0xFF, 0x83, 0x54, 0x32, 0xFF, 0x83, 0x53, + 0x32, 0xFF, 0x82, 0x53, 0x33, 0xFF, 0x83, 0x54, 0x34, 0xFF, 0x83, 0x54, 0x35, 0xFF, 0x84, 0x56, + 0x39, 0xFF, 0x89, 0x5D, 0x40, 0xFF, 0x92, 0x68, 0x4B, 0xFF, 0x9A, 0x72, 0x56, 0xFF, 0xA2, 0x7C, + 0x62, 0xFC, 0xA8, 0x83, 0x68, 0xE5, 0xAF, 0x8D, 0x71, 0xA5, 0xB5, 0x90, 0x6F, 0x54, 0x98, 0x64, + 0x37, 0x31, 0x76, 0x35, 0x00, 0x24, 0x7E, 0x3F, 0x00, 0x1C, 0x85, 0x47, 0x0B, 0x19, 0x84, 0x47, + 0x0E, 0x19, 0x84, 0x45, 0x0D, 0x18, 0x84, 0x45, 0x0C, 0x14, 0x83, 0x45, 0x0C, 0x10, 0x83, 0x45, + 0x0D, 0x0E, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x45, 0x0C, 0x09, 0x83, 0x45, 0x0C, 0x07, 0x82, 0x45, + 0x0C, 0x06, 0x82, 0x44, 0x0B, 0x04, 0x81, 0x43, 0x0B, 0x02, 0x81, 0x44, 0x0B, 0x02, 0x83, 0x45, + 0x0D, 0x01, 0x84, 0x48, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x85, 0x49, 0x11, 0x01, 0x83, 0x46, 0x0C, 0x01, 0x83, 0x44, 0x0C, 0x02, 0x83, 0x45, + 0x0C, 0x02, 0x83, 0x46, 0x0D, 0x03, 0x83, 0x48, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0E, 0x06, 0x86, 0x41, 0x0F, 0x08, 0x7C, 0x38, 0x04, 0x0B, 0x73, 0x33, 0x00, 0x0F, 0xA3, 0x6F, + 0x41, 0x13, 0xCA, 0xA5, 0x8A, 0x30, 0xAB, 0x84, 0x68, 0x7E, 0x99, 0x70, 0x54, 0xD5, 0x8F, 0x65, + 0x46, 0xF8, 0x83, 0x55, 0x35, 0xFF, 0x6F, 0x3D, 0x1C, 0xFF, 0x65, 0x30, 0x0F, 0xFF, 0x5F, 0x29, + 0x09, 0xFF, 0x5E, 0x27, 0x06, 0xFF, 0x5E, 0x27, 0x06, 0xFF, 0x60, 0x28, 0x06, 0xFF, 0x60, 0x29, + 0x06, 0xFF, 0x62, 0x2A, 0x05, 0xFF, 0x63, 0x2B, 0x06, 0xFF, 0x65, 0x2B, 0x05, 0xFF, 0x66, 0x2C, + 0x05, 0xFF, 0x67, 0x2D, 0x06, 0xFF, 0x68, 0x2E, 0x06, 0xFF, 0x6A, 0x2F, 0x06, 0xFF, 0x6B, 0x31, + 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x6D, 0x33, 0x07, 0xFF, 0x6F, 0x34, 0x08, 0xFF, 0x70, 0x35, + 0x08, 0xFF, 0x71, 0x36, 0x08, 0xFF, 0x72, 0x37, 0x09, 0xFF, 0x73, 0x38, 0x09, 0xFF, 0x74, 0x39, + 0x09, 0xFF, 0x76, 0x39, 0x0A, 0xFF, 0x76, 0x3A, 0x0A, 0xFF, 0x77, 0x3A, 0x0A, 0xFF, 0x77, 0x3B, + 0x09, 0xFF, 0x78, 0x3B, 0x0A, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x7A, 0x3E, 0x0C, 0xFF, 0x7B, 0x3F, + 0x0D, 0xFF, 0x7D, 0x41, 0x10, 0xFF, 0x7E, 0x43, 0x12, 0xFF, 0x80, 0x45, 0x15, 0xFF, 0x82, 0x49, + 0x19, 0xFF, 0x84, 0x4C, 0x1D, 0xFF, 0x85, 0x4F, 0x20, 0xFF, 0x87, 0x51, 0x24, 0xFF, 0x88, 0x53, + 0x27, 0xFF, 0x89, 0x53, 0x28, 0xFF, 0x89, 0x54, 0x29, 0xFF, 0x8A, 0x55, 0x2A, 0xFF, 0x89, 0x56, + 0x2A, 0xFF, 0x8A, 0x56, 0x2B, 0xFF, 0x8A, 0x57, 0x2B, 0xFF, 0x8B, 0x57, 0x2C, 0xFF, 0x8B, 0x57, + 0x2D, 0xFF, 0x8B, 0x57, 0x2D, 0xFF, 0x8A, 0x57, 0x2E, 0xFF, 0x8A, 0x57, 0x2E, 0xFF, 0x8A, 0x57, + 0x2F, 0xFF, 0x8A, 0x57, 0x30, 0xFF, 0x89, 0x57, 0x30, 0xFF, 0x89, 0x57, 0x30, 0xFF, 0x88, 0x57, + 0x30, 0xFF, 0x88, 0x57, 0x30, 0xFF, 0x86, 0x56, 0x31, 0xFF, 0x86, 0x55, 0x31, 0xFF, 0x85, 0x55, + 0x32, 0xFF, 0x85, 0x54, 0x32, 0xFF, 0x84, 0x55, 0x33, 0xFF, 0x84, 0x55, 0x33, 0xFF, 0x84, 0x54, + 0x34, 0xFF, 0x85, 0x56, 0x37, 0xFF, 0x87, 0x5A, 0x3B, 0xFF, 0x8E, 0x63, 0x45, 0xFF, 0x97, 0x70, + 0x54, 0xFF, 0xA2, 0x7C, 0x60, 0xFD, 0xA8, 0x83, 0x66, 0xEF, 0xAD, 0x8B, 0x6E, 0xB1, 0xBC, 0x9B, + 0x7E, 0x51, 0xAB, 0x7F, 0x57, 0x27, 0x76, 0x35, 0x00, 0x18, 0x7D, 0x37, 0x00, 0x14, 0x85, 0x43, + 0x0D, 0x13, 0x83, 0x43, 0x0C, 0x10, 0x83, 0x46, 0x0C, 0x0D, 0x83, 0x45, 0x0C, 0x0C, 0x83, 0x45, + 0x0D, 0x0B, 0x83, 0x45, 0x0C, 0x09, 0x82, 0x45, 0x0C, 0x07, 0x83, 0x45, 0x0C, 0x05, 0x82, 0x45, + 0x0C, 0x04, 0x82, 0x45, 0x0C, 0x02, 0x81, 0x44, 0x0B, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x83, 0x45, + 0x0D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x4A, 0x12, 0x01, 0x84, 0x46, + 0x0E, 0x01, 0x83, 0x45, 0x0C, 0x02, 0x86, 0x4A, 0x0F, 0x02, 0x85, 0x47, 0x14, 0x02, 0x69, 0x1E, + 0x00, 0x03, 0x62, 0x12, 0x00, 0x06, 0x78, 0x32, 0x0B, 0x09, 0xC0, 0x99, 0x6C, 0x0F, 0xD8, 0xB4, + 0x9C, 0x30, 0xA9, 0x83, 0x65, 0x88, 0x93, 0x6A, 0x4E, 0xDD, 0x90, 0x64, 0x44, 0xF8, 0x81, 0x52, + 0x31, 0xFE, 0x6C, 0x39, 0x17, 0xFF, 0x64, 0x2E, 0x0C, 0xFF, 0x62, 0x2A, 0x08, 0xFF, 0x5F, 0x27, + 0x05, 0xFF, 0x60, 0x28, 0x04, 0xFF, 0x61, 0x29, 0x05, 0xFF, 0x62, 0x29, 0x05, 0xFF, 0x63, 0x2B, + 0x06, 0xFF, 0x65, 0x2C, 0x05, 0xFF, 0x67, 0x2E, 0x05, 0xFF, 0x68, 0x2F, 0x06, 0xFF, 0x6A, 0x30, + 0x06, 0xFF, 0x6C, 0x32, 0x07, 0xFF, 0x6D, 0x32, 0x06, 0xFF, 0x6E, 0x33, 0x06, 0xFF, 0x6F, 0x34, + 0x07, 0xFF, 0x71, 0x35, 0x07, 0xFF, 0x72, 0x36, 0x07, 0xFF, 0x73, 0x37, 0x07, 0xFF, 0x74, 0x38, + 0x07, 0xFF, 0x75, 0x39, 0x08, 0xFF, 0x76, 0x3A, 0x08, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3C, + 0x09, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7C, 0x3E, + 0x0A, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7C, 0x3F, 0x0B, 0xFF, 0x7D, 0x3F, 0x0C, 0xFF, 0x7D, 0x40, + 0x0D, 0xFF, 0x7D, 0x41, 0x0E, 0xFF, 0x7E, 0x43, 0x11, 0xFF, 0x7F, 0x46, 0x14, 0xFF, 0x82, 0x49, + 0x19, 0xFF, 0x85, 0x4D, 0x1E, 0xFF, 0x87, 0x51, 0x22, 0xFF, 0x8A, 0x55, 0x26, 0xFF, 0x8B, 0x56, + 0x28, 0xFF, 0x8C, 0x58, 0x2A, 0xFF, 0x8D, 0x58, 0x2B, 0xFF, 0x8D, 0x58, 0x2B, 0xFF, 0x8C, 0x58, + 0x2C, 0xFF, 0x8C, 0x58, 0x2C, 0xFF, 0x8C, 0x59, 0x2D, 0xFF, 0x8C, 0x58, 0x2D, 0xFF, 0x8C, 0x58, + 0x2E, 0xFF, 0x8B, 0x58, 0x2E, 0xFF, 0x8B, 0x58, 0x2F, 0xFF, 0x8B, 0x58, 0x2F, 0xFF, 0x8B, 0x58, + 0x2F, 0xFF, 0x8A, 0x58, 0x30, 0xFF, 0x8A, 0x58, 0x30, 0xFF, 0x89, 0x57, 0x31, 0xFF, 0x88, 0x57, + 0x31, 0xFF, 0x87, 0x57, 0x31, 0xFF, 0x87, 0x56, 0x31, 0xFF, 0x86, 0x56, 0x32, 0xFF, 0x85, 0x55, + 0x32, 0xFF, 0x85, 0x55, 0x33, 0xFF, 0x85, 0x56, 0x35, 0xFF, 0x87, 0x59, 0x38, 0xFF, 0x8C, 0x61, + 0x43, 0xFF, 0x97, 0x6E, 0x51, 0xFF, 0xA4, 0x7E, 0x61, 0xFF, 0xAA, 0x85, 0x66, 0xF5, 0xAD, 0x8A, + 0x6D, 0xB7, 0xC1, 0xA2, 0x85, 0x52, 0xBA, 0x98, 0x76, 0x24, 0x7D, 0x3F, 0x18, 0x11, 0x6A, 0x22, + 0x00, 0x0E, 0x73, 0x2E, 0x00, 0x0A, 0x83, 0x48, 0x0F, 0x08, 0x85, 0x47, 0x0E, 0x07, 0x83, 0x44, + 0x0C, 0x06, 0x84, 0x45, 0x0D, 0x05, 0x83, 0x45, 0x0C, 0x04, 0x83, 0x45, 0x0C, 0x03, 0x83, 0x45, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x83, 0x46, 0x0E, 0x01, 0x84, 0x46, 0x0E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x46, + 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3D, 0x12, 0x01, 0x58, 0x04, + 0x00, 0x02, 0x5D, 0x0E, 0x03, 0x05, 0xC3, 0xA4, 0x85, 0x0A, 0xDF, 0xC6, 0xAC, 0x2D, 0xA1, 0x7A, + 0x5D, 0x88, 0x8D, 0x66, 0x4C, 0xDF, 0x92, 0x66, 0x45, 0xFB, 0x82, 0x51, 0x2E, 0xFF, 0x68, 0x34, + 0x12, 0xFF, 0x61, 0x2B, 0x09, 0xFF, 0x5F, 0x28, 0x06, 0xFF, 0x60, 0x27, 0x06, 0xFF, 0x60, 0x28, + 0x05, 0xFF, 0x62, 0x29, 0x04, 0xFF, 0x63, 0x2A, 0x05, 0xFF, 0x65, 0x2B, 0x05, 0xFF, 0x66, 0x2D, + 0x06, 0xFF, 0x68, 0x2F, 0x06, 0xFF, 0x69, 0x30, 0x06, 0xFF, 0x6B, 0x31, 0x06, 0xFF, 0x6B, 0x32, + 0x06, 0xFF, 0x6D, 0x33, 0x07, 0xFF, 0x6E, 0x34, 0x07, 0xFF, 0x71, 0x35, 0x07, 0xFF, 0x72, 0x36, + 0x07, 0xFF, 0x74, 0x38, 0x08, 0xFF, 0x75, 0x39, 0x08, 0xFF, 0x76, 0x3A, 0x08, 0xFF, 0x77, 0x3B, + 0x08, 0xFF, 0x78, 0x3C, 0x08, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3D, 0x09, 0xFF, 0x7A, 0x3D, + 0x09, 0xFF, 0x7A, 0x3D, 0x09, 0xFF, 0x7B, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7B, 0x3E, + 0x09, 0xFF, 0x7C, 0x3F, 0x0A, 0xFF, 0x7D, 0x3F, 0x0A, 0xFF, 0x7D, 0x40, 0x0A, 0xFF, 0x7D, 0x40, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x40, 0x0B, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x7F, 0x41, + 0x0C, 0xFF, 0x80, 0x41, 0x0C, 0xFF, 0x80, 0x41, 0x0B, 0xFF, 0x80, 0x41, 0x0C, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x80, 0x42, 0x0D, 0xFF, 0x81, 0x45, 0x10, 0xFF, 0x83, 0x48, 0x14, 0xFF, 0x87, 0x4E, + 0x1A, 0xFF, 0x89, 0x52, 0x20, 0xFF, 0x8B, 0x55, 0x25, 0xFF, 0x8D, 0x57, 0x29, 0xFF, 0x8D, 0x58, + 0x2A, 0xFF, 0x8D, 0x59, 0x2B, 0xFF, 0x8D, 0x5A, 0x2C, 0xFF, 0x8E, 0x5A, 0x2D, 0xFF, 0x8D, 0x5A, + 0x2D, 0xFF, 0x8D, 0x5A, 0x2D, 0xFF, 0x8D, 0x5A, 0x2E, 0xFF, 0x8D, 0x5A, 0x2E, 0xFF, 0x8D, 0x5A, + 0x2F, 0xFF, 0x8D, 0x59, 0x2F, 0xFF, 0x8C, 0x59, 0x30, 0xFF, 0x8C, 0x59, 0x31, 0xFF, 0x8A, 0x59, + 0x31, 0xFF, 0x89, 0x58, 0x31, 0xFF, 0x89, 0x58, 0x31, 0xFF, 0x88, 0x57, 0x31, 0xFF, 0x87, 0x57, + 0x32, 0xFF, 0x87, 0x56, 0x32, 0xFF, 0x86, 0x56, 0x33, 0xFF, 0x86, 0x57, 0x34, 0xFF, 0x86, 0x58, + 0x37, 0xFF, 0x8A, 0x5E, 0x3F, 0xFF, 0x95, 0x6B, 0x4E, 0xFF, 0xA3, 0x7D, 0x5F, 0xFF, 0xAB, 0x86, + 0x6A, 0xF9, 0xB2, 0x91, 0x76, 0xBA, 0xC2, 0xA6, 0x89, 0x52, 0xC5, 0xA1, 0x82, 0x1D, 0x75, 0x33, + 0x0D, 0x0B, 0x6A, 0x1B, 0x00, 0x08, 0x7E, 0x3E, 0x09, 0x05, 0x83, 0x46, 0x0C, 0x04, 0x83, 0x45, + 0x0B, 0x03, 0x83, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x45, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x5B, + 0x40, 0x01, 0xCF, 0xB4, 0x99, 0x06, 0xD5, 0xB9, 0x9F, 0x29, 0xAB, 0x83, 0x62, 0x88, 0x93, 0x69, + 0x48, 0xE1, 0x94, 0x69, 0x45, 0xFB, 0x81, 0x50, 0x2E, 0xFE, 0x6A, 0x34, 0x11, 0xFF, 0x61, 0x29, + 0x06, 0xFF, 0x62, 0x29, 0x06, 0xFF, 0x61, 0x28, 0x05, 0xFF, 0x61, 0x29, 0x05, 0xFF, 0x63, 0x2A, + 0x06, 0xFF, 0x65, 0x2C, 0x05, 0xFF, 0x67, 0x2D, 0x06, 0xFF, 0x68, 0x2E, 0x06, 0xFF, 0x6A, 0x31, + 0x06, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6B, 0x33, 0x08, 0xFF, 0x6C, 0x34, + 0x08, 0xFF, 0x6E, 0x35, 0x08, 0xFF, 0x70, 0x36, 0x08, 0xFF, 0x73, 0x38, 0x09, 0xFF, 0x75, 0x39, + 0x08, 0xFF, 0x77, 0x3B, 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3D, 0x0A, 0xFF, 0x7A, 0x3E, + 0x0A, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7C, 0x3F, 0x0A, 0xFF, 0x7D, 0x3F, 0x0A, 0xFF, 0x7D, 0x40, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7F, 0x41, + 0x0A, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x80, 0x41, 0x0B, 0xFF, 0x80, 0x42, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x43, 0x0A, 0xFF, 0x82, 0x43, 0x0A, 0xFF, 0x82, 0x43, + 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x81, 0x43, 0x0C, 0xFF, 0x81, 0x43, 0x0C, 0xFF, 0x81, 0x44, + 0x0D, 0xFF, 0x81, 0x45, 0x0F, 0xFF, 0x83, 0x48, 0x14, 0xFF, 0x86, 0x4D, 0x1A, 0xFF, 0x88, 0x51, + 0x20, 0xFF, 0x8C, 0x56, 0x27, 0xFF, 0x8E, 0x59, 0x2A, 0xFF, 0x8F, 0x5B, 0x2C, 0xFF, 0x8F, 0x5B, + 0x2D, 0xFF, 0x90, 0x5B, 0x2D, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8E, 0x5B, + 0x2F, 0xFF, 0x8E, 0x5B, 0x2F, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5A, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8C, 0x5A, 0x31, 0xFF, 0x8B, 0x5A, 0x31, 0xFF, 0x8A, 0x59, 0x31, 0xFF, 0x8A, 0x58, + 0x32, 0xFF, 0x89, 0x58, 0x32, 0xFF, 0x87, 0x57, 0x32, 0xFF, 0x87, 0x57, 0x33, 0xFF, 0x87, 0x57, + 0x34, 0xFF, 0x87, 0x58, 0x35, 0xFF, 0x8A, 0x5D, 0x3E, 0xFF, 0x96, 0x6C, 0x4C, 0xFF, 0xA3, 0x7C, + 0x5C, 0xFF, 0xA8, 0x83, 0x68, 0xF8, 0xB1, 0x90, 0x77, 0xB8, 0xBE, 0xA1, 0x88, 0x51, 0xC3, 0xA6, + 0x8A, 0x18, 0x9F, 0x6D, 0x4F, 0x04, 0x90, 0x4A, 0x1E, 0x03, 0x79, 0x39, 0x04, 0x01, 0x7C, 0x3F, + 0x08, 0x01, 0x84, 0x48, 0x0F, 0x02, 0x81, 0x45, 0x0D, 0x02, 0x83, 0x46, 0x0F, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xD6, + 0xBF, 0x01, 0xDB, 0xBF, 0xA6, 0x25, 0xA8, 0x81, 0x63, 0x80, 0x96, 0x6D, 0x4E, 0xDE, 0x91, 0x65, + 0x43, 0xFC, 0x80, 0x4E, 0x2A, 0xFF, 0x69, 0x34, 0x11, 0xFF, 0x62, 0x2B, 0x07, 0xFF, 0x61, 0x29, + 0x05, 0xFF, 0x62, 0x29, 0x06, 0xFF, 0x62, 0x2A, 0x05, 0xFF, 0x63, 0x2A, 0x05, 0xFF, 0x65, 0x2D, + 0x06, 0xFF, 0x69, 0x2F, 0x07, 0xFF, 0x69, 0x2F, 0x07, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6B, 0x32, + 0x07, 0xFF, 0x6C, 0x33, 0x07, 0xFF, 0x6B, 0x34, 0x08, 0xFF, 0x6C, 0x34, 0x08, 0xFF, 0x6D, 0x36, + 0x09, 0xFF, 0x6F, 0x36, 0x08, 0xFF, 0x70, 0x38, 0x08, 0xFF, 0x73, 0x39, 0x09, 0xFF, 0x76, 0x3B, + 0x09, 0xFF, 0x78, 0x3C, 0x0A, 0xFF, 0x79, 0x3D, 0x0A, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7C, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7E, 0x41, 0x0A, 0xFF, 0x7F, 0x41, 0x0A, 0xFF, 0x80, 0x42, + 0x0A, 0xFF, 0x80, 0x42, 0x0A, 0xFF, 0x80, 0x42, 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x43, + 0x0B, 0xFF, 0x81, 0x43, 0x0B, 0xFF, 0x81, 0x43, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x82, 0x44, + 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x82, 0x44, + 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x82, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x84, 0x45, 0x0D, 0xFF, 0x83, 0x45, + 0x0D, 0xFF, 0x84, 0x44, 0x0D, 0xFF, 0x84, 0x44, 0x0C, 0xFF, 0x85, 0x45, 0x0D, 0xFF, 0x85, 0x46, + 0x0F, 0xFF, 0x86, 0x48, 0x12, 0xFF, 0x89, 0x4E, 0x19, 0xFF, 0x8C, 0x54, 0x21, 0xFF, 0x8E, 0x58, + 0x27, 0xFF, 0x90, 0x5A, 0x2B, 0xFF, 0x90, 0x5C, 0x2D, 0xFF, 0x90, 0x5B, 0x2E, 0xFF, 0x90, 0x5C, + 0x2E, 0xFF, 0x90, 0x5C, 0x2F, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8F, 0x5C, 0x30, 0xFF, 0x8F, 0x5C, + 0x30, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5B, 0x31, 0xFF, 0x8C, 0x5A, 0x32, 0xFF, 0x8C, 0x5A, + 0x32, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x89, 0x58, 0x32, 0xFF, 0x88, 0x58, 0x32, 0xFF, 0x88, 0x57, + 0x33, 0xFF, 0x88, 0x58, 0x33, 0xFF, 0x88, 0x59, 0x36, 0xFF, 0x8B, 0x5D, 0x3C, 0xFF, 0x96, 0x6C, + 0x4B, 0xFF, 0xA3, 0x7D, 0x5F, 0xFF, 0xA9, 0x86, 0x6A, 0xF7, 0xB3, 0x92, 0x76, 0xAE, 0xBB, 0x9D, + 0x81, 0x49, 0xC8, 0xAA, 0x8F, 0x12, 0xC0, 0xA2, 0x86, 0x01, 0xA7, 0x74, 0x46, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x49, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC2, + 0xB3, 0x1F, 0xB1, 0x86, 0x69, 0x79, 0x99, 0x6D, 0x4A, 0xD9, 0x92, 0x65, 0x43, 0xFB, 0x7F, 0x4D, + 0x29, 0xFF, 0x6B, 0x34, 0x10, 0xFF, 0x63, 0x2B, 0x07, 0xFF, 0x63, 0x2B, 0x06, 0xFF, 0x64, 0x2B, + 0x06, 0xFF, 0x65, 0x2B, 0x06, 0xFF, 0x65, 0x2C, 0x07, 0xFF, 0x67, 0x2D, 0x07, 0xFF, 0x6A, 0x30, + 0x07, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6B, 0x32, 0x08, 0xFF, 0x6C, 0x33, 0x07, 0xFF, 0x6D, 0x34, + 0x08, 0xFF, 0x6D, 0x36, 0x09, 0xFF, 0x6D, 0x37, 0x09, 0xFF, 0x69, 0x35, 0x08, 0xFF, 0x68, 0x35, + 0x08, 0xFF, 0x6B, 0x38, 0x09, 0xFF, 0x6C, 0x37, 0x07, 0xFF, 0x6F, 0x39, 0x08, 0xFF, 0x74, 0x3B, + 0x0A, 0xFF, 0x77, 0x3D, 0x0B, 0xFF, 0x7B, 0x3E, 0x0B, 0xFF, 0x7E, 0x40, 0x0C, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x43, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x82, 0x43, + 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0C, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x83, 0x45, 0x0C, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x84, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, + 0x0D, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x84, 0x46, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x85, 0x46, 0x0D, 0xFF, 0x84, 0x46, 0x0D, 0xFF, 0x84, 0x47, 0x10, 0xFF, 0x86, 0x4B, + 0x16, 0xFF, 0x8A, 0x52, 0x1F, 0xFF, 0x8E, 0x57, 0x25, 0xFF, 0x91, 0x5B, 0x2B, 0xFF, 0x92, 0x5D, + 0x2E, 0xFF, 0x92, 0x5D, 0x2E, 0xFF, 0x91, 0x5D, 0x2F, 0xFF, 0x91, 0x5D, 0x2F, 0xFF, 0x91, 0x5D, + 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8F, 0x5C, 0x31, 0xFF, 0x8F, 0x5C, 0x31, 0xFF, 0x8E, 0x5B, + 0x31, 0xFF, 0x8D, 0x5B, 0x32, 0xFF, 0x8C, 0x5A, 0x32, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x8A, 0x58, + 0x32, 0xFF, 0x89, 0x57, 0x32, 0xFF, 0x89, 0x58, 0x33, 0xFF, 0x89, 0x59, 0x35, 0xFF, 0x8C, 0x5D, + 0x3C, 0xFF, 0x97, 0x6C, 0x4C, 0xFF, 0xA5, 0x7F, 0x62, 0xFF, 0xAB, 0x87, 0x69, 0xF2, 0xB7, 0x96, + 0x7A, 0xA7, 0xC2, 0xA4, 0x8A, 0x46, 0xCA, 0xAF, 0x95, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xC7, 0xB8, 0x1B, 0xAD, 0x89, + 0x6B, 0x6E, 0x9A, 0x70, 0x4C, 0xD2, 0x93, 0x67, 0x45, 0xFA, 0x7F, 0x4E, 0x2B, 0xFF, 0x6C, 0x35, + 0x12, 0xFF, 0x64, 0x2C, 0x08, 0xFF, 0x63, 0x2A, 0x05, 0xFF, 0x65, 0x2B, 0x06, 0xFF, 0x65, 0x2C, + 0x06, 0xFF, 0x67, 0x2D, 0x06, 0xFF, 0x68, 0x2E, 0x07, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x33, + 0x07, 0xFF, 0x6D, 0x33, 0x07, 0xFF, 0x6D, 0x34, 0x07, 0xFF, 0x6D, 0x34, 0x08, 0xFF, 0x6D, 0x35, + 0x08, 0xFF, 0x6C, 0x35, 0x08, 0xFF, 0x6A, 0x36, 0x09, 0xFF, 0x69, 0x39, 0x0D, 0xFF, 0x6A, 0x3D, + 0x12, 0xFF, 0x64, 0x36, 0x0C, 0xFF, 0x63, 0x35, 0x09, 0xFF, 0x6A, 0x3A, 0x09, 0xFF, 0x6F, 0x3B, + 0x09, 0xFF, 0x75, 0x3D, 0x0B, 0xFF, 0x7B, 0x3F, 0x0C, 0xFF, 0x7E, 0x41, 0x0C, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x84, 0x45, + 0x0B, 0xFF, 0x85, 0x45, 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x86, 0x46, + 0x0C, 0xFF, 0x86, 0x47, 0x0D, 0xFF, 0x86, 0x47, 0x0D, 0xFF, 0x87, 0x47, 0x0D, 0xFF, 0x86, 0x46, + 0x0D, 0xFF, 0x86, 0x47, 0x0E, 0xFF, 0x87, 0x4A, 0x12, 0xFF, 0x8B, 0x4F, 0x18, 0xFF, 0x8F, 0x56, + 0x21, 0xFF, 0x92, 0x5A, 0x28, 0xFF, 0x92, 0x5D, 0x2D, 0xFF, 0x93, 0x5D, 0x2F, 0xFF, 0x92, 0x5E, + 0x2F, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x91, 0x5D, 0x30, 0xFF, 0x90, 0x5D, + 0x31, 0xFF, 0x8F, 0x5D, 0x31, 0xFF, 0x8E, 0x5C, 0x32, 0xFF, 0x8D, 0x5B, 0x32, 0xFF, 0x8C, 0x5A, + 0x32, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x8A, 0x58, 0x33, 0xFF, 0x8A, 0x5A, + 0x37, 0xFF, 0x8F, 0x60, 0x3F, 0xFF, 0x98, 0x6D, 0x4E, 0xFE, 0xA7, 0x80, 0x63, 0xFF, 0xAF, 0x8B, + 0x6E, 0xEC, 0xB7, 0x96, 0x7A, 0x98, 0xC7, 0xA9, 0x92, 0x37, 0xD0, 0xBA, 0xA4, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xAB, 0x96, 0x0D, 0xB3, 0x93, 0x74, 0x61, 0xA7, 0x82, + 0x61, 0xCB, 0x95, 0x69, 0x46, 0xF8, 0x83, 0x51, 0x2C, 0xFE, 0x6F, 0x38, 0x14, 0xFF, 0x67, 0x2F, + 0x0A, 0xFF, 0x64, 0x2A, 0x05, 0xFF, 0x66, 0x2B, 0x06, 0xFF, 0x68, 0x2C, 0x06, 0xFF, 0x69, 0x2E, + 0x07, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x6F, 0x34, 0x07, 0xFF, 0x70, 0x35, + 0x08, 0xFF, 0x6F, 0x35, 0x07, 0xFF, 0x6F, 0x35, 0x07, 0xFF, 0x6F, 0x36, 0x08, 0xFF, 0x6D, 0x35, + 0x08, 0xFF, 0x66, 0x32, 0x06, 0xFF, 0x65, 0x37, 0x10, 0xFF, 0x76, 0x4F, 0x29, 0xFF, 0xA1, 0x86, + 0x6D, 0xFF, 0x98, 0x7C, 0x64, 0xFF, 0x71, 0x48, 0x23, 0xFF, 0x66, 0x3C, 0x0E, 0xFF, 0x65, 0x38, + 0x07, 0xFF, 0x6D, 0x3B, 0x0A, 0xFF, 0x77, 0x3F, 0x0A, 0xFF, 0x7C, 0x41, 0x0B, 0xFF, 0x80, 0x43, + 0x0B, 0xFF, 0x83, 0x44, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x49, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x87, 0x48, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x48, 0x0D, 0xFF, 0x87, 0x48, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x47, 0x0D, 0xFF, 0x87, 0x48, 0x0D, 0xFF, 0x87, 0x4A, + 0x10, 0xFF, 0x89, 0x4E, 0x16, 0xFF, 0x8C, 0x54, 0x1F, 0xFF, 0x91, 0x5B, 0x29, 0xFF, 0x94, 0x5E, + 0x2E, 0xFF, 0x94, 0x5F, 0x2F, 0xFF, 0x93, 0x5F, 0x30, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x92, 0x5E, + 0x31, 0xFF, 0x91, 0x5E, 0x31, 0xFF, 0x90, 0x5D, 0x32, 0xFF, 0x90, 0x5D, 0x32, 0xFF, 0x8F, 0x5C, + 0x32, 0xFF, 0x8E, 0x5B, 0x31, 0xFF, 0x8D, 0x5A, 0x32, 0xFF, 0x8C, 0x59, 0x32, 0xFF, 0x8B, 0x59, + 0x33, 0xFF, 0x8C, 0x5B, 0x37, 0xFF, 0x90, 0x61, 0x3F, 0xFF, 0x99, 0x6E, 0x4D, 0xFF, 0xAB, 0x84, + 0x66, 0xFF, 0xB0, 0x8D, 0x6F, 0xE5, 0xB8, 0x97, 0x7C, 0x8D, 0xD4, 0xB9, 0xA4, 0x2C, 0x00, 0x00, + 0x00, 0x00, 0xF1, 0xE3, 0xD7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC3, 0xA5, 0x8A, 0x07, 0xC0, 0xA1, 0x85, 0x47, 0xAF, 0x8A, 0x69, 0xB5, 0x9B, 0x71, + 0x4C, 0xF2, 0x85, 0x54, 0x2F, 0xFF, 0x72, 0x3C, 0x16, 0xFF, 0x67, 0x2E, 0x09, 0xFF, 0x66, 0x2C, + 0x06, 0xFF, 0x66, 0x2B, 0x06, 0xFF, 0x68, 0x2D, 0x06, 0xFF, 0x6A, 0x2E, 0x07, 0xFF, 0x6B, 0x30, + 0x07, 0xFF, 0x6E, 0x32, 0x08, 0xFF, 0x70, 0x35, 0x07, 0xFF, 0x70, 0x35, 0x07, 0xFF, 0x71, 0x36, + 0x08, 0xFF, 0x70, 0x37, 0x08, 0xFF, 0x6E, 0x37, 0x07, 0xFF, 0x69, 0x35, 0x07, 0xFF, 0x62, 0x33, + 0x07, 0xFF, 0x63, 0x3A, 0x12, 0xFF, 0x7A, 0x5D, 0x36, 0xFF, 0xB2, 0xA1, 0x8C, 0xFF, 0xE6, 0xDB, + 0xD5, 0xFF, 0xE0, 0xD6, 0xCE, 0xFF, 0xAD, 0x9C, 0x8B, 0xFF, 0x81, 0x60, 0x3D, 0xFF, 0x67, 0x3F, + 0x15, 0xFF, 0x65, 0x3A, 0x0B, 0xFF, 0x70, 0x3E, 0x09, 0xFF, 0x76, 0x3F, 0x09, 0xFF, 0x7C, 0x42, + 0x0A, 0xFF, 0x81, 0x44, 0x0B, 0xFF, 0x84, 0x46, 0x0C, 0xFF, 0x87, 0x48, 0x0C, 0xFF, 0x88, 0x49, + 0x0D, 0xFF, 0x89, 0x48, 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x89, 0x48, 0x0D, 0xFF, 0x88, 0x49, + 0x0C, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, 0x0C, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x89, 0x4A, + 0x0C, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x89, 0x49, 0x0C, 0xFF, 0x88, 0x49, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x88, 0x48, + 0x0D, 0xFF, 0x89, 0x49, 0x0E, 0xFF, 0x89, 0x4A, 0x0F, 0xFF, 0x8B, 0x4E, 0x14, 0xFF, 0x8F, 0x55, + 0x1F, 0xFF, 0x93, 0x5C, 0x29, 0xFF, 0x94, 0x5E, 0x2E, 0xFF, 0x94, 0x5E, 0x2F, 0xFF, 0x94, 0x5F, + 0x30, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x92, 0x5E, 0x31, 0xFF, 0x91, 0x5D, + 0x31, 0xFF, 0x90, 0x5C, 0x31, 0xFF, 0x8F, 0x5C, 0x32, 0xFF, 0x8E, 0x5B, 0x32, 0xFF, 0x8D, 0x5A, + 0x32, 0xFF, 0x8C, 0x5A, 0x33, 0xFF, 0x8E, 0x5E, 0x39, 0xFF, 0x91, 0x63, 0x40, 0xFF, 0x9A, 0x71, + 0x50, 0xFF, 0xAD, 0x86, 0x67, 0xFF, 0xB4, 0x90, 0x72, 0xDB, 0xBE, 0x9E, 0x85, 0x78, 0xD9, 0xC4, + 0xB6, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCA, 0xAE, 0x92, 0x33, 0xB9, 0x97, 0x79, 0x9D, 0x9D, 0x73, 0x4F, 0xE9, 0x8B, 0x5A, + 0x35, 0xFD, 0x77, 0x41, 0x1A, 0xFF, 0x6C, 0x33, 0x0D, 0xFF, 0x67, 0x2D, 0x07, 0xFF, 0x68, 0x2D, + 0x07, 0xFF, 0x69, 0x2D, 0x07, 0xFF, 0x6B, 0x2F, 0x07, 0xFF, 0x6C, 0x31, 0x07, 0xFF, 0x6F, 0x33, + 0x08, 0xFF, 0x71, 0x35, 0x08, 0xFF, 0x71, 0x37, 0x08, 0xFF, 0x71, 0x37, 0x08, 0xFF, 0x70, 0x38, + 0x07, 0xFF, 0x70, 0x39, 0x08, 0xFF, 0x6A, 0x35, 0x07, 0xFF, 0x65, 0x36, 0x0A, 0xFF, 0x6E, 0x48, + 0x22, 0xFF, 0x98, 0x7F, 0x68, 0xFF, 0xB4, 0xA6, 0x98, 0xFF, 0xA1, 0x96, 0x86, 0xFF, 0xC7, 0xC0, + 0xB5, 0xFF, 0xEF, 0xEB, 0xE8, 0xFF, 0xED, 0xE6, 0xE2, 0xFF, 0xBF, 0xB1, 0xA5, 0xFF, 0x90, 0x6F, + 0x54, 0xFF, 0x6D, 0x48, 0x20, 0xFF, 0x67, 0x3D, 0x0E, 0xFF, 0x6D, 0x3E, 0x0C, 0xFF, 0x75, 0x41, + 0x0B, 0xFF, 0x7C, 0x43, 0x0B, 0xFF, 0x82, 0x46, 0x0C, 0xFF, 0x86, 0x48, 0x0D, 0xFF, 0x88, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0E, 0xFF, 0x8A, 0x49, 0x0D, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x89, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0E, 0xFF, 0x88, 0x4A, + 0x10, 0xFF, 0x8A, 0x4E, 0x16, 0xFF, 0x8E, 0x56, 0x1F, 0xFF, 0x93, 0x5D, 0x2A, 0xFF, 0x96, 0x5F, + 0x2E, 0xFF, 0x96, 0x60, 0x2F, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x93, 0x5F, + 0x31, 0xFF, 0x91, 0x5E, 0x31, 0xFF, 0x91, 0x5D, 0x32, 0xFF, 0x90, 0x5D, 0x32, 0xFF, 0x8F, 0x5B, + 0x32, 0xFF, 0x8D, 0x5A, 0x32, 0xFF, 0x8E, 0x5C, 0x34, 0xFF, 0x8F, 0x5F, 0x3A, 0xFF, 0x93, 0x65, + 0x43, 0xFF, 0x9E, 0x75, 0x53, 0xFF, 0xAF, 0x89, 0x69, 0xFE, 0xB9, 0x97, 0x7A, 0xCA, 0xC2, 0xA7, + 0x90, 0x62, 0xCE, 0xB6, 0xA1, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xAE, + 0x97, 0x1C, 0xC1, 0xA0, 0x83, 0x7E, 0xA0, 0x78, 0x57, 0xDC, 0x8E, 0x5F, 0x3A, 0xFC, 0x79, 0x44, + 0x1D, 0xFF, 0x6D, 0x34, 0x0F, 0xFF, 0x69, 0x2F, 0x08, 0xFF, 0x68, 0x2D, 0x08, 0xFF, 0x6A, 0x2E, + 0x07, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x72, 0x36, + 0x08, 0xFF, 0x72, 0x36, 0x08, 0xFF, 0x72, 0x38, 0x09, 0xFF, 0x71, 0x39, 0x08, 0xFF, 0x6F, 0x39, + 0x07, 0xFF, 0x68, 0x37, 0x07, 0xFF, 0x62, 0x38, 0x09, 0xFF, 0x72, 0x52, 0x2C, 0xFF, 0xAC, 0x9C, + 0x8B, 0xFF, 0xD9, 0xD5, 0xD1, 0xFF, 0xDC, 0xDC, 0xD9, 0xFF, 0xC6, 0xBD, 0xB6, 0xFF, 0x96, 0x8E, + 0x7F, 0xFF, 0xA6, 0xA0, 0x94, 0xFF, 0xD7, 0xD5, 0xCD, 0xFF, 0xEC, 0xEA, 0xE2, 0xFF, 0xD2, 0xC8, + 0xBD, 0xFF, 0x9C, 0x85, 0x6E, 0xFF, 0x71, 0x4F, 0x2B, 0xFF, 0x68, 0x40, 0x14, 0xFF, 0x6F, 0x3F, + 0x10, 0xFF, 0x74, 0x3F, 0x0B, 0xFF, 0x7B, 0x44, 0x0C, 0xFF, 0x81, 0x46, 0x0D, 0xFF, 0x86, 0x49, + 0x0D, 0xFF, 0x89, 0x4A, 0x0E, 0xFF, 0x89, 0x4A, 0x0E, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x8A, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8A, 0x4A, + 0x0E, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x8B, 0x4C, 0x10, 0xFF, 0x8D, 0x51, 0x16, 0xFF, 0x91, 0x59, + 0x22, 0xFF, 0x95, 0x5E, 0x2A, 0xFF, 0x95, 0x60, 0x2E, 0xFF, 0x95, 0x5F, 0x30, 0xFF, 0x94, 0x5F, + 0x31, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x93, 0x5F, 0x32, 0xFF, 0x92, 0x5E, 0x31, 0xFF, 0x91, 0x5D, + 0x32, 0xFF, 0x8F, 0x5C, 0x32, 0xFF, 0x8E, 0x5B, 0x32, 0xFF, 0x8F, 0x5D, 0x35, 0xFF, 0x92, 0x61, + 0x3C, 0xFF, 0x95, 0x68, 0x44, 0xFF, 0xA2, 0x7A, 0x59, 0xFF, 0xB0, 0x8B, 0x6D, 0xF2, 0xBA, 0x99, + 0x7F, 0xB2, 0xC6, 0xAA, 0x91, 0x42, 0xCD, 0xB4, 0x9D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC5, 0xB0, 0x0E, 0xC0, 0xA1, + 0x87, 0x57, 0xA5, 0x7E, 0x5C, 0xC6, 0x95, 0x68, 0x44, 0xF9, 0x80, 0x4C, 0x25, 0xFF, 0x72, 0x38, + 0x11, 0xFF, 0x6C, 0x30, 0x09, 0xFF, 0x6B, 0x2F, 0x08, 0xFF, 0x6B, 0x2F, 0x07, 0xFF, 0x6D, 0x31, + 0x07, 0xFF, 0x6E, 0x32, 0x07, 0xFF, 0x71, 0x35, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x74, 0x38, + 0x08, 0xFF, 0x73, 0x39, 0x08, 0xFF, 0x72, 0x3A, 0x08, 0xFF, 0x70, 0x3A, 0x08, 0xFF, 0x68, 0x37, + 0x07, 0xFF, 0x64, 0x39, 0x0D, 0xFF, 0x75, 0x55, 0x30, 0xFF, 0xB0, 0x9F, 0x91, 0xFF, 0xDF, 0xDB, + 0xDA, 0xFF, 0xE5, 0xE4, 0xE1, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xD3, 0xCB, + 0xC3, 0xFF, 0x90, 0x86, 0x74, 0xFF, 0x9D, 0x92, 0x83, 0xFF, 0xCD, 0xC9, 0xBD, 0xFF, 0xE5, 0xE1, + 0xD9, 0xFF, 0xDF, 0xD9, 0xD1, 0xFF, 0xB4, 0xA1, 0x90, 0xFF, 0x7F, 0x60, 0x3C, 0xFF, 0x71, 0x49, + 0x1C, 0xFF, 0x70, 0x42, 0x12, 0xFF, 0x72, 0x40, 0x0C, 0xFF, 0x79, 0x44, 0x0E, 0xFF, 0x80, 0x47, + 0x0D, 0xFF, 0x85, 0x49, 0x0E, 0xFF, 0x88, 0x4A, 0x0E, 0xFF, 0x8A, 0x4A, 0x0E, 0xFF, 0x8A, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8B, 0x4C, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0E, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4C, + 0x11, 0xFF, 0x8C, 0x52, 0x1A, 0xFF, 0x91, 0x59, 0x24, 0xFF, 0x96, 0x5F, 0x2D, 0xFF, 0x96, 0x61, + 0x2F, 0xFF, 0x96, 0x61, 0x30, 0xFF, 0x94, 0x60, 0x31, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x92, 0x5E, + 0x32, 0xFF, 0x92, 0x5E, 0x32, 0xFF, 0x90, 0x5C, 0x31, 0xFF, 0x8F, 0x5C, 0x32, 0xFF, 0x90, 0x5E, + 0x36, 0xFF, 0x93, 0x63, 0x3B, 0xFF, 0x99, 0x6E, 0x4A, 0xFF, 0xA7, 0x7E, 0x5C, 0xFF, 0xB3, 0x8F, + 0x71, 0xE7, 0xC2, 0xA2, 0x88, 0x8E, 0xCC, 0xB3, 0x9B, 0x28, 0xCE, 0xB5, 0x9E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xB8, 0xA3, 0x3A, 0xAE, 0x8C, + 0x6D, 0x9C, 0x9B, 0x6F, 0x4A, 0xF3, 0x88, 0x57, 0x30, 0xFF, 0x76, 0x3E, 0x17, 0xFF, 0x6D, 0x32, + 0x0B, 0xFF, 0x6B, 0x2F, 0x08, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x6E, 0x32, + 0x07, 0xFF, 0x72, 0x35, 0x08, 0xFF, 0x74, 0x37, 0x08, 0xFF, 0x75, 0x38, 0x08, 0xFF, 0x75, 0x39, + 0x08, 0xFF, 0x75, 0x3B, 0x08, 0xFF, 0x71, 0x3B, 0x07, 0xFF, 0x6A, 0x38, 0x06, 0xFF, 0x68, 0x3B, + 0x0A, 0xFF, 0x75, 0x54, 0x2F, 0xFF, 0xAC, 0x9D, 0x8D, 0xFF, 0xE3, 0xDF, 0xDA, 0xFF, 0xE3, 0xE2, + 0xE1, 0xFF, 0xE3, 0xE1, 0xE0, 0xFF, 0xE0, 0xE0, 0xDF, 0xFF, 0xE0, 0xE2, 0xE2, 0xFF, 0xE3, 0xE5, + 0xE3, 0xFF, 0xCE, 0xC9, 0xBF, 0xFF, 0x97, 0x8A, 0x77, 0xFF, 0x90, 0x83, 0x6F, 0xFF, 0xC1, 0xB9, + 0xAA, 0xFF, 0xE0, 0xDB, 0xD4, 0xFF, 0xDE, 0xD9, 0xD3, 0xFF, 0xC3, 0xB7, 0xAA, 0xFF, 0x8E, 0x72, + 0x52, 0xFF, 0x75, 0x4D, 0x21, 0xFF, 0x71, 0x44, 0x14, 0xFF, 0x72, 0x41, 0x0E, 0xFF, 0x78, 0x44, + 0x0C, 0xFF, 0x7F, 0x46, 0x0C, 0xFF, 0x84, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x89, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8C, 0x4D, + 0x0E, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4C, 0x0E, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0E, 0xFF, 0x8C, 0x4B, 0x0F, 0xFF, 0x8D, 0x4F, 0x13, 0xFF, 0x91, 0x56, 0x1C, 0xFF, 0x95, 0x5D, + 0x27, 0xFF, 0x97, 0x60, 0x2D, 0xFF, 0x96, 0x61, 0x30, 0xFF, 0x95, 0x61, 0x31, 0xFF, 0x94, 0x60, + 0x32, 0xFF, 0x93, 0x5F, 0x31, 0xFF, 0x92, 0x5E, 0x31, 0xFF, 0x91, 0x5D, 0x32, 0xFF, 0x90, 0x5D, + 0x32, 0xFF, 0x92, 0x5F, 0x36, 0xFF, 0x95, 0x66, 0x3F, 0xFF, 0xA0, 0x75, 0x50, 0xFF, 0xAC, 0x85, + 0x64, 0xFE, 0xBA, 0x96, 0x78, 0xD1, 0xCA, 0xAC, 0x93, 0x63, 0xCF, 0xB6, 0xA0, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA5, 0x8B, 0x16, 0xBE, 0x9E, 0x81, 0x7A, 0xA6, 0x7D, + 0x5C, 0xDB, 0x91, 0x61, 0x39, 0xFF, 0x7E, 0x47, 0x1F, 0xFF, 0x71, 0x35, 0x0E, 0xFF, 0x6D, 0x31, + 0x09, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x6E, 0x32, 0x08, 0xFF, 0x70, 0x33, 0x08, 0xFF, 0x73, 0x36, + 0x09, 0xFF, 0x75, 0x38, 0x09, 0xFF, 0x76, 0x39, 0x09, 0xFF, 0x76, 0x3A, 0x08, 0xFF, 0x75, 0x3B, + 0x08, 0xFF, 0x74, 0x3B, 0x09, 0xFF, 0x6C, 0x39, 0x08, 0xFF, 0x6A, 0x3C, 0x0E, 0xFF, 0x73, 0x51, + 0x2B, 0xFF, 0xAC, 0x9B, 0x8A, 0xFF, 0xE1, 0xDD, 0xDA, 0xFF, 0xE6, 0xE5, 0xE3, 0xFF, 0xE3, 0xE3, + 0xE2, 0xFF, 0xE3, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE5, + 0xE7, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xD6, 0xD3, 0xCC, 0xFF, 0xA0, 0x97, 0x87, 0xFF, 0x84, 0x77, + 0x62, 0xFF, 0xA4, 0x9A, 0x88, 0xFF, 0xD5, 0xD0, 0xC6, 0xFF, 0xDF, 0xDC, 0xD8, 0xFF, 0xD1, 0xCB, + 0xC1, 0xFF, 0xA0, 0x89, 0x70, 0xFF, 0x7C, 0x56, 0x2B, 0xFF, 0x70, 0x45, 0x14, 0xFF, 0x70, 0x42, + 0x0C, 0xFF, 0x77, 0x45, 0x0E, 0xFF, 0x7F, 0x48, 0x0D, 0xFF, 0x84, 0x49, 0x0D, 0xFF, 0x88, 0x4B, + 0x0E, 0xFF, 0x8B, 0x4C, 0x0E, 0xFF, 0x8C, 0x4D, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4E, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4C, 0x0E, 0xFF, 0x8C, 0x4D, 0x10, 0xFF, 0x8D, 0x51, + 0x16, 0xFF, 0x92, 0x58, 0x22, 0xFF, 0x96, 0x60, 0x2B, 0xFF, 0x98, 0x62, 0x2F, 0xFF, 0x96, 0x61, + 0x30, 0xFF, 0x95, 0x60, 0x31, 0xFF, 0x94, 0x5F, 0x32, 0xFF, 0x93, 0x5F, 0x32, 0xFF, 0x92, 0x5E, + 0x32, 0xFF, 0x92, 0x5E, 0x33, 0xFF, 0x93, 0x62, 0x37, 0xFF, 0x9A, 0x6B, 0x44, 0xFF, 0xA6, 0x7C, + 0x59, 0xFF, 0xB2, 0x8B, 0x6B, 0xF8, 0xBC, 0x99, 0x7D, 0xAE, 0xCB, 0xAE, 0x96, 0x3B, 0xE3, 0xD2, + 0xC0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC2, 0xA3, 0x85, 0x05, 0xBA, 0x99, 0x7D, 0x47, 0xAC, 0x86, 0x65, 0xBD, 0x96, 0x69, + 0x45, 0xF9, 0x86, 0x52, 0x2A, 0xFF, 0x75, 0x3C, 0x14, 0xFF, 0x6D, 0x32, 0x0A, 0xFF, 0x6D, 0x31, + 0x07, 0xFF, 0x6E, 0x31, 0x07, 0xFF, 0x70, 0x33, 0x08, 0xFF, 0x73, 0x36, 0x09, 0xFF, 0x75, 0x38, + 0x09, 0xFF, 0x76, 0x39, 0x09, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x77, 0x3B, 0x08, 0xFF, 0x75, 0x3C, + 0x08, 0xFF, 0x6F, 0x3A, 0x08, 0xFF, 0x6B, 0x3B, 0x0A, 0xFF, 0x72, 0x4F, 0x27, 0xFF, 0xA8, 0x96, + 0x83, 0xFF, 0xE4, 0xE0, 0xDA, 0xFF, 0xE6, 0xE6, 0xE4, 0xFF, 0xE5, 0xE4, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE6, 0xE6, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xDC, 0xDB, 0xD5, 0xFF, 0xAA, 0xA1, + 0x92, 0xFF, 0x85, 0x76, 0x60, 0xFF, 0x95, 0x88, 0x72, 0xFF, 0xC2, 0xBC, 0xB0, 0xFF, 0xE1, 0xDE, + 0xD9, 0xFF, 0xDC, 0xD8, 0xD1, 0xFF, 0xAF, 0x9D, 0x8B, 0xFF, 0x83, 0x62, 0x3C, 0xFF, 0x73, 0x4A, + 0x1D, 0xFF, 0x6F, 0x43, 0x11, 0xFF, 0x77, 0x45, 0x0D, 0xFF, 0x7E, 0x46, 0x0D, 0xFF, 0x83, 0x49, + 0x0D, 0xFF, 0x88, 0x4B, 0x0D, 0xFF, 0x8B, 0x4C, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4E, + 0x0F, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0D, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0D, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x8D, 0x4D, + 0x0D, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8E, 0x4E, 0x12, 0xFF, 0x91, 0x56, 0x1C, 0xFF, 0x97, 0x5E, 0x27, 0xFF, 0x98, 0x62, + 0x2E, 0xFF, 0x97, 0x61, 0x30, 0xFF, 0x95, 0x61, 0x31, 0xFF, 0x94, 0x60, 0x31, 0xFF, 0x94, 0x5F, + 0x31, 0xFF, 0x93, 0x5F, 0x32, 0xFF, 0x93, 0x60, 0x34, 0xFF, 0x95, 0x64, 0x3A, 0xFF, 0x9E, 0x72, + 0x4D, 0xFF, 0xAC, 0x83, 0x61, 0xFF, 0xB6, 0x90, 0x72, 0xE8, 0xC6, 0xA4, 0x8B, 0x7C, 0xE0, 0xCE, + 0xBD, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCE, 0xB3, 0x99, 0x22, 0xB8, 0x94, 0x76, 0x8D, 0x9F, 0x74, 0x4F, 0xE7, 0x8D, 0x5B, + 0x34, 0xFF, 0x7C, 0x44, 0x1A, 0xFF, 0x71, 0x36, 0x0D, 0xFF, 0x6F, 0x32, 0x08, 0xFF, 0x70, 0x33, + 0x08, 0xFF, 0x71, 0x34, 0x08, 0xFF, 0x73, 0x36, 0x09, 0xFF, 0x75, 0x38, 0x09, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x78, 0x3C, 0x09, 0xFF, 0x78, 0x3D, 0x09, 0xFF, 0x76, 0x3D, 0x09, 0xFF, 0x72, 0x3B, + 0x07, 0xFF, 0x6D, 0x3D, 0x0D, 0xFF, 0x6F, 0x48, 0x22, 0xFF, 0xA3, 0x90, 0x7B, 0xFF, 0xE1, 0xDD, + 0xD8, 0xFF, 0xE8, 0xE9, 0xE5, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE4, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE3, 0xE2, + 0xDF, 0xFF, 0xB3, 0xAB, 0xA0, 0xFF, 0x81, 0x75, 0x5C, 0xFF, 0x85, 0x78, 0x5F, 0xFF, 0xAF, 0xA7, + 0x99, 0xFF, 0xDE, 0xDB, 0xD7, 0xFF, 0xE3, 0xDF, 0xDA, 0xFF, 0xC6, 0xBA, 0xAC, 0xFF, 0x8E, 0x71, + 0x51, 0xFF, 0x73, 0x4E, 0x21, 0xFF, 0x70, 0x46, 0x12, 0xFF, 0x75, 0x47, 0x10, 0xFF, 0x7B, 0x47, + 0x0D, 0xFF, 0x81, 0x48, 0x0D, 0xFF, 0x87, 0x4B, 0x0D, 0xFF, 0x8B, 0x4D, 0x0E, 0xFF, 0x8D, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0F, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, 0x10, 0xFF, 0x8E, 0x51, 0x16, 0xFF, 0x93, 0x5B, + 0x22, 0xFF, 0x97, 0x61, 0x2D, 0xFF, 0x97, 0x62, 0x2F, 0xFF, 0x96, 0x62, 0x30, 0xFF, 0x95, 0x60, + 0x30, 0xFF, 0x94, 0x60, 0x31, 0xFF, 0x93, 0x60, 0x32, 0xFF, 0x94, 0x61, 0x35, 0xFF, 0x98, 0x68, + 0x3F, 0xFF, 0xA3, 0x78, 0x52, 0xFF, 0xB3, 0x8D, 0x6B, 0xFB, 0xBF, 0x9B, 0x7E, 0xC2, 0xCA, 0xB0, + 0x97, 0x4F, 0xD0, 0xBA, 0xA3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xB2, + 0x97, 0x07, 0xCA, 0xAD, 0x94, 0x5C, 0xAE, 0x88, 0x68, 0xC6, 0x96, 0x67, 0x40, 0xFD, 0x82, 0x4D, + 0x24, 0xFF, 0x75, 0x3A, 0x11, 0xFF, 0x70, 0x34, 0x0A, 0xFF, 0x70, 0x33, 0x08, 0xFF, 0x71, 0x34, + 0x07, 0xFF, 0x73, 0x36, 0x08, 0xFF, 0x75, 0x37, 0x09, 0xFF, 0x78, 0x3A, 0x09, 0xFF, 0x7A, 0x3D, + 0x0A, 0xFF, 0x7A, 0x3D, 0x09, 0xFF, 0x78, 0x3F, 0x09, 0xFF, 0x76, 0x3E, 0x09, 0xFF, 0x71, 0x3C, + 0x09, 0xFF, 0x6D, 0x46, 0x19, 0xFF, 0x96, 0x7F, 0x65, 0xFF, 0xDD, 0xD9, 0xD1, 0xFF, 0xE6, 0xE6, + 0xE5, 0xFF, 0xE5, 0xE4, 0xE3, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE7, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE7, 0xE8, 0xFF, 0xE7, 0xE7, + 0xE8, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE9, 0xE8, 0xE8, 0xFF, 0xEB, 0xE9, + 0xEA, 0xFF, 0xE5, 0xE5, 0xE3, 0xFF, 0xBB, 0xB7, 0xAA, 0xFF, 0x85, 0x79, 0x60, 0xFF, 0x84, 0x72, + 0x58, 0xFF, 0x99, 0x8C, 0x7B, 0xFF, 0xCF, 0xC8, 0xC2, 0xFF, 0xE4, 0xE0, 0xDC, 0xFF, 0xD2, 0xC9, + 0xC0, 0xFF, 0x99, 0x85, 0x6D, 0xFF, 0x74, 0x52, 0x2B, 0xFF, 0x6F, 0x47, 0x16, 0xFF, 0x75, 0x45, + 0x10, 0xFF, 0x79, 0x44, 0x0C, 0xFF, 0x7F, 0x48, 0x0D, 0xFF, 0x86, 0x4A, 0x0E, 0xFF, 0x8A, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4F, 0x0F, 0xFF, 0x8F, 0x4F, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x50, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0F, 0xFF, 0x8E, 0x4E, 0x0F, 0xFF, 0x8E, 0x4E, 0x0F, 0xFF, 0x90, 0x51, + 0x13, 0xFF, 0x94, 0x59, 0x1F, 0xFF, 0x96, 0x5F, 0x29, 0xFF, 0x97, 0x61, 0x2D, 0xFF, 0x96, 0x61, + 0x2F, 0xFF, 0x95, 0x60, 0x30, 0xFF, 0x95, 0x60, 0x31, 0xFF, 0x95, 0x61, 0x33, 0xFF, 0x97, 0x65, + 0x39, 0xFF, 0x9C, 0x6E, 0x44, 0xFF, 0xA9, 0x81, 0x5D, 0xFF, 0xB8, 0x93, 0x72, 0xE8, 0xC0, 0x9E, + 0x82, 0x8D, 0xCA, 0xB1, 0x96, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xA8, + 0x8B, 0x22, 0xBA, 0x98, 0x7A, 0x9A, 0xA3, 0x78, 0x55, 0xEC, 0x8E, 0x5A, 0x30, 0xFF, 0x7C, 0x42, + 0x18, 0xFF, 0x74, 0x37, 0x0C, 0xFF, 0x72, 0x35, 0x09, 0xFF, 0x72, 0x34, 0x08, 0xFF, 0x75, 0x37, + 0x08, 0xFF, 0x77, 0x39, 0x08, 0xFF, 0x79, 0x3A, 0x09, 0xFF, 0x7B, 0x3D, 0x0A, 0xFF, 0x7C, 0x3F, + 0x0A, 0xFF, 0x7C, 0x40, 0x0A, 0xFF, 0x7B, 0x42, 0x0B, 0xFF, 0x75, 0x40, 0x0C, 0xFF, 0x6F, 0x43, + 0x16, 0xFF, 0x8D, 0x74, 0x57, 0xFF, 0xD4, 0xCD, 0xC2, 0xFF, 0xE5, 0xE5, 0xE1, 0xFF, 0xE3, 0xE4, + 0xE3, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xE9, 0xE9, 0xFF, 0xE9, 0xE8, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xE8, 0xE9, 0xE8, 0xFF, 0xC4, 0xC1, 0xBA, 0xFF, 0x90, 0x83, + 0x72, 0xFF, 0x7F, 0x6C, 0x52, 0xFF, 0x87, 0x78, 0x61, 0xFF, 0xBC, 0xB5, 0xA6, 0xFF, 0xE1, 0xDC, + 0xD6, 0xFF, 0xDE, 0xD9, 0xD2, 0xFF, 0xB0, 0xA0, 0x8E, 0xFF, 0x81, 0x64, 0x3F, 0xFF, 0x74, 0x4E, + 0x1C, 0xFF, 0x74, 0x47, 0x11, 0xFF, 0x76, 0x45, 0x0D, 0xFF, 0x7D, 0x47, 0x0E, 0xFF, 0x84, 0x4B, + 0x0E, 0xFF, 0x8A, 0x4E, 0x0F, 0xFF, 0x8E, 0x4F, 0x0E, 0xFF, 0x90, 0x50, 0x0F, 0xFF, 0x90, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x51, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x50, + 0x0F, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0F, 0xFF, 0x8F, 0x4F, 0x12, 0xFF, 0x91, 0x55, 0x1B, 0xFF, 0x95, 0x5D, 0x27, 0xFF, 0x98, 0x61, + 0x2D, 0xFF, 0x98, 0x62, 0x2F, 0xFF, 0x96, 0x61, 0x30, 0xFF, 0x95, 0x61, 0x31, 0xFF, 0x96, 0x62, + 0x34, 0xFF, 0x99, 0x67, 0x3B, 0xFF, 0xA2, 0x77, 0x4F, 0xFF, 0xB3, 0x8B, 0x67, 0xFD, 0xBE, 0x9B, + 0x7A, 0xC5, 0xCA, 0xAC, 0x93, 0x54, 0xD9, 0xC6, 0xB1, 0x07, 0xE0, 0xCE, 0xBD, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA3, 0x84, 0x06, 0xB7, 0x96, + 0x78, 0x55, 0xAF, 0x87, 0x65, 0xCC, 0x98, 0x69, 0x41, 0xFD, 0x87, 0x4E, 0x22, 0xFF, 0x78, 0x3C, + 0x11, 0xFF, 0x73, 0x36, 0x0A, 0xFF, 0x72, 0x35, 0x08, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x76, 0x39, + 0x08, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7E, 0x3F, 0x0A, 0xFF, 0x7D, 0x41, + 0x0A, 0xFF, 0x7D, 0x42, 0x0A, 0xFF, 0x7B, 0x44, 0x0D, 0xFF, 0x73, 0x42, 0x0F, 0xFF, 0x88, 0x65, + 0x41, 0xFF, 0xCE, 0xC4, 0xB3, 0xFF, 0xE4, 0xE2, 0xDF, 0xFF, 0xE6, 0xE4, 0xE4, 0xFF, 0xE5, 0xE6, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEB, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xE8, 0xEA, 0xE9, 0xFF, 0xCA, 0xC9, + 0xC3, 0xFF, 0x97, 0x8D, 0x7D, 0xFF, 0x82, 0x6F, 0x56, 0xFF, 0x7C, 0x6B, 0x51, 0xFF, 0xAE, 0xA3, + 0x91, 0xFF, 0xDE, 0xD9, 0xD4, 0xFF, 0xDD, 0xD8, 0xD5, 0xFF, 0xBB, 0xB0, 0xA5, 0xFF, 0x8C, 0x72, + 0x51, 0xFF, 0x78, 0x53, 0x23, 0xFF, 0x74, 0x48, 0x14, 0xFF, 0x75, 0x45, 0x0F, 0xFF, 0x7C, 0x47, + 0x0D, 0xFF, 0x84, 0x4A, 0x0E, 0xFF, 0x8A, 0x4E, 0x0E, 0xFF, 0x8F, 0x50, 0x0E, 0xFF, 0x8F, 0x51, + 0x0F, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x51, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8E, 0x4E, 0x10, 0xFF, 0x91, 0x53, 0x18, 0xFF, 0x95, 0x5B, + 0x24, 0xFF, 0x98, 0x60, 0x2B, 0xFF, 0x98, 0x61, 0x2E, 0xFF, 0x97, 0x62, 0x31, 0xFF, 0x96, 0x62, + 0x32, 0xFF, 0x99, 0x65, 0x37, 0xFF, 0x9F, 0x6E, 0x44, 0xFF, 0xAC, 0x82, 0x5C, 0xFF, 0xB9, 0x94, + 0x72, 0xEC, 0xCB, 0xA9, 0x8E, 0x8C, 0xDC, 0xC5, 0xB2, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xB1, 0x9A, 0x20, 0xB5, 0x92, + 0x72, 0x94, 0xA6, 0x78, 0x50, 0xEA, 0x92, 0x5C, 0x34, 0xFF, 0x7F, 0x44, 0x17, 0xFF, 0x76, 0x38, + 0x0C, 0xFF, 0x74, 0x36, 0x09, 0xFF, 0x75, 0x37, 0x09, 0xFF, 0x77, 0x38, 0x09, 0xFF, 0x79, 0x3B, + 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x81, 0x41, 0x0A, 0xFF, 0x7F, 0x43, + 0x0A, 0xFF, 0x7F, 0x44, 0x0D, 0xFF, 0x78, 0x41, 0x0E, 0xFF, 0x83, 0x59, 0x2D, 0xFF, 0xC3, 0xB5, + 0xA2, 0xFF, 0xE3, 0xE2, 0xDD, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE5, 0xE6, + 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEC, 0xEB, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEB, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, + 0xEE, 0xFF, 0xD3, 0xD1, 0xCE, 0xFF, 0xA1, 0x96, 0x87, 0xFF, 0x7F, 0x6B, 0x51, 0xFF, 0x73, 0x61, + 0x44, 0xFF, 0x93, 0x87, 0x73, 0xFF, 0xD0, 0xC9, 0xC3, 0xFF, 0xDF, 0xDB, 0xD9, 0xFF, 0xC9, 0xC1, + 0xBA, 0xFF, 0xA0, 0x8A, 0x72, 0xFF, 0x7F, 0x5D, 0x2F, 0xFF, 0x72, 0x4A, 0x16, 0xFF, 0x72, 0x45, + 0x0E, 0xFF, 0x79, 0x48, 0x0F, 0xFF, 0x83, 0x4B, 0x0E, 0xFF, 0x8A, 0x4E, 0x0E, 0xFF, 0x8E, 0x50, + 0x0F, 0xFF, 0x90, 0x51, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x10, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x52, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x51, + 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x8F, 0x4F, 0x10, 0xFF, 0x90, 0x52, + 0x16, 0xFF, 0x94, 0x59, 0x20, 0xFF, 0x98, 0x60, 0x2A, 0xFF, 0x9A, 0x63, 0x2F, 0xFF, 0x97, 0x62, + 0x31, 0xFF, 0x99, 0x64, 0x35, 0xFF, 0x9D, 0x69, 0x3D, 0xFF, 0xA4, 0x78, 0x50, 0xFF, 0xB3, 0x8C, + 0x68, 0xFC, 0xC5, 0xA1, 0x83, 0xC2, 0xD8, 0xBD, 0xA5, 0x4F, 0xDD, 0xC6, 0xAD, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xC5, 0xAE, 0x05, 0xD6, 0xBE, 0xA7, 0x4E, 0xB2, 0x8E, + 0x6D, 0xC0, 0x9B, 0x69, 0x3E, 0xFB, 0x87, 0x4F, 0x25, 0xFF, 0x79, 0x3C, 0x10, 0xFF, 0x75, 0x37, + 0x0B, 0xFF, 0x76, 0x37, 0x08, 0xFF, 0x77, 0x38, 0x08, 0xFF, 0x79, 0x3B, 0x09, 0xFF, 0x7B, 0x3E, + 0x09, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x82, 0x42, 0x0B, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x84, 0x47, + 0x0D, 0xFF, 0x81, 0x48, 0x0D, 0xFF, 0x83, 0x55, 0x25, 0xFF, 0xBF, 0xA8, 0x8D, 0xFF, 0xDF, 0xDD, + 0xD6, 0xFF, 0xE9, 0xE8, 0xE7, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE6, 0xE7, + 0xE8, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xED, + 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEC, 0xED, + 0xEE, 0xFF, 0xEC, 0xED, 0xEE, 0xFF, 0xEB, 0xED, 0xEE, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEC, 0xEE, 0xEF, 0xFF, 0xDB, 0xDD, 0xD9, 0xFF, 0xA6, 0xA0, 0x91, 0xFF, 0x7F, 0x6B, + 0x52, 0xFF, 0x71, 0x5D, 0x41, 0xFF, 0x8B, 0x7D, 0x67, 0xFF, 0xC2, 0xBA, 0xB1, 0xFF, 0xDE, 0xDA, + 0xD8, 0xFF, 0xD3, 0xCE, 0xCA, 0xFF, 0xAA, 0x98, 0x87, 0xFF, 0x85, 0x66, 0x3F, 0xFF, 0x76, 0x4F, + 0x20, 0xFF, 0x71, 0x46, 0x12, 0xFF, 0x79, 0x48, 0x0F, 0xFF, 0x81, 0x4A, 0x0E, 0xFF, 0x87, 0x4E, + 0x0F, 0xFF, 0x8D, 0x50, 0x0F, 0xFF, 0x8F, 0x51, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x94, 0x53, + 0x10, 0xFF, 0x94, 0x53, 0x10, 0xFF, 0x94, 0x53, 0x10, 0xFF, 0x94, 0x53, 0x10, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x52, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x8F, 0x4F, + 0x0F, 0xFF, 0x91, 0x52, 0x14, 0xFF, 0x94, 0x59, 0x1F, 0xFF, 0x98, 0x5F, 0x28, 0xFF, 0x98, 0x62, + 0x2E, 0xFF, 0x99, 0x64, 0x32, 0xFF, 0x9D, 0x68, 0x3A, 0xFF, 0x9F, 0x6F, 0x45, 0xFF, 0xAD, 0x83, + 0x5D, 0xFF, 0xBB, 0x97, 0x75, 0xE7, 0xC8, 0xA7, 0x8D, 0x83, 0xC5, 0xAA, 0x8C, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xB7, 0x9C, 0x18, 0xCB, 0xAC, 0x90, 0x7E, 0xA9, 0x80, + 0x5C, 0xE1, 0x93, 0x5E, 0x31, 0xFF, 0x81, 0x45, 0x19, 0xFF, 0x79, 0x3A, 0x0D, 0xFF, 0x76, 0x38, + 0x09, 0xFF, 0x77, 0x38, 0x08, 0xFF, 0x79, 0x3B, 0x08, 0xFF, 0x7C, 0x3E, 0x09, 0xFF, 0x7F, 0x40, + 0x0A, 0xFF, 0x82, 0x42, 0x0B, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x8A, 0x4B, + 0x11, 0xFF, 0x82, 0x47, 0x09, 0xFF, 0x92, 0x68, 0x35, 0xFF, 0xD4, 0xC3, 0xB9, 0xFF, 0xE8, 0xE6, + 0xE2, 0xFF, 0xEB, 0xEA, 0xE9, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE9, 0xE9, + 0xEA, 0xFF, 0xE8, 0xE9, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, 0xE9, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xEC, 0xED, + 0xEC, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xEF, 0xEF, 0xFF, 0xED, 0xF0, 0xF0, 0xFF, 0xE2, 0xE6, 0xE3, 0xFF, 0xB5, 0xAF, + 0xA6, 0xFF, 0x82, 0x70, 0x59, 0xFF, 0x6E, 0x5D, 0x40, 0xFF, 0x79, 0x6A, 0x50, 0xFF, 0xB1, 0xA7, + 0x96, 0xFF, 0xDD, 0xDA, 0xD7, 0xFF, 0xDB, 0xD8, 0xD5, 0xFF, 0xBC, 0xB0, 0xA3, 0xFF, 0x90, 0x75, + 0x54, 0xFF, 0x76, 0x53, 0x25, 0xFF, 0x72, 0x49, 0x14, 0xFF, 0x77, 0x4A, 0x13, 0xFF, 0x7F, 0x4B, + 0x10, 0xFF, 0x86, 0x4D, 0x0F, 0xFF, 0x8C, 0x50, 0x10, 0xFF, 0x91, 0x53, 0x10, 0xFF, 0x94, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, + 0x11, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, + 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, + 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x90, 0x50, 0x0F, 0xFF, 0x90, 0x52, 0x13, 0xFF, 0x92, 0x57, 0x1B, 0xFF, 0x97, 0x5E, + 0x27, 0xFF, 0x9A, 0x63, 0x2E, 0xFF, 0x9C, 0x66, 0x34, 0xFF, 0x9D, 0x6A, 0x3D, 0xFF, 0xAA, 0x7E, + 0x56, 0xFF, 0xB9, 0x91, 0x6B, 0xFC, 0xBC, 0x95, 0x76, 0xB8, 0xCC, 0xB0, 0x91, 0x3D, 0xF9, 0xFF, + 0xFB, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC9, 0xB1, 0x97, 0x02, 0xC0, 0xA3, 0x86, 0x35, 0xBA, 0x93, 0x70, 0xAF, 0xA0, 0x71, + 0x49, 0xF5, 0x90, 0x56, 0x28, 0xFF, 0x80, 0x42, 0x15, 0xFF, 0x79, 0x3A, 0x0C, 0xFF, 0x78, 0x39, + 0x08, 0xFF, 0x79, 0x3A, 0x08, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7E, 0x40, 0x09, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x84, 0x44, 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x8B, 0x4C, + 0x0F, 0xFF, 0x8C, 0x4D, 0x11, 0xFF, 0x84, 0x4F, 0x10, 0xFF, 0xAA, 0x8F, 0x6E, 0xFF, 0xE1, 0xDF, + 0xDA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, + 0xEB, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEE, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEE, 0xF0, 0xF0, 0xFF, 0xEE, 0xF1, 0xF1, 0xFF, 0xEB, 0xED, + 0xED, 0xFF, 0xC3, 0xC1, 0xBA, 0xFF, 0x85, 0x75, 0x5F, 0xFF, 0x71, 0x5F, 0x3F, 0xFF, 0x7C, 0x6C, + 0x49, 0xFF, 0x9E, 0x92, 0x7D, 0xFF, 0xD2, 0xCD, 0xC9, 0xFF, 0xDF, 0xDC, 0xDB, 0xFF, 0xCB, 0xC2, + 0xBB, 0xFF, 0x9C, 0x88, 0x70, 0xFF, 0x7A, 0x59, 0x31, 0xFF, 0x73, 0x4C, 0x19, 0xFF, 0x78, 0x49, + 0x13, 0xFF, 0x7D, 0x49, 0x10, 0xFF, 0x85, 0x4E, 0x11, 0xFF, 0x8C, 0x50, 0x11, 0xFF, 0x91, 0x53, + 0x11, 0xFF, 0x95, 0x55, 0x12, 0xFF, 0x96, 0x56, 0x12, 0xFF, 0x96, 0x55, 0x12, 0xFF, 0x96, 0x55, + 0x12, 0xFF, 0x96, 0x55, 0x11, 0xFF, 0x96, 0x55, 0x11, 0xFF, 0x96, 0x55, 0x11, 0xFF, 0x96, 0x56, + 0x11, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x56, + 0x11, 0xFF, 0x96, 0x56, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x55, + 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x55, 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x55, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x52, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x8F, 0x50, 0x0E, 0xFF, 0x91, 0x53, 0x12, 0xFF, 0x93, 0x58, + 0x1C, 0xFF, 0x98, 0x5F, 0x26, 0xFF, 0x9B, 0x64, 0x2E, 0xFF, 0x9C, 0x68, 0x36, 0xFF, 0xA4, 0x76, + 0x4B, 0xFF, 0xB2, 0x89, 0x61, 0xFF, 0xB6, 0x8C, 0x6A, 0xDE, 0xE2, 0xC7, 0xAD, 0x69, 0xFE, 0xFF, + 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF4, 0xE8, 0xDB, 0x0A, 0xC3, 0xA1, 0x84, 0x62, 0xB0, 0x81, 0x58, 0xD8, 0x9A, 0x66, + 0x3D, 0xFD, 0x8B, 0x4F, 0x20, 0xFF, 0x7D, 0x3E, 0x0F, 0xFF, 0x7A, 0x3A, 0x0A, 0xFF, 0x7B, 0x3B, + 0x09, 0xFF, 0x7C, 0x3D, 0x09, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x83, 0x44, + 0x0C, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x88, 0x49, 0x0D, 0xFF, 0x8A, 0x4B, 0x0E, 0xFF, 0x8B, 0x4C, + 0x0E, 0xFF, 0x8A, 0x4D, 0x0F, 0xFF, 0x8A, 0x51, 0x13, 0xFF, 0x8A, 0x5B, 0x20, 0xFF, 0xB6, 0x9F, + 0x84, 0xFF, 0xE8, 0xE4, 0xE0, 0xFF, 0xEE, 0xED, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEB, 0xED, + 0xED, 0xFF, 0xEB, 0xED, 0xED, 0xFF, 0xEB, 0xED, 0xED, 0xFF, 0xEC, 0xED, 0xEC, 0xFF, 0xEC, 0xED, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEC, 0xED, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, + 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xF1, 0xF0, 0xFF, 0xED, 0xF0, 0xF0, 0xFF, 0xEF, 0xF1, + 0xF2, 0xFF, 0xED, 0xEF, 0xF0, 0xFF, 0xCE, 0xCD, 0xC9, 0xFF, 0x8E, 0x81, 0x6F, 0xFF, 0x75, 0x64, + 0x44, 0xFF, 0x77, 0x65, 0x42, 0xFF, 0x8F, 0x80, 0x67, 0xFF, 0xC9, 0xC5, 0xBB, 0xFF, 0xE2, 0xDF, + 0xDE, 0xFF, 0xD8, 0xD3, 0xCD, 0xFF, 0xB0, 0xA2, 0x8F, 0xFF, 0x85, 0x6A, 0x46, 0xFF, 0x79, 0x54, + 0x23, 0xFF, 0x78, 0x4C, 0x18, 0xFF, 0x7C, 0x4C, 0x12, 0xFF, 0x83, 0x4E, 0x12, 0xFF, 0x8B, 0x51, + 0x12, 0xFF, 0x91, 0x55, 0x13, 0xFF, 0x95, 0x56, 0x13, 0xFF, 0x96, 0x57, 0x13, 0xFF, 0x97, 0x57, + 0x13, 0xFF, 0x97, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, + 0x13, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x58, + 0x12, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x98, 0x57, 0x12, 0xFF, 0x98, 0x57, 0x12, 0xFF, 0x98, 0x57, + 0x12, 0xFF, 0x98, 0x57, 0x11, 0xFF, 0x97, 0x56, 0x11, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x97, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x56, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x55, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x94, 0x54, + 0x10, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x91, 0x53, + 0x13, 0xFF, 0x94, 0x57, 0x1A, 0xFF, 0x98, 0x5E, 0x26, 0xFF, 0x9C, 0x66, 0x32, 0xFF, 0xA0, 0x6F, + 0x40, 0xFF, 0xAE, 0x83, 0x59, 0xFF, 0xB6, 0x8A, 0x66, 0xF1, 0xD6, 0xBD, 0xA0, 0x9B, 0xE3, 0xCF, + 0xBB, 0x26, 0xDC, 0xC7, 0xB0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xF3, 0xEA, 0x1F, 0xC9, 0xA6, 0x88, 0x8D, 0xA9, 0x77, 0x4C, 0xF1, 0x92, 0x5D, + 0x32, 0xFF, 0x86, 0x48, 0x18, 0xFF, 0x7B, 0x3C, 0x0C, 0xFF, 0x7C, 0x3C, 0x0A, 0xFF, 0x7D, 0x3C, + 0x09, 0xFF, 0x7F, 0x3F, 0x09, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x86, 0x47, + 0x0C, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8D, 0x4D, 0x0F, 0xFF, 0x8E, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4F, 0x0F, 0xFF, 0x8F, 0x51, 0x11, 0xFF, 0x8D, 0x53, 0x13, 0xFF, 0x94, 0x68, + 0x2D, 0xFF, 0xCA, 0xB3, 0x9C, 0xFF, 0xED, 0xE9, 0xE5, 0xFF, 0xEF, 0xEE, 0xEF, 0xFF, 0xED, 0xED, + 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF2, 0xF1, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF0, 0xF2, + 0xF3, 0xFF, 0xF2, 0xF3, 0xF4, 0xFF, 0xF1, 0xF2, 0xF4, 0xFF, 0xD9, 0xD8, 0xD4, 0xFF, 0x95, 0x8A, + 0x73, 0xFF, 0x78, 0x66, 0x44, 0xFF, 0x7E, 0x6A, 0x46, 0xFF, 0x85, 0x73, 0x55, 0xFF, 0xBB, 0xB2, + 0xA2, 0xFF, 0xE2, 0xDF, 0xDC, 0xFF, 0xDF, 0xDA, 0xD7, 0xFF, 0xBC, 0xB2, 0xA4, 0xFF, 0x8F, 0x77, + 0x56, 0xFF, 0x7D, 0x5A, 0x2C, 0xFF, 0x78, 0x4E, 0x1A, 0xFF, 0x7A, 0x4B, 0x14, 0xFF, 0x82, 0x4E, + 0x12, 0xFF, 0x8B, 0x51, 0x13, 0xFF, 0x91, 0x56, 0x13, 0xFF, 0x96, 0x58, 0x13, 0xFF, 0x97, 0x59, + 0x14, 0xFF, 0x98, 0x59, 0x13, 0xFF, 0x99, 0x5A, 0x14, 0xFF, 0x9A, 0x59, 0x14, 0xFF, 0x99, 0x59, + 0x14, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x99, 0x5A, + 0x14, 0xFF, 0x9A, 0x59, 0x14, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x59, + 0x13, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x98, 0x58, 0x12, 0xFF, 0x99, 0x58, 0x12, 0xFF, 0x98, 0x58, + 0x11, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x98, 0x57, 0x11, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x56, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x55, + 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x91, 0x51, + 0x0E, 0xFF, 0x92, 0x53, 0x12, 0xFF, 0x94, 0x57, 0x1B, 0xFF, 0x9A, 0x60, 0x29, 0xFF, 0x9F, 0x6B, + 0x39, 0xFF, 0xA8, 0x79, 0x4C, 0xFF, 0xB3, 0x87, 0x62, 0xFC, 0xBB, 0x9C, 0x7A, 0xC2, 0xCA, 0xAB, + 0x8E, 0x49, 0xD1, 0xBB, 0xA0, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xC1, + 0xB0, 0x03, 0xDB, 0xC5, 0xB0, 0x3A, 0xBB, 0x96, 0x76, 0xBA, 0xA4, 0x72, 0x44, 0xF9, 0x8F, 0x56, + 0x26, 0xFF, 0x82, 0x44, 0x12, 0xFF, 0x7C, 0x3C, 0x0B, 0xFF, 0x7E, 0x3D, 0x0A, 0xFF, 0x80, 0x3E, + 0x0A, 0xFF, 0x82, 0x41, 0x09, 0xFF, 0x85, 0x44, 0x0A, 0xFF, 0x87, 0x46, 0x0B, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x53, 0x10, 0xFF, 0x92, 0x53, 0x10, 0xFF, 0x90, 0x53, 0x11, 0xFF, 0x89, 0x56, + 0x18, 0xFF, 0x9E, 0x76, 0x42, 0xFF, 0xD8, 0xC8, 0xB9, 0xFF, 0xF2, 0xED, 0xE8, 0xFF, 0xEE, 0xED, + 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEF, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF0, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF2, 0xF3, 0xF5, 0xFF, 0xE5, 0xE5, + 0xE2, 0xFF, 0xA4, 0x9D, 0x8D, 0xFF, 0x7B, 0x6A, 0x4C, 0xFF, 0x7A, 0x64, 0x42, 0xFF, 0x7A, 0x65, + 0x45, 0xFF, 0xAA, 0x9D, 0x89, 0xFF, 0xDB, 0xD7, 0xD4, 0xFF, 0xE5, 0xE2, 0xE0, 0xFF, 0xCC, 0xC7, + 0xBD, 0xFF, 0xA5, 0x92, 0x7A, 0xFF, 0x84, 0x64, 0x38, 0xFF, 0x79, 0x52, 0x1E, 0xFF, 0x79, 0x4D, + 0x15, 0xFF, 0x7F, 0x4F, 0x14, 0xFF, 0x8A, 0x54, 0x13, 0xFF, 0x92, 0x57, 0x14, 0xFF, 0x96, 0x59, + 0x14, 0xFF, 0x98, 0x5A, 0x15, 0xFF, 0x9A, 0x5A, 0x14, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, + 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, + 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, + 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5A, + 0x14, 0xFF, 0x9B, 0x5A, 0x14, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x99, 0x58, + 0x12, 0xFF, 0x99, 0x57, 0x11, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x93, 0x52, + 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x52, 0x12, 0xFF, 0x95, 0x57, 0x1B, 0xFF, 0x9D, 0x64, + 0x2F, 0xFF, 0xA4, 0x72, 0x43, 0xFF, 0xB0, 0x81, 0x57, 0xFF, 0xC6, 0xA2, 0x80, 0xDD, 0xC7, 0xA7, + 0x8B, 0x74, 0xD8, 0xBB, 0x9F, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xC1, + 0xA4, 0x0A, 0xC6, 0xA7, 0x88, 0x5E, 0xB1, 0x87, 0x64, 0xD6, 0xA0, 0x6A, 0x39, 0xFC, 0x8D, 0x51, + 0x20, 0xFF, 0x7E, 0x3F, 0x0F, 0xFF, 0x7D, 0x3D, 0x0A, 0xFF, 0x7F, 0x3D, 0x0A, 0xFF, 0x81, 0x40, + 0x0A, 0xFF, 0x84, 0x43, 0x0A, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x89, 0x48, 0x0C, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x94, 0x54, 0x10, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0E, 0xFF, 0x8C, 0x53, + 0x0F, 0xFF, 0x8F, 0x5B, 0x1B, 0xFF, 0xA7, 0x87, 0x5D, 0xFF, 0xE2, 0xD8, 0xCE, 0xFF, 0xF0, 0xEE, + 0xEC, 0xFF, 0xEE, 0xEE, 0xEF, 0xFF, 0xEC, 0xEE, 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xED, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, + 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF3, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF2, 0xF2, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF2, + 0xF5, 0xFF, 0xE8, 0xE9, 0xE8, 0xFF, 0xB4, 0xB0, 0xA4, 0xFF, 0x83, 0x75, 0x5A, 0xFF, 0x7A, 0x66, + 0x45, 0xFF, 0x76, 0x62, 0x3F, 0xFF, 0x9E, 0x91, 0x7B, 0xFF, 0xD9, 0xD4, 0xCF, 0xFF, 0xE4, 0xE1, + 0xE0, 0xFF, 0xD8, 0xD3, 0xCE, 0xFF, 0xAE, 0xA0, 0x8E, 0xFF, 0x8A, 0x6E, 0x49, 0xFF, 0x7B, 0x56, + 0x27, 0xFF, 0x76, 0x4D, 0x18, 0xFF, 0x7E, 0x50, 0x14, 0xFF, 0x88, 0x53, 0x14, 0xFF, 0x8F, 0x57, + 0x15, 0xFF, 0x95, 0x59, 0x15, 0xFF, 0x99, 0x5B, 0x15, 0xFF, 0x9B, 0x5B, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5D, 0x16, 0xFF, 0x9D, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x16, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9C, 0x5C, 0x14, 0xFF, 0x9B, 0x5B, + 0x14, 0xFF, 0x9B, 0x59, 0x13, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x9A, 0x58, + 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x9A, 0x58, + 0x10, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x98, 0x58, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x55, 0x0F, 0xFF, 0x95, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x93, 0x53, 0x12, 0xFF, 0x99, 0x5C, + 0x22, 0xFF, 0xA1, 0x6C, 0x3B, 0xFF, 0xA7, 0x78, 0x4E, 0xFF, 0xC2, 0x9C, 0x76, 0xF3, 0xD4, 0xB1, + 0x8E, 0x9A, 0xD5, 0xBA, 0xA3, 0x2C, 0xA7, 0x96, 0x7E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xB7, + 0x97, 0x18, 0xC8, 0xA9, 0x8A, 0x84, 0xA8, 0x7C, 0x56, 0xE9, 0x9B, 0x63, 0x33, 0xFD, 0x88, 0x4B, + 0x1A, 0xFF, 0x80, 0x40, 0x0D, 0xFF, 0x80, 0x3E, 0x0A, 0xFF, 0x81, 0x3F, 0x0A, 0xFF, 0x83, 0x43, + 0x0A, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x88, 0x49, 0x0C, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x96, 0x56, 0x10, 0xFF, 0x96, 0x56, 0x0F, 0xFF, 0x97, 0x57, 0x10, 0xFF, 0x94, 0x56, + 0x0F, 0xFF, 0x90, 0x56, 0x12, 0xFF, 0x92, 0x62, 0x27, 0xFF, 0xB6, 0x9B, 0x7D, 0xFF, 0xE8, 0xE2, + 0xD5, 0xFF, 0xF3, 0xF0, 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF2, 0xF2, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF1, 0xF1, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF4, 0xFF, 0xEB, 0xED, 0xEE, 0xFF, 0xC3, 0xBF, 0xB8, 0xFF, 0x92, 0x83, + 0x68, 0xFF, 0x7D, 0x68, 0x44, 0xFF, 0x71, 0x5C, 0x38, 0xFF, 0x8C, 0x7D, 0x63, 0xFF, 0xCF, 0xCA, + 0xBF, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xDD, 0xDB, 0xD7, 0xFF, 0xC1, 0xB7, 0xAC, 0xFF, 0x96, 0x7E, + 0x60, 0xFF, 0x7B, 0x5B, 0x2D, 0xFF, 0x77, 0x51, 0x1B, 0xFF, 0x7D, 0x52, 0x19, 0xFF, 0x87, 0x54, + 0x16, 0xFF, 0x8F, 0x57, 0x15, 0xFF, 0x95, 0x5A, 0x17, 0xFF, 0x99, 0x5C, 0x18, 0xFF, 0x9C, 0x5D, + 0x17, 0xFF, 0x9D, 0x5E, 0x18, 0xFF, 0x9D, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9C, 0x5C, 0x14, 0xFF, 0x9C, 0x5B, + 0x13, 0xFF, 0x9B, 0x5A, 0x12, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x9B, 0x59, + 0x11, 0xFF, 0x9A, 0x5A, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x59, + 0x11, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x95, 0x55, 0x10, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x94, 0x55, + 0x15, 0xFF, 0x9C, 0x63, 0x2B, 0xFF, 0xA3, 0x75, 0x47, 0xFF, 0xC2, 0x99, 0x70, 0xFF, 0xD8, 0xB4, + 0x89, 0xBC, 0xB9, 0xA4, 0x8B, 0x41, 0x00, 0x24, 0x4C, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9, 0xAC, + 0x8E, 0x2C, 0xC0, 0x97, 0x73, 0xA9, 0xA4, 0x74, 0x49, 0xF6, 0x96, 0x5C, 0x2B, 0xFE, 0x87, 0x49, + 0x18, 0xFF, 0x81, 0x41, 0x0D, 0xFF, 0x81, 0x40, 0x0A, 0xFF, 0x83, 0x42, 0x0A, 0xFF, 0x86, 0x45, + 0x0A, 0xFF, 0x88, 0x48, 0x0B, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x53, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x99, 0x5A, + 0x13, 0xFF, 0x99, 0x5B, 0x15, 0xFF, 0x92, 0x5C, 0x19, 0xFF, 0x9C, 0x71, 0x38, 0xFF, 0xC1, 0xAE, + 0x94, 0xFF, 0xE9, 0xE7, 0xDE, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xEB, 0xED, + 0xEE, 0xFF, 0xEC, 0xED, 0xEE, 0xFF, 0xEC, 0xEE, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xEE, + 0xED, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, 0xF2, 0xFF, 0xEF, 0xF0, + 0xF2, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, 0xF2, 0xFF, 0xEA, 0xEC, 0xED, 0xFF, 0xD0, 0xD0, + 0xCB, 0xFF, 0x99, 0x8F, 0x78, 0xFF, 0x7C, 0x67, 0x45, 0xFF, 0x74, 0x5E, 0x38, 0xFF, 0x8C, 0x78, + 0x5A, 0xFF, 0xC6, 0xBC, 0xAE, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0xE0, 0xE0, 0xDF, 0xFF, 0xCC, 0xC5, + 0xBC, 0xFF, 0xA1, 0x8F, 0x77, 0xFF, 0x7F, 0x62, 0x39, 0xFF, 0x78, 0x53, 0x21, 0xFF, 0x7E, 0x52, + 0x1A, 0xFF, 0x85, 0x53, 0x17, 0xFF, 0x8E, 0x58, 0x18, 0xFF, 0x95, 0x5A, 0x19, 0xFF, 0x99, 0x5D, + 0x18, 0xFF, 0x9D, 0x5F, 0x19, 0xFF, 0x9E, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, + 0x1A, 0xFF, 0xA0, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0xA0, 0x60, 0x1A, 0xFF, 0x9F, 0x60, + 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, 0x1A, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0xA0, 0x60, 0x19, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0xA0, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x18, 0xFF, 0x9F, 0x5F, 0x17, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9E, 0x5C, 0x15, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0x9C, 0x5A, 0x12, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x99, 0x59, 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x98, 0x5A, 0x1B, 0xFF, 0xA2, 0x71, 0x3D, 0xFF, 0xB9, 0x8C, 0x61, 0xFF, 0xD4, 0xAC, + 0x81, 0xD9, 0xA8, 0x92, 0x71, 0x62, 0x03, 0x26, 0x4C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFD, 0x03, 0xCE, 0xB1, + 0x94, 0x45, 0xB3, 0x83, 0x56, 0xCB, 0xA2, 0x6E, 0x40, 0xFD, 0x93, 0x5A, 0x29, 0xFF, 0x85, 0x46, + 0x14, 0xFF, 0x82, 0x41, 0x0C, 0xFF, 0x83, 0x42, 0x0A, 0xFF, 0x85, 0x44, 0x0A, 0xFF, 0x88, 0x47, + 0x0B, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x99, 0x58, + 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9D, 0x5F, + 0x17, 0xFF, 0x9D, 0x5F, 0x19, 0xFF, 0x99, 0x5D, 0x17, 0xFF, 0x97, 0x63, 0x20, 0xFF, 0xA3, 0x7A, + 0x48, 0xFF, 0xCD, 0xBF, 0xAD, 0xFF, 0xE8, 0xE8, 0xE2, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xE9, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEE, 0xF0, + 0xF0, 0xFF, 0xEE, 0xEF, 0xF0, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xED, 0xEF, + 0xEF, 0xFF, 0xDA, 0xDA, 0xD7, 0xFF, 0xA9, 0xA0, 0x90, 0xFF, 0x80, 0x6D, 0x4B, 0xFF, 0x73, 0x60, + 0x39, 0xFF, 0x82, 0x6F, 0x4E, 0xFF, 0xB6, 0xAA, 0x96, 0xFF, 0xDF, 0xE0, 0xDB, 0xFF, 0xE1, 0xE2, + 0xE1, 0xFF, 0xD7, 0xD4, 0xCC, 0xFF, 0xB4, 0xA8, 0x93, 0xFF, 0x89, 0x71, 0x4A, 0xFF, 0x7C, 0x5B, + 0x2A, 0xFF, 0x7E, 0x56, 0x20, 0xFF, 0x84, 0x56, 0x1A, 0xFF, 0x8C, 0x58, 0x19, 0xFF, 0x94, 0x5C, + 0x1A, 0xFF, 0x9B, 0x5F, 0x1B, 0xFF, 0x9E, 0x60, 0x1A, 0xFF, 0x9F, 0x61, 0x1B, 0xFF, 0xA0, 0x61, + 0x1B, 0xFF, 0xA0, 0x61, 0x1B, 0xFF, 0xA1, 0x62, 0x1C, 0xFF, 0xA1, 0x62, 0x1C, 0xFF, 0xA1, 0x62, + 0x1C, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1A, 0xFF, 0xA1, 0x61, 0x19, 0xFF, 0xA0, 0x60, 0x18, 0xFF, 0x9F, 0x5E, 0x16, 0xFF, 0x9E, 0x5D, + 0x13, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9C, 0x5B, + 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x99, 0x58, + 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x97, 0x56, 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x94, 0x54, + 0x0F, 0xFF, 0x94, 0x55, 0x13, 0xFF, 0x9F, 0x67, 0x2D, 0xFF, 0xB3, 0x85, 0x56, 0xFF, 0xC5, 0x9F, + 0x75, 0xEC, 0xC5, 0xA7, 0x87, 0x7F, 0xC6, 0xB3, 0xA0, 0x1B, 0xA8, 0xA0, 0x96, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0x0B, 0xD7, 0xB8, + 0x9D, 0x5D, 0xAB, 0x7C, 0x4C, 0xE4, 0x9D, 0x69, 0x39, 0xFF, 0x92, 0x56, 0x25, 0xFF, 0x84, 0x44, + 0x10, 0xFF, 0x84, 0x43, 0x0C, 0xFF, 0x85, 0x43, 0x0A, 0xFF, 0x88, 0x47, 0x0B, 0xFF, 0x8A, 0x49, + 0x0C, 0xFF, 0x8D, 0x4C, 0x0C, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x93, 0x53, + 0x0F, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9B, 0x5A, + 0x12, 0xFF, 0x9D, 0x5C, 0x14, 0xFF, 0x9E, 0x5F, 0x17, 0xFF, 0xA0, 0x61, 0x19, 0xFF, 0xA2, 0x63, + 0x1B, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0x9F, 0x62, 0x1B, 0xFF, 0x9C, 0x61, 0x1D, 0xFF, 0x9A, 0x66, + 0x27, 0xFF, 0xAC, 0x89, 0x5C, 0xFF, 0xD3, 0xCB, 0xBC, 0xFF, 0xE8, 0xE8, 0xE5, 0xFF, 0xE9, 0xEA, + 0xEB, 0xFF, 0xE8, 0xEA, 0xEA, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEA, 0xFF, 0xEA, 0xEB, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEE, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xE6, 0xE6, 0xE5, 0xFF, 0xBA, 0xB4, 0xA7, 0xFF, 0x81, 0x70, + 0x4E, 0xFF, 0x73, 0x5E, 0x36, 0xFF, 0x84, 0x70, 0x4B, 0xFF, 0xAA, 0x9C, 0x84, 0xFF, 0xD9, 0xD7, + 0xD0, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xDF, 0xDB, 0xD8, 0xFF, 0xBF, 0xB6, 0xA7, 0xFF, 0x91, 0x7B, + 0x5A, 0xFF, 0x7F, 0x5F, 0x31, 0xFF, 0x7E, 0x56, 0x21, 0xFF, 0x83, 0x55, 0x1C, 0xFF, 0x8C, 0x58, + 0x1A, 0xFF, 0x95, 0x5C, 0x1C, 0xFF, 0x9A, 0x60, 0x1B, 0xFF, 0x9F, 0x62, 0x1B, 0xFF, 0xA0, 0x63, + 0x1C, 0xFF, 0xA1, 0x63, 0x1C, 0xFF, 0xA2, 0x64, 0x1D, 0xFF, 0xA3, 0x64, 0x1D, 0xFF, 0xA2, 0x64, + 0x1C, 0xFF, 0xA3, 0x63, 0x1C, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA2, 0x64, 0x1B, 0xFF, 0xA2, 0x64, + 0x1C, 0xFF, 0xA3, 0x64, 0x1C, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA3, 0x64, 0x1D, 0xFF, 0xA2, 0x63, + 0x1C, 0xFF, 0xA2, 0x63, 0x1D, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA3, 0x64, 0x1C, 0xFF, 0xA2, 0x64, + 0x1C, 0xFF, 0xA3, 0x64, 0x1C, 0xFF, 0xA2, 0x63, 0x1B, 0xFF, 0xA2, 0x62, 0x1A, 0xFF, 0xA1, 0x61, + 0x18, 0xFF, 0xA0, 0x5E, 0x15, 0xFF, 0x9E, 0x5D, 0x12, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9D, 0x5C, + 0x11, 0xFF, 0x9D, 0x5C, 0x11, 0xFF, 0x9C, 0x5C, 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, + 0x10, 0xFF, 0x9A, 0x59, 0x10, 0xFF, 0x99, 0x58, 0x0F, 0xFF, 0x98, 0x57, 0x0F, 0xFF, 0x96, 0x56, + 0x10, 0xFF, 0x95, 0x56, 0x12, 0xFF, 0x9B, 0x5E, 0x1E, 0xFF, 0xAC, 0x7B, 0x49, 0xFF, 0xB8, 0x90, + 0x65, 0xF6, 0xC9, 0xAC, 0x8B, 0x9F, 0xDB, 0xC3, 0xA7, 0x29, 0xDB, 0xC2, 0xA9, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE0, 0xD4, 0x15, 0xCC, 0xAC, + 0x8D, 0x7C, 0xAD, 0x7D, 0x4D, 0xED, 0x9C, 0x66, 0x34, 0xFF, 0x8F, 0x51, 0x1C, 0xFF, 0x85, 0x44, + 0x0F, 0xFF, 0x86, 0x44, 0x0C, 0xFF, 0x88, 0x46, 0x0B, 0xFF, 0x8A, 0x49, 0x0B, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8F, 0x4E, 0x0D, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x94, 0x52, 0x0E, 0xFF, 0x96, 0x54, + 0x0F, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9F, 0x60, + 0x18, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA3, 0x65, 0x1D, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA3, 0x65, 0x1E, 0xFF, 0xA2, 0x65, 0x1E, 0xFF, 0x9F, 0x63, 0x1E, 0xFF, 0x9B, 0x62, + 0x1E, 0xFF, 0x9B, 0x69, 0x2A, 0xFF, 0xB5, 0x95, 0x6E, 0xFF, 0xD9, 0xD3, 0xCA, 0xFF, 0xE8, 0xE8, + 0xE6, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE7, 0xE9, 0xE9, 0xFF, 0xE6, 0xE8, 0xE8, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, + 0xE9, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xED, + 0xEE, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEC, 0xEC, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xC8, 0xC5, + 0xBC, 0xFF, 0x89, 0x7B, 0x5F, 0xFF, 0x73, 0x61, 0x3B, 0xFF, 0x7D, 0x68, 0x43, 0xFF, 0x9B, 0x8A, + 0x6F, 0xFF, 0xD2, 0xCF, 0xC1, 0xFF, 0xE5, 0xE4, 0xE4, 0xFF, 0xE2, 0xE0, 0xDE, 0xFF, 0xCF, 0xCB, + 0xC0, 0xFF, 0xA2, 0x92, 0x7A, 0xFF, 0x87, 0x69, 0x3E, 0xFF, 0x7F, 0x5A, 0x26, 0xFF, 0x81, 0x57, + 0x1E, 0xFF, 0x89, 0x59, 0x1D, 0xFF, 0x93, 0x5E, 0x1D, 0xFF, 0x9B, 0x61, 0x1D, 0xFF, 0x9F, 0x63, + 0x1D, 0xFF, 0xA1, 0x64, 0x1D, 0xFF, 0xA2, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1D, 0xFF, 0xA3, 0x64, 0x1B, 0xFF, 0xA2, 0x62, 0x17, 0xFF, 0xA0, 0x60, 0x15, 0xFF, 0x9F, 0x5E, + 0x13, 0xFF, 0x9F, 0x5D, 0x13, 0xFF, 0x9E, 0x5D, 0x12, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9D, 0x5C, + 0x11, 0xFF, 0x9C, 0x5B, 0x10, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x97, 0x56, + 0x0F, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x9A, 0x5C, 0x1B, 0xFF, 0xA9, 0x71, 0x3A, 0xFF, 0xB6, 0x87, + 0x58, 0xFB, 0xCC, 0xB0, 0x8B, 0xBB, 0xE0, 0xC6, 0xAC, 0x3A, 0xDF, 0xCA, 0xB2, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC9, 0xAF, 0x25, 0xC8, 0xA6, + 0x81, 0x97, 0xAA, 0x78, 0x45, 0xF4, 0x9B, 0x61, 0x2F, 0xFF, 0x8C, 0x4D, 0x18, 0xFF, 0x87, 0x45, + 0x0F, 0xFF, 0x88, 0x45, 0x0C, 0xFF, 0x8A, 0x47, 0x0B, 0xFF, 0x8C, 0x4B, 0x0C, 0xFF, 0x8E, 0x4E, + 0x0D, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x93, 0x52, 0x0E, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x98, 0x56, + 0x10, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0xA0, 0x61, 0x1A, 0xFF, 0xA2, 0x64, + 0x1D, 0xFF, 0xA4, 0x66, 0x1F, 0xFF, 0xA4, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xA5, 0x67, + 0x20, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xA5, 0x66, 0x1F, 0xFF, 0xA3, 0x66, 0x1F, 0xFF, 0x9F, 0x65, + 0x1D, 0xFF, 0x9B, 0x62, 0x1F, 0xFF, 0xA1, 0x72, 0x33, 0xFF, 0xBC, 0xA4, 0x86, 0xFF, 0xE0, 0xDC, + 0xD6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, + 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, + 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEA, 0xEB, 0xEC, 0xFF, 0xEA, 0xEB, 0xEC, 0xFF, 0xEB, 0xEB, 0xED, 0xFF, 0xEB, 0xEA, + 0xEC, 0xFF, 0xD6, 0xD3, 0xCE, 0xFF, 0x93, 0x87, 0x6C, 0xFF, 0x7A, 0x66, 0x3F, 0xFF, 0x82, 0x6D, + 0x45, 0xFF, 0x92, 0x7F, 0x5E, 0xFF, 0xC7, 0xC0, 0xB0, 0xFF, 0xE6, 0xE3, 0xE2, 0xFF, 0xE4, 0xE0, + 0xE1, 0xFF, 0xD7, 0xD3, 0xCC, 0xFF, 0xB0, 0xA4, 0x90, 0xFF, 0x8E, 0x74, 0x4E, 0xFF, 0x80, 0x5D, + 0x2D, 0xFF, 0x7F, 0x57, 0x20, 0xFF, 0x87, 0x5A, 0x1E, 0xFF, 0x91, 0x5D, 0x1E, 0xFF, 0x98, 0x61, + 0x1E, 0xFF, 0x9E, 0x63, 0x1E, 0xFF, 0xA1, 0x66, 0x1E, 0xFF, 0xA4, 0x66, 0x1E, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x66, 0x1F, 0xFF, 0xA5, 0x66, 0x1F, 0xFF, 0xA6, 0x66, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x20, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xA5, 0x67, + 0x20, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x66, 0x1D, 0xFF, 0xA4, 0x64, 0x1A, 0xFF, 0xA2, 0x62, + 0x17, 0xFF, 0xA1, 0x5F, 0x14, 0xFF, 0x9F, 0x5E, 0x13, 0xFF, 0xA0, 0x5D, 0x12, 0xFF, 0x9E, 0x5D, + 0x11, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x99, 0x57, + 0x0F, 0xFF, 0x97, 0x56, 0x0F, 0xFF, 0x98, 0x5A, 0x17, 0xFF, 0xA7, 0x6C, 0x31, 0xFF, 0xB4, 0x80, + 0x4D, 0xFD, 0xC8, 0xAA, 0x85, 0xCC, 0xDD, 0xC8, 0xB0, 0x50, 0xE0, 0xCA, 0xB4, 0x0A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xC9, 0xB0, 0x03, 0xDB, 0xC1, 0xA5, 0x2F, 0xC0, 0x9E, + 0x7A, 0xB0, 0xAA, 0x75, 0x40, 0xF8, 0x9A, 0x5F, 0x2C, 0xFF, 0x8D, 0x4D, 0x17, 0xFF, 0x88, 0x46, + 0x0D, 0xFF, 0x8A, 0x47, 0x0B, 0xFF, 0x8C, 0x49, 0x0C, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x99, 0x57, 0x11, 0xFF, 0x9B, 0x5A, + 0x14, 0xFF, 0x9F, 0x5F, 0x19, 0xFF, 0xA2, 0x64, 0x1D, 0xFF, 0xA4, 0x66, 0x1F, 0xFF, 0xA5, 0x68, + 0x21, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x69, + 0x22, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA3, 0x67, + 0x20, 0xFF, 0xA0, 0x66, 0x20, 0xFF, 0x9A, 0x64, 0x22, 0xFF, 0xA2, 0x7A, 0x41, 0xFF, 0xC3, 0xB1, + 0x9A, 0xFF, 0xDE, 0xDD, 0xD9, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xE4, 0xE5, 0xE6, 0xFF, 0xE3, 0xE5, + 0xE4, 0xFF, 0xE2, 0xE4, 0xE4, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE9, 0xE9, 0xFF, 0xE8, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, + 0xEB, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE8, 0xE9, 0xEA, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xEA, 0xE9, 0xEB, 0xFF, 0xDF, 0xDE, 0xD9, 0xFF, 0xA3, 0x99, 0x86, 0xFF, 0x7C, 0x6A, + 0x48, 0xFF, 0x7E, 0x6A, 0x43, 0xFF, 0x85, 0x71, 0x4E, 0xFF, 0xBC, 0xB1, 0x9D, 0xFF, 0xE1, 0xDE, + 0xDA, 0xFF, 0xE7, 0xE4, 0xE3, 0xFF, 0xDA, 0xD8, 0xD4, 0xFF, 0xC2, 0xBA, 0xAE, 0xFF, 0x9B, 0x84, + 0x64, 0xFF, 0x82, 0x63, 0x33, 0xFF, 0x7F, 0x5A, 0x23, 0xFF, 0x85, 0x5C, 0x21, 0xFF, 0x90, 0x5E, + 0x1F, 0xFF, 0x98, 0x61, 0x1E, 0xFF, 0x9E, 0x65, 0x1F, 0xFF, 0xA2, 0x67, 0x20, 0xFF, 0xA5, 0x68, + 0x20, 0xFF, 0xA7, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x68, 0x20, 0xFF, 0xA6, 0x68, + 0x1E, 0xFF, 0xA4, 0x65, 0x1A, 0xFF, 0xA2, 0x62, 0x16, 0xFF, 0xA1, 0x5F, 0x13, 0xFF, 0x9F, 0x5E, + 0x12, 0xFF, 0x9F, 0x5C, 0x11, 0xFF, 0x9E, 0x5B, 0x11, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9B, 0x59, + 0x10, 0xFF, 0x99, 0x58, 0x10, 0xFF, 0x98, 0x59, 0x15, 0xFF, 0xA7, 0x6B, 0x2E, 0xFF, 0xB2, 0x7B, + 0x46, 0xFF, 0xC5, 0xA4, 0x7B, 0xD9, 0xDC, 0xC5, 0xAB, 0x69, 0xDF, 0xC9, 0xB0, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xC3, 0xA8, 0x04, 0xD7, 0xBD, 0xA2, 0x3D, 0xBC, 0x9A, + 0x74, 0xC4, 0xA8, 0x71, 0x3A, 0xFD, 0x98, 0x5C, 0x28, 0xFF, 0x8D, 0x4C, 0x15, 0xFF, 0x8A, 0x48, + 0x0D, 0xFF, 0x8B, 0x48, 0x0B, 0xFF, 0x8D, 0x4B, 0x0C, 0xFF, 0x90, 0x4E, 0x0D, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x99, 0x57, 0x12, 0xFF, 0x9C, 0x5B, 0x15, 0xFF, 0xA0, 0x61, + 0x1B, 0xFF, 0xA3, 0x65, 0x1F, 0xFF, 0xA5, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x22, 0xFF, 0xA7, 0x6A, + 0x22, 0xFF, 0xA8, 0x6A, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, + 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x22, 0xFF, 0xA7, 0x6A, + 0x22, 0xFF, 0xA5, 0x69, 0x21, 0xFF, 0x9F, 0x67, 0x20, 0xFF, 0x9C, 0x69, 0x25, 0xFF, 0xAA, 0x83, + 0x4D, 0xFF, 0xC9, 0xBC, 0xAD, 0xFF, 0xE1, 0xE0, 0xDE, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE1, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xE2, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE6, 0xE8, 0xE7, 0xFF, 0xE6, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE8, 0xEA, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE7, 0xE8, 0xFF, 0xEB, 0xE8, 0xEB, 0xFF, 0xE2, 0xE0, 0xDE, 0xFF, 0xB1, 0xA9, + 0x96, 0xFF, 0x83, 0x72, 0x50, 0xFF, 0x7F, 0x69, 0x42, 0xFF, 0x83, 0x6E, 0x48, 0xFF, 0xB0, 0xA5, + 0x8F, 0xFF, 0xDD, 0xD9, 0xD5, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xDC, 0xDB, 0xD9, 0xFF, 0xCC, 0xC5, + 0xBB, 0xFF, 0xA4, 0x92, 0x76, 0xFF, 0x85, 0x69, 0x3D, 0xFF, 0x7E, 0x5C, 0x27, 0xFF, 0x86, 0x5C, + 0x22, 0xFF, 0x8E, 0x5D, 0x1F, 0xFF, 0x97, 0x62, 0x21, 0xFF, 0x9E, 0x65, 0x22, 0xFF, 0xA4, 0x69, + 0x21, 0xFF, 0xA7, 0x6A, 0x22, 0xFF, 0xA8, 0x6B, 0x22, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x22, 0xFF, 0xA9, 0x6B, 0x22, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x22, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, + 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, 0x23, 0xFF, 0xA9, 0x6B, + 0x22, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA7, 0x67, 0x1C, 0xFF, 0xA4, 0x63, 0x17, 0xFF, 0xA1, 0x60, + 0x14, 0xFF, 0xA0, 0x5E, 0x12, 0xFF, 0x9F, 0x5C, 0x11, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0x9C, 0x5A, + 0x10, 0xFF, 0x9B, 0x5A, 0x10, 0xFF, 0x9C, 0x5D, 0x15, 0xFF, 0xA3, 0x66, 0x28, 0xFF, 0xB2, 0x7A, + 0x42, 0xFF, 0xC4, 0x9F, 0x76, 0xE4, 0xDA, 0xC0, 0xA4, 0x82, 0xDD, 0xC4, 0xAA, 0x17, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBE, 0xA3, 0x06, 0xD5, 0xBA, 0x9D, 0x4F, 0xBC, 0x98, + 0x70, 0xD8, 0xA7, 0x6E, 0x38, 0xFD, 0x96, 0x58, 0x23, 0xFF, 0x8E, 0x4D, 0x14, 0xFF, 0x8C, 0x49, + 0x0E, 0xFF, 0x8D, 0x49, 0x0B, 0xFF, 0x90, 0x4D, 0x0D, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x99, 0x58, 0x13, 0xFF, 0x9D, 0x5D, 0x18, 0xFF, 0xA1, 0x62, 0x1D, 0xFF, 0xA4, 0x67, + 0x21, 0xFF, 0xA6, 0x69, 0x23, 0xFF, 0xA8, 0x6A, 0x24, 0xFF, 0xA9, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, + 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAB, 0x6D, + 0x25, 0xFF, 0xAB, 0x6D, 0x25, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xA9, 0x6D, 0x24, 0xFF, 0xA6, 0x6B, 0x23, 0xFF, 0xA0, 0x68, 0x22, 0xFF, 0x9C, 0x6C, + 0x2A, 0xFF, 0xAD, 0x8E, 0x63, 0xFF, 0xD0, 0xC7, 0xBB, 0xFF, 0xE1, 0xE0, 0xDC, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xDF, 0xE1, 0xE0, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xE0, 0xFF, 0xDE, 0xDF, + 0xE0, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE1, 0xE2, 0xE1, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE4, 0xE6, 0xE5, 0xFF, 0xE3, 0xE6, + 0xE6, 0xFF, 0xE4, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE8, 0xE7, 0xEA, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xBF, 0xB9, 0xAE, 0xFF, 0x8F, 0x7D, 0x5C, 0xFF, 0x82, 0x6B, 0x42, 0xFF, 0x7D, 0x68, + 0x41, 0xFF, 0xA1, 0x94, 0x7A, 0xFF, 0xD7, 0xD3, 0xCB, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xDD, 0xDD, + 0xDC, 0xFF, 0xD3, 0xCF, 0xC9, 0xFF, 0xB5, 0xA7, 0x91, 0xFF, 0x8E, 0x76, 0x4F, 0xFF, 0x81, 0x62, + 0x2F, 0xFF, 0x85, 0x5F, 0x27, 0xFF, 0x8E, 0x60, 0x23, 0xFF, 0x96, 0x63, 0x22, 0xFF, 0x9F, 0x68, + 0x23, 0xFF, 0xA5, 0x6C, 0x24, 0xFF, 0xA8, 0x6C, 0x24, 0xFF, 0xA9, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, + 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x25, 0xFF, 0xAA, 0x6E, + 0x25, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAA, 0x6C, 0x23, 0xFF, 0xA9, 0x6A, 0x20, 0xFF, 0xA6, 0x66, + 0x1A, 0xFF, 0xA3, 0x62, 0x15, 0xFF, 0xA1, 0x5F, 0x12, 0xFF, 0xA0, 0x5E, 0x11, 0xFF, 0x9F, 0x5D, + 0x11, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9E, 0x5F, 0x17, 0xFF, 0xA3, 0x66, 0x23, 0xFF, 0xAF, 0x77, + 0x3D, 0xFF, 0xC3, 0x9D, 0x72, 0xEA, 0xD6, 0xB9, 0x99, 0x95, 0xD9, 0xBF, 0xA1, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBD, 0xA1, 0x0A, 0xD6, 0xBA, 0x9C, 0x62, 0xBB, 0x95, + 0x6B, 0xDE, 0xA4, 0x69, 0x33, 0xFD, 0x96, 0x57, 0x1F, 0xFF, 0x8E, 0x4D, 0x13, 0xFF, 0x8E, 0x4B, + 0x0D, 0xFF, 0x8F, 0x4B, 0x0C, 0xFF, 0x92, 0x4F, 0x0D, 0xFF, 0x94, 0x52, 0x0F, 0xFF, 0x98, 0x58, + 0x13, 0xFF, 0x9D, 0x5D, 0x19, 0xFF, 0xA2, 0x63, 0x1F, 0xFF, 0xA5, 0x68, 0x23, 0xFF, 0xA6, 0x6A, + 0x25, 0xFF, 0xA9, 0x6C, 0x25, 0xFF, 0xA9, 0x6C, 0x25, 0xFF, 0xAB, 0x6D, 0x26, 0xFF, 0xAB, 0x6F, + 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAB, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x26, 0xFF, 0xAB, 0x6F, 0x26, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xA8, 0x6C, 0x25, 0xFF, 0xA1, 0x6A, + 0x25, 0xFF, 0xA1, 0x73, 0x32, 0xFF, 0xB2, 0x97, 0x71, 0xFF, 0xD4, 0xCD, 0xC5, 0xFF, 0xDF, 0xDF, + 0xDE, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDC, 0xDE, 0xDE, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDD, 0xDE, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDC, 0xDE, + 0xDE, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xDF, 0xDE, 0xDC, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE5, 0xE6, + 0xE6, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE5, 0xE4, + 0xE7, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xCB, 0xC9, 0xC1, 0xFF, 0x97, 0x8A, 0x6B, 0xFF, 0x7F, 0x6A, + 0x43, 0xFF, 0x7C, 0x67, 0x3E, 0xFF, 0x9A, 0x8A, 0x6C, 0xFF, 0xD2, 0xCA, 0xC0, 0xFF, 0xE0, 0xE0, + 0xDE, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xD8, 0xD4, 0xD1, 0xFF, 0xBF, 0xB5, 0xA5, 0xFF, 0x94, 0x7F, + 0x5D, 0xFF, 0x82, 0x65, 0x36, 0xFF, 0x86, 0x5F, 0x2A, 0xFF, 0x8D, 0x60, 0x25, 0xFF, 0x95, 0x64, + 0x24, 0xFF, 0x9E, 0x68, 0x25, 0xFF, 0xA4, 0x6C, 0x25, 0xFF, 0xA9, 0x6E, 0x25, 0xFF, 0xAA, 0x6E, + 0x26, 0xFF, 0xAB, 0x6F, 0x25, 0xFF, 0xAB, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAB, 0x6F, + 0x25, 0xFF, 0xAC, 0x6E, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAB, 0x6F, + 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAD, 0x6F, 0x26, 0xFF, 0xAC, 0x6F, + 0x27, 0xFF, 0xAC, 0x6F, 0x27, 0xFF, 0xAC, 0x6F, 0x26, 0xFF, 0xAC, 0x6E, 0x26, 0xFF, 0xAA, 0x6C, + 0x22, 0xFF, 0xA7, 0x67, 0x1C, 0xFF, 0xA4, 0x63, 0x16, 0xFF, 0xA2, 0x60, 0x13, 0xFF, 0xA0, 0x5E, + 0x12, 0xFF, 0x9F, 0x5D, 0x12, 0xFF, 0x9F, 0x5F, 0x16, 0xFF, 0xA5, 0x67, 0x21, 0xFF, 0xAF, 0x77, + 0x38, 0xFF, 0xC2, 0x9A, 0x6F, 0xF3, 0xD3, 0xB5, 0x93, 0xA4, 0xD6, 0xB9, 0x9A, 0x24, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBE, 0xA1, 0x0E, 0xD7, 0xBC, 0x9D, 0x72, 0xBB, 0x96, + 0x6B, 0xE3, 0xA3, 0x67, 0x30, 0xFE, 0x97, 0x57, 0x1D, 0xFF, 0x90, 0x4F, 0x13, 0xFF, 0x90, 0x4C, + 0x0D, 0xFF, 0x91, 0x4D, 0x0C, 0xFF, 0x94, 0x50, 0x0E, 0xFF, 0x98, 0x57, 0x14, 0xFF, 0x9E, 0x5F, + 0x1C, 0xFF, 0xA2, 0x65, 0x22, 0xFF, 0xA5, 0x69, 0x25, 0xFF, 0xA7, 0x6B, 0x26, 0xFF, 0xA9, 0x6D, + 0x27, 0xFF, 0xAA, 0x6E, 0x27, 0xFF, 0xAB, 0x6E, 0x27, 0xFF, 0xAD, 0x6F, 0x28, 0xFF, 0xAD, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAD, 0x71, 0x28, 0xFF, 0xAC, 0x70, 0x28, 0xFF, 0xAB, 0x70, 0x28, 0xFF, 0xA8, 0x6E, + 0x26, 0xFF, 0xA3, 0x6D, 0x28, 0xFF, 0xA1, 0x76, 0x3B, 0xFF, 0xB9, 0xA4, 0x88, 0xFF, 0xD5, 0xD0, + 0xC7, 0xFF, 0xDF, 0xDD, 0xDD, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xD9, 0xDB, 0xDB, 0xFF, 0xD9, 0xDB, + 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, + 0xDB, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xDA, 0xDC, + 0xDD, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDB, 0xDB, 0xDA, 0xFF, 0xD4, 0xD0, + 0xCB, 0xFF, 0xC9, 0xC0, 0xB0, 0xFF, 0xC8, 0xC1, 0xAF, 0xFF, 0xD7, 0xD8, 0xD0, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xDF, 0xE1, 0xE1, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE3, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE4, 0xE4, + 0xE5, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xD4, 0xD3, 0xCE, 0xFF, 0xA5, 0x99, + 0x7F, 0xFF, 0x81, 0x6D, 0x43, 0xFF, 0x7B, 0x69, 0x3E, 0xFF, 0x92, 0x81, 0x62, 0xFF, 0xC8, 0xBF, + 0xB0, 0xFF, 0xDA, 0xD9, 0xD5, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xDA, 0xD8, 0xD7, 0xFF, 0xCC, 0xC7, + 0xBB, 0xFF, 0xA4, 0x95, 0x7B, 0xFF, 0x88, 0x6C, 0x42, 0xFF, 0x84, 0x61, 0x2D, 0xFF, 0x8B, 0x62, + 0x26, 0xFF, 0x93, 0x64, 0x25, 0xFF, 0x9E, 0x6A, 0x26, 0xFF, 0xA6, 0x6E, 0x27, 0xFF, 0xA9, 0x6F, + 0x27, 0xFF, 0xAB, 0x6F, 0x27, 0xFF, 0xAC, 0x71, 0x27, 0xFF, 0xAD, 0x71, 0x28, 0xFF, 0xAD, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x29, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAD, 0x70, + 0x27, 0xFF, 0xAC, 0x6E, 0x25, 0xFF, 0xA9, 0x69, 0x1E, 0xFF, 0xA5, 0x63, 0x17, 0xFF, 0xA2, 0x60, + 0x12, 0xFF, 0xA1, 0x5F, 0x12, 0xFF, 0xA0, 0x61, 0x15, 0xFF, 0xA5, 0x67, 0x20, 0xFF, 0xAF, 0x77, + 0x33, 0xFF, 0xC0, 0x99, 0x6E, 0xF8, 0xD5, 0xB5, 0x93, 0xB6, 0xD5, 0xB7, 0x96, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBE, 0xA0, 0x12, 0xD7, 0xBD, 0x9E, 0x7F, 0xBB, 0x95, + 0x69, 0xE4, 0xA2, 0x64, 0x2C, 0xFD, 0x97, 0x57, 0x1C, 0xFF, 0x92, 0x50, 0x13, 0xFF, 0x92, 0x4E, + 0x0D, 0xFF, 0x93, 0x4F, 0x0E, 0xFF, 0x97, 0x55, 0x13, 0xFF, 0x9D, 0x5E, 0x1C, 0xFF, 0xA2, 0x65, + 0x23, 0xFF, 0xA6, 0x6A, 0x27, 0xFF, 0xA7, 0x6C, 0x28, 0xFF, 0xAA, 0x6E, 0x28, 0xFF, 0xAB, 0x6E, + 0x29, 0xFF, 0xAC, 0x6F, 0x29, 0xFF, 0xAD, 0x70, 0x29, 0xFF, 0xAE, 0x71, 0x29, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAE, 0x72, 0x29, 0xFF, 0xAD, 0x71, + 0x29, 0xFF, 0xAA, 0x70, 0x29, 0xFF, 0xA4, 0x70, 0x2D, 0xFF, 0xA7, 0x81, 0x4A, 0xFF, 0xBD, 0xAD, + 0x96, 0xFF, 0xD4, 0xD1, 0xCD, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xD7, 0xD9, + 0xD9, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD9, 0xDA, + 0xD9, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDA, 0xDB, + 0xDC, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, 0xD9, 0xFF, 0xD0, 0xCA, 0xBF, 0xFF, 0xA4, 0x93, + 0x76, 0xFF, 0x94, 0x7C, 0x52, 0xFF, 0x96, 0x7C, 0x4F, 0xFF, 0xBD, 0xAF, 0x96, 0xFF, 0xDB, 0xD9, + 0xD3, 0xFF, 0xDE, 0xDD, 0xDD, 0xFF, 0xDD, 0xDE, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE3, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, 0xE6, 0xFF, 0xE2, 0xE4, + 0xE5, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xDC, 0xDC, + 0xDB, 0xFF, 0xB4, 0xAC, 0x98, 0xFF, 0x84, 0x71, 0x4B, 0xFF, 0x7D, 0x69, 0x3E, 0xFF, 0x95, 0x83, + 0x61, 0xFF, 0xC3, 0xB9, 0xA6, 0xFF, 0xD8, 0xD6, 0xD2, 0xFF, 0xDB, 0xDA, 0xDB, 0xFF, 0xDB, 0xD8, + 0xD8, 0xFF, 0xD2, 0xCD, 0xC7, 0xFF, 0xB2, 0xA6, 0x8F, 0xFF, 0x8F, 0x78, 0x51, 0xFF, 0x84, 0x64, + 0x32, 0xFF, 0x88, 0x61, 0x28, 0xFF, 0x92, 0x65, 0x27, 0xFF, 0x9D, 0x69, 0x28, 0xFF, 0xA4, 0x6D, + 0x28, 0xFF, 0xA9, 0x6F, 0x28, 0xFF, 0xAC, 0x72, 0x29, 0xFF, 0xAE, 0x72, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x29, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x29, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xAF, 0x72, 0x2A, 0xFF, 0xAE, 0x70, 0x27, 0xFF, 0xAA, 0x6A, 0x1F, 0xFF, 0xA4, 0x62, + 0x15, 0xFF, 0xA3, 0x60, 0x14, 0xFF, 0xA2, 0x62, 0x16, 0xFF, 0xA6, 0x67, 0x1E, 0xFF, 0xB1, 0x77, + 0x30, 0xFF, 0xBF, 0x97, 0x6A, 0xFF, 0xD5, 0xB5, 0x92, 0xC5, 0xD6, 0xB7, 0x95, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBD, 0xA0, 0x15, 0xD7, 0xBC, 0x9E, 0x87, 0xBE, 0x95, + 0x69, 0xE8, 0xA2, 0x64, 0x2B, 0xFF, 0x97, 0x56, 0x1A, 0xFF, 0x93, 0x50, 0x12, 0xFF, 0x94, 0x50, + 0x10, 0xFF, 0x97, 0x54, 0x13, 0xFF, 0x9E, 0x5F, 0x1E, 0xFF, 0xA2, 0x66, 0x25, 0xFF, 0xA6, 0x6A, + 0x28, 0xFF, 0xA8, 0x6D, 0x29, 0xFF, 0xAA, 0x6E, 0x2A, 0xFF, 0xAB, 0x70, 0x2A, 0xFF, 0xAD, 0x71, + 0x2A, 0xFF, 0xAE, 0x72, 0x2B, 0xFF, 0xAF, 0x73, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB1, 0x75, + 0x2C, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB0, 0x75, 0x2B, 0xFF, 0xAF, 0x74, + 0x2B, 0xFF, 0xAD, 0x73, 0x2C, 0xFF, 0xAA, 0x71, 0x2B, 0xFF, 0xA4, 0x72, 0x2F, 0xFF, 0xA9, 0x86, + 0x54, 0xFF, 0xC3, 0xB6, 0xA6, 0xFF, 0xD3, 0xD3, 0xCE, 0xFF, 0xD9, 0xD8, 0xD9, 0xFF, 0xD7, 0xD7, + 0xD8, 0xFF, 0xD6, 0xD7, 0xD8, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD8, 0xD9, + 0xD9, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xD9, 0xDA, 0xDB, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xD8, 0xDA, + 0xDB, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xD7, 0xD9, 0xD8, 0xFF, 0xB3, 0xA8, 0x95, 0xFF, 0x8B, 0x74, + 0x4D, 0xFF, 0x8A, 0x6F, 0x44, 0xFF, 0x8B, 0x6E, 0x40, 0xFF, 0xA6, 0x8C, 0x60, 0xFF, 0xD6, 0xCF, + 0xC5, 0xFF, 0xDB, 0xDA, 0xD9, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDE, 0xDF, + 0xE0, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE2, 0xE3, + 0xE4, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xE1, 0xE3, 0xE4, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xE0, 0xE2, + 0xE1, 0xFF, 0xE0, 0xE1, 0xDF, 0xFF, 0xC1, 0xBB, 0xAE, 0xFF, 0x8C, 0x7C, 0x5A, 0xFF, 0x7F, 0x6F, + 0x47, 0xFF, 0x92, 0x82, 0x60, 0xFF, 0xB9, 0xAD, 0x98, 0xFF, 0xD5, 0xD4, 0xCC, 0xFF, 0xDA, 0xD9, + 0xDA, 0xFF, 0xDC, 0xDB, 0xDB, 0xFF, 0xD7, 0xD5, 0xD0, 0xFF, 0xC0, 0xB8, 0xA9, 0xFF, 0x9B, 0x85, + 0x64, 0xFF, 0x87, 0x69, 0x39, 0xFF, 0x89, 0x64, 0x2C, 0xFF, 0x91, 0x66, 0x2A, 0xFF, 0x9C, 0x6B, + 0x29, 0xFF, 0xA4, 0x6E, 0x29, 0xFF, 0xA9, 0x71, 0x2B, 0xFF, 0xAC, 0x73, 0x2B, 0xFF, 0xAF, 0x74, + 0x2B, 0xFF, 0xB1, 0x74, 0x2B, 0xFF, 0xB1, 0x74, 0x2B, 0xFF, 0xB1, 0x74, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB1, 0x75, + 0x2C, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB0, 0x74, 0x2C, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAA, 0x6A, + 0x20, 0xFF, 0xA5, 0x63, 0x17, 0xFF, 0xA3, 0x63, 0x17, 0xFF, 0xA5, 0x66, 0x1D, 0xFF, 0xB2, 0x75, + 0x2E, 0xFF, 0xC1, 0x97, 0x69, 0xFF, 0xD4, 0xB4, 0x91, 0xD7, 0xD5, 0xB6, 0x94, 0x27, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBE, 0xA0, 0x19, 0xD8, 0xBC, 0x9D, 0x8F, 0xBF, 0x95, + 0x66, 0xEA, 0xA2, 0x63, 0x29, 0xFE, 0x98, 0x56, 0x1A, 0xFF, 0x95, 0x52, 0x14, 0xFF, 0x98, 0x54, + 0x14, 0xFF, 0x9C, 0x5C, 0x1C, 0xFF, 0xA3, 0x66, 0x26, 0xFF, 0xA6, 0x6B, 0x2A, 0xFF, 0xA8, 0x6D, + 0x2B, 0xFF, 0xAB, 0x6F, 0x2B, 0xFF, 0xAC, 0x70, 0x2B, 0xFF, 0xAD, 0x71, 0x2C, 0xFF, 0xAF, 0x73, + 0x2C, 0xFF, 0xB0, 0x74, 0x2C, 0xFF, 0xB1, 0x75, 0x2D, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB1, 0x76, 0x2D, 0xFF, 0xAF, 0x75, 0x2C, 0xFF, 0xAB, 0x73, 0x2D, 0xFF, 0xA6, 0x75, + 0x33, 0xFF, 0xAF, 0x8F, 0x61, 0xFF, 0xC6, 0xBE, 0xB0, 0xFF, 0xD4, 0xD3, 0xCF, 0xFF, 0xD5, 0xD5, + 0xD6, 0xFF, 0xD5, 0xD6, 0xD7, 0xFF, 0xD5, 0xD6, 0xD6, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD8, + 0xD8, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, + 0xDA, 0xFF, 0xD9, 0xDB, 0xDB, 0xFF, 0xD7, 0xD9, 0xD5, 0xFF, 0xAB, 0xA1, 0x8A, 0xFF, 0x84, 0x6F, + 0x44, 0xFF, 0x8A, 0x6F, 0x42, 0xFF, 0x84, 0x68, 0x3B, 0xFF, 0x9A, 0x7C, 0x4C, 0xFF, 0xCF, 0xC3, + 0xB3, 0xFF, 0xDB, 0xDA, 0xD7, 0xFF, 0xDC, 0xDB, 0xDC, 0xFF, 0xDD, 0xDE, 0xE0, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xE0, 0xDF, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE1, 0xE2, + 0xE4, 0xFF, 0xE2, 0xE2, 0xE4, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE0, 0xE1, + 0xE0, 0xFF, 0xDF, 0xE1, 0xE2, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xD0, 0xCC, 0xC5, 0xFF, 0x98, 0x8B, + 0x6D, 0xFF, 0x87, 0x76, 0x4F, 0xFF, 0x93, 0x82, 0x60, 0xFF, 0xB6, 0xA8, 0x91, 0xFF, 0xD1, 0xCE, + 0xC6, 0xFF, 0xDB, 0xDB, 0xDA, 0xFF, 0xDC, 0xDA, 0xDA, 0xFF, 0xD8, 0xD8, 0xD5, 0xFF, 0xCA, 0xC4, + 0xB8, 0xFF, 0xA4, 0x93, 0x76, 0xFF, 0x8A, 0x6F, 0x42, 0xFF, 0x87, 0x65, 0x2F, 0xFF, 0x91, 0x68, + 0x2C, 0xFF, 0x9B, 0x6B, 0x2A, 0xFF, 0xA2, 0x6F, 0x2B, 0xFF, 0xA9, 0x72, 0x2C, 0xFF, 0xAE, 0x75, + 0x2C, 0xFF, 0xB1, 0x76, 0x2C, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB2, 0x76, + 0x2D, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, + 0x2E, 0xFF, 0xB3, 0x77, 0x2E, 0xFF, 0xB2, 0x76, 0x2E, 0xFF, 0xB1, 0x75, 0x2D, 0xFF, 0xAF, 0x73, + 0x2A, 0xFF, 0xAB, 0x6C, 0x21, 0xFF, 0xA7, 0x67, 0x1C, 0xFF, 0xA7, 0x67, 0x1D, 0xFF, 0xAF, 0x72, + 0x2C, 0xFF, 0xC2, 0x98, 0x67, 0xFF, 0xD4, 0xB5, 0x91, 0xE4, 0xD6, 0xB6, 0x93, 0x23, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBE, 0x9F, 0x19, 0xD9, 0xBD, 0x9E, 0x94, 0xBF, 0x93, + 0x63, 0xED, 0xA3, 0x64, 0x29, 0xFF, 0x9B, 0x59, 0x1C, 0xFF, 0x98, 0x56, 0x18, 0xFF, 0x9D, 0x5D, + 0x1F, 0xFF, 0xA1, 0x65, 0x27, 0xFF, 0xA5, 0x6A, 0x2B, 0xFF, 0xA8, 0x6D, 0x2C, 0xFF, 0xAB, 0x6F, + 0x2C, 0xFF, 0xAD, 0x71, 0x2D, 0xFF, 0xAE, 0x72, 0x2D, 0xFF, 0xAF, 0x73, 0x2D, 0xFF, 0xB0, 0x75, + 0x2E, 0xFF, 0xB1, 0x76, 0x2E, 0xFF, 0xB2, 0x77, 0x2F, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB3, 0x79, 0x2E, 0xFF, 0xB1, 0x78, 0x2E, 0xFF, 0xB0, 0x77, 0x30, 0xFF, 0xAA, 0x75, + 0x2E, 0xFF, 0xA7, 0x78, 0x35, 0xFF, 0xB1, 0x95, 0x70, 0xFF, 0xCB, 0xC5, 0xBC, 0xFF, 0xD5, 0xD6, + 0xD3, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, + 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD7, 0xD8, + 0xD8, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, 0xD5, 0xFF, 0xCB, 0xC5, 0xB7, 0xFF, 0x99, 0x89, + 0x64, 0xFF, 0x85, 0x70, 0x43, 0xFF, 0x86, 0x6E, 0x41, 0xFF, 0x9A, 0x81, 0x5A, 0xFF, 0xC3, 0xB2, + 0x97, 0xFF, 0xD9, 0xD8, 0xD4, 0xFF, 0xDE, 0xDF, 0xE1, 0xFF, 0xDD, 0xDD, 0xD7, 0xFF, 0xDC, 0xDD, + 0xD8, 0xFF, 0xDD, 0xDB, 0xD5, 0xFF, 0xE1, 0xE0, 0xD9, 0xFF, 0xE2, 0xE2, 0xE1, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0xE2, 0xE3, 0xE1, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE3, + 0xE3, 0xFF, 0xE0, 0xE2, 0xE2, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xE1, 0xE0, 0xE0, 0xFF, 0xD3, 0xD1, + 0xCB, 0xFF, 0xA6, 0x9B, 0x85, 0xFF, 0x89, 0x7A, 0x58, 0xFF, 0x8F, 0x7E, 0x5E, 0xFF, 0xA7, 0x99, + 0x80, 0xFF, 0xD0, 0xCC, 0xC0, 0xFF, 0xDC, 0xDA, 0xD9, 0xFF, 0xDC, 0xDC, 0xDB, 0xFF, 0xDA, 0xDA, + 0xD8, 0xFF, 0xD1, 0xCE, 0xC8, 0xFF, 0xB3, 0xA5, 0x8F, 0xFF, 0x91, 0x79, 0x4E, 0xFF, 0x8A, 0x6A, + 0x34, 0xFF, 0x90, 0x6A, 0x2F, 0xFF, 0x99, 0x6C, 0x2C, 0xFF, 0xA2, 0x70, 0x2D, 0xFF, 0xAA, 0x74, + 0x2E, 0xFF, 0xB0, 0x77, 0x2F, 0xFF, 0xB2, 0x78, 0x2F, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x30, 0xFF, 0xB4, 0x79, 0x30, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB2, 0x77, 0x2F, 0xFF, 0xB2, 0x77, + 0x2F, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAC, 0x6E, 0x25, 0xFF, 0xAC, 0x6D, 0x24, 0xFF, 0xB0, 0x73, + 0x2E, 0xFF, 0xC2, 0x98, 0x66, 0xFF, 0xD5, 0xB5, 0x90, 0xEF, 0xD6, 0xB7, 0x92, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xBE, 0x9F, 0x1A, 0xD9, 0xBC, 0x9C, 0x96, 0xBF, 0x92, + 0x60, 0xED, 0xA4, 0x67, 0x2B, 0xFF, 0x9E, 0x5E, 0x21, 0xFF, 0x9C, 0x5C, 0x20, 0xFF, 0xA2, 0x65, + 0x28, 0xFF, 0xA5, 0x6A, 0x2C, 0xFF, 0xA7, 0x6C, 0x2D, 0xFF, 0xAB, 0x6F, 0x2E, 0xFF, 0xAC, 0x71, + 0x2E, 0xFF, 0xAF, 0x73, 0x2E, 0xFF, 0xB0, 0x74, 0x2F, 0xFF, 0xB1, 0x76, 0x2F, 0xFF, 0xB2, 0x77, + 0x30, 0xFF, 0xB3, 0x78, 0x30, 0xFF, 0xB4, 0x79, 0x31, 0xFF, 0xB5, 0x7A, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB5, 0x7B, 0x30, 0xFF, 0xB4, 0x7A, 0x30, 0xFF, 0xB3, 0x7A, 0x31, 0xFF, 0xAF, 0x78, + 0x30, 0xFF, 0xAD, 0x78, 0x32, 0xFF, 0xAB, 0x82, 0x45, 0xFF, 0xBA, 0xA5, 0x8B, 0xFF, 0xD1, 0xCD, + 0xC6, 0xFF, 0xD6, 0xD7, 0xD5, 0xFF, 0xD6, 0xD7, 0xD6, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD5, 0xD7, + 0xD6, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD5, 0xD6, 0xD6, 0xFF, 0xD6, 0xD5, 0xD7, 0xFF, 0xDB, 0xDA, 0xDB, 0xFF, 0xCB, 0xC6, + 0xC2, 0xFF, 0xBC, 0xB8, 0xAE, 0xFF, 0xB8, 0xB4, 0x9F, 0xFF, 0xB6, 0xAC, 0x8E, 0xFF, 0xAD, 0x9D, + 0x77, 0xFF, 0xB5, 0xAB, 0x97, 0xFF, 0xC6, 0xBC, 0xA6, 0xFF, 0xC4, 0xB6, 0x96, 0xFF, 0xBA, 0xAB, + 0x8D, 0xFF, 0xB8, 0xA7, 0x91, 0xFF, 0xB7, 0xA6, 0x8F, 0xFF, 0xC1, 0xB4, 0xA2, 0xFF, 0xD2, 0xCC, + 0xC2, 0xFF, 0xDD, 0xDC, 0xD1, 0xFF, 0xDE, 0xDE, 0xD7, 0xFF, 0xE2, 0xE1, 0xDF, 0xFF, 0xE3, 0xE3, + 0xE2, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xE0, 0xDF, + 0xE0, 0xFF, 0xDA, 0xD8, 0xD2, 0xFF, 0xB3, 0xA9, 0x94, 0xFF, 0x93, 0x84, 0x63, 0xFF, 0x91, 0x81, + 0x5F, 0xFF, 0xA5, 0x97, 0x7B, 0xFF, 0xCD, 0xC8, 0xBC, 0xFF, 0xDC, 0xDB, 0xDA, 0xFF, 0xDB, 0xDD, + 0xDC, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD4, 0xD1, 0xCC, 0xFF, 0xBC, 0xB1, 0xA0, 0xFF, 0x98, 0x82, + 0x5B, 0xFF, 0x8B, 0x6C, 0x3A, 0xFF, 0x8F, 0x6A, 0x31, 0xFF, 0x98, 0x6C, 0x2E, 0xFF, 0xA2, 0x71, + 0x2F, 0xFF, 0xAA, 0x75, 0x30, 0xFF, 0xB0, 0x79, 0x31, 0xFF, 0xB4, 0x7A, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7A, 0x31, 0xFF, 0xB5, 0x7A, 0x31, 0xFF, 0xB6, 0x7A, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB4, 0x7A, 0x31, 0xFF, 0xB4, 0x79, 0x30, 0xFF, 0xB3, 0x78, + 0x30, 0xFF, 0xB2, 0x77, 0x2F, 0xFF, 0xB0, 0x74, 0x2C, 0xFF, 0xAF, 0x73, 0x2C, 0xFF, 0xB0, 0x75, + 0x31, 0xFF, 0xC3, 0x9B, 0x67, 0xFF, 0xD5, 0xB5, 0x90, 0xF2, 0xD6, 0xB7, 0x92, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xBE, 0x9F, 0x19, 0xD9, 0xBC, 0x9C, 0x95, 0xBD, 0x8F, + 0x5E, 0xEE, 0xA6, 0x6E, 0x34, 0xFF, 0xA3, 0x67, 0x2C, 0xFF, 0xA3, 0x66, 0x2C, 0xFF, 0xA6, 0x6A, + 0x2E, 0xFF, 0xA8, 0x6D, 0x2F, 0xFF, 0xAA, 0x6F, 0x2F, 0xFF, 0xAC, 0x72, 0x30, 0xFF, 0xAF, 0x74, + 0x31, 0xFF, 0xB0, 0x75, 0x31, 0xFF, 0xB2, 0x77, 0x32, 0xFF, 0xB3, 0x78, 0x32, 0xFF, 0xB4, 0x7A, + 0x32, 0xFF, 0xB5, 0x7B, 0x32, 0xFF, 0xB6, 0x7C, 0x33, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB6, 0x7D, 0x32, 0xFF, 0xB4, 0x7C, + 0x33, 0xFF, 0xB4, 0x7F, 0x3A, 0xFF, 0xB2, 0x83, 0x3F, 0xFF, 0xB3, 0x93, 0x63, 0xFF, 0xC2, 0xB3, + 0x9D, 0xFF, 0xD3, 0xD2, 0xCD, 0xFF, 0xD7, 0xD7, 0xD5, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD4, 0xD7, + 0xD7, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD5, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD6, 0xD7, + 0xD7, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD5, 0xD6, 0xD6, 0xFF, 0xD6, 0xD7, 0xD5, 0xFF, 0xD5, 0xD6, + 0xD4, 0xFF, 0xD9, 0xDA, 0xD9, 0xFF, 0xD9, 0xD9, 0xD8, 0xFF, 0xD1, 0xCE, 0xC3, 0xFF, 0xB1, 0x9F, + 0x7F, 0xFF, 0x9F, 0x89, 0x66, 0xFF, 0xA9, 0x98, 0x73, 0xFF, 0xB0, 0xA0, 0x80, 0xFF, 0xB7, 0xAA, + 0x8D, 0xFF, 0xC9, 0xC2, 0xAC, 0xFF, 0xBB, 0xAF, 0x96, 0xFF, 0xA9, 0x94, 0x73, 0xFF, 0xA1, 0x8B, + 0x69, 0xFF, 0xA6, 0x91, 0x70, 0xFF, 0xB2, 0xA5, 0x8B, 0xFF, 0xCC, 0xC7, 0xB9, 0xFF, 0xE4, 0xE2, + 0xE2, 0xFF, 0xE3, 0xE3, 0xE5, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, + 0xE0, 0xFF, 0xE0, 0xDF, 0xDF, 0xFF, 0xDB, 0xDB, 0xD6, 0xFF, 0xBA, 0xB4, 0xA4, 0xFF, 0x9A, 0x8D, + 0x6F, 0xFF, 0x92, 0x82, 0x61, 0xFF, 0x9C, 0x8D, 0x6F, 0xFF, 0xC7, 0xC1, 0xB1, 0xFF, 0xDD, 0xDD, + 0xDA, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xD9, 0xD7, 0xD5, 0xFF, 0xCD, 0xC5, + 0xB8, 0xFF, 0xA5, 0x92, 0x70, 0xFF, 0x8F, 0x72, 0x42, 0xFF, 0x8E, 0x6B, 0x34, 0xFF, 0x98, 0x6D, + 0x2F, 0xFF, 0xA1, 0x71, 0x2F, 0xFF, 0xAB, 0x77, 0x32, 0xFF, 0xB2, 0x7B, 0x33, 0xFF, 0xB5, 0x7C, + 0x33, 0xFF, 0xB6, 0x7C, 0x33, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB6, 0x7C, 0x33, 0xFF, 0xB6, 0x7B, 0x33, 0xFF, 0xB5, 0x7B, + 0x32, 0xFF, 0xB4, 0x7A, 0x32, 0xFF, 0xB3, 0x79, 0x32, 0xFF, 0xB5, 0x7C, 0x37, 0xFF, 0xB5, 0x7F, + 0x3C, 0xFF, 0xC6, 0x9E, 0x6B, 0xFF, 0xD5, 0xB5, 0x90, 0xF2, 0xD7, 0xB8, 0x94, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xC0, 0xA1, 0x15, 0xDA, 0xBD, 0x9D, 0x93, 0xBF, 0x93, + 0x62, 0xED, 0xAD, 0x76, 0x3E, 0xFF, 0xAA, 0x70, 0x38, 0xFF, 0xA8, 0x6C, 0x32, 0xFF, 0xA8, 0x6D, + 0x31, 0xFF, 0xAB, 0x6F, 0x30, 0xFF, 0xAC, 0x72, 0x31, 0xFF, 0xAF, 0x74, 0x32, 0xFF, 0xB0, 0x76, + 0x33, 0xFF, 0xB2, 0x78, 0x33, 0xFF, 0xB4, 0x79, 0x34, 0xFF, 0xB5, 0x7B, 0x34, 0xFF, 0xB6, 0x7C, + 0x34, 0xFF, 0xB7, 0x7D, 0x34, 0xFF, 0xB8, 0x7E, 0x35, 0xFF, 0xB9, 0x7E, 0x35, 0xFF, 0xB8, 0x7E, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB8, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x80, 0x35, 0xFF, 0xB9, 0x81, 0x38, 0xFF, 0xBC, 0x86, + 0x40, 0xFF, 0xBE, 0x8B, 0x49, 0xFF, 0xBB, 0x8C, 0x4B, 0xFF, 0xB6, 0x8D, 0x50, 0xFF, 0xBA, 0x9A, + 0x6B, 0xFF, 0xCA, 0xBD, 0xAD, 0xFF, 0xD6, 0xD6, 0xD3, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD6, 0xD7, + 0xD8, 0xFF, 0xD6, 0xD8, 0xD8, 0xFF, 0xD6, 0xD8, 0xD7, 0xFF, 0xD6, 0xD8, 0xD8, 0xFF, 0xD7, 0xD8, + 0xD8, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD7, 0xD9, 0xD8, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD7, 0xD9, + 0xD8, 0xFF, 0xD8, 0xDA, 0xD9, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDA, 0xDA, 0xD7, 0xFF, 0xC1, 0xB9, + 0xA5, 0xFF, 0x9F, 0x8A, 0x64, 0xFF, 0xA3, 0x91, 0x69, 0xFF, 0xC3, 0xB3, 0x98, 0xFF, 0xDE, 0xD6, + 0xC8, 0xFF, 0xE1, 0xE2, 0xE0, 0xFF, 0xD9, 0xD8, 0xD2, 0xFF, 0xB2, 0xA4, 0x84, 0xFF, 0x9C, 0x88, + 0x63, 0xFF, 0x98, 0x83, 0x5E, 0xFF, 0x95, 0x81, 0x59, 0xFF, 0xA8, 0x9A, 0x7E, 0xFF, 0xD4, 0xD1, + 0xCC, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xE0, 0xDF, 0xE0, 0xFF, 0xE1, 0xE0, 0xE2, 0xFF, 0xDE, 0xDD, 0xDA, 0xFF, 0xC1, 0xBD, + 0xAE, 0xFF, 0x9F, 0x94, 0x77, 0xFF, 0x97, 0x86, 0x65, 0xFF, 0x9D, 0x8D, 0x6D, 0xFF, 0xC1, 0xBB, + 0xAC, 0xFF, 0xDE, 0xDD, 0xDB, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xDC, 0xDA, + 0xD9, 0xFF, 0xD3, 0xCD, 0xC4, 0xFF, 0xAB, 0x9D, 0x80, 0xFF, 0x90, 0x77, 0x4B, 0xFF, 0x8F, 0x6C, + 0x37, 0xFF, 0x98, 0x6E, 0x31, 0xFF, 0xA4, 0x74, 0x33, 0xFF, 0xAE, 0x79, 0x35, 0xFF, 0xB4, 0x7D, + 0x35, 0xFF, 0xB7, 0x7E, 0x35, 0xFF, 0xB8, 0x7E, 0x34, 0xFF, 0xB9, 0x7E, 0x35, 0xFF, 0xB9, 0x7E, + 0x35, 0xFF, 0xBA, 0x7E, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xBA, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB8, 0x7F, + 0x35, 0xFF, 0xB9, 0x7E, 0x35, 0xFF, 0xB8, 0x7E, 0x35, 0xFF, 0xB8, 0x7D, 0x34, 0xFF, 0xB7, 0x7D, + 0x34, 0xFF, 0xB6, 0x7C, 0x34, 0xFF, 0xB6, 0x7D, 0x36, 0xFF, 0xB8, 0x80, 0x3E, 0xFF, 0xBB, 0x86, + 0x45, 0xFF, 0xC9, 0xA2, 0x72, 0xFF, 0xD6, 0xB7, 0x93, 0xE9, 0xD9, 0xBA, 0x96, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xC2, 0xA4, 0x15, 0xDC, 0xBE, 0x9E, 0x8C, 0xC3, 0x9A, + 0x6C, 0xEB, 0xB5, 0x80, 0x48, 0xFF, 0xAE, 0x76, 0x3D, 0xFF, 0xAB, 0x70, 0x36, 0xFF, 0xAA, 0x70, + 0x33, 0xFF, 0xAD, 0x72, 0x32, 0xFF, 0xAE, 0x74, 0x34, 0xFF, 0xB0, 0x77, 0x35, 0xFF, 0xB3, 0x79, + 0x35, 0xFF, 0xB4, 0x7A, 0x35, 0xFF, 0xB6, 0x7C, 0x36, 0xFF, 0xB7, 0x7D, 0x36, 0xFF, 0xB7, 0x7E, + 0x36, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xB9, 0x80, 0x37, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBC, 0x84, 0x3C, 0xFF, 0xBF, 0x8A, 0x46, 0xFF, 0xC3, 0x91, + 0x4F, 0xFF, 0xC2, 0x91, 0x52, 0xFF, 0xC1, 0x91, 0x52, 0xFF, 0xBD, 0x90, 0x52, 0xFF, 0xB7, 0x90, + 0x56, 0xFF, 0xBE, 0xA1, 0x7A, 0xFF, 0xD0, 0xC7, 0xBB, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, 0xD8, 0xD8, + 0xD8, 0xFF, 0xD8, 0xD9, 0xD9, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xD9, 0xDA, + 0xDA, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xD8, 0xDA, + 0xD9, 0xFF, 0xD8, 0xD9, 0xDA, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xCE, 0xCE, + 0xC4, 0xFF, 0xAB, 0x9D, 0x80, 0xFF, 0x9E, 0x8C, 0x6B, 0xFF, 0xAF, 0x9F, 0x82, 0xFF, 0xDB, 0xD2, + 0xC5, 0xFF, 0xE5, 0xE1, 0xE1, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xCA, 0xC6, 0xB5, 0xFF, 0xA2, 0x93, + 0x6F, 0xFF, 0x99, 0x87, 0x5B, 0xFF, 0x8E, 0x7C, 0x55, 0xFF, 0xAA, 0x9D, 0x84, 0xFF, 0xD6, 0xD4, + 0xCE, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDC, 0xDE, 0xDE, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xDF, 0xE0, + 0xDE, 0xFF, 0xC9, 0xC6, 0xBC, 0xFF, 0xA8, 0x9C, 0x81, 0xFF, 0x9A, 0x8A, 0x69, 0xFF, 0x99, 0x8B, + 0x6C, 0xFF, 0xBE, 0xB6, 0xA4, 0xFF, 0xDE, 0xDD, 0xD9, 0xFF, 0xDD, 0xDC, 0xDC, 0xFF, 0xDA, 0xDA, + 0xD9, 0xFF, 0xDC, 0xDB, 0xD9, 0xFF, 0xDA, 0xD6, 0xCD, 0xFF, 0xBB, 0xAF, 0x98, 0xFF, 0x9A, 0x80, + 0x55, 0xFF, 0x95, 0x72, 0x3C, 0xFF, 0x9F, 0x75, 0x36, 0xFF, 0xA8, 0x78, 0x35, 0xFF, 0xB1, 0x7C, + 0x36, 0xFF, 0xB7, 0x7F, 0x36, 0xFF, 0xB9, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xB9, 0x7F, 0x36, 0xFF, 0xB8, 0x7F, + 0x36, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xB7, 0x7E, 0x38, 0xFF, 0xB9, 0x83, 0x41, 0xFF, 0xBF, 0x8C, + 0x4B, 0xFF, 0xCC, 0xA7, 0x7B, 0xFF, 0xDA, 0xBB, 0x98, 0xE1, 0xDB, 0xBD, 0x9A, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC2, 0xA4, 0x11, 0xDF, 0xC1, 0xA1, 0x84, 0xC9, 0xA2, + 0x75, 0xE6, 0xB8, 0x85, 0x4F, 0xFF, 0xB2, 0x7B, 0x41, 0xFF, 0xAD, 0x73, 0x38, 0xFF, 0xAC, 0x72, + 0x34, 0xFF, 0xAF, 0x74, 0x34, 0xFF, 0xB0, 0x76, 0x35, 0xFF, 0xB3, 0x79, 0x36, 0xFF, 0xB4, 0x7B, + 0x37, 0xFF, 0xB6, 0x7D, 0x37, 0xFF, 0xB8, 0x7E, 0x38, 0xFF, 0xB9, 0x7F, 0x38, 0xFF, 0xB9, 0x80, + 0x38, 0xFF, 0xBA, 0x81, 0x38, 0xFF, 0xBB, 0x82, 0x39, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBD, 0x84, + 0x3A, 0xFF, 0xBE, 0x87, 0x3E, 0xFF, 0xC2, 0x8D, 0x48, 0xFF, 0xC5, 0x93, 0x53, 0xFF, 0xC6, 0x95, + 0x56, 0xFF, 0xC5, 0x94, 0x56, 0xFF, 0xC5, 0x94, 0x56, 0xFF, 0xC3, 0x93, 0x56, 0xFF, 0xBC, 0x91, + 0x55, 0xFF, 0xBC, 0x94, 0x5E, 0xFF, 0xC2, 0xAA, 0x87, 0xFF, 0xD6, 0xCE, 0xC5, 0xFF, 0xDB, 0xDA, + 0xD8, 0xFF, 0xDB, 0xDA, 0xDB, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDA, 0xDC, 0xDC, 0xFF, 0xDB, 0xDD, + 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDB, 0xDC, + 0xDC, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDA, 0xDB, 0xDC, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xD1, 0xD1, + 0xCC, 0xFF, 0xB4, 0xAA, 0x8E, 0xFF, 0xBD, 0xB1, 0x97, 0xFF, 0xA7, 0x98, 0x79, 0xFF, 0xC0, 0xB3, + 0x9D, 0xFF, 0xDB, 0xD6, 0xD0, 0xFF, 0xE4, 0xE4, 0xE6, 0xFF, 0xDC, 0xDB, 0xDB, 0xFF, 0xB7, 0xAF, + 0x9E, 0xFF, 0x9D, 0x8F, 0x71, 0xFF, 0xA4, 0x9A, 0x83, 0xFF, 0xCC, 0xCB, 0xBF, 0xFF, 0xDA, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDA, 0xDB, 0xDD, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE1, 0xE2, + 0xE3, 0xFF, 0xDF, 0xE1, 0xE0, 0xFF, 0xD2, 0xD1, 0xCA, 0xFF, 0xAF, 0xA7, 0x8F, 0xFF, 0x9D, 0x8E, + 0x6E, 0xFF, 0x9B, 0x8C, 0x6C, 0xFF, 0xBA, 0xB3, 0xA2, 0xFF, 0xDD, 0xDC, 0xD6, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDE, 0xDB, 0xDD, 0xFF, 0xDB, 0xD7, 0xD1, 0xFF, 0xC3, 0xB8, + 0xA1, 0xFF, 0x9C, 0x84, 0x5B, 0xFF, 0x9B, 0x76, 0x3E, 0xFF, 0xA4, 0x77, 0x37, 0xFF, 0xAF, 0x7C, + 0x36, 0xFF, 0xB7, 0x7F, 0x38, 0xFF, 0xBA, 0x82, 0x38, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x82, + 0x38, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x82, 0x39, 0xFF, 0xBB, 0x81, 0x38, 0xFF, 0xBA, 0x81, + 0x38, 0xFF, 0xB9, 0x80, 0x38, 0xFF, 0xB8, 0x80, 0x3B, 0xFF, 0xBC, 0x86, 0x44, 0xFF, 0xC1, 0x90, + 0x51, 0xFF, 0xD0, 0xAD, 0x82, 0xFF, 0xDB, 0xBD, 0x9A, 0xD1, 0xDD, 0xBF, 0x9D, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC4, 0xA5, 0x10, 0xDE, 0xC2, 0xA2, 0x77, 0xCA, 0xA6, + 0x7B, 0xE4, 0xBA, 0x89, 0x52, 0xFF, 0xB4, 0x7E, 0x45, 0xFF, 0xB0, 0x76, 0x3B, 0xFF, 0xAF, 0x74, + 0x37, 0xFF, 0xB1, 0x76, 0x36, 0xFF, 0xB3, 0x78, 0x37, 0xFF, 0xB4, 0x7B, 0x38, 0xFF, 0xB6, 0x7D, + 0x39, 0xFF, 0xB8, 0x7F, 0x3A, 0xFF, 0xB9, 0x80, 0x3A, 0xFF, 0xBA, 0x81, 0x3A, 0xFF, 0xBB, 0x82, + 0x3A, 0xFF, 0xBC, 0x83, 0x3A, 0xFF, 0xBC, 0x84, 0x3B, 0xFF, 0xBD, 0x84, 0x3B, 0xFF, 0xBE, 0x85, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBE, 0x85, 0x3C, 0xFF, 0xBF, 0x88, + 0x40, 0xFF, 0xC4, 0x8F, 0x4C, 0xFF, 0xC6, 0x95, 0x56, 0xFF, 0xC7, 0x97, 0x5A, 0xFF, 0xC7, 0x98, + 0x5A, 0xFF, 0xC7, 0x99, 0x5A, 0xFF, 0xC7, 0x98, 0x5A, 0xFF, 0xC6, 0x97, 0x5A, 0xFF, 0xC4, 0x96, + 0x59, 0xFF, 0xC0, 0x95, 0x5A, 0xFF, 0xBB, 0x98, 0x65, 0xFF, 0xC6, 0xB0, 0x95, 0xFF, 0xD9, 0xD3, + 0xCA, 0xFF, 0xE0, 0xDD, 0xDB, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDE, + 0xDE, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, 0xDF, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDD, 0xDE, 0xDF, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xE1, 0xE0, 0xE0, 0xFF, 0xCD, 0xCB, + 0xC5, 0xFF, 0xB1, 0xAA, 0x91, 0xFF, 0xDE, 0xDB, 0xCE, 0xFF, 0xC5, 0xBC, 0xA5, 0xFF, 0xA7, 0x9B, + 0x7E, 0xFF, 0xBE, 0xB4, 0x9F, 0xFF, 0xDD, 0xDA, 0xD3, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xDB, 0xDC, + 0xDB, 0xFF, 0xD4, 0xD0, 0xC9, 0xFF, 0xD6, 0xD5, 0xCE, 0xFF, 0xDD, 0xDF, 0xDD, 0xFF, 0xDB, 0xDC, + 0xDB, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xD8, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDB, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDF, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE1, 0xE3, 0xE2, 0xFF, 0xD9, 0xD9, 0xD5, 0xFF, 0xBC, 0xB6, + 0xA2, 0xFF, 0xA1, 0x94, 0x74, 0xFF, 0x9B, 0x90, 0x71, 0xFF, 0xB9, 0xB3, 0x9E, 0xFF, 0xDC, 0xD9, + 0xD3, 0xFF, 0xDF, 0xDD, 0xDD, 0xFF, 0xDC, 0xDB, 0xDC, 0xFF, 0xDF, 0xDD, 0xDE, 0xFF, 0xE1, 0xDD, + 0xD5, 0xFF, 0xC7, 0xBA, 0xA5, 0xFF, 0xA1, 0x84, 0x55, 0xFF, 0xA1, 0x77, 0x36, 0xFF, 0xAE, 0x7D, + 0x38, 0xFF, 0xB7, 0x81, 0x3B, 0xFF, 0xBB, 0x83, 0x3B, 0xFF, 0xBD, 0x84, 0x3B, 0xFF, 0xBD, 0x84, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBC, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBE, 0x85, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBC, 0x84, 0x3A, 0xFF, 0xBC, 0x83, + 0x3A, 0xFF, 0xBB, 0x83, 0x3A, 0xFF, 0xBA, 0x83, 0x3D, 0xFF, 0xBE, 0x89, 0x46, 0xFF, 0xC4, 0x93, + 0x55, 0xFF, 0xD2, 0xAF, 0x84, 0xFD, 0xDB, 0xBE, 0x9B, 0xC1, 0xDE, 0xC1, 0x9F, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC4, 0xA5, 0x09, 0xDF, 0xC3, 0xA3, 0x68, 0xCE, 0xAA, + 0x80, 0xDE, 0xBD, 0x8C, 0x54, 0xFE, 0xB8, 0x82, 0x49, 0xFF, 0xB2, 0x79, 0x3D, 0xFF, 0xB0, 0x76, + 0x38, 0xFF, 0xB3, 0x78, 0x38, 0xFF, 0xB4, 0x7A, 0x39, 0xFF, 0xB6, 0x7D, 0x3A, 0xFF, 0xB7, 0x7F, + 0x3B, 0xFF, 0xB9, 0x81, 0x3B, 0xFF, 0xBA, 0x82, 0x3C, 0xFF, 0xBC, 0x83, 0x3C, 0xFF, 0xBD, 0x84, + 0x3C, 0xFF, 0xBE, 0x85, 0x3C, 0xFF, 0xBE, 0x86, 0x3D, 0xFF, 0xBF, 0x86, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xC0, 0x8A, 0x42, 0xFF, 0xC5, 0x91, + 0x4D, 0xFF, 0xC7, 0x98, 0x59, 0xFF, 0xC9, 0x9A, 0x5D, 0xFF, 0xCA, 0x9B, 0x5D, 0xFF, 0xC9, 0x9B, + 0x5D, 0xFF, 0xC9, 0x9B, 0x5D, 0xFF, 0xC9, 0x9B, 0x5D, 0xFF, 0xC9, 0x9A, 0x5D, 0xFF, 0xC8, 0x9A, + 0x5D, 0xFF, 0xC6, 0x99, 0x5E, 0xFF, 0xC0, 0x98, 0x5F, 0xFF, 0xBF, 0x9D, 0x6E, 0xFF, 0xCA, 0xB9, + 0x9E, 0xFF, 0xDD, 0xD8, 0xD2, 0xFF, 0xDF, 0xDE, 0xDE, 0xFF, 0xDE, 0xDF, 0xE0, 0xFF, 0xDD, 0xDF, + 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xDF, 0xE0, + 0xE1, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xC8, 0xC5, + 0xBD, 0xFF, 0xBC, 0xB5, 0x9F, 0xFF, 0xE6, 0xE4, 0xE1, 0xFF, 0xE0, 0xDD, 0xD4, 0xFF, 0xBC, 0xB4, + 0x9F, 0xFF, 0xAC, 0xA0, 0x81, 0xFF, 0xB9, 0xAD, 0x94, 0xFF, 0xDB, 0xD6, 0xCE, 0xFF, 0xE2, 0xE1, + 0xE1, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xDD, 0xDE, 0xDD, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDC, + 0xDC, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, 0xDB, 0xFF, 0xD9, 0xDA, 0xDA, 0xFF, 0xDA, 0xDB, + 0xDB, 0xFF, 0xDC, 0xDD, 0xDE, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xE0, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE3, 0xE2, 0xFF, 0xE1, 0xE3, 0xE3, 0xFF, 0xDF, 0xDF, + 0xDE, 0xFF, 0xC9, 0xC4, 0xB6, 0xFF, 0xA4, 0x98, 0x7C, 0xFF, 0x99, 0x8E, 0x6E, 0xFF, 0xB9, 0xB3, + 0xA0, 0xFF, 0xDC, 0xDA, 0xD4, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDE, 0xDE, 0xE0, 0xFF, 0xE2, 0xE0, + 0xDF, 0xFF, 0xDE, 0xD7, 0xCE, 0xFF, 0xB0, 0x99, 0x75, 0xFF, 0xA5, 0x7A, 0x3C, 0xFF, 0xB1, 0x7F, + 0x3D, 0xFF, 0xB8, 0x82, 0x3D, 0xFF, 0xBC, 0x84, 0x3C, 0xFF, 0xBF, 0x86, 0x3C, 0xFF, 0xBF, 0x86, + 0x3D, 0xFF, 0xBF, 0x86, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x87, 0x3D, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x84, 0x3C, 0xFF, 0xBC, 0x85, 0x3F, 0xFF, 0xC1, 0x8D, 0x4B, 0xFF, 0xC7, 0x98, + 0x5B, 0xFF, 0xD3, 0xB2, 0x88, 0xF9, 0xDC, 0xC0, 0x9D, 0xB2, 0xDF, 0xC4, 0xA3, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC5, 0xA6, 0x06, 0xDF, 0xC3, 0xA3, 0x55, 0xD1, 0xAD, + 0x83, 0xD8, 0xC0, 0x90, 0x58, 0xFF, 0xBB, 0x86, 0x4D, 0xFF, 0xB5, 0x7C, 0x41, 0xFF, 0xB3, 0x79, + 0x3B, 0xFF, 0xB5, 0x7A, 0x3A, 0xFF, 0xB6, 0x7C, 0x3B, 0xFF, 0xB7, 0x7F, 0x3C, 0xFF, 0xBA, 0x81, + 0x3D, 0xFF, 0xBB, 0x83, 0x3D, 0xFF, 0xBC, 0x84, 0x3D, 0xFF, 0xBD, 0x85, 0x3E, 0xFF, 0xBE, 0x86, + 0x3E, 0xFF, 0xBF, 0x87, 0x3F, 0xFF, 0xBF, 0x88, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x8B, 0x42, 0xFF, 0xC5, 0x92, 0x4E, 0xFF, 0xCA, 0x9B, + 0x5C, 0xFF, 0xCA, 0x9D, 0x62, 0xFF, 0xCB, 0x9E, 0x61, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xCB, 0x9E, + 0x61, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xCB, 0x9E, 0x61, 0xFF, 0xCB, 0x9E, 0x61, 0xFF, 0xCA, 0x9D, + 0x60, 0xFF, 0xCA, 0x9D, 0x61, 0xFF, 0xC8, 0x9C, 0x60, 0xFF, 0xC3, 0x9B, 0x63, 0xFF, 0xC0, 0xA2, + 0x74, 0xFF, 0xD0, 0xC0, 0xAB, 0xFF, 0xDF, 0xDC, 0xD6, 0xFF, 0xE4, 0xE2, 0xE3, 0xFF, 0xE1, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE1, 0xE2, + 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, 0xDF, 0xFF, 0xE3, 0xE2, 0xE0, 0xFF, 0xC9, 0xC5, + 0xB9, 0xFF, 0xBE, 0xB8, 0xA1, 0xFF, 0xE4, 0xE4, 0xE0, 0xFF, 0xE8, 0xE5, 0xE4, 0xFF, 0xE0, 0xDE, + 0xD8, 0xFF, 0xBB, 0xB4, 0xA3, 0xFF, 0xA8, 0x9D, 0x7F, 0xFF, 0xB6, 0xAA, 0x92, 0xFF, 0xDA, 0xD6, + 0xCE, 0xFF, 0xE1, 0xE0, 0xE1, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDD, 0xDD, + 0xDE, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDB, 0xDC, 0xDD, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDA, 0xDB, + 0xDA, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE2, + 0xE1, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE3, 0xE4, 0xE3, 0xFF, 0xE3, 0xE4, 0xE3, 0xFF, 0xE2, 0xE4, + 0xE3, 0xFF, 0xE3, 0xE3, 0xE1, 0xFF, 0xD2, 0xCE, 0xC4, 0xFF, 0xAD, 0xA3, 0x8A, 0xFF, 0x9A, 0x92, + 0x75, 0xFF, 0xB9, 0xB4, 0xA0, 0xFF, 0xDC, 0xD9, 0xD5, 0xFF, 0xE1, 0xE0, 0xDF, 0xFF, 0xE1, 0xE0, + 0xDE, 0xFF, 0xE1, 0xDC, 0xD7, 0xFF, 0xB8, 0xA5, 0x82, 0xFF, 0xA9, 0x7C, 0x3F, 0xFF, 0xB4, 0x82, + 0x40, 0xFF, 0xB9, 0x84, 0x3F, 0xFF, 0xBE, 0x87, 0x3E, 0xFF, 0xC1, 0x88, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xBF, 0x88, 0x3E, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3E, 0xFF, 0xBE, 0x88, 0x42, 0xFF, 0xC3, 0x91, 0x50, 0xFF, 0xC9, 0x9C, + 0x60, 0xFF, 0xD5, 0xB5, 0x8B, 0xF3, 0xDE, 0xC5, 0xA2, 0xA0, 0xE2, 0xC9, 0xA9, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xC6, 0xA7, 0x05, 0xDE, 0xC2, 0xA2, 0x40, 0xD3, 0xAF, + 0x84, 0xCC, 0xC4, 0x95, 0x60, 0xFC, 0xBE, 0x8A, 0x52, 0xFF, 0xB8, 0x80, 0x44, 0xFF, 0xB5, 0x7C, + 0x3D, 0xFF, 0xB6, 0x7C, 0x3C, 0xFF, 0xB7, 0x7E, 0x3D, 0xFF, 0xBA, 0x81, 0x3E, 0xFF, 0xBB, 0x83, + 0x3F, 0xFF, 0xBD, 0x85, 0x3F, 0xFF, 0xBE, 0x86, 0x3F, 0xFF, 0xBF, 0x87, 0x3F, 0xFF, 0xC0, 0x88, + 0x40, 0xFF, 0xC1, 0x89, 0x40, 0xFF, 0xC1, 0x8A, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC3, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8B, 0x41, 0xFF, 0xC2, 0x8A, + 0x41, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8B, 0x40, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8B, + 0x41, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC6, 0x92, 0x4C, 0xFF, 0xCA, 0x9B, 0x5B, 0xFF, 0xCC, 0xA0, + 0x64, 0xFF, 0xCD, 0xA1, 0x65, 0xFF, 0xCD, 0xA0, 0x65, 0xFF, 0xCE, 0xA0, 0x64, 0xFF, 0xCD, 0xA0, + 0x64, 0xFF, 0xCE, 0xA1, 0x64, 0xFF, 0xCD, 0xA0, 0x64, 0xFF, 0xCD, 0xA0, 0x64, 0xFF, 0xCD, 0xA0, + 0x64, 0xFF, 0xCC, 0xA0, 0x63, 0xFF, 0xCC, 0xA0, 0x63, 0xFF, 0xC9, 0x9E, 0x64, 0xFF, 0xC3, 0x9D, + 0x68, 0xFF, 0xC5, 0xA8, 0x7E, 0xFF, 0xD4, 0xC8, 0xB6, 0xFF, 0xE2, 0xE0, 0xDB, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE3, 0xE4, 0xFF, 0xE2, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE5, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE3, 0xE2, 0xFF, 0xE4, 0xE3, 0xE2, 0xFF, 0xCE, 0xCA, + 0xBE, 0xFF, 0xBE, 0xB6, 0x9C, 0xFF, 0xDD, 0xDB, 0xD5, 0xFF, 0xE4, 0xE2, 0xE2, 0xFF, 0xE7, 0xE5, + 0xE5, 0xFF, 0xDD, 0xDB, 0xD6, 0xFF, 0xBF, 0xB7, 0xA1, 0xFF, 0xB1, 0xA3, 0x85, 0xFF, 0xBE, 0xB4, + 0x9E, 0xFF, 0xDA, 0xD5, 0xCD, 0xFF, 0xDE, 0xDC, 0xDB, 0xFF, 0xDB, 0xDA, 0xD9, 0xFF, 0xDB, 0xDB, + 0xDA, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xDD, 0xDE, 0xDD, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDD, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDD, 0xDE, 0xDF, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE4, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xDD, 0xD9, 0xD3, 0xFF, 0xB3, 0xAC, + 0x96, 0xFF, 0x9E, 0x94, 0x76, 0xFF, 0xBB, 0xB3, 0x9F, 0xFF, 0xDD, 0xDA, 0xD3, 0xFF, 0xE4, 0xE2, + 0xDE, 0xFF, 0xE4, 0xDF, 0xD9, 0xFF, 0xBC, 0xA7, 0x81, 0xFF, 0xAC, 0x7D, 0x40, 0xFF, 0xB7, 0x85, + 0x43, 0xFF, 0xBB, 0x86, 0x40, 0xFF, 0xBF, 0x89, 0x40, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8B, 0x41, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC0, 0x89, 0x41, 0xFF, 0xBF, 0x8A, 0x44, 0xFF, 0xC7, 0x95, 0x57, 0xFF, 0xCB, 0x9F, + 0x66, 0xFF, 0xD7, 0xB8, 0x8F, 0xEB, 0xE2, 0xCA, 0xAA, 0x8B, 0xE5, 0xCD, 0xAF, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xC8, 0xAA, 0x04, 0xDF, 0xC2, 0x9E, 0x2E, 0xD4, 0xB1, + 0x88, 0xB6, 0xC6, 0x9A, 0x67, 0xFA, 0xC1, 0x8F, 0x57, 0xFF, 0xBA, 0x83, 0x48, 0xFF, 0xB7, 0x7F, + 0x40, 0xFF, 0xB8, 0x7F, 0x3E, 0xFF, 0xBA, 0x80, 0x3F, 0xFF, 0xBB, 0x83, 0x40, 0xFF, 0xBD, 0x85, + 0x41, 0xFF, 0xBE, 0x87, 0x41, 0xFF, 0xC0, 0x88, 0x42, 0xFF, 0xC1, 0x8A, 0x42, 0xFF, 0xC1, 0x8A, + 0x42, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC2, 0x8C, 0x43, 0xFF, 0xC3, 0x8D, 0x43, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8E, + 0x43, 0xFF, 0xC7, 0x91, 0x4B, 0xFF, 0xCB, 0x9C, 0x5B, 0xFF, 0xCD, 0xA1, 0x65, 0xFF, 0xCE, 0xA2, + 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, + 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, + 0x67, 0xFF, 0xCF, 0xA3, 0x67, 0xFF, 0xCE, 0xA2, 0x67, 0xFF, 0xCC, 0xA1, 0x67, 0xFF, 0xC9, 0xA1, + 0x67, 0xFF, 0xC5, 0xA0, 0x6C, 0xFF, 0xC7, 0xAD, 0x85, 0xFF, 0xD9, 0xCF, 0xC1, 0xFF, 0xE4, 0xE3, + 0xDF, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE4, 0xE6, + 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE7, 0xE5, 0xE4, 0xFF, 0xD1, 0xCC, + 0xC4, 0xFF, 0xBA, 0xAC, 0x8F, 0xFF, 0xC6, 0xBC, 0xA6, 0xFF, 0xD4, 0xCE, 0xBF, 0xFF, 0xDB, 0xD8, + 0xD6, 0xFF, 0xE3, 0xE3, 0xE2, 0xFF, 0xDF, 0xDF, 0xD6, 0xFF, 0xC3, 0xB8, 0xA2, 0xFF, 0xB6, 0xAB, + 0x8E, 0xFF, 0xBE, 0xB3, 0x9B, 0xFF, 0xCB, 0xC1, 0xB2, 0xFF, 0xCC, 0xC6, 0xBA, 0xFF, 0xD0, 0xCE, + 0xC5, 0xFF, 0xDA, 0xDB, 0xD7, 0xFF, 0xDD, 0xDF, 0xDF, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE3, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE0, 0xDF, + 0xD9, 0xFF, 0xC1, 0xBB, 0xA9, 0xFF, 0xA6, 0x9C, 0x7F, 0xFF, 0xBD, 0xB4, 0x9D, 0xFF, 0xE1, 0xDC, + 0xD2, 0xFF, 0xE5, 0xDC, 0xD0, 0xFF, 0xB9, 0x9F, 0x74, 0xFF, 0xB1, 0x83, 0x43, 0xFF, 0xBB, 0x89, + 0x44, 0xFF, 0xBE, 0x8A, 0x43, 0xFF, 0xC2, 0x8C, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC3, 0x8B, 0x42, 0xFF, 0xC2, 0x8A, + 0x41, 0xFF, 0xC1, 0x8B, 0x43, 0xFF, 0xC1, 0x8D, 0x48, 0xFF, 0xCA, 0x99, 0x5C, 0xFF, 0xCE, 0xA4, + 0x6B, 0xFF, 0xDA, 0xBA, 0x93, 0xE1, 0xE5, 0xCF, 0xB2, 0x72, 0xE8, 0xD2, 0xB5, 0x0D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xD2, 0xB6, 0x04, 0xE6, 0xCC, 0xAF, 0x23, 0xD9, 0xB9, + 0x92, 0x9D, 0xCA, 0xA1, 0x6F, 0xF4, 0xC4, 0x94, 0x5D, 0xFF, 0xBC, 0x87, 0x4C, 0xFF, 0xB9, 0x81, + 0x43, 0xFF, 0xBA, 0x81, 0x41, 0xFF, 0xBB, 0x82, 0x40, 0xFF, 0xBD, 0x85, 0x42, 0xFF, 0xBE, 0x87, + 0x42, 0xFF, 0xC0, 0x89, 0x43, 0xFF, 0xC2, 0x8A, 0x44, 0xFF, 0xC3, 0x8B, 0x44, 0xFF, 0xC3, 0x8C, + 0x44, 0xFF, 0xC3, 0x8D, 0x44, 0xFF, 0xC4, 0x8E, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8E, 0x45, 0xFF, 0xC5, 0x8E, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC6, 0x8F, 0x45, 0xFF, 0xC6, 0x90, + 0x48, 0xFF, 0xCA, 0x98, 0x56, 0xFF, 0xCF, 0xA2, 0x66, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xCF, 0xA5, + 0x6A, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, + 0x6B, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xD0, 0xA5, 0x6B, 0xFF, 0xD0, 0xA5, + 0x6B, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xD0, 0xA5, 0x6A, 0xFF, 0xCF, 0xA4, 0x6A, 0xFF, 0xCE, 0xA5, + 0x6A, 0xFF, 0xCB, 0xA3, 0x6B, 0xFF, 0xC6, 0xA3, 0x71, 0xFF, 0xCD, 0xB5, 0x91, 0xFF, 0xDD, 0xD7, + 0xCB, 0xFF, 0xE6, 0xE6, 0xE3, 0xFF, 0xE7, 0xE8, 0xE7, 0xFF, 0xE6, 0xE8, 0xE8, 0xFF, 0xE6, 0xE8, + 0xE8, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE9, 0xE8, 0xE6, 0xFF, 0xCC, 0xC7, + 0xBE, 0xFF, 0xAF, 0x9F, 0x7F, 0xFF, 0xAD, 0x9A, 0x75, 0xFF, 0xB2, 0xA0, 0x7B, 0xFF, 0xBF, 0xB3, + 0x9B, 0xFF, 0xDF, 0xD9, 0xD0, 0xFF, 0xE7, 0xE7, 0xE5, 0xFF, 0xD6, 0xD0, 0xC3, 0xFF, 0xBA, 0xAC, + 0x91, 0xFF, 0xB0, 0xA0, 0x7D, 0xFF, 0xB0, 0x9F, 0x77, 0xFF, 0xB5, 0xA5, 0x81, 0xFF, 0xC1, 0xB5, + 0x9D, 0xFF, 0xD8, 0xD3, 0xCA, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xDE, 0xE0, 0xE0, 0xFF, 0xDF, 0xE1, + 0xE2, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDE, 0xDF, + 0xDF, 0xFF, 0xDE, 0xDF, 0xE0, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE4, 0xE5, + 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE8, 0xE9, + 0xE8, 0xFF, 0xE5, 0xE3, 0xDE, 0xFF, 0xCE, 0xC8, 0xB7, 0xFF, 0xB9, 0xAD, 0x91, 0xFF, 0xC4, 0xBC, + 0xA3, 0xFF, 0xD9, 0xCA, 0xAD, 0xFF, 0xB6, 0x94, 0x5E, 0xFF, 0xB6, 0x86, 0x43, 0xFF, 0xBC, 0x8B, + 0x44, 0xFF, 0xC0, 0x8C, 0x44, 0xFF, 0xC3, 0x8E, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, 0x45, 0xFF, 0xC5, 0x8F, + 0x45, 0xFF, 0xC5, 0x8E, 0x45, 0xFF, 0xC4, 0x8E, 0x44, 0xFF, 0xC4, 0x8D, 0x44, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC3, 0x8D, 0x45, 0xFF, 0xC4, 0x91, 0x4B, 0xFF, 0xCB, 0x9C, 0x63, 0xFF, 0xD0, 0xA8, + 0x72, 0xFF, 0xDD, 0xBE, 0x98, 0xD5, 0xE8, 0xD2, 0xB7, 0x58, 0xEA, 0xD3, 0xB8, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xE4, 0xD8, 0x02, 0xF9, 0xEE, 0xE1, 0x15, 0xE1, 0xC1, + 0x9D, 0x86, 0xCE, 0xA5, 0x74, 0xED, 0xC6, 0x98, 0x64, 0xFE, 0xBF, 0x8B, 0x51, 0xFF, 0xBB, 0x84, + 0x46, 0xFF, 0xBC, 0x84, 0x44, 0xFF, 0xBD, 0x85, 0x44, 0xFF, 0xBF, 0x87, 0x44, 0xFF, 0xC1, 0x8A, + 0x45, 0xFF, 0xC2, 0x8B, 0x46, 0xFF, 0xC3, 0x8C, 0x46, 0xFF, 0xC4, 0x8D, 0x46, 0xFF, 0xC4, 0x8E, + 0x47, 0xFF, 0xC5, 0x8F, 0x47, 0xFF, 0xC6, 0x90, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC6, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x47, 0xFF, 0xC6, 0x91, 0x47, 0xFF, 0xC8, 0x92, 0x48, 0xFF, 0xC8, 0x96, + 0x51, 0xFF, 0xCF, 0xA2, 0x65, 0xFF, 0xD1, 0xA8, 0x6D, 0xFF, 0xD2, 0xA9, 0x6F, 0xFF, 0xD1, 0xA8, + 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD1, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, + 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD1, 0xA8, + 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xD1, 0xA8, + 0x6E, 0xFF, 0xCF, 0xA7, 0x6E, 0xFF, 0xCB, 0xA5, 0x6E, 0xFF, 0xC8, 0xA7, 0x74, 0xFF, 0xCE, 0xBA, + 0x9A, 0xFF, 0xE0, 0xDB, 0xD3, 0xFF, 0xE8, 0xE8, 0xE5, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xEA, + 0xEA, 0xFF, 0xE7, 0xE9, 0xEA, 0xFF, 0xE8, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xE7, 0xFF, 0xCA, 0xC6, + 0xB6, 0xFF, 0x9F, 0x91, 0x6C, 0xFF, 0xA6, 0x95, 0x6A, 0xFF, 0xA9, 0x98, 0x6F, 0xFF, 0xAA, 0x9C, + 0x7D, 0xFF, 0xD2, 0xCC, 0xBF, 0xFF, 0xE5, 0xE4, 0xE1, 0xFF, 0xDA, 0xD8, 0xD0, 0xFF, 0xB7, 0xAA, + 0x91, 0xFF, 0xA8, 0x96, 0x6F, 0xFF, 0xA7, 0x95, 0x6B, 0xFF, 0xAB, 0x98, 0x70, 0xFF, 0xB6, 0xA8, + 0x8B, 0xFF, 0xD6, 0xCF, 0xC6, 0xFF, 0xE1, 0xDF, 0xE0, 0xFF, 0xDF, 0xE0, 0xE2, 0xFF, 0xDF, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE0, 0xE1, + 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE6, 0xE7, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE7, 0xE5, 0xE1, 0xFF, 0xDC, 0xD6, 0xCD, 0xFF, 0xC7, 0xBD, + 0xA0, 0xFF, 0xC1, 0xA7, 0x7C, 0xFF, 0xB5, 0x8D, 0x52, 0xFF, 0xB6, 0x87, 0x43, 0xFF, 0xBE, 0x8D, + 0x45, 0xFF, 0xC3, 0x8F, 0x47, 0xFF, 0xC5, 0x90, 0x47, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC6, 0x91, + 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC6, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC6, 0x91, 0x48, 0xFF, 0xC6, 0x91, 0x48, 0xFF, 0xC6, 0x90, 0x47, 0xFF, 0xC5, 0x8F, + 0x46, 0xFF, 0xC5, 0x90, 0x48, 0xFF, 0xC7, 0x95, 0x51, 0xFF, 0xCE, 0xA1, 0x69, 0xFF, 0xD5, 0xAE, + 0x79, 0xFE, 0xE2, 0xC4, 0x9D, 0xBD, 0xEC, 0xD3, 0xB9, 0x3C, 0xE9, 0xD3, 0xB9, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xE9, 0xD8, 0x0E, 0xD9, 0xB8, + 0x8E, 0x65, 0xD0, 0xA8, 0x77, 0xE0, 0xCA, 0x9E, 0x6A, 0xFE, 0xC3, 0x8F, 0x57, 0xFF, 0xBE, 0x87, + 0x49, 0xFF, 0xBF, 0x86, 0x46, 0xFF, 0xBF, 0x87, 0x46, 0xFF, 0xC1, 0x8A, 0x46, 0xFF, 0xC2, 0x8C, + 0x47, 0xFF, 0xC4, 0x8E, 0x48, 0xFF, 0xC5, 0x8E, 0x48, 0xFF, 0xC5, 0x8F, 0x48, 0xFF, 0xC6, 0x90, + 0x49, 0xFF, 0xC7, 0x92, 0x49, 0xFF, 0xC8, 0x92, 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x49, 0xFF, 0xC9, 0x93, 0x49, 0xFF, 0xC8, 0x93, 0x49, 0xFF, 0xC9, 0x95, 0x4E, 0xFF, 0xCD, 0x9F, + 0x5D, 0xFF, 0xD2, 0xA8, 0x6D, 0xFF, 0xD3, 0xAB, 0x72, 0xFF, 0xD4, 0xAB, 0x72, 0xFF, 0xD3, 0xAB, + 0x71, 0xFF, 0xD4, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, + 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAA, + 0x71, 0xFF, 0xD3, 0xAA, 0x71, 0xFF, 0xD3, 0xAB, 0x71, 0xFF, 0xD4, 0xAB, 0x71, 0xFF, 0xD4, 0xAB, + 0x71, 0xFF, 0xD2, 0xAA, 0x71, 0xFF, 0xCF, 0xA9, 0x70, 0xFF, 0xCD, 0xA7, 0x71, 0xFF, 0xCB, 0xAB, + 0x7B, 0xFF, 0xD3, 0xC1, 0xA7, 0xFF, 0xE3, 0xE0, 0xDA, 0xFF, 0xE9, 0xEA, 0xE8, 0xFF, 0xEA, 0xEB, + 0xEA, 0xFF, 0xE9, 0xEB, 0xEB, 0xFF, 0xE9, 0xEB, 0xEA, 0xFF, 0xE7, 0xE8, 0xE7, 0xFF, 0xD1, 0xD0, + 0xC4, 0xFF, 0xA4, 0x9A, 0x7A, 0xFF, 0xA3, 0x95, 0x6F, 0xFF, 0xA4, 0x94, 0x73, 0xFF, 0xB4, 0xAA, + 0x96, 0xFF, 0xDC, 0xDA, 0xD2, 0xFF, 0xE5, 0xE5, 0xE4, 0xFF, 0xDC, 0xDC, 0xD8, 0xFF, 0xBD, 0xB9, + 0xA7, 0xFF, 0xA3, 0x94, 0x71, 0xFF, 0xA3, 0x8F, 0x6A, 0xFF, 0xA6, 0x95, 0x6E, 0xFF, 0xA9, 0x9D, + 0x7C, 0xFF, 0xD4, 0xD0, 0xC7, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xE0, 0xE2, + 0xE2, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE4, 0xE3, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE3, 0xE4, + 0xE4, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE5, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE6, 0xE8, + 0xEA, 0xFF, 0xE7, 0xE8, 0xEA, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xE1, 0xDF, 0xD9, 0xFF, 0xC5, 0xB9, + 0x9C, 0xFF, 0xB6, 0x99, 0x66, 0xFF, 0xB3, 0x8E, 0x53, 0xFF, 0xB5, 0x89, 0x44, 0xFF, 0xBE, 0x8E, + 0x47, 0xFF, 0xC3, 0x90, 0x49, 0xFF, 0xC5, 0x92, 0x49, 0xFF, 0xC7, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC9, 0x93, 0x4A, 0xFF, 0xC8, 0x93, + 0x4A, 0xFF, 0xC8, 0x93, 0x4A, 0xFF, 0xC7, 0x93, 0x49, 0xFF, 0xC8, 0x92, 0x49, 0xFF, 0xC7, 0x92, + 0x49, 0xFF, 0xC7, 0x93, 0x4C, 0xFF, 0xC9, 0x99, 0x57, 0xFF, 0xD2, 0xA7, 0x70, 0xFF, 0xD9, 0xB3, + 0x80, 0xF8, 0xDF, 0xC4, 0x9F, 0xA2, 0xE4, 0xCE, 0xB5, 0x2C, 0xE1, 0xD0, 0xB8, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC0, 0x9A, 0x05, 0xD9, 0xB8, + 0x8B, 0x47, 0xD6, 0xB0, 0x82, 0xD0, 0xCE, 0xA4, 0x70, 0xFD, 0xC7, 0x95, 0x5D, 0xFF, 0xC2, 0x8C, + 0x4F, 0xFF, 0xC2, 0x8A, 0x4A, 0xFF, 0xC1, 0x8A, 0x48, 0xFF, 0xC3, 0x8C, 0x48, 0xFF, 0xC4, 0x8E, + 0x49, 0xFF, 0xC5, 0x90, 0x4A, 0xFF, 0xC6, 0x91, 0x4B, 0xFF, 0xC7, 0x92, 0x4B, 0xFF, 0xC8, 0x93, + 0x4B, 0xFF, 0xC9, 0x94, 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCB, 0x95, 0x4C, 0xFF, 0xCA, 0x95, + 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCB, 0x95, 0x4C, 0xFF, 0xCA, 0x96, + 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x96, 0x4D, 0xFF, 0xCD, 0x9C, 0x57, 0xFF, 0xD3, 0xA8, + 0x6B, 0xFF, 0xD5, 0xAD, 0x74, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, + 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, + 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAE, + 0x75, 0xFF, 0xD6, 0xAE, 0x75, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD5, 0xAE, 0x75, 0xFF, 0xD5, 0xAD, + 0x75, 0xFF, 0xD5, 0xAD, 0x75, 0xFF, 0xD3, 0xAD, 0x74, 0xFF, 0xD1, 0xAA, 0x74, 0xFF, 0xCD, 0xAA, + 0x76, 0xFF, 0xCE, 0xAF, 0x82, 0xFF, 0xD7, 0xC7, 0xB1, 0xFF, 0xE6, 0xE4, 0xDF, 0xFF, 0xEC, 0xEC, + 0xEA, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEC, 0xEC, 0xFF, 0xEA, 0xEA, 0xEC, 0xFF, 0xE6, 0xE7, + 0xE5, 0xFF, 0xC9, 0xC5, 0xB6, 0xFF, 0xBC, 0xB3, 0x9D, 0xFF, 0xC4, 0xBC, 0xAC, 0xFF, 0xDD, 0xDB, + 0xD0, 0xFF, 0xE3, 0xE4, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE1, 0xE0, 0xE0, 0xFF, 0xD5, 0xD5, + 0xCC, 0xFF, 0xB9, 0xB3, 0x9D, 0xFF, 0xB1, 0xA5, 0x87, 0xFF, 0xAF, 0xA2, 0x81, 0xFF, 0xA5, 0x9B, + 0x7B, 0xFF, 0xD3, 0xCF, 0xC6, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE7, 0xE7, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE7, 0xE8, + 0xEA, 0xFF, 0xE9, 0xEA, 0xEB, 0xFF, 0xE9, 0xE9, 0xE6, 0xFF, 0xD4, 0xD1, 0xC2, 0xFF, 0xBB, 0xAE, + 0x8A, 0xFF, 0xBC, 0xA6, 0x7A, 0xFF, 0xB3, 0x94, 0x5E, 0xFF, 0xB2, 0x89, 0x49, 0xFF, 0xBA, 0x8D, + 0x47, 0xFF, 0xC1, 0x91, 0x49, 0xFF, 0xC4, 0x92, 0x4A, 0xFF, 0xC7, 0x93, 0x4C, 0xFF, 0xC9, 0x95, + 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCA, 0x96, 0x4C, 0xFF, 0xCA, 0x96, + 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x96, 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCA, 0x96, + 0x4C, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xC9, 0x95, 0x4C, 0xFF, 0xCA, 0x95, 0x4B, 0xFF, 0xC9, 0x94, + 0x4C, 0xFF, 0xCA, 0x96, 0x50, 0xFF, 0xCC, 0x9E, 0x5D, 0xFF, 0xD5, 0xAD, 0x77, 0xFF, 0xDC, 0xB8, + 0x86, 0xEE, 0xD7, 0xBC, 0x9A, 0x86, 0xC6, 0xBC, 0xAF, 0x1C, 0xD3, 0xC8, 0xB9, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xB6, 0x8C, 0x02, 0xDE, 0xBF, + 0x97, 0x2C, 0xDC, 0xB9, 0x90, 0xB4, 0xD3, 0xAA, 0x77, 0xF6, 0xCC, 0x9C, 0x63, 0xFF, 0xC6, 0x91, + 0x55, 0xFF, 0xC4, 0x8C, 0x4D, 0xFF, 0xC3, 0x8C, 0x4A, 0xFF, 0xC5, 0x8D, 0x4A, 0xFF, 0xC5, 0x8F, + 0x4B, 0xFF, 0xC7, 0x92, 0x4C, 0xFF, 0xC8, 0x93, 0x4D, 0xFF, 0xC9, 0x94, 0x4D, 0xFF, 0xCA, 0x95, + 0x4D, 0xFF, 0xCB, 0x96, 0x4D, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCC, 0x98, + 0x4E, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCC, 0x97, 0x4D, 0xFF, 0xCC, 0x97, 0x4D, 0xFF, 0xCC, 0x98, + 0x4D, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCC, 0x99, 0x51, 0xFF, 0xD2, 0xA3, 0x62, 0xFF, 0xD6, 0xAE, + 0x75, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x78, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x77, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x78, 0xFF, 0xD8, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xB0, + 0x78, 0xFF, 0xD7, 0xB0, 0x78, 0xFF, 0xD7, 0xAF, 0x78, 0xFF, 0xD5, 0xAE, 0x77, 0xFF, 0xD1, 0xAD, + 0x77, 0xFF, 0xD1, 0xAD, 0x7B, 0xFF, 0xD3, 0xB5, 0x89, 0xFF, 0xDB, 0xCE, 0xBC, 0xFF, 0xE9, 0xE8, + 0xE4, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEA, 0xE8, 0xE7, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xE7, 0xE8, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xE7, 0xE6, 0xE7, 0xFF, 0xE5, 0xE5, + 0xE4, 0xFF, 0xDD, 0xDC, 0xD8, 0xFF, 0xD4, 0xD3, 0xCD, 0xFF, 0xCF, 0xCC, 0xC2, 0xFF, 0xBD, 0xBA, + 0xA9, 0xFF, 0xD7, 0xD7, 0xD1, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE4, 0xE5, + 0xE5, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, + 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE5, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE9, 0xEA, + 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xE7, 0xFF, 0xCD, 0xC7, 0xB7, 0xFF, 0xB3, 0xA7, + 0x88, 0xFF, 0xC5, 0xB3, 0x8F, 0xFF, 0xC2, 0xAA, 0x7C, 0xFF, 0xB4, 0x91, 0x5A, 0xFF, 0xB5, 0x8D, + 0x4D, 0xFF, 0xBB, 0x8F, 0x4A, 0xFF, 0xC1, 0x92, 0x4B, 0xFF, 0xC5, 0x93, 0x4C, 0xFF, 0xC8, 0x96, + 0x4D, 0xFF, 0xCA, 0x97, 0x4D, 0xFF, 0xCB, 0x97, 0x4E, 0xFF, 0xCC, 0x98, 0x4E, 0xFF, 0xCC, 0x98, + 0x4E, 0xFF, 0xCC, 0x98, 0x4E, 0xFF, 0xCC, 0x98, 0x4E, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCC, 0x98, + 0x4E, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCB, 0x97, 0x4D, 0xFF, 0xCC, 0x97, 0x4E, 0xFF, 0xCB, 0x96, + 0x4F, 0xFF, 0xCC, 0x9A, 0x55, 0xFF, 0xCF, 0xA3, 0x64, 0xFF, 0xDA, 0xB2, 0x7F, 0xFD, 0xE0, 0xBE, + 0x8F, 0xDE, 0xDE, 0xC2, 0x9C, 0x64, 0xC3, 0xB6, 0xA5, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xC9, + 0xA5, 0x1A, 0xE1, 0xC1, 0x9B, 0x8E, 0xD5, 0xAF, 0x7D, 0xEA, 0xCE, 0xA2, 0x6A, 0xFF, 0xCA, 0x97, + 0x5C, 0xFF, 0xC6, 0x90, 0x51, 0xFF, 0xC5, 0x8E, 0x4D, 0xFF, 0xC7, 0x90, 0x4D, 0xFF, 0xC8, 0x92, + 0x4D, 0xFF, 0xC9, 0x94, 0x4F, 0xFF, 0xCA, 0x95, 0x4F, 0xFF, 0xCB, 0x96, 0x4F, 0xFF, 0xCC, 0x97, + 0x4F, 0xFF, 0xCD, 0x98, 0x50, 0xFF, 0xCD, 0x99, 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, + 0x50, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, 0x4F, 0xFF, 0xCE, 0x9A, + 0x4F, 0xFF, 0xCF, 0x9B, 0x51, 0xFF, 0xCF, 0x9F, 0x57, 0xFF, 0xD6, 0xAB, 0x6F, 0xFF, 0xD9, 0xB2, + 0x7A, 0xFF, 0xDA, 0xB3, 0x7C, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB3, 0x7B, 0xFF, 0xD9, 0xB3, + 0x7B, 0xFF, 0xD9, 0xB3, 0x7B, 0xFF, 0xDA, 0xB2, 0x7B, 0xFF, 0xD9, 0xB2, 0x7B, 0xFF, 0xD6, 0xB1, + 0x7A, 0xFF, 0xD3, 0xAF, 0x7B, 0xFF, 0xD0, 0xAF, 0x7E, 0xFF, 0xD1, 0xB7, 0x8E, 0xFF, 0xDA, 0xD2, + 0xC1, 0xFF, 0xEC, 0xEA, 0xE7, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xEE, 0xFF, 0xED, 0xEF, 0xEE, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xEC, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE3, 0xE2, 0xE1, 0xFF, 0xDD, 0xDE, + 0xDA, 0xFF, 0xE1, 0xE4, 0xE2, 0xFF, 0xE5, 0xE6, 0xE7, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE6, 0xE8, + 0xE8, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE5, 0xE6, 0xE6, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xE6, 0xE8, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xF0, 0xF0, 0xEC, 0xFF, 0xD6, 0xD3, 0xC5, 0xFF, 0xB5, 0xAC, + 0x91, 0xFF, 0xC5, 0xB9, 0x9B, 0xFF, 0xCE, 0xC0, 0x9F, 0xFF, 0xBF, 0xA9, 0x81, 0xFF, 0xB3, 0x92, + 0x5B, 0xFF, 0xB3, 0x8D, 0x4E, 0xFF, 0xB8, 0x8F, 0x4B, 0xFF, 0xBF, 0x92, 0x4D, 0xFF, 0xC5, 0x95, + 0x4E, 0xFF, 0xC9, 0x98, 0x4F, 0xFF, 0xCB, 0x99, 0x50, 0xFF, 0xCD, 0x99, 0x50, 0xFF, 0xCD, 0x99, + 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xCF, 0x9A, + 0x50, 0xFF, 0xCE, 0x9A, 0x50, 0xFF, 0xCE, 0x99, 0x4F, 0xFF, 0xCE, 0x99, 0x50, 0xFF, 0xCC, 0x99, + 0x52, 0xFF, 0xCF, 0x9F, 0x5A, 0xFF, 0xD4, 0xA9, 0x6C, 0xFF, 0xDD, 0xB8, 0x88, 0xFC, 0xE0, 0xC1, + 0x98, 0xCA, 0xDE, 0xC3, 0x9F, 0x43, 0xDE, 0xC2, 0x9F, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xCC, + 0xA9, 0x0E, 0xE2, 0xC3, 0x9D, 0x64, 0xD8, 0xB4, 0x83, 0xD9, 0xD2, 0xA8, 0x71, 0xFF, 0xCE, 0x9D, + 0x62, 0xFE, 0xC8, 0x94, 0x55, 0xFF, 0xC7, 0x91, 0x4F, 0xFF, 0xC9, 0x92, 0x4E, 0xFF, 0xC9, 0x93, + 0x4F, 0xFF, 0xCB, 0x96, 0x50, 0xFF, 0xCB, 0x97, 0x50, 0xFF, 0xCD, 0x98, 0x51, 0xFF, 0xCE, 0x99, + 0x51, 0xFF, 0xCF, 0x9A, 0x51, 0xFF, 0xCF, 0x9B, 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD0, 0x9C, + 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xCF, 0x9C, 0x51, 0xFF, 0xD0, 0x9C, 0x51, 0xFF, 0xD0, 0x9C, + 0x52, 0xFF, 0xD1, 0x9D, 0x54, 0xFF, 0xD2, 0xA4, 0x5E, 0xFF, 0xD9, 0xB1, 0x77, 0xFF, 0xDB, 0xB5, + 0x7E, 0xFF, 0xDB, 0xB6, 0x7F, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDC, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, + 0x7E, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, + 0x7D, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, + 0x7D, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, + 0x7E, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7E, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDA, 0xB4, + 0x7E, 0xFF, 0xD8, 0xB3, 0x7D, 0xFF, 0xD4, 0xB2, 0x7D, 0xFF, 0xD4, 0xB3, 0x82, 0xFF, 0xD6, 0xBC, + 0x93, 0xFF, 0xE1, 0xD6, 0xC8, 0xFF, 0xED, 0xED, 0xE9, 0xFF, 0xEE, 0xED, 0xED, 0xFF, 0xED, 0xEE, + 0xEF, 0xFF, 0xED, 0xEE, 0xEF, 0xFF, 0xEE, 0xEF, 0xEE, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEF, + 0xEF, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEB, 0xED, 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEB, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xE8, + 0xE8, 0xFF, 0xE7, 0xE8, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, + 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xED, 0xED, + 0xEC, 0xFF, 0xEE, 0xEF, 0xED, 0xFF, 0xF0, 0xF0, 0xEF, 0xFF, 0xED, 0xEC, 0xE9, 0xFF, 0xD3, 0xCF, + 0xBF, 0xFF, 0xBF, 0xB7, 0x9F, 0xFF, 0xC9, 0xBF, 0xA5, 0xFF, 0xD1, 0xC5, 0xA9, 0xFF, 0xC1, 0xB0, + 0x8A, 0xFF, 0xB2, 0x96, 0x62, 0xFF, 0xB0, 0x8C, 0x51, 0xFF, 0xB8, 0x90, 0x4F, 0xFF, 0xC1, 0x95, + 0x4F, 0xFF, 0xC8, 0x98, 0x50, 0xFF, 0xCB, 0x9A, 0x51, 0xFF, 0xCE, 0x9B, 0x52, 0xFF, 0xCF, 0x9C, + 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD1, 0x9C, 0x52, 0xFF, 0xD0, 0x9B, + 0x51, 0xFF, 0xD0, 0x9B, 0x51, 0xFF, 0xD0, 0x9B, 0x51, 0xFF, 0xCF, 0x9B, 0x53, 0xFF, 0xCF, 0x9C, + 0x56, 0xFF, 0xD2, 0xA3, 0x61, 0xFF, 0xD8, 0xAF, 0x75, 0xFF, 0xDD, 0xBB, 0x8E, 0xF9, 0xDE, 0xC1, + 0x9B, 0xA4, 0xDC, 0xC2, 0xA1, 0x29, 0xDB, 0xC3, 0xA0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xC7, + 0xA1, 0x05, 0xE0, 0xBF, 0x97, 0x3F, 0xD9, 0xB8, 0x8A, 0xBE, 0xD6, 0xAD, 0x78, 0xFD, 0xD1, 0xA2, + 0x68, 0xFE, 0xCC, 0x98, 0x5B, 0xFF, 0xC9, 0x94, 0x53, 0xFF, 0xCA, 0x94, 0x51, 0xFF, 0xCB, 0x96, + 0x51, 0xFF, 0xCC, 0x97, 0x51, 0xFF, 0xCD, 0x99, 0x52, 0xFF, 0xCE, 0x9A, 0x53, 0xFF, 0xCF, 0x9B, + 0x53, 0xFF, 0xD0, 0x9D, 0x54, 0xFF, 0xD0, 0x9D, 0x54, 0xFF, 0xD1, 0x9E, 0x54, 0xFF, 0xD1, 0x9E, + 0x54, 0xFF, 0xD2, 0x9F, 0x54, 0xFF, 0xD1, 0x9F, 0x54, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD1, 0x9E, + 0x53, 0xFF, 0xD3, 0xA1, 0x57, 0xFF, 0xD6, 0xAC, 0x69, 0xFF, 0xDC, 0xB6, 0x7E, 0xFF, 0xDC, 0xB8, + 0x82, 0xFF, 0xDD, 0xB8, 0x82, 0xFF, 0xDC, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, + 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB8, 0x81, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDC, 0xB7, + 0x81, 0xFF, 0xDC, 0xB7, 0x81, 0xFF, 0xD9, 0xB6, 0x80, 0xFF, 0xD6, 0xB4, 0x80, 0xFF, 0xD3, 0xB4, + 0x85, 0xFF, 0xD6, 0xBE, 0x9B, 0xFF, 0xE2, 0xDB, 0xCF, 0xFF, 0xED, 0xED, 0xEB, 0xFF, 0xEF, 0xEF, + 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, + 0xF1, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE8, 0xE9, + 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEA, 0xEA, 0xE9, 0xFF, 0xEA, 0xEA, 0xE8, 0xFF, 0xEA, 0xEA, + 0xE8, 0xFF, 0xEB, 0xEC, 0xEA, 0xFF, 0xEC, 0xEE, 0xEC, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xF1, 0xF1, + 0xEE, 0xFF, 0xE3, 0xE0, 0xD5, 0xFF, 0xC5, 0xC0, 0xAB, 0xFF, 0xCD, 0xC6, 0xAF, 0xFF, 0xD8, 0xCF, + 0xB8, 0xFF, 0xCC, 0xBE, 0xA0, 0xFF, 0xB8, 0x9D, 0x6D, 0xFF, 0xB5, 0x91, 0x58, 0xFF, 0xBD, 0x94, + 0x53, 0xFF, 0xC4, 0x98, 0x51, 0xFF, 0xCB, 0x9B, 0x53, 0xFF, 0xCE, 0x9D, 0x54, 0xFF, 0xD0, 0x9E, + 0x54, 0xFF, 0xD1, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, + 0x53, 0xFF, 0xD2, 0x9D, 0x53, 0xFF, 0xD1, 0x9D, 0x53, 0xFF, 0xD1, 0x9E, 0x55, 0xFF, 0xD2, 0xA0, + 0x5B, 0xFF, 0xD6, 0xA8, 0x69, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDF, 0xC0, 0x94, 0xE9, 0xD9, 0xC0, + 0x9F, 0x77, 0xD9, 0xC2, 0xA2, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xE0, + 0xCB, 0x02, 0xF1, 0xDF, 0xC4, 0x23, 0xE0, 0xC2, 0x98, 0x95, 0xD6, 0xB0, 0x7C, 0xF2, 0xD4, 0xA7, + 0x6E, 0xFF, 0xD0, 0x9D, 0x60, 0xFF, 0xCB, 0x97, 0x56, 0xFF, 0xCC, 0x96, 0x53, 0xFF, 0xCC, 0x98, + 0x53, 0xFF, 0xCE, 0x99, 0x53, 0xFF, 0xCE, 0x9B, 0x53, 0xFF, 0xD0, 0x9C, 0x54, 0xFF, 0xD1, 0x9D, + 0x55, 0xFF, 0xD2, 0x9E, 0x56, 0xFF, 0xD2, 0x9F, 0x56, 0xFF, 0xD3, 0xA0, 0x56, 0xFF, 0xD3, 0xA0, + 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD4, 0xA1, 0x56, 0xFF, 0xD3, 0xA1, + 0x56, 0xFF, 0xD5, 0xA4, 0x5C, 0xFF, 0xDA, 0xB1, 0x73, 0xFF, 0xDE, 0xB9, 0x83, 0xFF, 0xDE, 0xBB, + 0x85, 0xFF, 0xDE, 0xBB, 0x84, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, + 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, + 0x84, 0xFF, 0xDE, 0xBA, 0x83, 0xFF, 0xDE, 0xBA, 0x84, 0xFF, 0xDB, 0xB8, 0x83, 0xFF, 0xD7, 0xB7, + 0x83, 0xFF, 0xDA, 0xB9, 0x8B, 0xFF, 0xDB, 0xC4, 0xA0, 0xFF, 0xE7, 0xE0, 0xD6, 0xFF, 0xEE, 0xEE, + 0xEC, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF2, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, + 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xEA, 0xEB, + 0xEB, 0xFF, 0xEA, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE6, 0xE6, 0xE2, 0xFF, 0xE3, 0xE3, 0xDF, 0xFF, 0xE9, 0xEA, + 0xE7, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEC, 0xEE, 0xED, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xF0, 0xF0, + 0xF1, 0xFF, 0xF3, 0xF2, 0xF1, 0xFF, 0xE4, 0xE2, 0xD8, 0xFF, 0xC9, 0xC5, 0xB4, 0xFF, 0xD1, 0xCA, + 0xB9, 0xFF, 0xD9, 0xD2, 0xBD, 0xFF, 0xD3, 0xC7, 0xAB, 0xFF, 0xBA, 0xA1, 0x74, 0xFF, 0xB7, 0x92, + 0x58, 0xFF, 0xC1, 0x97, 0x53, 0xFF, 0xCA, 0x9C, 0x53, 0xFF, 0xCF, 0x9F, 0x55, 0xFF, 0xD1, 0xA0, + 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD3, 0xA1, 0x56, 0xFF, 0xD3, 0xA0, 0x56, 0xFF, 0xD3, 0x9F, + 0x55, 0xFF, 0xD3, 0x9F, 0x55, 0xFF, 0xD2, 0xA0, 0x56, 0xFF, 0xD3, 0xA1, 0x59, 0xFF, 0xD3, 0xA4, + 0x61, 0xFF, 0xDA, 0xAF, 0x74, 0xFF, 0xE3, 0xBC, 0x86, 0xFC, 0xDE, 0xC3, 0x9A, 0xCE, 0xD7, 0xC1, + 0xA5, 0x50, 0xD7, 0xC2, 0xA5, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFD, 0xFF, 0x0B, 0xE9, 0xCE, 0xA9, 0x67, 0xD6, 0xB1, 0x7C, 0xDC, 0xD8, 0xAE, + 0x7A, 0xFF, 0xD3, 0xA3, 0x68, 0xFF, 0xCE, 0x9A, 0x5B, 0xFF, 0xCF, 0x9A, 0x57, 0xFF, 0xCE, 0x9A, + 0x55, 0xFF, 0xD0, 0x9B, 0x55, 0xFF, 0xD1, 0x9D, 0x56, 0xFF, 0xD2, 0x9E, 0x57, 0xFF, 0xD2, 0xA0, + 0x58, 0xFF, 0xD3, 0xA1, 0x58, 0xFF, 0xD3, 0xA1, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA3, + 0x58, 0xFF, 0xD4, 0xA3, 0x58, 0xFF, 0xD4, 0xA3, 0x58, 0xFF, 0xD5, 0xA3, 0x58, 0xFF, 0xD5, 0xA3, + 0x59, 0xFF, 0xD8, 0xA7, 0x61, 0xFF, 0xDD, 0xB6, 0x7B, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x88, 0xFF, 0xE0, 0xBD, 0x88, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, 0x87, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xDF, 0xBD, + 0x86, 0xFF, 0xE0, 0xBD, 0x87, 0xFF, 0xE0, 0xBC, 0x86, 0xFF, 0xDF, 0xBC, 0x87, 0xFF, 0xDC, 0xBA, + 0x85, 0xFF, 0xDA, 0xB9, 0x86, 0xFF, 0xD8, 0xBB, 0x8E, 0xFF, 0xDB, 0xC7, 0xA8, 0xFF, 0xE6, 0xE1, + 0xD7, 0xFF, 0xF2, 0xEF, 0xEC, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xEC, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEC, 0xED, + 0xEB, 0xFF, 0xE4, 0xE5, 0xE0, 0xFF, 0xE2, 0xE3, 0xDD, 0xFF, 0xEA, 0xEB, 0xE9, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEE, 0xFF, 0xED, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xEA, 0xE8, 0xE2, 0xFF, 0xD6, 0xD0, + 0xC2, 0xFF, 0xD3, 0xCC, 0xBA, 0xFF, 0xDE, 0xD7, 0xC3, 0xFF, 0xD7, 0xCA, 0xAF, 0xFF, 0xBC, 0xA0, + 0x6E, 0xFF, 0xBE, 0x97, 0x54, 0xFF, 0xC9, 0x9C, 0x55, 0xFF, 0xCF, 0xA0, 0x58, 0xFF, 0xD2, 0xA2, + 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, + 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD4, 0xA2, 0x58, 0xFF, 0xD5, 0xA4, 0x5D, 0xFF, 0xD7, 0xAA, + 0x69, 0xFF, 0xDE, 0xB6, 0x7E, 0xFF, 0xE7, 0xC1, 0x8B, 0xF5, 0xE0, 0xC5, 0xA1, 0xA7, 0xD5, 0xC3, + 0xAE, 0x2C, 0xD5, 0xC3, 0xAC, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0xFA, 0xFE, 0x02, 0xE5, 0xCA, 0x9F, 0x39, 0xD9, 0xB5, 0x80, 0xB8, 0xDA, 0xB3, + 0x80, 0xF8, 0xD8, 0xAA, 0x72, 0xFF, 0xD2, 0x9F, 0x61, 0xFF, 0xD1, 0x9C, 0x5A, 0xFF, 0xD0, 0x9C, + 0x57, 0xFF, 0xD2, 0x9D, 0x57, 0xFF, 0xD2, 0x9F, 0x58, 0xFF, 0xD4, 0xA0, 0x59, 0xFF, 0xD4, 0xA1, + 0x5A, 0xFF, 0xD4, 0xA2, 0x5A, 0xFF, 0xD5, 0xA3, 0x5A, 0xFF, 0xD6, 0xA4, 0x5A, 0xFF, 0xD6, 0xA4, + 0x5A, 0xFF, 0xD7, 0xA5, 0x5A, 0xFF, 0xD6, 0xA5, 0x5A, 0xFF, 0xD7, 0xA5, 0x5A, 0xFF, 0xD6, 0xA5, + 0x5C, 0xFF, 0xDA, 0xAB, 0x67, 0xFF, 0xDF, 0xBA, 0x82, 0xFF, 0xE2, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8B, 0xFF, 0xE1, 0xBF, 0x8B, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE2, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, + 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBF, 0x8A, 0xFF, 0xE1, 0xBE, 0x89, 0xFF, 0xE1, 0xBE, + 0x89, 0xFF, 0xDF, 0xBD, 0x89, 0xFF, 0xD9, 0xBB, 0x8A, 0xFF, 0xD9, 0xBE, 0x91, 0xFF, 0xDC, 0xCC, + 0xAD, 0xFF, 0xEA, 0xE4, 0xDC, 0xFF, 0xF1, 0xF0, 0xEE, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF1, 0xF3, 0xF3, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF2, + 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xED, 0xEE, 0xEC, 0xFF, 0xE6, 0xE6, + 0xE0, 0xFF, 0xE2, 0xE3, 0xDE, 0xFF, 0xEE, 0xEF, 0xED, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xEF, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xF0, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xF5, 0xF5, 0xF6, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xE8, 0xE7, + 0xE1, 0xFF, 0xDC, 0xDA, 0xD1, 0xFF, 0xE4, 0xE1, 0xD7, 0xFF, 0xEA, 0xE1, 0xD3, 0xFF, 0xC8, 0xB1, + 0x8A, 0xFF, 0xC1, 0x9A, 0x57, 0xFF, 0xCA, 0x9F, 0x59, 0xFF, 0xD0, 0xA1, 0x5A, 0xFF, 0xD4, 0xA3, + 0x5A, 0xFF, 0xD6, 0xA4, 0x5A, 0xFF, 0xD6, 0xA4, 0x59, 0xFF, 0xD6, 0xA4, 0x59, 0xFF, 0xD6, 0xA4, + 0x59, 0xFF, 0xD7, 0xA5, 0x5A, 0xFF, 0xD6, 0xA4, 0x5C, 0xFF, 0xD6, 0xA7, 0x62, 0xFF, 0xD9, 0xAF, + 0x70, 0xFF, 0xE2, 0xBB, 0x86, 0xFE, 0xE8, 0xC7, 0x93, 0xE3, 0xE0, 0xC6, 0xA5, 0x75, 0xDA, 0xC5, + 0xAD, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xC5, 0x96, 0x19, 0xE4, 0xC2, 0x91, 0x8C, 0xDC, 0xB6, + 0x83, 0xE5, 0xDB, 0xB0, 0x79, 0xFF, 0xD6, 0xA6, 0x69, 0xFF, 0xD3, 0xA0, 0x5F, 0xFF, 0xD2, 0x9F, + 0x5B, 0xFF, 0xD3, 0x9F, 0x5A, 0xFF, 0xD4, 0xA0, 0x5B, 0xFF, 0xD5, 0xA2, 0x5B, 0xFF, 0xD5, 0xA3, + 0x5C, 0xFF, 0xD6, 0xA4, 0x5D, 0xFF, 0xD7, 0xA5, 0x5D, 0xFF, 0xD8, 0xA6, 0x5D, 0xFF, 0xD8, 0xA7, + 0x5D, 0xFF, 0xD9, 0xA7, 0x5D, 0xFF, 0xD9, 0xA7, 0x5C, 0xFF, 0xD9, 0xA7, 0x5C, 0xFF, 0xD8, 0xA8, + 0x5F, 0xFF, 0xDC, 0xB0, 0x6C, 0xFF, 0xE1, 0xBE, 0x87, 0xFF, 0xE3, 0xC2, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE4, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8E, 0xFF, 0xE3, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE4, 0xC1, 0x8E, 0xFF, 0xE3, 0xC1, + 0x8D, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE3, 0xC1, 0x8D, 0xFF, 0xE2, 0xC0, + 0x8D, 0xFF, 0xE2, 0xC0, 0x8D, 0xFF, 0xDF, 0xBF, 0x8D, 0xFF, 0xDB, 0xBE, 0x8D, 0xFF, 0xD8, 0xC1, + 0x95, 0xFF, 0xDF, 0xCF, 0xB4, 0xFF, 0xE9, 0xE5, 0xDE, 0xFF, 0xF3, 0xF1, 0xEF, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF4, 0xF4, 0xFF, 0xF1, 0xF3, 0xF3, 0xFF, 0xF1, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, 0xEF, 0xFF, 0xEF, 0xF0, 0xF0, 0xFF, 0xEF, 0xF0, + 0xF0, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xEF, 0xF0, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xED, 0xEE, 0xED, 0xFF, 0xE6, 0xE7, 0xE2, 0xFF, 0xE5, 0xE6, + 0xE1, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xEF, 0xF0, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF0, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xED, 0xED, + 0xEA, 0xFF, 0xEA, 0xE9, 0xE4, 0xFF, 0xF1, 0xF1, 0xF0, 0xFF, 0xF4, 0xF3, 0xF3, 0xFF, 0xF0, 0xF1, + 0xF0, 0xFF, 0xEC, 0xEB, 0xE8, 0xFF, 0xEA, 0xE7, 0xE0, 0xFF, 0xEA, 0xE1, 0xD4, 0xFF, 0xCA, 0xB3, + 0x88, 0xFF, 0xC5, 0x9E, 0x5B, 0xFF, 0xCD, 0xA1, 0x5B, 0xFF, 0xD3, 0xA4, 0x5D, 0xFF, 0xD6, 0xA6, + 0x5D, 0xFF, 0xD8, 0xA6, 0x5C, 0xFF, 0xD8, 0xA6, 0x5C, 0xFF, 0xD8, 0xA7, 0x5C, 0xFF, 0xD8, 0xA7, + 0x5C, 0xFF, 0xD9, 0xA7, 0x5D, 0xFF, 0xD8, 0xA8, 0x60, 0xFF, 0xD8, 0xAC, 0x68, 0xFF, 0xDC, 0xB5, + 0x77, 0xFF, 0xE3, 0xC1, 0x8E, 0xFB, 0xE6, 0xCB, 0x9E, 0xC5, 0xE3, 0xCB, 0xA8, 0x42, 0xE1, 0xC7, + 0xAB, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xD7, 0xB8, 0x09, 0xEC, 0xD1, 0xB0, 0x58, 0xE0, 0xBD, + 0x8D, 0xC3, 0xDE, 0xB5, 0x7F, 0xFD, 0xDB, 0xAE, 0x73, 0xFF, 0xD5, 0xA4, 0x65, 0xFF, 0xD3, 0xA1, + 0x5E, 0xFF, 0xD5, 0xA1, 0x5D, 0xFF, 0xD5, 0xA2, 0x5C, 0xFF, 0xD6, 0xA3, 0x5D, 0xFF, 0xD7, 0xA5, + 0x5E, 0xFF, 0xD8, 0xA6, 0x5E, 0xFF, 0xD8, 0xA7, 0x5F, 0xFF, 0xDA, 0xA8, 0x5F, 0xFF, 0xDA, 0xA8, + 0x5F, 0xFF, 0xDA, 0xA9, 0x5E, 0xFF, 0xDA, 0xA9, 0x5E, 0xFF, 0xDB, 0xA9, 0x5E, 0xFF, 0xDA, 0xAA, + 0x61, 0xFF, 0xDE, 0xB4, 0x72, 0xFF, 0xE3, 0xC1, 0x8C, 0xFF, 0xE6, 0xC4, 0x91, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, + 0x91, 0xFF, 0xE5, 0xC3, 0x91, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE5, 0xC3, + 0x91, 0xFF, 0xE4, 0xC3, 0x90, 0xFF, 0xE3, 0xC3, 0x90, 0xFF, 0xE1, 0xC1, 0x90, 0xFF, 0xDB, 0xC0, + 0x90, 0xFF, 0xDD, 0xC3, 0x99, 0xFF, 0xE1, 0xD2, 0xB7, 0xFF, 0xED, 0xE8, 0xE0, 0xFF, 0xF3, 0xF3, + 0xF1, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF5, 0xFF, 0xF2, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xF1, 0xF2, + 0xF1, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF3, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xF0, 0xF1, + 0xEF, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xEF, 0xFF, 0xE1, 0xDF, + 0xCD, 0xFF, 0xC8, 0xC3, 0xB0, 0xFF, 0xE6, 0xE5, 0xDB, 0xFF, 0xF2, 0xF1, 0xED, 0xFF, 0xF1, 0xF2, + 0xF1, 0xFF, 0xF0, 0xF1, 0xF0, 0xFF, 0xEF, 0xEC, 0xE5, 0xFF, 0xE4, 0xD6, 0xC1, 0xFF, 0xC6, 0xA9, + 0x75, 0xFF, 0xCA, 0xA1, 0x5C, 0xFF, 0xD1, 0xA5, 0x5E, 0xFF, 0xD5, 0xA6, 0x5F, 0xFF, 0xD8, 0xA8, + 0x5F, 0xFF, 0xDA, 0xA8, 0x5E, 0xFF, 0xDA, 0xA8, 0x5E, 0xFF, 0xDB, 0xA9, 0x5E, 0xFF, 0xDA, 0xA9, + 0x5E, 0xFF, 0xDA, 0xA9, 0x60, 0xFF, 0xDA, 0xAB, 0x64, 0xFF, 0xDE, 0xB2, 0x73, 0xFF, 0xE2, 0xBD, + 0x87, 0xFE, 0xE7, 0xC5, 0x97, 0xF1, 0xE9, 0xCD, 0xA4, 0x8F, 0xE8, 0xCE, 0xA8, 0x20, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xDE, 0xC9, 0x01, 0xE9, 0xD4, 0xBA, 0x28, 0xE5, 0xC3, + 0x94, 0x99, 0xE0, 0xBA, 0x86, 0xF0, 0xDE, 0xB4, 0x7B, 0xFF, 0xD9, 0xAA, 0x6E, 0xFF, 0xD6, 0xA5, + 0x63, 0xFF, 0xD7, 0xA4, 0x60, 0xFF, 0xD7, 0xA4, 0x5F, 0xFF, 0xD8, 0xA5, 0x5F, 0xFF, 0xD8, 0xA7, + 0x60, 0xFF, 0xD9, 0xA9, 0x61, 0xFF, 0xD9, 0xAA, 0x61, 0xFF, 0xDA, 0xAA, 0x61, 0xFF, 0xDA, 0xAB, + 0x61, 0xFF, 0xDB, 0xAB, 0x61, 0xFF, 0xDC, 0xAB, 0x60, 0xFF, 0xDC, 0xAB, 0x60, 0xFF, 0xDB, 0xAC, + 0x63, 0xFF, 0xDF, 0xB6, 0x76, 0xFF, 0xE5, 0xC4, 0x91, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE7, 0xC6, 0x94, 0xFF, 0xE6, 0xC6, + 0x94, 0xFF, 0xE6, 0xC6, 0x94, 0xFF, 0xE5, 0xC5, 0x93, 0xFF, 0xE5, 0xC5, 0x94, 0xFF, 0xE2, 0xC3, + 0x92, 0xFF, 0xDE, 0xC2, 0x92, 0xFF, 0xDC, 0xC6, 0x9C, 0xFF, 0xE4, 0xD3, 0xBA, 0xFF, 0xEC, 0xE9, + 0xE0, 0xFF, 0xF5, 0xF4, 0xF1, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF5, + 0xF5, 0xFF, 0xF3, 0xF5, 0xF5, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF1, 0xF2, 0xF3, 0xFF, 0xF1, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xEC, 0xED, 0xEA, 0xFF, 0xED, 0xEE, 0xEA, 0xFF, 0xF2, 0xF3, 0xF2, 0xFF, 0xF2, 0xF3, + 0xF2, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF1, 0xF2, + 0xF3, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF2, 0xF3, 0xF1, 0xFF, 0xE5, 0xE3, 0xD7, 0xFF, 0xBA, 0xB4, + 0x9D, 0xFF, 0xC6, 0xC2, 0xAF, 0xFF, 0xEF, 0xEE, 0xE6, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF2, 0xF1, 0xF0, 0xFF, 0xF0, 0xE7, 0xDB, 0xFF, 0xD3, 0xBE, 0x96, 0xFF, 0xC6, 0xA3, + 0x67, 0xFF, 0xCF, 0xA5, 0x60, 0xFF, 0xD5, 0xA9, 0x62, 0xFF, 0xD9, 0xAA, 0x61, 0xFF, 0xDB, 0xAA, + 0x61, 0xFF, 0xDC, 0xAA, 0x60, 0xFF, 0xDC, 0xAB, 0x61, 0xFF, 0xDC, 0xAB, 0x61, 0xFF, 0xDB, 0xAB, + 0x61, 0xFF, 0xDB, 0xAC, 0x65, 0xFF, 0xDD, 0xAF, 0x6C, 0xFF, 0xE2, 0xBA, 0x80, 0xFF, 0xE7, 0xC5, + 0x92, 0xFE, 0xEE, 0xCA, 0x9D, 0xD3, 0xF1, 0xCF, 0xA5, 0x55, 0xE9, 0xD3, 0xA4, 0x0D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xCC, 0xAE, 0x0E, 0xE3, 0xC3, + 0x96, 0x5C, 0xE2, 0xBE, 0x8C, 0xD2, 0xE1, 0xB9, 0x83, 0xFE, 0xDD, 0xB1, 0x76, 0xFF, 0xD9, 0xA9, + 0x68, 0xFF, 0xD9, 0xA7, 0x62, 0xFF, 0xD9, 0xA6, 0x61, 0xFF, 0xD9, 0xA7, 0x61, 0xFF, 0xD9, 0xA9, + 0x61, 0xFF, 0xDA, 0xAA, 0x62, 0xFF, 0xDB, 0xAB, 0x63, 0xFF, 0xDC, 0xAC, 0x63, 0xFF, 0xDC, 0xAC, + 0x63, 0xFF, 0xDD, 0xAD, 0x63, 0xFF, 0xDD, 0xAD, 0x63, 0xFF, 0xDD, 0xAD, 0x62, 0xFF, 0xDD, 0xAF, + 0x65, 0xFF, 0xE1, 0xB8, 0x79, 0xFF, 0xE7, 0xC6, 0x93, 0xFF, 0xE9, 0xC8, 0x97, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, + 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE8, 0xC8, 0x96, 0xFF, 0xE7, 0xC7, 0x96, 0xFF, 0xE6, 0xC7, + 0x95, 0xFF, 0xE4, 0xC5, 0x95, 0xFF, 0xDF, 0xC4, 0x96, 0xFF, 0xE2, 0xC9, 0xA0, 0xFF, 0xE5, 0xD6, + 0xBC, 0xFF, 0xF0, 0xEA, 0xE2, 0xFF, 0xF5, 0xF4, 0xF3, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF5, 0xF6, + 0xF6, 0xFF, 0xF4, 0xF5, 0xF6, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF2, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, 0xF3, 0xFF, 0xF3, 0xF3, 0xF2, 0xFF, 0xF1, 0xF2, + 0xF0, 0xFF, 0xF0, 0xF1, 0xEF, 0xFF, 0xF3, 0xF4, 0xF3, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF5, 0xF5, 0xFF, 0xEE, 0xEF, 0xEA, 0xFF, 0xCE, 0xCB, 0xBB, 0xFF, 0xBD, 0xB8, + 0xA5, 0xFF, 0xE3, 0xE0, 0xD3, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF5, 0xF5, + 0xF3, 0xFF, 0xF0, 0xEA, 0xE3, 0xFF, 0xD9, 0xC9, 0xAA, 0xFF, 0xC7, 0xA8, 0x72, 0xFF, 0xCC, 0xA5, + 0x62, 0xFF, 0xD4, 0xA9, 0x63, 0xFF, 0xD8, 0xAB, 0x63, 0xFF, 0xDC, 0xAC, 0x62, 0xFF, 0xDC, 0xAC, + 0x62, 0xFF, 0xDD, 0xAD, 0x62, 0xFF, 0xDD, 0xAC, 0x62, 0xFF, 0xDD, 0xAC, 0x63, 0xFF, 0xDC, 0xAD, + 0x64, 0xFF, 0xDD, 0xAF, 0x6A, 0xFF, 0xDE, 0xB3, 0x74, 0xFF, 0xE7, 0xC4, 0x8E, 0xFF, 0xEC, 0xCB, + 0x97, 0xF4, 0xEB, 0xCB, 0xA1, 0x9A, 0xE2, 0xCA, 0xA7, 0x27, 0xC0, 0xC5, 0xB6, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xC8, 0xA2, 0x01, 0xE1, 0xC5, + 0x9C, 0x29, 0xE5, 0xC2, 0x93, 0xA2, 0xE3, 0xBE, 0x8A, 0xF0, 0xE1, 0xB7, 0x7F, 0xFF, 0xDC, 0xAF, + 0x70, 0xFF, 0xDA, 0xAA, 0x67, 0xFF, 0xDA, 0xA9, 0x63, 0xFF, 0xDB, 0xA9, 0x63, 0xFF, 0xDB, 0xAA, + 0x63, 0xFF, 0xDC, 0xAC, 0x64, 0xFF, 0xDC, 0xAC, 0x64, 0xFF, 0xDD, 0xAD, 0x65, 0xFF, 0xDD, 0xAE, + 0x65, 0xFF, 0xDE, 0xAE, 0x65, 0xFF, 0xDE, 0xAE, 0x64, 0xFF, 0xDE, 0xAF, 0x64, 0xFF, 0xDF, 0xB1, + 0x66, 0xFF, 0xE2, 0xBA, 0x7A, 0xFF, 0xE8, 0xC8, 0x95, 0xFF, 0xEA, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, + 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE8, 0xCA, 0x99, 0xFF, 0xE9, 0xCA, 0x99, 0xFF, 0xE8, 0xC9, + 0x98, 0xFF, 0xE8, 0xC9, 0x99, 0xFF, 0xE5, 0xC8, 0x98, 0xFF, 0xE3, 0xC7, 0x99, 0xFF, 0xE0, 0xCA, + 0xA2, 0xFF, 0xE5, 0xD5, 0xBC, 0xFF, 0xED, 0xE9, 0xE1, 0xFF, 0xF6, 0xF5, 0xF2, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF5, 0xF6, 0xF7, 0xFF, 0xF5, 0xF6, 0xF7, 0xFF, 0xF5, 0xF6, + 0xF6, 0xFF, 0xF5, 0xF6, 0xF6, 0xFF, 0xF4, 0xF5, 0xF6, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF3, 0xF4, + 0xF5, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xF6, 0xF6, 0xF3, 0xFF, 0xF5, 0xF5, 0xF3, 0xFF, 0xF3, 0xF5, + 0xF4, 0xFF, 0xF4, 0xF5, 0xF4, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF4, 0xF5, + 0xF5, 0xFF, 0xF5, 0xF5, 0xF6, 0xFF, 0xF3, 0xF4, 0xF5, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF5, 0xF6, + 0xF5, 0xFF, 0xF3, 0xF4, 0xF5, 0xFF, 0xEF, 0xF0, 0xED, 0xFF, 0xE3, 0xE3, 0xDA, 0xFF, 0xE5, 0xE3, + 0xDB, 0xFF, 0xF8, 0xF8, 0xF4, 0xFF, 0xF8, 0xF9, 0xF8, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF5, 0xEE, + 0xE6, 0xFF, 0xDC, 0xCB, 0xAC, 0xFF, 0xC9, 0xAC, 0x78, 0xFF, 0xCC, 0xA6, 0x63, 0xFF, 0xD3, 0xAA, + 0x64, 0xFF, 0xD9, 0xAD, 0x64, 0xFF, 0xDC, 0xAF, 0x65, 0xFF, 0xDE, 0xAF, 0x65, 0xFF, 0xDF, 0xAF, + 0x64, 0xFF, 0xDF, 0xAF, 0x65, 0xFF, 0xDE, 0xAF, 0x65, 0xFF, 0xDF, 0xAF, 0x66, 0xFF, 0xE0, 0xB1, + 0x69, 0xFF, 0xE1, 0xB3, 0x71, 0xFF, 0xDE, 0xBA, 0x82, 0xFF, 0xEA, 0xCA, 0x97, 0xFE, 0xF1, 0xCE, + 0x98, 0xD6, 0xE5, 0xCA, 0xA9, 0x5A, 0x49, 0xAC, 0xFD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xC7, + 0xA3, 0x10, 0xE3, 0xC4, 0x9A, 0x61, 0xE5, 0xC2, 0x8F, 0xCE, 0xE5, 0xBD, 0x87, 0xFF, 0xE1, 0xB5, + 0x7A, 0xFF, 0xDD, 0xAE, 0x6D, 0xFF, 0xDB, 0xAB, 0x66, 0xFF, 0xDD, 0xAB, 0x65, 0xFF, 0xDC, 0xAC, + 0x65, 0xFF, 0xDD, 0xAD, 0x65, 0xFF, 0xDD, 0xAE, 0x66, 0xFF, 0xDE, 0xAF, 0x67, 0xFF, 0xDE, 0xAF, + 0x67, 0xFF, 0xDF, 0xB0, 0x67, 0xFF, 0xDF, 0xB0, 0x66, 0xFF, 0xE0, 0xB0, 0x66, 0xFF, 0xE1, 0xB2, + 0x68, 0xFF, 0xE4, 0xBB, 0x7C, 0xFF, 0xE9, 0xCA, 0x96, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, + 0x9C, 0xFF, 0xEA, 0xCB, 0x9C, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, + 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xE9, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, 0x9B, 0xFF, 0xEA, 0xCC, + 0x9C, 0xFF, 0xEA, 0xCB, 0x9B, 0xFF, 0xE9, 0xCB, 0x9B, 0xFF, 0xE6, 0xC9, 0x9B, 0xFF, 0xE2, 0xC9, + 0x9D, 0xFF, 0xE5, 0xCC, 0xA6, 0xFF, 0xE6, 0xD6, 0xBC, 0xFF, 0xF0, 0xE9, 0xE0, 0xFF, 0xF6, 0xF5, + 0xF3, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF7, 0xF7, 0xF8, 0xFF, 0xF6, 0xF8, 0xF8, 0xFF, 0xF6, 0xF8, + 0xF8, 0xFF, 0xF6, 0xF7, 0xF8, 0xFF, 0xF5, 0xF6, 0xF7, 0xFF, 0xF5, 0xF5, 0xF7, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF1, 0xEF, 0xE8, 0xFF, 0xF1, 0xEF, 0xE9, 0xFF, 0xF7, 0xF6, 0xF4, 0xFF, 0xF6, 0xF7, + 0xF6, 0xFF, 0xF6, 0xF7, 0xF7, 0xFF, 0xF5, 0xF7, 0xF7, 0xFF, 0xF6, 0xF7, 0xF7, 0xFF, 0xF6, 0xF7, + 0xF7, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF4, 0xF6, 0xF6, 0xFF, 0xF5, 0xF6, 0xF6, 0xFF, 0xF7, 0xF7, + 0xF7, 0xFF, 0xF7, 0xF8, 0xF8, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF6, 0xF7, 0xF7, 0xFF, 0xF7, 0xF8, + 0xF7, 0xFF, 0xF9, 0xFA, 0xFA, 0xFF, 0xF9, 0xFB, 0xFA, 0xFF, 0xF5, 0xF2, 0xEC, 0xFF, 0xE1, 0xD4, + 0xBB, 0xFF, 0xCC, 0xB0, 0x7D, 0xFF, 0xCC, 0xA7, 0x68, 0xFF, 0xD1, 0xA9, 0x62, 0xFF, 0xD7, 0xAD, + 0x65, 0xFF, 0xDD, 0xAF, 0x66, 0xFF, 0xDF, 0xB1, 0x67, 0xFF, 0xE0, 0xB1, 0x67, 0xFF, 0xE0, 0xB1, + 0x66, 0xFF, 0xE0, 0xB1, 0x67, 0xFF, 0xDF, 0xB0, 0x67, 0xFF, 0xE1, 0xB1, 0x69, 0xFF, 0xE3, 0xB4, + 0x6D, 0xFF, 0xE0, 0xB8, 0x78, 0xFF, 0xE3, 0xC4, 0x8E, 0xFF, 0xEF, 0xCA, 0x98, 0xF5, 0xF2, 0xD0, + 0xA3, 0x9A, 0xDA, 0xCB, 0xAF, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xCA, + 0xAF, 0x01, 0xE0, 0xC8, 0xA8, 0x2A, 0xE5, 0xC5, 0x95, 0x97, 0xE5, 0xC1, 0x8E, 0xEE, 0xE3, 0xBB, + 0x83, 0xFF, 0xE0, 0xB3, 0x75, 0xFF, 0xDE, 0xAE, 0x6C, 0xFF, 0xDE, 0xAD, 0x69, 0xFF, 0xDE, 0xAD, + 0x67, 0xFF, 0xDE, 0xAE, 0x67, 0xFF, 0xDF, 0xAF, 0x68, 0xFF, 0xE0, 0xB1, 0x68, 0xFF, 0xE0, 0xB1, + 0x69, 0xFF, 0xE1, 0xB2, 0x69, 0xFF, 0xE1, 0xB2, 0x68, 0xFF, 0xE1, 0xB2, 0x68, 0xFF, 0xE2, 0xB3, + 0x6A, 0xFF, 0xE5, 0xBB, 0x7A, 0xFF, 0xE9, 0xCA, 0x97, 0xFF, 0xEA, 0xCD, 0x9E, 0xFF, 0xEB, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCD, + 0x9F, 0xFF, 0xEB, 0xCD, 0x9F, 0xFF, 0xEA, 0xCC, 0x9E, 0xFF, 0xEA, 0xCC, 0x9F, 0xFF, 0xE8, 0xCC, + 0x9E, 0xFF, 0xE6, 0xCB, 0x9F, 0xFF, 0xE3, 0xCD, 0xA6, 0xFF, 0xE5, 0xD5, 0xB8, 0xFF, 0xEC, 0xE8, + 0xDC, 0xFF, 0xF6, 0xF5, 0xF1, 0xFF, 0xF8, 0xF8, 0xF8, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF6, 0xF8, + 0xF8, 0xFF, 0xF6, 0xF7, 0xF8, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xEC, 0xE5, + 0xD6, 0xFF, 0xE2, 0xD7, 0xC0, 0xFF, 0xE2, 0xD9, 0xC5, 0xFF, 0xEF, 0xEC, 0xE3, 0xFF, 0xF8, 0xF7, + 0xF6, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xF6, 0xF7, 0xF8, 0xFF, 0xF6, 0xF8, 0xF9, 0xFF, 0xF8, 0xF9, + 0xFA, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF7, 0xF8, 0xF8, 0xFF, 0xFA, 0xFA, 0xF7, 0xFF, 0xF8, 0xF9, + 0xF7, 0xFF, 0xF8, 0xFA, 0xF9, 0xFF, 0xF9, 0xFC, 0xFC, 0xFF, 0xF7, 0xF9, 0xFB, 0xFF, 0xF7, 0xF9, + 0xFA, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF9, 0xF6, 0xF2, 0xFF, 0xE8, 0xDF, 0xCE, 0xFF, 0xD4, 0xBE, + 0x95, 0xFF, 0xD1, 0xAD, 0x6F, 0xFF, 0xD6, 0xAD, 0x68, 0xFF, 0xDA, 0xAF, 0x66, 0xFF, 0xDE, 0xB2, + 0x67, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE1, 0xB2, 0x68, 0xFF, 0xE2, 0xB3, 0x68, 0xFF, 0xE1, 0xB3, + 0x68, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE1, 0xB2, 0x69, 0xFF, 0xE3, 0xB4, 0x6D, 0xFF, 0xE4, 0xBA, + 0x76, 0xFF, 0xE3, 0xBF, 0x84, 0xFF, 0xE8, 0xC9, 0x98, 0xFD, 0xEE, 0xCC, 0xA1, 0xD0, 0xEC, 0xD2, + 0xAF, 0x59, 0xE5, 0xD0, 0xB7, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE0, 0xCB, 0xB1, 0x0D, 0xE6, 0xC9, 0x9D, 0x52, 0xE9, 0xC6, 0x93, 0xC7, 0xE7, 0xC1, + 0x8D, 0xFB, 0xE3, 0xB9, 0x81, 0xFF, 0xE0, 0xB3, 0x74, 0xFF, 0xE0, 0xB0, 0x6C, 0xFF, 0xDF, 0xAF, + 0x69, 0xFF, 0xDF, 0xB0, 0x69, 0xFF, 0xE0, 0xB1, 0x69, 0xFF, 0xE1, 0xB2, 0x6A, 0xFF, 0xE1, 0xB3, + 0x6A, 0xFF, 0xE2, 0xB4, 0x6B, 0xFF, 0xE2, 0xB4, 0x6A, 0xFF, 0xE3, 0xB4, 0x6B, 0xFF, 0xE4, 0xB5, + 0x6C, 0xFF, 0xE6, 0xBB, 0x79, 0xFF, 0xEA, 0xCA, 0x96, 0xFF, 0xEC, 0xCF, 0xA0, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, + 0xA1, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEC, 0xCF, 0xA2, 0xFF, 0xEC, 0xCF, 0xA1, 0xFF, 0xEB, 0xCF, + 0xA1, 0xFF, 0xE9, 0xCD, 0xA0, 0xFF, 0xE6, 0xCD, 0xA1, 0xFF, 0xE7, 0xCE, 0xA6, 0xFF, 0xE8, 0xD6, + 0xB5, 0xFF, 0xEE, 0xE6, 0xD6, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xF9, 0xF9, 0xF7, 0xFF, 0xF6, 0xF7, + 0xF6, 0xFF, 0xF7, 0xF8, 0xF9, 0xFF, 0xF6, 0xF7, 0xF6, 0xFF, 0xEA, 0xE0, 0xCD, 0xFF, 0xE1, 0xD0, + 0xAC, 0xFF, 0xDF, 0xCB, 0xA6, 0xFF, 0xE1, 0xCD, 0xA9, 0xFF, 0xE8, 0xD9, 0xBD, 0xFF, 0xF3, 0xEE, + 0xE3, 0xFF, 0xFA, 0xF9, 0xF6, 0xFF, 0xF8, 0xFA, 0xF9, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF8, 0xF9, + 0xFA, 0xFF, 0xFA, 0xFB, 0xFA, 0xFF, 0xF6, 0xF6, 0xF3, 0xFF, 0xE8, 0xE6, 0xDB, 0xFF, 0xE4, 0xE2, + 0xD7, 0xFF, 0xF2, 0xF1, 0xEB, 0xFF, 0xF8, 0xF9, 0xF9, 0xFF, 0xF7, 0xF9, 0xFA, 0xFF, 0xF8, 0xF9, + 0xF9, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xEC, 0xE5, 0xD4, 0xFF, 0xDE, 0xCC, 0xAA, 0xFF, 0xD6, 0xB8, + 0x83, 0xFF, 0xD8, 0xB1, 0x6C, 0xFF, 0xDC, 0xB2, 0x6A, 0xFF, 0xDF, 0xB2, 0x69, 0xFF, 0xE1, 0xB4, + 0x6A, 0xFF, 0xE3, 0xB5, 0x6B, 0xFF, 0xE3, 0xB5, 0x6A, 0xFF, 0xE3, 0xB5, 0x6A, 0xFF, 0xE2, 0xB4, + 0x6A, 0xFF, 0xE2, 0xB5, 0x6B, 0xFF, 0xE2, 0xB4, 0x6C, 0xFF, 0xE4, 0xB8, 0x74, 0xFF, 0xE6, 0xC0, + 0x81, 0xFF, 0xE7, 0xC5, 0x8F, 0xFE, 0xEA, 0xCC, 0x9D, 0xE7, 0xEC, 0xD0, 0xA6, 0x8F, 0xEA, 0xD3, + 0xAE, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xDE, 0xCB, 0xB0, 0x01, 0xE3, 0xC8, 0xA3, 0x1E, 0xEC, 0xC9, 0x94, 0x88, 0xE7, 0xC5, + 0x93, 0xE2, 0xE7, 0xC1, 0x8A, 0xFF, 0xE4, 0xB9, 0x7D, 0xFF, 0xE2, 0xB5, 0x72, 0xFF, 0xE1, 0xB2, + 0x6D, 0xFF, 0xE1, 0xB2, 0x6C, 0xFF, 0xE1, 0xB2, 0x6C, 0xFF, 0xE2, 0xB4, 0x6C, 0xFF, 0xE2, 0xB5, + 0x6D, 0xFF, 0xE3, 0xB5, 0x6D, 0xFF, 0xE4, 0xB6, 0x6D, 0xFF, 0xE4, 0xB6, 0x6D, 0xFF, 0xE5, 0xB7, + 0x6E, 0xFF, 0xE6, 0xBC, 0x77, 0xFF, 0xEA, 0xC9, 0x92, 0xFF, 0xEE, 0xD1, 0xA2, 0xFF, 0xEE, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, + 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD1, 0xA4, 0xFF, 0xEE, 0xD1, 0xA4, 0xFF, 0xED, 0xD0, + 0xA4, 0xFF, 0xED, 0xD0, 0xA3, 0xFF, 0xEA, 0xCF, 0xA2, 0xFF, 0xE8, 0xCE, 0xA3, 0xFF, 0xE7, 0xCF, + 0xA6, 0xFF, 0xE7, 0xD3, 0xAE, 0xFF, 0xE9, 0xDE, 0xC8, 0xFF, 0xF1, 0xEC, 0xE4, 0xFF, 0xF6, 0xF5, + 0xF2, 0xFF, 0xF7, 0xF4, 0xED, 0xFF, 0xEC, 0xE1, 0xCD, 0xFF, 0xE5, 0xD1, 0xAD, 0xFF, 0xE4, 0xCD, + 0xA5, 0xFF, 0xE4, 0xCE, 0xA4, 0xFF, 0xE4, 0xCC, 0xA1, 0xFF, 0xE5, 0xCF, 0xA9, 0xFF, 0xE9, 0xDB, + 0xBE, 0xFF, 0xF4, 0xEC, 0xDF, 0xFF, 0xFA, 0xFA, 0xF5, 0xFF, 0xFB, 0xFB, 0xFA, 0xFF, 0xF9, 0xFA, + 0xFA, 0xFF, 0xF8, 0xF8, 0xF7, 0xFF, 0xE6, 0xE5, 0xDA, 0xFF, 0xC7, 0xC4, 0xB2, 0xFF, 0xD3, 0xD1, + 0xC1, 0xFF, 0xF0, 0xEF, 0xE8, 0xFF, 0xF9, 0xFB, 0xFA, 0xFF, 0xF7, 0xF9, 0xFB, 0xFF, 0xF9, 0xF5, + 0xF1, 0xFF, 0xF0, 0xE7, 0xD6, 0xFF, 0xE2, 0xD1, 0xB5, 0xFF, 0xE1, 0xC7, 0x9D, 0xFF, 0xDC, 0xBB, + 0x82, 0xFF, 0xE0, 0xB6, 0x6F, 0xFF, 0xE2, 0xB6, 0x6C, 0xFF, 0xE3, 0xB5, 0x6C, 0xFF, 0xE3, 0xB7, + 0x6D, 0xFF, 0xE4, 0xB7, 0x6D, 0xFF, 0xE4, 0xB7, 0x6D, 0xFF, 0xE4, 0xB7, 0x6D, 0xFF, 0xE4, 0xB6, + 0x6D, 0xFF, 0xE4, 0xB7, 0x6F, 0xFF, 0xE4, 0xB9, 0x73, 0xFF, 0xE6, 0xBE, 0x7F, 0xFF, 0xE9, 0xC6, + 0x8C, 0xFF, 0xEC, 0xCC, 0x99, 0xF6, 0xED, 0xD1, 0xA5, 0xBA, 0xEB, 0xD1, 0xAA, 0x49, 0xE7, 0xD2, + 0xAE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xCC, 0xAC, 0x06, 0xE8, 0xCD, 0xA1, 0x40, 0xEA, 0xCB, + 0x95, 0xAD, 0xEB, 0xC4, 0x91, 0xF5, 0xE9, 0xC0, 0x87, 0xFF, 0xE5, 0xB9, 0x7C, 0xFF, 0xE2, 0xB5, + 0x72, 0xFF, 0xE2, 0xB4, 0x6E, 0xFF, 0xE2, 0xB4, 0x6D, 0xFF, 0xE3, 0xB5, 0x6E, 0xFF, 0xE3, 0xB6, + 0x6E, 0xFF, 0xE4, 0xB7, 0x6F, 0xFF, 0xE5, 0xB7, 0x6F, 0xFF, 0xE5, 0xB8, 0x6F, 0xFF, 0xE5, 0xB7, + 0x6F, 0xFF, 0xE8, 0xBB, 0x75, 0xFF, 0xEB, 0xC7, 0x8D, 0xFF, 0xEF, 0xD2, 0xA2, 0xFF, 0xF0, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA7, 0xFF, 0xEF, 0xD3, 0xA7, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEF, 0xD3, + 0xA7, 0xFF, 0xEF, 0xD3, 0xA6, 0xFF, 0xEE, 0xD2, 0xA5, 0xFF, 0xED, 0xD1, 0xA5, 0xFF, 0xEC, 0xD2, + 0xA5, 0xFF, 0xED, 0xD2, 0xA7, 0xFF, 0xE9, 0xD1, 0xAC, 0xFF, 0xEB, 0xD8, 0xB9, 0xFF, 0xEF, 0xDD, + 0xC2, 0xFF, 0xED, 0xD9, 0xBA, 0xFF, 0xE6, 0xD1, 0xAB, 0xFF, 0xE6, 0xCE, 0xA6, 0xFF, 0xE8, 0xCF, + 0xA5, 0xFF, 0xE9, 0xD0, 0xA5, 0xFF, 0xE9, 0xD0, 0xA5, 0xFF, 0xE9, 0xD0, 0xA7, 0xFF, 0xE6, 0xD2, + 0xAE, 0xFF, 0xEC, 0xDA, 0xBC, 0xFF, 0xF4, 0xEC, 0xDE, 0xFF, 0xFA, 0xF9, 0xF5, 0xFF, 0xFA, 0xFA, + 0xFA, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xE7, 0xE6, 0xDB, 0xFF, 0xD9, 0xD7, 0xC5, 0xFF, 0xE6, 0xE4, + 0xD9, 0xFF, 0xF6, 0xF8, 0xF4, 0xFF, 0xF8, 0xFA, 0xFC, 0xFF, 0xF7, 0xF6, 0xF6, 0xFF, 0xF1, 0xE9, + 0xD9, 0xFF, 0xE7, 0xD7, 0xB8, 0xFF, 0xE3, 0xCD, 0xA8, 0xFF, 0xE5, 0xC8, 0x99, 0xFF, 0xE0, 0xBB, + 0x7E, 0xFF, 0xE4, 0xB8, 0x70, 0xFF, 0xE4, 0xB8, 0x6F, 0xFF, 0xE5, 0xB8, 0x6E, 0xFF, 0xE6, 0xB9, + 0x6F, 0xFF, 0xE6, 0xB9, 0x6F, 0xFF, 0xE5, 0xB8, 0x6F, 0xFF, 0xE5, 0xB8, 0x70, 0xFF, 0xE5, 0xB8, + 0x70, 0xFF, 0xE5, 0xBA, 0x74, 0xFF, 0xE7, 0xBE, 0x7C, 0xFF, 0xE8, 0xC3, 0x88, 0xFF, 0xED, 0xCA, + 0x94, 0xFE, 0xEE, 0xCF, 0xA0, 0xD9, 0xEC, 0xD3, 0xAE, 0x76, 0xEA, 0xD4, 0xB0, 0x19, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xD9, 0xE4, 0x0D, 0xEE, 0xCB, + 0x9C, 0x62, 0xEB, 0xC9, 0x92, 0xD3, 0xEA, 0xC5, 0x8E, 0xFF, 0xE8, 0xC0, 0x88, 0xFF, 0xE4, 0xBA, + 0x7A, 0xFF, 0xE3, 0xB6, 0x72, 0xFF, 0xE4, 0xB6, 0x70, 0xFF, 0xE5, 0xB6, 0x70, 0xFF, 0xE4, 0xB7, + 0x70, 0xFF, 0xE5, 0xB8, 0x70, 0xFF, 0xE5, 0xB9, 0x71, 0xFF, 0xE6, 0xB9, 0x71, 0xFF, 0xE6, 0xB8, + 0x70, 0xFF, 0xE7, 0xBA, 0x74, 0xFF, 0xEA, 0xC4, 0x86, 0xFF, 0xF0, 0xD3, 0xA2, 0xFF, 0xF0, 0xD4, + 0xA8, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF0, 0xD5, 0xA9, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xEF, 0xD5, 0xA8, 0xFF, 0xEE, 0xD4, + 0xA7, 0xFF, 0xEE, 0xD3, 0xA9, 0xFF, 0xED, 0xD2, 0xA9, 0xFF, 0xED, 0xD3, 0xA9, 0xFF, 0xEC, 0xD4, + 0xAC, 0xFF, 0xEB, 0xD3, 0xAB, 0xFF, 0xEC, 0xD3, 0xA9, 0xFF, 0xED, 0xD2, 0xA9, 0xFF, 0xED, 0xD3, + 0xA7, 0xFF, 0xEE, 0xD4, 0xA8, 0xFF, 0xEE, 0xD3, 0xA8, 0xFF, 0xED, 0xD3, 0xA8, 0xFF, 0xEA, 0xD2, + 0xA9, 0xFF, 0xE8, 0xD2, 0xAB, 0xFF, 0xEA, 0xD9, 0xB9, 0xFF, 0xF4, 0xEB, 0xDB, 0xFF, 0xFB, 0xF9, + 0xF4, 0xFF, 0xFB, 0xFA, 0xF8, 0xFF, 0xF6, 0xF6, 0xF2, 0xFF, 0xF5, 0xF5, 0xF1, 0xFF, 0xF7, 0xF9, + 0xF5, 0xFF, 0xF9, 0xFB, 0xFC, 0xFF, 0xF9, 0xF8, 0xF9, 0xFF, 0xF3, 0xEC, 0xE0, 0xFF, 0xE5, 0xD6, + 0xBA, 0xFF, 0xE5, 0xD0, 0xAC, 0xFF, 0xE7, 0xD1, 0xAB, 0xFF, 0xE8, 0xC8, 0x94, 0xFF, 0xE3, 0xBB, + 0x78, 0xFF, 0xE6, 0xBA, 0x72, 0xFF, 0xE6, 0xBA, 0x71, 0xFF, 0xE7, 0xBA, 0x70, 0xFF, 0xE7, 0xBA, + 0x71, 0xFF, 0xE7, 0xBA, 0x70, 0xFF, 0xE6, 0xBA, 0x71, 0xFF, 0xE7, 0xBA, 0x72, 0xFF, 0xE7, 0xBB, + 0x73, 0xFF, 0xE8, 0xBE, 0x7A, 0xFF, 0xEA, 0xC4, 0x87, 0xFF, 0xEC, 0xC9, 0x92, 0xFF, 0xEE, 0xCF, + 0x9C, 0xEE, 0xEF, 0xD4, 0xA8, 0x9C, 0xEB, 0xD6, 0xBA, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xCD, + 0xA8, 0x25, 0xEE, 0xCC, 0x99, 0x89, 0xEB, 0xC8, 0x93, 0xE6, 0xEA, 0xC5, 0x8F, 0xFF, 0xE8, 0xC0, + 0x85, 0xFF, 0xE6, 0xBA, 0x7A, 0xFF, 0xE5, 0xB8, 0x73, 0xFF, 0xE6, 0xB8, 0x72, 0xFF, 0xE6, 0xB8, + 0x71, 0xFF, 0xE6, 0xB9, 0x71, 0xFF, 0xE6, 0xBA, 0x72, 0xFF, 0xE7, 0xBA, 0x72, 0xFF, 0xE6, 0xBA, + 0x72, 0xFF, 0xE8, 0xBB, 0x74, 0xFF, 0xEB, 0xC2, 0x81, 0xFF, 0xEE, 0xCF, 0x9E, 0xFF, 0xF0, 0xD5, + 0xA9, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD6, + 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF0, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD6, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD6, 0xAA, 0xFF, 0xF0, 0xD6, + 0xAA, 0xFF, 0xF0, 0xD5, 0xAA, 0xFF, 0xEF, 0xD5, 0xAA, 0xFF, 0xEF, 0xD4, 0xAB, 0xFF, 0xED, 0xD4, + 0xAB, 0xFF, 0xEE, 0xD5, 0xAB, 0xFF, 0xEE, 0xD5, 0xAB, 0xFF, 0xF0, 0xD6, 0xAB, 0xFF, 0xF0, 0xD6, + 0xAA, 0xFF, 0xF1, 0xD6, 0xAA, 0xFF, 0xF0, 0xD6, 0xAA, 0xFF, 0xEF, 0xD5, 0xAB, 0xFF, 0xEE, 0xD5, + 0xAB, 0xFF, 0xEB, 0xD4, 0xAA, 0xFF, 0xE7, 0xD2, 0xAC, 0xFF, 0xEA, 0xD8, 0xB7, 0xFF, 0xF3, 0xEB, + 0xD7, 0xFF, 0xFB, 0xFA, 0xF3, 0xFF, 0xF9, 0xFA, 0xF9, 0xFF, 0xFA, 0xFA, 0xF9, 0xFF, 0xFA, 0xFB, + 0xFA, 0xFF, 0xFC, 0xFC, 0xFB, 0xFF, 0xF6, 0xF1, 0xE5, 0xFF, 0xE9, 0xDA, 0xBB, 0xFF, 0xE3, 0xD0, + 0xAC, 0xFF, 0xE7, 0xD2, 0xAB, 0xFF, 0xE8, 0xD1, 0xA8, 0xFF, 0xEB, 0xC7, 0x8B, 0xFF, 0xE7, 0xBD, + 0x76, 0xFF, 0xE7, 0xBC, 0x74, 0xFF, 0xE8, 0xBC, 0x73, 0xFF, 0xE8, 0xBC, 0x72, 0xFF, 0xE8, 0xBB, + 0x72, 0xFF, 0xE8, 0xBB, 0x72, 0xFF, 0xE7, 0xBB, 0x73, 0xFF, 0xE9, 0xBC, 0x75, 0xFF, 0xE9, 0xBE, + 0x78, 0xFF, 0xE9, 0xC3, 0x82, 0xFF, 0xEC, 0xCA, 0x90, 0xFF, 0xED, 0xCE, 0x9C, 0xF8, 0xEF, 0xD2, + 0xA5, 0xBB, 0xEF, 0xD6, 0xAE, 0x54, 0xEC, 0xD7, 0xBB, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xD2, + 0xB6, 0x06, 0xF1, 0xD4, 0xAA, 0x3C, 0xEE, 0xCD, 0x9A, 0xA6, 0xEC, 0xC9, 0x93, 0xF2, 0xEC, 0xC6, + 0x8F, 0xFF, 0xEA, 0xC2, 0x87, 0xFF, 0xE7, 0xBC, 0x7B, 0xFF, 0xE6, 0xBA, 0x75, 0xFF, 0xE7, 0xBA, + 0x74, 0xFF, 0xE7, 0xBA, 0x74, 0xFF, 0xE7, 0xBB, 0x74, 0xFF, 0xE8, 0xBC, 0x74, 0xFF, 0xE8, 0xBC, + 0x73, 0xFF, 0xE8, 0xBC, 0x74, 0xFF, 0xEC, 0xC1, 0x7D, 0xFF, 0xED, 0xCB, 0x96, 0xFF, 0xF0, 0xD5, + 0xAA, 0xFF, 0xF2, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAE, 0xFF, 0xF1, 0xD7, + 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD7, + 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF0, 0xD7, 0xAD, 0xFF, 0xF1, 0xD7, 0xAD, 0xFF, 0xF0, 0xD6, + 0xAD, 0xFF, 0xF0, 0xD7, 0xAD, 0xFF, 0xF0, 0xD7, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, + 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF1, 0xD8, 0xAD, 0xFF, 0xF0, 0xD7, + 0xAC, 0xFF, 0xEF, 0xD6, 0xAC, 0xFF, 0xEC, 0xD5, 0xAC, 0xFF, 0xEA, 0xD4, 0xAD, 0xFF, 0xE9, 0xD7, + 0xB6, 0xFF, 0xF2, 0xE9, 0xD3, 0xFF, 0xF8, 0xF7, 0xF2, 0xFF, 0xFB, 0xFA, 0xF8, 0xFF, 0xFB, 0xF9, + 0xF7, 0xFF, 0xF7, 0xF3, 0xE9, 0xFF, 0xEA, 0xDD, 0xC2, 0xFF, 0xE8, 0xD4, 0xAF, 0xFF, 0xE8, 0xD3, + 0xAC, 0xFF, 0xEC, 0xD5, 0xAE, 0xFF, 0xEA, 0xD2, 0xA3, 0xFF, 0xEE, 0xC6, 0x82, 0xFF, 0xE8, 0xBE, + 0x76, 0xFF, 0xE9, 0xBD, 0x75, 0xFF, 0xE9, 0xBD, 0x75, 0xFF, 0xE9, 0xBD, 0x74, 0xFF, 0xE8, 0xBD, + 0x74, 0xFF, 0xE8, 0xBD, 0x75, 0xFF, 0xE9, 0xBD, 0x76, 0xFF, 0xEB, 0xBF, 0x79, 0xFF, 0xE9, 0xC3, + 0x82, 0xFF, 0xEC, 0xCA, 0x8E, 0xFF, 0xEE, 0xD0, 0x9A, 0xFF, 0xEF, 0xD4, 0xA5, 0xD4, 0xEE, 0xD5, + 0xAE, 0x6F, 0xEE, 0xD7, 0xB4, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xEE, 0xD4, 0xAD, 0x12, 0xEF, 0xD1, 0xA7, 0x56, 0xEF, 0xCD, 0x9B, 0xC0, 0xEE, 0xCA, + 0x94, 0xF9, 0xED, 0xC7, 0x8E, 0xFF, 0xEB, 0xC2, 0x85, 0xFF, 0xE9, 0xBD, 0x7C, 0xFF, 0xE7, 0xBB, + 0x77, 0xFF, 0xE8, 0xBC, 0x76, 0xFF, 0xE8, 0xBC, 0x75, 0xFF, 0xE9, 0xBC, 0x75, 0xFF, 0xE9, 0xBD, + 0x75, 0xFF, 0xE9, 0xBD, 0x75, 0xFF, 0xEA, 0xBF, 0x7A, 0xFF, 0xEE, 0xC9, 0x8C, 0xFF, 0xF1, 0xD4, + 0xA8, 0xFF, 0xF3, 0xD8, 0xAF, 0xFF, 0xF2, 0xD9, 0xB0, 0xFF, 0xF2, 0xD9, 0xB0, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD8, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF1, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xDA, 0xB0, 0xFF, 0xF2, 0xDA, + 0xB0, 0xFF, 0xF2, 0xDA, 0xB0, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xF2, 0xD9, 0xAF, 0xFF, 0xF2, 0xD9, + 0xAF, 0xFF, 0xF1, 0xD8, 0xAF, 0xFF, 0xF0, 0xD8, 0xAF, 0xFF, 0xEF, 0xD8, 0xAF, 0xFF, 0xEC, 0xD6, + 0xAF, 0xFF, 0xEC, 0xD8, 0xB5, 0xFF, 0xF1, 0xE6, 0xD1, 0xFF, 0xF8, 0xF1, 0xE6, 0xFF, 0xF8, 0xF2, + 0xE4, 0xFF, 0xEF, 0xE2, 0xC9, 0xFF, 0xE9, 0xD7, 0xB3, 0xFF, 0xEA, 0xD6, 0xAF, 0xFF, 0xEC, 0xD6, + 0xAD, 0xFF, 0xF1, 0xD9, 0xAF, 0xFF, 0xEC, 0xCF, 0x9A, 0xFF, 0xEE, 0xC2, 0x7C, 0xFF, 0xE9, 0xBF, + 0x77, 0xFF, 0xEA, 0xBE, 0x76, 0xFF, 0xEA, 0xBF, 0x76, 0xFF, 0xEA, 0xBE, 0x76, 0xFF, 0xE9, 0xBE, + 0x76, 0xFF, 0xEA, 0xBF, 0x78, 0xFF, 0xEB, 0xC0, 0x7A, 0xFF, 0xEB, 0xC3, 0x82, 0xFF, 0xEC, 0xC9, + 0x90, 0xFF, 0xEF, 0xCE, 0x9A, 0xFE, 0xEF, 0xD3, 0xA1, 0xE2, 0xF1, 0xD7, 0xA9, 0x89, 0xEC, 0xD6, + 0xB7, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD4, 0xAC, 0x1B, 0xED, 0xD1, 0xA7, 0x6E, 0xEE, 0xCD, + 0x9B, 0xD1, 0xEE, 0xCA, 0x93, 0xFF, 0xED, 0xC8, 0x8E, 0xFF, 0xEC, 0xC4, 0x87, 0xFF, 0xE9, 0xBF, + 0x7D, 0xFF, 0xE9, 0xBE, 0x79, 0xFF, 0xE9, 0xBE, 0x78, 0xFF, 0xEA, 0xBE, 0x77, 0xFF, 0xEA, 0xBE, + 0x77, 0xFF, 0xEA, 0xBF, 0x77, 0xFF, 0xEB, 0xC0, 0x79, 0xFF, 0xEE, 0xC5, 0x82, 0xFF, 0xF1, 0xD1, + 0x9E, 0xFF, 0xF3, 0xD9, 0xB0, 0xFF, 0xF4, 0xDA, 0xB2, 0xFF, 0xF3, 0xDA, 0xB2, 0xFF, 0xF3, 0xDA, + 0xB2, 0xFF, 0xF3, 0xDA, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDA, + 0xB2, 0xFF, 0xF3, 0xDA, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF3, 0xDB, 0xB1, 0xFF, 0xF3, 0xDB, + 0xB2, 0xFF, 0xF3, 0xDB, 0xB2, 0xFF, 0xF2, 0xDA, 0xB2, 0xFF, 0xF1, 0xD9, 0xB1, 0xFF, 0xF1, 0xDA, + 0xB1, 0xFF, 0xEF, 0xD8, 0xB2, 0xFF, 0xEC, 0xDA, 0xB6, 0xFF, 0xF0, 0xE1, 0xC4, 0xFF, 0xF0, 0xE1, + 0xC4, 0xFF, 0xED, 0xDB, 0xB6, 0xFF, 0xEF, 0xDA, 0xB2, 0xFF, 0xF0, 0xDA, 0xB1, 0xFF, 0xF0, 0xD8, + 0xAF, 0xFF, 0xF3, 0xD9, 0xAB, 0xFF, 0xED, 0xCA, 0x8E, 0xFF, 0xEB, 0xC0, 0x7A, 0xFF, 0xEA, 0xBF, + 0x78, 0xFF, 0xEB, 0xC0, 0x78, 0xFF, 0xEB, 0xC0, 0x78, 0xFF, 0xEA, 0xC0, 0x79, 0xFF, 0xEA, 0xC0, + 0x7A, 0xFF, 0xEB, 0xC2, 0x7D, 0xFF, 0xEC, 0xC5, 0x83, 0xFF, 0xED, 0xCA, 0x91, 0xFF, 0xF1, 0xD2, + 0x9D, 0xFF, 0xF3, 0xD5, 0xA4, 0xEA, 0xF4, 0xD5, 0xA3, 0xA0, 0xF2, 0xD7, 0xA8, 0x3B, 0xE8, 0xD9, + 0xBF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xD4, 0xAA, 0x25, 0xF0, 0xD2, + 0xA3, 0x7E, 0xF0, 0xCF, 0x9B, 0xD8, 0xEF, 0xCC, 0x95, 0xFD, 0xEE, 0xC8, 0x8E, 0xFF, 0xEC, 0xC4, + 0x85, 0xFF, 0xEB, 0xC0, 0x7E, 0xFF, 0xEA, 0xBF, 0x7A, 0xFF, 0xEB, 0xBF, 0x79, 0xFF, 0xEB, 0xBF, + 0x79, 0xFF, 0xEB, 0xC0, 0x78, 0xFF, 0xEB, 0xC0, 0x79, 0xFF, 0xEE, 0xC3, 0x7D, 0xFF, 0xF1, 0xCD, + 0x8F, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, + 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, + 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDC, + 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, + 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF3, 0xDC, + 0xB3, 0xFF, 0xF2, 0xDA, 0xB3, 0xFF, 0xEF, 0xDA, 0xB4, 0xFF, 0xF1, 0xDC, 0xB7, 0xFF, 0xF0, 0xDC, + 0xB8, 0xFF, 0xF0, 0xDB, 0xB5, 0xFF, 0xF2, 0xDC, 0xB5, 0xFF, 0xF3, 0xDC, 0xB3, 0xFF, 0xF3, 0xDB, + 0xB1, 0xFF, 0xF3, 0xD5, 0xA1, 0xFF, 0xEC, 0xC6, 0x83, 0xFF, 0xEA, 0xC0, 0x79, 0xFF, 0xEC, 0xC2, + 0x7A, 0xFF, 0xED, 0xC1, 0x7A, 0xFF, 0xEC, 0xC2, 0x7A, 0xFF, 0xEC, 0xC2, 0x7C, 0xFF, 0xEC, 0xC3, + 0x7D, 0xFF, 0xEC, 0xC5, 0x84, 0xFF, 0xEF, 0xCB, 0x8F, 0xFF, 0xF0, 0xD0, 0x9D, 0xFF, 0xF3, 0xD4, + 0xA2, 0xEE, 0xF3, 0xD6, 0xA6, 0xB2, 0xF1, 0xD8, 0xB0, 0x4A, 0xE9, 0xDB, 0xC1, 0x0A, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD5, + 0xA8, 0x2C, 0xF2, 0xD4, 0xA5, 0x89, 0xEF, 0xCF, 0x9C, 0xDE, 0xEE, 0xCC, 0x94, 0xFF, 0xEE, 0xCA, + 0x8F, 0xFF, 0xED, 0xC6, 0x88, 0xFF, 0xEC, 0xC2, 0x7F, 0xFF, 0xEC, 0xC1, 0x7C, 0xFF, 0xEC, 0xC1, + 0x7B, 0xFF, 0xEC, 0xC1, 0x7A, 0xFF, 0xEC, 0xC1, 0x7A, 0xFF, 0xED, 0xC2, 0x7C, 0xFF, 0xF1, 0xC8, + 0x83, 0xFF, 0xF2, 0xD3, 0xA2, 0xFF, 0xF4, 0xDC, 0xB3, 0xFF, 0xF6, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF4, 0xDE, + 0xB6, 0xFF, 0xF4, 0xDD, 0xB6, 0xFF, 0xF3, 0xDD, 0xB6, 0xFF, 0xF3, 0xDD, 0xB7, 0xFF, 0xF3, 0xDD, + 0xB7, 0xFF, 0xF3, 0xDD, 0xB7, 0xFF, 0xF3, 0xDD, 0xB6, 0xFF, 0xF4, 0xDC, 0xB4, 0xFF, 0xF3, 0xDA, + 0xAC, 0xFF, 0xF1, 0xCD, 0x90, 0xFF, 0xEC, 0xC4, 0x7E, 0xFF, 0xEC, 0xC3, 0x7B, 0xFF, 0xED, 0xC3, + 0x7B, 0xFF, 0xED, 0xC3, 0x7C, 0xFF, 0xED, 0xC4, 0x7D, 0xFF, 0xEE, 0xC5, 0x7F, 0xFF, 0xEF, 0xC8, + 0x84, 0xFF, 0xF1, 0xCC, 0x90, 0xFF, 0xF2, 0xD2, 0x9E, 0xFF, 0xF2, 0xD5, 0xA4, 0xF1, 0xF5, 0xD5, + 0xA1, 0xB9, 0xF5, 0xDA, 0xAC, 0x55, 0xD2, 0xE5, 0xF8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD5, + 0xA7, 0x01, 0xF2, 0xD6, 0xA8, 0x32, 0xF1, 0xD4, 0xA3, 0x94, 0xF1, 0xD1, 0x9D, 0xE0, 0xF0, 0xCE, + 0x98, 0xFE, 0xEF, 0xCB, 0x91, 0xFF, 0xEE, 0xC7, 0x88, 0xFF, 0xED, 0xC3, 0x81, 0xFF, 0xEC, 0xC2, + 0x7D, 0xFF, 0xED, 0xC2, 0x7C, 0xFF, 0xED, 0xC2, 0x7C, 0xFF, 0xEE, 0xC2, 0x7C, 0xFF, 0xEF, 0xC4, + 0x7E, 0xFF, 0xF2, 0xCD, 0x90, 0xFF, 0xF4, 0xD9, 0xAE, 0xFF, 0xF7, 0xDE, 0xB6, 0xFF, 0xF7, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, + 0xB8, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, 0xB8, 0xFF, 0xF5, 0xDF, + 0xB9, 0xFF, 0xF6, 0xDF, 0xB9, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF2, 0xD5, + 0x9F, 0xFF, 0xEF, 0xC7, 0x83, 0xFF, 0xEE, 0xC5, 0x7D, 0xFF, 0xEE, 0xC4, 0x7D, 0xFF, 0xEE, 0xC5, + 0x7D, 0xFF, 0xEE, 0xC5, 0x7F, 0xFF, 0xEE, 0xC6, 0x80, 0xFF, 0xF0, 0xC8, 0x85, 0xFF, 0xF3, 0xCD, + 0x8F, 0xFF, 0xF2, 0xD2, 0x9D, 0xFF, 0xF3, 0xD6, 0xA5, 0xF4, 0xF6, 0xD7, 0xA6, 0xC2, 0xF4, 0xD6, + 0xA6, 0x62, 0xED, 0xDC, 0xC6, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF1, 0xD4, 0xA5, 0x01, 0xF1, 0xD6, 0xA8, 0x3B, 0xF2, 0xD5, 0xA7, 0x9B, 0xF1, 0xD2, + 0x9F, 0xE5, 0xF0, 0xCF, 0x98, 0xFF, 0xF1, 0xCD, 0x92, 0xFF, 0xF1, 0xCA, 0x8B, 0xFF, 0xEE, 0xC6, + 0x83, 0xFF, 0xEE, 0xC4, 0x80, 0xFF, 0xEE, 0xC4, 0x7F, 0xFF, 0xEE, 0xC4, 0x7F, 0xFF, 0xEF, 0xC5, + 0x7F, 0xFF, 0xF1, 0xC7, 0x84, 0xFF, 0xF3, 0xD2, 0x9B, 0xFF, 0xF6, 0xDC, 0xB5, 0xFF, 0xF8, 0xE0, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBB, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBB, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBA, 0xFF, 0xF6, 0xE0, 0xBB, 0xFF, 0xF5, 0xE0, + 0xBA, 0xFF, 0xF6, 0xE0, 0xB9, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF4, 0xD9, 0xA9, 0xFF, 0xF3, 0xCE, + 0x8F, 0xFF, 0xEF, 0xC7, 0x81, 0xFF, 0xEE, 0xC6, 0x7E, 0xFF, 0xEF, 0xC6, 0x7F, 0xFF, 0xEF, 0xC7, + 0x80, 0xFF, 0xF0, 0xC8, 0x83, 0xFF, 0xF1, 0xCA, 0x87, 0xFF, 0xF3, 0xCE, 0x92, 0xFF, 0xF3, 0xD4, + 0x9E, 0xFF, 0xF5, 0xD8, 0xA6, 0xF9, 0xF5, 0xD7, 0xA4, 0xC6, 0xF5, 0xD7, 0xA6, 0x6A, 0xE7, 0xE0, + 0xCB, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xD6, 0xA9, 0x04, 0xF3, 0xD7, 0xA9, 0x3E, 0xF3, 0xD6, + 0xA6, 0xA0, 0xF3, 0xD3, 0xA0, 0xE3, 0xF2, 0xD1, 0x9A, 0xFE, 0xF2, 0xCE, 0x94, 0xFF, 0xF1, 0xCB, + 0x8C, 0xFF, 0xEF, 0xC7, 0x86, 0xFF, 0xEE, 0xC5, 0x82, 0xFF, 0xEF, 0xC6, 0x80, 0xFF, 0xF0, 0xC6, + 0x80, 0xFF, 0xF1, 0xC7, 0x82, 0xFF, 0xF3, 0xCB, 0x88, 0xFF, 0xF3, 0xD7, 0xA6, 0xFF, 0xF7, 0xE0, + 0xBA, 0xFF, 0xF8, 0xE1, 0xBC, 0xFF, 0xF7, 0xE1, 0xBC, 0xFF, 0xF7, 0xE1, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE1, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBD, 0xFF, 0xF7, 0xE2, 0xBD, 0xFF, 0xF7, 0xE2, + 0xBC, 0xFF, 0xF7, 0xE2, 0xBA, 0xFF, 0xF6, 0xDD, 0xB1, 0xFF, 0xF4, 0xD2, 0x98, 0xFF, 0xF2, 0xCB, + 0x85, 0xFF, 0xEF, 0xC8, 0x81, 0xFF, 0xEF, 0xC8, 0x80, 0xFF, 0xF0, 0xC8, 0x83, 0xFF, 0xF0, 0xC9, + 0x85, 0xFF, 0xF2, 0xCB, 0x8A, 0xFF, 0xF3, 0xD0, 0x95, 0xFF, 0xF2, 0xD3, 0x9F, 0xFF, 0xF4, 0xD8, + 0xA6, 0xF7, 0xF6, 0xD9, 0xA7, 0xCD, 0xF3, 0xD7, 0xAC, 0x6D, 0xEE, 0xDE, 0xC7, 0x1E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xD6, 0xA7, 0x02, 0xF3, 0xD7, + 0xA9, 0x3D, 0xF4, 0xD7, 0xA8, 0x99, 0xF2, 0xD4, 0xA1, 0xE2, 0xF2, 0xD1, 0x9A, 0xFE, 0xF2, 0xD0, + 0x96, 0xFF, 0xF3, 0xCE, 0x91, 0xFF, 0xF0, 0xCA, 0x89, 0xFF, 0xEF, 0xC8, 0x84, 0xFF, 0xF0, 0xC7, + 0x82, 0xFF, 0xF0, 0xC7, 0x83, 0xFF, 0xF1, 0xC9, 0x85, 0xFF, 0xF3, 0xCF, 0x90, 0xFF, 0xF5, 0xDB, + 0xAE, 0xFF, 0xF9, 0xE2, 0xBB, 0xFF, 0xF8, 0xE2, 0xBE, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, + 0xBE, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF7, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, + 0xBD, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF7, 0xE3, 0xBE, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF8, 0xE2, + 0xBC, 0xFF, 0xF7, 0xDF, 0xB4, 0xFF, 0xF5, 0xD5, 0xA0, 0xFF, 0xF2, 0xCC, 0x8A, 0xFF, 0xF1, 0xCA, + 0x83, 0xFF, 0xF1, 0xC9, 0x83, 0xFF, 0xF0, 0xCA, 0x84, 0xFF, 0xF2, 0xCC, 0x88, 0xFF, 0xF4, 0xCE, + 0x8F, 0xFF, 0xF4, 0xD1, 0x99, 0xFF, 0xF5, 0xD6, 0xA2, 0xFF, 0xF6, 0xD8, 0xA5, 0xF5, 0xF8, 0xD9, + 0xA3, 0xC2, 0xF6, 0xD9, 0xA7, 0x6A, 0xEA, 0xDD, 0xCE, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xD8, + 0xAA, 0x02, 0xF4, 0xD9, 0xAB, 0x36, 0xF3, 0xD8, 0xA8, 0x8F, 0xF3, 0xD5, 0xA2, 0xDA, 0xF3, 0xD4, + 0x9D, 0xFB, 0xF4, 0xD2, 0x99, 0xFF, 0xF3, 0xD0, 0x94, 0xFF, 0xF1, 0xCB, 0x8C, 0xFF, 0xF0, 0xC9, + 0x86, 0xFF, 0xF1, 0xC8, 0x84, 0xFF, 0xF0, 0xC9, 0x83, 0xFF, 0xF4, 0xCB, 0x87, 0xFF, 0xF6, 0xD3, + 0x96, 0xFF, 0xF7, 0xDE, 0xB2, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF9, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, + 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF8, 0xE3, 0xBE, 0xFF, 0xF8, 0xE1, + 0xB8, 0xFF, 0xF6, 0xD8, 0xA6, 0xFF, 0xF4, 0xCF, 0x8E, 0xFF, 0xF1, 0xCB, 0x85, 0xFF, 0xF2, 0xCB, + 0x84, 0xFF, 0xF1, 0xCB, 0x86, 0xFF, 0xF3, 0xCE, 0x8A, 0xFF, 0xF4, 0xD0, 0x91, 0xFF, 0xF6, 0xD3, + 0x9A, 0xFF, 0xF4, 0xD5, 0xA2, 0xFE, 0xF5, 0xD7, 0xA8, 0xED, 0xF7, 0xDB, 0xA9, 0xBB, 0xF6, 0xDB, + 0xAD, 0x60, 0xED, 0xDE, 0xC8, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xDB, 0xAF, 0x2F, 0xF4, 0xD9, 0xAD, 0x7E, 0xF4, 0xD6, + 0xA4, 0xCF, 0xF4, 0xD5, 0x9F, 0xF9, 0xF4, 0xD4, 0x9D, 0xFF, 0xF4, 0xD1, 0x99, 0xFF, 0xF2, 0xCD, + 0x8F, 0xFF, 0xF2, 0xCB, 0x89, 0xFF, 0xF2, 0xCA, 0x87, 0xFF, 0xF2, 0xCA, 0x87, 0xFF, 0xF4, 0xCD, + 0x8A, 0xFF, 0xF6, 0xD3, 0x98, 0xFF, 0xF5, 0xDE, 0xB2, 0xFF, 0xF9, 0xE4, 0xBE, 0xFF, 0xF9, 0xE5, + 0xC1, 0xFF, 0xF9, 0xE5, 0xC1, 0xFF, 0xF8, 0xE5, 0xC1, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE5, + 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE4, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC1, 0xFF, 0xF8, 0xE4, 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF8, 0xE5, + 0xC0, 0xFF, 0xF8, 0xE5, 0xC0, 0xFF, 0xF9, 0xE4, 0xBF, 0xFF, 0xF8, 0xE1, 0xB9, 0xFF, 0xF7, 0xD9, + 0xA7, 0xFF, 0xF4, 0xD0, 0x92, 0xFF, 0xF3, 0xCC, 0x88, 0xFF, 0xF3, 0xCB, 0x87, 0xFF, 0xF2, 0xCC, + 0x89, 0xFF, 0xF4, 0xCF, 0x8F, 0xFF, 0xF5, 0xD2, 0x97, 0xFF, 0xF6, 0xD5, 0x9F, 0xFF, 0xF5, 0xD7, + 0xA4, 0xFE, 0xF5, 0xD9, 0xA9, 0xE6, 0xF4, 0xD8, 0xA8, 0xA6, 0xF8, 0xDD, 0xB1, 0x54, 0xE7, 0xEA, + 0xEA, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xDC, 0xB1, 0x24, 0xF3, 0xD9, + 0xAC, 0x68, 0xF4, 0xD7, 0xA5, 0xC2, 0xF5, 0xD6, 0xA2, 0xF4, 0xF6, 0xD5, 0x9F, 0xFF, 0xF6, 0xD3, + 0x9B, 0xFF, 0xF4, 0xD0, 0x94, 0xFF, 0xF4, 0xCD, 0x8E, 0xFF, 0xF3, 0xCC, 0x8A, 0xFF, 0xF2, 0xCC, + 0x89, 0xFF, 0xF5, 0xCD, 0x8C, 0xFF, 0xF7, 0xD4, 0x99, 0xFF, 0xF8, 0xDE, 0xB3, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xF9, 0xE6, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, 0xC2, 0xFF, 0xF9, 0xE5, + 0xC2, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE2, 0xBA, 0xFF, 0xF8, 0xDB, 0xA8, 0xFF, 0xF5, 0xD1, + 0x92, 0xFF, 0xF3, 0xCE, 0x8B, 0xFF, 0xF4, 0xCD, 0x89, 0xFF, 0xF4, 0xCE, 0x8D, 0xFF, 0xF5, 0xD1, + 0x94, 0xFF, 0xF6, 0xD4, 0x9B, 0xFF, 0xF6, 0xD7, 0xA0, 0xFF, 0xF6, 0xD9, 0xA6, 0xFB, 0xF7, 0xDB, + 0xAA, 0xD8, 0xF8, 0xDC, 0xAD, 0x94, 0xF4, 0xDA, 0xB0, 0x3F, 0xF5, 0xDF, 0xC3, 0x0E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, + 0xB3, 0x1A, 0xF4, 0xDB, 0xB1, 0x50, 0xF4, 0xD8, 0xA7, 0xA0, 0xF6, 0xD7, 0xA2, 0xE4, 0xF7, 0xD7, + 0xA1, 0xFE, 0xF6, 0xD6, 0x9E, 0xFF, 0xF4, 0xD2, 0x99, 0xFF, 0xF4, 0xD0, 0x94, 0xFF, 0xF4, 0xCE, + 0x8E, 0xFF, 0xF3, 0xCD, 0x8C, 0xFF, 0xF4, 0xCE, 0x8E, 0xFF, 0xF5, 0xD3, 0x98, 0xFF, 0xF6, 0xDD, + 0xB1, 0xFF, 0xFA, 0xE6, 0xC0, 0xFF, 0xFB, 0xE6, 0xC4, 0xFF, 0xFB, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC4, 0xFF, 0xFA, 0xE6, 0xC4, 0xFF, 0xF9, 0xE6, 0xC4, 0xFF, 0xF9, 0xE6, 0xC4, 0xFF, 0xF9, 0xE6, + 0xC3, 0xFF, 0xF9, 0xE1, 0xB9, 0xFF, 0xF8, 0xD9, 0xA4, 0xFF, 0xF5, 0xD1, 0x92, 0xFF, 0xF3, 0xCF, + 0x8B, 0xFF, 0xF4, 0xCF, 0x8D, 0xFF, 0xF5, 0xD1, 0x92, 0xFF, 0xF6, 0xD4, 0x9A, 0xFF, 0xF6, 0xD7, + 0x9F, 0xFF, 0xF6, 0xD8, 0xA3, 0xFF, 0xF7, 0xDA, 0xA6, 0xF3, 0xF8, 0xDC, 0xAB, 0xC3, 0xF8, 0xDE, + 0xB0, 0x7C, 0xF9, 0xE0, 0xB6, 0x2D, 0xF3, 0xDF, 0xBD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF1, 0xDB, 0xB9, 0x0E, 0xF2, 0xD9, 0xB0, 0x3C, 0xF5, 0xD8, 0xA8, 0x7E, 0xF7, 0xDA, + 0xA5, 0xCB, 0xF8, 0xD9, 0xA3, 0xF6, 0xF7, 0xD7, 0xA0, 0xFF, 0xF6, 0xD5, 0x9D, 0xFF, 0xF6, 0xD3, + 0x98, 0xFF, 0xF5, 0xD1, 0x92, 0xFF, 0xF4, 0xD0, 0x90, 0xFF, 0xF6, 0xD0, 0x90, 0xFF, 0xF7, 0xD3, + 0x98, 0xFF, 0xF9, 0xDB, 0xAC, 0xFF, 0xF9, 0xE3, 0xBD, 0xFF, 0xFB, 0xE6, 0xC5, 0xFF, 0xFB, 0xE7, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, + 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE8, 0xC6, 0xFF, 0xFB, 0xE7, 0xC6, 0xFF, 0xFB, 0xE7, + 0xC5, 0xFF, 0xFB, 0xE6, 0xC5, 0xFF, 0xFA, 0xE6, 0xC6, 0xFF, 0xFB, 0xE6, 0xC2, 0xFF, 0xFA, 0xE0, + 0xB5, 0xFF, 0xF8, 0xD9, 0xA1, 0xFF, 0xF5, 0xD3, 0x93, 0xFF, 0xF3, 0xD1, 0x90, 0xFF, 0xF5, 0xD1, + 0x90, 0xFF, 0xF5, 0xD3, 0x96, 0xFF, 0xF7, 0xD7, 0x9E, 0xFF, 0xF8, 0xD9, 0xA2, 0xFF, 0xF8, 0xDA, + 0xA4, 0xFC, 0xF7, 0xDC, 0xAB, 0xE5, 0xF6, 0xDC, 0xB0, 0xA4, 0xF6, 0xDD, 0xB2, 0x5C, 0xF7, 0xE0, + 0xB5, 0x1C, 0xF8, 0xE0, 0xB7, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0xD9, 0xC7, 0x04, 0xE8, 0xD7, 0xC3, 0x21, 0xF6, 0xDB, + 0xAA, 0x5B, 0xF7, 0xDA, 0xA6, 0xA1, 0xF7, 0xD8, 0xA5, 0xDE, 0xF6, 0xD7, 0xA3, 0xFA, 0xF7, 0xD7, + 0xA1, 0xFF, 0xF8, 0xD7, 0x9E, 0xFF, 0xF7, 0xD5, 0x99, 0xFF, 0xF6, 0xD3, 0x95, 0xFF, 0xF5, 0xD2, + 0x93, 0xFF, 0xF6, 0xD3, 0x96, 0xFF, 0xF7, 0xD9, 0xA4, 0xFF, 0xF9, 0xE1, 0xB7, 0xFF, 0xFB, 0xE6, + 0xC4, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, + 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, + 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE9, 0xC7, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFC, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFB, 0xE8, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFB, 0xE9, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE7, + 0xC7, 0xFF, 0xFC, 0xE7, 0xC6, 0xFF, 0xFA, 0xE5, 0xBE, 0xFF, 0xF9, 0xDE, 0xAD, 0xFF, 0xF8, 0xD8, + 0x9C, 0xFF, 0xF7, 0xD5, 0x96, 0xFF, 0xF5, 0xD4, 0x94, 0xFF, 0xF6, 0xD5, 0x99, 0xFF, 0xF6, 0xD7, + 0x9E, 0xFF, 0xF6, 0xD8, 0xA4, 0xFF, 0xF8, 0xDA, 0xA6, 0xFD, 0xF9, 0xDB, 0xA8, 0xEF, 0xF7, 0xDB, + 0xAA, 0xC5, 0xF8, 0xDE, 0xB3, 0x80, 0xF7, 0xE4, 0xC4, 0x3F, 0xF6, 0xE4, 0xC5, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xD8, 0xC8, 0x01, 0xF1, 0xD8, + 0xB2, 0x10, 0xF5, 0xD9, 0xAC, 0x34, 0xF5, 0xDA, 0xAA, 0x72, 0xF6, 0xDA, 0xA9, 0xC0, 0xF7, 0xDB, + 0xA7, 0xF0, 0xF8, 0xDA, 0xA4, 0xFF, 0xF9, 0xD9, 0xA2, 0xFF, 0xF9, 0xD8, 0x9F, 0xFF, 0xF8, 0xD6, + 0x9A, 0xFF, 0xF7, 0xD4, 0x97, 0xFF, 0xF6, 0xD3, 0x98, 0xFF, 0xF8, 0xD6, 0x9E, 0xFF, 0xFB, 0xDD, + 0xB0, 0xFF, 0xFD, 0xE5, 0xC0, 0xFF, 0xFC, 0xE8, 0xC8, 0xFF, 0xFC, 0xE8, 0xC9, 0xFF, 0xFB, 0xE8, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xEA, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xEA, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFB, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFD, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xCA, 0xFF, 0xFC, 0xE8, 0xC8, 0xFF, 0xFC, 0xE6, + 0xC3, 0xFF, 0xFC, 0xE2, 0xB7, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xF7, 0xD7, 0x9C, 0xFF, 0xF6, 0xD6, + 0x97, 0xFF, 0xF7, 0xD6, 0x99, 0xFF, 0xF8, 0xD8, 0x9E, 0xFF, 0xFA, 0xDA, 0xA2, 0xFF, 0xF9, 0xDC, + 0xA6, 0xFF, 0xF9, 0xDC, 0xA9, 0xFB, 0xF9, 0xDC, 0xAA, 0xD7, 0xFA, 0xDD, 0xAE, 0x97, 0xF8, 0xDE, + 0xB0, 0x4F, 0xF8, 0xE0, 0xB5, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, 0xB7, 0x18, 0xF3, 0xDC, 0xB4, 0x46, 0xF6, 0xDC, + 0xAC, 0x8C, 0xF7, 0xDC, 0xA9, 0xC8, 0xF7, 0xDB, 0xA7, 0xF1, 0xF9, 0xDA, 0xA5, 0xFE, 0xF9, 0xDA, + 0xA3, 0xFF, 0xF8, 0xD8, 0xA0, 0xFF, 0xF7, 0xD7, 0x9E, 0xFF, 0xF7, 0xD6, 0x9C, 0xFF, 0xF7, 0xD6, + 0x9D, 0xFF, 0xF8, 0xD9, 0xA4, 0xFF, 0xF9, 0xE0, 0xB3, 0xFF, 0xFB, 0xE6, 0xC3, 0xFF, 0xFB, 0xE9, + 0xC8, 0xFF, 0xFB, 0xEA, 0xC9, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFB, 0xE9, + 0xCB, 0xFF, 0xFC, 0xE9, 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFB, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFC, 0xE9, 0xCB, 0xFF, 0xFB, 0xE9, + 0xCB, 0xFF, 0xFB, 0xE9, 0xCB, 0xFF, 0xFB, 0xEA, 0xCA, 0xFF, 0xFB, 0xE9, 0xCA, 0xFF, 0xFB, 0xE9, + 0xCA, 0xFF, 0xFD, 0xE9, 0xC9, 0xFF, 0xFC, 0xE8, 0xC5, 0xFF, 0xFB, 0xE4, 0xBA, 0xFF, 0xFA, 0xDD, + 0xAB, 0xFF, 0xF9, 0xD9, 0xA0, 0xFF, 0xF7, 0xD7, 0x9D, 0xFF, 0xF7, 0xD8, 0x9E, 0xFF, 0xF6, 0xD8, + 0xA0, 0xFF, 0xF7, 0xD9, 0xA6, 0xFF, 0xF9, 0xDB, 0xA7, 0xFE, 0xFA, 0xDC, 0xA9, 0xF9, 0xF9, 0xDD, + 0xA9, 0xE2, 0xF9, 0xDD, 0xAC, 0xAD, 0xFA, 0xE0, 0xB4, 0x69, 0xFA, 0xE0, 0xB7, 0x2B, 0xF8, 0xE0, + 0xB5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, 0xB7, 0x08, 0xF4, 0xDB, + 0xAF, 0x23, 0xF7, 0xDC, 0xAD, 0x4F, 0xF8, 0xDD, 0xAC, 0x8D, 0xF8, 0xDD, 0xAB, 0xCC, 0xF9, 0xDC, + 0xA9, 0xF2, 0xF9, 0xDB, 0xA6, 0xFD, 0xF9, 0xDA, 0xA4, 0xFF, 0xF9, 0xD9, 0xA3, 0xFF, 0xF8, 0xD9, + 0xA1, 0xFF, 0xF9, 0xD8, 0x9F, 0xFF, 0xF9, 0xD8, 0xA1, 0xFF, 0xF9, 0xDB, 0xA7, 0xFF, 0xFB, 0xE0, + 0xB5, 0xFF, 0xFC, 0xE5, 0xBF, 0xFF, 0xFB, 0xE9, 0xC7, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFB, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFB, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFB, 0xEA, 0xCB, 0xFF, 0xFC, 0xE9, 0xCA, 0xFF, 0xFD, 0xE7, + 0xC3, 0xFF, 0xFC, 0xE2, 0xB8, 0xFF, 0xFB, 0xDF, 0xAE, 0xFF, 0xFB, 0xDB, 0xA6, 0xFF, 0xF8, 0xD9, + 0xA1, 0xFF, 0xF6, 0xD8, 0xA0, 0xFF, 0xF6, 0xD8, 0xA2, 0xFF, 0xF9, 0xDA, 0xA2, 0xFF, 0xFA, 0xDB, + 0xA6, 0xFF, 0xFA, 0xDD, 0xAA, 0xFC, 0xF9, 0xDC, 0xA9, 0xE0, 0xFB, 0xDD, 0xB0, 0xAF, 0xF8, 0xDD, + 0xB4, 0x71, 0xF6, 0xDF, 0xB5, 0x3B, 0xF7, 0xE5, 0xBD, 0x11, 0xF7, 0xE2, 0xBB, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF6, 0xDC, 0xB0, 0x05, 0xF6, 0xDE, 0xB5, 0x23, 0xF6, 0xDD, 0xB4, 0x51, 0xF7, 0xDD, + 0xAE, 0x8B, 0xF8, 0xDD, 0xAA, 0xBD, 0xF8, 0xDC, 0xA9, 0xE3, 0xF8, 0xDA, 0xA6, 0xF6, 0xF8, 0xDA, + 0xA4, 0xFF, 0xF8, 0xDA, 0xA4, 0xFF, 0xF9, 0xDA, 0xA4, 0xFF, 0xF9, 0xDA, 0xA4, 0xFF, 0xF9, 0xDB, + 0xA5, 0xFF, 0xFA, 0xDC, 0xA9, 0xFF, 0xF9, 0xE0, 0xB1, 0xFF, 0xF9, 0xE4, 0xBB, 0xFF, 0xF9, 0xE6, + 0xC5, 0xFF, 0xFB, 0xE9, 0xCA, 0xFF, 0xFB, 0xEA, 0xCB, 0xFF, 0xFC, 0xEB, 0xCC, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEC, 0xCD, 0xFF, 0xFC, 0xEB, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEB, 0xCB, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFB, 0xE7, 0xC1, 0xFF, 0xFD, 0xE4, 0xB7, 0xFF, 0xFB, 0xE0, + 0xAE, 0xFF, 0xF8, 0xDC, 0xA7, 0xFF, 0xF8, 0xDA, 0xA5, 0xFF, 0xFA, 0xDB, 0xA6, 0xFF, 0xF9, 0xDB, + 0xA5, 0xFF, 0xF9, 0xDB, 0xA7, 0xFD, 0xF7, 0xDB, 0xA6, 0xF9, 0xF8, 0xDC, 0xAB, 0xF2, 0xFC, 0xDC, + 0xA7, 0xDD, 0xFD, 0xDC, 0xA7, 0xA9, 0xFB, 0xDB, 0xAB, 0x6E, 0xF7, 0xDD, 0xC0, 0x3A, 0xE6, 0xE4, + 0xDD, 0x16, 0xE8, 0xE6, 0xDB, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDE, 0xB7, 0x01, 0xF5, 0xDD, 0xB6, 0x0B, 0xF6, 0xDD, + 0xB1, 0x22, 0xF7, 0xDD, 0xAE, 0x46, 0xF8, 0xDD, 0xAE, 0x77, 0xF8, 0xDE, 0xAE, 0xA8, 0xF9, 0xDE, + 0xAE, 0xCE, 0xFA, 0xDD, 0xAA, 0xED, 0xFB, 0xDD, 0xA8, 0xFD, 0xFA, 0xDC, 0xA7, 0xFF, 0xF9, 0xDC, + 0xA8, 0xFF, 0xFB, 0xDC, 0xA8, 0xFF, 0xFB, 0xDC, 0xA8, 0xFF, 0xFB, 0xDD, 0xA9, 0xFF, 0xFB, 0xDF, + 0xAE, 0xFF, 0xFB, 0xE1, 0xB4, 0xFF, 0xFC, 0xE4, 0xBA, 0xFF, 0xFD, 0xE7, 0xC0, 0xFF, 0xFC, 0xE9, + 0xC6, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEB, 0xCA, 0xFF, 0xFC, 0xEB, 0xCB, 0xFF, 0xFC, 0xEB, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCD, 0xFF, 0xFC, 0xEA, 0xCD, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFD, 0xEB, 0xCC, 0xFF, 0xFD, 0xEB, 0xCB, 0xFF, 0xFD, 0xEB, + 0xC9, 0xFF, 0xFD, 0xE9, 0xC7, 0xFF, 0xFE, 0xE9, 0xC4, 0xFF, 0xFD, 0xE7, 0xC0, 0xFF, 0xFB, 0xE3, + 0xB8, 0xFF, 0xFA, 0xDF, 0xB0, 0xFF, 0xFA, 0xDF, 0xAC, 0xFF, 0xFA, 0xDC, 0xA8, 0xFF, 0xF7, 0xDB, + 0xA9, 0xFF, 0xF9, 0xDC, 0xA8, 0xFF, 0xFA, 0xDC, 0xA7, 0xFF, 0xFC, 0xDE, 0xA9, 0xFD, 0xFB, 0xDE, + 0xAA, 0xF2, 0xFB, 0xDE, 0xAD, 0xE1, 0xFD, 0xDF, 0xAF, 0xBC, 0xF9, 0xE1, 0xB5, 0x92, 0xF2, 0xDD, + 0xBB, 0x5A, 0xF3, 0xDE, 0xB2, 0x2D, 0xF2, 0xE0, 0xB0, 0x13, 0xF2, 0xE0, 0xC6, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF6, 0xDD, 0xB2, 0x03, 0xF4, 0xDF, 0xBA, 0x14, 0xF5, 0xE1, 0xBD, 0x33, 0xF9, 0xE3, + 0xB9, 0x5E, 0xFB, 0xE3, 0xB5, 0x8A, 0xFB, 0xDF, 0xB0, 0xB4, 0xFA, 0xDD, 0xAC, 0xD0, 0xFA, 0xDD, + 0xAB, 0xE8, 0xFA, 0xDD, 0xAB, 0xF4, 0xFA, 0xDD, 0xAB, 0xFB, 0xFB, 0xDD, 0xAB, 0xFF, 0xFA, 0xDD, + 0xAA, 0xFF, 0xFB, 0xDE, 0xAB, 0xFF, 0xFA, 0xDE, 0xAC, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xE2, + 0xB2, 0xFF, 0xFC, 0xE3, 0xB7, 0xFF, 0xFA, 0xE4, 0xB9, 0xFF, 0xFA, 0xE5, 0xBC, 0xFF, 0xFA, 0xE6, + 0xBF, 0xFF, 0xFB, 0xE7, 0xC2, 0xFF, 0xFA, 0xE7, 0xC2, 0xFF, 0xFA, 0xE7, 0xC2, 0xFF, 0xFA, 0xE7, + 0xC1, 0xFF, 0xFB, 0xE7, 0xC0, 0xFF, 0xFA, 0xE5, 0xBE, 0xFF, 0xFA, 0xE4, 0xBC, 0xFF, 0xF9, 0xE2, + 0xB8, 0xFF, 0xF9, 0xE1, 0xB5, 0xFF, 0xFA, 0xE1, 0xB3, 0xFF, 0xFA, 0xE0, 0xB0, 0xFF, 0xF9, 0xDE, + 0xAC, 0xFF, 0xFB, 0xDF, 0xAC, 0xFE, 0xFB, 0xDF, 0xAC, 0xFD, 0xFA, 0xDE, 0xAD, 0xF8, 0xF9, 0xDE, + 0xAE, 0xF3, 0xFB, 0xDE, 0xAC, 0xEA, 0xFA, 0xDC, 0xA8, 0xDC, 0xF9, 0xDD, 0xAA, 0xC2, 0xF9, 0xDF, + 0xB2, 0x9E, 0xFC, 0xE2, 0xB9, 0x6D, 0xFD, 0xE1, 0xB9, 0x44, 0xF7, 0xE3, 0xC1, 0x23, 0xAC, 0xE5, + 0xFF, 0x0A, 0xA2, 0xE6, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xE2, 0xBE, 0x02, 0xF8, 0xE3, + 0xBD, 0x0B, 0xFB, 0xE4, 0xB9, 0x19, 0xFA, 0xE2, 0xB5, 0x35, 0xFB, 0xE1, 0xB4, 0x56, 0xFC, 0xE1, + 0xB3, 0x76, 0xFB, 0xE1, 0xB2, 0x97, 0xFB, 0xE0, 0xAF, 0xBA, 0xFB, 0xDF, 0xAD, 0xCF, 0xFB, 0xDF, + 0xAD, 0xE0, 0xFB, 0xDF, 0xAE, 0xEE, 0xFA, 0xDF, 0xAE, 0xF6, 0xFA, 0xDF, 0xAD, 0xFE, 0xFA, 0xDF, + 0xAE, 0xFF, 0xFA, 0xDF, 0xAE, 0xFF, 0xFB, 0xDF, 0xAF, 0xFF, 0xFB, 0xDF, 0xB0, 0xFF, 0xFB, 0xE0, + 0xAF, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xF9, 0xDF, + 0xAE, 0xFF, 0xFA, 0xDE, 0xAD, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFC, 0xE1, + 0xAF, 0xFF, 0xFC, 0xE1, 0xAF, 0xFE, 0xFC, 0xE0, 0xAD, 0xFC, 0xFC, 0xE0, 0xAD, 0xF8, 0xFB, 0xE0, + 0xAD, 0xF1, 0xFB, 0xDF, 0xAD, 0xE6, 0xFC, 0xE0, 0xAF, 0xDB, 0xFC, 0xE1, 0xB1, 0xCD, 0xFB, 0xE0, + 0xB1, 0xAE, 0xFD, 0xE3, 0xB7, 0x8F, 0xFF, 0xE4, 0xBA, 0x69, 0xF8, 0xE1, 0xB7, 0x42, 0xF9, 0xE4, + 0xBD, 0x26, 0xFE, 0xE5, 0xBF, 0x12, 0xF5, 0xE2, 0xBB, 0x05, 0xEC, 0xE5, 0xC5, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xE2, + 0xBA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xE3, 0xB9, 0x04, 0xFC, 0xEB, + 0xC9, 0x16, 0xFC, 0xE9, 0xC7, 0x2B, 0xFB, 0xE2, 0xB6, 0x3E, 0xFB, 0xE1, 0xB2, 0x58, 0xFB, 0xE1, + 0xB3, 0x74, 0xFB, 0xE0, 0xB2, 0x90, 0xFA, 0xE0, 0xB0, 0xA4, 0xFA, 0xE0, 0xAF, 0xBB, 0xFA, 0xDF, + 0xAD, 0xD3, 0xF9, 0xDF, 0xAD, 0xE0, 0xF9, 0xDE, 0xAD, 0xEC, 0xF9, 0xDD, 0xAC, 0xF7, 0xF9, 0xDE, + 0xAD, 0xFB, 0xFA, 0xDE, 0xAD, 0xFF, 0xF9, 0xDD, 0xAB, 0xFF, 0xFA, 0xDE, 0xAD, 0xFF, 0xF9, 0xDE, + 0xAC, 0xFF, 0xF9, 0xDF, 0xAD, 0xFF, 0xFA, 0xDE, 0xAD, 0xFE, 0xF9, 0xDE, 0xAA, 0xF2, 0xF8, 0xDC, + 0xA7, 0xE7, 0xF8, 0xDC, 0xA8, 0xD5, 0xF9, 0xDE, 0xAB, 0xC4, 0xFC, 0xE0, 0xAF, 0xAD, 0xFC, 0xE1, + 0xB2, 0x99, 0xFB, 0xE1, 0xB4, 0x7E, 0xFB, 0xE2, 0xB6, 0x67, 0xFB, 0xE2, 0xB7, 0x4A, 0xFA, 0xE2, + 0xB9, 0x31, 0xFD, 0xE9, 0xC8, 0x1D, 0xFA, 0xFE, 0xFF, 0x0D, 0xFE, 0xFF, 0xFF, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFC, 0xE9, 0xC7, 0x01, 0xFB, 0xE4, 0xBA, 0x03, 0xFC, 0xE3, 0xB6, 0x0A, 0xFC, 0xE2, + 0xB5, 0x12, 0xFB, 0xE1, 0xB3, 0x18, 0xFA, 0xE0, 0xB1, 0x22, 0xFB, 0xE0, 0xB0, 0x2C, 0xFA, 0xE0, + 0xAF, 0x33, 0xFB, 0xE1, 0xB1, 0x3E, 0xFA, 0xE1, 0xB3, 0x45, 0xFA, 0xE1, 0xB3, 0x4A, 0xFA, 0xE2, + 0xB3, 0x50, 0xFB, 0xE2, 0xB3, 0x53, 0xFC, 0xE2, 0xB5, 0x56, 0xFC, 0xE2, 0xB4, 0x55, 0xFB, 0xE2, + 0xB4, 0x51, 0xFB, 0xE2, 0xB3, 0x4B, 0xF9, 0xE0, 0xB1, 0x47, 0xFA, 0xE1, 0xB2, 0x47, 0xFA, 0xE0, + 0xB5, 0x43, 0xFA, 0xE2, 0xB6, 0x3D, 0xF9, 0xE1, 0xB3, 0x32, 0xFB, 0xE1, 0xB3, 0x28, 0xFA, 0xE2, + 0xB4, 0x20, 0xFB, 0xE2, 0xB6, 0x17, 0xFB, 0xE3, 0xB8, 0x0C, 0xFC, 0xE4, 0xBC, 0x08, 0xFB, 0xE6, + 0xC1, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xEB, 0xCA, 0x03, 0xFF, 0xED, 0xCB, 0x07, 0xFE, 0xE9, + 0xC1, 0x06, 0xFD, 0xE6, 0xBC, 0x07, 0xFC, 0xE5, 0xBB, 0x08, 0xFD, 0xE6, 0xBC, 0x08, 0xFD, 0xE8, + 0xBF, 0x07, 0xFE, 0xE9, 0xC1, 0x07, 0xFB, 0xE8, 0xC0, 0x06, 0xFF, 0xF1, 0xD2, 0x06, 0xFF, 0xFF, + 0xFF, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0xFF, 0xF0, 0xCF, 0x01, 0xFB, 0xE4, 0xB6, 0x01, 0xFC, 0xE3, + 0xB5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xEC, 0xD0, 0x04, 0xFF, 0xED, 0xD2, 0x08, 0xFE, 0xEB, + 0xC7, 0x0A, 0xFD, 0xE7, 0xBF, 0x0B, 0xFC, 0xE6, 0xBD, 0x0C, 0xFC, 0xE7, 0xBE, 0x0D, 0xFC, 0xE9, + 0xC1, 0x0C, 0xFE, 0xE9, 0xC3, 0x0B, 0xFC, 0xE9, 0xC2, 0x09, 0xFB, 0xF0, 0xD7, 0x06, 0xFF, 0xFF, + 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x03, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x80, 0x00, 0x00, 0x00, + 0x3F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x01, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x1F, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x90, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x54, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, + 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x21, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, + 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, + 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x21, 0x82, 0x44, + 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x31, 0x82, 0x44, 0x0C, 0x33, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, + 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, + 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, + 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, + 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3C, 0x82, 0x44, + 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, 0x0C, 0x2F, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, + 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x40, 0x82, 0x44, 0x0C, 0x43, 0x82, 0x44, + 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, + 0x0C, 0x57, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, + 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, + 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, 0x0C, 0x58, 0x82, 0x44, 0x0C, 0x57, 0x82, 0x44, + 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x54, 0x82, 0x44, 0x0C, 0x52, 0x82, 0x44, 0x0C, 0x50, 0x82, 0x44, + 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x4B, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, + 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, + 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x03, 0x81, 0x43, 0x0B, 0x02, 0x81, 0x42, 0x0B, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x36, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x4B, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, + 0x0C, 0x62, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, + 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x73, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, + 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, + 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x75, 0x82, 0x44, 0x0C, 0x74, 0x82, 0x44, + 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x6E, 0x82, 0x44, 0x0C, 0x6D, 0x82, 0x44, + 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x64, 0x82, 0x44, 0x0C, 0x60, 0x82, 0x44, + 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x58, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, + 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, + 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x05, 0x81, 0x43, 0x0B, 0x03, 0x85, 0x48, 0x12, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x09, 0x01, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x41, 0x82, 0x44, + 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, + 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x7B, 0x82, 0x44, + 0x0C, 0x7E, 0x82, 0x44, 0x0C, 0x82, 0x82, 0x44, 0x0C, 0x84, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, + 0x0C, 0x89, 0x82, 0x44, 0x0C, 0x8B, 0x82, 0x44, 0x0B, 0x8D, 0x81, 0x43, 0x0B, 0x8D, 0x81, 0x43, + 0x0A, 0x8E, 0x81, 0x42, 0x09, 0x8F, 0x81, 0x42, 0x09, 0x90, 0x80, 0x41, 0x08, 0x90, 0x80, 0x41, + 0x08, 0x90, 0x80, 0x41, 0x08, 0x90, 0x81, 0x41, 0x08, 0x91, 0x81, 0x42, 0x09, 0x90, 0x81, 0x42, + 0x0A, 0x90, 0x81, 0x43, 0x0B, 0x90, 0x82, 0x43, 0x0B, 0x8F, 0x82, 0x44, 0x0C, 0x8E, 0x82, 0x44, + 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x8C, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, + 0x0C, 0x86, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, 0x0C, 0x7D, 0x82, 0x44, + 0x0C, 0x78, 0x82, 0x44, 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x62, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x52, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, + 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x43, 0x0C, 0x02, 0x9A, 0x68, + 0x3B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x0A, 0x01, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, + 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, + 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, + 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x93, 0x82, 0x44, + 0x0C, 0x97, 0x82, 0x44, 0x0C, 0x9A, 0x82, 0x44, 0x0C, 0x9C, 0x81, 0x43, 0x0B, 0x9D, 0x81, 0x42, + 0x09, 0x9E, 0x81, 0x43, 0x0A, 0xA0, 0x84, 0x46, 0x0E, 0xA3, 0x87, 0x4C, 0x15, 0xA8, 0x8B, 0x52, + 0x1F, 0xAD, 0x90, 0x5B, 0x2B, 0xB5, 0x93, 0x5F, 0x32, 0xBA, 0x94, 0x61, 0x34, 0xBD, 0x94, 0x61, + 0x34, 0xBF, 0x94, 0x61, 0x34, 0xBE, 0x94, 0x60, 0x33, 0xBC, 0x92, 0x5D, 0x2E, 0xB8, 0x8D, 0x55, + 0x23, 0xB1, 0x89, 0x4E, 0x19, 0xAB, 0x85, 0x47, 0x11, 0xA7, 0x82, 0x44, 0x0B, 0xA4, 0x81, 0x42, + 0x09, 0xA2, 0x81, 0x43, 0x0A, 0xA1, 0x82, 0x44, 0x0B, 0xA0, 0x82, 0x44, 0x0C, 0x9F, 0x82, 0x44, + 0x0C, 0x9D, 0x82, 0x44, 0x0C, 0x9B, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, 0x0C, 0x95, 0x82, 0x44, + 0x0C, 0x91, 0x82, 0x44, 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, 0x0C, 0x82, 0x82, 0x44, + 0x0C, 0x7B, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, + 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x06, 0x81, 0x43, 0x0B, 0x03, 0x89, 0x4E, + 0x1B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x62, 0x32, 0x01, 0x81, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, + 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x50, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, + 0x0C, 0x71, 0x82, 0x44, 0x0C, 0x7D, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, + 0x0C, 0x96, 0x82, 0x44, 0x0C, 0x9C, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0xA4, 0x82, 0x43, + 0x0B, 0xA7, 0x81, 0x42, 0x09, 0xA8, 0x83, 0x45, 0x0D, 0xAB, 0x89, 0x4F, 0x1A, 0xB3, 0x92, 0x5E, + 0x2F, 0xC1, 0x9A, 0x6C, 0x44, 0xD1, 0x9F, 0x74, 0x51, 0xDF, 0x9E, 0x75, 0x56, 0xE8, 0x9D, 0x76, + 0x59, 0xF1, 0x9C, 0x76, 0x5A, 0xF8, 0x9B, 0x75, 0x5A, 0xFB, 0x9A, 0x74, 0x5A, 0xFD, 0x99, 0x74, + 0x5A, 0xFD, 0x9A, 0x75, 0x5B, 0xFD, 0x9C, 0x76, 0x5C, 0xFC, 0x9E, 0x79, 0x5E, 0xF9, 0x9F, 0x79, + 0x5D, 0xF4, 0xA0, 0x79, 0x5A, 0xEC, 0xA0, 0x77, 0x57, 0xE4, 0x9E, 0x72, 0x4D, 0xD8, 0x96, 0x65, + 0x39, 0xC9, 0x8C, 0x55, 0x22, 0xBB, 0x85, 0x48, 0x11, 0xB1, 0x81, 0x42, 0x0A, 0xAD, 0x81, 0x43, + 0x0A, 0xAC, 0x82, 0x44, 0x0C, 0xAB, 0x82, 0x44, 0x0C, 0xA8, 0x82, 0x44, 0x0C, 0xA6, 0x82, 0x44, + 0x0C, 0xA2, 0x82, 0x44, 0x0C, 0x9E, 0x82, 0x44, 0x0C, 0x99, 0x82, 0x44, 0x0C, 0x94, 0x82, 0x44, + 0x0C, 0x8C, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x78, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x46, + 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x62, 0x33, 0x01, 0x81, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, + 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, + 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x84, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x97, 0x82, 0x44, + 0x0C, 0x9E, 0x82, 0x44, 0x0C, 0xA3, 0x81, 0x43, 0x0B, 0xA6, 0x81, 0x42, 0x0A, 0xA8, 0x87, 0x4C, + 0x15, 0xB1, 0x94, 0x60, 0x32, 0xC4, 0x9D, 0x71, 0x4C, 0xDB, 0x9E, 0x76, 0x57, 0xEE, 0x99, 0x72, + 0x56, 0xFA, 0x90, 0x68, 0x4D, 0xFE, 0x89, 0x60, 0x45, 0xFF, 0x83, 0x59, 0x3F, 0xFF, 0x7F, 0x54, + 0x3A, 0xFF, 0x7C, 0x50, 0x36, 0xFF, 0x7A, 0x4E, 0x34, 0xFF, 0x79, 0x4D, 0x34, 0xFF, 0x79, 0x4D, + 0x34, 0xFF, 0x7B, 0x4F, 0x35, 0xFF, 0x7C, 0x51, 0x37, 0xFF, 0x7F, 0x55, 0x3B, 0xFF, 0x83, 0x59, + 0x40, 0xFF, 0x88, 0x5F, 0x46, 0xFF, 0x8E, 0x67, 0x4D, 0xFF, 0x95, 0x6F, 0x55, 0xFF, 0x9D, 0x77, + 0x5D, 0xFC, 0xA2, 0x7C, 0x60, 0xF5, 0xA1, 0x78, 0x56, 0xE5, 0x99, 0x69, 0x3F, 0xD0, 0x8B, 0x53, + 0x1F, 0xBB, 0x82, 0x44, 0x0C, 0xB0, 0x81, 0x42, 0x0A, 0xAD, 0x82, 0x44, 0x0C, 0xAC, 0x82, 0x44, + 0x0C, 0xA9, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0x9B, 0x82, 0x44, + 0x0C, 0x94, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, + 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x44, + 0x0D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x62, 0x33, 0x01, 0x81, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x63, 0x82, 0x44, + 0x0C, 0x73, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x92, 0x81, 0x43, + 0x0B, 0x98, 0x81, 0x43, 0x0A, 0x9B, 0x8A, 0x50, 0x1C, 0xA9, 0x99, 0x69, 0x40, 0xC8, 0x9F, 0x76, + 0x56, 0xE8, 0x97, 0x70, 0x53, 0xFA, 0x8B, 0x61, 0x45, 0xFF, 0x7E, 0x53, 0x37, 0xFF, 0x76, 0x48, + 0x2D, 0xFF, 0x71, 0x43, 0x28, 0xFF, 0x6F, 0x41, 0x26, 0xFF, 0x6E, 0x40, 0x25, 0xFF, 0x6E, 0x40, + 0x25, 0xFF, 0x6F, 0x40, 0x26, 0xFF, 0x70, 0x41, 0x26, 0xFF, 0x71, 0x42, 0x27, 0xFF, 0x71, 0x43, + 0x28, 0xFF, 0x72, 0x44, 0x29, 0xFF, 0x73, 0x46, 0x2A, 0xFF, 0x74, 0x47, 0x2C, 0xFF, 0x75, 0x49, + 0x2E, 0xFF, 0x76, 0x4A, 0x2F, 0xFF, 0x78, 0x4C, 0x32, 0xFF, 0x7B, 0x50, 0x35, 0xFF, 0x81, 0x56, + 0x3C, 0xFF, 0x88, 0x5F, 0x45, 0xFF, 0x93, 0x6B, 0x51, 0xFF, 0x9D, 0x78, 0x5D, 0xFD, 0xA4, 0x7E, + 0x61, 0xF1, 0x9F, 0x73, 0x4F, 0xD9, 0x90, 0x5A, 0x2A, 0xBA, 0x83, 0x45, 0x0D, 0xA7, 0x81, 0x42, + 0x0A, 0xA3, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0x9C, 0x82, 0x44, 0x0C, 0x96, 0x82, 0x44, + 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x7A, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, + 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x03, 0x83, 0x45, + 0x0D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x0A, 0x02, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, + 0x0C, 0x65, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x7A, 0x81, 0x42, 0x09, 0x7F, 0x88, 0x4C, + 0x16, 0x8E, 0x9B, 0x6B, 0x42, 0xB9, 0x9F, 0x76, 0x57, 0xE7, 0x93, 0x6A, 0x4D, 0xFC, 0x81, 0x55, + 0x38, 0xFF, 0x74, 0x45, 0x29, 0xFF, 0x6D, 0x3D, 0x21, 0xFF, 0x6A, 0x3A, 0x1F, 0xFF, 0x6A, 0x3A, + 0x1E, 0xFF, 0x6B, 0x3B, 0x1F, 0xFF, 0x6D, 0x3C, 0x20, 0xFF, 0x6E, 0x3E, 0x21, 0xFF, 0x6F, 0x40, + 0x22, 0xFF, 0x71, 0x41, 0x23, 0xFF, 0x73, 0x43, 0x25, 0xFF, 0x74, 0x44, 0x26, 0xFF, 0x75, 0x45, + 0x27, 0xFF, 0x76, 0x46, 0x28, 0xFF, 0x76, 0x47, 0x29, 0xFF, 0x77, 0x48, 0x2A, 0xFF, 0x77, 0x49, + 0x2B, 0xFF, 0x78, 0x49, 0x2C, 0xFF, 0x78, 0x4A, 0x2D, 0xFF, 0x78, 0x4B, 0x2E, 0xFF, 0x78, 0x4B, + 0x2F, 0xFF, 0x7A, 0x4D, 0x31, 0xFF, 0x7D, 0x50, 0x35, 0xFF, 0x83, 0x58, 0x3C, 0xFF, 0x8D, 0x64, + 0x49, 0xFF, 0x9A, 0x74, 0x5A, 0xFF, 0xA5, 0x7F, 0x63, 0xF4, 0xA2, 0x77, 0x53, 0xD2, 0x8E, 0x57, + 0x25, 0xA4, 0x81, 0x43, 0x0A, 0x8E, 0x81, 0x43, 0x0B, 0x8B, 0x82, 0x44, 0x0C, 0x86, 0x82, 0x44, + 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, + 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x2F, 0x82, 0x44, 0x0C, 0x21, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x43, 0x0B, 0x03, 0x86, 0x4A, + 0x15, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x42, 0x09, 0x01, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, + 0x0C, 0x50, 0x81, 0x43, 0x0A, 0x5A, 0x83, 0x46, 0x0E, 0x62, 0x97, 0x65, 0x38, 0x8D, 0xA1, 0x77, + 0x56, 0xD3, 0x94, 0x6A, 0x4D, 0xFA, 0x7E, 0x50, 0x33, 0xFF, 0x6F, 0x3F, 0x22, 0xFF, 0x69, 0x38, + 0x1B, 0xFF, 0x67, 0x36, 0x19, 0xFF, 0x68, 0x37, 0x19, 0xFF, 0x6A, 0x38, 0x1A, 0xFF, 0x6C, 0x3A, + 0x1C, 0xFF, 0x6E, 0x3D, 0x1D, 0xFF, 0x71, 0x3F, 0x1F, 0xFF, 0x72, 0x41, 0x20, 0xFF, 0x74, 0x42, + 0x21, 0xFF, 0x76, 0x44, 0x22, 0xFF, 0x77, 0x46, 0x24, 0xFF, 0x78, 0x47, 0x25, 0xFF, 0x79, 0x48, + 0x26, 0xFF, 0x7A, 0x49, 0x27, 0xFF, 0x7B, 0x4A, 0x28, 0xFF, 0x7C, 0x4B, 0x29, 0xFF, 0x7C, 0x4C, + 0x2A, 0xFF, 0x7C, 0x4C, 0x2B, 0xFF, 0x7D, 0x4D, 0x2C, 0xFF, 0x7C, 0x4D, 0x2D, 0xFF, 0x7C, 0x4D, + 0x2E, 0xFF, 0x7C, 0x4D, 0x2F, 0xFF, 0x7B, 0x4D, 0x2F, 0xFF, 0x7C, 0x4E, 0x31, 0xFF, 0x7D, 0x50, + 0x34, 0xFF, 0x82, 0x56, 0x3A, 0xFF, 0x8D, 0x63, 0x47, 0xFF, 0x9C, 0x76, 0x5B, 0xFF, 0xA6, 0x81, + 0x64, 0xE9, 0x9F, 0x72, 0x4A, 0xAF, 0x89, 0x4F, 0x19, 0x7B, 0x81, 0x42, 0x09, 0x6C, 0x82, 0x44, + 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x4B, 0x82, 0x44, + 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x31, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x05, 0x81, 0x43, 0x0B, 0x02, 0x94, 0x60, + 0x30, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0B, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, 0x0C, 0x31, 0x80, 0x41, + 0x08, 0x37, 0x8E, 0x56, 0x23, 0x4C, 0xA4, 0x7A, 0x57, 0x9E, 0x9C, 0x74, 0x56, 0xEC, 0x84, 0x57, + 0x38, 0xFF, 0x70, 0x3F, 0x21, 0xFF, 0x68, 0x36, 0x18, 0xFF, 0x66, 0x34, 0x15, 0xFF, 0x67, 0x35, + 0x16, 0xFF, 0x69, 0x37, 0x17, 0xFF, 0x6C, 0x39, 0x19, 0xFF, 0x6E, 0x3B, 0x1A, 0xFF, 0x71, 0x3E, + 0x1B, 0xFF, 0x73, 0x40, 0x1D, 0xFF, 0x75, 0x42, 0x1E, 0xFF, 0x77, 0x44, 0x20, 0xFF, 0x79, 0x45, + 0x21, 0xFF, 0x7A, 0x47, 0x22, 0xFF, 0x7C, 0x49, 0x23, 0xFF, 0x7D, 0x4A, 0x24, 0xFF, 0x7E, 0x4B, + 0x25, 0xFF, 0x7F, 0x4C, 0x26, 0xFF, 0x80, 0x4D, 0x27, 0xFF, 0x81, 0x4E, 0x28, 0xFF, 0x81, 0x4F, + 0x29, 0xFF, 0x81, 0x4F, 0x2A, 0xFF, 0x81, 0x50, 0x2B, 0xFF, 0x81, 0x50, 0x2C, 0xFF, 0x81, 0x50, + 0x2D, 0xFF, 0x81, 0x50, 0x2E, 0xFF, 0x80, 0x50, 0x2E, 0xFF, 0x7F, 0x50, 0x2F, 0xFF, 0x7E, 0x50, + 0x30, 0xFF, 0x7E, 0x50, 0x31, 0xFF, 0x80, 0x52, 0x35, 0xFF, 0x85, 0x5A, 0x3C, 0xFF, 0x92, 0x6A, + 0x4D, 0xFF, 0xA3, 0x7E, 0x62, 0xFA, 0xAA, 0x84, 0x64, 0xC8, 0x98, 0x66, 0x38, 0x72, 0x81, 0x42, + 0x09, 0x4B, 0x82, 0x43, 0x0B, 0x47, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0B, 0x03, 0x85, 0x49, 0x13, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0E, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0B, 0x19, 0x7D, 0x3C, 0x01, 0x1B, 0x9F, 0x70, + 0x46, 0x41, 0xA6, 0x7F, 0x60, 0xB4, 0x90, 0x65, 0x46, 0xF9, 0x75, 0x44, 0x24, 0xFF, 0x66, 0x32, + 0x13, 0xFF, 0x61, 0x2C, 0x0E, 0xFF, 0x61, 0x2B, 0x0C, 0xFF, 0x63, 0x2D, 0x0C, 0xFF, 0x65, 0x2E, + 0x0C, 0xFF, 0x68, 0x30, 0x0D, 0xFF, 0x6A, 0x32, 0x0E, 0xFF, 0x6D, 0x35, 0x0F, 0xFF, 0x6F, 0x38, + 0x11, 0xFF, 0x72, 0x3A, 0x13, 0xFF, 0x75, 0x3D, 0x14, 0xFF, 0x77, 0x40, 0x16, 0xFF, 0x7A, 0x43, + 0x19, 0xFF, 0x7D, 0x46, 0x1C, 0xFF, 0x7F, 0x49, 0x20, 0xFF, 0x81, 0x4C, 0x22, 0xFF, 0x83, 0x4E, + 0x24, 0xFF, 0x84, 0x4F, 0x26, 0xFF, 0x85, 0x50, 0x27, 0xFF, 0x85, 0x51, 0x29, 0xFF, 0x86, 0x51, + 0x29, 0xFF, 0x86, 0x52, 0x2A, 0xFF, 0x86, 0x52, 0x2B, 0xFF, 0x86, 0x53, 0x2C, 0xFF, 0x86, 0x53, + 0x2D, 0xFF, 0x85, 0x53, 0x2E, 0xFF, 0x85, 0x53, 0x2E, 0xFF, 0x84, 0x53, 0x2F, 0xFF, 0x83, 0x53, + 0x30, 0xFF, 0x82, 0x52, 0x30, 0xFF, 0x81, 0x52, 0x31, 0xFF, 0x80, 0x52, 0x33, 0xFF, 0x83, 0x55, + 0x37, 0xFF, 0x8C, 0x60, 0x43, 0xFF, 0x9C, 0x75, 0x59, 0xFF, 0xAB, 0x88, 0x6B, 0xDE, 0xA7, 0x7D, + 0x58, 0x72, 0x83, 0x45, 0x0D, 0x2D, 0x81, 0x42, 0x0A, 0x28, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x03, 0x81, 0x43, 0x0A, 0x02, 0x94, 0x5F, 0x2E, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x4A, + 0x13, 0x01, 0x81, 0x43, 0x0B, 0x01, 0x82, 0x44, 0x0B, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, + 0x0C, 0x07, 0x81, 0x42, 0x0A, 0x0A, 0x77, 0x31, 0x00, 0x09, 0xB0, 0x8A, 0x69, 0x3F, 0xA4, 0x7D, + 0x5E, 0xC8, 0x85, 0x57, 0x36, 0xFF, 0x6A, 0x35, 0x14, 0xFF, 0x5F, 0x29, 0x09, 0xFF, 0x5D, 0x26, + 0x05, 0xFF, 0x5F, 0x27, 0x05, 0xFF, 0x62, 0x29, 0x05, 0xFF, 0x64, 0x2B, 0x05, 0xFF, 0x67, 0x2D, + 0x06, 0xFF, 0x69, 0x2F, 0x06, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6D, 0x32, 0x07, 0xFF, 0x70, 0x34, + 0x07, 0xFF, 0x72, 0x35, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x75, 0x38, 0x09, 0xFF, 0x76, 0x39, + 0x0A, 0xFF, 0x78, 0x3B, 0x0B, 0xFF, 0x79, 0x3D, 0x0D, 0xFF, 0x7B, 0x40, 0x10, 0xFF, 0x7E, 0x43, + 0x13, 0xFF, 0x81, 0x48, 0x18, 0xFF, 0x84, 0x4C, 0x1E, 0xFF, 0x87, 0x50, 0x23, 0xFF, 0x89, 0x53, + 0x27, 0xFF, 0x8A, 0x55, 0x29, 0xFF, 0x8A, 0x56, 0x2A, 0xFF, 0x8A, 0x56, 0x2B, 0xFF, 0x8A, 0x56, + 0x2C, 0xFF, 0x8A, 0x56, 0x2D, 0xFF, 0x89, 0x56, 0x2D, 0xFF, 0x89, 0x56, 0x2E, 0xFF, 0x88, 0x56, + 0x2F, 0xFF, 0x87, 0x55, 0x2F, 0xFF, 0x85, 0x55, 0x30, 0xFF, 0x84, 0x54, 0x31, 0xFF, 0x83, 0x53, + 0x31, 0xFF, 0x83, 0x55, 0x34, 0xFF, 0x89, 0x5C, 0x3D, 0xFF, 0x97, 0x6F, 0x51, 0xFF, 0xAB, 0x86, + 0x6A, 0xEA, 0xB1, 0x8D, 0x6E, 0x78, 0x8E, 0x56, 0x23, 0x1A, 0x7F, 0x3F, 0x05, 0x12, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, + 0x0C, 0x03, 0x81, 0x43, 0x0B, 0x02, 0x80, 0x41, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x8B, 0x51, 0x1D, 0x01, 0x85, 0x48, 0x11, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x7E, 0x3D, + 0x03, 0x03, 0x5C, 0x09, 0x00, 0x02, 0xB7, 0x95, 0x77, 0x3E, 0xA3, 0x7B, 0x5C, 0xD0, 0x81, 0x50, + 0x2D, 0xFF, 0x67, 0x31, 0x0F, 0xFF, 0x5F, 0x28, 0x07, 0xFF, 0x5F, 0x28, 0x05, 0xFF, 0x62, 0x2A, + 0x05, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x67, 0x2E, 0x06, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6D, 0x32, + 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x72, 0x36, 0x08, 0xFF, 0x74, 0x38, 0x08, 0xFF, 0x76, 0x39, + 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3C, 0x09, 0xFF, 0x7B, 0x3D, + 0x0A, 0xFF, 0x7B, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, 0x09, 0xFF, 0x7C, 0x3E, + 0x09, 0xFF, 0x7D, 0x3E, 0x0A, 0xFF, 0x7E, 0x40, 0x0B, 0xFF, 0x7F, 0x42, 0x0E, 0xFF, 0x82, 0x46, + 0x13, 0xFF, 0x85, 0x4B, 0x19, 0xFF, 0x89, 0x51, 0x20, 0xFF, 0x8C, 0x56, 0x27, 0xFF, 0x8D, 0x58, + 0x2B, 0xFF, 0x8E, 0x59, 0x2C, 0xFF, 0x8D, 0x59, 0x2C, 0xFF, 0x8D, 0x59, 0x2D, 0xFF, 0x8C, 0x59, + 0x2E, 0xFF, 0x8B, 0x58, 0x2F, 0xFF, 0x8A, 0x58, 0x2F, 0xFF, 0x89, 0x57, 0x30, 0xFF, 0x87, 0x56, + 0x30, 0xFF, 0x85, 0x55, 0x31, 0xFF, 0x84, 0x55, 0x33, 0xFF, 0x88, 0x5A, 0x39, 0xFF, 0x95, 0x6B, + 0x4C, 0xFF, 0xAA, 0x86, 0x6A, 0xF2, 0xB6, 0x95, 0x79, 0x7C, 0x9D, 0x6D, 0x41, 0x0F, 0x78, 0x34, + 0x00, 0x06, 0x82, 0x44, 0x0D, 0x06, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x43, 0x0B, 0x02, 0x82, 0x44, + 0x0D, 0x01, 0x86, 0x49, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xBB, 0x9A, 0x7E, 0x37, 0xA3, 0x7C, 0x5D, 0xCF, 0x7F, 0x4E, 0x2B, 0xFF, 0x67, 0x30, + 0x0E, 0xFF, 0x60, 0x29, 0x07, 0xFF, 0x61, 0x29, 0x06, 0xFF, 0x64, 0x2B, 0x06, 0xFF, 0x68, 0x2E, + 0x06, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6C, 0x32, 0x08, 0xFF, 0x6D, 0x34, 0x08, 0xFF, 0x6E, 0x35, + 0x08, 0xFF, 0x72, 0x38, 0x09, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x7B, 0x3E, + 0x0A, 0xFF, 0x7D, 0x3F, 0x0A, 0xFF, 0x7E, 0x3F, 0x0B, 0xFF, 0x7F, 0x40, 0x0B, 0xFF, 0x7F, 0x41, + 0x0B, 0xFF, 0x80, 0x41, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x42, + 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x43, 0x0C, 0xFF, 0x84, 0x46, 0x11, 0xFF, 0x87, 0x4C, + 0x18, 0xFF, 0x8C, 0x53, 0x22, 0xFF, 0x8F, 0x59, 0x29, 0xFF, 0x90, 0x5B, 0x2D, 0xFF, 0x90, 0x5B, + 0x2E, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8E, 0x5A, 0x2F, 0xFF, 0x8D, 0x5A, 0x2F, 0xFF, 0x8B, 0x59, + 0x30, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x88, 0x57, 0x31, 0xFF, 0x87, 0x56, 0x33, 0xFF, 0x89, 0x5A, + 0x38, 0xFF, 0x95, 0x6A, 0x4A, 0xFF, 0xAB, 0x87, 0x6A, 0xF3, 0xBA, 0x99, 0x7E, 0x74, 0xA8, 0x7C, + 0x51, 0x07, 0x61, 0x13, 0x00, 0x01, 0x83, 0x45, 0x0D, 0x01, 0x85, 0x48, 0x11, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0xA9, + 0x90, 0x2C, 0xA7, 0x80, 0x61, 0xC6, 0x83, 0x51, 0x2D, 0xFF, 0x69, 0x32, 0x0F, 0xFF, 0x63, 0x2A, + 0x07, 0xFF, 0x64, 0x2A, 0x06, 0xFF, 0x66, 0x2D, 0x07, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6D, 0x32, + 0x08, 0xFF, 0x6E, 0x34, 0x08, 0xFF, 0x6B, 0x34, 0x08, 0xFF, 0x66, 0x32, 0x06, 0xFF, 0x65, 0x32, + 0x06, 0xFF, 0x6B, 0x36, 0x08, 0xFF, 0x75, 0x3C, 0x0A, 0xFF, 0x7C, 0x3F, 0x0B, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x84, 0x45, 0x0D, 0xFF, 0x86, 0x49, 0x12, 0xFF, 0x8B, 0x51, 0x1C, 0xFF, 0x90, 0x58, + 0x27, 0xFF, 0x92, 0x5C, 0x2D, 0xFF, 0x92, 0x5D, 0x2F, 0xFF, 0x91, 0x5C, 0x2F, 0xFF, 0x8F, 0x5C, + 0x2F, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8C, 0x5A, 0x31, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x89, 0x58, + 0x32, 0xFF, 0x8B, 0x5B, 0x38, 0xFF, 0x98, 0x6C, 0x4B, 0xFF, 0xAE, 0x89, 0x6C, 0xED, 0xBF, 0x9F, + 0x85, 0x62, 0xD1, 0xB1, 0x92, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xB2, 0x9C, 0x19, 0xAD, 0x88, + 0x69, 0xB4, 0x88, 0x57, 0x33, 0xFF, 0x6C, 0x34, 0x10, 0xFF, 0x65, 0x2B, 0x07, 0xFF, 0x66, 0x2C, + 0x06, 0xFF, 0x69, 0x2F, 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x6F, 0x35, + 0x08, 0xFF, 0x68, 0x33, 0x06, 0xFF, 0x60, 0x32, 0x08, 0xFF, 0x92, 0x74, 0x58, 0xFF, 0xA0, 0x89, + 0x71, 0xFF, 0x65, 0x3D, 0x14, 0xFF, 0x67, 0x36, 0x06, 0xFF, 0x77, 0x3F, 0x0A, 0xFF, 0x80, 0x43, + 0x0B, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x87, 0x46, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x85, 0x46, 0x0B, 0xFF, 0x87, 0x48, + 0x0F, 0xFF, 0x8B, 0x50, 0x18, 0xFF, 0x91, 0x58, 0x25, 0xFF, 0x94, 0x5E, 0x2E, 0xFF, 0x94, 0x5E, + 0x30, 0xFF, 0x92, 0x5D, 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8B, 0x59, 0x32, 0xFF, 0x8D, 0x5D, 0x39, 0xFF, 0x9B, 0x6F, 0x4E, 0xFF, 0xB2, 0x8E, + 0x71, 0xE4, 0xC8, 0xAB, 0x93, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xD4, 0xC1, 0x07, 0xB5, 0x92, 0x74, 0x8D, 0x90, 0x61, + 0x3C, 0xFE, 0x70, 0x39, 0x13, 0xFF, 0x67, 0x2D, 0x08, 0xFF, 0x68, 0x2D, 0x07, 0xFF, 0x6C, 0x30, + 0x07, 0xFF, 0x6F, 0x33, 0x08, 0xFF, 0x72, 0x36, 0x09, 0xFF, 0x71, 0x38, 0x09, 0xFF, 0x67, 0x32, + 0x05, 0xFF, 0x6C, 0x45, 0x1E, 0xFF, 0xA0, 0x8C, 0x77, 0xFF, 0xB8, 0xAE, 0xA1, 0xFF, 0xE4, 0xE2, + 0xDD, 0xFF, 0xC3, 0xB7, 0xA8, 0xFF, 0x74, 0x53, 0x2E, 0xFF, 0x66, 0x38, 0x06, 0xFF, 0x76, 0x40, + 0x0A, 0xFF, 0x81, 0x45, 0x0C, 0xFF, 0x86, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x49, 0x0E, 0xFF, 0x8C, 0x50, 0x18, 0xFF, 0x92, 0x5A, + 0x26, 0xFF, 0x95, 0x5F, 0x2E, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x91, 0x5D, + 0x30, 0xFF, 0x8F, 0x5B, 0x31, 0xFF, 0x8D, 0x5A, 0x32, 0xFF, 0x90, 0x60, 0x3A, 0xFF, 0xA0, 0x75, + 0x53, 0xFF, 0xB7, 0x95, 0x78, 0xCD, 0xD0, 0xB8, 0xA3, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x9F, 0x83, 0x59, 0x9C, 0x70, 0x4C, 0xF1, 0x77, 0x40, + 0x19, 0xFF, 0x69, 0x2F, 0x09, 0xFF, 0x69, 0x2E, 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x71, 0x34, + 0x08, 0xFF, 0x73, 0x38, 0x09, 0xFF, 0x73, 0x39, 0x09, 0xFF, 0x68, 0x34, 0x05, 0xFF, 0x70, 0x4A, + 0x24, 0xFF, 0xC3, 0xB7, 0xAA, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xCD, 0xC9, 0xC1, 0xFF, 0x9D, 0x94, + 0x83, 0xFF, 0xD0, 0xCC, 0xC3, 0xFF, 0xDD, 0xD6, 0xCE, 0xFF, 0x8E, 0x74, 0x54, 0xFF, 0x68, 0x3C, + 0x0B, 0xFF, 0x74, 0x40, 0x0A, 0xFF, 0x80, 0x46, 0x0C, 0xFF, 0x87, 0x49, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x89, 0x4A, + 0x0F, 0xFF, 0x8E, 0x53, 0x1A, 0xFF, 0x94, 0x5D, 0x29, 0xFF, 0x96, 0x60, 0x2F, 0xFF, 0x94, 0x5F, + 0x30, 0xFF, 0x92, 0x5E, 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8E, 0x5C, 0x32, 0xFF, 0x94, 0x64, + 0x3E, 0xFF, 0xA7, 0x7F, 0x5C, 0xFF, 0xBE, 0x9F, 0x83, 0xA0, 0xD7, 0xC4, 0xB1, 0x0E, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0xB0, 0x96, 0x23, 0xAA, 0x83, 0x61, 0xCB, 0x83, 0x4E, 0x26, 0xFF, 0x6D, 0x33, + 0x0C, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6E, 0x32, 0x07, 0xFF, 0x73, 0x36, 0x08, 0xFF, 0x76, 0x39, + 0x09, 0xFF, 0x75, 0x3A, 0x09, 0xFF, 0x6B, 0x37, 0x06, 0xFF, 0x6F, 0x4A, 0x21, 0xFF, 0xC5, 0xBA, + 0xAD, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xD7, 0xD4, + 0xD0, 0xFF, 0x95, 0x8B, 0x78, 0xFF, 0xB2, 0xAA, 0x9C, 0xFF, 0xE6, 0xE3, 0xDD, 0xFF, 0xAB, 0x98, + 0x81, 0xFF, 0x6D, 0x46, 0x17, 0xFF, 0x70, 0x3E, 0x08, 0xFF, 0x7E, 0x46, 0x0C, 0xFF, 0x86, 0x49, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4C, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8C, 0x4D, 0x11, 0xFF, 0x92, 0x57, 0x1F, 0xFF, 0x96, 0x60, + 0x2D, 0xFF, 0x96, 0x60, 0x2F, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x91, 0x5D, 0x30, 0xFF, 0x91, 0x5E, + 0x34, 0xFF, 0x9A, 0x6C, 0x45, 0xFF, 0xB1, 0x8B, 0x6A, 0xF4, 0xC7, 0xA8, 0x8E, 0x61, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE2, + 0xD4, 0x04, 0xB9, 0x96, 0x77, 0x86, 0x94, 0x63, 0x3C, 0xFE, 0x73, 0x3A, 0x12, 0xFF, 0x6C, 0x31, + 0x08, 0xFF, 0x6F, 0x32, 0x08, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x78, 0x3C, + 0x0A, 0xFF, 0x70, 0x39, 0x08, 0xFF, 0x6D, 0x45, 0x1A, 0xFF, 0xC0, 0xB4, 0xA5, 0xFF, 0xEB, 0xEA, + 0xEB, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE5, 0xE4, 0xE4, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xE8, 0xE7, + 0xE8, 0xFF, 0xE2, 0xE0, 0xDD, 0xFF, 0x9A, 0x90, 0x7F, 0xFF, 0x92, 0x86, 0x72, 0xFF, 0xDE, 0xDB, + 0xD6, 0xFF, 0xC5, 0xBA, 0xAB, 0xFF, 0x7A, 0x59, 0x2F, 0xFF, 0x6C, 0x3D, 0x08, 0xFF, 0x7B, 0x45, + 0x0C, 0xFF, 0x86, 0x4A, 0x0D, 0xFF, 0x8C, 0x4C, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0E, 0xFF, 0x8F, 0x52, + 0x17, 0xFF, 0x96, 0x5D, 0x28, 0xFF, 0x97, 0x61, 0x30, 0xFF, 0x95, 0x60, 0x30, 0xFF, 0x92, 0x5E, + 0x30, 0xFF, 0x94, 0x62, 0x37, 0xFF, 0xA3, 0x77, 0x52, 0xFF, 0xBB, 0x99, 0x7A, 0xCC, 0xD1, 0xB7, + 0xA0, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xA9, + 0x8D, 0x36, 0xA7, 0x7C, 0x58, 0xE1, 0x7F, 0x48, 0x1E, 0xFF, 0x6F, 0x34, 0x0A, 0xFF, 0x70, 0x33, + 0x07, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x79, 0x3B, 0x09, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x74, 0x3C, + 0x08, 0xFF, 0x6B, 0x3F, 0x12, 0xFF, 0xB5, 0xA5, 0x93, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE5, 0xE4, + 0xE4, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE8, 0xE7, 0xFF, 0xA8, 0xA0, 0x91, 0xFF, 0x7C, 0x6D, + 0x56, 0xFF, 0xC9, 0xC3, 0xBA, 0xFF, 0xD9, 0xD3, 0xCC, 0xFF, 0x90, 0x76, 0x55, 0xFF, 0x6B, 0x40, + 0x0C, 0xFF, 0x77, 0x43, 0x0A, 0xFF, 0x85, 0x4A, 0x0D, 0xFF, 0x8C, 0x4D, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4F, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8E, 0x4F, 0x12, 0xFF, 0x94, 0x5A, 0x22, 0xFF, 0x98, 0x61, 0x2E, 0xFF, 0x95, 0x60, + 0x2F, 0xFF, 0x94, 0x5F, 0x31, 0xFF, 0x9A, 0x69, 0x3F, 0xFF, 0xAF, 0x87, 0x63, 0xFD, 0xC5, 0xA8, + 0x8B, 0x7D, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xEE, 0xE4, 0x06, 0xB9, 0x95, + 0x73, 0x94, 0x92, 0x60, 0x36, 0xFF, 0x76, 0x3B, 0x10, 0xFF, 0x71, 0x34, 0x08, 0xFF, 0x75, 0x37, + 0x08, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7E, 0x3F, 0x0A, 0xFF, 0x7C, 0x40, 0x0A, 0xFF, 0x70, 0x3D, + 0x0B, 0xFF, 0xA7, 0x91, 0x77, 0xFF, 0xEA, 0xE9, 0xE8, 0xFF, 0xE5, 0xE4, 0xE4, 0xFF, 0xE6, 0xE5, + 0xE5, 0xFF, 0xE8, 0xE7, 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xBA, 0xB3, + 0xAA, 0xFF, 0x72, 0x62, 0x48, 0xFF, 0xAB, 0xA2, 0x92, 0xFF, 0xDF, 0xDD, 0xD9, 0xFF, 0xA9, 0x97, + 0x80, 0xFF, 0x70, 0x4A, 0x19, 0xFF, 0x73, 0x41, 0x08, 0xFF, 0x82, 0x4A, 0x0D, 0xFF, 0x8B, 0x4E, + 0x0E, 0xFF, 0x90, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x92, 0x50, + 0x0F, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0D, 0xFF, 0x8E, 0x4D, 0x0F, 0xFF, 0x93, 0x56, 0x1C, 0xFF, 0x98, 0x61, + 0x2C, 0xFF, 0x97, 0x61, 0x2F, 0xFF, 0x97, 0x62, 0x34, 0xFF, 0xA4, 0x76, 0x4D, 0xFF, 0xBC, 0x99, + 0x79, 0xD7, 0xD3, 0xB9, 0xA1, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xB4, 0x9A, 0x30, 0xA9, 0x7F, + 0x58, 0xE0, 0x83, 0x4A, 0x1E, 0xFF, 0x74, 0x37, 0x0A, 0xFF, 0x75, 0x37, 0x08, 0xFF, 0x7A, 0x3B, + 0x09, 0xFF, 0x7E, 0x3F, 0x0A, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x7C, 0x42, 0x09, 0xFF, 0x9F, 0x7E, + 0x5B, 0xFF, 0xE9, 0xE6, 0xE3, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE7, 0xE7, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE6, 0xFF, 0xE8, 0xE8, 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xCB, 0xC7, 0xBE, 0xFF, 0x75, 0x65, 0x49, 0xFF, 0x8E, 0x80, 0x6A, 0xFF, 0xD9, 0xD7, + 0xD3, 0xFF, 0xC0, 0xB6, 0xA8, 0xFF, 0x7C, 0x5C, 0x31, 0xFF, 0x6F, 0x41, 0x09, 0xFF, 0x7E, 0x49, + 0x0D, 0xFF, 0x8A, 0x4E, 0x0E, 0xFF, 0x90, 0x51, 0x0F, 0xFF, 0x92, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x92, 0x54, + 0x18, 0xFF, 0x97, 0x60, 0x2A, 0xFF, 0x98, 0x62, 0x30, 0xFF, 0x9D, 0x6A, 0x3D, 0xFF, 0xB2, 0x8A, + 0x64, 0xFE, 0xCA, 0xAB, 0x8E, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0x9F, 0x80, 0x7C, 0x99, 0x67, + 0x3C, 0xFE, 0x7C, 0x3F, 0x12, 0xFF, 0x76, 0x38, 0x09, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7E, 0x3F, + 0x0A, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x86, 0x47, 0x0C, 0xFF, 0x82, 0x46, 0x0B, 0xFF, 0xBA, 0x9F, + 0x81, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, 0x82, 0x74, 0x5C, 0xFF, 0x77, 0x66, + 0x49, 0xFF, 0xCB, 0xC5, 0xBD, 0xFF, 0xD4, 0xCF, 0xC9, 0xFF, 0x90, 0x78, 0x55, 0xFF, 0x6F, 0x45, + 0x0F, 0xFF, 0x7B, 0x48, 0x0C, 0xFF, 0x89, 0x4F, 0x0F, 0xFF, 0x91, 0x53, 0x10, 0xFF, 0x94, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x8F, 0x4F, + 0x0E, 0xFF, 0x91, 0x53, 0x15, 0xFF, 0x98, 0x5F, 0x28, 0xFF, 0x9B, 0x65, 0x33, 0xFF, 0xA9, 0x7B, + 0x50, 0xFF, 0xC2, 0xA0, 0x7E, 0xC6, 0xDA, 0xC3, 0xAC, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xD8, 0xC9, 0x16, 0xB4, 0x8C, 0x67, 0xC4, 0x8C, 0x55, + 0x26, 0xFF, 0x7A, 0x3B, 0x0C, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x7F, 0x3F, 0x0A, 0xFF, 0x83, 0x43, + 0x0B, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8A, 0x4B, 0x0C, 0xFF, 0x8C, 0x58, + 0x20, 0xFF, 0xD3, 0xC3, 0xB0, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xED, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xF0, 0xF0, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, + 0xEF, 0xFF, 0xF0, 0xF0, 0xEF, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xE2, 0xE2, 0xDF, 0xFF, 0x94, 0x88, + 0x73, 0xFF, 0x6B, 0x58, 0x35, 0xFF, 0xB7, 0xAE, 0xA0, 0xFF, 0xE0, 0xDE, 0xDC, 0xFF, 0xA9, 0x99, + 0x82, 0xFF, 0x74, 0x4F, 0x1E, 0xFF, 0x77, 0x47, 0x0C, 0xFF, 0x87, 0x50, 0x11, 0xFF, 0x91, 0x55, + 0x12, 0xFF, 0x96, 0x57, 0x13, 0xFF, 0x97, 0x57, 0x13, 0xFF, 0x98, 0x57, 0x13, 0xFF, 0x97, 0x57, + 0x13, 0xFF, 0x97, 0x57, 0x13, 0xFF, 0x97, 0x57, 0x13, 0xFF, 0x97, 0x57, 0x12, 0xFF, 0x97, 0x56, + 0x12, 0xFF, 0x97, 0x56, 0x11, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x92, 0x53, 0x15, 0xFF, 0x98, 0x60, 0x29, 0xFF, 0xA3, 0x70, + 0x41, 0xFF, 0xBA, 0x94, 0x6E, 0xF2, 0xD1, 0xB4, 0x98, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0xB2, 0x95, 0x45, 0xA8, 0x7A, 0x50, 0xF0, 0x84, 0x48, + 0x18, 0xFF, 0x7B, 0x3C, 0x0A, 0xFF, 0x7E, 0x3E, 0x0A, 0xFF, 0x84, 0x43, 0x0B, 0xFF, 0x88, 0x47, + 0x0C, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x8C, 0x4E, + 0x0B, 0xFF, 0x98, 0x6A, 0x36, 0xFF, 0xE2, 0xDA, 0xCF, 0xFF, 0xF0, 0xF1, 0xF2, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF1, 0xF1, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xEC, 0xEC, + 0xEB, 0xFF, 0xA8, 0xA0, 0x90, 0xFF, 0x68, 0x54, 0x32, 0xFF, 0xA0, 0x93, 0x7D, 0xFF, 0xE2, 0xE1, + 0xDF, 0xFF, 0xC3, 0xBB, 0xAD, 0xFF, 0x81, 0x63, 0x38, 0xFF, 0x74, 0x47, 0x0E, 0xFF, 0x85, 0x50, + 0x12, 0xFF, 0x91, 0x56, 0x13, 0xFF, 0x98, 0x59, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x58, + 0x11, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x55, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x50, 0x0E, 0xFF, 0x92, 0x53, 0x14, 0xFF, 0x9E, 0x66, + 0x31, 0xFF, 0xB3, 0x88, 0x5D, 0xFF, 0xCB, 0xAB, 0x8B, 0x91, 0xF9, 0xEF, 0xE2, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0xA3, 0x82, 0x80, 0x9C, 0x68, 0x3B, 0xFF, 0x81, 0x43, + 0x11, 0xFF, 0x7E, 0x3E, 0x0A, 0xFF, 0x83, 0x42, 0x0B, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x90, 0x4E, 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x8D, 0x50, 0x0C, 0xFF, 0xA8, 0x83, 0x56, 0xFF, 0xEC, 0xE8, 0xE3, 0xFF, 0xEF, 0xEF, + 0xF0, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xBD, 0xB7, 0xAC, 0xFF, 0x6F, 0x5C, 0x38, 0xFF, 0x8A, 0x79, + 0x5C, 0xFF, 0xDB, 0xD8, 0xD3, 0xFF, 0xD9, 0xD5, 0xCF, 0xFF, 0x94, 0x7E, 0x5C, 0xFF, 0x74, 0x4C, + 0x15, 0xFF, 0x81, 0x50, 0x13, 0xFF, 0x90, 0x58, 0x15, 0xFF, 0x99, 0x5B, 0x16, 0xFF, 0x9C, 0x5D, + 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, + 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, + 0x16, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9B, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, + 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x99, 0x58, 0x11, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x92, 0x51, 0x0E, 0xFF, 0x95, 0x58, + 0x1B, 0xFF, 0xAB, 0x7A, 0x4B, 0xFF, 0xC5, 0xA3, 0x80, 0xCB, 0xBA, 0xA6, 0x90, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF0, 0xE5, 0xD6, 0x0B, 0xBA, 0x93, 0x6C, 0xB8, 0x94, 0x5C, 0x2B, 0xFF, 0x81, 0x41, + 0x0D, 0xFF, 0x82, 0x41, 0x0A, 0xFF, 0x87, 0x46, 0x0C, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x90, 0x4E, + 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x9A, 0x5C, 0x15, 0xFF, 0x92, 0x5A, 0x16, 0xFF, 0xBC, 0xA1, 0x7F, 0xFF, 0xEE, 0xEE, + 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xD0, 0xCC, 0xC4, 0xFF, 0x7D, 0x6D, + 0x4C, 0xFF, 0x7A, 0x67, 0x43, 0xFF, 0xCE, 0xC8, 0xBE, 0xFF, 0xE5, 0xE4, 0xE3, 0xFF, 0xAB, 0x9D, + 0x85, 0xFF, 0x7A, 0x57, 0x24, 0xFF, 0x7E, 0x50, 0x13, 0xFF, 0x8F, 0x59, 0x17, 0xFF, 0x99, 0x5E, + 0x18, 0xFF, 0x9E, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, + 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9F, 0x5F, 0x17, 0xFF, 0x9D, 0x5D, + 0x14, 0xFF, 0x9C, 0x5B, 0x12, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, 0x11, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x93, 0x52, + 0x10, 0xFF, 0xA1, 0x6A, 0x31, 0xFF, 0xBF, 0x99, 0x71, 0xEC, 0xAF, 0x9A, 0x82, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE1, 0xCD, 0xB7, 0x27, 0xB4, 0x88, 0x5D, 0xDB, 0x8F, 0x54, 0x20, 0xFF, 0x82, 0x42, + 0x0C, 0xFF, 0x86, 0x45, 0x0B, 0xFF, 0x8B, 0x49, 0x0C, 0xFF, 0x90, 0x4E, 0x0E, 0xFF, 0x93, 0x52, + 0x0E, 0xFF, 0x97, 0x55, 0x0F, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9E, 0x5D, 0x15, 0xFF, 0xA1, 0x62, + 0x1A, 0xFF, 0xA1, 0x63, 0x1C, 0xFF, 0x9D, 0x60, 0x1A, 0xFF, 0x97, 0x62, 0x22, 0xFF, 0xCB, 0xB8, + 0xA1, 0xFF, 0xEC, 0xED, 0xEE, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xDD, 0xDB, + 0xD7, 0xFF, 0x90, 0x82, 0x66, 0xFF, 0x71, 0x5D, 0x35, 0xFF, 0xBD, 0xB4, 0xA4, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xC3, 0xBA, 0xAC, 0xFF, 0x85, 0x68, 0x3C, 0xFF, 0x7B, 0x50, 0x15, 0xFF, 0x8D, 0x59, + 0x19, 0xFF, 0x99, 0x5F, 0x1B, 0xFF, 0x9F, 0x62, 0x1C, 0xFF, 0xA1, 0x63, 0x1C, 0xFF, 0xA2, 0x63, + 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, + 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA2, 0x63, + 0x1B, 0xFF, 0xA1, 0x62, 0x19, 0xFF, 0x9F, 0x5E, 0x14, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9D, 0x5B, + 0x11, 0xFF, 0x9C, 0x5A, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x96, 0x54, + 0x10, 0xFF, 0x9B, 0x5E, 0x1F, 0xFF, 0xB7, 0x8B, 0x5D, 0xFB, 0xD0, 0xB3, 0x94, 0x6B, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xD3, 0xB5, 0x97, 0x45, 0xAE, 0x7F, 0x51, 0xEF, 0x8D, 0x4F, 0x19, 0xFF, 0x85, 0x43, + 0x0B, 0xFF, 0x8A, 0x47, 0x0C, 0xFF, 0x8F, 0x4D, 0x0D, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x97, 0x55, + 0x0F, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0xA1, 0x61, 0x1A, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA4, 0x66, 0x1E, 0xFF, 0x9E, 0x62, 0x1B, 0xFF, 0x9D, 0x6F, + 0x34, 0xFF, 0xD5, 0xCA, 0xBA, 0xFF, 0xE8, 0xE9, 0xEA, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xEE, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xA5, 0x9A, 0x85, 0xFF, 0x6F, 0x5A, 0x30, 0xFF, 0xA9, 0x9D, + 0x86, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xD6, 0xD2, 0xCC, 0xFF, 0x96, 0x80, 0x5E, 0xFF, 0x7A, 0x54, + 0x1C, 0xFF, 0x89, 0x59, 0x1A, 0xFF, 0x99, 0x61, 0x1D, 0xFF, 0xA1, 0x65, 0x1E, 0xFF, 0xA4, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, + 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA5, 0x66, 0x1E, 0xFF, 0xA3, 0x63, 0x1A, 0xFF, 0xA0, 0x5F, + 0x13, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9C, 0x5A, 0x11, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x9A, 0x5B, 0x18, 0xFF, 0xB0, 0x7E, 0x49, 0xFF, 0xCF, 0xAE, 0x8C, 0x94, 0xFF, 0xFF, + 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0xAA, 0x88, 0x64, 0xA9, 0x77, 0x47, 0xFC, 0x8D, 0x4D, 0x15, 0xFF, 0x89, 0x46, + 0x0B, 0xFF, 0x8E, 0x4B, 0x0D, 0xFF, 0x92, 0x50, 0x0E, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0xA3, 0x65, 0x1F, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA8, 0x6A, + 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA7, 0x6A, 0x21, 0xFF, 0x9E, 0x64, + 0x1D, 0xFF, 0xA6, 0x7F, 0x4B, 0xFF, 0xDA, 0xD4, 0xCC, 0xFF, 0xE3, 0xE4, 0xE5, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE1, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xB8, 0xB1, 0xA1, 0xFF, 0x74, 0x60, + 0x37, 0xFF, 0x97, 0x86, 0x68, 0xFF, 0xDE, 0xDC, 0xD8, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xAB, 0x9D, + 0x84, 0xFF, 0x7F, 0x5E, 0x2B, 0xFF, 0x86, 0x59, 0x1B, 0xFF, 0x98, 0x63, 0x20, 0xFF, 0xA2, 0x67, + 0x21, 0xFF, 0xA6, 0x69, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, + 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, + 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA8, 0x6A, 0x21, 0xFF, 0xA7, 0x69, + 0x1E, 0xFF, 0xA3, 0x62, 0x16, 0xFF, 0xA0, 0x5E, 0x12, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0x9C, 0x5A, + 0x10, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0xAD, 0x77, 0x3E, 0xFF, 0xCC, 0xAA, 0x85, 0xB4, 0xF3, 0xEC, + 0xE1, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x01, 0xCA, 0xA5, 0x81, 0x80, 0xA7, 0x71, 0x3D, 0xFF, 0x8E, 0x4D, 0x13, 0xFF, 0x8C, 0x49, + 0x0C, 0xFF, 0x92, 0x4F, 0x0D, 0xFF, 0x97, 0x55, 0x11, 0xFF, 0x9F, 0x60, 0x1B, 0xFF, 0xA5, 0x68, + 0x23, 0xFF, 0xA8, 0x6A, 0x24, 0xFF, 0xA9, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xA9, 0x6D, + 0x24, 0xFF, 0x9F, 0x67, 0x21, 0xFF, 0xB0, 0x90, 0x66, 0xFF, 0xDC, 0xDA, 0xD7, 0xFF, 0xDF, 0xDF, + 0xE0, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE0, 0xE0, + 0xE1, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE5, 0xE6, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xCA, 0xC4, + 0xBA, 0xFF, 0x7F, 0x6D, 0x47, 0xFF, 0x88, 0x75, 0x51, 0xFF, 0xD2, 0xCD, 0xC4, 0xFF, 0xE6, 0xE7, + 0xE7, 0xFF, 0xC0, 0xB7, 0xA8, 0xFF, 0x89, 0x6E, 0x42, 0xFF, 0x83, 0x5A, 0x1E, 0xFF, 0x96, 0x64, + 0x22, 0xFF, 0xA2, 0x6A, 0x24, 0xFF, 0xA9, 0x6D, 0x24, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAB, 0x6E, + 0x25, 0xFF, 0xAA, 0x6D, 0x23, 0xFF, 0xA6, 0x66, 0x1B, 0xFF, 0xA2, 0x5F, 0x13, 0xFF, 0x9F, 0x5C, + 0x11, 0xFF, 0x9F, 0x5D, 0x14, 0xFF, 0xAC, 0x74, 0x36, 0xFF, 0xCA, 0xA4, 0x7B, 0xCB, 0xE3, 0xCF, + 0xB6, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x05, 0xCB, 0xA7, 0x81, 0x95, 0xA5, 0x6D, 0x37, 0xFF, 0x90, 0x4E, 0x12, 0xFF, 0x90, 0x4C, + 0x0C, 0xFF, 0x96, 0x54, 0x11, 0xFF, 0xA0, 0x62, 0x1F, 0xFF, 0xA6, 0x69, 0x25, 0xFF, 0xA9, 0x6C, + 0x26, 0xFF, 0xAB, 0x6E, 0x27, 0xFF, 0xAD, 0x70, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAD, 0x71, + 0x27, 0xFF, 0xAA, 0x6F, 0x26, 0xFF, 0xA0, 0x6C, 0x28, 0xFF, 0xBA, 0xA2, 0x81, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xD2, 0xCD, + 0xC4, 0xFF, 0xB2, 0xA3, 0x89, 0xFF, 0xCB, 0xC0, 0xAF, 0xFF, 0xE2, 0xE1, 0xE1, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xD5, 0xD3, 0xCD, 0xFF, 0x8E, 0x7F, 0x5E, 0xFF, 0x81, 0x6D, 0x45, 0xFF, 0xC4, 0xBD, + 0xB0, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xD0, 0xCB, 0xC3, 0xFF, 0x98, 0x83, 0x5F, 0xFF, 0x82, 0x5D, + 0x23, 0xFF, 0x93, 0x64, 0x23, 0xFF, 0xA2, 0x6C, 0x27, 0xFF, 0xAA, 0x6F, 0x27, 0xFF, 0xAD, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, 0x27, 0xFF, 0xAE, 0x71, + 0x27, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAD, 0x70, 0x27, 0xFF, 0xA8, 0x69, 0x1E, 0xFF, 0xA2, 0x60, + 0x13, 0xFF, 0xA0, 0x5E, 0x13, 0xFF, 0xAB, 0x72, 0x31, 0xFF, 0xC9, 0xA1, 0x76, 0xDB, 0xE2, 0xCE, + 0xB5, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x08, 0xCB, 0xA6, 0x80, 0xA3, 0xA5, 0x6B, 0x33, 0xFF, 0x92, 0x4F, 0x11, 0xFF, 0x95, 0x52, + 0x12, 0xFF, 0xA1, 0x62, 0x21, 0xFF, 0xA7, 0x6A, 0x28, 0xFF, 0xAA, 0x6D, 0x29, 0xFF, 0xAC, 0x70, + 0x2A, 0xFF, 0xAE, 0x72, 0x2A, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAB, 0x71, 0x29, 0xFF, 0xA3, 0x71, 0x31, 0xFF, 0xC1, 0xB0, + 0x98, 0xFF, 0xD8, 0xD8, 0xD9, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, + 0xD8, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDB, 0xDB, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xA3, 0x96, + 0x7B, 0xFF, 0x7F, 0x62, 0x30, 0xFF, 0x99, 0x7F, 0x53, 0xFF, 0xDF, 0xDB, 0xD5, 0xFF, 0xDC, 0xDD, + 0xDE, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xE0, 0xE1, 0xE1, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, + 0xE1, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xDD, 0xDC, 0xD9, 0xFF, 0xA2, 0x97, 0x7E, 0xFF, 0x82, 0x70, + 0x48, 0xFF, 0xB9, 0xB0, 0x9E, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xDA, 0xD8, 0xD6, 0xFF, 0xAA, 0x9C, + 0x81, 0xFF, 0x85, 0x64, 0x2F, 0xFF, 0x90, 0x64, 0x25, 0xFF, 0xA2, 0x6E, 0x2A, 0xFF, 0xAB, 0x72, + 0x2A, 0xFF, 0xAF, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, + 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAF, 0x73, 0x2B, 0xFF, 0xAA, 0x6B, + 0x20, 0xFF, 0xA3, 0x61, 0x14, 0xFF, 0xAC, 0x71, 0x2E, 0xFF, 0xC9, 0xA0, 0x73, 0xE6, 0xE3, 0xCF, + 0xB6, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFB, + 0xF6, 0x09, 0xCC, 0xA7, 0x80, 0xAB, 0xA5, 0x6B, 0x31, 0xFF, 0x96, 0x54, 0x15, 0xFF, 0xA0, 0x61, + 0x23, 0xFF, 0xA7, 0x6B, 0x2B, 0xFF, 0xAA, 0x6E, 0x2B, 0xFF, 0xAD, 0x71, 0x2C, 0xFF, 0xAF, 0x74, + 0x2D, 0xFF, 0xB1, 0x76, 0x2D, 0xFF, 0xB3, 0x77, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB2, 0x78, 0x2E, 0xFF, 0xAC, 0x73, 0x2B, 0xFF, 0xA7, 0x7A, + 0x3E, 0xFF, 0xC8, 0xBC, 0xAD, 0xFF, 0xD6, 0xD7, 0xD8, 0xFF, 0xD7, 0xD6, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xB6, 0xAF, + 0x9E, 0xFF, 0x8B, 0x78, 0x50, 0xFF, 0x98, 0x83, 0x5B, 0xFF, 0xD5, 0xCD, 0xBF, 0xFF, 0xE1, 0xDF, + 0xDB, 0xFF, 0xD9, 0xD6, 0xCE, 0xFF, 0xDA, 0xD7, 0xD0, 0xFF, 0xE3, 0xE2, 0xE0, 0xFF, 0xE6, 0xE6, + 0xE7, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE1, 0xE1, 0xE0, 0xFF, 0xB5, 0xAD, + 0x9A, 0xFF, 0x89, 0x77, 0x52, 0xFF, 0xB0, 0xA5, 0x8F, 0xFF, 0xDD, 0xDC, 0xDB, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xBC, 0xB3, 0xA2, 0xFF, 0x8C, 0x72, 0x43, 0xFF, 0x8C, 0x64, 0x27, 0xFF, 0xA1, 0x6F, + 0x2C, 0xFF, 0xAC, 0x75, 0x2D, 0xFF, 0xB1, 0x77, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, + 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB3, 0x78, 0x2E, 0xFF, 0xB2, 0x77, 0x2E, 0xFF, 0xB1, 0x75, + 0x2D, 0xFF, 0xAB, 0x6C, 0x23, 0xFF, 0xAE, 0x73, 0x2E, 0xFF, 0xC9, 0xA0, 0x71, 0xEB, 0xE4, 0xCF, + 0xB6, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFA, + 0xF5, 0x09, 0xCD, 0xA8, 0x80, 0xAC, 0xA9, 0x70, 0x35, 0xFF, 0xA1, 0x63, 0x27, 0xFF, 0xA6, 0x6A, + 0x2D, 0xFF, 0xAA, 0x6F, 0x2E, 0xFF, 0xAE, 0x72, 0x2F, 0xFF, 0xB1, 0x75, 0x30, 0xFF, 0xB3, 0x78, + 0x30, 0xFF, 0xB4, 0x7A, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xAF, 0x7A, + 0x34, 0xFF, 0xB3, 0x91, 0x61, 0xFF, 0xD1, 0xCC, 0xC4, 0xFF, 0xD7, 0xD7, 0xD8, 0xFF, 0xD6, 0xD6, + 0xD6, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xD6, 0xD6, 0xD6, 0xFF, 0xDA, 0xDA, + 0xD9, 0xFF, 0xD6, 0xD4, 0xCF, 0xFF, 0xC8, 0xBF, 0xAF, 0xFF, 0x9D, 0x8A, 0x64, 0xFF, 0xAE, 0x9C, + 0x7B, 0xFF, 0xBB, 0xAD, 0x93, 0xFF, 0xB1, 0xA3, 0x88, 0xFF, 0xB4, 0xA6, 0x8B, 0xFF, 0xBB, 0xAF, + 0x97, 0xFF, 0xD8, 0xD4, 0xCC, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE2, 0xE2, + 0xE3, 0xFF, 0xC3, 0xBE, 0xB1, 0xFF, 0x90, 0x81, 0x5D, 0xFF, 0xA9, 0x9D, 0x82, 0xFF, 0xDA, 0xD8, + 0xD6, 0xFF, 0xE0, 0xE1, 0xE3, 0xFF, 0xCD, 0xC9, 0xBE, 0xFF, 0x99, 0x84, 0x5D, 0xFF, 0x8C, 0x67, + 0x2C, 0xFF, 0xA0, 0x71, 0x2F, 0xFF, 0xAE, 0x78, 0x31, 0xFF, 0xB4, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB5, 0x7B, 0x31, 0xFF, 0xB4, 0x79, + 0x31, 0xFF, 0xB3, 0x78, 0x31, 0xFF, 0xB5, 0x7E, 0x3C, 0xFF, 0xCB, 0xA2, 0x72, 0xED, 0xE5, 0xD0, + 0xB6, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFD, 0x08, 0xD0, 0xAB, 0x83, 0xA6, 0xB3, 0x7D, 0x47, 0xFF, 0xA9, 0x6E, 0x33, 0xFF, 0xAA, 0x6E, + 0x30, 0xFF, 0xAE, 0x73, 0x32, 0xFF, 0xB1, 0x77, 0x33, 0xFF, 0xB4, 0x7A, 0x34, 0xFF, 0xB6, 0x7C, + 0x34, 0xFF, 0xB7, 0x7E, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xBD, 0x86, 0x40, 0xFF, 0xC0, 0x8E, + 0x4E, 0xFF, 0xB9, 0x8B, 0x4E, 0xFF, 0xBE, 0xA2, 0x7C, 0xFF, 0xD7, 0xD4, 0xD0, 0xFF, 0xD8, 0xD8, + 0xD9, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD8, 0xD8, + 0xD8, 0xFF, 0xD8, 0xD8, 0xD9, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xB6, 0xAB, 0x91, 0xFF, 0xA7, 0x95, + 0x71, 0xFF, 0xE5, 0xE2, 0xDC, 0xFF, 0xE2, 0xE1, 0xDD, 0xFF, 0xA4, 0x94, 0x71, 0xFF, 0x85, 0x6F, + 0x41, 0xFF, 0xB6, 0xAC, 0x96, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xCF, 0xCC, 0xC3, 0xFF, 0x9A, 0x8D, 0x6D, 0xFF, 0xA5, 0x98, + 0x7C, 0xFF, 0xD8, 0xD5, 0xD1, 0xFF, 0xE0, 0xE0, 0xE2, 0xFF, 0xD8, 0xD6, 0xD1, 0xFF, 0xA8, 0x97, + 0x76, 0xFF, 0x90, 0x6C, 0x32, 0xFF, 0xA4, 0x75, 0x32, 0xFF, 0xB3, 0x7C, 0x34, 0xFF, 0xB8, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, + 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB9, 0x7F, 0x35, 0xFF, 0xB8, 0x7F, 0x35, 0xFF, 0xB7, 0x7D, + 0x34, 0xFF, 0xB6, 0x7D, 0x36, 0xFF, 0xBD, 0x89, 0x4B, 0xFF, 0xD0, 0xAA, 0x7D, 0xE8, 0xE5, 0xD0, + 0xB6, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x06, 0xD4, 0xB1, 0x8C, 0x9A, 0xBB, 0x89, 0x55, 0xFF, 0xAD, 0x73, 0x38, 0xFF, 0xAE, 0x73, + 0x33, 0xFF, 0xB2, 0x77, 0x35, 0xFF, 0xB5, 0x7B, 0x37, 0xFF, 0xB7, 0x7D, 0x38, 0xFF, 0xB9, 0x80, + 0x38, 0xFF, 0xBA, 0x81, 0x38, 0xFF, 0xBC, 0x82, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x82, + 0x38, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xC0, 0x8B, 0x46, 0xFF, 0xC5, 0x94, 0x55, 0xFF, 0xC5, 0x95, + 0x57, 0xFF, 0xC3, 0x93, 0x56, 0xFF, 0xBB, 0x90, 0x55, 0xFF, 0xC7, 0xB1, 0x92, 0xFF, 0xDC, 0xDB, + 0xD9, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDC, 0xDC, + 0xDC, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDF, 0xDF, 0xDE, 0xFF, 0xBD, 0xB5, 0xA2, 0xFF, 0xB6, 0xAB, + 0x91, 0xFF, 0xB6, 0xAA, 0x90, 0xFF, 0xE3, 0xE1, 0xDE, 0xFF, 0xD0, 0xCB, 0xBF, 0xFF, 0xB6, 0xAD, + 0x98, 0xFF, 0xD2, 0xD0, 0xC9, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xD8, 0xD6, 0xD2, 0xFF, 0xA6, 0x9C, + 0x81, 0xFF, 0xA2, 0x96, 0x78, 0xFF, 0xD6, 0xD3, 0xCC, 0xFF, 0xE1, 0xE1, 0xE3, 0xFF, 0xDF, 0xDE, + 0xDB, 0xFF, 0xB7, 0xA8, 0x8A, 0xFF, 0x9D, 0x75, 0x39, 0xFF, 0xB0, 0x7C, 0x37, 0xFF, 0xBA, 0x82, + 0x38, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x82, 0x39, 0xFF, 0xBA, 0x81, + 0x38, 0xFF, 0xB9, 0x81, 0x3A, 0xFF, 0xC1, 0x8F, 0x53, 0xFF, 0xD5, 0xB1, 0x87, 0xDF, 0xE6, 0xD1, + 0xB7, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x02, 0xD5, 0xB3, 0x8C, 0x87, 0xC0, 0x91, 0x5D, 0xFF, 0xB1, 0x79, 0x3D, 0xFF, 0xB1, 0x77, + 0x37, 0xFF, 0xB5, 0x7B, 0x39, 0xFF, 0xB8, 0x7F, 0x3A, 0xFF, 0xBA, 0x81, 0x3B, 0xFF, 0xBC, 0x83, + 0x3B, 0xFF, 0xBD, 0x85, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, + 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, + 0x3C, 0xFF, 0xC3, 0x8F, 0x4A, 0xFF, 0xCA, 0x99, 0x5B, 0xFF, 0xCA, 0x9A, 0x5D, 0xFF, 0xCA, 0x9A, + 0x5C, 0xFF, 0xCA, 0x9A, 0x5C, 0xFF, 0xC5, 0x98, 0x5B, 0xFF, 0xBE, 0x96, 0x5E, 0xFF, 0xCF, 0xBD, + 0xA5, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE0, 0xDF, 0xDD, 0xFF, 0xC2, 0xBC, 0xAA, 0xFF, 0xE5, 0xE4, + 0xE1, 0xFF, 0xBE, 0xB6, 0xA1, 0xFF, 0xB6, 0xAB, 0x92, 0xFF, 0xE1, 0xE0, 0xDE, 0xFF, 0xE0, 0xE0, + 0xE2, 0xFF, 0xDC, 0xDC, 0xDD, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, + 0xDD, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE0, 0xDF, + 0xDD, 0xFF, 0xB5, 0xAE, 0x99, 0xFF, 0xA2, 0x97, 0x79, 0xFF, 0xD4, 0xD0, 0xC7, 0xFF, 0xE2, 0xE2, + 0xE4, 0xFF, 0xE0, 0xDD, 0xD8, 0xFF, 0xAA, 0x8B, 0x58, 0xFF, 0xAE, 0x7D, 0x38, 0xFF, 0xBC, 0x85, + 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, + 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBE, 0x86, 0x3C, 0xFF, 0xBD, 0x84, + 0x3B, 0xFF, 0xBD, 0x85, 0x3E, 0xFF, 0xC5, 0x96, 0x5B, 0xFF, 0xD7, 0xB6, 0x8C, 0xD0, 0xE6, 0xD1, + 0xB4, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xD8, 0xB6, 0x90, 0x6C, 0xC7, 0x99, 0x67, 0xFF, 0xB6, 0x7E, 0x43, 0xFF, 0xB4, 0x7B, + 0x3B, 0xFF, 0xB8, 0x7E, 0x3C, 0xFF, 0xBB, 0x82, 0x3D, 0xFF, 0xBD, 0x85, 0x3E, 0xFF, 0xBF, 0x87, + 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, + 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC4, 0x90, + 0x49, 0xFF, 0xCC, 0x9D, 0x60, 0xFF, 0xCE, 0x9F, 0x63, 0xFF, 0xCE, 0x9F, 0x63, 0xFF, 0xCE, 0x9F, + 0x63, 0xFF, 0xCD, 0x9F, 0x63, 0xFF, 0xCC, 0x9F, 0x63, 0xFF, 0xC9, 0x9C, 0x61, 0xFF, 0xC1, 0x9D, + 0x68, 0xFF, 0xD6, 0xCA, 0xB7, 0xFF, 0xE4, 0xE5, 0xE5, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xE1, 0xE0, 0xDD, 0xFF, 0xC0, 0xB8, 0xA5, 0xFF, 0xE4, 0xE2, + 0xDF, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xBB, 0xB2, 0x9B, 0xFF, 0xBA, 0xAF, 0x97, 0xFF, 0xDF, 0xDD, + 0xDB, 0xFF, 0xDE, 0xDD, 0xDC, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xDD, 0xDD, + 0xDD, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xC5, 0xBF, 0xB1, 0xFF, 0xA7, 0x9D, 0x81, 0xFF, 0xD5, 0xD1, + 0xC8, 0xFF, 0xE7, 0xE5, 0xE2, 0xFF, 0xB4, 0x95, 0x65, 0xFF, 0xB2, 0x81, 0x3B, 0xFF, 0xBF, 0x89, + 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, + 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC2, 0x8A, 0x40, 0xFF, 0xC1, 0x89, 0x40, 0xFF, 0xC0, 0x88, + 0x3F, 0xFF, 0xC0, 0x8A, 0x44, 0xFF, 0xCB, 0x9D, 0x64, 0xFF, 0xDC, 0xBC, 0x95, 0xBC, 0xEF, 0xE2, + 0xD0, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xDC, 0xBD, 0x97, 0x4E, 0xCC, 0xA1, 0x70, 0xF3, 0xBB, 0x86, 0x4B, 0xFF, 0xB8, 0x7F, + 0x3F, 0xFF, 0xBB, 0x82, 0x40, 0xFF, 0xBE, 0x86, 0x41, 0xFF, 0xC0, 0x89, 0x42, 0xFF, 0xC2, 0x8A, + 0x42, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC5, 0x8F, 0x47, 0xFF, 0xCD, 0x9E, + 0x60, 0xFF, 0xD0, 0xA4, 0x69, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, + 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xCF, 0xA3, 0x68, 0xFF, 0xCB, 0xA0, + 0x66, 0xFF, 0xC5, 0xA5, 0x75, 0xFF, 0xDD, 0xD5, 0xC8, 0xFF, 0xE7, 0xE8, 0xE8, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE4, 0xFF, 0xBB, 0xB1, 0x99, 0xFF, 0xB6, 0xA6, + 0x86, 0xFF, 0xD1, 0xCA, 0xB9, 0xFF, 0xE4, 0xE3, 0xE1, 0xFF, 0xBC, 0xAF, 0x96, 0xFF, 0xB9, 0xA9, + 0x8A, 0xFF, 0xBE, 0xB0, 0x94, 0xFF, 0xDA, 0xD8, 0xD2, 0xFF, 0xDF, 0xE0, 0xE0, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE5, 0xE5, + 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xD4, 0xD0, 0xC5, 0xFF, 0xB8, 0xAE, + 0x95, 0xFF, 0xD9, 0xCE, 0xBB, 0xFF, 0xB5, 0x90, 0x56, 0xFF, 0xBA, 0x88, 0x41, 0xFF, 0xC3, 0x8D, + 0x44, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8D, 0x43, 0xFF, 0xC3, 0x8C, + 0x42, 0xFF, 0xC4, 0x8F, 0x4A, 0xFF, 0xD0, 0xA5, 0x6F, 0xFF, 0xDF, 0xC0, 0x9B, 0x9E, 0xFF, 0xFF, + 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE6, 0xCF, 0xB1, 0x30, 0xD1, 0xA9, 0x79, 0xE2, 0xC1, 0x8E, 0x55, 0xFF, 0xBC, 0x83, + 0x44, 0xFF, 0xBE, 0x86, 0x44, 0xFF, 0xC1, 0x8A, 0x45, 0xFF, 0xC3, 0x8C, 0x46, 0xFF, 0xC5, 0x8E, + 0x46, 0xFF, 0xC7, 0x90, 0x47, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x90, 0x47, 0xFF, 0xCC, 0x9B, 0x59, 0xFF, 0xD3, 0xA8, + 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, + 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, + 0x6E, 0xFF, 0xCC, 0xA4, 0x6B, 0xFF, 0xCC, 0xAF, 0x84, 0xFF, 0xE3, 0xDE, 0xD5, 0xFF, 0xEA, 0xEA, + 0xEB, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xE8, 0xE7, 0xE6, 0xFF, 0xB0, 0xA6, 0x8B, 0xFF, 0x9A, 0x89, + 0x5F, 0xFF, 0xB5, 0xAA, 0x8E, 0xFF, 0xE7, 0xE7, 0xE6, 0xFF, 0xC4, 0xBC, 0xAA, 0xFF, 0xA2, 0x8E, + 0x64, 0xFF, 0xA8, 0x94, 0x6C, 0xFF, 0xD4, 0xD0, 0xC5, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE1, 0xE1, + 0xE1, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xE3, 0xDF, + 0xD7, 0xFF, 0xBD, 0xA8, 0x81, 0xFF, 0xB3, 0x89, 0x48, 0xFF, 0xBF, 0x8D, 0x46, 0xFF, 0xC5, 0x90, + 0x47, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC5, 0x90, + 0x47, 0xFF, 0xC9, 0x96, 0x53, 0xFF, 0xD5, 0xAE, 0x7B, 0xFE, 0xE2, 0xC5, 0xA1, 0x78, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xEE, 0xDE, 0xC7, 0x12, 0xD7, 0xB1, 0x82, 0xC4, 0xC9, 0x98, 0x60, 0xFF, 0xC1, 0x89, + 0x4A, 0xFF, 0xC2, 0x8A, 0x48, 0xFF, 0xC4, 0x8D, 0x49, 0xFF, 0xC7, 0x90, 0x4A, 0xFF, 0xC9, 0x92, + 0x4A, 0xFF, 0xCA, 0x94, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, + 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCC, 0x97, 0x4F, 0xFF, 0xD4, 0xA8, 0x6C, 0xFF, 0xD6, 0xAD, + 0x75, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, + 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, 0x74, 0xFF, 0xD6, 0xAD, + 0x74, 0xFF, 0xD5, 0xAC, 0x74, 0xFF, 0xCF, 0xA8, 0x71, 0xFF, 0xD1, 0xB8, 0x93, 0xFF, 0xE7, 0xE4, + 0xDF, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xD9, 0xD7, 0xCF, 0xFF, 0xC3, 0xBD, + 0xAC, 0xFF, 0xDA, 0xD8, 0xD0, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xD7, 0xD4, 0xCD, 0xFF, 0xBF, 0xB8, + 0xA4, 0xFF, 0xAC, 0xA1, 0x84, 0xFF, 0xCD, 0xC9, 0xBC, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEC, 0xED, 0xED, 0xFF, 0xDA, 0xD6, + 0xC9, 0xFF, 0xB9, 0xA6, 0x80, 0xFF, 0xB6, 0x92, 0x59, 0xFF, 0xBB, 0x8D, 0x48, 0xFF, 0xC3, 0x92, + 0x4B, 0xFF, 0xC8, 0x94, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, + 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCB, 0x95, 0x4B, 0xFF, 0xCA, 0x94, + 0x4C, 0xFF, 0xCF, 0x9E, 0x5E, 0xFF, 0xDB, 0xB6, 0x86, 0xF1, 0xD7, 0xBF, 0xA0, 0x4D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xDE, 0xBB, 0x91, 0x92, 0xD0, 0xA2, 0x6C, 0xFF, 0xC5, 0x90, + 0x52, 0xFF, 0xC5, 0x8E, 0x4B, 0xFF, 0xC8, 0x91, 0x4C, 0xFF, 0xCB, 0x94, 0x4E, 0xFF, 0xCC, 0x96, + 0x4E, 0xFF, 0xCE, 0x98, 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCF, 0x99, + 0x4F, 0xFF, 0xCF, 0x99, 0x4E, 0xFF, 0xD3, 0xA2, 0x5E, 0xFF, 0xD9, 0xB1, 0x79, 0xFF, 0xDA, 0xB1, + 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, + 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xDA, 0xB1, + 0x7A, 0xFF, 0xDA, 0xB1, 0x7A, 0xFF, 0xD8, 0xB0, 0x79, 0xFF, 0xD1, 0xAD, 0x77, 0xFF, 0xD6, 0xC0, + 0xA0, 0xFF, 0xEA, 0xE8, 0xE5, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, + 0xF0, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xE8, 0xE9, + 0xE9, 0xFF, 0xDF, 0xDE, 0xDC, 0xFF, 0xDF, 0xDF, 0xDC, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xF2, 0xF2, 0xF1, 0xFF, 0xD7, 0xD3, + 0xC4, 0xFF, 0xB8, 0xAD, 0x8F, 0xFF, 0xC7, 0xB4, 0x91, 0xFF, 0xB3, 0x91, 0x56, 0xFF, 0xB8, 0x8D, + 0x4A, 0xFF, 0xC3, 0x94, 0x4E, 0xFF, 0xCB, 0x98, 0x4F, 0xFF, 0xCE, 0x99, 0x4F, 0xFF, 0xCF, 0x99, + 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCF, 0x99, 0x4F, 0xFF, 0xCE, 0x98, 0x4F, 0xFF, 0xCE, 0x99, + 0x52, 0xFF, 0xD5, 0xA8, 0x6B, 0xFF, 0xE0, 0xBF, 0x92, 0xD7, 0xCE, 0xBA, 0xA0, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xC4, 0x9E, 0x55, 0xD7, 0xAD, 0x7A, 0xF8, 0xCC, 0x99, + 0x5C, 0xFF, 0xC9, 0x92, 0x4F, 0xFF, 0xCC, 0x95, 0x50, 0xFF, 0xCD, 0x98, 0x51, 0xFF, 0xCF, 0x9A, + 0x51, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD1, 0x9D, 0x52, 0xFF, 0xD2, 0x9D, 0x52, 0xFF, 0xD1, 0x9D, + 0x52, 0xFF, 0xD2, 0x9D, 0x53, 0xFF, 0xD9, 0xAD, 0x6E, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB6, + 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, + 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, + 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDD, 0xB6, 0x7F, 0xFF, 0xDB, 0xB5, 0x7F, 0xFF, 0xD4, 0xB1, + 0x7D, 0xFF, 0xDA, 0xC9, 0xAC, 0xFF, 0xED, 0xEC, 0xEA, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xEF, + 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE9, 0xE9, 0xE5, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xDE, 0xDA, 0xCF, 0xFF, 0xC9, 0xC1, 0xAA, 0xFF, 0xD0, 0xC3, 0xA8, 0xFF, 0xB5, 0x98, + 0x63, 0xFF, 0xB8, 0x90, 0x4E, 0xFF, 0xC9, 0x99, 0x52, 0xFF, 0xD0, 0x9C, 0x52, 0xFF, 0xD1, 0x9D, + 0x52, 0xFF, 0xD2, 0x9D, 0x52, 0xFF, 0xD1, 0x9D, 0x52, 0xFF, 0xD1, 0x9C, 0x53, 0xFF, 0xD2, 0xA0, + 0x5A, 0xFF, 0xDC, 0xB3, 0x7B, 0xFF, 0xDF, 0xC2, 0x9A, 0xA4, 0xC7, 0xBD, 0xAF, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xD6, 0xB7, 0x22, 0xDD, 0xB7, 0x86, 0xD4, 0xD3, 0xA3, + 0x69, 0xFF, 0xCD, 0x97, 0x55, 0xFF, 0xCF, 0x98, 0x53, 0xFF, 0xD1, 0x9B, 0x54, 0xFF, 0xD2, 0x9D, + 0x55, 0xFF, 0xD3, 0x9F, 0x56, 0xFF, 0xD4, 0xA0, 0x56, 0xFF, 0xD5, 0xA1, 0x56, 0xFF, 0xD4, 0xA1, + 0x56, 0xFF, 0xD6, 0xA3, 0x5A, 0xFF, 0xDE, 0xB6, 0x7C, 0xFF, 0xE0, 0xBB, 0x85, 0xFF, 0xDF, 0xBB, + 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, + 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, + 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xE0, 0xBB, 0x84, 0xFF, 0xDF, 0xBB, 0x84, 0xFF, 0xDE, 0xB9, + 0x84, 0xFF, 0xD7, 0xB6, 0x84, 0xFF, 0xDE, 0xD0, 0xB6, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEE, 0xEE, + 0xED, 0xFF, 0xE7, 0xE6, 0xE2, 0xFF, 0xEA, 0xEA, 0xE6, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xE6, 0xE4, 0xDC, 0xFF, 0xD0, 0xCB, 0xB9, 0xFF, 0xDC, 0xD4, + 0xC0, 0xFF, 0xBE, 0xA1, 0x6E, 0xFF, 0xC4, 0x98, 0x53, 0xFF, 0xD1, 0x9F, 0x56, 0xFF, 0xD4, 0xA1, + 0x56, 0xFF, 0xD5, 0xA1, 0x56, 0xFF, 0xD4, 0xA1, 0x56, 0xFF, 0xD4, 0xA0, 0x57, 0xFF, 0xD7, 0xA8, + 0x66, 0xFF, 0xE1, 0xBC, 0x8A, 0xFA, 0xE0, 0xC5, 0xA2, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xE2, 0xC0, 0x93, 0x95, 0xD9, 0xAE, + 0x77, 0xFF, 0xD2, 0x9F, 0x5F, 0xFF, 0xD1, 0x9C, 0x57, 0xFF, 0xD4, 0x9E, 0x58, 0xFF, 0xD5, 0xA1, + 0x59, 0xFF, 0xD6, 0xA3, 0x5A, 0xFF, 0xD7, 0xA4, 0x5A, 0xFF, 0xD8, 0xA4, 0x5A, 0xFF, 0xD7, 0xA4, + 0x59, 0xFF, 0xDA, 0xA9, 0x63, 0xFF, 0xE2, 0xBC, 0x86, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, + 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, + 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, + 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE3, 0xBF, 0x8A, 0xFF, 0xE2, 0xBF, + 0x8A, 0xFF, 0xE0, 0xBD, 0x89, 0xFF, 0xD9, 0xBB, 0x8B, 0xFF, 0xE2, 0xD5, 0xBF, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, + 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xEF, 0xEE, 0xEE, 0xFF, 0xE7, 0xE6, + 0xE2, 0xFF, 0xEA, 0xEA, 0xE7, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xF1, 0xF1, 0xF0, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xE9, 0xE8, 0xE2, 0xFF, 0xE5, 0xE2, + 0xD7, 0xFF, 0xD1, 0xBC, 0x97, 0xFF, 0xC4, 0x9A, 0x55, 0xFF, 0xD4, 0xA3, 0x5A, 0xFF, 0xD7, 0xA5, + 0x5A, 0xFF, 0xD8, 0xA5, 0x5A, 0xFF, 0xD7, 0xA4, 0x5A, 0xFF, 0xD7, 0xA6, 0x5E, 0xFF, 0xDD, 0xB3, + 0x76, 0xFF, 0xE6, 0xC5, 0x97, 0xD7, 0xD8, 0xC5, 0xAB, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xCC, 0xA3, 0x44, 0xE0, 0xB8, + 0x85, 0xEE, 0xD8, 0xA8, 0x6C, 0xFF, 0xD5, 0xA0, 0x5D, 0xFF, 0xD6, 0xA2, 0x5C, 0xFF, 0xD8, 0xA4, + 0x5D, 0xFF, 0xD9, 0xA6, 0x5E, 0xFF, 0xDA, 0xA7, 0x5E, 0xFF, 0xDB, 0xA8, 0x5E, 0xFF, 0xDB, 0xA8, + 0x5D, 0xFF, 0xDD, 0xAE, 0x6A, 0xFF, 0xE5, 0xC1, 0x8D, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, 0x90, 0xFF, 0xE6, 0xC2, + 0x90, 0xFF, 0xE5, 0xC2, 0x90, 0xFF, 0xE2, 0xC1, 0x8F, 0xFF, 0xDC, 0xBF, 0x92, 0xFF, 0xE5, 0xDA, + 0xC4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xEA, 0xEA, 0xE7, 0xFF, 0xEE, 0xEE, + 0xEB, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xEF, 0xEF, + 0xEC, 0xFF, 0xCF, 0xCB, 0xB8, 0xFF, 0xEB, 0xEA, 0xE4, 0xFF, 0xF2, 0xF2, 0xF4, 0xFF, 0xF1, 0xF0, + 0xED, 0xFF, 0xD1, 0xB8, 0x8C, 0xFF, 0xCC, 0xA0, 0x5A, 0xFF, 0xD8, 0xA7, 0x5E, 0xFF, 0xDB, 0xA8, + 0x5E, 0xFF, 0xDB, 0xA8, 0x5E, 0xFF, 0xDB, 0xA8, 0x5F, 0xFF, 0xDC, 0xAD, 0x69, 0xFF, 0xE4, 0xBE, + 0x88, 0xFF, 0xE8, 0xCC, 0xA2, 0x90, 0xB9, 0xC2, 0xCF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xD4, 0xB9, 0x0E, 0xE3, 0xC0, + 0x91, 0xAF, 0xDF, 0xB4, 0x7C, 0xFF, 0xD9, 0xA7, 0x66, 0xFF, 0xD9, 0xA5, 0x60, 0xFF, 0xDA, 0xA8, + 0x60, 0xFF, 0xDB, 0xA9, 0x61, 0xFF, 0xDC, 0xAB, 0x62, 0xFF, 0xDD, 0xAC, 0x62, 0xFF, 0xDD, 0xAB, + 0x61, 0xFF, 0xE0, 0xB3, 0x6F, 0xFF, 0xE8, 0xC7, 0x93, 0xFF, 0xE9, 0xC8, 0x95, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, 0x94, 0xFF, 0xE9, 0xC8, + 0x94, 0xFF, 0xE8, 0xC8, 0x94, 0xFF, 0xE8, 0xC8, 0x94, 0xFF, 0xE5, 0xC4, 0x93, 0xFF, 0xDF, 0xC4, + 0x96, 0xFF, 0xE7, 0xDC, 0xC8, 0xFF, 0xF5, 0xF4, 0xF4, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF5, 0xF5, + 0xF5, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF1, 0xF0, 0xEE, 0xFF, 0xF2, 0xF2, 0xF1, 0xFF, 0xF4, 0xF4, + 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xD7, 0xD5, + 0xC7, 0xFF, 0xCF, 0xCC, 0xB9, 0xFF, 0xF4, 0xF4, 0xF3, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xDC, 0xCD, + 0xAF, 0xFF, 0xCB, 0xA4, 0x64, 0xFF, 0xD7, 0xA9, 0x61, 0xFF, 0xDD, 0xAC, 0x62, 0xFF, 0xDE, 0xAC, + 0x62, 0xFF, 0xDE, 0xAC, 0x62, 0xFF, 0xDE, 0xAD, 0x65, 0xFF, 0xE2, 0xB8, 0x7A, 0xFF, 0xE8, 0xC8, + 0x98, 0xE8, 0xE4, 0xCE, 0xAB, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, 0xC3, + 0x9A, 0x4F, 0xE5, 0xBE, 0x89, 0xF0, 0xDE, 0xB0, 0x73, 0xFF, 0xDC, 0xA9, 0x65, 0xFF, 0xDD, 0xAA, + 0x63, 0xFF, 0xDE, 0xAC, 0x64, 0xFF, 0xDF, 0xAE, 0x65, 0xFF, 0xDF, 0xAE, 0x65, 0xFF, 0xE0, 0xAF, + 0x64, 0xFF, 0xE2, 0xB6, 0x71, 0xFF, 0xEA, 0xCA, 0x96, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEB, 0xCB, + 0x99, 0xFF, 0xEB, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xE7, 0xC9, + 0x98, 0xFF, 0xE2, 0xC8, 0x9B, 0xFF, 0xE9, 0xDD, 0xC8, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xF7, 0xF7, + 0xF8, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF3, 0xF2, + 0xF0, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xF7, 0xF7, 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF1, 0xF0, + 0xED, 0xFF, 0xF5, 0xF5, 0xF3, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xE4, 0xD7, 0xBE, 0xFF, 0xCB, 0xA7, + 0x68, 0xFF, 0xD7, 0xAA, 0x63, 0xFF, 0xDE, 0xAE, 0x65, 0xFF, 0xE0, 0xAF, 0x65, 0xFF, 0xE0, 0xAF, + 0x65, 0xFF, 0xE0, 0xAF, 0x67, 0xFF, 0xE2, 0xB4, 0x71, 0xFF, 0xE8, 0xC3, 0x8C, 0xFF, 0xEA, 0xCE, + 0xA3, 0x9B, 0xCB, 0xC7, 0xBD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xCA, + 0xAD, 0x0D, 0xE8, 0xC5, 0x95, 0xA7, 0xE5, 0xBB, 0x84, 0xFF, 0xE0, 0xAF, 0x6F, 0xFF, 0xDF, 0xAD, + 0x67, 0xFF, 0xE0, 0xAF, 0x67, 0xFF, 0xE1, 0xB1, 0x68, 0xFF, 0xE1, 0xB2, 0x69, 0xFF, 0xE2, 0xB2, + 0x68, 0xFF, 0xE4, 0xB7, 0x72, 0xFF, 0xEB, 0xCC, 0x99, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, 0x9E, 0xFF, 0xEC, 0xCE, + 0x9E, 0xFF, 0xEA, 0xCD, 0x9D, 0xFF, 0xE4, 0xCB, 0x9E, 0xFF, 0xE9, 0xDC, 0xC3, 0xFF, 0xF6, 0xF4, + 0xF1, 0xFF, 0xF9, 0xF9, 0xFA, 0xFF, 0xF9, 0xF9, 0xFA, 0xFF, 0xF2, 0xEF, 0xE8, 0xFF, 0xE0, 0xD2, + 0xB6, 0xFF, 0xE6, 0xDA, 0xC2, 0xFF, 0xF7, 0xF6, 0xF3, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xF8, 0xF8, + 0xF8, 0xFF, 0xF9, 0xF8, 0xF8, 0xFF, 0xEF, 0xEF, 0xE9, 0xFF, 0xF5, 0xF5, 0xF3, 0xFF, 0xF9, 0xF9, + 0xFA, 0xFF, 0xFA, 0xFA, 0xFA, 0xFF, 0xEE, 0xE8, 0xD9, 0xFF, 0xD5, 0xB8, 0x85, 0xFF, 0xD8, 0xAC, + 0x66, 0xFF, 0xE0, 0xB2, 0x69, 0xFF, 0xE2, 0xB3, 0x69, 0xFF, 0xE2, 0xB3, 0x69, 0xFF, 0xE2, 0xB3, + 0x69, 0xFF, 0xE3, 0xB5, 0x6E, 0xFF, 0xE7, 0xBF, 0x82, 0xFF, 0xED, 0xCD, 0x9C, 0xE3, 0xE9, 0xD2, + 0xAE, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE6, 0xCB, 0xA1, 0x3C, 0xEA, 0xC4, 0x91, 0xE3, 0xE5, 0xBA, 0x7F, 0xFF, 0xE2, 0xB2, + 0x6E, 0xFF, 0xE2, 0xB1, 0x6B, 0xFF, 0xE3, 0xB3, 0x6B, 0xFF, 0xE4, 0xB5, 0x6C, 0xFF, 0xE4, 0xB5, + 0x6C, 0xFF, 0xE6, 0xB8, 0x71, 0xFF, 0xED, 0xCD, 0x98, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, 0xA3, 0xFF, 0xEF, 0xD2, + 0xA3, 0xFF, 0xEE, 0xD2, 0xA3, 0xFF, 0xEC, 0xD0, 0xA2, 0xFF, 0xE8, 0xCE, 0xA1, 0xFF, 0xEA, 0xD8, + 0xB7, 0xFF, 0xF3, 0xEC, 0xDF, 0xFF, 0xF2, 0xEB, 0xDE, 0xFF, 0xE5, 0xD2, 0xAF, 0xFF, 0xE3, 0xCB, + 0x9F, 0xFF, 0xE4, 0xCC, 0xA1, 0xFF, 0xEB, 0xDC, 0xBF, 0xFF, 0xF8, 0xF6, 0xF1, 0xFF, 0xFB, 0xFB, + 0xFC, 0xFF, 0xF0, 0xEF, 0xE9, 0xFF, 0xCF, 0xCB, 0xB6, 0xFF, 0xF1, 0xF0, 0xEB, 0xFF, 0xFB, 0xFB, + 0xFC, 0xFF, 0xF1, 0xEB, 0xDE, 0xFF, 0xE1, 0xCD, 0xA7, 0xFF, 0xDF, 0xB9, 0x7B, 0xFF, 0xE2, 0xB4, + 0x6C, 0xFF, 0xE4, 0xB6, 0x6D, 0xFF, 0xE5, 0xB6, 0x6D, 0xFF, 0xE5, 0xB6, 0x6D, 0xFF, 0xE5, 0xB7, + 0x6F, 0xFF, 0xE7, 0xBD, 0x7C, 0xFF, 0xEC, 0xCB, 0x95, 0xFD, 0xED, 0xD2, 0xA7, 0x84, 0xD3, 0xD3, + 0xD4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC9, 0xD6, 0xE3, 0x02, 0xEB, 0xCC, 0x9C, 0x7C, 0xEA, 0xC4, 0x8E, 0xFC, 0xE6, 0xBA, + 0x7C, 0xFF, 0xE5, 0xB5, 0x70, 0xFF, 0xE5, 0xB6, 0x6F, 0xFF, 0xE6, 0xB7, 0x70, 0xFF, 0xE6, 0xB8, + 0x70, 0xFF, 0xE7, 0xB9, 0x70, 0xFF, 0xED, 0xCA, 0x91, 0xFF, 0xF1, 0xD5, 0xA8, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF1, 0xD5, + 0xA7, 0xFF, 0xF1, 0xD5, 0xA7, 0xFF, 0xF0, 0xD5, 0xA7, 0xFF, 0xEF, 0xD4, 0xA7, 0xFF, 0xED, 0xD2, + 0xA5, 0xFF, 0xEB, 0xD3, 0xA9, 0xFF, 0xEB, 0xD3, 0xA9, 0xFF, 0xEC, 0xD2, 0xA5, 0xFF, 0xEF, 0xD4, + 0xA7, 0xFF, 0xEE, 0xD4, 0xA7, 0xFF, 0xEA, 0xD1, 0xA5, 0xFF, 0xEB, 0xDB, 0xBB, 0xFF, 0xF8, 0xF4, + 0xED, 0xFF, 0xF8, 0xF8, 0xF6, 0xFF, 0xF1, 0xF0, 0xE9, 0xFF, 0xFC, 0xFC, 0xFB, 0xFF, 0xF4, 0xEF, + 0xE3, 0xFF, 0xE4, 0xD2, 0xAF, 0xFF, 0xE7, 0xCD, 0x9F, 0xFF, 0xE6, 0xBC, 0x78, 0xFF, 0xE6, 0xB9, + 0x6F, 0xFF, 0xE7, 0xB9, 0x70, 0xFF, 0xE7, 0xB9, 0x70, 0xFF, 0xE7, 0xB9, 0x71, 0xFF, 0xE8, 0xBD, + 0x79, 0xFF, 0xEC, 0xC9, 0x90, 0xFF, 0xEF, 0xD3, 0xA3, 0xC1, 0xEA, 0xD6, 0xB5, 0x1D, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xD4, 0xAF, 0x15, 0xED, 0xCC, 0x9A, 0xB3, 0xEB, 0xC5, + 0x8D, 0xFF, 0xE8, 0xBB, 0x7B, 0xFF, 0xE7, 0xB8, 0x73, 0xFF, 0xE8, 0xB9, 0x72, 0xFF, 0xE8, 0xBA, + 0x73, 0xFF, 0xE9, 0xBB, 0x72, 0xFF, 0xEC, 0xC5, 0x86, 0xFF, 0xF1, 0xD7, 0xAA, 0xFF, 0xF2, 0xD7, + 0xAC, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAB, 0xFF, 0xED, 0xD4, 0xA9, 0xFF, 0xEC, 0xDA, + 0xB8, 0xFF, 0xF7, 0xF2, 0xE8, 0xFF, 0xFE, 0xFE, 0xFF, 0xFF, 0xF6, 0xF2, 0xE9, 0xFF, 0xE7, 0xD6, + 0xB4, 0xFF, 0xEB, 0xD4, 0xAA, 0xFF, 0xED, 0xCE, 0x98, 0xFF, 0xE9, 0xBD, 0x74, 0xFF, 0xE9, 0xBC, + 0x73, 0xFF, 0xE9, 0xBC, 0x73, 0xFF, 0xE9, 0xBC, 0x74, 0xFF, 0xEA, 0xBE, 0x79, 0xFF, 0xEC, 0xC8, + 0x8C, 0xFF, 0xF0, 0xD2, 0xA0, 0xE6, 0xEE, 0xD6, 0xB0, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD2, 0xA8, 0x35, 0xEF, 0xCD, + 0x99, 0xD7, 0xED, 0xC7, 0x8D, 0xFF, 0xEA, 0xBE, 0x7D, 0xFF, 0xEA, 0xBC, 0x76, 0xFF, 0xEA, 0xBC, + 0x76, 0xFF, 0xEA, 0xBD, 0x76, 0xFF, 0xEC, 0xC0, 0x7B, 0xFF, 0xF2, 0xD5, 0xA4, 0xFF, 0xF3, 0xDA, + 0xB0, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, + 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF3, 0xDA, 0xAF, 0xFF, 0xF2, 0xDA, 0xAF, 0xFF, 0xEF, 0xD7, + 0xAE, 0xFF, 0xEE, 0xDB, 0xB8, 0xFF, 0xF6, 0xEC, 0xD9, 0xFF, 0xED, 0xDD, 0xBD, 0xFF, 0xED, 0xD6, + 0xAD, 0xFF, 0xF1, 0xD9, 0xAE, 0xFF, 0xED, 0xC9, 0x89, 0xFF, 0xEB, 0xBE, 0x75, 0xFF, 0xEB, 0xBF, + 0x77, 0xFF, 0xEB, 0xBF, 0x77, 0xFF, 0xEC, 0xC1, 0x7B, 0xFF, 0xEE, 0xC9, 0x8A, 0xFF, 0xF1, 0xD2, + 0x9E, 0xF6, 0xF0, 0xD7, 0xAD, 0x72, 0xDE, 0xDF, 0xE4, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xD3, + 0xA6, 0x50, 0xF1, 0xCF, 0x99, 0xE4, 0xEE, 0xC9, 0x8E, 0xFF, 0xEC, 0xC1, 0x7F, 0xFF, 0xEC, 0xBF, + 0x79, 0xFF, 0xEC, 0xC0, 0x79, 0xFF, 0xEC, 0xC0, 0x78, 0xFF, 0xF1, 0xCD, 0x91, 0xFF, 0xF5, 0xDC, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, + 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF5, 0xDD, 0xB3, 0xFF, 0xF4, 0xDC, + 0xB3, 0xFF, 0xF3, 0xDB, 0xB3, 0xFF, 0xF2, 0xDB, 0xB3, 0xFF, 0xF2, 0xDB, 0xB3, 0xFF, 0xF3, 0xDC, + 0xB4, 0xFF, 0xF2, 0xD5, 0xA3, 0xFF, 0xED, 0xC3, 0x7D, 0xFF, 0xED, 0xC1, 0x79, 0xFF, 0xED, 0xC1, + 0x7A, 0xFF, 0xED, 0xC3, 0x7D, 0xFF, 0xEF, 0xCA, 0x8B, 0xFF, 0xF2, 0xD3, 0x9E, 0xFC, 0xF3, 0xD8, + 0xAA, 0x92, 0xE7, 0xDA, 0xC3, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xFF, + 0xFF, 0x01, 0xF2, 0xD4, 0xA4, 0x5E, 0xF2, 0xD1, 0x9C, 0xEA, 0xF0, 0xCB, 0x90, 0xFF, 0xEE, 0xC3, + 0x81, 0xFF, 0xEE, 0xC2, 0x7D, 0xFF, 0xEE, 0xC2, 0x7C, 0xFF, 0xEF, 0xC5, 0x80, 0xFF, 0xF5, 0xD7, + 0xA7, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, + 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF6, 0xDF, 0xB8, 0xFF, 0xF6, 0xDE, + 0xB3, 0xFF, 0xF1, 0xCC, 0x8D, 0xFF, 0xEF, 0xC4, 0x7C, 0xFF, 0xEF, 0xC4, 0x7D, 0xFF, 0xEF, 0xC7, + 0x80, 0xFF, 0xF1, 0xCC, 0x8D, 0xFF, 0xF3, 0xD4, 0x9F, 0xFF, 0xF3, 0xD9, 0xA9, 0xA2, 0xEF, 0xDD, + 0xBE, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE5, 0xE3, 0xDD, 0x03, 0xF2, 0xD6, 0xA7, 0x67, 0xF3, 0xD3, 0x9E, 0xEB, 0xF2, 0xCE, + 0x94, 0xFF, 0xF0, 0xC8, 0x86, 0xFF, 0xF0, 0xC5, 0x80, 0xFF, 0xF0, 0xC5, 0x7E, 0xFF, 0xF2, 0xCD, + 0x8D, 0xFF, 0xF6, 0xDE, 0xB4, 0xFF, 0xF7, 0xE2, 0xBC, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, + 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF4, 0xD5, + 0x9D, 0xFF, 0xF1, 0xC8, 0x80, 0xFF, 0xF0, 0xC8, 0x80, 0xFF, 0xF1, 0xC9, 0x84, 0xFF, 0xF3, 0xCF, + 0x91, 0xFF, 0xF5, 0xD6, 0xA1, 0xFE, 0xF5, 0xDA, 0xAB, 0xA9, 0xEF, 0xDE, 0xBF, 0x1C, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xE5, 0xE2, 0x03, 0xF4, 0xD8, 0xA8, 0x60, 0xF4, 0xD4, + 0xA0, 0xE4, 0xF4, 0xD1, 0x98, 0xFF, 0xF2, 0xCC, 0x8B, 0xFF, 0xF2, 0xC9, 0x84, 0xFF, 0xF2, 0xC8, + 0x82, 0xFF, 0xF4, 0xD3, 0x98, 0xFF, 0xF8, 0xE2, 0xBA, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF6, 0xDA, 0xA8, 0xFF, 0xF3, 0xCB, + 0x86, 0xFF, 0xF2, 0xCA, 0x83, 0xFF, 0xF3, 0xCD, 0x89, 0xFF, 0xF4, 0xD2, 0x96, 0xFF, 0xF6, 0xD8, + 0xA3, 0xF9, 0xF6, 0xDB, 0xAC, 0x9E, 0xF1, 0xE0, 0xC1, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xFA, 0xFF, 0x01, 0xF4, 0xDA, + 0xAD, 0x4E, 0xF6, 0xD7, 0xA2, 0xD3, 0xF5, 0xD4, 0x9D, 0xFF, 0xF4, 0xD0, 0x92, 0xFF, 0xF3, 0xCC, + 0x88, 0xFF, 0xF3, 0xCB, 0x85, 0xFF, 0xF5, 0xD5, 0x9D, 0xFF, 0xF9, 0xE4, 0xBC, 0xFF, 0xF9, 0xE6, + 0xC1, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC1, 0xFF, 0xF7, 0xDC, 0xAC, 0xFF, 0xF4, 0xCE, 0x8B, 0xFF, 0xF3, 0xCC, + 0x87, 0xFF, 0xF4, 0xD0, 0x90, 0xFF, 0xF6, 0xD5, 0x9D, 0xFF, 0xF7, 0xDA, 0xA6, 0xF0, 0xF7, 0xDC, + 0xAF, 0x84, 0xF3, 0xE2, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF4, 0xDB, 0xB1, 0x31, 0xF5, 0xD8, 0xA5, 0xAC, 0xF7, 0xD7, 0xA2, 0xFA, 0xF6, 0xD4, + 0x9B, 0xFF, 0xF5, 0xCF, 0x90, 0xFF, 0xF4, 0xCD, 0x8A, 0xFF, 0xF6, 0xD5, 0x9C, 0xFF, 0xFA, 0xE3, + 0xBC, 0xFF, 0xFA, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, + 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE7, 0xC4, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xF8, 0xDC, 0xAA, 0xFF, 0xF5, 0xD0, 0x8E, 0xFF, 0xF5, 0xD0, 0x8D, 0xFF, 0xF6, 0xD5, + 0x98, 0xFF, 0xF7, 0xD9, 0xA3, 0xFF, 0xF8, 0xDC, 0xAA, 0xD7, 0xF8, 0xDE, 0xB1, 0x5E, 0xF5, 0xE9, + 0xD4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD9, 0xBB, 0x12, 0xF5, 0xDA, 0xAA, 0x70, 0xF8, 0xD9, + 0xA4, 0xD8, 0xF8, 0xD8, 0xA1, 0xFF, 0xF7, 0xD5, 0x9A, 0xFF, 0xF6, 0xD1, 0x90, 0xFF, 0xF7, 0xD4, + 0x98, 0xFF, 0xF9, 0xE0, 0xB4, 0xFF, 0xFB, 0xE8, 0xC5, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, + 0xC8, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFB, 0xE8, 0xC8, 0xFF, 0xFA, 0xE4, 0xBD, 0xFF, 0xF8, 0xD9, + 0xA2, 0xFF, 0xF7, 0xD2, 0x91, 0xFF, 0xF7, 0xD5, 0x97, 0xFF, 0xF8, 0xD9, 0xA2, 0xFF, 0xF8, 0xDB, + 0xA7, 0xF0, 0xF8, 0xDD, 0xAE, 0x9E, 0xF7, 0xE2, 0xBC, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDB, + 0xB3, 0x2F, 0xF7, 0xDB, 0xA9, 0x99, 0xF9, 0xDB, 0xA6, 0xE9, 0xF9, 0xDA, 0xA3, 0xFF, 0xF8, 0xD6, + 0x9B, 0xFF, 0xF7, 0xD5, 0x98, 0xFF, 0xF9, 0xDB, 0xA7, 0xFF, 0xFB, 0xE4, 0xBD, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE7, 0xC3, 0xFF, 0xFA, 0xE0, 0xB0, 0xFF, 0xF8, 0xD8, 0x9C, 0xFF, 0xF8, 0xD7, + 0x9A, 0xFF, 0xF9, 0xDA, 0xA3, 0xFF, 0xF9, 0xDD, 0xA9, 0xF8, 0xF9, 0xDE, 0xAC, 0xC0, 0xF9, 0xE0, + 0xB4, 0x52, 0xF7, 0xEB, 0xD7, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xED, 0xE0, 0xC9, 0x08, 0xF5, 0xDD, 0xB2, 0x42, 0xF8, 0xDC, 0xAA, 0x9E, 0xF9, 0xDC, + 0xA8, 0xE4, 0xF9, 0xDB, 0xA5, 0xFE, 0xF9, 0xD9, 0xA1, 0xFF, 0xF9, 0xDA, 0xA1, 0xFF, 0xFA, 0xDE, + 0xAC, 0xFF, 0xFB, 0xE4, 0xBB, 0xFF, 0xFC, 0xE9, 0xC7, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCE, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCE, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFB, 0xE7, 0xC0, 0xFF, 0xFA, 0xE1, + 0xB2, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xF9, 0xDA, 0xA1, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xFA, 0xDD, + 0xAA, 0xF3, 0xF9, 0xDE, 0xAD, 0xBF, 0xF7, 0xDF, 0xB2, 0x67, 0xF2, 0xE1, 0xC0, 0x18, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xE2, 0xCD, 0x08, 0xF5, 0xDD, + 0xB4, 0x36, 0xF8, 0xDE, 0xAD, 0x82, 0xFA, 0xDE, 0xAC, 0xC6, 0xFA, 0xDD, 0xA9, 0xF0, 0xFA, 0xDC, + 0xA6, 0xFF, 0xFA, 0xDD, 0xA7, 0xFF, 0xFB, 0xDE, 0xAC, 0xFF, 0xFB, 0xE2, 0xB3, 0xFF, 0xFB, 0xE5, + 0xBB, 0xFF, 0xFB, 0xE7, 0xC1, 0xFF, 0xFC, 0xE9, 0xC5, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xC9, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE8, 0xC3, 0xFF, 0xFC, 0xE6, + 0xBE, 0xFF, 0xFB, 0xE3, 0xB7, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xDE, 0xA9, 0xFF, 0xFA, 0xDD, + 0xA7, 0xFF, 0xFB, 0xDE, 0xA9, 0xF9, 0xFA, 0xDF, 0xAE, 0xD9, 0xFA, 0xDF, 0xAF, 0x9F, 0xF6, 0xDF, + 0xB5, 0x51, 0xF5, 0xE1, 0xBE, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xEA, 0xCC, 0x18, 0xFB, 0xE3, 0xB8, 0x42, 0xFB, 0xE2, + 0xB5, 0x7B, 0xFB, 0xE0, 0xAF, 0xAF, 0xFB, 0xDF, 0xAC, 0xD3, 0xFB, 0xDF, 0xAB, 0xE8, 0xFB, 0xDF, + 0xAC, 0xF8, 0xFB, 0xDF, 0xAD, 0xFF, 0xFB, 0xE0, 0xAE, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xE1, + 0xB0, 0xFF, 0xFB, 0xE0, 0xB0, 0xFF, 0xFB, 0xE0, 0xAF, 0xFF, 0xFB, 0xE0, 0xAE, 0xFF, 0xFB, 0xE0, + 0xAD, 0xFC, 0xFB, 0xDF, 0xAC, 0xEF, 0xFB, 0xDF, 0xAD, 0xDC, 0xFB, 0xE0, 0xAF, 0xC0, 0xFB, 0xE2, + 0xB5, 0x91, 0xFB, 0xE4, 0xB9, 0x58, 0xFB, 0xE6, 0xC0, 0x26, 0xF8, 0xF8, 0xF4, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFC, 0xEB, 0xCC, 0x07, 0xFC, 0xE4, 0xBB, 0x1F, 0xFB, 0xE2, 0xB4, 0x37, 0xFB, 0xE0, + 0xAE, 0x50, 0xFB, 0xE0, 0xAF, 0x69, 0xFB, 0xE1, 0xB0, 0x7B, 0xFB, 0xE1, 0xAF, 0x85, 0xFB, 0xE1, + 0xB1, 0x8B, 0xFC, 0xE1, 0xB0, 0x88, 0xFB, 0xE1, 0xB0, 0x7F, 0xFB, 0xE1, 0xB0, 0x71, 0xFB, 0xE0, + 0xAF, 0x5A, 0xFB, 0xE2, 0xB3, 0x41, 0xFC, 0xE4, 0xBA, 0x29, 0xFC, 0xE8, 0xC4, 0x10, 0xFF, 0xFF, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF6, 0xE8, 0x02, 0xFE, 0xED, + 0xCE, 0x03, 0xFD, 0xF2, 0xD9, 0x02, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFC, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, + 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, + 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, + 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, + 0x01, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFE, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, + 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF8, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, + 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, + 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x2C, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x27, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x40, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, + 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, + 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, + 0x0C, 0x40, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x31, 0x82, 0x44, 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, + 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x19, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x02, 0x81, 0x43, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, + 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x33, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x41, 0x82, 0x44, + 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, + 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x5C, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, + 0x0C, 0x64, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, + 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x64, 0x82, 0x44, 0x0C, 0x62, 0x82, 0x44, + 0x0C, 0x60, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x55, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x4D, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, + 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x03, 0x81, 0x43, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x43, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x57, 0x82, 0x44, 0x0C, 0x5F, 0x82, 0x44, + 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x75, 0x82, 0x44, + 0x0C, 0x79, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x81, 0x82, 0x44, + 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x43, 0x0B, 0x86, 0x81, 0x43, 0x0A, 0x88, 0x81, 0x42, + 0x0A, 0x88, 0x81, 0x42, 0x09, 0x88, 0x81, 0x42, 0x09, 0x89, 0x81, 0x42, 0x09, 0x89, 0x81, 0x42, + 0x09, 0x89, 0x81, 0x43, 0x0A, 0x89, 0x82, 0x43, 0x0B, 0x89, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, + 0x0C, 0x87, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x81, 0x82, 0x44, + 0x0C, 0x7F, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x79, 0x82, 0x44, 0x0C, 0x75, 0x82, 0x44, + 0x0C, 0x71, 0x82, 0x44, 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, 0x0C, 0x60, 0x82, 0x44, + 0x0C, 0x58, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, + 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x06, 0x81, 0x43, 0x0B, 0x03, 0x8F, 0x57, 0x25, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x2A, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, + 0x0C, 0x5B, 0x82, 0x44, 0x0C, 0x68, 0x82, 0x44, 0x0C, 0x73, 0x82, 0x44, 0x0C, 0x7B, 0x82, 0x44, + 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x44, 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x91, 0x82, 0x44, + 0x0C, 0x95, 0x82, 0x44, 0x0C, 0x97, 0x81, 0x43, 0x0B, 0x99, 0x81, 0x42, 0x09, 0x9B, 0x81, 0x43, + 0x0A, 0x9D, 0x83, 0x46, 0x0E, 0xA0, 0x87, 0x4B, 0x14, 0xA4, 0x8B, 0x52, 0x1D, 0xA9, 0x8E, 0x57, + 0x25, 0xAF, 0x8F, 0x58, 0x28, 0xB2, 0x8F, 0x59, 0x28, 0xB3, 0x8F, 0x59, 0x28, 0xB2, 0x8F, 0x57, + 0x26, 0xB0, 0x8C, 0x53, 0x20, 0xAC, 0x87, 0x4C, 0x16, 0xA7, 0x84, 0x46, 0x0F, 0xA2, 0x82, 0x43, + 0x0B, 0xA0, 0x81, 0x42, 0x09, 0x9E, 0x81, 0x43, 0x0A, 0x9D, 0x82, 0x44, 0x0C, 0x9C, 0x82, 0x44, + 0x0C, 0x9A, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, 0x0C, 0x95, 0x82, 0x44, 0x0C, 0x91, 0x82, 0x44, + 0x0C, 0x8D, 0x82, 0x44, 0x0C, 0x89, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, + 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x2C, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x04, 0x83, 0x46, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0E, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x47, 0x82, 0x44, 0x0C, 0x5B, 0x82, 0x44, + 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, 0x0C, 0x90, 0x82, 0x44, + 0x0C, 0x97, 0x82, 0x44, 0x0C, 0x9D, 0x82, 0x44, 0x0C, 0xA1, 0x82, 0x43, 0x0B, 0xA5, 0x81, 0x42, + 0x09, 0xA7, 0x83, 0x45, 0x0D, 0xAA, 0x8A, 0x50, 0x1C, 0xB3, 0x93, 0x5F, 0x31, 0xC1, 0x9A, 0x6B, + 0x44, 0xD1, 0x9C, 0x71, 0x4E, 0xDE, 0x9C, 0x73, 0x53, 0xE8, 0x9C, 0x74, 0x57, 0xF1, 0x9B, 0x74, + 0x58, 0xF6, 0x9A, 0x73, 0x58, 0xF8, 0x9A, 0x73, 0x58, 0xF9, 0x9A, 0x74, 0x59, 0xF8, 0x9C, 0x76, + 0x5B, 0xF7, 0x9E, 0x77, 0x5B, 0xF2, 0x9E, 0x76, 0x57, 0xEA, 0x9E, 0x74, 0x52, 0xE1, 0x9C, 0x6F, + 0x4A, 0xD6, 0x95, 0x63, 0x37, 0xC7, 0x8C, 0x53, 0x20, 0xB9, 0x84, 0x47, 0x10, 0xAF, 0x81, 0x42, + 0x0A, 0xAB, 0x81, 0x43, 0x0A, 0xAA, 0x82, 0x44, 0x0C, 0xA8, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, + 0x0C, 0xA2, 0x82, 0x44, 0x0C, 0x9D, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, 0x0C, 0x91, 0x82, 0x44, + 0x0C, 0x89, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x43, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x46, + 0x0F, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x83, 0x82, 0x44, 0x0C, 0x8F, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x44, + 0x0C, 0x9F, 0x81, 0x43, 0x0B, 0xA4, 0x81, 0x43, 0x0A, 0xA7, 0x88, 0x4D, 0x16, 0xB1, 0x94, 0x61, + 0x33, 0xC5, 0x9C, 0x70, 0x4B, 0xDD, 0x9B, 0x72, 0x53, 0xF0, 0x94, 0x6C, 0x50, 0xFB, 0x8C, 0x63, + 0x48, 0xFF, 0x85, 0x5B, 0x40, 0xFF, 0x7F, 0x55, 0x3A, 0xFF, 0x7C, 0x50, 0x36, 0xFF, 0x79, 0x4E, + 0x34, 0xFF, 0x79, 0x4D, 0x33, 0xFF, 0x79, 0x4D, 0x33, 0xFF, 0x7A, 0x4F, 0x35, 0xFF, 0x7C, 0x52, + 0x37, 0xFF, 0x80, 0x56, 0x3C, 0xFF, 0x85, 0x5C, 0x42, 0xFF, 0x8B, 0x63, 0x49, 0xFF, 0x92, 0x6B, + 0x51, 0xFF, 0x9A, 0x74, 0x5A, 0xFC, 0x9F, 0x79, 0x5C, 0xF4, 0x9F, 0x76, 0x53, 0xE4, 0x97, 0x66, + 0x3C, 0xCD, 0x8A, 0x51, 0x1C, 0xB9, 0x82, 0x43, 0x0B, 0xAE, 0x81, 0x43, 0x0A, 0xAC, 0x82, 0x44, + 0x0C, 0xAA, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, 0x0C, 0xA0, 0x82, 0x44, 0x0C, 0x99, 0x82, 0x44, + 0x0C, 0x91, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x64, 0x82, 0x44, + 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x43, 0x0B, 0x02, 0x87, 0x4A, 0x13, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, + 0x0E, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, 0x0C, 0x5C, 0x82, 0x44, + 0x0C, 0x6E, 0x82, 0x44, 0x0C, 0x7D, 0x82, 0x44, 0x0C, 0x88, 0x82, 0x43, 0x0B, 0x91, 0x81, 0x43, + 0x0A, 0x96, 0x8A, 0x4F, 0x1A, 0xA4, 0x99, 0x68, 0x3F, 0xC6, 0x9C, 0x73, 0x52, 0xE9, 0x93, 0x6A, + 0x4E, 0xFB, 0x84, 0x5A, 0x3E, 0xFF, 0x79, 0x4C, 0x30, 0xFF, 0x72, 0x43, 0x28, 0xFF, 0x6E, 0x40, + 0x25, 0xFF, 0x6D, 0x3F, 0x24, 0xFF, 0x6D, 0x3F, 0x24, 0xFF, 0x6E, 0x40, 0x24, 0xFF, 0x70, 0x41, + 0x26, 0xFF, 0x71, 0x42, 0x27, 0xFF, 0x72, 0x43, 0x28, 0xFF, 0x72, 0x45, 0x29, 0xFF, 0x73, 0x46, + 0x2A, 0xFF, 0x74, 0x47, 0x2C, 0xFF, 0x75, 0x49, 0x2E, 0xFF, 0x77, 0x4A, 0x2F, 0xFF, 0x79, 0x4D, + 0x32, 0xFF, 0x7E, 0x52, 0x38, 0xFF, 0x85, 0x5B, 0x40, 0xFF, 0x8F, 0x67, 0x4D, 0xFF, 0x9B, 0x75, + 0x5A, 0xFD, 0xA2, 0x7B, 0x5D, 0xF0, 0x9D, 0x70, 0x49, 0xD3, 0x8D, 0x55, 0x22, 0xB2, 0x82, 0x43, + 0x0B, 0xA1, 0x81, 0x43, 0x0B, 0x9D, 0x82, 0x44, 0x0C, 0x99, 0x82, 0x44, 0x0C, 0x92, 0x82, 0x44, + 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, + 0x0C, 0x4B, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x43, 0x0B, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x4D, 0x82, 0x44, + 0x0C, 0x5C, 0x82, 0x44, 0x0C, 0x69, 0x81, 0x42, 0x09, 0x72, 0x86, 0x4A, 0x13, 0x7F, 0x98, 0x67, + 0x3D, 0xAD, 0x9D, 0x73, 0x53, 0xE3, 0x8E, 0x64, 0x47, 0xFC, 0x7C, 0x4E, 0x31, 0xFF, 0x6F, 0x40, + 0x23, 0xFF, 0x6A, 0x3A, 0x1E, 0xFF, 0x69, 0x39, 0x1C, 0xFF, 0x6B, 0x3A, 0x1D, 0xFF, 0x6C, 0x3C, + 0x1E, 0xFF, 0x6E, 0x3E, 0x20, 0xFF, 0x70, 0x40, 0x21, 0xFF, 0x72, 0x42, 0x23, 0xFF, 0x74, 0x43, + 0x24, 0xFF, 0x75, 0x45, 0x26, 0xFF, 0x76, 0x46, 0x27, 0xFF, 0x77, 0x47, 0x28, 0xFF, 0x78, 0x48, + 0x29, 0xFF, 0x79, 0x49, 0x2A, 0xFF, 0x79, 0x4A, 0x2B, 0xFF, 0x79, 0x4B, 0x2C, 0xFF, 0x79, 0x4B, + 0x2D, 0xFF, 0x79, 0x4B, 0x2E, 0xFF, 0x7A, 0x4C, 0x30, 0xFF, 0x7C, 0x4F, 0x33, 0xFF, 0x81, 0x55, + 0x39, 0xFF, 0x8B, 0x61, 0x46, 0xFF, 0x99, 0x72, 0x58, 0xFF, 0xA4, 0x7E, 0x61, 0xEE, 0x9D, 0x70, + 0x48, 0xC0, 0x89, 0x4F, 0x19, 0x92, 0x81, 0x42, 0x09, 0x82, 0x82, 0x44, 0x0C, 0x7E, 0x82, 0x44, + 0x0C, 0x76, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, + 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x04, 0x83, 0x45, 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, + 0x09, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x43, + 0x0B, 0x44, 0x81, 0x42, 0x09, 0x4D, 0x95, 0x62, 0x33, 0x74, 0xA0, 0x76, 0x54, 0xC4, 0x92, 0x67, + 0x49, 0xF7, 0x7B, 0x4C, 0x2E, 0xFF, 0x6C, 0x3B, 0x1E, 0xFF, 0x67, 0x36, 0x18, 0xFF, 0x67, 0x36, + 0x18, 0xFF, 0x6A, 0x38, 0x19, 0xFF, 0x6C, 0x3A, 0x1B, 0xFF, 0x6F, 0x3C, 0x1C, 0xFF, 0x71, 0x3F, + 0x1D, 0xFF, 0x73, 0x41, 0x1F, 0xFF, 0x75, 0x43, 0x20, 0xFF, 0x77, 0x45, 0x22, 0xFF, 0x79, 0x47, + 0x23, 0xFF, 0x7A, 0x48, 0x24, 0xFF, 0x7C, 0x49, 0x26, 0xFF, 0x7D, 0x4B, 0x27, 0xFF, 0x7D, 0x4C, + 0x28, 0xFF, 0x7E, 0x4D, 0x29, 0xFF, 0x7E, 0x4D, 0x2A, 0xFF, 0x7F, 0x4E, 0x2B, 0xFF, 0x7F, 0x4E, + 0x2C, 0xFF, 0x7E, 0x4F, 0x2D, 0xFF, 0x7E, 0x4E, 0x2E, 0xFF, 0x7D, 0x4E, 0x2F, 0xFF, 0x7D, 0x4F, + 0x30, 0xFF, 0x7D, 0x50, 0x32, 0xFF, 0x82, 0x55, 0x39, 0xFF, 0x8D, 0x63, 0x47, 0xFF, 0x9D, 0x77, + 0x5B, 0xFC, 0xA6, 0x7F, 0x60, 0xD8, 0x9A, 0x6A, 0x3E, 0x90, 0x83, 0x45, 0x0D, 0x61, 0x81, 0x43, + 0x0A, 0x59, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, + 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, + 0x0C, 0x06, 0x81, 0x43, 0x0B, 0x03, 0x8C, 0x54, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1C, 0x80, 0x41, 0x08, 0x23, 0x87, 0x4B, + 0x13, 0x2D, 0xA3, 0x78, 0x53, 0x76, 0x9C, 0x73, 0x54, 0xDE, 0x82, 0x54, 0x35, 0xFF, 0x6D, 0x3A, + 0x1B, 0xFF, 0x64, 0x31, 0x13, 0xFF, 0x63, 0x30, 0x11, 0xFF, 0x66, 0x31, 0x12, 0xFF, 0x69, 0x33, + 0x13, 0xFF, 0x6B, 0x36, 0x13, 0xFF, 0x6E, 0x39, 0x15, 0xFF, 0x71, 0x3C, 0x17, 0xFF, 0x74, 0x3F, + 0x19, 0xFF, 0x77, 0x42, 0x1B, 0xFF, 0x7A, 0x45, 0x1E, 0xFF, 0x7C, 0x47, 0x20, 0xFF, 0x7E, 0x4A, + 0x23, 0xFF, 0x80, 0x4C, 0x24, 0xFF, 0x81, 0x4D, 0x25, 0xFF, 0x82, 0x4E, 0x27, 0xFF, 0x83, 0x4F, + 0x28, 0xFF, 0x83, 0x50, 0x29, 0xFF, 0x84, 0x51, 0x2A, 0xFF, 0x84, 0x51, 0x2B, 0xFF, 0x84, 0x51, + 0x2C, 0xFF, 0x83, 0x52, 0x2D, 0xFF, 0x83, 0x52, 0x2E, 0xFF, 0x82, 0x52, 0x2E, 0xFF, 0x82, 0x51, + 0x2F, 0xFF, 0x81, 0x51, 0x30, 0xFF, 0x80, 0x51, 0x31, 0xFF, 0x80, 0x52, 0x34, 0xFF, 0x86, 0x5A, + 0x3C, 0xFF, 0x95, 0x6C, 0x50, 0xFF, 0xA6, 0x81, 0x64, 0xEE, 0xA8, 0x7F, 0x5C, 0x9A, 0x8C, 0x53, + 0x1F, 0x44, 0x80, 0x40, 0x07, 0x34, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, + 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, + 0x0C, 0x04, 0x83, 0x46, 0x0F, 0x02, 0xA0, 0x71, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x85, 0x48, 0x11, 0x01, 0x82, 0x43, 0x0B, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x0A, 0x7B, 0x3A, 0x00, 0x0D, 0x9B, 0x68, 0x39, 0x19, 0xA9, 0x82, + 0x62, 0x81, 0x93, 0x68, 0x48, 0xEE, 0x73, 0x41, 0x20, 0xFF, 0x62, 0x2C, 0x0C, 0xFF, 0x5E, 0x27, + 0x07, 0xFF, 0x5F, 0x28, 0x06, 0xFF, 0x62, 0x29, 0x06, 0xFF, 0x65, 0x2B, 0x06, 0xFF, 0x67, 0x2D, + 0x07, 0xFF, 0x6A, 0x30, 0x07, 0xFF, 0x6C, 0x32, 0x08, 0xFF, 0x6F, 0x34, 0x09, 0xFF, 0x71, 0x36, + 0x0A, 0xFF, 0x74, 0x38, 0x0B, 0xFF, 0x76, 0x3A, 0x0D, 0xFF, 0x78, 0x3D, 0x0F, 0xFF, 0x7B, 0x40, + 0x12, 0xFF, 0x7E, 0x44, 0x16, 0xFF, 0x80, 0x48, 0x1A, 0xFF, 0x83, 0x4C, 0x1F, 0xFF, 0x86, 0x50, + 0x24, 0xFF, 0x88, 0x52, 0x28, 0xFF, 0x89, 0x54, 0x29, 0xFF, 0x89, 0x55, 0x2A, 0xFF, 0x89, 0x55, + 0x2B, 0xFF, 0x89, 0x55, 0x2C, 0xFF, 0x88, 0x55, 0x2D, 0xFF, 0x88, 0x55, 0x2E, 0xFF, 0x87, 0x55, + 0x2F, 0xFF, 0x86, 0x55, 0x2F, 0xFF, 0x84, 0x54, 0x30, 0xFF, 0x83, 0x53, 0x31, 0xFF, 0x82, 0x53, + 0x32, 0xFF, 0x84, 0x56, 0x37, 0xFF, 0x8F, 0x64, 0x46, 0xFF, 0xA2, 0x7C, 0x60, 0xF9, 0xAE, 0x8A, + 0x6C, 0xA6, 0x9D, 0x6D, 0x42, 0x31, 0x7C, 0x3B, 0x00, 0x17, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x04, 0x81, 0x43, + 0x0B, 0x02, 0x83, 0x46, 0x0E, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x4B, 0x14, 0x01, 0x83, 0x45, 0x0E, 0x01, 0x83, 0x45, + 0x0D, 0x02, 0x5F, 0x0F, 0x00, 0x03, 0xB2, 0x8C, 0x69, 0x10, 0xAC, 0x87, 0x69, 0x88, 0x8E, 0x61, + 0x40, 0xF6, 0x6D, 0x39, 0x16, 0xFF, 0x60, 0x29, 0x08, 0xFF, 0x5F, 0x27, 0x05, 0xFF, 0x62, 0x29, + 0x05, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x68, 0x2E, 0x06, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6E, 0x33, + 0x07, 0xFF, 0x71, 0x35, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x75, 0x39, 0x08, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x78, 0x3B, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7A, 0x3C, 0x09, 0xFF, 0x7B, 0x3D, + 0x09, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7C, 0x3E, 0x0A, 0xFF, 0x7D, 0x3F, 0x0C, 0xFF, 0x7F, 0x42, + 0x0F, 0xFF, 0x82, 0x46, 0x13, 0xFF, 0x85, 0x4C, 0x1A, 0xFF, 0x89, 0x52, 0x22, 0xFF, 0x8C, 0x56, + 0x28, 0xFF, 0x8D, 0x58, 0x2B, 0xFF, 0x8D, 0x59, 0x2C, 0xFF, 0x8C, 0x58, 0x2D, 0xFF, 0x8C, 0x58, + 0x2D, 0xFF, 0x8B, 0x58, 0x2E, 0xFF, 0x8A, 0x57, 0x2F, 0xFF, 0x88, 0x57, 0x30, 0xFF, 0x87, 0x56, + 0x30, 0xFF, 0x85, 0x55, 0x31, 0xFF, 0x85, 0x56, 0x34, 0xFF, 0x8C, 0x60, 0x40, 0xFF, 0xA0, 0x79, + 0x5B, 0xFE, 0xB2, 0x90, 0x73, 0xAF, 0xAE, 0x87, 0x65, 0x26, 0x6E, 0x25, 0x00, 0x07, 0x82, 0x44, + 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0D, 0x01, 0x84, 0x46, + 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC9, 0xAA, 0x8F, 0x09, 0xAE, 0x89, 0x6C, 0x84, 0x8D, 0x60, 0x3E, 0xF8, 0x6C, 0x37, + 0x13, 0xFF, 0x61, 0x29, 0x07, 0xFF, 0x61, 0x29, 0x06, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x68, 0x2E, + 0x07, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6C, 0x33, 0x08, 0xFF, 0x6D, 0x34, 0x08, 0xFF, 0x71, 0x37, + 0x09, 0xFF, 0x76, 0x3A, 0x09, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7D, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x7F, 0x41, 0x0B, 0xFF, 0x80, 0x41, + 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x42, + 0x0A, 0xFF, 0x81, 0x42, 0x0A, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x81, 0x43, 0x0D, 0xFF, 0x84, 0x47, + 0x12, 0xFF, 0x88, 0x4D, 0x19, 0xFF, 0x8C, 0x54, 0x23, 0xFF, 0x8F, 0x59, 0x2A, 0xFF, 0x90, 0x5B, + 0x2D, 0xFF, 0x8F, 0x5B, 0x2E, 0xFF, 0x8E, 0x5A, 0x2F, 0xFF, 0x8D, 0x5A, 0x2F, 0xFF, 0x8B, 0x59, + 0x30, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x87, 0x57, 0x31, 0xFF, 0x87, 0x57, 0x33, 0xFF, 0x8D, 0x5F, + 0x3E, 0xFF, 0xA0, 0x78, 0x5A, 0xFF, 0xB4, 0x92, 0x77, 0xAC, 0xBA, 0x97, 0x79, 0x1B, 0x00, 0x00, + 0x00, 0x00, 0x84, 0x46, 0x0F, 0x02, 0x84, 0x47, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xDF, + 0xD2, 0x05, 0xB4, 0x91, 0x74, 0x77, 0x91, 0x63, 0x40, 0xF5, 0x6E, 0x38, 0x14, 0xFF, 0x63, 0x2B, + 0x07, 0xFF, 0x64, 0x2B, 0x06, 0xFF, 0x67, 0x2D, 0x07, 0xFF, 0x6B, 0x31, 0x07, 0xFF, 0x6D, 0x33, + 0x08, 0xFF, 0x6C, 0x34, 0x08, 0xFF, 0x67, 0x33, 0x07, 0xFF, 0x67, 0x36, 0x0B, 0xFF, 0x68, 0x35, + 0x06, 0xFF, 0x73, 0x3B, 0x0A, 0xFF, 0x7C, 0x3F, 0x0B, 0xFF, 0x81, 0x42, 0x0B, 0xFF, 0x82, 0x43, + 0x0B, 0xFF, 0x83, 0x43, 0x0B, 0xFF, 0x83, 0x44, 0x0B, 0xFF, 0x84, 0x44, 0x0C, 0xFF, 0x84, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x84, 0x45, + 0x0B, 0xFF, 0x84, 0x44, 0x0B, 0xFF, 0x84, 0x45, 0x0D, 0xFF, 0x87, 0x4A, 0x13, 0xFF, 0x8C, 0x52, + 0x1E, 0xFF, 0x91, 0x59, 0x28, 0xFF, 0x92, 0x5D, 0x2E, 0xFF, 0x92, 0x5D, 0x2F, 0xFF, 0x90, 0x5C, + 0x2F, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8C, 0x5A, 0x31, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x89, 0x58, + 0x33, 0xFF, 0x8F, 0x60, 0x3E, 0xFF, 0xA3, 0x7B, 0x5C, 0xFE, 0xB8, 0x97, 0x7B, 0x9D, 0xCA, 0xAD, + 0x95, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x99, + 0x7D, 0x5B, 0x97, 0x6B, 0x48, 0xEF, 0x72, 0x3C, 0x17, 0xFF, 0x65, 0x2C, 0x08, 0xFF, 0x67, 0x2C, + 0x06, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6E, 0x33, 0x07, 0xFF, 0x70, 0x35, 0x08, 0xFF, 0x6C, 0x34, + 0x07, 0xFF, 0x63, 0x32, 0x08, 0xFF, 0x80, 0x60, 0x3F, 0xFF, 0xBB, 0xAA, 0x99, 0xFF, 0x7F, 0x60, + 0x3F, 0xFF, 0x64, 0x36, 0x07, 0xFF, 0x75, 0x3E, 0x09, 0xFF, 0x80, 0x43, 0x0B, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x87, 0x47, 0x0C, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x86, 0x46, + 0x0C, 0xFF, 0x88, 0x49, 0x10, 0xFF, 0x8C, 0x51, 0x1A, 0xFF, 0x92, 0x5A, 0x28, 0xFF, 0x94, 0x5E, + 0x2F, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x91, 0x5D, 0x30, 0xFF, 0x8F, 0x5B, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8B, 0x59, 0x33, 0xFF, 0x92, 0x63, 0x40, 0xFF, 0xA7, 0x80, 0x60, 0xFB, 0xBE, 0x9E, + 0x84, 0x84, 0xE5, 0xD8, 0xCC, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA5, 0x8A, 0x32, 0xA1, 0x77, + 0x55, 0xD8, 0x79, 0x44, 0x1D, 0xFF, 0x68, 0x2F, 0x09, 0xFF, 0x69, 0x2E, 0x07, 0xFF, 0x6C, 0x31, + 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x72, 0x38, 0x09, 0xFF, 0x6D, 0x36, 0x07, 0xFF, 0x66, 0x3A, + 0x10, 0xFF, 0xA2, 0x8D, 0x77, 0xFF, 0xC0, 0xB7, 0xAC, 0xFF, 0xC1, 0xBB, 0xB1, 0xFF, 0xDC, 0xD7, + 0xCF, 0xFF, 0x9A, 0x83, 0x69, 0xFF, 0x68, 0x3E, 0x10, 0xFF, 0x73, 0x3E, 0x09, 0xFF, 0x81, 0x46, + 0x0C, 0xFF, 0x87, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x89, 0x4A, 0x10, 0xFF, 0x8E, 0x53, + 0x1B, 0xFF, 0x94, 0x5C, 0x29, 0xFF, 0x95, 0x5F, 0x2F, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x91, 0x5D, + 0x30, 0xFF, 0x8F, 0x5B, 0x31, 0xFF, 0x8D, 0x5C, 0x34, 0xFF, 0x96, 0x68, 0x44, 0xFF, 0xAE, 0x88, + 0x68, 0xF0, 0xC4, 0xA8, 0x8F, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xBC, 0xA5, 0x0F, 0xAD, 0x87, 0x66, 0xAC, 0x85, 0x52, + 0x2B, 0xFF, 0x6C, 0x32, 0x0B, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6E, 0x32, 0x07, 0xFF, 0x73, 0x36, + 0x08, 0xFF, 0x75, 0x39, 0x09, 0xFF, 0x6F, 0x38, 0x07, 0xFF, 0x68, 0x3D, 0x11, 0xFF, 0xAC, 0x9B, + 0x87, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xE5, 0xE5, 0xE4, 0xFF, 0xBE, 0xB9, 0xAF, 0xFF, 0xA4, 0x9B, + 0x8B, 0xFF, 0xD9, 0xD5, 0xCE, 0xFF, 0xB9, 0xA9, 0x96, 0xFF, 0x74, 0x4E, 0x22, 0xFF, 0x6F, 0x3D, + 0x08, 0xFF, 0x7F, 0x46, 0x0C, 0xFF, 0x87, 0x49, 0x0D, 0xFF, 0x8A, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x89, 0x49, + 0x0C, 0xFF, 0x8B, 0x4C, 0x12, 0xFF, 0x91, 0x56, 0x1F, 0xFF, 0x96, 0x5F, 0x2C, 0xFF, 0x95, 0x60, + 0x30, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x90, 0x5E, 0x35, 0xFF, 0x9D, 0x71, + 0x4C, 0xFF, 0xB6, 0x93, 0x74, 0xD1, 0xCD, 0xB2, 0x9A, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0x99, 0x7B, 0x65, 0x95, 0x66, 0x40, 0xF7, 0x73, 0x3A, + 0x12, 0xFF, 0x6B, 0x30, 0x07, 0xFF, 0x6F, 0x33, 0x08, 0xFF, 0x74, 0x37, 0x09, 0xFF, 0x77, 0x3A, + 0x09, 0xFF, 0x73, 0x3A, 0x08, 0xFF, 0x6A, 0x3C, 0x0F, 0xFF, 0xAB, 0x98, 0x83, 0xFF, 0xE8, 0xE7, + 0xE6, 0xFF, 0xE4, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE8, 0xE7, 0xE8, 0xFF, 0xCB, 0xC7, + 0xBE, 0xFF, 0x93, 0x88, 0x75, 0xFF, 0xC4, 0xBD, 0xB2, 0xFF, 0xD0, 0xC8, 0xBB, 0xFF, 0x86, 0x67, + 0x42, 0xFF, 0x6D, 0x3E, 0x09, 0xFF, 0x7C, 0x45, 0x0B, 0xFF, 0x87, 0x4A, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8D, 0x4C, + 0x0D, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8E, 0x50, 0x15, 0xFF, 0x95, 0x5C, + 0x26, 0xFF, 0x97, 0x61, 0x2F, 0xFF, 0x94, 0x5F, 0x30, 0xFF, 0x92, 0x5D, 0x30, 0xFF, 0x94, 0x63, + 0x39, 0xFF, 0xA8, 0x7E, 0x5A, 0xFF, 0xC0, 0x9F, 0x83, 0x93, 0xE4, 0xD4, 0xC3, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xCC, 0xAF, 0x95, 0x20, 0xA8, 0x7E, 0x5B, 0xCE, 0x7F, 0x49, 0x1F, 0xFF, 0x6E, 0x33, + 0x09, 0xFF, 0x70, 0x33, 0x07, 0xFF, 0x75, 0x37, 0x09, 0xFF, 0x79, 0x3C, 0x0A, 0xFF, 0x77, 0x3D, + 0x09, 0xFF, 0x6B, 0x3A, 0x0B, 0xFF, 0xA1, 0x8B, 0x73, 0xFF, 0xE7, 0xE6, 0xE4, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xD8, 0xD5, 0xD0, 0xFF, 0x8F, 0x83, 0x6E, 0xFF, 0xA7, 0x9D, 0x8E, 0xFF, 0xDA, 0xD5, + 0xCE, 0xFF, 0x9D, 0x87, 0x6B, 0xFF, 0x6E, 0x44, 0x12, 0xFF, 0x78, 0x43, 0x09, 0xFF, 0x86, 0x4A, + 0x0D, 0xFF, 0x8C, 0x4D, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x8D, 0x4D, + 0x10, 0xFF, 0x93, 0x58, 0x1F, 0xFF, 0x97, 0x61, 0x2D, 0xFF, 0x95, 0x60, 0x2F, 0xFF, 0x93, 0x5F, + 0x31, 0xFF, 0x9B, 0x6C, 0x42, 0xFF, 0xB4, 0x8F, 0x6D, 0xEA, 0xCB, 0xAE, 0x94, 0x42, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xBA, 0x97, 0x77, 0x76, 0x94, 0x62, 0x39, 0xFD, 0x75, 0x3A, 0x0F, 0xFF, 0x71, 0x34, + 0x08, 0xFF, 0x76, 0x38, 0x08, 0xFF, 0x7B, 0x3C, 0x0A, 0xFF, 0x7D, 0x40, 0x0A, 0xFF, 0x71, 0x3B, + 0x07, 0xFF, 0x94, 0x77, 0x57, 0xFF, 0xE3, 0xE1, 0xDE, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE5, + 0xE5, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEA, 0xE9, 0xE9, 0xFF, 0xEA, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE2, 0xE1, 0xDF, 0xFF, 0x97, 0x8C, 0x7B, 0xFF, 0x8C, 0x7F, + 0x69, 0xFF, 0xD3, 0xCF, 0xC8, 0xFF, 0xB5, 0xA7, 0x95, 0xFF, 0x76, 0x52, 0x23, 0xFF, 0x73, 0x41, + 0x08, 0xFF, 0x83, 0x4A, 0x0D, 0xFF, 0x8D, 0x4E, 0x0E, 0xFF, 0x90, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, + 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x91, 0x50, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x91, 0x50, 0x0F, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x91, 0x54, 0x19, 0xFF, 0x97, 0x5F, 0x2A, 0xFF, 0x97, 0x61, + 0x2F, 0xFF, 0x97, 0x63, 0x35, 0xFF, 0xA8, 0x7C, 0x54, 0xFF, 0xC1, 0xA0, 0x81, 0xA4, 0xE0, 0xCD, + 0xBA, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xBD, + 0xA6, 0x1C, 0xAB, 0x81, 0x5C, 0xCD, 0x83, 0x4A, 0x1E, 0xFF, 0x73, 0x36, 0x09, 0xFF, 0x76, 0x38, + 0x09, 0xFF, 0x7B, 0x3D, 0x0A, 0xFF, 0x81, 0x41, 0x0B, 0xFF, 0x7E, 0x41, 0x09, 0xFF, 0x90, 0x68, + 0x3E, 0xFF, 0xDF, 0xDA, 0xD3, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE6, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEA, 0xE9, 0xE8, 0xFF, 0xA6, 0x9D, + 0x8D, 0xFF, 0x7A, 0x6A, 0x4F, 0xFF, 0xC0, 0xB9, 0xB0, 0xFF, 0xCA, 0xC1, 0xB7, 0xFF, 0x86, 0x69, + 0x42, 0xFF, 0x70, 0x42, 0x0B, 0xFF, 0x80, 0x49, 0x0C, 0xFF, 0x8C, 0x4F, 0x0F, 0xFF, 0x91, 0x51, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x91, 0x52, 0x15, 0xFF, 0x97, 0x5E, + 0x27, 0xFF, 0x98, 0x62, 0x30, 0xFF, 0x9F, 0x6D, 0x41, 0xFF, 0xB7, 0x91, 0x6D, 0xEA, 0xCF, 0xB2, + 0x97, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0xA3, + 0x84, 0x5F, 0x9B, 0x6A, 0x3F, 0xF8, 0x7B, 0x3E, 0x11, 0xFF, 0x76, 0x38, 0x08, 0xFF, 0x7B, 0x3D, + 0x09, 0xFF, 0x81, 0x41, 0x0B, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x84, 0x45, 0x09, 0xFF, 0xA7, 0x82, + 0x5A, 0xFF, 0xED, 0xEB, 0xE9, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEA, 0xEA, 0xE9, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEF, + 0xEE, 0xFF, 0xB8, 0xB1, 0xA6, 0xFF, 0x73, 0x62, 0x46, 0xFF, 0xA9, 0x9F, 0x8D, 0xFF, 0xD6, 0xD2, + 0xCD, 0xFF, 0x9D, 0x88, 0x6B, 0xFF, 0x72, 0x49, 0x14, 0xFF, 0x7C, 0x48, 0x0C, 0xFF, 0x8B, 0x50, + 0x10, 0xFF, 0x93, 0x53, 0x10, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x94, 0x54, 0x0F, 0xFF, 0x94, 0x53, + 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x52, + 0x13, 0xFF, 0x97, 0x5D, 0x25, 0xFF, 0x9B, 0x66, 0x34, 0xFF, 0xAE, 0x82, 0x58, 0xFF, 0xC7, 0xA6, + 0x87, 0x8F, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xEE, 0xE3, 0x09, 0xB7, 0x90, + 0x6C, 0xAA, 0x8E, 0x56, 0x28, 0xFF, 0x7A, 0x3B, 0x0B, 0xFF, 0x7C, 0x3C, 0x09, 0xFF, 0x81, 0x41, + 0x0A, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x89, 0x50, + 0x13, 0xFF, 0xC0, 0xA8, 0x8C, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xED, 0xED, 0xEC, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF1, + 0xF0, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xCA, 0xC5, 0xBE, 0xFF, 0x79, 0x69, 0x4A, 0xFF, 0x92, 0x85, + 0x6D, 0xFF, 0xD8, 0xD5, 0xD1, 0xFF, 0xB6, 0xA9, 0x97, 0xFF, 0x7B, 0x58, 0x29, 0xFF, 0x78, 0x48, + 0x0D, 0xFF, 0x8A, 0x51, 0x12, 0xFF, 0x94, 0x56, 0x13, 0xFF, 0x97, 0x58, 0x13, 0xFF, 0x98, 0x58, + 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x58, 0x13, 0xFF, 0x98, 0x57, + 0x13, 0xFF, 0x98, 0x57, 0x12, 0xFF, 0x97, 0x56, 0x11, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x97, 0x56, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x92, 0x50, + 0x0E, 0xFF, 0x91, 0x52, 0x13, 0xFF, 0x98, 0x5E, 0x26, 0xFF, 0xA6, 0x75, 0x46, 0xFF, 0xBF, 0x9B, + 0x78, 0xD3, 0xD6, 0xBD, 0xA3, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xBC, 0xA2, 0x2B, 0xAB, 0x7E, + 0x54, 0xE1, 0x85, 0x49, 0x18, 0xFF, 0x7C, 0x3C, 0x0A, 0xFF, 0x81, 0x40, 0x0A, 0xFF, 0x86, 0x45, + 0x0B, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x90, 0x4E, 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x91, 0x51, + 0x0D, 0xFF, 0x90, 0x5C, 0x1F, 0xFF, 0xD4, 0xC4, 0xB2, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xED, 0xED, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF4, 0xF4, 0xF5, 0xFF, 0xDA, 0xD8, 0xD3, 0xFF, 0x87, 0x79, + 0x5F, 0xFF, 0x80, 0x6F, 0x50, 0xFF, 0xD0, 0xCC, 0xC3, 0xFF, 0xCF, 0xC9, 0xBE, 0xFF, 0x8B, 0x70, + 0x49, 0xFF, 0x76, 0x4A, 0x11, 0xFF, 0x87, 0x52, 0x12, 0xFF, 0x94, 0x58, 0x14, 0xFF, 0x9A, 0x5A, + 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, + 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5B, 0x14, 0xFF, 0x9B, 0x5A, 0x14, 0xFF, 0x9A, 0x5A, + 0x13, 0xFF, 0x99, 0x58, 0x12, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x99, 0x57, 0x10, 0xFF, 0x98, 0x57, 0x10, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x96, 0x54, + 0x0F, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x92, 0x52, 0x13, 0xFF, 0x9F, 0x67, 0x32, 0xFF, 0xB8, 0x8F, + 0x67, 0xF6, 0xD0, 0xB2, 0x95, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xA7, 0x86, 0x5E, 0xA0, 0x6D, + 0x40, 0xF9, 0x82, 0x43, 0x11, 0xFF, 0x80, 0x3F, 0x0A, 0xFF, 0x85, 0x45, 0x0B, 0xFF, 0x8A, 0x4A, + 0x0D, 0xFF, 0x8F, 0x4E, 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x92, 0x54, 0x0E, 0xFF, 0x9E, 0x71, 0x3B, 0xFF, 0xE2, 0xDB, 0xD0, 0xFF, 0xEF, 0xF0, + 0xF1, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF3, 0xF3, 0xF4, 0xFF, 0xE5, 0xE4, + 0xE3, 0xFF, 0x9A, 0x8F, 0x78, 0xFF, 0x75, 0x62, 0x3E, 0xFF, 0xC0, 0xB8, 0xAA, 0xFF, 0xDE, 0xDC, + 0xD8, 0xFF, 0xA0, 0x8D, 0x70, 0xFF, 0x78, 0x51, 0x1B, 0xFF, 0x84, 0x52, 0x13, 0xFF, 0x94, 0x5A, + 0x17, 0xFF, 0x9B, 0x5D, 0x17, 0xFF, 0x9D, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, 0x18, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9C, 0x5B, 0x13, 0xFF, 0x9B, 0x59, + 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x98, 0x57, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x93, 0x52, 0x0E, 0xFF, 0x96, 0x58, 0x1A, 0xFF, 0xB1, 0x83, + 0x54, 0xFF, 0xC3, 0xA4, 0x83, 0x8E, 0x00, 0x24, 0x4C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xBF, 0x99, 0x74, 0x92, 0x98, 0x61, + 0x30, 0xFF, 0x82, 0x42, 0x0D, 0xFF, 0x84, 0x43, 0x0A, 0xFF, 0x8A, 0x49, 0x0C, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x97, 0x56, 0x10, 0xFF, 0x9A, 0x59, 0x12, 0xFF, 0x9D, 0x5D, + 0x15, 0xFF, 0x9F, 0x61, 0x19, 0xFF, 0x97, 0x5C, 0x16, 0xFF, 0xAD, 0x89, 0x5D, 0xFF, 0xE7, 0xE4, + 0xE0, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xEC, 0xEB, 0xEB, 0xFF, 0xB0, 0xA7, 0x96, 0xFF, 0x74, 0x61, 0x3B, 0xFF, 0xAD, 0xA2, + 0x8E, 0xFF, 0xE4, 0xE4, 0xE1, 0xFF, 0xB8, 0xAD, 0x99, 0xFF, 0x80, 0x5F, 0x2F, 0xFF, 0x80, 0x52, + 0x14, 0xFF, 0x93, 0x5B, 0x19, 0xFF, 0x9D, 0x60, 0x1A, 0xFF, 0xA0, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0xA0, 0x60, + 0x18, 0xFF, 0x9E, 0x5D, 0x13, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9C, 0x5B, 0x11, 0xFF, 0x9B, 0x5A, + 0x11, 0xFF, 0x9A, 0x58, 0x10, 0xFF, 0x97, 0x56, 0x0F, 0xFF, 0x95, 0x54, 0x11, 0xFF, 0xA6, 0x70, + 0x39, 0xFF, 0xC1, 0x9E, 0x79, 0xC0, 0xC5, 0xB4, 0xA2, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xD9, 0xC7, 0x0F, 0xBA, 0x91, 0x68, 0xBB, 0x93, 0x58, + 0x24, 0xFF, 0x84, 0x43, 0x0C, 0xFF, 0x89, 0x47, 0x0B, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x93, 0x51, + 0x0E, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x9C, 0x5C, 0x14, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA3, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA2, 0x64, 0x1D, 0xFF, 0x99, 0x60, 0x1C, 0xFF, 0xBA, 0x9F, + 0x7C, 0xFF, 0xE7, 0xE7, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xED, 0xED, 0xEE, 0xFF, 0xC3, 0xBE, 0xB2, 0xFF, 0x7B, 0x69, + 0x45, 0xFF, 0x9B, 0x8C, 0x71, 0xFF, 0xE1, 0xDF, 0xDC, 0xFF, 0xCE, 0xC8, 0xBD, 0xFF, 0x8E, 0x74, + 0x4C, 0xFF, 0x7E, 0x54, 0x19, 0xFF, 0x90, 0x5C, 0x1B, 0xFF, 0x9D, 0x62, 0x1D, 0xFF, 0xA2, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, + 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA4, 0x65, 0x1E, 0xFF, 0xA4, 0x65, + 0x1E, 0xFF, 0xA4, 0x65, 0x1D, 0xFF, 0xA2, 0x62, 0x18, 0xFF, 0x9F, 0x5E, 0x13, 0xFF, 0x9E, 0x5C, + 0x12, 0xFF, 0x9D, 0x5B, 0x11, 0xFF, 0x9B, 0x59, 0x11, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0xA0, 0x64, + 0x26, 0xFF, 0xBF, 0x96, 0x6B, 0xE1, 0xE0, 0xCA, 0xB1, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xC1, 0xA6, 0x1F, 0xB4, 0x88, 0x5B, 0xD9, 0x91, 0x53, + 0x1D, 0xFF, 0x88, 0x46, 0x0B, 0xFF, 0x8D, 0x4B, 0x0C, 0xFF, 0x92, 0x50, 0x0E, 0xFF, 0x98, 0x56, + 0x11, 0xFF, 0x9F, 0x5F, 0x19, 0xFF, 0xA4, 0x66, 0x1F, 0xFF, 0xA6, 0x68, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA4, 0x67, 0x1F, 0xFF, 0x9C, 0x68, + 0x27, 0xFF, 0xC5, 0xB2, 0x9A, 0xFF, 0xE4, 0xE5, 0xE6, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xD4, 0xD0, + 0xC9, 0xFF, 0x88, 0x78, 0x57, 0xFF, 0x8C, 0x7A, 0x58, 0xFF, 0xD7, 0xD3, 0xCC, 0xFF, 0xDC, 0xDA, + 0xD7, 0xFF, 0xA1, 0x8F, 0x70, 0xFF, 0x7F, 0x5A, 0x22, 0xFF, 0x8D, 0x5C, 0x1C, 0xFF, 0x9D, 0x65, + 0x20, 0xFF, 0xA5, 0x68, 0x20, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, + 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA7, 0x69, 0x21, 0xFF, 0xA6, 0x68, 0x1E, 0xFF, 0xA3, 0x62, + 0x16, 0xFF, 0x9F, 0x5D, 0x12, 0xFF, 0x9E, 0x5B, 0x11, 0xFF, 0x9B, 0x59, 0x10, 0xFF, 0x9F, 0x61, + 0x1F, 0xFF, 0xBA, 0x8D, 0x5D, 0xF1, 0xDC, 0xC4, 0xAA, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0xBB, 0x9E, 0x34, 0xB1, 0x81, 0x51, 0xEB, 0x91, 0x51, + 0x18, 0xFF, 0x8C, 0x49, 0x0C, 0xFF, 0x91, 0x4F, 0x0D, 0xFF, 0x98, 0x57, 0x13, 0xFF, 0xA1, 0x62, + 0x1D, 0xFF, 0xA6, 0x69, 0x23, 0xFF, 0xA9, 0x6B, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAA, 0x6E, 0x24, 0xFF, 0xA5, 0x6A, + 0x22, 0xFF, 0xA2, 0x73, 0x37, 0xFF, 0xCE, 0xC2, 0xB2, 0xFF, 0xE0, 0xE1, 0xE2, 0xFF, 0xDE, 0xDE, + 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDD, 0xDE, + 0xDE, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE3, 0xE4, 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE8, 0xE8, + 0xE9, 0xFF, 0xDD, 0xDB, 0xD8, 0xFF, 0x98, 0x8B, 0x6F, 0xFF, 0x81, 0x6E, 0x48, 0xFF, 0xC8, 0xC0, + 0xB4, 0xFF, 0xE3, 0xE3, 0xE2, 0xFF, 0xB6, 0xAA, 0x96, 0xFF, 0x85, 0x66, 0x35, 0xFF, 0x8A, 0x5D, + 0x1E, 0xFF, 0x9D, 0x67, 0x23, 0xFF, 0xA7, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6E, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAB, 0x6D, 0x24, 0xFF, 0xAB, 0x6E, 0x25, 0xFF, 0xAA, 0x6C, + 0x23, 0xFF, 0xA6, 0x66, 0x1A, 0xFF, 0xA1, 0x5F, 0x13, 0xFF, 0x9E, 0x5C, 0x11, 0xFF, 0xA1, 0x61, + 0x1B, 0xFF, 0xB8, 0x88, 0x54, 0xF9, 0xD6, 0xB9, 0x99, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBD, 0x9F, 0x47, 0xAF, 0x7D, 0x4B, 0xF1, 0x92, 0x52, + 0x15, 0xFF, 0x90, 0x4C, 0x0C, 0xFF, 0x98, 0x56, 0x13, 0xFF, 0xA2, 0x64, 0x21, 0xFF, 0xA7, 0x6B, + 0x26, 0xFF, 0xAA, 0x6D, 0x27, 0xFF, 0xAC, 0x6F, 0x27, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAD, 0x71, + 0x28, 0xFF, 0xA6, 0x6C, 0x24, 0xFF, 0xA9, 0x81, 0x4C, 0xFF, 0xD2, 0xCC, 0xC3, 0xFF, 0xDB, 0xDC, + 0xDD, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xD8, 0xD6, 0xD3, 0xFF, 0xB4, 0xA6, 0x8F, 0xFF, 0xBD, 0xB0, + 0x99, 0xFF, 0xE0, 0xDE, 0xDC, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xE2, 0xE1, 0xE0, 0xFF, 0xAA, 0xA0, 0x8A, 0xFF, 0x80, 0x6D, + 0x45, 0xFF, 0xB9, 0xB0, 0x9E, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xC8, 0xC1, 0xB6, 0xFF, 0x92, 0x79, + 0x50, 0xFF, 0x87, 0x5F, 0x22, 0xFF, 0x9B, 0x68, 0x25, 0xFF, 0xA8, 0x6E, 0x27, 0xFF, 0xAC, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xAE, 0x71, + 0x28, 0xFF, 0xAD, 0x70, 0x27, 0xFF, 0xA9, 0x69, 0x1E, 0xFF, 0xA2, 0x5F, 0x12, 0xFF, 0xA2, 0x62, + 0x18, 0xFF, 0xB7, 0x86, 0x4E, 0xFE, 0xD5, 0xB6, 0x93, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBC, 0x9E, 0x53, 0xB0, 0x7C, 0x48, 0xF5, 0x94, 0x52, + 0x14, 0xFF, 0x97, 0x54, 0x13, 0xFF, 0xA2, 0x65, 0x24, 0xFF, 0xA8, 0x6C, 0x29, 0xFF, 0xAB, 0x6F, + 0x2A, 0xFF, 0xAE, 0x72, 0x2A, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xAF, 0x74, 0x2B, 0xFF, 0xA7, 0x6F, 0x28, 0xFF, 0xB0, 0x8F, 0x62, 0xFF, 0xD3, 0xD0, + 0xCC, 0xFF, 0xD6, 0xD6, 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xC3, 0xBE, 0xB2, 0xFF, 0x80, 0x68, 0x3A, 0xFF, 0x8F, 0x73, + 0x44, 0xFF, 0xDA, 0xD3, 0xCA, 0xFF, 0xDF, 0xE0, 0xE2, 0xFF, 0xDF, 0xE0, 0xE1, 0xFF, 0xE2, 0xE3, + 0xE3, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xBD, 0xB7, + 0xA8, 0xFF, 0x89, 0x79, 0x54, 0xFF, 0xAF, 0xA4, 0x8E, 0xFF, 0xDE, 0xDE, 0xDD, 0xFF, 0xD5, 0xD3, + 0xCE, 0xFF, 0xA2, 0x90, 0x70, 0xFF, 0x87, 0x63, 0x2B, 0xFF, 0x99, 0x69, 0x27, 0xFF, 0xA8, 0x71, + 0x2B, 0xFF, 0xAF, 0x74, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, 0x2B, 0xFF, 0xB1, 0x75, + 0x2B, 0xFF, 0xB1, 0x75, 0x2C, 0xFF, 0xB0, 0x74, 0x2B, 0xFF, 0xAA, 0x6B, 0x20, 0xFF, 0xA5, 0x64, + 0x19, 0xFF, 0xB8, 0x84, 0x4A, 0xFF, 0xD5, 0xB5, 0x91, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xBC, 0x9D, 0x59, 0xB1, 0x7C, 0x46, 0xF7, 0x9A, 0x59, + 0x1B, 0xFF, 0xA1, 0x64, 0x26, 0xFF, 0xA8, 0x6C, 0x2C, 0xFF, 0xAC, 0x70, 0x2C, 0xFF, 0xAF, 0x73, + 0x2D, 0xFF, 0xB1, 0x76, 0x2E, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB2, 0x78, 0x2E, 0xFF, 0xA9, 0x73, 0x2D, 0xFF, 0xB9, 0x9F, + 0x7D, 0xFF, 0xD5, 0xD5, 0xD4, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xD4, 0xD2, 0xCE, 0xFF, 0xAA, 0x9F, 0x87, 0xFF, 0xA2, 0x91, + 0x6F, 0xFF, 0xBD, 0xB1, 0x99, 0xFF, 0xD2, 0xCB, 0xBC, 0xFF, 0xC9, 0xC0, 0xAF, 0xFF, 0xCD, 0xC5, + 0xB7, 0xFF, 0xDE, 0xDB, 0xD5, 0xFF, 0xE2, 0xE1, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE3, 0xE3, + 0xE4, 0xFF, 0xCC, 0xC8, 0xBD, 0xFF, 0x95, 0x86, 0x66, 0xFF, 0xA7, 0x9B, 0x81, 0xFF, 0xDA, 0xD8, + 0xD5, 0xFF, 0xDC, 0xDC, 0xDB, 0xFF, 0xB3, 0xA7, 0x91, 0xFF, 0x8C, 0x6D, 0x39, 0xFF, 0x96, 0x6A, + 0x29, 0xFF, 0xA9, 0x74, 0x2E, 0xFF, 0xB1, 0x78, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB4, 0x79, + 0x2F, 0xFF, 0xB4, 0x79, 0x2F, 0xFF, 0xB3, 0x78, 0x2F, 0xFF, 0xB1, 0x76, 0x2E, 0xFF, 0xAD, 0x6F, + 0x27, 0xFF, 0xB9, 0x86, 0x4A, 0xFF, 0xD6, 0xB6, 0x90, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xBD, 0x9D, 0x57, 0xB5, 0x82, 0x4D, 0xF7, 0xA5, 0x69, + 0x2F, 0xFF, 0xA8, 0x6C, 0x2E, 0xFF, 0xAC, 0x71, 0x30, 0xFF, 0xB0, 0x75, 0x31, 0xFF, 0xB3, 0x78, + 0x32, 0xFF, 0xB5, 0x7B, 0x32, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7E, 0x33, 0xFF, 0xB8, 0x82, 0x3C, 0xFF, 0xB4, 0x89, + 0x4D, 0xFF, 0xC7, 0xB6, 0x9F, 0xFF, 0xD7, 0xD8, 0xD8, 0xFF, 0xD6, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDB, 0xD9, + 0xD5, 0xFF, 0xA9, 0x99, 0x79, 0xFF, 0xAD, 0x9B, 0x78, 0xFF, 0xD1, 0xCA, 0xB9, 0xFF, 0xBB, 0xB0, + 0x99, 0xFF, 0x9D, 0x89, 0x63, 0xFF, 0xAE, 0xA1, 0x85, 0xFF, 0xDF, 0xDE, 0xDC, 0xFF, 0xE0, 0xE0, + 0xE0, 0xFF, 0xE2, 0xE2, 0xE3, 0xFF, 0xD5, 0xD3, 0xCD, 0xFF, 0xA0, 0x95, 0x79, 0xFF, 0xA3, 0x96, + 0x79, 0xFF, 0xD6, 0xD4, 0xCF, 0xFF, 0xE0, 0xE0, 0xE2, 0xFF, 0xC5, 0xBD, 0xAF, 0xFF, 0x95, 0x7B, + 0x4D, 0xFF, 0x96, 0x6C, 0x2D, 0xFF, 0xAB, 0x77, 0x32, 0xFF, 0xB5, 0x7C, 0x33, 0xFF, 0xB7, 0x7D, + 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, 0x33, 0xFF, 0xB8, 0x7D, + 0x33, 0xFF, 0xB7, 0x7D, 0x33, 0xFF, 0xB7, 0x7C, 0x33, 0xFF, 0xB5, 0x7B, 0x32, 0xFF, 0xB5, 0x7C, + 0x37, 0xFF, 0xC0, 0x90, 0x57, 0xFF, 0xD7, 0xB7, 0x92, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xC0, 0xA1, 0x4F, 0xBF, 0x90, 0x5E, 0xF4, 0xAD, 0x74, + 0x3A, 0xFF, 0xAC, 0x71, 0x32, 0xFF, 0xB0, 0x76, 0x34, 0xFF, 0xB4, 0x7A, 0x35, 0xFF, 0xB7, 0x7D, + 0x36, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xC0, 0x8B, 0x46, 0xFF, 0xC4, 0x93, 0x53, 0xFF, 0xC0, 0x91, + 0x52, 0xFF, 0xBA, 0x93, 0x5E, 0xFF, 0xD0, 0xC4, 0xB5, 0xFF, 0xDB, 0xDB, 0xDC, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xD9, 0xD9, 0xD9, 0xFF, 0xDD, 0xDE, + 0xDF, 0xFF, 0xC0, 0xB9, 0xA6, 0xFF, 0xAA, 0x9B, 0x7B, 0xFF, 0xD6, 0xD0, 0xC4, 0xFF, 0xDF, 0xDD, + 0xD8, 0xFF, 0xA3, 0x95, 0x74, 0xFF, 0xAA, 0x9F, 0x85, 0xFF, 0xDA, 0xDA, 0xD8, 0xFF, 0xDD, 0xDD, + 0xDE, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE1, 0xE2, 0xE2, 0xFF, 0xDC, 0xDB, 0xD8, 0xFF, 0xAE, 0xA5, + 0x8E, 0xFF, 0xA2, 0x95, 0x78, 0xFF, 0xD3, 0xD0, 0xC8, 0xFF, 0xE1, 0xE2, 0xE3, 0xFF, 0xD3, 0xCE, + 0xC4, 0xFF, 0xA3, 0x8B, 0x61, 0xFF, 0x9F, 0x74, 0x34, 0xFF, 0xB3, 0x7D, 0x36, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x81, + 0x37, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBA, 0x80, 0x37, 0xFF, 0xB8, 0x7F, 0x36, 0xFF, 0xB9, 0x81, + 0x3D, 0xFF, 0xC8, 0x9B, 0x66, 0xFF, 0xDB, 0xBD, 0x9A, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xC3, 0xA4, 0x40, 0xC4, 0x99, 0x68, 0xEF, 0xB2, 0x7A, + 0x40, 0xFF, 0xB0, 0x75, 0x36, 0xFF, 0xB4, 0x7A, 0x38, 0xFF, 0xB7, 0x7E, 0x39, 0xFF, 0xBA, 0x81, + 0x3A, 0xFF, 0xBC, 0x83, 0x3A, 0xFF, 0xBD, 0x84, 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBE, 0x85, + 0x3C, 0xFF, 0xC3, 0x8F, 0x4B, 0xFF, 0xC9, 0x98, 0x5A, 0xFF, 0xC9, 0x99, 0x5A, 0xFF, 0xC8, 0x98, + 0x5A, 0xFF, 0xC2, 0x95, 0x58, 0xFF, 0xC0, 0x9E, 0x6F, 0xFF, 0xD8, 0xD1, 0xC5, 0xFF, 0xDE, 0xDF, + 0xE0, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE0, 0xE0, + 0xDF, 0xFF, 0xC5, 0xBF, 0xB0, 0xFF, 0xD6, 0xD2, 0xC8, 0xFF, 0xB3, 0xA8, 0x8D, 0xFF, 0xD3, 0xCE, + 0xC2, 0xFF, 0xDF, 0xDE, 0xDD, 0xFF, 0xDB, 0xDB, 0xD9, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDA, 0xDA, + 0xDA, 0xFF, 0xDD, 0xDD, 0xDD, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE2, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, + 0xE1, 0xFF, 0xBD, 0xB7, 0xA6, 0xFF, 0xA4, 0x99, 0x7C, 0xFF, 0xD1, 0xCD, 0xC2, 0xFF, 0xE2, 0xE3, + 0xE5, 0xFF, 0xD9, 0xD4, 0xCB, 0xFF, 0xA6, 0x84, 0x4E, 0xFF, 0xB1, 0x7E, 0x38, 0xFF, 0xBD, 0x84, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBD, 0x85, + 0x3B, 0xFF, 0xBE, 0x85, 0x3B, 0xFF, 0xBD, 0x85, 0x3B, 0xFF, 0xBC, 0x83, 0x3A, 0xFF, 0xBD, 0x87, + 0x42, 0xFF, 0xCD, 0xA2, 0x6E, 0xFD, 0xDE, 0xC1, 0x9E, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xC4, 0xA4, 0x2B, 0xCB, 0xA0, 0x70, 0xE5, 0xB8, 0x81, + 0x47, 0xFF, 0xB4, 0x7A, 0x3A, 0xFF, 0xB7, 0x7E, 0x3C, 0xFF, 0xBB, 0x82, 0x3D, 0xFF, 0xBD, 0x85, + 0x3D, 0xFF, 0xBF, 0x87, 0x3E, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC5, 0x92, + 0x4D, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xCD, 0x9E, 0x62, 0xFF, 0xCD, 0x9E, 0x61, 0xFF, 0xCD, 0x9E, + 0x61, 0xFF, 0xCC, 0x9E, 0x61, 0xFF, 0xC5, 0x9A, 0x5E, 0xFF, 0xC7, 0xA9, 0x7F, 0xFF, 0xDE, 0xDA, + 0xD4, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE2, + 0xE0, 0xFF, 0xC4, 0xBE, 0xAC, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0xD9, 0xD6, 0xCE, 0xFF, 0xB3, 0xA7, + 0x8C, 0xFF, 0xD4, 0xCF, 0xC4, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDD, 0xDD, 0xDC, 0xFF, 0xDD, 0xDD, + 0xDD, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xDE, 0xDE, 0xDE, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xCD, 0xC8, 0xBC, 0xFF, 0xAA, 0xA1, 0x86, 0xFF, 0xD1, 0xCD, + 0xC2, 0xFF, 0xE5, 0xE3, 0xE0, 0xFF, 0xB3, 0x93, 0x62, 0xFF, 0xB4, 0x81, 0x3B, 0xFF, 0xC0, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC1, 0x89, + 0x3F, 0xFF, 0xC1, 0x89, 0x3F, 0xFF, 0xC0, 0x89, 0x3F, 0xFF, 0xBF, 0x87, 0x3E, 0xFF, 0xC1, 0x8D, + 0x4A, 0xFF, 0xD1, 0xA9, 0x77, 0xF7, 0xE2, 0xCA, 0xA9, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xCA, 0xAA, 0x17, 0xD0, 0xA8, 0x7B, 0xCE, 0xBE, 0x8A, + 0x51, 0xFF, 0xB8, 0x7F, 0x3F, 0xFF, 0xBB, 0x82, 0x3F, 0xFF, 0xBE, 0x86, 0x41, 0xFF, 0xC1, 0x89, + 0x42, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC3, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC7, 0x91, 0x4A, 0xFF, 0xCE, 0xA0, + 0x63, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xD0, 0xA3, + 0x68, 0xFF, 0xD0, 0xA3, 0x68, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xC8, 0x9E, 0x65, 0xFF, 0xCD, 0xB5, + 0x91, 0xFF, 0xE4, 0xE2, 0xDF, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE6, 0xFF, 0xC0, 0xB6, 0xA0, 0xFF, 0xBB, 0xAD, 0x90, 0xFF, 0xD9, 0xD4, 0xCB, 0xFF, 0xD6, 0xD2, + 0xC8, 0xFF, 0xB6, 0xA8, 0x8A, 0xFF, 0xC0, 0xB2, 0x97, 0xFF, 0xD2, 0xCC, 0xBF, 0xFF, 0xDF, 0xE0, + 0xE0, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE3, 0xE3, + 0xE3, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE8, 0xE9, 0xE9, 0xFF, 0xD9, 0xD7, 0xCF, 0xFF, 0xBB, 0xB2, + 0x9B, 0xFF, 0xD7, 0xCC, 0xB9, 0xFF, 0xB6, 0x90, 0x57, 0xFF, 0xBC, 0x88, 0x41, 0xFF, 0xC3, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC4, 0x8D, + 0x43, 0xFF, 0xC4, 0x8D, 0x43, 0xFF, 0xC3, 0x8C, 0x43, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC7, 0x94, + 0x53, 0xFF, 0xD6, 0xB0, 0x81, 0xED, 0xE8, 0xD2, 0xB5, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xEC, 0xDE, 0x09, 0xD6, 0xB1, 0x86, 0xAC, 0xC4, 0x93, + 0x5C, 0xFF, 0xBC, 0x84, 0x45, 0xFF, 0xBF, 0x87, 0x44, 0xFF, 0xC2, 0x8B, 0x46, 0xFF, 0xC4, 0x8D, + 0x46, 0xFF, 0xC5, 0x8F, 0x47, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xCE, 0x9F, 0x5F, 0xFF, 0xD3, 0xA9, + 0x6F, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, + 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD3, 0xA8, 0x6E, 0xFF, 0xD2, 0xA8, 0x6E, 0xFF, 0xCB, 0xA4, + 0x6D, 0xFF, 0xD4, 0xC0, 0xA3, 0xFF, 0xE8, 0xE7, 0xE6, 0xFF, 0xE9, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xE9, 0xFF, 0xB8, 0xB0, 0x98, 0xFF, 0x9C, 0x8C, 0x64, 0xFF, 0xC4, 0xBB, 0xA8, 0xFF, 0xE3, 0xE2, + 0xE0, 0xFF, 0xB0, 0xA3, 0x85, 0xFF, 0xA2, 0x8E, 0x62, 0xFF, 0xC3, 0xB9, 0xA5, 0xFF, 0xE2, 0xE2, + 0xE3, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE2, 0xE2, + 0xE2, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEA, 0xEA, 0xEB, 0xFF, 0xE6, 0xE3, + 0xDE, 0xFF, 0xC0, 0xAC, 0x88, 0xFF, 0xB4, 0x89, 0x49, 0xFF, 0xC1, 0x8E, 0x46, 0xFF, 0xC7, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC8, 0x91, + 0x48, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xC7, 0x91, 0x48, 0xFF, 0xC7, 0x90, 0x48, 0xFF, 0xCD, 0x9D, + 0x5F, 0xFF, 0xDB, 0xB8, 0x8C, 0xD5, 0xE8, 0xD3, 0xB7, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xB8, 0x8D, 0x7E, 0xCD, 0x9F, + 0x69, 0xFF, 0xC2, 0x8B, 0x4D, 0xFF, 0xC3, 0x8B, 0x48, 0xFF, 0xC5, 0x8F, 0x4A, 0xFF, 0xC8, 0x92, + 0x4B, 0xFF, 0xCA, 0x94, 0x4B, 0xFF, 0xCC, 0x95, 0x4C, 0xFF, 0xCC, 0x96, 0x4C, 0xFF, 0xCC, 0x96, + 0x4C, 0xFF, 0xCC, 0x96, 0x4B, 0xFF, 0xCE, 0x9B, 0x55, 0xFF, 0xD6, 0xAC, 0x72, 0xFF, 0xD7, 0xAE, + 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, + 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD7, 0xAE, 0x75, 0xFF, 0xD5, 0xAC, + 0x74, 0xFF, 0xCF, 0xAA, 0x77, 0xFF, 0xDB, 0xCC, 0xB4, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEC, 0xEC, + 0xED, 0xFF, 0xE1, 0xDF, 0xDA, 0xFF, 0xD1, 0xCD, 0xC1, 0xFF, 0xE3, 0xE2, 0xDE, 0xFF, 0xE7, 0xE6, + 0xE6, 0xFF, 0xD5, 0xD2, 0xC9, 0xFF, 0xBD, 0xB6, 0xA2, 0xFF, 0xC2, 0xBD, 0xAC, 0xFF, 0xE5, 0xE5, + 0xE4, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xDD, 0xDA, + 0xD0, 0xFF, 0xB9, 0xA9, 0x85, 0xFF, 0xB8, 0x96, 0x5F, 0xFF, 0xBA, 0x8D, 0x48, 0xFF, 0xC4, 0x92, + 0x4B, 0xFF, 0xCA, 0x95, 0x4C, 0xFF, 0xCB, 0x96, 0x4C, 0xFF, 0xCC, 0x96, 0x4C, 0xFF, 0xCC, 0x96, + 0x4C, 0xFF, 0xCC, 0x96, 0x4C, 0xFF, 0xCB, 0x95, 0x4C, 0xFF, 0xCB, 0x96, 0x4F, 0xFF, 0xD4, 0xA8, + 0x6D, 0xFF, 0xDC, 0xBC, 0x93, 0xAD, 0xC5, 0xBC, 0xAE, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0xC5, 0xA0, 0x48, 0xD4, 0xAA, + 0x76, 0xF2, 0xC9, 0x94, 0x57, 0xFF, 0xC7, 0x8F, 0x4C, 0xFF, 0xCA, 0x93, 0x4E, 0xFF, 0xCC, 0x96, + 0x4F, 0xFF, 0xCE, 0x98, 0x4F, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xD0, 0x9A, 0x50, 0xFF, 0xCF, 0x9A, + 0x50, 0xFF, 0xD0, 0x9A, 0x50, 0xFF, 0xD5, 0xA7, 0x66, 0xFF, 0xDB, 0xB3, 0x7C, 0xFF, 0xDB, 0xB3, + 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, + 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, 0x7B, 0xFF, 0xDB, 0xB3, + 0x7B, 0xFF, 0xD8, 0xB1, 0x7A, 0xFF, 0xD2, 0xB1, 0x80, 0xFF, 0xDF, 0xD4, 0xC0, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE4, 0xE4, 0xE3, 0xFF, 0xE8, 0xE8, + 0xE8, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEF, 0xEF, 0xED, 0xFF, 0xE6, 0xE5, + 0xDF, 0xFF, 0xC3, 0xBB, 0xA2, 0xFF, 0xC7, 0xB8, 0x99, 0xFF, 0xB7, 0x99, 0x64, 0xFF, 0xB7, 0x8E, + 0x4B, 0xFF, 0xC5, 0x96, 0x4F, 0xFF, 0xCD, 0x99, 0x50, 0xFF, 0xCF, 0x9A, 0x50, 0xFF, 0xD0, 0x9A, + 0x50, 0xFF, 0xD0, 0x9A, 0x50, 0xFF, 0xCF, 0x99, 0x50, 0xFF, 0xD0, 0x9D, 0x58, 0xFF, 0xDB, 0xB2, + 0x7D, 0xFE, 0xDF, 0xC2, 0x9C, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD3, 0xB3, 0x1A, 0xDB, 0xB5, + 0x85, 0xCF, 0xD0, 0x9E, 0x63, 0xFF, 0xCB, 0x94, 0x52, 0xFF, 0xCD, 0x97, 0x51, 0xFF, 0xCF, 0x9A, + 0x52, 0xFF, 0xD1, 0x9C, 0x53, 0xFF, 0xD2, 0x9E, 0x54, 0xFF, 0xD3, 0x9F, 0x54, 0xFF, 0xD3, 0x9F, + 0x54, 0xFF, 0xD4, 0xA0, 0x56, 0xFF, 0xDB, 0xB2, 0x76, 0xFF, 0xDE, 0xB9, 0x82, 0xFF, 0xDE, 0xB8, + 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, + 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDE, 0xB8, + 0x81, 0xFF, 0xDE, 0xB8, 0x81, 0xFF, 0xDB, 0xB6, 0x80, 0xFF, 0xD6, 0xB7, 0x89, 0xFF, 0xE4, 0xDB, + 0xCC, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, + 0xEF, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xED, 0xEC, 0xEC, 0xFF, 0xE8, 0xE8, 0xE4, 0xFF, 0xEC, 0xEC, 0xE9, 0xFF, 0xEE, 0xEF, + 0xEF, 0xFF, 0xEB, 0xEA, 0xE7, 0xFF, 0xD3, 0xCE, 0xBC, 0xFF, 0xD2, 0xC9, 0xB2, 0xFF, 0xBE, 0xA5, + 0x77, 0xFF, 0xBD, 0x94, 0x52, 0xFF, 0xCD, 0x9C, 0x53, 0xFF, 0xD2, 0x9F, 0x54, 0xFF, 0xD3, 0x9F, + 0x54, 0xFF, 0xD3, 0x9E, 0x54, 0xFF, 0xD2, 0x9E, 0x55, 0xFF, 0xD6, 0xA6, 0x65, 0xFF, 0xE0, 0xBC, + 0x8C, 0xEC, 0xD8, 0xC1, 0xA2, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xE1, 0xBF, + 0x91, 0x8D, 0xD7, 0xAA, 0x73, 0xFF, 0xD0, 0x9B, 0x5A, 0xFF, 0xD1, 0x9B, 0x55, 0xFF, 0xD3, 0x9E, + 0x57, 0xFF, 0xD4, 0xA0, 0x58, 0xFF, 0xD5, 0xA2, 0x58, 0xFF, 0xD6, 0xA3, 0x58, 0xFF, 0xD6, 0xA3, + 0x58, 0xFF, 0xD8, 0xA6, 0x5F, 0xFF, 0xE0, 0xBA, 0x82, 0xFF, 0xE1, 0xBD, 0x88, 0xFF, 0xE1, 0xBD, + 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, + 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, + 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xE1, 0xBD, 0x87, 0xFF, 0xDE, 0xBA, 0x85, 0xFF, 0xD9, 0xBD, + 0x92, 0xFF, 0xE7, 0xE0, 0xD3, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, + 0xF1, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xED, + 0xED, 0xFF, 0xE7, 0xE7, 0xE2, 0xFF, 0xEB, 0xEB, 0xE8, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xF1, 0xF2, 0xF2, 0xFF, 0xF0, 0xEF, 0xED, 0xFF, 0xDC, 0xD8, 0xCC, 0xFF, 0xE0, 0xD8, + 0xC7, 0xFF, 0xC1, 0xA0, 0x67, 0xFF, 0xCD, 0x9E, 0x56, 0xFF, 0xD5, 0xA3, 0x58, 0xFF, 0xD6, 0xA3, + 0x58, 0xFF, 0xD6, 0xA3, 0x58, 0xFF, 0xD6, 0xA4, 0x5C, 0xFF, 0xDD, 0xB2, 0x76, 0xFF, 0xE3, 0xC4, + 0x98, 0xBB, 0xD5, 0xC3, 0xAE, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xCB, + 0xA1, 0x41, 0xDE, 0xB6, 0x82, 0xEC, 0xD6, 0xA4, 0x67, 0xFF, 0xD4, 0x9F, 0x5B, 0xFF, 0xD6, 0xA1, + 0x5B, 0xFF, 0xD7, 0xA4, 0x5C, 0xFF, 0xD9, 0xA6, 0x5D, 0xFF, 0xDA, 0xA7, 0x5D, 0xFF, 0xDA, 0xA7, + 0x5C, 0xFF, 0xDC, 0xAD, 0x67, 0xFF, 0xE4, 0xC0, 0x8B, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, + 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, + 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, + 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE5, 0xC1, 0x8E, 0xFF, 0xE4, 0xC1, 0x8E, 0xFF, 0xE0, 0xBF, + 0x8C, 0xFF, 0xDC, 0xC3, 0x9A, 0xFF, 0xEA, 0xE4, 0xD9, 0xFF, 0xF4, 0xF5, 0xF5, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEA, 0xEA, + 0xE6, 0xFF, 0xED, 0xED, 0xEB, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF2, 0xFF, 0xF2, 0xF2, + 0xF1, 0xFF, 0xE0, 0xDD, 0xD2, 0xFF, 0xEE, 0xED, 0xE9, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xE9, 0xE3, + 0xD7, 0xFF, 0xC9, 0xA7, 0x6D, 0xFF, 0xD2, 0xA3, 0x5B, 0xFF, 0xD9, 0xA7, 0x5D, 0xFF, 0xDA, 0xA7, + 0x5D, 0xFF, 0xDA, 0xA7, 0x5D, 0xFF, 0xDB, 0xAC, 0x67, 0xFF, 0xE3, 0xBE, 0x88, 0xFC, 0xE7, 0xCC, + 0xA3, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD7, + 0xBA, 0x0C, 0xE3, 0xBF, 0x8F, 0xAE, 0xDD, 0xB1, 0x77, 0xFF, 0xD8, 0xA5, 0x62, 0xFF, 0xD9, 0xA5, + 0x5F, 0xFF, 0xDA, 0xA8, 0x60, 0xFF, 0xDB, 0xAA, 0x61, 0xFF, 0xDC, 0xAB, 0x61, 0xFF, 0xDD, 0xAB, + 0x60, 0xFF, 0xDF, 0xB2, 0x6D, 0xFF, 0xE8, 0xC5, 0x92, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, + 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, + 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, + 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE8, 0xC7, 0x94, 0xFF, 0xE7, 0xC7, + 0x94, 0xFF, 0xE3, 0xC3, 0x91, 0xFF, 0xE0, 0xC9, 0xA0, 0xFF, 0xED, 0xE7, 0xDC, 0xFF, 0xF6, 0xF6, + 0xF7, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF3, 0xF3, + 0xF3, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF4, 0xF3, 0xF3, 0xFF, 0xF0, 0xF0, 0xEE, 0xFF, 0xF2, 0xF2, + 0xF0, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xE3, 0xE2, + 0xD9, 0xFF, 0xCB, 0xC7, 0xB3, 0xFF, 0xF2, 0xF1, 0xEE, 0xFF, 0xF3, 0xF2, 0xF0, 0xFF, 0xD9, 0xC5, + 0xA1, 0xFF, 0xCE, 0xA4, 0x61, 0xFF, 0xDA, 0xAA, 0x61, 0xFF, 0xDD, 0xAB, 0x61, 0xFF, 0xDD, 0xAB, + 0x61, 0xFF, 0xDD, 0xAC, 0x64, 0xFF, 0xE2, 0xB7, 0x79, 0xFF, 0xE8, 0xC8, 0x99, 0xD5, 0xE3, 0xCD, + 0xAD, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0xC3, 0x99, 0x4F, 0xE4, 0xBC, 0x87, 0xF2, 0xDD, 0xAE, 0x6F, 0xFF, 0xDC, 0xA9, + 0x63, 0xFF, 0xDD, 0xAB, 0x63, 0xFF, 0xDE, 0xAD, 0x65, 0xFF, 0xDF, 0xAE, 0x65, 0xFF, 0xDF, 0xAE, + 0x64, 0xFF, 0xE2, 0xB5, 0x70, 0xFF, 0xEA, 0xCA, 0x96, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xEA, 0xCB, + 0x99, 0xFF, 0xEA, 0xCB, 0x99, 0xFF, 0xE6, 0xC8, 0x97, 0xFF, 0xE3, 0xCC, 0xA5, 0xFF, 0xEE, 0xE7, + 0xDC, 0xFF, 0xF7, 0xF7, 0xF8, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, + 0xF7, 0xFF, 0xF4, 0xF3, 0xF1, 0xFF, 0xF5, 0xF4, 0xF2, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF7, 0xF7, 0xF7, 0xFF, 0xF0, 0xEF, + 0xEC, 0xFF, 0xF2, 0xF1, 0xEE, 0xFF, 0xF8, 0xF8, 0xF7, 0xFF, 0xDF, 0xCF, 0xAF, 0xFF, 0xCD, 0xA6, + 0x65, 0xFF, 0xDA, 0xAC, 0x64, 0xFF, 0xDF, 0xAF, 0x65, 0xFF, 0xE0, 0xAF, 0x65, 0xFF, 0xE0, 0xAF, + 0x66, 0xFF, 0xE1, 0xB4, 0x6F, 0xFF, 0xE8, 0xC3, 0x8D, 0xFE, 0xE9, 0xCE, 0xA4, 0x7C, 0x36, 0xA7, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xDF, 0xCB, 0xAE, 0x0C, 0xE8, 0xC5, 0x94, 0xA8, 0xE4, 0xB9, 0x81, 0xFF, 0xE0, 0xAE, + 0x6C, 0xFF, 0xDF, 0xAE, 0x67, 0xFF, 0xE1, 0xB0, 0x68, 0xFF, 0xE2, 0xB2, 0x69, 0xFF, 0xE2, 0xB2, + 0x68, 0xFF, 0xE4, 0xB7, 0x71, 0xFF, 0xEB, 0xCC, 0x99, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, + 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xEC, 0xCE, 0x9F, 0xFF, 0xE9, 0xCC, 0x9D, 0xFF, 0xE5, 0xCE, + 0xA6, 0xFF, 0xEE, 0xE6, 0xD6, 0xFF, 0xF8, 0xF8, 0xF7, 0xFF, 0xF9, 0xFA, 0xFB, 0xFF, 0xF3, 0xF0, + 0xEA, 0xFF, 0xE2, 0xD4, 0xB8, 0xFF, 0xE7, 0xDB, 0xC3, 0xFF, 0xF7, 0xF6, 0xF3, 0xFF, 0xF8, 0xF9, + 0xF9, 0xFF, 0xF9, 0xF9, 0xF9, 0xFF, 0xF1, 0xF0, 0xEB, 0xFF, 0xF0, 0xEF, 0xEA, 0xFF, 0xF9, 0xFA, + 0xFA, 0xFF, 0xFA, 0xFA, 0xF9, 0xFF, 0xEB, 0xE2, 0xCF, 0xFF, 0xD5, 0xB4, 0x7A, 0xFF, 0xDC, 0xAF, + 0x67, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE3, 0xB3, 0x69, 0xFF, 0xE2, 0xB3, 0x69, 0xFF, 0xE3, 0xB4, + 0x6D, 0xFF, 0xE7, 0xBF, 0x82, 0xFF, 0xEC, 0xCD, 0x9D, 0xCF, 0xE7, 0xD2, 0xB1, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xCB, 0xA0, 0x3B, 0xEA, 0xC4, 0x90, 0xE3, 0xE5, 0xB9, + 0x7C, 0xFF, 0xE2, 0xB2, 0x6D, 0xFF, 0xE3, 0xB3, 0x6C, 0xFF, 0xE4, 0xB5, 0x6D, 0xFF, 0xE5, 0xB6, + 0x6D, 0xFF, 0xE6, 0xB8, 0x71, 0xFF, 0xED, 0xCD, 0x98, 0xFF, 0xF0, 0xD3, 0xA5, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, + 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEF, 0xD2, 0xA4, 0xFF, 0xEC, 0xD0, + 0xA2, 0xFF, 0xE9, 0xD0, 0xA5, 0xFF, 0xED, 0xDE, 0xC3, 0xFF, 0xF1, 0xE8, 0xD7, 0xFF, 0xE7, 0xD4, + 0xB2, 0xFF, 0xE6, 0xCD, 0xA0, 0xFF, 0xE7, 0xCE, 0xA2, 0xFF, 0xEC, 0xDD, 0xC0, 0xFF, 0xF8, 0xF6, + 0xF1, 0xFF, 0xFA, 0xFA, 0xFA, 0xFF, 0xDC, 0xDA, 0xCA, 0xFF, 0xE7, 0xE6, 0xDC, 0xFF, 0xFB, 0xFB, + 0xFB, 0xFF, 0xEF, 0xE7, 0xD7, 0xFF, 0xE2, 0xCB, 0xA1, 0xFF, 0xE1, 0xB8, 0x76, 0xFF, 0xE4, 0xB6, + 0x6D, 0xFF, 0xE5, 0xB7, 0x6E, 0xFF, 0xE5, 0xB7, 0x6E, 0xFF, 0xE5, 0xB7, 0x6F, 0xFF, 0xE7, 0xBD, + 0x7C, 0xFF, 0xED, 0xCB, 0x96, 0xF6, 0xEC, 0xD3, 0xA9, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xDD, 0xE8, 0x02, 0xEC, 0xCC, 0x9C, 0x79, 0xEA, 0xC4, + 0x8D, 0xFB, 0xE6, 0xBA, 0x7A, 0xFF, 0xE6, 0xB6, 0x70, 0xFF, 0xE6, 0xB7, 0x70, 0xFF, 0xE7, 0xB9, + 0x71, 0xFF, 0xE7, 0xB9, 0x71, 0xFF, 0xED, 0xCA, 0x91, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, 0xA9, 0xFF, 0xF1, 0xD6, + 0xA8, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xEE, 0xD3, 0xA7, 0xFF, 0xED, 0xD3, 0xA8, 0xFF, 0xEE, 0xD3, + 0xA7, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xF0, 0xD5, 0xA8, 0xFF, 0xEB, 0xD2, 0xA7, 0xFF, 0xED, 0xDC, + 0xBC, 0xFF, 0xF8, 0xF5, 0xED, 0xFF, 0xF8, 0xF8, 0xF6, 0xFF, 0xFB, 0xFB, 0xFA, 0xFF, 0xF2, 0xEB, + 0xDD, 0xFF, 0xE5, 0xD2, 0xAD, 0xFF, 0xE9, 0xCC, 0x9A, 0xFF, 0xE7, 0xBB, 0x74, 0xFF, 0xE8, 0xBA, + 0x71, 0xFF, 0xE8, 0xBA, 0x71, 0xFF, 0xE8, 0xBA, 0x72, 0xFF, 0xE9, 0xBE, 0x79, 0xFF, 0xED, 0xCA, + 0x91, 0xFF, 0xEF, 0xD3, 0xA5, 0xA5, 0xE9, 0xD8, 0xBC, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD3, 0xAE, 0x13, 0xEE, 0xCD, + 0x9A, 0xAD, 0xEC, 0xC5, 0x8D, 0xFF, 0xE9, 0xBC, 0x7B, 0xFF, 0xE8, 0xBA, 0x74, 0xFF, 0xE9, 0xBB, + 0x74, 0xFF, 0xE9, 0xBC, 0x73, 0xFF, 0xEC, 0xC4, 0x85, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD9, + 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD9, 0xAD, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xEE, 0xD6, + 0xAB, 0xFF, 0xEE, 0xDC, 0xBA, 0xFF, 0xF9, 0xF3, 0xEA, 0xFF, 0xF6, 0xF0, 0xE4, 0xFF, 0xE9, 0xD7, + 0xB2, 0xFF, 0xED, 0xD6, 0xAC, 0xFF, 0xED, 0xCB, 0x8F, 0xFF, 0xEA, 0xBD, 0x74, 0xFF, 0xEA, 0xBD, + 0x75, 0xFF, 0xEA, 0xBD, 0x75, 0xFF, 0xEB, 0xBF, 0x7A, 0xFF, 0xED, 0xCA, 0x8E, 0xFF, 0xF0, 0xD3, + 0xA2, 0xD0, 0xED, 0xD7, 0xB3, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEC, 0xD3, + 0xA9, 0x2B, 0xF0, 0xCE, 0x9A, 0xCB, 0xEE, 0xC8, 0x8D, 0xFF, 0xEB, 0xBF, 0x7D, 0xFF, 0xEB, 0xBE, + 0x78, 0xFF, 0xEB, 0xBE, 0x77, 0xFF, 0xEC, 0xC1, 0x7B, 0xFF, 0xF2, 0xD4, 0xA1, 0xFF, 0xF4, 0xDC, + 0xB3, 0xFF, 0xF4, 0xDB, 0xB1, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDB, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, + 0xB2, 0xFF, 0xF4, 0xDB, 0xB2, 0xFF, 0xF4, 0xDC, 0xB1, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF4, 0xDB, + 0xB2, 0xFF, 0xF1, 0xD9, 0xB0, 0xFF, 0xF1, 0xDD, 0xB8, 0xFF, 0xF0, 0xDC, 0xB8, 0xFF, 0xF0, 0xDA, + 0xB1, 0xFF, 0xF2, 0xD8, 0xAA, 0xFF, 0xED, 0xC4, 0x81, 0xFF, 0xEC, 0xBF, 0x78, 0xFF, 0xEC, 0xC0, + 0x79, 0xFF, 0xEC, 0xC2, 0x7D, 0xFF, 0xEF, 0xCB, 0x8E, 0xFF, 0xF2, 0xD4, 0xA1, 0xE5, 0xF0, 0xD8, + 0xAF, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF2, 0xD5, 0xA6, 0x3B, 0xF1, 0xD0, 0x9B, 0xD6, 0xEF, 0xCA, 0x8F, 0xFF, 0xEE, 0xC2, + 0x80, 0xFF, 0xED, 0xC1, 0x7B, 0xFF, 0xED, 0xC1, 0x7A, 0xFF, 0xF1, 0xCB, 0x8C, 0xFF, 0xF6, 0xDD, + 0xB3, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF6, 0xDF, + 0xB6, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF5, 0xDE, 0xB5, 0xFF, 0xF5, 0xDE, 0xB6, 0xFF, 0xF5, 0xDE, + 0xB6, 0xFF, 0xF2, 0xD1, 0x97, 0xFF, 0xEE, 0xC3, 0x7B, 0xFF, 0xEE, 0xC3, 0x7C, 0xFF, 0xEF, 0xC5, + 0x80, 0xFF, 0xF1, 0xCD, 0x8F, 0xFF, 0xF3, 0xD5, 0xA1, 0xED, 0xF3, 0xD9, 0xAD, 0x61, 0xD5, 0xE7, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xD6, 0xA8, 0x47, 0xF3, 0xD3, 0x9E, 0xDB, 0xF2, 0xCD, + 0x92, 0xFF, 0xF0, 0xC7, 0x84, 0xFF, 0xEF, 0xC4, 0x7F, 0xFF, 0xF0, 0xC5, 0x7F, 0xFF, 0xF4, 0xD4, + 0x9F, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, + 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE1, 0xBA, 0xFF, 0xF7, 0xE2, 0xBB, 0xFF, 0xF5, 0xDA, + 0xA9, 0xFF, 0xF1, 0xC9, 0x83, 0xFF, 0xF0, 0xC7, 0x7F, 0xFF, 0xF1, 0xC9, 0x84, 0xFF, 0xF3, 0xCF, + 0x92, 0xFF, 0xF5, 0xD7, 0xA3, 0xF1, 0xF4, 0xDA, 0xAF, 0x6F, 0xE5, 0xE4, 0xDD, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xD8, 0xA9, 0x45, 0xF4, 0xD5, + 0xA0, 0xD3, 0xF3, 0xD1, 0x97, 0xFF, 0xF2, 0xCB, 0x8A, 0xFF, 0xF1, 0xC8, 0x82, 0xFF, 0xF2, 0xCB, + 0x86, 0xFF, 0xF6, 0xDB, 0xAB, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, 0xBE, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, + 0xBD, 0xFF, 0xF8, 0xE4, 0xBD, 0xFF, 0xF8, 0xE4, 0xBF, 0xFF, 0xF7, 0xDF, 0xB3, 0xFF, 0xF3, 0xCE, + 0x8D, 0xFF, 0xF2, 0xCA, 0x82, 0xFF, 0xF3, 0xCD, 0x89, 0xFF, 0xF5, 0xD2, 0x98, 0xFF, 0xF6, 0xD8, + 0xA5, 0xE9, 0xF5, 0xDC, 0xB0, 0x6A, 0xEA, 0xE5, 0xDB, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0xDB, + 0xAF, 0x35, 0xF5, 0xD7, 0xA3, 0xBD, 0xF5, 0xD4, 0x9D, 0xFE, 0xF4, 0xCF, 0x91, 0xFF, 0xF3, 0xCB, + 0x87, 0xFF, 0xF4, 0xCE, 0x8C, 0xFF, 0xF7, 0xDD, 0xAE, 0xFF, 0xF9, 0xE6, 0xC1, 0xFF, 0xF9, 0xE6, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, 0xC0, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF9, 0xE6, 0xC1, 0xFF, 0xF8, 0xE1, 0xB6, 0xFF, 0xF5, 0xD1, 0x93, 0xFF, 0xF4, 0xCC, + 0x87, 0xFF, 0xF5, 0xD0, 0x91, 0xFF, 0xF6, 0xD6, 0x9E, 0xFF, 0xF7, 0xDA, 0xA8, 0xD5, 0xF6, 0xDD, + 0xB3, 0x52, 0xEC, 0xED, 0xF2, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF3, 0xDC, 0xB4, 0x1D, 0xF5, 0xD8, 0xA7, 0x90, 0xF7, 0xD8, 0xA2, 0xF0, 0xF6, 0xD4, + 0x9A, 0xFF, 0xF5, 0xD0, 0x8F, 0xFF, 0xF5, 0xD0, 0x8F, 0xFF, 0xF8, 0xDC, 0xAC, 0xFF, 0xFA, 0xE6, + 0xC2, 0xFF, 0xFB, 0xE7, 0xC5, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, + 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFB, 0xE7, 0xC4, 0xFF, 0xFA, 0xE7, + 0xC4, 0xFF, 0xF9, 0xE0, 0xB3, 0xFF, 0xF6, 0xD3, 0x94, 0xFF, 0xF5, 0xD0, 0x8E, 0xFF, 0xF7, 0xD5, + 0x9A, 0xFF, 0xF8, 0xDA, 0xA4, 0xF9, 0xF8, 0xDC, 0xAC, 0xAF, 0xF8, 0xE0, 0xB4, 0x32, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0xDA, 0xC4, 0x08, 0xF5, 0xDA, 0xAB, 0x51, 0xF7, 0xD9, + 0xA6, 0xC2, 0xF8, 0xD9, 0xA2, 0xFC, 0xF8, 0xD6, 0x9A, 0xFF, 0xF7, 0xD3, 0x94, 0xFF, 0xF8, 0xD9, + 0xA3, 0xFF, 0xFB, 0xE4, 0xBD, 0xFF, 0xFC, 0xE8, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE9, + 0xC8, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFC, 0xE9, 0xC9, 0xFF, 0xFB, 0xE6, 0xC1, 0xFF, 0xF9, 0xDD, + 0xAA, 0xFF, 0xF7, 0xD5, 0x96, 0xFF, 0xF8, 0xD6, 0x99, 0xFF, 0xF8, 0xDA, 0xA4, 0xFF, 0xF9, 0xDC, + 0xA9, 0xD6, 0xF8, 0xDE, 0xB0, 0x6D, 0xF7, 0xE5, 0xC5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xDC, + 0xB6, 0x1A, 0xF7, 0xDC, 0xAB, 0x74, 0xF9, 0xDC, 0xA8, 0xD2, 0xF9, 0xDA, 0xA4, 0xFC, 0xF8, 0xD8, + 0x9E, 0xFF, 0xF9, 0xD8, 0x9F, 0xFF, 0xFA, 0xDF, 0xAF, 0xFF, 0xFB, 0xE6, 0xC0, 0xFF, 0xFC, 0xEA, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE7, 0xC3, 0xFF, 0xFB, 0xE1, 0xB4, 0xFF, 0xF9, 0xDA, 0xA2, 0xFF, 0xF9, 0xD9, + 0x9E, 0xFF, 0xF9, 0xDB, 0xA5, 0xFF, 0xF9, 0xDD, 0xAB, 0xE1, 0xF8, 0xDE, 0xAF, 0x8E, 0xF8, 0xE2, + 0xB9, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDE, 0xB5, 0x21, 0xF8, 0xDD, 0xAD, 0x6E, 0xF9, 0xDD, + 0xAA, 0xBE, 0xFA, 0xDC, 0xA7, 0xEF, 0xFA, 0xDB, 0xA4, 0xFF, 0xFA, 0xDC, 0xA6, 0xFF, 0xFB, 0xE0, + 0xAF, 0xFF, 0xFB, 0xE4, 0xBB, 0xFF, 0xFC, 0xE8, 0xC3, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEB, + 0xCC, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, 0xCE, 0xFF, 0xFC, 0xEB, 0xCD, 0xFF, 0xFC, 0xEB, + 0xCC, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xE9, 0xC5, 0xFF, 0xFB, 0xE5, 0xBD, 0xFF, 0xFB, 0xE1, + 0xB2, 0xFF, 0xFA, 0xDD, 0xA8, 0xFF, 0xFA, 0xDC, 0xA5, 0xFF, 0xFA, 0xDD, 0xA8, 0xF5, 0xF9, 0xDE, + 0xAC, 0xCE, 0xF9, 0xDE, 0xB0, 0x83, 0xF6, 0xE0, 0xB7, 0x31, 0xE6, 0xE4, 0xDF, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xE1, + 0xBD, 0x12, 0xFA, 0xE3, 0xB8, 0x44, 0xFB, 0xE0, 0xB0, 0x84, 0xFB, 0xDF, 0xAE, 0xBB, 0xFB, 0xDE, + 0xAB, 0xE2, 0xFB, 0xDE, 0xAA, 0xF4, 0xFB, 0xDF, 0xAC, 0xFD, 0xFB, 0xE1, 0xB0, 0xFF, 0xFB, 0xE2, + 0xB3, 0xFF, 0xFB, 0xE3, 0xB6, 0xFF, 0xFB, 0xE3, 0xB7, 0xFF, 0xFB, 0xE3, 0xB6, 0xFF, 0xFB, 0xE2, + 0xB4, 0xFF, 0xFB, 0xE1, 0xB1, 0xFF, 0xFB, 0xE0, 0xAE, 0xFF, 0xFB, 0xDF, 0xAB, 0xF6, 0xFB, 0xDF, + 0xAC, 0xE8, 0xFB, 0xE0, 0xB0, 0xC6, 0xFB, 0xE1, 0xB1, 0x92, 0xFB, 0xE3, 0xB8, 0x52, 0xF7, 0xE3, + 0xBE, 0x1B, 0xA5, 0xE6, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEA, 0xC9, 0x0F, 0xFC, 0xE3, + 0xB5, 0x29, 0xFB, 0xE1, 0xB3, 0x4D, 0xFB, 0xE0, 0xAF, 0x6C, 0xFB, 0xE0, 0xAD, 0x89, 0xFB, 0xE0, + 0xAE, 0x9C, 0xFB, 0xE0, 0xAE, 0xA6, 0xFB, 0xE0, 0xAF, 0xAB, 0xFB, 0xE0, 0xAE, 0xA8, 0xFB, 0xE0, + 0xAE, 0x9F, 0xFB, 0xE0, 0xAE, 0x8F, 0xFB, 0xE1, 0xAF, 0x74, 0xFB, 0xE2, 0xB4, 0x55, 0xFC, 0xE3, + 0xB7, 0x32, 0xFC, 0xE8, 0xC3, 0x14, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xEC, + 0xCE, 0x06, 0xFD, 0xE8, 0xC0, 0x09, 0xFC, 0xE6, 0xBC, 0x0B, 0xFC, 0xE8, 0xC0, 0x0A, 0xFD, 0xEC, + 0xCB, 0x07, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x7F, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xC0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xE0, + 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, + 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFE, + 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, + 0xC0, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFC, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x80, 0x00, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFC, 0x0F, 0xFF, 0xFF, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x60, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x25, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, + 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, + 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, + 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x21, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, + 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, + 0x0C, 0x21, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, + 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, + 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, + 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, + 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x30, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, + 0x0C, 0x41, 0x82, 0x44, 0x0C, 0x42, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, + 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x46, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, + 0x0C, 0x43, 0x82, 0x44, 0x0C, 0x41, 0x82, 0x44, 0x0C, 0x3F, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, + 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x36, 0x82, 0x44, 0x0C, 0x32, 0x82, 0x44, 0x0C, 0x2D, 0x82, 0x44, + 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, 0x0C, 0x16, 0x82, 0x44, + 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x05, 0x82, 0x44, 0x0C, 0x02, 0x81, 0x43, + 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, + 0x0C, 0x41, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x57, 0x82, 0x44, + 0x0C, 0x5C, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x65, 0x82, 0x44, 0x0C, 0x68, 0x82, 0x44, + 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x6D, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, 0x0B, 0x6F, 0x82, 0x43, + 0x0B, 0x70, 0x82, 0x44, 0x0B, 0x70, 0x82, 0x44, 0x0C, 0x70, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, + 0x0C, 0x6E, 0x82, 0x44, 0x0C, 0x6C, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, 0x0C, 0x66, 0x82, 0x44, + 0x0C, 0x63, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x53, 0x82, 0x44, + 0x0C, 0x4C, 0x82, 0x44, 0x0C, 0x44, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x2F, 0x82, 0x44, + 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, + 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x59, 0x82, 0x44, + 0x0C, 0x67, 0x82, 0x44, 0x0C, 0x71, 0x82, 0x44, 0x0C, 0x79, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, + 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x8A, 0x81, 0x43, 0x0A, 0x8D, 0x81, 0x42, 0x09, 0x8F, 0x81, 0x43, + 0x0A, 0x91, 0x83, 0x45, 0x0D, 0x94, 0x85, 0x49, 0x12, 0x98, 0x87, 0x4B, 0x14, 0x9A, 0x87, 0x4B, + 0x14, 0x9B, 0x87, 0x4B, 0x14, 0x9B, 0x85, 0x48, 0x12, 0x99, 0x83, 0x45, 0x0D, 0x96, 0x81, 0x42, + 0x0A, 0x94, 0x81, 0x42, 0x09, 0x92, 0x81, 0x43, 0x0A, 0x90, 0x82, 0x44, 0x0C, 0x8E, 0x82, 0x44, + 0x0C, 0x8B, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, 0x0C, 0x82, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, + 0x0C, 0x74, 0x82, 0x44, 0x0C, 0x6B, 0x82, 0x44, 0x0C, 0x5E, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, + 0x0C, 0x3C, 0x82, 0x44, 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x17, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, + 0x0C, 0x04, 0x8B, 0x51, 0x1D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x4E, + 0x18, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x2F, 0x82, 0x44, 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x62, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x44, + 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x90, 0x82, 0x44, 0x0C, 0x98, 0x82, 0x43, 0x0B, 0x9E, 0x81, 0x43, + 0x0A, 0xA2, 0x84, 0x47, 0x0F, 0xA8, 0x8B, 0x52, 0x1E, 0xB2, 0x92, 0x5F, 0x32, 0xC1, 0x96, 0x67, + 0x40, 0xD0, 0x97, 0x6B, 0x48, 0xDB, 0x98, 0x6E, 0x4E, 0xE5, 0x97, 0x6E, 0x4F, 0xEA, 0x97, 0x6E, + 0x50, 0xEB, 0x99, 0x70, 0x51, 0xEA, 0x9A, 0x70, 0x50, 0xE5, 0x99, 0x6D, 0x4A, 0xDB, 0x98, 0x69, + 0x42, 0xD0, 0x93, 0x5F, 0x32, 0xC2, 0x8A, 0x51, 0x1D, 0xB4, 0x83, 0x46, 0x0E, 0xAB, 0x81, 0x42, + 0x0A, 0xA7, 0x82, 0x43, 0x0B, 0xA4, 0x82, 0x44, 0x0C, 0xA1, 0x82, 0x44, 0x0C, 0x9B, 0x82, 0x44, + 0x0C, 0x94, 0x82, 0x44, 0x0C, 0x8A, 0x82, 0x44, 0x0C, 0x7C, 0x82, 0x44, 0x0C, 0x69, 0x82, 0x44, + 0x0C, 0x51, 0x82, 0x44, 0x0C, 0x38, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, + 0x0C, 0x06, 0x83, 0x45, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x52, + 0x1D, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x1C, 0x82, 0x44, + 0x0C, 0x34, 0x82, 0x44, 0x0C, 0x4F, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x80, 0x82, 0x44, + 0x0C, 0x90, 0x82, 0x44, 0x0B, 0x9B, 0x81, 0x43, 0x0A, 0xA1, 0x88, 0x4D, 0x17, 0xAD, 0x93, 0x60, + 0x33, 0xC6, 0x97, 0x6A, 0x47, 0xE1, 0x92, 0x68, 0x4A, 0xF3, 0x89, 0x5F, 0x43, 0xFC, 0x81, 0x57, + 0x3C, 0xFF, 0x7C, 0x51, 0x37, 0xFF, 0x79, 0x4D, 0x33, 0xFF, 0x78, 0x4C, 0x32, 0xFF, 0x79, 0x4D, + 0x33, 0xFF, 0x7A, 0x4F, 0x35, 0xFF, 0x7E, 0x54, 0x3A, 0xFF, 0x83, 0x5A, 0x40, 0xFF, 0x8A, 0x61, + 0x48, 0xFF, 0x92, 0x6B, 0x50, 0xFC, 0x9A, 0x71, 0x54, 0xF3, 0x9B, 0x70, 0x4D, 0xE1, 0x93, 0x60, + 0x33, 0xC7, 0x87, 0x4B, 0x14, 0xB2, 0x81, 0x43, 0x0A, 0xA9, 0x82, 0x44, 0x0C, 0xA5, 0x82, 0x44, + 0x0C, 0x9E, 0x82, 0x44, 0x0C, 0x94, 0x82, 0x44, 0x0C, 0x86, 0x82, 0x44, 0x0C, 0x72, 0x82, 0x44, + 0x0C, 0x59, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x23, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x06, 0x82, 0x44, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x4B, + 0x14, 0x01, 0x82, 0x44, 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x18, 0x82, 0x44, + 0x0C, 0x2D, 0x82, 0x44, 0x0C, 0x45, 0x82, 0x44, 0x0C, 0x5D, 0x82, 0x44, 0x0C, 0x71, 0x81, 0x42, + 0x0A, 0x7E, 0x87, 0x4B, 0x14, 0x8F, 0x95, 0x64, 0x39, 0xBB, 0x95, 0x6A, 0x49, 0xE7, 0x87, 0x5C, + 0x3F, 0xFC, 0x77, 0x4A, 0x2E, 0xFF, 0x6F, 0x40, 0x24, 0xFF, 0x6C, 0x3C, 0x21, 0xFF, 0x6D, 0x3D, + 0x21, 0xFF, 0x6E, 0x3F, 0x22, 0xFF, 0x70, 0x41, 0x24, 0xFF, 0x72, 0x43, 0x26, 0xFF, 0x74, 0x45, + 0x27, 0xFF, 0x75, 0x46, 0x29, 0xFF, 0x76, 0x48, 0x2B, 0xFF, 0x77, 0x49, 0x2C, 0xFF, 0x78, 0x4A, + 0x2E, 0xFF, 0x7A, 0x4D, 0x31, 0xFF, 0x7F, 0x53, 0x38, 0xFF, 0x89, 0x5F, 0x44, 0xFF, 0x96, 0x6E, + 0x53, 0xFC, 0x9E, 0x75, 0x55, 0xE7, 0x96, 0x65, 0x3A, 0xBD, 0x85, 0x49, 0x12, 0x98, 0x81, 0x42, + 0x0A, 0x8D, 0x82, 0x44, 0x0C, 0x85, 0x82, 0x44, 0x0C, 0x77, 0x82, 0x44, 0x0C, 0x65, 0x82, 0x44, + 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, + 0x0C, 0x05, 0x84, 0x46, 0x0F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x11, 0x82, 0x44, + 0x0C, 0x1F, 0x82, 0x44, 0x0C, 0x30, 0x81, 0x43, 0x0B, 0x42, 0x82, 0x44, 0x0C, 0x50, 0x95, 0x62, + 0x35, 0x81, 0x98, 0x6C, 0x4A, 0xD0, 0x85, 0x59, 0x3B, 0xFB, 0x71, 0x41, 0x24, 0xFF, 0x69, 0x37, + 0x1A, 0xFF, 0x69, 0x37, 0x19, 0xFF, 0x6C, 0x3A, 0x1B, 0xFF, 0x6F, 0x3D, 0x1D, 0xFF, 0x72, 0x40, + 0x1F, 0xFF, 0x75, 0x43, 0x21, 0xFF, 0x77, 0x45, 0x23, 0xFF, 0x79, 0x47, 0x25, 0xFF, 0x7B, 0x49, + 0x26, 0xFF, 0x7C, 0x4B, 0x28, 0xFF, 0x7D, 0x4C, 0x29, 0xFF, 0x7D, 0x4D, 0x2B, 0xFF, 0x7E, 0x4E, + 0x2C, 0xFF, 0x7D, 0x4E, 0x2D, 0xFF, 0x7D, 0x4E, 0x2E, 0xFF, 0x7C, 0x4E, 0x30, 0xFF, 0x7F, 0x52, + 0x34, 0xFF, 0x88, 0x5D, 0x41, 0xFF, 0x98, 0x71, 0x55, 0xFA, 0xA1, 0x77, 0x56, 0xCF, 0x93, 0x5F, + 0x30, 0x87, 0x81, 0x43, 0x0A, 0x61, 0x82, 0x43, 0x0B, 0x57, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, + 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x25, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, + 0x0C, 0x04, 0x8C, 0x54, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0D, 0x01, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x10, 0x80, 0x40, 0x07, 0x19, 0x8C, 0x51, 0x1C, 0x28, 0x9F, 0x74, 0x50, 0x80, 0x8E, 0x62, + 0x42, 0xE7, 0x73, 0x41, 0x22, 0xFF, 0x64, 0x30, 0x12, 0xFF, 0x63, 0x2E, 0x0E, 0xFF, 0x66, 0x31, + 0x0F, 0xFF, 0x6A, 0x34, 0x11, 0xFF, 0x6E, 0x37, 0x13, 0xFF, 0x72, 0x3B, 0x14, 0xFF, 0x75, 0x3F, + 0x17, 0xFF, 0x79, 0x43, 0x1A, 0xFF, 0x7C, 0x47, 0x1E, 0xFF, 0x7F, 0x4A, 0x21, 0xFF, 0x82, 0x4D, + 0x24, 0xFF, 0x83, 0x4F, 0x27, 0xFF, 0x84, 0x50, 0x29, 0xFF, 0x85, 0x51, 0x2A, 0xFF, 0x85, 0x52, + 0x2B, 0xFF, 0x84, 0x52, 0x2D, 0xFF, 0x84, 0x52, 0x2E, 0xFF, 0x83, 0x52, 0x2F, 0xFF, 0x82, 0x52, + 0x30, 0xFF, 0x80, 0x51, 0x31, 0xFF, 0x83, 0x55, 0x37, 0xFF, 0x90, 0x65, 0x49, 0xFF, 0xA2, 0x7B, + 0x5E, 0xE5, 0xA3, 0x79, 0x54, 0x80, 0x86, 0x49, 0x12, 0x34, 0x81, 0x42, 0x09, 0x28, 0x82, 0x44, + 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x05, 0x83, 0x46, + 0x0F, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x45, 0x0D, 0x01, 0x83, 0x45, 0x0D, 0x03, 0x73, 0x2D, + 0x00, 0x05, 0xA6, 0x79, 0x50, 0x12, 0xA3, 0x7B, 0x5C, 0x86, 0x84, 0x55, 0x34, 0xF5, 0x66, 0x31, + 0x10, 0xFF, 0x5E, 0x27, 0x06, 0xFF, 0x61, 0x29, 0x05, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x69, 0x2F, + 0x07, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x70, 0x34, 0x08, 0xFF, 0x73, 0x37, 0x08, 0xFF, 0x75, 0x39, + 0x09, 0xFF, 0x77, 0x3B, 0x0A, 0xFF, 0x79, 0x3D, 0x0C, 0xFF, 0x7C, 0x3F, 0x0E, 0xFF, 0x7E, 0x43, + 0x12, 0xFF, 0x81, 0x47, 0x17, 0xFF, 0x85, 0x4D, 0x1D, 0xFF, 0x88, 0x52, 0x24, 0xFF, 0x8A, 0x55, + 0x29, 0xFF, 0x8B, 0x57, 0x2C, 0xFF, 0x8B, 0x57, 0x2D, 0xFF, 0x8A, 0x57, 0x2E, 0xFF, 0x89, 0x56, + 0x2F, 0xFF, 0x87, 0x55, 0x30, 0xFF, 0x85, 0x54, 0x30, 0xFF, 0x84, 0x54, 0x33, 0xFF, 0x8B, 0x5E, + 0x3F, 0xFF, 0x9F, 0x78, 0x5B, 0xF1, 0xAE, 0x89, 0x6B, 0x80, 0x94, 0x5E, 0x2D, 0x16, 0x7D, 0x3C, + 0x01, 0x0C, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCA, 0xAB, + 0x8F, 0x09, 0xA5, 0x7E, 0x5F, 0x84, 0x81, 0x51, 0x2F, 0xF9, 0x65, 0x2E, 0x0C, 0xFF, 0x61, 0x29, + 0x06, 0xFF, 0x65, 0x2C, 0x06, 0xFF, 0x69, 0x30, 0x07, 0xFF, 0x6B, 0x32, 0x07, 0xFF, 0x6E, 0x34, + 0x07, 0xFF, 0x74, 0x39, 0x09, 0xFF, 0x79, 0x3C, 0x09, 0xFF, 0x7B, 0x3E, 0x0A, 0xFF, 0x7D, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0A, 0xFF, 0x7F, 0x40, 0x0A, 0xFF, 0x7F, 0x41, 0x0A, 0xFF, 0x80, 0x41, + 0x0A, 0xFF, 0x80, 0x41, 0x0A, 0xFF, 0x80, 0x42, 0x0B, 0xFF, 0x82, 0x44, 0x0E, 0xFF, 0x84, 0x48, + 0x13, 0xFF, 0x89, 0x4F, 0x1C, 0xFF, 0x8C, 0x55, 0x25, 0xFF, 0x8F, 0x5A, 0x2C, 0xFF, 0x8F, 0x5B, + 0x2E, 0xFF, 0x8D, 0x5A, 0x2F, 0xFF, 0x8B, 0x59, 0x30, 0xFF, 0x89, 0x58, 0x31, 0xFF, 0x87, 0x56, + 0x32, 0xFF, 0x8B, 0x5D, 0x3B, 0xFF, 0xA0, 0x78, 0x59, 0xF6, 0xB4, 0x91, 0x75, 0x79, 0xAB, 0x7F, + 0x56, 0x07, 0x63, 0x16, 0x00, 0x02, 0x85, 0x48, 0x11, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFA, 0x03, 0xAC, 0x86, + 0x68, 0x76, 0x85, 0x54, 0x31, 0xF7, 0x67, 0x2F, 0x0B, 0xFF, 0x64, 0x2B, 0x06, 0xFF, 0x69, 0x2F, + 0x07, 0xFF, 0x6D, 0x33, 0x08, 0xFF, 0x6A, 0x32, 0x05, 0xFF, 0x6E, 0x3E, 0x14, 0xFF, 0x70, 0x43, + 0x19, 0xFF, 0x6D, 0x38, 0x07, 0xFF, 0x7C, 0x40, 0x0B, 0xFF, 0x82, 0x43, 0x0B, 0xFF, 0x83, 0x44, + 0x0B, 0xFF, 0x84, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x46, + 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x46, 0x0C, 0xFF, 0x85, 0x45, 0x0C, 0xFF, 0x85, 0x45, + 0x0B, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x85, 0x47, 0x0E, 0xFF, 0x89, 0x4C, 0x15, 0xFF, 0x8E, 0x55, + 0x21, 0xFF, 0x91, 0x5B, 0x2B, 0xFF, 0x92, 0x5D, 0x2F, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8D, 0x5A, + 0x31, 0xFF, 0x8A, 0x58, 0x31, 0xFF, 0x8E, 0x5E, 0x3A, 0xFF, 0xA3, 0x7B, 0x5B, 0xF2, 0xBA, 0x99, + 0x7D, 0x67, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x91, 0x74, 0x52, 0x8D, 0x5E, + 0x3A, 0xEE, 0x6B, 0x33, 0x0E, 0xFF, 0x68, 0x2D, 0x06, 0xFF, 0x6D, 0x31, 0x07, 0xFF, 0x71, 0x35, + 0x08, 0xFF, 0x6A, 0x33, 0x06, 0xFF, 0x77, 0x51, 0x2C, 0xFF, 0xA8, 0x97, 0x83, 0xFF, 0xC1, 0xB6, + 0xA8, 0xFF, 0x83, 0x63, 0x40, 0xFF, 0x6E, 0x3B, 0x08, 0xFF, 0x7F, 0x44, 0x0B, 0xFF, 0x87, 0x47, + 0x0C, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, 0x0D, 0xFF, 0x89, 0x49, + 0x0D, 0xFF, 0x88, 0x48, 0x0D, 0xFF, 0x88, 0x48, 0x0C, 0xFF, 0x88, 0x47, 0x0C, 0xFF, 0x87, 0x48, + 0x0D, 0xFF, 0x8A, 0x4C, 0x13, 0xFF, 0x90, 0x56, 0x21, 0xFF, 0x94, 0x5D, 0x2C, 0xFF, 0x93, 0x5E, + 0x30, 0xFF, 0x90, 0x5C, 0x30, 0xFF, 0x8D, 0x5A, 0x31, 0xFF, 0x91, 0x62, 0x3D, 0xFF, 0xA9, 0x82, + 0x62, 0xE8, 0xC2, 0xA4, 0x8A, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xA4, 0x87, 0x25, 0x9A, 0x6E, 0x4A, 0xD1, 0x72, 0x3B, + 0x13, 0xFF, 0x6A, 0x2F, 0x07, 0xFF, 0x6F, 0x33, 0x08, 0xFF, 0x74, 0x38, 0x09, 0xFF, 0x6D, 0x36, + 0x06, 0xFF, 0x80, 0x5E, 0x3A, 0xFF, 0xD1, 0xCA, 0xC1, 0xFF, 0xD9, 0xD7, 0xD4, 0xFF, 0xB6, 0xB0, + 0xA4, 0xFF, 0xC7, 0xBE, 0xB3, 0xFF, 0x9D, 0x85, 0x69, 0xFF, 0x72, 0x43, 0x11, 0xFF, 0x7D, 0x44, + 0x0A, 0xFF, 0x88, 0x4A, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, + 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4B, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8C, 0x4F, 0x14, 0xFF, 0x92, 0x59, + 0x24, 0xFF, 0x95, 0x5F, 0x2F, 0xFF, 0x93, 0x5E, 0x30, 0xFF, 0x8F, 0x5C, 0x31, 0xFF, 0x98, 0x69, + 0x43, 0xFF, 0xB2, 0x8D, 0x6D, 0xC7, 0xCD, 0xB1, 0x99, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0xF1, 0xE4, 0x04, 0xAB, 0x83, 0x61, 0x92, 0x81, 0x4B, 0x23, 0xFF, 0x6C, 0x31, + 0x08, 0xFF, 0x71, 0x34, 0x08, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x71, 0x39, 0x07, 0xFF, 0x7F, 0x5B, + 0x35, 0xFF, 0xD3, 0xCC, 0xC3, 0xFF, 0xE7, 0xE6, 0xE7, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xDE, 0xDC, + 0xD9, 0xFF, 0xAE, 0xA6, 0x98, 0xFF, 0xB8, 0xB0, 0xA3, 0xFF, 0xB4, 0xA4, 0x8F, 0xFF, 0x7A, 0x52, + 0x24, 0xFF, 0x79, 0x43, 0x09, 0xFF, 0x88, 0x4B, 0x0D, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0E, 0xFF, 0x8D, 0x4C, 0x0E, 0xFF, 0x8C, 0x4B, 0x0D, 0xFF, 0x8C, 0x4C, + 0x0F, 0xFF, 0x90, 0x54, 0x1A, 0xFF, 0x96, 0x5E, 0x2B, 0xFF, 0x95, 0x5F, 0x30, 0xFF, 0x92, 0x5F, + 0x33, 0xFF, 0xA2, 0x76, 0x50, 0xFF, 0xBD, 0x9B, 0x7D, 0x84, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xBE, 0x9C, 0x7D, 0x3C, 0x95, 0x65, 0x3D, 0xEA, 0x73, 0x37, 0x0D, 0xFF, 0x72, 0x35, + 0x08, 0xFF, 0x79, 0x3B, 0x09, 0xFF, 0x78, 0x3C, 0x08, 0xFF, 0x7A, 0x50, 0x25, 0xFF, 0xCC, 0xC2, + 0xB7, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE7, 0xE6, 0xE6, 0xFF, 0xE8, 0xE7, 0xE7, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xE6, 0xE5, 0xE4, 0xFF, 0xAF, 0xA8, 0x9B, 0xFF, 0xA3, 0x9A, 0x8A, 0xFF, 0xBF, 0xB5, + 0xA7, 0xFF, 0x89, 0x69, 0x42, 0xFF, 0x76, 0x43, 0x0A, 0xFF, 0x87, 0x4B, 0x0C, 0xFF, 0x8E, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, + 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x8F, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4D, 0x0D, 0xFF, 0x8F, 0x51, 0x13, 0xFF, 0x95, 0x5C, 0x25, 0xFF, 0x96, 0x60, + 0x2F, 0xFF, 0x98, 0x66, 0x39, 0xFF, 0xB0, 0x89, 0x65, 0xE2, 0xCB, 0xAE, 0x93, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x04, 0xAD, 0x84, 0x60, 0x9A, 0x83, 0x4B, 0x1F, 0xFF, 0x74, 0x36, 0x08, 0xFF, 0x7A, 0x3B, + 0x09, 0xFF, 0x80, 0x40, 0x0A, 0xFF, 0x80, 0x4B, 0x16, 0xFF, 0xC2, 0xB2, 0xA0, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xBA, 0xB4, 0xA9, 0xFF, 0x92, 0x86, + 0x71, 0xFF, 0xBE, 0xB5, 0xAA, 0xFF, 0x9D, 0x86, 0x69, 0xFF, 0x76, 0x49, 0x13, 0xFF, 0x83, 0x4A, + 0x0C, 0xFF, 0x8F, 0x50, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x93, 0x51, 0x0F, 0xFF, 0x93, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x90, 0x4F, 0x0E, 0xFF, 0x90, 0x50, 0x11, 0xFF, 0x94, 0x5A, + 0x21, 0xFF, 0x97, 0x61, 0x2F, 0xFF, 0xA5, 0x77, 0x4C, 0xFF, 0xC0, 0x9E, 0x7E, 0x8C, 0xFF, 0xFF, + 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xAE, + 0x91, 0x2B, 0x9E, 0x6D, 0x44, 0xE2, 0x7A, 0x3D, 0x0F, 0xFF, 0x7A, 0x3B, 0x09, 0xFF, 0x81, 0x41, + 0x0B, 0xFF, 0x86, 0x46, 0x0B, 0xFF, 0x8E, 0x57, 0x20, 0xFF, 0xD8, 0xCC, 0xBD, 0xFF, 0xED, 0xEE, + 0xEF, 0xFF, 0xEB, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF1, 0xF1, 0xFF, 0xCA, 0xC5, + 0xBD, 0xFF, 0x8B, 0x7D, 0x66, 0xFF, 0xB3, 0xAB, 0x9C, 0xFF, 0xB3, 0xA4, 0x90, 0xFF, 0x7D, 0x57, + 0x26, 0xFF, 0x7F, 0x4A, 0x0C, 0xFF, 0x90, 0x53, 0x10, 0xFF, 0x95, 0x55, 0x11, 0xFF, 0x96, 0x55, + 0x11, 0xFF, 0x95, 0x55, 0x11, 0xFF, 0x95, 0x55, 0x11, 0xFF, 0x95, 0x54, 0x10, 0xFF, 0x95, 0x54, + 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x95, 0x54, + 0x0F, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x94, 0x53, 0x0F, 0xFF, 0x93, 0x52, 0x0E, 0xFF, 0x91, 0x50, + 0x10, 0xFF, 0x94, 0x59, 0x1E, 0xFF, 0x9E, 0x69, 0x38, 0xFF, 0xB7, 0x90, 0x6A, 0xD9, 0xD2, 0xB7, + 0x9C, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x97, + 0x73, 0x6D, 0x90, 0x5A, 0x2B, 0xFE, 0x7B, 0x3C, 0x0A, 0xFF, 0x81, 0x41, 0x0A, 0xFF, 0x88, 0x47, + 0x0C, 0xFF, 0x8E, 0x4D, 0x0E, 0xFF, 0x8D, 0x4E, 0x0C, 0xFF, 0xA1, 0x76, 0x45, 0xFF, 0xE6, 0xE1, + 0xDA, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xEE, 0xEE, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF3, 0xF3, + 0xF4, 0xFF, 0xD9, 0xD7, 0xD2, 0xFF, 0x8F, 0x82, 0x6A, 0xFF, 0xA4, 0x9A, 0x87, 0xFF, 0xC5, 0xBC, + 0xB0, 0xFF, 0x8D, 0x70, 0x48, 0xFF, 0x7D, 0x4C, 0x10, 0xFF, 0x90, 0x55, 0x12, 0xFF, 0x98, 0x59, + 0x13, 0xFF, 0x9A, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x13, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x99, 0x59, + 0x13, 0xFF, 0x99, 0x59, 0x13, 0xFF, 0x99, 0x58, 0x12, 0xFF, 0x98, 0x57, 0x11, 0xFF, 0x98, 0x56, + 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x98, 0x56, 0x10, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x95, 0x53, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x97, 0x5B, 0x21, 0xFF, 0xAF, 0x81, 0x56, 0xFB, 0xCA, 0xAA, + 0x8A, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF9, 0xF0, 0xE2, 0x07, 0xB0, 0x85, + 0x5D, 0xAD, 0x88, 0x4C, 0x1A, 0xFF, 0x80, 0x3F, 0x0A, 0xFF, 0x87, 0x46, 0x0C, 0xFF, 0x8E, 0x4D, + 0x0D, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x97, 0x55, 0x10, 0xFF, 0x92, 0x54, 0x0F, 0xFF, 0xB4, 0x94, + 0x6C, 0xFF, 0xEC, 0xEB, 0xE9, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF3, 0xF3, 0xF4, 0xFF, 0xE5, 0xE4, 0xE2, 0xFF, 0x9D, 0x92, 0x7C, 0xFF, 0x96, 0x88, + 0x6E, 0xFF, 0xCE, 0xC8, 0xBE, 0xFF, 0xA3, 0x8E, 0x70, 0xFF, 0x7E, 0x53, 0x1A, 0xFF, 0x8D, 0x56, + 0x14, 0xFF, 0x9A, 0x5D, 0x17, 0xFF, 0x9D, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9E, 0x5E, + 0x17, 0xFF, 0x9E, 0x5E, 0x17, 0xFF, 0x9D, 0x5E, 0x17, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9C, 0x5B, + 0x14, 0xFF, 0x9B, 0x5A, 0x12, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x9A, 0x58, 0x11, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x96, 0x55, 0x0F, 0xFF, 0x93, 0x52, 0x10, 0xFF, 0xA4, 0x6F, 0x3A, 0xFF, 0xC0, 0x9D, + 0x79, 0x9E, 0x87, 0x96, 0xA1, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0xBD, 0xA2, 0x1E, 0xA8, 0x78, + 0x4B, 0xD9, 0x86, 0x47, 0x12, 0xFF, 0x86, 0x45, 0x0B, 0xFF, 0x8D, 0x4C, 0x0D, 0xFF, 0x93, 0x52, + 0x0E, 0xFF, 0x99, 0x57, 0x11, 0xFF, 0x9D, 0x5D, 0x15, 0xFF, 0x9F, 0x60, 0x19, 0xFF, 0x9A, 0x61, + 0x1E, 0xFF, 0xC4, 0xAE, 0x91, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xED, 0xED, + 0xED, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF0, 0xF0, 0xF1, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xB0, 0xA7, + 0x95, 0xFF, 0x8D, 0x7E, 0x60, 0xFF, 0xCC, 0xC5, 0xBB, 0xFF, 0xB9, 0xAD, 0x99, 0xFF, 0x85, 0x61, + 0x2E, 0xFF, 0x8B, 0x57, 0x16, 0xFF, 0x9C, 0x60, 0x1A, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA1, 0x62, + 0x1B, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0x9F, 0x5F, 0x16, 0xFF, 0x9D, 0x5C, 0x12, 0xFF, 0x9C, 0x5B, + 0x11, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x97, 0x55, 0x0F, 0xFF, 0x9C, 0x5F, 0x20, 0xFF, 0xBA, 0x91, + 0x67, 0xCE, 0xD0, 0xBB, 0xA6, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xAA, 0x88, 0x3C, 0xA3, 0x6F, + 0x3E, 0xF0, 0x87, 0x46, 0x0E, 0xFF, 0x8C, 0x49, 0x0C, 0xFF, 0x93, 0x51, 0x0E, 0xFF, 0x9A, 0x59, + 0x13, 0xFF, 0xA1, 0x62, 0x1B, 0xFF, 0xA5, 0x66, 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA3, 0x66, + 0x1D, 0xFF, 0xA0, 0x6C, 0x2D, 0xFF, 0xCF, 0xC0, 0xAD, 0xFF, 0xE6, 0xE7, 0xE8, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xC2, 0xBC, 0xAF, 0xFF, 0x8C, 0x7C, 0x5C, 0xFF, 0xBF, 0xB7, 0xA9, 0xFF, 0xCD, 0xC5, + 0xBA, 0xFF, 0x91, 0x76, 0x4C, 0xFF, 0x88, 0x59, 0x1B, 0xFF, 0x9C, 0x62, 0x1D, 0xFF, 0xA4, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA5, 0x67, + 0x1F, 0xFF, 0xA6, 0x67, 0x1F, 0xFF, 0xA5, 0x67, 0x1F, 0xFF, 0xA4, 0x65, 0x1C, 0xFF, 0xA1, 0x60, + 0x15, 0xFF, 0x9E, 0x5C, 0x12, 0xFF, 0x9B, 0x59, 0x10, 0xFF, 0x9B, 0x5B, 0x16, 0xFF, 0xB5, 0x87, + 0x54, 0xE9, 0xDA, 0xC1, 0xA5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xA2, 0x7C, 0x59, 0xA0, 0x68, + 0x34, 0xFC, 0x8B, 0x49, 0x0D, 0xFF, 0x92, 0x4F, 0x0E, 0xFF, 0x9B, 0x5B, 0x16, 0xFF, 0xA4, 0x66, + 0x20, 0xFF, 0xA8, 0x6B, 0x23, 0xFF, 0xAA, 0x6C, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xA6, 0x6A, 0x21, 0xFF, 0xA7, 0x7B, 0x42, 0xFF, 0xD4, 0xCD, 0xC1, 0xFF, 0xE0, 0xE1, + 0xE2, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDE, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, + 0xDF, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE9, 0xE9, 0xEA, 0xFF, 0xD0, 0xCC, 0xC4, 0xFF, 0x92, 0x82, 0x64, 0xFF, 0xB0, 0xA5, + 0x90, 0xFF, 0xD6, 0xD3, 0xCD, 0xFF, 0xA3, 0x90, 0x71, 0xFF, 0x89, 0x60, 0x25, 0xFF, 0x9B, 0x65, + 0x21, 0xFF, 0xA7, 0x6B, 0x23, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, + 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xAA, 0x6D, 0x24, 0xFF, 0xA9, 0x6C, + 0x22, 0xFF, 0xA6, 0x65, 0x1A, 0xFF, 0xA0, 0x5E, 0x12, 0xFF, 0x9E, 0x5C, 0x13, 0xFF, 0xB3, 0x81, + 0x4A, 0xF6, 0xD5, 0xB7, 0x95, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xA3, 0x7C, 0x6E, 0xA0, 0x65, + 0x2D, 0xFF, 0x90, 0x4D, 0x0D, 0xFF, 0x9C, 0x5B, 0x18, 0xFF, 0xA6, 0x69, 0x25, 0xFF, 0xAA, 0x6E, + 0x27, 0xFF, 0xAD, 0x70, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, + 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xA8, 0x6E, 0x25, 0xFF, 0xB0, 0x8B, 0x5B, 0xFF, 0xD5, 0xD1, + 0xCC, 0xFF, 0xDA, 0xDA, 0xDB, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDA, 0xDA, 0xDA, 0xFF, 0xDC, 0xDC, + 0xDD, 0xFF, 0xCA, 0xC3, 0xB9, 0xFF, 0xA9, 0x97, 0x79, 0xFF, 0xD6, 0xD0, 0xC8, 0xFF, 0xE0, 0xE1, + 0xE2, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE5, 0xE5, 0xE6, 0xFF, 0xD9, 0xD7, 0xD3, 0xFF, 0x9E, 0x91, + 0x76, 0xFF, 0xA6, 0x99, 0x80, 0xFF, 0xD7, 0xD5, 0xD1, 0xFF, 0xB6, 0xAA, 0x95, 0xFF, 0x8E, 0x6B, + 0x37, 0xFF, 0x99, 0x66, 0x24, 0xFF, 0xA9, 0x6F, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, + 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, 0x28, 0xFF, 0xAE, 0x72, + 0x28, 0xFF, 0xAE, 0x71, 0x28, 0xFF, 0xA9, 0x69, 0x1E, 0xFF, 0xA2, 0x60, 0x13, 0xFF, 0xB3, 0x7E, + 0x43, 0xFC, 0xD3, 0xB2, 0x8E, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9, 0xA3, 0x7B, 0x7A, 0xA2, 0x66, + 0x2B, 0xFF, 0x9A, 0x59, 0x1A, 0xFF, 0xA6, 0x6A, 0x29, 0xFF, 0xAC, 0x70, 0x2B, 0xFF, 0xAF, 0x73, + 0x2C, 0xFF, 0xB2, 0x76, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, + 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xAB, 0x73, 0x2B, 0xFF, 0xB7, 0x99, + 0x72, 0xFF, 0xD4, 0xD3, 0xD1, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xDB, 0xDB, + 0xDC, 0xFF, 0xBC, 0xB6, 0xA7, 0xFF, 0x8D, 0x77, 0x4D, 0xFF, 0xC1, 0xB5, 0x9F, 0xFF, 0xDC, 0xD9, + 0xD5, 0xFF, 0xD8, 0xD5, 0xCF, 0xFF, 0xE1, 0xE0, 0xDE, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xDF, 0xDE, + 0xDD, 0xFF, 0xB0, 0xA7, 0x92, 0xFF, 0xA3, 0x96, 0x7B, 0xFF, 0xD4, 0xD2, 0xCC, 0xFF, 0xC8, 0xC0, + 0xB5, 0xFF, 0x97, 0x7C, 0x50, 0xFF, 0x96, 0x69, 0x28, 0xFF, 0xAB, 0x73, 0x2C, 0xFF, 0xB2, 0x77, + 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, 0x2D, 0xFF, 0xB3, 0x77, + 0x2D, 0xFF, 0xB2, 0x77, 0x2D, 0xFF, 0xB1, 0x75, 0x2D, 0xFF, 0xAB, 0x6C, 0x22, 0xFF, 0xB5, 0x80, + 0x41, 0xFF, 0xD4, 0xB3, 0x8D, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xA5, 0x7C, 0x7B, 0xAA, 0x71, + 0x38, 0xFF, 0xA6, 0x69, 0x2C, 0xFF, 0xAC, 0x71, 0x2F, 0xFF, 0xB1, 0x76, 0x30, 0xFF, 0xB4, 0x79, + 0x31, 0xFF, 0xB6, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, + 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB6, 0x7D, 0x34, 0xFF, 0xB3, 0x83, + 0x42, 0xFF, 0xC5, 0xB2, 0x98, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, 0xD7, 0xFF, 0xD7, 0xD7, + 0xD7, 0xFF, 0xD7, 0xD7, 0xD6, 0xFF, 0xD2, 0xD0, 0xC9, 0xFF, 0xB4, 0xA6, 0x8C, 0xFF, 0xB8, 0xA9, + 0x8D, 0xFF, 0xC7, 0xBD, 0xAB, 0xFF, 0xAE, 0x9F, 0x82, 0xFF, 0xC2, 0xB9, 0xA8, 0xFF, 0xE1, 0xE1, + 0xE2, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xBE, 0xB8, 0xA9, 0xFF, 0xA4, 0x98, 0x7C, 0xFF, 0xD0, 0xCC, + 0xC4, 0xFF, 0xD4, 0xD1, 0xCC, 0xFF, 0xA5, 0x91, 0x6E, 0xFF, 0x98, 0x6E, 0x30, 0xFF, 0xAD, 0x78, + 0x31, 0xFF, 0xB6, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB7, 0x7C, + 0x32, 0xFF, 0xB7, 0x7C, 0x32, 0xFF, 0xB6, 0x7B, 0x32, 0xFF, 0xB4, 0x79, 0x32, 0xFF, 0xBD, 0x8B, + 0x4F, 0xFF, 0xD6, 0xB5, 0x8F, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xAD, 0x86, 0x71, 0xB6, 0x82, + 0x4C, 0xFF, 0xAC, 0x71, 0x33, 0xFF, 0xB2, 0x77, 0x35, 0xFF, 0xB6, 0x7C, 0x36, 0xFF, 0xB9, 0x7F, + 0x37, 0xFF, 0xBB, 0x81, 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, + 0x38, 0xFF, 0xBB, 0x81, 0x37, 0xFF, 0xBC, 0x84, 0x3B, 0xFF, 0xC2, 0x8E, 0x4B, 0xFF, 0xC3, 0x93, + 0x54, 0xFF, 0xBD, 0x94, 0x5D, 0xFF, 0xCF, 0xC2, 0xB0, 0xFF, 0xDB, 0xDC, 0xDC, 0xFF, 0xDB, 0xDB, + 0xDB, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xDD, 0xDD, 0xDE, 0xFF, 0xC9, 0xC2, 0xB4, 0xFF, 0xB7, 0xAB, + 0x91, 0xFF, 0xD9, 0xD5, 0xCC, 0xFF, 0xBA, 0xB1, 0x9C, 0xFF, 0xBD, 0xB6, 0xA5, 0xFF, 0xDC, 0xDD, + 0xDD, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xCC, 0xC8, 0xBD, 0xFF, 0xAA, 0x9F, + 0x86, 0xFF, 0xCD, 0xC8, 0xBE, 0xFF, 0xDD, 0xDC, 0xDA, 0xFF, 0xB5, 0xA4, 0x86, 0xFF, 0xA4, 0x79, + 0x39, 0xFF, 0xB7, 0x80, 0x37, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBB, 0x82, + 0x38, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBA, 0x81, 0x37, 0xFF, 0xB9, 0x80, 0x39, 0xFF, 0xC5, 0x97, + 0x5F, 0xFD, 0xDB, 0xBC, 0x98, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xB2, 0x8A, 0x5E, 0xBD, 0x8C, + 0x57, 0xFD, 0xB2, 0x78, 0x39, 0xFF, 0xB6, 0x7D, 0x3A, 0xFF, 0xBA, 0x82, 0x3B, 0xFF, 0xBD, 0x85, + 0x3C, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xC0, 0x88, 0x3F, 0xFF, 0xC7, 0x95, 0x53, 0xFF, 0xCB, 0x9C, 0x5E, 0xFF, 0xCB, 0x9B, + 0x5E, 0xFF, 0xC8, 0x99, 0x5C, 0xFF, 0xC3, 0xA0, 0x6E, 0xFF, 0xD8, 0xD0, 0xC3, 0xFF, 0xE1, 0xE1, + 0xE2, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE2, 0xE2, 0xE2, 0xFF, 0xCF, 0xCA, 0xBE, 0xFF, 0xDA, 0xD7, + 0xCF, 0xFF, 0xBE, 0xB5, 0xA0, 0xFF, 0xD7, 0xD4, 0xCD, 0xFF, 0xDF, 0xDF, 0xE0, 0xFF, 0xDC, 0xDC, + 0xDC, 0xFF, 0xDC, 0xDC, 0xDC, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE4, 0xE4, 0xE5, 0xFF, 0xD8, 0xD5, + 0xD0, 0xFF, 0xB4, 0xAC, 0x95, 0xFF, 0xCC, 0xC8, 0xBC, 0xFF, 0xDF, 0xDC, 0xD7, 0xFF, 0xB0, 0x8C, + 0x57, 0xFF, 0xB9, 0x83, 0x3A, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBF, 0x87, + 0x3D, 0xFF, 0xBF, 0x87, 0x3D, 0xFF, 0xBE, 0x86, 0x3D, 0xFF, 0xBE, 0x86, 0x3F, 0xFF, 0xCC, 0xA0, + 0x69, 0xF7, 0xDE, 0xC2, 0x9F, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0xB8, 0x91, 0x41, 0xC5, 0x97, + 0x63, 0xF3, 0xB8, 0x7F, 0x40, 0xFF, 0xBB, 0x82, 0x3F, 0xFF, 0xBF, 0x87, 0x41, 0xFF, 0xC2, 0x8A, + 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, + 0x42, 0xFF, 0xC9, 0x97, 0x54, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xCF, 0xA2, + 0x67, 0xFF, 0xCF, 0xA2, 0x67, 0xFF, 0xCC, 0xA0, 0x65, 0xFF, 0xCB, 0xAB, 0x7F, 0xFF, 0xE0, 0xDB, + 0xD4, 0xFF, 0xE6, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, 0xE8, 0xFF, 0xCA, 0xC2, 0xB1, 0xFF, 0xC8, 0xBD, + 0xA9, 0xFF, 0xD7, 0xD3, 0xC9, 0xFF, 0xBE, 0xB2, 0x9A, 0xFF, 0xC9, 0xBE, 0xAA, 0xFF, 0xDB, 0xDA, + 0xD6, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xDF, 0xDF, 0xDF, 0xFF, 0xE1, 0xE1, 0xE1, 0xFF, 0xE6, 0xE6, + 0xE6, 0xFF, 0xE1, 0xE0, 0xDD, 0xFF, 0xC4, 0xBD, 0xAC, 0xFF, 0xD2, 0xC9, 0xB6, 0xFF, 0xB8, 0x92, + 0x58, 0xFF, 0xBF, 0x89, 0x40, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC3, 0x8C, + 0x42, 0xFF, 0xC3, 0x8C, 0x42, 0xFF, 0xC2, 0x8B, 0x42, 0xFF, 0xC3, 0x8D, 0x47, 0xFF, 0xD2, 0xA9, + 0x75, 0xED, 0xE5, 0xCD, 0xAD, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0xC7, 0xA4, 0x24, 0xCE, 0xA2, + 0x70, 0xDF, 0xBF, 0x88, 0x4A, 0xFF, 0xC0, 0x88, 0x45, 0xFF, 0xC3, 0x8D, 0x47, 0xFF, 0xC7, 0x90, + 0x48, 0xFF, 0xC8, 0x92, 0x48, 0xFF, 0xC9, 0x92, 0x49, 0xFF, 0xC9, 0x92, 0x48, 0xFF, 0xCA, 0x96, + 0x4F, 0xFF, 0xD2, 0xA7, 0x6B, 0xFF, 0xD4, 0xA9, 0x70, 0xFF, 0xD4, 0xA9, 0x6F, 0xFF, 0xD4, 0xA9, + 0x6F, 0xFF, 0xD4, 0xA9, 0x6F, 0xFF, 0xD4, 0xA9, 0x6F, 0xFF, 0xD0, 0xA7, 0x6D, 0xFF, 0xD2, 0xB8, + 0x92, 0xFF, 0xE6, 0xE4, 0xE0, 0xFF, 0xEB, 0xEC, 0xED, 0xFF, 0xCA, 0xC4, 0xB4, 0xFF, 0xAC, 0xA0, + 0x80, 0xFF, 0xDD, 0xDA, 0xD3, 0xFF, 0xC0, 0xB7, 0xA2, 0xFF, 0xA9, 0x99, 0x74, 0xFF, 0xD5, 0xD1, + 0xC9, 0xFF, 0xE3, 0xE3, 0xE4, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xE4, 0xE4, + 0xE4, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xE8, 0xE8, 0xE6, 0xFF, 0xC7, 0xB5, 0x97, 0xFF, 0xB7, 0x8C, + 0x4B, 0xFF, 0xC3, 0x90, 0x47, 0xFF, 0xC8, 0x92, 0x49, 0xFF, 0xC9, 0x92, 0x49, 0xFF, 0xC9, 0x92, + 0x49, 0xFF, 0xC9, 0x92, 0x49, 0xFF, 0xC8, 0x91, 0x48, 0xFF, 0xCA, 0x97, 0x53, 0xFF, 0xD8, 0xB2, + 0x82, 0xD4, 0xE4, 0xCE, 0xB1, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xD9, 0xBE, 0x0A, 0xD6, 0xAE, + 0x7E, 0xB7, 0xC8, 0x93, 0x57, 0xFF, 0xC5, 0x8E, 0x4A, 0xFF, 0xC9, 0x92, 0x4C, 0xFF, 0xCC, 0x95, + 0x4D, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCE, 0x98, 0x4E, 0xFF, 0xCE, 0x98, 0x4E, 0xFF, 0xD3, 0xA4, + 0x63, 0xFF, 0xD9, 0xB0, 0x79, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, + 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD9, 0xB0, 0x78, 0xFF, 0xD4, 0xAD, + 0x77, 0xFF, 0xD8, 0xC3, 0xA4, 0xFF, 0xEB, 0xE9, 0xE7, 0xFF, 0xEB, 0xEB, 0xEA, 0xFF, 0xE6, 0xE5, + 0xE2, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xE4, 0xE3, 0xE1, 0xFF, 0xD4, 0xD1, 0xC8, 0xFF, 0xDD, 0xDC, + 0xD8, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE6, 0xE6, 0xE6, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xE7, 0xE7, + 0xE7, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xE9, 0xE6, 0xFF, 0xC3, 0xB8, 0x9D, 0xFF, 0xBC, 0xA1, + 0x72, 0xFF, 0xB9, 0x8F, 0x4C, 0xFF, 0xC7, 0x94, 0x4D, 0xFF, 0xCD, 0x98, 0x4E, 0xFF, 0xCE, 0x98, + 0x4E, 0xFF, 0xCE, 0x98, 0x4E, 0xFF, 0xCD, 0x97, 0x4E, 0xFF, 0xD2, 0xA2, 0x63, 0xFF, 0xDC, 0xBB, + 0x8E, 0xA9, 0xC0, 0xBC, 0xB7, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xBA, + 0x8D, 0x7B, 0xD1, 0xA1, 0x67, 0xFF, 0xCB, 0x94, 0x51, 0xFF, 0xCE, 0x98, 0x51, 0xFF, 0xD0, 0x9B, + 0x52, 0xFF, 0xD2, 0x9D, 0x53, 0xFF, 0xD2, 0x9E, 0x53, 0xFF, 0xD3, 0x9F, 0x55, 0xFF, 0xDB, 0xB1, + 0x75, 0xFF, 0xDD, 0xB8, 0x81, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, + 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, 0x80, 0xFF, 0xDD, 0xB7, + 0x80, 0xFF, 0xD8, 0xB4, 0x80, 0xFF, 0xDE, 0xCD, 0xB1, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xF0, 0xF1, + 0xF1, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xED, 0xED, 0xED, 0xFF, 0xEC, 0xEC, 0xED, 0xFF, 0xEA, 0xEA, + 0xEB, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEB, 0xEB, + 0xEB, 0xFF, 0xE9, 0xE9, 0xE6, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xE5, 0xE3, 0xDD, 0xFF, 0xD2, 0xCA, + 0xB6, 0xFF, 0xC4, 0xB0, 0x89, 0xFF, 0xBD, 0x96, 0x56, 0xFF, 0xCE, 0x9C, 0x53, 0xFF, 0xD2, 0x9E, + 0x53, 0xFF, 0xD2, 0x9E, 0x53, 0xFF, 0xD2, 0x9E, 0x55, 0xFF, 0xDA, 0xB0, 0x76, 0xFE, 0xDE, 0xC1, + 0x9A, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0xC8, + 0x9E, 0x36, 0xDA, 0xAF, 0x79, 0xEA, 0xD1, 0x9D, 0x5B, 0xFF, 0xD2, 0x9D, 0x57, 0xFF, 0xD5, 0xA0, + 0x58, 0xFF, 0xD6, 0xA3, 0x59, 0xFF, 0xD7, 0xA3, 0x59, 0xFF, 0xD8, 0xA7, 0x60, 0xFF, 0xE1, 0xBB, + 0x83, 0xFF, 0xE2, 0xBE, 0x89, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, + 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, 0x88, 0xFF, 0xE2, 0xBE, + 0x88, 0xFF, 0xE1, 0xBD, 0x88, 0xFF, 0xDC, 0xBB, 0x89, 0xFF, 0xE3, 0xD5, 0xBC, 0xFF, 0xF1, 0xF1, + 0xF0, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, 0xED, 0xFF, 0xE9, 0xE9, + 0xE6, 0xFF, 0xED, 0xED, 0xEB, 0xFF, 0xEF, 0xEF, 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEB, 0xEA, + 0xE6, 0xFF, 0xE2, 0xDE, 0xD3, 0xFF, 0xCB, 0xAE, 0x7E, 0xFF, 0xCF, 0x9F, 0x56, 0xFF, 0xD7, 0xA4, + 0x59, 0xFF, 0xD7, 0xA3, 0x59, 0xFF, 0xD8, 0xA8, 0x62, 0xFF, 0xE1, 0xBC, 0x89, 0xE3, 0xE0, 0xC8, + 0xA6, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xDF, + 0xC2, 0x08, 0xE1, 0xBB, 0x8A, 0xAC, 0xD9, 0xA9, 0x6C, 0xFF, 0xD6, 0xA2, 0x5D, 0xFF, 0xD9, 0xA5, + 0x5E, 0xFF, 0xDA, 0xA8, 0x5F, 0xFF, 0xDB, 0xA9, 0x5E, 0xFF, 0xDD, 0xAE, 0x69, 0xFF, 0xE6, 0xC2, + 0x8E, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, + 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE7, 0xC4, + 0x91, 0xFF, 0xE7, 0xC4, 0x91, 0xFF, 0xE5, 0xC3, 0x90, 0xFF, 0xE0, 0xC2, 0x93, 0xFF, 0xE7, 0xDB, + 0xC4, 0xFF, 0xF4, 0xF3, 0xF3, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xF2, 0xF2, + 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xF2, 0xF2, 0xF2, 0xFF, 0xEE, 0xEE, 0xEC, 0xFF, 0xF0, 0xF0, + 0xEF, 0xFF, 0xF2, 0xF2, 0xF3, 0xFF, 0xF1, 0xF0, 0xEF, 0xFF, 0xD8, 0xD5, 0xC7, 0xFF, 0xEE, 0xEE, + 0xEB, 0xFF, 0xEC, 0xE9, 0xE1, 0xFF, 0xD0, 0xAF, 0x79, 0xFF, 0xD6, 0xA6, 0x5D, 0xFF, 0xDC, 0xA9, + 0x5F, 0xFF, 0xDB, 0xA9, 0x60, 0xFF, 0xE0, 0xB5, 0x76, 0xFF, 0xE7, 0xC8, 0x99, 0x9E, 0xD9, 0xD3, + 0xC8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE3, 0xC2, 0x96, 0x4D, 0xE1, 0xB7, 0x7F, 0xF3, 0xDC, 0xA9, 0x66, 0xFF, 0xDC, 0xAA, + 0x63, 0xFF, 0xDE, 0xAD, 0x64, 0xFF, 0xDF, 0xAE, 0x64, 0xFF, 0xE1, 0xB4, 0x6E, 0xFF, 0xE9, 0xC9, + 0x95, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, + 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, + 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xEA, 0xCA, 0x98, 0xFF, 0xE9, 0xC9, 0x97, 0xFF, 0xE4, 0xC8, + 0x9A, 0xFF, 0xEA, 0xDD, 0xC8, 0xFF, 0xF5, 0xF5, 0xF4, 0xFF, 0xF6, 0xF6, 0xF7, 0xFF, 0xF6, 0xF6, + 0xF6, 0xFF, 0xF4, 0xF3, 0xF2, 0xFF, 0xF4, 0xF4, 0xF2, 0xFF, 0xF5, 0xF5, 0xF5, 0xFF, 0xF5, 0xF5, + 0xF5, 0xFF, 0xF6, 0xF6, 0xF6, 0xFF, 0xF2, 0xF2, 0xF0, 0xFF, 0xE9, 0xE8, 0xE2, 0xFF, 0xF3, 0xF1, + 0xEC, 0xFF, 0xD7, 0xBE, 0x93, 0xFF, 0xD5, 0xA9, 0x63, 0xFF, 0xDE, 0xAE, 0x64, 0xFF, 0xDF, 0xAE, + 0x65, 0xFF, 0xE0, 0xB2, 0x6C, 0xFF, 0xE7, 0xC3, 0x8D, 0xED, 0xE8, 0xCE, 0xA7, 0x40, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE2, 0xCC, 0xAB, 0x0A, 0xE7, 0xC3, 0x90, 0xA9, 0xE3, 0xB5, 0x79, 0xFF, 0xE0, 0xAE, + 0x69, 0xFF, 0xE1, 0xB1, 0x69, 0xFF, 0xE2, 0xB2, 0x69, 0xFF, 0xE4, 0xB7, 0x71, 0xFF, 0xEC, 0xCC, + 0x99, 0xFF, 0xED, 0xCF, 0xA0, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, + 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, + 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xED, 0xCF, 0x9F, 0xFF, 0xEC, 0xCF, + 0x9F, 0xFF, 0xE8, 0xCD, 0xA0, 0xFF, 0xEB, 0xDD, 0xC3, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xF5, 0xF2, + 0xEC, 0xFF, 0xE5, 0xD7, 0xBC, 0xFF, 0xEA, 0xDD, 0xC5, 0xFF, 0xF8, 0xF6, 0xF4, 0xFF, 0xF8, 0xF9, + 0xF9, 0xFF, 0xEA, 0xE9, 0xE1, 0xFF, 0xF4, 0xF4, 0xF2, 0xFF, 0xF9, 0xF8, 0xF6, 0xFF, 0xE5, 0xD6, + 0xB6, 0xFF, 0xD9, 0xB0, 0x6D, 0xFF, 0xE1, 0xB3, 0x69, 0xFF, 0xE3, 0xB4, 0x6A, 0xFF, 0xE3, 0xB4, + 0x6C, 0xFF, 0xE7, 0xBF, 0x82, 0xFF, 0xEC, 0xCE, 0x9F, 0x9B, 0xE1, 0xD6, 0xC5, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xCB, 0x9E, 0x36, 0xE9, 0xC3, 0x8D, 0xE3, 0xE5, 0xB7, + 0x76, 0xFF, 0xE4, 0xB5, 0x6E, 0xFF, 0xE6, 0xB7, 0x6F, 0xFF, 0xE7, 0xB9, 0x72, 0xFF, 0xEE, 0xCD, + 0x98, 0xFF, 0xF0, 0xD4, 0xA7, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, + 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, + 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xF0, 0xD4, + 0xA6, 0xFF, 0xF0, 0xD4, 0xA6, 0xFF, 0xED, 0xD2, 0xA5, 0xFF, 0xED, 0xD8, 0xB4, 0xFF, 0xEC, 0xD7, + 0xB3, 0xFF, 0xEB, 0xD1, 0xA4, 0xFF, 0xEB, 0xD1, 0xA5, 0xFF, 0xEE, 0xDF, 0xC3, 0xFF, 0xF8, 0xF6, + 0xF0, 0xFF, 0xEB, 0xEA, 0xE2, 0xFF, 0xF6, 0xF5, 0xF2, 0xFF, 0xEC, 0xE1, 0xCA, 0xFF, 0xE5, 0xC7, + 0x94, 0xFF, 0xE5, 0xB8, 0x70, 0xFF, 0xE6, 0xB8, 0x6F, 0xFF, 0xE7, 0xB8, 0x70, 0xFF, 0xE8, 0xBE, + 0x7C, 0xFF, 0xED, 0xCD, 0x98, 0xDA, 0xED, 0xD4, 0xAD, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xCD, 0x9C, 0x6D, 0xEB, 0xC4, + 0x8C, 0xF8, 0xE8, 0xBB, 0x78, 0xFF, 0xE8, 0xBA, 0x73, 0xFF, 0xE9, 0xBB, 0x73, 0xFF, 0xEE, 0xCA, + 0x8F, 0xFF, 0xF2, 0xD8, 0xAD, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, + 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, + 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, + 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xEF, 0xD6, 0xAB, 0xFF, 0xF0, 0xDF, + 0xC0, 0xFF, 0xF9, 0xF5, 0xEE, 0xFF, 0xF1, 0xE7, 0xD2, 0xFF, 0xEB, 0xD5, 0xAC, 0xFF, 0xEC, 0xC8, + 0x8B, 0xFF, 0xE9, 0xBC, 0x73, 0xFF, 0xEA, 0xBD, 0x74, 0xFF, 0xEB, 0xC0, 0x7C, 0xFF, 0xEE, 0xCD, + 0x95, 0xF4, 0xEF, 0xD5, 0xA9, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0xD6, 0xB4, 0x0A, 0xF0, 0xCF, + 0x9C, 0x94, 0xEE, 0xC8, 0x8D, 0xFE, 0xEB, 0xBF, 0x7C, 0xFF, 0xEC, 0xBF, 0x77, 0xFF, 0xED, 0xC4, + 0x81, 0xFF, 0xF4, 0xD8, 0xAB, 0xFF, 0xF5, 0xDC, 0xB3, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, + 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF5, 0xDC, 0xB2, 0xFF, 0xF4, 0xDC, 0xB2, 0xFF, 0xF2, 0xDB, + 0xB1, 0xFF, 0xF2, 0xDE, 0xB9, 0xFF, 0xF1, 0xDB, 0xB5, 0xFF, 0xF2, 0xD7, 0xA8, 0xFF, 0xED, 0xC4, + 0x7F, 0xFF, 0xEC, 0xC0, 0x78, 0xFF, 0xED, 0xC3, 0x7F, 0xFF, 0xF0, 0xCE, 0x94, 0xFB, 0xF2, 0xD6, + 0xA7, 0x87, 0xEB, 0xDE, 0xC5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF2, 0xD7, + 0xAB, 0x12, 0xF2, 0xD2, 0x9E, 0xA4, 0xF0, 0xCB, 0x90, 0xFF, 0xEF, 0xC4, 0x81, 0xFF, 0xEF, 0xC3, + 0x7D, 0xFF, 0xF3, 0xD0, 0x97, 0xFF, 0xF6, 0xDF, 0xB7, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, + 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF7, 0xE0, 0xB8, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xE0, + 0xB8, 0xFF, 0xF6, 0xE0, 0xB8, 0xFF, 0xF6, 0xDF, 0xB6, 0xFF, 0xF2, 0xD0, 0x94, 0xFF, 0xEF, 0xC4, + 0x7D, 0xFF, 0xF0, 0xC8, 0x83, 0xFF, 0xF3, 0xD1, 0x96, 0xFE, 0xF3, 0xD8, 0xA7, 0x99, 0xF1, 0xDD, + 0xBB, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF2, 0xD9, 0xAE, 0x17, 0xF4, 0xD4, 0xA1, 0xA1, 0xF3, 0xD0, 0x95, 0xFD, 0xF1, 0xCA, + 0x87, 0xFF, 0xF2, 0xC9, 0x84, 0xFF, 0xF5, 0xD9, 0xA6, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF8, 0xE3, + 0xBD, 0xFF, 0xF8, 0xE3, 0xBD, 0xFF, 0xF5, 0xD8, 0xA4, 0xFF, 0xF2, 0xCA, 0x84, 0xFF, 0xF3, 0xCD, + 0x8A, 0xFF, 0xF5, 0xD4, 0x9B, 0xFB, 0xF6, 0xDA, 0xA9, 0x98, 0xF2, 0xDE, 0xBC, 0x13, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDC, 0xB3, 0x10, 0xF5, 0xD7, 0xA5, 0x87, 0xF5, 0xD4, + 0x9C, 0xF1, 0xF4, 0xCF, 0x90, 0xFF, 0xF4, 0xCE, 0x8C, 0xFF, 0xF7, 0xDC, 0xAB, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, + 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xF9, 0xE5, + 0xC0, 0xFF, 0xF7, 0xDB, 0xA9, 0xFF, 0xF4, 0xCF, 0x8C, 0xFF, 0xF5, 0xD1, 0x93, 0xFF, 0xF7, 0xD8, + 0xA2, 0xED, 0xF7, 0xDC, 0xAC, 0x7B, 0xF4, 0xE1, 0xC0, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xE0, 0xC7, 0x05, 0xF5, 0xD9, + 0xA9, 0x56, 0xF7, 0xD8, 0xA3, 0xCC, 0xF7, 0xD5, 0x9A, 0xFF, 0xF6, 0xD2, 0x94, 0xFF, 0xF8, 0xDB, + 0xA8, 0xFF, 0xFA, 0xE6, 0xC1, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC5, 0xFF, 0xFB, 0xE8, + 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFB, 0xE8, 0xC7, 0xFF, 0xFA, 0xE5, 0xC0, 0xFF, 0xF8, 0xDB, + 0xA6, 0xFF, 0xF7, 0xD4, 0x95, 0xFF, 0xF7, 0xD7, 0x9E, 0xFE, 0xF8, 0xDB, 0xA8, 0xC5, 0xF8, 0xDE, + 0xB1, 0x4D, 0xFB, 0xEF, 0xDA, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xF4, 0xDB, 0xB0, 0x1E, 0xF7, 0xDB, 0xA9, 0x82, 0xF8, 0xDA, 0xA4, 0xDD, 0xF8, 0xD7, + 0x9E, 0xFF, 0xF9, 0xDA, 0xA4, 0xFF, 0xFB, 0xE2, 0xB7, 0xFF, 0xFC, 0xE8, 0xC5, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xEA, 0xCB, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, 0xCC, 0xFF, 0xFC, 0xEA, + 0xCB, 0xFF, 0xFC, 0xE8, 0xC4, 0xFF, 0xFB, 0xE2, 0xB6, 0xFF, 0xF9, 0xDB, 0xA3, 0xFF, 0xF9, 0xD9, + 0xA0, 0xFE, 0xF9, 0xDC, 0xA8, 0xD9, 0xF8, 0xDE, 0xAE, 0x79, 0xF8, 0xE2, 0xB9, 0x19, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFA, 0xFF, 0x01, 0xF7, 0xDD, 0xB1, 0x28, 0xF8, 0xDD, + 0xAC, 0x78, 0xF9, 0xDC, 0xA8, 0xC5, 0xFA, 0xDC, 0xA6, 0xF0, 0xFB, 0xDE, 0xAB, 0xFF, 0xFB, 0xE2, + 0xB5, 0xFF, 0xFC, 0xE6, 0xBF, 0xFF, 0xFC, 0xE8, 0xC4, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xEA, + 0xC9, 0xFF, 0xFC, 0xE9, 0xC8, 0xFF, 0xFC, 0xE8, 0xC4, 0xFF, 0xFB, 0xE6, 0xBE, 0xFF, 0xFB, 0xE2, + 0xB5, 0xFF, 0xFA, 0xDF, 0xAC, 0xFF, 0xFA, 0xDD, 0xA8, 0xEE, 0xFA, 0xDE, 0xAA, 0xC0, 0xF9, 0xDE, + 0xAF, 0x73, 0xF7, 0xE0, 0xB6, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xFA, 0xE6, 0xC1, 0x12, 0xFB, 0xE2, 0xB5, 0x3E, 0xFB, 0xE0, 0xAF, 0x73, 0xFB, 0xDF, + 0xAC, 0xA1, 0xFB, 0xDF, 0xAC, 0xC1, 0xFB, 0xE0, 0xAF, 0xD6, 0xFB, 0xE1, 0xB0, 0xDE, 0xFB, 0xE1, + 0xB1, 0xE1, 0xFB, 0xE1, 0xB0, 0xDE, 0xFB, 0xE0, 0xAF, 0xD5, 0xFB, 0xE0, 0xAD, 0xBF, 0xFB, 0xDF, + 0xAD, 0x9E, 0xFB, 0xE1, 0xB2, 0x6F, 0xFB, 0xE3, 0xB8, 0x3A, 0xFA, 0xE7, 0xC5, 0x0F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xEA, + 0xCA, 0x04, 0xFB, 0xE2, 0xB2, 0x0F, 0xFC, 0xE2, 0xB3, 0x1F, 0xFC, 0xE2, 0xB2, 0x29, 0xFC, 0xE2, + 0xB2, 0x2D, 0xFC, 0xE2, 0xB3, 0x29, 0xFB, 0xE3, 0xB3, 0x1E, 0xFB, 0xE3, 0xB5, 0x0E, 0xFD, 0xEE, + 0xD3, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, + 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF0, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xF8, 0x00, + 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xFE, 0x00, + 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFF, 0x00, + 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0xC0, + 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0xFF, 0xE0, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0xFF, 0xF8, + 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, 0xFF, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0xFF, 0xFF, + 0x80, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0x00, 0x00, 0x28, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, + 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x0C, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, + 0x0C, 0x14, 0x82, 0x44, 0x0C, 0x13, 0x82, 0x44, 0x0C, 0x12, 0x82, 0x44, 0x0C, 0x10, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x0B, 0x82, 0x44, 0x0C, 0x08, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x03, 0x82, 0x44, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x06, 0x82, 0x44, + 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x1D, 0x82, 0x44, 0x0C, 0x24, 0x82, 0x44, + 0x0C, 0x2B, 0x82, 0x44, 0x0C, 0x30, 0x82, 0x44, 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x39, 0x82, 0x44, + 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, 0x0C, 0x3E, 0x82, 0x44, + 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x3A, 0x82, 0x44, 0x0C, 0x37, 0x82, 0x44, 0x0C, 0x34, 0x82, 0x44, + 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x29, 0x82, 0x44, 0x0C, 0x22, 0x82, 0x44, 0x0C, 0x1A, 0x82, 0x44, + 0x0C, 0x11, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x04, 0x82, 0x44, 0x0C, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x01, 0x82, 0x44, 0x0C, 0x07, 0x82, 0x44, 0x0C, 0x14, 0x82, 0x44, + 0x0C, 0x28, 0x82, 0x44, 0x0C, 0x3D, 0x82, 0x44, 0x0C, 0x4E, 0x82, 0x44, 0x0C, 0x5A, 0x82, 0x44, + 0x0C, 0x64, 0x82, 0x44, 0x0B, 0x6C, 0x81, 0x43, 0x0A, 0x71, 0x81, 0x43, 0x0A, 0x75, 0x82, 0x44, + 0x0B, 0x78, 0x83, 0x45, 0x0D, 0x7B, 0x83, 0x46, 0x0E, 0x7C, 0x83, 0x45, 0x0D, 0x7B, 0x82, 0x43, + 0x0A, 0x7A, 0x81, 0x42, 0x09, 0x77, 0x81, 0x43, 0x0B, 0x74, 0x82, 0x44, 0x0C, 0x6F, 0x82, 0x44, + 0x0C, 0x69, 0x82, 0x44, 0x0C, 0x61, 0x82, 0x44, 0x0C, 0x56, 0x82, 0x44, 0x0C, 0x48, 0x82, 0x44, + 0x0C, 0x35, 0x82, 0x44, 0x0C, 0x20, 0x82, 0x44, 0x0C, 0x0E, 0x82, 0x44, 0x0D, 0x04, 0x97, 0x64, + 0x35, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x45, 0x0D, 0x03, 0x82, 0x44, 0x0C, 0x0D, 0x82, 0x44, 0x0C, 0x26, 0x82, 0x44, + 0x0C, 0x49, 0x82, 0x44, 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x81, 0x82, 0x43, 0x0B, 0x8F, 0x82, 0x43, + 0x0B, 0x98, 0x85, 0x49, 0x12, 0xA2, 0x8A, 0x51, 0x1E, 0xAE, 0x8F, 0x5B, 0x2E, 0xBD, 0x94, 0x65, + 0x3F, 0xCE, 0x96, 0x6A, 0x48, 0xD9, 0x96, 0x6A, 0x49, 0xDB, 0x97, 0x6B, 0x48, 0xD7, 0x94, 0x64, + 0x3C, 0xC9, 0x8E, 0x58, 0x2A, 0xB9, 0x88, 0x4E, 0x1A, 0xAD, 0x83, 0x46, 0x0F, 0xA3, 0x81, 0x43, + 0x0A, 0x9C, 0x82, 0x44, 0x0C, 0x96, 0x82, 0x44, 0x0C, 0x8B, 0x82, 0x44, 0x0C, 0x7A, 0x82, 0x44, + 0x0C, 0x5F, 0x82, 0x44, 0x0C, 0x3B, 0x82, 0x44, 0x0C, 0x1B, 0x82, 0x44, 0x0C, 0x08, 0x85, 0x48, + 0x12, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x45, 0x0D, 0x03, 0x82, 0x44, 0x0C, 0x0F, 0x82, 0x44, 0x0C, 0x2B, 0x82, 0x44, + 0x0C, 0x52, 0x82, 0x44, 0x0C, 0x76, 0x82, 0x43, 0x0B, 0x8D, 0x86, 0x4B, 0x14, 0xA2, 0x8F, 0x5C, + 0x30, 0xC4, 0x8E, 0x61, 0x3F, 0xE7, 0x82, 0x55, 0x37, 0xF6, 0x7B, 0x4E, 0x32, 0xFD, 0x78, 0x4B, + 0x31, 0xFF, 0x78, 0x4B, 0x31, 0xFF, 0x79, 0x4D, 0x32, 0xFF, 0x7C, 0x51, 0x36, 0xFF, 0x80, 0x55, + 0x3B, 0xFF, 0x86, 0x5C, 0x40, 0xFB, 0x90, 0x65, 0x48, 0xF3, 0x97, 0x6B, 0x47, 0xE0, 0x8E, 0x58, + 0x28, 0xBC, 0x84, 0x47, 0x0F, 0xA4, 0x81, 0x43, 0x0B, 0x97, 0x82, 0x44, 0x0C, 0x87, 0x82, 0x44, + 0x0C, 0x6A, 0x82, 0x44, 0x0C, 0x43, 0x82, 0x44, 0x0C, 0x1E, 0x82, 0x44, 0x0C, 0x09, 0x82, 0x44, + 0x0C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x82, 0x44, 0x0C, 0x02, 0x82, 0x44, 0x0C, 0x0A, 0x82, 0x44, 0x0C, 0x1D, 0x81, 0x43, + 0x0A, 0x38, 0x84, 0x47, 0x0F, 0x55, 0x91, 0x5D, 0x30, 0x90, 0x8B, 0x5D, 0x3B, 0xDF, 0x77, 0x48, + 0x2B, 0xFC, 0x6D, 0x3D, 0x20, 0xFF, 0x6C, 0x3B, 0x1C, 0xFF, 0x70, 0x3E, 0x1E, 0xFF, 0x73, 0x42, + 0x21, 0xFF, 0x77, 0x45, 0x24, 0xFF, 0x79, 0x48, 0x27, 0xFF, 0x7B, 0x4A, 0x29, 0xFF, 0x7C, 0x4C, + 0x2B, 0xFF, 0x7C, 0x4D, 0x2D, 0xFF, 0x7E, 0x50, 0x32, 0xFF, 0x84, 0x58, 0x3B, 0xFF, 0x8F, 0x65, + 0x48, 0xF7, 0x9A, 0x6E, 0x4B, 0xCF, 0x8D, 0x56, 0x24, 0x85, 0x81, 0x43, 0x0A, 0x60, 0x82, 0x44, + 0x0C, 0x4A, 0x82, 0x44, 0x0C, 0x2E, 0x82, 0x44, 0x0C, 0x15, 0x82, 0x44, 0x0C, 0x06, 0x89, 0x4F, + 0x1A, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x83, 0x46, 0x0E, 0x01, 0x82, 0x45, 0x0D, 0x04, 0x7D, 0x3C, 0x01, 0x0A, 0x92, 0x5C, + 0x2A, 0x1E, 0x95, 0x68, 0x45, 0x88, 0x7A, 0x49, 0x29, 0xEF, 0x66, 0x31, 0x12, 0xFF, 0x63, 0x2D, + 0x0B, 0xFF, 0x69, 0x31, 0x0C, 0xFF, 0x6E, 0x36, 0x0E, 0xFF, 0x73, 0x3B, 0x11, 0xFF, 0x78, 0x40, + 0x14, 0xFF, 0x7D, 0x46, 0x1A, 0xFF, 0x81, 0x4B, 0x20, 0xFF, 0x84, 0x4F, 0x25, 0xFF, 0x86, 0x52, + 0x29, 0xFF, 0x87, 0x54, 0x2C, 0xFF, 0x86, 0x54, 0x2E, 0xFF, 0x84, 0x53, 0x2F, 0xFF, 0x83, 0x53, + 0x32, 0xFF, 0x8A, 0x5D, 0x3F, 0xFF, 0x9A, 0x71, 0x52, 0xDC, 0x9F, 0x73, 0x4C, 0x63, 0x82, 0x43, + 0x0A, 0x1F, 0x81, 0x43, 0x0A, 0x13, 0x82, 0x44, 0x0C, 0x08, 0x83, 0x45, 0x0D, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0x9B, 0x7C, 0x09, 0x98, 0x6D, + 0x4D, 0x85, 0x74, 0x40, 0x1E, 0xF7, 0x62, 0x2B, 0x07, 0xFF, 0x66, 0x2C, 0x05, 0xFF, 0x69, 0x2F, + 0x05, 0xFF, 0x70, 0x35, 0x06, 0xFF, 0x77, 0x3A, 0x09, 0xFF, 0x7B, 0x3D, 0x09, 0xFF, 0x7D, 0x3F, + 0x0A, 0xFF, 0x7E, 0x40, 0x0B, 0xFF, 0x80, 0x42, 0x0C, 0xFF, 0x81, 0x44, 0x0F, 0xFF, 0x84, 0x48, + 0x13, 0xFF, 0x88, 0x4F, 0x1D, 0xFF, 0x8C, 0x56, 0x28, 0xFF, 0x8D, 0x59, 0x2D, 0xFF, 0x8B, 0x59, + 0x2F, 0xFF, 0x88, 0x57, 0x30, 0xFF, 0x89, 0x5B, 0x38, 0xFF, 0x9B, 0x72, 0x52, 0xE2, 0xAE, 0x8A, + 0x6C, 0x4F, 0x76, 0x2C, 0x00, 0x03, 0x7A, 0x38, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0x9F, 0x76, 0x55, 0x71, 0x78, 0x43, + 0x1F, 0xF7, 0x67, 0x2D, 0x07, 0xFF, 0x6B, 0x30, 0x06, 0xFF, 0x6C, 0x37, 0x0C, 0xFF, 0x7F, 0x59, + 0x36, 0xFF, 0x79, 0x4D, 0x23, 0xFF, 0x79, 0x3E, 0x09, 0xFF, 0x84, 0x45, 0x0B, 0xFF, 0x86, 0x46, + 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x86, 0x46, + 0x0B, 0xFF, 0x86, 0x46, 0x0C, 0xFF, 0x87, 0x48, 0x10, 0xFF, 0x8A, 0x4E, 0x17, 0xFF, 0x90, 0x58, + 0x26, 0xFF, 0x91, 0x5C, 0x2E, 0xFF, 0x8E, 0x5B, 0x30, 0xFF, 0x8D, 0x5D, 0x37, 0xFF, 0xA0, 0x76, + 0x55, 0xDC, 0xBA, 0x99, 0x7E, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAA, 0x83, 0x62, 0x42, 0x82, 0x4F, 0x29, 0xEB, 0x6B, 0x30, + 0x08, 0xFF, 0x70, 0x34, 0x07, 0xFF, 0x71, 0x3D, 0x10, 0xFF, 0xA7, 0x91, 0x7B, 0xFF, 0xCA, 0xC3, + 0xBB, 0xFF, 0xB6, 0xAB, 0x9B, 0xFF, 0x8A, 0x67, 0x41, 0xFF, 0x7C, 0x45, 0x0D, 0xFF, 0x88, 0x49, + 0x0C, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8B, 0x4A, + 0x0D, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0D, 0xFF, 0x8A, 0x4A, 0x0C, 0xFF, 0x8A, 0x4B, + 0x0F, 0xFF, 0x8D, 0x51, 0x17, 0xFF, 0x93, 0x5B, 0x28, 0xFF, 0x92, 0x5D, 0x30, 0xFF, 0x93, 0x62, + 0x39, 0xFF, 0xA9, 0x81, 0x5F, 0xC2, 0xC7, 0xAA, 0x91, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xC3, 0xA2, 0x84, 0x13, 0x96, 0x66, 0x40, 0xBF, 0x72, 0x37, 0x0E, 0xFF, 0x74, 0x36, + 0x08, 0xFF, 0x75, 0x3E, 0x0E, 0xFF, 0xA7, 0x90, 0x78, 0xFF, 0xE4, 0xE3, 0xE2, 0xFF, 0xE5, 0xE5, + 0xE4, 0xFF, 0xCE, 0xCA, 0xC3, 0xFF, 0xAD, 0xA3, 0x93, 0xFF, 0x9D, 0x84, 0x66, 0xFF, 0x7E, 0x4C, + 0x15, 0xFF, 0x88, 0x4A, 0x0C, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, + 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4E, 0x0E, 0xFF, 0x8E, 0x4D, + 0x0E, 0xFF, 0x8D, 0x4D, 0x0D, 0xFF, 0x8E, 0x4E, 0x11, 0xFF, 0x92, 0x57, 0x1F, 0xFF, 0x94, 0x5E, + 0x2E, 0xFF, 0x9C, 0x6C, 0x43, 0xFD, 0xB7, 0x94, 0x73, 0x80, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xAA, 0x81, 0x5D, 0x55, 0x82, 0x4A, 0x1F, 0xF9, 0x76, 0x38, 0x08, 0xFF, 0x7C, 0x3F, + 0x09, 0xFF, 0x9E, 0x7D, 0x5A, 0xFF, 0xE3, 0xE1, 0xDF, 0xFF, 0xE8, 0xE8, 0xE8, 0xFF, 0xEA, 0xEA, + 0xEA, 0xFF, 0xEB, 0xEB, 0xEB, 0xFF, 0xD3, 0xD0, 0xCB, 0xFF, 0xA6, 0x9C, 0x8C, 0xFF, 0xA6, 0x95, + 0x7D, 0xFF, 0x84, 0x59, 0x27, 0xFF, 0x87, 0x4B, 0x0C, 0xFF, 0x91, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x92, 0x51, + 0x0F, 0xFF, 0x92, 0x51, 0x0F, 0xFF, 0x91, 0x50, 0x0E, 0xFF, 0x90, 0x4F, 0x0F, 0xFF, 0x92, 0x55, + 0x18, 0xFF, 0x97, 0x61, 0x2E, 0xFF, 0xAA, 0x7F, 0x57, 0xDA, 0xC8, 0xA8, 0x8B, 0x1F, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xC3, + 0xA9, 0x0C, 0xA0, 0x71, 0x48, 0xB8, 0x7C, 0x3F, 0x0F, 0xFF, 0x81, 0x41, 0x0A, 0xFF, 0x88, 0x48, + 0x0C, 0xFF, 0xAF, 0x8D, 0x68, 0xFF, 0xEB, 0xEA, 0xE9, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xEC, 0xEC, + 0xEC, 0xFF, 0xEF, 0xEF, 0xEE, 0xFF, 0xF1, 0xF1, 0xF1, 0xFF, 0xDD, 0xDB, 0xD6, 0xFF, 0xA7, 0x9E, + 0x8D, 0xFF, 0xAB, 0x9E, 0x8A, 0xFF, 0x91, 0x70, 0x47, 0xFF, 0x86, 0x4F, 0x11, 0xFF, 0x94, 0x55, + 0x11, 0xFF, 0x97, 0x56, 0x12, 0xFF, 0x97, 0x56, 0x12, 0xFF, 0x96, 0x56, 0x11, 0xFF, 0x96, 0x55, + 0x10, 0xFF, 0x96, 0x55, 0x10, 0xFF, 0x96, 0x54, 0x10, 0xFF, 0x95, 0x54, 0x0F, 0xFF, 0x93, 0x52, + 0x0F, 0xFF, 0x93, 0x54, 0x16, 0xFF, 0xA2, 0x6E, 0x3D, 0xFC, 0xC1, 0x9E, 0x7B, 0x70, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0x96, + 0x71, 0x2C, 0x94, 0x5D, 0x2E, 0xE9, 0x81, 0x41, 0x0B, 0xFF, 0x8B, 0x4A, 0x0D, 0xFF, 0x92, 0x51, + 0x0E, 0xFF, 0x96, 0x5B, 0x19, 0xFF, 0xCB, 0xB5, 0x9B, 0xFF, 0xEE, 0xEF, 0xEF, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xEE, 0xEE, 0xEE, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xF3, 0xF3, 0xF3, 0xFF, 0xE7, 0xE5, + 0xE3, 0xFF, 0xB1, 0xA9, 0x99, 0xFF, 0xAB, 0x9F, 0x8B, 0xFF, 0xA5, 0x8F, 0x70, 0xFF, 0x89, 0x59, + 0x1D, 0xFF, 0x96, 0x59, 0x14, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9D, 0x5D, 0x16, 0xFF, 0x9C, 0x5C, + 0x16, 0xFF, 0x9C, 0x5C, 0x15, 0xFF, 0x9B, 0x5A, 0x13, 0xFF, 0x9A, 0x59, 0x11, 0xFF, 0x99, 0x57, + 0x10, 0xFF, 0x96, 0x54, 0x0F, 0xFF, 0x99, 0x5C, 0x1F, 0xFF, 0xB6, 0x8C, 0x62, 0xB9, 0xD0, 0xBD, + 0xA8, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x88, + 0x5F, 0x50, 0x8F, 0x53, 0x1F, 0xFA, 0x89, 0x47, 0x0B, 0xFF, 0x93, 0x52, 0x0F, 0xFF, 0x9C, 0x5B, + 0x14, 0xFF, 0xA0, 0x60, 0x18, 0xFF, 0xA4, 0x70, 0x33, 0xFF, 0xD7, 0xCC, 0xBC, 0xFF, 0xE9, 0xEA, + 0xEA, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEE, 0xEE, + 0xEE, 0xFF, 0xE9, 0xE9, 0xE8, 0xFF, 0xBD, 0xB5, 0xA7, 0xFF, 0xA8, 0x9D, 0x87, 0xFF, 0xB6, 0xA7, + 0x91, 0xFF, 0x8F, 0x68, 0x33, 0xFF, 0x97, 0x5E, 0x19, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA3, 0x64, + 0x1C, 0xFF, 0xA2, 0x64, 0x1C, 0xFF, 0xA2, 0x63, 0x1C, 0xFF, 0xA1, 0x62, 0x1A, 0xFF, 0x9F, 0x5E, + 0x14, 0xFF, 0x9C, 0x5A, 0x11, 0xFF, 0x99, 0x58, 0x13, 0xFF, 0xAC, 0x79, 0x44, 0xDC, 0xCE, 0xAF, + 0x90, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x86, + 0x5A, 0x75, 0x91, 0x52, 0x18, 0xFF, 0x92, 0x50, 0x0F, 0xFF, 0x9F, 0x60, 0x1B, 0xFF, 0xA7, 0x69, + 0x22, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA7, 0x6A, 0x21, 0xFF, 0xAD, 0x82, 0x4B, 0xFF, 0xD9, 0xD3, + 0xCB, 0xFF, 0xE1, 0xE1, 0xE2, 0xFF, 0xE0, 0xE0, 0xE0, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE1, 0xE0, + 0xDF, 0xFF, 0xE4, 0xE4, 0xE3, 0xFF, 0xE7, 0xE7, 0xE7, 0xFF, 0xC8, 0xC1, 0xB7, 0xFF, 0xA7, 0x9B, + 0x84, 0xFF, 0xBE, 0xB4, 0xA4, 0xFF, 0x9B, 0x7D, 0x52, 0xFF, 0x98, 0x64, 0x21, 0xFF, 0xA7, 0x6A, + 0x22, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA9, 0x6C, 0x23, 0xFF, 0xA9, 0x6B, + 0x22, 0xFF, 0xA5, 0x65, 0x1A, 0xFF, 0x9F, 0x5C, 0x12, 0xFF, 0xAA, 0x72, 0x35, 0xED, 0xCC, 0xA9, + 0x82, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0xB9, 0x8D, + 0x60, 0x94, 0x97, 0x56, 0x18, 0xFF, 0xA0, 0x62, 0x1F, 0xFF, 0xAB, 0x6E, 0x28, 0xFF, 0xAF, 0x72, + 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xAC, 0x71, 0x29, 0xFF, 0xB5, 0x92, + 0x64, 0xFF, 0xD5, 0xD3, 0xCF, 0xFF, 0xD9, 0xD9, 0xDA, 0xFF, 0xDB, 0xDB, 0xDB, 0xFF, 0xB8, 0xAE, + 0x9C, 0xFF, 0xB9, 0xAC, 0x94, 0xFF, 0xDF, 0xDE, 0xDD, 0xFF, 0xE3, 0xE3, 0xE3, 0xFF, 0xD1, 0xCD, + 0xC5, 0xFF, 0xAC, 0xA2, 0x8C, 0xFF, 0xC2, 0xBB, 0xAE, 0xFF, 0xAC, 0x98, 0x79, 0xFF, 0x99, 0x6C, + 0x2D, 0xFF, 0xAA, 0x70, 0x28, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xB0, 0x73, 0x2A, 0xFF, 0xB0, 0x73, + 0x2A, 0xFF, 0xAF, 0x73, 0x29, 0xFF, 0xA9, 0x6A, 0x1F, 0xFF, 0xAD, 0x74, 0x32, 0xF5, 0xCE, 0xA9, + 0x81, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x03, 0xBF, 0x94, + 0x67, 0x9D, 0xA4, 0x68, 0x2B, 0xFF, 0xAC, 0x70, 0x2E, 0xFF, 0xB2, 0x77, 0x30, 0xFF, 0xB5, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB3, 0x7D, + 0x37, 0xFF, 0xC1, 0xA9, 0x88, 0xFF, 0xD6, 0xD6, 0xD5, 0xFF, 0xD8, 0xD8, 0xD8, 0xFF, 0xCD, 0xCA, + 0xC2, 0xFF, 0xBB, 0xB0, 0x9A, 0xFF, 0xBF, 0xB4, 0x9E, 0xFF, 0xBE, 0xB5, 0xA0, 0xFF, 0xD2, 0xCE, + 0xC3, 0xFF, 0xD8, 0xD6, 0xD3, 0xFF, 0xB7, 0xAF, 0x9D, 0xFF, 0xC4, 0xBF, 0xB2, 0xFF, 0xBC, 0xAF, + 0x9A, 0xFF, 0x9F, 0x78, 0x3F, 0xFF, 0xAF, 0x78, 0x30, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB6, 0x7B, + 0x31, 0xFF, 0xB6, 0x7B, 0x31, 0xFF, 0xB4, 0x79, 0x30, 0xFF, 0xB8, 0x81, 0x41, 0xF7, 0xD2, 0xAF, + 0x86, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x01, 0xC9, 0x9F, + 0x73, 0x8E, 0xB1, 0x78, 0x3C, 0xFF, 0xB4, 0x79, 0x36, 0xFF, 0xB9, 0x80, 0x38, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBE, 0x87, 0x3F, 0xFF, 0xC4, 0x92, + 0x51, 0xFF, 0xC2, 0x97, 0x5D, 0xFF, 0xCF, 0xBE, 0xA8, 0xFF, 0xDC, 0xDD, 0xDD, 0xFF, 0xDF, 0xDF, + 0xE0, 0xFF, 0xD5, 0xD2, 0xCB, 0xFF, 0xC5, 0xBD, 0xAA, 0xFF, 0xCC, 0xC5, 0xB8, 0xFF, 0xD1, 0xCE, + 0xC8, 0xFF, 0xDE, 0xDE, 0xDF, 0xFF, 0xDD, 0xDC, 0xDA, 0xFF, 0xC3, 0xBE, 0xAF, 0xFF, 0xC8, 0xC2, + 0xB6, 0xFF, 0xCA, 0xBF, 0xAE, 0xFF, 0xAE, 0x82, 0x44, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xBC, 0x83, + 0x39, 0xFF, 0xBC, 0x83, 0x39, 0xFF, 0xBB, 0x82, 0x38, 0xFF, 0xC2, 0x90, 0x53, 0xF3, 0xD8, 0xB7, + 0x8F, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xA4, + 0x76, 0x6B, 0xBA, 0x84, 0x49, 0xFF, 0xBB, 0x82, 0x3E, 0xFF, 0xC0, 0x88, 0x40, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC3, 0x8D, 0x45, 0xFF, 0xCC, 0x9C, 0x5D, 0xFF, 0xCF, 0xA1, + 0x65, 0xFF, 0xCE, 0xA0, 0x64, 0xFF, 0xCB, 0xA4, 0x70, 0xFF, 0xDA, 0xD0, 0xC0, 0xFF, 0xE6, 0xE7, + 0xE8, 0xFF, 0xDA, 0xD6, 0xCE, 0xFF, 0xCE, 0xC7, 0xB6, 0xFF, 0xC9, 0xC0, 0xAF, 0xFF, 0xD1, 0xCA, + 0xBD, 0xFF, 0xDE, 0xDD, 0xDD, 0xFF, 0xE0, 0xE0, 0xE1, 0xFF, 0xE3, 0xE2, 0xE2, 0xFF, 0xD2, 0xCF, + 0xC4, 0xFF, 0xCD, 0xC4, 0xB2, 0xFF, 0xB9, 0x90, 0x54, 0xFF, 0xC1, 0x8A, 0x40, 0xFF, 0xC2, 0x8B, + 0x41, 0xFF, 0xC2, 0x8B, 0x41, 0xFF, 0xC1, 0x8A, 0x41, 0xFF, 0xCB, 0x9C, 0x60, 0xEA, 0xDD, 0xBF, + 0x99, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xAE, + 0x80, 0x47, 0xC5, 0x93, 0x58, 0xF7, 0xC2, 0x8A, 0x47, 0xFF, 0xC8, 0x91, 0x49, 0xFF, 0xCA, 0x94, + 0x4A, 0xFF, 0xCA, 0x94, 0x4A, 0xFF, 0xCF, 0x9D, 0x5B, 0xFF, 0xD5, 0xAB, 0x72, 0xFF, 0xD5, 0xAB, + 0x72, 0xFF, 0xD5, 0xAB, 0x72, 0xFF, 0xD4, 0xAA, 0x71, 0xFF, 0xD3, 0xB2, 0x83, 0xFF, 0xE5, 0xDE, + 0xD5, 0xFF, 0xDE, 0xDC, 0xD7, 0xFF, 0xCC, 0xC5, 0xB6, 0xFF, 0xD5, 0xD1, 0xC5, 0xFF, 0xBE, 0xB5, + 0x9E, 0xFF, 0xE1, 0xE0, 0xDF, 0xFF, 0xE4, 0xE4, 0xE4, 0xFF, 0xE5, 0xE5, 0xE5, 0xFF, 0xE9, 0xE9, + 0xE9, 0xFF, 0xD1, 0xC5, 0xB0, 0xFF, 0xBA, 0x92, 0x54, 0xFF, 0xC5, 0x91, 0x48, 0xFF, 0xCA, 0x94, + 0x4A, 0xFF, 0xCA, 0x94, 0x4A, 0xFF, 0xCA, 0x95, 0x4D, 0xFF, 0xD4, 0xA9, 0x72, 0xD5, 0xDE, 0xC4, + 0xA2, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDF, 0xBD, + 0x92, 0x23, 0xD2, 0xA4, 0x6C, 0xE2, 0xCB, 0x94, 0x51, 0xFF, 0xCE, 0x99, 0x51, 0xFF, 0xD1, 0x9C, + 0x52, 0xFF, 0xD2, 0x9E, 0x55, 0xFF, 0xDA, 0xB0, 0x75, 0xFF, 0xDC, 0xB6, 0x7F, 0xFF, 0xDC, 0xB6, + 0x7F, 0xFF, 0xDC, 0xB6, 0x7F, 0xFF, 0xDC, 0xB6, 0x7F, 0xFF, 0xDB, 0xB5, 0x7D, 0xFF, 0xDB, 0xBF, + 0x96, 0xFF, 0xEA, 0xE6, 0xDF, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEC, 0xEC, 0xEC, 0xFF, 0xE6, 0xE6, + 0xE5, 0xFF, 0xE9, 0xE9, 0xE9, 0xFF, 0xEA, 0xEA, 0xEA, 0xFF, 0xEA, 0xEA, 0xE9, 0xFF, 0xEB, 0xEB, + 0xE9, 0xFF, 0xE2, 0xE0, 0xD8, 0xFF, 0xCB, 0xBB, 0x9D, 0xFF, 0xC0, 0x9C, 0x61, 0xFF, 0xCE, 0x9B, + 0x51, 0xFF, 0xD1, 0x9C, 0x52, 0xFF, 0xD3, 0xA1, 0x5C, 0xFF, 0xDD, 0xB8, 0x87, 0xAC, 0xD7, 0xCD, + 0xBF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xDF, + 0xC4, 0x06, 0xDD, 0xB4, 0x81, 0xA0, 0xD4, 0xA0, 0x5F, 0xFF, 0xD5, 0xA1, 0x59, 0xFF, 0xD7, 0xA4, + 0x5A, 0xFF, 0xDA, 0xA9, 0x61, 0xFF, 0xE2, 0xBD, 0x86, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE3, 0xBF, + 0x8B, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE3, 0xBF, 0x8B, 0xFF, 0xE2, 0xBE, + 0x8A, 0xFF, 0xE1, 0xCA, 0xA5, 0xFF, 0xEF, 0xEC, 0xE6, 0xFF, 0xF2, 0xF3, 0xF3, 0xFF, 0xF0, 0xF0, + 0xF0, 0xFF, 0xF0, 0xF0, 0xF0, 0xFF, 0xEF, 0xEF, 0xEF, 0xFF, 0xEC, 0xEC, 0xE9, 0xFF, 0xEF, 0xEF, + 0xEE, 0xFF, 0xED, 0xED, 0xEA, 0xFF, 0xEB, 0xEA, 0xE6, 0xFF, 0xD7, 0xC2, 0x9F, 0xFF, 0xD3, 0xA2, + 0x5A, 0xFF, 0xD8, 0xA5, 0x5B, 0xFF, 0xDC, 0xB0, 0x70, 0xF7, 0xE2, 0xC3, 0x98, 0x56, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE3, 0xBF, 0x90, 0x41, 0xDE, 0xB1, 0x75, 0xF2, 0xDB, 0xA8, 0x62, 0xFF, 0xDD, 0xAC, + 0x62, 0xFF, 0xE0, 0xB1, 0x6B, 0xFF, 0xE8, 0xC7, 0x92, 0xFF, 0xE9, 0xC9, 0x97, 0xFF, 0xE9, 0xC9, + 0x96, 0xFF, 0xE9, 0xC9, 0x96, 0xFF, 0xE9, 0xC9, 0x96, 0xFF, 0xE9, 0xC9, 0x96, 0xFF, 0xE9, 0xC9, + 0x96, 0xFF, 0xE7, 0xC8, 0x96, 0xFF, 0xE7, 0xD2, 0xAF, 0xFF, 0xF2, 0xEF, 0xE9, 0xFF, 0xF5, 0xF6, + 0xF7, 0xFF, 0xF3, 0xF3, 0xF2, 0xFF, 0xF3, 0xF3, 0xF1, 0xFF, 0xF4, 0xF4, 0xF4, 0xFF, 0xF4, 0xF4, + 0xF3, 0xFF, 0xEA, 0xEA, 0xE4, 0xFF, 0xEC, 0xE5, 0xD9, 0xFF, 0xD7, 0xB4, 0x7B, 0xFF, 0xDC, 0xAC, + 0x62, 0xFF, 0xE0, 0xB0, 0x69, 0xFF, 0xE5, 0xC0, 0x89, 0xCA, 0xE7, 0xCF, 0xA9, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xE6, 0xCD, 0xA7, 0x09, 0xE6, 0xC0, 0x8B, 0xA1, 0xE2, 0xB3, 0x72, 0xFF, 0xE2, 0xB2, + 0x6A, 0xFF, 0xE5, 0xB8, 0x71, 0xFF, 0xED, 0xCD, 0x9A, 0xFF, 0xEE, 0xD1, 0xA2, 0xFF, 0xEE, 0xD1, + 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xEE, 0xD1, + 0xA1, 0xFF, 0xEE, 0xD1, 0xA1, 0xFF, 0xED, 0xD0, 0xA1, 0xFF, 0xEC, 0xD7, 0xB3, 0xFF, 0xF2, 0xEA, + 0xDC, 0xFF, 0xEA, 0xDB, 0xC0, 0xFF, 0xED, 0xDE, 0xC4, 0xFF, 0xF6, 0xF4, 0xEF, 0xFF, 0xE9, 0xE8, + 0xE1, 0xFF, 0xF4, 0xF1, 0xEB, 0xFF, 0xE4, 0xCC, 0xA0, 0xFF, 0xE1, 0xB3, 0x6A, 0xFF, 0xE4, 0xB5, + 0x6C, 0xFF, 0xE7, 0xBE, 0x80, 0xF6, 0xEB, 0xCD, 0x9F, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEB, 0xCC, 0x9C, 0x2A, 0xEA, 0xC3, 0x8A, 0xD9, 0xE8, 0xBA, + 0x76, 0xFF, 0xE9, 0xBB, 0x74, 0xFF, 0xEF, 0xCE, 0x98, 0xFF, 0xF2, 0xD8, 0xAC, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, + 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF2, 0xD7, 0xAB, 0xFF, 0xF1, 0xD7, 0xAA, 0xFF, 0xF0, 0xD7, + 0xAD, 0xFF, 0xF0, 0xD6, 0xAA, 0xFF, 0xF0, 0xD6, 0xAB, 0xFF, 0xF1, 0xE1, 0xC3, 0xFF, 0xF4, 0xEF, + 0xE3, 0xFF, 0xED, 0xDC, 0xBD, 0xFF, 0xE9, 0xC3, 0x85, 0xFF, 0xE9, 0xBB, 0x72, 0xFF, 0xEB, 0xC1, + 0x7F, 0xFF, 0xEE, 0xCE, 0x9A, 0xA5, 0xED, 0xD8, 0xB7, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEF, 0xCF, 0x9C, 0x4B, 0xEE, 0xC8, + 0x8D, 0xE8, 0xED, 0xC0, 0x7C, 0xFF, 0xEF, 0xC9, 0x88, 0xFF, 0xF5, 0xDC, 0xB1, 0xFF, 0xF5, 0xDD, + 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, + 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, + 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF5, 0xDD, 0xB4, 0xFF, 0xF4, 0xDD, 0xB4, 0xFF, 0xF4, 0xE0, + 0xBB, 0xFF, 0xF2, 0xD7, 0xA8, 0xFF, 0xEE, 0xC4, 0x7E, 0xFF, 0xEE, 0xC7, 0x83, 0xFF, 0xF1, 0xD1, + 0x99, 0xC2, 0xF1, 0xD8, 0xAE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x01, 0xF3, 0xD3, + 0xA0, 0x56, 0xF2, 0xCE, 0x93, 0xE7, 0xF1, 0xC9, 0x86, 0xFF, 0xF4, 0xD5, 0x9F, 0xFF, 0xF8, 0xE2, + 0xBB, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, + 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, + 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF8, 0xE3, 0xBC, 0xFF, 0xF7, 0xE0, + 0xB6, 0xFF, 0xF3, 0xD0, 0x92, 0xFF, 0xF2, 0xCC, 0x8A, 0xFF, 0xF4, 0xD4, 0x9E, 0xC4, 0xF4, 0xDA, + 0xAE, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, + 0xFF, 0x01, 0xF5, 0xD7, 0xA5, 0x44, 0xF5, 0xD4, 0x9B, 0xCE, 0xF5, 0xD1, 0x93, 0xFF, 0xF7, 0xDB, + 0xA8, 0xFF, 0xFA, 0xE5, 0xC0, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, + 0xC2, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, 0xC2, 0xFF, 0xFA, 0xE6, + 0xC2, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xFA, 0xE6, 0xC3, 0xFF, 0xF9, 0xE3, 0xBB, 0xFF, 0xF6, 0xD7, + 0x9E, 0xFF, 0xF6, 0xD3, 0x96, 0xF8, 0xF7, 0xD8, 0xA4, 0xA6, 0xF7, 0xDD, 0xB1, 0x21, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xDA, 0xAC, 0x1E, 0xF7, 0xD9, 0xA4, 0x84, 0xF8, 0xD8, + 0x9F, 0xE5, 0xF9, 0xDC, 0xA8, 0xFF, 0xFB, 0xE4, 0xBD, 0xFF, 0xFC, 0xE8, 0xC8, 0xFF, 0xFC, 0xE9, + 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xEA, 0xCA, 0xFF, 0xFC, 0xE9, 0xCA, 0xFF, 0xFC, 0xE9, + 0xC9, 0xFF, 0xFC, 0xE8, 0xC5, 0xFF, 0xFB, 0xE2, 0xB7, 0xFF, 0xF9, 0xDB, 0xA4, 0xFA, 0xF8, 0xDA, + 0xA3, 0xCE, 0xF8, 0xDC, 0xAB, 0x5B, 0xF9, 0xE2, 0xB9, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1, 0xE6, 0xCF, 0x03, 0xF8, 0xDD, + 0xAC, 0x2A, 0xF9, 0xDC, 0xA9, 0x71, 0xFA, 0xDD, 0xAA, 0xC4, 0xFB, 0xE1, 0xB2, 0xE5, 0xFB, 0xE4, + 0xB8, 0xF2, 0xFB, 0xE6, 0xBE, 0xF8, 0xFB, 0xE7, 0xC0, 0xF9, 0xFB, 0xE5, 0xBD, 0xF7, 0xFB, 0xE3, + 0xB6, 0xEF, 0xFB, 0xE1, 0xB0, 0xDD, 0xFA, 0xDE, 0xAB, 0xAD, 0xF9, 0xDE, 0xAC, 0x56, 0xF8, 0xE0, + 0xB4, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xE2, 0xB6, 0x12, 0xFB, 0xDF, 0xAD, 0x2D, 0xFB, 0xDF, + 0xAB, 0x46, 0xFB, 0xE0, 0xAE, 0x58, 0xFB, 0xE1, 0xB0, 0x5C, 0xFB, 0xE0, 0xAE, 0x53, 0xFB, 0xDF, + 0xAC, 0x3E, 0xFB, 0xE1, 0xB1, 0x24, 0xFC, 0xE7, 0xC1, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x03, 0xE0, 0x00, + 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, 0x00, 0x01, 0xE0, 0x00, + 0x00, 0x03, 0xF8, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x0F, 0xF0, 0x00, 0x00, 0x07, 0xE0, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x01, 0xC0, 0x00, + 0x00, 0x03, 0xE0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x07, 0xF8, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFC, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x80, + 0x01, 0xFF, 0xFF, 0xF0, 0x07, 0xFF +}; + +void *get_window_icon_raw_data(int *len) +{ + *len = (int)sizeof(window_icon_hexData); + return window_icon_hexData; +} + diff --git a/src/gui/Include/Hiperiso2Disk.h b/src/gui/Include/Hiperiso2Disk.h new file mode 100644 index 0000000..1fc3c0f --- /dev/null +++ b/src/gui/Include/Hiperiso2Disk.h @@ -0,0 +1,26 @@ +/****************************************************************************** + * Hiperiso2Disk.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO2DISK_H__ +#define __HIPERISO2DISK_H__ + + + +#endif /* __HIPERISO2DISK_H__ */ + diff --git a/src/gui/Lib/exfat/buidexfat.sh b/src/gui/Lib/exfat/buidexfat.sh new file mode 100644 index 0000000..00a83c6 --- /dev/null +++ b/src/gui/Lib/exfat/buidexfat.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +CUR="$PWD" + +rm -rf src +mkdir -p src/libexfat +mkdir -p src/mkfs + +rm -rf exfat-1.3.0 +unzip exfat-1.3.0.zip + +cd exfat-1.3.0 +autoreconf --install +./configure --prefix="$CUR" CFLAGS='-O2 -D_FILE_OFFSET_BITS=64' +make + +cp -a libexfat/*.c ../src/libexfat/ +cp -a libexfat/*.h ../src/libexfat/ +cp -a mkfs/*.c ../src/mkfs/ +cp -a mkfs/*.h ../src/mkfs/ +rm -f ../src/libexfat/log.c + +cd .. +rm -rf exfat-1.3.0 + +mv src/mkfs/main.c src/mkfs/mkexfat_main.c +sed 's//"exfat.h"/g' -i src/mkfs/mkexfat_main.c +sed 's//"exfat.h"/g' -i src/mkfs/mkexfat.h +sed 's/int main/int mkexfat_main/g' -i src/mkfs/mkexfat_main.c + diff --git a/src/gui/Lib/exfat/exfat-1.3.0.zip b/src/gui/Lib/exfat/exfat-1.3.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..aa1d5f39014fe13e7803605fad0cdf42088dd022 GIT binary patch literal 90929 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%0A|YcOifthU*)sS787@G7(_K2M)3 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 literal 0 HcmV?d00001 diff --git a/src/gui/Lib/exfat/src/libexfat/byteorder.h b/src/gui/Lib/exfat/src/libexfat/byteorder.h new file mode 100644 index 0000000..ba54410 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/byteorder.h @@ -0,0 +1,68 @@ +/* + byteorder.h (12.01.10) + Endianness stuff. exFAT uses little-endian byte order. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef BYTEORDER_H_INCLUDED +#define BYTEORDER_H_INCLUDED + +#include "platform.h" +#include +#include + +typedef struct { uint16_t __u16; } le16_t; +typedef struct { uint32_t __u32; } le32_t; +typedef struct { uint64_t __u64; } le64_t; + +#if EXFAT_BYTE_ORDER == EXFAT_LITTLE_ENDIAN + +static inline uint16_t le16_to_cpu(le16_t v) { return v.__u16; } +static inline uint32_t le32_to_cpu(le32_t v) { return v.__u32; } +static inline uint64_t le64_to_cpu(le64_t v) { return v.__u64; } + +static inline le16_t cpu_to_le16(uint16_t v) { le16_t t = {v}; return t; } +static inline le32_t cpu_to_le32(uint32_t v) { le32_t t = {v}; return t; } +static inline le64_t cpu_to_le64(uint64_t v) { le64_t t = {v}; return t; } + +typedef size_t bitmap_t; + +#elif EXFAT_BYTE_ORDER == EXFAT_BIG_ENDIAN + +static inline uint16_t le16_to_cpu(le16_t v) + { return exfat_bswap16(v.__u16); } +static inline uint32_t le32_to_cpu(le32_t v) + { return exfat_bswap32(v.__u32); } +static inline uint64_t le64_to_cpu(le64_t v) + { return exfat_bswap64(v.__u64); } + +static inline le16_t cpu_to_le16(uint16_t v) + { le16_t t = {exfat_bswap16(v)}; return t; } +static inline le32_t cpu_to_le32(uint32_t v) + { le32_t t = {exfat_bswap32(v)}; return t; } +static inline le64_t cpu_to_le64(uint64_t v) + { le64_t t = {exfat_bswap64(v)}; return t; } + +typedef unsigned char bitmap_t; + +#else +#error Wow! You have a PDP machine?! +#endif + +#endif /* ifndef BYTEORDER_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/cluster.c b/src/gui/Lib/exfat/src/libexfat/cluster.c new file mode 100644 index 0000000..15cd9aa --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/cluster.c @@ -0,0 +1,491 @@ +/* + cluster.c (03.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include + +/* + * Sector to absolute offset. + */ +static off_t s2o(const struct exfat* ef, off_t sector) +{ + return sector << ef->sb->sector_bits; +} + +/* + * Cluster to sector. + */ +static off_t c2s(const struct exfat* ef, cluster_t cluster) +{ + if (cluster < EXFAT_FIRST_DATA_CLUSTER) + exfat_bug("invalid cluster number %u", cluster); + return le32_to_cpu(ef->sb->cluster_sector_start) + + ((off_t) (cluster - EXFAT_FIRST_DATA_CLUSTER) << ef->sb->spc_bits); +} + +/* + * Cluster to absolute offset. + */ +off_t exfat_c2o(const struct exfat* ef, cluster_t cluster) +{ + return s2o(ef, c2s(ef, cluster)); +} + +/* + * Sector to cluster. + */ +static cluster_t s2c(const struct exfat* ef, off_t sector) +{ + return ((sector - le32_to_cpu(ef->sb->cluster_sector_start)) >> + ef->sb->spc_bits) + EXFAT_FIRST_DATA_CLUSTER; +} + +/* + * Size in bytes to size in clusters (rounded upwards). + */ +static uint32_t bytes2clusters(const struct exfat* ef, uint64_t bytes) +{ + uint64_t cluster_size = CLUSTER_SIZE(*ef->sb); + return DIV_ROUND_UP(bytes, cluster_size); +} + +cluster_t exfat_next_cluster(const struct exfat* ef, + const struct exfat_node* node, cluster_t cluster) +{ + le32_t next; + off_t fat_offset; + + if (cluster < EXFAT_FIRST_DATA_CLUSTER) + exfat_bug("bad cluster 0x%x", cluster); + + if (node->is_contiguous) + return cluster + 1; + fat_offset = s2o(ef, le32_to_cpu(ef->sb->fat_sector_start)) + + cluster * sizeof(cluster_t); + if (exfat_pread(ef->dev, &next, sizeof(next), fat_offset) < 0) + return EXFAT_CLUSTER_BAD; /* the caller should handle this and print + appropriate error message */ + return le32_to_cpu(next); +} + +cluster_t exfat_advance_cluster(const struct exfat* ef, + struct exfat_node* node, uint32_t count) +{ + uint32_t i; + + if (node->fptr_index > count) + { + node->fptr_index = 0; + node->fptr_cluster = node->start_cluster; + } + + for (i = node->fptr_index; i < count; i++) + { + node->fptr_cluster = exfat_next_cluster(ef, node, node->fptr_cluster); + if (CLUSTER_INVALID(*ef->sb, node->fptr_cluster)) + break; /* the caller should handle this and print appropriate + error message */ + } + node->fptr_index = count; + return node->fptr_cluster; +} + +static cluster_t find_bit_and_set(bitmap_t* bitmap, size_t start, size_t end) +{ + const size_t start_index = start / sizeof(bitmap_t) / 8; + const size_t end_index = DIV_ROUND_UP(end, sizeof(bitmap_t) * 8); + size_t i; + size_t start_bitindex; + size_t end_bitindex; + size_t c; + + for (i = start_index; i < end_index; i++) + { + if (bitmap[i] == ~((bitmap_t) 0)) + continue; + start_bitindex = MAX(i * sizeof(bitmap_t) * 8, start); + end_bitindex = MIN((i + 1) * sizeof(bitmap_t) * 8, end); + for (c = start_bitindex; c < end_bitindex; c++) + if (BMAP_GET(bitmap, c) == 0) + { + BMAP_SET(bitmap, c); + return c + EXFAT_FIRST_DATA_CLUSTER; + } + } + return EXFAT_CLUSTER_END; +} + +static int flush_nodes(struct exfat* ef, struct exfat_node* node) +{ + struct exfat_node* p; + + for (p = node->child; p != NULL; p = p->next) + { + int rc = flush_nodes(ef, p); + if (rc != 0) + return rc; + } + return exfat_flush_node(ef, node); +} + +int exfat_flush_nodes(struct exfat* ef) +{ + return flush_nodes(ef, ef->root); +} + +int exfat_flush(struct exfat* ef) +{ + if (ef->cmap.dirty) + { + if (exfat_pwrite(ef->dev, ef->cmap.chunk, + BMAP_SIZE(ef->cmap.chunk_size), + exfat_c2o(ef, ef->cmap.start_cluster)) < 0) + { + exfat_error("failed to write clusters bitmap"); + return -EIO; + } + ef->cmap.dirty = false; + } + + return 0; +} + +static bool set_next_cluster(const struct exfat* ef, bool contiguous, + cluster_t current, cluster_t next) +{ + off_t fat_offset; + le32_t next_le32; + + if (contiguous) + return true; + fat_offset = s2o(ef, le32_to_cpu(ef->sb->fat_sector_start)) + + current * sizeof(cluster_t); + next_le32 = cpu_to_le32(next); + if (exfat_pwrite(ef->dev, &next_le32, sizeof(next_le32), fat_offset) < 0) + { + exfat_error("failed to write the next cluster %#x after %#x", next, + current); + return false; + } + return true; +} + +static cluster_t allocate_cluster(struct exfat* ef, cluster_t hint) +{ + cluster_t cluster; + + hint -= EXFAT_FIRST_DATA_CLUSTER; + if (hint >= ef->cmap.chunk_size) + hint = 0; + + cluster = find_bit_and_set(ef->cmap.chunk, hint, ef->cmap.chunk_size); + if (cluster == EXFAT_CLUSTER_END) + cluster = find_bit_and_set(ef->cmap.chunk, 0, hint); + if (cluster == EXFAT_CLUSTER_END) + { + exfat_error("no free space left"); + return EXFAT_CLUSTER_END; + } + + ef->cmap.dirty = true; + return cluster; +} + +static void free_cluster(struct exfat* ef, cluster_t cluster) +{ + if (cluster - EXFAT_FIRST_DATA_CLUSTER >= ef->cmap.size) + exfat_bug("caller must check cluster validity (%#x, %#x)", cluster, + ef->cmap.size); + + BMAP_CLR(ef->cmap.chunk, cluster - EXFAT_FIRST_DATA_CLUSTER); + ef->cmap.dirty = true; +} + +static bool make_noncontiguous(const struct exfat* ef, cluster_t first, + cluster_t last) +{ + cluster_t c; + + for (c = first; c < last; c++) + if (!set_next_cluster(ef, false, c, c + 1)) + return false; + return true; +} + +static int shrink_file(struct exfat* ef, struct exfat_node* node, + uint32_t current, uint32_t difference); + +static int grow_file(struct exfat* ef, struct exfat_node* node, + uint32_t current, uint32_t difference) +{ + cluster_t previous; + cluster_t next; + uint32_t allocated = 0; + + if (difference == 0) + exfat_bug("zero clusters count passed"); + + if (node->start_cluster != EXFAT_CLUSTER_FREE) + { + /* get the last cluster of the file */ + previous = exfat_advance_cluster(ef, node, current - 1); + if (CLUSTER_INVALID(*ef->sb, previous)) + { + exfat_error("invalid cluster 0x%x while growing", previous); + return -EIO; + } + } + else + { + if (node->fptr_index != 0) + exfat_bug("non-zero pointer index (%u)", node->fptr_index); + /* file does not have clusters (i.e. is empty), allocate + the first one for it */ + previous = allocate_cluster(ef, 0); + if (CLUSTER_INVALID(*ef->sb, previous)) + return -ENOSPC; + node->fptr_cluster = node->start_cluster = previous; + allocated = 1; + /* file consists of only one cluster, so it's contiguous */ + node->is_contiguous = true; + } + + while (allocated < difference) + { + next = allocate_cluster(ef, previous + 1); + if (CLUSTER_INVALID(*ef->sb, next)) + { + if (allocated != 0) + shrink_file(ef, node, current + allocated, allocated); + return -ENOSPC; + } + if (next != previous - 1 && node->is_contiguous) + { + /* it's a pity, but we are not able to keep the file contiguous + anymore */ + if (!make_noncontiguous(ef, node->start_cluster, previous)) + return -EIO; + node->is_contiguous = false; + node->is_dirty = true; + } + if (!set_next_cluster(ef, node->is_contiguous, previous, next)) + return -EIO; + previous = next; + allocated++; + } + + if (!set_next_cluster(ef, node->is_contiguous, previous, + EXFAT_CLUSTER_END)) + return -EIO; + return 0; +} + +static int shrink_file(struct exfat* ef, struct exfat_node* node, + uint32_t current, uint32_t difference) +{ + cluster_t previous; + cluster_t next; + + if (difference == 0) + exfat_bug("zero difference passed"); + if (node->start_cluster == EXFAT_CLUSTER_FREE) + exfat_bug("unable to shrink empty file (%u clusters)", current); + if (current < difference) + exfat_bug("file underflow (%u < %u)", current, difference); + + /* crop the file */ + if (current > difference) + { + cluster_t last = exfat_advance_cluster(ef, node, + current - difference - 1); + if (CLUSTER_INVALID(*ef->sb, last)) + { + exfat_error("invalid cluster 0x%x while shrinking", last); + return -EIO; + } + previous = exfat_next_cluster(ef, node, last); + if (!set_next_cluster(ef, node->is_contiguous, last, + EXFAT_CLUSTER_END)) + return -EIO; + } + else + { + previous = node->start_cluster; + node->start_cluster = EXFAT_CLUSTER_FREE; + node->is_dirty = true; + } + node->fptr_index = 0; + node->fptr_cluster = node->start_cluster; + + /* free remaining clusters */ + while (difference--) + { + if (CLUSTER_INVALID(*ef->sb, previous)) + { + exfat_error("invalid cluster 0x%x while freeing after shrink", + previous); + return -EIO; + } + + next = exfat_next_cluster(ef, node, previous); + if (!set_next_cluster(ef, node->is_contiguous, previous, + EXFAT_CLUSTER_FREE)) + return -EIO; + free_cluster(ef, previous); + previous = next; + } + return 0; +} + +static bool erase_raw(struct exfat* ef, size_t size, off_t offset) +{ + if (exfat_pwrite(ef->dev, ef->zero_cluster, size, offset) < 0) + { + exfat_error("failed to erase %zu bytes at %"PRId64, size, offset); + return false; + } + return true; +} + +static int erase_range(struct exfat* ef, struct exfat_node* node, + uint64_t begin, uint64_t end) +{ + uint64_t cluster_boundary; + cluster_t cluster; + + if (begin >= end) + return 0; + + cluster_boundary = (begin | (CLUSTER_SIZE(*ef->sb) - 1)) + 1; + cluster = exfat_advance_cluster(ef, node, + begin / CLUSTER_SIZE(*ef->sb)); + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while erasing", cluster); + return -EIO; + } + /* erase from the beginning to the closest cluster boundary */ + if (!erase_raw(ef, MIN(cluster_boundary, end) - begin, + exfat_c2o(ef, cluster) + begin % CLUSTER_SIZE(*ef->sb))) + return -EIO; + /* erase whole clusters */ + while (cluster_boundary < end) + { + cluster = exfat_next_cluster(ef, node, cluster); + /* the cluster cannot be invalid because we have just allocated it */ + if (CLUSTER_INVALID(*ef->sb, cluster)) + exfat_bug("invalid cluster 0x%x after allocation", cluster); + if (!erase_raw(ef, CLUSTER_SIZE(*ef->sb), exfat_c2o(ef, cluster))) + return -EIO; + cluster_boundary += CLUSTER_SIZE(*ef->sb); + } + return 0; +} + +int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size, + bool erase) +{ + uint32_t c1 = bytes2clusters(ef, node->size); + uint32_t c2 = bytes2clusters(ef, size); + int rc = 0; + + if (node->references == 0 && node->parent) + exfat_bug("no references, node changes can be lost"); + + if (node->size == size) + return 0; + + if (c1 < c2) + rc = grow_file(ef, node, c1, c2 - c1); + else if (c1 > c2) + rc = shrink_file(ef, node, c1, c1 - c2); + + if (rc != 0) + return rc; + + if (erase) + { + rc = erase_range(ef, node, node->size, size); + if (rc != 0) + return rc; + } + + exfat_update_mtime(node); + node->size = size; + node->is_dirty = true; + return 0; +} + +uint32_t exfat_count_free_clusters(const struct exfat* ef) +{ + uint32_t free_clusters = 0; + uint32_t i; + + for (i = 0; i < ef->cmap.size; i++) + if (BMAP_GET(ef->cmap.chunk, i) == 0) + free_clusters++; + return free_clusters; +} + +static int find_used_clusters(const struct exfat* ef, + cluster_t* a, cluster_t* b) +{ + const cluster_t end = le32_to_cpu(ef->sb->cluster_count); + + /* find first used cluster */ + for (*a = *b + 1; *a < end; (*a)++) + if (BMAP_GET(ef->cmap.chunk, *a - EXFAT_FIRST_DATA_CLUSTER)) + break; + if (*a >= end) + return 1; + + /* find last contiguous used cluster */ + for (*b = *a; *b < end; (*b)++) + if (BMAP_GET(ef->cmap.chunk, *b - EXFAT_FIRST_DATA_CLUSTER) == 0) + { + (*b)--; + break; + } + + return 0; +} + +int exfat_find_used_sectors(const struct exfat* ef, off_t* a, off_t* b) +{ + cluster_t ca, cb; + + if (*a == 0 && *b == 0) + ca = cb = EXFAT_FIRST_DATA_CLUSTER - 1; + else + { + ca = s2c(ef, *a); + cb = s2c(ef, *b); + } + if (find_used_clusters(ef, &ca, &cb) != 0) + return 1; + if (*a != 0 || *b != 0) + *a = c2s(ef, ca); + *b = c2s(ef, cb) + (CLUSTER_SIZE(*ef->sb) - 1) / SECTOR_SIZE(*ef->sb); + return 0; +} diff --git a/src/gui/Lib/exfat/src/libexfat/compiler.h b/src/gui/Lib/exfat/src/libexfat/compiler.h new file mode 100644 index 0000000..7eb686c --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/compiler.h @@ -0,0 +1,66 @@ +/* + compiler.h (09.06.13) + Compiler-specific definitions. Note that unknown compiler is not a + showstopper. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef COMPILER_H_INCLUDED +#define COMPILER_H_INCLUDED + +#if __STDC_VERSION__ < 199901L +#error C99-compliant compiler is required +#endif + +#if defined(__clang__) + +#define PRINTF __attribute__((format(printf, 1, 2))) +#define NORETURN __attribute__((noreturn)) +#define PACKED __attribute__((packed)) +#if __has_extension(c_static_assert) +#define USE_C11_STATIC_ASSERT +#endif + +#elif defined(__GNUC__) + +#define PRINTF __attribute__((format(printf, 1, 2))) +#define NORETURN __attribute__((noreturn)) +#define PACKED __attribute__((packed)) +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) +#define USE_C11_STATIC_ASSERT +#endif + +#else + +#define PRINTF +#define NORETURN +#define PACKED + +#endif + +#ifdef USE_C11_STATIC_ASSERT +#define STATIC_ASSERT(cond) _Static_assert(cond, #cond) +#else +#define CONCAT2(a, b) a ## b +#define CONCAT1(a, b) CONCAT2(a, b) +#define STATIC_ASSERT(cond) \ + extern void CONCAT1(static_assert, __LINE__)(int x[(cond) ? 1 : -1]) +#endif + +#endif /* ifndef COMPILER_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/config.h b/src/gui/Lib/exfat/src/libexfat/config.h new file mode 100644 index 0000000..73059a7 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/config.h @@ -0,0 +1,40 @@ +/* libexfat/config.h. Generated from config.h.in by configure. */ +/* libexfat/config.h.in. Generated from configure.ac by autoheader. */ + +/* Name of package */ +#define PACKAGE "exfat" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "relan@users.noreply.github.com" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "Free exFAT implementation" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "Free exFAT implementation 1.3.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "exfat" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "https://github.com/relan/exfat" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.3.0" + +/* Define if block devices are not supported. */ +/* #undef USE_UBLIO */ + +/* Version number of package */ +#define VERSION "1.3.0" + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ diff --git a/src/gui/Lib/exfat/src/libexfat/exfat.h b/src/gui/Lib/exfat/src/libexfat/exfat.h new file mode 100644 index 0000000..8a8d982 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/exfat.h @@ -0,0 +1,255 @@ +/* + exfat.h (29.08.09) + Definitions of structures and constants used in exFAT file system + implementation. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef EXFAT_H_INCLUDED +#define EXFAT_H_INCLUDED + +#ifndef ANDROID +/* Android.bp is used instead of autotools when targeting Android */ +#include "config.h" +#endif +#include "compiler.h" +#include "exfatfs.h" +#include +#include +#include +#include +#include +#include + +#define EXFAT_NAME_MAX 255 +/* UTF-16 encodes code points up to U+FFFF as single 16-bit code units. + UTF-8 uses up to 3 bytes (i.e. 8-bit code units) to encode code points + up to U+FFFF. One additional character is for null terminator. */ +#define EXFAT_UTF8_NAME_BUFFER_MAX (EXFAT_NAME_MAX * 3 + 1) +#define EXFAT_UTF8_ENAME_BUFFER_MAX (EXFAT_ENAME_MAX * 3 + 1) + +#define SECTOR_SIZE(sb) (1 << (sb).sector_bits) +#define CLUSTER_SIZE(sb) (SECTOR_SIZE(sb) << (sb).spc_bits) +#define CLUSTER_INVALID(sb, c) ((c) < EXFAT_FIRST_DATA_CLUSTER || \ + (c) - EXFAT_FIRST_DATA_CLUSTER >= le32_to_cpu((sb).cluster_count)) + +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define DIV_ROUND_UP(x, d) (((x) + (d) - 1) / (d)) +#define ROUND_UP(x, d) (DIV_ROUND_UP(x, d) * (d)) + +#define BMAP_SIZE(count) (ROUND_UP(count, sizeof(bitmap_t) * 8) / 8) +#define BMAP_BLOCK(index) ((index) / sizeof(bitmap_t) / 8) +#define BMAP_MASK(index) ((bitmap_t) 1 << ((index) % (sizeof(bitmap_t) * 8))) +#define BMAP_GET(bitmap, index) \ + ((bitmap)[BMAP_BLOCK(index)] & BMAP_MASK(index)) +#define BMAP_SET(bitmap, index) \ + ((bitmap)[BMAP_BLOCK(index)] |= BMAP_MASK(index)) +#define BMAP_CLR(bitmap, index) \ + ((bitmap)[BMAP_BLOCK(index)] &= ~BMAP_MASK(index)) + +#define EXFAT_REPAIR(hook, ef, ...) \ + (exfat_ask_to_fix(ef) && exfat_fix_ ## hook(ef, __VA_ARGS__)) + +/* The size of off_t type must be 64 bits. File systems larger than 2 GB will + be corrupted with 32-bit off_t. */ +STATIC_ASSERT(sizeof(off_t) == 8); + +struct exfat_node +{ + struct exfat_node* parent; + struct exfat_node* child; + struct exfat_node* next; + struct exfat_node* prev; + + int references; + uint32_t fptr_index; + cluster_t fptr_cluster; + off_t entry_offset; + cluster_t start_cluster; + uint16_t attrib; + uint8_t continuations; + bool is_contiguous : 1; + bool is_cached : 1; + bool is_dirty : 1; + bool is_unlinked : 1; + uint64_t size; + time_t mtime, atime; + le16_t name[EXFAT_NAME_MAX + 1]; +}; + +enum exfat_mode +{ + EXFAT_MODE_RO, + EXFAT_MODE_RW, + EXFAT_MODE_ANY, +}; + +struct exfat_dev; + +struct exfat +{ + struct exfat_dev* dev; + struct exfat_super_block* sb; + uint16_t* upcase; + struct exfat_node* root; + struct + { + cluster_t start_cluster; + uint32_t size; /* in bits */ + bitmap_t* chunk; + uint32_t chunk_size; /* in bits */ + bool dirty; + } + cmap; + char label[EXFAT_UTF8_ENAME_BUFFER_MAX]; + void* zero_cluster; + int dmask, fmask; + uid_t uid; + gid_t gid; + int ro; + bool noatime; + enum { EXFAT_REPAIR_NO, EXFAT_REPAIR_ASK, EXFAT_REPAIR_YES } repair; +}; + +/* in-core nodes iterator */ +struct exfat_iterator +{ + struct exfat_node* parent; + struct exfat_node* current; +}; + +struct exfat_human_bytes +{ + uint64_t value; + const char* unit; +}; + +extern int exfat_errors; +extern int exfat_errors_fixed; + +#define VLOG_LOG 1 +#define VLOG_DEBUG 2 +void hiperiso_syslog_newline(int level, const char *Fmt, ...); +#define exfat_bug(fmt, args...) hiperiso_syslog_newline(VLOG_LOG, fmt, ##args) +#define exfat_error(fmt, args...) hiperiso_syslog_newline(VLOG_LOG, fmt, ##args) +#define exfat_error(fmt, args...) hiperiso_syslog_newline(VLOG_LOG, fmt, ##args) +#define exfat_warn(fmt, args...) hiperiso_syslog_newline(VLOG_LOG, fmt, ##args) +#define exfat_debug(fmt, args...) hiperiso_syslog_newline(VLOG_DEBUG, fmt, ##args) + +#if 0 +void exfat_bug(const char* format, ...) PRINTF NORETURN; +void exfat_error(const char* format, ...) PRINTF; +void exfat_warn(const char* format, ...) PRINTF; +void exfat_debug(const char* format, ...) PRINTF; +#endif /* #if 0 */ + +struct exfat_dev* exfat_open(const char* spec, enum exfat_mode mode); +int exfat_close(struct exfat_dev* dev); +int exfat_fsync(struct exfat_dev* dev); +enum exfat_mode exfat_get_mode(const struct exfat_dev* dev); +off_t exfat_get_size(const struct exfat_dev* dev); +off_t exfat_seek(struct exfat_dev* dev, off_t offset, int whence); +ssize_t exfat_read(struct exfat_dev* dev, void* buffer, size_t size); +ssize_t exfat_write(struct exfat_dev* dev, const void* buffer, size_t size); +ssize_t exfat_pread(struct exfat_dev* dev, void* buffer, size_t size, + off_t offset); +ssize_t exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size, + off_t offset); +ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, + void* buffer, size_t size, off_t offset); +ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node, + const void* buffer, size_t size, off_t offset); + +int exfat_opendir(struct exfat* ef, struct exfat_node* dir, + struct exfat_iterator* it); +void exfat_closedir(struct exfat* ef, struct exfat_iterator* it); +struct exfat_node* exfat_readdir(struct exfat_iterator* it); +int exfat_lookup(struct exfat* ef, struct exfat_node** node, + const char* path); +int exfat_split(struct exfat* ef, struct exfat_node** parent, + struct exfat_node** node, le16_t* name, const char* path); + +off_t exfat_c2o(const struct exfat* ef, cluster_t cluster); +cluster_t exfat_next_cluster(const struct exfat* ef, + const struct exfat_node* node, cluster_t cluster); +cluster_t exfat_advance_cluster(const struct exfat* ef, + struct exfat_node* node, uint32_t count); +int exfat_flush_nodes(struct exfat* ef); +int exfat_flush(struct exfat* ef); +int exfat_truncate(struct exfat* ef, struct exfat_node* node, uint64_t size, + bool erase); +uint32_t exfat_count_free_clusters(const struct exfat* ef); +int exfat_find_used_sectors(const struct exfat* ef, off_t* a, off_t* b); + +void exfat_stat(const struct exfat* ef, const struct exfat_node* node, + struct stat* stbuf); +void exfat_get_name(const struct exfat_node* node, + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]); +uint16_t exfat_start_checksum(const struct exfat_entry_meta1* entry); +uint16_t exfat_add_checksum(const void* entry, uint16_t sum); +le16_t exfat_calc_checksum(const struct exfat_entry* entries, int n); +uint32_t exfat_vbr_start_checksum(const void* sector, size_t size); +uint32_t exfat_vbr_add_checksum(const void* sector, size_t size, uint32_t sum); +le16_t exfat_calc_name_hash(const struct exfat* ef, const le16_t* name, + size_t length); +void exfat_humanize_bytes(uint64_t value, struct exfat_human_bytes* hb); +void exfat_print_info(const struct exfat_super_block* sb, + uint32_t free_clusters); + +int utf16_to_utf8(char* output, const le16_t* input, size_t outsize, + size_t insize); +int utf8_to_utf16(le16_t* output, const char* input, size_t outsize, + size_t insize); +size_t utf16_length(const le16_t* str); + +struct exfat_node* exfat_get_node(struct exfat_node* node); +void exfat_put_node(struct exfat* ef, struct exfat_node* node); +int exfat_cleanup_node(struct exfat* ef, struct exfat_node* node); +int exfat_cache_directory(struct exfat* ef, struct exfat_node* dir); +void exfat_reset_cache(struct exfat* ef); +int exfat_flush_node(struct exfat* ef, struct exfat_node* node); +int exfat_unlink(struct exfat* ef, struct exfat_node* node); +int exfat_rmdir(struct exfat* ef, struct exfat_node* node); +int exfat_mknod(struct exfat* ef, const char* path); +int exfat_mkdir(struct exfat* ef, const char* path); +int exfat_rename(struct exfat* ef, const char* old_path, const char* new_path); +void exfat_utimes(struct exfat_node* node, const struct timespec tv[2]); +void exfat_update_atime(struct exfat_node* node); +void exfat_update_mtime(struct exfat_node* node); +const char* exfat_get_label(struct exfat* ef); +int exfat_set_label(struct exfat* ef, const char* label); + +int exfat_mount(struct exfat* ef, const char* spec, const char* options); +void exfat_unmount(struct exfat* ef); + +time_t exfat_exfat2unix(le16_t date, le16_t time, uint8_t centisec); +void exfat_unix2exfat(time_t unix_time, le16_t* date, le16_t* time, + uint8_t* centisec); +void exfat_tzset(void); + +bool exfat_ask_to_fix(const struct exfat* ef); +bool exfat_fix_invalid_vbr_checksum(const struct exfat* ef, void* sector, + uint32_t vbr_checksum); +bool exfat_fix_invalid_node_checksum(const struct exfat* ef, + struct exfat_node* node); +bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir, + const struct exfat_entry* entry, off_t offset); + +#endif /* ifndef EXFAT_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/exfatfs.h b/src/gui/Lib/exfat/src/libexfat/exfatfs.h new file mode 100644 index 0000000..b7b6cac --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/exfatfs.h @@ -0,0 +1,180 @@ +/* + exfatfs.h (29.08.09) + Definitions of structures and constants used in exFAT file system. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef EXFATFS_H_INCLUDED +#define EXFATFS_H_INCLUDED + +#include "byteorder.h" +#include "compiler.h" + +typedef uint32_t cluster_t; /* cluster number */ + +#define EXFAT_FIRST_DATA_CLUSTER 2 +#define EXFAT_LAST_DATA_CLUSTER 0xfffffff6 + +#define EXFAT_CLUSTER_FREE 0 /* free cluster */ +#define EXFAT_CLUSTER_BAD 0xfffffff7 /* cluster contains bad sector */ +#define EXFAT_CLUSTER_END 0xffffffff /* final cluster of file or directory */ + +#define EXFAT_STATE_MOUNTED 2 + +struct exfat_super_block +{ + uint8_t jump[3]; /* 0x00 jmp and nop instructions */ + uint8_t oem_name[8]; /* 0x03 "EXFAT " */ + uint8_t __unused1[53]; /* 0x0B always 0 */ + le64_t sector_start; /* 0x40 partition first sector */ + le64_t sector_count; /* 0x48 partition sectors count */ + le32_t fat_sector_start; /* 0x50 FAT first sector */ + le32_t fat_sector_count; /* 0x54 FAT sectors count */ + le32_t cluster_sector_start; /* 0x58 first cluster sector */ + le32_t cluster_count; /* 0x5C total clusters count */ + le32_t rootdir_cluster; /* 0x60 first cluster of the root dir */ + le32_t volume_serial; /* 0x64 volume serial number */ + struct /* 0x68 FS version */ + { + uint8_t minor; + uint8_t major; + } + version; + le16_t volume_state; /* 0x6A volume state flags */ + uint8_t sector_bits; /* 0x6C sector size as (1 << n) */ + uint8_t spc_bits; /* 0x6D sectors per cluster as (1 << n) */ + uint8_t fat_count; /* 0x6E always 1 */ + uint8_t drive_no; /* 0x6F always 0x80 */ + uint8_t allocated_percent; /* 0x70 percentage of allocated space */ + uint8_t __unused2[397]; /* 0x71 always 0 */ + le16_t boot_signature; /* the value of 0xAA55 */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_super_block) == 512); + +#define EXFAT_ENTRY_VALID 0x80 +#define EXFAT_ENTRY_CONTINUED 0x40 +#define EXFAT_ENTRY_OPTIONAL 0x20 + +#define EXFAT_ENTRY_BITMAP (0x01 | EXFAT_ENTRY_VALID) +#define EXFAT_ENTRY_UPCASE (0x02 | EXFAT_ENTRY_VALID) +#define EXFAT_ENTRY_LABEL (0x03 | EXFAT_ENTRY_VALID) +#define EXFAT_ENTRY_FILE (0x05 | EXFAT_ENTRY_VALID) +#define EXFAT_ENTRY_FILE_INFO (0x00 | EXFAT_ENTRY_VALID | EXFAT_ENTRY_CONTINUED) +#define EXFAT_ENTRY_FILE_NAME (0x01 | EXFAT_ENTRY_VALID | EXFAT_ENTRY_CONTINUED) +#define EXFAT_ENTRY_FILE_TAIL (0x00 | EXFAT_ENTRY_VALID \ + | EXFAT_ENTRY_CONTINUED \ + | EXFAT_ENTRY_OPTIONAL) + +struct exfat_entry /* common container for all entries */ +{ + uint8_t type; /* any of EXFAT_ENTRY_xxx */ + uint8_t data[31]; +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry) == 32); + +#define EXFAT_ENAME_MAX 15 + +struct exfat_entry_bitmap /* allocated clusters bitmap */ +{ + uint8_t type; /* EXFAT_ENTRY_BITMAP */ + uint8_t __unknown1[19]; + le32_t start_cluster; + le64_t size; /* in bytes */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_bitmap) == 32); + +#define EXFAT_UPCASE_CHARS 0x10000 + +struct exfat_entry_upcase /* upper case translation table */ +{ + uint8_t type; /* EXFAT_ENTRY_UPCASE */ + uint8_t __unknown1[3]; + le32_t checksum; + uint8_t __unknown2[12]; + le32_t start_cluster; + le64_t size; /* in bytes */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_upcase) == 32); + +struct exfat_entry_label /* volume label */ +{ + uint8_t type; /* EXFAT_ENTRY_LABEL */ + uint8_t length; /* number of characters */ + le16_t name[EXFAT_ENAME_MAX]; /* in UTF-16LE */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_label) == 32); + +#define EXFAT_ATTRIB_RO 0x01 +#define EXFAT_ATTRIB_HIDDEN 0x02 +#define EXFAT_ATTRIB_SYSTEM 0x04 +#define EXFAT_ATTRIB_VOLUME 0x08 +#define EXFAT_ATTRIB_DIR 0x10 +#define EXFAT_ATTRIB_ARCH 0x20 + +struct exfat_entry_meta1 /* file or directory info (part 1) */ +{ + uint8_t type; /* EXFAT_ENTRY_FILE */ + uint8_t continuations; + le16_t checksum; + le16_t attrib; /* combination of EXFAT_ATTRIB_xxx */ + le16_t __unknown1; + le16_t crtime, crdate; /* creation date and time */ + le16_t mtime, mdate; /* latest modification date and time */ + le16_t atime, adate; /* latest access date and time */ + uint8_t crtime_cs; /* creation time in cs (centiseconds) */ + uint8_t mtime_cs; /* latest modification time in cs */ + uint8_t __unknown2[10]; +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_meta1) == 32); + +#define EXFAT_FLAG_ALWAYS1 (1u << 0) +#define EXFAT_FLAG_CONTIGUOUS (1u << 1) + +struct exfat_entry_meta2 /* file or directory info (part 2) */ +{ + uint8_t type; /* EXFAT_ENTRY_FILE_INFO */ + uint8_t flags; /* combination of EXFAT_FLAG_xxx */ + uint8_t __unknown1; + uint8_t name_length; + le16_t name_hash; + le16_t __unknown2; + le64_t valid_size; /* in bytes, less or equal to size */ + uint8_t __unknown3[4]; + le32_t start_cluster; + le64_t size; /* in bytes */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_meta2) == 32); + +struct exfat_entry_name /* file or directory name */ +{ + uint8_t type; /* EXFAT_ENTRY_FILE_NAME */ + uint8_t __unknown; + le16_t name[EXFAT_ENAME_MAX]; /* in UTF-16LE */ +} +PACKED; +STATIC_ASSERT(sizeof(struct exfat_entry_name) == 32); + +#endif /* ifndef EXFATFS_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/io.c b/src/gui/Lib/exfat/src/libexfat/io.c new file mode 100644 index 0000000..3808cae --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/io.c @@ -0,0 +1,511 @@ +/* + io.c (02.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include +#include +#include +#include +#include +#if defined(__APPLE__) +#include +#elif defined(__OpenBSD__) +#include +#include +#include +#include +#elif __linux__ +#include +#endif +#ifdef USE_UBLIO +#include +#include +#endif + +struct exfat_dev +{ + int fd; + enum exfat_mode mode; + off_t size; /* in bytes */ +#ifdef USE_UBLIO + off_t pos; + ublio_filehandle_t ufh; +#endif +}; + +int g_hiso_exfat_disk_fd = -1; +uint64_t g_hiso_exfat_part_size = 0; + +static bool is_open(int fd) +{ + return fcntl(fd, F_GETFD) != -1; +} + +static int open_ro(const char* spec) +{ + return open(spec, O_RDONLY); +} + +static int open_rw(const char* spec) +{ + int fd = open(spec, O_RDWR); +#ifdef __linux__ + int ro = 0; + + /* + This ioctl is needed because after "blockdev --setro" kernel still + allows to open the device in read-write mode but fails writes. + */ + if (fd != -1 && ioctl(fd, BLKROGET, &ro) == 0 && ro) + { + close(fd); + errno = EROFS; + return -1; + } +#endif + return fd; +} + +struct exfat_dev* exfat_open(const char* spec, enum exfat_mode mode) +{ + struct exfat_dev* dev; + struct stat stbuf; +#ifdef USE_UBLIO + struct ublio_param up; +#endif + + /* The system allocates file descriptors sequentially. If we have been + started with stdin (0), stdout (1) or stderr (2) closed, the system + will give us descriptor 0, 1 or 2 later when we open block device, + FUSE communication pipe, etc. As a result, functions using stdin, + stdout or stderr will actually work with a different thing and can + corrupt it. Protect descriptors 0, 1 and 2 from such misuse. */ + while (!is_open(STDIN_FILENO) + || !is_open(STDOUT_FILENO) + || !is_open(STDERR_FILENO)) + { + /* we don't need those descriptors, let them leak */ + if (open("/dev/null", O_RDWR) == -1) + { + exfat_error("failed to open /dev/null"); + return NULL; + } + } + + dev = malloc(sizeof(struct exfat_dev)); + if (dev == NULL) + { + exfat_error("failed to allocate memory for device structure"); + return NULL; + } + + switch (mode) + { + case EXFAT_MODE_RO: + dev->fd = g_hiso_exfat_disk_fd < 0 ? open_ro(spec) : g_hiso_exfat_disk_fd; + if (dev->fd == -1) + { + free(dev); + exfat_error("failed to open '%s' in read-only mode: %s", spec, + strerror(errno)); + return NULL; + } + dev->mode = EXFAT_MODE_RO; + break; + case EXFAT_MODE_RW: + dev->fd = g_hiso_exfat_disk_fd < 0 ? open_rw(spec) : g_hiso_exfat_disk_fd; + if (dev->fd == -1) + { + free(dev); + exfat_error("failed to open '%s' in read-write mode: %s", spec, + strerror(errno)); + return NULL; + } + dev->mode = EXFAT_MODE_RW; + break; + case EXFAT_MODE_ANY: + dev->fd = g_hiso_exfat_disk_fd < 0 ? open_rw(spec) : g_hiso_exfat_disk_fd; + if (dev->fd != -1) + { + dev->mode = EXFAT_MODE_RW; + break; + } + dev->fd = g_hiso_exfat_disk_fd < 0 ? open_ro(spec) : g_hiso_exfat_disk_fd; + if (dev->fd != -1) + { + dev->mode = EXFAT_MODE_RO; + exfat_warn("'%s' is write-protected, mounting read-only", spec); + break; + } + free(dev); + exfat_error("failed to open '%s': %s", spec, strerror(errno)); + return NULL; + } + + if (fstat(dev->fd, &stbuf) != 0) + { + close(dev->fd); + free(dev); + exfat_error("failed to fstat '%s'", spec); + return NULL; + } + if (!S_ISBLK(stbuf.st_mode) && + !S_ISCHR(stbuf.st_mode) && + !S_ISREG(stbuf.st_mode)) + { + close(dev->fd); + free(dev); + exfat_error("'%s' is neither a device, nor a regular file", spec); + return NULL; + } + +#if defined(__APPLE__) + if (!S_ISREG(stbuf.st_mode)) + { + uint32_t block_size = 0; + uint64_t blocks = 0; + + if (ioctl(dev->fd, DKIOCGETBLOCKSIZE, &block_size) != 0) + { + close(dev->fd); + free(dev); + exfat_error("failed to get block size"); + return NULL; + } + if (ioctl(dev->fd, DKIOCGETBLOCKCOUNT, &blocks) != 0) + { + close(dev->fd); + free(dev); + exfat_error("failed to get blocks count"); + return NULL; + } + dev->size = blocks * block_size; + } + else +#elif defined(__OpenBSD__) + if (!S_ISREG(stbuf.st_mode)) + { + struct disklabel lab; + struct partition* pp; + char* partition; + + if (ioctl(dev->fd, DIOCGDINFO, &lab) == -1) + { + close(dev->fd); + free(dev); + exfat_error("failed to get disklabel"); + return NULL; + } + + /* Don't need to check that partition letter is valid as we won't get + this far otherwise. */ + partition = strchr(spec, '\0') - 1; + pp = &(lab.d_partitions[*partition - 'a']); + dev->size = DL_GETPSIZE(pp) * lab.d_secsize; + + if (pp->p_fstype != FS_NTFS) + exfat_warn("partition type is not 0x07 (NTFS/exFAT); " + "you can fix this with fdisk(8)"); + } + else +#endif + { + /* works for Linux, FreeBSD, Solaris */ + dev->size = exfat_seek(dev, 0, SEEK_END); + if (dev->size <= 0) + { + close(dev->fd); + free(dev); + exfat_error("failed to get size of '%s'", spec); + return NULL; + } + if (exfat_seek(dev, 0, SEEK_SET) == -1) + { + close(dev->fd); + free(dev); + exfat_error("failed to seek to the beginning of '%s'", spec); + return NULL; + } + } + +#ifdef USE_UBLIO + memset(&up, 0, sizeof(struct ublio_param)); + up.up_blocksize = 256 * 1024; + up.up_items = 64; + up.up_grace = 32; + up.up_priv = &dev->fd; + + dev->pos = 0; + dev->ufh = ublio_open(&up); + if (dev->ufh == NULL) + { + close(dev->fd); + free(dev); + exfat_error("failed to initialize ublio"); + return NULL; + } +#endif + + return dev; +} + +int exfat_close(struct exfat_dev* dev) +{ + int rc = 0; + +#ifdef USE_UBLIO + if (ublio_close(dev->ufh) != 0) + { + exfat_error("failed to close ublio"); + rc = -EIO; + } +#endif + if (dev->fd != g_hiso_exfat_disk_fd) + { + if (close(dev->fd) != 0) + { + exfat_error("failed to close device: %s", strerror(errno)); + rc = -EIO; + } + } + + free(dev); + return rc; +} + +int exfat_fsync(struct exfat_dev* dev) +{ + int rc = 0; + +#ifdef USE_UBLIO + if (ublio_fsync(dev->ufh) != 0) + { + exfat_error("ublio fsync failed"); + rc = -EIO; + } +#endif + if (fsync(dev->fd) != 0) + { + exfat_error("fsync failed: %s", strerror(errno)); + rc = -EIO; + } + return rc; +} + +enum exfat_mode exfat_get_mode(const struct exfat_dev* dev) +{ + return dev->mode; +} + + +off_t exfat_get_size(const struct exfat_dev* dev) +{ + return dev->size; +} + +off_t exfat_seek(struct exfat_dev* dev, off_t offset, int whence) +{ +#ifdef USE_UBLIO + /* XXX SEEK_CUR will be handled incorrectly */ + return dev->pos = lseek(dev->fd, offset, whence); +#else + + if (SEEK_SET == whence) + { + if (offset > g_hiso_exfat_part_size) + { + return -1; + } + + lseek(dev->fd, 512 * 2048 + offset, SEEK_SET); + return offset; + } + else if (SEEK_END == whence) + { + if (offset == 0) + { + offset = 512 * 2048 + g_hiso_exfat_part_size; + lseek(dev->fd, offset, SEEK_SET); + return (off_t)g_hiso_exfat_part_size; + } + else + { + exfat_error("Invalid SEEK_END offset %llu", (unsigned long long)offset); + return -1; + } + } + else + { + exfat_error("Invalid seek whence %d", whence); + return lseek(dev->fd, offset, whence); + } +#endif +} + +ssize_t exfat_read(struct exfat_dev* dev, void* buffer, size_t size) +{ +#ifdef USE_UBLIO + ssize_t result = ublio_pread(dev->ufh, buffer, size, dev->pos); + if (result >= 0) + dev->pos += size; + return result; +#else + return read(dev->fd, buffer, size); +#endif +} + +ssize_t exfat_write(struct exfat_dev* dev, const void* buffer, size_t size) +{ +#ifdef USE_UBLIO + ssize_t result = ublio_pwrite(dev->ufh, buffer, size, dev->pos); + if (result >= 0) + dev->pos += size; + return result; +#else + return write(dev->fd, buffer, size); +#endif +} + +ssize_t exfat_pread(struct exfat_dev* dev, void* buffer, size_t size, + off_t offset) +{ +#ifdef USE_UBLIO + return ublio_pread(dev->ufh, buffer, size, offset); +#else + return pread(dev->fd, buffer, size, offset); +#endif +} + +ssize_t exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size, + off_t offset) +{ +#ifdef USE_UBLIO + return ublio_pwrite(dev->ufh, buffer, size, offset); +#else + return pwrite(dev->fd, buffer, size, offset); +#endif +} + +ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node, + void* buffer, size_t size, off_t offset) +{ + cluster_t cluster; + char* bufp = buffer; + off_t lsize, loffset, remainder; + + if (offset >= node->size) + return 0; + if (size == 0) + return 0; + + cluster = exfat_advance_cluster(ef, node, offset / CLUSTER_SIZE(*ef->sb)); + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while reading", cluster); + return -EIO; + } + + loffset = offset % CLUSTER_SIZE(*ef->sb); + remainder = MIN(size, node->size - offset); + while (remainder > 0) + { + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while reading", cluster); + return -EIO; + } + lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder); + if (exfat_pread(ef->dev, bufp, lsize, + exfat_c2o(ef, cluster) + loffset) < 0) + { + exfat_error("failed to read cluster %#x", cluster); + return -EIO; + } + bufp += lsize; + loffset = 0; + remainder -= lsize; + cluster = exfat_next_cluster(ef, node, cluster); + } + if (!(node->attrib & EXFAT_ATTRIB_DIR) && !ef->ro && !ef->noatime) + exfat_update_atime(node); + return MIN(size, node->size - offset) - remainder; +} + +ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node, + const void* buffer, size_t size, off_t offset) +{ + int rc; + cluster_t cluster; + const char* bufp = buffer; + off_t lsize, loffset, remainder; + + if (offset > node->size) + { + rc = exfat_truncate(ef, node, offset, true); + if (rc != 0) + return rc; + } + if (offset + size > node->size) + { + rc = exfat_truncate(ef, node, offset + size, false); + if (rc != 0) + return rc; + } + if (size == 0) + return 0; + + cluster = exfat_advance_cluster(ef, node, offset / CLUSTER_SIZE(*ef->sb)); + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while writing", cluster); + return -EIO; + } + + loffset = offset % CLUSTER_SIZE(*ef->sb); + remainder = size; + while (remainder > 0) + { + if (CLUSTER_INVALID(*ef->sb, cluster)) + { + exfat_error("invalid cluster 0x%x while writing", cluster); + return -EIO; + } + lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder); + if (exfat_pwrite(ef->dev, bufp, lsize, + exfat_c2o(ef, cluster) + loffset) < 0) + { + exfat_error("failed to write cluster %#x", cluster); + return -EIO; + } + bufp += lsize; + loffset = 0; + remainder -= lsize; + cluster = exfat_next_cluster(ef, node, cluster); + } + if (!(node->attrib & EXFAT_ATTRIB_DIR)) + /* directory's mtime should be updated by the caller only when it + creates or removes something in this directory */ + exfat_update_mtime(node); + return size - remainder; +} diff --git a/src/gui/Lib/exfat/src/libexfat/lookup.c b/src/gui/Lib/exfat/src/libexfat/lookup.c new file mode 100644 index 0000000..8fa8e0f --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/lookup.c @@ -0,0 +1,224 @@ +/* + lookup.c (02.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include + +int exfat_opendir(struct exfat* ef, struct exfat_node* dir, + struct exfat_iterator* it) +{ + int rc; + + exfat_get_node(dir); + it->parent = dir; + it->current = NULL; + rc = exfat_cache_directory(ef, dir); + if (rc != 0) + exfat_put_node(ef, dir); + return rc; +} + +void exfat_closedir(struct exfat* ef, struct exfat_iterator* it) +{ + exfat_put_node(ef, it->parent); + it->parent = NULL; + it->current = NULL; +} + +struct exfat_node* exfat_readdir(struct exfat_iterator* it) +{ + if (it->current == NULL) + it->current = it->parent->child; + else + it->current = it->current->next; + + if (it->current != NULL) + return exfat_get_node(it->current); + else + return NULL; +} + +static int compare_char(struct exfat* ef, uint16_t a, uint16_t b) +{ + return (int) ef->upcase[a] - (int) ef->upcase[b]; +} + +static int compare_name(struct exfat* ef, const le16_t* a, const le16_t* b) +{ + while (le16_to_cpu(*a) && le16_to_cpu(*b)) + { + int rc = compare_char(ef, le16_to_cpu(*a), le16_to_cpu(*b)); + if (rc != 0) + return rc; + a++; + b++; + } + return compare_char(ef, le16_to_cpu(*a), le16_to_cpu(*b)); +} + +static int lookup_name(struct exfat* ef, struct exfat_node* parent, + struct exfat_node** node, const char* name, size_t n) +{ + struct exfat_iterator it; + le16_t buffer[EXFAT_NAME_MAX + 1]; + int rc; + + *node = NULL; + + rc = utf8_to_utf16(buffer, name, EXFAT_NAME_MAX + 1, n); + if (rc != 0) + return rc; + + rc = exfat_opendir(ef, parent, &it); + if (rc != 0) + return rc; + while ((*node = exfat_readdir(&it))) + { + if (compare_name(ef, buffer, (*node)->name) == 0) + { + exfat_closedir(ef, &it); + return 0; + } + exfat_put_node(ef, *node); + } + exfat_closedir(ef, &it); + return -ENOENT; +} + +static size_t get_comp(const char* path, const char** comp) +{ + const char* end; + + *comp = path + strspn(path, "/"); /* skip leading slashes */ + end = strchr(*comp, '/'); + if (end == NULL) + return strlen(*comp); + else + return end - *comp; +} + +int exfat_lookup(struct exfat* ef, struct exfat_node** node, + const char* path) +{ + struct exfat_node* parent; + const char* p; + size_t n; + int rc; + + /* start from the root directory */ + parent = *node = exfat_get_node(ef->root); + for (p = path; (n = get_comp(p, &p)); p += n) + { + if (n == 1 && *p == '.') /* skip "." component */ + continue; + rc = lookup_name(ef, parent, node, p, n); + if (rc != 0) + { + exfat_put_node(ef, parent); + return rc; + } + exfat_put_node(ef, parent); + parent = *node; + } + return 0; +} + +static bool is_last_comp(const char* comp, size_t length) +{ + const char* p = comp + length; + + return get_comp(p, &p) == 0; +} + +static bool is_allowed(const char* comp, size_t length) +{ + size_t i; + + for (i = 0; i < length; i++) + switch (comp[i]) + { + case 0x01 ... 0x1f: + case '/': + case '\\': + case ':': + case '*': + case '?': + case '"': + case '<': + case '>': + case '|': + return false; + } + return true; +} + +int exfat_split(struct exfat* ef, struct exfat_node** parent, + struct exfat_node** node, le16_t* name, const char* path) +{ + const char* p; + size_t n; + int rc; + + memset(name, 0, (EXFAT_NAME_MAX + 1) * sizeof(le16_t)); + *parent = *node = exfat_get_node(ef->root); + for (p = path; (n = get_comp(p, &p)); p += n) + { + if (n == 1 && *p == '.') + continue; + if (is_last_comp(p, n)) + { + if (!is_allowed(p, n)) + { + /* contains characters that are not allowed */ + exfat_put_node(ef, *parent); + return -ENOENT; + } + rc = utf8_to_utf16(name, p, EXFAT_NAME_MAX + 1, n); + if (rc != 0) + { + exfat_put_node(ef, *parent); + return rc; + } + + rc = lookup_name(ef, *parent, node, p, n); + if (rc != 0 && rc != -ENOENT) + { + exfat_put_node(ef, *parent); + return rc; + } + return 0; + } + rc = lookup_name(ef, *parent, node, p, n); + if (rc != 0) + { + exfat_put_node(ef, *parent); + return rc; + } + exfat_put_node(ef, *parent); + *parent = *node; + } + exfat_bug("impossible"); + + return 1; +} diff --git a/src/gui/Lib/exfat/src/libexfat/mount.c b/src/gui/Lib/exfat/src/libexfat/mount.c new file mode 100644 index 0000000..4284aee --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/mount.c @@ -0,0 +1,389 @@ +/* + mount.c (22.10.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include +#include +#include +#include + +static uint64_t rootdir_size(const struct exfat* ef) +{ + uint32_t clusters = 0; + uint32_t clusters_max = le32_to_cpu(ef->sb->cluster_count); + cluster_t rootdir_cluster = le32_to_cpu(ef->sb->rootdir_cluster); + + /* Iterate all clusters of the root directory to calculate its size. + It can't be contiguous because there is no flag to indicate this. */ + do + { + if (clusters == clusters_max) /* infinite loop detected */ + { + exfat_error("root directory cannot occupy all %d clusters", + clusters); + return 0; + } + if (CLUSTER_INVALID(*ef->sb, rootdir_cluster)) + { + exfat_error("bad cluster %#x while reading root directory", + rootdir_cluster); + return 0; + } + rootdir_cluster = exfat_next_cluster(ef, ef->root, rootdir_cluster); + clusters++; + } + while (rootdir_cluster != EXFAT_CLUSTER_END); + + return (uint64_t) clusters * CLUSTER_SIZE(*ef->sb); +} + +static const char* get_option(const char* options, const char* option_name) +{ + const char* p; + size_t length = strlen(option_name); + + for (p = strstr(options, option_name); p; p = strstr(p + 1, option_name)) + if ((p == options || p[-1] == ',') && p[length] == '=') + return p + length + 1; + return NULL; +} + +static int get_int_option(const char* options, const char* option_name, + int base, int default_value) +{ + const char* p = get_option(options, option_name); + + if (p == NULL) + return default_value; + return strtol(p, NULL, base); +} + +static bool match_option(const char* options, const char* option_name) +{ + const char* p; + size_t length = strlen(option_name); + + for (p = strstr(options, option_name); p; p = strstr(p + 1, option_name)) + if ((p == options || p[-1] == ',') && + (p[length] == ',' || p[length] == '\0')) + return true; + return false; +} + +static void parse_options(struct exfat* ef, const char* options) +{ + int opt_umask; + + opt_umask = get_int_option(options, "umask", 8, 0); + ef->dmask = get_int_option(options, "dmask", 8, opt_umask); + ef->fmask = get_int_option(options, "fmask", 8, opt_umask); + + ef->uid = get_int_option(options, "uid", 10, geteuid()); + ef->gid = get_int_option(options, "gid", 10, getegid()); + + ef->noatime = match_option(options, "noatime"); + + switch (get_int_option(options, "repair", 10, 0)) + { + case 1: + ef->repair = EXFAT_REPAIR_ASK; + break; + case 2: + ef->repair = EXFAT_REPAIR_YES; + break; + default: + ef->repair = EXFAT_REPAIR_NO; + break; + } +} + +static bool verify_vbr_checksum(const struct exfat* ef, void* sector) +{ + off_t sector_size = SECTOR_SIZE(*ef->sb); + uint32_t vbr_checksum; + int i; + + if (exfat_pread(ef->dev, sector, sector_size, 0) < 0) + { + exfat_error("failed to read boot sector"); + return false; + } + vbr_checksum = exfat_vbr_start_checksum(sector, sector_size); + for (i = 1; i < 11; i++) + { + if (exfat_pread(ef->dev, sector, sector_size, i * sector_size) < 0) + { + exfat_error("failed to read VBR sector"); + return false; + } + vbr_checksum = exfat_vbr_add_checksum(sector, sector_size, + vbr_checksum); + } + if (exfat_pread(ef->dev, sector, sector_size, i * sector_size) < 0) + { + exfat_error("failed to read VBR checksum sector"); + return false; + } + for (i = 0; i < sector_size / sizeof(vbr_checksum); i++) + if (le32_to_cpu(((const le32_t*) sector)[i]) != vbr_checksum) + { + exfat_error("invalid VBR checksum 0x%x (expected 0x%x)", + le32_to_cpu(((const le32_t*) sector)[i]), vbr_checksum); + if (!EXFAT_REPAIR(invalid_vbr_checksum, ef, sector, vbr_checksum)) + return false; + } + return true; +} + +static int commit_super_block(const struct exfat* ef) +{ + if (exfat_pwrite(ef->dev, ef->sb, sizeof(struct exfat_super_block), 0) < 0) + { + exfat_error("failed to write super block"); + return 1; + } + return exfat_fsync(ef->dev); +} + +static int prepare_super_block(const struct exfat* ef) +{ + if (le16_to_cpu(ef->sb->volume_state) & EXFAT_STATE_MOUNTED) + exfat_warn("volume was not unmounted cleanly"); + + if (ef->ro) + return 0; + + ef->sb->volume_state = cpu_to_le16( + le16_to_cpu(ef->sb->volume_state) | EXFAT_STATE_MOUNTED); + return commit_super_block(ef); +} + +static void exfat_free(struct exfat* ef) +{ + exfat_close(ef->dev); /* first of all, close the descriptor */ + ef->dev = NULL; /* struct exfat_dev is freed by exfat_close() */ + free(ef->root); + ef->root = NULL; + free(ef->zero_cluster); + ef->zero_cluster = NULL; + free(ef->cmap.chunk); + ef->cmap.chunk = NULL; + free(ef->upcase); + ef->upcase = NULL; + free(ef->sb); + ef->sb = NULL; +} + +int exfat_mount(struct exfat* ef, const char* spec, const char* options) +{ + int rc; + enum exfat_mode mode; + + exfat_tzset(); + memset(ef, 0, sizeof(struct exfat)); + + parse_options(ef, options); + + if (match_option(options, "ro")) + mode = EXFAT_MODE_RO; + else if (match_option(options, "ro_fallback")) + mode = EXFAT_MODE_ANY; + else + mode = EXFAT_MODE_RW; + ef->dev = exfat_open(spec, mode); + if (ef->dev == NULL) + return -EIO; + if (exfat_get_mode(ef->dev) == EXFAT_MODE_RO) + { + if (mode == EXFAT_MODE_ANY) + ef->ro = -1; + else + ef->ro = 1; + } + + ef->sb = malloc(sizeof(struct exfat_super_block)); + if (ef->sb == NULL) + { + exfat_error("failed to allocate memory for the super block"); + exfat_free(ef); + return -ENOMEM; + } + memset(ef->sb, 0, sizeof(struct exfat_super_block)); + + if (exfat_pread(ef->dev, ef->sb, sizeof(struct exfat_super_block), 0) < 0) + { + exfat_error("failed to read boot sector"); + exfat_free(ef); + return -EIO; + } + if (memcmp(ef->sb->oem_name, "EXFAT ", 8) != 0) + { + exfat_error("exFAT file system is not found"); + exfat_free(ef); + return -EIO; + } + /* sector cannot be smaller than 512 bytes */ + if (ef->sb->sector_bits < 9) + { + exfat_error("too small sector size: 2^%hhd", ef->sb->sector_bits); + exfat_free(ef); + return -EIO; + } + /* officially exFAT supports cluster size up to 32 MB */ + if ((int) ef->sb->sector_bits + (int) ef->sb->spc_bits > 25) + { + exfat_error("too big cluster size: 2^(%hhd+%hhd)", + ef->sb->sector_bits, ef->sb->spc_bits); + exfat_free(ef); + return -EIO; + } + ef->zero_cluster = malloc(CLUSTER_SIZE(*ef->sb)); + if (ef->zero_cluster == NULL) + { + exfat_error("failed to allocate zero sector"); + exfat_free(ef); + return -ENOMEM; + } + /* use zero_cluster as a temporary buffer for VBR checksum verification */ + if (!verify_vbr_checksum(ef, ef->zero_cluster)) + { + exfat_free(ef); + return -EIO; + } + memset(ef->zero_cluster, 0, CLUSTER_SIZE(*ef->sb)); + if (ef->sb->version.major != 1 || ef->sb->version.minor != 0) + { + exfat_error("unsupported exFAT version: %hhu.%hhu", + ef->sb->version.major, ef->sb->version.minor); + exfat_free(ef); + return -EIO; + } + if (ef->sb->fat_count != 1) + { + exfat_error("unsupported FAT count: %hhu", ef->sb->fat_count); + exfat_free(ef); + return -EIO; + } + if (le64_to_cpu(ef->sb->sector_count) * SECTOR_SIZE(*ef->sb) > + exfat_get_size(ef->dev)) + { + /* this can cause I/O errors later but we don't fail mounting to let + user rescue data */ + exfat_warn("file system in sectors is larger than device: " + "%"PRIu64" * %d > %"PRIu64, + le64_to_cpu(ef->sb->sector_count), SECTOR_SIZE(*ef->sb), + exfat_get_size(ef->dev)); + } + if ((off_t) le32_to_cpu(ef->sb->cluster_count) * CLUSTER_SIZE(*ef->sb) > + exfat_get_size(ef->dev)) + { + exfat_error("file system in clusters is larger than device: " + "%u * %d > %"PRIu64, + le32_to_cpu(ef->sb->cluster_count), CLUSTER_SIZE(*ef->sb), + exfat_get_size(ef->dev)); + exfat_free(ef); + return -EIO; + } + + ef->root = malloc(sizeof(struct exfat_node)); + if (ef->root == NULL) + { + exfat_error("failed to allocate root node"); + exfat_free(ef); + return -ENOMEM; + } + memset(ef->root, 0, sizeof(struct exfat_node)); + ef->root->attrib = EXFAT_ATTRIB_DIR; + ef->root->start_cluster = le32_to_cpu(ef->sb->rootdir_cluster); + ef->root->fptr_cluster = ef->root->start_cluster; + ef->root->name[0] = cpu_to_le16('\0'); + ef->root->size = rootdir_size(ef); + if (ef->root->size == 0) + { + exfat_free(ef); + return -EIO; + } + /* exFAT does not have time attributes for the root directory */ + ef->root->mtime = 0; + ef->root->atime = 0; + /* always keep at least 1 reference to the root node */ + exfat_get_node(ef->root); + + rc = exfat_cache_directory(ef, ef->root); + if (rc != 0) + goto error; + if (ef->upcase == NULL) + { + exfat_error("upcase table is not found"); + goto error; + } + if (ef->cmap.chunk == NULL) + { + exfat_error("clusters bitmap is not found"); + goto error; + } + + if (prepare_super_block(ef) != 0) + goto error; + + return 0; + +error: + exfat_put_node(ef, ef->root); + exfat_reset_cache(ef); + exfat_free(ef); + return -EIO; +} + +static void finalize_super_block(struct exfat* ef) +{ + if (ef->ro) + return; + + ef->sb->volume_state = cpu_to_le16( + le16_to_cpu(ef->sb->volume_state) & ~EXFAT_STATE_MOUNTED); + + /* Some implementations set the percentage of allocated space to 0xff + on FS creation and never update it. In this case leave it as is. */ + if (ef->sb->allocated_percent != 0xff) + { + uint32_t free, total; + + free = exfat_count_free_clusters(ef); + total = le32_to_cpu(ef->sb->cluster_count); + ef->sb->allocated_percent = ((total - free) * 100 + total / 2) / total; + } + + commit_super_block(ef); /* ignore return code */ +} + +void exfat_unmount(struct exfat* ef) +{ + exfat_flush_nodes(ef); /* ignore return code */ + exfat_flush(ef); /* ignore return code */ + exfat_put_node(ef, ef->root); + exfat_reset_cache(ef); + finalize_super_block(ef); + exfat_free(ef); /* will close the descriptor */ +} diff --git a/src/gui/Lib/exfat/src/libexfat/node.c b/src/gui/Lib/exfat/src/libexfat/node.c new file mode 100644 index 0000000..ab1d7d6 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/node.c @@ -0,0 +1,1226 @@ +/* + node.c (09.10.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include + +#define EXFAT_ENTRY_NONE (-1) + +struct exfat_node* exfat_get_node(struct exfat_node* node) +{ + /* if we switch to multi-threaded mode we will need atomic + increment here and atomic decrement in exfat_put_node() */ + node->references++; + return node; +} + +void exfat_put_node(struct exfat* ef, struct exfat_node* node) +{ + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]; + + --node->references; + if (node->references < 0) + { + exfat_get_name(node, buffer); + exfat_bug("reference counter of '%s' is below zero", buffer); + } + else if (node->references == 0 && node != ef->root) + { + if (node->is_dirty) + { + exfat_get_name(node, buffer); + exfat_warn("dirty node '%s' with zero references", buffer); + } + } +} + +/** + * This function must be called on rmdir and unlink (after the last + * exfat_put_node()) to free clusters. + */ +int exfat_cleanup_node(struct exfat* ef, struct exfat_node* node) +{ + int rc = 0; + + if (node->references != 0) + exfat_bug("unable to cleanup a node with %d references", + node->references); + + if (node->is_unlinked) + { + /* free all clusters and node structure itself */ + rc = exfat_truncate(ef, node, 0, true); + /* free the node even in case of error or its memory will be lost */ + free(node); + } + return rc; +} + +static int read_entries(struct exfat* ef, struct exfat_node* dir, + struct exfat_entry* entries, int n, off_t offset) +{ + ssize_t size; + + if (!(dir->attrib & EXFAT_ATTRIB_DIR)) + exfat_bug("attempted to read entries from a file"); + + size = exfat_generic_pread(ef, dir, entries, + sizeof(struct exfat_entry[n]), offset); + if (size == sizeof(struct exfat_entry[n])) + return 0; /* success */ + if (size == 0) + return -ENOENT; + if (size < 0) + return -EIO; + exfat_error("read %zd bytes instead of %zu bytes", size, + sizeof(struct exfat_entry[n])); + return -EIO; +} + +static int write_entries(struct exfat* ef, struct exfat_node* dir, + const struct exfat_entry* entries, int n, off_t offset) +{ + ssize_t size; + + if (!(dir->attrib & EXFAT_ATTRIB_DIR)) + exfat_bug("attempted to write entries into a file"); + + size = exfat_generic_pwrite(ef, dir, entries, + sizeof(struct exfat_entry[n]), offset); + if (size == sizeof(struct exfat_entry[n])) + return 0; /* success */ + if (size < 0) + return -EIO; + exfat_error("wrote %zd bytes instead of %zu bytes", size, + sizeof(struct exfat_entry[n])); + return -EIO; +} + +static struct exfat_node* allocate_node(void) +{ + struct exfat_node* node = malloc(sizeof(struct exfat_node)); + if (node == NULL) + { + exfat_error("failed to allocate node"); + return NULL; + } + memset(node, 0, sizeof(struct exfat_node)); + return node; +} + +static void init_node_meta1(struct exfat_node* node, + const struct exfat_entry_meta1* meta1) +{ + node->attrib = le16_to_cpu(meta1->attrib); + node->continuations = meta1->continuations; + node->mtime = exfat_exfat2unix(meta1->mdate, meta1->mtime, + meta1->mtime_cs); + /* there is no centiseconds field for atime */ + node->atime = exfat_exfat2unix(meta1->adate, meta1->atime, 0); +} + +static void init_node_meta2(struct exfat_node* node, + const struct exfat_entry_meta2* meta2) +{ + node->size = le64_to_cpu(meta2->size); + node->start_cluster = le32_to_cpu(meta2->start_cluster); + node->fptr_cluster = node->start_cluster; + node->is_contiguous = ((meta2->flags & EXFAT_FLAG_CONTIGUOUS) != 0); +} + +static void init_node_name(struct exfat_node* node, + const struct exfat_entry* entries, int n) +{ + int i; + + for (i = 0; i < n; i++) + memcpy(node->name + i * EXFAT_ENAME_MAX, + ((const struct exfat_entry_name*) &entries[i])->name, + EXFAT_ENAME_MAX * sizeof(le16_t)); +} + +static bool check_entries(const struct exfat_entry* entry, int n) +{ + int previous = EXFAT_ENTRY_NONE; + int current; + int i; + + /* check transitions between entries types */ + for (i = 0; i < n + 1; previous = current, i++) + { + bool valid = false; + + current = (i < n) ? entry[i].type : EXFAT_ENTRY_NONE; + switch (previous) + { + case EXFAT_ENTRY_NONE: + valid = (current == EXFAT_ENTRY_FILE); + break; + case EXFAT_ENTRY_FILE: + valid = (current == EXFAT_ENTRY_FILE_INFO); + break; + case EXFAT_ENTRY_FILE_INFO: + valid = (current == EXFAT_ENTRY_FILE_NAME); + break; + case EXFAT_ENTRY_FILE_NAME: + valid = (current == EXFAT_ENTRY_FILE_NAME || + current == EXFAT_ENTRY_NONE || + current >= EXFAT_ENTRY_FILE_TAIL); + break; + case EXFAT_ENTRY_FILE_TAIL ... 0xff: + valid = (current >= EXFAT_ENTRY_FILE_TAIL || + current == EXFAT_ENTRY_NONE); + break; + } + + if (!valid) + { + exfat_error("unexpected entry type %#x after %#x at %d/%d", + current, previous, i, n); + return false; + } + } + return true; +} + +static bool check_node(const struct exfat* ef, struct exfat_node* node, + le16_t actual_checksum, const struct exfat_entry_meta1* meta1, + const struct exfat_entry_meta2* meta2) +{ + int cluster_size = CLUSTER_SIZE(*ef->sb); + uint64_t clusters_heap_size = + (uint64_t) le32_to_cpu(ef->sb->cluster_count) * cluster_size; + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]; + bool ret = true; + + /* + Validate checksum first. If it's invalid all other fields probably + contain just garbage. + */ + if (le16_to_cpu(actual_checksum) != le16_to_cpu(meta1->checksum)) + { + exfat_get_name(node, buffer); + exfat_error("'%s' has invalid checksum (%#hx != %#hx)", buffer, + le16_to_cpu(actual_checksum), le16_to_cpu(meta1->checksum)); + if (!EXFAT_REPAIR(invalid_node_checksum, ef, node)) + ret = false; + } + + /* + exFAT does not support sparse files but allows files with uninitialized + clusters. For such files valid_size means initialized data size and + cannot be greater than file size. See SetFileValidData() function + description in MSDN. + */ + if (le64_to_cpu(meta2->valid_size) > node->size) + { + exfat_get_name(node, buffer); + exfat_error("'%s' has valid size (%"PRIu64") greater than size " + "(%"PRIu64")", buffer, le64_to_cpu(meta2->valid_size), + node->size); + ret = false; + } + + /* + Empty file must have zero start cluster. Non-empty file must start + with a valid cluster. Directories cannot be empty (i.e. must always + have a valid start cluster), but we will check this later while + reading that directory to give user a chance to read this directory. + */ + if (node->size == 0 && node->start_cluster != EXFAT_CLUSTER_FREE) + { + exfat_get_name(node, buffer); + exfat_error("'%s' is empty but start cluster is %#x", buffer, + node->start_cluster); + ret = false; + } + if (node->size > 0 && CLUSTER_INVALID(*ef->sb, node->start_cluster)) + { + exfat_get_name(node, buffer); + exfat_error("'%s' points to invalid cluster %#x", buffer, + node->start_cluster); + ret = false; + } + + /* File or directory cannot be larger than clusters heap. */ + if (node->size > clusters_heap_size) + { + exfat_get_name(node, buffer); + exfat_error("'%s' is larger than clusters heap: %"PRIu64" > %"PRIu64, + buffer, node->size, clusters_heap_size); + ret = false; + } + + /* Empty file or directory must be marked as non-contiguous. */ + if (node->size == 0 && node->is_contiguous) + { + exfat_get_name(node, buffer); + exfat_error("'%s' is empty but marked as contiguous (%#hx)", buffer, + node->attrib); + ret = false; + } + + /* Directory size must be aligned on at cluster boundary. */ + if ((node->attrib & EXFAT_ATTRIB_DIR) && node->size % cluster_size != 0) + { + exfat_get_name(node, buffer); + exfat_error("'%s' directory size %"PRIu64" is not divisible by %d", buffer, + node->size, cluster_size); + ret = false; + } + + return ret; +} + +static int parse_file_entries(struct exfat* ef, struct exfat_node* node, + const struct exfat_entry* entries, int n) +{ + const struct exfat_entry_meta1* meta1; + const struct exfat_entry_meta2* meta2; + int mandatory_entries; + + if (!check_entries(entries, n)) + return -EIO; + + meta1 = (const struct exfat_entry_meta1*) &entries[0]; + if (meta1->continuations < 2) + { + exfat_error("too few continuations (%hhu)", meta1->continuations); + return -EIO; + } + meta2 = (const struct exfat_entry_meta2*) &entries[1]; + if (meta2->flags & ~(EXFAT_FLAG_ALWAYS1 | EXFAT_FLAG_CONTIGUOUS)) + { + exfat_error("unknown flags in meta2 (%#hhx)", meta2->flags); + return -EIO; + } + mandatory_entries = 2 + DIV_ROUND_UP(meta2->name_length, EXFAT_ENAME_MAX); + if (meta1->continuations < mandatory_entries - 1) + { + exfat_error("too few continuations (%hhu < %d)", + meta1->continuations, mandatory_entries - 1); + return -EIO; + } + + init_node_meta1(node, meta1); + init_node_meta2(node, meta2); + init_node_name(node, entries + 2, mandatory_entries - 2); + + if (!check_node(ef, node, exfat_calc_checksum(entries, n), meta1, meta2)) + return -EIO; + + return 0; +} + +static int parse_file_entry(struct exfat* ef, struct exfat_node* parent, + struct exfat_node** node, off_t* offset, int n) +{ + struct exfat_entry entries[n]; + int rc; + + rc = read_entries(ef, parent, entries, n, *offset); + if (rc != 0) + return rc; + + /* a new node has zero references */ + *node = allocate_node(); + if (*node == NULL) + return -ENOMEM; + (*node)->entry_offset = *offset; + + rc = parse_file_entries(ef, *node, entries, n); + if (rc != 0) + { + free(*node); + return rc; + } + + *offset += sizeof(struct exfat_entry[n]); + return 0; +} + +static void decompress_upcase(uint16_t* output, const le16_t* source, + size_t size) +{ + size_t si; + size_t oi; + + for (oi = 0; oi < EXFAT_UPCASE_CHARS; oi++) + output[oi] = oi; + + for (si = 0, oi = 0; si < size && oi < EXFAT_UPCASE_CHARS; si++) + { + uint16_t ch = le16_to_cpu(source[si]); + + if (ch == 0xffff && si + 1 < size) /* indicates a run */ + oi += le16_to_cpu(source[++si]); + else + output[oi++] = ch; + } +} + +/* + * Read one entry in a directory at offset position and build a new node + * structure. + */ +static int readdir(struct exfat* ef, struct exfat_node* parent, + struct exfat_node** node, off_t* offset) +{ + int rc; + struct exfat_entry entry; + const struct exfat_entry_meta1* meta1; + const struct exfat_entry_upcase* upcase; + const struct exfat_entry_bitmap* bitmap; + const struct exfat_entry_label* label; + uint64_t upcase_size = 0; + le16_t* upcase_comp = NULL; + + for (;;) + { + rc = read_entries(ef, parent, &entry, 1, *offset); + if (rc != 0) + return rc; + + switch (entry.type) + { + case EXFAT_ENTRY_FILE: + meta1 = (const struct exfat_entry_meta1*) &entry; + return parse_file_entry(ef, parent, node, offset, + 1 + meta1->continuations); + + case EXFAT_ENTRY_UPCASE: + if (ef->upcase != NULL) + break; + upcase = (const struct exfat_entry_upcase*) &entry; + if (CLUSTER_INVALID(*ef->sb, le32_to_cpu(upcase->start_cluster))) + { + exfat_error("invalid cluster 0x%x in upcase table", + le32_to_cpu(upcase->start_cluster)); + return -EIO; + } + upcase_size = le64_to_cpu(upcase->size); + if (upcase_size == 0 || + upcase_size > EXFAT_UPCASE_CHARS * sizeof(uint16_t) || + upcase_size % sizeof(uint16_t) != 0) + { + exfat_error("bad upcase table size (%"PRIu64" bytes)", + upcase_size); + return -EIO; + } + upcase_comp = malloc(upcase_size); + if (upcase_comp == NULL) + { + exfat_error("failed to allocate upcase table (%"PRIu64" bytes)", + upcase_size); + return -ENOMEM; + } + + /* read compressed upcase table */ + if (exfat_pread(ef->dev, upcase_comp, upcase_size, + exfat_c2o(ef, le32_to_cpu(upcase->start_cluster))) < 0) + { + free(upcase_comp); + exfat_error("failed to read upper case table " + "(%"PRIu64" bytes starting at cluster %#x)", + upcase_size, + le32_to_cpu(upcase->start_cluster)); + return -EIO; + } + + /* decompress upcase table */ + ef->upcase = calloc(EXFAT_UPCASE_CHARS, sizeof(uint16_t)); + if (ef->upcase == NULL) + { + free(upcase_comp); + exfat_error("failed to allocate decompressed upcase table"); + return -ENOMEM; + } + decompress_upcase(ef->upcase, upcase_comp, + upcase_size / sizeof(uint16_t)); + free(upcase_comp); + break; + + case EXFAT_ENTRY_BITMAP: + bitmap = (const struct exfat_entry_bitmap*) &entry; + ef->cmap.start_cluster = le32_to_cpu(bitmap->start_cluster); + if (CLUSTER_INVALID(*ef->sb, ef->cmap.start_cluster)) + { + exfat_error("invalid cluster 0x%x in clusters bitmap", + ef->cmap.start_cluster); + return -EIO; + } + ef->cmap.size = le32_to_cpu(ef->sb->cluster_count); + if (le64_to_cpu(bitmap->size) < DIV_ROUND_UP(ef->cmap.size, 8)) + { + exfat_error("invalid clusters bitmap size: %"PRIu64 + " (expected at least %u)", + le64_to_cpu(bitmap->size), + DIV_ROUND_UP(ef->cmap.size, 8)); + return -EIO; + } + /* FIXME bitmap can be rather big, up to 512 MB */ + ef->cmap.chunk_size = ef->cmap.size; + ef->cmap.chunk = malloc(BMAP_SIZE(ef->cmap.chunk_size)); + if (ef->cmap.chunk == NULL) + { + exfat_error("failed to allocate clusters bitmap chunk " + "(%"PRIu64" bytes)", le64_to_cpu(bitmap->size)); + return -ENOMEM; + } + + if (exfat_pread(ef->dev, ef->cmap.chunk, + BMAP_SIZE(ef->cmap.chunk_size), + exfat_c2o(ef, ef->cmap.start_cluster)) < 0) + { + exfat_error("failed to read clusters bitmap " + "(%"PRIu64" bytes starting at cluster %#x)", + le64_to_cpu(bitmap->size), ef->cmap.start_cluster); + return -EIO; + } + break; + + case EXFAT_ENTRY_LABEL: + label = (const struct exfat_entry_label*) &entry; + if (label->length > EXFAT_ENAME_MAX) + { + exfat_error("too long label (%hhu chars)", label->length); + return -EIO; + } + if (utf16_to_utf8(ef->label, label->name, + sizeof(ef->label), EXFAT_ENAME_MAX) != 0) + return -EIO; + break; + + default: + if (!(entry.type & EXFAT_ENTRY_VALID)) + break; /* deleted entry, ignore it */ + + exfat_error("unknown entry type %#hhx", entry.type); + if (!EXFAT_REPAIR(unknown_entry, ef, parent, &entry, *offset)) + return -EIO; + } + *offset += sizeof(entry); + } + /* we never reach here */ +} + +int exfat_cache_directory(struct exfat* ef, struct exfat_node* dir) +{ + off_t offset = 0; + int rc; + struct exfat_node* node; + struct exfat_node* current = NULL; + + if (dir->is_cached) + return 0; /* already cached */ + + while ((rc = readdir(ef, dir, &node, &offset)) == 0) + { + node->parent = dir; + if (current != NULL) + { + current->next = node; + node->prev = current; + } + else + dir->child = node; + + current = node; + } + + if (rc != -ENOENT) + { + /* rollback */ + for (current = dir->child; current; current = node) + { + node = current->next; + free(current); + } + dir->child = NULL; + return rc; + } + + dir->is_cached = true; + return 0; +} + +static void tree_attach(struct exfat_node* dir, struct exfat_node* node) +{ + node->parent = dir; + if (dir->child) + { + dir->child->prev = node; + node->next = dir->child; + } + dir->child = node; +} + +static void tree_detach(struct exfat_node* node) +{ + if (node->prev) + node->prev->next = node->next; + else /* this is the first node in the list */ + node->parent->child = node->next; + if (node->next) + node->next->prev = node->prev; + node->parent = NULL; + node->prev = NULL; + node->next = NULL; +} + +static void reset_cache(struct exfat* ef, struct exfat_node* node) +{ + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]; + + while (node->child) + { + struct exfat_node* p = node->child; + reset_cache(ef, p); + tree_detach(p); + free(p); + } + node->is_cached = false; + if (node->references != 0) + { + exfat_get_name(node, buffer); + exfat_warn("non-zero reference counter (%d) for '%s'", + node->references, buffer); + } + if (node != ef->root && node->is_dirty) + { + exfat_get_name(node, buffer); + exfat_bug("node '%s' is dirty", buffer); + } + while (node->references) + exfat_put_node(ef, node); +} + +void exfat_reset_cache(struct exfat* ef) +{ + reset_cache(ef, ef->root); +} + +int exfat_flush_node(struct exfat* ef, struct exfat_node* node) +{ + struct exfat_entry entries[1 + node->continuations]; + struct exfat_entry_meta1* meta1 = (struct exfat_entry_meta1*) &entries[0]; + struct exfat_entry_meta2* meta2 = (struct exfat_entry_meta2*) &entries[1]; + int rc; + + if (!node->is_dirty) + return 0; /* no need to flush */ + + if (ef->ro) + exfat_bug("unable to flush node to read-only FS"); + + if (node->parent == NULL) + return 0; /* do not flush unlinked node */ + + rc = read_entries(ef, node->parent, entries, 1 + node->continuations, + node->entry_offset); + if (rc != 0) + return rc; + if (!check_entries(entries, 1 + node->continuations)) + return -EIO; + + meta1->attrib = cpu_to_le16(node->attrib); + exfat_unix2exfat(node->mtime, &meta1->mdate, &meta1->mtime, + &meta1->mtime_cs); + exfat_unix2exfat(node->atime, &meta1->adate, &meta1->atime, NULL); + meta2->size = meta2->valid_size = cpu_to_le64(node->size); + meta2->start_cluster = cpu_to_le32(node->start_cluster); + meta2->flags = EXFAT_FLAG_ALWAYS1; + /* empty files must not be marked as contiguous */ + if (node->size != 0 && node->is_contiguous) + meta2->flags |= EXFAT_FLAG_CONTIGUOUS; + /* name hash remains unchanged, no need to recalculate it */ + + meta1->checksum = exfat_calc_checksum(entries, 1 + node->continuations); + rc = write_entries(ef, node->parent, entries, 1 + node->continuations, + node->entry_offset); + if (rc != 0) + return rc; + + node->is_dirty = false; + return exfat_flush(ef); +} + +static int erase_entries(struct exfat* ef, struct exfat_node* dir, int n, + off_t offset) +{ + struct exfat_entry entries[n]; + int rc; + int i; + + rc = read_entries(ef, dir, entries, n, offset); + if (rc != 0) + return rc; + for (i = 0; i < n; i++) + entries[i].type &= ~EXFAT_ENTRY_VALID; + return write_entries(ef, dir, entries, n, offset); +} + +static int erase_node(struct exfat* ef, struct exfat_node* node) +{ + int rc; + + exfat_get_node(node->parent); + rc = erase_entries(ef, node->parent, 1 + node->continuations, + node->entry_offset); + if (rc != 0) + { + exfat_put_node(ef, node->parent); + return rc; + } + rc = exfat_flush_node(ef, node->parent); + exfat_put_node(ef, node->parent); + return rc; +} + +static int shrink_directory(struct exfat* ef, struct exfat_node* dir, + off_t deleted_offset) +{ + const struct exfat_node* node; + const struct exfat_node* last_node; + uint64_t entries = 0; + uint64_t new_size; + + if (!(dir->attrib & EXFAT_ATTRIB_DIR)) + exfat_bug("attempted to shrink a file"); + if (!dir->is_cached) + exfat_bug("attempted to shrink uncached directory"); + + for (last_node = node = dir->child; node; node = node->next) + { + if (deleted_offset < node->entry_offset) + { + /* there are other entries after the removed one, no way to shrink + this directory */ + return 0; + } + if (last_node->entry_offset < node->entry_offset) + last_node = node; + } + + if (last_node) + { + /* offset of the last entry */ + entries += last_node->entry_offset / sizeof(struct exfat_entry); + /* two subentries with meta info */ + entries += 2; + /* subentries with file name */ + entries += DIV_ROUND_UP(utf16_length(last_node->name), + EXFAT_ENAME_MAX); + } + + new_size = DIV_ROUND_UP(entries * sizeof(struct exfat_entry), + CLUSTER_SIZE(*ef->sb)) * CLUSTER_SIZE(*ef->sb); + if (new_size == 0) /* directory always has at least 1 cluster */ + new_size = CLUSTER_SIZE(*ef->sb); + if (new_size == dir->size) + return 0; + return exfat_truncate(ef, dir, new_size, true); +} + +static int delete(struct exfat* ef, struct exfat_node* node) +{ + struct exfat_node* parent = node->parent; + off_t deleted_offset = node->entry_offset; + int rc; + + exfat_get_node(parent); + rc = erase_node(ef, node); + if (rc != 0) + { + exfat_put_node(ef, parent); + return rc; + } + tree_detach(node); + rc = shrink_directory(ef, parent, deleted_offset); + node->is_unlinked = true; + if (rc != 0) + { + exfat_flush_node(ef, parent); + exfat_put_node(ef, parent); + return rc; + } + exfat_update_mtime(parent); + rc = exfat_flush_node(ef, parent); + exfat_put_node(ef, parent); + return rc; +} + +int exfat_unlink(struct exfat* ef, struct exfat_node* node) +{ + if (node->attrib & EXFAT_ATTRIB_DIR) + return -EISDIR; + return delete(ef, node); +} + +int exfat_rmdir(struct exfat* ef, struct exfat_node* node) +{ + int rc; + + if (!(node->attrib & EXFAT_ATTRIB_DIR)) + return -ENOTDIR; + /* check that directory is empty */ + rc = exfat_cache_directory(ef, node); + if (rc != 0) + return rc; + if (node->child) + return -ENOTEMPTY; + return delete(ef, node); +} + +static int check_slot(struct exfat* ef, struct exfat_node* dir, off_t offset, + int n) +{ + struct exfat_entry entries[n]; + int rc; + size_t i; + + /* Root directory contains entries, that don't have any nodes associated + with them (clusters bitmap, upper case table, label). We need to be + careful not to overwrite them. */ + if (dir != ef->root) + return 0; + + rc = read_entries(ef, dir, entries, n, offset); + if (rc != 0) + return rc; + for (i = 0; i < n; i++) + if (entries[i].type & EXFAT_ENTRY_VALID) + return -EINVAL; + return 0; +} + +static int find_slot(struct exfat* ef, struct exfat_node* dir, + off_t* offset, int n) +{ + bitmap_t* dmap; + struct exfat_node* p; + size_t i; + int contiguous = 0; + + if (!dir->is_cached) + exfat_bug("directory is not cached"); + + /* build a bitmap of valid entries in the directory */ + dmap = calloc(BMAP_SIZE(dir->size / sizeof(struct exfat_entry)), + sizeof(bitmap_t)); + if (dmap == NULL) + { + exfat_error("failed to allocate directory bitmap (%"PRIu64")", + dir->size / sizeof(struct exfat_entry)); + return -ENOMEM; + } + for (p = dir->child; p != NULL; p = p->next) + for (i = 0; i < 1 + p->continuations; i++) + BMAP_SET(dmap, p->entry_offset / sizeof(struct exfat_entry) + i); + + /* find a slot in the directory entries bitmap */ + for (i = 0; i < dir->size / sizeof(struct exfat_entry); i++) + { + if (BMAP_GET(dmap, i) == 0) + { + if (contiguous++ == 0) + *offset = (off_t) i * sizeof(struct exfat_entry); + if (contiguous == n) + /* suitable slot is found, check that it's not occupied */ + switch (check_slot(ef, dir, *offset, n)) + { + case 0: + free(dmap); + return 0; + case -EIO: + free(dmap); + return -EIO; + case -EINVAL: + /* slot at (i-n) is occupied, go back and check (i-n+1) */ + i -= contiguous - 1; + contiguous = 0; + break; + } + } + else + contiguous = 0; + } + free(dmap); + + /* no suitable slots found, extend the directory */ + if (contiguous == 0) + *offset = dir->size; + return exfat_truncate(ef, dir, + ROUND_UP(dir->size + sizeof(struct exfat_entry[n - contiguous]), + CLUSTER_SIZE(*ef->sb)), + true); +} + +static int commit_entry(struct exfat* ef, struct exfat_node* dir, + const le16_t* name, off_t offset, uint16_t attrib) +{ + struct exfat_node* node; + const size_t name_length = utf16_length(name); + const int name_entries = DIV_ROUND_UP(name_length, EXFAT_ENAME_MAX); + struct exfat_entry entries[2 + name_entries]; + struct exfat_entry_meta1* meta1 = (struct exfat_entry_meta1*) &entries[0]; + struct exfat_entry_meta2* meta2 = (struct exfat_entry_meta2*) &entries[1]; + int i; + int rc; + + memset(entries, 0, sizeof(struct exfat_entry[2])); + + meta1->type = EXFAT_ENTRY_FILE; + meta1->continuations = 1 + name_entries; + meta1->attrib = cpu_to_le16(attrib); + exfat_unix2exfat(time(NULL), &meta1->crdate, &meta1->crtime, + &meta1->crtime_cs); + meta1->adate = meta1->mdate = meta1->crdate; + meta1->atime = meta1->mtime = meta1->crtime; + meta1->mtime_cs = meta1->crtime_cs; /* there is no atime_cs */ + + meta2->type = EXFAT_ENTRY_FILE_INFO; + meta2->flags = EXFAT_FLAG_ALWAYS1; + meta2->name_length = name_length; + meta2->name_hash = exfat_calc_name_hash(ef, name, name_length); + meta2->start_cluster = cpu_to_le32(EXFAT_CLUSTER_FREE); + + for (i = 0; i < name_entries; i++) + { + struct exfat_entry_name* name_entry; + + name_entry = (struct exfat_entry_name*) &entries[2 + i]; + name_entry->type = EXFAT_ENTRY_FILE_NAME; + name_entry->__unknown = 0; + memcpy(name_entry->name, name + i * EXFAT_ENAME_MAX, + EXFAT_ENAME_MAX * sizeof(le16_t)); + } + + meta1->checksum = exfat_calc_checksum(entries, 2 + name_entries); + rc = write_entries(ef, dir, entries, 2 + name_entries, offset); + if (rc != 0) + return rc; + + node = allocate_node(); + if (node == NULL) + return -ENOMEM; + node->entry_offset = offset; + memcpy(node->name, name, name_length * sizeof(le16_t)); + init_node_meta1(node, meta1); + init_node_meta2(node, meta2); + + tree_attach(dir, node); + return 0; +} + +static int create(struct exfat* ef, const char* path, uint16_t attrib) +{ + struct exfat_node* dir; + struct exfat_node* existing; + off_t offset = -1; + le16_t name[EXFAT_NAME_MAX + 1]; + int rc; + + rc = exfat_split(ef, &dir, &existing, name, path); + if (rc != 0) + return rc; + if (existing != NULL) + { + exfat_put_node(ef, existing); + exfat_put_node(ef, dir); + return -EEXIST; + } + + rc = find_slot(ef, dir, &offset, + 2 + DIV_ROUND_UP(utf16_length(name), EXFAT_ENAME_MAX)); + if (rc != 0) + { + exfat_put_node(ef, dir); + return rc; + } + rc = commit_entry(ef, dir, name, offset, attrib); + if (rc != 0) + { + exfat_put_node(ef, dir); + return rc; + } + exfat_update_mtime(dir); + rc = exfat_flush_node(ef, dir); + exfat_put_node(ef, dir); + return rc; +} + +int exfat_mknod(struct exfat* ef, const char* path) +{ + return create(ef, path, EXFAT_ATTRIB_ARCH); +} + +int exfat_mkdir(struct exfat* ef, const char* path) +{ + int rc; + struct exfat_node* node; + + rc = create(ef, path, EXFAT_ATTRIB_DIR); + if (rc != 0) + return rc; + rc = exfat_lookup(ef, &node, path); + if (rc != 0) + return 0; + /* directories always have at least one cluster */ + rc = exfat_truncate(ef, node, CLUSTER_SIZE(*ef->sb), true); + if (rc != 0) + { + delete(ef, node); + exfat_put_node(ef, node); + return rc; + } + rc = exfat_flush_node(ef, node); + if (rc != 0) + { + delete(ef, node); + exfat_put_node(ef, node); + return rc; + } + exfat_put_node(ef, node); + return 0; +} + +static int rename_entry(struct exfat* ef, struct exfat_node* dir, + struct exfat_node* node, const le16_t* name, off_t new_offset) +{ + const size_t name_length = utf16_length(name); + const int name_entries = DIV_ROUND_UP(name_length, EXFAT_ENAME_MAX); + struct exfat_entry entries[2 + name_entries]; + struct exfat_entry_meta1* meta1 = (struct exfat_entry_meta1*) &entries[0]; + struct exfat_entry_meta2* meta2 = (struct exfat_entry_meta2*) &entries[1]; + int rc; + int i; + + rc = read_entries(ef, node->parent, entries, 2, node->entry_offset); + if (rc != 0) + return rc; + + meta1->continuations = 1 + name_entries; + meta2->name_length = name_length; + meta2->name_hash = exfat_calc_name_hash(ef, name, name_length); + + rc = erase_node(ef, node); + if (rc != 0) + return rc; + + node->entry_offset = new_offset; + node->continuations = 1 + name_entries; + + for (i = 0; i < name_entries; i++) + { + struct exfat_entry_name* name_entry; + + name_entry = (struct exfat_entry_name*) &entries[2 + i]; + name_entry->type = EXFAT_ENTRY_FILE_NAME; + name_entry->__unknown = 0; + memcpy(name_entry->name, name + i * EXFAT_ENAME_MAX, + EXFAT_ENAME_MAX * sizeof(le16_t)); + } + + meta1->checksum = exfat_calc_checksum(entries, 2 + name_entries); + rc = write_entries(ef, dir, entries, 2 + name_entries, new_offset); + if (rc != 0) + return rc; + + memcpy(node->name, name, (EXFAT_NAME_MAX + 1) * sizeof(le16_t)); + tree_detach(node); + tree_attach(dir, node); + return 0; +} + +int exfat_rename(struct exfat* ef, const char* old_path, const char* new_path) +{ + struct exfat_node* node; + struct exfat_node* existing; + struct exfat_node* dir; + off_t offset = -1; + le16_t name[EXFAT_NAME_MAX + 1]; + int rc; + + rc = exfat_lookup(ef, &node, old_path); + if (rc != 0) + return rc; + + rc = exfat_split(ef, &dir, &existing, name, new_path); + if (rc != 0) + { + exfat_put_node(ef, node); + return rc; + } + + /* check that target is not a subdirectory of the source */ + if (node->attrib & EXFAT_ATTRIB_DIR) + { + struct exfat_node* p; + + for (p = dir; p; p = p->parent) + if (node == p) + { + if (existing != NULL) + exfat_put_node(ef, existing); + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return -EINVAL; + } + } + + if (existing != NULL) + { + /* remove target if it's not the same node as source */ + if (existing != node) + { + if (existing->attrib & EXFAT_ATTRIB_DIR) + { + if (node->attrib & EXFAT_ATTRIB_DIR) + rc = exfat_rmdir(ef, existing); + else + rc = -ENOTDIR; + } + else + { + if (!(node->attrib & EXFAT_ATTRIB_DIR)) + rc = exfat_unlink(ef, existing); + else + rc = -EISDIR; + } + exfat_put_node(ef, existing); + if (rc != 0) + { + /* free clusters even if something went wrong; overwise they + will be just lost */ + exfat_cleanup_node(ef, existing); + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return rc; + } + rc = exfat_cleanup_node(ef, existing); + if (rc != 0) + { + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return rc; + } + } + else + exfat_put_node(ef, existing); + } + + rc = find_slot(ef, dir, &offset, + 2 + DIV_ROUND_UP(utf16_length(name), EXFAT_ENAME_MAX)); + if (rc != 0) + { + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return rc; + } + rc = rename_entry(ef, dir, node, name, offset); + if (rc != 0) + { + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + return rc; + } + rc = exfat_flush_node(ef, dir); + exfat_put_node(ef, dir); + exfat_put_node(ef, node); + /* node itself is not marked as dirty, no need to flush it */ + return rc; +} + +void exfat_utimes(struct exfat_node* node, const struct timespec tv[2]) +{ + node->atime = tv[0].tv_sec; + node->mtime = tv[1].tv_sec; + node->is_dirty = true; +} + +void exfat_update_atime(struct exfat_node* node) +{ + node->atime = time(NULL); + node->is_dirty = true; +} + +void exfat_update_mtime(struct exfat_node* node) +{ + node->mtime = time(NULL); + node->is_dirty = true; +} + +const char* exfat_get_label(struct exfat* ef) +{ + return ef->label; +} + +static int find_label(struct exfat* ef, off_t* offset) +{ + struct exfat_entry entry; + int rc; + + for (*offset = 0; ; *offset += sizeof(entry)) + { + rc = read_entries(ef, ef->root, &entry, 1, *offset); + if (rc != 0) + return rc; + + if (entry.type == EXFAT_ENTRY_LABEL) + return 0; + } +} + +int exfat_set_label(struct exfat* ef, const char* label) +{ + le16_t label_utf16[EXFAT_ENAME_MAX + 1]; + int rc; + off_t offset; + struct exfat_entry_label entry; + + memset(label_utf16, 0, sizeof(label_utf16)); + rc = utf8_to_utf16(label_utf16, label, EXFAT_ENAME_MAX + 1, strlen(label)); + if (rc != 0) + return rc; + + rc = find_label(ef, &offset); + if (rc == -ENOENT) + rc = find_slot(ef, ef->root, &offset, 1); + if (rc != 0) + return rc; + + entry.type = EXFAT_ENTRY_LABEL; + entry.length = utf16_length(label_utf16); + memcpy(entry.name, label_utf16, sizeof(entry.name)); + if (entry.length == 0) + entry.type ^= EXFAT_ENTRY_VALID; + + rc = write_entries(ef, ef->root, (struct exfat_entry*) &entry, 1, offset); + if (rc != 0) + return rc; + + strcpy(ef->label, label); + return 0; +} diff --git a/src/gui/Lib/exfat/src/libexfat/platform.h b/src/gui/Lib/exfat/src/libexfat/platform.h new file mode 100644 index 0000000..9ab3155 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/platform.h @@ -0,0 +1,63 @@ +/* + platform.h (14.05.13) + OS-specific code (libc-specific in fact). Note that systems with the + same kernel can use different libc implementations. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef PLATFORM_H_INCLUDED +#define PLATFORM_H_INCLUDED + +#if defined(__linux__) || defined(__GLIBC__) || defined(__GNU__) + +#include +#include +#define exfat_bswap16(x) bswap_16(x) +#define exfat_bswap32(x) bswap_32(x) +#define exfat_bswap64(x) bswap_64(x) +#define EXFAT_BYTE_ORDER __BYTE_ORDER +#define EXFAT_LITTLE_ENDIAN __LITTLE_ENDIAN +#define EXFAT_BIG_ENDIAN __BIG_ENDIAN + +#elif defined(__APPLE__) + +#include +#include +#define exfat_bswap16(x) OSSwapInt16(x) +#define exfat_bswap32(x) OSSwapInt32(x) +#define exfat_bswap64(x) OSSwapInt64(x) +#define EXFAT_BYTE_ORDER BYTE_ORDER +#define EXFAT_LITTLE_ENDIAN LITTLE_ENDIAN +#define EXFAT_BIG_ENDIAN BIG_ENDIAN + +#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) || defined(__OpenBSD__) + +#include +#define exfat_bswap16(x) bswap16(x) +#define exfat_bswap32(x) bswap32(x) +#define exfat_bswap64(x) bswap64(x) +#define EXFAT_BYTE_ORDER _BYTE_ORDER +#define EXFAT_LITTLE_ENDIAN _LITTLE_ENDIAN +#define EXFAT_BIG_ENDIAN _BIG_ENDIAN + +#else +#error Unknown platform +#endif + +#endif /* ifndef PLATFORM_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/libexfat/repair.c b/src/gui/Lib/exfat/src/libexfat/repair.c new file mode 100644 index 0000000..620ad52 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/repair.c @@ -0,0 +1,103 @@ +/* + repair.c (09.03.17) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include + +int exfat_errors_fixed; + +bool exfat_ask_to_fix(const struct exfat* ef) +{ + const char* question = "Fix (Y/N)?"; + char answer[8]; + bool yeah, nope; + + switch (ef->repair) + { + case EXFAT_REPAIR_NO: + return false; + case EXFAT_REPAIR_YES: + printf("%s %s", question, "Y\n"); + return true; + case EXFAT_REPAIR_ASK: + do + { + printf("%s ", question); + fflush(stdout); + if (fgets(answer, sizeof(answer), stdin)) + { + yeah = strcasecmp(answer, "Y\n") == 0; + nope = strcasecmp(answer, "N\n") == 0; + } + else + { + yeah = false; + nope = true; + } + } + while (!yeah && !nope); + return yeah; + } + exfat_bug("invalid repair option value: %d", ef->repair); + return false; +} + +bool exfat_fix_invalid_vbr_checksum(const struct exfat* ef, void* sector, + uint32_t vbr_checksum) +{ + size_t i; + off_t sector_size = SECTOR_SIZE(*ef->sb); + + for (i = 0; i < sector_size / sizeof(vbr_checksum); i++) + ((le32_t*) sector)[i] = cpu_to_le32(vbr_checksum); + if (exfat_pwrite(ef->dev, sector, sector_size, 11 * sector_size) < 0) + { + exfat_error("failed to write correct VBR checksum"); + return false; + } + exfat_errors_fixed++; + return true; +} + +bool exfat_fix_invalid_node_checksum(const struct exfat* ef, + struct exfat_node* node) +{ + /* checksum will be rewritten by exfat_flush_node() */ + node->is_dirty = true; + + exfat_errors_fixed++; + return true; +} + +bool exfat_fix_unknown_entry(struct exfat* ef, struct exfat_node* dir, + const struct exfat_entry* entry, off_t offset) +{ + struct exfat_entry deleted = *entry; + + deleted.type &= ~EXFAT_ENTRY_VALID; + if (exfat_generic_pwrite(ef, dir, &deleted, sizeof(struct exfat_entry), + offset) != sizeof(struct exfat_entry)) + return false; + + exfat_errors_fixed++; + return true; +} diff --git a/src/gui/Lib/exfat/src/libexfat/time.c b/src/gui/Lib/exfat/src/libexfat/time.c new file mode 100644 index 0000000..31ae5a2 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/time.c @@ -0,0 +1,164 @@ +/* + time.c (03.02.12) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" + +/* timezone offset from UTC in seconds; positive for western timezones, + negative for eastern ones */ +static long exfat_timezone; + +#define SEC_IN_MIN 60ll +#define SEC_IN_HOUR (60 * SEC_IN_MIN) +#define SEC_IN_DAY (24 * SEC_IN_HOUR) +#define SEC_IN_YEAR (365 * SEC_IN_DAY) /* not leap year */ +/* Unix epoch started at 0:00:00 UTC 1 January 1970 */ +#define UNIX_EPOCH_YEAR 1970 +/* exFAT epoch started at 0:00:00 UTC 1 January 1980 */ +#define EXFAT_EPOCH_YEAR 1980 +/* number of years from Unix epoch to exFAT epoch */ +#define EPOCH_DIFF_YEAR (EXFAT_EPOCH_YEAR - UNIX_EPOCH_YEAR) +/* number of days from Unix epoch to exFAT epoch (considering leap days) */ +#define EPOCH_DIFF_DAYS (EPOCH_DIFF_YEAR * 365 + EPOCH_DIFF_YEAR / 4) +/* number of seconds from Unix epoch to exFAT epoch (considering leap days) */ +#define EPOCH_DIFF_SEC (EPOCH_DIFF_DAYS * SEC_IN_DAY) +/* number of leap years passed from exFAT epoch to the specified year + (excluding the specified year itself) */ +#define LEAP_YEARS(year) ((EXFAT_EPOCH_YEAR + (year) - 1) / 4 \ + - (EXFAT_EPOCH_YEAR - 1) / 4) +/* checks whether the specified year is leap */ +#define IS_LEAP_YEAR(year) ((EXFAT_EPOCH_YEAR + (year)) % 4 == 0) + +static const time_t days_in_year[] = +{ + /* Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec */ + 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 +}; + +time_t exfat_exfat2unix(le16_t date, le16_t time, uint8_t centisec) +{ + time_t unix_time = EPOCH_DIFF_SEC; + uint16_t ndate = le16_to_cpu(date); + uint16_t ntime = le16_to_cpu(time); + + uint16_t day = ndate & 0x1f; /* 5 bits, 1-31 */ + uint16_t month = ndate >> 5 & 0xf; /* 4 bits, 1-12 */ + uint16_t year = ndate >> 9; /* 7 bits, 1-127 (+1980) */ + + uint16_t twosec = ntime & 0x1f; /* 5 bits, 0-29 (2 sec granularity) */ + uint16_t min = ntime >> 5 & 0x3f; /* 6 bits, 0-59 */ + uint16_t hour = ntime >> 11; /* 5 bits, 0-23 */ + + if (day == 0 || month == 0 || month > 12) + { + exfat_error("bad date %u-%02hu-%02hu", + year + EXFAT_EPOCH_YEAR, month, day); + return 0; + } + if (hour > 23 || min > 59 || twosec > 29) + { + exfat_error("bad time %hu:%02hu:%02u", + hour, min, twosec * 2); + return 0; + } + if (centisec > 199) + { + exfat_error("bad centiseconds count %hhu", centisec); + return 0; + } + + /* every 4th year between 1904 and 2096 is leap */ + unix_time += year * SEC_IN_YEAR + LEAP_YEARS(year) * SEC_IN_DAY; + unix_time += days_in_year[month] * SEC_IN_DAY; + /* if it's leap year and February has passed we should add 1 day */ + if ((EXFAT_EPOCH_YEAR + year) % 4 == 0 && month > 2) + unix_time += SEC_IN_DAY; + unix_time += (day - 1) * SEC_IN_DAY; + + unix_time += hour * SEC_IN_HOUR; + unix_time += min * SEC_IN_MIN; + /* exFAT represents time with 2 sec granularity */ + unix_time += twosec * 2; + unix_time += centisec / 100; + + /* exFAT stores timestamps in local time, so we correct it to UTC */ + unix_time += exfat_timezone; + + return unix_time; +} + +void exfat_unix2exfat(time_t unix_time, le16_t* date, le16_t* time, + uint8_t* centisec) +{ + time_t shift = EPOCH_DIFF_SEC + exfat_timezone; + uint16_t day, month, year; + uint16_t twosec, min, hour; + int days; + int i; + + /* time before exFAT epoch cannot be represented */ + if (unix_time < shift) + unix_time = shift; + + unix_time -= shift; + + days = unix_time / SEC_IN_DAY; + year = (4 * days) / (4 * 365 + 1); + days -= year * 365 + LEAP_YEARS(year); + month = 0; + for (i = 1; i <= 12; i++) + { + int leap_day = (IS_LEAP_YEAR(year) && i == 2); + int leap_sub = (IS_LEAP_YEAR(year) && i >= 3); + + if (i == 12 || days - leap_sub < days_in_year[i + 1] + leap_day) + { + month = i; + days -= days_in_year[i] + leap_sub; + break; + } + } + day = days + 1; + + hour = (unix_time % SEC_IN_DAY) / SEC_IN_HOUR; + min = (unix_time % SEC_IN_HOUR) / SEC_IN_MIN; + twosec = (unix_time % SEC_IN_MIN) / 2; + + *date = cpu_to_le16(day | (month << 5) | (year << 9)); + *time = cpu_to_le16(twosec | (min << 5) | (hour << 11)); + if (centisec) + *centisec = (unix_time % 2) * 100; +} + +void exfat_tzset(void) +{ + time_t now; + struct tm* utc; + + tzset(); + now = time(NULL); + utc = gmtime(&now); + /* gmtime() always sets tm_isdst to 0 because daylight savings never + affect UTC. Setting tm_isdst to -1 makes mktime() to determine whether + summer time is in effect. */ + utc->tm_isdst = -1; + exfat_timezone = mktime(utc) - now; +} diff --git a/src/gui/Lib/exfat/src/libexfat/utf.c b/src/gui/Lib/exfat/src/libexfat/utf.c new file mode 100644 index 0000000..0d0018c --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/utf.c @@ -0,0 +1,245 @@ +/* + utf.c (13.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include + +static char* wchar_to_utf8(char* output, wchar_t wc, size_t outsize) +{ + if (wc <= 0x7f) + { + if (outsize < 1) + return NULL; + *output++ = (char) wc; + } + else if (wc <= 0x7ff) + { + if (outsize < 2) + return NULL; + *output++ = 0xc0 | (wc >> 6); + *output++ = 0x80 | (wc & 0x3f); + } + else if (wc <= 0xffff) + { + if (outsize < 3) + return NULL; + *output++ = 0xe0 | (wc >> 12); + *output++ = 0x80 | ((wc >> 6) & 0x3f); + *output++ = 0x80 | (wc & 0x3f); + } + else if (wc <= 0x1fffff) + { + if (outsize < 4) + return NULL; + *output++ = 0xf0 | (wc >> 18); + *output++ = 0x80 | ((wc >> 12) & 0x3f); + *output++ = 0x80 | ((wc >> 6) & 0x3f); + *output++ = 0x80 | (wc & 0x3f); + } + else if (wc <= 0x3ffffff) + { + if (outsize < 5) + return NULL; + *output++ = 0xf8 | (wc >> 24); + *output++ = 0x80 | ((wc >> 18) & 0x3f); + *output++ = 0x80 | ((wc >> 12) & 0x3f); + *output++ = 0x80 | ((wc >> 6) & 0x3f); + *output++ = 0x80 | (wc & 0x3f); + } + else if (wc <= 0x7fffffff) + { + if (outsize < 6) + return NULL; + *output++ = 0xfc | (wc >> 30); + *output++ = 0x80 | ((wc >> 24) & 0x3f); + *output++ = 0x80 | ((wc >> 18) & 0x3f); + *output++ = 0x80 | ((wc >> 12) & 0x3f); + *output++ = 0x80 | ((wc >> 6) & 0x3f); + *output++ = 0x80 | (wc & 0x3f); + } + else + return NULL; + + return output; +} + +static const le16_t* utf16_to_wchar(const le16_t* input, wchar_t* wc, + size_t insize) +{ + if ((le16_to_cpu(input[0]) & 0xfc00) == 0xd800) + { + if (insize < 2 || (le16_to_cpu(input[1]) & 0xfc00) != 0xdc00) + return NULL; + *wc = ((wchar_t) (le16_to_cpu(input[0]) & 0x3ff) << 10); + *wc |= (le16_to_cpu(input[1]) & 0x3ff); + *wc += 0x10000; + return input + 2; + } + else + { + *wc = le16_to_cpu(*input); + return input + 1; + } +} + +int utf16_to_utf8(char* output, const le16_t* input, size_t outsize, + size_t insize) +{ + const le16_t* inp = input; + char* outp = output; + wchar_t wc; + + while (inp - input < insize) + { + inp = utf16_to_wchar(inp, &wc, insize - (inp - input)); + if (inp == NULL) + { + exfat_error("illegal UTF-16 sequence"); + return -EILSEQ; + } + outp = wchar_to_utf8(outp, wc, outsize - (outp - output)); + if (outp == NULL) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; + } + if (wc == 0) + return 0; + } + if (outp - output >= outsize) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; + } + *outp = '\0'; + return 0; +} + +static const char* utf8_to_wchar(const char* input, wchar_t* wc, + size_t insize) +{ + if ((input[0] & 0x80) == 0 && insize >= 1) + { + *wc = (wchar_t) input[0]; + return input + 1; + } + if ((input[0] & 0xe0) == 0xc0 && insize >= 2) + { + *wc = (((wchar_t) input[0] & 0x1f) << 6) | + ((wchar_t) input[1] & 0x3f); + return input + 2; + } + if ((input[0] & 0xf0) == 0xe0 && insize >= 3) + { + *wc = (((wchar_t) input[0] & 0x0f) << 12) | + (((wchar_t) input[1] & 0x3f) << 6) | + ((wchar_t) input[2] & 0x3f); + return input + 3; + } + if ((input[0] & 0xf8) == 0xf0 && insize >= 4) + { + *wc = (((wchar_t) input[0] & 0x07) << 18) | + (((wchar_t) input[1] & 0x3f) << 12) | + (((wchar_t) input[2] & 0x3f) << 6) | + ((wchar_t) input[3] & 0x3f); + return input + 4; + } + if ((input[0] & 0xfc) == 0xf8 && insize >= 5) + { + *wc = (((wchar_t) input[0] & 0x03) << 24) | + (((wchar_t) input[1] & 0x3f) << 18) | + (((wchar_t) input[2] & 0x3f) << 12) | + (((wchar_t) input[3] & 0x3f) << 6) | + ((wchar_t) input[4] & 0x3f); + return input + 5; + } + if ((input[0] & 0xfe) == 0xfc && insize >= 6) + { + *wc = (((wchar_t) input[0] & 0x01) << 30) | + (((wchar_t) input[1] & 0x3f) << 24) | + (((wchar_t) input[2] & 0x3f) << 18) | + (((wchar_t) input[3] & 0x3f) << 12) | + (((wchar_t) input[4] & 0x3f) << 6) | + ((wchar_t) input[5] & 0x3f); + return input + 6; + } + return NULL; +} + +static le16_t* wchar_to_utf16(le16_t* output, wchar_t wc, size_t outsize) +{ + if (wc <= 0xffff) /* if character is from BMP */ + { + if (outsize == 0) + return NULL; + output[0] = cpu_to_le16(wc); + return output + 1; + } + if (outsize < 2) + return NULL; + wc -= 0x10000; + output[0] = cpu_to_le16(0xd800 | ((wc >> 10) & 0x3ff)); + output[1] = cpu_to_le16(0xdc00 | (wc & 0x3ff)); + return output + 2; +} + +int utf8_to_utf16(le16_t* output, const char* input, size_t outsize, + size_t insize) +{ + const char* inp = input; + le16_t* outp = output; + wchar_t wc; + + while (inp - input < insize) + { + inp = utf8_to_wchar(inp, &wc, insize - (inp - input)); + if (inp == NULL) + { + exfat_error("illegal UTF-8 sequence"); + return -EILSEQ; + } + outp = wchar_to_utf16(outp, wc, outsize - (outp - output)); + if (outp == NULL) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; + } + if (wc == 0) + break; + } + if (outp - output >= outsize) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; + } + *outp = cpu_to_le16(0); + return 0; +} + +size_t utf16_length(const le16_t* str) +{ + size_t i = 0; + + while (le16_to_cpu(str[i])) + i++; + return i; +} diff --git a/src/gui/Lib/exfat/src/libexfat/utils.c b/src/gui/Lib/exfat/src/libexfat/utils.c new file mode 100644 index 0000000..7baa663 --- /dev/null +++ b/src/gui/Lib/exfat/src/libexfat/utils.c @@ -0,0 +1,180 @@ +/* + utils.c (04.09.09) + exFAT file system implementation library. + + Free exFAT implementation. + Copyright (C) 2010-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "exfat.h" +#include +#include +#include + +void exfat_stat(const struct exfat* ef, const struct exfat_node* node, + struct stat* stbuf) +{ + memset(stbuf, 0, sizeof(struct stat)); + if (node->attrib & EXFAT_ATTRIB_DIR) + stbuf->st_mode = S_IFDIR | (0777 & ~ef->dmask); + else + stbuf->st_mode = S_IFREG | (0777 & ~ef->fmask); + stbuf->st_nlink = 1; + stbuf->st_uid = ef->uid; + stbuf->st_gid = ef->gid; + stbuf->st_size = node->size; + stbuf->st_blocks = ROUND_UP(node->size, CLUSTER_SIZE(*ef->sb)) / 512; + stbuf->st_mtime = node->mtime; + stbuf->st_atime = node->atime; + /* set ctime to mtime to ensure we don't break programs that rely on ctime + (e.g. rsync) */ + stbuf->st_ctime = node->mtime; +} + +void exfat_get_name(const struct exfat_node* node, + char buffer[EXFAT_UTF8_NAME_BUFFER_MAX]) +{ + if (utf16_to_utf8(buffer, node->name, EXFAT_UTF8_NAME_BUFFER_MAX, + EXFAT_NAME_MAX) != 0) + exfat_bug("failed to convert name to UTF-8"); +} + +static uint16_t add_checksum_byte(uint16_t sum, uint8_t byte) +{ + return ((sum << 15) | (sum >> 1)) + byte; +} + +static uint16_t add_checksum_bytes(uint16_t sum, const void* buffer, size_t n) +{ + int i; + + for (i = 0; i < n; i++) + sum = add_checksum_byte(sum, ((const uint8_t*) buffer)[i]); + return sum; +} + +uint16_t exfat_start_checksum(const struct exfat_entry_meta1* entry) +{ + uint16_t sum = 0; + int i; + + for (i = 0; i < sizeof(struct exfat_entry); i++) + if (i != 2 && i != 3) /* skip checksum field itself */ + sum = add_checksum_byte(sum, ((const uint8_t*) entry)[i]); + return sum; +} + +uint16_t exfat_add_checksum(const void* entry, uint16_t sum) +{ + return add_checksum_bytes(sum, entry, sizeof(struct exfat_entry)); +} + +le16_t exfat_calc_checksum(const struct exfat_entry* entries, int n) +{ + uint16_t checksum; + int i; + + checksum = exfat_start_checksum((const struct exfat_entry_meta1*) entries); + for (i = 1; i < n; i++) + checksum = exfat_add_checksum(entries + i, checksum); + return cpu_to_le16(checksum); +} + +uint32_t exfat_vbr_start_checksum(const void* sector, size_t size) +{ + size_t i; + uint32_t sum = 0; + + for (i = 0; i < size; i++) + /* skip volume_state and allocated_percent fields */ + if (i != 0x6a && i != 0x6b && i != 0x70) + sum = ((sum << 31) | (sum >> 1)) + ((const uint8_t*) sector)[i]; + return sum; +} + +uint32_t exfat_vbr_add_checksum(const void* sector, size_t size, uint32_t sum) +{ + size_t i; + + for (i = 0; i < size; i++) + sum = ((sum << 31) | (sum >> 1)) + ((const uint8_t*) sector)[i]; + return sum; +} + +le16_t exfat_calc_name_hash(const struct exfat* ef, const le16_t* name, + size_t length) +{ + size_t i; + uint16_t hash = 0; + + for (i = 0; i < length; i++) + { + uint16_t c = le16_to_cpu(name[i]); + + /* convert to upper case */ + c = ef->upcase[c]; + + hash = ((hash << 15) | (hash >> 1)) + (c & 0xff); + hash = ((hash << 15) | (hash >> 1)) + (c >> 8); + } + return cpu_to_le16(hash); +} + +void exfat_humanize_bytes(uint64_t value, struct exfat_human_bytes* hb) +{ + size_t i; + /* 16 EB (minus 1 byte) is the largest size that can be represented by + uint64_t */ + const char* units[] = {"bytes", "KB", "MB", "GB", "TB", "PB", "EB"}; + uint64_t divisor = 1; + uint64_t temp = 0; + + for (i = 0; ; i++, divisor *= 1024) + { + temp = (value + divisor / 2) / divisor; + + if (temp == 0) + break; + if (temp / 1024 * 1024 == temp) + continue; + if (temp < 10240) + break; + } + hb->value = temp; + hb->unit = units[i]; +} + +void exfat_print_info(const struct exfat_super_block* sb, + uint32_t free_clusters) +{ + struct exfat_human_bytes hb; + off_t total_space = le64_to_cpu(sb->sector_count) * SECTOR_SIZE(*sb); + off_t avail_space = (off_t) free_clusters * CLUSTER_SIZE(*sb); + + printf("File system version %hhu.%hhu\n", + sb->version.major, sb->version.minor); + exfat_humanize_bytes(SECTOR_SIZE(*sb), &hb); + printf("Sector size %10"PRIu64" %s\n", hb.value, hb.unit); + exfat_humanize_bytes(CLUSTER_SIZE(*sb), &hb); + printf("Cluster size %10"PRIu64" %s\n", hb.value, hb.unit); + exfat_humanize_bytes(total_space, &hb); + printf("Volume size %10"PRIu64" %s\n", hb.value, hb.unit); + exfat_humanize_bytes(total_space - avail_space, &hb); + printf("Used space %10"PRIu64" %s\n", hb.value, hb.unit); + exfat_humanize_bytes(avail_space, &hb); + printf("Available space %10"PRIu64" %s\n", hb.value, hb.unit); +} diff --git a/src/gui/Lib/exfat/src/mkfs/cbm.c b/src/gui/Lib/exfat/src/mkfs/cbm.c new file mode 100644 index 0000000..ad5accc --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/cbm.c @@ -0,0 +1,79 @@ +/* + cbm.c (09.11.10) + Clusters Bitmap creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "cbm.h" +#include "fat.h" +#include "uct.h" +#include "rootdir.h" +#include +#include + +static off_t cbm_alignment(void) +{ + return get_cluster_size(); +} + +static off_t cbm_size(void) +{ + return DIV_ROUND_UP( + (get_volume_size() - get_position(&cbm)) / get_cluster_size(), + CHAR_BIT); +} + +static int cbm_write(struct exfat_dev* dev) +{ + uint32_t allocated_clusters = + DIV_ROUND_UP(cbm.get_size(), get_cluster_size()) + + DIV_ROUND_UP(uct.get_size(), get_cluster_size()) + + DIV_ROUND_UP(rootdir.get_size(), get_cluster_size()); + size_t bitmap_size = ROUND_UP(allocated_clusters, CHAR_BIT); + bitmap_t* bitmap = malloc(BMAP_SIZE(bitmap_size)); + size_t i; + + if (bitmap == NULL) + { + exfat_error("failed to allocate bitmap of %zu bytes", + BMAP_SIZE(bitmap_size)); + return 1; + } + memset(bitmap, 0, BMAP_SIZE(bitmap_size)); + + for (i = 0; i < bitmap_size; i++) + if (i < allocated_clusters) + BMAP_SET(bitmap, i); + if (exfat_write(dev, bitmap, bitmap_size / CHAR_BIT) < 0) + { + free(bitmap); + exfat_error("failed to write bitmap of %zu bytes", + bitmap_size / CHAR_BIT); + return 1; + } + free(bitmap); + return 0; +} + +const struct fs_object cbm = +{ + .get_alignment = cbm_alignment, + .get_size = cbm_size, + .write = cbm_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/cbm.h b/src/gui/Lib/exfat/src/mkfs/cbm.h new file mode 100644 index 0000000..3803b79 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/cbm.h @@ -0,0 +1,30 @@ +/* + cbm.h (09.11.10) + Clusters Bitmap creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_CBM_H_INCLUDED +#define MKFS_CBM_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object cbm; + +#endif /* ifndef MKFS_CBM_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/fat.c b/src/gui/Lib/exfat/src/mkfs/fat.c new file mode 100644 index 0000000..c5174a7 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/fat.c @@ -0,0 +1,88 @@ +/* + fat.c (09.11.10) + File Allocation Table creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "fat.h" +#include "cbm.h" +#include "uct.h" +#include "rootdir.h" +#include + +static off_t fat_alignment(void) +{ + return (off_t) 128 * get_sector_size(); +} + +static off_t fat_size(void) +{ + return get_volume_size() / get_cluster_size() * sizeof(cluster_t); +} + +static cluster_t fat_write_entry(struct exfat_dev* dev, cluster_t cluster, + cluster_t value) +{ + le32_t fat_entry = cpu_to_le32(value); + if (exfat_write(dev, &fat_entry, sizeof(fat_entry)) < 0) + { + exfat_error("failed to write FAT entry 0x%x", value); + return 0; + } + return cluster + 1; +} + +static cluster_t fat_write_entries(struct exfat_dev* dev, cluster_t cluster, + uint64_t length) +{ + cluster_t end = cluster + DIV_ROUND_UP(length, get_cluster_size()); + + while (cluster < end - 1) + { + cluster = fat_write_entry(dev, cluster, cluster + 1); + if (cluster == 0) + return 0; + } + return fat_write_entry(dev, cluster, EXFAT_CLUSTER_END); +} + +static int fat_write(struct exfat_dev* dev) +{ + cluster_t c = 0; + + if (!(c = fat_write_entry(dev, c, 0xfffffff8))) /* media type */ + return 1; + if (!(c = fat_write_entry(dev, c, 0xffffffff))) /* some weird constant */ + return 1; + if (!(c = fat_write_entries(dev, c, cbm.get_size()))) + return 1; + if (!(c = fat_write_entries(dev, c, uct.get_size()))) + return 1; + if (!(c = fat_write_entries(dev, c, rootdir.get_size()))) + return 1; + + return 0; +} + +const struct fs_object fat = +{ + .get_alignment = fat_alignment, + .get_size = fat_size, + .write = fat_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/fat.h b/src/gui/Lib/exfat/src/mkfs/fat.h new file mode 100644 index 0000000..fbecaa2 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/fat.h @@ -0,0 +1,30 @@ +/* + fat.h (09.11.10) + File Allocation Table creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_FAT_H_INCLUDED +#define MKFS_FAT_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object fat; + +#endif /* ifndef MKFS_FAT_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/mkexfat.c b/src/gui/Lib/exfat/src/mkfs/mkexfat.c new file mode 100644 index 0000000..10ecf23 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/mkexfat.c @@ -0,0 +1,167 @@ +/* + mkexfat.c (22.04.12) + FS creation engine. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "mkexfat.h" +#include +#include +#include +#include +#include + +static int check_size(off_t volume_size) +{ + const struct fs_object** pp; + off_t position = 0; + + for (pp = objects; *pp; pp++) + { + position = ROUND_UP(position, (*pp)->get_alignment()); + position += (*pp)->get_size(); + } + + if (position > volume_size) + { + struct exfat_human_bytes vhb; + + exfat_humanize_bytes(volume_size, &vhb); + exfat_error("too small device (%"PRIu64" %s)", vhb.value, vhb.unit); + return 1; + } + + return 0; + +} + +static int erase_object(struct exfat_dev* dev, const void* block, + size_t block_size, off_t start, off_t size) +{ + const off_t block_count = DIV_ROUND_UP(size, block_size); + off_t i; + + if (exfat_seek(dev, start, SEEK_SET) == (off_t) -1) + { + exfat_error("seek to 0x%"PRIx64" failed", start); + return 1; + } + for (i = 0; i < size; i += block_size) + { + if (exfat_write(dev, block, MIN(size - i, block_size)) < 0) + { + exfat_error("failed to erase block %"PRIu64"/%"PRIu64 + " at 0x%"PRIx64, i + 1, block_count, start); + return 1; + } + } + return 0; +} + +static int erase(struct exfat_dev* dev) +{ + const struct fs_object** pp; + off_t position = 0; + const size_t block_size = 1024 * 1024; + void* block = malloc(block_size); + + if (block == NULL) + { + exfat_error("failed to allocate erase block of %zu bytes", block_size); + return 1; + } + memset(block, 0, block_size); + + for (pp = objects; *pp; pp++) + { + position = ROUND_UP(position, (*pp)->get_alignment()); + if (erase_object(dev, block, block_size, position, + (*pp)->get_size()) != 0) + { + free(block); + return 1; + } + position += (*pp)->get_size(); + } + + free(block); + return 0; +} + +static int create(struct exfat_dev* dev) +{ + const struct fs_object** pp; + off_t position = 0; + + for (pp = objects; *pp; pp++) + { + position = ROUND_UP(position, (*pp)->get_alignment()); + if (exfat_seek(dev, position, SEEK_SET) == (off_t) -1) + { + exfat_error("seek to 0x%"PRIx64" failed", position); + return 1; + } + if ((*pp)->write(dev) != 0) + return 1; + position += (*pp)->get_size(); + } + return 0; +} + +int mkfs(struct exfat_dev* dev, off_t volume_size) +{ + if (check_size(volume_size) != 0) + return 1; + + exfat_debug("Creating... "); + //fputs("Creating... ", stdout); + //fflush(stdout); + if (erase(dev) != 0) + return 1; + if (create(dev) != 0) + return 1; + //puts("done."); + + //fputs("Flushing... ", stdout); + //fflush(stdout); + exfat_debug("Flushing... "); + if (exfat_fsync(dev) != 0) + return 1; + //puts("done."); + + return 0; +} + +off_t get_position(const struct fs_object* object) +{ + const struct fs_object** pp; + off_t position = 0; + + for (pp = objects; *pp; pp++) + { + position = ROUND_UP(position, (*pp)->get_alignment()); + if (*pp == object) + return position; + position += (*pp)->get_size(); + } + exfat_bug("unknown object"); + + return 0; +} + diff --git a/src/gui/Lib/exfat/src/mkfs/mkexfat.h b/src/gui/Lib/exfat/src/mkfs/mkexfat.h new file mode 100644 index 0000000..54816af --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/mkexfat.h @@ -0,0 +1,49 @@ +/* + mkexfat.h (09.11.10) + FS creation engine. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_MKEXFAT_H_INCLUDED +#define MKFS_MKEXFAT_H_INCLUDED + +#include "exfat.h" + +struct fs_object +{ + off_t (*get_alignment)(void); + off_t (*get_size)(void); + int (*write)(struct exfat_dev* dev); +}; + +extern const struct fs_object* objects[]; + +int get_sector_bits(void); +int get_spc_bits(void); +off_t get_volume_size(void); +const le16_t* get_volume_label(void); +uint32_t get_volume_serial(void); +uint64_t get_first_sector(void); +int get_sector_size(void); +int get_cluster_size(void); + +int mkfs(struct exfat_dev* dev, off_t volume_size); +off_t get_position(const struct fs_object* object); + +#endif /* ifndef MKFS_MKEXFAT_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/mkexfat_main.c b/src/gui/Lib/exfat/src/mkfs/mkexfat_main.c new file mode 100644 index 0000000..3304104 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/mkexfat_main.c @@ -0,0 +1,268 @@ +/* + main.c (15.08.10) + Creates exFAT file system. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "mkexfat.h" +#include "vbr.h" +#include "fat.h" +#include "cbm.h" +#include "uct.h" +#include "rootdir.h" +#include "exfat.h" +#include +#include +#include +#include +#include +#include +#include + +const struct fs_object* objects[] = +{ + &vbr, + &vbr, + &fat, + /* clusters heap */ + &cbm, + &uct, + &rootdir, + NULL, +}; + +static struct +{ + int sector_bits; + int spc_bits; + off_t volume_size; + le16_t volume_label[EXFAT_ENAME_MAX + 1]; + uint32_t volume_serial; + uint64_t first_sector; +} +param; + +extern int g_hiso_exfat_disk_fd; +extern uint64_t g_hiso_exfat_part_size; + +int get_sector_bits(void) +{ + return param.sector_bits; +} + +int get_spc_bits(void) +{ + return param.spc_bits; +} + +off_t get_volume_size(void) +{ + return param.volume_size; +} + +const le16_t* get_volume_label(void) +{ + return param.volume_label; +} + +uint32_t get_volume_serial(void) +{ + return param.volume_serial; +} + +uint64_t get_first_sector(void) +{ + return param.first_sector; +} + +int get_sector_size(void) +{ + return 1 << get_sector_bits(); +} + +int get_cluster_size(void) +{ + return get_sector_size() << get_spc_bits(); +} + +static int setup_spc_bits(int sector_bits, int user_defined, off_t volume_size) +{ + int i; + + if (user_defined != -1) + { + off_t cluster_size = 1 << sector_bits << user_defined; + if (volume_size / cluster_size > EXFAT_LAST_DATA_CLUSTER) + { + struct exfat_human_bytes chb, vhb; + + exfat_humanize_bytes(cluster_size, &chb); + exfat_humanize_bytes(volume_size, &vhb); + exfat_error("cluster size %"PRIu64" %s is too small for " + "%"PRIu64" %s volume, try -s %d", + chb.value, chb.unit, + vhb.value, vhb.unit, + 1 << setup_spc_bits(sector_bits, -1, volume_size)); + return -1; + } + return user_defined; + } + + if (volume_size < 256ull * 1024 * 1024) + return MAX(0, 12 - sector_bits); /* 4 KB */ + if (volume_size < 32ull * 1024 * 1024 * 1024) + return MAX(0, 15 - sector_bits); /* 32 KB */ + + for (i = 17; ; i++) /* 128 KB or more */ + if (DIV_ROUND_UP(volume_size, 1 << i) <= EXFAT_LAST_DATA_CLUSTER) + return MAX(0, i - sector_bits); +} + +static int setup_volume_label(le16_t label[EXFAT_ENAME_MAX + 1], const char* s) +{ + memset(label, 0, (EXFAT_ENAME_MAX + 1) * sizeof(le16_t)); + if (s == NULL) + return 0; + return utf8_to_utf16(label, s, EXFAT_ENAME_MAX + 1, strlen(s)); +} + +static uint32_t setup_volume_serial(uint32_t user_defined) +{ + struct timeval now; + + if (user_defined != 0) + return user_defined; + + if (gettimeofday(&now, NULL) != 0) + { + exfat_error("failed to form volume id"); + return 0; + } + return (now.tv_sec << 20) | now.tv_usec; +} + +static int setup(struct exfat_dev* dev, int sector_bits, int spc_bits, + const char* volume_label, uint32_t volume_serial, + uint64_t first_sector) +{ + param.sector_bits = sector_bits; + param.first_sector = first_sector; + param.volume_size = exfat_get_size(dev); + + param.spc_bits = setup_spc_bits(sector_bits, spc_bits, param.volume_size); + if (param.spc_bits == -1) + return 1; + + if (setup_volume_label(param.volume_label, volume_label) != 0) + return 1; + + param.volume_serial = setup_volume_serial(volume_serial); + if (param.volume_serial == 0) + return 1; + + return mkfs(dev, param.volume_size); +} + +static int logarithm2(int n) +{ + int i; + + for (i = 0; i < sizeof(int) * CHAR_BIT - 1; i++) + if ((1 << i) == n) + return i; + return -1; +} + +static void usage(const char* prog) +{ + fprintf(stderr, "Usage: %s [-i volume-id] [-n label] " + "[-p partition-first-sector] " + "[-s sectors-per-cluster] [-V] \n", prog); + exit(1); +} + +int mkexfat_main(const char *devpath, int fd, uint64_t part_sector_count) +{ + int spc_bits = -1; + uint32_t volume_serial = 0; + uint64_t first_sector = 0; + struct exfat_dev* dev; + +#if 0 + while ((opt = getopt(argc, argv, "i:n:p:s:V")) != -1) + { + switch (opt) + { + case 'i': + volume_serial = strtol(optarg, NULL, 16); + break; + case 'n': + volume_label = optarg; + break; + case 'p': + first_sector = strtoll(optarg, NULL, 10); + break; + case 's': + spc_bits = logarithm2(atoi(optarg)); + if (spc_bits < 0) + { + exfat_error("invalid option value: '%s'", optarg); + return 1; + } + break; + case 'V': + puts("Copyright (C) 2011-2018 Andrew Nayenko"); + return 0; + default: + usage(argv[0]); + break; + } + } +#endif /* #if 0 */ + + /* + * DiskSize > 32GB Cluster Size use 128KB + * DiskSize < 32GB Cluster Size use 32KB + */ + if ((part_sector_count / 2097152) > 32) + { + spc_bits = logarithm2(256); + } + else + { + spc_bits = logarithm2(64); + } + + g_hiso_exfat_disk_fd = fd; + g_hiso_exfat_part_size = part_sector_count * 512; + + dev = exfat_open(devpath, EXFAT_MODE_RW); + if (dev == NULL) + return 1; + if (setup(dev, 9, spc_bits, "Hiperiso", volume_serial, first_sector) != 0) + { + exfat_close(dev); + return 1; + } + if (exfat_close(dev) != 0) + return 1; + + return 0; +} + diff --git a/src/gui/Lib/exfat/src/mkfs/rootdir.c b/src/gui/Lib/exfat/src/mkfs/rootdir.c new file mode 100644 index 0000000..323da8a --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/rootdir.c @@ -0,0 +1,102 @@ +/* + rootdir.c (09.11.10) + Root directory creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "rootdir.h" +#include "uct.h" +#include "cbm.h" +#include "uctc.h" +#include + +static off_t rootdir_alignment(void) +{ + return get_cluster_size(); +} + +static off_t rootdir_size(void) +{ + return get_cluster_size(); +} + +static void init_label_entry(struct exfat_entry_label* label_entry) +{ + memset(label_entry, 0, sizeof(struct exfat_entry_label)); + label_entry->type = EXFAT_ENTRY_LABEL ^ EXFAT_ENTRY_VALID; + + if (utf16_length(get_volume_label()) == 0) + return; + + memcpy(label_entry->name, get_volume_label(), + EXFAT_ENAME_MAX * sizeof(le16_t)); + label_entry->length = utf16_length(get_volume_label()); + label_entry->type |= EXFAT_ENTRY_VALID; +} + +static void init_bitmap_entry(struct exfat_entry_bitmap* bitmap_entry) +{ + memset(bitmap_entry, 0, sizeof(struct exfat_entry_bitmap)); + bitmap_entry->type = EXFAT_ENTRY_BITMAP; + bitmap_entry->start_cluster = cpu_to_le32(EXFAT_FIRST_DATA_CLUSTER); + bitmap_entry->size = cpu_to_le64(cbm.get_size()); +} + +static void init_upcase_entry(struct exfat_entry_upcase* upcase_entry) +{ + size_t i; + uint32_t sum = 0; + + for (i = 0; i < sizeof(upcase_table); i++) + sum = ((sum << 31) | (sum >> 1)) + upcase_table[i]; + + memset(upcase_entry, 0, sizeof(struct exfat_entry_upcase)); + upcase_entry->type = EXFAT_ENTRY_UPCASE; + upcase_entry->checksum = cpu_to_le32(sum); + upcase_entry->start_cluster = cpu_to_le32( + (get_position(&uct) - get_position(&cbm)) / get_cluster_size() + + EXFAT_FIRST_DATA_CLUSTER); + upcase_entry->size = cpu_to_le64(sizeof(upcase_table)); +} + +static int rootdir_write(struct exfat_dev* dev) +{ + struct exfat_entry_label label_entry; + struct exfat_entry_bitmap bitmap_entry; + struct exfat_entry_upcase upcase_entry; + + init_label_entry(&label_entry); + init_bitmap_entry(&bitmap_entry); + init_upcase_entry(&upcase_entry); + + if (exfat_write(dev, &label_entry, sizeof(struct exfat_entry)) < 0) + return 1; + if (exfat_write(dev, &bitmap_entry, sizeof(struct exfat_entry)) < 0) + return 1; + if (exfat_write(dev, &upcase_entry, sizeof(struct exfat_entry)) < 0) + return 1; + return 0; +} + +const struct fs_object rootdir = +{ + .get_alignment = rootdir_alignment, + .get_size = rootdir_size, + .write = rootdir_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/rootdir.h b/src/gui/Lib/exfat/src/mkfs/rootdir.h new file mode 100644 index 0000000..87f437f --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/rootdir.h @@ -0,0 +1,30 @@ +/* + rootdir.h (09.11.10) + Root directory creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_ROOTDIR_H_INCLUDED +#define MKFS_ROOTDIR_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object rootdir; + +#endif /* ifndef MKFS_ROOTDIR_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/uct.c b/src/gui/Lib/exfat/src/mkfs/uct.c new file mode 100644 index 0000000..98cdce8 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/uct.c @@ -0,0 +1,52 @@ +/* + uct.c (09.11.10) + Upper Case Table creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "uct.h" +#include "uctc.h" + +static off_t uct_alignment(void) +{ + return get_cluster_size(); +} + +static off_t uct_size(void) +{ + return sizeof(upcase_table); +} + +static int uct_write(struct exfat_dev* dev) +{ + if (exfat_write(dev, upcase_table, sizeof(upcase_table)) < 0) + { + exfat_error("failed to write upcase table of %zu bytes", + sizeof(upcase_table)); + return 1; + } + return 0; +} + +const struct fs_object uct = +{ + .get_alignment = uct_alignment, + .get_size = uct_size, + .write = uct_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/uct.h b/src/gui/Lib/exfat/src/mkfs/uct.h new file mode 100644 index 0000000..ce619ec --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/uct.h @@ -0,0 +1,30 @@ +/* + uct.h (09.11.10) + Upper Case Table creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_UCT_H_INCLUDED +#define MKFS_UCT_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object uct; + +#endif /* ifndef MKFS_UCT_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/uctc.c b/src/gui/Lib/exfat/src/mkfs/uctc.c new file mode 100644 index 0000000..518219c --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/uctc.c @@ -0,0 +1,757 @@ +/* + uctc.c (30.04.12) + Upper Case Table contents. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "uctc.h" + +uint8_t upcase_table[5836] = +{ + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, + 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, + 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, + 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, + 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, + 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, + 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, + 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, + 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, + 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, + 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, + 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, + 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, + 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, + 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, + 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, + 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, + 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, + 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, + 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, + 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, + 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, + 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, + 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, + 0x60, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, + 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, + 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, + 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, + 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, + 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, + 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x7b, 0x00, + 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x7f, 0x00, + 0x80, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, + 0x84, 0x00, 0x85, 0x00, 0x86, 0x00, 0x87, 0x00, + 0x88, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, + 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, + 0x90, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, + 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, + 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, + 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x9f, 0x00, + 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, + 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, + 0xa8, 0x00, 0xa9, 0x00, 0xaa, 0x00, 0xab, 0x00, + 0xac, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, + 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, 0xb3, 0x00, + 0xb4, 0x00, 0xb5, 0x00, 0xb6, 0x00, 0xb7, 0x00, + 0xb8, 0x00, 0xb9, 0x00, 0xba, 0x00, 0xbb, 0x00, + 0xbc, 0x00, 0xbd, 0x00, 0xbe, 0x00, 0xbf, 0x00, + 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, + 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, + 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, + 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, + 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, + 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd7, 0x00, + 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, + 0xdc, 0x00, 0xdd, 0x00, 0xde, 0x00, 0xdf, 0x00, + 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, + 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, 0xc7, 0x00, + 0xc8, 0x00, 0xc9, 0x00, 0xca, 0x00, 0xcb, 0x00, + 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, + 0xd0, 0x00, 0xd1, 0x00, 0xd2, 0x00, 0xd3, 0x00, + 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xf7, 0x00, + 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, 0xdb, 0x00, + 0xdc, 0x00, 0xdd, 0x00, 0xde, 0x00, 0x78, 0x01, + 0x00, 0x01, 0x00, 0x01, 0x02, 0x01, 0x02, 0x01, + 0x04, 0x01, 0x04, 0x01, 0x06, 0x01, 0x06, 0x01, + 0x08, 0x01, 0x08, 0x01, 0x0a, 0x01, 0x0a, 0x01, + 0x0c, 0x01, 0x0c, 0x01, 0x0e, 0x01, 0x0e, 0x01, + 0x10, 0x01, 0x10, 0x01, 0x12, 0x01, 0x12, 0x01, + 0x14, 0x01, 0x14, 0x01, 0x16, 0x01, 0x16, 0x01, + 0x18, 0x01, 0x18, 0x01, 0x1a, 0x01, 0x1a, 0x01, + 0x1c, 0x01, 0x1c, 0x01, 0x1e, 0x01, 0x1e, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x22, 0x01, 0x22, 0x01, + 0x24, 0x01, 0x24, 0x01, 0x26, 0x01, 0x26, 0x01, + 0x28, 0x01, 0x28, 0x01, 0x2a, 0x01, 0x2a, 0x01, + 0x2c, 0x01, 0x2c, 0x01, 0x2e, 0x01, 0x2e, 0x01, + 0x30, 0x01, 0x31, 0x01, 0x32, 0x01, 0x32, 0x01, + 0x34, 0x01, 0x34, 0x01, 0x36, 0x01, 0x36, 0x01, + 0x38, 0x01, 0x39, 0x01, 0x39, 0x01, 0x3b, 0x01, + 0x3b, 0x01, 0x3d, 0x01, 0x3d, 0x01, 0x3f, 0x01, + 0x3f, 0x01, 0x41, 0x01, 0x41, 0x01, 0x43, 0x01, + 0x43, 0x01, 0x45, 0x01, 0x45, 0x01, 0x47, 0x01, + 0x47, 0x01, 0x49, 0x01, 0x4a, 0x01, 0x4a, 0x01, + 0x4c, 0x01, 0x4c, 0x01, 0x4e, 0x01, 0x4e, 0x01, + 0x50, 0x01, 0x50, 0x01, 0x52, 0x01, 0x52, 0x01, + 0x54, 0x01, 0x54, 0x01, 0x56, 0x01, 0x56, 0x01, + 0x58, 0x01, 0x58, 0x01, 0x5a, 0x01, 0x5a, 0x01, + 0x5c, 0x01, 0x5c, 0x01, 0x5e, 0x01, 0x5e, 0x01, + 0x60, 0x01, 0x60, 0x01, 0x62, 0x01, 0x62, 0x01, + 0x64, 0x01, 0x64, 0x01, 0x66, 0x01, 0x66, 0x01, + 0x68, 0x01, 0x68, 0x01, 0x6a, 0x01, 0x6a, 0x01, + 0x6c, 0x01, 0x6c, 0x01, 0x6e, 0x01, 0x6e, 0x01, + 0x70, 0x01, 0x70, 0x01, 0x72, 0x01, 0x72, 0x01, + 0x74, 0x01, 0x74, 0x01, 0x76, 0x01, 0x76, 0x01, + 0x78, 0x01, 0x79, 0x01, 0x79, 0x01, 0x7b, 0x01, + 0x7b, 0x01, 0x7d, 0x01, 0x7d, 0x01, 0x7f, 0x01, + 0x43, 0x02, 0x81, 0x01, 0x82, 0x01, 0x82, 0x01, + 0x84, 0x01, 0x84, 0x01, 0x86, 0x01, 0x87, 0x01, + 0x87, 0x01, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, + 0x8b, 0x01, 0x8d, 0x01, 0x8e, 0x01, 0x8f, 0x01, + 0x90, 0x01, 0x91, 0x01, 0x91, 0x01, 0x93, 0x01, + 0x94, 0x01, 0xf6, 0x01, 0x96, 0x01, 0x97, 0x01, + 0x98, 0x01, 0x98, 0x01, 0x3d, 0x02, 0x9b, 0x01, + 0x9c, 0x01, 0x9d, 0x01, 0x20, 0x02, 0x9f, 0x01, + 0xa0, 0x01, 0xa0, 0x01, 0xa2, 0x01, 0xa2, 0x01, + 0xa4, 0x01, 0xa4, 0x01, 0xa6, 0x01, 0xa7, 0x01, + 0xa7, 0x01, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, + 0xac, 0x01, 0xac, 0x01, 0xae, 0x01, 0xaf, 0x01, + 0xaf, 0x01, 0xb1, 0x01, 0xb2, 0x01, 0xb3, 0x01, + 0xb3, 0x01, 0xb5, 0x01, 0xb5, 0x01, 0xb7, 0x01, + 0xb8, 0x01, 0xb8, 0x01, 0xba, 0x01, 0xbb, 0x01, + 0xbc, 0x01, 0xbc, 0x01, 0xbe, 0x01, 0xf7, 0x01, + 0xc0, 0x01, 0xc1, 0x01, 0xc2, 0x01, 0xc3, 0x01, + 0xc4, 0x01, 0xc5, 0x01, 0xc4, 0x01, 0xc7, 0x01, + 0xc8, 0x01, 0xc7, 0x01, 0xca, 0x01, 0xcb, 0x01, + 0xca, 0x01, 0xcd, 0x01, 0xcd, 0x01, 0xcf, 0x01, + 0xcf, 0x01, 0xd1, 0x01, 0xd1, 0x01, 0xd3, 0x01, + 0xd3, 0x01, 0xd5, 0x01, 0xd5, 0x01, 0xd7, 0x01, + 0xd7, 0x01, 0xd9, 0x01, 0xd9, 0x01, 0xdb, 0x01, + 0xdb, 0x01, 0x8e, 0x01, 0xde, 0x01, 0xde, 0x01, + 0xe0, 0x01, 0xe0, 0x01, 0xe2, 0x01, 0xe2, 0x01, + 0xe4, 0x01, 0xe4, 0x01, 0xe6, 0x01, 0xe6, 0x01, + 0xe8, 0x01, 0xe8, 0x01, 0xea, 0x01, 0xea, 0x01, + 0xec, 0x01, 0xec, 0x01, 0xee, 0x01, 0xee, 0x01, + 0xf0, 0x01, 0xf1, 0x01, 0xf2, 0x01, 0xf1, 0x01, + 0xf4, 0x01, 0xf4, 0x01, 0xf6, 0x01, 0xf7, 0x01, + 0xf8, 0x01, 0xf8, 0x01, 0xfa, 0x01, 0xfa, 0x01, + 0xfc, 0x01, 0xfc, 0x01, 0xfe, 0x01, 0xfe, 0x01, + 0x00, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, + 0x04, 0x02, 0x04, 0x02, 0x06, 0x02, 0x06, 0x02, + 0x08, 0x02, 0x08, 0x02, 0x0a, 0x02, 0x0a, 0x02, + 0x0c, 0x02, 0x0c, 0x02, 0x0e, 0x02, 0x0e, 0x02, + 0x10, 0x02, 0x10, 0x02, 0x12, 0x02, 0x12, 0x02, + 0x14, 0x02, 0x14, 0x02, 0x16, 0x02, 0x16, 0x02, + 0x18, 0x02, 0x18, 0x02, 0x1a, 0x02, 0x1a, 0x02, + 0x1c, 0x02, 0x1c, 0x02, 0x1e, 0x02, 0x1e, 0x02, + 0x20, 0x02, 0x21, 0x02, 0x22, 0x02, 0x22, 0x02, + 0x24, 0x02, 0x24, 0x02, 0x26, 0x02, 0x26, 0x02, + 0x28, 0x02, 0x28, 0x02, 0x2a, 0x02, 0x2a, 0x02, + 0x2c, 0x02, 0x2c, 0x02, 0x2e, 0x02, 0x2e, 0x02, + 0x30, 0x02, 0x30, 0x02, 0x32, 0x02, 0x32, 0x02, + 0x34, 0x02, 0x35, 0x02, 0x36, 0x02, 0x37, 0x02, + 0x38, 0x02, 0x39, 0x02, 0x65, 0x2c, 0x3b, 0x02, + 0x3b, 0x02, 0x3d, 0x02, 0x66, 0x2c, 0x3f, 0x02, + 0x40, 0x02, 0x41, 0x02, 0x41, 0x02, 0x43, 0x02, + 0x44, 0x02, 0x45, 0x02, 0x46, 0x02, 0x46, 0x02, + 0x48, 0x02, 0x48, 0x02, 0x4a, 0x02, 0x4a, 0x02, + 0x4c, 0x02, 0x4c, 0x02, 0x4e, 0x02, 0x4e, 0x02, + 0x50, 0x02, 0x51, 0x02, 0x52, 0x02, 0x81, 0x01, + 0x86, 0x01, 0x55, 0x02, 0x89, 0x01, 0x8a, 0x01, + 0x58, 0x02, 0x8f, 0x01, 0x5a, 0x02, 0x90, 0x01, + 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, + 0x93, 0x01, 0x61, 0x02, 0x62, 0x02, 0x94, 0x01, + 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, + 0x97, 0x01, 0x96, 0x01, 0x6a, 0x02, 0x62, 0x2c, + 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x9c, 0x01, + 0x70, 0x02, 0x71, 0x02, 0x9d, 0x01, 0x73, 0x02, + 0x74, 0x02, 0x9f, 0x01, 0x76, 0x02, 0x77, 0x02, + 0x78, 0x02, 0x79, 0x02, 0x7a, 0x02, 0x7b, 0x02, + 0x7c, 0x02, 0x64, 0x2c, 0x7e, 0x02, 0x7f, 0x02, + 0xa6, 0x01, 0x81, 0x02, 0x82, 0x02, 0xa9, 0x01, + 0x84, 0x02, 0x85, 0x02, 0x86, 0x02, 0x87, 0x02, + 0xae, 0x01, 0x44, 0x02, 0xb1, 0x01, 0xb2, 0x01, + 0x45, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8f, 0x02, + 0x90, 0x02, 0x91, 0x02, 0xb7, 0x01, 0x93, 0x02, + 0x94, 0x02, 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, + 0x98, 0x02, 0x99, 0x02, 0x9a, 0x02, 0x9b, 0x02, + 0x9c, 0x02, 0x9d, 0x02, 0x9e, 0x02, 0x9f, 0x02, + 0xa0, 0x02, 0xa1, 0x02, 0xa2, 0x02, 0xa3, 0x02, + 0xa4, 0x02, 0xa5, 0x02, 0xa6, 0x02, 0xa7, 0x02, + 0xa8, 0x02, 0xa9, 0x02, 0xaa, 0x02, 0xab, 0x02, + 0xac, 0x02, 0xad, 0x02, 0xae, 0x02, 0xaf, 0x02, + 0xb0, 0x02, 0xb1, 0x02, 0xb2, 0x02, 0xb3, 0x02, + 0xb4, 0x02, 0xb5, 0x02, 0xb6, 0x02, 0xb7, 0x02, + 0xb8, 0x02, 0xb9, 0x02, 0xba, 0x02, 0xbb, 0x02, + 0xbc, 0x02, 0xbd, 0x02, 0xbe, 0x02, 0xbf, 0x02, + 0xc0, 0x02, 0xc1, 0x02, 0xc2, 0x02, 0xc3, 0x02, + 0xc4, 0x02, 0xc5, 0x02, 0xc6, 0x02, 0xc7, 0x02, + 0xc8, 0x02, 0xc9, 0x02, 0xca, 0x02, 0xcb, 0x02, + 0xcc, 0x02, 0xcd, 0x02, 0xce, 0x02, 0xcf, 0x02, + 0xd0, 0x02, 0xd1, 0x02, 0xd2, 0x02, 0xd3, 0x02, + 0xd4, 0x02, 0xd5, 0x02, 0xd6, 0x02, 0xd7, 0x02, + 0xd8, 0x02, 0xd9, 0x02, 0xda, 0x02, 0xdb, 0x02, + 0xdc, 0x02, 0xdd, 0x02, 0xde, 0x02, 0xdf, 0x02, + 0xe0, 0x02, 0xe1, 0x02, 0xe2, 0x02, 0xe3, 0x02, + 0xe4, 0x02, 0xe5, 0x02, 0xe6, 0x02, 0xe7, 0x02, + 0xe8, 0x02, 0xe9, 0x02, 0xea, 0x02, 0xeb, 0x02, + 0xec, 0x02, 0xed, 0x02, 0xee, 0x02, 0xef, 0x02, + 0xf0, 0x02, 0xf1, 0x02, 0xf2, 0x02, 0xf3, 0x02, + 0xf4, 0x02, 0xf5, 0x02, 0xf6, 0x02, 0xf7, 0x02, + 0xf8, 0x02, 0xf9, 0x02, 0xfa, 0x02, 0xfb, 0x02, + 0xfc, 0x02, 0xfd, 0x02, 0xfe, 0x02, 0xff, 0x02, + 0x00, 0x03, 0x01, 0x03, 0x02, 0x03, 0x03, 0x03, + 0x04, 0x03, 0x05, 0x03, 0x06, 0x03, 0x07, 0x03, + 0x08, 0x03, 0x09, 0x03, 0x0a, 0x03, 0x0b, 0x03, + 0x0c, 0x03, 0x0d, 0x03, 0x0e, 0x03, 0x0f, 0x03, + 0x10, 0x03, 0x11, 0x03, 0x12, 0x03, 0x13, 0x03, + 0x14, 0x03, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, + 0x18, 0x03, 0x19, 0x03, 0x1a, 0x03, 0x1b, 0x03, + 0x1c, 0x03, 0x1d, 0x03, 0x1e, 0x03, 0x1f, 0x03, + 0x20, 0x03, 0x21, 0x03, 0x22, 0x03, 0x23, 0x03, + 0x24, 0x03, 0x25, 0x03, 0x26, 0x03, 0x27, 0x03, + 0x28, 0x03, 0x29, 0x03, 0x2a, 0x03, 0x2b, 0x03, + 0x2c, 0x03, 0x2d, 0x03, 0x2e, 0x03, 0x2f, 0x03, + 0x30, 0x03, 0x31, 0x03, 0x32, 0x03, 0x33, 0x03, + 0x34, 0x03, 0x35, 0x03, 0x36, 0x03, 0x37, 0x03, + 0x38, 0x03, 0x39, 0x03, 0x3a, 0x03, 0x3b, 0x03, + 0x3c, 0x03, 0x3d, 0x03, 0x3e, 0x03, 0x3f, 0x03, + 0x40, 0x03, 0x41, 0x03, 0x42, 0x03, 0x43, 0x03, + 0x44, 0x03, 0x45, 0x03, 0x46, 0x03, 0x47, 0x03, + 0x48, 0x03, 0x49, 0x03, 0x4a, 0x03, 0x4b, 0x03, + 0x4c, 0x03, 0x4d, 0x03, 0x4e, 0x03, 0x4f, 0x03, + 0x50, 0x03, 0x51, 0x03, 0x52, 0x03, 0x53, 0x03, + 0x54, 0x03, 0x55, 0x03, 0x56, 0x03, 0x57, 0x03, + 0x58, 0x03, 0x59, 0x03, 0x5a, 0x03, 0x5b, 0x03, + 0x5c, 0x03, 0x5d, 0x03, 0x5e, 0x03, 0x5f, 0x03, + 0x60, 0x03, 0x61, 0x03, 0x62, 0x03, 0x63, 0x03, + 0x64, 0x03, 0x65, 0x03, 0x66, 0x03, 0x67, 0x03, + 0x68, 0x03, 0x69, 0x03, 0x6a, 0x03, 0x6b, 0x03, + 0x6c, 0x03, 0x6d, 0x03, 0x6e, 0x03, 0x6f, 0x03, + 0x70, 0x03, 0x71, 0x03, 0x72, 0x03, 0x73, 0x03, + 0x74, 0x03, 0x75, 0x03, 0x76, 0x03, 0x77, 0x03, + 0x78, 0x03, 0x79, 0x03, 0x7a, 0x03, 0xfd, 0x03, + 0xfe, 0x03, 0xff, 0x03, 0x7e, 0x03, 0x7f, 0x03, + 0x80, 0x03, 0x81, 0x03, 0x82, 0x03, 0x83, 0x03, + 0x84, 0x03, 0x85, 0x03, 0x86, 0x03, 0x87, 0x03, + 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, 0x8b, 0x03, + 0x8c, 0x03, 0x8d, 0x03, 0x8e, 0x03, 0x8f, 0x03, + 0x90, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, + 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, + 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, + 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, + 0xa0, 0x03, 0xa1, 0x03, 0xa2, 0x03, 0xa3, 0x03, + 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, + 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xab, 0x03, + 0x86, 0x03, 0x88, 0x03, 0x89, 0x03, 0x8a, 0x03, + 0xb0, 0x03, 0x91, 0x03, 0x92, 0x03, 0x93, 0x03, + 0x94, 0x03, 0x95, 0x03, 0x96, 0x03, 0x97, 0x03, + 0x98, 0x03, 0x99, 0x03, 0x9a, 0x03, 0x9b, 0x03, + 0x9c, 0x03, 0x9d, 0x03, 0x9e, 0x03, 0x9f, 0x03, + 0xa0, 0x03, 0xa1, 0x03, 0xa3, 0x03, 0xa3, 0x03, + 0xa4, 0x03, 0xa5, 0x03, 0xa6, 0x03, 0xa7, 0x03, + 0xa8, 0x03, 0xa9, 0x03, 0xaa, 0x03, 0xab, 0x03, + 0x8c, 0x03, 0x8e, 0x03, 0x8f, 0x03, 0xcf, 0x03, + 0xd0, 0x03, 0xd1, 0x03, 0xd2, 0x03, 0xd3, 0x03, + 0xd4, 0x03, 0xd5, 0x03, 0xd6, 0x03, 0xd7, 0x03, + 0xd8, 0x03, 0xd8, 0x03, 0xda, 0x03, 0xda, 0x03, + 0xdc, 0x03, 0xdc, 0x03, 0xde, 0x03, 0xde, 0x03, + 0xe0, 0x03, 0xe0, 0x03, 0xe2, 0x03, 0xe2, 0x03, + 0xe4, 0x03, 0xe4, 0x03, 0xe6, 0x03, 0xe6, 0x03, + 0xe8, 0x03, 0xe8, 0x03, 0xea, 0x03, 0xea, 0x03, + 0xec, 0x03, 0xec, 0x03, 0xee, 0x03, 0xee, 0x03, + 0xf0, 0x03, 0xf1, 0x03, 0xf9, 0x03, 0xf3, 0x03, + 0xf4, 0x03, 0xf5, 0x03, 0xf6, 0x03, 0xf7, 0x03, + 0xf7, 0x03, 0xf9, 0x03, 0xfa, 0x03, 0xfa, 0x03, + 0xfc, 0x03, 0xfd, 0x03, 0xfe, 0x03, 0xff, 0x03, + 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, + 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, + 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, + 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, 0x04, + 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, + 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, 0x04, + 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, 0x04, + 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, + 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, + 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, 0x04, + 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, + 0x2c, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x2f, 0x04, + 0x10, 0x04, 0x11, 0x04, 0x12, 0x04, 0x13, 0x04, + 0x14, 0x04, 0x15, 0x04, 0x16, 0x04, 0x17, 0x04, + 0x18, 0x04, 0x19, 0x04, 0x1a, 0x04, 0x1b, 0x04, + 0x1c, 0x04, 0x1d, 0x04, 0x1e, 0x04, 0x1f, 0x04, + 0x20, 0x04, 0x21, 0x04, 0x22, 0x04, 0x23, 0x04, + 0x24, 0x04, 0x25, 0x04, 0x26, 0x04, 0x27, 0x04, + 0x28, 0x04, 0x29, 0x04, 0x2a, 0x04, 0x2b, 0x04, + 0x2c, 0x04, 0x2d, 0x04, 0x2e, 0x04, 0x2f, 0x04, + 0x00, 0x04, 0x01, 0x04, 0x02, 0x04, 0x03, 0x04, + 0x04, 0x04, 0x05, 0x04, 0x06, 0x04, 0x07, 0x04, + 0x08, 0x04, 0x09, 0x04, 0x0a, 0x04, 0x0b, 0x04, + 0x0c, 0x04, 0x0d, 0x04, 0x0e, 0x04, 0x0f, 0x04, + 0x60, 0x04, 0x60, 0x04, 0x62, 0x04, 0x62, 0x04, + 0x64, 0x04, 0x64, 0x04, 0x66, 0x04, 0x66, 0x04, + 0x68, 0x04, 0x68, 0x04, 0x6a, 0x04, 0x6a, 0x04, + 0x6c, 0x04, 0x6c, 0x04, 0x6e, 0x04, 0x6e, 0x04, + 0x70, 0x04, 0x70, 0x04, 0x72, 0x04, 0x72, 0x04, + 0x74, 0x04, 0x74, 0x04, 0x76, 0x04, 0x76, 0x04, + 0x78, 0x04, 0x78, 0x04, 0x7a, 0x04, 0x7a, 0x04, + 0x7c, 0x04, 0x7c, 0x04, 0x7e, 0x04, 0x7e, 0x04, + 0x80, 0x04, 0x80, 0x04, 0x82, 0x04, 0x83, 0x04, + 0x84, 0x04, 0x85, 0x04, 0x86, 0x04, 0x87, 0x04, + 0x88, 0x04, 0x89, 0x04, 0x8a, 0x04, 0x8a, 0x04, + 0x8c, 0x04, 0x8c, 0x04, 0x8e, 0x04, 0x8e, 0x04, + 0x90, 0x04, 0x90, 0x04, 0x92, 0x04, 0x92, 0x04, + 0x94, 0x04, 0x94, 0x04, 0x96, 0x04, 0x96, 0x04, + 0x98, 0x04, 0x98, 0x04, 0x9a, 0x04, 0x9a, 0x04, + 0x9c, 0x04, 0x9c, 0x04, 0x9e, 0x04, 0x9e, 0x04, + 0xa0, 0x04, 0xa0, 0x04, 0xa2, 0x04, 0xa2, 0x04, + 0xa4, 0x04, 0xa4, 0x04, 0xa6, 0x04, 0xa6, 0x04, + 0xa8, 0x04, 0xa8, 0x04, 0xaa, 0x04, 0xaa, 0x04, + 0xac, 0x04, 0xac, 0x04, 0xae, 0x04, 0xae, 0x04, + 0xb0, 0x04, 0xb0, 0x04, 0xb2, 0x04, 0xb2, 0x04, + 0xb4, 0x04, 0xb4, 0x04, 0xb6, 0x04, 0xb6, 0x04, + 0xb8, 0x04, 0xb8, 0x04, 0xba, 0x04, 0xba, 0x04, + 0xbc, 0x04, 0xbc, 0x04, 0xbe, 0x04, 0xbe, 0x04, + 0xc0, 0x04, 0xc1, 0x04, 0xc1, 0x04, 0xc3, 0x04, + 0xc3, 0x04, 0xc5, 0x04, 0xc5, 0x04, 0xc7, 0x04, + 0xc7, 0x04, 0xc9, 0x04, 0xc9, 0x04, 0xcb, 0x04, + 0xcb, 0x04, 0xcd, 0x04, 0xcd, 0x04, 0xc0, 0x04, + 0xd0, 0x04, 0xd0, 0x04, 0xd2, 0x04, 0xd2, 0x04, + 0xd4, 0x04, 0xd4, 0x04, 0xd6, 0x04, 0xd6, 0x04, + 0xd8, 0x04, 0xd8, 0x04, 0xda, 0x04, 0xda, 0x04, + 0xdc, 0x04, 0xdc, 0x04, 0xde, 0x04, 0xde, 0x04, + 0xe0, 0x04, 0xe0, 0x04, 0xe2, 0x04, 0xe2, 0x04, + 0xe4, 0x04, 0xe4, 0x04, 0xe6, 0x04, 0xe6, 0x04, + 0xe8, 0x04, 0xe8, 0x04, 0xea, 0x04, 0xea, 0x04, + 0xec, 0x04, 0xec, 0x04, 0xee, 0x04, 0xee, 0x04, + 0xf0, 0x04, 0xf0, 0x04, 0xf2, 0x04, 0xf2, 0x04, + 0xf4, 0x04, 0xf4, 0x04, 0xf6, 0x04, 0xf6, 0x04, + 0xf8, 0x04, 0xf8, 0x04, 0xfa, 0x04, 0xfa, 0x04, + 0xfc, 0x04, 0xfc, 0x04, 0xfe, 0x04, 0xfe, 0x04, + 0x00, 0x05, 0x00, 0x05, 0x02, 0x05, 0x02, 0x05, + 0x04, 0x05, 0x04, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x08, 0x05, 0x08, 0x05, 0x0a, 0x05, 0x0a, 0x05, + 0x0c, 0x05, 0x0c, 0x05, 0x0e, 0x05, 0x0e, 0x05, + 0x10, 0x05, 0x10, 0x05, 0x12, 0x05, 0x12, 0x05, + 0x14, 0x05, 0x15, 0x05, 0x16, 0x05, 0x17, 0x05, + 0x18, 0x05, 0x19, 0x05, 0x1a, 0x05, 0x1b, 0x05, + 0x1c, 0x05, 0x1d, 0x05, 0x1e, 0x05, 0x1f, 0x05, + 0x20, 0x05, 0x21, 0x05, 0x22, 0x05, 0x23, 0x05, + 0x24, 0x05, 0x25, 0x05, 0x26, 0x05, 0x27, 0x05, + 0x28, 0x05, 0x29, 0x05, 0x2a, 0x05, 0x2b, 0x05, + 0x2c, 0x05, 0x2d, 0x05, 0x2e, 0x05, 0x2f, 0x05, + 0x30, 0x05, 0x31, 0x05, 0x32, 0x05, 0x33, 0x05, + 0x34, 0x05, 0x35, 0x05, 0x36, 0x05, 0x37, 0x05, + 0x38, 0x05, 0x39, 0x05, 0x3a, 0x05, 0x3b, 0x05, + 0x3c, 0x05, 0x3d, 0x05, 0x3e, 0x05, 0x3f, 0x05, + 0x40, 0x05, 0x41, 0x05, 0x42, 0x05, 0x43, 0x05, + 0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, + 0x48, 0x05, 0x49, 0x05, 0x4a, 0x05, 0x4b, 0x05, + 0x4c, 0x05, 0x4d, 0x05, 0x4e, 0x05, 0x4f, 0x05, + 0x50, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, + 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, 0x57, 0x05, + 0x58, 0x05, 0x59, 0x05, 0x5a, 0x05, 0x5b, 0x05, + 0x5c, 0x05, 0x5d, 0x05, 0x5e, 0x05, 0x5f, 0x05, + 0x60, 0x05, 0x31, 0x05, 0x32, 0x05, 0x33, 0x05, + 0x34, 0x05, 0x35, 0x05, 0x36, 0x05, 0x37, 0x05, + 0x38, 0x05, 0x39, 0x05, 0x3a, 0x05, 0x3b, 0x05, + 0x3c, 0x05, 0x3d, 0x05, 0x3e, 0x05, 0x3f, 0x05, + 0x40, 0x05, 0x41, 0x05, 0x42, 0x05, 0x43, 0x05, + 0x44, 0x05, 0x45, 0x05, 0x46, 0x05, 0x47, 0x05, + 0x48, 0x05, 0x49, 0x05, 0x4a, 0x05, 0x4b, 0x05, + 0x4c, 0x05, 0x4d, 0x05, 0x4e, 0x05, 0x4f, 0x05, + 0x50, 0x05, 0x51, 0x05, 0x52, 0x05, 0x53, 0x05, + 0x54, 0x05, 0x55, 0x05, 0x56, 0x05, 0xff, 0xff, + 0xf6, 0x17, 0x63, 0x2c, 0x7e, 0x1d, 0x7f, 0x1d, + 0x80, 0x1d, 0x81, 0x1d, 0x82, 0x1d, 0x83, 0x1d, + 0x84, 0x1d, 0x85, 0x1d, 0x86, 0x1d, 0x87, 0x1d, + 0x88, 0x1d, 0x89, 0x1d, 0x8a, 0x1d, 0x8b, 0x1d, + 0x8c, 0x1d, 0x8d, 0x1d, 0x8e, 0x1d, 0x8f, 0x1d, + 0x90, 0x1d, 0x91, 0x1d, 0x92, 0x1d, 0x93, 0x1d, + 0x94, 0x1d, 0x95, 0x1d, 0x96, 0x1d, 0x97, 0x1d, + 0x98, 0x1d, 0x99, 0x1d, 0x9a, 0x1d, 0x9b, 0x1d, + 0x9c, 0x1d, 0x9d, 0x1d, 0x9e, 0x1d, 0x9f, 0x1d, + 0xa0, 0x1d, 0xa1, 0x1d, 0xa2, 0x1d, 0xa3, 0x1d, + 0xa4, 0x1d, 0xa5, 0x1d, 0xa6, 0x1d, 0xa7, 0x1d, + 0xa8, 0x1d, 0xa9, 0x1d, 0xaa, 0x1d, 0xab, 0x1d, + 0xac, 0x1d, 0xad, 0x1d, 0xae, 0x1d, 0xaf, 0x1d, + 0xb0, 0x1d, 0xb1, 0x1d, 0xb2, 0x1d, 0xb3, 0x1d, + 0xb4, 0x1d, 0xb5, 0x1d, 0xb6, 0x1d, 0xb7, 0x1d, + 0xb8, 0x1d, 0xb9, 0x1d, 0xba, 0x1d, 0xbb, 0x1d, + 0xbc, 0x1d, 0xbd, 0x1d, 0xbe, 0x1d, 0xbf, 0x1d, + 0xc0, 0x1d, 0xc1, 0x1d, 0xc2, 0x1d, 0xc3, 0x1d, + 0xc4, 0x1d, 0xc5, 0x1d, 0xc6, 0x1d, 0xc7, 0x1d, + 0xc8, 0x1d, 0xc9, 0x1d, 0xca, 0x1d, 0xcb, 0x1d, + 0xcc, 0x1d, 0xcd, 0x1d, 0xce, 0x1d, 0xcf, 0x1d, + 0xd0, 0x1d, 0xd1, 0x1d, 0xd2, 0x1d, 0xd3, 0x1d, + 0xd4, 0x1d, 0xd5, 0x1d, 0xd6, 0x1d, 0xd7, 0x1d, + 0xd8, 0x1d, 0xd9, 0x1d, 0xda, 0x1d, 0xdb, 0x1d, + 0xdc, 0x1d, 0xdd, 0x1d, 0xde, 0x1d, 0xdf, 0x1d, + 0xe0, 0x1d, 0xe1, 0x1d, 0xe2, 0x1d, 0xe3, 0x1d, + 0xe4, 0x1d, 0xe5, 0x1d, 0xe6, 0x1d, 0xe7, 0x1d, + 0xe8, 0x1d, 0xe9, 0x1d, 0xea, 0x1d, 0xeb, 0x1d, + 0xec, 0x1d, 0xed, 0x1d, 0xee, 0x1d, 0xef, 0x1d, + 0xf0, 0x1d, 0xf1, 0x1d, 0xf2, 0x1d, 0xf3, 0x1d, + 0xf4, 0x1d, 0xf5, 0x1d, 0xf6, 0x1d, 0xf7, 0x1d, + 0xf8, 0x1d, 0xf9, 0x1d, 0xfa, 0x1d, 0xfb, 0x1d, + 0xfc, 0x1d, 0xfd, 0x1d, 0xfe, 0x1d, 0xff, 0x1d, + 0x00, 0x1e, 0x00, 0x1e, 0x02, 0x1e, 0x02, 0x1e, + 0x04, 0x1e, 0x04, 0x1e, 0x06, 0x1e, 0x06, 0x1e, + 0x08, 0x1e, 0x08, 0x1e, 0x0a, 0x1e, 0x0a, 0x1e, + 0x0c, 0x1e, 0x0c, 0x1e, 0x0e, 0x1e, 0x0e, 0x1e, + 0x10, 0x1e, 0x10, 0x1e, 0x12, 0x1e, 0x12, 0x1e, + 0x14, 0x1e, 0x14, 0x1e, 0x16, 0x1e, 0x16, 0x1e, + 0x18, 0x1e, 0x18, 0x1e, 0x1a, 0x1e, 0x1a, 0x1e, + 0x1c, 0x1e, 0x1c, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, + 0x20, 0x1e, 0x20, 0x1e, 0x22, 0x1e, 0x22, 0x1e, + 0x24, 0x1e, 0x24, 0x1e, 0x26, 0x1e, 0x26, 0x1e, + 0x28, 0x1e, 0x28, 0x1e, 0x2a, 0x1e, 0x2a, 0x1e, + 0x2c, 0x1e, 0x2c, 0x1e, 0x2e, 0x1e, 0x2e, 0x1e, + 0x30, 0x1e, 0x30, 0x1e, 0x32, 0x1e, 0x32, 0x1e, + 0x34, 0x1e, 0x34, 0x1e, 0x36, 0x1e, 0x36, 0x1e, + 0x38, 0x1e, 0x38, 0x1e, 0x3a, 0x1e, 0x3a, 0x1e, + 0x3c, 0x1e, 0x3c, 0x1e, 0x3e, 0x1e, 0x3e, 0x1e, + 0x40, 0x1e, 0x40, 0x1e, 0x42, 0x1e, 0x42, 0x1e, + 0x44, 0x1e, 0x44, 0x1e, 0x46, 0x1e, 0x46, 0x1e, + 0x48, 0x1e, 0x48, 0x1e, 0x4a, 0x1e, 0x4a, 0x1e, + 0x4c, 0x1e, 0x4c, 0x1e, 0x4e, 0x1e, 0x4e, 0x1e, + 0x50, 0x1e, 0x50, 0x1e, 0x52, 0x1e, 0x52, 0x1e, + 0x54, 0x1e, 0x54, 0x1e, 0x56, 0x1e, 0x56, 0x1e, + 0x58, 0x1e, 0x58, 0x1e, 0x5a, 0x1e, 0x5a, 0x1e, + 0x5c, 0x1e, 0x5c, 0x1e, 0x5e, 0x1e, 0x5e, 0x1e, + 0x60, 0x1e, 0x60, 0x1e, 0x62, 0x1e, 0x62, 0x1e, + 0x64, 0x1e, 0x64, 0x1e, 0x66, 0x1e, 0x66, 0x1e, + 0x68, 0x1e, 0x68, 0x1e, 0x6a, 0x1e, 0x6a, 0x1e, + 0x6c, 0x1e, 0x6c, 0x1e, 0x6e, 0x1e, 0x6e, 0x1e, + 0x70, 0x1e, 0x70, 0x1e, 0x72, 0x1e, 0x72, 0x1e, + 0x74, 0x1e, 0x74, 0x1e, 0x76, 0x1e, 0x76, 0x1e, + 0x78, 0x1e, 0x78, 0x1e, 0x7a, 0x1e, 0x7a, 0x1e, + 0x7c, 0x1e, 0x7c, 0x1e, 0x7e, 0x1e, 0x7e, 0x1e, + 0x80, 0x1e, 0x80, 0x1e, 0x82, 0x1e, 0x82, 0x1e, + 0x84, 0x1e, 0x84, 0x1e, 0x86, 0x1e, 0x86, 0x1e, + 0x88, 0x1e, 0x88, 0x1e, 0x8a, 0x1e, 0x8a, 0x1e, + 0x8c, 0x1e, 0x8c, 0x1e, 0x8e, 0x1e, 0x8e, 0x1e, + 0x90, 0x1e, 0x90, 0x1e, 0x92, 0x1e, 0x92, 0x1e, + 0x94, 0x1e, 0x94, 0x1e, 0x96, 0x1e, 0x97, 0x1e, + 0x98, 0x1e, 0x99, 0x1e, 0x9a, 0x1e, 0x9b, 0x1e, + 0x9c, 0x1e, 0x9d, 0x1e, 0x9e, 0x1e, 0x9f, 0x1e, + 0xa0, 0x1e, 0xa0, 0x1e, 0xa2, 0x1e, 0xa2, 0x1e, + 0xa4, 0x1e, 0xa4, 0x1e, 0xa6, 0x1e, 0xa6, 0x1e, + 0xa8, 0x1e, 0xa8, 0x1e, 0xaa, 0x1e, 0xaa, 0x1e, + 0xac, 0x1e, 0xac, 0x1e, 0xae, 0x1e, 0xae, 0x1e, + 0xb0, 0x1e, 0xb0, 0x1e, 0xb2, 0x1e, 0xb2, 0x1e, + 0xb4, 0x1e, 0xb4, 0x1e, 0xb6, 0x1e, 0xb6, 0x1e, + 0xb8, 0x1e, 0xb8, 0x1e, 0xba, 0x1e, 0xba, 0x1e, + 0xbc, 0x1e, 0xbc, 0x1e, 0xbe, 0x1e, 0xbe, 0x1e, + 0xc0, 0x1e, 0xc0, 0x1e, 0xc2, 0x1e, 0xc2, 0x1e, + 0xc4, 0x1e, 0xc4, 0x1e, 0xc6, 0x1e, 0xc6, 0x1e, + 0xc8, 0x1e, 0xc8, 0x1e, 0xca, 0x1e, 0xca, 0x1e, + 0xcc, 0x1e, 0xcc, 0x1e, 0xce, 0x1e, 0xce, 0x1e, + 0xd0, 0x1e, 0xd0, 0x1e, 0xd2, 0x1e, 0xd2, 0x1e, + 0xd4, 0x1e, 0xd4, 0x1e, 0xd6, 0x1e, 0xd6, 0x1e, + 0xd8, 0x1e, 0xd8, 0x1e, 0xda, 0x1e, 0xda, 0x1e, + 0xdc, 0x1e, 0xdc, 0x1e, 0xde, 0x1e, 0xde, 0x1e, + 0xe0, 0x1e, 0xe0, 0x1e, 0xe2, 0x1e, 0xe2, 0x1e, + 0xe4, 0x1e, 0xe4, 0x1e, 0xe6, 0x1e, 0xe6, 0x1e, + 0xe8, 0x1e, 0xe8, 0x1e, 0xea, 0x1e, 0xea, 0x1e, + 0xec, 0x1e, 0xec, 0x1e, 0xee, 0x1e, 0xee, 0x1e, + 0xf0, 0x1e, 0xf0, 0x1e, 0xf2, 0x1e, 0xf2, 0x1e, + 0xf4, 0x1e, 0xf4, 0x1e, 0xf6, 0x1e, 0xf6, 0x1e, + 0xf8, 0x1e, 0xf8, 0x1e, 0xfa, 0x1e, 0xfb, 0x1e, + 0xfc, 0x1e, 0xfd, 0x1e, 0xfe, 0x1e, 0xff, 0x1e, + 0x08, 0x1f, 0x09, 0x1f, 0x0a, 0x1f, 0x0b, 0x1f, + 0x0c, 0x1f, 0x0d, 0x1f, 0x0e, 0x1f, 0x0f, 0x1f, + 0x08, 0x1f, 0x09, 0x1f, 0x0a, 0x1f, 0x0b, 0x1f, + 0x0c, 0x1f, 0x0d, 0x1f, 0x0e, 0x1f, 0x0f, 0x1f, + 0x18, 0x1f, 0x19, 0x1f, 0x1a, 0x1f, 0x1b, 0x1f, + 0x1c, 0x1f, 0x1d, 0x1f, 0x16, 0x1f, 0x17, 0x1f, + 0x18, 0x1f, 0x19, 0x1f, 0x1a, 0x1f, 0x1b, 0x1f, + 0x1c, 0x1f, 0x1d, 0x1f, 0x1e, 0x1f, 0x1f, 0x1f, + 0x28, 0x1f, 0x29, 0x1f, 0x2a, 0x1f, 0x2b, 0x1f, + 0x2c, 0x1f, 0x2d, 0x1f, 0x2e, 0x1f, 0x2f, 0x1f, + 0x28, 0x1f, 0x29, 0x1f, 0x2a, 0x1f, 0x2b, 0x1f, + 0x2c, 0x1f, 0x2d, 0x1f, 0x2e, 0x1f, 0x2f, 0x1f, + 0x38, 0x1f, 0x39, 0x1f, 0x3a, 0x1f, 0x3b, 0x1f, + 0x3c, 0x1f, 0x3d, 0x1f, 0x3e, 0x1f, 0x3f, 0x1f, + 0x38, 0x1f, 0x39, 0x1f, 0x3a, 0x1f, 0x3b, 0x1f, + 0x3c, 0x1f, 0x3d, 0x1f, 0x3e, 0x1f, 0x3f, 0x1f, + 0x48, 0x1f, 0x49, 0x1f, 0x4a, 0x1f, 0x4b, 0x1f, + 0x4c, 0x1f, 0x4d, 0x1f, 0x46, 0x1f, 0x47, 0x1f, + 0x48, 0x1f, 0x49, 0x1f, 0x4a, 0x1f, 0x4b, 0x1f, + 0x4c, 0x1f, 0x4d, 0x1f, 0x4e, 0x1f, 0x4f, 0x1f, + 0x50, 0x1f, 0x59, 0x1f, 0x52, 0x1f, 0x5b, 0x1f, + 0x54, 0x1f, 0x5d, 0x1f, 0x56, 0x1f, 0x5f, 0x1f, + 0x58, 0x1f, 0x59, 0x1f, 0x5a, 0x1f, 0x5b, 0x1f, + 0x5c, 0x1f, 0x5d, 0x1f, 0x5e, 0x1f, 0x5f, 0x1f, + 0x68, 0x1f, 0x69, 0x1f, 0x6a, 0x1f, 0x6b, 0x1f, + 0x6c, 0x1f, 0x6d, 0x1f, 0x6e, 0x1f, 0x6f, 0x1f, + 0x68, 0x1f, 0x69, 0x1f, 0x6a, 0x1f, 0x6b, 0x1f, + 0x6c, 0x1f, 0x6d, 0x1f, 0x6e, 0x1f, 0x6f, 0x1f, + 0xba, 0x1f, 0xbb, 0x1f, 0xc8, 0x1f, 0xc9, 0x1f, + 0xca, 0x1f, 0xcb, 0x1f, 0xda, 0x1f, 0xdb, 0x1f, + 0xf8, 0x1f, 0xf9, 0x1f, 0xea, 0x1f, 0xeb, 0x1f, + 0xfa, 0x1f, 0xfb, 0x1f, 0x7e, 0x1f, 0x7f, 0x1f, + 0x88, 0x1f, 0x89, 0x1f, 0x8a, 0x1f, 0x8b, 0x1f, + 0x8c, 0x1f, 0x8d, 0x1f, 0x8e, 0x1f, 0x8f, 0x1f, + 0x88, 0x1f, 0x89, 0x1f, 0x8a, 0x1f, 0x8b, 0x1f, + 0x8c, 0x1f, 0x8d, 0x1f, 0x8e, 0x1f, 0x8f, 0x1f, + 0x98, 0x1f, 0x99, 0x1f, 0x9a, 0x1f, 0x9b, 0x1f, + 0x9c, 0x1f, 0x9d, 0x1f, 0x9e, 0x1f, 0x9f, 0x1f, + 0x98, 0x1f, 0x99, 0x1f, 0x9a, 0x1f, 0x9b, 0x1f, + 0x9c, 0x1f, 0x9d, 0x1f, 0x9e, 0x1f, 0x9f, 0x1f, + 0xa8, 0x1f, 0xa9, 0x1f, 0xaa, 0x1f, 0xab, 0x1f, + 0xac, 0x1f, 0xad, 0x1f, 0xae, 0x1f, 0xaf, 0x1f, + 0xa8, 0x1f, 0xa9, 0x1f, 0xaa, 0x1f, 0xab, 0x1f, + 0xac, 0x1f, 0xad, 0x1f, 0xae, 0x1f, 0xaf, 0x1f, + 0xb8, 0x1f, 0xb9, 0x1f, 0xb2, 0x1f, 0xbc, 0x1f, + 0xb4, 0x1f, 0xb5, 0x1f, 0xb6, 0x1f, 0xb7, 0x1f, + 0xb8, 0x1f, 0xb9, 0x1f, 0xba, 0x1f, 0xbb, 0x1f, + 0xbc, 0x1f, 0xbd, 0x1f, 0xbe, 0x1f, 0xbf, 0x1f, + 0xc0, 0x1f, 0xc1, 0x1f, 0xc2, 0x1f, 0xc3, 0x1f, + 0xc4, 0x1f, 0xc5, 0x1f, 0xc6, 0x1f, 0xc7, 0x1f, + 0xc8, 0x1f, 0xc9, 0x1f, 0xca, 0x1f, 0xcb, 0x1f, + 0xc3, 0x1f, 0xcd, 0x1f, 0xce, 0x1f, 0xcf, 0x1f, + 0xd8, 0x1f, 0xd9, 0x1f, 0xd2, 0x1f, 0xd3, 0x1f, + 0xd4, 0x1f, 0xd5, 0x1f, 0xd6, 0x1f, 0xd7, 0x1f, + 0xd8, 0x1f, 0xd9, 0x1f, 0xda, 0x1f, 0xdb, 0x1f, + 0xdc, 0x1f, 0xdd, 0x1f, 0xde, 0x1f, 0xdf, 0x1f, + 0xe8, 0x1f, 0xe9, 0x1f, 0xe2, 0x1f, 0xe3, 0x1f, + 0xe4, 0x1f, 0xec, 0x1f, 0xe6, 0x1f, 0xe7, 0x1f, + 0xe8, 0x1f, 0xe9, 0x1f, 0xea, 0x1f, 0xeb, 0x1f, + 0xec, 0x1f, 0xed, 0x1f, 0xee, 0x1f, 0xef, 0x1f, + 0xf0, 0x1f, 0xf1, 0x1f, 0xf2, 0x1f, 0xf3, 0x1f, + 0xf4, 0x1f, 0xf5, 0x1f, 0xf6, 0x1f, 0xf7, 0x1f, + 0xf8, 0x1f, 0xf9, 0x1f, 0xfa, 0x1f, 0xfb, 0x1f, + 0xf3, 0x1f, 0xfd, 0x1f, 0xfe, 0x1f, 0xff, 0x1f, + 0x00, 0x20, 0x01, 0x20, 0x02, 0x20, 0x03, 0x20, + 0x04, 0x20, 0x05, 0x20, 0x06, 0x20, 0x07, 0x20, + 0x08, 0x20, 0x09, 0x20, 0x0a, 0x20, 0x0b, 0x20, + 0x0c, 0x20, 0x0d, 0x20, 0x0e, 0x20, 0x0f, 0x20, + 0x10, 0x20, 0x11, 0x20, 0x12, 0x20, 0x13, 0x20, + 0x14, 0x20, 0x15, 0x20, 0x16, 0x20, 0x17, 0x20, + 0x18, 0x20, 0x19, 0x20, 0x1a, 0x20, 0x1b, 0x20, + 0x1c, 0x20, 0x1d, 0x20, 0x1e, 0x20, 0x1f, 0x20, + 0x20, 0x20, 0x21, 0x20, 0x22, 0x20, 0x23, 0x20, + 0x24, 0x20, 0x25, 0x20, 0x26, 0x20, 0x27, 0x20, + 0x28, 0x20, 0x29, 0x20, 0x2a, 0x20, 0x2b, 0x20, + 0x2c, 0x20, 0x2d, 0x20, 0x2e, 0x20, 0x2f, 0x20, + 0x30, 0x20, 0x31, 0x20, 0x32, 0x20, 0x33, 0x20, + 0x34, 0x20, 0x35, 0x20, 0x36, 0x20, 0x37, 0x20, + 0x38, 0x20, 0x39, 0x20, 0x3a, 0x20, 0x3b, 0x20, + 0x3c, 0x20, 0x3d, 0x20, 0x3e, 0x20, 0x3f, 0x20, + 0x40, 0x20, 0x41, 0x20, 0x42, 0x20, 0x43, 0x20, + 0x44, 0x20, 0x45, 0x20, 0x46, 0x20, 0x47, 0x20, + 0x48, 0x20, 0x49, 0x20, 0x4a, 0x20, 0x4b, 0x20, + 0x4c, 0x20, 0x4d, 0x20, 0x4e, 0x20, 0x4f, 0x20, + 0x50, 0x20, 0x51, 0x20, 0x52, 0x20, 0x53, 0x20, + 0x54, 0x20, 0x55, 0x20, 0x56, 0x20, 0x57, 0x20, + 0x58, 0x20, 0x59, 0x20, 0x5a, 0x20, 0x5b, 0x20, + 0x5c, 0x20, 0x5d, 0x20, 0x5e, 0x20, 0x5f, 0x20, + 0x60, 0x20, 0x61, 0x20, 0x62, 0x20, 0x63, 0x20, + 0x64, 0x20, 0x65, 0x20, 0x66, 0x20, 0x67, 0x20, + 0x68, 0x20, 0x69, 0x20, 0x6a, 0x20, 0x6b, 0x20, + 0x6c, 0x20, 0x6d, 0x20, 0x6e, 0x20, 0x6f, 0x20, + 0x70, 0x20, 0x71, 0x20, 0x72, 0x20, 0x73, 0x20, + 0x74, 0x20, 0x75, 0x20, 0x76, 0x20, 0x77, 0x20, + 0x78, 0x20, 0x79, 0x20, 0x7a, 0x20, 0x7b, 0x20, + 0x7c, 0x20, 0x7d, 0x20, 0x7e, 0x20, 0x7f, 0x20, + 0x80, 0x20, 0x81, 0x20, 0x82, 0x20, 0x83, 0x20, + 0x84, 0x20, 0x85, 0x20, 0x86, 0x20, 0x87, 0x20, + 0x88, 0x20, 0x89, 0x20, 0x8a, 0x20, 0x8b, 0x20, + 0x8c, 0x20, 0x8d, 0x20, 0x8e, 0x20, 0x8f, 0x20, + 0x90, 0x20, 0x91, 0x20, 0x92, 0x20, 0x93, 0x20, + 0x94, 0x20, 0x95, 0x20, 0x96, 0x20, 0x97, 0x20, + 0x98, 0x20, 0x99, 0x20, 0x9a, 0x20, 0x9b, 0x20, + 0x9c, 0x20, 0x9d, 0x20, 0x9e, 0x20, 0x9f, 0x20, + 0xa0, 0x20, 0xa1, 0x20, 0xa2, 0x20, 0xa3, 0x20, + 0xa4, 0x20, 0xa5, 0x20, 0xa6, 0x20, 0xa7, 0x20, + 0xa8, 0x20, 0xa9, 0x20, 0xaa, 0x20, 0xab, 0x20, + 0xac, 0x20, 0xad, 0x20, 0xae, 0x20, 0xaf, 0x20, + 0xb0, 0x20, 0xb1, 0x20, 0xb2, 0x20, 0xb3, 0x20, + 0xb4, 0x20, 0xb5, 0x20, 0xb6, 0x20, 0xb7, 0x20, + 0xb8, 0x20, 0xb9, 0x20, 0xba, 0x20, 0xbb, 0x20, + 0xbc, 0x20, 0xbd, 0x20, 0xbe, 0x20, 0xbf, 0x20, + 0xc0, 0x20, 0xc1, 0x20, 0xc2, 0x20, 0xc3, 0x20, + 0xc4, 0x20, 0xc5, 0x20, 0xc6, 0x20, 0xc7, 0x20, + 0xc8, 0x20, 0xc9, 0x20, 0xca, 0x20, 0xcb, 0x20, + 0xcc, 0x20, 0xcd, 0x20, 0xce, 0x20, 0xcf, 0x20, + 0xd0, 0x20, 0xd1, 0x20, 0xd2, 0x20, 0xd3, 0x20, + 0xd4, 0x20, 0xd5, 0x20, 0xd6, 0x20, 0xd7, 0x20, + 0xd8, 0x20, 0xd9, 0x20, 0xda, 0x20, 0xdb, 0x20, + 0xdc, 0x20, 0xdd, 0x20, 0xde, 0x20, 0xdf, 0x20, + 0xe0, 0x20, 0xe1, 0x20, 0xe2, 0x20, 0xe3, 0x20, + 0xe4, 0x20, 0xe5, 0x20, 0xe6, 0x20, 0xe7, 0x20, + 0xe8, 0x20, 0xe9, 0x20, 0xea, 0x20, 0xeb, 0x20, + 0xec, 0x20, 0xed, 0x20, 0xee, 0x20, 0xef, 0x20, + 0xf0, 0x20, 0xf1, 0x20, 0xf2, 0x20, 0xf3, 0x20, + 0xf4, 0x20, 0xf5, 0x20, 0xf6, 0x20, 0xf7, 0x20, + 0xf8, 0x20, 0xf9, 0x20, 0xfa, 0x20, 0xfb, 0x20, + 0xfc, 0x20, 0xfd, 0x20, 0xfe, 0x20, 0xff, 0x20, + 0x00, 0x21, 0x01, 0x21, 0x02, 0x21, 0x03, 0x21, + 0x04, 0x21, 0x05, 0x21, 0x06, 0x21, 0x07, 0x21, + 0x08, 0x21, 0x09, 0x21, 0x0a, 0x21, 0x0b, 0x21, + 0x0c, 0x21, 0x0d, 0x21, 0x0e, 0x21, 0x0f, 0x21, + 0x10, 0x21, 0x11, 0x21, 0x12, 0x21, 0x13, 0x21, + 0x14, 0x21, 0x15, 0x21, 0x16, 0x21, 0x17, 0x21, + 0x18, 0x21, 0x19, 0x21, 0x1a, 0x21, 0x1b, 0x21, + 0x1c, 0x21, 0x1d, 0x21, 0x1e, 0x21, 0x1f, 0x21, + 0x20, 0x21, 0x21, 0x21, 0x22, 0x21, 0x23, 0x21, + 0x24, 0x21, 0x25, 0x21, 0x26, 0x21, 0x27, 0x21, + 0x28, 0x21, 0x29, 0x21, 0x2a, 0x21, 0x2b, 0x21, + 0x2c, 0x21, 0x2d, 0x21, 0x2e, 0x21, 0x2f, 0x21, + 0x30, 0x21, 0x31, 0x21, 0x32, 0x21, 0x33, 0x21, + 0x34, 0x21, 0x35, 0x21, 0x36, 0x21, 0x37, 0x21, + 0x38, 0x21, 0x39, 0x21, 0x3a, 0x21, 0x3b, 0x21, + 0x3c, 0x21, 0x3d, 0x21, 0x3e, 0x21, 0x3f, 0x21, + 0x40, 0x21, 0x41, 0x21, 0x42, 0x21, 0x43, 0x21, + 0x44, 0x21, 0x45, 0x21, 0x46, 0x21, 0x47, 0x21, + 0x48, 0x21, 0x49, 0x21, 0x4a, 0x21, 0x4b, 0x21, + 0x4c, 0x21, 0x4d, 0x21, 0x32, 0x21, 0x4f, 0x21, + 0x50, 0x21, 0x51, 0x21, 0x52, 0x21, 0x53, 0x21, + 0x54, 0x21, 0x55, 0x21, 0x56, 0x21, 0x57, 0x21, + 0x58, 0x21, 0x59, 0x21, 0x5a, 0x21, 0x5b, 0x21, + 0x5c, 0x21, 0x5d, 0x21, 0x5e, 0x21, 0x5f, 0x21, + 0x60, 0x21, 0x61, 0x21, 0x62, 0x21, 0x63, 0x21, + 0x64, 0x21, 0x65, 0x21, 0x66, 0x21, 0x67, 0x21, + 0x68, 0x21, 0x69, 0x21, 0x6a, 0x21, 0x6b, 0x21, + 0x6c, 0x21, 0x6d, 0x21, 0x6e, 0x21, 0x6f, 0x21, + 0x60, 0x21, 0x61, 0x21, 0x62, 0x21, 0x63, 0x21, + 0x64, 0x21, 0x65, 0x21, 0x66, 0x21, 0x67, 0x21, + 0x68, 0x21, 0x69, 0x21, 0x6a, 0x21, 0x6b, 0x21, + 0x6c, 0x21, 0x6d, 0x21, 0x6e, 0x21, 0x6f, 0x21, + 0x80, 0x21, 0x81, 0x21, 0x82, 0x21, 0x83, 0x21, + 0x83, 0x21, 0xff, 0xff, 0x4b, 0x03, 0xb6, 0x24, + 0xb7, 0x24, 0xb8, 0x24, 0xb9, 0x24, 0xba, 0x24, + 0xbb, 0x24, 0xbc, 0x24, 0xbd, 0x24, 0xbe, 0x24, + 0xbf, 0x24, 0xc0, 0x24, 0xc1, 0x24, 0xc2, 0x24, + 0xc3, 0x24, 0xc4, 0x24, 0xc5, 0x24, 0xc6, 0x24, + 0xc7, 0x24, 0xc8, 0x24, 0xc9, 0x24, 0xca, 0x24, + 0xcb, 0x24, 0xcc, 0x24, 0xcd, 0x24, 0xce, 0x24, + 0xcf, 0x24, 0xff, 0xff, 0x46, 0x07, 0x00, 0x2c, + 0x01, 0x2c, 0x02, 0x2c, 0x03, 0x2c, 0x04, 0x2c, + 0x05, 0x2c, 0x06, 0x2c, 0x07, 0x2c, 0x08, 0x2c, + 0x09, 0x2c, 0x0a, 0x2c, 0x0b, 0x2c, 0x0c, 0x2c, + 0x0d, 0x2c, 0x0e, 0x2c, 0x0f, 0x2c, 0x10, 0x2c, + 0x11, 0x2c, 0x12, 0x2c, 0x13, 0x2c, 0x14, 0x2c, + 0x15, 0x2c, 0x16, 0x2c, 0x17, 0x2c, 0x18, 0x2c, + 0x19, 0x2c, 0x1a, 0x2c, 0x1b, 0x2c, 0x1c, 0x2c, + 0x1d, 0x2c, 0x1e, 0x2c, 0x1f, 0x2c, 0x20, 0x2c, + 0x21, 0x2c, 0x22, 0x2c, 0x23, 0x2c, 0x24, 0x2c, + 0x25, 0x2c, 0x26, 0x2c, 0x27, 0x2c, 0x28, 0x2c, + 0x29, 0x2c, 0x2a, 0x2c, 0x2b, 0x2c, 0x2c, 0x2c, + 0x2d, 0x2c, 0x2e, 0x2c, 0x5f, 0x2c, 0x60, 0x2c, + 0x60, 0x2c, 0x62, 0x2c, 0x63, 0x2c, 0x64, 0x2c, + 0x65, 0x2c, 0x66, 0x2c, 0x67, 0x2c, 0x67, 0x2c, + 0x69, 0x2c, 0x69, 0x2c, 0x6b, 0x2c, 0x6b, 0x2c, + 0x6d, 0x2c, 0x6e, 0x2c, 0x6f, 0x2c, 0x70, 0x2c, + 0x71, 0x2c, 0x72, 0x2c, 0x73, 0x2c, 0x74, 0x2c, + 0x75, 0x2c, 0x75, 0x2c, 0x77, 0x2c, 0x78, 0x2c, + 0x79, 0x2c, 0x7a, 0x2c, 0x7b, 0x2c, 0x7c, 0x2c, + 0x7d, 0x2c, 0x7e, 0x2c, 0x7f, 0x2c, 0x80, 0x2c, + 0x80, 0x2c, 0x82, 0x2c, 0x82, 0x2c, 0x84, 0x2c, + 0x84, 0x2c, 0x86, 0x2c, 0x86, 0x2c, 0x88, 0x2c, + 0x88, 0x2c, 0x8a, 0x2c, 0x8a, 0x2c, 0x8c, 0x2c, + 0x8c, 0x2c, 0x8e, 0x2c, 0x8e, 0x2c, 0x90, 0x2c, + 0x90, 0x2c, 0x92, 0x2c, 0x92, 0x2c, 0x94, 0x2c, + 0x94, 0x2c, 0x96, 0x2c, 0x96, 0x2c, 0x98, 0x2c, + 0x98, 0x2c, 0x9a, 0x2c, 0x9a, 0x2c, 0x9c, 0x2c, + 0x9c, 0x2c, 0x9e, 0x2c, 0x9e, 0x2c, 0xa0, 0x2c, + 0xa0, 0x2c, 0xa2, 0x2c, 0xa2, 0x2c, 0xa4, 0x2c, + 0xa4, 0x2c, 0xa6, 0x2c, 0xa6, 0x2c, 0xa8, 0x2c, + 0xa8, 0x2c, 0xaa, 0x2c, 0xaa, 0x2c, 0xac, 0x2c, + 0xac, 0x2c, 0xae, 0x2c, 0xae, 0x2c, 0xb0, 0x2c, + 0xb0, 0x2c, 0xb2, 0x2c, 0xb2, 0x2c, 0xb4, 0x2c, + 0xb4, 0x2c, 0xb6, 0x2c, 0xb6, 0x2c, 0xb8, 0x2c, + 0xb8, 0x2c, 0xba, 0x2c, 0xba, 0x2c, 0xbc, 0x2c, + 0xbc, 0x2c, 0xbe, 0x2c, 0xbe, 0x2c, 0xc0, 0x2c, + 0xc0, 0x2c, 0xc2, 0x2c, 0xc2, 0x2c, 0xc4, 0x2c, + 0xc4, 0x2c, 0xc6, 0x2c, 0xc6, 0x2c, 0xc8, 0x2c, + 0xc8, 0x2c, 0xca, 0x2c, 0xca, 0x2c, 0xcc, 0x2c, + 0xcc, 0x2c, 0xce, 0x2c, 0xce, 0x2c, 0xd0, 0x2c, + 0xd0, 0x2c, 0xd2, 0x2c, 0xd2, 0x2c, 0xd4, 0x2c, + 0xd4, 0x2c, 0xd6, 0x2c, 0xd6, 0x2c, 0xd8, 0x2c, + 0xd8, 0x2c, 0xda, 0x2c, 0xda, 0x2c, 0xdc, 0x2c, + 0xdc, 0x2c, 0xde, 0x2c, 0xde, 0x2c, 0xe0, 0x2c, + 0xe0, 0x2c, 0xe2, 0x2c, 0xe2, 0x2c, 0xe4, 0x2c, + 0xe5, 0x2c, 0xe6, 0x2c, 0xe7, 0x2c, 0xe8, 0x2c, + 0xe9, 0x2c, 0xea, 0x2c, 0xeb, 0x2c, 0xec, 0x2c, + 0xed, 0x2c, 0xee, 0x2c, 0xef, 0x2c, 0xf0, 0x2c, + 0xf1, 0x2c, 0xf2, 0x2c, 0xf3, 0x2c, 0xf4, 0x2c, + 0xf5, 0x2c, 0xf6, 0x2c, 0xf7, 0x2c, 0xf8, 0x2c, + 0xf9, 0x2c, 0xfa, 0x2c, 0xfb, 0x2c, 0xfc, 0x2c, + 0xfd, 0x2c, 0xfe, 0x2c, 0xff, 0x2c, 0xa0, 0x10, + 0xa1, 0x10, 0xa2, 0x10, 0xa3, 0x10, 0xa4, 0x10, + 0xa5, 0x10, 0xa6, 0x10, 0xa7, 0x10, 0xa8, 0x10, + 0xa9, 0x10, 0xaa, 0x10, 0xab, 0x10, 0xac, 0x10, + 0xad, 0x10, 0xae, 0x10, 0xaf, 0x10, 0xb0, 0x10, + 0xb1, 0x10, 0xb2, 0x10, 0xb3, 0x10, 0xb4, 0x10, + 0xb5, 0x10, 0xb6, 0x10, 0xb7, 0x10, 0xb8, 0x10, + 0xb9, 0x10, 0xba, 0x10, 0xbb, 0x10, 0xbc, 0x10, + 0xbd, 0x10, 0xbe, 0x10, 0xbf, 0x10, 0xc0, 0x10, + 0xc1, 0x10, 0xc2, 0x10, 0xc3, 0x10, 0xc4, 0x10, + 0xc5, 0x10, 0xff, 0xff, 0x1b, 0xd2, 0x21, 0xff, + 0x22, 0xff, 0x23, 0xff, 0x24, 0xff, 0x25, 0xff, + 0x26, 0xff, 0x27, 0xff, 0x28, 0xff, 0x29, 0xff, + 0x2a, 0xff, 0x2b, 0xff, 0x2c, 0xff, 0x2d, 0xff, + 0x2e, 0xff, 0x2f, 0xff, 0x30, 0xff, 0x31, 0xff, + 0x32, 0xff, 0x33, 0xff, 0x34, 0xff, 0x35, 0xff, + 0x36, 0xff, 0x37, 0xff, 0x38, 0xff, 0x39, 0xff, + 0x3a, 0xff, 0x5b, 0xff, 0x5c, 0xff, 0x5d, 0xff, + 0x5e, 0xff, 0x5f, 0xff, 0x60, 0xff, 0x61, 0xff, + 0x62, 0xff, 0x63, 0xff, 0x64, 0xff, 0x65, 0xff, + 0x66, 0xff, 0x67, 0xff, 0x68, 0xff, 0x69, 0xff, + 0x6a, 0xff, 0x6b, 0xff, 0x6c, 0xff, 0x6d, 0xff, + 0x6e, 0xff, 0x6f, 0xff, 0x70, 0xff, 0x71, 0xff, + 0x72, 0xff, 0x73, 0xff, 0x74, 0xff, 0x75, 0xff, + 0x76, 0xff, 0x77, 0xff, 0x78, 0xff, 0x79, 0xff, + 0x7a, 0xff, 0x7b, 0xff, 0x7c, 0xff, 0x7d, 0xff, + 0x7e, 0xff, 0x7f, 0xff, 0x80, 0xff, 0x81, 0xff, + 0x82, 0xff, 0x83, 0xff, 0x84, 0xff, 0x85, 0xff, + 0x86, 0xff, 0x87, 0xff, 0x88, 0xff, 0x89, 0xff, + 0x8a, 0xff, 0x8b, 0xff, 0x8c, 0xff, 0x8d, 0xff, + 0x8e, 0xff, 0x8f, 0xff, 0x90, 0xff, 0x91, 0xff, + 0x92, 0xff, 0x93, 0xff, 0x94, 0xff, 0x95, 0xff, + 0x96, 0xff, 0x97, 0xff, 0x98, 0xff, 0x99, 0xff, + 0x9a, 0xff, 0x9b, 0xff, 0x9c, 0xff, 0x9d, 0xff, + 0x9e, 0xff, 0x9f, 0xff, 0xa0, 0xff, 0xa1, 0xff, + 0xa2, 0xff, 0xa3, 0xff, 0xa4, 0xff, 0xa5, 0xff, + 0xa6, 0xff, 0xa7, 0xff, 0xa8, 0xff, 0xa9, 0xff, + 0xaa, 0xff, 0xab, 0xff, 0xac, 0xff, 0xad, 0xff, + 0xae, 0xff, 0xaf, 0xff, 0xb0, 0xff, 0xb1, 0xff, + 0xb2, 0xff, 0xb3, 0xff, 0xb4, 0xff, 0xb5, 0xff, + 0xb6, 0xff, 0xb7, 0xff, 0xb8, 0xff, 0xb9, 0xff, + 0xba, 0xff, 0xbb, 0xff, 0xbc, 0xff, 0xbd, 0xff, + 0xbe, 0xff, 0xbf, 0xff, 0xc0, 0xff, 0xc1, 0xff, + 0xc2, 0xff, 0xc3, 0xff, 0xc4, 0xff, 0xc5, 0xff, + 0xc6, 0xff, 0xc7, 0xff, 0xc8, 0xff, 0xc9, 0xff, + 0xca, 0xff, 0xcb, 0xff, 0xcc, 0xff, 0xcd, 0xff, + 0xce, 0xff, 0xcf, 0xff, 0xd0, 0xff, 0xd1, 0xff, + 0xd2, 0xff, 0xd3, 0xff, 0xd4, 0xff, 0xd5, 0xff, + 0xd6, 0xff, 0xd7, 0xff, 0xd8, 0xff, 0xd9, 0xff, + 0xda, 0xff, 0xdb, 0xff, 0xdc, 0xff, 0xdd, 0xff, + 0xde, 0xff, 0xdf, 0xff, 0xe0, 0xff, 0xe1, 0xff, + 0xe2, 0xff, 0xe3, 0xff, 0xe4, 0xff, 0xe5, 0xff, + 0xe6, 0xff, 0xe7, 0xff, 0xe8, 0xff, 0xe9, 0xff, + 0xea, 0xff, 0xeb, 0xff, 0xec, 0xff, 0xed, 0xff, + 0xee, 0xff, 0xef, 0xff, 0xf0, 0xff, 0xf1, 0xff, + 0xf2, 0xff, 0xf3, 0xff, 0xf4, 0xff, 0xf5, 0xff, + 0xf6, 0xff, 0xf7, 0xff, 0xf8, 0xff, 0xf9, 0xff, + 0xfa, 0xff, 0xfb, 0xff, 0xfc, 0xff, 0xfd, 0xff, + 0xfe, 0xff, 0xff, 0xff +}; diff --git a/src/gui/Lib/exfat/src/mkfs/uctc.h b/src/gui/Lib/exfat/src/mkfs/uctc.h new file mode 100644 index 0000000..bd5ebb2 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/uctc.h @@ -0,0 +1,30 @@ +/* + uctc.h (30.10.10) + Upper Case Table declaration. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_UCTC_H_INCLUDED +#define MKFS_UCTC_H_INCLUDED + +#include + +extern uint8_t upcase_table[5836]; + +#endif /* ifndef MKFS_UCTC_H_INCLUDED */ diff --git a/src/gui/Lib/exfat/src/mkfs/vbr.c b/src/gui/Lib/exfat/src/mkfs/vbr.c new file mode 100644 index 0000000..e40081f --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/vbr.c @@ -0,0 +1,148 @@ +/* + vbr.c (09.11.10) + Volume Boot Record creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#include "vbr.h" +#include "fat.h" +#include "cbm.h" +#include "uct.h" +#include "rootdir.h" +#include + +static off_t vbr_alignment(void) +{ + return get_sector_size(); +} + +static off_t vbr_size(void) +{ + return 12 * get_sector_size(); +} + +static void init_sb(struct exfat_super_block* sb) +{ + uint32_t clusters_max; + uint32_t fat_sectors; + + clusters_max = get_volume_size() / get_cluster_size(); + fat_sectors = DIV_ROUND_UP((off_t) clusters_max * sizeof(cluster_t), + get_sector_size()); + + memset(sb, 0, sizeof(struct exfat_super_block)); + sb->jump[0] = 0xeb; + sb->jump[1] = 0x76; + sb->jump[2] = 0x90; + memcpy(sb->oem_name, "EXFAT ", sizeof(sb->oem_name)); + sb->sector_start = cpu_to_le64(get_first_sector()); + sb->sector_count = cpu_to_le64(get_volume_size() / get_sector_size()); + sb->fat_sector_start = cpu_to_le32( + fat.get_alignment() / get_sector_size()); + sb->fat_sector_count = cpu_to_le32(ROUND_UP( + le32_to_cpu(sb->fat_sector_start) + fat_sectors, + 1 << get_spc_bits()) - + le32_to_cpu(sb->fat_sector_start)); + sb->cluster_sector_start = cpu_to_le32( + get_position(&cbm) / get_sector_size()); + sb->cluster_count = cpu_to_le32(clusters_max - + ((le32_to_cpu(sb->fat_sector_start) + + le32_to_cpu(sb->fat_sector_count)) >> get_spc_bits())); + sb->rootdir_cluster = cpu_to_le32( + (get_position(&rootdir) - get_position(&cbm)) / get_cluster_size() + + EXFAT_FIRST_DATA_CLUSTER); + sb->volume_serial = cpu_to_le32(get_volume_serial()); + sb->version.major = 1; + sb->version.minor = 0; + sb->volume_state = cpu_to_le16(0); + sb->sector_bits = get_sector_bits(); + sb->spc_bits = get_spc_bits(); + sb->fat_count = 1; + sb->drive_no = 0x80; + sb->allocated_percent = 0; + sb->boot_signature = cpu_to_le16(0xaa55); +} + +static int vbr_write(struct exfat_dev* dev) +{ + struct exfat_super_block sb; + uint32_t checksum; + le32_t* sector = malloc(get_sector_size()); + size_t i; + + if (sector == NULL) + { + exfat_error("failed to allocate sector-sized block of memory"); + return 1; + } + + init_sb(&sb); + if (exfat_write(dev, &sb, sizeof(struct exfat_super_block)) < 0) + { + free(sector); + exfat_error("failed to write super block sector"); + return 1; + } + checksum = exfat_vbr_start_checksum(&sb, sizeof(struct exfat_super_block)); + + memset(sector, 0, get_sector_size()); + sector[get_sector_size() / sizeof(sector[0]) - 1] = + cpu_to_le32(0xaa550000); + for (i = 0; i < 8; i++) + { + if (exfat_write(dev, sector, get_sector_size()) < 0) + { + free(sector); + exfat_error("failed to write a sector with boot signature"); + return 1; + } + checksum = exfat_vbr_add_checksum(sector, get_sector_size(), checksum); + } + + memset(sector, 0, get_sector_size()); + for (i = 0; i < 2; i++) + { + if (exfat_write(dev, sector, get_sector_size()) < 0) + { + free(sector); + exfat_error("failed to write an empty sector"); + return 1; + } + checksum = exfat_vbr_add_checksum(sector, get_sector_size(), checksum); + } + + for (i = 0; i < get_sector_size() / sizeof(sector[0]); i++) + sector[i] = cpu_to_le32(checksum); + if (exfat_write(dev, sector, get_sector_size()) < 0) + { + free(sector); + exfat_error("failed to write checksum sector"); + return 1; + } + + free(sector); + return 0; +} + +const struct fs_object vbr = +{ + .get_alignment = vbr_alignment, + .get_size = vbr_size, + .write = vbr_write, +}; diff --git a/src/gui/Lib/exfat/src/mkfs/vbr.h b/src/gui/Lib/exfat/src/mkfs/vbr.h new file mode 100644 index 0000000..c1f59a6 --- /dev/null +++ b/src/gui/Lib/exfat/src/mkfs/vbr.h @@ -0,0 +1,30 @@ +/* + vbr.h (09.11.10) + Volume Boot Record creation code. + + Free exFAT implementation. + Copyright (C) 2011-2018 Andrew Nayenko + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef MKFS_VBR_H_INCLUDED +#define MKFS_VBR_H_INCLUDED + +#include "mkexfat.h" + +extern const struct fs_object vbr; + +#endif /* ifndef MKFS_VBR_H_INCLUDED */ diff --git a/src/gui/Lib/fat_io_lib/API.txt b/src/gui/Lib/fat_io_lib/API.txt new file mode 100644 index 0000000..61fc164 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/API.txt @@ -0,0 +1,22 @@ +File IO Lib API +-=-=-=-=-=-=-=-=- + +void fl_init(void) + + Called to initialize FAT IO library. + This should be called prior to any other functions. + +void fl_attach_locks(void (*lock)(void), void (*unlock)(void)) + + [Optional] File system thread safety locking functions. + For thread safe operation, you should provide lock() and unlock() functions. + Note that locking primitive used must support recursive locking, i.e lock() called within an already ‘locked’ region. + +int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr) + + This function is used to attach system specific disk/media access functions. + This should be done subsequent to calling fl_init() and fl_attach_locks() (if locking required). + +void fl_shutdown(void) + + Shutdown the FAT IO library. This purges any un-saved data back to disk. diff --git a/src/gui/Lib/fat_io_lib/COPYRIGHT.txt b/src/gui/Lib/fat_io_lib/COPYRIGHT.txt new file mode 100644 index 0000000..4335f7f --- /dev/null +++ b/src/gui/Lib/fat_io_lib/COPYRIGHT.txt @@ -0,0 +1,345 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/gui/Lib/fat_io_lib/Configuration.txt b/src/gui/Lib/fat_io_lib/Configuration.txt new file mode 100644 index 0000000..9ec576e --- /dev/null +++ b/src/gui/Lib/fat_io_lib/Configuration.txt @@ -0,0 +1,53 @@ +File IO Lib Options +-=-=-=-=-=-=-=-=-=- + +See defines in fat_opts.h: + +FATFS_IS_LITTLE_ENDIAN [1/0] + Which endian is your system? Set to 1 for little endian, 0 for big endian. + +FATFS_MAX_LONG_FILENAME [260] + By default, 260 characters (max LFN length). Increase this to support greater path depths. + +FATFS_MAX_OPEN_FILES + The more files you wish to have concurrently open, the greater this number should be. + This increases the number of FL_FILE file structures in the library, each of these is around 1K in size (assuming 512 byte sectors). + +FAT_BUFFER_SECTORS + Minimum is 1, more increases performance. + This defines how many FAT sectors can be buffered per FAT_BUFFER entry. + +FAT_BUFFERS + Minimum is 1, more increases performance. + This defines how many FAT buffer entries are available. + Memory usage is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE + +FATFS_INC_WRITE_SUPPORT + Support file write functionality. + +FAT_SECTOR_SIZE + Sector size used by buffers. Most likely to be 512 bytes (standard for ATA/IDE). + +FAT_PRINTF + A define that allows the File IO library to print to console/stdout. + Provide your own printf function if printf not available. + +FAT_CLUSTER_CACHE_ENTRIES + Size of cluster chain cache (can be undefined if not required). + Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 + Improves access speed considerably. + +FATFS_INC_LFN_SUPPORT [1/0] + Enable/Disable support for long filenames. + +FATFS_DIR_LIST_SUPPORT [1/0] + Include support for directory listing. + +FATFS_INC_TIME_DATE_SUPPORT [1/0] + Use time/date functions provided by time.h to update creation & modification timestamps. + +FATFS_INC_FORMAT_SUPPORT + Include support for formatting disks (FAT16 only). + +FAT_PRINTF_NOINC_STDIO + Disable use of printf & inclusion of stdio.h diff --git a/src/gui/Lib/fat_io_lib/History.txt b/src/gui/Lib/fat_io_lib/History.txt new file mode 100644 index 0000000..58958f4 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/History.txt @@ -0,0 +1,24 @@ +Revision History +-=-=-=-=-=-=-=-=- +v2.6.11 - Fix compilation with GCC on 64-bit machines +v2.6.10 - Added support for FAT32 format. +V2.6.9 - Added support for time & date handling. +V2.6.8 - Fixed error with FSINFO sector write. +V2.6.7 - Added fgets(). + Fixed C warnings, removed dependancy on some string.h functions. +V2.6.6 – Massive read + write performance improvements. +V2.6.5 – Bug fixes for big endian systems. +V2.6.4 – Further bug fixes and performance improvements for write operations. +V2.6.3 – Peformance improvements, FAT16 formatting support. Various bug fixes. +V2.6 - Basic support for FAT16 added (18-04-10). +V2.5 - Code cleaned up. Many bugs fixed. Thread safety functions added. +V2.x - Write support added as well as better stdio like API. +V1.0 - Rewrite of all code to enable multiple files to be opened and provides a + better file API. + Also better string matching, and generally better C code than origonal + version. +V0.1c - Fetch_ID_Max_LBA() function added to retrieve Drive infomation and stoping + the drive reads from addressing a sector that is out of range. +V0.1b - fopen(), fgetc(), fopenDIR() using new software stack for IDE and FAT32 + access. +V0.1a - First release (27/12/03); fopen(), fgetc() unbuffered reads. diff --git a/src/gui/Lib/fat_io_lib/License.txt b/src/gui/Lib/fat_io_lib/License.txt new file mode 100644 index 0000000..c7fb0cc --- /dev/null +++ b/src/gui/Lib/fat_io_lib/License.txt @@ -0,0 +1,10 @@ +FAT File IO Library License +-=-=-=-=-=-=-=-=-=-=-=-=-=- + +This versions license: GPL + +If you include GPL software in your project, you must release the source code of that project too. + +If you would like a version with a more permissive license for use in closed source commercial applications please contact me for details. + +Email: admin@ultra-embedded.com diff --git a/src/gui/Lib/fat_io_lib/Media Access API.txt b/src/gui/Lib/fat_io_lib/Media Access API.txt new file mode 100644 index 0000000..45eede0 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/Media Access API.txt @@ -0,0 +1,40 @@ +Media Access API +-=-=-=-=-=-=-=-=- + +int media_read(uint32 sector, uint8 *buffer, uint32 sector_count) + +Params: + Sector: 32-bit sector number + Buffer: Target buffer to read n sectors of data into. + Sector_count: Number of sectors to read. + +Return: + int, 1 = success, 0 = failure. + +Description: + Application/target specific disk/media read function. + Sector number (sectors are usually 512 byte pages) to read. + +Media Write API + +int media_write(uint32 sector, uint8 *buffer, uint32 sector_count) + +Params: + Sector: 32-bit sector number + Buffer: Target buffer to write n sectors of data from. + Sector_count: Number of sectors to write. + +Return: + int, 1 = success, 0 = failure. + +Description: + Application/target specific disk/media write function. + Sector number (sectors are usually 512 byte pages) to write to. + +File IO Library Linkage + Use the following API to attach the media IO functions to the File IO library. + + int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr) + + + diff --git a/src/gui/Lib/fat_io_lib/fat_access.c b/src/gui/Lib/fat_io_lib/fat_access.c new file mode 100644 index 0000000..f55bd59 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_access.c @@ -0,0 +1,904 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// fatfs_init: Load FAT Parameters +//----------------------------------------------------------------------------- +int fatfs_init(struct fatfs *fs) +{ + uint8 num_of_fats; + uint16 reserved_sectors; + uint32 FATSz; + uint32 root_dir_sectors; + uint32 total_sectors; + uint32 data_sectors; + uint32 count_of_clusters; + uint8 valid_partition = 0; + + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have a read function (write function is optional) + if (!fs->disk_io.read_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // MBR: Sector 0 on the disk + // NOTE: Some removeable media does not have this. + + // Load MBR (LBA 0) into the 512 byte buffer + if (!fs->disk_io.read_media(0, fs->currentsector.sector, 1)) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Make Sure 0x55 and 0xAA are at end of sector + // (this should be the case regardless of the MBR or boot sector) + if (fs->currentsector.sector[SIGNATURE_POSITION] != 0x55 || fs->currentsector.sector[SIGNATURE_POSITION+1] != 0xAA) + return FAT_INIT_INVALID_SIGNATURE; + + // Now check again using the access function to prove endian conversion function + if (GET_16BIT_WORD(fs->currentsector.sector, SIGNATURE_POSITION) != SIGNATURE_VALUE) + return FAT_INIT_ENDIAN_ERROR; + + // Verify packed structures + if (sizeof(struct fat_dir_entry) != FAT_DIR_ENTRY_SIZE) + return FAT_INIT_STRUCT_PACKING; + + // Check the partition type code + switch(fs->currentsector.sector[PARTITION1_TYPECODE_LOCATION]) + { + case 0x0B: + case 0x06: + case 0x0C: + case 0x0E: + case 0x0F: + case 0x05: + valid_partition = 1; + break; + case 0x00: + valid_partition = 0; + break; + default: + if (fs->currentsector.sector[PARTITION1_TYPECODE_LOCATION] <= 0x06) + valid_partition = 1; + break; + } + + // Read LBA Begin for the file system + if (valid_partition) + fs->lba_begin = GET_32BIT_WORD(fs->currentsector.sector, PARTITION1_LBA_BEGIN_LOCATION); + // Else possibly MBR less disk + else + fs->lba_begin = 0; + + // Load Volume 1 table into sector buffer + // (We may already have this in the buffer if MBR less drive!) + if (!fs->disk_io.read_media(fs->lba_begin, fs->currentsector.sector, 1)) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Make sure there are 512 bytes per cluster + if (GET_16BIT_WORD(fs->currentsector.sector, 0x0B) != FAT_SECTOR_SIZE) + return FAT_INIT_INVALID_SECTOR_SIZE; + + // Load Parameters of FAT partition + fs->sectors_per_cluster = fs->currentsector.sector[BPB_SECPERCLUS]; + reserved_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_RSVDSECCNT); + num_of_fats = fs->currentsector.sector[BPB_NUMFATS]; + fs->root_entry_count = GET_16BIT_WORD(fs->currentsector.sector, BPB_ROOTENTCNT); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16) != 0) + fs->fat_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16); + else + fs->fat_sectors = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_FATSZ32); + + // For FAT32 (which this may be) + fs->rootdir_first_cluster = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_ROOTCLUS); + fs->fs_info_sector = GET_16BIT_WORD(fs->currentsector.sector, BPB_FAT32_FSINFO); + + // For FAT16 (which this may be), rootdir_first_cluster is actuall rootdir_first_sector + fs->rootdir_first_sector = reserved_sectors + (num_of_fats * fs->fat_sectors); + fs->rootdir_sectors = ((fs->root_entry_count * 32) + (FAT_SECTOR_SIZE - 1)) / FAT_SECTOR_SIZE; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (num_of_fats * fs->fat_sectors); + + if (GET_16BIT_WORD(fs->currentsector.sector, 0x1FE) != 0xAA55) // This signature should be AA55 + return FAT_INIT_INVALID_SIGNATURE; + + // Calculate the root dir sectors + root_dir_sectors = ((GET_16BIT_WORD(fs->currentsector.sector, BPB_ROOTENTCNT) * 32) + (GET_16BIT_WORD(fs->currentsector.sector, BPB_BYTSPERSEC) - 1)) / GET_16BIT_WORD(fs->currentsector.sector, BPB_BYTSPERSEC); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16) != 0) + FATSz = GET_16BIT_WORD(fs->currentsector.sector, BPB_FATSZ16); + else + FATSz = GET_32BIT_WORD(fs->currentsector.sector, BPB_FAT32_FATSZ32); + + if(GET_16BIT_WORD(fs->currentsector.sector, BPB_TOTSEC16) != 0) + total_sectors = GET_16BIT_WORD(fs->currentsector.sector, BPB_TOTSEC16); + else + total_sectors = GET_32BIT_WORD(fs->currentsector.sector, BPB_TOTSEC32); + + data_sectors = total_sectors - (GET_16BIT_WORD(fs->currentsector.sector, BPB_RSVDSECCNT) + (fs->currentsector.sector[BPB_NUMFATS] * FATSz) + root_dir_sectors); + + // Find out which version of FAT this is... + if (fs->sectors_per_cluster != 0) + { + count_of_clusters = data_sectors / fs->sectors_per_cluster; + + if(count_of_clusters < 4085) + // Volume is FAT12 + return FAT_INIT_WRONG_FILESYS_TYPE; + else if(count_of_clusters < 65525) + { + // Clear this FAT32 specific param + fs->rootdir_first_cluster = 0; + + // Volume is FAT16 + fs->fat_type = FAT_TYPE_16; + return FAT_INIT_OK; + } + else + { + // Volume is FAT32 + fs->fat_type = FAT_TYPE_32; + return FAT_INIT_OK; + } + } + else + return FAT_INIT_WRONG_FILESYS_TYPE; +} +//----------------------------------------------------------------------------- +// fatfs_lba_of_cluster: This function converts a cluster number into a sector / +// LBA number. +//----------------------------------------------------------------------------- +uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number) +{ + if (fs->fat_type == FAT_TYPE_16) + return (fs->cluster_begin_lba + (fs->root_entry_count * 32 / FAT_SECTOR_SIZE) + ((Cluster_Number-2) * fs->sectors_per_cluster)); + else + return ((fs->cluster_begin_lba + ((Cluster_Number-2)*fs->sectors_per_cluster))); +} +//----------------------------------------------------------------------------- +// fatfs_sector_read: +//----------------------------------------------------------------------------- +int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count) +{ + return fs->disk_io.read_media(lba, target, count); +} +//----------------------------------------------------------------------------- +// fatfs_sector_write: +//----------------------------------------------------------------------------- +int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count) +{ + return fs->disk_io.write_media(lba, target, count); +} +//----------------------------------------------------------------------------- +// fatfs_sector_reader: From the provided startcluster and sector offset +// Returns True if success, returns False if not (including if read out of range) +//----------------------------------------------------------------------------- +int fatfs_sector_reader(struct fatfs *fs, uint32 start_cluster, uint32 offset, uint8 *target) +{ + uint32 sector_to_read = 0; + uint32 cluster_to_read = 0; + uint32 cluster_chain = 0; + uint32 i; + uint32 lba; + + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && start_cluster == 0) + { + if (offset < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + offset; + else + return 0; + } + // FAT16/32 Other + else + { + // Set start of cluster chain to initial value + cluster_chain = start_cluster; + + // Find parameters + cluster_to_read = offset / fs->sectors_per_cluster; + sector_to_read = offset - (cluster_to_read*fs->sectors_per_cluster); + + // Follow chain to find cluster to read + for (i=0; idisk_io.read_media(lba, target, 1); + // Else read sector if not already loaded + else if (lba != fs->currentsector.address) + { + fs->currentsector.address = lba; + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + else + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_read_sector: Read from the provided cluster and sector offset +// Returns True if success, returns False if not +//----------------------------------------------------------------------------- +int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target) +{ + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && cluster == 0) + { + uint32 lba; + + // In FAT16, there are a limited amount of sectors in root dir! + if (sector < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + sector; + else + return 0; + + // User target buffer passed in + if (target) + { + // Read from disk + return fs->disk_io.read_media(lba, target, 1); + } + else + { + // Calculate read address + fs->currentsector.address = lba; + + // Read from disk + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + // FAT16/32 Other + else + { + // User target buffer passed in + if (target) + { + // Calculate read address + uint32 lba = fatfs_lba_of_cluster(fs, cluster) + sector; + + // Read from disk + return fs->disk_io.read_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = fatfs_lba_of_cluster(fs, cluster)+sector; + + // Read from disk + return fs->disk_io.read_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } +} +//----------------------------------------------------------------------------- +// fatfs_write_sector: Write to the provided cluster and sector offset +// Returns True if success, returns False if not +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target) +{ + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // FAT16 Root directory + if (fs->fat_type == FAT_TYPE_16 && cluster == 0) + { + uint32 lba; + + // In FAT16 we cannot extend the root dir! + if (sector < fs->rootdir_sectors) + lba = fs->lba_begin + fs->rootdir_first_sector + sector; + else + return 0; + + // User target buffer passed in + if (target) + { + // Write to disk + return fs->disk_io.write_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = lba; + + // Write to disk + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + // FAT16/32 Other + else + { + // User target buffer passed in + if (target) + { + // Calculate write address + uint32 lba = fatfs_lba_of_cluster(fs, cluster) + sector; + + // Write to disk + return fs->disk_io.write_media(lba, target, 1); + } + else + { + // Calculate write address + fs->currentsector.address = fatfs_lba_of_cluster(fs, cluster)+sector; + + // Write to disk + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } +} +#endif +//----------------------------------------------------------------------------- +// fatfs_show_details: Show the details about the filesystem +//----------------------------------------------------------------------------- +void fatfs_show_details(struct fatfs *fs) +{ + FAT_PRINTF(("FAT details:\r\n")); + FAT_PRINTF((" Type =%s", (fs->fat_type == FAT_TYPE_32) ? "FAT32": "FAT16")); + FAT_PRINTF((" Root Dir First Cluster = %x\r\n", fs->rootdir_first_cluster)); + FAT_PRINTF((" FAT Begin LBA = 0x%x\r\n",fs->fat_begin_lba)); + FAT_PRINTF((" Cluster Begin LBA = 0x%x\r\n",fs->cluster_begin_lba)); + FAT_PRINTF((" Sectors Per Cluster = %d\r\n", fs->sectors_per_cluster)); +} +//----------------------------------------------------------------------------- +// fatfs_get_root_cluster: Get the root dir cluster +//----------------------------------------------------------------------------- +uint32 fatfs_get_root_cluster(struct fatfs *fs) +{ + // NOTE: On FAT16 this will be 0 which has a special meaning... + return fs->rootdir_first_cluster; +} +//------------------------------------------------------------- +// fatfs_get_file_entry: Find the file entry for a filename +//------------------------------------------------------------- +uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *name_to_find, struct fat_dir_entry *sfEntry) +{ + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + int x=0; + char *long_filename = NULL; + char short_filename[13]; + struct lfn_cache lfn; + int dotRequired = 0; + struct fat_dir_entry *directoryEntry; + + fatfs_lfn_cache_init(&lfn, 1); + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + fatfs_lfn_cache_entry(&lfn, fs->currentsector.sector+recordoffset); + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + fatfs_lfn_cache_init(&lfn, 0); + + // Normal SFN Entry and Long text exists + else if (fatfs_entry_lfn_exists(&lfn, directoryEntry) ) + { + long_filename = fatfs_lfn_cache_get(&lfn); + + // Compare names to see if they match + if (fatfs_compare_names(long_filename, name_to_find)) + { + memcpy(sfEntry,directoryEntry,sizeof(struct fat_dir_entry)); + return 1; + } + + fatfs_lfn_cache_init(&lfn, 0); + } + else +#endif + // Normal Entry, only 8.3 Text + if (fatfs_entry_sfn_only(directoryEntry) ) + { + memset(short_filename, 0, sizeof(short_filename)); + + // Copy name to string + for (i=0; i<8; i++) + short_filename[i] = directoryEntry->Name[i]; + + // Extension + dotRequired = 0; + for (i=8; i<11; i++) + { + short_filename[i+1] = directoryEntry->Name[i]; + if (directoryEntry->Name[i] != ' ') + dotRequired = 1; + } + + // Dot only required if extension present + if (dotRequired) + { + // If not . or .. entry + if (short_filename[0]!='.') + short_filename[8] = '.'; + else + short_filename[8] = ' '; + } + else + short_filename[8] = ' '; + + // Compare names to see if they match + if (fatfs_compare_names(short_filename, name_to_find)) + { + memcpy(sfEntry,directoryEntry,sizeof(struct fat_dir_entry)); + return 1; + } + + fatfs_lfn_cache_init(&lfn, 0); + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +//------------------------------------------------------------- +// fatfs_sfn_exists: Check if a short filename exists. +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + else +#endif + // Normal Entry, only 8.3 Text + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char*)directoryEntry->Name, shortname, 11)==0) + return 1; + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//------------------------------------------------------------- +// fatfs_update_timestamps: Update date/time details +//------------------------------------------------------------- +#if FATFS_INC_TIME_DATE_SUPPORT +int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access) +{ + time_t time_now; + struct tm * time_info; + uint16 fat_time; + uint16 fat_date; + + // Get system time + time(&time_now); + + // Convert to local time + time_info = localtime(&time_now); + + // Convert time to FAT format + fat_time = fatfs_convert_to_fat_time(time_info->tm_hour, time_info->tm_min, time_info->tm_sec); + + // Convert date to FAT format + fat_date = fatfs_convert_to_fat_date(time_info->tm_mday, time_info->tm_mon + 1, time_info->tm_year + 1900); + + // Update requested fields + if (create) + { + directoryEntry->CrtTime[1] = fat_time >> 8; + directoryEntry->CrtTime[0] = fat_time >> 0; + directoryEntry->CrtDate[1] = fat_date >> 8; + directoryEntry->CrtDate[0] = fat_date >> 0; + } + + if (modify) + { + directoryEntry->WrtTime[1] = fat_time >> 8; + directoryEntry->WrtTime[0] = fat_time >> 0; + directoryEntry->WrtDate[1] = fat_date >> 8; + directoryEntry->WrtDate[0] = fat_date >> 0; + } + + if (access) + { + directoryEntry->LstAccDate[1] = fat_time >> 8; + directoryEntry->LstAccDate[0] = fat_time >> 0; + directoryEntry->LstAccDate[1] = fat_date >> 8; + directoryEntry->LstAccDate[0] = fat_date >> 0; + } + + return 1; +} +#endif +//------------------------------------------------------------- +// fatfs_update_file_length: Find a SFN entry and update it +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + + // Normal Entry, only 8.3 Text + else +#endif + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char*)directoryEntry->Name, shortname, 11)==0) + { + directoryEntry->FileSize = FAT_HTONL(fileLength); + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update access / modify time & date + fatfs_update_timestamps(directoryEntry, 0, 1, 1); +#endif + + // Update sfn entry + memcpy((uint8*)(fs->currentsector.sector+recordoffset), (uint8*)directoryEntry, sizeof(struct fat_dir_entry)); + + // Write sector back + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//------------------------------------------------------------- +// fatfs_mark_file_deleted: Find a SFN entry and mark if as deleted +// NOTE: shortname is XXXXXXXXYYY not XXXXXXXX.YYY +//------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname) +{ + uint8 item=0; + uint16 recordoffset = 0; + int x=0; + struct fat_dir_entry *directoryEntry; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, Cluster, x++, 0)) // If sector read was successfull + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if (fatfs_entry_lfn_text(directoryEntry) ) + ; + + // If Invalid record found delete any long file name information collated + else if (fatfs_entry_lfn_invalid(directoryEntry) ) + ; + + // Normal Entry, only 8.3 Text + else +#endif + if (fatfs_entry_sfn_only(directoryEntry) ) + { + if (strncmp((const char *)directoryEntry->Name, shortname, 11)==0) + { + // Mark as deleted + directoryEntry->Name[0] = FILE_HEADER_DELETED; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update access / modify time & date + fatfs_update_timestamps(directoryEntry, 0, 1, 1); +#endif + + // Update sfn entry + memcpy((uint8*)(fs->currentsector.sector+recordoffset), (uint8*)directoryEntry, sizeof(struct fat_dir_entry)); + + // Write sector back + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } + } + } // End of if + } + else + break; + } // End of while loop + + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_list_directory_start: Initialise a directory listing procedure +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster) +{ + dirls->cluster = StartCluster; + dirls->sector = 0; + dirls->offset = 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_list_directory_next: Get the next entry in the directory. +// Returns: 1 = found, 0 = end of listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry) +{ + uint8 i,item; + uint16 recordoffset; + struct fat_dir_entry *directoryEntry; + char *long_filename = NULL; + char short_filename[13]; + struct lfn_cache lfn; + int dotRequired = 0; + int result = 0; + + // Initialise LFN cache first + fatfs_lfn_cache_init(&lfn, 0); + + while (1) + { + // If data read OK + if (fatfs_sector_reader(fs, dirls->cluster, dirls->sector, 0)) + { + // Maximum of 16 directory entries + for (item = dirls->offset; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Increase directory offset + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + +#if FATFS_INC_LFN_SUPPORT + // Long File Name Text Found + if ( fatfs_entry_lfn_text(directoryEntry) ) + fatfs_lfn_cache_entry(&lfn, fs->currentsector.sector+recordoffset); + + // If Invalid record found delete any long file name information collated + else if ( fatfs_entry_lfn_invalid(directoryEntry) ) + fatfs_lfn_cache_init(&lfn, 0); + + // Normal SFN Entry and Long text exists + else if (fatfs_entry_lfn_exists(&lfn, directoryEntry) ) + { + // Get text + long_filename = fatfs_lfn_cache_get(&lfn); + strncpy(entry->filename, long_filename, FATFS_MAX_LONG_FILENAME-1); + + if (fatfs_entry_is_dir(directoryEntry)) + entry->is_dir = 1; + else + entry->is_dir = 0; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Get time / dates + entry->create_time = ((uint16)directoryEntry->CrtTime[1] << 8) | directoryEntry->CrtTime[0]; + entry->create_date = ((uint16)directoryEntry->CrtDate[1] << 8) | directoryEntry->CrtDate[0]; + entry->access_date = ((uint16)directoryEntry->LstAccDate[1] << 8) | directoryEntry->LstAccDate[0]; + entry->write_time = ((uint16)directoryEntry->WrtTime[1] << 8) | directoryEntry->WrtTime[0]; + entry->write_date = ((uint16)directoryEntry->WrtDate[1] << 8) | directoryEntry->WrtDate[0]; +#endif + + entry->size = FAT_HTONL(directoryEntry->FileSize); + entry->cluster = (FAT_HTONS(directoryEntry->FstClusHI)<<16) | FAT_HTONS(directoryEntry->FstClusLO); + + // Next starting position + dirls->offset = item + 1; + result = 1; + return 1; + } + // Normal Entry, only 8.3 Text + else +#endif + if ( fatfs_entry_sfn_only(directoryEntry) ) + { + fatfs_lfn_cache_init(&lfn, 0); + + memset(short_filename, 0, sizeof(short_filename)); + + // Copy name to string + for (i=0; i<8; i++) + short_filename[i] = directoryEntry->Name[i]; + + // Extension + dotRequired = 0; + for (i=8; i<11; i++) + { + short_filename[i+1] = directoryEntry->Name[i]; + if (directoryEntry->Name[i] != ' ') + dotRequired = 1; + } + + // Dot only required if extension present + if (dotRequired) + { + // If not . or .. entry + if (short_filename[0]!='.') + short_filename[8] = '.'; + else + short_filename[8] = ' '; + } + else + short_filename[8] = ' '; + + fatfs_get_sfn_display_name(entry->filename, short_filename); + + if (fatfs_entry_is_dir(directoryEntry)) + entry->is_dir = 1; + else + entry->is_dir = 0; + +#if FATFS_INC_TIME_DATE_SUPPORT + // Get time / dates + entry->create_time = ((uint16)directoryEntry->CrtTime[1] << 8) | directoryEntry->CrtTime[0]; + entry->create_date = ((uint16)directoryEntry->CrtDate[1] << 8) | directoryEntry->CrtDate[0]; + entry->access_date = ((uint16)directoryEntry->LstAccDate[1] << 8) | directoryEntry->LstAccDate[0]; + entry->write_time = ((uint16)directoryEntry->WrtTime[1] << 8) | directoryEntry->WrtTime[0]; + entry->write_date = ((uint16)directoryEntry->WrtDate[1] << 8) | directoryEntry->WrtDate[0]; +#endif + + entry->size = FAT_HTONL(directoryEntry->FileSize); + entry->cluster = (FAT_HTONS(directoryEntry->FstClusHI)<<16) | FAT_HTONS(directoryEntry->FstClusLO); + + // Next starting position + dirls->offset = item + 1; + result = 1; + return 1; + } + }// end of for + + // If reached end of the dir move onto next sector + dirls->sector++; + dirls->offset = 0; + } + else + break; + } + + return result; +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_access.h b/src/gui/Lib/fat_io_lib/fat_access.h new file mode 100644 index 0000000..1752387 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_access.h @@ -0,0 +1,133 @@ +#ifndef __FAT_ACCESS_H__ +#define __FAT_ACCESS_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define FAT_INIT_OK 0 +#define FAT_INIT_MEDIA_ACCESS_ERROR (-1) +#define FAT_INIT_INVALID_SECTOR_SIZE (-2) +#define FAT_INIT_INVALID_SIGNATURE (-3) +#define FAT_INIT_ENDIAN_ERROR (-4) +#define FAT_INIT_WRONG_FILESYS_TYPE (-5) +#define FAT_INIT_WRONG_PARTITION_TYPE (-6) +#define FAT_INIT_STRUCT_PACKING (-7) + +#define FAT_DIR_ENTRIES_PER_SECTOR (FAT_SECTOR_SIZE / FAT_DIR_ENTRY_SIZE) + +//----------------------------------------------------------------------------- +// Function Pointers +//----------------------------------------------------------------------------- +typedef int (*fn_diskio_read) (uint32 sector, uint8 *buffer, uint32 sector_count); +typedef int (*fn_diskio_write)(uint32 sector, uint8 *buffer, uint32 sector_count); + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct disk_if +{ + // User supplied function pointers for disk IO + fn_diskio_read read_media; + fn_diskio_write write_media; +}; + +// Forward declaration +struct fat_buffer; + +struct fat_buffer +{ + uint8 sector[FAT_SECTOR_SIZE * FAT_BUFFER_SECTORS]; + uint32 address; + int dirty; + uint8 * ptr; + + // Next in chain of sector buffers + struct fat_buffer *next; +}; + +typedef enum eFatType +{ + FAT_TYPE_16, + FAT_TYPE_32 +} tFatType; + +struct fatfs +{ + // Filesystem globals + uint8 sectors_per_cluster; + uint32 cluster_begin_lba; + uint32 rootdir_first_cluster; + uint32 rootdir_first_sector; + uint32 rootdir_sectors; + uint32 fat_begin_lba; + uint16 fs_info_sector; + uint32 lba_begin; + uint32 fat_sectors; + uint32 next_free_cluster; + uint16 root_entry_count; + uint16 reserved_sectors; + uint8 num_of_fats; + tFatType fat_type; + + // Disk/Media API + struct disk_if disk_io; + + // [Optional] Thread Safety + void (*fl_lock)(void); + void (*fl_unlock)(void); + + // Working buffer + struct fat_buffer currentsector; + + // FAT Buffer + struct fat_buffer *fat_buffer_head; + struct fat_buffer fat_buffers[FAT_BUFFERS]; +}; + +struct fs_dir_list_status +{ + uint32 sector; + uint32 cluster; + uint8 offset; +}; + +struct fs_dir_ent +{ + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 is_dir; + uint32 cluster; + uint32 size; + +#if FATFS_INC_TIME_DATE_SUPPORT + uint16 access_date; + uint16 write_time; + uint16 write_date; + uint16 create_date; + uint16 create_time; +#endif +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_init(struct fatfs *fs); +uint32 fatfs_lba_of_cluster(struct fatfs *fs, uint32 Cluster_Number); +int fatfs_sector_reader(struct fatfs *fs, uint32 Startcluster, uint32 offset, uint8 *target); +int fatfs_sector_read(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_sector_write(struct fatfs *fs, uint32 lba, uint8 *target, uint32 count); +int fatfs_read_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +int fatfs_write_sector(struct fatfs *fs, uint32 cluster, uint32 sector, uint8 *target); +void fatfs_show_details(struct fatfs *fs); +uint32 fatfs_get_root_cluster(struct fatfs *fs); +uint32 fatfs_get_file_entry(struct fatfs *fs, uint32 Cluster, char *nametofind, struct fat_dir_entry *sfEntry); +int fatfs_sfn_exists(struct fatfs *fs, uint32 Cluster, char *shortname); +int fatfs_update_file_length(struct fatfs *fs, uint32 Cluster, char *shortname, uint32 fileLength); +int fatfs_mark_file_deleted(struct fatfs *fs, uint32 Cluster, char *shortname); +void fatfs_list_directory_start(struct fatfs *fs, struct fs_dir_list_status *dirls, uint32 StartCluster); +int fatfs_list_directory_next(struct fatfs *fs, struct fs_dir_list_status *dirls, struct fs_dir_ent *entry); +int fatfs_update_timestamps(struct fat_dir_entry *directoryEntry, int create, int modify, int access); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_cache.c b/src/gui/Lib/fat_io_lib/fat_cache.c new file mode 100644 index 0000000..de77e6a --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_cache.c @@ -0,0 +1,91 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_cache.h" + +// Per file cluster chain caching used to improve performance. +// This does not have to be enabled for architectures with low +// memory space. + +//----------------------------------------------------------------------------- +// fatfs_cache_init: +//----------------------------------------------------------------------------- +int fatfs_cache_init(struct fatfs *fs, FL_FILE *file) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + int i; + + for (i=0;icluster_cache_idx[i] = 0xFFFFFFFF; // Not used + file->cluster_cache_data[i] = 0; + } +#endif + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_cache_get_next_cluster: +//----------------------------------------------------------------------------- +int fatfs_cache_get_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 *pNextCluster) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 slot = clusterIdx % FAT_CLUSTER_CACHE_ENTRIES; + + if (file->cluster_cache_idx[slot] == clusterIdx) + { + *pNextCluster = file->cluster_cache_data[slot]; + return 1; + } +#endif + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_cache_set_next_cluster: +//----------------------------------------------------------------------------- +int fatfs_cache_set_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 nextCluster) +{ +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 slot = clusterIdx % FAT_CLUSTER_CACHE_ENTRIES; + + if (file->cluster_cache_idx[slot] == clusterIdx) + file->cluster_cache_data[slot] = nextCluster; + else + { + file->cluster_cache_idx[slot] = clusterIdx; + file->cluster_cache_data[slot] = nextCluster; + } +#endif + + return 1; +} diff --git a/src/gui/Lib/fat_io_lib/fat_cache.h b/src/gui/Lib/fat_io_lib/fat_cache.h new file mode 100644 index 0000000..348d5d3 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_cache.h @@ -0,0 +1,13 @@ +#ifndef __FAT_CACHE_H__ +#define __FAT_CACHE_H__ + +#include "fat_filelib.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_cache_init(struct fatfs *fs, FL_FILE *file); +int fatfs_cache_get_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 *pNextCluster); +int fatfs_cache_set_next_cluster(struct fatfs *fs, FL_FILE *file, uint32 clusterIdx, uint32 nextCluster); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_defs.h b/src/gui/Lib/fat_io_lib/fat_defs.h new file mode 100644 index 0000000..5fe8d6a --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_defs.h @@ -0,0 +1,128 @@ +#ifndef __FAT_DEFS_H__ +#define __FAT_DEFS_H__ + +#include "fat_opts.h" +#include "fat_types.h" + +//----------------------------------------------------------------------------- +// FAT32 Offsets +// Name Offset +//----------------------------------------------------------------------------- + +// Boot Sector +#define BS_JMPBOOT 0 // Length = 3 +#define BS_OEMNAME 3 // Length = 8 +#define BPB_BYTSPERSEC 11 // Length = 2 +#define BPB_SECPERCLUS 13 // Length = 1 +#define BPB_RSVDSECCNT 14 // Length = 2 +#define BPB_NUMFATS 16 // Length = 1 +#define BPB_ROOTENTCNT 17 // Length = 2 +#define BPB_TOTSEC16 19 // Length = 2 +#define BPB_MEDIA 21 // Length = 1 +#define BPB_FATSZ16 22 // Length = 2 +#define BPB_SECPERTRK 24 // Length = 2 +#define BPB_NUMHEADS 26 // Length = 2 +#define BPB_HIDDSEC 28 // Length = 4 +#define BPB_TOTSEC32 32 // Length = 4 + +// FAT 12/16 +#define BS_FAT_DRVNUM 36 // Length = 1 +#define BS_FAT_BOOTSIG 38 // Length = 1 +#define BS_FAT_VOLID 39 // Length = 4 +#define BS_FAT_VOLLAB 43 // Length = 11 +#define BS_FAT_FILSYSTYPE 54 // Length = 8 + +// FAT 32 +#define BPB_FAT32_FATSZ32 36 // Length = 4 +#define BPB_FAT32_EXTFLAGS 40 // Length = 2 +#define BPB_FAT32_FSVER 42 // Length = 2 +#define BPB_FAT32_ROOTCLUS 44 // Length = 4 +#define BPB_FAT32_FSINFO 48 // Length = 2 +#define BPB_FAT32_BKBOOTSEC 50 // Length = 2 +#define BS_FAT32_DRVNUM 64 // Length = 1 +#define BS_FAT32_BOOTSIG 66 // Length = 1 +#define BS_FAT32_VOLID 67 // Length = 4 +#define BS_FAT32_VOLLAB 71 // Length = 11 +#define BS_FAT32_FILSYSTYPE 82 // Length = 8 + +//----------------------------------------------------------------------------- +// FAT Types +//----------------------------------------------------------------------------- +#define FAT_TYPE_FAT12 1 +#define FAT_TYPE_FAT16 2 +#define FAT_TYPE_FAT32 3 + +//----------------------------------------------------------------------------- +// FAT32 Specific Statics +//----------------------------------------------------------------------------- +#define SIGNATURE_POSITION 510 +#define SIGNATURE_VALUE 0xAA55 +#define PARTITION1_TYPECODE_LOCATION 450 +#define FAT32_TYPECODE1 0x0B +#define FAT32_TYPECODE2 0x0C +#define PARTITION1_LBA_BEGIN_LOCATION 454 +#define PARTITION1_SIZE_LOCATION 458 + +#define FAT_DIR_ENTRY_SIZE 32 +#define FAT_SFN_SIZE_FULL 11 +#define FAT_SFN_SIZE_PARTIAL 8 + +//----------------------------------------------------------------------------- +// FAT32 File Attributes and Types +//----------------------------------------------------------------------------- +#define FILE_ATTR_READ_ONLY 0x01 +#define FILE_ATTR_HIDDEN 0x02 +#define FILE_ATTR_SYSTEM 0x04 +#define FILE_ATTR_SYSHID 0x06 +#define FILE_ATTR_VOLUME_ID 0x08 +#define FILE_ATTR_DIRECTORY 0x10 +#define FILE_ATTR_ARCHIVE 0x20 +#define FILE_ATTR_LFN_TEXT 0x0F +#define FILE_HEADER_BLANK 0x00 +#define FILE_HEADER_DELETED 0xE5 +#define FILE_TYPE_DIR 0x10 +#define FILE_TYPE_FILE 0x20 + +//----------------------------------------------------------------------------- +// Time / Date details +//----------------------------------------------------------------------------- +#define FAT_TIME_HOURS_SHIFT 11 +#define FAT_TIME_HOURS_MASK 0x1F +#define FAT_TIME_MINUTES_SHIFT 5 +#define FAT_TIME_MINUTES_MASK 0x3F +#define FAT_TIME_SECONDS_SHIFT 0 +#define FAT_TIME_SECONDS_MASK 0x1F +#define FAT_TIME_SECONDS_SCALE 2 +#define FAT_DATE_YEAR_SHIFT 9 +#define FAT_DATE_YEAR_MASK 0x7F +#define FAT_DATE_MONTH_SHIFT 5 +#define FAT_DATE_MONTH_MASK 0xF +#define FAT_DATE_DAY_SHIFT 0 +#define FAT_DATE_DAY_MASK 0x1F +#define FAT_DATE_YEAR_OFFSET 1980 + +//----------------------------------------------------------------------------- +// Other Defines +//----------------------------------------------------------------------------- +#define FAT32_LAST_CLUSTER 0xFFFFFFFF +#define FAT32_INVALID_CLUSTER 0xFFFFFFFF + +STRUCT_PACK_BEGIN +struct fat_dir_entry STRUCT_PACK +{ + uint8 Name[11]; + uint8 Attr; + uint8 NTRes; + uint8 CrtTimeTenth; + uint8 CrtTime[2]; + uint8 CrtDate[2]; + uint8 LstAccDate[2]; + uint16 FstClusHI; + uint8 WrtTime[2]; + uint8 WrtDate[2]; + uint16 FstClusLO; + uint32 FileSize; +} STRUCT_PACKED; +STRUCT_PACK_END + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_filelib.c b/src/gui/Lib/fat_io_lib/fat_filelib.c new file mode 100644 index 0000000..2c4a236 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_filelib.c @@ -0,0 +1,1603 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_misc.h" +#include "fat_string.h" +#include "fat_filelib.h" +#include "fat_cache.h" + +//----------------------------------------------------------------------------- +// Locals +//----------------------------------------------------------------------------- +static FL_FILE _files[FATFS_MAX_OPEN_FILES]; +static int _filelib_init = 0; +static int _filelib_valid = 0; +static struct fatfs _fs; +static struct fat_list _open_file_list; +static struct fat_list _free_file_list; + +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- + +// Macro for checking if file lib is initialised +#define CHECK_FL_INIT() { if (_filelib_init==0) fl_init(); } + +#define FL_LOCK(a) do { if ((a)->fl_lock) (a)->fl_lock(); } while (0) +#define FL_UNLOCK(a) do { if ((a)->fl_unlock) (a)->fl_unlock(); } while (0) + +//----------------------------------------------------------------------------- +// Local Functions +//----------------------------------------------------------------------------- +static void _fl_init(); + +//----------------------------------------------------------------------------- +// _allocate_file: Find a slot in the open files buffer for a new file +//----------------------------------------------------------------------------- +static FL_FILE* _allocate_file(void) +{ + // Allocate free file + struct fat_node *node = fat_list_pop_head(&_free_file_list); + + // Add to open list + if (node) + fat_list_insert_last(&_open_file_list, node); + + return fat_list_entry(node, FL_FILE, list_node); +} +//----------------------------------------------------------------------------- +// _check_file_open: Returns true if the file is already open +//----------------------------------------------------------------------------- +static int _check_file_open(FL_FILE* file) +{ + struct fat_node *node; + + // Compare open files + fat_list_for_each(&_open_file_list, node) + { + FL_FILE* openFile = fat_list_entry(node, FL_FILE, list_node); + + // If not the current file + if (openFile != file) + { + // Compare path and name + if ( (fatfs_compare_names(openFile->path,file->path)) && (fatfs_compare_names(openFile->filename,file->filename)) ) + return 1; + } + } + + return 0; +} +//----------------------------------------------------------------------------- +// _free_file: Free open file handle +//----------------------------------------------------------------------------- +static void _free_file(FL_FILE* file) +{ + // Remove from open list + fat_list_remove(&_open_file_list, &file->list_node); + + // Add to free list + fat_list_insert_last(&_free_file_list, &file->list_node); +} + +//----------------------------------------------------------------------------- +// Low Level +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// _open_directory: Cycle through path string to find the start cluster +// address of the highest subdir. +//----------------------------------------------------------------------------- +static int _open_directory(char *path, uint32 *pathCluster) +{ + int levels; + int sublevel; + char currentfolder[FATFS_MAX_LONG_FILENAME]; + struct fat_dir_entry sfEntry; + uint32 startcluster; + + // Set starting cluster to root cluster + startcluster = fatfs_get_root_cluster(&_fs); + + // Find number of levels + levels = fatfs_total_path_levels(path); + + // Cycle through each level and get the start sector + for (sublevel=0;sublevel<(levels+1);sublevel++) + { + if (fatfs_get_substring(path, sublevel, currentfolder, sizeof(currentfolder)) == -1) + return 0; + + // Find clusteraddress for folder (currentfolder) + if (fatfs_get_file_entry(&_fs, startcluster, currentfolder,&sfEntry)) + { + // Check entry is folder + if (fatfs_entry_is_dir(&sfEntry)) + startcluster = ((FAT_HTONS((uint32)sfEntry.FstClusHI))<<16) + FAT_HTONS(sfEntry.FstClusLO); + else + return 0; + } + else + return 0; + } + + *pathCluster = startcluster; + return 1; +} +//----------------------------------------------------------------------------- +// _create_directory: Cycle through path string and create the end directory +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static int _create_directory(char *path) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + char shortFilename[FAT_SFN_SIZE_FULL]; + int tailNum = 0; + int i; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return 0; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)path, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return 0; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return 0; + } + + // If file is in the root dir + if (file->path[0] == 0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return 0; + } + } + + // Check if same filename exists in directory + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry) == 1) + { + _free_file(file); + return 0; + } + + file->startcluster = 0; + + // Create the file space for the folder (at least one clusters worth!) + if (!fatfs_allocate_free_space(&_fs, 1, &file->startcluster, 1)) + { + _free_file(file); + return 0; + } + + // Erase new directory cluster + memset(file->file_data_sector, 0x00, FAT_SECTOR_SIZE); + for (i=0;i<_fs.sectors_per_cluster;i++) + { + if (!fatfs_write_sector(&_fs, file->startcluster, i, file->file_data_sector)) + { + _free_file(file); + return 0; + } + } + +#if FATFS_INC_LFN_SUPPORT + + // Generate a short filename & tail + tailNum = 0; + do + { + // Create a standard short filename (without tail) + fatfs_lfn_create_sfn(shortFilename, file->filename); + + // If second hit or more, generate a ~n tail + if (tailNum != 0) + fatfs_lfn_generate_tail((char*)file->shortfilename, shortFilename, tailNum); + // Try with no tail if first entry + else + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already or not + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename) == 0) + break; + + tailNum++; + } + while (tailNum < 9999); + + // We reached the max number of duplicate short file names (unlikely!) + if (tailNum == 9999) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } +#else + // Create a standard short filename (without tail) + if (!fatfs_lfn_create_sfn(shortFilename, file->filename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } + + // Copy to SFN space + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } +#endif + + // Add file to disk + if (!fatfs_add_file_entry(&_fs, file->parentcluster, (char*)file->filename, (char*)file->shortfilename, file->startcluster, 0, 1)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return 0; + } + + // General + file->filelength = 0; + file->bytenum = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_fat_purge(&_fs); + + _free_file(file); + return 1; +} +#endif +//----------------------------------------------------------------------------- +// _open_file: Open a file for reading +//----------------------------------------------------------------------------- +static FL_FILE* _open_file(const char *path) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return NULL; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)path, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return NULL; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return NULL; + } + + // If file is in the root dir + if (file->path[0]==0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return NULL; + } + } + + // Using dir cluster address search for filename + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry)) + // Make sure entry is file not dir! + if (fatfs_entry_is_file(&sfEntry)) + { + // Initialise file details + memcpy(file->shortfilename, sfEntry.Name, FAT_SFN_SIZE_FULL); + file->filelength = FAT_HTONL(sfEntry.FileSize); + file->bytenum = 0; + file->startcluster = ((FAT_HTONS((uint32)sfEntry.FstClusHI))<<16) + FAT_HTONS(sfEntry.FstClusLO); + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_cache_init(&_fs, file); + + fatfs_fat_purge(&_fs); + + return file; + } + + _free_file(file); + return NULL; +} +//----------------------------------------------------------------------------- +// _create_file: Create a new file +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static FL_FILE* _create_file(const char *filename) +{ + FL_FILE* file; + struct fat_dir_entry sfEntry; + char shortFilename[FAT_SFN_SIZE_FULL]; + int tailNum = 0; + + // No write access? + if (!_fs.disk_io.write_media) + return NULL; + + // Allocate a new file handle + file = _allocate_file(); + if (!file) + return NULL; + + // Clear filename + memset(file->path, '\0', sizeof(file->path)); + memset(file->filename, '\0', sizeof(file->filename)); + + // Split full path into filename and directory path + if (fatfs_split_path((char*)filename, file->path, sizeof(file->path), file->filename, sizeof(file->filename)) == -1) + { + _free_file(file); + return NULL; + } + + // Check if file already open + if (_check_file_open(file)) + { + _free_file(file); + return NULL; + } + + // If file is in the root dir + if (file->path[0] == 0) + file->parentcluster = fatfs_get_root_cluster(&_fs); + else + { + // Find parent directory start cluster + if (!_open_directory(file->path, &file->parentcluster)) + { + _free_file(file); + return NULL; + } + } + + // Check if same filename exists in directory + if (fatfs_get_file_entry(&_fs, file->parentcluster, file->filename,&sfEntry) == 1) + { + _free_file(file); + return NULL; + } + + file->startcluster = 0; + + // Create the file space for the file (at least one clusters worth!) + if (!fatfs_allocate_free_space(&_fs, 1, &file->startcluster, 1)) + { + _free_file(file); + return NULL; + } + +#if FATFS_INC_LFN_SUPPORT + // Generate a short filename & tail + tailNum = 0; + do + { + // Create a standard short filename (without tail) + fatfs_lfn_create_sfn(shortFilename, file->filename); + + // If second hit or more, generate a ~n tail + if (tailNum != 0) + fatfs_lfn_generate_tail((char*)file->shortfilename, shortFilename, tailNum); + // Try with no tail if first entry + else + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already or not + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename) == 0) + break; + + tailNum++; + } + while (tailNum < 9999); + + // We reached the max number of duplicate short file names (unlikely!) + if (tailNum == 9999) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } +#else + // Create a standard short filename (without tail) + if (!fatfs_lfn_create_sfn(shortFilename, file->filename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } + + // Copy to SFN space + memcpy(file->shortfilename, shortFilename, FAT_SFN_SIZE_FULL); + + // Check if entry exists already + if (fatfs_sfn_exists(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } +#endif + + // Add file to disk + if (!fatfs_add_file_entry(&_fs, file->parentcluster, (char*)file->filename, (char*)file->shortfilename, file->startcluster, 0, 0)) + { + // Delete allocated space + fatfs_free_cluster_chain(&_fs, file->startcluster); + + _free_file(file); + return NULL; + } + + // General + file->filelength = 0; + file->bytenum = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Quick lookup for next link in the chain + file->last_fat_lookup.ClusterIdx = 0xFFFFFFFF; + file->last_fat_lookup.CurrentCluster = 0xFFFFFFFF; + + fatfs_cache_init(&_fs, file); + + fatfs_fat_purge(&_fs); + + return file; +} +#endif +//----------------------------------------------------------------------------- +// _read_sectors: Read sector(s) from disk to file +//----------------------------------------------------------------------------- +static uint32 _read_sectors(FL_FILE* file, uint32 offset, uint8 *buffer, uint32 count) +{ + uint32 Sector = 0; + uint32 ClusterIdx = 0; + uint32 Cluster = 0; + uint32 i; + uint32 lba; + + // Find cluster index within file & sector with cluster + ClusterIdx = offset / _fs.sectors_per_cluster; + Sector = offset - (ClusterIdx * _fs.sectors_per_cluster); + + // Limit number of sectors read to the number remaining in this cluster + if ((Sector + count) > _fs.sectors_per_cluster) + count = _fs.sectors_per_cluster - Sector; + + // Quick lookup for next link in the chain + if (ClusterIdx == file->last_fat_lookup.ClusterIdx) + Cluster = file->last_fat_lookup.CurrentCluster; + // Else walk the chain + else + { + // Starting from last recorded cluster? + if (ClusterIdx && ClusterIdx == file->last_fat_lookup.ClusterIdx + 1) + { + i = file->last_fat_lookup.ClusterIdx; + Cluster = file->last_fat_lookup.CurrentCluster; + } + // Start searching from the beginning.. + else + { + // Set start of cluster chain to initial value + i = 0; + Cluster = file->startcluster; + } + + // Follow chain to find cluster to read + for ( ;ilast_fat_lookup.CurrentCluster = Cluster; + file->last_fat_lookup.ClusterIdx = ClusterIdx; + } + } + + // If end of cluster chain then return false + if (Cluster == FAT32_LAST_CLUSTER) + return 0; + + // Calculate sector address + lba = fatfs_lba_of_cluster(&_fs, Cluster) + Sector; + + // Read sector of file + if (fatfs_sector_read(&_fs, lba, buffer, count)) + return count; + else + return 0; +} + +//----------------------------------------------------------------------------- +// External API +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// fl_init: Initialise library +//----------------------------------------------------------------------------- +void fl_init(void) +{ + int i; + + fat_list_init(&_free_file_list); + fat_list_init(&_open_file_list); + + // Add all file objects to free list + for (i=0;iflags = flags; + + FL_UNLOCK(&_fs); + return file; +} +//----------------------------------------------------------------------------- +// _write_sectors: Write sector(s) to disk +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +static uint32 _write_sectors(FL_FILE* file, uint32 offset, uint8 *buf, uint32 count) +{ + uint32 SectorNumber = 0; + uint32 ClusterIdx = 0; + uint32 Cluster = 0; + uint32 LastCluster = FAT32_LAST_CLUSTER; + uint32 i; + uint32 lba; + uint32 TotalWriteCount = count; + + // Find values for Cluster index & sector within cluster + ClusterIdx = offset / _fs.sectors_per_cluster; + SectorNumber = offset - (ClusterIdx * _fs.sectors_per_cluster); + + // Limit number of sectors written to the number remaining in this cluster + if ((SectorNumber + count) > _fs.sectors_per_cluster) + count = _fs.sectors_per_cluster - SectorNumber; + + // Quick lookup for next link in the chain + if (ClusterIdx == file->last_fat_lookup.ClusterIdx) + Cluster = file->last_fat_lookup.CurrentCluster; + // Else walk the chain + else + { + // Starting from last recorded cluster? + if (ClusterIdx && ClusterIdx == file->last_fat_lookup.ClusterIdx + 1) + { + i = file->last_fat_lookup.ClusterIdx; + Cluster = file->last_fat_lookup.CurrentCluster; + } + // Start searching from the beginning.. + else + { + // Set start of cluster chain to initial value + i = 0; + Cluster = file->startcluster; + } + + // Follow chain to find cluster to read + for ( ;ilast_fat_lookup.CurrentCluster = Cluster; + file->last_fat_lookup.ClusterIdx = ClusterIdx; + } + + // Calculate write address + lba = fatfs_lba_of_cluster(&_fs, Cluster) + SectorNumber; + + if (fatfs_sector_write(&_fs, lba, buf, count)) + return count; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_fflush: Flush un-written data to the file +//----------------------------------------------------------------------------- +int fl_fflush(void *f) +{ +#if FATFS_INC_WRITE_SUPPORT + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (file) + { + FL_LOCK(&_fs); + + // If some write data still in buffer + if (file->file_data_dirty) + { + // Write back current sector before loading next + if (_write_sectors(file, file->file_data_address, file->file_data_sector, 1)) + file->file_data_dirty = 0; + } + + FL_UNLOCK(&_fs); + } +#endif + return 0; +} +//----------------------------------------------------------------------------- +// fl_fclose: Close an open file +//----------------------------------------------------------------------------- +void fl_fclose(void *f) +{ + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (file) + { + FL_LOCK(&_fs); + + // Flush un-written data to file + fl_fflush(f); + + // File size changed? + if (file->filelength_changed) + { +#if FATFS_INC_WRITE_SUPPORT + // Update filesize in directory + fatfs_update_file_length(&_fs, file->parentcluster, (char*)file->shortfilename, file->filelength); +#endif + file->filelength_changed = 0; + } + + file->bytenum = 0; + file->filelength = 0; + file->startcluster = 0; + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + file->filelength_changed = 0; + + // Free file handle + _free_file(file); + + fatfs_fat_purge(&_fs); + + FL_UNLOCK(&_fs); + } +} +//----------------------------------------------------------------------------- +// fl_fgetc: Get a character in the stream +//----------------------------------------------------------------------------- +int fl_fgetc(void *f) +{ + int res; + uint8 data = 0; + + res = fl_fread(&data, 1, 1, f); + if (res == 1) + return (int)data; + else + return res; +} +//----------------------------------------------------------------------------- +// fl_fgets: Get a string from a stream +//----------------------------------------------------------------------------- +char *fl_fgets(char *s, int n, void *f) +{ + int idx = 0; + + // Space for null terminator? + if (n > 0) + { + // While space (+space for null terminator) + while (idx < (n-1)) + { + int ch = fl_fgetc(f); + + // EOF / Error? + if (ch < 0) + break; + + // Store character read from stream + s[idx++] = (char)ch; + + // End of line? + if (ch == '\n') + break; + } + + if (idx > 0) + s[idx] = '\0'; + } + + return (idx > 0) ? s : 0; +} +//----------------------------------------------------------------------------- +// fl_fread: Read a block of data from the file +//----------------------------------------------------------------------------- +int fl_fread(void * buffer, int size, int length, void *f ) +{ + uint32 sector; + uint32 offset; + int copyCount; + int count = size * length; + int bytesRead = 0; + + FL_FILE *file = (FL_FILE *)f; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (buffer==NULL || file==NULL) + return -1; + + // No read permissions + if (!(file->flags & FILE_READ)) + return -1; + + // Nothing to be done + if (!count) + return 0; + + // Check if read starts past end of file + if (file->bytenum >= file->filelength) + return -1; + + // Limit to file size + if ( (file->bytenum + count) > file->filelength ) + count = file->filelength - file->bytenum; + + // Calculate start sector + sector = file->bytenum / FAT_SECTOR_SIZE; + + // Offset to start copying data from first sector + offset = file->bytenum % FAT_SECTOR_SIZE; + + while (bytesRead < count) + { + // Read whole sector, read from media directly into target buffer + if ((offset == 0) && ((count - bytesRead) >= FAT_SECTOR_SIZE)) + { + // Read as many sectors as possible into target buffer + uint32 sectorsRead = _read_sectors(file, sector, (uint8*)((uint8*)buffer + bytesRead), (count - bytesRead) / FAT_SECTOR_SIZE); + if (sectorsRead) + { + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE * sectorsRead; + + // Move onto next sector and reset copy offset + sector+= sectorsRead; + offset = 0; + } + else + break; + } + else + { + // Do we need to re-read the sector? + if (file->file_data_address != sector) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + // Get LBA of sector offset within file + if (!_read_sectors(file, sector, file->file_data_sector, 1)) + // Read failed - out of range (probably) + break; + + file->file_data_address = sector; + file->file_data_dirty = 0; + } + + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE - offset; + + // Only require some of this sector? + if (copyCount > (count - bytesRead)) + copyCount = (count - bytesRead); + + // Copy to application buffer + memcpy( (uint8*)((uint8*)buffer + bytesRead), (uint8*)(file->file_data_sector + offset), copyCount); + + // Move onto next sector and reset copy offset + sector++; + offset = 0; + } + + // Increase total read count + bytesRead += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + } + + return bytesRead; +} +//----------------------------------------------------------------------------- +// fl_fseek: Seek to a specific place in the file +//----------------------------------------------------------------------------- +int fl_fseek( void *f, long offset, int origin ) +{ + FL_FILE *file = (FL_FILE *)f; + int res = -1; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (!file) + return -1; + + if (origin == SEEK_END && offset != 0) + return -1; + + FL_LOCK(&_fs); + + // Invalidate file buffer + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + + if (origin == SEEK_SET) + { + file->bytenum = (uint32)offset; + + if (file->bytenum > file->filelength) + file->bytenum = file->filelength; + + res = 0; + } + else if (origin == SEEK_CUR) + { + // Positive shift + if (offset >= 0) + { + file->bytenum += offset; + + if (file->bytenum > file->filelength) + file->bytenum = file->filelength; + } + // Negative shift + else + { + // Make shift positive + offset = -offset; + + // Limit to negative shift to start of file + if ((uint32)offset > file->bytenum) + file->bytenum = 0; + else + file->bytenum-= offset; + } + + res = 0; + } + else if (origin == SEEK_END) + { + file->bytenum = file->filelength; + res = 0; + } + else + res = -1; + + FL_UNLOCK(&_fs); + + return res; +} +//----------------------------------------------------------------------------- +// fl_fgetpos: Get the current file position +//----------------------------------------------------------------------------- +int fl_fgetpos(void *f , uint32 * position) +{ + FL_FILE *file = (FL_FILE *)f; + + if (!file) + return -1; + + FL_LOCK(&_fs); + + // Get position + *position = file->bytenum; + + FL_UNLOCK(&_fs); + + return 0; +} +//----------------------------------------------------------------------------- +// fl_ftell: Get the current file position +//----------------------------------------------------------------------------- +long fl_ftell(void *f) +{ + uint32 pos = 0; + + fl_fgetpos(f, &pos); + + return (long)pos; +} +//----------------------------------------------------------------------------- +// fl_feof: Is the file pointer at the end of the stream? +//----------------------------------------------------------------------------- +int fl_feof(void *f) +{ + FL_FILE *file = (FL_FILE *)f; + int res; + + if (!file) + return -1; + + FL_LOCK(&_fs); + + if (file->bytenum == file->filelength) + res = EOF; + else + res = 0; + + FL_UNLOCK(&_fs); + + return res; +} +//----------------------------------------------------------------------------- +// fl_fputc: Write a character to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fputc(int c, void *f) +{ + uint8 data = (uint8)c; + int res; + + res = fl_fwrite(&data, 1, 1, f); + if (res == 1) + return c; + else + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_fwrite: Write a block of data to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fwrite(const void * data, int size, int count, void *f ) +{ + FL_FILE *file = (FL_FILE *)f; + uint32 sector; + uint32 offset; + uint32 length = (size*count); + uint8 *buffer = (uint8 *)data; + uint32 bytesWritten = 0; + uint32 copyCount; + + // If first call to library, initialise + CHECK_FL_INIT(); + + if (!file) + return -1; + + FL_LOCK(&_fs); + + // No write permissions + if (!(file->flags & FILE_WRITE)) + { + FL_UNLOCK(&_fs); + return -1; + } + + // Append writes to end of file + if (file->flags & FILE_APPEND) + file->bytenum = file->filelength; + // Else write to current position + + // Calculate start sector + sector = file->bytenum / FAT_SECTOR_SIZE; + + // Offset to start copying data from first sector + offset = file->bytenum % FAT_SECTOR_SIZE; + + while (bytesWritten < length) + { + // Whole sector or more to be written? + if ((offset == 0) && ((length - bytesWritten) >= FAT_SECTOR_SIZE)) + { + uint32 sectorsWrote; + + // Buffered sector, flush back to disk + if (file->file_data_address != 0xFFFFFFFF) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + file->file_data_address = 0xFFFFFFFF; + file->file_data_dirty = 0; + } + + // Write as many sectors as possible + sectorsWrote = _write_sectors(file, sector, (uint8*)(buffer + bytesWritten), (length - bytesWritten) / FAT_SECTOR_SIZE); + copyCount = FAT_SECTOR_SIZE * sectorsWrote; + + // Increase total read count + bytesWritten += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + + // Move onto next sector and reset copy offset + sector+= sectorsWrote; + offset = 0; + + if (!sectorsWrote) + break; + } + else + { + // We have upto one sector to copy + copyCount = FAT_SECTOR_SIZE - offset; + + // Only require some of this sector? + if (copyCount > (length - bytesWritten)) + copyCount = (length - bytesWritten); + + // Do we need to read a new sector? + if (file->file_data_address != sector) + { + // Flush un-written data to file + if (file->file_data_dirty) + fl_fflush(file); + + // If we plan to overwrite the whole sector, we don't need to read it first! + if (copyCount != FAT_SECTOR_SIZE) + { + // NOTE: This does not have succeed; if last sector of file + // reached, no valid data will be read in, but write will + // allocate some more space for new data. + + // Get LBA of sector offset within file + if (!_read_sectors(file, sector, file->file_data_sector, 1)) + memset(file->file_data_sector, 0x00, FAT_SECTOR_SIZE); + } + + file->file_data_address = sector; + file->file_data_dirty = 0; + } + + // Copy from application buffer into sector buffer + memcpy((uint8*)(file->file_data_sector + offset), (uint8*)(buffer + bytesWritten), copyCount); + + // Mark buffer as dirty + file->file_data_dirty = 1; + + // Increase total read count + bytesWritten += copyCount; + + // Increment file pointer + file->bytenum += copyCount; + + // Move onto next sector and reset copy offset + sector++; + offset = 0; + } + } + + // Write increased extent of the file? + if (file->bytenum > file->filelength) + { + // Increase file size to new point + file->filelength = file->bytenum; + + // We are changing the file length and this + // will need to be writen back at some point + file->filelength_changed = 1; + } + +#if FATFS_INC_TIME_DATE_SUPPORT + // If time & date support is enabled, always force directory entry to be + // written in-order to update file modify / access time & date. + file->filelength_changed = 1; +#endif + + FL_UNLOCK(&_fs); + + return (size*count); +} +#endif +//----------------------------------------------------------------------------- +// fl_fputs: Write a character string to the stream +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_fputs(const char * str, void *f) +{ + int len = (int)strlen(str); + int res = fl_fwrite(str, 1, len, f); + + if (res == len) + return len; + else + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_remove: Remove a file from the filesystem +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_remove( const char * filename ) +{ + FL_FILE* file; + int res = -1; + + FL_LOCK(&_fs); + + // Use read_file as this will check if the file is already open! + file = fl_fopen((char*)filename, "r"); + if (file) + { + // Delete allocated space + if (fatfs_free_cluster_chain(&_fs, file->startcluster)) + { + // Remove directory entries + if (fatfs_mark_file_deleted(&_fs, file->parentcluster, (char*)file->shortfilename)) + { + // Close the file handle (this should not write anything to the file + // as we have not changed the file since opening it!) + fl_fclose(file); + + res = 0; + } + } + } + + FL_UNLOCK(&_fs); + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_createdirectory: Create a directory based on a path +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fl_createdirectory(const char *path) +{ + int res; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + res =_create_directory((char*)path); + FL_UNLOCK(&_fs); + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_listdirectory: List a directory based on a path +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +void fl_listdirectory(const char *path) +{ + FL_DIR dirstat; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + FAT_PRINTF(("\r\nDirectory %s\r\n", path)); + + if (fl_opendir(path, &dirstat)) + { + struct fs_dir_ent dirent; + + while (fl_readdir(&dirstat, &dirent) == 0) + { +#if FATFS_INC_TIME_DATE_SUPPORT + int d,m,y,h,mn,s; + fatfs_convert_from_fat_time(dirent.write_time, &h,&m,&s); + fatfs_convert_from_fat_date(dirent.write_date, &d,&mn,&y); + FAT_PRINTF(("%02d/%02d/%04d %02d:%02d ", d,mn,y,h,m)); +#endif + + if (dirent.is_dir) + { + FAT_PRINTF(("%s \r\n", dirent.filename)); + } + else + { + FAT_PRINTF(("%s [%d bytes]\r\n", dirent.filename, dirent.size)); + } + } + + fl_closedir(&dirstat); + } + + FL_UNLOCK(&_fs); +} +#endif +//----------------------------------------------------------------------------- +// fl_opendir: Opens a directory for listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +FL_DIR* fl_opendir(const char* path, FL_DIR *dir) +{ + int levels; + int res = 1; + uint32 cluster = FAT32_INVALID_CLUSTER; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + levels = fatfs_total_path_levels((char*)path) + 1; + + // If path is in the root dir + if (levels == 0) + cluster = fatfs_get_root_cluster(&_fs); + // Find parent directory start cluster + else + res = _open_directory((char*)path, &cluster); + + if (res) + fatfs_list_directory_start(&_fs, dir, cluster); + + FL_UNLOCK(&_fs); + + return cluster != FAT32_INVALID_CLUSTER ? dir : 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_readdir: Get next item in directory +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_readdir(FL_DIR *dirls, fl_dirent *entry) +{ + int res = 0; + + // If first call to library, initialise + CHECK_FL_INIT(); + + FL_LOCK(&_fs); + + res = fatfs_list_directory_next(&_fs, dirls, entry); + + FL_UNLOCK(&_fs); + + return res ? 0 : -1; +} +#endif +//----------------------------------------------------------------------------- +// fl_closedir: Close directory after listing +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_closedir(FL_DIR* dir) +{ + // Not used + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fl_is_dir: Is this a directory? +//----------------------------------------------------------------------------- +#if FATFS_DIR_LIST_SUPPORT +int fl_is_dir(const char *path) +{ + int res = 0; + FL_DIR dir; + + if (fl_opendir(path, &dir)) + { + res = 1; + fl_closedir(&dir); + } + + return res; +} +#endif +//----------------------------------------------------------------------------- +// fl_format: Format a partition with either FAT16 or FAT32 based on size +//----------------------------------------------------------------------------- +#if FATFS_INC_FORMAT_SUPPORT +int fl_format(uint32 volume_sectors, const char *name) +{ + return fatfs_format(&_fs, volume_sectors, name); +} +#endif /*FATFS_INC_FORMAT_SUPPORT*/ +//----------------------------------------------------------------------------- +// fl_get_fs: +//----------------------------------------------------------------------------- +#ifdef FATFS_INC_TEST_HOOKS +struct fatfs* fl_get_fs(void) +{ + return &_fs; +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_filelib.h b/src/gui/Lib/fat_io_lib/fat_filelib.h new file mode 100644 index 0000000..a40a28f --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_filelib.h @@ -0,0 +1,146 @@ +#ifndef __FAT_FILELIB_H__ +#define __FAT_FILELIB_H__ + +#include "fat_opts.h" +#include "fat_access.h" +#include "fat_list.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#ifndef SEEK_CUR + #define SEEK_CUR 1 +#endif + +#ifndef SEEK_END + #define SEEK_END 2 +#endif + +#ifndef SEEK_SET + #define SEEK_SET 0 +#endif + +#ifndef EOF + #define EOF (-1) +#endif + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct sFL_FILE; + +struct cluster_lookup +{ + uint32 ClusterIdx; + uint32 CurrentCluster; +}; + +typedef struct sFL_FILE +{ + uint32 parentcluster; + uint32 startcluster; + uint32 bytenum; + uint32 filelength; + int filelength_changed; + char path[FATFS_MAX_LONG_FILENAME]; + char filename[FATFS_MAX_LONG_FILENAME]; + uint8 shortfilename[11]; + +#ifdef FAT_CLUSTER_CACHE_ENTRIES + uint32 cluster_cache_idx[FAT_CLUSTER_CACHE_ENTRIES]; + uint32 cluster_cache_data[FAT_CLUSTER_CACHE_ENTRIES]; +#endif + + // Cluster Lookup + struct cluster_lookup last_fat_lookup; + + // Read/Write sector buffer + uint8 file_data_sector[FAT_SECTOR_SIZE]; + uint32 file_data_address; + int file_data_dirty; + + // File fopen flags + uint8 flags; +#define FILE_READ (1 << 0) +#define FILE_WRITE (1 << 1) +#define FILE_APPEND (1 << 2) +#define FILE_BINARY (1 << 3) +#define FILE_ERASE (1 << 4) +#define FILE_CREATE (1 << 5) + + struct fat_node list_node; +} FL_FILE; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- + +// External +void fl_init(void); +void fl_attach_locks(void (*lock)(void), void (*unlock)(void)); +int fl_attach_media(fn_diskio_read rd, fn_diskio_write wr); +void fl_shutdown(void); + +// Standard API +void* fl_fopen(const char *path, const char *modifiers); +void fl_fclose(void *file); +int fl_fflush(void *file); +int fl_fgetc(void *file); +char * fl_fgets(char *s, int n, void *f); +int fl_fputc(int c, void *file); +int fl_fputs(const char * str, void *file); +int fl_fwrite(const void * data, int size, int count, void *file ); +int fl_fread(void * data, int size, int count, void *file ); +int fl_fseek(void *file , long offset , int origin ); +int fl_fgetpos(void *file , uint32 * position); +long fl_ftell(void *f); +int fl_feof(void *f); +int fl_remove(const char * filename); + +// Equivelant dirent.h +typedef struct fs_dir_list_status FL_DIR; +typedef struct fs_dir_ent fl_dirent; + +FL_DIR* fl_opendir(const char* path, FL_DIR *dir); +int fl_readdir(FL_DIR *dirls, fl_dirent *entry); +int fl_closedir(FL_DIR* dir); + +// Extensions +void fl_listdirectory(const char *path); +int fl_createdirectory(const char *path); +int fl_is_dir(const char *path); + +int fl_format(uint32 volume_sectors, const char *name); + +// Test hooks +#ifdef FATFS_INC_TEST_HOOKS +struct fatfs* fl_get_fs(void); +#endif + +//----------------------------------------------------------------------------- +// Stdio file I/O names +//----------------------------------------------------------------------------- +#ifdef USE_FILELIB_STDIO_COMPAT_NAMES + +#define FILE FL_FILE + +#define fopen(a,b) fl_fopen(a, b) +#define fclose(a) fl_fclose(a) +#define fflush(a) fl_fflush(a) +#define fgetc(a) fl_fgetc(a) +#define fgets(a,b,c) fl_fgets(a, b, c) +#define fputc(a,b) fl_fputc(a, b) +#define fputs(a,b) fl_fputs(a, b) +#define fwrite(a,b,c,d) fl_fwrite(a, b, c, d) +#define fread(a,b,c,d) fl_fread(a, b, c, d) +#define fseek(a,b,c) fl_fseek(a, b, c) +#define fgetpos(a,b) fl_fgetpos(a, b) +#define ftell(a) fl_ftell(a) +#define feof(a) fl_feof(a) +#define remove(a) fl_remove(a) +#define mkdir(a) fl_createdirectory(a) +#define rmdir(a) 0 + +#endif + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_format.c b/src/gui/Lib/fat_io_lib/fat_format.c new file mode 100644 index 0000000..d067f37 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_format.c @@ -0,0 +1,532 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" +#include "fat_format.h" + +#if FATFS_INC_FORMAT_SUPPORT + +//----------------------------------------------------------------------------- +// Tables +//----------------------------------------------------------------------------- +struct sec_per_clus_table +{ + uint32 sectors; + uint8 sectors_per_cluster; +}; + +struct sec_per_clus_table _cluster_size_table16[] = +{ + { 32680, 2}, // 16MB - 1K + { 262144, 4}, // 128MB - 2K + { 524288, 8}, // 256MB - 4K + { 1048576, 16}, // 512MB - 8K + { 2097152, 32}, // 1GB - 16K + { 4194304, 64}, // 2GB - 32K + { 8388608, 128},// 2GB - 64K [Warning only supported by Windows XP onwards] + { 0 , 0 } // Invalid +}; + +struct sec_per_clus_table _cluster_size_table32[] = +{ + { 532480, 1}, // 260MB - 512b + { 16777216, 8}, // 8GB - 4K + { 33554432, 16}, // 16GB - 8K + { 67108864, 32}, // 32GB - 16K + { 0xFFFFFFFF, 64},// >32GB - 32K + { 0 , 0 } // Invalid +}; + +//----------------------------------------------------------------------------- +// fatfs_calc_cluster_size: Calculate what cluster size should be used +//----------------------------------------------------------------------------- +static uint8 fatfs_calc_cluster_size(uint32 sectors, int is_fat32) +{ + int i; + + if (!is_fat32) + { + for (i=0; _cluster_size_table16[i].sectors_per_cluster != 0;i++) + if (sectors <= _cluster_size_table16[i].sectors) + return _cluster_size_table16[i].sectors_per_cluster; + } + else + { + for (i=0; _cluster_size_table32[i].sectors_per_cluster != 0;i++) + if (sectors <= _cluster_size_table32[i].sectors) + return _cluster_size_table32[i].sectors_per_cluster; + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_erase_sectors: Erase a number of sectors +//----------------------------------------------------------------------------- +static int fatfs_erase_sectors(struct fatfs *fs, uint32 lba, int count) +{ + int i; + + // Zero sector first + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + for (i=0;idisk_io.write_media(lba + i, fs->currentsector.sector, 1)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_create_boot_sector: Create the boot sector +//----------------------------------------------------------------------------- +static int fatfs_create_boot_sector(struct fatfs *fs, uint32 boot_sector_lba, uint32 vol_sectors, const char *name, int is_fat32) +{ + uint32 total_clusters; + int i; + + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // OEM Name & Jump Code + fs->currentsector.sector[0] = 0xEB; + fs->currentsector.sector[1] = 0x3C; + fs->currentsector.sector[2] = 0x90; + fs->currentsector.sector[3] = 0x4D; + fs->currentsector.sector[4] = 0x53; + fs->currentsector.sector[5] = 0x44; + fs->currentsector.sector[6] = 0x4F; + fs->currentsector.sector[7] = 0x53; + fs->currentsector.sector[8] = 0x35; + fs->currentsector.sector[9] = 0x2E; + fs->currentsector.sector[10] = 0x30; + + // Bytes per sector + fs->currentsector.sector[11] = (FAT_SECTOR_SIZE >> 0) & 0xFF; + fs->currentsector.sector[12] = (FAT_SECTOR_SIZE >> 8) & 0xFF; + + // Get sectors per cluster size for the disk + fs->sectors_per_cluster = fatfs_calc_cluster_size(vol_sectors, is_fat32); + if (!fs->sectors_per_cluster) + return 0; // Invalid disk size + + // Sectors per cluster + fs->currentsector.sector[13] = fs->sectors_per_cluster; + + // Reserved Sectors + if (!is_fat32) + fs->reserved_sectors = 8; + else + fs->reserved_sectors = 32; + fs->currentsector.sector[14] = (fs->reserved_sectors >> 0) & 0xFF; + fs->currentsector.sector[15] = (fs->reserved_sectors >> 8) & 0xFF; + + // Number of FATS + fs->num_of_fats = 2; + fs->currentsector.sector[16] = fs->num_of_fats; + + // Max entries in root dir (FAT16 only) + if (!is_fat32) + { + fs->root_entry_count = 512; + fs->currentsector.sector[17] = (fs->root_entry_count >> 0) & 0xFF; + fs->currentsector.sector[18] = (fs->root_entry_count >> 8) & 0xFF; + } + else + { + fs->root_entry_count = 0; + fs->currentsector.sector[17] = 0; + fs->currentsector.sector[18] = 0; + } + + // [FAT16] Total sectors (use FAT32 count instead) + fs->currentsector.sector[19] = 0x00; + fs->currentsector.sector[20] = 0x00; + + // Media type + fs->currentsector.sector[21] = 0xF8; + + + // FAT16 BS Details + if (!is_fat32) + { + // Count of sectors used by the FAT table (FAT16 only) + total_clusters = (vol_sectors / fs->sectors_per_cluster) + 1; + fs->fat_sectors = (total_clusters/(FAT_SECTOR_SIZE/2)) + 1; + fs->currentsector.sector[22] = (uint8)((fs->fat_sectors >> 0) & 0xFF); + fs->currentsector.sector[23] = (uint8)((fs->fat_sectors >> 8) & 0xFF); + + // Sectors per track + fs->currentsector.sector[24] = 0x00; + fs->currentsector.sector[25] = 0x00; + + // Heads + fs->currentsector.sector[26] = 0x00; + fs->currentsector.sector[27] = 0x00; + + // Hidden sectors + fs->currentsector.sector[28] = 0x20; + fs->currentsector.sector[29] = 0x00; + fs->currentsector.sector[30] = 0x00; + fs->currentsector.sector[31] = 0x00; + + // Total sectors for this volume + fs->currentsector.sector[32] = (uint8)((vol_sectors>>0)&0xFF); + fs->currentsector.sector[33] = (uint8)((vol_sectors>>8)&0xFF); + fs->currentsector.sector[34] = (uint8)((vol_sectors>>16)&0xFF); + fs->currentsector.sector[35] = (uint8)((vol_sectors>>24)&0xFF); + + // Drive number + fs->currentsector.sector[36] = 0x00; + + // Reserved + fs->currentsector.sector[37] = 0x00; + + // Boot signature + fs->currentsector.sector[38] = 0x29; + + // Volume ID + fs->currentsector.sector[39] = 0x12; + fs->currentsector.sector[40] = 0x34; + fs->currentsector.sector[41] = 0x56; + fs->currentsector.sector[42] = 0x78; + + // Volume name + for (i=0;i<11;i++) + { + if (i < (int)strlen(name)) + fs->currentsector.sector[i+43] = name[i]; + else + fs->currentsector.sector[i+43] = ' '; + } + + // File sys type + fs->currentsector.sector[54] = 'F'; + fs->currentsector.sector[55] = 'A'; + fs->currentsector.sector[56] = 'T'; + fs->currentsector.sector[57] = '1'; + fs->currentsector.sector[58] = '6'; + fs->currentsector.sector[59] = ' '; + fs->currentsector.sector[60] = ' '; + fs->currentsector.sector[61] = ' '; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + } + // FAT32 BS Details + else + { + // Count of sectors used by the FAT table (FAT16 only) + fs->currentsector.sector[22] = 0; + fs->currentsector.sector[23] = 0; + + // Sectors per track (default) + fs->currentsector.sector[24] = 0x3F; + fs->currentsector.sector[25] = 0x00; + + // Heads (default) + fs->currentsector.sector[26] = 0xFF; + fs->currentsector.sector[27] = 0x00; + + // Hidden sectors + fs->currentsector.sector[28] = 0x00; + fs->currentsector.sector[29] = 0x00; + fs->currentsector.sector[30] = 0x00; + fs->currentsector.sector[31] = 0x00; + + // Total sectors for this volume + fs->currentsector.sector[32] = (uint8)((vol_sectors>>0)&0xFF); + fs->currentsector.sector[33] = (uint8)((vol_sectors>>8)&0xFF); + fs->currentsector.sector[34] = (uint8)((vol_sectors>>16)&0xFF); + fs->currentsector.sector[35] = (uint8)((vol_sectors>>24)&0xFF); + + total_clusters = (vol_sectors / fs->sectors_per_cluster) + 1; + fs->fat_sectors = (total_clusters/(FAT_SECTOR_SIZE/4)) + 1; + + // BPB_FATSz32 + fs->currentsector.sector[36] = (uint8)((fs->fat_sectors>>0)&0xFF); + fs->currentsector.sector[37] = (uint8)((fs->fat_sectors>>8)&0xFF); + fs->currentsector.sector[38] = (uint8)((fs->fat_sectors>>16)&0xFF); + fs->currentsector.sector[39] = (uint8)((fs->fat_sectors>>24)&0xFF); + + // BPB_ExtFlags + fs->currentsector.sector[40] = 0; + fs->currentsector.sector[41] = 0; + + // BPB_FSVer + fs->currentsector.sector[42] = 0; + fs->currentsector.sector[43] = 0; + + // BPB_RootClus + fs->currentsector.sector[44] = (uint8)((fs->rootdir_first_cluster>>0)&0xFF); + fs->currentsector.sector[45] = (uint8)((fs->rootdir_first_cluster>>8)&0xFF); + fs->currentsector.sector[46] = (uint8)((fs->rootdir_first_cluster>>16)&0xFF); + fs->currentsector.sector[47] = (uint8)((fs->rootdir_first_cluster>>24)&0xFF); + + // BPB_FSInfo + fs->currentsector.sector[48] = (uint8)((fs->fs_info_sector>>0)&0xFF); + fs->currentsector.sector[49] = (uint8)((fs->fs_info_sector>>8)&0xFF); + + // BPB_BkBootSec + fs->currentsector.sector[50] = 6; + fs->currentsector.sector[51] = 0; + + // Drive number + fs->currentsector.sector[64] = 0x00; + + // Boot signature + fs->currentsector.sector[66] = 0x29; + + // Volume ID + fs->currentsector.sector[67] = 0x12; + fs->currentsector.sector[68] = 0x34; + fs->currentsector.sector[69] = 0x56; + fs->currentsector.sector[70] = 0x78; + + // Volume name + for (i=0;i<11;i++) + { + if (i < (int)strlen(name)) + fs->currentsector.sector[i+71] = name[i]; + else + fs->currentsector.sector[i+71] = ' '; + } + + // File sys type + fs->currentsector.sector[82] = 'F'; + fs->currentsector.sector[83] = 'A'; + fs->currentsector.sector[84] = 'T'; + fs->currentsector.sector[85] = '3'; + fs->currentsector.sector[86] = '2'; + fs->currentsector.sector[87] = ' '; + fs->currentsector.sector[88] = ' '; + fs->currentsector.sector[89] = ' '; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + } + + if (fs->disk_io.write_media(boot_sector_lba, fs->currentsector.sector, 1)) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_create_fsinfo_sector: Create the FSInfo sector (FAT32) +//----------------------------------------------------------------------------- +static int fatfs_create_fsinfo_sector(struct fatfs *fs, uint32 sector_lba) +{ + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // FSI_LeadSig + fs->currentsector.sector[0] = 0x52; + fs->currentsector.sector[1] = 0x52; + fs->currentsector.sector[2] = 0x61; + fs->currentsector.sector[3] = 0x41; + + // FSI_StrucSig + fs->currentsector.sector[484] = 0x72; + fs->currentsector.sector[485] = 0x72; + fs->currentsector.sector[486] = 0x41; + fs->currentsector.sector[487] = 0x61; + + // FSI_Free_Count + fs->currentsector.sector[488] = 0xFF; + fs->currentsector.sector[489] = 0xFF; + fs->currentsector.sector[490] = 0xFF; + fs->currentsector.sector[491] = 0xFF; + + // FSI_Nxt_Free + fs->currentsector.sector[492] = 0xFF; + fs->currentsector.sector[493] = 0xFF; + fs->currentsector.sector[494] = 0xFF; + fs->currentsector.sector[495] = 0xFF; + + // Signature + fs->currentsector.sector[510] = 0x55; + fs->currentsector.sector[511] = 0xAA; + + if (fs->disk_io.write_media(sector_lba, fs->currentsector.sector, 1)) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_erase_fat: Erase FAT table using fs details in fs struct +//----------------------------------------------------------------------------- +static int fatfs_erase_fat(struct fatfs *fs, int is_fat32) +{ + uint32 i; + + // Zero sector initially + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + + // Initialise default allocate / reserved clusters + if (!is_fat32) + { + SET_16BIT_WORD(fs->currentsector.sector, 0, 0xFFF8); + SET_16BIT_WORD(fs->currentsector.sector, 2, 0xFFFF); + } + else + { + SET_32BIT_WORD(fs->currentsector.sector, 0, 0x0FFFFFF8); + SET_32BIT_WORD(fs->currentsector.sector, 4, 0xFFFFFFFF); + SET_32BIT_WORD(fs->currentsector.sector, 8, 0x0FFFFFFF); + } + + if (!fs->disk_io.write_media(fs->fat_begin_lba + 0, fs->currentsector.sector, 1)) + return 0; + + // Zero remaining FAT sectors + memset(fs->currentsector.sector, 0, FAT_SECTOR_SIZE); + for (i=1;ifat_sectors*fs->num_of_fats;i++) + if (!fs->disk_io.write_media(fs->fat_begin_lba + i, fs->currentsector.sector, 1)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format_fat16: Format a FAT16 partition +//----------------------------------------------------------------------------- +int fatfs_format_fat16(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have read + write functions + if (!fs->disk_io.read_media || !fs->disk_io.write_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Volume is FAT16 + fs->fat_type = FAT_TYPE_16; + + // Not valid for FAT16 + fs->fs_info_sector = 0; + fs->rootdir_first_cluster = 0; + + // Sector 0: Boot sector + // NOTE: We don't need an MBR, it is a waste of a good sector! + fs->lba_begin = 0; + if (!fatfs_create_boot_sector(fs, fs->lba_begin, volume_sectors, name, 0)) + return 0; + + // For FAT16 (which this may be), rootdir_first_cluster is actuall rootdir_first_sector + fs->rootdir_first_sector = fs->reserved_sectors + (fs->num_of_fats * fs->fat_sectors); + fs->rootdir_sectors = ((fs->root_entry_count * 32) + (FAT_SECTOR_SIZE - 1)) / FAT_SECTOR_SIZE; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + fs->reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (fs->num_of_fats * fs->fat_sectors); + + // Initialise FAT sectors + if (!fatfs_erase_fat(fs, 0)) + return 0; + + // Erase Root directory + if (!fatfs_erase_sectors(fs, fs->lba_begin + fs->rootdir_first_sector, fs->rootdir_sectors)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format_fat32: Format a FAT32 partition +//----------------------------------------------------------------------------- +int fatfs_format_fat32(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + fs->currentsector.address = FAT32_INVALID_CLUSTER; + fs->currentsector.dirty = 0; + + fs->next_free_cluster = 0; // Invalid + + fatfs_fat_init(fs); + + // Make sure we have read + write functions + if (!fs->disk_io.read_media || !fs->disk_io.write_media) + return FAT_INIT_MEDIA_ACCESS_ERROR; + + // Volume is FAT32 + fs->fat_type = FAT_TYPE_32; + + // Basic defaults for normal FAT32 partitions + fs->fs_info_sector = 1; + fs->rootdir_first_cluster = 2; + + // Sector 0: Boot sector + // NOTE: We don't need an MBR, it is a waste of a good sector! + fs->lba_begin = 0; + if (!fatfs_create_boot_sector(fs, fs->lba_begin, volume_sectors, name, 1)) + return 0; + + // First FAT LBA address + fs->fat_begin_lba = fs->lba_begin + fs->reserved_sectors; + + // The address of the first data cluster on this volume + fs->cluster_begin_lba = fs->fat_begin_lba + (fs->num_of_fats * fs->fat_sectors); + + // Initialise FSInfo sector + if (!fatfs_create_fsinfo_sector(fs, fs->fs_info_sector)) + return 0; + + // Initialise FAT sectors + if (!fatfs_erase_fat(fs, 1)) + return 0; + + // Erase Root directory + if (!fatfs_erase_sectors(fs, fatfs_lba_of_cluster(fs, fs->rootdir_first_cluster), fs->sectors_per_cluster)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_format: Format a partition with either FAT16 or FAT32 based on size +//----------------------------------------------------------------------------- +int fatfs_format(struct fatfs *fs, uint32 volume_sectors, const char *name) +{ + // 2GB - 32K limit for safe behaviour for FAT16 + if (volume_sectors <= 4194304) + return fatfs_format_fat16(fs, volume_sectors, name); + else + return fatfs_format_fat32(fs, volume_sectors, name); +} +#endif /*FATFS_INC_FORMAT_SUPPORT*/ diff --git a/src/gui/Lib/fat_io_lib/fat_format.h b/src/gui/Lib/fat_io_lib/fat_format.h new file mode 100644 index 0000000..a8a6bba --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_format.h @@ -0,0 +1,15 @@ +#ifndef __FAT_FORMAT_H__ +#define __FAT_FORMAT_H__ + +#include "fat_defs.h" +#include "fat_opts.h" +#include "fat_access.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_format(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat16(struct fatfs *fs, uint32 volume_sectors, const char *name); +int fatfs_format_fat32(struct fatfs *fs, uint32 volume_sectors, const char *name); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_list.h b/src/gui/Lib/fat_io_lib/fat_list.h new file mode 100644 index 0000000..bd386ef --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_list.h @@ -0,0 +1,161 @@ +#ifndef __FAT_LIST_H__ +#define __FAT_LIST_H__ + +#ifndef FAT_ASSERT + #define FAT_ASSERT(x) +#endif + +#ifndef FAT_INLINE + #define FAT_INLINE +#endif + +//----------------------------------------------------------------- +// Types +//----------------------------------------------------------------- +struct fat_list; + +struct fat_node +{ + struct fat_node *previous; + struct fat_node *next; +}; + +struct fat_list +{ + struct fat_node *head; + struct fat_node *tail; +}; + +//----------------------------------------------------------------- +// Macros +//----------------------------------------------------------------- +#define fat_list_entry(p, t, m) p ? ((t *)((char *)(p)-(char*)(&((t *)0)->m))) : 0 +#define fat_list_next(l, p) (p)->next +#define fat_list_prev(l, p) (p)->previous +#define fat_list_first(l) (l)->head +#define fat_list_last(l) (l)->tail +#define fat_list_for_each(l, p) for ((p) = (l)->head; (p); (p) = (p)->next) + +//----------------------------------------------------------------- +// Inline Functions +//----------------------------------------------------------------- + +//----------------------------------------------------------------- +// fat_list_init: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_init(struct fat_list *list) +{ + FAT_ASSERT(list); + + list->head = list->tail = 0; +} +//----------------------------------------------------------------- +// fat_list_remove: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_remove(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if(!node->previous) + list->head = node->next; + else + node->previous->next = node->next; + + if(!node->next) + list->tail = node->previous; + else + node->next->previous = node->previous; +} +//----------------------------------------------------------------- +// fat_list_insert_after: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_after(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node; + new_node->next = node->next; + if (!node->next) + list->tail = new_node; + else + node->next->previous = new_node; + node->next = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_before: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_before(struct fat_list *list, struct fat_node *node, struct fat_node *new_node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + FAT_ASSERT(new_node); + + new_node->previous = node->previous; + new_node->next = node; + if (!node->previous) + list->head = new_node; + else + node->previous->next = new_node; + node->previous = new_node; +} +//----------------------------------------------------------------- +// fat_list_insert_first: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_first(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->head) + { + list->head = node; + list->tail = node; + node->previous = 0; + node->next = 0; + } + else + fat_list_insert_before(list, list->head, node); +} +//----------------------------------------------------------------- +// fat_list_insert_last: +//----------------------------------------------------------------- +static FAT_INLINE void fat_list_insert_last(struct fat_list *list, struct fat_node *node) +{ + FAT_ASSERT(list); + FAT_ASSERT(node); + + if (!list->tail) + fat_list_insert_first(list, node); + else + fat_list_insert_after(list, list->tail, node); +} +//----------------------------------------------------------------- +// fat_list_is_empty: +//----------------------------------------------------------------- +static FAT_INLINE int fat_list_is_empty(struct fat_list *list) +{ + FAT_ASSERT(list); + + return !list->head; +} +//----------------------------------------------------------------- +// fat_list_pop_head: +//----------------------------------------------------------------- +static FAT_INLINE struct fat_node * fat_list_pop_head(struct fat_list *list) +{ + struct fat_node * node; + + FAT_ASSERT(list); + + node = fat_list_first(list); + if (node) + fat_list_remove(list, node); + + return node; +} + +#endif + diff --git a/src/gui/Lib/fat_io_lib/fat_misc.c b/src/gui/Lib/fat_io_lib/fat_misc.c new file mode 100644 index 0000000..cbf6f08 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_misc.c @@ -0,0 +1,505 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_init: Clear long file name cache +//----------------------------------------------------------------------------- +void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable) +{ + int i = 0; + + lfn->no_of_strings = 0; + +#if FATFS_INC_LFN_SUPPORT + + // Zero out buffer also + if (wipeTable) + for (i=0;iString[i], 0x00, MAX_LFN_ENTRY_LENGTH); +#endif +} +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_entry - Function extracts long file name text from sector +// at a specific offset +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer) +{ + uint8 LFNIndex, i; + LFNIndex = entryBuffer[0] & 0x1F; + + // Limit file name to cache size! + if (LFNIndex > MAX_LONGFILENAME_ENTRIES) + return ; + + // This is an error condition + if (LFNIndex == 0) + return ; + + if (lfn->no_of_strings == 0) + lfn->no_of_strings = LFNIndex; + + lfn->String[LFNIndex-1][0] = entryBuffer[1]; + lfn->String[LFNIndex-1][1] = entryBuffer[3]; + lfn->String[LFNIndex-1][2] = entryBuffer[5]; + lfn->String[LFNIndex-1][3] = entryBuffer[7]; + lfn->String[LFNIndex-1][4] = entryBuffer[9]; + lfn->String[LFNIndex-1][5] = entryBuffer[0x0E]; + lfn->String[LFNIndex-1][6] = entryBuffer[0x10]; + lfn->String[LFNIndex-1][7] = entryBuffer[0x12]; + lfn->String[LFNIndex-1][8] = entryBuffer[0x14]; + lfn->String[LFNIndex-1][9] = entryBuffer[0x16]; + lfn->String[LFNIndex-1][10] = entryBuffer[0x18]; + lfn->String[LFNIndex-1][11] = entryBuffer[0x1C]; + lfn->String[LFNIndex-1][12] = entryBuffer[0x1E]; + + for (i=0; iString[LFNIndex-1][i]==0xFF) + lfn->String[LFNIndex-1][i] = 0x20; // Replace with spaces +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_cache_get: Get a reference to the long filename +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +char* fatfs_lfn_cache_get(struct lfn_cache *lfn) +{ + // Null terminate long filename + if (lfn->no_of_strings == MAX_LONGFILENAME_ENTRIES) + lfn->Null = '\0'; + else if (lfn->no_of_strings) + lfn->String[lfn->no_of_strings][0] = '\0'; + else + lfn->String[0][0] = '\0'; + + return (char*)&lfn->String[0][0]; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_text: If LFN text entry found +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_text(struct fat_dir_entry *entry) +{ + if ((entry->Attr & FILE_ATTR_LFN_TEXT) == FILE_ATTR_LFN_TEXT) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_invalid: If SFN found not relating to LFN +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry) +{ + if ( (entry->Name[0]==FILE_HEADER_BLANK) || + (entry->Name[0]==FILE_HEADER_DELETED)|| + (entry->Attr==FILE_ATTR_VOLUME_ID) || + (entry->Attr & FILE_ATTR_SYSHID) ) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_lfn_exists: If LFN exists and correlation SFN found +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry) +{ + if ( (entry->Attr!=FILE_ATTR_LFN_TEXT) && + (entry->Name[0]!=FILE_HEADER_BLANK) && + (entry->Name[0]!=FILE_HEADER_DELETED) && + (entry->Attr!=FILE_ATTR_VOLUME_ID) && + (!(entry->Attr&FILE_ATTR_SYSHID)) && + (lfn->no_of_strings) ) + return 1; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_entry_sfn_only: If SFN only exists +//----------------------------------------------------------------------------- +int fatfs_entry_sfn_only(struct fat_dir_entry *entry) +{ + if ( (entry->Attr!=FILE_ATTR_LFN_TEXT) && + (entry->Name[0]!=FILE_HEADER_BLANK) && + (entry->Name[0]!=FILE_HEADER_DELETED) && + (entry->Attr!=FILE_ATTR_VOLUME_ID) && + (!(entry->Attr&FILE_ATTR_SYSHID)) ) + return 1; + else + return 0; +} +// TODO: FILE_ATTR_SYSHID ?!?!??! +//----------------------------------------------------------------------------- +// fatfs_entry_is_dir: Returns 1 if a directory +//----------------------------------------------------------------------------- +int fatfs_entry_is_dir(struct fat_dir_entry *entry) +{ + if (entry->Attr & FILE_TYPE_DIR) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_entry_is_file: Returns 1 is a file entry +//----------------------------------------------------------------------------- +int fatfs_entry_is_file(struct fat_dir_entry *entry) +{ + if (entry->Attr & FILE_TYPE_FILE) + return 1; + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_lfn_entries_required: Calculate number of 13 characters entries +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +int fatfs_lfn_entries_required(char *filename) +{ + int length = (int)strlen(filename); + + if (length) + return (length + MAX_LFN_ENTRY_LENGTH - 1) / MAX_LFN_ENTRY_LENGTH; + else + return 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_filename_to_lfn: +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk) +{ + int i; + int nameIndexes[MAX_LFN_ENTRY_LENGTH] = {1,3,5,7,9,0x0E,0x10,0x12,0x14,0x16,0x18,0x1C,0x1E}; + + // 13 characters entries + int length = (int)strlen(filename); + int entriesRequired = fatfs_lfn_entries_required(filename); + + // Filename offset + int start = entry * MAX_LFN_ENTRY_LENGTH; + + // Initialise to zeros + memset(buffer, 0x00, FAT_DIR_ENTRY_SIZE); + + // LFN entry number + buffer[0] = (uint8)(((entriesRequired-1)==entry)?(0x40|(entry+1)):(entry+1)); + + // LFN flag + buffer[11] = 0x0F; + + // Checksum of short filename + buffer[13] = sfnChk; + + // Copy to buffer + for (i=0;iName[i] = shortfilename[i]; + + // Unless we have a RTC we might as well set these to 1980 + entry->CrtTimeTenth = 0x00; + entry->CrtTime[1] = entry->CrtTime[0] = 0x00; + entry->CrtDate[1] = 0x00; + entry->CrtDate[0] = 0x20; + entry->LstAccDate[1] = 0x00; + entry->LstAccDate[0] = 0x20; + entry->WrtTime[1] = entry->WrtTime[0] = 0x00; + entry->WrtDate[1] = 0x00; + entry->WrtDate[0] = 0x20; + + if (!dir) + entry->Attr = FILE_TYPE_FILE; + else + entry->Attr = FILE_TYPE_DIR; + + entry->NTRes = 0x00; + + entry->FstClusHI = FAT_HTONS((uint16)((startCluster>>16) & 0xFFFF)); + entry->FstClusLO = FAT_HTONS((uint16)((startCluster>>0) & 0xFFFF)); + entry->FileSize = FAT_HTONL(size); +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_create_sfn: Create a padded SFN +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_lfn_create_sfn(char *sfn_output, char *filename) +{ + int i; + int dotPos = -1; + char ext[3]; + int pos; + int len = (int)strlen(filename); + + // Invalid to start with . + if (filename[0]=='.') + return 0; + + memset(sfn_output, ' ', FAT_SFN_SIZE_FULL); + memset(ext, ' ', 3); + + // Find dot seperator + for (i = 0; i< len; i++) + { + if (filename[i]=='.') + dotPos = i; + } + + // Extract extensions + if (dotPos!=-1) + { + // Copy first three chars of extension + for (i = (dotPos+1); i < (dotPos+1+3); i++) + if (i= 'a' && filename[i] <= 'z') + sfn_output[pos++] = filename[i] - 'a' + 'A'; + else + sfn_output[pos++] = filename[i]; + } + + // Fill upto 8 characters + if (pos==FAT_SFN_SIZE_PARTIAL) + break; + } + + // Add extension part + for (i=FAT_SFN_SIZE_PARTIAL;i= 'a' && ext[i-FAT_SFN_SIZE_PARTIAL] <= 'z') + sfn_output[i] = ext[i-FAT_SFN_SIZE_PARTIAL] - 'a' + 'A'; + else + sfn_output[i] = ext[i-FAT_SFN_SIZE_PARTIAL]; + } + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_itoa: +//----------------------------------------------------------------------------- +static void fatfs_itoa(uint32 num, char *s) +{ + char* cp; + char outbuf[12]; + const char digits[] = "0123456789ABCDEF"; + + // Build string backwards + cp = outbuf; + do + { + *cp++ = digits[(int)(num % 10)]; + } + while ((num /= 10) > 0); + + *cp-- = 0; + + // Copy in forwards + while (cp >= outbuf) + *s++ = *cp--; + + *s = 0; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_lfn_generate_tail: +// sfn_input = Input short filename, spaced format & in upper case +// sfn_output = Output short filename with tail +//----------------------------------------------------------------------------- +#if FATFS_INC_LFN_SUPPORT +#if FATFS_INC_WRITE_SUPPORT +int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum) +{ + int tail_chars; + char tail_str[12]; + + if (tailNum > 99999) + return 0; + + // Convert to number + memset(tail_str, 0x00, sizeof(tail_str)); + tail_str[0] = '~'; + fatfs_itoa(tailNum, tail_str+1); + + // Copy in base filename + memcpy(sfn_output, sfn_input, FAT_SFN_SIZE_FULL); + + // Overwrite with tail + tail_chars = (int)strlen(tail_str); + memcpy(sfn_output+(FAT_SFN_SIZE_PARTIAL-tail_chars), tail_str, tail_chars); + + return 1; +} +#endif +#endif +//----------------------------------------------------------------------------- +// fatfs_convert_from_fat_time: Convert FAT time to h/m/s +//----------------------------------------------------------------------------- +#if FATFS_INC_TIME_DATE_SUPPORT +void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds) +{ + *hours = (fat_time >> FAT_TIME_HOURS_SHIFT) & FAT_TIME_HOURS_MASK; + *minutes = (fat_time >> FAT_TIME_MINUTES_SHIFT) & FAT_TIME_MINUTES_MASK; + *seconds = (fat_time >> FAT_TIME_SECONDS_SHIFT) & FAT_TIME_SECONDS_MASK; + *seconds = *seconds * FAT_TIME_SECONDS_SCALE; +} +//----------------------------------------------------------------------------- +// fatfs_convert_from_fat_date: Convert FAT date to d/m/y +//----------------------------------------------------------------------------- +void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year) +{ + *day = (fat_date >> FAT_DATE_DAY_SHIFT) & FAT_DATE_DAY_MASK; + *month = (fat_date >> FAT_DATE_MONTH_SHIFT) & FAT_DATE_MONTH_MASK; + *year = (fat_date >> FAT_DATE_YEAR_SHIFT) & FAT_DATE_YEAR_MASK; + *year = *year + FAT_DATE_YEAR_OFFSET; +} +//----------------------------------------------------------------------------- +// fatfs_convert_to_fat_time: Convert h/m/s to FAT time +//----------------------------------------------------------------------------- +uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds) +{ + uint16 fat_time = 0; + + // Most FAT times are to a resolution of 2 seconds + seconds /= FAT_TIME_SECONDS_SCALE; + + fat_time = (hours & FAT_TIME_HOURS_MASK) << FAT_TIME_HOURS_SHIFT; + fat_time|= (minutes & FAT_TIME_MINUTES_MASK) << FAT_TIME_MINUTES_SHIFT; + fat_time|= (seconds & FAT_TIME_SECONDS_MASK) << FAT_TIME_SECONDS_SHIFT; + + return fat_time; +} +//----------------------------------------------------------------------------- +// fatfs_convert_to_fat_date: Convert d/m/y to FAT date +//----------------------------------------------------------------------------- +uint16 fatfs_convert_to_fat_date(int day, int month, int year) +{ + uint16 fat_date = 0; + + // FAT dates are relative to 1980 + if (year >= FAT_DATE_YEAR_OFFSET) + year -= FAT_DATE_YEAR_OFFSET; + + fat_date = (day & FAT_DATE_DAY_MASK) << FAT_DATE_DAY_SHIFT; + fat_date|= (month & FAT_DATE_MONTH_MASK) << FAT_DATE_MONTH_SHIFT; + fat_date|= (year & FAT_DATE_YEAR_MASK) << FAT_DATE_YEAR_SHIFT; + + return fat_date; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_print_sector: +//----------------------------------------------------------------------------- +#ifdef FATFS_DEBUG +void fatfs_print_sector(uint32 sector, uint8 *data) +{ + int i; + int j; + + FAT_PRINTF(("Sector %d:\n", sector)); + + for (i=0;i 31 && ch < 127) + { + FAT_PRINTF(("%c", ch)); + } + else + { + FAT_PRINTF((".")); + } + } + + FAT_PRINTF(("\n")); + } + } +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_misc.h b/src/gui/Lib/fat_io_lib/fat_misc.h new file mode 100644 index 0000000..0c02634 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_misc.h @@ -0,0 +1,63 @@ +#ifndef __FAT_MISC_H__ +#define __FAT_MISC_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- +#define MAX_LONGFILENAME_ENTRIES 20 +#define MAX_LFN_ENTRY_LENGTH 13 + +//----------------------------------------------------------------------------- +// Macros +//----------------------------------------------------------------------------- +#define GET_32BIT_WORD(buffer, location) ( ((uint32)buffer[location+3]<<24) + ((uint32)buffer[location+2]<<16) + ((uint32)buffer[location+1]<<8) + (uint32)buffer[location+0] ) +#define GET_16BIT_WORD(buffer, location) ( ((uint16)buffer[location+1]<<8) + (uint16)buffer[location+0] ) + +#define SET_32BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); \ + buffer[location+2] = (uint8)((value>>16)&0xFF); \ + buffer[location+3] = (uint8)((value>>24)&0xFF); } + +#define SET_16BIT_WORD(buffer, location, value) { buffer[location+0] = (uint8)((value)&0xFF); \ + buffer[location+1] = (uint8)((value>>8)&0xFF); } + +//----------------------------------------------------------------------------- +// Structures +//----------------------------------------------------------------------------- +struct lfn_cache +{ +#if FATFS_INC_LFN_SUPPORT + // Long File Name Structure (max 260 LFN length) + uint8 String[MAX_LONGFILENAME_ENTRIES][MAX_LFN_ENTRY_LENGTH]; + uint8 Null; +#endif + uint8 no_of_strings; +}; + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_lfn_cache_init(struct lfn_cache *lfn, int wipeTable); +void fatfs_lfn_cache_entry(struct lfn_cache *lfn, uint8 *entryBuffer); +char* fatfs_lfn_cache_get(struct lfn_cache *lfn); +int fatfs_entry_lfn_text(struct fat_dir_entry *entry); +int fatfs_entry_lfn_invalid(struct fat_dir_entry *entry); +int fatfs_entry_lfn_exists(struct lfn_cache *lfn, struct fat_dir_entry *entry); +int fatfs_entry_sfn_only(struct fat_dir_entry *entry); +int fatfs_entry_is_dir(struct fat_dir_entry *entry); +int fatfs_entry_is_file(struct fat_dir_entry *entry); +int fatfs_lfn_entries_required(char *filename); +void fatfs_filename_to_lfn(char *filename, uint8 *buffer, int entry, uint8 sfnChk); +void fatfs_sfn_create_entry(char *shortfilename, uint32 size, uint32 startCluster, struct fat_dir_entry *entry, int dir); +int fatfs_lfn_create_sfn(char *sfn_output, char *filename); +int fatfs_lfn_generate_tail(char *sfn_output, char *sfn_input, uint32 tailNum); +void fatfs_convert_from_fat_time(uint16 fat_time, int *hours, int *minutes, int *seconds); +void fatfs_convert_from_fat_date(uint16 fat_date, int *day, int *month, int *year); +uint16 fatfs_convert_to_fat_time(int hours, int minutes, int seconds); +uint16 fatfs_convert_to_fat_date(int day, int month, int year); +void fatfs_print_sector(uint32 sector, uint8 *data); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_opts.h b/src/gui/Lib/fat_io_lib/fat_opts.h new file mode 100644 index 0000000..a7a7385 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_opts.h @@ -0,0 +1,83 @@ +#ifndef __FAT_OPTS_H__ +#define __FAT_OPTS_H__ + +#ifdef FATFS_USE_CUSTOM_OPTS_FILE + #include "fat_custom.h" +#endif + +//------------------------------------------------------------- +// Configuration +//------------------------------------------------------------- + +// Is the processor little endian (1) or big endian (0) +#ifndef FATFS_IS_LITTLE_ENDIAN + #define FATFS_IS_LITTLE_ENDIAN 1 +#endif + +// Max filename Length +#ifndef FATFS_MAX_LONG_FILENAME + #define FATFS_MAX_LONG_FILENAME 260 +#endif + +// Max open files (reduce to lower memory requirements) +#ifndef FATFS_MAX_OPEN_FILES + #define FATFS_MAX_OPEN_FILES 2 +#endif + +// Number of sectors per FAT_BUFFER (min 1) +#ifndef FAT_BUFFER_SECTORS + #define FAT_BUFFER_SECTORS 1 +#endif + +// Max FAT sectors to buffer (min 1) +// (mem used is FAT_BUFFERS * FAT_BUFFER_SECTORS * FAT_SECTOR_SIZE) +#ifndef FAT_BUFFERS + #define FAT_BUFFERS 1 +#endif + +// Size of cluster chain cache (can be undefined) +// Mem used = FAT_CLUSTER_CACHE_ENTRIES * 4 * 2 +// Improves access speed considerably +//#define FAT_CLUSTER_CACHE_ENTRIES 128 + +// Include support for writing files (1 / 0)? +#ifndef FATFS_INC_WRITE_SUPPORT + #define FATFS_INC_WRITE_SUPPORT 1 +#endif + +// Support long filenames (1 / 0)? +// (if not (0) only 8.3 format is supported) +#ifndef FATFS_INC_LFN_SUPPORT + #define FATFS_INC_LFN_SUPPORT 1 +#endif + +// Support directory listing (1 / 0)? +#ifndef FATFS_DIR_LIST_SUPPORT + #define FATFS_DIR_LIST_SUPPORT 1 +#endif + +// Support time/date (1 / 0)? +#ifndef FATFS_INC_TIME_DATE_SUPPORT + #define FATFS_INC_TIME_DATE_SUPPORT 0 +#endif + +// Include support for formatting disks (1 / 0)? +#ifndef FATFS_INC_FORMAT_SUPPORT + #define FATFS_INC_FORMAT_SUPPORT 0 +#endif + +// Sector size used +#define FAT_SECTOR_SIZE 512 + +// Printf output (directory listing / debug) +#ifndef FAT_PRINTF + void hiperiso_syslog_printf(const char *Fmt, ...); + #define FAT_PRINTF(a) hiperiso_syslog_printf a +#endif + +// Time/Date support requires time.h +#if FATFS_INC_TIME_DATE_SUPPORT + #include +#endif + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_string.c b/src/gui/Lib/fat_io_lib/fat_string.c new file mode 100644 index 0000000..f7206ce --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_string.c @@ -0,0 +1,514 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include +#include "fat_string.h" + +//----------------------------------------------------------------------------- +// fatfs_total_path_levels: Take a filename and path and count the sub levels +// of folders. E.g. C:\folder\file.zip = 1 level +// Acceptable input formats are: +// c:\folder\file.zip +// /dev/etc/samba.conf +// Returns: -1 = Error, 0 or more = Ok +//----------------------------------------------------------------------------- +int fatfs_total_path_levels(char *path) +{ + int levels = 0; + char expectedchar; + + if (!path) + return -1; + + // Acceptable formats: + // c:\folder\file.zip + // /dev/etc/samba.conf + if (*path == '/') + { + expectedchar = '/'; + path++; + } + else if (path[1] == ':' || path[2] == '\\') + { + expectedchar = '\\'; + path += 3; + } + else + return -1; + + // Count levels in path string + while (*path) + { + // Fast forward through actual subdir text to next slash + for (; *path; ) + { + // If slash detected escape from for loop + if (*path == expectedchar) { path++; break; } + path++; + } + + // Increase number of subdirs founds + levels++; + } + + // Subtract the file itself + return levels-1; +} +//----------------------------------------------------------------------------- +// fatfs_get_substring: Get a substring from 'path' which contains the folder +// (or file) at the specified level. +// E.g. C:\folder\file.zip : Level 0 = C:\folder, Level 1 = file.zip +// Returns: -1 = Error, 0 = Ok +//----------------------------------------------------------------------------- +int fatfs_get_substring(char *path, int levelreq, char *output, int max_len) +{ + int i; + int pathlen=0; + int levels=0; + int copypnt=0; + char expectedchar; + + if (!path || max_len <= 0) + return -1; + + // Acceptable formats: + // c:\folder\file.zip + // /dev/etc/samba.conf + if (*path == '/') + { + expectedchar = '/'; + path++; + } + else if (path[1] == ':' || path[2] == '\\') + { + expectedchar = '\\'; + path += 3; + } + else + return -1; + + // Get string length of path + pathlen = (int)strlen (path); + + // Loop through the number of times as characters in 'path' + for (i = 0; i path = C:\folder filename = file.zip +// E.g. C:\file.zip -> path = [blank] filename = file.zip +//----------------------------------------------------------------------------- +int fatfs_split_path(char *full_path, char *path, int max_path, char *filename, int max_filename) +{ + int strindex; + + // Count the levels to the filepath + int levels = fatfs_total_path_levels(full_path); + if (levels == -1) + return -1; + + // Get filename part of string + if (fatfs_get_substring(full_path, levels, filename, max_filename) != 0) + return -1; + + // If root file + if (levels == 0) + path[0] = '\0'; + else + { + strindex = (int)strlen(full_path) - (int)strlen(filename); + if (strindex > max_path) + strindex = max_path; + + memcpy(path, full_path, strindex); + path[strindex-1] = '\0'; + } + + return 0; +} +//----------------------------------------------------------------------------- +// FileString_StrCmpNoCase: Compare two strings case with case sensitivity +//----------------------------------------------------------------------------- +static int FileString_StrCmpNoCase(char *s1, char *s2, int n) +{ + int diff; + char a,b; + + while (n--) + { + a = *s1; + b = *s2; + + // Make lower case if uppercase + if ((a>='A') && (a<='Z')) + a+= 32; + if ((b>='A') && (b<='Z')) + b+= 32; + + diff = a - b; + + // If different + if (diff) + return diff; + + // If run out of strings + if ( (*s1 == 0) || (*s2 == 0) ) + break; + + s1++; + s2++; + } + return 0; +} +//----------------------------------------------------------------------------- +// FileString_GetExtension: Get index to extension within filename +// Returns -1 if not found or index otherwise +//----------------------------------------------------------------------------- +static int FileString_GetExtension(char *str) +{ + int dotPos = -1; + char *strSrc = str; + + // Find last '.' in string (if at all) + while (*strSrc) + { + if (*strSrc=='.') + dotPos = (int)(strSrc-str); + + strSrc++; + } + + return dotPos; +} +//----------------------------------------------------------------------------- +// FileString_TrimLength: Get length of string excluding trailing spaces +// Returns -1 if not found or index otherwise +//----------------------------------------------------------------------------- +static int FileString_TrimLength(char *str, int strLen) +{ + int length = strLen; + char *strSrc = str+strLen-1; + + // Find last non white space + while (strLen != 0) + { + if (*strSrc == ' ') + length = (int)(strSrc - str); + else + break; + + strSrc--; + strLen--; + } + + return length; +} +//----------------------------------------------------------------------------- +// fatfs_compare_names: Compare two filenames (without copying or changing origonals) +// Returns 1 if match, 0 if not +//----------------------------------------------------------------------------- +int fatfs_compare_names(char* strA, char* strB) +{ + char *ext1 = NULL; + char *ext2 = NULL; + int ext1Pos, ext2Pos; + int file1Len, file2Len; + + // Get both files extension + ext1Pos = FileString_GetExtension(strA); + ext2Pos = FileString_GetExtension(strB); + + // NOTE: Extension position can be different for matching + // filename if trailing space are present before it! + // Check that if one has an extension, so does the other + if ((ext1Pos==-1) && (ext2Pos!=-1)) + return 0; + if ((ext2Pos==-1) && (ext1Pos!=-1)) + return 0; + + // If they both have extensions, compare them + if (ext1Pos!=-1) + { + // Set pointer to start of extension + ext1 = strA+ext1Pos+1; + ext2 = strB+ext2Pos+1; + + // Verify that the file extension lengths match! + if (strlen(ext1) != strlen(ext2)) + return 0; + + // If they dont match + if (FileString_StrCmpNoCase(ext1, ext2, (int)strlen(ext1))!=0) + return 0; + + // Filelength is upto extensions + file1Len = ext1Pos; + file2Len = ext2Pos; + } + // No extensions + else + { + // Filelength is actual filelength + file1Len = (int)strlen(strA); + file2Len = (int)strlen(strB); + } + + // Find length without trailing spaces (before ext) + file1Len = FileString_TrimLength(strA, file1Len); + file2Len = FileString_TrimLength(strB, file2Len); + + // Check the file lengths match + if (file1Len!=file2Len) + return 0; + + // Compare main part of filenames + if (FileString_StrCmpNoCase(strA, strB, file1Len)!=0) + return 0; + else + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_string_ends_with_slash: Does the string end with a slash (\ or /) +//----------------------------------------------------------------------------- +int fatfs_string_ends_with_slash(char *path) +{ + if (path) + { + while (*path) + { + // Last character? + if (!(*(path+1))) + { + if (*path == '\\' || *path == '/') + return 1; + } + + path++; + } + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_get_sfn_display_name: Get display name for SFN entry +//----------------------------------------------------------------------------- +int fatfs_get_sfn_display_name(char* out, char* in) +{ + int len = 0; + while (*in && len <= 11) + { + char a = *in++; + + if (a == ' ') + continue; + // Make lower case if uppercase + else if ((a>='A') && (a<='Z')) + a+= 32; + + *out++ = a; + len++; + } + + *out = '\0'; + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_get_extension: Get extension of filename passed in 'filename'. +// Returned extension is always lower case. +// Returns: 1 if ok, 0 if not. +//----------------------------------------------------------------------------- +int fatfs_get_extension(char* filename, char* out, int maxlen) +{ + int len = 0; + + // Get files extension offset + int ext_pos = FileString_GetExtension(filename); + + if (ext_pos > 0 && out && maxlen) + { + filename += ext_pos + 1; + + while (*filename && len < (maxlen-1)) + { + char a = *filename++; + + // Make lowercase if uppercase + if ((a>='A') && (a<='Z')) + a+= 32; + + *out++ = a; + len++; + } + + *out = '\0'; + return 1; + } + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_create_path_string: Append path & filename to create file path string. +// Returns: 1 if ok, 0 if not. +//----------------------------------------------------------------------------- +int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen) +{ + int len = 0; + char last = 0; + char seperator = '/'; + + if (path && filename && out && maxlen > 0) + { + while (*path && len < (maxlen-2)) + { + last = *path++; + if (last == '\\') + seperator = '\\'; + *out++ = last; + len++; + } + + // Add a seperator if trailing one not found + if (last != '\\' && last != '/') + *out++ = seperator; + + while (*filename && len < (maxlen-1)) + { + *out++ = *filename++; + len++; + } + + *out = '\0'; + + return 1; + } + + return 0; +} +//----------------------------------------------------------------------------- +// Test Bench +//----------------------------------------------------------------------------- +#ifdef FAT_STRING_TESTBENCH +void main(void) +{ + char output[255]; + char output2[255]; + + assert(fatfs_total_path_levels("C:\\folder\\file.zip") == 1); + assert(fatfs_total_path_levels("C:\\file.zip") == 0); + assert(fatfs_total_path_levels("C:\\folder\\folder2\\file.zip") == 2); + assert(fatfs_total_path_levels("C:\\") == -1); + assert(fatfs_total_path_levels("") == -1); + assert(fatfs_total_path_levels("/dev/etc/file.zip") == 2); + assert(fatfs_total_path_levels("/dev/file.zip") == 1); + + assert(fatfs_get_substring("C:\\folder\\file.zip", 0, output, sizeof(output)) == 0); + assert(strcmp(output, "folder") == 0); + + assert(fatfs_get_substring("C:\\folder\\file.zip", 1, output, sizeof(output)) == 0); + assert(strcmp(output, "file.zip") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 0, output, sizeof(output)) == 0); + assert(strcmp(output, "dev") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 1, output, sizeof(output)) == 0); + assert(strcmp(output, "etc") == 0); + + assert(fatfs_get_substring("/dev/etc/file.zip", 2, output, sizeof(output)) == 0); + assert(strcmp(output, "file.zip") == 0); + + assert(fatfs_split_path("C:\\folder\\file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(strcmp(output, "C:\\folder") == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(fatfs_split_path("C:\\file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(output[0] == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(fatfs_split_path("/dev/etc/file.zip", output, sizeof(output), output2, sizeof(output2)) == 0); + assert(strcmp(output, "/dev/etc") == 0); + assert(strcmp(output2, "file.zip") == 0); + + assert(FileString_GetExtension("C:\\file.zip") == strlen("C:\\file")); + assert(FileString_GetExtension("C:\\file.zip.ext") == strlen("C:\\file.zip")); + assert(FileString_GetExtension("C:\\file.zip.") == strlen("C:\\file.zip")); + + assert(FileString_TrimLength("C:\\file.zip", strlen("C:\\file.zip")) == strlen("C:\\file.zip")); + assert(FileString_TrimLength("C:\\file.zip ", strlen("C:\\file.zip ")) == strlen("C:\\file.zip")); + assert(FileString_TrimLength(" ", strlen(" ")) == 0); + + assert(fatfs_compare_names("C:\\file.ext", "C:\\file.ext") == 1); + assert(fatfs_compare_names("C:\\file2.ext", "C:\\file.ext") == 0); + assert(fatfs_compare_names("C:\\file .ext", "C:\\file.ext") == 1); + assert(fatfs_compare_names("C:\\file .ext", "C:\\file2.ext") == 0); + + assert(fatfs_string_ends_with_slash("C:\\folder") == 0); + assert(fatfs_string_ends_with_slash("C:\\folder\\") == 1); + assert(fatfs_string_ends_with_slash("/path") == 0); + assert(fatfs_string_ends_with_slash("/path/a") == 0); + assert(fatfs_string_ends_with_slash("/path/") == 1); + + assert(fatfs_get_extension("/mypath/file.wav", output, 4) == 1); + assert(strcmp(output, "wav") == 0); + assert(fatfs_get_extension("/mypath/file.WAV", output, 4) == 1); + assert(strcmp(output, "wav") == 0); + assert(fatfs_get_extension("/mypath/file.zip", output, 4) == 1); + assert(strcmp(output, "ext") != 0); + + assert(fatfs_create_path_string("/mydir1", "myfile.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "/mydir1/myfile.txt") == 0); + assert(fatfs_create_path_string("/mydir2/", "myfile2.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "/mydir2/myfile2.txt") == 0); + assert(fatfs_create_path_string("C:\\mydir3", "myfile3.txt", output, sizeof(output)) == 1); + assert(strcmp(output, "C:\\mydir3\\myfile3.txt") == 0); +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_string.h b/src/gui/Lib/fat_io_lib/fat_string.h new file mode 100644 index 0000000..90ca8e0 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_string.h @@ -0,0 +1,20 @@ +#ifndef __FILESTRING_H__ +#define __FILESTRING_H__ + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_total_path_levels(char *path); +int fatfs_get_substring(char *Path, int levelreq, char *output, int max_len); +int fatfs_split_path(char *FullPath, char *Path, int max_path, char *FileName, int max_filename); +int fatfs_compare_names(char* strA, char* strB); +int fatfs_string_ends_with_slash(char *path); +int fatfs_get_sfn_display_name(char* out, char* in); +int fatfs_get_extension(char* filename, char* out, int maxlen); +int fatfs_create_path_string(char* path, char *filename, char* out, int maxlen); + +#ifndef NULL + #define NULL 0 +#endif + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_table.c b/src/gui/Lib/fat_io_lib/fat_table.c new file mode 100644 index 0000000..8d05d3b --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_table.c @@ -0,0 +1,478 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" + +#ifndef FAT_BUFFERS + #define FAT_BUFFERS 1 +#endif + +#ifndef FAT_BUFFER_SECTORS + #define FAT_BUFFER_SECTORS 1 +#endif + +#if FAT_BUFFERS < 1 || FAT_BUFFER_SECTORS < 1 + #error "FAT_BUFFERS & FAT_BUFFER_SECTORS must be at least 1" +#endif + +//----------------------------------------------------------------------------- +// FAT Sector Buffer +//----------------------------------------------------------------------------- +#define FAT32_GET_32BIT_WORD(pbuf, location) ( GET_32BIT_WORD(pbuf->ptr, location) ) +#define FAT32_SET_32BIT_WORD(pbuf, location, value) { SET_32BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; } +#define FAT16_GET_16BIT_WORD(pbuf, location) ( GET_16BIT_WORD(pbuf->ptr, location) ) +#define FAT16_SET_16BIT_WORD(pbuf, location, value) { SET_16BIT_WORD(pbuf->ptr, location, value); pbuf->dirty = 1; } + +//----------------------------------------------------------------------------- +// fatfs_fat_init: +//----------------------------------------------------------------------------- +void fatfs_fat_init(struct fatfs *fs) +{ + int i; + + // FAT buffer chain head + fs->fat_buffer_head = NULL; + + for (i=0;ifat_buffers[i].address = FAT32_INVALID_CLUSTER; + fs->fat_buffers[i].dirty = 0; + memset(fs->fat_buffers[i].sector, 0x00, sizeof(fs->fat_buffers[i].sector)); + fs->fat_buffers[i].ptr = NULL; + + // Add to head of queue + fs->fat_buffers[i].next = fs->fat_buffer_head; + fs->fat_buffer_head = &fs->fat_buffers[i]; + } +} +//----------------------------------------------------------------------------- +// fatfs_fat_writeback: Writeback 'dirty' FAT sectors to disk +//----------------------------------------------------------------------------- +static int fatfs_fat_writeback(struct fatfs *fs, struct fat_buffer *pcur) +{ + if (pcur) + { + // Writeback sector if changed + if (pcur->dirty) + { + if (fs->disk_io.write_media) + { + uint32 sectors = FAT_BUFFER_SECTORS; + uint32 offset = pcur->address - fs->fat_begin_lba; + + // Limit to sectors used for the FAT + if ((offset + FAT_BUFFER_SECTORS) <= fs->fat_sectors) + sectors = FAT_BUFFER_SECTORS; + else + sectors = fs->fat_sectors - offset; + + if (!fs->disk_io.write_media(pcur->address, pcur->sector, sectors)) + return 0; + } + + pcur->dirty = 0; + } + + return 1; + } + else + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_fat_read_sector: Read a FAT sector +//----------------------------------------------------------------------------- +static struct fat_buffer *fatfs_fat_read_sector(struct fatfs *fs, uint32 sector) +{ + struct fat_buffer *last = NULL; + struct fat_buffer *pcur = fs->fat_buffer_head; + + // Itterate through sector buffer list + while (pcur) + { + // Sector within this buffer? + if ((sector >= pcur->address) && (sector < (pcur->address + FAT_BUFFER_SECTORS))) + break; + + // End of list? + if (pcur->next == NULL) + { + // Remove buffer from list + if (last) + last->next = NULL; + // We the first and last buffer in the chain? + else + fs->fat_buffer_head = NULL; + } + + last = pcur; + pcur = pcur->next; + } + + // We found the sector already in FAT buffer chain + if (pcur) + { + pcur->ptr = (uint8 *)(pcur->sector + ((sector - pcur->address) * FAT_SECTOR_SIZE)); + return pcur; + } + + // Else, we removed the last item from the list + pcur = last; + + // Add to start of sector buffer list (now newest sector) + pcur->next = fs->fat_buffer_head; + fs->fat_buffer_head = pcur; + + // Writeback sector if changed + if (pcur->dirty) + if (!fatfs_fat_writeback(fs, pcur)) + return 0; + + // Address is now new sector + pcur->address = sector; + + // Read next sector + if (!fs->disk_io.read_media(pcur->address, pcur->sector, FAT_BUFFER_SECTORS)) + { + // Read failed, invalidate buffer address + pcur->address = FAT32_INVALID_CLUSTER; + return NULL; + } + + pcur->ptr = pcur->sector; + return pcur; +} +//----------------------------------------------------------------------------- +// fatfs_fat_purge: Purge 'dirty' FAT sectors to disk +//----------------------------------------------------------------------------- +int fatfs_fat_purge(struct fatfs *fs) +{ + struct fat_buffer *pcur = fs->fat_buffer_head; + + // Itterate through sector buffer list + while (pcur) + { + // Writeback sector if changed + if (pcur->dirty) + if (!fatfs_fat_writeback(fs, pcur)) + return 0; + + pcur = pcur->next; + } + + return 1; +} + +//----------------------------------------------------------------------------- +// General FAT Table Operations +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// fatfs_find_next_cluster: Return cluster number of next cluster in chain by +// reading FAT table and traversing it. Return 0xffffffff for end of chain. +//----------------------------------------------------------------------------- +uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster) +{ + uint32 fat_sector_offset, position; + uint32 nextcluster; + struct fat_buffer *pbuf; + + // Why is '..' labelled with cluster 0 when it should be 2 ?? + if (current_cluster == 0) + current_cluster = 2; + + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = current_cluster / 256; + else + fat_sector_offset = current_cluster / 128; + + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return (FAT32_LAST_CLUSTER); + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 256)) * 2; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT16_GET_16BIT_WORD(pbuf, (uint16)position); + + // If end of chain found + if (nextcluster >= 0xFFF8 && nextcluster <= 0xFFFF) + return (FAT32_LAST_CLUSTER); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 128)) * 4; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT32_GET_32BIT_WORD(pbuf, (uint16)position); + + // Mask out MS 4 bits (its 28bit addressing) + nextcluster = nextcluster & 0x0FFFFFFF; + + // If end of chain found + if (nextcluster >= 0x0FFFFFF8 && nextcluster <= 0x0FFFFFFF) + return (FAT32_LAST_CLUSTER); + } + + // Else return next cluster + return (nextcluster); +} +//----------------------------------------------------------------------------- +// fatfs_set_fs_info_next_free_cluster: Write the next free cluster to the FSINFO table +//----------------------------------------------------------------------------- +void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue) +{ + if (fs->fat_type == FAT_TYPE_16) + ; + else + { + // Load sector to change it + struct fat_buffer *pbuf = fatfs_fat_read_sector(fs, fs->lba_begin+fs->fs_info_sector); + if (!pbuf) + return ; + + // Change + FAT32_SET_32BIT_WORD(pbuf, 492, newValue); + fs->next_free_cluster = newValue; + + // Write back FSINFO sector to disk + if (fs->disk_io.write_media) + fs->disk_io.write_media(pbuf->address, pbuf->sector, 1); + + // Invalidate cache entry + pbuf->address = FAT32_INVALID_CLUSTER; + pbuf->dirty = 0; + } +} +//----------------------------------------------------------------------------- +// fatfs_find_blank_cluster: Find a free cluster entry by reading the FAT +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster) +{ + uint32 fat_sector_offset, position; + uint32 nextcluster; + uint32 current_cluster = start_cluster; + struct fat_buffer *pbuf; + + do + { + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = current_cluster / 256; + else + fat_sector_offset = current_cluster / 128; + + if ( fat_sector_offset < fs->fat_sectors) + { + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return 0; + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 256)) * 2; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT16_GET_16BIT_WORD(pbuf, (uint16)position); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (current_cluster - (fat_sector_offset * 128)) * 4; + + // Read Next Clusters value from Sector Buffer + nextcluster = FAT32_GET_32BIT_WORD(pbuf, (uint16)position); + + // Mask out MS 4 bits (its 28bit addressing) + nextcluster = nextcluster & 0x0FFFFFFF; + } + + if (nextcluster !=0 ) + current_cluster++; + } + else + // Otherwise, run out of FAT sectors to check... + return 0; + } + while (nextcluster != 0x0); + + // Found blank entry + *free_cluster = current_cluster; + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_fat_set_cluster: Set a cluster link in the chain. NOTE: Immediate +// write (slow). +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster) +{ + struct fat_buffer *pbuf; + uint32 fat_sector_offset, position; + + // Find which sector of FAT table to read + if (fs->fat_type == FAT_TYPE_16) + fat_sector_offset = cluster / 256; + else + fat_sector_offset = cluster / 128; + + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba+fat_sector_offset); + if (!pbuf) + return 0; + + if (fs->fat_type == FAT_TYPE_16) + { + // Find 16 bit entry of current sector relating to cluster number + position = (cluster - (fat_sector_offset * 256)) * 2; + + // Write Next Clusters value to Sector Buffer + FAT16_SET_16BIT_WORD(pbuf, (uint16)position, ((uint16)next_cluster)); + } + else + { + // Find 32 bit entry of current sector relating to cluster number + position = (cluster - (fat_sector_offset * 128)) * 4; + + // Write Next Clusters value to Sector Buffer + FAT32_SET_32BIT_WORD(pbuf, (uint16)position, next_cluster); + } + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_free_cluster_chain: Follow a chain marking each element as free +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster) +{ + uint32 last_cluster; + uint32 next_cluster = start_cluster; + + // Loop until end of chain + while ( (next_cluster != FAT32_LAST_CLUSTER) && (next_cluster != 0x00000000) ) + { + last_cluster = next_cluster; + + // Find next link + next_cluster = fatfs_find_next_cluster(fs, next_cluster); + + // Clear last link + fatfs_fat_set_cluster(fs, last_cluster, 0x00000000); + } + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_fat_add_cluster_to_chain: Follow a chain marking and then add a new entry +// to the current tail. +//----------------------------------------------------------------------------- +#if FATFS_INC_WRITE_SUPPORT +int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry) +{ + uint32 last_cluster = FAT32_LAST_CLUSTER; + uint32 next_cluster = start_cluster; + + if (start_cluster == FAT32_LAST_CLUSTER) + return 0; + + // Loop until end of chain + while ( next_cluster != FAT32_LAST_CLUSTER ) + { + last_cluster = next_cluster; + + // Find next link + next_cluster = fatfs_find_next_cluster(fs, next_cluster); + if (!next_cluster) + return 0; + } + + // Add link in for new cluster + fatfs_fat_set_cluster(fs, last_cluster, newEntry); + + // Mark new cluster as end of chain + fatfs_fat_set_cluster(fs, newEntry, FAT32_LAST_CLUSTER); + + return 1; +} +#endif +//----------------------------------------------------------------------------- +// fatfs_count_free_clusters: +//----------------------------------------------------------------------------- +uint32 fatfs_count_free_clusters(struct fatfs *fs) +{ + uint32 i,j; + uint32 count = 0; + struct fat_buffer *pbuf; + + for (i = 0; i < fs->fat_sectors; i++) + { + // Read FAT sector into buffer + pbuf = fatfs_fat_read_sector(fs, fs->fat_begin_lba + i); + if (!pbuf) + break; + + for (j = 0; j < FAT_SECTOR_SIZE; ) + { + if (fs->fat_type == FAT_TYPE_16) + { + if (FAT16_GET_16BIT_WORD(pbuf, (uint16)j) == 0) + count++; + + j += 2; + } + else + { + if (FAT32_GET_32BIT_WORD(pbuf, (uint16)j) == 0) + count++; + + j += 4; + } + } + } + + return count; +} diff --git a/src/gui/Lib/fat_io_lib/fat_table.h b/src/gui/Lib/fat_io_lib/fat_table.h new file mode 100644 index 0000000..ead75f3 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_table.h @@ -0,0 +1,20 @@ +#ifndef __FAT_TABLE_H__ +#define __FAT_TABLE_H__ + +#include "fat_opts.h" +#include "fat_misc.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +void fatfs_fat_init(struct fatfs *fs); +int fatfs_fat_purge(struct fatfs *fs); +uint32 fatfs_find_next_cluster(struct fatfs *fs, uint32 current_cluster); +void fatfs_set_fs_info_next_free_cluster(struct fatfs *fs, uint32 newValue); +int fatfs_find_blank_cluster(struct fatfs *fs, uint32 start_cluster, uint32 *free_cluster); +int fatfs_fat_set_cluster(struct fatfs *fs, uint32 cluster, uint32 next_cluster); +int fatfs_fat_add_cluster_to_chain(struct fatfs *fs, uint32 start_cluster, uint32 newEntry); +int fatfs_free_cluster_chain(struct fatfs *fs, uint32 start_cluster); +uint32 fatfs_count_free_clusters(struct fatfs *fs); + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_types.h b/src/gui/Lib/fat_io_lib/fat_types.h new file mode 100644 index 0000000..5e2cca8 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_types.h @@ -0,0 +1,69 @@ +#ifndef __FAT_TYPES_H__ +#define __FAT_TYPES_H__ + +// Detect 64-bit compilation on GCC +#if defined(__GNUC__) && defined(__SIZEOF_LONG__) + #if __SIZEOF_LONG__ == 8 + #define FATFS_DEF_UINT32_AS_INT + #endif +#endif + +//------------------------------------------------------------- +// System specific types +//------------------------------------------------------------- +#ifndef FATFS_NO_DEF_TYPES + typedef unsigned char uint8; + typedef unsigned short uint16; + + // If compiling on a 64-bit machine, use int as 32-bits + #ifdef FATFS_DEF_UINT32_AS_INT + typedef unsigned int uint32; + // Else for 32-bit machines & embedded systems, use long... + #else + typedef unsigned long uint32; + #endif +#endif + +#ifndef NULL + #define NULL 0 +#endif + +//------------------------------------------------------------- +// Endian Macros +//------------------------------------------------------------- +// FAT is little endian so big endian systems need to swap words + +// Little Endian - No swap required +#if FATFS_IS_LITTLE_ENDIAN == 1 + + #define FAT_HTONS(n) (n) + #define FAT_HTONL(n) (n) + +// Big Endian - Swap required +#else + + #define FAT_HTONS(n) ((((uint16)((n) & 0xff)) << 8) | (((n) & 0xff00) >> 8)) + #define FAT_HTONL(n) (((((uint32)(n) & 0xFF)) << 24) | \ + ((((uint32)(n) & 0xFF00)) << 8) | \ + ((((uint32)(n) & 0xFF0000)) >> 8) | \ + ((((uint32)(n) & 0xFF000000)) >> 24)) + +#endif + +//------------------------------------------------------------- +// Structure Packing Compile Options +//------------------------------------------------------------- +#ifdef __GNUC__ + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED __attribute__ ((packed)) +#else + // Other compilers may require other methods of packing structures + #define STRUCT_PACK + #define STRUCT_PACK_BEGIN + #define STRUCT_PACK_END + #define STRUCT_PACKED +#endif + +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_write.c b/src/gui/Lib/fat_io_lib/fat_write.c new file mode 100644 index 0000000..0718cb1 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_write.c @@ -0,0 +1,373 @@ +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +// FAT16/32 File IO Library +// V2.6 +// Ultra-Embedded.com +// Copyright 2003 - 2012 +// +// Email: admin@ultra-embedded.com +// +// License: GPL +// If you would like a version with a more permissive license for use in +// closed source commercial applications please contact me for details. +//----------------------------------------------------------------------------- +// +// This file is part of FAT File IO Library. +// +// FAT File IO Library is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// FAT File IO Library 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with FAT File IO Library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +//----------------------------------------------------------------------------- +//----------------------------------------------------------------------------- +#include +#include "fat_defs.h" +#include "fat_access.h" +#include "fat_table.h" +#include "fat_write.h" +#include "fat_string.h" +#include "fat_misc.h" + +#if FATFS_INC_WRITE_SUPPORT +//----------------------------------------------------------------------------- +// fatfs_add_free_space: Allocate another cluster of free space to the end +// of a files cluster chain. +//----------------------------------------------------------------------------- +int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters) +{ + uint32 i; + uint32 nextcluster; + uint32 start = *startCluster; + + // Set the next free cluster hint to unknown + if (fs->next_free_cluster != FAT32_LAST_CLUSTER) + fatfs_set_fs_info_next_free_cluster(fs, FAT32_LAST_CLUSTER); + + for (i=0;irootdir_first_cluster, &nextcluster)) + { + // Point last to this + fatfs_fat_set_cluster(fs, start, nextcluster); + + // Point this to end of file + fatfs_fat_set_cluster(fs, nextcluster, FAT32_LAST_CLUSTER); + + // Adjust argument reference + start = nextcluster; + if (i == 0) + *startCluster = nextcluster; + } + else + return 0; + } + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_allocate_free_space: Add an ammount of free space to a file either from +// 'startCluster' if newFile = false, or allocating a new start to the chain if +// newFile = true. +//----------------------------------------------------------------------------- +int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size) +{ + uint32 clusterSize; + uint32 clusterCount; + uint32 nextcluster; + + if (size==0) + return 0; + + // Set the next free cluster hint to unknown + if (fs->next_free_cluster != FAT32_LAST_CLUSTER) + fatfs_set_fs_info_next_free_cluster(fs, FAT32_LAST_CLUSTER); + + // Work out size and clusters + clusterSize = fs->sectors_per_cluster * FAT_SECTOR_SIZE; + clusterCount = (size / clusterSize); + + // If any left over + if (size-(clusterSize*clusterCount)) + clusterCount++; + + // Allocated first link in the chain if a new file + if (newFile) + { + if (!fatfs_find_blank_cluster(fs, fs->rootdir_first_cluster, &nextcluster)) + return 0; + + // If this is all that is needed then all done + if (clusterCount==1) + { + fatfs_fat_set_cluster(fs, nextcluster, FAT32_LAST_CLUSTER); + *startCluster = nextcluster; + return 1; + } + } + // Allocate from end of current chain (startCluster is end of chain) + else + nextcluster = *startCluster; + + if (!fatfs_add_free_space(fs, &nextcluster, clusterCount)) + return 0; + + return 1; +} +//----------------------------------------------------------------------------- +// fatfs_find_free_dir_offset: Find a free space in the directory for a new entry +// which takes up 'entryCount' blocks (or allocate some more) +//----------------------------------------------------------------------------- +static int fatfs_find_free_dir_offset(struct fatfs *fs, uint32 dirCluster, int entryCount, uint32 *pSector, uint8 *pOffset) +{ + struct fat_dir_entry *directoryEntry; + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + int x=0; + int possible_spaces = 0; + int start_recorded = 0; + + // No entries required? + if (entryCount == 0) + return 0; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, dirCluster, x++, 0)) + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // Overlay directory entry over buffer + directoryEntry = (struct fat_dir_entry*)(fs->currentsector.sector+recordoffset); + + // LFN Entry + if (fatfs_entry_lfn_text(directoryEntry)) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + // Increment the count in-case the file turns + // out to be deleted... + possible_spaces++; + } + // SFN Entry + else + { + // Has file been deleted? + if (fs->currentsector.sector[recordoffset] == FILE_HEADER_DELETED) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + possible_spaces++; + + // We have found enough space? + if (possible_spaces >= entryCount) + return 1; + + // Else continue counting until we find a valid entry! + } + // Is the file entry empty? + else if (fs->currentsector.sector[recordoffset] == FILE_HEADER_BLANK) + { + // First entry? + if (possible_spaces == 0) + { + // Store start + *pSector = x-1; + *pOffset = item; + start_recorded = 1; + } + + // Increment the blank entries count + possible_spaces++; + + // We have found enough space? + if (possible_spaces >= entryCount) + return 1; + } + // File entry is valid + else + { + // Reset all flags + possible_spaces = 0; + start_recorded = 0; + } + } + } // End of for + } // End of if + // Run out of free space in the directory, allocate some more + else + { + uint32 newCluster; + + // Get a new cluster for directory + if (!fatfs_find_blank_cluster(fs, fs->rootdir_first_cluster, &newCluster)) + return 0; + + // Add cluster to end of directory tree + if (!fatfs_fat_add_cluster_to_chain(fs, dirCluster, newCluster)) + return 0; + + // Erase new directory cluster + memset(fs->currentsector.sector, 0x00, FAT_SECTOR_SIZE); + for (i=0;isectors_per_cluster;i++) + { + if (!fatfs_write_sector(fs, newCluster, i, 0)) + return 0; + } + + // If non of the name fitted on previous sectors + if (!start_recorded) + { + // Store start + *pSector = (x-1); + *pOffset = 0; + start_recorded = 1; + } + + return 1; + } + } // End of while loop + + return 0; +} +//----------------------------------------------------------------------------- +// fatfs_add_file_entry: Add a directory entry to a location found by FindFreeOffset +//----------------------------------------------------------------------------- +int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir) +{ + uint8 item=0; + uint16 recordoffset = 0; + uint8 i=0; + uint32 x=0; + int entryCount; + struct fat_dir_entry shortEntry; + int dirtySector = 0; + + uint32 dirSector = 0; + uint8 dirOffset = 0; + int foundEnd = 0; + + uint8 checksum; + uint8 *pSname; + + // No write access? + if (!fs->disk_io.write_media) + return 0; + +#if FATFS_INC_LFN_SUPPORT + // How many LFN entries are required? + // NOTE: We always request one LFN even if it would fit in a SFN! + entryCount = fatfs_lfn_entries_required(filename); + if (!entryCount) + return 0; +#else + entryCount = 0; +#endif + + // Find space in the directory for this filename (or allocate some more) + // NOTE: We need to find space for at least the LFN + SFN (or just the SFN if LFNs not supported). + if (!fatfs_find_free_dir_offset(fs, dirCluster, entryCount + 1, &dirSector, &dirOffset)) + return 0; + + // Generate checksum of short filename + pSname = (uint8*)shortfilename; + checksum = 0; + for (i=11; i!=0; i--) checksum = ((checksum & 1) ? 0x80 : 0) + (checksum >> 1) + *pSname++; + + // Start from current sector where space was found! + x = dirSector; + + // Main cluster following loop + while (1) + { + // Read sector + if (fatfs_sector_reader(fs, dirCluster, x++, 0)) + { + // Analyse Sector + for (item = 0; item < FAT_DIR_ENTRIES_PER_SECTOR; item++) + { + // Create the multiplier for sector access + recordoffset = FAT_DIR_ENTRY_SIZE * item; + + // If the start position for the entry has been found + if (foundEnd==0) + if ( (dirSector==(x-1)) && (dirOffset==item) ) + foundEnd = 1; + + // Start adding filename + if (foundEnd) + { + if (entryCount==0) + { + // Short filename + fatfs_sfn_create_entry(shortfilename, size, startCluster, &shortEntry, dir); + +#if FATFS_INC_TIME_DATE_SUPPORT + // Update create, access & modify time & date + fatfs_update_timestamps(&shortEntry, 1, 1, 1); +#endif + + memcpy(&fs->currentsector.sector[recordoffset], &shortEntry, sizeof(shortEntry)); + + // Writeback + return fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1); + } +#if FATFS_INC_LFN_SUPPORT + else + { + entryCount--; + + // Copy entry to directory buffer + fatfs_filename_to_lfn(filename, &fs->currentsector.sector[recordoffset], entryCount, checksum); + dirtySector = 1; + } +#endif + } + } // End of if + + // Write back to disk before loading another sector + if (dirtySector) + { + if (!fs->disk_io.write_media(fs->currentsector.address, fs->currentsector.sector, 1)) + return 0; + + dirtySector = 0; + } + } + else + return 0; + } // End of while loop + + return 0; +} +#endif diff --git a/src/gui/Lib/fat_io_lib/fat_write.h b/src/gui/Lib/fat_io_lib/fat_write.h new file mode 100644 index 0000000..5558a86 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/fat_write.h @@ -0,0 +1,14 @@ +#ifndef __FAT_WRITE_H__ +#define __FAT_WRITE_H__ + +#include "fat_defs.h" +#include "fat_opts.h" + +//----------------------------------------------------------------------------- +// Prototypes +//----------------------------------------------------------------------------- +int fatfs_add_file_entry(struct fatfs *fs, uint32 dirCluster, char *filename, char *shortfilename, uint32 startCluster, uint32 size, int dir); +int fatfs_add_free_space(struct fatfs *fs, uint32 *startCluster, uint32 clusters); +int fatfs_allocate_free_space(struct fatfs *fs, int newFile, uint32 *startCluster, uint32 size); + +#endif diff --git a/src/gui/Lib/fat_io_lib/version.txt b/src/gui/Lib/fat_io_lib/version.txt new file mode 100644 index 0000000..5a00a98 --- /dev/null +++ b/src/gui/Lib/fat_io_lib/version.txt @@ -0,0 +1 @@ +2.6.11 diff --git a/src/gui/Lib/libhttp/buildlib.sh b/src/gui/Lib/libhttp/buildlib.sh new file mode 100644 index 0000000..07c542f --- /dev/null +++ b/src/gui/Lib/libhttp/buildlib.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +# https://github.com/lammertb/libhttp/archive/v1.8.tar.gz + + +# rm -rf include +# rm -rf lib +# mkdir include +# mkdir lib + +# rm -rf libhttp-1.8 +# tar xf libhttp-1.8.tar.gz +# cd libhttp-1.8 +# cp -a include/civetweb.h ../include/ + + +# cd .. +# rm -rf libhttp-1.8 +# tar xf libhttp-1.8.tar.gz +# cd libhttp-1.8 +# make lib COPT="-DNDEBUG -DNO_CGI -DNO_CACHING -DNO_SSL -DSQLITE_DISABLE_LFS -DSSL_ALREADY_INITIALIZED" +# cp -a libcivetweb.a ../lib/libcivetweb_64.a + + + +# cd .. +# rm -rf libhttp-1.8 +# tar xf libhttp-1.8.tar.gz +# cd libhttp-1.8 +# make lib COPT="-m32 -DNDEBUG -DNO_CGI -DNO_CACHING -DNO_SSL -DSQLITE_DISABLE_LFS -DSSL_ALREADY_INITIALIZED" +# cp -a libcivetweb.a ../lib/libcivetweb_32.a + + + +# cd .. +# rm -rf libhttp-1.8 +# tar xf libhttp-1.8.tar.gz +# cd libhttp-1.8 +# make lib CC=aarch64-linux-gnu-gcc COPT="-DNDEBUG -DNO_CGI -DNO_CACHING -DNO_SSL -DSQLITE_DISABLE_LFS -DSSL_ALREADY_INITIALIZED" +# cp -a libcivetweb.a ../lib/libcivetweb_aa64.a + + +# cd .. +# rm -rf libhttp-1.8 + + diff --git a/src/gui/Lib/libhttp/include/civetweb.c b/src/gui/Lib/libhttp/include/civetweb.c new file mode 100644 index 0000000..98130f5 --- /dev/null +++ b/src/gui/Lib/libhttp/include/civetweb.c @@ -0,0 +1,13145 @@ +/* Copyright (c) 2013-2016 the Civetweb developers + * Copyright (c) 2004-2013 Sergey Lyubka + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + + +#if defined(_WIN32) +#if !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS /* Disable deprecation warning in VS2005 */ +#endif +#ifndef _WIN32_WINNT /* defined for tdm-gcc so we can use getnameinfo */ +#define _WIN32_WINNT 0x0501 +#endif +#else +#if defined(__GNUC__) && !defined(_GNU_SOURCE) +#define _GNU_SOURCE /* for setgroups() */ +#endif +#if defined(__linux__) && !defined(_XOPEN_SOURCE) +#define _XOPEN_SOURCE 600 /* For flockfile() on Linux */ +#endif +#ifndef _LARGEFILE_SOURCE +#define _LARGEFILE_SOURCE /* For fseeko(), ftello() */ +#endif +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 64 /* Use 64-bit file offsets by default */ +#endif +#ifndef __STDC_FORMAT_MACROS +#define __STDC_FORMAT_MACROS /* wants this for C++ */ +#endif +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS /* C++ wants that for INT64_MAX */ +#endif +#ifdef __sun +#define __EXTENSIONS__ /* to expose flockfile and friends in stdio.h */ +#define __inline inline /* not recognized on older compiler versions */ +#endif +#endif + +#if defined(USE_LUA) && defined(USE_WEBSOCKET) +#define USE_TIMERS +#endif + +#if defined(_MSC_VER) +/* 'type cast' : conversion from 'int' to 'HANDLE' of greater size */ +#pragma warning(disable : 4306) +/* conditional expression is constant: introduced by FD_SET(..) */ +#pragma warning(disable : 4127) +/* non-constant aggregate initializer: issued due to missing C99 support */ +#pragma warning(disable : 4204) +/* padding added after data member */ +#pragma warning(disable : 4820) +/* not defined as a preprocessor macro, replacing with '0' for '#if/#elif' */ +#pragma warning(disable : 4668) +/* no function prototype given: converting '()' to '(void)' */ +#pragma warning(disable : 4255) +/* function has been selected for automatic inline expansion */ +#pragma warning(disable : 4711) +#endif + + +/* This code uses static_assert to check some conditions. + * Unfortunately some compilers still do not support it, so we have a + * replacement function here. */ +#if defined(_MSC_VER) && (_MSC_VER >= 1600) +#define mg_static_assert static_assert +#elif defined(__cplusplus) && (__cplusplus >= 201103L) +#define mg_static_assert static_assert +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +#define mg_static_assert _Static_assert +#else +char static_assert_replacement[1]; +#define mg_static_assert(cond, txt) \ + extern char static_assert_replacement[(cond) ? 1 : -1] +#endif + +mg_static_assert(sizeof(int) == 4 || sizeof(int) == 8, + "int data type size check"); +mg_static_assert(sizeof(void *) == 4 || sizeof(void *) == 8, + "pointer data type size check"); +mg_static_assert(sizeof(void *) >= sizeof(int), "data type size check"); +/* mg_static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8, "size_t data + * type size check"); */ + +/* DTL -- including winsock2.h works better if lean and mean */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif + +#if defined(__SYMBIAN32__) +#define NO_SSL /* SSL is not supported */ +#define NO_CGI /* CGI is not supported */ +#define PATH_MAX FILENAME_MAX +#endif /* __SYMBIAN32__ */ + + +/* Include the header file here, so the CivetWeb interface is defined for the + * entire implementation, including the following forward definitions. */ +#include "civetweb.h" + + +#ifndef IGNORE_UNUSED_RESULT +#define IGNORE_UNUSED_RESULT(a) ((void)((a) && 1)) +#endif + +#ifndef _WIN32_WCE /* Some ANSI #includes are not available on Windows CE */ +#include +#include +#include +#include +#include +#endif /* !_WIN32_WCE */ + +#ifdef __MACH__ + +#define CLOCK_MONOTONIC (1) +#define CLOCK_REALTIME (2) + +#include +#include +#include +#include +#include + + +/* clock_gettime is not implemented on OSX */ +int clock_gettime(int clk_id, struct timespec *t); + +int +clock_gettime(int clk_id, struct timespec *t) +{ + memset(t, 0, sizeof(*t)); + if (clk_id == CLOCK_REALTIME) { + struct timeval now; + int rv = gettimeofday(&now, NULL); + if (rv) { + return rv; + } + t->tv_sec = now.tv_sec; + t->tv_nsec = now.tv_usec * 1000; + return 0; + + } else if (clk_id == CLOCK_MONOTONIC) { + static uint64_t clock_start_time = 0; + static mach_timebase_info_data_t timebase_ifo = {0, 0}; + + uint64_t now = mach_absolute_time(); + + if (clock_start_time == 0) { + kern_return_t mach_status = mach_timebase_info(&timebase_ifo); +#if defined(DEBUG) + assert(mach_status == KERN_SUCCESS); +#else + /* appease "unused variable" warning for release builds */ + (void)mach_status; +#endif + clock_start_time = now; + } + + now = (uint64_t)((double)(now - clock_start_time) + * (double)timebase_ifo.numer + / (double)timebase_ifo.denom); + + t->tv_sec = now / 1000000000; + t->tv_nsec = now % 1000000000; + return 0; + } + return -1; /* EINVAL - Clock ID is unknown */ +} +#endif + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#ifndef MAX_WORKER_THREADS +#define MAX_WORKER_THREADS (1024 * 64) +#endif +#ifndef SOCKET_TIMEOUT_QUANTUM +#define SOCKET_TIMEOUT_QUANTUM (10000) +#endif + +mg_static_assert(MAX_WORKER_THREADS >= 1, + "worker threads must be a positive number"); + +#if defined(_WIN32) \ + && !defined(__SYMBIAN32__) /* WINDOWS / UNIX include block */ +#include +#include /* DTL add for SO_EXCLUSIVE */ +#include + +typedef const char *SOCK_OPT_TYPE; + +#if !defined(PATH_MAX) +#define PATH_MAX (MAX_PATH) +#endif + +#if !defined(PATH_MAX) +#define PATH_MAX (4096) +#endif + +mg_static_assert(PATH_MAX >= 1, "path length must be a positive number"); + +#ifndef _IN_PORT_T +#ifndef in_port_t +#define in_port_t u_short +#endif +#endif + +#ifndef _WIN32_WCE +#include +#include +#include +#else /* _WIN32_WCE */ +#define NO_CGI /* WinCE has no pipes */ + +typedef long off_t; + +#define errno ((int)(GetLastError())) +#define strerror(x) (_ultoa(x, (char *)_alloca(sizeof(x) * 3), 10)) +#endif /* _WIN32_WCE */ + +#define MAKEUQUAD(lo, hi) \ + ((uint64_t)(((uint32_t)(lo)) | ((uint64_t)((uint32_t)(hi))) << 32)) +#define RATE_DIFF (10000000) /* 100 nsecs */ +#define EPOCH_DIFF (MAKEUQUAD(0xd53e8000, 0x019db1de)) +#define SYS2UNIX_TIME(lo, hi) \ + ((time_t)((MAKEUQUAD((lo), (hi)) - EPOCH_DIFF) / RATE_DIFF)) + +/* Visual Studio 6 does not know __func__ or __FUNCTION__ + * The rest of MS compilers use __FUNCTION__, not C99 __func__ + * Also use _strtoui64 on modern M$ compilers */ +#if defined(_MSC_VER) +#if (_MSC_VER < 1300) +#define STRX(x) #x +#define STR(x) STRX(x) +#define __func__ __FILE__ ":" STR(__LINE__) +#define strtoull(x, y, z) ((unsigned __int64)_atoi64(x)) +#define strtoll(x, y, z) (_atoi64(x)) +#else +#define __func__ __FUNCTION__ +#define strtoull(x, y, z) (_strtoui64(x, y, z)) +#define strtoll(x, y, z) (_strtoi64(x, y, z)) +#endif +#endif /* _MSC_VER */ + +#define ERRNO ((int)(GetLastError())) +#define NO_SOCKLEN_T + +#if defined(_WIN64) || defined(__MINGW64__) +#define SSL_LIB "ssleay64.dll" +#define CRYPTO_LIB "libeay64.dll" +#else +#define SSL_LIB "ssleay32.dll" +#define CRYPTO_LIB "libeay32.dll" +#endif + +#define O_NONBLOCK (0) +#ifndef W_OK +#define W_OK (2) /* http://msdn.microsoft.com/en-us/library/1w06ktdy.aspx */ +#endif +#if !defined(EWOULDBLOCK) +#define EWOULDBLOCK WSAEWOULDBLOCK +#endif /* !EWOULDBLOCK */ +#define _POSIX_ +#define INT64_FMT "I64d" +#define UINT64_FMT "I64u" + +#define WINCDECL __cdecl +#define SHUT_RD (0) +#define SHUT_WR (1) +#define SHUT_BOTH (2) +#define vsnprintf_impl _vsnprintf +#define access _access +#define mg_sleep(x) (Sleep(x)) + +#define pipe(x) _pipe(x, MG_BUF_LEN, _O_BINARY) +#ifndef popen +#define popen(x, y) (_popen(x, y)) +#endif +#ifndef pclose +#define pclose(x) (_pclose(x)) +#endif +#define close(x) (_close(x)) +#define dlsym(x, y) (GetProcAddress((HINSTANCE)(x), (y))) +#define RTLD_LAZY (0) +#define fseeko(x, y, z) (_lseeki64(_fileno(x), (y), (z)) == -1 ? -1 : 0) +#define fdopen(x, y) (_fdopen((x), (y))) +#define write(x, y, z) (_write((x), (y), (unsigned)z)) +#define read(x, y, z) (_read((x), (y), (unsigned)z)) +#define flockfile(x) (EnterCriticalSection(&global_log_file_lock)) +#define funlockfile(x) (LeaveCriticalSection(&global_log_file_lock)) +#define sleep(x) (Sleep((x)*1000)) +#define rmdir(x) (_rmdir(x)) +#define timegm(x) (_mkgmtime(x)) + +#if !defined(fileno) +#define fileno(x) (_fileno(x)) +#endif /* !fileno MINGW #defines fileno */ + +typedef HANDLE pthread_mutex_t; +typedef DWORD pthread_key_t; +typedef HANDLE pthread_t; +typedef struct { + CRITICAL_SECTION threadIdSec; + int waitingthreadcount; /* The number of threads queued. */ + pthread_t *waitingthreadhdls; /* The thread handles. */ +} pthread_cond_t; + +#ifndef __clockid_t_defined +typedef DWORD clockid_t; +#endif +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC (1) +#endif +#ifndef CLOCK_REALTIME +#define CLOCK_REALTIME (2) +#endif + +#if defined(_MSC_VER) && (_MSC_VER >= 1900) +#define _TIMESPEC_DEFINED +#endif +#ifndef _TIMESPEC_DEFINED +struct timespec { + time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ +}; +#endif + +#define pid_t HANDLE /* MINGW typedefs pid_t to int. Using #define here. */ + +static int pthread_mutex_lock(pthread_mutex_t *); +static int pthread_mutex_unlock(pthread_mutex_t *); +static void path_to_unicode(const struct mg_connection *conn, + const char *path, + wchar_t *wbuf, + size_t wbuf_len); +struct file; +static const char * +mg_fgets(char *buf, size_t size, struct file *filep, char **p); + + +#if defined(HAVE_STDINT) +#include +#else +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned __int64 uint64_t; +typedef __int64 int64_t; +#define INT64_MAX (9223372036854775807) +#endif /* HAVE_STDINT */ + +/* POSIX dirent interface */ +struct dirent { + char d_name[PATH_MAX]; +}; + +typedef struct DIR { + HANDLE handle; + WIN32_FIND_DATAW info; + struct dirent result; +} DIR; + +#if defined(_WIN32) && !defined(POLLIN) +#ifndef HAVE_POLL +struct pollfd { + SOCKET fd; + short events; + short revents; +}; +#define POLLIN (0x0300) +#endif +#endif + +/* Mark required libraries */ +#if defined(_MSC_VER) +#pragma comment(lib, "Ws2_32.lib") +#endif + +#else /* defined(_WIN32) && !defined(__SYMBIAN32__) - WINDOWS / UNIX include \ + block */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +typedef const void *SOCK_OPT_TYPE; + +#if defined(ANDROID) +typedef unsigned short int in_port_t; +#endif + +#include +#include +#include +#include +#define vsnprintf_impl vsnprintf + +#if !defined(NO_SSL_DL) && !defined(NO_SSL) +#include +#endif +#include +#if defined(__MACH__) +#define SSL_LIB "libssl.dylib" +#define CRYPTO_LIB "libcrypto.dylib" +#else +#if !defined(SSL_LIB) +#define SSL_LIB "libssl.so" +#endif +#if !defined(CRYPTO_LIB) +#define CRYPTO_LIB "libcrypto.so" +#endif +#endif +#ifndef O_BINARY +#define O_BINARY (0) +#endif /* O_BINARY */ +#define closesocket(a) (close(a)) +#define mg_mkdir(conn, path, mode) (mkdir(path, mode)) +#define mg_remove(conn, x) (remove(x)) +#define mg_sleep(x) (usleep((x)*1000)) +#define mg_opendir(conn, x) (opendir(x)) +#define mg_closedir(x) (closedir(x)) +#define mg_readdir(x) (readdir(x)) +#define ERRNO (errno) +#define INVALID_SOCKET (-1) +#define INT64_FMT PRId64 +#define UINT64_FMT PRIu64 +typedef int SOCKET; +#define WINCDECL + +#if defined(__hpux) +/* HPUX 11 does not have monotonic, fall back to realtime */ +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC CLOCK_REALTIME +#endif + +/* HPUX defines socklen_t incorrectly as size_t which is 64bit on + * Itanium. Without defining _XOPEN_SOURCE or _XOPEN_SOURCE_EXTENDED + * the prototypes use int* rather than socklen_t* which matches the + * actual library expectation. When called with the wrong size arg + * accept() returns a zero client inet addr and check_acl() always + * fails. Since socklen_t is widely used below, just force replace + * their typedef with int. - DTL + */ +#define socklen_t int +#endif /* hpux */ + +#endif /* defined(_WIN32) && !defined(__SYMBIAN32__) - WINDOWS / UNIX include \ + block */ + +/* va_copy should always be a macro, C99 and C++11 - DTL */ +#ifndef va_copy +#define va_copy(x, y) ((x) = (y)) +#endif + +#ifdef _WIN32 +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static CRITICAL_SECTION global_log_file_lock; +static DWORD +pthread_self(void) +{ + return GetCurrentThreadId(); +} + + +static int +pthread_key_create( + pthread_key_t *key, + void (*_ignored)(void *) /* destructor not supported for Windows */ + ) +{ + (void)_ignored; + + if ((key != 0)) { + *key = TlsAlloc(); + return (*key != TLS_OUT_OF_INDEXES) ? 0 : -1; + } + return -2; +} + + +static int +pthread_key_delete(pthread_key_t key) +{ + return TlsFree(key) ? 0 : 1; +} + + +static int +pthread_setspecific(pthread_key_t key, void *value) +{ + return TlsSetValue(key, value) ? 0 : 1; +} + + +static void * +pthread_getspecific(pthread_key_t key) +{ + return TlsGetValue(key); +} + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +static struct pthread_mutex_undefined_struct *pthread_mutex_attr = NULL; +#else +static pthread_mutexattr_t pthread_mutex_attr; +#endif /* _WIN32 */ + + +#define PASSWORDS_FILE_NAME ".htpasswd" +#define CGI_ENVIRONMENT_SIZE (4096) +#define MAX_CGI_ENVIR_VARS (256) +#define MG_BUF_LEN (8192) + +#ifndef MAX_REQUEST_SIZE +#define MAX_REQUEST_SIZE (16384) +#endif + +mg_static_assert(MAX_REQUEST_SIZE >= 256, + "request size length must be a positive number"); + +#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0])) + +#if !defined(DEBUG_TRACE) +#if defined(DEBUG) + + +static void DEBUG_TRACE_FUNC(const char *func, + unsigned line, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(3, 4); + +static void +DEBUG_TRACE_FUNC(const char *func, unsigned line, const char *fmt, ...) +{ + va_list args; + flockfile(stdout); + printf("*** %lu.%p.%s.%u: ", + (unsigned long)time(NULL), + (void *)pthread_self(), + func, + line); + va_start(args, fmt); + vprintf(fmt, args); + va_end(args); + putchar('\n'); + fflush(stdout); + funlockfile(stdout); +} + +#define DEBUG_TRACE(fmt, ...) \ + DEBUG_TRACE_FUNC(__func__, __LINE__, fmt, __VA_ARGS__) + +#else +#define DEBUG_TRACE(fmt, ...) \ + do { \ + } while (0) +#endif /* DEBUG */ +#endif /* DEBUG_TRACE */ + +#if defined(MEMORY_DEBUGGING) +unsigned long mg_memory_debug_blockCount = 0; +unsigned long mg_memory_debug_totalMemUsed = 0; + + +static void * +mg_malloc_ex(size_t size, const char *file, unsigned line) +{ + void *data = malloc(size + sizeof(size_t)); + void *memory = 0; + char mallocStr[256]; + + if (data) { + *(size_t *)data = size; + mg_memory_debug_totalMemUsed += size; + mg_memory_debug_blockCount++; + memory = (void *)(((char *)data) + sizeof(size_t)); + } + + sprintf(mallocStr, + "MEM: %p %5lu alloc %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)size, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + + return memory; +} + + +static void * +mg_calloc_ex(size_t count, size_t size, const char *file, unsigned line) +{ + void *data = mg_malloc_ex(size * count, file, line); + if (data) { + memset(data, 0, size); + } + return data; +} + + +static void +mg_free_ex(void *memory, const char *file, unsigned line) +{ + char mallocStr[256]; + void *data = (void *)(((char *)memory) - sizeof(size_t)); + size_t size; + + if (memory) { + size = *(size_t *)data; + mg_memory_debug_totalMemUsed -= size; + mg_memory_debug_blockCount--; + sprintf(mallocStr, + "MEM: %p %5lu free %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)size, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + + free(data); + } +} + + +static void * +mg_realloc_ex(void *memory, size_t newsize, const char *file, unsigned line) +{ + char mallocStr[256]; + void *data; + void *_realloc; + size_t oldsize; + + if (newsize) { + if (memory) { + data = (void *)(((char *)memory) - sizeof(size_t)); + oldsize = *(size_t *)data; + _realloc = realloc(data, newsize + sizeof(size_t)); + if (_realloc) { + data = _realloc; + mg_memory_debug_totalMemUsed -= oldsize; + sprintf(mallocStr, + "MEM: %p %5lu r-free %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)oldsize, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + mg_memory_debug_totalMemUsed += newsize; + sprintf(mallocStr, + "MEM: %p %5lu r-alloc %7lu %4lu --- %s:%u\n", + memory, + (unsigned long)newsize, + mg_memory_debug_totalMemUsed, + mg_memory_debug_blockCount, + file, + line); +#if defined(_WIN32) + OutputDebugStringA(mallocStr); +#else + DEBUG_TRACE("%s", mallocStr); +#endif + *(size_t *)data = newsize; + data = (void *)(((char *)data) + sizeof(size_t)); + } else { +#if defined(_WIN32) + OutputDebugStringA("MEM: realloc failed\n"); +#else + DEBUG_TRACE("%s", "MEM: realloc failed\n"); +#endif + return _realloc; + } + } else { + data = mg_malloc_ex(newsize, file, line); + } + } else { + data = 0; + mg_free_ex(memory, file, line); + } + + return data; +} + +#define mg_malloc(a) mg_malloc_ex(a, __FILE__, __LINE__) +#define mg_calloc(a, b) mg_calloc_ex(a, b, __FILE__, __LINE__) +#define mg_realloc(a, b) mg_realloc_ex(a, b, __FILE__, __LINE__) +#define mg_free(a) mg_free_ex(a, __FILE__, __LINE__) + +#else + +static __inline void * +mg_malloc(size_t a) +{ + return malloc(a); +} + +static __inline void * +mg_calloc(size_t a, size_t b) +{ + return calloc(a, b); +} + +static __inline void * +mg_realloc(void *a, size_t b) +{ + return realloc(a, b); +} + +static __inline void +mg_free(void *a) +{ + free(a); +} + +#endif + + +static void mg_vsnprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + va_list ap); + +static void mg_snprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(5, 6); + +/* This following lines are just meant as a reminder to use the mg-functions + * for memory management */ +#ifdef malloc +#undef malloc +#endif +#ifdef calloc +#undef calloc +#endif +#ifdef realloc +#undef realloc +#endif +#ifdef free +#undef free +#endif +#ifdef snprintf +#undef snprintf +#endif +#ifdef vsnprintf +#undef vsnprintf +#endif +#define malloc DO_NOT_USE_THIS_FUNCTION__USE_mg_malloc +#define calloc DO_NOT_USE_THIS_FUNCTION__USE_mg_calloc +#define realloc DO_NOT_USE_THIS_FUNCTION__USE_mg_realloc +#define free DO_NOT_USE_THIS_FUNCTION__USE_mg_free +#define snprintf DO_NOT_USE_THIS_FUNCTION__USE_mg_snprintf +#ifdef _WIN32 /* vsnprintf must not be used in any system, * \ + * but this define only works well for Windows. */ +#define vsnprintf DO_NOT_USE_THIS_FUNCTION__USE_mg_vsnprintf +#endif + +#define MD5_STATIC static +#include "md5.inl" + +/* Darwin prior to 7.0 and Win32 do not have socklen_t */ +#ifdef NO_SOCKLEN_T +typedef int socklen_t; +#endif /* NO_SOCKLEN_T */ +#define _DARWIN_UNLIMITED_SELECT + +#define IP_ADDR_STR_LEN (50) /* IPv6 hex string is 46 chars */ + +#if !defined(MSG_NOSIGNAL) +#define MSG_NOSIGNAL (0) +#endif + +#if !defined(SOMAXCONN) +#define SOMAXCONN (100) +#endif + +/* Size of the accepted socket queue */ +#if !defined(MGSQLEN) +#define MGSQLEN (20) +#endif + +#if defined(NO_SSL_DL) +#include +#include +#include +#include +#include +#else +/* SSL loaded dynamically from DLL. + * I put the prototypes here to be independent from OpenSSL source + * installation. */ + +typedef struct ssl_st SSL; +typedef struct ssl_method_st SSL_METHOD; +typedef struct ssl_ctx_st SSL_CTX; +typedef struct x509_store_ctx_st X509_STORE_CTX; + +#define SSL_CTRL_OPTIONS (32) +#define SSL_CTRL_CLEAR_OPTIONS (77) +#define SSL_CTRL_SET_ECDH_AUTO (94) + +#define SSL_VERIFY_NONE (0) +#define SSL_VERIFY_PEER (1) +#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT (2) +#define SSL_VERIFY_CLIENT_ONCE (4) +#define SSL_OP_ALL ((long)(0x80000BFFUL)) +#define SSL_OP_NO_SSLv2 (0x01000000L) +#define SSL_OP_NO_SSLv3 (0x02000000L) +#define SSL_OP_NO_TLSv1 (0x04000000L) +#define SSL_OP_NO_TLSv1_2 (0x08000000L) +#define SSL_OP_NO_TLSv1_1 (0x10000000L) +#define SSL_OP_SINGLE_DH_USE (0x00100000L) + +struct ssl_func { + const char *name; /* SSL function name */ + void (*ptr)(void); /* Function pointer */ +}; + +#define SSL_free (*(void (*)(SSL *))ssl_sw[0].ptr) +#define SSL_accept (*(int (*)(SSL *))ssl_sw[1].ptr) +#define SSL_connect (*(int (*)(SSL *))ssl_sw[2].ptr) +#define SSL_read (*(int (*)(SSL *, void *, int))ssl_sw[3].ptr) +#define SSL_write (*(int (*)(SSL *, const void *, int))ssl_sw[4].ptr) +#define SSL_get_error (*(int (*)(SSL *, int))ssl_sw[5].ptr) +#define SSL_set_fd (*(int (*)(SSL *, SOCKET))ssl_sw[6].ptr) +#define SSL_new (*(SSL * (*)(SSL_CTX *))ssl_sw[7].ptr) +#define SSL_CTX_new (*(SSL_CTX * (*)(SSL_METHOD *))ssl_sw[8].ptr) +#define SSLv23_server_method (*(SSL_METHOD * (*)(void))ssl_sw[9].ptr) +#define SSL_library_init (*(int (*)(void))ssl_sw[10].ptr) +#define SSL_CTX_use_PrivateKey_file \ + (*(int (*)(SSL_CTX *, const char *, int))ssl_sw[11].ptr) +#define SSL_CTX_use_certificate_file \ + (*(int (*)(SSL_CTX *, const char *, int))ssl_sw[12].ptr) +#define SSL_CTX_set_default_passwd_cb \ + (*(void (*)(SSL_CTX *, mg_callback_t))ssl_sw[13].ptr) +#define SSL_CTX_free (*(void (*)(SSL_CTX *))ssl_sw[14].ptr) +#define SSL_load_error_strings (*(void (*)(void))ssl_sw[15].ptr) +#define SSL_CTX_use_certificate_chain_file \ + (*(int (*)(SSL_CTX *, const char *))ssl_sw[16].ptr) +#define SSLv23_client_method (*(SSL_METHOD * (*)(void))ssl_sw[17].ptr) +#define SSL_pending (*(int (*)(SSL *))ssl_sw[18].ptr) +#define SSL_CTX_set_verify \ + (*(void (*)(SSL_CTX *, \ + int, \ + int (*verify_callback)(int, X509_STORE_CTX *)))ssl_sw[19].ptr) +#define SSL_shutdown (*(int (*)(SSL *))ssl_sw[20].ptr) +#define SSL_CTX_load_verify_locations \ + (*(int (*)(SSL_CTX *, const char *, const char *))ssl_sw[21].ptr) +#define SSL_CTX_set_default_verify_paths (*(int (*)(SSL_CTX *))ssl_sw[22].ptr) +#define SSL_CTX_set_verify_depth (*(void (*)(SSL_CTX *, int))ssl_sw[23].ptr) +#define SSL_get_peer_certificate (*(X509 * (*)(SSL *))ssl_sw[24].ptr) +#define SSL_get_version (*(const char *(*)(SSL *))ssl_sw[25].ptr) +#define SSL_get_current_cipher (*(SSL_CIPHER * (*)(SSL *))ssl_sw[26].ptr) +#define SSL_CIPHER_get_name \ + (*(const char *(*)(const SSL_CIPHER *))ssl_sw[27].ptr) +#define SSL_CTX_check_private_key (*(int (*)(SSL_CTX *))ssl_sw[28].ptr) +#define SSL_CTX_set_session_id_context \ + (*(int (*)(SSL_CTX *, const unsigned char *, unsigned int))ssl_sw[29].ptr) +#define SSL_CTX_ctrl (*(long (*)(SSL_CTX *, int, long, void *))ssl_sw[30].ptr) +#define SSL_CTX_set_cipher_list \ + (*(int (*)(SSL_CTX *, const char *))ssl_sw[31].ptr) +#define SSL_CTX_set_options(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_OPTIONS, (op), NULL) +#define SSL_CTX_clear_options(ctx, op) \ + SSL_CTX_ctrl((ctx), SSL_CTRL_CLEAR_OPTIONS, (op), NULL) +#define SSL_CTX_set_ecdh_auto(ctx, onoff) \ + SSL_CTX_ctrl(ctx, SSL_CTRL_SET_ECDH_AUTO, onoff, NULL) + +#define CRYPTO_num_locks (*(int (*)(void))crypto_sw[0].ptr) +#define CRYPTO_set_locking_callback \ + (*(void (*)(void (*)(int, int, const char *, int)))crypto_sw[1].ptr) +#define CRYPTO_set_id_callback \ + (*(void (*)(unsigned long (*)(void)))crypto_sw[2].ptr) +#define ERR_get_error (*(unsigned long (*)(void))crypto_sw[3].ptr) +#define ERR_error_string (*(char *(*)(unsigned long, char *))crypto_sw[4].ptr) +#define ERR_remove_state (*(void (*)(unsigned long))crypto_sw[5].ptr) +#define ERR_free_strings (*(void (*)(void))crypto_sw[6].ptr) +#define ENGINE_cleanup (*(void (*)(void))crypto_sw[7].ptr) +#define CONF_modules_unload (*(void (*)(int))crypto_sw[8].ptr) +#define CRYPTO_cleanup_all_ex_data (*(void (*)(void))crypto_sw[9].ptr) +#define EVP_cleanup (*(void (*)(void))crypto_sw[10].ptr) + + +/* set_ssl_option() function updates this array. + * It loads SSL library dynamically and changes NULLs to the actual addresses + * of respective functions. The macros above (like SSL_connect()) are really + * just calling these functions indirectly via the pointer. */ +static struct ssl_func ssl_sw[] = {{"SSL_free", NULL}, + {"SSL_accept", NULL}, + {"SSL_connect", NULL}, + {"SSL_read", NULL}, + {"SSL_write", NULL}, + {"SSL_get_error", NULL}, + {"SSL_set_fd", NULL}, + {"SSL_new", NULL}, + {"SSL_CTX_new", NULL}, + {"SSLv23_server_method", NULL}, + {"SSL_library_init", NULL}, + {"SSL_CTX_use_PrivateKey_file", NULL}, + {"SSL_CTX_use_certificate_file", NULL}, + {"SSL_CTX_set_default_passwd_cb", NULL}, + {"SSL_CTX_free", NULL}, + {"SSL_load_error_strings", NULL}, + {"SSL_CTX_use_certificate_chain_file", NULL}, + {"SSLv23_client_method", NULL}, + {"SSL_pending", NULL}, + {"SSL_CTX_set_verify", NULL}, + {"SSL_shutdown", NULL}, + {"SSL_CTX_load_verify_locations", NULL}, + {"SSL_CTX_set_default_verify_paths", NULL}, + {"SSL_CTX_set_verify_depth", NULL}, + {"SSL_get_peer_certificate", NULL}, + {"SSL_get_version", NULL}, + {"SSL_get_current_cipher", NULL}, + {"SSL_CIPHER_get_name", NULL}, + {"SSL_CTX_check_private_key", NULL}, + {"SSL_CTX_set_session_id_context", NULL}, + {"SSL_CTX_ctrl", NULL}, + {"SSL_CTX_set_cipher_list", NULL}, + {NULL, NULL}}; + + +/* Similar array as ssl_sw. These functions could be located in different + * lib. */ +#if !defined(NO_SSL) +static struct ssl_func crypto_sw[] = {{"CRYPTO_num_locks", NULL}, + {"CRYPTO_set_locking_callback", NULL}, + {"CRYPTO_set_id_callback", NULL}, + {"ERR_get_error", NULL}, + {"ERR_error_string", NULL}, + {"ERR_remove_state", NULL}, + {"ERR_free_strings", NULL}, + {"ENGINE_cleanup", NULL}, + {"CONF_modules_unload", NULL}, + {"CRYPTO_cleanup_all_ex_data", NULL}, + {"EVP_cleanup", NULL}, + {NULL, NULL}}; +#endif /* NO_SSL */ +#endif /* NO_SSL_DL */ + + +#if !defined(NO_CACHING) +static const char *month_names[] = {"Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec"}; +#endif /* !NO_CACHING */ + +/* Unified socket address. For IPv6 support, add IPv6 address structure in the + * union u. */ +union usa { + struct sockaddr sa; + struct sockaddr_in sin; +#if defined(USE_IPV6) + struct sockaddr_in6 sin6; +#endif +}; + +/* Describes a string (chunk of memory). */ +struct vec { + const char *ptr; + size_t len; +}; + +struct file { + uint64_t size; + time_t last_modified; + FILE *fp; + const char *membuf; /* Non-NULL if file data is in memory */ + int is_directory; + int gzipped; /* set to 1 if the content is gzipped + * in which case we need a content-encoding: gzip header */ +}; + +#define STRUCT_FILE_INITIALIZER \ + { \ + (uint64_t)0, (time_t)0, (FILE *)NULL, (const char *)NULL, 0, 0 \ + } + +/* Describes listening socket, or socket which was accept()-ed by the master + * thread and queued for future handling by the worker thread. */ +struct socket { + SOCKET sock; /* Listening socket */ + union usa lsa; /* Local socket address */ + union usa rsa; /* Remote socket address */ + unsigned char is_ssl; /* Is port SSL-ed */ + unsigned char ssl_redir; /* Is port supposed to redirect everything to SSL + * port */ +}; + +/* NOTE(lsm): this enum shoulds be in sync with the config_options below. */ +enum { + CGI_EXTENSIONS, + CGI_ENVIRONMENT, + PUT_DELETE_PASSWORDS_FILE, + CGI_INTERPRETER, + PROTECT_URI, + AUTHENTICATION_DOMAIN, + SSI_EXTENSIONS, + THROTTLE, + ACCESS_LOG_FILE, + ENABLE_DIRECTORY_LISTING, + ERROR_LOG_FILE, + GLOBAL_PASSWORDS_FILE, + INDEX_FILES, + ENABLE_KEEP_ALIVE, + ACCESS_CONTROL_LIST, + EXTRA_MIME_TYPES, + LISTENING_PORTS, + DOCUMENT_ROOT, + SSL_CERTIFICATE, + NUM_THREADS, + RUN_AS_USER, + REWRITE, + HIDE_FILES, + REQUEST_TIMEOUT, + SSL_DO_VERIFY_PEER, + SSL_CA_PATH, + SSL_CA_FILE, + SSL_VERIFY_DEPTH, + SSL_DEFAULT_VERIFY_PATHS, + SSL_CIPHER_LIST, + SSL_PROTOCOL_VERSION, + SSL_SHORT_TRUST, +#if defined(USE_WEBSOCKET) + WEBSOCKET_TIMEOUT, +#endif + DECODE_URL, + +#if defined(USE_LUA) + LUA_PRELOAD_FILE, + LUA_SCRIPT_EXTENSIONS, + LUA_SERVER_PAGE_EXTENSIONS, +#endif +#if defined(USE_DUKTAPE) + DUKTAPE_SCRIPT_EXTENSIONS, +#endif + +#if defined(USE_WEBSOCKET) + WEBSOCKET_ROOT, +#endif +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + LUA_WEBSOCKET_EXTENSIONS, +#endif + ACCESS_CONTROL_ALLOW_ORIGIN, + ERROR_PAGES, + CONFIG_TCP_NODELAY, /* Prepended CONFIG_ to avoid conflict with the + * socket option typedef TCP_NODELAY. */ +#if !defined(NO_CACHING) + STATIC_FILE_MAX_AGE, +#endif + + NUM_OPTIONS +}; + + +/* Config option name, config types, default value */ +static struct mg_option config_options[] = { + {"cgi_pattern", CONFIG_TYPE_EXT_PATTERN, "**.cgi$|**.pl$|**.php$"}, + {"cgi_environment", CONFIG_TYPE_STRING, NULL}, + {"put_delete_auth_file", CONFIG_TYPE_FILE, NULL}, + {"cgi_interpreter", CONFIG_TYPE_FILE, NULL}, + {"protect_uri", CONFIG_TYPE_STRING, NULL}, + {"authentication_domain", CONFIG_TYPE_STRING, "mydomain.com"}, + {"ssi_pattern", CONFIG_TYPE_EXT_PATTERN, "**.shtml$|**.shtm$"}, + {"throttle", CONFIG_TYPE_STRING, NULL}, + {"access_log_file", CONFIG_TYPE_FILE, NULL}, + {"enable_directory_listing", CONFIG_TYPE_BOOLEAN, "yes"}, + {"error_log_file", CONFIG_TYPE_FILE, NULL}, + {"global_auth_file", CONFIG_TYPE_FILE, NULL}, + {"index_files", + CONFIG_TYPE_STRING, +#ifdef USE_LUA + "index.xhtml,index.html,index.htm,index.lp,index.lsp,index.lua,index.cgi," + "index.shtml,index.php"}, +#else + "index.xhtml,index.html,index.htm,index.cgi,index.shtml,index.php"}, +#endif + {"enable_keep_alive", CONFIG_TYPE_BOOLEAN, "no"}, + {"access_control_list", CONFIG_TYPE_STRING, NULL}, + {"extra_mime_types", CONFIG_TYPE_STRING, NULL}, + {"listening_ports", CONFIG_TYPE_STRING, "8080"}, + {"document_root", CONFIG_TYPE_DIRECTORY, NULL}, + {"ssl_certificate", CONFIG_TYPE_FILE, NULL}, + {"num_threads", CONFIG_TYPE_NUMBER, "50"}, + {"run_as_user", CONFIG_TYPE_STRING, NULL}, + {"url_rewrite_patterns", CONFIG_TYPE_STRING, NULL}, + {"hide_files_patterns", CONFIG_TYPE_EXT_PATTERN, NULL}, + {"request_timeout_ms", CONFIG_TYPE_NUMBER, "30000"}, + {"ssl_verify_peer", CONFIG_TYPE_BOOLEAN, "no"}, + {"ssl_ca_path", CONFIG_TYPE_DIRECTORY, NULL}, + {"ssl_ca_file", CONFIG_TYPE_FILE, NULL}, + {"ssl_verify_depth", CONFIG_TYPE_NUMBER, "9"}, + {"ssl_default_verify_paths", CONFIG_TYPE_BOOLEAN, "yes"}, + {"ssl_cipher_list", CONFIG_TYPE_STRING, NULL}, + {"ssl_protocol_version", CONFIG_TYPE_NUMBER, "0"}, + {"ssl_short_trust", CONFIG_TYPE_BOOLEAN, "no"}, +#if defined(USE_WEBSOCKET) + {"websocket_timeout_ms", CONFIG_TYPE_NUMBER, "30000"}, +#endif + {"decode_url", CONFIG_TYPE_BOOLEAN, "yes"}, + +#if defined(USE_LUA) + {"lua_preload_file", CONFIG_TYPE_FILE, NULL}, + {"lua_script_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lua$"}, + {"lua_server_page_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lp$|**.lsp$"}, +#endif +#if defined(USE_DUKTAPE) + /* The support for duktape is still in alpha version state. + * The name of this config option might change. */ + {"duktape_script_pattern", CONFIG_TYPE_EXT_PATTERN, "**.ssjs$"}, +#endif + +#if defined(USE_WEBSOCKET) + {"websocket_root", CONFIG_TYPE_DIRECTORY, NULL}, +#endif +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + {"lua_websocket_pattern", CONFIG_TYPE_EXT_PATTERN, "**.lua$"}, +#endif + {"access_control_allow_origin", CONFIG_TYPE_STRING, "*"}, + {"error_pages", CONFIG_TYPE_DIRECTORY, NULL}, + {"tcp_nodelay", CONFIG_TYPE_NUMBER, "0"}, +#if !defined(NO_CACHING) + {"static_file_max_age", CONFIG_TYPE_NUMBER, "3600"}, +#endif + + {NULL, CONFIG_TYPE_UNKNOWN, NULL}}; + +/* Check if the config_options and the corresponding enum have compatible + * sizes. */ +mg_static_assert((sizeof(config_options) / sizeof(config_options[0])) + == (NUM_OPTIONS + 1), + "config_options and enum not sync"); + +enum { REQUEST_HANDLER, WEBSOCKET_HANDLER, AUTH_HANDLER }; + +struct mg_handler_info { + /* Name/Pattern of the URI. */ + char *uri; + size_t uri_len; + + /* handler type */ + int handler_type; + + /* Handler for http/https or authorization requests. */ + mg_request_handler handler; + + /* Handler for ws/wss (websocket) requests. */ + mg_websocket_connect_handler connect_handler; + mg_websocket_ready_handler ready_handler; + mg_websocket_data_handler data_handler; + mg_websocket_close_handler close_handler; + + /* Handler for authorization requests */ + mg_authorization_handler auth_handler; + + /* User supplied argument for the handler function. */ + void *cbdata; + + /* next handler in a linked list */ + struct mg_handler_info *next; +}; + +struct mg_context { + volatile int stop_flag; /* Should we stop event loop */ + SSL_CTX *ssl_ctx; /* SSL context */ + char *config[NUM_OPTIONS]; /* Civetweb configuration parameters */ + struct mg_callbacks callbacks; /* User-defined callback function */ + void *user_data; /* User-defined data */ + int context_type; /* 1 = server context, 2 = client context */ + + struct socket *listening_sockets; + in_port_t *listening_ports; + unsigned int num_listening_sockets; + + volatile int + running_worker_threads; /* Number of currently running worker threads */ + pthread_mutex_t thread_mutex; /* Protects (max|num)_threads */ + pthread_cond_t thread_cond; /* Condvar for tracking workers terminations */ + + struct socket queue[MGSQLEN]; /* Accepted sockets */ + volatile int sq_head; /* Head of the socket queue */ + volatile int sq_tail; /* Tail of the socket queue */ + pthread_cond_t sq_full; /* Signaled when socket is produced */ + pthread_cond_t sq_empty; /* Signaled when socket is consumed */ + pthread_t masterthreadid; /* The master thread ID */ + unsigned int + cfg_worker_threads; /* The number of configured worker threads. */ + pthread_t *workerthreadids; /* The worker thread IDs */ + + time_t start_time; /* Server start time, used for authentication */ + uint64_t auth_nonce_mask; /* Mask for all nonce values */ + pthread_mutex_t nonce_mutex; /* Protects nonce_count */ + unsigned long nonce_count; /* Used nonces, used for authentication */ + + char *systemName; /* What operating system is running */ + + /* linked list of uri handlers */ + struct mg_handler_info *handlers; + +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + /* linked list of shared lua websockets */ + struct mg_shared_lua_websocket_list *shared_lua_websockets; +#endif + +#ifdef USE_TIMERS + struct ttimers *timers; +#endif +}; + + +struct mg_connection { + struct mg_request_info request_info; + struct mg_context *ctx; + SSL *ssl; /* SSL descriptor */ + SSL_CTX *client_ssl_ctx; /* SSL context for client connections */ + struct socket client; /* Connected client */ + time_t conn_birth_time; /* Time (wall clock) when connection was + * established */ + struct timespec req_time; /* Time (since system start) when the request + * was received */ + int64_t num_bytes_sent; /* Total bytes sent to client */ + int64_t content_len; /* Content-Length header value */ + int64_t consumed_content; /* How many bytes of content have been read */ + int is_chunked; /* Transfer-Encoding is chunked: 0=no, 1=yes: + * data available, 2: all data read */ + size_t chunk_remainder; /* Unread data from the last chunk */ + char *buf; /* Buffer for received data */ + char *path_info; /* PATH_INFO part of the URL */ + + int must_close; /* 1 if connection must be closed */ + int in_error_handler; /* 1 if in handler for user defined error + * pages */ + int internal_error; /* 1 if an error occured while processing the + * request */ + + int buf_size; /* Buffer size */ + int request_len; /* Size of the request + headers in a buffer */ + int data_len; /* Total size of data in a buffer */ + int status_code; /* HTTP reply status code, e.g. 200 */ + int throttle; /* Throttling, bytes/sec. <= 0 means no + * throttle */ + time_t last_throttle_time; /* Last time throttled data was sent */ + int64_t last_throttle_bytes; /* Bytes sent this second */ + pthread_mutex_t mutex; /* Used by mg_(un)lock_connection to ensure + * atomic transmissions for websockets */ +#if defined(USE_LUA) && defined(USE_WEBSOCKET) + void *lua_websocket_state; /* Lua_State for a websocket connection */ +#endif +}; + + +static pthread_key_t sTlsKey; /* Thread local storage index */ +static int sTlsInit = 0; +static int thread_idx_max = 0; + + +struct mg_workerTLS { + int is_master; + unsigned long thread_idx; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + HANDLE pthread_cond_helper_mutex; +#endif +}; + +/* Directory entry */ +struct de { + struct mg_connection *conn; + char *file_name; + struct file file; +}; + + +#if defined(USE_WEBSOCKET) +static int is_websocket_protocol(const struct mg_connection *conn); +#else +#define is_websocket_protocol(conn) (0) +#endif + + +static int +mg_atomic_inc(volatile int *addr) +{ + int ret; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + /* Depending on the SDK, this function uses either + * (volatile unsigned int *) or (volatile LONG *), + * so whatever you use, the other SDK is likely to raise a warning. */ + ret = InterlockedIncrement((volatile long *)addr); +#elif defined(__GNUC__) \ + && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 0))) + ret = __sync_add_and_fetch(addr, 1); +#else + ret = (++(*addr)); +#endif + return ret; +} + + +static int +mg_atomic_dec(volatile int *addr) +{ + int ret; +#if defined(_WIN32) && !defined(__SYMBIAN32__) + /* Depending on the SDK, this function uses either + * (volatile unsigned int *) or (volatile LONG *), + * so whatever you use, the other SDK is likely to raise a warning. */ + ret = InterlockedDecrement((volatile long *)addr); +#elif defined(__GNUC__) \ + && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 0))) + ret = __sync_sub_and_fetch(addr, 1); +#else + ret = (--(*addr)); +#endif + return ret; +} + +#if !defined(NO_THREAD_NAME) +#if defined(_WIN32) && defined(_MSC_VER) +/* Set the thread name for debugging purposes in Visual Studio + * http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx + */ +#pragma pack(push, 8) +typedef struct tagTHREADNAME_INFO { + DWORD dwType; /* Must be 0x1000. */ + LPCSTR szName; /* Pointer to name (in user addr space). */ + DWORD dwThreadID; /* Thread ID (-1=caller thread). */ + DWORD dwFlags; /* Reserved for future use, must be zero. */ +} THREADNAME_INFO; +#pragma pack(pop) +#elif defined(__linux__) +#include +#include +#endif + + +static void +mg_set_thread_name(const char *name) +{ + char threadName[16 + 1]; /* 16 = Max. thread length in Linux/OSX/.. */ + + mg_snprintf( + NULL, NULL, threadName, sizeof(threadName), "civetweb-%s", name); + +#if defined(_WIN32) +#if defined(_MSC_VER) + /* Windows and Visual Studio Compiler */ + __try + { + THREADNAME_INFO info; + info.dwType = 0x1000; + info.szName = threadName; + info.dwThreadID = ~0U; + info.dwFlags = 0; + + RaiseException(0x406D1388, + 0, + sizeof(info) / sizeof(ULONG_PTR), + (ULONG_PTR *)&info); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + } +#elif defined(__MINGW32__) +/* No option known to set thread name for MinGW */ +#endif +#elif defined(__GLIBC__) \ + && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 12))) + /* pthread_setname_np first appeared in glibc in version 2.12*/ + (void)pthread_setname_np(pthread_self(), threadName); +#elif defined(__linux__) + /* on linux we can use the old prctl function */ + (void)prctl(PR_SET_NAME, threadName, 0, 0, 0); +#endif +} +#else /* !defined(NO_THREAD_NAME) */ +void +mg_set_thread_name(const char *threadName) +{ +} +#endif + + +#if defined(MG_LEGACY_INTERFACE) +const char ** +mg_get_valid_option_names(void) +{ + /* This function is deprecated. Use mg_get_valid_options instead. */ + static const char * + data[2 * sizeof(config_options) / sizeof(config_options[0])] = {0}; + int i; + + for (i = 0; config_options[i].name != NULL; i++) { + data[i * 2] = config_options[i].name; + data[i * 2 + 1] = config_options[i].default_value; + } + + return data; +} +#endif + + +const struct mg_option * +mg_get_valid_options(void) +{ + return config_options; +} + + +static int +is_file_in_memory(const struct mg_connection *conn, + const char *path, + struct file *filep) +{ + size_t size = 0; + if (!conn || !filep) { + return 0; + } + + if (conn->ctx->callbacks.open_file) { + filep->membuf = conn->ctx->callbacks.open_file(conn, path, &size); + if (filep->membuf != NULL) { + /* NOTE: override filep->size only on success. Otherwise, it might + * break constructs like if (!mg_stat() || !mg_fopen()) ... */ + filep->size = size; + } + } + + return filep->membuf != NULL; +} + + +static int +is_file_opened(const struct file *filep) +{ + if (!filep) { + return 0; + } + + return filep->membuf != NULL || filep->fp != NULL; +} + + +/* mg_fopen will open a file either in memory or on the disk. + * The input parameter path is a string in UTF-8 encoding. + * The input parameter mode is the same as for fopen. + * Either fp or membuf will be set in the output struct filep. + * The function returns 1 on success, 0 on error. */ +static int +mg_fopen(const struct mg_connection *conn, + const char *path, + const char *mode, + struct file *filep) +{ + struct stat st; + + if (!filep) { + return 0; + } + + /* TODO (high): mg_fopen should only open a file, while mg_stat should + * only get the file status. They should not work on different members of + * the same structure (bad cohesion). */ + memset(filep, 0, sizeof(*filep)); + + if (stat(path, &st) == 0) { + filep->size = (uint64_t)(st.st_size); + } + + if (!is_file_in_memory(conn, path, filep)) { +#ifdef _WIN32 + wchar_t wbuf[PATH_MAX], wmode[20]; + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + MultiByteToWideChar(CP_UTF8, 0, mode, -1, wmode, ARRAY_SIZE(wmode)); + filep->fp = _wfopen(wbuf, wmode); +#else + /* Linux et al already use unicode. No need to convert. */ + filep->fp = fopen(path, mode); +#endif + } + + return is_file_opened(filep); +} + + +static void +mg_fclose(struct file *filep) +{ + if (filep != NULL && filep->fp != NULL) { + fclose(filep->fp); + } +} + + +static void +mg_strlcpy(register char *dst, register const char *src, size_t n) +{ + for (; *src != '\0' && n > 1; n--) { + *dst++ = *src++; + } + *dst = '\0'; +} + + +static int +lowercase(const char *s) +{ + return tolower(*(const unsigned char *)s); +} + + +int +mg_strncasecmp(const char *s1, const char *s2, size_t len) +{ + int diff = 0; + + if (len > 0) { + do { + diff = lowercase(s1++) - lowercase(s2++); + } while (diff == 0 && s1[-1] != '\0' && --len > 0); + } + + return diff; +} + + +int +mg_strcasecmp(const char *s1, const char *s2) +{ + int diff; + + do { + diff = lowercase(s1++) - lowercase(s2++); + } while (diff == 0 && s1[-1] != '\0'); + + return diff; +} + + +static char * +mg_strndup(const char *ptr, size_t len) +{ + char *p; + + if ((p = (char *)mg_malloc(len + 1)) != NULL) { + mg_strlcpy(p, ptr, len + 1); + } + + return p; +} + + +static char * +mg_strdup(const char *str) +{ + return mg_strndup(str, strlen(str)); +} + + +static const char * +mg_strcasestr(const char *big_str, const char *small_str) +{ + size_t i, big_len = strlen(big_str), small_len = strlen(small_str); + + if (big_len >= small_len) { + for (i = 0; i <= (big_len - small_len); i++) { + if (mg_strncasecmp(big_str + i, small_str, small_len) == 0) { + return big_str + i; + } + } + } + + return NULL; +} + + +/* Return null terminated string of given maximum length. + * Report errors if length is exceeded. */ +static void +mg_vsnprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + va_list ap) +{ + int n, ok; + + if (buflen == 0) { + return; + } + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wformat-nonliteral" +/* Using fmt as a non-literal is intended here, since it is mostly called + * indirectly by mg_snprintf */ +#endif + + n = (int)vsnprintf_impl(buf, buflen, fmt, ap); + ok = (n >= 0) && ((size_t)n < buflen); + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif + + if (ok) { + if (truncated) { + *truncated = 0; + } + } else { + if (truncated) { + *truncated = 1; + } + mg_cry(conn, + "truncating vsnprintf buffer: [%.*s]", + (int)((buflen > 200) ? 200 : (buflen - 1)), + buf); + n = (int)buflen - 1; + } + buf[n] = '\0'; +} + + +static void +mg_snprintf(const struct mg_connection *conn, + int *truncated, + char *buf, + size_t buflen, + const char *fmt, + ...) +{ + va_list ap; + + va_start(ap, fmt); + mg_vsnprintf(conn, truncated, buf, buflen, fmt, ap); + va_end(ap); +} + + +static int +get_option_index(const char *name) +{ + int i; + + for (i = 0; config_options[i].name != NULL; i++) { + if (strcmp(config_options[i].name, name) == 0) { + return i; + } + } + return -1; +} + + +const char * +mg_get_option(const struct mg_context *ctx, const char *name) +{ + int i; + if ((i = get_option_index(name)) == -1) { + return NULL; + } else if (!ctx || ctx->config[i] == NULL) { + return ""; + } else { + return ctx->config[i]; + } +} + + +struct mg_context * +mg_get_context(const struct mg_connection *conn) +{ + return (conn == NULL) ? (struct mg_context *)NULL : (conn->ctx); +} + + +void * +mg_get_user_data(const struct mg_context *ctx) +{ + return (ctx == NULL) ? NULL : ctx->user_data; +} + + +void +mg_set_user_connection_data(struct mg_connection *conn, void *data) +{ + if (conn != NULL) { + conn->request_info.conn_data = data; + } +} + + +void * +mg_get_user_connection_data(const struct mg_connection *conn) +{ + if (conn != NULL) { + return conn->request_info.conn_data; + } + return NULL; +} + + +size_t +mg_get_ports(const struct mg_context *ctx, size_t size, int *ports, int *ssl) +{ + size_t i; + if (!ctx) { + return 0; + } + for (i = 0; i < size && i < ctx->num_listening_sockets; i++) { + ssl[i] = ctx->listening_sockets[i].is_ssl; + ports[i] = ctx->listening_ports[i]; + } + return i; +} + + +int +mg_get_server_ports(const struct mg_context *ctx, + int size, + struct mg_server_ports *ports) +{ + int i, cnt = 0; + + if (size <= 0) { + return -1; + } + memset(ports, 0, sizeof(*ports) * (size_t)size); + if (!ctx) { + return -1; + } + if (!ctx->listening_sockets || !ctx->listening_ports) { + return -1; + } + + for (i = 0; (i < size) && (i < (int)ctx->num_listening_sockets); i++) { + + ports[cnt].port = ctx->listening_ports[i]; + ports[cnt].is_ssl = ctx->listening_sockets[i].is_ssl; + ports[cnt].is_redirect = ctx->listening_sockets[i].ssl_redir; + + if (ctx->listening_sockets[i].lsa.sa.sa_family == AF_INET) { + /* IPv4 */ + ports[cnt].protocol = 1; + cnt++; + } else if (ctx->listening_sockets[i].lsa.sa.sa_family == AF_INET6) { + /* IPv6 */ + ports[cnt].protocol = 3; + cnt++; + } + } + + return cnt; +} + + +static void +sockaddr_to_string(char *buf, size_t len, const union usa *usa) +{ + buf[0] = '\0'; + + if (!usa) { + return; + } + + if (usa->sa.sa_family == AF_INET) { + getnameinfo(&usa->sa, + sizeof(usa->sin), + buf, + (unsigned)len, + NULL, + 0, + NI_NUMERICHOST); + } +#if defined(USE_IPV6) + else if (usa->sa.sa_family == AF_INET6) { + getnameinfo(&usa->sa, + sizeof(usa->sin6), + buf, + (unsigned)len, + NULL, + 0, + NI_NUMERICHOST); + } +#endif +} + + +/* Convert time_t to a string. According to RFC2616, Sec 14.18, this must be + * included in all responses other than 100, 101, 5xx. */ +static void +gmt_time_string(char *buf, size_t buf_len, time_t *t) +{ + struct tm *tm; + + tm = ((t != NULL) ? gmtime(t) : NULL); + if (tm != NULL) { + strftime(buf, buf_len, "%a, %d %b %Y %H:%M:%S GMT", tm); + } else { + mg_strlcpy(buf, "Thu, 01 Jan 1970 00:00:00 GMT", buf_len); + buf[buf_len - 1] = '\0'; + } +} + + +/* difftime for struct timespec. Return value is in seconds. */ +static double +mg_difftimespec(const struct timespec *ts_now, const struct timespec *ts_before) +{ + return (double)(ts_now->tv_nsec - ts_before->tv_nsec) * 1.0E-9 + + (double)(ts_now->tv_sec - ts_before->tv_sec); +} + + +/* Print error message to the opened error log stream. */ +void +mg_cry(const struct mg_connection *conn, const char *fmt, ...) +{ + char buf[MG_BUF_LEN], src_addr[IP_ADDR_STR_LEN]; + va_list ap; + struct file fi; + time_t timestamp; + + va_start(ap, fmt); + IGNORE_UNUSED_RESULT(vsnprintf_impl(buf, sizeof(buf), fmt, ap)); + va_end(ap); + buf[sizeof(buf) - 1] = 0; + + if (!conn) { + puts(buf); + return; + } + + /* Do not lock when getting the callback value, here and below. + * I suppose this is fine, since function cannot disappear in the + * same way string option can. */ + if ((conn->ctx->callbacks.log_message == NULL) + || (conn->ctx->callbacks.log_message(conn, buf) == 0)) { + + if (conn->ctx->config[ERROR_LOG_FILE] != NULL) { + if (mg_fopen(conn, conn->ctx->config[ERROR_LOG_FILE], "a+", &fi) + == 0) { + fi.fp = NULL; + } + } else { + fi.fp = NULL; + } + + if (fi.fp != NULL) { + flockfile(fi.fp); + timestamp = time(NULL); + + sockaddr_to_string(src_addr, sizeof(src_addr), &conn->client.rsa); + fprintf(fi.fp, + "[%010lu] [error] [client %s] ", + (unsigned long)timestamp, + src_addr); + + if (conn->request_info.request_method != NULL) { + fprintf(fi.fp, + "%s %s: ", + conn->request_info.request_method, + conn->request_info.request_uri); + } + + fprintf(fi.fp, "%s", buf); + fputc('\n', fi.fp); + fflush(fi.fp); + funlockfile(fi.fp); + mg_fclose(&fi); + } + } +} + + +/* Return fake connection structure. Used for logging, if connection + * is not applicable at the moment of logging. */ +static struct mg_connection * +fc(struct mg_context *ctx) +{ + static struct mg_connection fake_connection; + fake_connection.ctx = ctx; + return &fake_connection; +} + + +const char * +mg_version(void) +{ + return CIVETWEB_VERSION; +} + + +const struct mg_request_info * +mg_get_request_info(const struct mg_connection *conn) +{ + if (!conn) { + return NULL; + } + return &conn->request_info; +} + + +/* Skip the characters until one of the delimiters characters found. + * 0-terminate resulting word. Skip the delimiter and following whitespaces. + * Advance pointer to buffer to the next word. Return found 0-terminated word. + * Delimiters can be quoted with quotechar. */ +static char * +skip_quoted(char **buf, + const char *delimiters, + const char *whitespace, + char quotechar) +{ + char *p, *begin_word, *end_word, *end_whitespace; + + begin_word = *buf; + end_word = begin_word + strcspn(begin_word, delimiters); + + /* Check for quotechar */ + if (end_word > begin_word) { + p = end_word - 1; + while (*p == quotechar) { + /* While the delimiter is quoted, look for the next delimiter. */ + /* This happens, e.g., in calls from parse_auth_header, + * if the user name contains a " character. */ + + /* If there is anything beyond end_word, copy it. */ + if (*end_word != '\0') { + size_t end_off = strcspn(end_word + 1, delimiters); + memmove(p, end_word, end_off + 1); + p += end_off; /* p must correspond to end_word - 1 */ + end_word += end_off + 1; + } else { + *p = '\0'; + break; + } + } + for (p++; p < end_word; p++) { + *p = '\0'; + } + } + + if (*end_word == '\0') { + *buf = end_word; + } else { + end_whitespace = end_word + 1 + strspn(end_word + 1, whitespace); + + for (p = end_word; p < end_whitespace; p++) { + *p = '\0'; + } + + *buf = end_whitespace; + } + + return begin_word; +} + + +/* Simplified version of skip_quoted without quote char + * and whitespace == delimiters */ +static char * +skip(char **buf, const char *delimiters) +{ + return skip_quoted(buf, delimiters, delimiters, 0); +} + + +/* Return HTTP header value, or NULL if not found. */ +static const char * +get_header(const struct mg_request_info *ri, const char *name) +{ + int i; + if (ri) { + for (i = 0; i < ri->num_headers; i++) { + if (!mg_strcasecmp(name, ri->http_headers[i].name)) { + return ri->http_headers[i].value; + } + } + } + + return NULL; +} + + +const char * +mg_get_header(const struct mg_connection *conn, const char *name) +{ + if (!conn) { + return NULL; + } + + return get_header(&conn->request_info, name); +} + + +/* A helper function for traversing a comma separated list of values. + * It returns a list pointer shifted to the next value, or NULL if the end + * of the list found. + * Value is stored in val vector. If value has form "x=y", then eq_val + * vector is initialized to point to the "y" part, and val vector length + * is adjusted to point only to "x". */ +static const char * +next_option(const char *list, struct vec *val, struct vec *eq_val) +{ + int end; + +reparse: + if (val == NULL || list == NULL || *list == '\0') { + /* End of the list */ + list = NULL; + } else { + /* Skip over leading LWS */ + while (*list == ' ' || *list == '\t') + list++; + + val->ptr = list; + if ((list = strchr(val->ptr, ',')) != NULL) { + /* Comma found. Store length and shift the list ptr */ + val->len = ((size_t)(list - val->ptr)); + list++; + } else { + /* This value is the last one */ + list = val->ptr + strlen(val->ptr); + val->len = ((size_t)(list - val->ptr)); + } + + /* Adjust length for trailing LWS */ + end = (int)val->len - 1; + while (end >= 0 && (val->ptr[end] == ' ' || val->ptr[end] == '\t')) + end--; + val->len = (size_t)(end + 1); + + if (val->len == 0) { + /* Ignore any empty entries. */ + goto reparse; + } + + if (eq_val != NULL) { + /* Value has form "x=y", adjust pointers and lengths + * so that val points to "x", and eq_val points to "y". */ + eq_val->len = 0; + eq_val->ptr = (const char *)memchr(val->ptr, '=', val->len); + if (eq_val->ptr != NULL) { + eq_val->ptr++; /* Skip over '=' character */ + eq_val->len = ((size_t)(val->ptr - eq_val->ptr)) + val->len; + val->len = ((size_t)(eq_val->ptr - val->ptr)) - 1; + } + } + } + + return list; +} + +/* A helper function for checking if a comma separated list of values contains + * the given option (case insensitvely). + * 'header' can be NULL, in which case false is returned. */ +static int +header_has_option(const char *header, const char *option) +{ + struct vec opt_vec; + struct vec eq_vec; + + assert(option != NULL); + assert(option[0] != '\0'); + + while ((header = next_option(header, &opt_vec, &eq_vec)) != NULL) { + if (mg_strncasecmp(option, opt_vec.ptr, opt_vec.len) == 0) + return 1; + } + + return 0; +} + +/* Perform case-insensitive match of string against pattern */ +static int +match_prefix(const char *pattern, size_t pattern_len, const char *str) +{ + const char *or_str; + size_t i; + int j, len, res; + + if ((or_str = (const char *)memchr(pattern, '|', pattern_len)) != NULL) { + res = match_prefix(pattern, (size_t)(or_str - pattern), str); + return res > 0 ? res : match_prefix(or_str + 1, + (size_t)((pattern + pattern_len) + - (or_str + 1)), + str); + } + + for (i = 0, j = 0; i < pattern_len; i++, j++) { + if (pattern[i] == '?' && str[j] != '\0') { + continue; + } else if (pattern[i] == '$') { + return str[j] == '\0' ? j : -1; + } else if (pattern[i] == '*') { + i++; + if (pattern[i] == '*') { + i++; + len = (int)strlen(str + j); + } else { + len = (int)strcspn(str + j, "/"); + } + if (i == pattern_len) { + return j + len; + } + do { + res = match_prefix(pattern + i, pattern_len - i, str + j + len); + } while (res == -1 && len-- > 0); + return res == -1 ? -1 : j + res + len; + } else if (lowercase(&pattern[i]) != lowercase(&str[j])) { + return -1; + } + } + return j; +} + + +/* HTTP 1.1 assumes keep alive if "Connection:" header is not set + * This function must tolerate situations when connection info is not + * set up, for example if request parsing failed. */ +static int +should_keep_alive(const struct mg_connection *conn) +{ + if (conn != NULL) { + const char *http_version = conn->request_info.http_version; + const char *header = mg_get_header(conn, "Connection"); + if (conn->must_close || conn->internal_error || conn->status_code == 401 + || mg_strcasecmp(conn->ctx->config[ENABLE_KEEP_ALIVE], "yes") != 0 + || (header != NULL && !header_has_option(header, "keep-alive")) + || (header == NULL && http_version + && 0 != strcmp(http_version, "1.1"))) { + return 0; + } + return 1; + } + return 0; +} + + +static int +should_decode_url(const struct mg_connection *conn) +{ + if (!conn || !conn->ctx) { + return 0; + } + + return (mg_strcasecmp(conn->ctx->config[DECODE_URL], "yes") == 0); +} + + +static const char * +suggest_connection_header(const struct mg_connection *conn) +{ + return should_keep_alive(conn) ? "keep-alive" : "close"; +} + + +static int +send_no_cache_header(struct mg_connection *conn) +{ + /* Send all current and obsolete cache opt-out directives. */ + return mg_printf(conn, + "Cache-Control: no-cache, no-store, " + "must-revalidate, private, max-age=0\r\n" + "Pragma: no-cache\r\n" + "Expires: 0\r\n"); +} + + +static int +send_static_cache_header(struct mg_connection *conn) +{ +#if !defined(NO_CACHING) + /* Read the server config to check how long a file may be cached. + * The configuration is in seconds. */ + int max_age = atoi(conn->ctx->config[STATIC_FILE_MAX_AGE]); + if (max_age <= 0) { + /* 0 means "do not cache". All values <0 are reserved + * and may be used differently in the future. */ + /* If a file should not be cached, do not only send + * max-age=0, but also pragmas and Expires headers. */ + return send_no_cache_header(conn); + } + + /* Use "Cache-Control: max-age" instead of "Expires" header. + * Reason: see https://www.mnot.net/blog/2007/05/15/expires_max-age */ + /* See also https://www.mnot.net/cache_docs/ */ + /* According to RFC 2616, Section 14.21, caching times should not exceed + * one year. A year with 365 days corresponds to 31536000 seconds, a leap + * year to 31622400 seconds. For the moment, we just send whatever has + * been configured, still the behavior for >1 year should be considered + * as undefined. */ + return mg_printf(conn, "Cache-Control: max-age=%u\r\n", (unsigned)max_age); +#else /* NO_CACHING */ + return send_no_cache_header(conn); +#endif /* !NO_CACHING */ +} + + +static void handle_file_based_request(struct mg_connection *conn, + const char *path, + struct file *filep); + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep); + + +const char * +mg_get_response_code_text(struct mg_connection *conn, int response_code) +{ + /* See IANA HTTP status code assignment: + * http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml + */ + + switch (response_code) { + /* RFC2616 Section 10.1 - Informational 1xx */ + case 100: + return "Continue"; /* RFC2616 Section 10.1.1 */ + case 101: + return "Switching Protocols"; /* RFC2616 Section 10.1.2 */ + case 102: + return "Processing"; /* RFC2518 Section 10.1 */ + + /* RFC2616 Section 10.2 - Successful 2xx */ + case 200: + return "OK"; /* RFC2616 Section 10.2.1 */ + case 201: + return "Created"; /* RFC2616 Section 10.2.2 */ + case 202: + return "Accepted"; /* RFC2616 Section 10.2.3 */ + case 203: + return "Non-Authoritative Information"; /* RFC2616 Section 10.2.4 */ + case 204: + return "No Content"; /* RFC2616 Section 10.2.5 */ + case 205: + return "Reset Content"; /* RFC2616 Section 10.2.6 */ + case 206: + return "Partial Content"; /* RFC2616 Section 10.2.7 */ + case 207: + return "Multi-Status"; /* RFC2518 Section 10.2, RFC4918 Section 11.1 */ + case 208: + return "Already Reported"; /* RFC5842 Section 7.1 */ + + case 226: + return "IM used"; /* RFC3229 Section 10.4.1 */ + + /* RFC2616 Section 10.3 - Redirection 3xx */ + case 300: + return "Multiple Choices"; /* RFC2616 Section 10.3.1 */ + case 301: + return "Moved Permanently"; /* RFC2616 Section 10.3.2 */ + case 302: + return "Found"; /* RFC2616 Section 10.3.3 */ + case 303: + return "See Other"; /* RFC2616 Section 10.3.4 */ + case 304: + return "Not Modified"; /* RFC2616 Section 10.3.5 */ + case 305: + return "Use Proxy"; /* RFC2616 Section 10.3.6 */ + case 307: + return "Temporary Redirect"; /* RFC2616 Section 10.3.8 */ + case 308: + return "Permanent Redirect"; /* RFC7238 Section 3 */ + + /* RFC2616 Section 10.4 - Client Error 4xx */ + case 400: + return "Bad Request"; /* RFC2616 Section 10.4.1 */ + case 401: + return "Unauthorized"; /* RFC2616 Section 10.4.2 */ + case 402: + return "Payment Required"; /* RFC2616 Section 10.4.3 */ + case 403: + return "Forbidden"; /* RFC2616 Section 10.4.4 */ + case 404: + return "Not Found"; /* RFC2616 Section 10.4.5 */ + case 405: + return "Method Not Allowed"; /* RFC2616 Section 10.4.6 */ + case 406: + return "Not Acceptable"; /* RFC2616 Section 10.4.7 */ + case 407: + return "Proxy Authentication Required"; /* RFC2616 Section 10.4.8 */ + case 408: + return "Request Time-out"; /* RFC2616 Section 10.4.9 */ + case 409: + return "Conflict"; /* RFC2616 Section 10.4.10 */ + case 410: + return "Gone"; /* RFC2616 Section 10.4.11 */ + case 411: + return "Length Required"; /* RFC2616 Section 10.4.12 */ + case 412: + return "Precondition Failed"; /* RFC2616 Section 10.4.13 */ + case 413: + return "Request Entity Too Large"; /* RFC2616 Section 10.4.14 */ + case 414: + return "Request-URI Too Large"; /* RFC2616 Section 10.4.15 */ + case 415: + return "Unsupported Media Type"; /* RFC2616 Section 10.4.16 */ + case 416: + return "Requested range not satisfiable"; /* RFC2616 Section 10.4.17 */ + case 417: + return "Expectation Failed"; /* RFC2616 Section 10.4.18 */ + + case 421: + return "Misdirected Request"; /* RFC7540 Section 9.1.2 */ + case 422: + return "Unproccessable entity"; /* RFC2518 Section 10.3, RFC4918 + * Section 11.2 */ + case 423: + return "Locked"; /* RFC2518 Section 10.4, RFC4918 Section 11.3 */ + case 424: + return "Failed Dependency"; /* RFC2518 Section 10.5, RFC4918 + * Section 11.4 */ + + case 426: + return "Upgrade Required"; /* RFC 2817 Section 4 */ + + case 428: + return "Precondition Required"; /* RFC 6585, Section 3 */ + case 429: + return "Too Many Requests"; /* RFC 6585, Section 4 */ + + case 431: + return "Request Header Fields Too Large"; /* RFC 6585, Section 5 */ + + case 451: + return "Unavailable For Legal Reasons"; /* draft-tbray-http-legally-restricted-status-05, + * Section 3 */ + + /* RFC2616 Section 10.5 - Server Error 5xx */ + case 500: + return "Internal Server Error"; /* RFC2616 Section 10.5.1 */ + case 501: + return "Not Implemented"; /* RFC2616 Section 10.5.2 */ + case 502: + return "Bad Gateway"; /* RFC2616 Section 10.5.3 */ + case 503: + return "Service Unavailable"; /* RFC2616 Section 10.5.4 */ + case 504: + return "Gateway Time-out"; /* RFC2616 Section 10.5.5 */ + case 505: + return "HTTP Version not supported"; /* RFC2616 Section 10.5.6 */ + case 506: + return "Variant Also Negotiates"; /* RFC 2295, Section 8.1 */ + case 507: + return "Insufficient Storage"; /* RFC2518 Section 10.6, RFC4918 + * Section 11.5 */ + case 508: + return "Loop Detected"; /* RFC5842 Section 7.1 */ + + case 510: + return "Not Extended"; /* RFC 2774, Section 7 */ + case 511: + return "Network Authentication Required"; /* RFC 6585, Section 6 */ + + /* Other status codes, not shown in the IANA HTTP status code assignment. + * E.g., "de facto" standards due to common use, ... */ + case 418: + return "I am a teapot"; /* RFC2324 Section 2.3.2 */ + case 419: + return "Authentication Timeout"; /* common use */ + case 420: + return "Enhance Your Calm"; /* common use */ + case 440: + return "Login Timeout"; /* common use */ + case 509: + return "Bandwidth Limit Exceeded"; /* common use */ + + default: + /* This error code is unknown. This should not happen. */ + if (conn) { + mg_cry(conn, "Unknown HTTP response code: %u", response_code); + } + + /* Return at least a category according to RFC 2616 Section 10. */ + if (response_code >= 100 && response_code < 200) { + /* Unknown informational status code */ + return "Information"; + } + if (response_code >= 200 && response_code < 300) { + /* Unknown success code */ + return "Success"; + } + if (response_code >= 300 && response_code < 400) { + /* Unknown redirection code */ + return "Redirection"; + } + if (response_code >= 400 && response_code < 500) { + /* Unknown request error code */ + return "Client Error"; + } + if (response_code >= 500 && response_code < 600) { + /* Unknown server error code */ + return "Server Error"; + } + + /* Response code not even within reasonable range */ + return ""; + } +} + + +static void send_http_error(struct mg_connection *, + int, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(3, 4); + +static void +send_http_error(struct mg_connection *conn, int status, const char *fmt, ...) +{ + char buf[MG_BUF_LEN]; + va_list ap; + int len, i, page_handler_found, scope, truncated; + char date[64]; + time_t curtime = time(NULL); + const char *error_handler = NULL; + struct file error_page_file = STRUCT_FILE_INITIALIZER; + const char *error_page_file_ext, *tstr; + + const char *status_text = mg_get_response_code_text(conn, status); + + if (conn == NULL) { + return; + } + + conn->status_code = status; + if (conn->in_error_handler || conn->ctx->callbacks.http_error == NULL + || conn->ctx->callbacks.http_error(conn, status)) { + if (!conn->in_error_handler) { + /* Send user defined error pages, if defined */ + error_handler = conn->ctx->config[ERROR_PAGES]; + error_page_file_ext = conn->ctx->config[INDEX_FILES]; + page_handler_found = 0; + if (error_handler != NULL) { + for (scope = 1; (scope <= 3) && !page_handler_found; scope++) { + switch (scope) { + case 1: /* Handler for specific error, e.g. 404 error */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror%03u.", + error_handler, + status); + break; + case 2: /* Handler for error group, e.g., 5xx error handler + * for all server errors (500-599) */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror%01uxx.", + error_handler, + status / 100); + break; + default: /* Handler for all errors */ + mg_snprintf(conn, + &truncated, + buf, + sizeof(buf) - 32, + "%serror.", + error_handler); + break; + } + + /* String truncation in buf may only occur if error_handler + * is too long. This string is from the config, not from a + * client. */ + (void)truncated; + + len = (int)strlen(buf); + + tstr = strchr(error_page_file_ext, '.'); + + while (tstr) { + for (i = 1; i < 32 && tstr[i] != 0 && tstr[i] != ','; + i++) + buf[len + i - 1] = tstr[i]; + buf[len + i - 1] = 0; + if (mg_stat(conn, buf, &error_page_file)) { + page_handler_found = 1; + break; + } + tstr = strchr(tstr + i, '.'); + } + } + } + + if (page_handler_found) { + conn->in_error_handler = 1; + handle_file_based_request(conn, buf, &error_page_file); + conn->in_error_handler = 0; + return; + } + } + + /* No custom error page. Send default error page. */ + gmt_time_string(date, sizeof(date), &curtime); + + conn->must_close = 1; + mg_printf(conn, "HTTP/1.1 %d %s\r\n", status, status_text); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Connection: close\r\n\r\n", + date); + + /* Errors 1xx, 204 and 304 MUST NOT send a body */ + if (status > 199 && status != 204 && status != 304) { + + mg_printf(conn, "Error %d: %s\n", status, status_text); + + if (fmt != NULL) { + va_start(ap, fmt); + mg_vsnprintf(conn, NULL, buf, sizeof(buf), fmt, ap); + va_end(ap); + mg_write(conn, buf, strlen(buf)); + DEBUG_TRACE("Error %i - [%s]", status, buf); + } + + } else { + /* No body allowed. Close the connection. */ + DEBUG_TRACE("Error %i", status); + } + } +} + +#if defined(_WIN32) && !defined(__SYMBIAN32__) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static int +pthread_mutex_init(pthread_mutex_t *mutex, void *unused) +{ + (void)unused; + *mutex = CreateMutex(NULL, FALSE, NULL); + return *mutex == NULL ? -1 : 0; +} + + +static int +pthread_mutex_destroy(pthread_mutex_t *mutex) +{ + return CloseHandle(*mutex) == 0 ? -1 : 0; +} + + +static int +pthread_mutex_lock(pthread_mutex_t *mutex) +{ + return WaitForSingleObject(*mutex, INFINITE) == WAIT_OBJECT_0 ? 0 : -1; +} + + +#ifdef ENABLE_UNUSED_PTHREAD_FUNCTIONS +static int +pthread_mutex_trylock(pthread_mutex_t *mutex) +{ + switch (WaitForSingleObject(*mutex, 0)) { + case WAIT_OBJECT_0: + return 0; + case WAIT_TIMEOUT: + return -2; /* EBUSY */ + } + return -1; +} +#endif + + +static int +pthread_mutex_unlock(pthread_mutex_t *mutex) +{ + return ReleaseMutex(*mutex) == 0 ? -1 : 0; +} + + +#ifndef WIN_PTHREADS_TIME_H +static int +clock_gettime(clockid_t clk_id, struct timespec *tp) +{ + FILETIME ft; + ULARGE_INTEGER li; + BOOL ok = FALSE; + double d; + static double perfcnt_per_sec = 0.0; + + if (tp) { + memset(tp, 0, sizeof(*tp)); + if (clk_id == CLOCK_REALTIME) { + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + li.QuadPart -= 116444736000000000; /* 1.1.1970 in filedate */ + tp->tv_sec = (time_t)(li.QuadPart / 10000000); + tp->tv_nsec = (long)(li.QuadPart % 10000000) * 100; + ok = TRUE; + } else if (clk_id == CLOCK_MONOTONIC) { + if (perfcnt_per_sec == 0.0) { + QueryPerformanceFrequency((LARGE_INTEGER *)&li); + perfcnt_per_sec = 1.0 / li.QuadPart; + } + if (perfcnt_per_sec != 0.0) { + QueryPerformanceCounter((LARGE_INTEGER *)&li); + d = li.QuadPart * perfcnt_per_sec; + tp->tv_sec = (time_t)d; + d -= tp->tv_sec; + tp->tv_nsec = (long)(d * 1.0E9); + ok = TRUE; + } + } + } + + return ok ? 0 : -1; +} +#endif + + +static int +pthread_cond_init(pthread_cond_t *cv, const void *unused) +{ + (void)unused; + InitializeCriticalSection(&cv->threadIdSec); + cv->waitingthreadcount = 0; + cv->waitingthreadhdls = + (pthread_t *)mg_calloc(MAX_WORKER_THREADS, sizeof(pthread_t)); + return (cv->waitingthreadhdls != NULL) ? 0 : -1; +} + + +static int +pthread_cond_timedwait(pthread_cond_t *cv, + pthread_mutex_t *mutex, + const struct timespec *abstime) +{ + struct mg_workerTLS *tls = + (struct mg_workerTLS *)pthread_getspecific(sTlsKey); + int ok; + struct timespec tsnow; + int64_t nsnow, nswaitabs, nswaitrel; + DWORD mswaitrel; + + EnterCriticalSection(&cv->threadIdSec); + assert(cv->waitingthreadcount < MAX_WORKER_THREADS); + cv->waitingthreadhdls[cv->waitingthreadcount] = + tls->pthread_cond_helper_mutex; + cv->waitingthreadcount++; + LeaveCriticalSection(&cv->threadIdSec); + + if (abstime) { + clock_gettime(CLOCK_REALTIME, &tsnow); + nsnow = (((int64_t)tsnow.tv_sec) * 1000000000) + tsnow.tv_nsec; + nswaitabs = + (((int64_t)abstime->tv_sec) * 1000000000) + abstime->tv_nsec; + nswaitrel = nswaitabs - nsnow; + if (nswaitrel < 0) { + nswaitrel = 0; + } + mswaitrel = (DWORD)(nswaitrel / 1000000); + } else { + mswaitrel = INFINITE; + } + + pthread_mutex_unlock(mutex); + ok = (WAIT_OBJECT_0 + == WaitForSingleObject(tls->pthread_cond_helper_mutex, mswaitrel)); + pthread_mutex_lock(mutex); + + return ok ? 0 : -1; +} + + +static int +pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex) +{ + return pthread_cond_timedwait(cv, mutex, NULL); +} + + +static int +pthread_cond_signal(pthread_cond_t *cv) +{ + int i; + HANDLE wkup = NULL; + BOOL ok = FALSE; + + EnterCriticalSection(&cv->threadIdSec); + if (cv->waitingthreadcount) { + wkup = cv->waitingthreadhdls[0]; + ok = SetEvent(wkup); + + for (i = 1; i < cv->waitingthreadcount; i++) { + cv->waitingthreadhdls[i - 1] = cv->waitingthreadhdls[i]; + } + cv->waitingthreadcount--; + + assert(ok); + } + LeaveCriticalSection(&cv->threadIdSec); + + return ok ? 0 : 1; +} + + +static int +pthread_cond_broadcast(pthread_cond_t *cv) +{ + EnterCriticalSection(&cv->threadIdSec); + while (cv->waitingthreadcount) { + pthread_cond_signal(cv); + } + LeaveCriticalSection(&cv->threadIdSec); + + return 0; +} + + +static int +pthread_cond_destroy(pthread_cond_t *cv) +{ + EnterCriticalSection(&cv->threadIdSec); + assert(cv->waitingthreadcount == 0); + mg_free(cv->waitingthreadhdls); + cv->waitingthreadhdls = 0; + LeaveCriticalSection(&cv->threadIdSec); + DeleteCriticalSection(&cv->threadIdSec); + + return 0; +} + + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + + +/* For Windows, change all slashes to backslashes in path names. */ +static void +change_slashes_to_backslashes(char *path) +{ + int i; + + for (i = 0; path[i] != '\0'; i++) { + if (path[i] == '/') { + path[i] = '\\'; + } + + /* remove double backslash (check i > 0 to preserve UNC paths, + * like \\server\file.txt) */ + if ((path[i] == '\\') && (i > 0)) { + while (path[i + 1] == '\\' || path[i + 1] == '/') { + (void)memmove(path + i + 1, path + i + 2, strlen(path + i + 1)); + } + } + } +} + + +static int +mg_wcscasecmp(const wchar_t *s1, const wchar_t *s2) +{ + int diff; + + do { + diff = tolower(*s1) - tolower(*s2); + s1++; + s2++; + } while (diff == 0 && s1[-1] != '\0'); + + return diff; +} + + +/* Encode 'path' which is assumed UTF-8 string, into UNICODE string. + * wbuf and wbuf_len is a target buffer and its length. */ +static void +path_to_unicode(const struct mg_connection *conn, + const char *path, + wchar_t *wbuf, + size_t wbuf_len) +{ + char buf[PATH_MAX], buf2[PATH_MAX]; + wchar_t wbuf2[MAX_PATH + 1]; + DWORD long_len, err; + int (*fcompare)(const wchar_t *, const wchar_t *) = mg_wcscasecmp; + + mg_strlcpy(buf, path, sizeof(buf)); + change_slashes_to_backslashes(buf); + + /* Convert to Unicode and back. If doubly-converted string does not + * match the original, something is fishy, reject. */ + memset(wbuf, 0, wbuf_len * sizeof(wchar_t)); + MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int)wbuf_len); + WideCharToMultiByte( + CP_UTF8, 0, wbuf, (int)wbuf_len, buf2, sizeof(buf2), NULL, NULL); + if (strcmp(buf, buf2) != 0) { + wbuf[0] = L'\0'; + } + + /* TODO: Add a configuration to switch between case sensitive and + * case insensitive URIs for Windows server. */ + /* + if (conn) { + if (conn->ctx->config[WINDOWS_CASE_SENSITIVE]) { + fcompare = wcscmp; + } + } + */ + (void)conn; /* conn is currently unused */ + + /* Only accept a full file path, not a Windows short (8.3) path. */ + memset(wbuf2, 0, ARRAY_SIZE(wbuf2) * sizeof(wchar_t)); + long_len = GetLongPathNameW(wbuf, wbuf2, ARRAY_SIZE(wbuf2) - 1); + if (long_len == 0) { + err = GetLastError(); + if (err == ERROR_FILE_NOT_FOUND) { + /* File does not exist. This is not always a problem here. */ + return; + } + } + if ((long_len >= ARRAY_SIZE(wbuf2)) || (fcompare(wbuf, wbuf2) != 0)) { + /* Short name is used. */ + wbuf[0] = L'\0'; + } +} + + +#if defined(_WIN32_WCE) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static time_t +time(time_t *ptime) +{ + time_t t; + SYSTEMTIME st; + FILETIME ft; + + GetSystemTime(&st); + SystemTimeToFileTime(&st, &ft); + t = SYS2UNIX_TIME(ft.dwLowDateTime, ft.dwHighDateTime); + + if (ptime != NULL) { + *ptime = t; + } + + return t; +} + + +static struct tm * +localtime(const time_t *ptime, struct tm *ptm) +{ + int64_t t = ((int64_t)*ptime) * RATE_DIFF + EPOCH_DIFF; + FILETIME ft, lft; + SYSTEMTIME st; + TIME_ZONE_INFORMATION tzinfo; + + if (ptm == NULL) { + return NULL; + } + + *(int64_t *)&ft = t; + FileTimeToLocalFileTime(&ft, &lft); + FileTimeToSystemTime(&lft, &st); + ptm->tm_year = st.wYear - 1900; + ptm->tm_mon = st.wMonth - 1; + ptm->tm_wday = st.wDayOfWeek; + ptm->tm_mday = st.wDay; + ptm->tm_hour = st.wHour; + ptm->tm_min = st.wMinute; + ptm->tm_sec = st.wSecond; + ptm->tm_yday = 0; /* hope nobody uses this */ + ptm->tm_isdst = + GetTimeZoneInformation(&tzinfo) == TIME_ZONE_ID_DAYLIGHT ? 1 : 0; + + return ptm; +} + + +static struct tm * +gmtime(const time_t *ptime, struct tm *ptm) +{ + /* FIXME(lsm): fix this. */ + return localtime(ptime, ptm); +} + + +static size_t +strftime(char *dst, size_t dst_size, const char *fmt, const struct tm *tm) +{ + (void)mg_snprintf(NULL, dst, dst_size, "implement strftime() for WinCE"); + return 0; +} + + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +#endif + + +/* Windows happily opens files with some garbage at the end of file name. + * For example, fopen("a.cgi ", "r") on Windows successfully opens + * "a.cgi", despite one would expect an error back. + * This function returns non-0 if path ends with some garbage. */ +static int +path_cannot_disclose_cgi(const char *path) +{ + static const char *allowed_last_characters = "_-"; + int last = path[strlen(path) - 1]; + return isalnum(last) || strchr(allowed_last_characters, last) != NULL; +} + + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep) +{ + wchar_t wbuf[PATH_MAX]; + WIN32_FILE_ATTRIBUTE_DATA info; + time_t creation_time; + + if (!filep) { + return 0; + } + memset(filep, 0, sizeof(*filep)); + + if (conn && is_file_in_memory(conn, path, filep)) { + /* filep->is_directory = 0; filep->gzipped = 0; .. already done by + * memset */ + filep->last_modified = time(NULL); + /* last_modified = now ... assumes the file may change during runtime, + * so every mg_fopen call may return different data */ + /* last_modified = conn->ctx.start_time; + * May be used it the data does not change during runtime. This allows + * browser caching. Since we do not know, we have to assume the file + * in memory may change. */ + return 1; + } + + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + if (GetFileAttributesExW(wbuf, GetFileExInfoStandard, &info) != 0) { + filep->size = MAKEUQUAD(info.nFileSizeLow, info.nFileSizeHigh); + filep->last_modified = + SYS2UNIX_TIME(info.ftLastWriteTime.dwLowDateTime, + info.ftLastWriteTime.dwHighDateTime); + + /* On Windows, the file creation time can be higher than the + * modification time, e.g. when a file is copied. + * Since the Last-Modified timestamp is used for caching + * it should be based on the most recent timestamp. */ + creation_time = SYS2UNIX_TIME(info.ftCreationTime.dwLowDateTime, + info.ftCreationTime.dwHighDateTime); + if (creation_time > filep->last_modified) { + filep->last_modified = creation_time; + } + + filep->is_directory = info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY; + /* If file name is fishy, reset the file structure and return + * error. + * Note it is important to reset, not just return the error, cause + * functions like is_file_opened() check the struct. */ + if (!filep->is_directory && !path_cannot_disclose_cgi(path)) { + memset(filep, 0, sizeof(*filep)); + return 0; + } + + return 1; + } + + return 0; +} + + +static int +mg_remove(const struct mg_connection *conn, const char *path) +{ + wchar_t wbuf[PATH_MAX]; + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + return DeleteFileW(wbuf) ? 0 : -1; +} + + +static int +mg_mkdir(const struct mg_connection *conn, const char *path, int mode) +{ + wchar_t wbuf[PATH_MAX]; + (void)mode; + path_to_unicode(conn, path, wbuf, ARRAY_SIZE(wbuf)); + return CreateDirectoryW(wbuf, NULL) ? 0 : -1; +} + + +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +/* Implementation of POSIX opendir/closedir/readdir for Windows. */ +static DIR * +mg_opendir(const struct mg_connection *conn, const char *name) +{ + DIR *dir = NULL; + wchar_t wpath[PATH_MAX]; + DWORD attrs; + + if (name == NULL) { + SetLastError(ERROR_BAD_ARGUMENTS); + } else if ((dir = (DIR *)mg_malloc(sizeof(*dir))) == NULL) { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + } else { + path_to_unicode(conn, name, wpath, ARRAY_SIZE(wpath)); + attrs = GetFileAttributesW(wpath); + if (attrs != 0xFFFFFFFF && ((attrs & FILE_ATTRIBUTE_DIRECTORY) + == FILE_ATTRIBUTE_DIRECTORY)) { + (void)wcscat(wpath, L"\\*"); + dir->handle = FindFirstFileW(wpath, &dir->info); + dir->result.d_name[0] = '\0'; + } else { + mg_free(dir); + dir = NULL; + } + } + + return dir; +} + + +static int +mg_closedir(DIR *dir) +{ + int result = 0; + + if (dir != NULL) { + if (dir->handle != INVALID_HANDLE_VALUE) + result = FindClose(dir->handle) ? 0 : -1; + + mg_free(dir); + } else { + result = -1; + SetLastError(ERROR_BAD_ARGUMENTS); + } + + return result; +} + + +static struct dirent * +mg_readdir(DIR *dir) +{ + struct dirent *result = 0; + + if (dir) { + if (dir->handle != INVALID_HANDLE_VALUE) { + result = &dir->result; + (void)WideCharToMultiByte(CP_UTF8, + 0, + dir->info.cFileName, + -1, + result->d_name, + sizeof(result->d_name), + NULL, + NULL); + + if (!FindNextFileW(dir->handle, &dir->info)) { + (void)FindClose(dir->handle); + dir->handle = INVALID_HANDLE_VALUE; + } + + } else { + SetLastError(ERROR_FILE_NOT_FOUND); + } + } else { + SetLastError(ERROR_BAD_ARGUMENTS); + } + + return result; +} + + +#ifndef HAVE_POLL +static int +poll(struct pollfd *pfd, unsigned int n, int milliseconds) +{ + struct timeval tv; + fd_set set; + unsigned int i; + int result; + SOCKET maxfd = 0; + + memset(&tv, 0, sizeof(tv)); + tv.tv_sec = milliseconds / 1000; + tv.tv_usec = (milliseconds % 1000) * 1000; + FD_ZERO(&set); + + for (i = 0; i < n; i++) { + FD_SET((SOCKET)pfd[i].fd, &set); + pfd[i].revents = 0; + + if (pfd[i].fd > maxfd) { + maxfd = pfd[i].fd; + } + } + + if ((result = select((int)maxfd + 1, &set, NULL, NULL, &tv)) > 0) { + for (i = 0; i < n; i++) { + if (FD_ISSET(pfd[i].fd, &set)) { + pfd[i].revents = POLLIN; + } + } + } + + return result; +} +#endif /* HAVE_POLL */ + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + + +static void +set_close_on_exec(SOCKET sock, struct mg_connection *conn /* may be null */) +{ + (void)conn; /* Unused. */ + (void)SetHandleInformation((HANDLE)(intptr_t)sock, HANDLE_FLAG_INHERIT, 0); +} + + +int +mg_start_thread(mg_thread_func_t f, void *p) +{ +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, e.g. -DUSE_STACK_SIZE=16384 + */ + return ((_beginthread((void(__cdecl *)(void *))f, USE_STACK_SIZE, p) + == ((uintptr_t)(-1L))) + ? -1 + : 0); +#else + return ( + (_beginthread((void(__cdecl *)(void *))f, 0, p) == ((uintptr_t)(-1L))) + ? -1 + : 0); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ +} + + +/* Start a thread storing the thread context. */ +static int +mg_start_thread_with_id(unsigned(__stdcall *f)(void *), + void *p, + pthread_t *threadidptr) +{ + uintptr_t uip; + HANDLE threadhandle; + int result = -1; + + uip = _beginthreadex(NULL, 0, (unsigned(__stdcall *)(void *))f, p, 0, NULL); + threadhandle = (HANDLE)uip; + if ((uip != (uintptr_t)(-1L)) && (threadidptr != NULL)) { + *threadidptr = threadhandle; + result = 0; + } + + return result; +} + + +/* Wait for a thread to finish. */ +static int +mg_join_thread(pthread_t threadid) +{ + int result; + DWORD dwevent; + + result = -1; + dwevent = WaitForSingleObject(threadid, INFINITE); + if (dwevent == WAIT_FAILED) { + DEBUG_TRACE("WaitForSingleObject() failed, error %d", ERRNO); + } else { + if (dwevent == WAIT_OBJECT_0) { + CloseHandle(threadid); + result = 0; + } + } + + return result; +} + +#if !defined(NO_SSL_DL) +/* Create substitutes for POSIX functions in Win32. */ + +#if defined(__MINGW32__) +/* Show no warning in case system functions are not used. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-function" +#endif + + +static HANDLE +dlopen(const char *dll_name, int flags) +{ + wchar_t wbuf[PATH_MAX]; + (void)flags; + path_to_unicode(NULL, dll_name, wbuf, ARRAY_SIZE(wbuf)); + return LoadLibraryW(wbuf); +} + + +static int +dlclose(void *handle) +{ + int result; + + if (FreeLibrary((HMODULE)handle) != 0) { + result = 0; + } else { + result = -1; + } + + return result; +} + + +#if defined(__MINGW32__) +/* Enable unused function warning again */ +#pragma GCC diagnostic pop +#endif + +#endif + + +#if !defined(NO_CGI) +#define SIGKILL (0) + +static int +kill(pid_t pid, int sig_num) +{ + (void)TerminateProcess((HANDLE)pid, (UINT)sig_num); + (void)CloseHandle((HANDLE)pid); + return 0; +} + + +static void +trim_trailing_whitespaces(char *s) +{ + char *e = s + strlen(s) - 1; + while (e > s && isspace(*(unsigned char *)e)) { + *e-- = '\0'; + } +} + + +static pid_t +spawn_process(struct mg_connection *conn, + const char *prog, + char *envblk, + char *envp[], + int fdin[2], + int fdout[2], + int fderr[2], + const char *dir) +{ + HANDLE me; + char *p, *interp, full_interp[PATH_MAX], full_dir[PATH_MAX], + cmdline[PATH_MAX], buf[PATH_MAX]; + int truncated; + struct file file = STRUCT_FILE_INITIALIZER; + STARTUPINFOA si; + PROCESS_INFORMATION pi = {0}; + + (void)envp; + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + + si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; + si.wShowWindow = SW_HIDE; + + me = GetCurrentProcess(); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fdin[0]), + me, + &si.hStdInput, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fdout[1]), + me, + &si.hStdOutput, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + DuplicateHandle(me, + (HANDLE)_get_osfhandle(fderr[1]), + me, + &si.hStdError, + 0, + TRUE, + DUPLICATE_SAME_ACCESS); + + /* Mark handles that should not be inherited. See + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.85%29.aspx + */ + SetHandleInformation((HANDLE)_get_osfhandle(fdin[1]), + HANDLE_FLAG_INHERIT, + 0); + SetHandleInformation((HANDLE)_get_osfhandle(fdout[0]), + HANDLE_FLAG_INHERIT, + 0); + SetHandleInformation((HANDLE)_get_osfhandle(fderr[0]), + HANDLE_FLAG_INHERIT, + 0); + + /* If CGI file is a script, try to read the interpreter line */ + interp = conn->ctx->config[CGI_INTERPRETER]; + if (interp == NULL) { + buf[0] = buf[1] = '\0'; + + /* Read the first line of the script into the buffer */ + mg_snprintf( + conn, &truncated, cmdline, sizeof(cmdline), "%s/%s", dir, prog); + + if (truncated) { + pi.hProcess = (pid_t)-1; + goto spawn_cleanup; + } + + if (mg_fopen(conn, cmdline, "r", &file)) { + p = (char *)file.membuf; + mg_fgets(buf, sizeof(buf), &file, &p); + mg_fclose(&file); + buf[sizeof(buf) - 1] = '\0'; + } + + if (buf[0] == '#' && buf[1] == '!') { + trim_trailing_whitespaces(buf + 2); + } else { + buf[2] = '\0'; + } + interp = buf + 2; + } + + if (interp[0] != '\0') { + GetFullPathNameA(interp, sizeof(full_interp), full_interp, NULL); + interp = full_interp; + } + GetFullPathNameA(dir, sizeof(full_dir), full_dir, NULL); + + if (interp[0] != '\0') { + mg_snprintf(conn, + &truncated, + cmdline, + sizeof(cmdline), + "\"%s\" \"%s\\%s\"", + interp, + full_dir, + prog); + } else { + mg_snprintf(conn, + &truncated, + cmdline, + sizeof(cmdline), + "\"%s\\%s\"", + full_dir, + prog); + } + + if (truncated) { + pi.hProcess = (pid_t)-1; + goto spawn_cleanup; + } + + DEBUG_TRACE("Running [%s]", cmdline); + if (CreateProcessA(NULL, + cmdline, + NULL, + NULL, + TRUE, + CREATE_NEW_PROCESS_GROUP, + envblk, + NULL, + &si, + &pi) == 0) { + mg_cry( + conn, "%s: CreateProcess(%s): %ld", __func__, cmdline, (long)ERRNO); + pi.hProcess = (pid_t)-1; + /* goto spawn_cleanup; */ + } + +spawn_cleanup: + (void)CloseHandle(si.hStdOutput); + (void)CloseHandle(si.hStdError); + (void)CloseHandle(si.hStdInput); + if (pi.hThread != NULL) { + (void)CloseHandle(pi.hThread); + } + + return (pid_t)pi.hProcess; +} +#endif /* !NO_CGI */ + + +static int +set_non_blocking_mode(SOCKET sock) +{ + unsigned long on = 1; + return ioctlsocket(sock, (long)FIONBIO, &on); +} + +#else + +static int +mg_stat(struct mg_connection *conn, const char *path, struct file *filep) +{ + struct stat st; + if (!filep) { + return 0; + } + memset(filep, 0, sizeof(*filep)); + + if (conn && is_file_in_memory(conn, path, filep)) { + return 1; + } + + if (0 == stat(path, &st)) { + filep->size = (uint64_t)(st.st_size); + filep->last_modified = st.st_mtime; + filep->is_directory = S_ISDIR(st.st_mode); + return 1; + } + + return 0; +} + + +static void +set_close_on_exec(SOCKET fd, struct mg_connection *conn /* may be null */) +{ + if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) { + if (conn) { + mg_cry(conn, + "%s: fcntl(F_SETFD FD_CLOEXEC) failed: %s", + __func__, + strerror(ERRNO)); + } + } +} + + +int +mg_start_thread(mg_thread_func_t func, void *param) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + + return result; +} + + +/* Start a thread storing the thread context. */ +static int +mg_start_thread_with_id(mg_thread_func_t func, + void *param, + pthread_t *threadidptr) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && USE_STACK_SIZE > 1 */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + if ((result == 0) && (threadidptr != NULL)) { + *threadidptr = thread_id; + } + return result; +} + + +/* Wait for a thread to finish. */ +static int +mg_join_thread(pthread_t threadid) +{ + int result; + + result = pthread_join(threadid, NULL); + return result; +} + + +#ifndef NO_CGI +static pid_t +spawn_process(struct mg_connection *conn, + const char *prog, + char *envblk, + char *envp[], + int fdin[2], + int fdout[2], + int fderr[2], + const char *dir) +{ + pid_t pid; + const char *interp; + + (void)envblk; + + if (conn == NULL) { + return 0; + } + + if ((pid = fork()) == -1) { + /* Parent */ + send_http_error(conn, + 500, + "Error: Creating CGI process\nfork(): %s", + strerror(ERRNO)); + } else if (pid == 0) { + /* Child */ + if (chdir(dir) != 0) { + mg_cry(conn, "%s: chdir(%s): %s", __func__, dir, strerror(ERRNO)); + } else if (dup2(fdin[0], 0) == -1) { + mg_cry(conn, + "%s: dup2(%d, 0): %s", + __func__, + fdin[0], + strerror(ERRNO)); + } else if (dup2(fdout[1], 1) == -1) { + mg_cry(conn, + "%s: dup2(%d, 1): %s", + __func__, + fdout[1], + strerror(ERRNO)); + } else if (dup2(fderr[1], 2) == -1) { + mg_cry(conn, + "%s: dup2(%d, 2): %s", + __func__, + fderr[1], + strerror(ERRNO)); + } else { + /* Keep stderr and stdout in two different pipes. + * Stdout will be sent back to the client, + * stderr should go into a server error log. */ + (void)close(fdin[0]); + (void)close(fdout[1]); + (void)close(fderr[1]); + + /* Close write end fdin and read end fdout and fderr */ + (void)close(fdin[1]); + (void)close(fdout[0]); + (void)close(fderr[0]); + + /* After exec, all signal handlers are restored to their default + * values, with one exception of SIGCHLD. According to + * POSIX.1-2001 and Linux's implementation, SIGCHLD's handler will + * leave unchanged after exec if it was set to be ignored. Restore + * it to default action. */ + signal(SIGCHLD, SIG_DFL); + + interp = conn->ctx->config[CGI_INTERPRETER]; + if (interp == NULL) { + (void)execle(prog, prog, NULL, envp); + mg_cry(conn, + "%s: execle(%s): %s", + __func__, + prog, + strerror(ERRNO)); + } else { + (void)execle(interp, interp, prog, NULL, envp); + mg_cry(conn, + "%s: execle(%s %s): %s", + __func__, + interp, + prog, + strerror(ERRNO)); + } + } + exit(EXIT_FAILURE); + } + + return pid; +} +#endif /* !NO_CGI */ + + +static int +set_non_blocking_mode(SOCKET sock) +{ + int flags; + + flags = fcntl(sock, F_GETFL, 0); + (void)fcntl(sock, F_SETFL, flags | O_NONBLOCK); + + return 0; +} +#endif /* _WIN32 */ +/* End of initial operating system specific define block. */ + + +/* Get a random number (independent of C rand function) */ +static uint64_t +get_random(void) +{ + static uint64_t lfsr = 0; /* Linear feedback shift register */ + static uint64_t lcg = 0; /* Linear congruential generator */ + struct timespec now; + + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &now); + + if (lfsr == 0) { + /* lfsr will be only 0 if has not been initialized, + * so this code is called only once. */ + lfsr = (((uint64_t)now.tv_sec) << 21) ^ ((uint64_t)now.tv_nsec) + ^ ((uint64_t)(ptrdiff_t)&now) ^ (((uint64_t)time(NULL)) << 33); + lcg = (((uint64_t)now.tv_sec) << 25) + (uint64_t)now.tv_nsec + + (uint64_t)(ptrdiff_t)&now; + } else { + /* Get the next step of both random number generators. */ + lfsr = (lfsr >> 1) + | ((((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 3) ^ (lfsr >> 4)) & 1) + << 63); + lcg = lcg * 6364136223846793005 + 1442695040888963407; + } + + /* Combining two pseudo-random number generators and a high resolution part + * of the current server time will make it hard (impossible?) to guess the + * next number. */ + return (lfsr ^ lcg ^ (uint64_t)now.tv_nsec); +} + + +/* Write data to the IO channel - opened file descriptor, socket or SSL + * descriptor. Return number of bytes written. */ +static int +push(struct mg_context *ctx, + FILE *fp, + SOCKET sock, + SSL *ssl, + const char *buf, + int len, + double timeout) +{ + struct timespec start, now; + int n, err; + +#ifdef _WIN32 + typedef int len_t; +#else + typedef size_t len_t; +#endif + + if (timeout > 0) { + memset(&start, 0, sizeof(start)); + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &start); + } + + if (ctx == NULL) { + return -1; + } + +#ifdef NO_SSL + if (ssl) { + return -1; + } +#endif + + do { + +#ifndef NO_SSL + if (ssl != NULL) { + n = SSL_write(ssl, buf, len); + if (n <= 0) { + err = SSL_get_error(ssl, n); + if ((err == 5 /* SSL_ERROR_SYSCALL */) && (n == -1)) { + err = ERRNO; + } else { + DEBUG_TRACE("SSL_write() failed, error %d", err); + return -1; + } + } else { + err = 0; + } + } else +#endif + if (fp != NULL) { + n = (int)fwrite(buf, 1, (size_t)len, fp); + if (ferror(fp)) { + n = -1; + err = ERRNO; + } else { + err = 0; + } + } else { + n = (int)send(sock, buf, (len_t)len, MSG_NOSIGNAL); + err = (n < 0) ? ERRNO : 0; + } + + if (ctx->stop_flag) { + return -1; + } + + if ((n > 0) || (n == 0 && len == 0)) { + /* some data has been read, or no data was requested */ + return n; + } + if (n == 0) { + /* shutdown of the socket at client side */ + return -1; + } + if (n < 0) { + /* socket error - check errno */ + DEBUG_TRACE("send() failed, error %d", err); + + /* TODO: error handling depending on the error code. + * These codes are different between Windows and Linux. + */ + return -1; + } + + /* This code is not reached in the moment. + * ==> Fix the TODOs above first. */ + + if (timeout > 0) { + clock_gettime(CLOCK_MONOTONIC, &now); + } + + } while ((timeout <= 0) || (mg_difftimespec(&now, &start) <= timeout)); + + (void)err; /* Avoid unused warning if NO_SSL is set and DEBUG_TRACE is not + used */ + + return -1; +} + + +static int64_t +push_all(struct mg_context *ctx, + FILE *fp, + SOCKET sock, + SSL *ssl, + const char *buf, + int64_t len) +{ + double timeout = -1.0; + int64_t n, nwritten = 0; + + if (ctx == NULL) { + return -1; + } + + if (ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + while (len > 0 && ctx->stop_flag == 0) { + n = push(ctx, fp, sock, ssl, buf + nwritten, (int)len, timeout); + if (n < 0) { + if (nwritten == 0) { + nwritten = n; /* Propagate the error */ + } + break; + } else if (n == 0) { + break; /* No more data to write */ + } else { + nwritten += n; + len -= n; + } + } + + return nwritten; +} + + +/* Read from IO channel - opened file descriptor, socket, or SSL descriptor. + * Return negative value on error, or number of bytes read on success. */ +static int +pull(FILE *fp, struct mg_connection *conn, char *buf, int len, double timeout) +{ + int nread, err; + struct timespec start, now; + +#ifdef _WIN32 + typedef int len_t; +#else + typedef size_t len_t; +#endif + + if (timeout > 0) { + memset(&start, 0, sizeof(start)); + memset(&now, 0, sizeof(now)); + clock_gettime(CLOCK_MONOTONIC, &start); + } + + do { + if (fp != NULL) { + /* Use read() instead of fread(), because if we're reading from the + * CGI pipe, fread() may block until IO buffer is filled up. We + * cannot afford to block and must pass all read bytes immediately + * to the client. */ + nread = (int)read(fileno(fp), buf, (size_t)len); + err = (nread < 0) ? ERRNO : 0; + +#ifndef NO_SSL + } else if (conn->ssl != NULL) { + nread = SSL_read(conn->ssl, buf, len); + if (nread <= 0) { + err = SSL_get_error(conn->ssl, nread); + if ((err == 5 /* SSL_ERROR_SYSCALL */) && (nread == -1)) { + err = ERRNO; + } else { + DEBUG_TRACE("SSL_read() failed, error %d", err); + return -1; + } + } else { + err = 0; + } +#endif + + } else { + nread = (int)recv(conn->client.sock, buf, (len_t)len, 0); + err = (nread < 0) ? ERRNO : 0; + } + + if (conn->ctx->stop_flag) { + return -1; + } + + if ((nread > 0) || (nread == 0 && len == 0)) { + /* some data has been read, or no data was requested */ + return nread; + } + if (nread == 0) { + /* shutdown of the socket at client side */ + return -1; + } + if (nread < 0) { +/* socket error - check errno */ +#ifdef _WIN32 + if (err == WSAEWOULDBLOCK) { + /* standard case if called from close_socket_gracefully */ + return -1; + } else if (err == WSAETIMEDOUT) { + /* timeout is handled by the while loop */ + } else { + DEBUG_TRACE("recv() failed, error %d", err); + return -1; + } +#else + /* TODO: POSIX returns either EAGAIN or EWOULDBLOCK in both cases, + * if the timeout is reached and if the socket was set to non- + * blocking in close_socket_gracefully, so we can not distinguish + * here. We have to wait for the timeout in both cases for now. + */ + if (err == EAGAIN || err == EWOULDBLOCK || err == EINTR) { + /* EAGAIN/EWOULDBLOCK: + * standard case if called from close_socket_gracefully + * => should return -1 */ + /* or timeout occured + * => the code must stay in the while loop */ + + /* EINTR can be generated on a socket with a timeout set even + * when SA_RESTART is effective for all relevant signals + * (see signal(7)). + * => stay in the while loop */ + } else { + DEBUG_TRACE("recv() failed, error %d", err); + return -1; + } +#endif + } + if (timeout > 0) { + clock_gettime(CLOCK_MONOTONIC, &now); + } + } while ((timeout <= 0) || (mg_difftimespec(&now, &start) <= timeout)); + + /* Timeout occured, but no data available. */ + return -1; +} + + +static int +pull_all(FILE *fp, struct mg_connection *conn, char *buf, int len) +{ + int n, nread = 0; + double timeout = -1.0; + + if (conn->ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + while (len > 0 && conn->ctx->stop_flag == 0) { + n = pull(fp, conn, buf + nread, len, timeout); + if (n < 0) { + if (nread == 0) { + nread = n; /* Propagate the error */ + } + break; + } else if (n == 0) { + break; /* No more data to read */ + } else { + conn->consumed_content += n; + nread += n; + len -= n; + } + } + + return nread; +} + + +static void +discard_unread_request_data(struct mg_connection *conn) +{ + char buf[MG_BUF_LEN]; + size_t to_read; + int nread; + + if (conn == NULL) { + return; + } + + to_read = sizeof(buf); + + if (conn->is_chunked) { + /* Chunked encoding: 1=chunk not read completely, 2=chunk read + * completely */ + while (conn->is_chunked == 1) { + nread = mg_read(conn, buf, to_read); + if (nread <= 0) { + break; + } + } + + } else { + /* Not chunked: content length is known */ + while (conn->consumed_content < conn->content_len) { + if (to_read + > (size_t)(conn->content_len - conn->consumed_content)) { + to_read = (size_t)(conn->content_len - conn->consumed_content); + } + + nread = mg_read(conn, buf, to_read); + if (nread <= 0) { + break; + } + } + } +} + + +static int +mg_read_inner(struct mg_connection *conn, void *buf, size_t len) +{ + int64_t n, buffered_len, nread; + int64_t len64 = + (int64_t)(len > INT_MAX ? INT_MAX : len); /* since the return value is + * int, we may not read more + * bytes */ + const char *body; + + if (conn == NULL) { + return 0; + } + + /* If Content-Length is not set for a PUT or POST request, read until + * socket is closed */ + if (conn->consumed_content == 0 && conn->content_len == -1) { + conn->content_len = INT64_MAX; + conn->must_close = 1; + } + + nread = 0; + if (conn->consumed_content < conn->content_len) { + /* Adjust number of bytes to read. */ + int64_t left_to_read = conn->content_len - conn->consumed_content; + if (left_to_read < len64) { + /* Do not read more than the total content length of the request. + */ + len64 = left_to_read; + } + + /* Return buffered data */ + buffered_len = (int64_t)(conn->data_len) - (int64_t)conn->request_len + - conn->consumed_content; + if (buffered_len > 0) { + if (len64 < buffered_len) { + buffered_len = len64; + } + body = conn->buf + conn->request_len + conn->consumed_content; + memcpy(buf, body, (size_t)buffered_len); + len64 -= buffered_len; + conn->consumed_content += buffered_len; + nread += buffered_len; + buf = (char *)buf + buffered_len; + } + + /* We have returned all buffered data. Read new data from the remote + * socket. + */ + if ((n = pull_all(NULL, conn, (char *)buf, (int)len64)) >= 0) { + nread += n; + } else { + nread = (nread > 0 ? nread : n); + } + } + return (int)nread; +} + + +static char +mg_getc(struct mg_connection *conn) +{ + char c; + if (conn == NULL) { + return 0; + } + conn->content_len++; + if (mg_read_inner(conn, &c, 1) <= 0) { + return (char)0; + } + return c; +} + + +int +mg_read(struct mg_connection *conn, void *buf, size_t len) +{ + if (len > INT_MAX) { + len = INT_MAX; + } + + if (conn == NULL) { + return 0; + } + + if (conn->is_chunked) { + size_t all_read = 0; + + while (len > 0) { + + if (conn->is_chunked == 2) { + /* No more data left to read */ + return 0; + } + + if (conn->chunk_remainder) { + /* copy from the remainder of the last received chunk */ + long read_ret; + size_t read_now = + ((conn->chunk_remainder > len) ? (len) + : (conn->chunk_remainder)); + + conn->content_len += (int)read_now; + read_ret = + mg_read_inner(conn, (char *)buf + all_read, read_now); + all_read += (size_t)read_ret; + + conn->chunk_remainder -= read_now; + len -= read_now; + + if (conn->chunk_remainder == 0) { + /* the rest of the data in the current chunk has been read + */ + if ((mg_getc(conn) != '\r') || (mg_getc(conn) != '\n')) { + /* Protocol violation */ + return -1; + } + } + + } else { + /* fetch a new chunk */ + int i = 0; + char lenbuf[64]; + char *end = 0; + unsigned long chunkSize = 0; + + for (i = 0; i < ((int)sizeof(lenbuf) - 1); i++) { + lenbuf[i] = mg_getc(conn); + if (i > 0 && lenbuf[i] == '\r' && lenbuf[i - 1] != '\r') { + continue; + } + if (i > 1 && lenbuf[i] == '\n' && lenbuf[i - 1] == '\r') { + lenbuf[i + 1] = 0; + chunkSize = strtoul(lenbuf, &end, 16); + if (chunkSize == 0) { + /* regular end of content */ + conn->is_chunked = 2; + } + break; + } + if (!isalnum(lenbuf[i])) { + /* illegal character for chunk length */ + return -1; + } + } + if ((end == NULL) || (*end != '\r')) { + /* chunksize not set correctly */ + return -1; + } + if (chunkSize == 0) { + break; + } + + conn->chunk_remainder = chunkSize; + } + } + + return (int)all_read; + } + return mg_read_inner(conn, buf, len); +} + + +int +mg_write(struct mg_connection *conn, const void *buf, size_t len) +{ + time_t now; + int64_t n, total, allowed; + + if (conn == NULL) { + return 0; + } + + if (conn->throttle > 0) { + if ((now = time(NULL)) != conn->last_throttle_time) { + conn->last_throttle_time = now; + conn->last_throttle_bytes = 0; + } + allowed = conn->throttle - conn->last_throttle_bytes; + if (allowed > (int64_t)len) { + allowed = (int64_t)len; + } + if ((total = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)allowed)) == allowed) { + buf = (const char *)buf + total; + conn->last_throttle_bytes += total; + while (total < (int64_t)len && conn->ctx->stop_flag == 0) { + allowed = conn->throttle > (int64_t)len - total + ? (int64_t)len - total + : conn->throttle; + if ((n = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)allowed)) != allowed) { + break; + } + sleep(1); + conn->last_throttle_bytes = allowed; + conn->last_throttle_time = time(NULL); + buf = (const char *)buf + n; + total += n; + } + } + } else { + total = push_all(conn->ctx, + NULL, + conn->client.sock, + conn->ssl, + (const char *)buf, + (int64_t)len); + } + return (int)total; +} + + +/* Alternative alloc_vprintf() for non-compliant C runtimes */ +static int +alloc_vprintf2(char **buf, const char *fmt, va_list ap) +{ + va_list ap_copy; + size_t size = MG_BUF_LEN / 4; + int len = -1; + + *buf = NULL; + while (len < 0) { + if (*buf) { + mg_free(*buf); + } + + size *= 4; + *buf = (char *)mg_malloc(size); + if (!*buf) { + break; + } + + va_copy(ap_copy, ap); + len = vsnprintf_impl(*buf, size - 1, fmt, ap_copy); + va_end(ap_copy); + (*buf)[size - 1] = 0; + } + + return len; +} + + +/* Print message to buffer. If buffer is large enough to hold the message, + * return buffer. If buffer is to small, allocate large enough buffer on heap, + * and return allocated buffer. */ +static int +alloc_vprintf(char **out_buf, + char *prealloc_buf, + size_t prealloc_size, + const char *fmt, + va_list ap) +{ + va_list ap_copy; + int len; + + /* Windows is not standard-compliant, and vsnprintf() returns -1 if + * buffer is too small. Also, older versions of msvcrt.dll do not have + * _vscprintf(). However, if size is 0, vsnprintf() behaves correctly. + * Therefore, we make two passes: on first pass, get required message + * length. + * On second pass, actually print the message. */ + va_copy(ap_copy, ap); + len = vsnprintf_impl(NULL, 0, fmt, ap_copy); + va_end(ap_copy); + + if (len < 0) { + /* C runtime is not standard compliant, vsnprintf() returned -1. + * Switch to alternative code path that uses incremental allocations. + */ + va_copy(ap_copy, ap); + len = alloc_vprintf2(out_buf, fmt, ap); + va_end(ap_copy); + + } else if ((size_t)(len) >= prealloc_size) { + /* The pre-allocated buffer not large enough. */ + /* Allocate a new buffer. */ + *out_buf = (char *)mg_malloc((size_t)(len) + 1); + if (!*out_buf) { + /* Allocation failed. Return -1 as "out of memory" error. */ + return -1; + } + /* Buffer allocation successful. Store the string there. */ + va_copy(ap_copy, ap); + IGNORE_UNUSED_RESULT( + vsnprintf_impl(*out_buf, (size_t)(len) + 1, fmt, ap_copy)); + va_end(ap_copy); + + } else { + /* The pre-allocated buffer is large enough. + * Use it to store the string and return the address. */ + va_copy(ap_copy, ap); + IGNORE_UNUSED_RESULT( + vsnprintf_impl(prealloc_buf, prealloc_size, fmt, ap_copy)); + va_end(ap_copy); + *out_buf = prealloc_buf; + } + + return len; +} + + +static int +mg_vprintf(struct mg_connection *conn, const char *fmt, va_list ap) +{ + char mem[MG_BUF_LEN]; + char *buf = NULL; + int len; + + if ((len = alloc_vprintf(&buf, mem, sizeof(mem), fmt, ap)) > 0) { + len = mg_write(conn, buf, (size_t)len); + } + if (buf != mem && buf != NULL) { + mg_free(buf); + } + + return len; +} + + +int +mg_printf(struct mg_connection *conn, const char *fmt, ...) +{ + va_list ap; + int result; + + va_start(ap, fmt); + result = mg_vprintf(conn, fmt, ap); + va_end(ap); + + return result; +} + + +int +mg_url_decode(const char *src, + int src_len, + char *dst, + int dst_len, + int is_form_url_encoded) +{ + int i, j, a, b; +#define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W') + + for (i = j = 0; i < src_len && j < dst_len - 1; i++, j++) { + if (i < src_len - 2 && src[i] == '%' + && isxdigit(*(const unsigned char *)(src + i + 1)) + && isxdigit(*(const unsigned char *)(src + i + 2))) { + a = tolower(*(const unsigned char *)(src + i + 1)); + b = tolower(*(const unsigned char *)(src + i + 2)); + dst[j] = (char)((HEXTOI(a) << 4) | HEXTOI(b)); + i += 2; + } else if (is_form_url_encoded && src[i] == '+') { + dst[j] = ' '; + } else { + dst[j] = src[i]; + } + } + + dst[j] = '\0'; /* Null-terminate the destination */ + + return i >= src_len ? j : -1; +} + + +int +mg_get_var(const char *data, + size_t data_len, + const char *name, + char *dst, + size_t dst_len) +{ + return mg_get_var2(data, data_len, name, dst, dst_len, 0); +} + + +int +mg_get_var2(const char *data, + size_t data_len, + const char *name, + char *dst, + size_t dst_len, + size_t occurrence) +{ + const char *p, *e, *s; + size_t name_len; + int len; + + if (dst == NULL || dst_len == 0) { + len = -2; + } else if (data == NULL || name == NULL || data_len == 0) { + len = -1; + dst[0] = '\0'; + } else { + name_len = strlen(name); + e = data + data_len; + len = -1; + dst[0] = '\0'; + + /* data is "var1=val1&var2=val2...". Find variable first */ + for (p = data; p + name_len < e; p++) { + if ((p == data || p[-1] == '&') && p[name_len] == '=' + && !mg_strncasecmp(name, p, name_len) && 0 == occurrence--) { + /* Point p to variable value */ + p += name_len + 1; + + /* Point s to the end of the value */ + s = (const char *)memchr(p, '&', (size_t)(e - p)); + if (s == NULL) { + s = e; + } + /* assert(s >= p); */ + if (s < p) { + return -3; + } + + /* Decode variable into destination buffer */ + len = mg_url_decode(p, (int)(s - p), dst, (int)dst_len, 1); + + /* Redirect error code from -1 to -2 (destination buffer too + * small). */ + if (len == -1) { + len = -2; + } + break; + } + } + } + + return len; +} + + +int +mg_get_cookie(const char *cookie_header, + const char *var_name, + char *dst, + size_t dst_size) +{ + const char *s, *p, *end; + int name_len, len = -1; + + if (dst == NULL || dst_size == 0) { + len = -2; + } else if (var_name == NULL || (s = cookie_header) == NULL) { + len = -1; + dst[0] = '\0'; + } else { + name_len = (int)strlen(var_name); + end = s + strlen(s); + dst[0] = '\0'; + + for (; (s = mg_strcasestr(s, var_name)) != NULL; s += name_len) { + if (s[name_len] == '=') { + s += name_len + 1; + if ((p = strchr(s, ' ')) == NULL) { + p = end; + } + if (p[-1] == ';') { + p--; + } + if (*s == '"' && p[-1] == '"' && p > s + 1) { + s++; + p--; + } + if ((size_t)(p - s) < dst_size) { + len = (int)(p - s); + mg_strlcpy(dst, s, (size_t)len + 1); + } else { + len = -3; + } + break; + } + } + } + return len; +} + + +#if defined(USE_WEBSOCKET) || defined(USE_LUA) +static void +base64_encode(const unsigned char *src, int src_len, char *dst) +{ + static const char *b64 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + int i, j, a, b, c; + + for (i = j = 0; i < src_len; i += 3) { + a = src[i]; + b = i + 1 >= src_len ? 0 : src[i + 1]; + c = i + 2 >= src_len ? 0 : src[i + 2]; + + dst[j++] = b64[a >> 2]; + dst[j++] = b64[((a & 3) << 4) | (b >> 4)]; + if (i + 1 < src_len) { + dst[j++] = b64[(b & 15) << 2 | (c >> 6)]; + } + if (i + 2 < src_len) { + dst[j++] = b64[c & 63]; + } + } + while (j % 4 != 0) { + dst[j++] = '='; + } + dst[j++] = '\0'; +} +#endif + + +#if defined(USE_LUA) +static unsigned char +b64reverse(char letter) +{ + if (letter >= 'A' && letter <= 'Z') { + return letter - 'A'; + } + if (letter >= 'a' && letter <= 'z') { + return letter - 'a' + 26; + } + if (letter >= '0' && letter <= '9') { + return letter - '0' + 52; + } + if (letter == '+') { + return 62; + } + if (letter == '/') { + return 63; + } + if (letter == '=') { + return 255; /* normal end */ + } + return 254; /* error */ +} + + +static int +base64_decode(const unsigned char *src, int src_len, char *dst, size_t *dst_len) +{ + int i; + unsigned char a, b, c, d; + + *dst_len = 0; + + for (i = 0; i < src_len; i += 4) { + a = b64reverse(src[i]); + if (a >= 254) { + return i; + } + + b = b64reverse(i + 1 >= src_len ? 0 : src[i + 1]); + if (b >= 254) { + return i + 1; + } + + c = b64reverse(i + 2 >= src_len ? 0 : src[i + 2]); + if (c == 254) { + return i + 2; + } + + d = b64reverse(i + 3 >= src_len ? 0 : src[i + 3]); + if (d == 254) { + return i + 3; + } + + dst[(*dst_len)++] = (a << 2) + (b >> 4); + if (c != 255) { + dst[(*dst_len)++] = (b << 4) + (c >> 2); + if (d != 255) { + dst[(*dst_len)++] = (c << 6) + d; + } + } + } + return -1; +} +#endif + + +static int +is_put_or_delete_method(const struct mg_connection *conn) +{ + if (conn) { + const char *s = conn->request_info.request_method; + return s != NULL && (!strcmp(s, "PUT") || !strcmp(s, "DELETE") + || !strcmp(s, "MKCOL") || !strcmp(s, "PATCH")); + } + return 0; +} + + +static void +interpret_uri(struct mg_connection *conn, /* in: request (must be valid) */ + char *filename, /* out: filename */ + size_t filename_buf_len, /* in: size of filename buffer */ + struct file *filep, /* out: file structure */ + int *is_found, /* out: file is found (directly) */ + int *is_script_resource, /* out: handled by a script? */ + int *is_websocket_request, /* out: websocket connetion? */ + int *is_put_or_delete_request /* out: put/delete a file? */ + ) +{ +/* TODO (high): Restructure this function */ + +#if !defined(NO_FILES) + const char *uri = conn->request_info.local_uri; + const char *root = conn->ctx->config[DOCUMENT_ROOT]; + const char *rewrite; + struct vec a, b; + int match_len; + char gz_path[PATH_MAX]; + char const *accept_encoding; + int truncated; +#if !defined(NO_CGI) || defined(USE_LUA) + char *p; +#endif +#else + (void)filename_buf_len; /* unused if NO_FILES is defined */ +#endif + + memset(filep, 0, sizeof(*filep)); + *filename = 0; + *is_found = 0; + *is_script_resource = 0; + *is_put_or_delete_request = is_put_or_delete_method(conn); + +#if defined(USE_WEBSOCKET) + *is_websocket_request = is_websocket_protocol(conn); +#if !defined(NO_FILES) + if (*is_websocket_request && conn->ctx->config[WEBSOCKET_ROOT]) { + root = conn->ctx->config[WEBSOCKET_ROOT]; + } +#endif /* !NO_FILES */ +#else /* USE_WEBSOCKET */ + *is_websocket_request = 0; +#endif /* USE_WEBSOCKET */ + +#if !defined(NO_FILES) + /* Note that root == NULL is a regular use case here. This occurs, + * if all requests are handled by callbacks, so the WEBSOCKET_ROOT + * config is not required. */ + if (root == NULL) { + /* all file related outputs have already been set to 0, just return + */ + return; + } + + /* Using buf_len - 1 because memmove() for PATH_INFO may shift part + * of the path one byte on the right. + * If document_root is NULL, leave the file empty. */ + mg_snprintf( + conn, &truncated, filename, filename_buf_len - 1, "%s%s", root, uri); + + if (truncated) { + goto interpret_cleanup; + } + + rewrite = conn->ctx->config[REWRITE]; + while ((rewrite = next_option(rewrite, &a, &b)) != NULL) { + if ((match_len = match_prefix(a.ptr, a.len, uri)) > 0) { + mg_snprintf(conn, + &truncated, + filename, + filename_buf_len - 1, + "%.*s%s", + (int)b.len, + b.ptr, + uri + match_len); + break; + } + } + + if (truncated) { + goto interpret_cleanup; + } + + /* Local file path and name, corresponding to requested URI + * is now stored in "filename" variable. */ + if (mg_stat(conn, filename, filep)) { +#if !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) + /* File exists. Check if it is a script type. */ + if (0 +#if !defined(NO_CGI) + || match_prefix(conn->ctx->config[CGI_EXTENSIONS], + strlen(conn->ctx->config[CGI_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_LUA) + || match_prefix(conn->ctx->config[LUA_SCRIPT_EXTENSIONS], + strlen(conn->ctx->config[LUA_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_DUKTAPE) + || match_prefix(conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS], + strlen( + conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif + ) { + /* The request addresses a CGI script or a Lua script. The URI + * corresponds to the script itself (like /path/script.cgi), + * and there is no additional resource path + * (like /path/script.cgi/something). + * Requests that modify (replace or delete) a resource, like + * PUT and DELETE requests, should replace/delete the script + * file. + * Requests that read or write from/to a resource, like GET and + * POST requests, should call the script and return the + * generated response. */ + *is_script_resource = !*is_put_or_delete_request; + } +#endif /* !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) */ + *is_found = 1; + return; + } + + /* If we can't find the actual file, look for the file + * with the same name but a .gz extension. If we find it, + * use that and set the gzipped flag in the file struct + * to indicate that the response need to have the content- + * encoding: gzip header. + * We can only do this if the browser declares support. */ + if ((accept_encoding = mg_get_header(conn, "Accept-Encoding")) != NULL) { + if (strstr(accept_encoding, "gzip") != NULL) { + mg_snprintf( + conn, &truncated, gz_path, sizeof(gz_path), "%s.gz", filename); + + if (truncated) { + goto interpret_cleanup; + } + + if (mg_stat(conn, gz_path, filep)) { + if (filep) { + filep->gzipped = 1; + *is_found = 1; + } + /* Currently gz files can not be scripts. */ + return; + } + } + } + +#if !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) + /* Support PATH_INFO for CGI scripts. */ + for (p = filename + strlen(filename); p > filename + 1; p--) { + if (*p == '/') { + *p = '\0'; + if ((0 +#if !defined(NO_CGI) + || match_prefix(conn->ctx->config[CGI_EXTENSIONS], + strlen(conn->ctx->config[CGI_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_LUA) + || match_prefix(conn->ctx->config[LUA_SCRIPT_EXTENSIONS], + strlen( + conn->ctx->config[LUA_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif +#if defined(USE_DUKTAPE) + || match_prefix( + conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS], + strlen(conn->ctx->config[DUKTAPE_SCRIPT_EXTENSIONS]), + filename) > 0 +#endif + ) && mg_stat(conn, filename, filep)) { + /* Shift PATH_INFO block one character right, e.g. + * "/x.cgi/foo/bar\x00" => "/x.cgi\x00/foo/bar\x00" + * conn->path_info is pointing to the local variable "path" + * declared in handle_request(), so PATH_INFO is not valid + * after handle_request returns. */ + conn->path_info = p + 1; + memmove(p + 2, p + 1, strlen(p + 1) + 1); /* +1 is for + * trailing \0 */ + p[1] = '/'; + *is_script_resource = 1; + break; + } else { + *p = '/'; + } + } + } +#endif /* !defined(NO_CGI) || defined(USE_LUA) || defined(USE_DUKTAPE) */ +#endif /* !defined(NO_FILES) */ + return; + +#if !defined(NO_FILES) +/* Reset all outputs */ +interpret_cleanup: + memset(filep, 0, sizeof(*filep)); + *filename = 0; + *is_found = 0; + *is_script_resource = 0; + *is_websocket_request = 0; + *is_put_or_delete_request = 0; +#endif /* !defined(NO_FILES) */ +} + + +/* Check whether full request is buffered. Return: + * -1 if request is malformed + * 0 if request is not yet fully buffered + * >0 actual request length, including last \r\n\r\n */ +static int +get_request_len(const char *buf, int buflen) +{ + const char *s, *e; + int len = 0; + + for (s = buf, e = s + buflen - 1; len <= 0 && s < e; s++) + /* Control characters are not allowed but >=128 is. */ + if (!isprint(*(const unsigned char *)s) && *s != '\r' && *s != '\n' + && *(const unsigned char *)s < 128) { + len = -1; + break; /* [i_a] abort scan as soon as one malformed character is + * found; */ + /* don't let subsequent \r\n\r\n win us over anyhow */ + } else if (s[0] == '\n' && s[1] == '\n') { + len = (int)(s - buf) + 2; + } else if (s[0] == '\n' && &s[1] < e && s[1] == '\r' && s[2] == '\n') { + len = (int)(s - buf) + 3; + } + + return len; +} + + +#if !defined(NO_CACHING) +/* Convert month to the month number. Return -1 on error, or month number */ +static int +get_month_index(const char *s) +{ + size_t i; + + for (i = 0; i < ARRAY_SIZE(month_names); i++) { + if (!strcmp(s, month_names[i])) { + return (int)i; + } + } + + return -1; +} + + +/* Parse UTC date-time string, and return the corresponding time_t value. */ +static time_t +parse_date_string(const char *datetime) +{ + char month_str[32] = {0}; + int second, minute, hour, day, month, year; + time_t result = (time_t)0; + struct tm tm; + + if ((sscanf(datetime, + "%d/%3s/%d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) || (sscanf(datetime, + "%d %3s %d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) + || (sscanf(datetime, + "%*3s, %d %3s %d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6) || (sscanf(datetime, + "%d-%3s-%d %d:%d:%d", + &day, + month_str, + &year, + &hour, + &minute, + &second) == 6)) { + month = get_month_index(month_str); + if ((month >= 0) && (year >= 1970)) { + memset(&tm, 0, sizeof(tm)); + tm.tm_year = year - 1900; + tm.tm_mon = month; + tm.tm_mday = day; + tm.tm_hour = hour; + tm.tm_min = minute; + tm.tm_sec = second; + result = timegm(&tm); + } + } + + return result; +} +#endif /* !NO_CACHING */ + + +/* Protect against directory disclosure attack by removing '..', + * excessive '/' and '\' characters */ +static void +remove_double_dots_and_double_slashes(char *s) +{ + char *p = s; + + while (*s != '\0') { + *p++ = *s++; + if (s[-1] == '/' || s[-1] == '\\') { + /* Skip all following slashes, backslashes and double-dots */ + while (s[0] != '\0') { + if (s[0] == '/' || s[0] == '\\') { + s++; + } else if (s[0] == '.' && s[1] == '.') { + s += 2; + } else { + break; + } + } + } + } + *p = '\0'; +} + + +static const struct { + const char *extension; + size_t ext_len; + const char *mime_type; +} builtin_mime_types[] = { + /* IANA registered MIME types (http://www.iana.org/assignments/media-types) + * application types */ + {".doc", 4, "application/msword"}, + {".eps", 4, "application/postscript"}, + {".exe", 4, "application/octet-stream"}, + {".js", 3, "application/javascript"}, + {".json", 5, "application/json"}, + {".pdf", 4, "application/pdf"}, + {".ps", 3, "application/postscript"}, + {".rtf", 4, "application/rtf"}, + {".xhtml", 6, "application/xhtml+xml"}, + {".xsl", 4, "application/xml"}, + {".xslt", 5, "application/xml"}, + + /* fonts */ + {".ttf", 4, "application/font-sfnt"}, + {".cff", 4, "application/font-sfnt"}, + {".otf", 4, "application/font-sfnt"}, + {".aat", 4, "application/font-sfnt"}, + {".sil", 4, "application/font-sfnt"}, + {".pfr", 4, "application/font-tdpfr"}, + {".woff", 5, "application/font-woff"}, + + /* audio */ + {".mp3", 4, "audio/mpeg"}, + {".oga", 4, "audio/ogg"}, + {".ogg", 4, "audio/ogg"}, + + /* image */ + {".gif", 4, "image/gif"}, + {".ief", 4, "image/ief"}, + {".jpeg", 5, "image/jpeg"}, + {".jpg", 4, "image/jpeg"}, + {".jpm", 4, "image/jpm"}, + {".jpx", 4, "image/jpx"}, + {".png", 4, "image/png"}, + {".svg", 4, "image/svg+xml"}, + {".tif", 4, "image/tiff"}, + {".tiff", 5, "image/tiff"}, + + /* model */ + {".wrl", 4, "model/vrml"}, + + /* text */ + {".css", 4, "text/css"}, + {".csv", 4, "text/csv"}, + {".htm", 4, "text/html"}, + {".html", 5, "text/html"}, + {".sgm", 4, "text/sgml"}, + {".shtm", 5, "text/html"}, + {".shtml", 6, "text/html"}, + {".txt", 4, "text/plain"}, + {".xml", 4, "text/xml"}, + + /* video */ + {".mov", 4, "video/quicktime"}, + {".mp4", 4, "video/mp4"}, + {".mpeg", 5, "video/mpeg"}, + {".mpg", 4, "video/mpeg"}, + {".ogv", 4, "video/ogg"}, + {".qt", 3, "video/quicktime"}, + + /* not registered types + * (http://reference.sitepoint.com/html/mime-types-full, + * http://www.hansenb.pdx.edu/DMKB/dict/tutorials/mime_typ.php, ..) */ + {".arj", 4, "application/x-arj-compressed"}, + {".gz", 3, "application/x-gunzip"}, + {".rar", 4, "application/x-arj-compressed"}, + {".swf", 4, "application/x-shockwave-flash"}, + {".tar", 4, "application/x-tar"}, + {".tgz", 4, "application/x-tar-gz"}, + {".torrent", 8, "application/x-bittorrent"}, + {".ppt", 4, "application/x-mspowerpoint"}, + {".xls", 4, "application/x-msexcel"}, + {".zip", 4, "application/x-zip-compressed"}, + {".aac", + 4, + "audio/aac"}, /* http://en.wikipedia.org/wiki/Advanced_Audio_Coding */ + {".aif", 4, "audio/x-aif"}, + {".m3u", 4, "audio/x-mpegurl"}, + {".mid", 4, "audio/x-midi"}, + {".ra", 3, "audio/x-pn-realaudio"}, + {".ram", 4, "audio/x-pn-realaudio"}, + {".wav", 4, "audio/x-wav"}, + {".bmp", 4, "image/bmp"}, + {".ico", 4, "image/x-icon"}, + {".pct", 4, "image/x-pct"}, + {".pict", 5, "image/pict"}, + {".rgb", 4, "image/x-rgb"}, + {".webm", 5, "video/webm"}, /* http://en.wikipedia.org/wiki/WebM */ + {".asf", 4, "video/x-ms-asf"}, + {".avi", 4, "video/x-msvideo"}, + {".m4v", 4, "video/x-m4v"}, + {NULL, 0, NULL}}; + + +const char * +mg_get_builtin_mime_type(const char *path) +{ + const char *ext; + size_t i, path_len; + + path_len = strlen(path); + + for (i = 0; builtin_mime_types[i].extension != NULL; i++) { + ext = path + (path_len - builtin_mime_types[i].ext_len); + if (path_len > builtin_mime_types[i].ext_len + && mg_strcasecmp(ext, builtin_mime_types[i].extension) == 0) { + return builtin_mime_types[i].mime_type; + } + } + + return "text/plain"; +} + + +/* Look at the "path" extension and figure what mime type it has. + * Store mime type in the vector. */ +static void +get_mime_type(struct mg_context *ctx, const char *path, struct vec *vec) +{ + struct vec ext_vec, mime_vec; + const char *list, *ext; + size_t path_len; + + path_len = strlen(path); + + if (ctx == NULL || vec == NULL) { + return; + } + + /* Scan user-defined mime types first, in case user wants to + * override default mime types. */ + list = ctx->config[EXTRA_MIME_TYPES]; + while ((list = next_option(list, &ext_vec, &mime_vec)) != NULL) { + /* ext now points to the path suffix */ + ext = path + path_len - ext_vec.len; + if (mg_strncasecmp(ext, ext_vec.ptr, ext_vec.len) == 0) { + *vec = mime_vec; + return; + } + } + + vec->ptr = mg_get_builtin_mime_type(path); + vec->len = strlen(vec->ptr); +} + + +/* Stringify binary data. Output buffer must be twice as big as input, + * because each byte takes 2 bytes in string representation */ +static void +bin2str(char *to, const unsigned char *p, size_t len) +{ + static const char *hex = "0123456789abcdef"; + + for (; len--; p++) { + *to++ = hex[p[0] >> 4]; + *to++ = hex[p[0] & 0x0f]; + } + *to = '\0'; +} + + +/* Return stringified MD5 hash for list of strings. Buffer must be 33 bytes. */ +char * +mg_md5(char buf[33], ...) +{ + md5_byte_t hash[16]; + const char *p; + va_list ap; + md5_state_t ctx; + + md5_init(&ctx); + + va_start(ap, buf); + while ((p = va_arg(ap, const char *)) != NULL) { + md5_append(&ctx, (const md5_byte_t *)p, strlen(p)); + } + va_end(ap); + + md5_finish(&ctx, hash); + bin2str(buf, hash, sizeof(hash)); + return buf; +} + + +/* Check the user's password, return 1 if OK */ +static int +check_password(const char *method, + const char *ha1, + const char *uri, + const char *nonce, + const char *nc, + const char *cnonce, + const char *qop, + const char *response) +{ + char ha2[32 + 1], expected_response[32 + 1]; + + /* Some of the parameters may be NULL */ + if (method == NULL || nonce == NULL || nc == NULL || cnonce == NULL + || qop == NULL + || response == NULL) { + return 0; + } + + /* NOTE(lsm): due to a bug in MSIE, we do not compare the URI */ + if (strlen(response) != 32) { + return 0; + } + + mg_md5(ha2, method, ":", uri, NULL); + mg_md5(expected_response, + ha1, + ":", + nonce, + ":", + nc, + ":", + cnonce, + ":", + qop, + ":", + ha2, + NULL); + + return mg_strcasecmp(response, expected_response) == 0; +} + + +/* Use the global passwords file, if specified by auth_gpass option, + * or search for .htpasswd in the requested directory. */ +static void +open_auth_file(struct mg_connection *conn, const char *path, struct file *filep) +{ + if (conn != NULL && conn->ctx != NULL) { + char name[PATH_MAX]; + const char *p, *e, *gpass = conn->ctx->config[GLOBAL_PASSWORDS_FILE]; + struct file file = STRUCT_FILE_INITIALIZER; + int truncated; + + if (gpass != NULL) { + /* Use global passwords file */ + if (!mg_fopen(conn, gpass, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", gpass, strerror(ERRNO)); +#endif + } + /* Important: using local struct file to test path for is_directory + * flag. If filep is used, mg_stat() makes it appear as if auth file + * was opened. */ + } else if (mg_stat(conn, path, &file) && file.is_directory) { + mg_snprintf(conn, + &truncated, + name, + sizeof(name), + "%s/%s", + path, + PASSWORDS_FILE_NAME); + + if (truncated || !mg_fopen(conn, name, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", name, strerror(ERRNO)); +#endif + } + } else { + /* Try to find .htpasswd in requested directory. */ + for (p = path, e = p + strlen(p) - 1; e > p; e--) { + if (e[0] == '/') { + break; + } + } + mg_snprintf(conn, + &truncated, + name, + sizeof(name), + "%.*s/%s", + (int)(e - p), + p, + PASSWORDS_FILE_NAME); + + if (truncated || !mg_fopen(conn, name, "r", filep)) { +#ifdef DEBUG + mg_cry(conn, "fopen(%s): %s", name, strerror(ERRNO)); +#endif + } + } + } +} + + +/* Parsed Authorization header */ +struct ah { + char *user, *uri, *cnonce, *response, *qop, *nc, *nonce; +}; + + +/* Return 1 on success. Always initializes the ah structure. */ +static int +parse_auth_header(struct mg_connection *conn, + char *buf, + size_t buf_size, + struct ah *ah) +{ + char *name, *value, *s; + const char *auth_header; + uint64_t nonce; + + if (!ah || !conn) { + return 0; + } + + (void)memset(ah, 0, sizeof(*ah)); + if ((auth_header = mg_get_header(conn, "Authorization")) == NULL + || mg_strncasecmp(auth_header, "Digest ", 7) != 0) { + return 0; + } + + /* Make modifiable copy of the auth header */ + (void)mg_strlcpy(buf, auth_header + 7, buf_size); + s = buf; + + /* Parse authorization header */ + for (;;) { + /* Gobble initial spaces */ + while (isspace(*(unsigned char *)s)) { + s++; + } + name = skip_quoted(&s, "=", " ", 0); + /* Value is either quote-delimited, or ends at first comma or space. */ + if (s[0] == '\"') { + s++; + value = skip_quoted(&s, "\"", " ", '\\'); + if (s[0] == ',') { + s++; + } + } else { + value = skip_quoted(&s, ", ", " ", 0); /* IE uses commas, FF uses + * spaces */ + } + if (*name == '\0') { + break; + } + + if (!strcmp(name, "username")) { + ah->user = value; + } else if (!strcmp(name, "cnonce")) { + ah->cnonce = value; + } else if (!strcmp(name, "response")) { + ah->response = value; + } else if (!strcmp(name, "uri")) { + ah->uri = value; + } else if (!strcmp(name, "qop")) { + ah->qop = value; + } else if (!strcmp(name, "nc")) { + ah->nc = value; + } else if (!strcmp(name, "nonce")) { + ah->nonce = value; + } + } + +#ifndef NO_NONCE_CHECK + /* Read the nonce from the response. */ + if (ah->nonce == NULL) { + return 0; + } + s = NULL; + nonce = strtoull(ah->nonce, &s, 10); + if ((s == NULL) || (*s != 0)) { + return 0; + } + + /* Convert the nonce from the client to a number. */ + nonce ^= conn->ctx->auth_nonce_mask; + + /* The converted number corresponds to the time the nounce has been + * created. This should not be earlier than the server start. */ + /* Server side nonce check is valuable in all situations but one: + * if the server restarts frequently, but the client should not see + * that, so the server should accept nonces from previous starts. */ + /* However, the reasonable default is to not accept a nonce from a + * previous start, so if anyone changed the access rights between + * two restarts, a new login is required. */ + if (nonce < (uint64_t)conn->ctx->start_time) { + /* nonce is from a previous start of the server and no longer valid + * (replay attack?) */ + return 0; + } + /* Check if the nonce is too high, so it has not (yet) been used by the + * server. */ + if (nonce >= ((uint64_t)conn->ctx->start_time + conn->ctx->nonce_count)) { + return 0; + } +#endif + + /* CGI needs it as REMOTE_USER */ + if (ah->user != NULL) { + conn->request_info.remote_user = mg_strdup(ah->user); + } else { + return 0; + } + + return 1; +} + + +static const char * +mg_fgets(char *buf, size_t size, struct file *filep, char **p) +{ + const char *eof; + size_t len; + const char *memend; + + if (!filep) { + return NULL; + } + + if (filep->membuf != NULL && *p != NULL) { + memend = (const char *)&filep->membuf[filep->size]; + /* Search for \n from p till the end of stream */ + eof = (char *)memchr(*p, '\n', (size_t)(memend - *p)); + if (eof != NULL) { + eof += 1; /* Include \n */ + } else { + eof = memend; /* Copy remaining data */ + } + len = (size_t)(eof - *p) > size - 1 ? size - 1 : (size_t)(eof - *p); + memcpy(buf, *p, len); + buf[len] = '\0'; + *p += len; + return len ? eof : NULL; + } else if (filep->fp != NULL) { + return fgets(buf, (int)size, filep->fp); + } else { + return NULL; + } +} + +struct read_auth_file_struct { + struct mg_connection *conn; + struct ah ah; + char *domain; + char buf[256 + 256 + 40]; + char *f_user; + char *f_domain; + char *f_ha1; +}; + + +static int +read_auth_file(struct file *filep, struct read_auth_file_struct *workdata) +{ + char *p; + int is_authorized = 0; + struct file fp; + size_t l; + + if (!filep || !workdata) { + return 0; + } + + /* Loop over passwords file */ + p = (char *)filep->membuf; + while (mg_fgets(workdata->buf, sizeof(workdata->buf), filep, &p) != NULL) { + l = strlen(workdata->buf); + while (l > 0) { + if (isspace(workdata->buf[l - 1]) + || iscntrl(workdata->buf[l - 1])) { + l--; + workdata->buf[l] = 0; + } else + break; + } + if (l < 1) { + continue; + } + + workdata->f_user = workdata->buf; + + if (workdata->f_user[0] == ':') { + /* user names may not contain a ':' and may not be empty, + * so lines starting with ':' may be used for a special purpose */ + if (workdata->f_user[1] == '#') { + /* :# is a comment */ + continue; + } else if (!strncmp(workdata->f_user + 1, "include=", 8)) { + if (mg_fopen(workdata->conn, workdata->f_user + 9, "r", &fp)) { + is_authorized = read_auth_file(&fp, workdata); + mg_fclose(&fp); + } else { + mg_cry(workdata->conn, + "%s: cannot open authorization file: %s", + __func__, + workdata->buf); + } + continue; + } + /* everything is invalid for the moment (might change in the + * future) */ + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + + workdata->f_domain = strchr(workdata->f_user, ':'); + if (workdata->f_domain == NULL) { + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + *(workdata->f_domain) = 0; + (workdata->f_domain)++; + + workdata->f_ha1 = strchr(workdata->f_domain, ':'); + if (workdata->f_ha1 == NULL) { + mg_cry(workdata->conn, + "%s: syntax error in authorization file: %s", + __func__, + workdata->buf); + continue; + } + *(workdata->f_ha1) = 0; + (workdata->f_ha1)++; + + if (!strcmp(workdata->ah.user, workdata->f_user) + && !strcmp(workdata->domain, workdata->f_domain)) { + return check_password(workdata->conn->request_info.request_method, + workdata->f_ha1, + workdata->ah.uri, + workdata->ah.nonce, + workdata->ah.nc, + workdata->ah.cnonce, + workdata->ah.qop, + workdata->ah.response); + } + } + + return is_authorized; +} + + +/* Authorize against the opened passwords file. Return 1 if authorized. */ +static int +authorize(struct mg_connection *conn, struct file *filep) +{ + struct read_auth_file_struct workdata; + char buf[MG_BUF_LEN]; + + if (!conn || !conn->ctx) { + return 0; + } + + memset(&workdata, 0, sizeof(workdata)); + workdata.conn = conn; + + if (!parse_auth_header(conn, buf, sizeof(buf), &workdata.ah)) { + return 0; + } + workdata.domain = conn->ctx->config[AUTHENTICATION_DOMAIN]; + + return read_auth_file(filep, &workdata); +} + + +/* Return 1 if request is authorised, 0 otherwise. */ +static int +check_authorization(struct mg_connection *conn, const char *path) +{ + char fname[PATH_MAX]; + struct vec uri_vec, filename_vec; + const char *list; + struct file file = STRUCT_FILE_INITIALIZER; + int authorized = 1, truncated; + + if (!conn || !conn->ctx) { + return 0; + } + + list = conn->ctx->config[PROTECT_URI]; + while ((list = next_option(list, &uri_vec, &filename_vec)) != NULL) { + if (!memcmp(conn->request_info.local_uri, uri_vec.ptr, uri_vec.len)) { + mg_snprintf(conn, + &truncated, + fname, + sizeof(fname), + "%.*s", + (int)filename_vec.len, + filename_vec.ptr); + + if (truncated || !mg_fopen(conn, fname, "r", &file)) { + mg_cry(conn, + "%s: cannot open %s: %s", + __func__, + fname, + strerror(errno)); + } + break; + } + } + + if (!is_file_opened(&file)) { + open_auth_file(conn, path, &file); + } + + if (is_file_opened(&file)) { + authorized = authorize(conn, &file); + mg_fclose(&file); + } + + return authorized; +} + + +static void +send_authorization_request(struct mg_connection *conn) +{ + char date[64]; + time_t curtime = time(NULL); + + if (conn && conn->ctx) { + uint64_t nonce = (uint64_t)(conn->ctx->start_time); + + (void)pthread_mutex_lock(&conn->ctx->nonce_mutex); + nonce += conn->ctx->nonce_count; + ++conn->ctx->nonce_count; + (void)pthread_mutex_unlock(&conn->ctx->nonce_mutex); + + nonce ^= conn->ctx->auth_nonce_mask; + conn->status_code = 401; + conn->must_close = 1; + + gmt_time_string(date, sizeof(date), &curtime); + + mg_printf(conn, "HTTP/1.1 401 Unauthorized\r\n"); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Connection: %s\r\n" + "Content-Length: 0\r\n" + "WWW-Authenticate: Digest qop=\"auth\", realm=\"%s\", " + "nonce=\"%" UINT64_FMT "\"\r\n\r\n", + date, + suggest_connection_header(conn), + conn->ctx->config[AUTHENTICATION_DOMAIN], + nonce); + } +} + + +#if !defined(NO_FILES) +static int +is_authorized_for_put(struct mg_connection *conn) +{ + if (conn) { + struct file file = STRUCT_FILE_INITIALIZER; + const char *passfile = conn->ctx->config[PUT_DELETE_PASSWORDS_FILE]; + int ret = 0; + + if (passfile != NULL && mg_fopen(conn, passfile, "r", &file)) { + ret = authorize(conn, &file); + mg_fclose(&file); + } + + return ret; + } + return 0; +} +#endif + + +int +mg_modify_passwords_file(const char *fname, + const char *domain, + const char *user, + const char *pass) +{ + int found, i; + char line[512], u[512] = "", d[512] = "", ha1[33], tmp[PATH_MAX + 8]; + FILE *fp, *fp2; + + found = 0; + fp = fp2 = NULL; + + /* Regard empty password as no password - remove user record. */ + if (pass != NULL && pass[0] == '\0') { + pass = NULL; + } + + /* Other arguments must not be empty */ + if (fname == NULL || domain == NULL || user == NULL) { + return 0; + } + + /* Using the given file format, user name and domain must not contain ':' + */ + if (strchr(user, ':') != NULL) { + return 0; + } + if (strchr(domain, ':') != NULL) { + return 0; + } + + /* Do not allow control characters like newline in user name and domain. + * Do not allow excessively long names either. */ + for (i = 0; i < 255 && user[i] != 0; i++) { + if (iscntrl(user[i])) { + return 0; + } + } + if (user[i]) { + return 0; + } + for (i = 0; i < 255 && domain[i] != 0; i++) { + if (iscntrl(domain[i])) { + return 0; + } + } + if (domain[i]) { + return 0; + } + + /* The maximum length of the path to the password file is limited */ + if ((strlen(fname) + 4) >= PATH_MAX) { + return 0; + } + + /* Create a temporary file name. Length has been checked before. */ + strcpy(tmp, fname); + strcat(tmp, ".tmp"); + + /* Create the file if does not exist */ + /* Use of fopen here is OK, since fname is only ASCII */ + if ((fp = fopen(fname, "a+")) != NULL) { + (void)fclose(fp); + } + + /* Open the given file and temporary file */ + if ((fp = fopen(fname, "r")) == NULL) { + return 0; + } else if ((fp2 = fopen(tmp, "w+")) == NULL) { + fclose(fp); + return 0; + } + + /* Copy the stuff to temporary file */ + while (fgets(line, sizeof(line), fp) != NULL) { + if (sscanf(line, "%255[^:]:%255[^:]:%*s", u, d) != 2) { + continue; + } + u[255] = 0; + d[255] = 0; + + if (!strcmp(u, user) && !strcmp(d, domain)) { + found++; + if (pass != NULL) { + mg_md5(ha1, user, ":", domain, ":", pass, NULL); + fprintf(fp2, "%s:%s:%s\n", user, domain, ha1); + } + } else { + fprintf(fp2, "%s", line); + } + } + + /* If new user, just add it */ + if (!found && pass != NULL) { + mg_md5(ha1, user, ":", domain, ":", pass, NULL); + fprintf(fp2, "%s:%s:%s\n", user, domain, ha1); + } + + /* Close files */ + fclose(fp); + fclose(fp2); + + /* Put the temp file in place of real file */ + IGNORE_UNUSED_RESULT(remove(fname)); + IGNORE_UNUSED_RESULT(rename(tmp, fname)); + + return 1; +} + + +static int +is_valid_port(unsigned long port) +{ + return port < 0xffff; +} + + +static int +mg_inet_pton(int af, const char *src, void *dst, size_t dstlen) +{ + struct addrinfo hints, *res, *ressave; + int func_ret = 0; + int gai_ret; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = af; + + gai_ret = getaddrinfo(src, NULL, &hints, &res); + if (gai_ret != 0) { + /* gai_strerror could be used to convert gai_ret to a string */ + /* POSIX return values: see + * http://pubs.opengroup.org/onlinepubs/9699919799/functions/freeaddrinfo.html + */ + /* Windows return values: see + * https://msdn.microsoft.com/en-us/library/windows/desktop/ms738520%28v=vs.85%29.aspx + */ + return 0; + } + + ressave = res; + + while (res) { + if (dstlen >= res->ai_addrlen) { + memcpy(dst, res->ai_addr, res->ai_addrlen); + func_ret = 1; + } + res = res->ai_next; + } + + freeaddrinfo(ressave); + return func_ret; +} + + +static int +connect_socket(struct mg_context *ctx /* may be NULL */, + const char *host, + int port, + int use_ssl, + char *ebuf, + size_t ebuf_len, + SOCKET *sock /* output: socket, must not be NULL */, + union usa *sa /* output: socket address, must not be NULL */ + ) +{ + int ip_ver = 0; + *sock = INVALID_SOCKET; + memset(sa, 0, sizeof(*sa)); + + if (ebuf_len > 0) { + *ebuf = 0; + } + + if (host == NULL) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "NULL host"); + return 0; + } + + if (port < 0 || !is_valid_port((unsigned)port)) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "invalid port"); + return 0; + } + + if (use_ssl && (SSLv23_client_method == NULL)) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "SSL is not initialized"); + return 0; + } + + if (mg_inet_pton(AF_INET, host, &sa->sin, sizeof(sa->sin))) { + sa->sin.sin_port = htons((uint16_t)port); + ip_ver = 4; +#ifdef USE_IPV6 + } else if (mg_inet_pton(AF_INET6, host, &sa->sin6, sizeof(sa->sin6))) { + sa->sin6.sin6_port = htons((uint16_t)port); + ip_ver = 6; + } else if (host[0] == '[') { + /* While getaddrinfo on Windows will work with [::1], + * getaddrinfo on Linux only works with ::1 (without []). */ + size_t l = strlen(host + 1); + char *h = l > 1 ? mg_strdup(host + 1) : NULL; + if (h) { + h[l - 1] = 0; + if (mg_inet_pton(AF_INET6, h, &sa->sin6, sizeof(sa->sin6))) { + sa->sin6.sin6_port = htons((uint16_t)port); + ip_ver = 6; + } + mg_free(h); + } +#endif + } + + if (ip_ver == 0) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "%s", + "host not found"); + return 0; + } + + if (ip_ver == 4) { + *sock = socket(PF_INET, SOCK_STREAM, 0); + } +#ifdef USE_IPV6 + else if (ip_ver == 6) { + *sock = socket(PF_INET6, SOCK_STREAM, 0); + } +#endif + + if (*sock == INVALID_SOCKET) { + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "socket(): %s", + strerror(ERRNO)); + return 0; + } + + set_close_on_exec(*sock, fc(ctx)); + + if ((ip_ver == 4) + && (connect(*sock, (struct sockaddr *)&sa->sin, sizeof(sa->sin)) + == 0)) { + /* connected with IPv4 */ + return 1; + } + +#ifdef USE_IPV6 + if ((ip_ver == 6) + && (connect(*sock, (struct sockaddr *)&sa->sin6, sizeof(sa->sin6)) + == 0)) { + /* connected with IPv6 */ + return 1; + } +#endif + + /* Not connected */ + mg_snprintf(NULL, + NULL, /* No truncation check for ebuf */ + ebuf, + ebuf_len, + "connect(%s:%d): %s", + host, + port, + strerror(ERRNO)); + closesocket(*sock); + *sock = INVALID_SOCKET; + return 0; +} + + +int +mg_url_encode(const char *src, char *dst, size_t dst_len) +{ + static const char *dont_escape = "._-$,;~()"; + static const char *hex = "0123456789abcdef"; + char *pos = dst; + const char *end = dst + dst_len - 1; + + for (; *src != '\0' && pos < end; src++, pos++) { + if (isalnum(*(const unsigned char *)src) + || strchr(dont_escape, *(const unsigned char *)src) != NULL) { + *pos = *src; + } else if (pos + 2 < end) { + pos[0] = '%'; + pos[1] = hex[(*(const unsigned char *)src) >> 4]; + pos[2] = hex[(*(const unsigned char *)src) & 0xf]; + pos += 2; + } else { + break; + } + } + + *pos = '\0'; + return (*src == '\0') ? (int)(pos - dst) : -1; +} + + +static void +print_dir_entry(struct de *de) +{ + char size[64], mod[64], href[PATH_MAX]; + struct tm *tm; + + if (de->file.is_directory) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%s", + "[DIRECTORY]"); + } else { + /* We use (signed) cast below because MSVC 6 compiler cannot + * convert unsigned __int64 to double. Sigh. */ + if (de->file.size < 1024) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%d", + (int)de->file.size); + } else if (de->file.size < 0x100000) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fk", + (double)de->file.size / 1024.0); + } else if (de->file.size < 0x40000000) { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fM", + (double)de->file.size / 1048576); + } else { + mg_snprintf(de->conn, + NULL, /* Buffer is big enough */ + size, + sizeof(size), + "%.1fG", + (double)de->file.size / 1073741824); + } + } + + /* Note: mg_snprintf will not cause a buffer overflow above. + * So, string truncation checks are not required here. */ + + tm = localtime(&de->file.last_modified); + if (tm != NULL) { + strftime(mod, sizeof(mod), "%d-%b-%Y %H:%M", tm); + } else { + mg_strlcpy(mod, "01-Jan-1970 00:00", sizeof(mod)); + mod[sizeof(mod) - 1] = '\0'; + } + mg_url_encode(de->file_name, href, sizeof(href)); + de->conn->num_bytes_sent += + mg_printf(de->conn, + "%s%s" + " %s  %s\n", + de->conn->request_info.local_uri, + href, + de->file.is_directory ? "/" : "", + de->file_name, + de->file.is_directory ? "/" : "", + mod, + size); +} + + +/* This function is called from send_directory() and used for + * sorting directory entries by size, or name, or modification time. + * On windows, __cdecl specification is needed in case if project is built + * with __stdcall convention. qsort always requires __cdels callback. */ +static int WINCDECL +compare_dir_entries(const void *p1, const void *p2) +{ + if (p1 && p2) { + const struct de *a = (const struct de *)p1, *b = (const struct de *)p2; + const char *query_string = a->conn->request_info.query_string; + int cmp_result = 0; + + if (query_string == NULL) { + query_string = "na"; + } + + if (a->file.is_directory && !b->file.is_directory) { + return -1; /* Always put directories on top */ + } else if (!a->file.is_directory && b->file.is_directory) { + return 1; /* Always put directories on top */ + } else if (*query_string == 'n') { + cmp_result = strcmp(a->file_name, b->file_name); + } else if (*query_string == 's') { + cmp_result = a->file.size == b->file.size + ? 0 + : a->file.size > b->file.size ? 1 : -1; + } else if (*query_string == 'd') { + cmp_result = + (a->file.last_modified == b->file.last_modified) + ? 0 + : ((a->file.last_modified > b->file.last_modified) ? 1 + : -1); + } + + return query_string[1] == 'd' ? -cmp_result : cmp_result; + } + return 0; +} + + +static int +must_hide_file(struct mg_connection *conn, const char *path) +{ + if (conn && conn->ctx) { + const char *pw_pattern = "**" PASSWORDS_FILE_NAME "$"; + const char *pattern = conn->ctx->config[HIDE_FILES]; + return match_prefix(pw_pattern, strlen(pw_pattern), path) > 0 + || (pattern != NULL + && match_prefix(pattern, strlen(pattern), path) > 0); + } + return 0; +} + + +static int +scan_directory(struct mg_connection *conn, + const char *dir, + void *data, + void (*cb)(struct de *, void *)) +{ + char path[PATH_MAX]; + struct dirent *dp; + DIR *dirp; + struct de de; + int truncated; + + if ((dirp = mg_opendir(conn, dir)) == NULL) { + return 0; + } else { + de.conn = conn; + + while ((dp = mg_readdir(dirp)) != NULL) { + /* Do not show current dir and hidden files */ + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") + || must_hide_file(conn, dp->d_name)) { + continue; + } + + mg_snprintf( + conn, &truncated, path, sizeof(path), "%s/%s", dir, dp->d_name); + + /* If we don't memset stat structure to zero, mtime will have + * garbage and strftime() will segfault later on in + * print_dir_entry(). memset is required only if mg_stat() + * fails. For more details, see + * http://code.google.com/p/mongoose/issues/detail?id=79 */ + memset(&de.file, 0, sizeof(de.file)); + + if (truncated) { + /* If the path is not complete, skip processing. */ + continue; + } + + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + } + de.file_name = dp->d_name; + cb(&de, data); + } + (void)mg_closedir(dirp); + } + return 1; +} + + +#if !defined(NO_FILES) +static int +remove_directory(struct mg_connection *conn, const char *dir) +{ + char path[PATH_MAX]; + struct dirent *dp; + DIR *dirp; + struct de de; + int truncated; + int ok = 1; + + if ((dirp = mg_opendir(conn, dir)) == NULL) { + return 0; + } else { + de.conn = conn; + + while ((dp = mg_readdir(dirp)) != NULL) { + /* Do not show current dir (but show hidden files as they will + * also be removed) */ + if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) { + continue; + } + + mg_snprintf( + conn, &truncated, path, sizeof(path), "%s/%s", dir, dp->d_name); + + /* If we don't memset stat structure to zero, mtime will have + * garbage and strftime() will segfault later on in + * print_dir_entry(). memset is required only if mg_stat() + * fails. For more details, see + * http://code.google.com/p/mongoose/issues/detail?id=79 */ + memset(&de.file, 0, sizeof(de.file)); + + if (truncated) { + /* Do not delete anything shorter */ + ok = 0; + continue; + } + + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + ok = 0; + } + if (de.file.membuf == NULL) { + /* file is not in memory */ + if (de.file.is_directory) { + if (remove_directory(conn, path) == 0) { + ok = 0; + } + } else { + if (mg_remove(conn, path) == 0) { + ok = 0; + } + } + } else { + /* file is in memory. It can not be deleted. */ + ok = 0; + } + } + (void)mg_closedir(dirp); + + IGNORE_UNUSED_RESULT(rmdir(dir)); + } + + return ok; +} +#endif + + +struct dir_scan_data { + struct de *entries; + unsigned int num_entries; + unsigned int arr_size; +}; + + +/* Behaves like realloc(), but frees original pointer on failure */ +static void * +realloc2(void *ptr, size_t size) +{ + void *new_ptr = mg_realloc(ptr, size); + if (new_ptr == NULL) { + mg_free(ptr); + } + return new_ptr; +} + + +static void +dir_scan_callback(struct de *de, void *data) +{ + struct dir_scan_data *dsd = (struct dir_scan_data *)data; + + if (dsd->entries == NULL || dsd->num_entries >= dsd->arr_size) { + dsd->arr_size *= 2; + dsd->entries = + (struct de *)realloc2(dsd->entries, + dsd->arr_size * sizeof(dsd->entries[0])); + } + if (dsd->entries == NULL) { + /* TODO(lsm, low): propagate an error to the caller */ + dsd->num_entries = 0; + } else { + dsd->entries[dsd->num_entries].file_name = mg_strdup(de->file_name); + dsd->entries[dsd->num_entries].file = de->file; + dsd->entries[dsd->num_entries].conn = de->conn; + dsd->num_entries++; + } +} + + +static void +handle_directory_request(struct mg_connection *conn, const char *dir) +{ + unsigned int i; + int sort_direction; + struct dir_scan_data data = {NULL, 0, 128}; + char date[64]; + time_t curtime = time(NULL); + + if (!scan_directory(conn, dir, &data, dir_scan_callback)) { + send_http_error(conn, + 500, + "Error: Cannot open directory\nopendir(%s): %s", + dir, + strerror(ERRNO)); + return; + } + + gmt_time_string(date, sizeof(date), &curtime); + + if (!conn) { + return; + } + + sort_direction = conn->request_info.query_string != NULL + && conn->request_info.query_string[1] == 'd' + ? 'a' + : 'd'; + + conn->must_close = 1; + mg_printf(conn, "HTTP/1.1 200 OK\r\n"); + send_static_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Connection: close\r\n" + "Content-Type: text/html; charset=utf-8\r\n\r\n", + date); + + conn->num_bytes_sent += + mg_printf(conn, + "Index of %s" + "" + "

Index of %s

"
+	              ""
+	              ""
+	              ""
+	              "",
+	              conn->request_info.local_uri,
+	              conn->request_info.local_uri,
+	              sort_direction,
+	              sort_direction,
+	              sort_direction);
+
+	/* Print first entry - link to a parent directory */
+	conn->num_bytes_sent +=
+	    mg_printf(conn,
+	              ""
+	              "\n",
+	              conn->request_info.local_uri,
+	              "..",
+	              "Parent directory",
+	              "-",
+	              "-");
+
+	/* Sort and print directory entries */
+	if (data.entries != NULL) {
+		qsort(data.entries,
+		      (size_t)data.num_entries,
+		      sizeof(data.entries[0]),
+		      compare_dir_entries);
+		for (i = 0; i < data.num_entries; i++) {
+			print_dir_entry(&data.entries[i]);
+			mg_free(data.entries[i].file_name);
+		}
+		mg_free(data.entries);
+	}
+
+	conn->num_bytes_sent += mg_printf(conn, "%s", "
NameModifiedSize

%s %s  %s
"); + conn->status_code = 200; +} + + +/* Send len bytes from the opened file to the client. */ +static void +send_file_data(struct mg_connection *conn, + struct file *filep, + int64_t offset, + int64_t len) +{ + char buf[MG_BUF_LEN]; + int to_read, num_read, num_written; + int64_t size; + + if (!filep || !conn) { + return; + } + + /* Sanity check the offset */ + size = filep->size > INT64_MAX ? INT64_MAX : (int64_t)(filep->size); + offset = offset < 0 ? 0 : offset > size ? size : offset; + + if (len > 0 && filep->membuf != NULL && size > 0) { + /* file stored in memory */ + if (len > size - offset) { + len = size - offset; + } + mg_write(conn, filep->membuf + offset, (size_t)len); + } else if (len > 0 && filep->fp != NULL) { +/* file stored on disk */ +#if defined(__linux__) + /* sendfile is only available for Linux */ + if (conn->throttle == 0 && conn->ssl == 0) { + off_t sf_offs = (off_t)offset; + ssize_t sf_sent; + int sf_file = fileno(filep->fp); + int loop_cnt = 0; + + do { + /* 2147479552 (0x7FFFF000) is a limit found by experiment on + * 64 bit Linux (2^31 minus one memory page of 4k?). */ + size_t sf_tosend = + (size_t)((len < 0x7FFFF000) ? len : 0x7FFFF000); + sf_sent = + sendfile(conn->client.sock, sf_file, &sf_offs, sf_tosend); + if (sf_sent > 0) { + conn->num_bytes_sent += sf_sent; + len -= sf_sent; + offset += sf_sent; + } else if (loop_cnt == 0) { + /* This file can not be sent using sendfile. + * This might be the case for pseudo-files in the + * /sys/ and /proc/ file system. + * Use the regular user mode copy code instead. */ + break; + } else if (sf_sent == 0) { + /* No error, but 0 bytes sent. May be EOF? */ + return; + } + loop_cnt++; + + } while ((len > 0) && (sf_sent >= 0)); + + if (sf_sent > 0) { + return; /* OK */ + } + + /* sf_sent<0 means error, thus fall back to the classic way */ + /* This is always the case, if sf_file is not a "normal" file, + * e.g., for sending data from the output of a CGI process. */ + offset = (int64_t)sf_offs; + } +#endif + if ((offset > 0) && (fseeko(filep->fp, offset, SEEK_SET) != 0)) { + mg_cry(conn, "%s: fseeko() failed: %s", __func__, strerror(ERRNO)); + send_http_error( + conn, + 500, + "%s", + "Error: Unable to access file at requested position."); + } else { + while (len > 0) { + /* Calculate how much to read from the file in the buffer */ + to_read = sizeof(buf); + if ((int64_t)to_read > len) { + to_read = (int)len; + } + + /* Read from file, exit the loop on error */ + if ((num_read = (int)fread(buf, 1, (size_t)to_read, filep->fp)) + <= 0) { + break; + } + + /* Send read bytes to the client, exit the loop on error */ + if ((num_written = mg_write(conn, buf, (size_t)num_read)) + != num_read) { + break; + } + + /* Both read and were successful, adjust counters */ + conn->num_bytes_sent += num_written; + len -= num_written; + } + } + } +} + + +static int +parse_range_header(const char *header, int64_t *a, int64_t *b) +{ + return sscanf(header, "bytes=%" INT64_FMT "-%" INT64_FMT, a, b); +} + + +static void +construct_etag(char *buf, size_t buf_len, const struct file *filep) +{ + if (filep != NULL && buf != NULL) { + mg_snprintf(NULL, + NULL, /* All calls to construct_etag use 64 byte buffer */ + buf, + buf_len, + "\"%lx.%" INT64_FMT "\"", + (unsigned long)filep->last_modified, + filep->size); + } +} + + +static void +fclose_on_exec(struct file *filep, struct mg_connection *conn) +{ + if (filep != NULL && filep->fp != NULL) { +#ifdef _WIN32 + (void)conn; /* Unused. */ +#else + if (fcntl(fileno(filep->fp), F_SETFD, FD_CLOEXEC) != 0) { + mg_cry(conn, + "%s: fcntl(F_SETFD FD_CLOEXEC) failed: %s", + __func__, + strerror(ERRNO)); + } +#endif + } +} + + +static void +handle_static_file_request(struct mg_connection *conn, + const char *path, + struct file *filep, + const char *mime_type) +{ + char date[64], lm[64], etag[64]; + char range[128]; /* large enough, so there will be no overflow */ + const char *msg = "OK", *hdr; + time_t curtime = time(NULL); + int64_t cl, r1, r2; + struct vec mime_vec; + int n, truncated; + char gz_path[PATH_MAX]; + const char *encoding = ""; + const char *cors1, *cors2, *cors3; + + if (conn == NULL || conn->ctx == NULL || filep == NULL) { + return; + } + + if (mime_type == NULL) { + get_mime_type(conn->ctx, path, &mime_vec); + } else { + mime_vec.ptr = mime_type; + mime_vec.len = strlen(mime_type); + } + if (filep->size > INT64_MAX) { + send_http_error(conn, + 500, + "Error: File size is too large to send\n%" INT64_FMT, + filep->size); + } + cl = (int64_t)filep->size; + conn->status_code = 200; + range[0] = '\0'; + + /* if this file is in fact a pre-gzipped file, rewrite its filename + * it's important to rewrite the filename after resolving + * the mime type from it, to preserve the actual file's type */ + if (filep->gzipped) { + mg_snprintf(conn, &truncated, gz_path, sizeof(gz_path), "%s.gz", path); + + if (truncated) { + send_http_error(conn, + 500, + "Error: Path of zipped file too long (%s)", + path); + return; + } + + path = gz_path; + encoding = "Content-Encoding: gzip\r\n"; + } + + if (!mg_fopen(conn, path, "rb", filep)) { + send_http_error(conn, + 500, + "Error: Cannot open file\nfopen(%s): %s", + path, + strerror(ERRNO)); + return; + } + + fclose_on_exec(filep, conn); + + /* If Range: header specified, act accordingly */ + r1 = r2 = 0; + hdr = mg_get_header(conn, "Range"); + if (hdr != NULL && (n = parse_range_header(hdr, &r1, &r2)) > 0 && r1 >= 0 + && r2 >= 0) { + /* actually, range requests don't play well with a pre-gzipped + * file (since the range is specified in the uncompressed space) */ + if (filep->gzipped) { + send_http_error( + conn, + 501, + "%s", + "Error: Range requests in gzipped files are not supported"); + mg_fclose(filep); + return; + } + conn->status_code = 206; + cl = n == 2 ? (r2 > cl ? cl : r2) - r1 + 1 : cl - r1; + mg_snprintf(conn, + NULL, /* range buffer is big enough */ + range, + sizeof(range), + "Content-Range: bytes " + "%" INT64_FMT "-%" INT64_FMT "/%" INT64_FMT "\r\n", + r1, + r1 + cl - 1, + filep->size); + msg = "Partial Content"; + } + + hdr = mg_get_header(conn, "Origin"); + if (hdr) { + /* Cross-origin resource sharing (CORS), see + * http://www.html5rocks.com/en/tutorials/cors/, + * http://www.html5rocks.com/static/images/cors_server_flowchart.png - + * preflight is not supported for files. */ + cors1 = "Access-Control-Allow-Origin: "; + cors2 = conn->ctx->config[ACCESS_CONTROL_ALLOW_ORIGIN]; + cors3 = "\r\n"; + } else { + cors1 = cors2 = cors3 = ""; + } + + /* Prepare Etag, Date, Last-Modified headers. Must be in UTC, according to + * http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 */ + gmt_time_string(date, sizeof(date), &curtime); + gmt_time_string(lm, sizeof(lm), &filep->last_modified); + construct_etag(etag, sizeof(etag), filep); + + (void)mg_printf(conn, + "HTTP/1.1 %d %s\r\n" + "%s%s%s" + "Date: %s\r\n", + conn->status_code, + msg, + cors1, + cors2, + cors3, + date); + send_static_cache_header(conn); + (void)mg_printf(conn, + "Last-Modified: %s\r\n" + "Etag: %s\r\n" + "Content-Type: %.*s\r\n" + "Content-Length: %" INT64_FMT "\r\n" + "Connection: %s\r\n" + "Accept-Ranges: bytes\r\n" + "%s%s\r\n", + lm, + etag, + (int)mime_vec.len, + mime_vec.ptr, + cl, + suggest_connection_header(conn), + range, + encoding); + + if (strcmp(conn->request_info.request_method, "HEAD") != 0) { + send_file_data(conn, filep, r1, cl); + } + mg_fclose(filep); +} + + +void +mg_send_file(struct mg_connection *conn, const char *path) +{ + mg_send_mime_file(conn, path, NULL); +} + + +void +mg_send_mime_file(struct mg_connection *conn, + const char *path, + const char *mime_type) +{ + struct file file = STRUCT_FILE_INITIALIZER; + if (mg_stat(conn, path, &file)) { + if (file.is_directory) { + if (!conn) { + return; + } + if (!mg_strcasecmp(conn->ctx->config[ENABLE_DIRECTORY_LISTING], + "yes")) { + handle_directory_request(conn, path); + } else { + send_http_error(conn, + 403, + "%s", + "Error: Directory listing denied"); + } + } else { + handle_static_file_request(conn, path, &file, mime_type); + } + } else { + send_http_error(conn, 404, "%s", "Error: File not found"); + } +} + + +/* For a given PUT path, create all intermediate subdirectories. + * Return 0 if the path itself is a directory. + * Return 1 if the path leads to a file. + * Return -1 for if the path is too long. + * Return -2 if path can not be created. +*/ +static int +put_dir(struct mg_connection *conn, const char *path) +{ + char buf[PATH_MAX]; + const char *s, *p; + struct file file = STRUCT_FILE_INITIALIZER; + size_t len; + int res = 1; + + for (s = p = path + 2; (p = strchr(s, '/')) != NULL; s = ++p) { + len = (size_t)(p - path); + if (len >= sizeof(buf)) { + /* path too long */ + res = -1; + break; + } + memcpy(buf, path, len); + buf[len] = '\0'; + + /* Try to create intermediate directory */ + DEBUG_TRACE("mkdir(%s)", buf); + if (!mg_stat(conn, buf, &file) && mg_mkdir(conn, buf, 0755) != 0) { + /* path does not exixt and can not be created */ + res = -2; + break; + } + + /* Is path itself a directory? */ + if (p[1] == '\0') { + res = 0; + } + } + + return res; +} + + +static void +remove_bad_file(const struct mg_connection *conn, const char *path) +{ + int r = mg_remove(conn, path); + if (r != 0) { + mg_cry(conn, "%s: Cannot remove invalid file %s", __func__, path); + } +} + + +long long +mg_store_body(struct mg_connection *conn, const char *path) +{ + char buf[MG_BUF_LEN]; + long long len = 0; + int ret, n; + struct file fi; + + if (conn->consumed_content != 0) { + mg_cry(conn, "%s: Contents already consumed", __func__); + return -11; + } + + ret = put_dir(conn, path); + if (ret < 0) { + /* -1 for path too long, + * -2 for path can not be created. */ + return ret; + } + if (ret != 1) { + /* Return 0 means, path itself is a directory. */ + return 0; + } + + if (mg_fopen(conn, path, "w", &fi) == 0) { + return -12; + } + + ret = mg_read(conn, buf, sizeof(buf)); + while (ret > 0) { + n = (int)fwrite(buf, 1, (size_t)ret, fi.fp); + if (n != ret) { + mg_fclose(&fi); + remove_bad_file(conn, path); + return -13; + } + ret = mg_read(conn, buf, sizeof(buf)); + } + + /* TODO: mg_fclose should return an error, + * and every caller should check and handle it. */ + if (fclose(fi.fp) != 0) { + remove_bad_file(conn, path); + return -14; + } + + return len; +} + + +/* Parse HTTP headers from the given buffer, advance buffer to the point + * where parsing stopped. */ +static void +parse_http_headers(char **buf, struct mg_request_info *ri) +{ + int i; + + if (!ri) { + return; + } + + ri->num_headers = 0; + + for (i = 0; i < (int)ARRAY_SIZE(ri->http_headers); i++) { + char *dp = *buf; + while ((*dp != ':') && (*dp != '\r') && (*dp != 0)) { + dp++; + } + if (!*dp) { + /* neither : nor \r\n. This is not a valid field. */ + break; + } + if (*dp == '\r') { + if (dp[1] == '\n') { + /* \r\n */ + ri->http_headers[i].name = *buf; + ri->http_headers[i].value = 0; + *buf = dp; + } else { + /* stray \r. This is not valid. */ + break; + } + } else { + /* (*dp == ':') */ + *dp = 0; + ri->http_headers[i].name = *buf; + do { + dp++; + } while (*dp == ' '); + + ri->http_headers[i].value = dp; + *buf = strstr(dp, "\r\n"); + } + + ri->num_headers = i + 1; + if (*buf) { + (*buf)[0] = 0; + (*buf)[1] = 0; + *buf += 2; + } else { + *buf = dp; + break; + } + + if (*buf[0] == '\r') { + /* This is the end of the header */ + break; + } + } +} + + +static int +is_valid_http_method(const char *method) +{ + return !strcmp(method, "GET") /* HTTP (RFC 2616) */ + || !strcmp(method, "POST") /* HTTP (RFC 2616) */ + || !strcmp(method, "HEAD") /* HTTP (RFC 2616) */ + || !strcmp(method, "PUT") /* HTTP (RFC 2616) */ + || !strcmp(method, "DELETE") /* HTTP (RFC 2616) */ + || !strcmp(method, "OPTIONS") /* HTTP (RFC 2616) */ + /* TRACE method (RFC 2616) is not supported for security reasons */ + || !strcmp(method, "CONNECT") /* HTTP (RFC 2616) */ + + || !strcmp(method, "PROPFIND") /* WEBDAV (RFC 2518) */ + || !strcmp(method, "MKCOL") /* WEBDAV (RFC 2518) */ + + /* Unsupported WEBDAV Methods: */ + /* PROPPATCH, COPY, MOVE, LOCK, UNLOCK (RFC 2518) */ + /* + 11 methods from RFC 3253 */ + /* ORDERPATCH (RFC 3648) */ + /* ACL (RFC 3744) */ + /* SEARCH (RFC 5323) */ + /* + MicroSoft extensions + * https://msdn.microsoft.com/en-us/library/aa142917.aspx */ + + /* PATCH method only allowed for CGI/Lua/LSP and callbacks. */ + || !strcmp(method, "PATCH"); /* PATCH method (RFC 5789) */ +} + + +/* Parse HTTP request, fill in mg_request_info structure. + * This function modifies the buffer by NUL-terminating + * HTTP request components, header names and header values. */ +static int +parse_http_message(char *buf, int len, struct mg_request_info *ri) +{ + int is_request, request_length; + + if (!ri) { + return 0; + } + + request_length = get_request_len(buf, len); + + if (request_length > 0) { + /* Reset attributes. DO NOT TOUCH is_ssl, remote_ip, remote_addr, + * remote_port */ + ri->remote_user = ri->request_method = ri->request_uri = + ri->http_version = NULL; + ri->num_headers = 0; + + buf[request_length - 1] = '\0'; + + /* RFC says that all initial whitespaces should be ingored */ + while (*buf != '\0' && isspace(*(unsigned char *)buf)) { + buf++; + } + ri->request_method = skip(&buf, " "); + ri->request_uri = skip(&buf, " "); + ri->http_version = skip(&buf, "\r\n"); + + /* HTTP message could be either HTTP request or HTTP response, e.g. + * "GET / HTTP/1.0 ...." or "HTTP/1.0 200 OK ..." */ + is_request = is_valid_http_method(ri->request_method); + if ((is_request && memcmp(ri->http_version, "HTTP/", 5) != 0) + || (!is_request && memcmp(ri->request_method, "HTTP/", 5) != 0)) { + request_length = -1; + } else { + if (is_request) { + ri->http_version += 5; + } + parse_http_headers(&buf, ri); + } + } + return request_length; +} + + +/* Keep reading the input (either opened file descriptor fd, or socket sock, + * or SSL descriptor ssl) into buffer buf, until \r\n\r\n appears in the + * buffer (which marks the end of HTTP request). Buffer buf may already + * have some data. The length of the data is stored in nread. + * Upon every read operation, increase nread by the number of bytes read. */ +static int +read_request(FILE *fp, + struct mg_connection *conn, + char *buf, + int bufsiz, + int *nread) +{ + int request_len, n = 0; + struct timespec last_action_time; + double request_timeout; + + if (!conn) { + return 0; + } + + memset(&last_action_time, 0, sizeof(last_action_time)); + + if (conn->ctx->config[REQUEST_TIMEOUT]) { + /* value of request_timeout is in seconds, config in milliseconds */ + request_timeout = atof(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } else { + request_timeout = -1.0; + } + + request_len = get_request_len(buf, *nread); + + /* first time reading from this connection */ + clock_gettime(CLOCK_MONOTONIC, &last_action_time); + + while ( + (conn->ctx->stop_flag == 0) && (*nread < bufsiz) && (request_len == 0) + && ((mg_difftimespec(&last_action_time, &(conn->req_time)) + <= request_timeout) || (request_timeout < 0)) + && ((n = pull(fp, conn, buf + *nread, bufsiz - *nread, request_timeout)) + > 0)) { + *nread += n; + /* assert(*nread <= bufsiz); */ + if (*nread > bufsiz) { + return -2; + } + request_len = get_request_len(buf, *nread); + if (request_timeout > 0.0) { + clock_gettime(CLOCK_MONOTONIC, &last_action_time); + } + } + + return (request_len <= 0 && n <= 0) ? -1 : request_len; +} + +#if !defined(NO_FILES) +/* For given directory path, substitute it to valid index file. + * Return 1 if index file has been found, 0 if not found. + * If the file is found, it's stats is returned in stp. */ +static int +substitute_index_file(struct mg_connection *conn, + char *path, + size_t path_len, + struct file *filep) +{ + if (conn && conn->ctx) { + const char *list = conn->ctx->config[INDEX_FILES]; + struct file file = STRUCT_FILE_INITIALIZER; + struct vec filename_vec; + size_t n = strlen(path); + int found = 0; + + /* The 'path' given to us points to the directory. Remove all trailing + * directory separator characters from the end of the path, and + * then append single directory separator character. */ + while (n > 0 && path[n - 1] == '/') { + n--; + } + path[n] = '/'; + + /* Traverse index files list. For each entry, append it to the given + * path and see if the file exists. If it exists, break the loop */ + while ((list = next_option(list, &filename_vec, NULL)) != NULL) { + /* Ignore too long entries that may overflow path buffer */ + if (filename_vec.len > path_len - (n + 2)) { + continue; + } + + /* Prepare full path to the index file */ + mg_strlcpy(path + n + 1, filename_vec.ptr, filename_vec.len + 1); + + /* Does it exist? */ + if (mg_stat(conn, path, &file)) { + /* Yes it does, break the loop */ + *filep = file; + found = 1; + break; + } + } + + /* If no index file exists, restore directory path */ + if (!found) { + path[n] = '\0'; + } + + return found; + } + return 0; +} +#endif + + +#if !defined(NO_CACHING) +/* Return True if we should reply 304 Not Modified. */ +static int +is_not_modified(const struct mg_connection *conn, const struct file *filep) +{ + char etag[64]; + const char *ims = mg_get_header(conn, "If-Modified-Since"); + const char *inm = mg_get_header(conn, "If-None-Match"); + construct_etag(etag, sizeof(etag), filep); + if (!filep) { + return 0; + } + return (inm != NULL && !mg_strcasecmp(etag, inm)) + || (ims != NULL && (filep->last_modified <= parse_date_string(ims))); +} +#endif /* !NO_CACHING */ + + +#if !defined(NO_CGI) || !defined(NO_FILES) +static int +forward_body_data(struct mg_connection *conn, FILE *fp, SOCKET sock, SSL *ssl) +{ + const char *expect, *body; + char buf[MG_BUF_LEN]; + int to_read, nread, success = 0; + int64_t buffered_len; + double timeout = -1.0; + + if (!conn) { + return 0; + } + if (conn->ctx->config[REQUEST_TIMEOUT]) { + timeout = atoi(conn->ctx->config[REQUEST_TIMEOUT]) / 1000.0; + } + + expect = mg_get_header(conn, "Expect"); + /* assert(fp != NULL); */ + if (!fp) { + send_http_error(conn, 500, "%s", "Error: NULL File"); + return 0; + } + + if (conn->content_len == -1 && !conn->is_chunked) { + /* Content length is not specified by the client. */ + send_http_error(conn, + 411, + "%s", + "Error: Client did not specify content length"); + } else if ((expect != NULL) + && (mg_strcasecmp(expect, "100-continue") != 0)) { + /* Client sent an "Expect: xyz" header and xyz is not 100-continue. */ + send_http_error(conn, + 417, + "Error: Can not fulfill expectation %s", + expect); + } else { + if (expect != NULL) { + (void)mg_printf(conn, "%s", "HTTP/1.1 100 Continue\r\n\r\n"); + conn->status_code = 100; + } else { + conn->status_code = 200; + } + + buffered_len = (int64_t)(conn->data_len) - (int64_t)conn->request_len + - conn->consumed_content; + + /* assert(buffered_len >= 0); */ + /* assert(conn->consumed_content == 0); */ + + if ((buffered_len < 0) || (conn->consumed_content != 0)) { + send_http_error(conn, 500, "%s", "Error: Size mismatch"); + return 0; + } + + if (buffered_len > 0) { + if ((int64_t)buffered_len > conn->content_len) { + buffered_len = (int)conn->content_len; + } + body = conn->buf + conn->request_len + conn->consumed_content; + push_all(conn->ctx, fp, sock, ssl, body, (int64_t)buffered_len); + conn->consumed_content += buffered_len; + } + + nread = 0; + while (conn->consumed_content < conn->content_len) { + to_read = sizeof(buf); + if ((int64_t)to_read > conn->content_len - conn->consumed_content) { + to_read = (int)(conn->content_len - conn->consumed_content); + } + nread = pull(NULL, conn, buf, to_read, timeout); + if (nread <= 0 + || push_all(conn->ctx, fp, sock, ssl, buf, nread) != nread) { + break; + } + conn->consumed_content += nread; + } + + if (conn->consumed_content == conn->content_len) { + success = (nread >= 0); + } + + /* Each error code path in this function must send an error */ + if (!success) { + /* NOTE: Maybe some data has already been sent. */ + /* TODO (low): If some data has been sent, a correct error + * reply can no longer be sent, so just close the connection */ + send_http_error(conn, 500, "%s", ""); + } + } + + return success; +} +#endif + +#if !defined(NO_CGI) +/* This structure helps to create an environment for the spawned CGI program. + * Environment is an array of "VARIABLE=VALUE\0" ASCIIZ strings, + * last element must be NULL. + * However, on Windows there is a requirement that all these VARIABLE=VALUE\0 + * strings must reside in a contiguous buffer. The end of the buffer is + * marked by two '\0' characters. + * We satisfy both worlds: we create an envp array (which is vars), all + * entries are actually pointers inside buf. */ +struct cgi_environment { + struct mg_connection *conn; + /* Data block */ + char *buf; /* Environment buffer */ + size_t buflen; /* Space available in buf */ + size_t bufused; /* Space taken in buf */ + /* Index block */ + char **var; /* char **envp */ + size_t varlen; /* Number of variables available in var */ + size_t varused; /* Number of variables stored in var */ +}; + + +static void addenv(struct cgi_environment *env, + PRINTF_FORMAT_STRING(const char *fmt), + ...) PRINTF_ARGS(2, 3); + +/* Append VARIABLE=VALUE\0 string to the buffer, and add a respective + * pointer into the vars array. Assumes env != NULL and fmt != NULL. */ +static void +addenv(struct cgi_environment *env, const char *fmt, ...) +{ + size_t n, space; + int truncated; + char *added; + va_list ap; + + /* Calculate how much space is left in the buffer */ + space = (env->buflen - env->bufused); + + /* Calculate an estimate for the required space */ + n = strlen(fmt) + 2 + 128; + + do { + if (space <= n) { + /* Allocate new buffer */ + n = env->buflen + CGI_ENVIRONMENT_SIZE; + added = (char *)mg_realloc(env->buf, n); + if (!added) { + /* Out of memory */ + mg_cry(env->conn, + "%s: Cannot allocate memory for CGI variable [%s]", + __func__, + fmt); + return; + } + env->buf = added; + env->buflen = n; + space = (env->buflen - env->bufused); + } + + /* Make a pointer to the free space int the buffer */ + added = env->buf + env->bufused; + + /* Copy VARIABLE=VALUE\0 string into the free space */ + va_start(ap, fmt); + mg_vsnprintf(env->conn, &truncated, added, (size_t)space, fmt, ap); + va_end(ap); + + /* Do not add truncated strings to the environment */ + if (truncated) { + /* Reallocate the buffer */ + space = 0; + n = 1; + } + } while (truncated); + + /* Calculate number of bytes added to the environment */ + n = strlen(added) + 1; + env->bufused += n; + + /* Now update the variable index */ + space = (env->varlen - env->varused); + if (space < 2) { + mg_cry(env->conn, + "%s: Cannot register CGI variable [%s]", + __func__, + fmt); + return; + } + + /* Append a pointer to the added string into the envp array */ + env->var[env->varused] = added; + env->varused++; +} + + +static void +prepare_cgi_environment(struct mg_connection *conn, + const char *prog, + struct cgi_environment *env) +{ + const char *s; + struct vec var_vec; + char *p, src_addr[IP_ADDR_STR_LEN], http_var_name[128]; + int i, truncated; + + if (conn == NULL || prog == NULL || env == NULL) { + return; + } + + env->conn = conn; + env->buflen = CGI_ENVIRONMENT_SIZE; + env->bufused = 0; + env->buf = (char *)mg_malloc(env->buflen); + env->varlen = MAX_CGI_ENVIR_VARS; + env->varused = 0; + env->var = (char **)mg_malloc(env->buflen * sizeof(char *)); + + addenv(env, "SERVER_NAME=%s", conn->ctx->config[AUTHENTICATION_DOMAIN]); + addenv(env, "SERVER_ROOT=%s", conn->ctx->config[DOCUMENT_ROOT]); + addenv(env, "DOCUMENT_ROOT=%s", conn->ctx->config[DOCUMENT_ROOT]); + addenv(env, "SERVER_SOFTWARE=%s/%s", "Civetweb", mg_version()); + + /* Prepare the environment block */ + addenv(env, "%s", "GATEWAY_INTERFACE=CGI/1.1"); + addenv(env, "%s", "SERVER_PROTOCOL=HTTP/1.1"); + addenv(env, "%s", "REDIRECT_STATUS=200"); /* For PHP */ + +#if defined(USE_IPV6) + if (conn->client.lsa.sa.sa_family == AF_INET6) { + addenv(env, "SERVER_PORT=%d", ntohs(conn->client.lsa.sin6.sin6_port)); + } else +#endif + { + addenv(env, "SERVER_PORT=%d", ntohs(conn->client.lsa.sin.sin_port)); + } + + sockaddr_to_string(src_addr, sizeof(src_addr), &conn->client.rsa); + addenv(env, "REMOTE_ADDR=%s", src_addr); + + addenv(env, "REQUEST_METHOD=%s", conn->request_info.request_method); + addenv(env, "REMOTE_PORT=%d", conn->request_info.remote_port); + + addenv(env, "REQUEST_URI=%s", conn->request_info.request_uri); + addenv(env, "LOCAL_URI=%s", conn->request_info.local_uri); + + /* SCRIPT_NAME */ + addenv(env, + "SCRIPT_NAME=%.*s", + (int)strlen(conn->request_info.local_uri) + - ((conn->path_info == NULL) ? 0 : (int)strlen(conn->path_info)), + conn->request_info.local_uri); + + addenv(env, "SCRIPT_FILENAME=%s", prog); + if (conn->path_info == NULL) { + addenv(env, "PATH_TRANSLATED=%s", conn->ctx->config[DOCUMENT_ROOT]); + } else { + addenv(env, + "PATH_TRANSLATED=%s%s", + conn->ctx->config[DOCUMENT_ROOT], + conn->path_info); + } + + addenv(env, "HTTPS=%s", conn->ssl == NULL ? "off" : "on"); + + if ((s = mg_get_header(conn, "Content-Type")) != NULL) { + addenv(env, "CONTENT_TYPE=%s", s); + } + if (conn->request_info.query_string != NULL) { + addenv(env, "QUERY_STRING=%s", conn->request_info.query_string); + } + if ((s = mg_get_header(conn, "Content-Length")) != NULL) { + addenv(env, "CONTENT_LENGTH=%s", s); + } + if ((s = getenv("PATH")) != NULL) { + addenv(env, "PATH=%s", s); + } + if (conn->path_info != NULL) { + addenv(env, "PATH_INFO=%s", conn->path_info); + } + + if (conn->status_code > 0) { + /* CGI error handler should show the status code */ + addenv(env, "STATUS=%d", conn->status_code); + } + +#if defined(_WIN32) + if ((s = getenv("COMSPEC")) != NULL) { + addenv(env, "COMSPEC=%s", s); + } + if ((s = getenv("SYSTEMROOT")) != NULL) { + addenv(env, "SYSTEMROOT=%s", s); + } + if ((s = getenv("SystemDrive")) != NULL) { + addenv(env, "SystemDrive=%s", s); + } + if ((s = getenv("ProgramFiles")) != NULL) { + addenv(env, "ProgramFiles=%s", s); + } + if ((s = getenv("ProgramFiles(x86)")) != NULL) { + addenv(env, "ProgramFiles(x86)=%s", s); + } +#else + if ((s = getenv("LD_LIBRARY_PATH")) != NULL) { + addenv(env, "LD_LIBRARY_PATH=%s", s); + } +#endif /* _WIN32 */ + + if ((s = getenv("PERLLIB")) != NULL) { + addenv(env, "PERLLIB=%s", s); + } + + if (conn->request_info.remote_user != NULL) { + addenv(env, "REMOTE_USER=%s", conn->request_info.remote_user); + addenv(env, "%s", "AUTH_TYPE=Digest"); + } + + /* Add all headers as HTTP_* variables */ + for (i = 0; i < conn->request_info.num_headers; i++) { + + (void)mg_snprintf(conn, + &truncated, + http_var_name, + sizeof(http_var_name), + "HTTP_%s", + conn->request_info.http_headers[i].name); + + if (truncated) { + mg_cry(conn, + "%s: HTTP header variable too long [%s]", + __func__, + conn->request_info.http_headers[i].name); + continue; + } + + /* Convert variable name into uppercase, and change - to _ */ + for (p = http_var_name; *p != '\0'; p++) { + if (*p == '-') { + *p = '_'; + } + *p = (char)toupper(*(unsigned char *)p); + } + + addenv(env, + "%s=%s", + http_var_name, + conn->request_info.http_headers[i].value); + } + + /* Add user-specified variables */ + s = conn->ctx->config[CGI_ENVIRONMENT]; + while ((s = next_option(s, &var_vec, NULL)) != NULL) { + addenv(env, "%.*s", (int)var_vec.len, var_vec.ptr); + } + + env->var[env->varused] = NULL; + env->buf[env->bufused] = '\0'; +} + + +static void +handle_cgi_request(struct mg_connection *conn, const char *prog) +{ + char *buf; + size_t buflen; + int headers_len, data_len, i, truncated; + int fdin[2] = {-1, -1}, fdout[2] = {-1, -1}, fderr[2] = {-1, -1}; + const char *status, *status_text, *connection_state; + char *pbuf, dir[PATH_MAX], *p; + struct mg_request_info ri; + struct cgi_environment blk; + FILE *in = NULL, *out = NULL, *err = NULL; + struct file fout = STRUCT_FILE_INITIALIZER; + pid_t pid = (pid_t)-1; + + if (conn == NULL) { + return; + } + + buf = NULL; + buflen = 16384; + prepare_cgi_environment(conn, prog, &blk); + + /* CGI must be executed in its own directory. 'dir' must point to the + * directory containing executable program, 'p' must point to the + * executable program name relative to 'dir'. */ + (void)mg_snprintf(conn, &truncated, dir, sizeof(dir), "%s", prog); + + if (truncated) { + mg_cry(conn, "Error: CGI program \"%s\": Path too long", prog); + send_http_error(conn, 500, "Error: %s", "CGI path too long"); + goto done; + } + + if ((p = strrchr(dir, '/')) != NULL) { + *p++ = '\0'; + } else { + dir[0] = '.', dir[1] = '\0'; + p = (char *)prog; + } + + if (pipe(fdin) != 0 || pipe(fdout) != 0 || pipe(fderr) != 0) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not create CGI pipes: %s", + prog, + status); + send_http_error(conn, 500, "Error: Cannot create CGI pipe: %s", status); + goto done; + } + + pid = spawn_process(conn, p, blk.buf, blk.var, fdin, fdout, fderr, dir); + + if (pid == (pid_t)-1) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not spawn CGI process: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: Cannot spawn CGI process [%s]: %s", + prog, + status); + goto done; + } + + /* Make sure child closes all pipe descriptors. It must dup them to 0,1 */ + set_close_on_exec((SOCKET)fdin[0], conn); /* stdin read */ + set_close_on_exec((SOCKET)fdout[1], conn); /* stdout write */ + set_close_on_exec((SOCKET)fderr[1], conn); /* stderr write */ + set_close_on_exec((SOCKET)fdin[1], conn); /* stdin write */ + set_close_on_exec((SOCKET)fdout[0], conn); /* stdout read */ + set_close_on_exec((SOCKET)fderr[0], conn); /* stderr read */ + + /* Parent closes only one side of the pipes. + * If we don't mark them as closed, close() attempt before + * return from this function throws an exception on Windows. + * Windows does not like when closed descriptor is closed again. */ + (void)close(fdin[0]); + (void)close(fdout[1]); + (void)close(fderr[1]); + fdin[0] = fdout[1] = fderr[1] = -1; + + if ((in = fdopen(fdin[1], "wb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stdin: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdin\nfopen: %s", + status); + goto done; + } + + if ((out = fdopen(fdout[0], "rb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stdout: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdout\nfopen: %s", + status); + goto done; + } + + if ((err = fdopen(fderr[0], "rb")) == NULL) { + status = strerror(ERRNO); + mg_cry(conn, + "Error: CGI program \"%s\": Can not open stderr: %s", + prog, + status); + send_http_error(conn, + 500, + "Error: CGI can not open fdout\nfopen: %s", + status); + goto done; + } + + setbuf(in, NULL); + setbuf(out, NULL); + setbuf(err, NULL); + fout.fp = out; + + if ((conn->request_info.content_length > 0) || conn->is_chunked) { + /* This is a POST/PUT request, or another request with body data. */ + if (!forward_body_data(conn, in, INVALID_SOCKET, NULL)) { + /* Error sending the body data */ + mg_cry(conn, + "Error: CGI program \"%s\": Forward body data failed", + prog); + goto done; + } + } + + /* Close so child gets an EOF. */ + fclose(in); + in = NULL; + fdin[1] = -1; + + /* Now read CGI reply into a buffer. We need to set correct + * status code, thus we need to see all HTTP headers first. + * Do not send anything back to client, until we buffer in all + * HTTP headers. */ + data_len = 0; + buf = (char *)mg_malloc(buflen); + if (buf == NULL) { + send_http_error(conn, + 500, + "Error: Not enough memory for CGI buffer (%u bytes)", + (unsigned int)buflen); + mg_cry(conn, + "Error: CGI program \"%s\": Not enough memory for buffer (%u " + "bytes)", + prog, + (unsigned int)buflen); + goto done; + } + headers_len = read_request(out, conn, buf, (int)buflen, &data_len); + if (headers_len <= 0) { + + /* Could not parse the CGI response. Check if some error message on + * stderr. */ + i = pull_all(err, conn, buf, (int)buflen); + if (i > 0) { + mg_cry(conn, + "Error: CGI program \"%s\" sent error " + "message: [%.*s]", + prog, + i, + buf); + send_http_error(conn, + 500, + "Error: CGI program \"%s\" sent error " + "message: [%.*s]", + prog, + i, + buf); + } else { + mg_cry(conn, + "Error: CGI program sent malformed or too big " + "(>%u bytes) HTTP headers: [%.*s]", + (unsigned)buflen, + data_len, + buf); + + send_http_error(conn, + 500, + "Error: CGI program sent malformed or too big " + "(>%u bytes) HTTP headers: [%.*s]", + (unsigned)buflen, + data_len, + buf); + } + + goto done; + } + pbuf = buf; + buf[headers_len - 1] = '\0'; + parse_http_headers(&pbuf, &ri); + + /* Make up and send the status line */ + status_text = "OK"; + if ((status = get_header(&ri, "Status")) != NULL) { + conn->status_code = atoi(status); + status_text = status; + while (isdigit(*(const unsigned char *)status_text) + || *status_text == ' ') { + status_text++; + } + } else if (get_header(&ri, "Location") != NULL) { + conn->status_code = 302; + } else { + conn->status_code = 200; + } + connection_state = get_header(&ri, "Connection"); + if (!header_has_option(connection_state, "keep-alive")) { + conn->must_close = 1; + } + (void)mg_printf(conn, "HTTP/1.1 %d %s\r\n", conn->status_code, status_text); + + /* Send headers */ + for (i = 0; i < ri.num_headers; i++) { + mg_printf(conn, + "%s: %s\r\n", + ri.http_headers[i].name, + ri.http_headers[i].value); + } + mg_write(conn, "\r\n", 2); + + /* Send chunk of data that may have been read after the headers */ + conn->num_bytes_sent += + mg_write(conn, buf + headers_len, (size_t)(data_len - headers_len)); + + /* Read the rest of CGI output and send to the client */ + send_file_data(conn, &fout, 0, INT64_MAX); + +done: + mg_free(blk.var); + mg_free(blk.buf); + + if (pid != (pid_t)-1) { + kill(pid, SIGKILL); +#if !defined(_WIN32) + { + int st; + while (waitpid(pid, &st, 0) != -1) + ; /* clean zombies */ + } +#endif + } + if (fdin[0] != -1) { + close(fdin[0]); + } + if (fdout[1] != -1) { + close(fdout[1]); + } + + if (in != NULL) { + fclose(in); + } else if (fdin[1] != -1) { + close(fdin[1]); + } + + if (out != NULL) { + fclose(out); + } else if (fdout[0] != -1) { + close(fdout[0]); + } + + if (err != NULL) { + fclose(err); + } else if (fderr[0] != -1) { + close(fderr[0]); + } + + if (buf != NULL) { + mg_free(buf); + } +} +#endif /* !NO_CGI */ + + +#if !defined(NO_FILES) +static void +mkcol(struct mg_connection *conn, const char *path) +{ + int rc, body_len; + struct de de; + char date[64]; + time_t curtime = time(NULL); + + if (conn == NULL) { + return; + } + + /* TODO (mid): Check the send_http_error situations in this function */ + + memset(&de.file, 0, sizeof(de.file)); + if (!mg_stat(conn, path, &de.file)) { + mg_cry(conn, + "%s: mg_stat(%s) failed: %s", + __func__, + path, + strerror(ERRNO)); + } + + if (de.file.last_modified) { + /* TODO (high): This check does not seem to make any sense ! */ + send_http_error( + conn, 405, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + return; + } + + body_len = conn->data_len - conn->request_len; + if (body_len > 0) { + send_http_error( + conn, 415, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + return; + } + + rc = mg_mkdir(conn, path, 0755); + + if (rc == 0) { + conn->status_code = 201; + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d Created\r\n" + "Date: %s\r\n", + conn->status_code, + date); + send_static_cache_header(conn); + mg_printf(conn, + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + suggest_connection_header(conn)); + } else if (rc == -1) { + if (errno == EEXIST) { + send_http_error( + conn, 405, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else if (errno == EACCES) { + send_http_error( + conn, 403, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else if (errno == ENOENT) { + send_http_error( + conn, 409, "Error: mkcol(%s): %s", path, strerror(ERRNO)); + } else { + send_http_error(conn, 500, "fopen(%s): %s", path, strerror(ERRNO)); + } + } +} + + +static void +put_file(struct mg_connection *conn, const char *path) +{ + struct file file = STRUCT_FILE_INITIALIZER; + const char *range; + int64_t r1, r2; + int rc; + char date[64]; + time_t curtime = time(NULL); + + if (conn == NULL) { + return; + } + + if (mg_stat(conn, path, &file)) { + /* File already exists */ + conn->status_code = 200; + + if (file.is_directory) { + /* This is an already existing directory, + * so there is nothing to do for the server. */ + rc = 0; + + } else { + /* File exists and is not a directory. */ + /* Can it be replaced? */ + + if (file.membuf != NULL) { + /* This is an "in-memory" file, that can not be replaced */ + send_http_error( + conn, + 405, + "Error: Put not possible\nReplacing %s is not supported", + path); + return; + } + + /* Check if the server may write this file */ + if (access(path, W_OK) == 0) { + /* Access granted */ + conn->status_code = 200; + rc = 1; + } else { + send_http_error( + conn, + 403, + "Error: Put not possible\nReplacing %s is not allowed", + path); + return; + } + } + } else { + /* File should be created */ + conn->status_code = 201; + rc = put_dir(conn, path); + } + + if (rc == 0) { + /* put_dir returns 0 if path is a directory */ + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d %s\r\n", + conn->status_code, + mg_get_response_code_text(NULL, conn->status_code)); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + date, + suggest_connection_header(conn)); + + /* Request to create a directory has been fulfilled successfully. + * No need to put a file. */ + return; + } + + if (rc == -1) { + /* put_dir returns -1 if the path is too long */ + send_http_error(conn, + 414, + "Error: Path too long\nput_dir(%s): %s", + path, + strerror(ERRNO)); + return; + } + + if (rc == -2) { + /* put_dir returns -2 if the directory can not be created */ + send_http_error(conn, + 500, + "Error: Can not create directory\nput_dir(%s): %s", + path, + strerror(ERRNO)); + return; + } + + /* A file should be created or overwritten. */ + if (!mg_fopen(conn, path, "wb+", &file) || file.fp == NULL) { + mg_fclose(&file); + send_http_error(conn, + 500, + "Error: Can not create file\nfopen(%s): %s", + path, + strerror(ERRNO)); + return; + } + + fclose_on_exec(&file, conn); + range = mg_get_header(conn, "Content-Range"); + r1 = r2 = 0; + if (range != NULL && parse_range_header(range, &r1, &r2) > 0) { + conn->status_code = 206; /* Partial content */ + fseeko(file.fp, r1, SEEK_SET); + } + + if (!forward_body_data(conn, file.fp, INVALID_SOCKET, NULL)) { + /* forward_body_data failed. + * The error code has already been sent to the client, + * and conn->status_code is already set. */ + mg_fclose(&file); + return; + } + + gmt_time_string(date, sizeof(date), &curtime); + mg_printf(conn, + "HTTP/1.1 %d %s\r\n", + conn->status_code, + mg_get_response_code_text(NULL, conn->status_code)); + send_no_cache_header(conn); + mg_printf(conn, + "Date: %s\r\n" + "Content-Length: 0\r\n" + "Connection: %s\r\n\r\n", + date, + suggest_connection_header(conn)); + + mg_fclose(&file); +} + + +static void +delete_file(struct mg_connection *conn, const char *path) +{ + struct de de; + memset(&de.file, 0, sizeof(de.file)); + if (!mg_stat(conn, path, &de.file)) { + /* mg_stat returns 0 if the file does not exist */ + send_http_error(conn, + 404, + "Error: Cannot delete file\nFile %s not found", + path); + return; + } + + if (de.file.membuf != NULL) { + /* the file is cached in memory */ + send_http_error( + conn, + 405, + "Error: Delete not possible\nDeleting %s is not supported", + path); + return; + } + + if (de.file.is_directory) { + if (remove_directory(conn, path)) { + /* Delete is successful: Return 204 without content. */ + send_http_error(conn, 204, "%s", ""); + } else { + /* Delete is not successful: Return 500 (Server error). */ + send_http_error(conn, 500, "Error: Could not delete %s", path); + } + return; + } + + /* This is an existing file (not a directory). + * Check if write permission is granted. */ + if (access(path, W_OK) != 0) { + /* File is read only */ + send_http_error( + conn, + 403, + "Error: Delete not possible\nDeleting %s is not allowed", + path); + return; + } + + /* Try to delete it. */ + if (mg_remove(conn, path) == 0) { + /* Delete was successful: Return 204 without content. */ + send_http_error(conn, 204, "%s", ""); + } else { + /* Delete not successful (file locked). */ + send_http_error(conn, + 423, + "Error: Cannot delete file\nremove(%s): %s", + path, + strerror(ERRNO)); + } +} +#endif /* !NO_FILES */ + + +static void +send_ssi_file(struct mg_connection *, const char *, struct file *, int); + + +static void +do_ssi_include(struct mg_connection *conn, + const char *ssi, + char *tag, + int include_level) +{ + char file_name[MG_BUF_LEN], path[512], *p; + struct file file = STRUCT_FILE_INITIALIZER; + size_t len; + int truncated = 0; + + if (conn == NULL) { + return; + } + + /* sscanf() is safe here, since send_ssi_file() also uses buffer + * of size MG_BUF_LEN to get the tag. So strlen(tag) is + * always < MG_BUF_LEN. */ + if (sscanf(tag, " virtual=\"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the webserver root */ + file_name[511] = 0; + (void)mg_snprintf(conn, + &truncated, + path, + sizeof(path), + "%s/%s", + conn->ctx->config[DOCUMENT_ROOT], + file_name); + + } else if (sscanf(tag, " abspath=\"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the webserver working directory + * or it is absolute system path */ + file_name[511] = 0; + (void) + mg_snprintf(conn, &truncated, path, sizeof(path), "%s", file_name); + + } else if (sscanf(tag, " file=\"%511[^\"]\"", file_name) == 1 + || sscanf(tag, " \"%511[^\"]\"", file_name) == 1) { + /* File name is relative to the currect document */ + file_name[511] = 0; + (void)mg_snprintf(conn, &truncated, path, sizeof(path), "%s", ssi); + + if (!truncated) { + if ((p = strrchr(path, '/')) != NULL) { + p[1] = '\0'; + } + len = strlen(path); + (void)mg_snprintf(conn, + &truncated, + path + len, + sizeof(path) - len, + "%s", + file_name); + } + + } else { + mg_cry(conn, "Bad SSI #include: [%s]", tag); + return; + } + + if (truncated) { + mg_cry(conn, "SSI #include path length overflow: [%s]", tag); + return; + } + + if (!mg_fopen(conn, path, "rb", &file)) { + mg_cry(conn, + "Cannot open SSI #include: [%s]: fopen(%s): %s", + tag, + path, + strerror(ERRNO)); + } else { + fclose_on_exec(&file, conn); + if (match_prefix(conn->ctx->config[SSI_EXTENSIONS], + strlen(conn->ctx->config[SSI_EXTENSIONS]), + path) > 0) { + send_ssi_file(conn, path, &file, include_level + 1); + } else { + send_file_data(conn, &file, 0, INT64_MAX); + } + mg_fclose(&file); + } +} + + +#if !defined(NO_POPEN) +static void +do_ssi_exec(struct mg_connection *conn, char *tag) +{ + char cmd[1024] = ""; + struct file file = STRUCT_FILE_INITIALIZER; + + if (sscanf(tag, " \"%1023[^\"]\"", cmd) != 1) { + mg_cry(conn, "Bad SSI #exec: [%s]", tag); + } else { + cmd[1023] = 0; + if ((file.fp = popen(cmd, "r")) == NULL) { + mg_cry(conn, "Cannot SSI #exec: [%s]: %s", cmd, strerror(ERRNO)); + } else { + send_file_data(conn, &file, 0, INT64_MAX); + pclose(file.fp); + } + } +} +#endif /* !NO_POPEN */ + + +static int +mg_fgetc(struct file *filep, int offset) +{ + if (filep == NULL) { + return EOF; + } + if (filep->membuf != NULL && offset >= 0 + && ((unsigned int)(offset)) < filep->size) { + return ((const unsigned char *)filep->membuf)[offset]; + } else if (filep->fp != NULL) { + return fgetc(filep->fp); + } else { + return EOF; + } +} + + +static void +send_ssi_file(struct mg_connection *conn, + const char *path, + struct file *filep, + int include_level) +{ + char buf[MG_BUF_LEN]; + int ch, offset, len, in_ssi_tag; + + if (include_level > 10) { + mg_cry(conn, "SSI #include level is too deep (%s)", path); + return; + } + + in_ssi_tag = len = offset = 0; + while ((ch = mg_fgetc(filep, offset)) != EOF) { + if (in_ssi_tag && ch == '>') { + in_ssi_tag = 0; + buf[len++] = (char)ch; + buf[len] = '\0'; + /* assert(len <= (int) sizeof(buf)); */ + if (len > (int)sizeof(buf)) { + break; + } + if (len < 6 || memcmp(buf, " + + + EnvironmentId + {666f325e-a9c7-45d6-a820-626289f99bab} + + + ProjectExplorer.Project.ActiveTarget + 0 + + + ProjectExplorer.Project.EditorSettings + + true + false + true + + Cpp + + CppGlobal + + + + QmlJS + + QmlJSGlobal + + + 2 + UTF-8 + false + 4 + false + 80 + true + true + 1 + true + false + 0 + true + true + 0 + 8 + true + 1 + true + true + true + false + + + + ProjectExplorer.Project.PluginSettings + + + true + Builtin.Questionable + + true + Builtin.DefaultTidyAndClazy + 2 + + + + true + + + + + ProjectExplorer.Project.Target.0 + + Desktop Qt 5.12.9 GCC 64bit + Desktop Qt 5.12.9 GCC 64bit + qt.qt5.5129.gcc_64_kit + 0 + 0 + 0 + + true + 0 + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Debug + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Debug + + + true + QtProjectManager.QMakeBuildStep + + false + + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Debug + Qt4ProjectManager.Qt4BuildConfiguration + 2 + 2 + 2 + + + true + 2 + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Release + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Release + + + true + QtProjectManager.QMakeBuildStep + + false + + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Release + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 2 + + + true + 0 + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Profile + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Profile + + + true + QtProjectManager.QMakeBuildStep + + false + + + + true + Qt4ProjectManager.MakeStep + + false + + + false + + 2 + Build + Build + ProjectExplorer.BuildSteps.Build + + + + true + Qt4ProjectManager.MakeStep + + true + clean + + false + + 1 + Clean + Clean + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + Qt4ProjectManager.Qt4BuildConfiguration + 0 + 0 + 0 + + 3 + + + 0 + Deploy + Deploy + ProjectExplorer.BuildSteps.Deploy + + 1 + + false + ProjectExplorer.DefaultDeployConfiguration + + 1 + + + dwarf + + cpu-cycles + + + 250 + + -e + cpu-cycles + --call-graph + dwarf,4096 + -F + 250 + + -F + true + 4096 + false + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + kcachegrind + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + + 2 + + Qt4ProjectManager.Qt4RunConfiguration:/home/panda/Hiperiso2Disk/Hiperiso2Disk.pro + /home/panda/Hiperiso2Disk/Hiperiso2Disk.pro + + false + + false + true + true + false + false + true + /home/panda/Desktop/hiperiso-1.0.52-linux/hiperiso-1.0.52 + /home/panda/build-Hiperiso2Disk-Desktop_Qt_5_12_9_GCC_64bit-Debug + + 1 + + + + ProjectExplorer.Project.TargetCount + 1 + + + ProjectExplorer.Project.Updater.FileVersion + 22 + + + Version + 22 + + diff --git a/src/gui/QT/Makefile b/src/gui/QT/Makefile new file mode 100644 index 0000000..7d1106b --- /dev/null +++ b/src/gui/QT/Makefile @@ -0,0 +1,1081 @@ +############################################################################# +# Makefile for building: Hiperiso2Disk +# Generated by qmake (3.1) (Qt 5.15.19) +# Project: Hiperiso2Disk.pro +# Template: app +# Command: /usr/bin/qmake-qt5 -o Makefile Hiperiso2Disk.pro +############################################################################# + +MAKEFILE = Makefile + +EQ = = + +####### Compiler, tools and options + +CC = gcc +CXX = g++ +DEFINES = -DQT_DEPRECATED_WARNINGS -DSTATIC=static -DINIT= -DQT_CHECK_EUID -D_FILE_OFFSET_BITS=64 -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB +CFLAGS = -pipe -O2 -flto -fno-fat-lto-objects -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES) +CXXFLAGS = -pipe -O2 -std=gnu++11 -flto -fno-fat-lto-objects -Wall -Wextra -D_REENTRANT -fPIC $(DEFINES) +INCPATH = -I. -I../Core -I../Web -I. -I../Include -I../Lib/libhttp/include -I/mnt/data/Builds/hiperiso/src/gui/QT/../Lib/fat_io_lib/include -I../Lib/xz-embedded/linux/include -I../Lib/xz-embedded/linux/include/linux -I../Lib/xz-embedded/userspace -I../Lib/exfat/src/libexfat -I../Lib/fat_io_lib -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I. -I. -I/usr/lib/qt/mkspecs/linux-g++ +QMAKE = /usr/bin/qmake-qt5 +DEL_FILE = rm -f +CHK_DIR_EXISTS= test -d +MKDIR = mkdir -p +COPY = cp -f +COPY_FILE = cp -f +COPY_DIR = cp -f -R +INSTALL_FILE = install -m 644 -p +INSTALL_PROGRAM = install -m 755 -p +INSTALL_DIR = cp -f -R +QINSTALL = /usr/bin/qmake-qt5 -install qinstall +QINSTALL_PROGRAM = /usr/bin/qmake-qt5 -install qinstall -exe +DEL_FILE = rm -f +SYMLINK = ln -f -s +DEL_DIR = rmdir +MOVE = mv -f +TAR = tar -cf +COMPRESS = gzip -9f +DISTNAME = Hiperiso2Disk1.0.0 +DISTDIR = /mnt/data/Builds/hiperiso/src/gui/QT/.tmp/Hiperiso2Disk1.0.0 +LINK = g++ +LFLAGS = -Wl,-O1 -pipe -O2 -std=gnu++11 -flto=16 -fno-fat-lto-objects -fuse-linker-plugin -fPIC +LIBS = $(SUBLIBS) /usr/lib/libQt5Widgets.so /usr/lib/libQt5Gui.so /usr/lib/libQt5Core.so -lGL -lpthread +AR = gcc-ar cqs +RANLIB = +SED = sed +STRIP = strip + +####### Output directory + +OBJECTS_DIR = ./ + +####### Files + +SOURCES = ../Core/hiperiso_crc32.c \ + ../Core/hiperiso_disk.c \ + ../Core/hiperiso_json.c \ + ../Core/hiperiso_log.c \ + ../Core/hiperiso_md5.c \ + ../Core/hiperiso_util.c \ + ../Lib/exfat/src/libexfat/cluster.c \ + ../Lib/exfat/src/libexfat/io.c \ + ../Lib/exfat/src/libexfat/lookup.c \ + ../Lib/exfat/src/libexfat/mount.c \ + ../Lib/exfat/src/libexfat/node.c \ + ../Lib/exfat/src/libexfat/repair.c \ + ../Lib/exfat/src/libexfat/time.c \ + ../Lib/exfat/src/libexfat/utf.c \ + ../Lib/exfat/src/libexfat/utils.c \ + ../Lib/exfat/src/mkfs/cbm.c \ + ../Lib/exfat/src/mkfs/fat.c \ + ../Lib/exfat/src/mkfs/mkexfat.c \ + ../Lib/exfat/src/mkfs/mkexfat_main.c \ + ../Lib/exfat/src/mkfs/rootdir.c \ + ../Lib/exfat/src/mkfs/uct.c \ + ../Lib/exfat/src/mkfs/uctc.c \ + ../Lib/exfat/src/mkfs/vbr.c \ + ../Lib/fat_io_lib/fat_access.c \ + ../Lib/fat_io_lib/fat_cache.c \ + ../Lib/fat_io_lib/fat_filelib.c \ + ../Lib/fat_io_lib/fat_format.c \ + ../Lib/fat_io_lib/fat_misc.c \ + ../Lib/fat_io_lib/fat_string.c \ + ../Lib/fat_io_lib/fat_table.c \ + ../Lib/fat_io_lib/fat_write.c \ + ../Lib/xz-embedded/linux/lib/decompress_unxz.c \ + refresh_icon_data.c \ + secure_icon_data.c \ + hiperiso_qt_stub.c \ + ../Web/hiperiso_http.c \ + main.cpp \ + partcfgdialog.cpp \ + hiperiso2diskwindow.cpp moc_partcfgdialog.cpp \ + moc_hiperiso2diskwindow.cpp +OBJECTS = hiperiso_crc32.o \ + hiperiso_disk.o \ + hiperiso_json.o \ + hiperiso_log.o \ + hiperiso_md5.o \ + hiperiso_util.o \ + cluster.o \ + io.o \ + lookup.o \ + mount.o \ + node.o \ + repair.o \ + time.o \ + utf.o \ + utils.o \ + cbm.o \ + fat.o \ + mkexfat.o \ + mkexfat_main.o \ + rootdir.o \ + uct.o \ + uctc.o \ + vbr.o \ + fat_access.o \ + fat_cache.o \ + fat_filelib.o \ + fat_format.o \ + fat_misc.o \ + fat_string.o \ + fat_table.o \ + fat_write.o \ + decompress_unxz.o \ + refresh_icon_data.o \ + secure_icon_data.o \ + hiperiso_qt_stub.o \ + hiperiso_http.o \ + main.o \ + partcfgdialog.o \ + hiperiso2diskwindow.o \ + moc_partcfgdialog.o \ + moc_hiperiso2diskwindow.o +DIST = Lib/fat_io_lib/API.txt \ + Lib/fat_io_lib/COPYRIGHT.txt \ + Lib/fat_io_lib/Configuration.txt \ + Lib/fat_io_lib/History.txt \ + Lib/fat_io_lib/License.txt \ + Lib/fat_io_lib/Media \ + Access \ + API.txt \ + Lib/fat_io_lib/version.txt \ + /usr/lib/qt/mkspecs/features/spec_pre.prf \ + /usr/lib/qt/mkspecs/common/unix.conf \ + /usr/lib/qt/mkspecs/common/linux.conf \ + /usr/lib/qt/mkspecs/common/sanitize.conf \ + /usr/lib/qt/mkspecs/common/gcc-base.conf \ + /usr/lib/qt/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt/mkspecs/common/g++-base.conf \ + /usr/lib/qt/mkspecs/common/g++-unix.conf \ + /usr/lib/qt/mkspecs/qconfig.pri \ + /usr/lib/qt/mkspecs/modules/qt_KArchive.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuth.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuthCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCodecs.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCompletion.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCrash.pri \ + /usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KI18n.pri \ + /usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri \ + /usr/lib/qt/mkspecs/modules/qt_Kirigami2.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemModels.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemViews.pri \ + /usr/lib/qt/mkspecs/modules/qt_KNotifications.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandClient.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandServer.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickshapes_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt/mkspecs/features/qt_functions.prf \ + /usr/lib/qt/mkspecs/features/qt_config.prf \ + /usr/lib/qt/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt/mkspecs/features/spec_post.prf \ + .qmake.stash \ + /usr/lib/qt/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt/mkspecs/features/toolchain.prf \ + /usr/lib/qt/mkspecs/features/default_pre.prf \ + /usr/lib/qt/mkspecs/features/resolve_config.prf \ + /usr/lib/qt/mkspecs/features/default_post.prf \ + /usr/lib/qt/mkspecs/features/link_ltcg.prf \ + /usr/lib/qt/mkspecs/features/ltcg.prf \ + /usr/lib/qt/mkspecs/features/warn_on.prf \ + /usr/lib/qt/mkspecs/features/qt.prf \ + /usr/lib/qt/mkspecs/features/resources_functions.prf \ + /usr/lib/qt/mkspecs/features/resources.prf \ + /usr/lib/qt/mkspecs/features/moc.prf \ + /usr/lib/qt/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt/mkspecs/features/uic.prf \ + /usr/lib/qt/mkspecs/features/unix/thread.prf \ + /usr/lib/qt/mkspecs/features/qmake_use.prf \ + /usr/lib/qt/mkspecs/features/file_copies.prf \ + /usr/lib/qt/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt/mkspecs/features/exceptions.prf \ + /usr/lib/qt/mkspecs/features/yacc.prf \ + /usr/lib/qt/mkspecs/features/lex.prf \ + Hiperiso2Disk.pro ../Core/hiperiso_define.h \ + ../Core/hiperiso_disk.h \ + ../Core/hiperiso_json.h \ + ../Core/hiperiso_util.h \ + ../Include/Hiperiso2Disk.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/mkfs/rootdir.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/uctc.h \ + ../Lib/exfat/src/mkfs/vbr.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_cache.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_format.h \ + ../Lib/fat_io_lib/fat_list.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_string.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/libhttp/include/civetweb.h \ + ../Lib/libhttp/include/handle_form.inl \ + ../Lib/libhttp/include/md5.inl \ + ../Lib/libhttp/include/mod_duktape.inl \ + ../Lib/libhttp/include/mod_lua.inl \ + ../Lib/libhttp/include/timer.inl \ + hiperiso_qt.h \ + ../Web/hiperiso_http.h \ + partcfgdialog.h \ + hiperiso2diskwindow.h ../Core/hiperiso_crc32.c \ + ../Core/hiperiso_disk.c \ + ../Core/hiperiso_json.c \ + ../Core/hiperiso_log.c \ + ../Core/hiperiso_md5.c \ + ../Core/hiperiso_util.c \ + ../Lib/exfat/src/libexfat/cluster.c \ + ../Lib/exfat/src/libexfat/io.c \ + ../Lib/exfat/src/libexfat/lookup.c \ + ../Lib/exfat/src/libexfat/mount.c \ + ../Lib/exfat/src/libexfat/node.c \ + ../Lib/exfat/src/libexfat/repair.c \ + ../Lib/exfat/src/libexfat/time.c \ + ../Lib/exfat/src/libexfat/utf.c \ + ../Lib/exfat/src/libexfat/utils.c \ + ../Lib/exfat/src/mkfs/cbm.c \ + ../Lib/exfat/src/mkfs/fat.c \ + ../Lib/exfat/src/mkfs/mkexfat.c \ + ../Lib/exfat/src/mkfs/mkexfat_main.c \ + ../Lib/exfat/src/mkfs/rootdir.c \ + ../Lib/exfat/src/mkfs/uct.c \ + ../Lib/exfat/src/mkfs/uctc.c \ + ../Lib/exfat/src/mkfs/vbr.c \ + ../Lib/fat_io_lib/fat_access.c \ + ../Lib/fat_io_lib/fat_cache.c \ + ../Lib/fat_io_lib/fat_filelib.c \ + ../Lib/fat_io_lib/fat_format.c \ + ../Lib/fat_io_lib/fat_misc.c \ + ../Lib/fat_io_lib/fat_string.c \ + ../Lib/fat_io_lib/fat_table.c \ + ../Lib/fat_io_lib/fat_write.c \ + ../Lib/xz-embedded/linux/lib/decompress_unxz.c \ + refresh_icon_data.c \ + secure_icon_data.c \ + hiperiso_qt_stub.c \ + ../Web/hiperiso_http.c \ + main.cpp \ + partcfgdialog.cpp \ + hiperiso2diskwindow.cpp +QMAKE_TARGET = Hiperiso2Disk +DESTDIR = +TARGET = Hiperiso2Disk + + +first: all +####### Build rules + +Hiperiso2Disk: ui_partcfgdialog.h ui_hiperiso2diskwindow.h $(OBJECTS) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) + +Makefile: Hiperiso2Disk.pro /usr/lib/qt/mkspecs/linux-g++/qmake.conf /usr/lib/qt/mkspecs/features/spec_pre.prf \ + /usr/lib/qt/mkspecs/common/unix.conf \ + /usr/lib/qt/mkspecs/common/linux.conf \ + /usr/lib/qt/mkspecs/common/sanitize.conf \ + /usr/lib/qt/mkspecs/common/gcc-base.conf \ + /usr/lib/qt/mkspecs/common/gcc-base-unix.conf \ + /usr/lib/qt/mkspecs/common/g++-base.conf \ + /usr/lib/qt/mkspecs/common/g++-unix.conf \ + /usr/lib/qt/mkspecs/qconfig.pri \ + /usr/lib/qt/mkspecs/modules/qt_KArchive.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuth.pri \ + /usr/lib/qt/mkspecs/modules/qt_KAuthCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCodecs.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCompletion.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri \ + /usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KCrash.pri \ + /usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KI18n.pri \ + /usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri \ + /usr/lib/qt/mkspecs/modules/qt_Kirigami2.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemModels.pri \ + /usr/lib/qt/mkspecs/modules/qt_KItemViews.pri \ + /usr/lib/qt/mkspecs/modules/qt_KNotifications.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandClient.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWaylandServer.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri \ + /usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_edid_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_kms_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediagsttools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickshapes_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_vulkan_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xkbcommon_support_private.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml.pri \ + /usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri \ + /usr/lib/qt/mkspecs/features/qt_functions.prf \ + /usr/lib/qt/mkspecs/features/qt_config.prf \ + /usr/lib/qt/mkspecs/linux-g++/qmake.conf \ + /usr/lib/qt/mkspecs/features/spec_post.prf \ + .qmake.stash \ + /usr/lib/qt/mkspecs/features/exclusive_builds.prf \ + /usr/lib/qt/mkspecs/features/toolchain.prf \ + /usr/lib/qt/mkspecs/features/default_pre.prf \ + /usr/lib/qt/mkspecs/features/resolve_config.prf \ + /usr/lib/qt/mkspecs/features/default_post.prf \ + /usr/lib/qt/mkspecs/features/link_ltcg.prf \ + /usr/lib/qt/mkspecs/features/ltcg.prf \ + /usr/lib/qt/mkspecs/features/warn_on.prf \ + /usr/lib/qt/mkspecs/features/qt.prf \ + /usr/lib/qt/mkspecs/features/resources_functions.prf \ + /usr/lib/qt/mkspecs/features/resources.prf \ + /usr/lib/qt/mkspecs/features/moc.prf \ + /usr/lib/qt/mkspecs/features/unix/opengl.prf \ + /usr/lib/qt/mkspecs/features/uic.prf \ + /usr/lib/qt/mkspecs/features/unix/thread.prf \ + /usr/lib/qt/mkspecs/features/qmake_use.prf \ + /usr/lib/qt/mkspecs/features/file_copies.prf \ + /usr/lib/qt/mkspecs/features/testcase_targets.prf \ + /usr/lib/qt/mkspecs/features/exceptions.prf \ + /usr/lib/qt/mkspecs/features/yacc.prf \ + /usr/lib/qt/mkspecs/features/lex.prf \ + Hiperiso2Disk.pro + $(QMAKE) -o Makefile Hiperiso2Disk.pro +/usr/lib/qt/mkspecs/features/spec_pre.prf: +/usr/lib/qt/mkspecs/common/unix.conf: +/usr/lib/qt/mkspecs/common/linux.conf: +/usr/lib/qt/mkspecs/common/sanitize.conf: +/usr/lib/qt/mkspecs/common/gcc-base.conf: +/usr/lib/qt/mkspecs/common/gcc-base-unix.conf: +/usr/lib/qt/mkspecs/common/g++-base.conf: +/usr/lib/qt/mkspecs/common/g++-unix.conf: +/usr/lib/qt/mkspecs/qconfig.pri: +/usr/lib/qt/mkspecs/modules/qt_KArchive.pri: +/usr/lib/qt/mkspecs/modules/qt_KAuth.pri: +/usr/lib/qt/mkspecs/modules/qt_KAuthCore.pri: +/usr/lib/qt/mkspecs/modules/qt_KCodecs.pri: +/usr/lib/qt/mkspecs/modules/qt_KCompletion.pri: +/usr/lib/qt/mkspecs/modules/qt_KConfigCore.pri: +/usr/lib/qt/mkspecs/modules/qt_KConfigGui.pri: +/usr/lib/qt/mkspecs/modules/qt_KConfigWidgets.pri: +/usr/lib/qt/mkspecs/modules/qt_KCoreAddons.pri: +/usr/lib/qt/mkspecs/modules/qt_KCrash.pri: +/usr/lib/qt/mkspecs/modules/qt_KGuiAddons.pri: +/usr/lib/qt/mkspecs/modules/qt_KI18n.pri: +/usr/lib/qt/mkspecs/modules/qt_KIconThemes.pri: +/usr/lib/qt/mkspecs/modules/qt_Kirigami2.pri: +/usr/lib/qt/mkspecs/modules/qt_KItemModels.pri: +/usr/lib/qt/mkspecs/modules/qt_KItemViews.pri: +/usr/lib/qt/mkspecs/modules/qt_KNotifications.pri: +/usr/lib/qt/mkspecs/modules/qt_KWaylandClient.pri: +/usr/lib/qt/mkspecs/modules/qt_KWaylandServer.pri: +/usr/lib/qt/mkspecs/modules/qt_KWidgetsAddons.pri: +/usr/lib/qt/mkspecs/modules/qt_KWindowSystem.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_accessibility_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_bootstrap_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_concurrent.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_concurrent_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_core.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_core_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_dbus.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_dbus_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_devicediscovery_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_edid_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_egl_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_eglfs_kms_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_eglfsdeviceintegration_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_eventdispatcher_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_fb_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_fontdatabase_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_glx_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_gui.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_gui_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_input_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_kms_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_linuxaccessibility_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimedia.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimedia_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimediagsttools_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_multimediawidgets_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_network.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_network_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_opengl.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_opengl_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_openglextensions_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_packetprotocol_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_platformcompositor_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_printsupport.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_printsupport_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qml.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qml_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmldebug_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmldevtools_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlmodels_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmltest.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmltest_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qmlworkerscript_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_qtmultimediaquicktools_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quick.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quick_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickcontrols2_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickparticles_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickshapes_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quicktemplates2_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_quickwidgets_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_service_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_sql.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_sql_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_svg.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_svg_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_testlib.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_testlib_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_texttospeech_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_theme_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_vulkan_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandclient_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_waylandcompositor_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_widgets.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_widgets_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_x11extras.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_x11extras_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xcb_qpa_lib_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xkbcommon_support_private.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xml.pri: +/usr/lib/qt/mkspecs/modules/qt_lib_xml_private.pri: +/usr/lib/qt/mkspecs/features/qt_functions.prf: +/usr/lib/qt/mkspecs/features/qt_config.prf: +/usr/lib/qt/mkspecs/linux-g++/qmake.conf: +/usr/lib/qt/mkspecs/features/spec_post.prf: +.qmake.stash: +/usr/lib/qt/mkspecs/features/exclusive_builds.prf: +/usr/lib/qt/mkspecs/features/toolchain.prf: +/usr/lib/qt/mkspecs/features/default_pre.prf: +/usr/lib/qt/mkspecs/features/resolve_config.prf: +/usr/lib/qt/mkspecs/features/default_post.prf: +/usr/lib/qt/mkspecs/features/link_ltcg.prf: +/usr/lib/qt/mkspecs/features/ltcg.prf: +/usr/lib/qt/mkspecs/features/warn_on.prf: +/usr/lib/qt/mkspecs/features/qt.prf: +/usr/lib/qt/mkspecs/features/resources_functions.prf: +/usr/lib/qt/mkspecs/features/resources.prf: +/usr/lib/qt/mkspecs/features/moc.prf: +/usr/lib/qt/mkspecs/features/unix/opengl.prf: +/usr/lib/qt/mkspecs/features/uic.prf: +/usr/lib/qt/mkspecs/features/unix/thread.prf: +/usr/lib/qt/mkspecs/features/qmake_use.prf: +/usr/lib/qt/mkspecs/features/file_copies.prf: +/usr/lib/qt/mkspecs/features/testcase_targets.prf: +/usr/lib/qt/mkspecs/features/exceptions.prf: +/usr/lib/qt/mkspecs/features/yacc.prf: +/usr/lib/qt/mkspecs/features/lex.prf: +Hiperiso2Disk.pro: +qmake: FORCE + @$(QMAKE) -o Makefile Hiperiso2Disk.pro + +qmake_all: FORCE + + +all: Makefile Hiperiso2Disk + +dist: distdir FORCE + (cd `dirname $(DISTDIR)` && $(TAR) $(DISTNAME).tar $(DISTNAME) && $(COMPRESS) $(DISTNAME).tar) && $(MOVE) `dirname $(DISTDIR)`/$(DISTNAME).tar.gz . && $(DEL_FILE) -r $(DISTDIR) + +distdir: FORCE + @test -d $(DISTDIR) || mkdir -p $(DISTDIR) + $(COPY_FILE) --parents $(DIST) $(DISTDIR)/ + $(COPY_FILE) --parents /usr/lib/qt/mkspecs/features/data/dummy.cpp $(DISTDIR)/ + $(COPY_FILE) --parents ../Core/hiperiso_define.h ../Core/hiperiso_disk.h ../Core/hiperiso_json.h ../Core/hiperiso_util.h ../Include/Hiperiso2Disk.h ../Lib/exfat/src/libexfat/byteorder.h ../Lib/exfat/src/libexfat/compiler.h ../Lib/exfat/src/libexfat/config.h ../Lib/exfat/src/libexfat/exfat.h ../Lib/exfat/src/libexfat/exfatfs.h ../Lib/exfat/src/libexfat/platform.h ../Lib/exfat/src/mkfs/cbm.h ../Lib/exfat/src/mkfs/fat.h ../Lib/exfat/src/mkfs/mkexfat.h ../Lib/exfat/src/mkfs/rootdir.h ../Lib/exfat/src/mkfs/uct.h ../Lib/exfat/src/mkfs/uctc.h ../Lib/exfat/src/mkfs/vbr.h ../Lib/fat_io_lib/fat_access.h ../Lib/fat_io_lib/fat_cache.h ../Lib/fat_io_lib/fat_defs.h ../Lib/fat_io_lib/fat_filelib.h ../Lib/fat_io_lib/fat_format.h ../Lib/fat_io_lib/fat_list.h ../Lib/fat_io_lib/fat_misc.h ../Lib/fat_io_lib/fat_opts.h ../Lib/fat_io_lib/fat_string.h ../Lib/fat_io_lib/fat_table.h ../Lib/fat_io_lib/fat_types.h ../Lib/fat_io_lib/fat_write.h ../Lib/libhttp/include/civetweb.h ../Lib/libhttp/include/handle_form.inl ../Lib/libhttp/include/md5.inl ../Lib/libhttp/include/mod_duktape.inl ../Lib/libhttp/include/mod_lua.inl ../Lib/libhttp/include/timer.inl hiperiso_qt.h ../Web/hiperiso_http.h partcfgdialog.h hiperiso2diskwindow.h $(DISTDIR)/ + $(COPY_FILE) --parents ../Core/hiperiso_crc32.c ../Core/hiperiso_disk.c ../Core/hiperiso_json.c ../Core/hiperiso_log.c ../Core/hiperiso_md5.c ../Core/hiperiso_util.c ../Lib/exfat/src/libexfat/cluster.c ../Lib/exfat/src/libexfat/io.c ../Lib/exfat/src/libexfat/lookup.c ../Lib/exfat/src/libexfat/mount.c ../Lib/exfat/src/libexfat/node.c ../Lib/exfat/src/libexfat/repair.c ../Lib/exfat/src/libexfat/time.c ../Lib/exfat/src/libexfat/utf.c ../Lib/exfat/src/libexfat/utils.c ../Lib/exfat/src/mkfs/cbm.c ../Lib/exfat/src/mkfs/fat.c ../Lib/exfat/src/mkfs/mkexfat.c ../Lib/exfat/src/mkfs/mkexfat_main.c ../Lib/exfat/src/mkfs/rootdir.c ../Lib/exfat/src/mkfs/uct.c ../Lib/exfat/src/mkfs/uctc.c ../Lib/exfat/src/mkfs/vbr.c ../Lib/fat_io_lib/fat_access.c ../Lib/fat_io_lib/fat_cache.c ../Lib/fat_io_lib/fat_filelib.c ../Lib/fat_io_lib/fat_format.c ../Lib/fat_io_lib/fat_misc.c ../Lib/fat_io_lib/fat_string.c ../Lib/fat_io_lib/fat_table.c ../Lib/fat_io_lib/fat_write.c ../Lib/xz-embedded/linux/lib/decompress_unxz.c refresh_icon_data.c secure_icon_data.c hiperiso_qt_stub.c ../Web/hiperiso_http.c main.cpp partcfgdialog.cpp hiperiso2diskwindow.cpp $(DISTDIR)/ + $(COPY_FILE) --parents partcfgdialog.ui hiperiso2diskwindow.ui $(DISTDIR)/ + + +clean: compiler_clean + -$(DEL_FILE) $(OBJECTS) + -$(DEL_FILE) *~ core *.core + + +distclean: clean + -$(DEL_FILE) $(TARGET) + -$(DEL_FILE) .qmake.stash + -$(DEL_FILE) Makefile + + +####### Sub-libraries + +mocclean: compiler_moc_header_clean compiler_moc_objc_header_clean compiler_moc_source_clean + +mocables: compiler_moc_header_make_all compiler_moc_objc_header_make_all compiler_moc_source_make_all + +check: first + +benchmark: first + +compiler_rcc_make_all: +compiler_rcc_clean: +compiler_moc_predefs_make_all: moc_predefs.h +compiler_moc_predefs_clean: + -$(DEL_FILE) moc_predefs.h +moc_predefs.h: /usr/lib/qt/mkspecs/features/data/dummy.cpp + g++ -pipe -O2 -std=gnu++11 -flto -fno-fat-lto-objects -Wall -Wextra -dM -E -o moc_predefs.h /usr/lib/qt/mkspecs/features/data/dummy.cpp + +compiler_moc_header_make_all: moc_partcfgdialog.cpp moc_hiperiso2diskwindow.cpp +compiler_moc_header_clean: + -$(DEL_FILE) moc_partcfgdialog.cpp moc_hiperiso2diskwindow.cpp +moc_partcfgdialog.cpp: partcfgdialog.h \ + moc_predefs.h \ + /usr/bin/moc + /usr/bin/moc $(DEFINES) --include /mnt/data/Builds/hiperiso/src/gui/QT/moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Core -I/mnt/data/Builds/hiperiso/src/gui/Web -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Include -I/mnt/data/Builds/hiperiso/src/gui/Lib/libhttp/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include/linux -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/userspace -I/mnt/data/Builds/hiperiso/src/gui/Lib/exfat/src/libexfat -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/16.1.1 -I/usr/include/c++/16.1.1/x86_64-pc-linux-gnu -I/usr/include/c++/16.1.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include -I/usr/local/include -I/usr/include partcfgdialog.h -o moc_partcfgdialog.cpp + +moc_hiperiso2diskwindow.cpp: hiperiso2diskwindow.h \ + partcfgdialog.h \ + moc_predefs.h \ + /usr/bin/moc + /usr/bin/moc $(DEFINES) --include /mnt/data/Builds/hiperiso/src/gui/QT/moc_predefs.h -I/usr/lib/qt/mkspecs/linux-g++ -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Core -I/mnt/data/Builds/hiperiso/src/gui/Web -I/mnt/data/Builds/hiperiso/src/gui/QT -I/mnt/data/Builds/hiperiso/src/gui/Include -I/mnt/data/Builds/hiperiso/src/gui/Lib/libhttp/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/linux/include/linux -I/mnt/data/Builds/hiperiso/src/gui/Lib/xz-embedded/userspace -I/mnt/data/Builds/hiperiso/src/gui/Lib/exfat/src/libexfat -I/mnt/data/Builds/hiperiso/src/gui/Lib/fat_io_lib -I/usr/include/qt -I/usr/include/qt/QtWidgets -I/usr/include/qt/QtGui -I/usr/include/qt/QtCore -I/usr/include/c++/16.1.1 -I/usr/include/c++/16.1.1/x86_64-pc-linux-gnu -I/usr/include/c++/16.1.1/backward -I/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include -I/usr/local/include -I/usr/include hiperiso2diskwindow.h -o moc_hiperiso2diskwindow.cpp + +compiler_moc_objc_header_make_all: +compiler_moc_objc_header_clean: +compiler_moc_source_make_all: +compiler_moc_source_clean: +compiler_uic_make_all: ui_partcfgdialog.h ui_hiperiso2diskwindow.h +compiler_uic_clean: + -$(DEL_FILE) ui_partcfgdialog.h ui_hiperiso2diskwindow.h +ui_partcfgdialog.h: partcfgdialog.ui \ + /usr/bin/uic + /usr/bin/uic partcfgdialog.ui -o ui_partcfgdialog.h + +ui_hiperiso2diskwindow.h: hiperiso2diskwindow.ui \ + /usr/bin/uic + /usr/bin/uic hiperiso2diskwindow.ui -o ui_hiperiso2diskwindow.h + +compiler_yacc_decl_make_all: +compiler_yacc_decl_clean: +compiler_yacc_impl_make_all: +compiler_yacc_impl_clean: +compiler_lex_make_all: +compiler_lex_clean: +compiler_clean: compiler_moc_predefs_clean compiler_moc_header_clean compiler_uic_clean + +####### Compile + +hiperiso_crc32.o: ../Core/hiperiso_crc32.c + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_crc32.o ../Core/hiperiso_crc32.c + +hiperiso_disk.o: ../Core/hiperiso_disk.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_disk.h \ + ../Core/hiperiso_util.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_disk.o ../Core/hiperiso_disk.c + +hiperiso_json.o: ../Core/hiperiso_json.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_util.h \ + ../Core/hiperiso_json.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_json.o ../Core/hiperiso_json.c + +hiperiso_log.o: ../Core/hiperiso_log.c ../Core/hiperiso_define.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_log.o ../Core/hiperiso_log.c + +hiperiso_md5.o: ../Core/hiperiso_md5.c + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_md5.o ../Core/hiperiso_md5.c + +hiperiso_util.o: ../Core/hiperiso_util.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_util.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_util.o ../Core/hiperiso_util.c + +cluster.o: ../Lib/exfat/src/libexfat/cluster.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o cluster.o ../Lib/exfat/src/libexfat/cluster.c + +io.o: ../Lib/exfat/src/libexfat/io.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o io.o ../Lib/exfat/src/libexfat/io.c + +lookup.o: ../Lib/exfat/src/libexfat/lookup.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o lookup.o ../Lib/exfat/src/libexfat/lookup.c + +mount.o: ../Lib/exfat/src/libexfat/mount.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mount.o ../Lib/exfat/src/libexfat/mount.c + +node.o: ../Lib/exfat/src/libexfat/node.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o node.o ../Lib/exfat/src/libexfat/node.c + +repair.o: ../Lib/exfat/src/libexfat/repair.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o repair.o ../Lib/exfat/src/libexfat/repair.c + +time.o: ../Lib/exfat/src/libexfat/time.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o time.o ../Lib/exfat/src/libexfat/time.c + +utf.o: ../Lib/exfat/src/libexfat/utf.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o utf.o ../Lib/exfat/src/libexfat/utf.c + +utils.o: ../Lib/exfat/src/libexfat/utils.c ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o utils.o ../Lib/exfat/src/libexfat/utils.c + +cbm.o: ../Lib/exfat/src/mkfs/cbm.c ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o cbm.o ../Lib/exfat/src/mkfs/cbm.c + +fat.o: ../Lib/exfat/src/mkfs/fat.c ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat.o ../Lib/exfat/src/mkfs/fat.c + +mkexfat.o: ../Lib/exfat/src/mkfs/mkexfat.c ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mkexfat.o ../Lib/exfat/src/mkfs/mkexfat.c + +mkexfat_main.o: ../Lib/exfat/src/mkfs/mkexfat_main.c ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/vbr.h \ + ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o mkexfat_main.o ../Lib/exfat/src/mkfs/mkexfat_main.c + +rootdir.o: ../Lib/exfat/src/mkfs/rootdir.c ../Lib/exfat/src/mkfs/rootdir.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o rootdir.o ../Lib/exfat/src/mkfs/rootdir.c + +uct.o: ../Lib/exfat/src/mkfs/uct.c ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o uct.o ../Lib/exfat/src/mkfs/uct.c + +uctc.o: ../Lib/exfat/src/mkfs/uctc.c ../Lib/exfat/src/mkfs/uctc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o uctc.o ../Lib/exfat/src/mkfs/uctc.c + +vbr.o: ../Lib/exfat/src/mkfs/vbr.c ../Lib/exfat/src/mkfs/vbr.h \ + ../Lib/exfat/src/mkfs/mkexfat.h \ + ../Lib/exfat/src/libexfat/exfat.h \ + ../Lib/exfat/src/libexfat/config.h \ + ../Lib/exfat/src/libexfat/compiler.h \ + ../Lib/exfat/src/libexfat/exfatfs.h \ + ../Lib/exfat/src/libexfat/byteorder.h \ + ../Lib/exfat/src/libexfat/platform.h \ + ../Lib/exfat/src/mkfs/fat.h \ + ../Lib/exfat/src/mkfs/cbm.h \ + ../Lib/exfat/src/mkfs/uct.h \ + ../Lib/exfat/src/mkfs/rootdir.h + $(CC) -c $(CFLAGS) $(INCPATH) -o vbr.o ../Lib/exfat/src/mkfs/vbr.c + +fat_access.o: ../Lib/fat_io_lib/fat_access.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_access.o ../Lib/fat_io_lib/fat_access.c + +fat_cache.o: ../Lib/fat_io_lib/fat_cache.c ../Lib/fat_io_lib/fat_cache.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_cache.o ../Lib/fat_io_lib/fat_cache.c + +fat_filelib.o: ../Lib/fat_io_lib/fat_filelib.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/fat_io_lib/fat_string.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_list.h \ + ../Lib/fat_io_lib/fat_cache.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_filelib.o ../Lib/fat_io_lib/fat_filelib.c + +fat_format.o: ../Lib/fat_io_lib/fat_format.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/fat_io_lib/fat_string.h \ + ../Lib/fat_io_lib/fat_format.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_format.o ../Lib/fat_io_lib/fat_format.c + +fat_misc.o: ../Lib/fat_io_lib/fat_misc.c ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_misc.o ../Lib/fat_io_lib/fat_misc.c + +fat_string.o: ../Lib/fat_io_lib/fat_string.c ../Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_string.o ../Lib/fat_io_lib/fat_string.c + +fat_table.o: ../Lib/fat_io_lib/fat_table.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_table.o ../Lib/fat_io_lib/fat_table.c + +fat_write.o: ../Lib/fat_io_lib/fat_write.c ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_table.h \ + ../Lib/fat_io_lib/fat_misc.h \ + ../Lib/fat_io_lib/fat_write.h \ + ../Lib/fat_io_lib/fat_string.h + $(CC) -c $(CFLAGS) $(INCPATH) -o fat_write.o ../Lib/fat_io_lib/fat_write.c + +decompress_unxz.o: ../Lib/xz-embedded/linux/lib/decompress_unxz.c ../Lib/xz-embedded/linux/include/linux/xz.h \ + ../Lib/xz-embedded/linux/lib/xz/xz_private.h \ + ../Lib/xz-embedded/userspace/xz_config.h \ + ../Lib/xz-embedded/linux/lib/xz/xz_crc32.c \ + ../Lib/xz-embedded/linux/lib/xz/xz_dec_stream.c \ + ../Lib/xz-embedded/linux/lib/xz/xz_stream.h \ + ../Lib/xz-embedded/linux/lib/xz/xz_dec_lzma2.c \ + ../Lib/xz-embedded/linux/lib/xz/xz_lzma2.h \ + ../Lib/xz-embedded/linux/lib/xz/xz_dec_bcj.c + $(CC) -c $(CFLAGS) $(INCPATH) -o decompress_unxz.o ../Lib/xz-embedded/linux/lib/decompress_unxz.c + +refresh_icon_data.o: refresh_icon_data.c + $(CC) -c $(CFLAGS) $(INCPATH) -o refresh_icon_data.o refresh_icon_data.c + +secure_icon_data.o: secure_icon_data.c + $(CC) -c $(CFLAGS) $(INCPATH) -o secure_icon_data.o secure_icon_data.c + +hiperiso_qt_stub.o: hiperiso_qt_stub.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_json.h \ + ../Core/hiperiso_util.h \ + ../Core/hiperiso_disk.h \ + ../Web/hiperiso_http.h \ + ../Lib/libhttp/include/civetweb.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_qt_stub.o hiperiso_qt_stub.c + +hiperiso_http.o: ../Web/hiperiso_http.c ../Core/hiperiso_define.h \ + ../Core/hiperiso_json.h \ + ../Core/hiperiso_util.h \ + ../Core/hiperiso_disk.h \ + ../Web/hiperiso_http.h \ + ../Lib/libhttp/include/civetweb.h \ + ../Lib/fat_io_lib/fat_filelib.h \ + ../Lib/fat_io_lib/fat_opts.h \ + ../Lib/fat_io_lib/fat_access.h \ + ../Lib/fat_io_lib/fat_defs.h \ + ../Lib/fat_io_lib/fat_types.h \ + ../Lib/fat_io_lib/fat_list.h + $(CC) -c $(CFLAGS) $(INCPATH) -o hiperiso_http.o ../Web/hiperiso_http.c + +main.o: main.cpp hiperiso2diskwindow.h \ + partcfgdialog.h \ + ../Core/hiperiso_define.h \ + ../Core/hiperiso_util.h \ + hiperiso_qt.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp + +partcfgdialog.o: partcfgdialog.cpp partcfgdialog.h \ + ui_partcfgdialog.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o partcfgdialog.o partcfgdialog.cpp + +hiperiso2diskwindow.o: hiperiso2diskwindow.cpp hiperiso2diskwindow.h \ + partcfgdialog.h \ + ui_hiperiso2diskwindow.h \ + ../Core/hiperiso_define.h \ + ../Core/hiperiso_util.h \ + ../Core/hiperiso_disk.h \ + ../Core/hiperiso_json.h \ + ../Web/hiperiso_http.h \ + ../Lib/libhttp/include/civetweb.h \ + hiperiso_qt.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o hiperiso2diskwindow.o hiperiso2diskwindow.cpp + +moc_partcfgdialog.o: moc_partcfgdialog.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_partcfgdialog.o moc_partcfgdialog.cpp + +moc_hiperiso2diskwindow.o: moc_hiperiso2diskwindow.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_hiperiso2diskwindow.o moc_hiperiso2diskwindow.cpp + +####### Install + +install_target: first FORCE + @test -d $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin || mkdir -p $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin + $(QINSTALL_PROGRAM) $(QMAKE_TARGET) $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin/$(QMAKE_TARGET) + +uninstall_target: FORCE + -$(DEL_FILE) $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin/$(QMAKE_TARGET) + -$(DEL_DIR) $(INSTALL_ROOT)/opt/Hiperiso2Disk/bin/ + + +install: install_target FORCE + +uninstall: uninstall_target FORCE + +FORCE: + diff --git a/src/gui/QT/build_output/.qmake.stash b/src/gui/QT/build_output/.qmake.stash new file mode 100644 index 0000000..e4723e0 --- /dev/null +++ b/src/gui/QT/build_output/.qmake.stash @@ -0,0 +1,20 @@ +QMAKE_CXX.QT_COMPILER_STDCXX = 202002L +QMAKE_CXX.QMAKE_GCC_MAJOR_VERSION = 16 +QMAKE_CXX.QMAKE_GCC_MINOR_VERSION = 1 +QMAKE_CXX.QMAKE_GCC_PATCH_VERSION = 1 +QMAKE_CXX.COMPILER_MACROS = \ + QT_COMPILER_STDCXX \ + QMAKE_GCC_MAJOR_VERSION \ + QMAKE_GCC_MINOR_VERSION \ + QMAKE_GCC_PATCH_VERSION +QMAKE_CXX.INCDIRS = \ + /usr/include/c++/16.1.1 \ + /usr/include/c++/16.1.1/x86_64-pc-linux-gnu \ + /usr/include/c++/16.1.1/backward \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include \ + /usr/local/include \ + /usr/include +QMAKE_CXX.LIBDIRS = \ + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 \ + /usr/lib \ + /lib diff --git a/src/gui/QT/build_output/Hiperiso2Disk b/src/gui/QT/build_output/Hiperiso2Disk new file mode 100755 index 0000000000000000000000000000000000000000..fecfb020132834b03fa1d1370694e167a06630f1 GIT binary patch literal 232512 zcmeEvdq7lW`u~8SXxd}MpxZJk3Y7&4c}UDbtlVyZFeu6`7!<2-O9GpxS$3(d z&2GC?yPMmUZf2SaT4HuXyO~`itL=c!%;P2up*jIWgi z>r>Wadu`FGV%Vp4hoY@dSr4&spQ;+@P7D29b+xLu>(A=bss}5mmwL96Pn{O}={DW4 zKCO7dNBp-^i4XZqqB8thpOD2LKJlNCq$-AgW>OjcGWqCmgxgCt+ZXsV`r8)T$SYxBsT1e8H5- zzo{rayP~|RzTxbK^eJagnS4%N^*IxH%tDu?k52!qzbg|Qjw2#S{)xCq{QK0q$?f6gX9(`Y`BkNDK882-%|Hn zp10bx>v5a--(_RBadc$;4L0$7&}JS!j+~6-=g~HK-f0uJ6(>d3bG$P$e~Zny%dnB} zJu{BZ2IvSoBTiCW?#L<#_qpt{CwYLTsPa;jkTGV&Z2&&6dm$+w#~k! zg682!>%|ABM&^IC8FzQs%%6r$zP)C%9{t@Wp4Zy=^Lrcl0-JebBI$`VuU6RPTfa^G z|7;V_Z*AIDY!f%X4gXi0ecHt~{dE!bc%*(Dw8^WZZT8hy*tB=M&A9uW&HT`7v+lfO z(=Wv~`Sh=|l*U)kh& zsm*oYVK(_QpY+pIGvv>2v%Y+1Gyk7z(_hcq%>U1j#YpWcptwaEcW#^ZuCvi|q)mHw z+VrDtleZge`q5_-=X{&%lmXiBMQYdMHtWj*8-9_^dU0xOXO)VY3f>*CtOMw3(NpZQ@Mfj5sbHw6S}pjsKf$_S+k6=95u2<8;AEk>gNcljpD4 z#O-OD`D(X~|J63_J=Z4RGHvoF!DgJ^Ym+AjZ1}}Cc57_r!z*pZ`!Lf|ZeSpJl=Fd-T z?2fQmmyfgQ_g`$r(Qj?yd6kX+BAan~tc@OeL>O^iy1=G?<8AW)LYsd1&?e5?Z1Uk# zn|;npHvO`|#-Dtfb*joHA0D!qXZ~ul&pg~_KDo+fyu3aZ)i%n!3|;;_i3 zU2ART)#*0-+i^DI=olNj@7d_NJUMdyMBB{IZW}%6HvV^z{z&`(V{P`~huP?lvXTG2 z&A7Y7CeALK_&j6N-rH>C>ukp9a+`Rrv6;6|x4ABO(nkL=Hu8_#wD@�)b^2{q3Qv`z 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 +#include "../hiperiso2diskwindow.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'hiperiso2diskwindow.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.15.19. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_MyQThread_t { + QByteArrayData data[5]; + char stringdata0[33]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_MyQThread_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_MyQThread_t qt_meta_stringdata_MyQThread = { + { +QT_MOC_LITERAL(0, 0, 9), // "MyQThread" +QT_MOC_LITERAL(1, 10, 12), // "thread_event" +QT_MOC_LITERAL(2, 23, 0), // "" +QT_MOC_LITERAL(3, 24, 3), // "msg" +QT_MOC_LITERAL(4, 28, 4) // "data" + + }, + "MyQThread\0thread_event\0\0msg\0data" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_MyQThread[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 2, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + + 0 // eod +}; + +void MyQThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + { + using _t = void (MyQThread::*)(int , int ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&MyQThread::thread_event)) { + *result = 0; + return; + } + } + } +} + +QT_INIT_METAOBJECT const QMetaObject MyQThread::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_MyQThread.data, + qt_meta_data_MyQThread, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *MyQThread::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *MyQThread::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_MyQThread.stringdata0)) + return static_cast(this); + return QThread::qt_metacast(_clname); +} + +int MyQThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void MyQThread::thread_event(int _t1, int _t2) +{ + void *_a[] = { nullptr, const_cast(reinterpret_cast(std::addressof(_t1))), const_cast(reinterpret_cast(std::addressof(_t2))) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} +struct qt_meta_stringdata_Hiperiso2DiskWindow_t { + QByteArrayData data[21]; + char stringdata0[439]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_Hiperiso2DiskWindow_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_Hiperiso2DiskWindow_t qt_meta_stringdata_Hiperiso2DiskWindow = { + { +QT_MOC_LITERAL(0, 0, 19), // "Hiperiso2DiskWindow" +QT_MOC_LITERAL(1, 20, 12), // "thread_event" +QT_MOC_LITERAL(2, 33, 0), // "" +QT_MOC_LITERAL(3, 34, 3), // "msg" +QT_MOC_LITERAL(4, 38, 4), // "data" +QT_MOC_LITERAL(5, 43, 23), // "part_style_check_action" +QT_MOC_LITERAL(6, 67, 8), // "QAction*" +QT_MOC_LITERAL(7, 76, 3), // "act" +QT_MOC_LITERAL(8, 80, 17), // "lang_check_action" +QT_MOC_LITERAL(9, 98, 24), // "on_ButtonInstall_clicked" +QT_MOC_LITERAL(10, 123, 23), // "on_ButtonUpdate_clicked" +QT_MOC_LITERAL(11, 147, 24), // "on_ButtonRefresh_clicked" +QT_MOC_LITERAL(12, 172, 37), // "on_comboBoxDevice_currentInde..." +QT_MOC_LITERAL(13, 210, 5), // "index" +QT_MOC_LITERAL(14, 216, 42), // "on_actionPartition_Configurat..." +QT_MOC_LITERAL(15, 259, 33), // "on_actionClear_Hiperiso_trigg..." +QT_MOC_LITERAL(16, 293, 33), // "on_actionShow_All_Devices_tog..." +QT_MOC_LITERAL(17, 327, 4), // "arg1" +QT_MOC_LITERAL(18, 332, 38), // "on_actionSecure_Boot_Support_..." +QT_MOC_LITERAL(19, 371, 42), // "on_actionInstall_Non_Destruct..." +QT_MOC_LITERAL(20, 414, 24) // "on_actionAbout_triggered" + + }, + "Hiperiso2DiskWindow\0thread_event\0\0msg\0" + "data\0part_style_check_action\0QAction*\0" + "act\0lang_check_action\0on_ButtonInstall_clicked\0" + "on_ButtonUpdate_clicked\0" + "on_ButtonRefresh_clicked\0" + "on_comboBoxDevice_currentIndexChanged\0" + "index\0on_actionPartition_Configuration_triggered\0" + "on_actionClear_Hiperiso_triggered\0" + "on_actionShow_All_Devices_toggled\0" + "arg1\0on_actionSecure_Boot_Support_triggered\0" + "on_actionInstall_Non_Destructive_triggered\0" + "on_actionAbout_triggered" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_Hiperiso2DiskWindow[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 13, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 2, 79, 2, 0x08 /* Private */, + 5, 1, 84, 2, 0x08 /* Private */, + 8, 1, 87, 2, 0x08 /* Private */, + 9, 0, 90, 2, 0x08 /* Private */, + 10, 0, 91, 2, 0x08 /* Private */, + 11, 0, 92, 2, 0x08 /* Private */, + 12, 1, 93, 2, 0x08 /* Private */, + 14, 0, 96, 2, 0x08 /* Private */, + 15, 0, 97, 2, 0x08 /* Private */, + 16, 1, 98, 2, 0x08 /* Private */, + 18, 0, 101, 2, 0x08 /* Private */, + 19, 0, 102, 2, 0x08 /* Private */, + 20, 0, 103, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 13, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Bool, 17, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + + 0 // eod +}; + +void Hiperiso2DiskWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + case 1: _t->part_style_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 2: _t->lang_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 3: _t->on_ButtonInstall_clicked(); break; + case 4: _t->on_ButtonUpdate_clicked(); break; + case 5: _t->on_ButtonRefresh_clicked(); break; + case 6: _t->on_comboBoxDevice_currentIndexChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + case 7: _t->on_actionPartition_Configuration_triggered(); break; + case 8: _t->on_actionClear_Hiperiso_triggered(); break; + case 9: _t->on_actionShow_All_Devices_toggled((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 10: _t->on_actionSecure_Boot_Support_triggered(); break; + case 11: _t->on_actionInstall_Non_Destructive_triggered(); break; + case 12: _t->on_actionAbout_triggered(); break; + default: ; + } + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + switch (_id) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 1: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + case 2: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + } + } +} + +QT_INIT_METAOBJECT const QMetaObject Hiperiso2DiskWindow::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_Hiperiso2DiskWindow.data, + qt_meta_data_Hiperiso2DiskWindow, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *Hiperiso2DiskWindow::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *Hiperiso2DiskWindow::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_Hiperiso2DiskWindow.stringdata0)) + return static_cast(this); + return QMainWindow::qt_metacast(_clname); +} + +int Hiperiso2DiskWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QMainWindow::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 13) + qt_static_metacall(this, _c, _id, _a); + _id -= 13; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 13) + qt_static_metacall(this, _c, _id, _a); + _id -= 13; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/src/gui/QT/build_output/moc_partcfgdialog.cpp b/src/gui/QT/build_output/moc_partcfgdialog.cpp new file mode 100644 index 0000000..4d616d3 --- /dev/null +++ b/src/gui/QT/build_output/moc_partcfgdialog.cpp @@ -0,0 +1,129 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'partcfgdialog.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.19) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include +#include "../partcfgdialog.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'partcfgdialog.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.15.19. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_PartCfgDialog_t { + QByteArrayData data[6]; + char stringdata0[97]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_PartCfgDialog_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_PartCfgDialog_t qt_meta_stringdata_PartCfgDialog = { + { +QT_MOC_LITERAL(0, 0, 13), // "PartCfgDialog" +QT_MOC_LITERAL(1, 14, 23), // "on_pushButtonOK_clicked" +QT_MOC_LITERAL(2, 38, 0), // "" +QT_MOC_LITERAL(3, 39, 27), // "on_pushButtonCancel_clicked" +QT_MOC_LITERAL(4, 67, 24), // "on_checkBox_stateChanged" +QT_MOC_LITERAL(5, 92, 4) // "arg1" + + }, + "PartCfgDialog\0on_pushButtonOK_clicked\0" + "\0on_pushButtonCancel_clicked\0" + "on_checkBox_stateChanged\0arg1" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_PartCfgDialog[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 3, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 0, 29, 2, 0x08 /* Private */, + 3, 0, 30, 2, 0x08 /* Private */, + 4, 1, 31, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 5, + + 0 // eod +}; + +void PartCfgDialog::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->on_pushButtonOK_clicked(); break; + case 1: _t->on_pushButtonCancel_clicked(); break; + case 2: _t->on_checkBox_stateChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + default: ; + } + } +} + +QT_INIT_METAOBJECT const QMetaObject PartCfgDialog::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_PartCfgDialog.data, + qt_meta_data_PartCfgDialog, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *PartCfgDialog::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *PartCfgDialog::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_PartCfgDialog.stringdata0)) + return static_cast(this); + return QDialog::qt_metacast(_clname); +} + +int PartCfgDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QDialog::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 3) + qt_static_metacall(this, _c, _id, _a); + _id -= 3; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 3) + *reinterpret_cast(_a[0]) = -1; + _id -= 3; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/src/gui/QT/build_output/moc_predefs.h b/src/gui/QT/build_output/moc_predefs.h new file mode 100644 index 0000000..b38b876 --- /dev/null +++ b/src/gui/QT/build_output/moc_predefs.h @@ -0,0 +1,446 @@ +#define __DBL_MIN_EXP__ (-1021) +#define __LDBL_MANT_DIG__ 64 +#define __UINT_LEAST16_MAX__ 0xffff +#define __FLT16_HAS_QUIET_NAN__ 1 +#define __ATOMIC_ACQUIRE 2 +#define __FLT128_MAX_10_EXP__ 4932 +#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F +#define __GCC_IEC_559_COMPLEX 2 +#define __UINT_LEAST8_TYPE__ unsigned char +#define __SIZEOF_FLOAT80__ 16 +#define __BFLT16_DENORM_MIN__ 9.18354961579912115600575419704879436e-41BF16 +#define __INTMAX_C(c) c ## L +#define __CHAR_BIT__ 8 +#define __UINT8_MAX__ 0xff +#define __SCHAR_WIDTH__ 8 +#define __WINT_MAX__ 0xffffffffU +#define __FLT32_MIN_EXP__ (-125) +#define __cpp_static_assert 200410L +#define __BFLT16_MIN_10_EXP__ (-37) +#define __cpp_inheriting_constructors 201511L +#define __ORDER_LITTLE_ENDIAN__ 1234 +#define __WCHAR_MAX__ 0x7fffffff +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 +#define __GCC_ATOMIC_CHAR_LOCK_FREE 2 +#define __GCC_IEC_559 2 +#define __FLT32X_DECIMAL_DIG__ 17 +#define __FLT_EVAL_METHOD__ 0 +#define __cpp_binary_literals 201304L +#define __FLT64_DECIMAL_DIG__ 17 +#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2 +#define __cpp_variadic_templates 200704L +#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL +#define __SIG_ATOMIC_TYPE__ int +#define __DBL_MIN_10_EXP__ (-307) +#define __FINITE_MATH_ONLY__ 0 +#define __FLT32X_MAX_EXP__ 1024 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 +#define __FLT32_HAS_DENORM__ 1 +#define __UINT_FAST8_MAX__ 0xff +#define __cpp_rvalue_reference 200610L +#define __FLT32_MAX_10_EXP__ 38 +#define __DEC64_MAX_EXP__ 385 +#define __INT8_C(c) c +#define __LDBL_HAS_INFINITY__ 1 +#define __INT_LEAST8_WIDTH__ 8 +#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL +#define __INT_LEAST8_MAX__ 0x7f +#define __cpp_attributes 200809L +#define __SHRT_MAX__ 0x7fff +#define __LDBL_MAX__ 1.18973149535723176502126385303097021e+4932L +#define __FLT64X_MAX_10_EXP__ 4932 +#define __BFLT16_MAX_10_EXP__ 38 +#define __BFLT16_MAX_EXP__ 128 +#define __LDBL_IS_IEC_60559__ 1 +#define __FLT64X_HAS_QUIET_NAN__ 1 +#define __UINT_LEAST8_MAX__ 0xff +#define __GCC_ATOMIC_BOOL_LOCK_FREE 2 +#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128 +#define __UINTMAX_TYPE__ long unsigned int +#define __cpp_nsdmi 200809L +#define __BFLT16_DECIMAL_DIG__ 4 +#define __linux 1 +#define __DEC32_EPSILON__ 1E-6DF +#define __FLT_EVAL_METHOD_TS_18661_3__ 0 +#define __OPTIMIZE__ 1 +#define __UINT32_MAX__ 0xffffffffU +#define __GXX_EXPERIMENTAL_CXX0X__ 1 +#define __DBL_DENORM_MIN__ double(4.94065645841246544176568792868221372e-324L) +#define __FLT128_MIN_EXP__ (-16381) +#define __DEC64X_MAX_EXP__ 6145 +#define __WINT_MIN__ 0U +#define __FLT128_MIN_10_EXP__ (-4931) +#define __FLT32X_IS_IEC_60559__ 1 +#define __INT_LEAST16_WIDTH__ 16 +#define __SCHAR_MAX__ 0x7f +#define __FLT128_MANT_DIG__ 113 +#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) +#define __INT64_C(c) c ## L +#define __SSP_STRONG__ 3 +#define __GCC_ATOMIC_POINTER_LOCK_FREE 2 +#define __ATOMIC_SEQ_CST 5 +#define __unix 1 +#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL +#define __FLT32X_MANT_DIG__ 53 +#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2 +#define __FLT64X_EPSILON__ 1.08420217248550443400745280086994171e-19F64x +#define __STDC_HOSTED__ 1 +#define __DEC64_MIN_EXP__ (-382) +#define __DBL_DIG__ 15 +#define __STDC_EMBED_EMPTY__ 2 +#define __FLT_EPSILON__ 1.19209289550781250000000000000000000e-7F +#define __GXX_WEAK__ 1 +#define __SHRT_WIDTH__ 16 +#define __FLT32_IS_IEC_60559__ 1 +#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L +#define __DBL_IS_IEC_60559__ 1 +#define __DEC32_MAX__ 9.999999E96DF +#define __cpp_threadsafe_static_init 200806L +#define __FLT64X_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951F64x +#define __FLT32X_HAS_INFINITY__ 1 +#define __unix__ 1 +#define __INT_WIDTH__ 32 +#define __STDC_IEC_559__ 1 +#define __STDC_ISO_10646__ 201706L +#define __DECIMAL_DIG__ 21 +#define __STDC_IEC_559_COMPLEX__ 1 +#define __gnu_linux__ 1 +#define __INT16_MAX__ 0x7fff +#define __FLT64_MIN_EXP__ (-1021) +#define __DEC64X_EPSILON__ 1E-33D64x +#define __FLT64X_MIN_10_EXP__ (-4931) +#define __LDBL_HAS_QUIET_NAN__ 1 +#define __FLT16_MIN_EXP__ (-13) +#define __FLT64_MANT_DIG__ 53 +#define __FLT64X_MANT_DIG__ 64 +#define __BFLT16_DIG__ 2 +#define __GNUC__ 16 +#define __GXX_RTTI 1 +#define __pie__ 2 +#define __MMX__ 1 +#define __FLT_HAS_DENORM__ 1 +#define __SIZEOF_LONG_DOUBLE__ 16 +#define __BIGGEST_ALIGNMENT__ 16 +#define __STDC_UTF_16__ 1 +#define __FLT64_MAX_10_EXP__ 308 +#define __BFLT16_IS_IEC_60559__ 0 +#define __FLT16_MAX_10_EXP__ 4 +#define __cpp_delegating_constructors 200604L +#define __DBL_MAX__ double(1.79769313486231570814527423731704357e+308L) +#define __cpp_raw_strings 200710L +#define __INT_FAST32_MAX__ 0x7fffffffffffffffL +#define __DBL_HAS_INFINITY__ 1 +#define __INT64_MAX__ 0x7fffffffffffffffL +#define __SIZEOF_FLOAT__ 4 +#define __HAVE_SPECULATION_SAFE_VALUE 1 +#define __DEC32_MIN_EXP__ (-94) +#define __INTPTR_WIDTH__ 64 +#define __UINT_LEAST32_MAX__ 0xffffffffU +#define __FLT32X_HAS_DENORM__ 1 +#define __INT_FAST16_TYPE__ long int +#define __MMX_WITH_SSE__ 1 +#define __LDBL_HAS_DENORM__ 1 +#define __SEG_GS 1 +#define __BFLT16_EPSILON__ 7.81250000000000000000000000000000000e-3BF16 +#define __cplusplus 201103L +#define __cpp_ref_qualifiers 200710L +#define __DEC32_MIN__ 1E-95DF +#define __DEPRECATED 1 +#define __cpp_rvalue_references 200610L +#define __DBL_MAX_EXP__ 1024 +#define __WCHAR_WIDTH__ 32 +#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32 +#define __DEC128_EPSILON__ 1E-33DL +#define __FLT16_DECIMAL_DIG__ 5 +#define __SSE2_MATH__ 1 +#define __ATOMIC_HLE_RELEASE 131072 +#define __PTRDIFF_MAX__ 0x7fffffffffffffffL +#define __amd64 1 +#define __DEC64X_MAX__ 9.999999999999999999999999999999999E6144D64x +#define __ATOMIC_HLE_ACQUIRE 65536 +#define __GNUG__ 16 +#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL +#define __SIZEOF_SIZE_T__ 8 +#define __BFLT16_HAS_INFINITY__ 1 +#define __FLT64X_MIN_EXP__ (-16381) +#define __SIZEOF_WINT_T__ 4 +#define __FLT32X_DIG__ 15 +#define __LONG_LONG_WIDTH__ 64 +#define __cpp_initializer_lists 200806L +#define __FLT32_MAX_EXP__ 128 +#define __cpp_hex_float 201603L +#define __GXX_ABI_VERSION 1021 +#define __FLT_MIN_EXP__ (-125) +#define __GCC_HAVE_DWARF2_CFI_ASM 1 +#define __x86_64 1 +#define __cpp_lambdas 200907L +#define __INT_FAST64_TYPE__ long int +#define __BFLT16_MAX__ 3.38953138925153547590470800371487867e+38BF16 +#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64 +#define __FLT16_DENORM_MIN__ 5.96046447753906250000000000000000000e-8F16 +#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128 +#define __FLT64X_NORM_MAX__ 1.18973149535723176502126385303097021e+4932F64x +#define __SIZEOF_POINTER__ 8 +#define __SIZE_TYPE__ long unsigned int +#define __LP64__ 1 +#define __DBL_HAS_QUIET_NAN__ 1 +#define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x +#define __LDBL_MAX_EXP__ 16384 +#define __DECIMAL_BID_FORMAT__ 1 +#define __FLT64_MIN_10_EXP__ (-307) +#define __FLT16_MIN_10_EXP__ (-4) +#define __FLT64X_DECIMAL_DIG__ 21 +#define __DEC128_MIN__ 1E-6143DL +#define __REGISTER_PREFIX__ +#define __UINT16_MAX__ 0xffff +#define __FLT128_HAS_INFINITY__ 1 +#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32 +#define __UINT8_TYPE__ unsigned char +#define __FLT_DIG__ 6 +#define __DEC_EVAL_METHOD__ 2 +#define __FLT_MANT_DIG__ 24 +#define __LDBL_DECIMAL_DIG__ 21 +#define __VERSION__ "16.1.1 20260430" +#define __UINT64_C(c) c ## UL +#define __cpp_unicode_characters 200704L +#define __DEC64X_MIN__ 1E-6143D64x +#define _STDC_PREDEF_H 1 +#define __INT_LEAST32_MAX__ 0x7fffffff +#define __GCC_ATOMIC_INT_LOCK_FREE 2 +#define __FLT128_MAX_EXP__ 16384 +#define __FLT32_MANT_DIG__ 24 +#define __cpp_decltype 200707L +#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __FLT32X_MIN_EXP__ (-1021) +#define __STDC_IEC_60559_COMPLEX__ 201404L +#define __BFLT16_MIN__ 1.17549435082228750796873653722224568e-38BF16 +#define __FLT128_HAS_DENORM__ 1 +#define __FLT32_DECIMAL_DIG__ 9 +#define __FLT128_DIG__ 33 +#define __INT32_C(c) c +#define __DEC64_EPSILON__ 1E-15DD +#define __ORDER_PDP_ENDIAN__ 3412 +#define __DEC128_MIN_EXP__ (-6142) +#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL +#define __INT_FAST32_TYPE__ long int +#define __UINT_LEAST16_TYPE__ short unsigned int +#define __DEC64X_MANT_DIG__ 34 +#define __DEC128_MAX_EXP__ 6145 +#define unix 1 +#define __DBL_HAS_DENORM__ 1 +#define __cpp_rtti 199711L +#define __UINT64_MAX__ 0xffffffffffffffffUL +#define __FLT_IS_IEC_60559__ 1 +#define __GNUC_WIDE_EXECUTION_CHARSET_NAME "UTF-32LE" +#define __FLT64X_DIG__ 18 +#define __INT8_TYPE__ signed char +#define __ELF__ 1 +#define __GCC_ASM_FLAG_OUTPUTS__ 1 +#define __UINT32_TYPE__ unsigned int +#define __BFLT16_HAS_QUIET_NAN__ 1 +#define __FLT_RADIX__ 2 +#define __INT_LEAST16_TYPE__ short int +#define __LDBL_EPSILON__ 1.08420217248550443400745280086994171e-19L +#define __UINTMAX_C(c) c ## UL +#define __FLT16_DIG__ 3 +#define __k8 1 +#define __FLT32X_MIN__ 2.22507385850720138309023271733240406e-308F32x +#define __SIG_ATOMIC_MAX__ 0x7fffffff +#define __cpp_constexpr 200704L +#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 +#define __USER_LABEL_PREFIX__ +#define __STDC_IEC_60559_BFP__ 201404L +#define __SIZEOF_PTRDIFF_T__ 8 +#define __FLT64X_HAS_INFINITY__ 1 +#define __SIZEOF_LONG__ 8 +#define __LDBL_DIG__ 18 +#define __FLT64_IS_IEC_60559__ 1 +#define __x86_64__ 1 +#define __FLT16_IS_IEC_60559__ 1 +#define __FLT16_MAX_EXP__ 16 +#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF +#define __STDC_EMBED_FOUND__ 1 +#define __INT_FAST16_MAX__ 0x7fffffffffffffffL +#define __GCC_CONSTRUCTIVE_SIZE 64 +#define __FLT64_DIG__ 15 +#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL +#define __UINT_LEAST64_TYPE__ long unsigned int +#define __FLT16_EPSILON__ 9.76562500000000000000000000000000000e-4F16 +#define __FLT_HAS_QUIET_NAN__ 1 +#define __FLT_MAX_10_EXP__ 38 +#define __FLT64X_HAS_DENORM__ 1 +#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL +#define __FLT_HAS_INFINITY__ 1 +#define __GNUC_EXECUTION_CHARSET_NAME "UTF-8" +#define __cpp_unicode_literals 200710L +#define __UINT_FAST16_TYPE__ long unsigned int +#define __DEC64_MAX__ 9.999999999999999E384DD +#define __STDC_EMBED_NOT_FOUND__ 0 +#define __INT_FAST32_WIDTH__ 64 +#define __CHAR16_TYPE__ short unsigned int +#define __PRAGMA_REDEFINE_EXTNAME 1 +#define __DEC64X_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143D64x +#define __SIZE_WIDTH__ 64 +#define __SEG_FS 1 +#define __INT_LEAST16_MAX__ 0x7fff +#define __FLT16_NORM_MAX__ 6.55040000000000000000000000000000000e+4F16 +#define __DEC64_MANT_DIG__ 16 +#define __FLT32_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F32 +#define __SIG_ATOMIC_WIDTH__ 32 +#define __INT_LEAST64_TYPE__ long int +#define __INT16_TYPE__ short int +#define __INT_LEAST8_TYPE__ signed char +#define __FLT16_MAX__ 6.55040000000000000000000000000000000e+4F16 +#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128 +#define __SIZEOF_INT__ 4 +#define __DEC32_MAX_EXP__ 97 +#define __INT_FAST8_MAX__ 0x7f +#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128 +#define __INTPTR_MAX__ 0x7fffffffffffffffL +#define linux 1 +#define __FLT64_HAS_QUIET_NAN__ 1 +#define __FLT32_MIN_10_EXP__ (-37) +#define __EXCEPTIONS 1 +#define __UINT16_C(c) c +#define __PTRDIFF_WIDTH__ 64 +#define __cpp_range_based_for 200907L +#define __INT_FAST16_WIDTH__ 64 +#define __FLT64_HAS_INFINITY__ 1 +#define __FLT64X_MAX__ 1.18973149535723176502126385303097021e+4932F64x +#define __FLT16_HAS_INFINITY__ 1 +#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) +#define __code_model_small__ 1 +#define __GCC_ATOMIC_LONG_LOCK_FREE 2 +#define __DEC32_MANT_DIG__ 7 +#define __k8__ 1 +#define __INTPTR_TYPE__ long int +#define __UINT16_TYPE__ short unsigned int +#define __WCHAR_TYPE__ int +#define __pic__ 2 +#define __UINTPTR_MAX__ 0xffffffffffffffffUL +#define __INT_FAST64_WIDTH__ 64 +#define __INT_FAST64_MAX__ 0x7fffffffffffffffL +#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 +#define __FLT_NORM_MAX__ 3.40282346638528859811704183484516925e+38F +#define __FLT32_HAS_INFINITY__ 1 +#define __FLT64X_MAX_EXP__ 16384 +#define __UINT_FAST64_TYPE__ long unsigned int +#define __BFLT16_MIN_EXP__ (-125) +#define __INT_MAX__ 0x7fffffff +#define __linux__ 1 +#define __INT64_TYPE__ long int +#define __FLT_MAX_EXP__ 128 +#define __ORDER_BIG_ENDIAN__ 4321 +#define __DBL_MANT_DIG__ 53 +#define __SIZEOF_FLOAT128__ 16 +#define __BFLT16_MANT_DIG__ 8 +#define __DEC64_MIN__ 1E-383DD +#define __WINT_TYPE__ unsigned int +#define __UINT_LEAST32_TYPE__ unsigned int +#define __SIZEOF_SHORT__ 2 +#define __FLT32_NORM_MAX__ 3.40282346638528859811704183484516925e+38F32 +#define __SSE__ 1 +#define __LDBL_MIN_EXP__ (-16381) +#define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64 +#define __DEC64X_MIN_EXP__ (-6142) +#define __amd64__ 1 +#define __WINT_WIDTH__ 32 +#define __INT_LEAST64_WIDTH__ 64 +#define __FLT32X_MAX_10_EXP__ 308 +#define __SIZEOF_INT128__ 16 +#define __FLT16_MIN__ 6.10351562500000000000000000000000000e-5F16 +#define __FLT64X_IS_IEC_60559__ 1 +#define __GXX_CONSTEXPR_ASM__ 1 +#define __LDBL_MAX_10_EXP__ 4932 +#define __ATOMIC_RELAXED 0 +#define __DBL_EPSILON__ double(2.22044604925031308084726333618164062e-16L) +#define __INT_LEAST32_TYPE__ int +#define _LP64 1 +#define __UINT8_C(c) c +#define __FLT64_MAX_EXP__ 1024 +#define __SIZEOF_WCHAR_T__ 4 +#define __GNUC_PATCHLEVEL__ 1 +#define __FLT128_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F128 +#define __FLT64_NORM_MAX__ 1.79769313486231570814527423731704357e+308F64 +#define __FLT128_HAS_QUIET_NAN__ 1 +#define __INTMAX_MAX__ 0x7fffffffffffffffL +#define __INT_FAST8_TYPE__ signed char +#define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x +#define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64 +#define __STDCPP_THREADS__ 1 +#define __BFLT16_HAS_DENORM__ 1 +#define __GNUC_STDC_INLINE__ 1 +#define __FLT64_HAS_DENORM__ 1 +#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32 +#define __FLT16_HAS_DENORM__ 1 +#define __DBL_DECIMAL_DIG__ 17 +#define __STDC_UTF_32__ 1 +#define __INT_FAST8_WIDTH__ 8 +#define __FXSR__ 1 +#define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x +#define __DBL_NORM_MAX__ double(1.79769313486231570814527423731704357e+308L) +#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __GCC_DESTRUCTIVE_SIZE 64 +#define __INTMAX_WIDTH__ 64 +#define __cpp_runtime_arrays 198712L +#define __FLT32_DIG__ 6 +#define __UINT64_TYPE__ long unsigned int +#define __UINT32_C(c) c ## U +#define __cpp_alias_templates 200704L +#define __FLT_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F +#define __FLT128_IS_IEC_60559__ 1 +#define __INT8_MAX__ 0x7f +#define __LONG_WIDTH__ 64 +#define __DBL_MIN__ double(2.22507385850720138309023271733240406e-308L) +#define __PIC__ 2 +#define __INT32_MAX__ 0x7fffffff +#define __UINT_FAST32_TYPE__ long unsigned int +#define __FLT16_MANT_DIG__ 11 +#define __FLT32X_NORM_MAX__ 1.79769313486231570814527423731704357e+308F32x +#define __CHAR32_TYPE__ unsigned int +#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F +#define __SSE2__ 1 +#define __BFLT16_NORM_MAX__ 3.38953138925153547590470800371487867e+38BF16 +#define __INT32_TYPE__ int +#define __SIZEOF_DOUBLE__ 8 +#define __cpp_exceptions 199711L +#define __FLT_MIN_10_EXP__ (-37) +#define __FLT64_MIN__ 2.22507385850720138309023271733240406e-308F64 +#define __INT_LEAST32_WIDTH__ 32 +#define __INTMAX_TYPE__ long int +#define __GLIBCXX_BITSIZE_INT_N_0 128 +#define __FLT32X_HAS_QUIET_NAN__ 1 +#define __ATOMIC_CONSUME 1 +#define __GNUC_MINOR__ 1 +#define __GLIBCXX_TYPE_INT_N_0 __int128 +#define __UINTMAX_MAX__ 0xffffffffffffffffUL +#define __PIE__ 2 +#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x +#define __DBL_MAX_10_EXP__ 308 +#define __LDBL_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951L +#define __INT16_C(c) c +#define __STDC__ 1 +#define __PTRDIFF_TYPE__ long int +#define __LONG_MAX__ 0x7fffffffffffffffL +#define __FLT32X_MIN_10_EXP__ (-307) +#define __UINTPTR_TYPE__ long unsigned int +#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD +#define __DEC128_MANT_DIG__ 34 +#define __LDBL_MIN_10_EXP__ (-4931) +#define __SSE_MATH__ 1 +#define __SIZEOF_LONG_LONG__ 8 +#define __cpp_user_defined_literals 200809L +#define __FLT128_DECIMAL_DIG__ 36 +#define __GCC_ATOMIC_LLONG_LOCK_FREE 2 +#define __FLT32_HAS_QUIET_NAN__ 1 +#define __FLT_DECIMAL_DIG__ 9 +#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL +#define __LDBL_NORM_MAX__ 1.18973149535723176502126385303097021e+4932L +#define __GCC_ATOMIC_SHORT_LOCK_FREE 2 +#define __SIZE_MAX__ 0xffffffffffffffffUL +#define __UINT_FAST8_TYPE__ unsigned char +#define _GNU_SOURCE 1 +#define __ATOMIC_ACQ_REL 4 +#define __ATOMIC_RELEASE 3 diff --git a/src/gui/QT/build_output/ui_hiperiso2diskwindow.h b/src/gui/QT/build_output/ui_hiperiso2diskwindow.h new file mode 100644 index 0000000..a1e493b --- /dev/null +++ b/src/gui/QT/build_output/ui_hiperiso2diskwindow.h @@ -0,0 +1,212 @@ +/******************************************************************************** +** Form generated from reading UI file 'hiperiso2diskwindow.ui' +** +** Created by: Qt User Interface Compiler version 5.15.19 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_HIPERISO2DISKWINDOW_H +#define UI_HIPERISO2DISKWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_Hiperiso2DiskWindow +{ +public: + QAction *actionSecure_Boot_Support; + QAction *actionMBR; + QAction *actionGPT; + QAction *actionPartition_Configuration; + QAction *actionClear_Hiperiso; + QAction *actionShow_All_Devices; + QAction *actionAbout; + QWidget *centralwidget; + QGroupBox *groupBoxDevice; + QComboBox *comboBoxDevice; + QPushButton *ButtonRefresh; + QGroupBox *groupBoxHiperisoLocal; + QLabel *labelHiperisoLocalVer; + QLabel *labelHiperisoLocalPartStyle; + QLabel *labelHiperisoLocalSecure; + QGroupBox *groupBoxHiperisoDevice; + QLabel *labelHiperisoDeviceVer; + QLabel *labelHiperisoDevicePartStyle; + QLabel *labelHiperisoDeviceSecure; + QGroupBox *groupBoxStatus; + QProgressBar *progressBar; + QPushButton *ButtonInstall; + QPushButton *ButtonUpdate; + QMenuBar *menubar; + QMenu *menuOption; + QMenu *menuPartition_Style; + QMenu *menuLanguage; + QMenu *menuHelp; + + void setupUi(QMainWindow *Hiperiso2DiskWindow) + { + if (Hiperiso2DiskWindow->objectName().isEmpty()) + Hiperiso2DiskWindow->setObjectName(QString::fromUtf8("Hiperiso2DiskWindow")); + Hiperiso2DiskWindow->resize(696, 418); + Hiperiso2DiskWindow->setMinimumSize(QSize(696, 418)); + actionSecure_Boot_Support = new QAction(Hiperiso2DiskWindow); + actionSecure_Boot_Support->setObjectName(QString::fromUtf8("actionSecure_Boot_Support")); + actionSecure_Boot_Support->setCheckable(true); + actionMBR = new QAction(Hiperiso2DiskWindow); + actionMBR->setObjectName(QString::fromUtf8("actionMBR")); + actionMBR->setCheckable(true); + actionGPT = new QAction(Hiperiso2DiskWindow); + actionGPT->setObjectName(QString::fromUtf8("actionGPT")); + actionGPT->setCheckable(true); + actionPartition_Configuration = new QAction(Hiperiso2DiskWindow); + actionPartition_Configuration->setObjectName(QString::fromUtf8("actionPartition_Configuration")); + actionClear_Hiperiso = new QAction(Hiperiso2DiskWindow); + actionClear_Hiperiso->setObjectName(QString::fromUtf8("actionClear_Hiperiso")); + actionShow_All_Devices = new QAction(Hiperiso2DiskWindow); + actionShow_All_Devices->setObjectName(QString::fromUtf8("actionShow_All_Devices")); + actionShow_All_Devices->setCheckable(true); + actionAbout = new QAction(Hiperiso2DiskWindow); + actionAbout->setObjectName(QString::fromUtf8("actionAbout")); + centralwidget = new QWidget(Hiperiso2DiskWindow); + centralwidget->setObjectName(QString::fromUtf8("centralwidget")); + groupBoxDevice = new QGroupBox(centralwidget); + groupBoxDevice->setObjectName(QString::fromUtf8("groupBoxDevice")); + groupBoxDevice->setGeometry(QRect(12, 11, 672, 88)); + comboBoxDevice = new QComboBox(groupBoxDevice); + comboBoxDevice->setObjectName(QString::fromUtf8("comboBoxDevice")); + comboBoxDevice->setGeometry(QRect(12, 44, 600, 29)); + ButtonRefresh = new QPushButton(groupBoxDevice); + ButtonRefresh->setObjectName(QString::fromUtf8("ButtonRefresh")); + ButtonRefresh->setGeometry(QRect(624, 41, 36, 33)); + QIcon icon; + icon.addFile(QString::fromUtf8("../refresh.ico"), QSize(), QIcon::Normal, QIcon::Off); + ButtonRefresh->setIcon(icon); + ButtonRefresh->setIconSize(QSize(24, 24)); + groupBoxHiperisoLocal = new QGroupBox(centralwidget); + groupBoxHiperisoLocal->setObjectName(QString::fromUtf8("groupBoxHiperisoLocal")); + groupBoxHiperisoLocal->setGeometry(QRect(12, 110, 330, 88)); + groupBoxHiperisoLocal->setAlignment(Qt::AlignCenter); + labelHiperisoLocalVer = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalVer->setObjectName(QString::fromUtf8("labelHiperisoLocalVer")); + labelHiperisoLocalVer->setGeometry(QRect(36, 33, 240, 45)); + labelHiperisoLocalVer->setAlignment(Qt::AlignCenter); + labelHiperisoLocalPartStyle = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalPartStyle->setObjectName(QString::fromUtf8("labelHiperisoLocalPartStyle")); + labelHiperisoLocalPartStyle->setGeometry(QRect(286, 66, 37, 20)); + labelHiperisoLocalSecure = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalSecure->setObjectName(QString::fromUtf8("labelHiperisoLocalSecure")); + labelHiperisoLocalSecure->setGeometry(QRect(14, 40, 25, 34)); + labelHiperisoLocalSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxHiperisoDevice = new QGroupBox(centralwidget); + groupBoxHiperisoDevice->setObjectName(QString::fromUtf8("groupBoxHiperisoDevice")); + groupBoxHiperisoDevice->setGeometry(QRect(354, 110, 330, 88)); + groupBoxHiperisoDevice->setAlignment(Qt::AlignCenter); + labelHiperisoDeviceVer = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDeviceVer->setObjectName(QString::fromUtf8("labelHiperisoDeviceVer")); + labelHiperisoDeviceVer->setGeometry(QRect(36, 33, 240, 45)); + labelHiperisoDeviceVer->setAlignment(Qt::AlignCenter); + labelHiperisoDevicePartStyle = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDevicePartStyle->setObjectName(QString::fromUtf8("labelHiperisoDevicePartStyle")); + labelHiperisoDevicePartStyle->setGeometry(QRect(286, 66, 37, 20)); + labelHiperisoDeviceSecure = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDeviceSecure->setObjectName(QString::fromUtf8("labelHiperisoDeviceSecure")); + labelHiperisoDeviceSecure->setGeometry(QRect(14, 40, 25, 34)); + labelHiperisoDeviceSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxStatus = new QGroupBox(centralwidget); + groupBoxStatus->setObjectName(QString::fromUtf8("groupBoxStatus")); + groupBoxStatus->setGeometry(QRect(12, 209, 672, 67)); + progressBar = new QProgressBar(groupBoxStatus); + progressBar->setObjectName(QString::fromUtf8("progressBar")); + progressBar->setGeometry(QRect(12, 33, 648, 25)); + progressBar->setValue(0); + progressBar->setTextVisible(true); + ButtonInstall = new QPushButton(centralwidget); + ButtonInstall->setObjectName(QString::fromUtf8("ButtonInstall")); + ButtonInstall->setGeometry(QRect(180, 302, 121, 45)); + ButtonUpdate = new QPushButton(centralwidget); + ButtonUpdate->setObjectName(QString::fromUtf8("ButtonUpdate")); + ButtonUpdate->setGeometry(QRect(396, 302, 121, 45)); + Hiperiso2DiskWindow->setCentralWidget(centralwidget); + menubar = new QMenuBar(Hiperiso2DiskWindow); + menubar->setObjectName(QString::fromUtf8("menubar")); + menubar->setGeometry(QRect(0, 0, 696, 25)); + menuOption = new QMenu(menubar); + menuOption->setObjectName(QString::fromUtf8("menuOption")); + menuPartition_Style = new QMenu(menuOption); + menuPartition_Style->setObjectName(QString::fromUtf8("menuPartition_Style")); + menuLanguage = new QMenu(menubar); + menuLanguage->setObjectName(QString::fromUtf8("menuLanguage")); + menuHelp = new QMenu(menubar); + menuHelp->setObjectName(QString::fromUtf8("menuHelp")); + Hiperiso2DiskWindow->setMenuBar(menubar); + + menubar->addAction(menuOption->menuAction()); + menubar->addAction(menuLanguage->menuAction()); + menubar->addAction(menuHelp->menuAction()); + menuOption->addAction(actionSecure_Boot_Support); + menuOption->addAction(menuPartition_Style->menuAction()); + menuOption->addAction(actionPartition_Configuration); + menuOption->addAction(actionClear_Hiperiso); + menuOption->addAction(actionShow_All_Devices); + menuPartition_Style->addAction(actionMBR); + menuPartition_Style->addAction(actionGPT); + menuHelp->addAction(actionAbout); + + retranslateUi(Hiperiso2DiskWindow); + + QMetaObject::connectSlotsByName(Hiperiso2DiskWindow); + } // setupUi + + void retranslateUi(QMainWindow *Hiperiso2DiskWindow) + { + Hiperiso2DiskWindow->setWindowTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso2Disk", nullptr)); + actionSecure_Boot_Support->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Secure Boot Support", nullptr)); + actionMBR->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "MBR", nullptr)); + actionGPT->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "GPT", nullptr)); + actionPartition_Configuration->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Partition Configuration", nullptr)); + actionClear_Hiperiso->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Clear Hiperiso", nullptr)); + actionShow_All_Devices->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Show All Devices", nullptr)); + actionAbout->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "About", nullptr)); + groupBoxDevice->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Device", nullptr)); + ButtonRefresh->setText(QString()); + groupBoxHiperisoLocal->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso In Package", nullptr)); + labelHiperisoLocalVer->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

1.0.53

", nullptr)); + labelHiperisoLocalPartStyle->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

MBR

", nullptr)); + labelHiperisoLocalSecure->setText(QString()); + groupBoxHiperisoDevice->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso In Device", nullptr)); + labelHiperisoDeviceVer->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

1.0.52

", nullptr)); + labelHiperisoDevicePartStyle->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

GPT

", nullptr)); + labelHiperisoDeviceSecure->setText(QString()); + groupBoxStatus->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Status: READY", nullptr)); + progressBar->setFormat(QCoreApplication::translate("Hiperiso2DiskWindow", "%p%", nullptr)); + ButtonInstall->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Install", nullptr)); + ButtonUpdate->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Update", nullptr)); + menuOption->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Option", nullptr)); + menuPartition_Style->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Partition Style", nullptr)); + menuLanguage->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Language", nullptr)); + menuHelp->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Help", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class Hiperiso2DiskWindow: public Ui_Hiperiso2DiskWindow {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_HIPERISO2DISKWINDOW_H diff --git a/src/gui/QT/build_output/ui_partcfgdialog.h b/src/gui/QT/build_output/ui_partcfgdialog.h new file mode 100644 index 0000000..a328b5d --- /dev/null +++ b/src/gui/QT/build_output/ui_partcfgdialog.h @@ -0,0 +1,146 @@ +/******************************************************************************** +** Form generated from reading UI file 'partcfgdialog.ui' +** +** Created by: Qt User Interface Compiler version 5.15.19 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_PARTCFGDIALOG_H +#define UI_PARTCFGDIALOG_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_PartCfgDialog +{ +public: + QPushButton *pushButtonOK; + QPushButton *pushButtonCancel; + QGroupBox *groupBox; + QCheckBox *checkBox; + QGroupBox *groupBox_2; + QLineEdit *lineEdit; + QGroupBox *groupBox_3; + QComboBox *comboBox; + QGroupBox *groupBox_4; + QCheckBox *checkBox_2; + QGroupBox *groupBox_5; + QLabel *labelFsType; + QComboBox *comboBoxFsType; + QGroupBox *groupBox_6; + QLabel *labelClusterSize; + QLineEdit *lineEditClusterSize; + + void setupUi(QDialog *PartCfgDialog) + { + if (PartCfgDialog->objectName().isEmpty()) + PartCfgDialog->setObjectName(QString::fromUtf8("PartCfgDialog")); + PartCfgDialog->resize(420, 358); + pushButtonOK = new QPushButton(PartCfgDialog); + pushButtonOK->setObjectName(QString::fromUtf8("pushButtonOK")); + pushButtonOK->setGeometry(QRect(90, 310, 90, 30)); + pushButtonCancel = new QPushButton(PartCfgDialog); + pushButtonCancel->setObjectName(QString::fromUtf8("pushButtonCancel")); + pushButtonCancel->setGeometry(QRect(230, 310, 90, 30)); + groupBox = new QGroupBox(PartCfgDialog); + groupBox->setObjectName(QString::fromUtf8("groupBox")); + groupBox->setGeometry(QRect(10, 10, 400, 51)); + checkBox = new QCheckBox(groupBox); + checkBox->setObjectName(QString::fromUtf8("checkBox")); + checkBox->setGeometry(QRect(10, 10, 381, 41)); + checkBox->setAutoRepeatInterval(0); + groupBox_2 = new QGroupBox(PartCfgDialog); + groupBox_2->setObjectName(QString::fromUtf8("groupBox_2")); + groupBox_2->setGeometry(QRect(10, 60, 200, 60)); + lineEdit = new QLineEdit(groupBox_2); + lineEdit->setObjectName(QString::fromUtf8("lineEdit")); + lineEdit->setGeometry(QRect(10, 20, 181, 26)); + lineEdit->setMaxLength(14); + groupBox_3 = new QGroupBox(PartCfgDialog); + groupBox_3->setObjectName(QString::fromUtf8("groupBox_3")); + groupBox_3->setGeometry(QRect(210, 60, 200, 60)); + comboBox = new QComboBox(groupBox_3); + comboBox->addItem(QString()); + comboBox->addItem(QString()); + comboBox->setObjectName(QString::fromUtf8("comboBox")); + comboBox->setGeometry(QRect(10, 20, 181, 26)); + groupBox_4 = new QGroupBox(PartCfgDialog); + groupBox_4->setObjectName(QString::fromUtf8("groupBox_4")); + groupBox_4->setGeometry(QRect(10, 130, 401, 51)); + checkBox_2 = new QCheckBox(groupBox_4); + checkBox_2->setObjectName(QString::fromUtf8("checkBox_2")); + checkBox_2->setGeometry(QRect(10, 18, 381, 24)); + checkBox_2->setChecked(true); + groupBox_5 = new QGroupBox(PartCfgDialog); + groupBox_5->setObjectName(QString::fromUtf8("groupBox_5")); + groupBox_5->setGeometry(QRect(10, 190, 401, 51)); + labelFsType = new QLabel(groupBox_5); + labelFsType->setObjectName(QString::fromUtf8("labelFsType")); + labelFsType->setGeometry(QRect(10, 15, 120, 21)); + comboBoxFsType = new QComboBox(groupBox_5); + comboBoxFsType->addItem(QString()); + comboBoxFsType->addItem(QString()); + comboBoxFsType->setObjectName(QString::fromUtf8("comboBoxFsType")); + comboBoxFsType->setGeometry(QRect(140, 12, 241, 26)); + groupBox_6 = new QGroupBox(PartCfgDialog); + groupBox_6->setObjectName(QString::fromUtf8("groupBox_6")); + groupBox_6->setGeometry(QRect(10, 250, 401, 51)); + labelClusterSize = new QLabel(groupBox_6); + labelClusterSize->setObjectName(QString::fromUtf8("labelClusterSize")); + labelClusterSize->setGeometry(QRect(10, 15, 200, 21)); + lineEditClusterSize = new QLineEdit(groupBox_6); + lineEditClusterSize->setObjectName(QString::fromUtf8("lineEditClusterSize")); + lineEditClusterSize->setGeometry(QRect(220, 12, 161, 26)); + lineEditClusterSize->setMaxLength(10); + + retranslateUi(PartCfgDialog); + + comboBox->setCurrentIndex(1); + comboBoxFsType->setCurrentIndex(0); + + + QMetaObject::connectSlotsByName(PartCfgDialog); + } // setupUi + + void retranslateUi(QDialog *PartCfgDialog) + { + PartCfgDialog->setWindowTitle(QCoreApplication::translate("PartCfgDialog", "Partition Configuration", nullptr)); + pushButtonOK->setText(QCoreApplication::translate("PartCfgDialog", "OK", nullptr)); + pushButtonCancel->setText(QCoreApplication::translate("PartCfgDialog", "Cancel", nullptr)); + groupBox->setTitle(QString()); + checkBox->setText(QCoreApplication::translate("PartCfgDialog", "Preserve some space at the end of the disk", nullptr)); + groupBox_2->setTitle(QString()); + groupBox_3->setTitle(QString()); + comboBox->setItemText(0, QCoreApplication::translate("PartCfgDialog", "MB", nullptr)); + comboBox->setItemText(1, QCoreApplication::translate("PartCfgDialog", "GB", nullptr)); + + groupBox_4->setTitle(QString()); + checkBox_2->setText(QCoreApplication::translate("PartCfgDialog", "Align partitions with 4KB", nullptr)); + groupBox_5->setTitle(QString()); + labelFsType->setText(QCoreApplication::translate("PartCfgDialog", "Filesystem:", nullptr)); + comboBoxFsType->setItemText(0, QCoreApplication::translate("PartCfgDialog", "exFAT", nullptr)); + comboBoxFsType->setItemText(1, QCoreApplication::translate("PartCfgDialog", "NTFS", nullptr)); + + groupBox_6->setTitle(QString()); + labelClusterSize->setText(QCoreApplication::translate("PartCfgDialog", "Cluster Size (sectors):", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class PartCfgDialog: public Ui_PartCfgDialog {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_PARTCFGDIALOG_H diff --git a/src/gui/QT/hiperiso.qss b/src/gui/QT/hiperiso.qss new file mode 100644 index 0000000..c1083cb --- /dev/null +++ b/src/gui/QT/hiperiso.qss @@ -0,0 +1,348 @@ +/* ============================================================ + * hiperiso.qss — Hiperiso2Disk Qt5 stylesheet + * + * NOTE: This file is the canonical reference copy. The exact same + * content is embedded as a raw-string literal in main.cpp so the + * binary is self-contained and needs no external file at runtime. + * Keep the two copies in sync when editing. + * + * Brand accent: #2d8e57 (green) + * ============================================================ */ + +/* ---- Base foreground (font inherited from system) ---- */ +QWidget { + color: #1f2933; +} + +QMainWindow { + background-color: #eef1f5; +} + +/* ---- Group boxes (panels) ---- */ +QGroupBox { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 6px; + margin-top: 14px; + padding: 14px 10px 10px 10px; + font-weight: bold; + color: #2d8e57; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 6px; + background-color: #ffffff; + color: #2d8e57; + font-weight: bold; +} + +/* ---- Combo boxes ---- */ +QComboBox { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 4px 28px 4px 10px; + min-height: 22px; + color: #1f2933; + selection-background-color: #2d8e57; + selection-color: #ffffff; +} + +QComboBox:hover { + border: 1px solid #2d8e57; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 24px; + border-left: 1px solid #d4d7dd; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #f5f6f8; +} + +QComboBox::drop-down:hover { + background-color: #e6efe9; +} + +QComboBox QAbstractItemView { + border: 1px solid #c4c9d2; + border-radius: 4px; + background-color: #ffffff; + selection-background-color: #2d8e57; + selection-color: #ffffff; + outline: none; + padding: 4px; +} + +/* ---- Progress bar ---- */ +QProgressBar { + background-color: #e6e9ee; + border: 1px solid #c4c9d2; + border-radius: 4px; + text-align: center; + color: #ffffff; + font-weight: bold; + min-height: 22px; +} + +QProgressBar::chunk { + background-color: #2d8e57; + border-radius: 3px; +} + +/* ---- Labels ---- */ +QLabel { + color: #1f2933; +} + +QGroupBox QLabel { + background: transparent; +} + +/* ---- Default buttons ---- */ +QPushButton { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 6px 16px; + color: #1f2933; + min-height: 20px; +} + +QPushButton:hover { + background-color: #f0f3f6; + border: 1px solid #2d8e57; + color: #2d8e57; +} + +QPushButton:pressed { + background-color: #e3e8ed; +} + +QPushButton:disabled { + color: #a0a6b0; + background-color: #f2f4f7; + border: 1px solid #dde0e6; +} + +/* ---- Primary brand buttons (Install / Update) ---- */ +QPushButton#ButtonInstall, +QPushButton#ButtonUpdate { + background-color: #2d8e57; + border: 1px solid #256e44; + color: #ffffff; + font-weight: 600; +} + +QPushButton#ButtonInstall:hover, +QPushButton#ButtonUpdate:hover { + background-color: #329f66; + border: 1px solid #256e44; + color: #ffffff; +} + +QPushButton#ButtonInstall:pressed, +QPushButton#ButtonUpdate:pressed { + background-color: #256e44; + color: #ffffff; +} + +QPushButton#ButtonInstall:disabled, +QPushButton#ButtonUpdate:disabled { + background-color: #a9cdb8; + border: 1px solid #94bda3; + color: #f2f7f4; +} + +/* ---- Refresh (icon) button ---- */ +QPushButton#ButtonRefresh { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; +} + +QPushButton#ButtonRefresh:hover { + background-color: #e6efe9; + border: 1px solid #2d8e57; +} + +QPushButton#ButtonRefresh:pressed { + background-color: #d2e4d9; +} + +/* ---- Menu bar & menus ---- */ +QMenuBar { + background-color: #ffffff; + color: #1f2933; + border-bottom: 1px solid #d4d7dd; + padding: 2px; +} + +QMenuBar::item { + background-color: transparent; + padding: 6px 12px; + border-radius: 3px; +} + +QMenuBar::item:selected { + background-color: #e6efe9; + color: #2d8e57; +} + +QMenu { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 4px; + padding: 4px; +} + +QMenu::item { + padding: 6px 24px; + border-radius: 3px; +} + +QMenu::item:selected { + background-color: #2d8e57; + color: #ffffff; +} + +QMenu::separator { + height: 1px; + background: #e3e6eb; + margin: 4px 8px; +} + +/* ---- Scroll bars ---- */ +QScrollBar:vertical { + background: #eef1f5; + width: 10px; + border: none; +} + +QScrollBar::handle:vertical { + background: #c4c9d2; + border-radius: 4px; + min-height: 24px; +} + +QScrollBar::handle:vertical:hover { + background: #2d8e57; +} + +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + height: 0px; +} + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +/* ---- Tooltips ---- */ +QToolTip { + background-color: #1f2933; + color: #ffffff; + border: 1px solid #1f2933; + border-radius: 3px; + padding: 4px 8px; +} + +/* ---- Dialog (PartCfg etc.) ---- */ +QDialog { + background-color: #f5f6f8; +} + +QGroupBox { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 6px; + margin-top: 14px; + padding: 14px 10px 10px 10px; + font-weight: bold; + color: #2d8e57; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 6px; + background-color: #ffffff; + color: #2d8e57; +} + +/* ---- Radio buttons & checkboxes ---- */ +QRadioButton { + spacing: 6px; + color: #1f2933; +} +QRadioButton::indicator { + width: 16px; + height: 16px; + border-radius: 8px; + border: 2px solid #c4c9d2; + background: #ffffff; +} +QRadioButton::indicator:hover { + border: 2px solid #2d8e57; +} +QRadioButton::indicator:checked { + border: 2px solid #2d8e57; + background: qradialgradient(cx:0.5, cy:0.5, radius:0.5, + fx:0.5, fy:0.5, + stop:0 #2d8e57, stop:0.5 #2d8e57, + stop:0.6 transparent, stop:1 transparent); +} + +QCheckBox { + spacing: 6px; + color: #1f2933; +} +QCheckBox::indicator { + width: 16px; + height: 16px; + border-radius: 3px; + border: 2px solid #c4c9d2; + background: #ffffff; +} +QCheckBox::indicator:hover { + border: 2px solid #2d8e57; +} +QCheckBox::indicator:checked { + border: 2px solid #2d8e57; + background: #2d8e57; + image: none; +} + +/* ---- Line edits & spin boxes ---- */ +QLineEdit, QSpinBox { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 4px 8px; + color: #1f2933; + selection-background-color: #2d8e57; + selection-color: #ffffff; +} +QLineEdit:focus, QSpinBox:focus { + border: 1px solid #2d8e57; +} +QSpinBox::up-button, QSpinBox::down-button { + background: #eef1f5; + border: none; + width: 18px; +} +QSpinBox::up-button:hover, QSpinBox::down-button:hover { + background: #d2e4d9; +} + +/* ---- Dialog buttons ---- */ +QDialogButtonBox QPushButton { + min-width: 72px; +} diff --git a/src/gui/QT/hiperiso2diskwindow.cpp b/src/gui/QT/hiperiso2diskwindow.cpp new file mode 100644 index 0000000..7cfcccb --- /dev/null +++ b/src/gui/QT/hiperiso2diskwindow.cpp @@ -0,0 +1,1131 @@ +#include "hiperiso2diskwindow.h" +#include "ui_hiperiso2diskwindow.h" +#include "partcfgdialog.h" + +#include +#include +#include +#include + +extern "C" { +#include "hiperiso_define.h" +#include "hiperiso_util.h" +#include "hiperiso_disk.h" +#include "hiperiso_json.h" +#include "hiperiso_http.h" +#include "hiperiso_qt.h" +} + +MyQThread::MyQThread(QObject *parent) : QThread(parent) +{ + m_index = -1; + m_type = 0; + m_running = false; + m_fs_type = 0; + m_cluster_size = 0; +} + +void MyQThread::install_run() +{ + int ret = 0; + int pos = 0; + int buflen = 0; + int percent = 0; + char buf[1024]; + char dec[64]; + char out[256]; + char disk_name[32]; + hiperiso_disk *cur; + + vlog("install run %d ...\n", m_index); + + cur = g_disk_list + m_index; + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(dec, sizeof(dec), "%llu", (unsigned long long)m_reserve_space); + + buflen = sizeof(buf); + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("method", "install"); + HISO_JSON_FMT_STRN("disk", disk_name); + HISO_JSON_FMT_STRN("reserve_space", dec); + HISO_JSON_FMT_UINT("partstyle", hiperiso_code_get_cur_part_style()); + HISO_JSON_FMT_UINT("secure_boot", m_secureboot); + HISO_JSON_FMT_UINT("align_4kb", m_align4K); + HISO_JSON_FMT_UINT("fs_type", m_fs_type); + HISO_JSON_FMT_UINT("cluster_sectors", m_cluster_size); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler install <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = hiperiso_code_get_percent(); + emit thread_event(THREAD_MSG_PROGRESS_BAR, percent); + msleep(50); + } + + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + emit thread_event(THREAD_MSG_INSTALL_FINISH, ret); + m_running = false; +} + +void MyQThread::update_run() +{ + int ret = 0; + int percent = 0; + char buf[1024]; + char out[256]; + char disk_name[32]; + hiperiso_disk *cur; + + vlog("install run %d ...\n", m_index); + + cur = g_disk_list + m_index; + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(buf, sizeof(buf), "{\"method\":\"update\",\"disk\":\"%s\",\"secure_boot\":%d}", disk_name, m_secureboot); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler update <%s>\n", out); + + if (strstr(out, "success")) + { + while (percent != 100) + { + percent = hiperiso_code_get_percent(); + emit thread_event(THREAD_MSG_PROGRESS_BAR, percent); + msleep(50); + } + + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + emit thread_event(THREAD_MSG_UPDATE_FINISH, ret); + m_running = false; +} + +void MyQThread::install_nondestr_run() +{ + int ret = 0; + char cmd[512]; + char buf[256]; + char disk_name[32]; + hiperiso_disk *cur; + + vlog("non-destructive install run %d ...\n", m_index); + + cur = g_disk_list + m_index; + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(cmd, sizeof(cmd), "echo y | sh ./tool/HiperisoWorker.sh -i -n %s 2>&1", disk_name); + + FILE *fp = popen(cmd, "r"); + if (!fp) + { + emit thread_event(THREAD_MSG_INSTALL_NONDESTR_FINISH, 1); + m_running = false; + return; + } + + while (fgets(buf, sizeof(buf), fp)) + { + vlog("%s", buf); + } + + ret = pclose(fp); + ret = WEXITSTATUS(ret); + + hiperiso_code_refresh_device(); + emit thread_event(THREAD_MSG_INSTALL_NONDESTR_FINISH, ret); + m_running = false; +} + +void MyQThread::run() +{ + if (THREAD_TYPE_INSTALL == m_type) + { + install_run(); + } + else if (THREAD_TYPE_UPDATE == m_type) + { + update_run(); + } + else if (THREAD_TYPE_INSTALL_NONDESTR == m_type) + { + install_nondestr_run(); + } + else + { + + } +} + + +Hiperiso2DiskWindow::Hiperiso2DiskWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::Hiperiso2DiskWindow) +{ + m_partcfg = new PartCfgDialog(); + m_part_group = new QActionGroup(this); + m_lang_group = new QActionGroup(this); + m_thread = new MyQThread(this); + + ui->setupUi(this); + setup_runtime_layout(); + + QAction *actNonDestr = new QAction("Install (Non-Destructive)", this); + actNonDestr->setObjectName("actionInstall_Non_Destructive"); + ui->menuOption->addAction(actNonDestr); + connect(actNonDestr, &QAction::triggered, this, &Hiperiso2DiskWindow::on_actionInstall_Non_Destructive_triggered); +} + +Hiperiso2DiskWindow::~Hiperiso2DiskWindow() +{ + delete m_partcfg; + delete m_part_group; + delete m_lang_group; + delete m_thread; + delete ui; +} + +void Hiperiso2DiskWindow::setup_runtime_layout() +{ + auto *mainLayout = new QVBoxLayout(ui->centralwidget); + mainLayout->setContentsMargins(10, 10, 10, 10); + mainLayout->setSpacing(10); + + auto *deviceLayout = new QHBoxLayout(); + deviceLayout->setContentsMargins(10, 28, 10, 10); + deviceLayout->setSpacing(10); + deviceLayout->addWidget(ui->comboBoxDevice, 1); + deviceLayout->addWidget(ui->ButtonRefresh, 0, Qt::AlignVCenter); + ui->groupBoxDevice->setLayout(deviceLayout); + + auto *localLayout = new QGridLayout(); + localLayout->setContentsMargins(12, 22, 12, 8); + localLayout->setHorizontalSpacing(8); + localLayout->setVerticalSpacing(4); + localLayout->addWidget(ui->labelHiperisoLocalSecure, 0, 0, 2, 1, Qt::AlignLeft | Qt::AlignVCenter); + localLayout->addWidget(ui->labelHiperisoLocalVer, 0, 1, 2, 1, Qt::AlignCenter); + localLayout->addWidget(ui->labelHiperisoLocalPartStyle, 1, 2, 1, 1, Qt::AlignRight | Qt::AlignBottom); + localLayout->setColumnStretch(1, 1); + ui->groupBoxHiperisoLocal->setLayout(localLayout); + + auto *deviceInfoLayout = new QGridLayout(); + deviceInfoLayout->setContentsMargins(12, 22, 12, 8); + deviceInfoLayout->setHorizontalSpacing(8); + deviceInfoLayout->setVerticalSpacing(4); + deviceInfoLayout->addWidget(ui->labelHiperisoDeviceSecure, 0, 0, 2, 1, Qt::AlignLeft | Qt::AlignVCenter); + deviceInfoLayout->addWidget(ui->labelHiperisoDeviceVer, 0, 1, 2, 1, Qt::AlignCenter); + deviceInfoLayout->addWidget(ui->labelHiperisoDevicePartStyle, 1, 2, 1, 1, Qt::AlignRight | Qt::AlignBottom); + deviceInfoLayout->setColumnStretch(1, 1); + ui->groupBoxHiperisoDevice->setLayout(deviceInfoLayout); + + auto *versionsLayout = new QHBoxLayout(); + versionsLayout->setSpacing(10); + versionsLayout->addWidget(ui->groupBoxHiperisoLocal, 1); + versionsLayout->addWidget(ui->groupBoxHiperisoDevice, 1); + + auto *statusLayout = new QVBoxLayout(); + statusLayout->setContentsMargins(10, 24, 10, 8); + statusLayout->addWidget(ui->progressBar); + ui->groupBoxStatus->setLayout(statusLayout); + + auto *buttonLayout = new QHBoxLayout(); + buttonLayout->addStretch(1); + buttonLayout->addWidget(ui->ButtonInstall); + buttonLayout->addSpacing(24); + buttonLayout->addWidget(ui->ButtonUpdate); + buttonLayout->addStretch(1); + + mainLayout->addWidget(ui->groupBoxDevice); + mainLayout->addLayout(versionsLayout); + mainLayout->addWidget(ui->groupBoxStatus); + mainLayout->addSpacing(6); + mainLayout->addLayout(buttonLayout); + mainLayout->addStretch(1); + + ui->labelHiperisoLocalVer->setMinimumHeight(48); + ui->labelHiperisoDeviceVer->setMinimumHeight(48); + ui->ButtonInstall->setMinimumWidth(120); + ui->ButtonUpdate->setMinimumWidth(120); +} + +bool LangCompare(const QString &s1, const QString &s2) +{ + if (true == s1.startsWith("Chinese Simplified") && false == s2.startsWith("Chinese Simplified")) + { + return true; + } + else if (false == s1.startsWith("Chinese Simplified") && true == s2.startsWith("Chinese Simplified")) + { + return false; + } + else + { + return s1 < s2; + } +} + +int Hiperiso2DiskWindow::lang_string(const QString &id, QString &str) +{ + QString cur = hiperiso_code_get_cur_language(); + + for (QJsonArray::iterator p = m_lang_array.begin(); p != m_lang_array.end(); p++) + { + if (p->toObject().value("name") == cur) + { + str = p->toObject().value(id).toString(); + str = str.replace("#@", "\r\n"); + return 0; + } + } + + return 1; +} + +void Hiperiso2DiskWindow::update_ui_language() +{ + QString dev; + QJsonObject obj; + QString cur = hiperiso_code_get_cur_language(); + + for (QJsonArray::iterator p = m_lang_array.begin(); p != m_lang_array.end(); p++) + { + if (p->toObject().value("name") == cur) + { + obj = p->toObject(); + break; + } + } + + ui->menuOption->setTitle(_LANG_STR("STR_MENU_OPTION")); + ui->actionSecure_Boot_Support->setText(_LANG_STR("STR_MENU_SECURE_BOOT")); + ui->menuPartition_Style->setTitle(_LANG_STR("STR_MENU_PART_STYLE")); + ui->actionPartition_Configuration->setText(_LANG_STR("STR_MENU_PART_CFG")); + ui->actionClear_Hiperiso->setText(_LANG_STR("STR_MENU_CLEAR")); + ui->actionShow_All_Devices->setText(_LANG_STR("STR_SHOW_ALL_DEV")); + + QAction *actNonDestr = findChild("actionInstall_Non_Destructive"); + if (actNonDestr) + { + actNonDestr->setText(_LANG_STR("STR_MENU_PART_RESIZE")); + } + + ui->menuHelp->setTitle(_LANG_STR("STR_MENU_HELP")); + ui->actionAbout->setText(_LANG_STR("STR_ABOUT")); + + dev = _LANG_STR("STR_DEVICE"); + if (m_partcfg->reserve) + { + QString str; + str.sprintf(" [ -%lld%s ]", (long long)m_partcfg->resvalue, m_partcfg->unit ? "GB" : "MB"); + ui->groupBoxDevice->setTitle(dev + str); + } + else + { + ui->groupBoxDevice->setTitle(dev); + } + + ui->groupBoxHiperisoLocal->setTitle(_LANG_STR("STR_LOCAL_VER")); + ui->groupBoxHiperisoDevice->setTitle(_LANG_STR("STR_DISK_VER")); + ui->groupBoxStatus->setTitle(_LANG_STR("STR_STATUS")); + ui->ButtonInstall->setText(_LANG_STR("STR_INSTALL")); + ui->ButtonUpdate->setText(_LANG_STR("STR_UPDATE")); + m_partcfg->update_language_ui(obj); + m_partcfg->setWindowTitle(_LANG_STR("STR_MENU_PART_CFG")); +} + +void Hiperiso2DiskWindow::lang_check_action(QAction *act) +{ + hiperiso_code_set_cur_language(act->text().toStdString().c_str()); + update_ui_language(); +} + +void Hiperiso2DiskWindow::LoadLanguages() +{ + QString curlang = hiperiso_code_get_cur_language(); + if (curlang.isEmpty()) + { + QString LANG = qgetenv("LANG"); + if (LANG.startsWith("zh_CN")) + { + hiperiso_code_set_cur_language("Chinese Simplified (简体中文)"); + } + else + { + hiperiso_code_set_cur_language("English (English)"); + } + curlang = hiperiso_code_get_cur_language(); + } + + + QFile inFile("./tool/languages.json"); + if (!inFile.open(QIODevice::ReadOnly|QIODevice::Text)) + { + ui->menuLanguage->setEnabled(false); + return; + } + QByteArray data = inFile.readAll(); + inFile.close(); + + QJsonParseError errorPtr; + QJsonDocument doc = QJsonDocument::fromJson(data, &errorPtr); + if (errorPtr.error != QJsonParseError::NoError || !doc.isArray()) + { + ui->menuLanguage->setEnabled(false); + return; + } + + m_lang_array = doc.array(); + if (m_lang_array.isEmpty()) + { + ui->menuLanguage->setEnabled(false); + return; + } + + QVector List; + for (QJsonArray::iterator p = m_lang_array.begin(); p != m_lang_array.end(); p++) + { + List.push_back(p->toObject().value("name").toString()); + } + + connect(m_lang_group, SIGNAL(triggered(QAction *)), this, SLOT(lang_check_action(QAction *))); + + std::sort(List.begin(), List.end(), LangCompare); + + for (QVector::iterator p = List.begin(); p != List.end(); p++) + { + QAction *action = new QAction(*p, m_lang_group); + action->setCheckable(true); + + if (p->compare(curlang) == 0) + { + action->setChecked(true); + m_lang_group->triggered(action); + } + + ui->menuLanguage->addAction(action); + } + + ui->menuLanguage->setEnabled(true); + + +} + +void Hiperiso2DiskWindow::part_style_check_action(QAction *action) +{ + int style = 0; + + if (action->text() == "MBR") + { + style = 0; + ui->labelHiperisoLocalPartStyle->setText("MBR"); + } + else + { + style = 1; + ui->labelHiperisoLocalPartStyle->setText("GPT"); + } + + if (style != hiperiso_code_get_cur_part_style()) + { + hiperiso_code_set_cur_part_style(style); + } +} + +static hiperiso_disk *select_active_dev(const QString &select, int *activeid) +{ + int i; + int alldev = hiperiso_code_get_cur_show_all(); + hiperiso_disk *cur = NULL; + + /* find the match one */ + if (!select.isEmpty()) + { + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (select.compare(cur->disk_name) == 0) + { + *activeid = i; + return cur; + } + } + } + + /* find the first one that installed with Hiperiso */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (cur->hisodata.hiperiso_valid) + { + *activeid = i; + return cur; + } + } + + /* find the first USB interface device */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + if (cur->type == HISO_DEVICE_USB) + { + *activeid = i; + return cur; + } + } + + /* use the first one */ + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + *activeid = i; + return cur; + } + + return NULL; +} + + +void Hiperiso2DiskWindow::FillDeviceList(const QString &select) +{ + int active; + int count = 0; + int alldev = hiperiso_code_get_cur_show_all(); + hiperiso_disk *cur; + + ui->comboBoxDevice->clear(); + + for (int i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + QString item; + item.sprintf("%s [%s] %s", cur->disk_name, cur->human_readable_size, cur->disk_model); + ui->comboBoxDevice->addItem(item, i); + count++; + } + + cur = select_active_dev(select, &active); + if (cur) + { + vlog("combox count:%d, active:%s id:%d\n", count, cur->disk_name, active); + ui->ButtonInstall->setEnabled(true); + ui->ButtonUpdate->setEnabled(cur->hisodata.hiperiso_valid); + ui->comboBoxDevice->setCurrentIndex(ui->comboBoxDevice->findData(active)); + } + else + { + vlog("combox count:%d, no active id\n", count); + ui->ButtonInstall->setEnabled(false); + ui->ButtonUpdate->setEnabled(false); + } +} + + +void Hiperiso2DiskWindow::OnInitWindow(void) +{ + int len; + const uchar *data; + QIcon icon; + QPixmap pix1; + QPixmap pix2; + char ver[512]; + + ui->labelHiperisoLocalSecure->hide(); + + m_part_group->addAction(ui->actionMBR); + m_part_group->addAction(ui->actionGPT); + connect(m_part_group, SIGNAL(triggered(QAction *)), this, SLOT(part_style_check_action(QAction *))); + + if (hiperiso_code_get_cur_part_style()) + { + ui->actionGPT->setChecked(true); + m_part_group->triggered(ui->actionGPT); + } + else + { + ui->actionMBR->setChecked(true); + m_part_group->triggered(ui->actionMBR); + } + + snprintf(ver, sizeof(ver), VERSION_FMT, hiperiso_get_local_version()); + ui->labelHiperisoLocalVer->setText(QApplication::translate("Hiperiso2DiskWindow", ver, nullptr)); + + LoadLanguages(); + + data = (const uchar *)get_refresh_icon_raw_data(&len); + pix1.loadFromData(data, len); + icon.addPixmap(pix1); + ui->ButtonRefresh->setIcon(icon); + + data = (const uchar *)get_secure_icon_raw_data(&len); + pix2.loadFromData(data, len); + ui->labelHiperisoLocalSecure->setPixmap(pix2); + ui->labelHiperisoDeviceSecure->setPixmap(pix2); + + ui->labelHiperisoDeviceSecure->setHidden(true); + ui->labelHiperisoDeviceVer->setText(""); + ui->labelHiperisoDevicePartStyle->setText(""); + + ui->actionSecure_Boot_Support->trigger(); + + ui->actionShow_All_Devices->setChecked(hiperiso_code_get_cur_show_all()); + + connect(m_thread, &MyQThread::thread_event, this, &Hiperiso2DiskWindow::thread_event); + + FillDeviceList(""); +} + +void Hiperiso2DiskWindow::showEvent(QShowEvent *ev) +{ + QMainWindow::showEvent(ev); + OnInitWindow(); +} + +void Hiperiso2DiskWindow::on_ButtonInstall_clicked() +{ + int index; + quint64 size = 0, space = 0; + hiperiso_disk *cur; + QString title_warn, title_err, msg; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + cur = g_disk_list + index; + + if (cur->is4kn) + { + lang_string("STR_4KN_UNSUPPORTED", msg); + QMessageBox::critical(this, title_err, msg); + return; + } + + if (hiperiso_code_get_cur_part_style() == 0 && cur->size_in_byte > 2199023255552ULL) + { + lang_string("STR_DISK_2TB_MBR_ERROR", msg); + QMessageBox::critical(this, title_err, msg); + return; + } + + if (m_partcfg->reserve) + { + size = cur->size_in_byte / SIZE_1MB; + space = m_partcfg->resvalue; + if (m_partcfg->unit == 1) + { + space = m_partcfg->resvalue * 1024; + } + + if (size <= space || (size - space) <= HISOEFI_PART_BYTES / SIZE_1MB) + { + lang_string("STR_SPACE_VAL_INVALID", msg); + QMessageBox::critical(this, title_err, msg); + vlog("reserved space too big.\n"); + return; + } + } + + lang_string("STR_INSTALL_TIP", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + lang_string("STR_INSTALL_TIP2", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + ui->ButtonRefresh->setEnabled(false); + ui->ButtonInstall->setEnabled(false); + ui->ButtonUpdate->setEnabled(false); + + m_thread->m_type = THREAD_TYPE_INSTALL; + m_thread->m_index = index; + m_thread->m_reserve_space = space * SIZE_1MB; + m_thread->m_secureboot = ui->actionSecure_Boot_Support->isChecked(); + m_thread->m_align4K = m_partcfg->align; + m_thread->m_fs_type = m_partcfg->m_fs_type; + m_thread->m_cluster_size = m_partcfg->m_cluster_size; + m_thread->m_running = true; + + m_thread->start(); +} + +void Hiperiso2DiskWindow::on_ButtonUpdate_clicked() +{ + int index; + hiperiso_disk *cur; + QString title_info, title_warn, title_err, msg; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + lang_string("STR_INFO", title_info); + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + cur = g_disk_list + index; + if (cur->hisodata.hiperiso_valid == 0) + { + vlog("invalid hiperiso version"); + return; + } + + lang_string("STR_UPDATE_TIP", msg); + if (QMessageBox::Yes != QMessageBox::information(this, title_info, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + ui->ButtonRefresh->setEnabled(false); + ui->ButtonInstall->setEnabled(false); + ui->ButtonUpdate->setEnabled(false); + + m_thread->m_type = THREAD_TYPE_UPDATE; + m_thread->m_index = index; + m_thread->m_secureboot = ui->actionSecure_Boot_Support->isChecked(); + + m_thread->m_running = true; + m_thread->start(); +} + +void Hiperiso2DiskWindow::on_ButtonRefresh_clicked() +{ + QString title_warn, msg; + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WARNING", title_warn); + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + hiperiso_code_refresh_device(); + FillDeviceList(""); +} + +void Hiperiso2DiskWindow::on_comboBoxDevice_currentIndexChanged(int index) +{ + char ver[512]; + hiperiso_disk *cur; + + (void) index; + + ui->labelHiperisoDeviceSecure->setHidden(true); + ui->labelHiperisoDeviceVer->setText(""); + ui->labelHiperisoDevicePartStyle->setText(""); + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("invalid combobox index %d\n", index); + return; + } + + cur = g_disk_list + index; + if (cur->hisodata.hiperiso_valid) + { + if (cur->hisodata.secure_boot_flag) + { + ui->labelHiperisoDeviceSecure->setHidden(false); + } + else + { + ui->labelHiperisoDeviceSecure->setHidden(true); + } + + if ((int)(ui->actionSecure_Boot_Support->isChecked()) != cur->hisodata.secure_boot_flag) + { + ui->actionSecure_Boot_Support->trigger(); + } + + snprintf(ver, sizeof(ver), VERSION_FMT, cur->hisodata.hiperiso_ver); + ui->labelHiperisoDeviceVer->setText(QApplication::translate("Hiperiso2DiskWindow", ver, nullptr)); + ui->labelHiperisoDevicePartStyle->setText(cur->hisodata.partition_style ? "GPT" : "MBR"); + } + else + { + if (!(ui->actionSecure_Boot_Support->isChecked())) + { + ui->actionSecure_Boot_Support->trigger(); + } + } +} + +void Hiperiso2DiskWindow::on_actionPartition_Configuration_triggered() +{ + m_partcfg->update_ui_status(); + if (QDialog::Accepted == m_partcfg->exec()) + { + QString str; + QString dev; + lang_string("STR_DEVICE", dev); + + if (m_partcfg->reserve) + { + str.sprintf(" [ -%lld%s ]", (long long)m_partcfg->resvalue, m_partcfg->unit ? "GB" : "MB"); + ui->groupBoxDevice->setTitle(dev + str); + } + else + { + ui->groupBoxDevice->setTitle(dev); + } + } +} + +void Hiperiso2DiskWindow::on_actionClear_Hiperiso_triggered() +{ + int ret; + int index; + hiperiso_disk *cur; + QString title_err, title_warn, title_info, msg; + char disk_name[64]; + char buf[256]; + char out[256]; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + lang_string("STR_INFO", title_info); + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + cur = g_disk_list + index; + + lang_string("STR_INSTALL_TIP", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + lang_string("STR_INSTALL_TIP2", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + snprintf(disk_name, sizeof(disk_name), "%s", cur->disk_name); + snprintf(buf, sizeof(buf), "{\"method\":\"clean\",\"disk\":\"%s\"}", disk_name); + + out[0] = 0; + hiperiso_func_handler(buf, out, sizeof(out)); + vlog("func handler clean <%s>\n", out); + + if (strstr(out, "success")) + { + ret = hiperiso_code_get_result(); + hiperiso_code_refresh_device(); + cur = NULL; + } + else + { + ret = 1; + } + + if (ret == 0) + { + lang_string("STR_CLEAR_SUCCESS", msg); + QMessageBox::information(this, title_info, msg); + } + else + { + lang_string("STR_CLEAR_FAILED", msg); + QMessageBox::critical(this, title_err, msg); + } + + FillDeviceList(disk_name); +} + +void Hiperiso2DiskWindow::on_actionShow_All_Devices_toggled(bool arg1) +{ + hiperiso_code_set_cur_show_all(arg1); + FillDeviceList(""); +} + +void Hiperiso2DiskWindow::on_actionInstall_Non_Destructive_triggered() +{ + int index; + QString title_warn, title_err, msg; + + lang_string("STR_ERROR", title_err); + lang_string("STR_WARNING", title_warn); + + if (m_thread->m_running || hiperiso_code_is_busy()) + { + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title_warn, msg); + return; + } + + index = ui->comboBoxDevice->currentData().toInt(); + if (index < 0 || index >= g_disk_num) + { + vlog("Invalid combobox current index %d\n", index); + return; + } + + lang_string("STR_PART_RESIZE_TIP", msg); + if (QMessageBox::Yes != QMessageBox::warning(this, title_warn, msg, QMessageBox::Yes | QMessageBox::No, QMessageBox::No)) + { + return; + } + + ui->ButtonRefresh->setEnabled(false); + ui->ButtonInstall->setEnabled(false); + ui->ButtonUpdate->setEnabled(false); + + m_thread->m_type = THREAD_TYPE_INSTALL_NONDESTR; + m_thread->m_index = index; + m_thread->m_running = true; + + m_thread->start(); +} + + +void Hiperiso2DiskWindow::closeEvent(QCloseEvent *event) +{ + vlog("On closeEvent ...\n"); + + if (m_thread->m_running) + { + QString title; + QString msg; + + lang_string("STR_WARNING", title); + lang_string("STR_WAIT_PROCESS", msg); + QMessageBox::warning(this, title, msg); + + event->ignore(); + return; + } + + hiperiso_code_save_cfg(); + + event->accept(); +} + +void Hiperiso2DiskWindow::on_actionSecure_Boot_Support_triggered() +{ + ui->labelHiperisoLocalSecure->setHidden(!(ui->actionSecure_Boot_Support->isChecked())); +} + +void Hiperiso2DiskWindow::on_actionAbout_triggered() +{ + QString about = QStringLiteral( + "" + "

Hiperiso2Disk

" + "

Version %1

" + "

A hypervisor-based ISO boot tool with full boot logging.
" + "Powered by KVM/QEMU · Based on the Ventoy project.

" + "

Project page: " + "https://github.com/hiperiso/hiperiso

" + ""); + + about = about.arg(QString::fromUtf8(hiperiso_get_local_version())); + + QMessageBox box(this); + box.setWindowTitle("About Hiperiso"); + box.setIcon(QMessageBox::Information); + box.setTextFormat(Qt::RichText); + box.setText(about); + + for (QObject *child : box.children()) + { + QLabel *label = qobject_cast(child); + if (label) + { + label->setOpenExternalLinks(true); + label->setTextInteractionFlags(Qt::TextBrowserInteraction); + } + } + + box.exec(); +} + +void Hiperiso2DiskWindow::set_percent(int percent) +{ + QString status, radio; + + ui->progressBar->setValue(percent); + + lang_string("STR_STATUS", status); + + if (percent == 0) + { + ui->groupBoxStatus->setTitle(status); + } + else + { + radio.sprintf("%d%%", percent); + ui->groupBoxStatus->setTitle(status + " " + radio); + } +} + +void Hiperiso2DiskWindow::thread_event(int msg, int data) +{ + char disk_name[32]; + QString title_err, title_info, tipmsg; + + if (msg == THREAD_MSG_PROGRESS_BAR) + { + set_percent(data); + } + else if (msg == THREAD_MSG_INSTALL_FINISH) + { + lang_string("STR_ERROR", title_err); + lang_string("STR_INFO", title_info); + + if (data == 0) + { + lang_string("STR_INSTALL_SUCCESS", tipmsg); + QMessageBox::information(this, title_info, tipmsg); + } + else + { + lang_string("STR_INSTALL_FAILED", tipmsg); + QMessageBox::critical(this, title_err, tipmsg); + } + + set_percent(0); + ui->ButtonRefresh->setEnabled(true); + ui->ButtonInstall->setEnabled(true); + ui->ButtonUpdate->setEnabled(true); + + snprintf(disk_name, sizeof(disk_name), "%s", g_disk_list[m_thread->m_index].disk_name); + FillDeviceList(disk_name); + } + else if (msg == THREAD_MSG_UPDATE_FINISH) + { + lang_string("STR_ERROR", title_err); + lang_string("STR_INFO", title_info); + + if (data == 0) + { + lang_string("STR_UPDATE_SUCCESS", tipmsg); + QMessageBox::information(this, title_info, tipmsg); + } + else + { + lang_string("STR_UPDATE_FAILED", tipmsg); + QMessageBox::critical(this, title_err, tipmsg); + } + + set_percent(0); + ui->ButtonRefresh->setEnabled(true); + ui->ButtonInstall->setEnabled(true); + ui->ButtonUpdate->setEnabled(true); + + snprintf(disk_name, sizeof(disk_name), "%s", g_disk_list[m_thread->m_index].disk_name); + FillDeviceList(disk_name); + } + else if (msg == THREAD_MSG_INSTALL_NONDESTR_FINISH) + { + lang_string("STR_ERROR", title_err); + lang_string("STR_INFO", title_info); + + if (data == 0) + { + lang_string("STR_INSTALL_SUCCESS", tipmsg); + QMessageBox::information(this, title_info, tipmsg); + } + else + { + lang_string("STR_INSTALL_FAILED", tipmsg); + QMessageBox::critical(this, title_err, tipmsg); + } + + set_percent(0); + ui->ButtonRefresh->setEnabled(true); + ui->ButtonInstall->setEnabled(true); + ui->ButtonUpdate->setEnabled(true); + + snprintf(disk_name, sizeof(disk_name), "%s", g_disk_list[m_thread->m_index].disk_name); + FillDeviceList(disk_name); + } +} diff --git a/src/gui/QT/hiperiso2diskwindow.h b/src/gui/QT/hiperiso2diskwindow.h new file mode 100644 index 0000000..e0438f3 --- /dev/null +++ b/src/gui/QT/hiperiso2diskwindow.h @@ -0,0 +1,117 @@ +#ifndef HIPERISO2DISKWINDOW_H +#define HIPERISO2DISKWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "partcfgdialog.h" + +QT_BEGIN_NAMESPACE +namespace Ui { class Hiperiso2DiskWindow; } +QT_END_NAMESPACE + +#define THREAD_TYPE_INSTALL 1 +#define THREAD_TYPE_UPDATE 2 +#define THREAD_TYPE_INSTALL_NONDESTR 3 + +#define THREAD_MSG_PROGRESS_BAR 1 +#define THREAD_MSG_INSTALL_FINISH 2 +#define THREAD_MSG_UPDATE_FINISH 3 +#define THREAD_MSG_INSTALL_NONDESTR_FINISH 4 + +class MyQThread : public QThread +{ + Q_OBJECT +public: + quint64 m_reserve_space; + int m_index; + int m_type; + int m_secureboot; + int m_align4K; + int m_fs_type; + int m_cluster_size; + bool m_running; + void install_run(); + void update_run(); + void install_nondestr_run(); + + explicit MyQThread(QObject *parent = nullptr); +protected: + void run(); +signals: + void thread_event(int msg, int data); +public slots: +}; + + +class Hiperiso2DiskWindow : public QMainWindow +{ + Q_OBJECT + +public: + Hiperiso2DiskWindow(QWidget *parent = nullptr); + ~Hiperiso2DiskWindow(); + + QActionGroup *m_part_group; + QActionGroup *m_lang_group; + QJsonArray m_lang_array; + PartCfgDialog *m_partcfg; + MyQThread *m_thread; + + void FillDeviceList(const QString &select); + void OnInitWindow(void); + void LoadLanguages(); + int lang_string(const QString &id, QString &str); + void update_ui_language(); + void set_percent(int percent); + void setup_runtime_layout(); +protected: + void showEvent(QShowEvent *ev); + void closeEvent(QCloseEvent *event); + +private slots: + + void thread_event(int msg, int data); + void part_style_check_action(QAction *act); + void lang_check_action(QAction *act); + + void on_ButtonInstall_clicked(); + + void on_ButtonUpdate_clicked(); + + void on_ButtonRefresh_clicked(); + + void on_comboBoxDevice_currentIndexChanged(int index); + + void on_actionPartition_Configuration_triggered(); + + void on_actionClear_Hiperiso_triggered(); + + void on_actionShow_All_Devices_toggled(bool arg1); + + void on_actionSecure_Boot_Support_triggered(); + + void on_actionInstall_Non_Destructive_triggered(); + + void on_actionAbout_triggered(); + +private: + Ui::Hiperiso2DiskWindow *ui; + + +}; + +#define _LANG_STR(id) obj.value(id).toString() +#define VERSION_FMT "

%s

" + +#endif // HIPERISO2DISKWINDOW_H diff --git a/src/gui/QT/hiperiso2diskwindow.ui b/src/gui/QT/hiperiso2diskwindow.ui new file mode 100644 index 0000000..e0a3e3b --- /dev/null +++ b/src/gui/QT/hiperiso2diskwindow.ui @@ -0,0 +1,341 @@ + + + Hiperiso2DiskWindow + + + + 0 + 0 + 696 + 418 + + + + + 696 + 418 + + + + Hiperiso2Disk + + + + + + 12 + 11 + 672 + 88 + + + + Device + + + + + 12 + 44 + 600 + 29 + + + + + + + 624 + 41 + 36 + 33 + + + + + + + + ../refresh.ico../refresh.ico + + + + 24 + 24 + + + + + + + + 12 + 110 + 330 + 88 + + + + Hiperiso In Package + + + Qt::AlignCenter + + + + + 36 + 33 + 240 + 45 + + + + <html><head/><body><p><span style=" font-size:20pt; font-weight:600; color:#2d8e57;">1.0.53</span></p></body></html> + + + Qt::AlignCenter + + + + + + 286 + 66 + 37 + 20 + + + + <html><head/><body><p>MBR</p></body></html> + + + + + + 14 + 40 + 25 + 34 + + + + + + + ../secure.ico + + + + + + + 354 + 110 + 330 + 88 + + + + Hiperiso In Device + + + Qt::AlignCenter + + + + + 36 + 33 + 240 + 45 + + + + <html><head/><body><p><span style=" font-size:20pt; font-weight:600; color:#2d8e57;">1.0.52</span></p></body></html> + + + Qt::AlignCenter + + + + + + 286 + 66 + 37 + 20 + + + + <html><head/><body><p>GPT</p></body></html> + + + + + + 14 + 40 + 25 + 34 + + + + + + + ../secure.ico + + + + + + + 12 + 209 + 672 + 67 + + + + Status: READY + + + + + 12 + 33 + 648 + 25 + + + + 0 + + + true + + + %p% + + + + + + + 180 + 302 + 121 + 45 + + + + Install + + + + + + 396 + 302 + 121 + 45 + + + + Update + + + + + + + 0 + 0 + 696 + 25 + + + + + Option + + + + Partition Style + + + + + + + + + + + + + Language + + + + + Help + + + + + + + + + + true + + + Secure Boot Support + + + + + true + + + MBR + + + + + true + + + GPT + + + + + Partition Configuration + + + + + Clear Hiperiso + + + + + true + + + Show All Devices + + + + + About + + + + + + diff --git a/src/gui/QT/hiperiso_qt.h b/src/gui/QT/hiperiso_qt.h new file mode 100644 index 0000000..3afb4c6 --- /dev/null +++ b/src/gui/QT/hiperiso_qt.h @@ -0,0 +1,47 @@ +/****************************************************************************** + * hiperiso_qt.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_QT_H__ +#define __HIPERISO_QT_H__ + +int hiperiso_disk_init(void); +void hiperiso_disk_exit(void); +int hiperiso_http_init(void); +void hiperiso_http_exit(void); +int hiperiso_log_init(void); +void hiperiso_log_exit(void); +void *get_refresh_icon_raw_data(int *len); +void *get_secure_icon_raw_data(int *len); +void *get_window_icon_raw_data(int *len); +int hiperiso_func_handler(const char *jsonstr, char *jsonbuf, int buflen); +const char * hiperiso_code_get_cur_language(void); +int hiperiso_code_get_cur_part_style(void); +void hiperiso_code_set_cur_part_style(int style); +int hiperiso_code_get_cur_show_all(void); +void hiperiso_code_set_cur_show_all(int show_all); +void hiperiso_code_set_cur_language(const char *lang); +void hiperiso_code_save_cfg(void); +void hiperiso_code_refresh_device(void); +int hiperiso_code_is_busy(void); +int hiperiso_code_get_percent(void); +int hiperiso_code_get_result(void); + +#endif /* __HIPERISO_QT_H__ */ + + diff --git a/src/gui/QT/hiperiso_qt_stub.c b/src/gui/QT/hiperiso_qt_stub.c new file mode 100644 index 0000000..2e0bcac --- /dev/null +++ b/src/gui/QT/hiperiso_qt_stub.c @@ -0,0 +1,600 @@ +/****************************************************************************** + * hiperiso_qt_stub.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +struct mg_context * +mg_start(const struct mg_callbacks *callbacks, + void *user_data, + const char **options) +{ + (void)callbacks; + (void)user_data; + (void)options; + + return NULL; +} + +void mg_stop(struct mg_context *ctx) +{ + (void)ctx; +} + +int mg_read(struct mg_connection *conn, void *buf, size_t len) +{ + (void)conn; + (void)buf; + (void)len; + return 0; +} + + +const struct mg_request_info * mg_get_request_info(const struct mg_connection *conn) +{ + (void)conn; + return NULL; +} + +int mg_start_thread(mg_thread_func_t func, void *param) +{ + pthread_t thread_id; + pthread_attr_t attr; + int result; + + (void)pthread_attr_init(&attr); + (void)pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + +#if defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) + /* Compile-time option to control stack size, + * e.g. -DUSE_STACK_SIZE=16384 */ + (void)pthread_attr_setstacksize(&attr, USE_STACK_SIZE); +#endif /* defined(USE_STACK_SIZE) && (USE_STACK_SIZE > 1) */ + + result = pthread_create(&thread_id, &attr, func, param); + pthread_attr_destroy(&attr); + + return result; +} + +int mg_printf(struct mg_connection *conn, const char *fmt, ...) +{ + (void)conn; + (void)fmt; + + return 0; +} + +static unsigned char window_icon_hexData[] = { + 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0xAA, 0x69, 0x71, + 0xDE, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xAF, 0xC8, 0x37, 0x05, 0x8A, + 0xE9, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80, + 0x84, 0x00, 0x00, 0xFA, 0x00, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, + 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00, 0x17, 0x70, 0x9C, 0xBA, 0x51, 0x3C, 0x00, 0x00, 0x00, + 0x06, 0x62, 0x4B, 0x47, 0x44, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xA0, 0xBD, 0xA7, 0x93, 0x00, + 0x00, 0x00, 0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xE4, 0x03, 0x17, 0x04, 0x10, 0x05, 0xF6, 0xCE, + 0xA8, 0xC0, 0x00, 0x00, 0x1C, 0x68, 0x49, 0x44, 0x41, 0x54, 0x78, 0xDA, 0xCD, 0x9B, 0x79, 0x94, + 0x1D, 0x57, 0x7D, 0xE7, 0x3F, 0xF7, 0xDE, 0xAA, 0x7A, 0xFB, 0xEB, 0xD7, 0xBB, 0xA4, 0x56, 0xCB, + 0xDA, 0x6C, 0x59, 0xB6, 0x64, 0x83, 0x91, 0x17, 0xBC, 0xE1, 0x0D, 0x2F, 0x04, 0x1B, 0xB0, 0x43, + 0x3C, 0x40, 0x32, 0x43, 0x4E, 0x38, 0x19, 0x87, 0x43, 0x26, 0x03, 0x84, 0x98, 0xC9, 0x1C, 0x98, + 0x93, 0x70, 0x48, 0x72, 0x66, 0x58, 0x86, 0x81, 0x10, 0x0E, 0x06, 0xC6, 0x21, 0xC1, 0x83, 0xC1, + 0x36, 0x18, 0xDB, 0x6C, 0xC6, 0x60, 0xB0, 0x65, 0xBC, 0x1B, 0x5B, 0x8B, 0x6D, 0x59, 0x92, 0xB5, + 0x75, 0x5B, 0x52, 0xAB, 0xD7, 0xB7, 0x56, 0xD5, 0x5D, 0xE6, 0x8F, 0xAA, 0xF7, 0xF4, 0xBA, 0xD5, + 0xF2, 0xC2, 0x92, 0x99, 0x3A, 0xE7, 0xD7, 0xF5, 0x96, 0x7A, 0x75, 0x7F, 0xDF, 0xEF, 0x6F, 0xB9, + 0xBF, 0xFB, 0xBB, 0xD5, 0x82, 0xDF, 0xD1, 0x61, 0x8C, 0x45, 0x7D, 0x70, 0x9A, 0xFD, 0x7F, 0x57, + 0x61, 0x57, 0xD5, 0x31, 0x17, 0x39, 0x9C, 0x83, 0xD8, 0xC1, 0xEF, 0xAF, 0x1A, 0xE6, 0xC9, 0x23, + 0x13, 0x41, 0x55, 0xA3, 0xB4, 0x75, 0xD2, 0x93, 0xB8, 0xBC, 0x27, 0xCC, 0xA6, 0x7E, 0x19, 0xDD, + 0xBA, 0x5B, 0xBB, 0xBC, 0x07, 0x02, 0x28, 0x78, 0x82, 0xD1, 0xA2, 0x60, 0x6D, 0x59, 0x52, 0x8F, + 0x1D, 0xC5, 0x40, 0xFE, 0xD6, 0xF5, 0x14, 0xBF, 0xED, 0x1B, 0x3E, 0xBC, 0x67, 0x92, 0x3C, 0x9A, + 0x03, 0xAE, 0x44, 0x84, 0xC7, 0xDB, 0x56, 0xFA, 0x3C, 0x3A, 0x61, 0x7A, 0x26, 0x43, 0x96, 0x59, + 0xEB, 0xD6, 0x6A, 0xC7, 0x09, 0x16, 0x46, 0x05, 0xF4, 0x03, 0x79, 0x01, 0xBE, 0x03, 0x03, 0x34, + 0x81, 0x19, 0x21, 0x18, 0xF3, 0x05, 0x7B, 0x95, 0x10, 0xBB, 0x8A, 0x3E, 0xFB, 0xCE, 0x1B, 0x56, + 0xD3, 0x77, 0xEC, 0x89, 0x4D, 0x5E, 0x5A, 0xFA, 0x5C, 0x9D, 0x59, 0xF2, 0xAC, 0x72, 0x87, 0x39, + 0x71, 0xD5, 0x09, 0xFF, 0x7F, 0x11, 0xF0, 0xD3, 0x17, 0x67, 0xC9, 0xA1, 0x99, 0xB0, 0x39, 0xBE, + 0x19, 0xE6, 0x78, 0x5F, 0xA1, 0xD1, 0x17, 0x4B, 0xFF, 0x8C, 0x96, 0x11, 0x17, 0x59, 0xC7, 0xD9, + 0xC6, 0xB1, 0xCE, 0x41, 0x9F, 0x14, 0xE4, 0x3C, 0x89, 0x54, 0x02, 0x94, 0x48, 0x14, 0x70, 0x80, + 0x75, 0x60, 0x8E, 0x4A, 0x53, 0xC0, 0x9C, 0x27, 0xD8, 0x2D, 0x04, 0x8F, 0x67, 0x24, 0xF7, 0x07, + 0xE8, 0x47, 0x2E, 0x52, 0xDF, 0x19, 0xBF, 0x3B, 0xBC, 0xD6, 0x55, 0x44, 0xC8, 0x6E, 0xBF, 0xCC, + 0x99, 0xCD, 0x3D, 0x9C, 0xB2, 0x76, 0xD5, 0xFF, 0x5B, 0x02, 0x7E, 0xBE, 0x6B, 0x92, 0x3E, 0xD1, + 0x64, 0x8F, 0xA9, 0x70, 0xF5, 0x89, 0x05, 0xBE, 0xBF, 0xBB, 0xB1, 0xAA, 0xE5, 0xD4, 0xD5, 0x06, + 0xF1, 0x76, 0xE3, 0xC4, 0xEB, 0x8D, 0xA3, 0x22, 0x05, 0xE4, 0x3C, 0x41, 0xD1, 0x83, 0xAC, 0x27, + 0x08, 0x24, 0xC8, 0x14, 0x7C, 0x9B, 0x80, 0x36, 0x09, 0xDA, 0x41, 0x4B, 0x3B, 0xEA, 0x1A, 0x1A, + 0xDA, 0x61, 0x1C, 0x28, 0x41, 0xC3, 0x13, 0xEE, 0x79, 0x0F, 0xEE, 0xC9, 0x48, 0x73, 0xC7, 0x3A, + 0x6F, 0x66, 0xCB, 0x56, 0x3D, 0xA0, 0x4F, 0xC8, 0x69, 0xE6, 0xB4, 0xE4, 0xFC, 0x91, 0xEC, 0xBF, + 0x3D, 0x01, 0x8F, 0xFE, 0x6A, 0x2B, 0xBB, 0x4B, 0xEB, 0xA9, 0x98, 0x39, 0x76, 0xDB, 0x0A, 0xAB, + 0xBC, 0xEA, 0xB2, 0x3A, 0xFE, 0xBB, 0x0D, 0xF2, 0xDF, 0x6B, 0xCB, 0x29, 0x91, 0x75, 0x4A, 0x20, + 0xA8, 0x64, 0x04, 0xBD, 0x19, 0x41, 0xCE, 0x13, 0x2C, 0x16, 0xC1, 0xEE, 0x38, 0x8A, 0x38, 0x20, + 0x34, 0x30, 0x1B, 0x39, 0xA6, 0x42, 0x8B, 0x76, 0x90, 0x91, 0x10, 0x48, 0xF6, 0x79, 0xC2, 0xDD, + 0x9E, 0xF7, 0xF8, 0xCA, 0xE5, 0x37, 0xFB, 0xDB, 0xEF, 0x7B, 0x6F, 0xCC, 0x25, 0xA3, 0x9A, 0xA7, + 0x0E, 0x29, 0xCE, 0x58, 0x92, 0xFB, 0xB7, 0x21, 0xE0, 0x91, 0xFD, 0x73, 0x9C, 0x55, 0xAE, 0xF2, + 0x9D, 0xC3, 0x15, 0x86, 0x5D, 0x35, 0xFB, 0x12, 0xA5, 0xAB, 0x62, 0x27, 0x3F, 0xA8, 0x11, 0xE7, + 0xB6, 0x0C, 0x2A, 0x32, 0x8E, 0x9E, 0x40, 0xB0, 0xAC, 0xA0, 0x28, 0x78, 0xA2, 0x33, 0x8A, 0x7B, + 0x8D, 0xE3, 0xB4, 0x95, 0x0B, 0x8D, 0xE3, 0x50, 0xD3, 0x72, 0xA4, 0x65, 0x51, 0x42, 0x50, 0xF0, + 0xC0, 0x97, 0xE2, 0xD9, 0x8C, 0x74, 0xFF, 0x34, 0x98, 0x71, 0xDF, 0xD8, 0xDF, 0x10, 0x53, 0xEB, + 0x8A, 0x9A, 0x99, 0x58, 0x72, 0xD1, 0x8A, 0xFC, 0xEF, 0x96, 0x80, 0x7B, 0x76, 0xD6, 0xE9, 0x0F, + 0x0C, 0x4F, 0xCD, 0x78, 0xAC, 0xC8, 0x9B, 0xD1, 0xAA, 0x96, 0x1F, 0x8E, 0x91, 0xEF, 0x6D, 0x69, + 0xD7, 0x53, 0xD7, 0x09, 0xC4, 0xD1, 0xA2, 0x62, 0x28, 0x2F, 0x51, 0x42, 0xBC, 0x66, 0xD0, 0xC7, + 0x3F, 0x1C, 0xD3, 0xA1, 0x63, 0x6F, 0xD5, 0x10, 0x19, 0x47, 0xD1, 0x97, 0xE4, 0x7D, 0x11, 0x65, + 0x25, 0xDF, 0xCF, 0x7A, 0x7C, 0xE2, 0xA1, 0xC9, 0xE0, 0xC9, 0x2B, 0x07, 0x1A, 0xB4, 0x2C, 0xBC, + 0x79, 0x55, 0xF1, 0x77, 0x43, 0xC0, 0x3D, 0xCF, 0xCF, 0x90, 0x55, 0xF0, 0xAB, 0x39, 0x9F, 0x35, + 0x25, 0x77, 0x66, 0x4D, 0x8B, 0x7F, 0x88, 0x0C, 0x17, 0xD7, 0x62, 0x27, 0x1A, 0xDA, 0xE1, 0x2B, + 0xC1, 0xEA, 0x1E, 0x45, 0x7F, 0x4E, 0x26, 0xC0, 0x7F, 0x7B, 0xE8, 0x13, 0x65, 0x05, 0xD4, 0x63, + 0xC7, 0xAE, 0x19, 0x43, 0x2D, 0x76, 0xE4, 0x3D, 0x41, 0x29, 0x10, 0xE4, 0x3D, 0xB1, 0xBD, 0xA0, + 0xDC, 0xC7, 0x2E, 0xAC, 0x34, 0xEE, 0x7C, 0x6A, 0xCE, 0x37, 0xA1, 0x15, 0x5C, 0xBE, 0xA6, 0xFC, + 0xDB, 0x25, 0xE0, 0x7B, 0xCF, 0xCD, 0x90, 0x53, 0x8E, 0xB7, 0x6C, 0xAF, 0xF0, 0x8D, 0x75, 0xF5, + 0x37, 0x37, 0x0D, 0x9F, 0x69, 0x6A, 0xB7, 0xA1, 0x1A, 0x39, 0x5A, 0xC6, 0xE1, 0x29, 0xC1, 0x89, + 0x15, 0x8F, 0xFE, 0x9C, 0xE4, 0x77, 0x80, 0xBD, 0x73, 0x48, 0xA0, 0x16, 0x3B, 0x76, 0x4C, 0x6B, + 0xEA, 0xDA, 0x91, 0x51, 0x82, 0x1E, 0x5F, 0x52, 0x0A, 0xC4, 0xE1, 0x82, 0xE7, 0xFE, 0xE6, 0x94, + 0x5C, 0xFD, 0xA6, 0xFD, 0x61, 0x10, 0x87, 0x16, 0xAE, 0x5A, 0x5B, 0xF9, 0xED, 0x10, 0x70, 0xCF, + 0x73, 0x53, 0x64, 0x14, 0xFC, 0x7C, 0xAA, 0xC0, 0x86, 0x52, 0x78, 0x45, 0xC3, 0x88, 0x2F, 0xD4, + 0x22, 0xB7, 0x76, 0x2E, 0xB2, 0xC4, 0xD6, 0x81, 0x10, 0xAC, 0x2C, 0x7B, 0x8C, 0x94, 0xD4, 0xEF, + 0x08, 0xF6, 0x02, 0xA5, 0x05, 0x4C, 0xB5, 0x2C, 0x3B, 0xA6, 0x35, 0xDA, 0x3A, 0x7C, 0x29, 0x28, + 0x07, 0x92, 0xDE, 0xAC, 0x9C, 0x2B, 0x2A, 0xF7, 0xF1, 0x8D, 0xF9, 0xD9, 0x7F, 0xDC, 0xD3, 0xCA, + 0xE9, 0xD8, 0x49, 0xAE, 0x3C, 0xF1, 0xE5, 0x49, 0x78, 0x45, 0x02, 0x7E, 0xB6, 0x65, 0x0F, 0x85, + 0x5C, 0x86, 0x87, 0x66, 0x0A, 0x0C, 0xE7, 0x38, 0xAF, 0x1E, 0xBB, 0x9B, 0x6A, 0x91, 0x5D, 0x3F, + 0x1B, 0x3A, 0x62, 0xE7, 0x70, 0x40, 0x5F, 0xCE, 0x63, 0x5D, 0x9F, 0x8F, 0xFA, 0xED, 0x17, 0x6A, + 0xC7, 0x1C, 0xCE, 0xB9, 0x8E, 0xD2, 0x7B, 0xAB, 0x86, 0x03, 0x55, 0x8D, 0x00, 0x3C, 0x29, 0xE8, + 0xC9, 0x48, 0xFA, 0xB2, 0x72, 0xAA, 0xE8, 0xF1, 0x97, 0xEF, 0x28, 0xEF, 0xBB, 0xF9, 0xFE, 0xFA, + 0x52, 0x67, 0x10, 0x5C, 0xB6, 0xB6, 0xF7, 0xD7, 0x27, 0xC0, 0x39, 0xF8, 0xCA, 0xD3, 0x73, 0xF4, + 0xA8, 0xE8, 0xD4, 0xD9, 0xD8, 0xBB, 0xB9, 0x1A, 0xD9, 0x4D, 0x33, 0x2D, 0x43, 0xEC, 0x12, 0x37, + 0xF7, 0x94, 0xE0, 0xA4, 0xBE, 0x80, 0xBE, 0xAC, 0x24, 0x75, 0x86, 0xDF, 0x00, 0xDD, 0x02, 0x8D, + 0x1C, 0xB8, 0xF6, 0x24, 0xE2, 0xC0, 0x5A, 0x43, 0xD6, 0x4B, 0x94, 0x0A, 0x2D, 0x84, 0x56, 0xF2, + 0xEC, 0x64, 0x4C, 0x33, 0x76, 0x08, 0x01, 0x9E, 0x84, 0xDE, 0xAC, 0xA2, 0x3F, 0xA7, 0xC6, 0xCB, + 0x9E, 0xFD, 0x8F, 0x7B, 0x9B, 0xFE, 0xDD, 0x67, 0x97, 0xE6, 0x88, 0x1B, 0x35, 0x2E, 0x38, 0xED, + 0xC4, 0xD7, 0x4E, 0xC0, 0x37, 0x9F, 0x3C, 0x08, 0x52, 0x92, 0x51, 0xF4, 0x1F, 0x89, 0xBC, 0x2F, + 0x57, 0x43, 0x7B, 0xED, 0x54, 0xD3, 0x10, 0xA6, 0x48, 0x9D, 0x80, 0xBE, 0xAC, 0xE2, 0xA4, 0xBE, + 0x00, 0x29, 0x39, 0xFE, 0xA4, 0xFE, 0x5A, 0x80, 0x2F, 0x76, 0x0F, 0x07, 0xD6, 0x6A, 0x7A, 0x02, + 0x38, 0x7D, 0xB8, 0x40, 0x64, 0x0C, 0x4F, 0xBD, 0x54, 0x25, 0x72, 0x1E, 0xFB, 0xEB, 0x30, 0x56, + 0x35, 0x9D, 0xCB, 0x7D, 0x29, 0x18, 0xC8, 0x4B, 0x06, 0x72, 0xEA, 0xE9, 0x5E, 0xCF, 0xFC, 0x61, + 0x9D, 0xCC, 0xD6, 0xEB, 0x4F, 0x2E, 0x1C, 0xD7, 0x32, 0xC7, 0x55, 0xF5, 0xAE, 0x87, 0xB6, 0x60, + 0x72, 0x15, 0xCE, 0x29, 0x4F, 0xC9, 0x7B, 0xA6, 0x47, 0x6E, 0x9C, 0x0D, 0xED, 0xDF, 0x4E, 0x36, + 0xB4, 0xD7, 0xD0, 0xC9, 0xAF, 0x84, 0x4C, 0x7E, 0xBA, 0xB2, 0x12, 0xB0, 0xA4, 0xE8, 0xFD, 0x06, + 0x66, 0xEF, 0xC2, 0xED, 0x1C, 0xCE, 0x5A, 0x04, 0x0E, 0x87, 0x40, 0xC8, 0x34, 0xA1, 0x9A, 0x98, + 0xC1, 0xBC, 0xE4, 0x75, 0x4B, 0x0B, 0xE4, 0x14, 0x78, 0x4A, 0xB1, 0x7F, 0xA6, 0xC9, 0xD3, 0x2F, + 0x55, 0x99, 0x8C, 0x3C, 0x76, 0xCC, 0x58, 0x8C, 0x13, 0x1D, 0x40, 0x19, 0x4F, 0xB0, 0xA4, 0xE0, + 0x31, 0x90, 0x93, 0xB7, 0x0C, 0xFB, 0xD1, 0x0D, 0x4D, 0x2B, 0xAB, 0x9E, 0x89, 0xB8, 0x72, 0xE3, + 0xC8, 0x31, 0xE3, 0x1E, 0x37, 0x6A, 0xDF, 0xAA, 0x7F, 0xCA, 0x78, 0x5C, 0xE0, 0x47, 0x53, 0x43, + 0x6F, 0xAC, 0x85, 0xF6, 0xFD, 0xD3, 0xF5, 0xD8, 0xAB, 0xB6, 0x34, 0xDA, 0x18, 0x8C, 0xB5, 0x68, + 0x63, 0xC1, 0x39, 0x32, 0x0A, 0xB4, 0x71, 0xC4, 0xDA, 0xFE, 0x46, 0x12, 0x45, 0x31, 0x26, 0x0E, + 0x59, 0x5E, 0x70, 0x9C, 0x36, 0xE8, 0x51, 0x10, 0x21, 0xAD, 0x56, 0x83, 0x28, 0x6C, 0xB2, 0xB4, + 0x20, 0xD8, 0xB4, 0xAC, 0x40, 0xC9, 0x97, 0x6C, 0xDD, 0x77, 0x80, 0x7D, 0x13, 0x47, 0x58, 0x51, + 0xC9, 0xB1, 0x7E, 0x30, 0x4F, 0xC6, 0x85, 0x48, 0x13, 0xA1, 0xB5, 0xC6, 0x18, 0x83, 0x36, 0x86, + 0x46, 0xA8, 0x99, 0xA8, 0x45, 0xCC, 0xB6, 0xEC, 0x3B, 0x26, 0x63, 0x75, 0xFD, 0x77, 0xF4, 0x00, + 0x81, 0x6D, 0xBD, 0x7A, 0x0F, 0xF8, 0xC1, 0x63, 0xDB, 0x99, 0xB2, 0x25, 0xF2, 0x52, 0x17, 0xC7, + 0xE3, 0xDC, 0x57, 0x26, 0x6B, 0xFA, 0xFA, 0x89, 0xBA, 0x26, 0xC6, 0x21, 0xA4, 0x44, 0xC8, 0xA4, + 0xC0, 0xC9, 0xF9, 0x92, 0x93, 0x07, 0x32, 0x04, 0xF2, 0x37, 0x5B, 0x52, 0x58, 0x6B, 0xC8, 0x49, + 0xCD, 0xE9, 0x4B, 0x72, 0xAC, 0xEA, 0xCB, 0xE3, 0x49, 0xC1, 0x74, 0x23, 0xE2, 0xA9, 0x03, 0xD3, + 0x14, 0x32, 0x3E, 0xA7, 0x8F, 0x54, 0x08, 0x54, 0xB2, 0x72, 0x98, 0x6B, 0xB6, 0x70, 0xCE, 0x51, + 0x29, 0xE4, 0x70, 0x08, 0xB6, 0x1F, 0x9C, 0xE5, 0xB6, 0x2D, 0x87, 0x99, 0x8C, 0x33, 0x48, 0xCF, + 0x4F, 0x6D, 0xEA, 0xF0, 0x84, 0x60, 0xB0, 0xE0, 0x31, 0x52, 0xF2, 0x7F, 0x35, 0xE0, 0xC7, 0xD7, + 0xC5, 0x4E, 0xEE, 0x56, 0x71, 0x9D, 0xB7, 0x6F, 0x5A, 0xFD, 0xCA, 0x1E, 0x30, 0x68, 0x27, 0x19, + 0x0B, 0xB3, 0x4C, 0x84, 0xEA, 0xD2, 0x6A, 0x53, 0xBF, 0x65, 0xAA, 0x1E, 0xD2, 0x8C, 0x35, 0xDA, + 0xD8, 0x84, 0x65, 0x9D, 0x88, 0xB3, 0x16, 0x63, 0x1D, 0x91, 0xB1, 0xBF, 0xB6, 0xB4, 0xA2, 0x88, + 0x2C, 0x11, 0x67, 0x2E, 0xCD, 0xB1, 0xBA, 0x37, 0x07, 0xCE, 0x11, 0x6B, 0x43, 0x29, 0x50, 0x9C, + 0x73, 0x42, 0x1F, 0xA7, 0x2D, 0x2D, 0xA3, 0x70, 0x98, 0x74, 0xEC, 0x42, 0xE0, 0x53, 0xCA, 0x66, + 0x98, 0xAB, 0x37, 0xA9, 0x37, 0x5B, 0x9C, 0x3C, 0x54, 0xE2, 0xCC, 0x65, 0x79, 0x6C, 0x73, 0x96, + 0x38, 0x0C, 0xD1, 0x5A, 0xA3, 0xB5, 0x25, 0x8C, 0x0D, 0x93, 0xF5, 0x88, 0x99, 0xA6, 0x3E, 0xBD, + 0xAA, 0xE5, 0xBB, 0xAF, 0x7D, 0xF6, 0x1A, 0xA1, 0xCC, 0xB1, 0x5E, 0x70, 0x8C, 0xE9, 0xA6, 0x1B, + 0x31, 0xF7, 0x3E, 0x77, 0x84, 0xDE, 0x9C, 0x2A, 0x6E, 0x3B, 0x14, 0x7E, 0xFD, 0xE0, 0x5C, 0xF4, + 0x8E, 0x89, 0x5A, 0x8C, 0x41, 0x20, 0x94, 0x48, 0x62, 0x5F, 0x08, 0x1C, 0x82, 0x52, 0x46, 0x72, + 0x62, 0x7F, 0x8E, 0x5F, 0xCF, 0x01, 0x1C, 0xC6, 0x68, 0x7A, 0x7C, 0xC3, 0x79, 0x2B, 0x4A, 0x8C, + 0xF4, 0xE4, 0xB0, 0xCE, 0xE1, 0x52, 0xE9, 0x56, 0x31, 0x36, 0x1A, 0x29, 0x25, 0x9E, 0x94, 0x38, + 0xE7, 0x90, 0x52, 0x72, 0x60, 0x72, 0x8A, 0x17, 0xC6, 0x0E, 0x72, 0xEE, 0x29, 0xEB, 0x90, 0x42, + 0xF0, 0xBD, 0xAD, 0xE3, 0xDC, 0xFF, 0x62, 0x1D, 0x82, 0x22, 0x88, 0xA4, 0x1E, 0x51, 0x02, 0x06, + 0x0B, 0x3E, 0x2B, 0x2B, 0xC1, 0xF6, 0x01, 0x3F, 0xBE, 0x26, 0x76, 0x62, 0x97, 0x98, 0x1D, 0xE3, + 0x0F, 0x2E, 0x3D, 0xFB, 0xF8, 0x1E, 0xD0, 0x9B, 0xBF, 0x86, 0xC3, 0x35, 0xCD, 0x4B, 0x35, 0x73, + 0x66, 0xB5, 0x19, 0x5F, 0x38, 0x53, 0x0D, 0x09, 0x23, 0xDD, 0xB1, 0xBA, 0xD6, 0x36, 0x15, 0x43, + 0x14, 0x1B, 0xC2, 0x58, 0x13, 0xC5, 0xE6, 0x35, 0x8A, 0xA6, 0x15, 0x86, 0xE4, 0x08, 0x39, 0x67, + 0x24, 0xCF, 0xD2, 0x72, 0x06, 0x6D, 0x0C, 0xD6, 0xDA, 0x8E, 0x98, 0xF4, 0xBD, 0xB3, 0x06, 0x09, + 0x34, 0x5A, 0x2D, 0x9A, 0x61, 0x88, 0x73, 0x0E, 0xA3, 0x35, 0x4B, 0x2A, 0x3D, 0xAC, 0x18, 0x1A, + 0x24, 0xD6, 0x1A, 0xE1, 0x2C, 0x67, 0x8E, 0x56, 0x28, 0xAA, 0x98, 0x28, 0x6C, 0xA5, 0x5E, 0x60, + 0x08, 0x63, 0xC3, 0x54, 0x3D, 0x64, 0xBA, 0x19, 0xAF, 0x6B, 0x38, 0xEF, 0xF7, 0x0E, 0xAC, 0x18, + 0x81, 0xB0, 0x3E, 0x0F, 0xEF, 0x31, 0xA5, 0xDB, 0xE3, 0x7B, 0x9F, 0xE0, 0x6D, 0xA7, 0x0D, 0xCA, + 0x5F, 0xBC, 0x30, 0xF5, 0x81, 0xC3, 0x33, 0xAD, 0x4B, 0x27, 0x6B, 0x11, 0xB1, 0x4D, 0x0A, 0x1E, + 0xE7, 0x1C, 0xB6, 0x2D, 0xD6, 0x82, 0x75, 0x94, 0x32, 0x49, 0xCC, 0x69, 0x6B, 0x31, 0xAF, 0x52, + 0xE2, 0x58, 0x93, 0x17, 0x11, 0xE7, 0x9F, 0x50, 0x62, 0xB4, 0x92, 0xEF, 0x58, 0xBE, 0x9B, 0x80, + 0xB6, 0x27, 0xB4, 0xBF, 0x53, 0x42, 0xD2, 0x88, 0x22, 0xAC, 0x73, 0x28, 0x29, 0xB1, 0xC6, 0xD0, + 0x57, 0xCA, 0x03, 0x82, 0x5D, 0x07, 0x8F, 0xD0, 0x88, 0x2D, 0x4F, 0xEE, 0x9D, 0xA2, 0x6E, 0x14, + 0x4E, 0x48, 0xAC, 0x75, 0x29, 0x91, 0x16, 0x4F, 0x08, 0x59, 0x0C, 0x84, 0xBF, 0x7C, 0xF2, 0xC0, + 0x5D, 0x3A, 0xD7, 0xD7, 0x3A, 0xE3, 0xC4, 0xE5, 0xDC, 0xF7, 0x93, 0x9F, 0x00, 0x30, 0x6F, 0xFE, + 0xAA, 0xB6, 0x34, 0x77, 0x3E, 0x7D, 0x88, 0x83, 0x73, 0xE1, 0x92, 0x5A, 0x23, 0xBA, 0x64, 0xA6, + 0x16, 0xD2, 0x0A, 0x63, 0x9C, 0x92, 0x08, 0x27, 0x3B, 0x09, 0xB0, 0x3D, 0xA7, 0x5A, 0x63, 0xA9, + 0xB5, 0x62, 0x8A, 0x19, 0x85, 0x7B, 0x95, 0xC5, 0xBF, 0xB3, 0x86, 0x9C, 0x88, 0x79, 0xE3, 0xCA, + 0x32, 0x2B, 0x2A, 0x39, 0x8C, 0xB5, 0xC9, 0xE7, 0x29, 0x01, 0xC7, 0x86, 0x40, 0x5A, 0xFD, 0x09, + 0x41, 0xDE, 0x0F, 0x68, 0xE9, 0x98, 0x50, 0x08, 0x02, 0x25, 0xA9, 0xB7, 0x22, 0xB6, 0x1F, 0x38, + 0x48, 0x23, 0x76, 0x6C, 0xDE, 0x35, 0xC9, 0x44, 0xCD, 0x21, 0xB2, 0x60, 0xB5, 0x49, 0xA2, 0xDB, + 0x81, 0xC1, 0x31, 0x5D, 0x83, 0x5A, 0x5E, 0xBD, 0x3E, 0xEF, 0xAB, 0x0D, 0xDA, 0x8A, 0x07, 0x97, + 0xAE, 0xDF, 0xD4, 0xB9, 0xF7, 0x3C, 0x02, 0x4A, 0xD9, 0xA5, 0x7C, 0xFE, 0xBE, 0x47, 0x30, 0xC6, + 0x9E, 0x36, 0x5B, 0x0F, 0xD7, 0xD4, 0x1A, 0x21, 0x51, 0x6C, 0x91, 0x4E, 0x21, 0x9C, 0x03, 0xE9, + 0xD2, 0xF9, 0xBF, 0xDD, 0xC7, 0x11, 0xCC, 0xD4, 0x05, 0x81, 0x08, 0x5E, 0xD5, 0xE2, 0xC7, 0x59, + 0x43, 0x40, 0xC4, 0xD9, 0xAB, 0x4B, 0xAC, 0xEE, 0xCF, 0x77, 0x80, 0xB5, 0xDD, 0x5F, 0x00, 0xDA, + 0x18, 0x62, 0xAD, 0xF1, 0x3D, 0x6F, 0x1E, 0x78, 0x21, 0x04, 0xCE, 0x19, 0x7C, 0x21, 0xF0, 0x94, + 0x62, 0xA6, 0xD1, 0xE4, 0xC1, 0x67, 0x77, 0xD3, 0x34, 0x8A, 0xC7, 0xF6, 0xCE, 0xF2, 0x52, 0x1D, + 0xBC, 0x6C, 0x19, 0x61, 0x00, 0x6B, 0x8E, 0xA6, 0x37, 0xE7, 0xA8, 0x3A, 0xCB, 0x6C, 0xC3, 0xEF, + 0xAB, 0x54, 0x32, 0xE7, 0xE9, 0x33, 0x56, 0x3E, 0x68, 0x6F, 0x7F, 0x72, 0x71, 0x02, 0x76, 0x1E, + 0xDE, 0xC3, 0xDA, 0xB5, 0x9F, 0xE6, 0x33, 0xDF, 0x7E, 0xD7, 0x59, 0xD5, 0x7A, 0x58, 0x6A, 0x34, + 0x23, 0x34, 0x02, 0x89, 0x43, 0x38, 0x09, 0x52, 0x22, 0x84, 0x9C, 0xD7, 0xE0, 0x98, 0xAE, 0x59, + 0x8A, 0xBE, 0x40, 0xBD, 0x42, 0x26, 0x74, 0xD6, 0xA2, 0x6C, 0xC4, 0xA6, 0x55, 0x45, 0x4E, 0x19, + 0x2E, 0xE2, 0xAC, 0xE5, 0x70, 0xB5, 0xCE, 0xC1, 0xA9, 0x19, 0x96, 0x0F, 0xF6, 0x91, 0xF5, 0x3C, + 0xF6, 0x1F, 0x99, 0x62, 0xC7, 0xD8, 0x21, 0xF2, 0x19, 0x9F, 0xB3, 0xD7, 0xAD, 0x86, 0x2E, 0xF0, + 0x6D, 0x32, 0xA4, 0x94, 0x60, 0x0C, 0xB3, 0xF5, 0x26, 0xFB, 0xA7, 0x1A, 0xEC, 0x98, 0x74, 0x1C, + 0x6A, 0x2A, 0x94, 0x9F, 0xC7, 0x38, 0x0F, 0x8C, 0x65, 0xDE, 0x5A, 0xD4, 0x39, 0x9A, 0x06, 0x66, + 0x1A, 0xA1, 0x18, 0xCA, 0x8B, 0xB3, 0x46, 0x1E, 0xFE, 0x65, 0xBE, 0xB6, 0x6C, 0x6D, 0x63, 0xD1, + 0x24, 0xB8, 0xEB, 0x50, 0x95, 0xDD, 0xBB, 0x3F, 0x9C, 0x0B, 0xC3, 0xF8, 0xB4, 0x6A, 0xAD, 0x45, + 0x2B, 0x8C, 0x3A, 0x09, 0x25, 0x8E, 0x0D, 0x3A, 0xD6, 0xC9, 0xFB, 0x38, 0x11, 0x13, 0x6B, 0xAA, + 0x8D, 0x88, 0xC9, 0x6A, 0x8B, 0x28, 0xD6, 0x84, 0xD1, 0xF1, 0x24, 0x26, 0x6C, 0x35, 0xD8, 0x30, + 0xE4, 0xF3, 0xFA, 0x91, 0x12, 0xCE, 0x59, 0xB4, 0xB5, 0xFC, 0xEC, 0x99, 0xE7, 0xF8, 0x97, 0xFB, + 0x1F, 0xE7, 0xB1, 0x1D, 0xFB, 0x88, 0xB4, 0xE6, 0xBE, 0x67, 0x76, 0x72, 0xFF, 0x73, 0x63, 0x84, + 0x5A, 0xE0, 0x8C, 0xC1, 0xA6, 0x9E, 0x91, 0xE8, 0xA0, 0x3B, 0x7A, 0x5A, 0x6B, 0x29, 0xE7, 0x72, + 0x28, 0x95, 0xE1, 0x70, 0x55, 0x63, 0x45, 0x06, 0xE3, 0x64, 0x92, 0x9C, 0xDB, 0x7A, 0xB6, 0x45, + 0x27, 0x3A, 0xCC, 0xD5, 0x43, 0x42, 0xED, 0x4E, 0xCE, 0x0D, 0xAD, 0xEE, 0x0F, 0xCA, 0x83, 0x8B, + 0x7B, 0xC0, 0xBE, 0x23, 0x75, 0xE6, 0x9A, 0x71, 0xB9, 0xDE, 0x8C, 0x56, 0xD7, 0x9B, 0x11, 0x51, + 0xAC, 0xC1, 0x3A, 0xA4, 0x73, 0x08, 0xA5, 0x40, 0x0A, 0x84, 0xB4, 0x2C, 0x9C, 0x3D, 0x27, 0xE6, + 0x42, 0x3C, 0x01, 0xFE, 0x22, 0xCB, 0x41, 0xE7, 0x1C, 0x56, 0x87, 0x6C, 0x18, 0xF6, 0x39, 0x6F, + 0x55, 0x05, 0x81, 0xC3, 0x68, 0x8B, 0x13, 0x82, 0x6C, 0x90, 0x65, 0xC3, 0xAA, 0x13, 0x58, 0xBD, + 0x64, 0x80, 0x83, 0x33, 0x55, 0x7C, 0x3F, 0xE0, 0xCC, 0xB5, 0x2B, 0x58, 0xD6, 0x57, 0xC6, 0xA4, + 0x6E, 0xEC, 0x52, 0xE0, 0x5E, 0x1A, 0x12, 0x52, 0x0A, 0x0E, 0x4C, 0x4E, 0xF3, 0xC4, 0xCE, 0xFD, + 0xBC, 0xFE, 0x84, 0x11, 0x9E, 0x3A, 0xD0, 0xE0, 0x70, 0x2B, 0x46, 0xFA, 0x92, 0x45, 0xEB, 0xBA, + 0x34, 0xA7, 0xD4, 0x9A, 0x50, 0x6F, 0xC5, 0x4B, 0xAC, 0x63, 0xD4, 0x58, 0xB7, 0x3F, 0xD2, 0x86, + 0xC0, 0x53, 0xF3, 0x09, 0x68, 0x45, 0x31, 0x51, 0x20, 0x07, 0xEA, 0xAD, 0x78, 0xB8, 0xD1, 0x8C, + 0x88, 0x63, 0x8D, 0x74, 0x0E, 0x9B, 0xDE, 0xA8, 0x93, 0x04, 0x17, 0x0C, 0xA4, 0xB5, 0xE1, 0xB0, + 0x70, 0x0C, 0x14, 0x03, 0x04, 0xDD, 0x6D, 0x30, 0x87, 0xD1, 0x11, 0xAB, 0x7A, 0x04, 0x97, 0xAC, + 0xED, 0xC5, 0x17, 0x0E, 0xAD, 0x93, 0xE5, 0xAB, 0x76, 0x50, 0xCC, 0x7A, 0x5C, 0xBC, 0x71, 0x2D, + 0x47, 0xE6, 0x6A, 0xFC, 0x62, 0xEB, 0x6E, 0xCE, 0x5D, 0xB7, 0x92, 0x91, 0x4A, 0x21, 0x99, 0x51, + 0x8C, 0xED, 0xB8, 0xBC, 0x52, 0xAA, 0x13, 0x0A, 0x5B, 0x5F, 0x1C, 0xE3, 0xD1, 0x1D, 0xBB, 0x39, + 0xFF, 0xD4, 0x93, 0x18, 0x1D, 0x2A, 0x53, 0x50, 0x86, 0x28, 0x6C, 0xE1, 0x09, 0x6F, 0x71, 0x02, + 0x70, 0x38, 0xEB, 0x68, 0x86, 0x8E, 0x46, 0x18, 0xE7, 0x6B, 0xAD, 0x68, 0xB4, 0x15, 0xE9, 0x4E, + 0xD2, 0x9E, 0x47, 0x80, 0xB3, 0x0E, 0x9C, 0x1B, 0x6C, 0x85, 0x51, 0x3E, 0x0C, 0x23, 0x74, 0x6C, + 0x69, 0xF3, 0x2A, 0x9C, 0x4A, 0x92, 0xA0, 0x68, 0xCF, 0x02, 0xF3, 0xD3, 0xDE, 0x74, 0xD5, 0x60, + 0x8D, 0xA5, 0x27, 0xE7, 0xA7, 0x39, 0xD2, 0x61, 0x4D, 0xCC, 0x70, 0xCE, 0x72, 0xF9, 0xBA, 0x61, + 0x8A, 0x3E, 0x44, 0x71, 0xDC, 0x89, 0x67, 0x84, 0xC0, 0x13, 0x82, 0xF1, 0xA9, 0x59, 0x1E, 0x7A, + 0x76, 0x37, 0x67, 0x9D, 0x74, 0x02, 0x4B, 0x7A, 0x0A, 0x84, 0x5A, 0x23, 0x21, 0x99, 0xEE, 0x94, + 0x42, 0x4A, 0x89, 0x94, 0x02, 0x63, 0x2D, 0x0F, 0x6C, 0xDD, 0xC1, 0xF6, 0x7D, 0x2F, 0x71, 0xF9, + 0x1B, 0x36, 0xB0, 0x7A, 0xA8, 0x97, 0xF1, 0xD9, 0x1A, 0x47, 0x66, 0xAB, 0x18, 0x53, 0x80, 0xD8, + 0x2C, 0xA2, 0x97, 0xE8, 0x10, 0xD0, 0xC2, 0xD2, 0x0C, 0x75, 0x50, 0x6F, 0xE9, 0xC1, 0xBD, 0x13, + 0xB5, 0xCE, 0xE2, 0x70, 0x1E, 0x01, 0x49, 0xB9, 0xE9, 0x7A, 0x1A, 0xCD, 0xD8, 0x8F, 0xA2, 0x18, + 0x6D, 0xDC, 0xD1, 0xFE, 0xBD, 0x03, 0xA4, 0x4D, 0x93, 0xE0, 0xD1, 0x59, 0xA0, 0x9B, 0xE9, 0xC9, + 0xAA, 0x49, 0xCA, 0xD8, 0xAC, 0x87, 0xB3, 0x9A, 0xA2, 0x8C, 0xB8, 0xFC, 0xA4, 0x41, 0x86, 0xF2, + 0x8A, 0x28, 0xD6, 0x1D, 0xF0, 0xD6, 0x5A, 0x02, 0xDF, 0xA3, 0x11, 0xC5, 0xDC, 0xFD, 0xE8, 0x36, + 0xAE, 0xDA, 0x74, 0x2A, 0xFD, 0xA5, 0x1C, 0x5F, 0xFA, 0xE1, 0x66, 0x7A, 0xF3, 0x19, 0xAE, 0x3D, + 0xF7, 0x74, 0x02, 0xA5, 0x10, 0x29, 0xF8, 0x7A, 0x2B, 0xE2, 0x07, 0x8F, 0x6D, 0xE1, 0xF0, 0x4C, + 0x8D, 0xB7, 0x9D, 0xFB, 0x3A, 0x46, 0xFA, 0xCA, 0xEC, 0x99, 0x98, 0xE5, 0xAB, 0x3F, 0x7D, 0x9A, + 0xF1, 0x19, 0x8D, 0xCC, 0x95, 0x70, 0xC6, 0x1C, 0xA3, 0x4F, 0x32, 0x15, 0x3A, 0x9C, 0xB3, 0xC4, + 0x56, 0xD0, 0x0A, 0x63, 0xA9, 0xB5, 0xE9, 0xFD, 0xFB, 0x3B, 0xB7, 0xF2, 0xD7, 0xD7, 0x9C, 0x7A, + 0x2C, 0x01, 0x61, 0xA4, 0xD1, 0xC6, 0x64, 0xA7, 0xE7, 0x1A, 0xAA, 0x5E, 0x6F, 0xE1, 0x94, 0x4A, + 0x3C, 0xC0, 0x81, 0xB0, 0x0E, 0x94, 0x44, 0x08, 0x97, 0x8E, 0xB3, 0xB8, 0xBB, 0x4D, 0x6A, 0x4D, + 0xA3, 0x29, 0xE8, 0xCD, 0x68, 0x2E, 0xDE, 0xD8, 0xC7, 0xEA, 0xFE, 0x0C, 0xB1, 0x8E, 0x3B, 0xD7, + 0x0B, 0x21, 0xF0, 0x3C, 0x45, 0x23, 0xB6, 0x6C, 0xD9, 0x73, 0x08, 0x27, 0x3D, 0xEA, 0x51, 0xCC, + 0xB6, 0xAD, 0xE3, 0x4C, 0xD7, 0x22, 0x7A, 0x8B, 0x05, 0x3C, 0xCF, 0x47, 0x4A, 0x81, 0x92, 0x92, + 0xC3, 0xB3, 0x55, 0x6E, 0x7F, 0xE0, 0x71, 0x10, 0x8A, 0x3F, 0xB8, 0xF0, 0x0D, 0xF4, 0x17, 0xF3, + 0x3C, 0xB1, 0x73, 0x8C, 0xAF, 0xFD, 0xF4, 0x57, 0xEC, 0x99, 0x15, 0xF8, 0x85, 0x41, 0x9C, 0x93, + 0xA0, 0xCD, 0x22, 0x3A, 0x25, 0x5D, 0x1B, 0xE7, 0x2C, 0x42, 0xC0, 0x6C, 0x3D, 0xA4, 0x15, 0xE9, + 0x7C, 0xF4, 0xF5, 0x2F, 0xE3, 0xBE, 0x7A, 0xFD, 0xB1, 0x04, 0xE0, 0x2C, 0x38, 0x27, 0xC3, 0x48, + 0x73, 0x64, 0xA6, 0x4E, 0xA1, 0x90, 0x21, 0x48, 0xEF, 0x23, 0xAC, 0x43, 0xD8, 0xA4, 0x18, 0x7A, + 0xB9, 0xB6, 0x8F, 0x73, 0x96, 0xA8, 0xDE, 0xE4, 0xE2, 0x0D, 0x15, 0x36, 0xAD, 0x28, 0xA7, 0x45, + 0xCD, 0x51, 0xF0, 0x8D, 0x48, 0xF3, 0xE3, 0x87, 0xB7, 0x70, 0x70, 0xAE, 0xC5, 0x29, 0x2B, 0x47, + 0x58, 0xB3, 0x74, 0x80, 0x6A, 0xA3, 0xC9, 0x8A, 0xC1, 0x5E, 0xCE, 0x3B, 0x65, 0x35, 0xF9, 0xC0, + 0x43, 0x09, 0x90, 0x42, 0xB0, 0x63, 0xEC, 0x10, 0xB7, 0xFE, 0xEC, 0x51, 0x46, 0x06, 0xFB, 0xB8, + 0xEE, 0xFC, 0x33, 0x08, 0x3C, 0xC9, 0x77, 0x1F, 0xDE, 0xCA, 0x37, 0x1F, 0x7A, 0x9E, 0x19, 0x93, + 0xC7, 0xCF, 0xF7, 0x63, 0x44, 0x90, 0xEC, 0xA7, 0x61, 0x8E, 0xA7, 0x10, 0xCE, 0x5A, 0xEA, 0xA1, + 0xA6, 0x9A, 0xF7, 0xB0, 0xCE, 0x49, 0xD8, 0xDF, 0x89, 0x14, 0x6F, 0xE1, 0xC5, 0x02, 0x17, 0x49, + 0x9C, 0x0D, 0xC3, 0x88, 0x56, 0x6C, 0xE8, 0xED, 0x15, 0xF8, 0x90, 0x14, 0x42, 0x4E, 0x21, 0xE4, + 0xCB, 0xF4, 0xBD, 0x9C, 0xC5, 0xC4, 0x2D, 0xCE, 0x5D, 0x99, 0xE3, 0x9A, 0xD7, 0x2D, 0x45, 0x89, + 0x24, 0x61, 0x4A, 0x29, 0x13, 0xCB, 0x2B, 0xC5, 0x0B, 0x2F, 0x1D, 0xE1, 0xAE, 0x47, 0xB6, 0x93, + 0x2F, 0xF4, 0xF0, 0xEE, 0x8B, 0xCF, 0x66, 0x49, 0xC9, 0xC7, 0x51, 0x42, 0x2A, 0xD5, 0xF1, 0x5A, + 0x21, 0x24, 0x9B, 0xB7, 0xEE, 0xE0, 0xB6, 0x5F, 0x3C, 0xCE, 0xB9, 0xA7, 0x9E, 0xC4, 0x35, 0x6F, + 0x3C, 0x8D, 0xD9, 0x7A, 0x93, 0xAF, 0xFC, 0xE8, 0x49, 0xEE, 0xDD, 0x32, 0x86, 0x0E, 0xFA, 0xF0, + 0xB2, 0x3D, 0x18, 0x82, 0x14, 0xF7, 0xE2, 0xE0, 0x93, 0x54, 0xE4, 0xA8, 0x37, 0x23, 0xC2, 0x30, + 0x06, 0x5B, 0x40, 0x38, 0x17, 0x52, 0xBE, 0x36, 0x8D, 0xE9, 0x85, 0x04, 0xE0, 0x10, 0x82, 0x9A, + 0x12, 0x4E, 0x0B, 0x2C, 0xCD, 0x96, 0x66, 0x7A, 0x56, 0x50, 0x2E, 0x83, 0x9F, 0xF1, 0x93, 0x30, + 0x90, 0xB2, 0xD3, 0xA9, 0x59, 0xF8, 0x5B, 0x1D, 0x87, 0x9C, 0x3C, 0xA8, 0xF8, 0xE3, 0xF3, 0x57, + 0xD1, 0x5B, 0xCC, 0x62, 0xEC, 0xD1, 0x84, 0x24, 0x84, 0xC0, 0x5A, 0xCB, 0xCA, 0xE1, 0x01, 0xDE, + 0x79, 0xE1, 0x26, 0xF2, 0xF9, 0x1C, 0x7D, 0x85, 0x00, 0xEB, 0x1C, 0x52, 0x29, 0x84, 0x48, 0xE2, + 0x3D, 0xD2, 0x86, 0x6F, 0xDF, 0xFF, 0x4B, 0xEE, 0x7D, 0x62, 0x3B, 0xEF, 0xBA, 0xF4, 0x8D, 0x5C, + 0xF6, 0xFA, 0x93, 0xD9, 0xBA, 0x67, 0x9C, 0x2F, 0xFF, 0xF0, 0x31, 0x9E, 0x19, 0xAF, 0xA3, 0x72, + 0x03, 0x48, 0xBF, 0x84, 0xC1, 0x7B, 0x79, 0xCB, 0xA7, 0xE0, 0x9B, 0xA1, 0xA6, 0xDA, 0x08, 0xC9, + 0x28, 0xF0, 0xA4, 0x73, 0x52, 0x30, 0x77, 0xD5, 0x47, 0x2E, 0x46, 0xA4, 0x5E, 0x79, 0x8C, 0x07, + 0x38, 0xEB, 0x26, 0x03, 0x4F, 0x46, 0xCA, 0x39, 0x30, 0x9A, 0x30, 0x0C, 0x99, 0xAD, 0x42, 0xC1, + 0xE6, 0x08, 0x32, 0x3E, 0x42, 0x2A, 0x90, 0xB6, 0x8B, 0xE3, 0x24, 0x49, 0x58, 0x1D, 0x33, 0x98, + 0x33, 0xFC, 0xE9, 0xC5, 0xEB, 0x58, 0x31, 0x58, 0x46, 0x1B, 0x8B, 0x27, 0xE7, 0x13, 0x04, 0x82, + 0xA2, 0xE7, 0x71, 0xED, 0x79, 0x1B, 0xD3, 0x69, 0x2D, 0xB1, 0xB6, 0x10, 0x49, 0xBC, 0x4F, 0x57, + 0xEB, 0x7C, 0xE9, 0xCE, 0x9F, 0xF0, 0xFC, 0xFE, 0x43, 0xFC, 0xC5, 0x75, 0x57, 0xB0, 0x71, 0xF5, + 0x08, 0x77, 0x3F, 0xBC, 0x95, 0xFF, 0xFD, 0x93, 0xA7, 0x38, 0xD4, 0xF4, 0xF1, 0xF3, 0x43, 0x38, + 0x2F, 0x8F, 0x71, 0x32, 0xA9, 0xF8, 0xDC, 0xC2, 0x9A, 0x24, 0x19, 0x43, 0x08, 0xB0, 0xD6, 0xD1, + 0x8C, 0x74, 0xB2, 0x96, 0x31, 0x06, 0x25, 0x15, 0x81, 0x14, 0x71, 0xA0, 0xC4, 0x91, 0x37, 0x9D, + 0xBA, 0x94, 0xB6, 0x0D, 0xE7, 0x11, 0x90, 0xF1, 0x15, 0xD9, 0x40, 0x4D, 0xE4, 0x33, 0x6A, 0xCA, + 0x97, 0x0C, 0x38, 0xA3, 0x41, 0x0B, 0xE2, 0x50, 0x50, 0x75, 0x90, 0x33, 0x96, 0x20, 0xE3, 0x27, + 0xE5, 0x68, 0x57, 0x18, 0x58, 0x6B, 0xC8, 0x8A, 0x16, 0x7F, 0xF2, 0xA6, 0xF5, 0xBC, 0x61, 0xF5, + 0x10, 0xC6, 0x3A, 0x3C, 0x71, 0x14, 0xBD, 0x58, 0x10, 0x32, 0xF3, 0xE6, 0x76, 0x40, 0x29, 0xC5, + 0xCE, 0x03, 0x07, 0xF9, 0xEC, 0xAD, 0xF7, 0x20, 0xA4, 0xC7, 0x27, 0xDE, 0xF7, 0x4E, 0x0A, 0x19, + 0x9F, 0xCF, 0xDE, 0xFE, 0x33, 0xBE, 0xF7, 0xD8, 0x6E, 0x22, 0x59, 0xC6, 0xCB, 0x55, 0x30, 0x22, + 0x9B, 0xD4, 0xFA, 0x2F, 0x63, 0x75, 0x00, 0xE3, 0x1C, 0xAD, 0xC8, 0x10, 0xC7, 0x1A, 0x67, 0x1D, + 0xCE, 0x1A, 0x3C, 0x5F, 0x90, 0xF3, 0x65, 0xAB, 0xB7, 0x10, 0x8C, 0x6B, 0x63, 0x16, 0xAF, 0x03, + 0x86, 0x2B, 0x39, 0x56, 0x0E, 0xF7, 0xCC, 0x94, 0x72, 0xC1, 0xBE, 0x8C, 0x2F, 0x4F, 0x12, 0x46, + 0xE3, 0x84, 0xC0, 0x49, 0x81, 0x89, 0x05, 0x0D, 0xE7, 0x88, 0x8D, 0x21, 0x13, 0xF8, 0x48, 0x25, + 0x93, 0xA2, 0xC7, 0x59, 0x9C, 0x6E, 0xF2, 0xCE, 0x37, 0xAD, 0xE2, 0xF7, 0x36, 0xAD, 0x4A, 0x00, + 0x09, 0xD7, 0x01, 0xBD, 0x10, 0x7C, 0x1B, 0x78, 0xFB, 0x3B, 0x01, 0x6C, 0x7E, 0xE6, 0x59, 0x3E, + 0xFF, 0xED, 0x1F, 0xB2, 0x61, 0xCD, 0x4A, 0xDE, 0x7F, 0xED, 0x9B, 0xD9, 0x77, 0x68, 0x92, 0xBF, + 0xF9, 0xFA, 0x0F, 0x79, 0x62, 0xCF, 0x0C, 0x32, 0xDB, 0x87, 0x0C, 0x4A, 0x18, 0xFC, 0xE3, 0xBA, + 0x7C, 0x77, 0x43, 0x39, 0x36, 0x96, 0x58, 0x1B, 0xAC, 0x4D, 0x57, 0x95, 0xD6, 0x82, 0x31, 0x64, + 0x94, 0x4F, 0x39, 0xE7, 0xCF, 0x64, 0x7C, 0x6F, 0x6F, 0xE0, 0x29, 0x02, 0x4F, 0x1D, 0x4B, 0xC0, + 0x89, 0xCB, 0x7A, 0xD9, 0x74, 0xE2, 0x50, 0xF5, 0x8E, 0x9F, 0xFB, 0xCF, 0x16, 0x73, 0xFE, 0x65, + 0xC2, 0x59, 0xAC, 0x8E, 0x71, 0x32, 0x5D, 0x8D, 0x09, 0x88, 0xA3, 0xA4, 0x5E, 0xF0, 0x3C, 0x85, + 0xE7, 0x49, 0x4C, 0xDC, 0xE2, 0x8A, 0x8D, 0x43, 0xFC, 0xC9, 0x65, 0x1B, 0x08, 0x3C, 0x0F, 0xEB, + 0xE6, 0x83, 0x6F, 0x2F, 0x6D, 0x93, 0x82, 0xE6, 0xA8, 0x57, 0x48, 0x29, 0x89, 0xA2, 0x98, 0xDB, + 0xEE, 0xDB, 0xCC, 0x37, 0x7E, 0xFC, 0x20, 0xD7, 0x5D, 0xFC, 0x46, 0xAE, 0xBD, 0xF8, 0x2C, 0x7E, + 0xF4, 0xE8, 0x36, 0xBE, 0xF8, 0xBD, 0x87, 0x19, 0xAB, 0x82, 0x9F, 0x1B, 0xC4, 0x79, 0x79, 0x2C, + 0xAA, 0x03, 0xFE, 0x38, 0x5D, 0x73, 0xAC, 0x75, 0xC4, 0xC6, 0xA6, 0x79, 0xC7, 0xB5, 0xC3, 0x39, + 0x69, 0xA8, 0x58, 0x4B, 0x7F, 0x31, 0xA0, 0x9C, 0x95, 0x2F, 0xCE, 0x4E, 0x8C, 0x1F, 0x6E, 0x36, + 0x8F, 0x92, 0x38, 0x8F, 0x80, 0x4D, 0x27, 0x0E, 0xF1, 0xC7, 0xFF, 0xE3, 0xFB, 0x76, 0xDD, 0x8A, + 0xFE, 0xC7, 0x2B, 0xC5, 0x6C, 0xE4, 0x09, 0x02, 0xA3, 0x35, 0x4E, 0x26, 0xE0, 0x3B, 0x2E, 0xEF, + 0x1C, 0x91, 0xB5, 0xB4, 0x9A, 0x11, 0xA7, 0x8D, 0x16, 0xF9, 0xD0, 0x3B, 0x36, 0xD1, 0x5B, 0xCC, + 0x26, 0x71, 0xDF, 0x65, 0xF1, 0x76, 0x29, 0xDB, 0x9E, 0x05, 0x3A, 0x5E, 0x20, 0x25, 0xD3, 0xB3, + 0x73, 0x7C, 0xF1, 0xB6, 0xEF, 0xF3, 0xD0, 0x96, 0x17, 0xF8, 0x8B, 0xEB, 0xDF, 0xCA, 0xC6, 0x35, + 0xA3, 0xFC, 0xCF, 0x6F, 0xDD, 0xC7, 0xB7, 0x1F, 0x7C, 0x8E, 0x96, 0x28, 0xE2, 0x65, 0x2B, 0x58, + 0x99, 0x41, 0x58, 0x12, 0x2B, 0x2E, 0x38, 0x5C, 0x97, 0x2E, 0xD6, 0xBA, 0xA3, 0xC0, 0xA1, 0x33, + 0xF7, 0x63, 0x2D, 0xCE, 0x18, 0xF2, 0x81, 0x62, 0xA4, 0xBF, 0x40, 0x3E, 0x90, 0x4F, 0x7E, 0xEB, + 0x3F, 0x9F, 0x3B, 0xBB, 0xE6, 0xDD, 0x9F, 0x5A, 0x9C, 0x80, 0xC3, 0x33, 0x4D, 0x36, 0xAE, 0x1A, + 0x64, 0xA8, 0xAF, 0xF0, 0xC4, 0x40, 0x6F, 0xE1, 0x60, 0x36, 0x50, 0x2B, 0xC2, 0x30, 0xC2, 0xC5, + 0x02, 0x8B, 0x40, 0x72, 0x74, 0x1D, 0x60, 0x75, 0x4C, 0x7F, 0xC1, 0x71, 0xE3, 0x75, 0x67, 0xB2, + 0x7A, 0xA8, 0x27, 0xA9, 0xF1, 0x3B, 0xEB, 0xF6, 0xF9, 0x56, 0x5F, 0x08, 0x7E, 0xF7, 0x81, 0x71, + 0x3E, 0xFD, 0xF5, 0x3B, 0x98, 0x6D, 0x84, 0x7C, 0xF2, 0xCF, 0xDE, 0x4D, 0x6C, 0x1C, 0x1F, 0xFA, + 0xC7, 0x3B, 0xF8, 0xE5, 0x8E, 0x09, 0x44, 0xB6, 0x17, 0x15, 0x94, 0x92, 0x29, 0xCE, 0x42, 0xFA, + 0xE7, 0x18, 0xF4, 0x36, 0x2D, 0x71, 0xAD, 0x5B, 0xE4, 0xCB, 0xB6, 0xF5, 0x8D, 0xC1, 0x17, 0x8E, + 0x25, 0x3D, 0x39, 0xFA, 0x8B, 0x99, 0x66, 0x5F, 0xB9, 0xF8, 0xD0, 0x45, 0xFF, 0xF0, 0xA4, 0xDD, + 0xF7, 0xF0, 0x77, 0x17, 0x27, 0x60, 0xB8, 0x37, 0xCF, 0x77, 0x36, 0xEF, 0x60, 0xD3, 0xFA, 0xE5, + 0xBB, 0x1F, 0xDD, 0xBA, 0xFF, 0x91, 0x4A, 0x29, 0xB7, 0x62, 0x6E, 0xAE, 0x8E, 0xD5, 0x71, 0x52, + 0x55, 0x76, 0x7A, 0x0C, 0x86, 0x40, 0x69, 0xFE, 0xFC, 0xAD, 0x67, 0x73, 0xC1, 0xA9, 0xCB, 0x89, + 0xD3, 0x15, 0x5B, 0x27, 0xE6, 0x84, 0x40, 0x76, 0xAD, 0xE1, 0x9D, 0x4B, 0xAA, 0x47, 0x29, 0x04, + 0x8F, 0x3E, 0xB3, 0x9D, 0x4F, 0xFD, 0xEB, 0x77, 0x59, 0xB3, 0x7C, 0x29, 0x1F, 0x7C, 0xCF, 0xDB, + 0xF9, 0xE5, 0xB6, 0x17, 0xF9, 0x5F, 0xDF, 0xD9, 0xCC, 0xFE, 0x19, 0x83, 0x9F, 0x1B, 0x40, 0xB4, + 0x5D, 0x7E, 0xA1, 0xD5, 0xD3, 0xAD, 0x38, 0x97, 0xEE, 0x47, 0x1E, 0xFD, 0x23, 0xBA, 0x92, 0x80, + 0xEB, 0xAC, 0xFE, 0x9C, 0xB1, 0xF8, 0xD2, 0x31, 0x50, 0xCC, 0x30, 0x50, 0xCE, 0xD0, 0x5B, 0xCC, + 0xEC, 0x2A, 0x17, 0x82, 0x47, 0x85, 0x08, 0xF1, 0x8B, 0x95, 0xC5, 0x09, 0x00, 0xB8, 0xE2, 0x0D, + 0xAB, 0xB8, 0xEA, 0xC6, 0x5B, 0x9A, 0x97, 0x9F, 0xB9, 0xE6, 0x9E, 0xE1, 0x81, 0xD2, 0x35, 0x07, + 0x0F, 0x4E, 0x66, 0x9A, 0x51, 0x04, 0xC2, 0x75, 0xDC, 0xCE, 0xC4, 0x96, 0x6B, 0x2E, 0x58, 0xC3, + 0x1F, 0x5E, 0xB2, 0x01, 0x1D, 0xC7, 0xA9, 0x15, 0x5C, 0x7B, 0x12, 0x4A, 0x9E, 0x80, 0xEA, 0x02, + 0xDF, 0xF6, 0x8A, 0x1F, 0x3C, 0xF0, 0x18, 0x37, 0xDF, 0x79, 0x2F, 0x57, 0x5C, 0x70, 0x16, 0x6F, + 0x3A, 0x63, 0x03, 0x37, 0xDD, 0xFD, 0x10, 0xB7, 0xFE, 0x7C, 0x1B, 0x4D, 0x97, 0xC7, 0xCB, 0xF6, + 0x63, 0x65, 0x16, 0x61, 0x45, 0xE2, 0xBA, 0x8B, 0xB9, 0xFC, 0xF1, 0x1E, 0x3A, 0xE8, 0x5E, 0x03, + 0xB9, 0xD4, 0xF2, 0x0A, 0xFA, 0x0B, 0x19, 0xCA, 0x59, 0x45, 0x5F, 0x29, 0x4B, 0x4F, 0x21, 0xF3, + 0x93, 0xF7, 0x5C, 0xBC, 0x7E, 0xEC, 0xB6, 0x5F, 0xEC, 0xE0, 0xCF, 0xFE, 0xDB, 0x87, 0x8E, 0x4F, + 0xC0, 0xBE, 0xC3, 0x73, 0xFC, 0xFE, 0x9B, 0x4E, 0x61, 0xA0, 0x52, 0xB8, 0x6F, 0x74, 0xB8, 0xB2, + 0xED, 0xC5, 0x3D, 0xD9, 0x33, 0x5A, 0x47, 0x5A, 0x10, 0x77, 0x0F, 0x6D, 0x38, 0x30, 0x7E, 0x88, + 0xC3, 0xD3, 0x73, 0x0C, 0x57, 0x0A, 0x49, 0xB3, 0x22, 0xB5, 0xBA, 0x50, 0x2A, 0x59, 0x09, 0x76, + 0x85, 0x41, 0x18, 0xC5, 0xDC, 0x72, 0xCF, 0x7D, 0xFC, 0xE2, 0x89, 0xAD, 0xBC, 0xFF, 0xFA, 0xAB, + 0xC9, 0x64, 0x73, 0xFC, 0xD5, 0x97, 0xEE, 0xE4, 0xE1, 0xE7, 0x0F, 0x23, 0x32, 0x15, 0x54, 0xA6, + 0x88, 0x13, 0xFE, 0xD1, 0xD8, 0x7D, 0xAD, 0x47, 0x1A, 0x07, 0x6D, 0x0F, 0xCC, 0x7A, 0x92, 0xBE, + 0x62, 0x40, 0xCE, 0x13, 0x94, 0x32, 0x1E, 0x83, 0x3D, 0xB9, 0x89, 0x4A, 0x31, 0xFB, 0x9D, 0x4F, + 0x7F, 0xFB, 0x51, 0xF3, 0xF5, 0x9F, 0x1F, 0x9C, 0xF7, 0xD3, 0x63, 0x4A, 0xBA, 0x93, 0x57, 0xF4, + 0xB3, 0x62, 0xB8, 0xC2, 0xBB, 0x2E, 0x39, 0xE5, 0xC0, 0xC8, 0x50, 0xCF, 0xAD, 0x23, 0x4B, 0x7A, + 0x6D, 0xE0, 0x49, 0x9C, 0x8E, 0xB1, 0x71, 0x8C, 0x8B, 0x23, 0x84, 0x73, 0x3C, 0xBC, 0x65, 0x2F, + 0x9F, 0xFC, 0xDA, 0xF7, 0xA9, 0x35, 0x93, 0x56, 0xB5, 0x6B, 0x2B, 0x61, 0x8F, 0x6E, 0x62, 0x00, + 0xCC, 0x56, 0x6B, 0x7C, 0xE1, 0x5F, 0xEF, 0x60, 0xE7, 0xBE, 0x71, 0x3E, 0xFA, 0xBE, 0x7F, 0xC7, + 0xD8, 0x54, 0x9D, 0x0F, 0x7C, 0xEE, 0x76, 0x36, 0x3F, 0x37, 0x89, 0xCC, 0xF6, 0x23, 0xFD, 0x12, + 0x4E, 0x78, 0x09, 0x78, 0x6B, 0xE7, 0x09, 0xAF, 0x20, 0xDD, 0xD7, 0x38, 0x63, 0xC0, 0x18, 0x8A, + 0x81, 0x64, 0xB0, 0x14, 0x90, 0x55, 0xE0, 0x0B, 0x47, 0x7F, 0x4F, 0x8E, 0x81, 0x9E, 0xFC, 0x8F, + 0xD7, 0x2C, 0xEB, 0x7D, 0x6C, 0xB0, 0x27, 0xC7, 0x27, 0xDE, 0xB3, 0x7E, 0x1E, 0xDE, 0x45, 0x9F, + 0x68, 0x78, 0xDB, 0x7B, 0x6E, 0xE0, 0xEC, 0x2B, 0xDF, 0xC3, 0x60, 0x6F, 0x71, 0xAC, 0xD6, 0x08, + 0x2F, 0x9A, 0x98, 0x9C, 0x5D, 0x5A, 0xAF, 0x37, 0xD2, 0x8D, 0xCB, 0xA4, 0x06, 0x12, 0x52, 0xF2, + 0xC2, 0x9E, 0x71, 0xB0, 0x31, 0xE7, 0x9C, 0xB6, 0x16, 0x29, 0x8E, 0xBA, 0xBC, 0x73, 0x16, 0xA5, + 0x14, 0x63, 0x87, 0x27, 0xF9, 0xD2, 0xAD, 0x77, 0xB1, 0x6C, 0x68, 0x80, 0x6B, 0x2F, 0xBF, 0x88, + 0x7F, 0xFE, 0xFE, 0xC3, 0x7C, 0xEE, 0xF6, 0xCD, 0x4C, 0xB5, 0x02, 0xFC, 0x6C, 0x2F, 0x42, 0x65, + 0x93, 0x4D, 0x0C, 0x77, 0x34, 0x7E, 0x5F, 0xB3, 0xA4, 0x44, 0x28, 0x1C, 0xBD, 0x85, 0x80, 0xDE, + 0x82, 0x8F, 0x87, 0x45, 0x3A, 0x43, 0x4F, 0x21, 0x60, 0xF5, 0x48, 0xFF, 0xC4, 0xE8, 0x70, 0xE5, + 0xBF, 0xEE, 0x1A, 0x9B, 0x7A, 0xE1, 0x5D, 0x97, 0xAC, 0xE7, 0x8C, 0x13, 0x97, 0xBD, 0xBC, 0x07, + 0x00, 0xBC, 0xEB, 0xD2, 0x53, 0x39, 0x61, 0x49, 0x85, 0xF7, 0xFF, 0xF9, 0x97, 0xF7, 0xAC, 0x1C, + 0xE9, 0xFF, 0xA7, 0x55, 0xA3, 0x43, 0xAD, 0x5C, 0xC6, 0x07, 0x13, 0xE3, 0x74, 0x84, 0x8B, 0x63, + 0x30, 0x60, 0xC8, 0x72, 0xD3, 0x9D, 0x8F, 0x70, 0xF3, 0x5D, 0x9B, 0x41, 0xC8, 0xD4, 0xF2, 0x1A, + 0x29, 0x24, 0xDB, 0x76, 0xED, 0xE5, 0x96, 0xBB, 0x7F, 0xC2, 0x65, 0xE7, 0x9E, 0xC9, 0xC6, 0x53, + 0x4E, 0xE6, 0x23, 0x9F, 0xBF, 0x9D, 0xAF, 0xFE, 0xE0, 0x57, 0x84, 0xA2, 0x8C, 0x97, 0xE9, 0x01, + 0x19, 0x24, 0xC1, 0xFB, 0x2A, 0xAD, 0x8D, 0x4D, 0x4A, 0x5F, 0xD7, 0x65, 0x7D, 0x67, 0x4C, 0xD2, + 0x66, 0xF7, 0x04, 0xC3, 0x3D, 0x59, 0x2A, 0x39, 0x0F, 0x65, 0x0D, 0xC2, 0x18, 0xB2, 0x9E, 0x60, + 0x49, 0x5F, 0x89, 0xA1, 0x4A, 0xF1, 0xD6, 0xD3, 0x4F, 0x5C, 0xFA, 0xE0, 0xE8, 0x50, 0x99, 0x07, + 0xB6, 0x8C, 0x1D, 0x83, 0xF5, 0xB8, 0xCF, 0xB4, 0x5C, 0xF1, 0xCE, 0xF7, 0x71, 0xE9, 0xA5, 0x1B, + 0x59, 0x39, 0xD2, 0xBF, 0xAB, 0xD6, 0x08, 0xD7, 0xCF, 0xCC, 0xD5, 0x4F, 0x99, 0x9B, 0xAD, 0x61, + 0x8D, 0xE9, 0x2C, 0x71, 0x85, 0x90, 0xC4, 0x16, 0x1E, 0xDF, 0xF6, 0x02, 0xA5, 0xBC, 0xCF, 0xE9, + 0x27, 0xAD, 0x40, 0x08, 0xC1, 0xA3, 0x5B, 0x9F, 0x67, 0xDB, 0xCE, 0x3D, 0x5C, 0x7D, 0xE9, 0x05, + 0x3C, 0xBB, 0x77, 0x82, 0xBF, 0xFE, 0xE2, 0x77, 0xD9, 0xB6, 0x7F, 0x0E, 0x2F, 0xD7, 0x8B, 0xF4, + 0xF2, 0x20, 0xD5, 0xC2, 0xCC, 0xB6, 0xE0, 0x38, 0x4E, 0x93, 0xBD, 0x63, 0xF9, 0x84, 0x80, 0x40, + 0x0A, 0x7A, 0x0B, 0x01, 0x7D, 0xC5, 0x0C, 0x19, 0x05, 0xC2, 0x1A, 0xB0, 0x06, 0x5F, 0x3A, 0x06, + 0x7B, 0x0B, 0xAC, 0x5A, 0x3E, 0xF0, 0xCC, 0x09, 0x4B, 0x7B, 0xFF, 0x6A, 0xEF, 0x4B, 0xD3, 0x87, + 0x8E, 0xCC, 0x35, 0xF8, 0xD3, 0xAB, 0xDF, 0x70, 0xCC, 0x2D, 0x5F, 0xB6, 0x97, 0xED, 0x9C, 0xE3, + 0x23, 0x5F, 0xF8, 0x01, 0xC3, 0xFD, 0xE5, 0x33, 0x1E, 0x7B, 0x66, 0xF7, 0x2D, 0x0F, 0x3F, 0xF1, + 0xDC, 0xBA, 0x89, 0x89, 0x69, 0xAC, 0x13, 0xA0, 0x14, 0x42, 0x79, 0x08, 0x4F, 0x62, 0x6D, 0x4C, + 0xCE, 0x0B, 0xB9, 0xE1, 0xBA, 0xF3, 0x39, 0xF3, 0x94, 0x15, 0xF8, 0x9E, 0x60, 0x74, 0x64, 0x19, + 0x37, 0xDD, 0xFE, 0x33, 0x6E, 0xB9, 0xF7, 0x49, 0x42, 0x0A, 0xA8, 0x6C, 0x19, 0x21, 0x03, 0xE8, + 0xB4, 0xD5, 0x5F, 0xE5, 0x86, 0x62, 0x17, 0x49, 0xED, 0xFA, 0xC2, 0x93, 0x82, 0x62, 0xCE, 0xA7, + 0x9C, 0x0B, 0x08, 0x94, 0x40, 0xB8, 0xC4, 0x3B, 0x84, 0xB5, 0x28, 0x61, 0xA9, 0x14, 0x73, 0xAC, + 0x5D, 0xB9, 0x64, 0x76, 0xDD, 0xCA, 0xA1, 0x1B, 0x3E, 0xFD, 0xAD, 0x27, 0xBF, 0x79, 0xEB, 0xC7, + 0xAF, 0xE2, 0xE0, 0xAC, 0xE6, 0xDA, 0x0B, 0x4F, 0x7E, 0xF5, 0x1E, 0x00, 0xB0, 0xF6, 0xDC, 0x6B, + 0x19, 0x19, 0xAC, 0x70, 0xC3, 0xF5, 0x7F, 0xFB, 0xD2, 0x75, 0xEF, 0xB9, 0x6C, 0x3A, 0x36, 0xF6, + 0x92, 0xE9, 0xE9, 0x6A, 0x36, 0x6C, 0xB6, 0xDA, 0xFD, 0xC3, 0x64, 0xEA, 0x13, 0x8A, 0xD8, 0x08, + 0x1E, 0x79, 0x66, 0x27, 0xE3, 0x47, 0xA6, 0x59, 0x35, 0x3A, 0xC2, 0xA7, 0x6E, 0xBE, 0x9B, 0xEF, + 0x6D, 0x7E, 0x0E, 0xEB, 0xF5, 0x20, 0xFD, 0x22, 0x42, 0xFA, 0xB4, 0x5B, 0x54, 0x9D, 0x95, 0xC8, + 0xAB, 0x88, 0xEF, 0x76, 0x43, 0x03, 0xE7, 0xF0, 0xA4, 0xA0, 0x94, 0xF3, 0x18, 0x28, 0x65, 0x29, + 0x67, 0x3D, 0x3C, 0xE1, 0x10, 0x2E, 0xB1, 0xBA, 0xB0, 0x06, 0xE9, 0x0C, 0xA5, 0x5C, 0xC0, 0x8A, + 0x91, 0x7E, 0xBD, 0x72, 0xD9, 0xC0, 0x67, 0x2F, 0xD9, 0xB4, 0xE6, 0x4B, 0xAF, 0x5B, 0x3B, 0x60, + 0x9A, 0x91, 0xE6, 0xBA, 0x8B, 0x4E, 0x5D, 0x14, 0xE3, 0xCB, 0x12, 0xF0, 0x82, 0x38, 0x95, 0xB7, + 0x9F, 0xBF, 0x9E, 0xF3, 0xAF, 0x3C, 0x9B, 0x2B, 0xCE, 0x3B, 0xF5, 0xB9, 0x83, 0x93, 0x73, 0x26, + 0x36, 0xF6, 0xDC, 0xD9, 0xD9, 0xAA, 0x1F, 0x85, 0x61, 0x92, 0x14, 0xD3, 0x82, 0x45, 0x08, 0x09, + 0xD2, 0x63, 0xFF, 0xA1, 0x59, 0xEE, 0x7D, 0x78, 0x3B, 0x7B, 0x0F, 0xD7, 0xF1, 0x82, 0x12, 0xB2, + 0x93, 0xE8, 0x5C, 0x32, 0x5D, 0x39, 0x9B, 0x36, 0x57, 0xEC, 0xCB, 0x82, 0x4F, 0x4A, 0x59, 0x87, + 0xC4, 0x91, 0xF5, 0x25, 0x3D, 0xF9, 0xC4, 0xD5, 0x4B, 0x59, 0x2F, 0x59, 0x66, 0xBB, 0x04, 0xB4, + 0xE8, 0x80, 0xB7, 0x14, 0xB2, 0x3E, 0xA3, 0xCB, 0xFA, 0xDD, 0xE8, 0xB2, 0xFE, 0x7F, 0x1E, 0xEA, + 0x2F, 0xFF, 0x8D, 0xD1, 0xB6, 0xFE, 0xF4, 0xCE, 0x43, 0x7C, 0xF2, 0x5F, 0x1E, 0x60, 0xE4, 0x8C, + 0xB7, 0x52, 0x5C, 0x77, 0x19, 0xB3, 0xCF, 0xFE, 0xF8, 0xD5, 0x11, 0xD0, 0x73, 0xE5, 0x27, 0x31, + 0xD6, 0x32, 0x35, 0x53, 0xE7, 0xC7, 0x8F, 0xEF, 0xE2, 0xE3, 0xFF, 0xE1, 0x02, 0xBB, 0x7D, 0xFF, + 0xF4, 0x93, 0xBE, 0x92, 0xBE, 0xC5, 0x9D, 0x3D, 0x3B, 0x57, 0xF3, 0xA2, 0x56, 0x88, 0xB3, 0xA6, + 0xCB, 0xAA, 0x02, 0x21, 0x14, 0x0E, 0x0F, 0xA9, 0x32, 0x20, 0xD2, 0x32, 0xA3, 0x03, 0xD6, 0x76, + 0x48, 0xC0, 0x76, 0xC5, 0x73, 0x97, 0xE0, 0x2C, 0x12, 0x4B, 0xA0, 0x24, 0xC5, 0xAC, 0x47, 0x6F, + 0x21, 0xA0, 0x27, 0x1F, 0x90, 0x0B, 0x54, 0x62, 0x71, 0x6B, 0xBB, 0xC0, 0x5B, 0xB0, 0x1A, 0x89, + 0xA3, 0x90, 0xF5, 0x59, 0xBE, 0xB4, 0x8F, 0xE5, 0x4B, 0xFB, 0xEF, 0x40, 0x79, 0x37, 0x7E, 0xF4, + 0x8F, 0x2E, 0x3C, 0xFC, 0xC3, 0x83, 0x23, 0xF2, 0xF1, 0xE7, 0xC7, 0xC8, 0x67, 0x7C, 0x96, 0x0F, + 0x94, 0x78, 0xF1, 0xE0, 0x2C, 0x76, 0xF4, 0x42, 0xEC, 0x9E, 0xFB, 0x5F, 0x3E, 0x07, 0x8C, 0xBC, + 0xFD, 0xBF, 0x13, 0xC6, 0x86, 0xD8, 0x58, 0x02, 0x4F, 0x89, 0x30, 0xD2, 0x38, 0x10, 0xD5, 0x47, + 0x76, 0x8A, 0xF7, 0x7F, 0xFC, 0xBA, 0x12, 0x71, 0xF4, 0xD1, 0x67, 0x77, 0xEC, 0xFB, 0x4F, 0xDB, + 0x9F, 0x7B, 0x31, 0x37, 0x3B, 0x53, 0x4D, 0x16, 0x22, 0x52, 0xA5, 0x9B, 0x27, 0x5D, 0x67, 0xA9, + 0x40, 0x76, 0x6F, 0xA9, 0xB5, 0x5B, 0xEA, 0x47, 0x37, 0x58, 0x45, 0x5A, 0x40, 0x29, 0x25, 0xF1, + 0x3D, 0x45, 0x26, 0x50, 0x64, 0x03, 0x8F, 0xC0, 0x53, 0x28, 0x99, 0x36, 0x4D, 0xD2, 0x90, 0x11, + 0x38, 0x84, 0x73, 0x08, 0x12, 0x42, 0x85, 0xB3, 0x28, 0x01, 0xC5, 0x7C, 0x86, 0x91, 0xA5, 0x03, + 0x6E, 0xC9, 0x70, 0xDF, 0x9D, 0x73, 0x4D, 0x7D, 0xE3, 0x97, 0xBF, 0x76, 0xFF, 0xDE, 0xE2, 0x09, + 0x03, 0x90, 0x2C, 0x24, 0xAC, 0x00, 0x2B, 0xA5, 0x64, 0x76, 0xAE, 0xE1, 0xCE, 0x58, 0xBF, 0x9C, + 0xFE, 0x9E, 0x1C, 0xF7, 0x7E, 0xF6, 0xBD, 0xC7, 0xF7, 0x80, 0x81, 0x8D, 0x57, 0xB2, 0xB4, 0xAF, + 0xC8, 0x4C, 0x2D, 0x14, 0xAD, 0x48, 0x0B, 0x92, 0xE9, 0xD2, 0x0B, 0x46, 0xFA, 0x82, 0xCD, 0xCF, + 0xEC, 0xC5, 0xCF, 0x66, 0x9F, 0x3A, 0x69, 0xC5, 0x60, 0x54, 0x2C, 0x64, 0x4F, 0x0B, 0xC3, 0x28, + 0x17, 0xB6, 0x42, 0x9C, 0xD1, 0x47, 0x2D, 0x6B, 0xDB, 0x96, 0xB2, 0x88, 0xD4, 0xE5, 0x85, 0x4B, + 0xF6, 0x18, 0x14, 0xC9, 0xE3, 0x6C, 0x81, 0x92, 0xE4, 0x03, 0x45, 0x21, 0xA3, 0x28, 0xE5, 0x7C, + 0xCA, 0x39, 0x9F, 0x52, 0xC6, 0x23, 0xEB, 0x2B, 0x7C, 0x49, 0xBA, 0x1F, 0x69, 0x13, 0x4B, 0xBB, + 0x64, 0x5E, 0x17, 0xCE, 0x20, 0xAC, 0xEE, 0xC4, 0x7B, 0x20, 0x05, 0xBD, 0xE5, 0x02, 0xA3, 0xCB, + 0x06, 0xA3, 0x9E, 0x4A, 0xE9, 0xDB, 0x5B, 0xF6, 0x4C, 0xFE, 0xFD, 0x6D, 0x3F, 0x7F, 0xF6, 0x48, + 0x71, 0xA0, 0x94, 0xCE, 0xB1, 0x47, 0x0D, 0x6C, 0xAD, 0x25, 0x97, 0x0B, 0xB8, 0xEA, 0x9C, 0x93, + 0x68, 0x86, 0x9A, 0x0F, 0xDF, 0xF8, 0x5F, 0xB8, 0xEB, 0xFF, 0xDC, 0xB4, 0x88, 0x07, 0x9C, 0xFF, + 0x31, 0x0A, 0xD9, 0x00, 0x29, 0x05, 0xCE, 0x39, 0x91, 0xEA, 0xAC, 0x00, 0x1F, 0xC8, 0x00, 0x39, + 0x6D, 0x6C, 0xA6, 0x98, 0xCF, 0xE4, 0x2F, 0xDA, 0xB8, 0xFC, 0x2A, 0x11, 0x87, 0x37, 0xEC, 0xDD, + 0x3B, 0xBE, 0x6A, 0x7C, 0x7C, 0x82, 0x66, 0xB3, 0x99, 0xF6, 0x03, 0x12, 0xEB, 0x0B, 0x25, 0x91, + 0x4A, 0xCD, 0x93, 0xF6, 0x66, 0x87, 0x52, 0xE9, 0x76, 0x7B, 0xBB, 0x84, 0xEE, 0xB4, 0xC8, 0x44, + 0x47, 0x73, 0x21, 0xDA, 0x0F, 0x45, 0xBA, 0xA4, 0x35, 0x8F, 0x43, 0xE0, 0x50, 0x02, 0xB2, 0xD9, + 0x80, 0x81, 0xBE, 0x1E, 0x06, 0x06, 0x7B, 0xA7, 0x5B, 0x56, 0xDE, 0xF6, 0xC0, 0xD6, 0x03, 0xDF, + 0x7A, 0x69, 0xB2, 0x36, 0xE3, 0x7B, 0x32, 0x22, 0xF9, 0xEF, 0x93, 0x56, 0x7A, 0x0E, 0x81, 0x18, + 0xD0, 0x4A, 0x0A, 0x7B, 0xCE, 0xA9, 0xA3, 0xEE, 0x47, 0x9F, 0xF9, 0xA6, 0xBB, 0xEB, 0xA1, 0xCF, + 0x72, 0xF5, 0xB9, 0x27, 0x2F, 0xE2, 0x01, 0xA3, 0x17, 0x12, 0xCF, 0x35, 0x50, 0x59, 0x5F, 0xC8, + 0x64, 0x1D, 0xAB, 0x80, 0x00, 0xC8, 0x02, 0x45, 0xA0, 0x2C, 0xA5, 0xE8, 0x8D, 0xB5, 0xED, 0xDB, + 0x31, 0x36, 0x3D, 0xE3, 0x67, 0x33, 0x2F, 0xAE, 0x1C, 0x19, 0x2C, 0xF4, 0xF5, 0x14, 0x87, 0x04, + 0x78, 0xCE, 0x18, 0x04, 0x16, 0x25, 0x93, 0xAC, 0xED, 0x49, 0x50, 0x42, 0xA0, 0x64, 0xD2, 0x29, + 0x92, 0x24, 0x22, 0x52, 0x0B, 0xCB, 0xD4, 0xA5, 0x85, 0x33, 0xF3, 0x2C, 0x9E, 0x48, 0x12, 0xE7, + 0xC2, 0x26, 0xF7, 0x94, 0x58, 0xB2, 0xBE, 0x47, 0x6F, 0xA5, 0xC8, 0xB2, 0xA5, 0x03, 0xA6, 0x50, + 0x2E, 0xBD, 0xB0, 0xF3, 0x70, 0xED, 0xF6, 0x9F, 0x3D, 0xBD, 0xEF, 0xF1, 0x5A, 0x33, 0xCA, 0x78, + 0x4A, 0x16, 0x52, 0x23, 0xB5, 0x9F, 0x96, 0x4A, 0xD8, 0x4B, 0x43, 0xC1, 0x5A, 0xE7, 0xC2, 0x48, + 0xBB, 0xBF, 0xFC, 0xE8, 0x3B, 0xF9, 0xE5, 0x96, 0xFD, 0x3C, 0x75, 0xDF, 0xAD, 0xC7, 0x12, 0x50, + 0x38, 0xF9, 0xCD, 0x54, 0x7A, 0x8B, 0x44, 0xDA, 0x08, 0x29, 0x84, 0x24, 0x59, 0x30, 0x05, 0x40, + 0x1E, 0x28, 0x03, 0xBD, 0x40, 0xBF, 0x10, 0x0C, 0x48, 0x21, 0x06, 0x0F, 0x4D, 0x37, 0xBC, 0x03, + 0x53, 0x8D, 0x03, 0x95, 0x9E, 0xE2, 0xDC, 0x8A, 0x65, 0x03, 0xA5, 0x9E, 0x52, 0xBE, 0x20, 0x85, + 0x94, 0xAE, 0xAB, 0x7A, 0x4B, 0x2C, 0x67, 0x3B, 0xC0, 0x65, 0x1A, 0xCB, 0x12, 0xDB, 0x05, 0xD6, + 0xCE, 0x07, 0x9E, 0x82, 0x97, 0x24, 0x44, 0x66, 0x03, 0x9F, 0xDE, 0x9E, 0x22, 0x4B, 0x87, 0xFB, + 0xE9, 0x1B, 0xE8, 0x9D, 0x3E, 0xDC, 0x30, 0x8F, 0x6D, 0x7E, 0xEE, 0xE0, 0x43, 0xBB, 0xC6, 0x67, + 0x66, 0x85, 0xA0, 0x24, 0x84, 0x28, 0xA4, 0x46, 0x0A, 0xBA, 0x42, 0xDB, 0x92, 0xF4, 0xD0, 0x34, + 0x60, 0x85, 0x10, 0xB6, 0x15, 0x6A, 0xFA, 0x4A, 0x39, 0xB7, 0xEB, 0xC0, 0x24, 0xFB, 0x1E, 0xBF, + 0xEB, 0x58, 0x02, 0xD6, 0x5F, 0x70, 0x1D, 0x2B, 0x86, 0x7B, 0x38, 0x3C, 0x5D, 0x97, 0x2E, 0x8D, + 0xFD, 0x94, 0xD5, 0x36, 0x01, 0x15, 0xA0, 0xAF, 0x2D, 0x52, 0x88, 0x5E, 0xAD, 0x6D, 0x79, 0x7C, + 0xAA, 0xD6, 0x3C, 0x52, 0x8B, 0x0F, 0xF6, 0xF4, 0x94, 0x1A, 0xCB, 0x96, 0xF4, 0x65, 0x06, 0x7A, + 0xCB, 0x99, 0x6C, 0x36, 0x90, 0x2A, 0xDD, 0x5D, 0x92, 0x0B, 0xAC, 0xDF, 0x26, 0xA1, 0x9D, 0xD4, + 0xDA, 0x16, 0x4E, 0xBC, 0x24, 0x79, 0x04, 0x37, 0x1B, 0xF8, 0x14, 0x8B, 0x39, 0x06, 0xFA, 0x7A, + 0x18, 0x1E, 0xEE, 0xB7, 0xA5, 0x4A, 0xCF, 0xDC, 0x74, 0xC4, 0xCE, 0x27, 0x76, 0x4F, 0x3E, 0xB3, + 0x6D, 0xEF, 0xE4, 0xC1, 0x30, 0xD2, 0x9E, 0x94, 0x22, 0x9F, 0xEA, 0x17, 0xA4, 0xBA, 0xB6, 0x9F, + 0x59, 0x35, 0xA9, 0xEB, 0x47, 0xED, 0x10, 0x20, 0xE9, 0x9C, 0xB9, 0xB1, 0x23, 0x73, 0xEE, 0xE0, + 0x74, 0x83, 0xE6, 0x0B, 0xF7, 0x1D, 0xBB, 0x1C, 0x56, 0x69, 0x5C, 0x2E, 0xD8, 0x67, 0x6C, 0x27, + 0x42, 0x95, 0x0E, 0xE2, 0xA7, 0x03, 0x06, 0x40, 0x46, 0x08, 0x32, 0x02, 0x91, 0x99, 0xA9, 0x35, + 0x79, 0xF4, 0x85, 0xE6, 0xDE, 0x52, 0x3E, 0x33, 0x31, 0x3A, 0x50, 0x1C, 0x58, 0x32, 0xB4, 0x64, + 0xC9, 0xE0, 0x12, 0xD7, 0x6F, 0xA2, 0xB0, 0xD0, 0x6A, 0xB6, 0xBC, 0x56, 0x2B, 0x24, 0x8A, 0x22, + 0x74, 0x6C, 0xB0, 0xF6, 0x68, 0x67, 0x56, 0x4A, 0x81, 0x54, 0x12, 0xDF, 0xF3, 0x08, 0x02, 0x9F, + 0x4C, 0x26, 0x20, 0x9B, 0xCD, 0x90, 0xCB, 0x65, 0x8D, 0xF4, 0xFD, 0x56, 0xD3, 0x30, 0xB3, 0x6F, + 0xA6, 0x75, 0x68, 0xCF, 0xC4, 0xF4, 0x91, 0xA9, 0xB9, 0x56, 0xDD, 0xE1, 0xAC, 0x14, 0x22, 0x07, + 0x22, 0x4E, 0xC1, 0xB5, 0x5D, 0x3D, 0xEE, 0xD2, 0xCB, 0x4B, 0xF5, 0x95, 0xA9, 0x74, 0xF2, 0x9D, + 0x36, 0x4E, 0xD8, 0x74, 0xBD, 0x7E, 0x0C, 0x01, 0xA6, 0xF3, 0x9C, 0xCE, 0xBC, 0x8F, 0xDB, 0x71, + 0xD4, 0xCD, 0x6A, 0x98, 0x4A, 0x7B, 0x5F, 0xDA, 0x09, 0x21, 0xAC, 0x00, 0xAF, 0xD6, 0x88, 0xEC, + 0xB6, 0xBD, 0x93, 0x8D, 0xE7, 0x95, 0x1C, 0xAB, 0x14, 0x32, 0xB9, 0xC1, 0x9E, 0x5C, 0xB9, 0xBF, + 0x58, 0xAE, 0x94, 0xCB, 0xB2, 0xE4, 0x4B, 0xF2, 0x9E, 0x20, 0x27, 0x70, 0x7E, 0xB2, 0xA9, 0x97, + 0xF4, 0x4B, 0xA4, 0x94, 0x0E, 0x21, 0x63, 0xED, 0x68, 0xC5, 0x96, 0x66, 0x2B, 0xB6, 0xF5, 0xF1, + 0xE9, 0x70, 0xF6, 0xD0, 0xCC, 0xDC, 0xDC, 0x74, 0xAD, 0xD5, 0x88, 0x62, 0xA3, 0x11, 0x38, 0x29, + 0x84, 0x15, 0x49, 0x73, 0xBC, 0xAD, 0x4B, 0x9C, 0xEA, 0xD1, 0xEA, 0xD2, 0xA9, 0x93, 0xF8, 0xDA, + 0xF1, 0xDF, 0x6D, 0xCE, 0xC0, 0x57, 0xAE, 0xFD, 0xF6, 0x18, 0x02, 0x76, 0x8D, 0x4F, 0x93, 0xCF, + 0xD4, 0x88, 0x8D, 0x71, 0x4A, 0xCA, 0x36, 0x70, 0x9D, 0x82, 0x6E, 0x74, 0x25, 0x19, 0xD2, 0x41, + 0x9A, 0x69, 0xEC, 0x65, 0xD3, 0xCF, 0x93, 0xC7, 0x78, 0x84, 0xF0, 0x9C, 0x73, 0x72, 0xAA, 0xDA, + 0x94, 0x47, 0xE6, 0x9A, 0x07, 0x85, 0x40, 0x7A, 0x4A, 0xAA, 0x8C, 0xEF, 0x79, 0xB9, 0x8C, 0xE7, + 0x67, 0x7D, 0x15, 0x28, 0x21, 0x54, 0xBA, 0x45, 0xE3, 0xAC, 0xC5, 0x46, 0xDA, 0xE8, 0x46, 0x18, + 0xC7, 0xAD, 0xC8, 0xC4, 0xDA, 0x58, 0x6B, 0x9D, 0xB3, 0x49, 0x57, 0x5E, 0x38, 0x29, 0x85, 0x65, + 0x7E, 0x4C, 0xEB, 0x2E, 0xBD, 0xDA, 0x04, 0x34, 0x80, 0x2A, 0x30, 0x9B, 0x9E, 0x1B, 0xE9, 0x77, + 0x6D, 0x22, 0x9C, 0xA7, 0x04, 0x6F, 0x39, 0x7B, 0x2D, 0xBB, 0xC7, 0xA6, 0xF8, 0xE9, 0x62, 0x04, + 0xD4, 0x1B, 0x21, 0xF5, 0x23, 0x73, 0xE4, 0xFA, 0x8A, 0xDD, 0x96, 0x6F, 0x03, 0x6D, 0x67, 0x56, + 0x9D, 0xBE, 0xAF, 0x02, 0xB9, 0x14, 0x7C, 0x9B, 0x98, 0xB6, 0x78, 0x80, 0x12, 0x42, 0x28, 0x95, + 0xFC, 0xC3, 0x98, 0xB4, 0xD6, 0xC9, 0x46, 0x2B, 0x16, 0xF5, 0x56, 0x24, 0xE9, 0xD8, 0xE0, 0xA8, + 0x6B, 0x0A, 0x91, 0xB4, 0xD4, 0x84, 0x48, 0xB6, 0x23, 0x94, 0xE8, 0x80, 0xEE, 0x06, 0xDF, 0x4D, + 0x40, 0xDB, 0x1B, 0x23, 0x8E, 0x4E, 0x7B, 0x0D, 0xA0, 0x96, 0xEA, 0x56, 0x4D, 0x3F, 0x8B, 0x01, + 0xE3, 0x9C, 0x73, 0xC3, 0xBD, 0x25, 0xF7, 0xBA, 0x93, 0x96, 0x52, 0xC8, 0x07, 0x8B, 0x13, 0x80, + 0x10, 0xE4, 0xFB, 0x4B, 0x48, 0x21, 0x3A, 0x2D, 0xC0, 0x54, 0xC9, 0xB0, 0x2B, 0xB9, 0x84, 0xE9, + 0x20, 0x6D, 0xCB, 0xB7, 0xE3, 0xAE, 0x1B, 0x7C, 0x3B, 0x06, 0xDB, 0x71, 0xA8, 0x20, 0x9D, 0xF2, + 0x11, 0xB2, 0xB3, 0x39, 0x37, 0x9F, 0x04, 0xD7, 0x75, 0xB6, 0x5D, 0xE7, 0xE3, 0x59, 0x7F, 0x31, + 0x12, 0x42, 0xE6, 0xD7, 0x01, 0xED, 0x24, 0x68, 0x00, 0xE7, 0xFB, 0xCA, 0x7D, 0xE0, 0xBA, 0x73, + 0x78, 0x70, 0xCB, 0x5E, 0x3E, 0xB7, 0x28, 0x01, 0x0F, 0x7E, 0x02, 0xF9, 0xE6, 0x4F, 0x2C, 0x8C, + 0x7F, 0xDD, 0xA5, 0x8C, 0x4E, 0x6F, 0xEE, 0x2F, 0x22, 0x0B, 0x81, 0x77, 0x13, 0xD0, 0x9D, 0x8C, + 0xDA, 0x49, 0xF5, 0x78, 0xC7, 0xF1, 0x08, 0x68, 0x8F, 0x6F, 0xBA, 0xA4, 0x1D, 0xEB, 0x71, 0x97, + 0x44, 0x5D, 0x9F, 0xB5, 0xAF, 0x77, 0x80, 0xDB, 0xB6, 0x65, 0x3F, 0x1B, 0xFE, 0xE8, 0xF3, 0x8C, + 0x4D, 0xCC, 0xC1, 0xA2, 0x04, 0x1C, 0xAB, 0x48, 0xFB, 0xDC, 0x4D, 0x40, 0xDC, 0x65, 0xD5, 0xC5, + 0xC0, 0x76, 0xBF, 0x6E, 0x17, 0x53, 0x62, 0x81, 0xBC, 0x12, 0x01, 0xDD, 0x63, 0x2E, 0x46, 0x84, + 0x59, 0x40, 0x48, 0x77, 0x88, 0x98, 0x45, 0xAE, 0x47, 0x08, 0xE1, 0x0A, 0x03, 0x45, 0x76, 0x8D, + 0x4D, 0x71, 0xFD, 0x25, 0x1B, 0xE7, 0xB9, 0xDE, 0x31, 0x47, 0x71, 0xBE, 0x17, 0x74, 0x5F, 0xDB, + 0x0D, 0xA0, 0xFB, 0xB5, 0x5C, 0xE4, 0xBB, 0xEE, 0xCF, 0xBA, 0x85, 0x45, 0xCE, 0x0B, 0x09, 0x5F, + 0x48, 0xC4, 0x42, 0x42, 0x16, 0x92, 0xB3, 0xF0, 0xBC, 0xF0, 0xF7, 0x9D, 0xA3, 0x76, 0xEF, 0xC7, + 0x8E, 0x01, 0xF5, 0x6A, 0x49, 0x58, 0x4C, 0xF1, 0x85, 0xC4, 0x74, 0xBF, 0x7E, 0x25, 0xC0, 0xAF, + 0x74, 0x1C, 0x8F, 0x90, 0xC5, 0xC8, 0xE1, 0x65, 0xCE, 0x8B, 0x82, 0x07, 0xF8, 0xBF, 0xBC, 0x7A, + 0x38, 0x97, 0x7C, 0xD1, 0xFC, 0xA1, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, + 0x74, 0x65, 0x3A, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x32, 0x30, 0x2D, 0x30, + 0x33, 0x2D, 0x31, 0x39, 0x54, 0x31, 0x30, 0x3A, 0x35, 0x30, 0x3A, 0x35, 0x38, 0x2B, 0x30, 0x30, + 0x3A, 0x30, 0x30, 0x62, 0x40, 0x28, 0xF1, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, + 0x61, 0x74, 0x65, 0x3A, 0x6D, 0x6F, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x39, 0x2D, + 0x30, 0x31, 0x2D, 0x30, 0x38, 0x54, 0x31, 0x35, 0x3A, 0x35, 0x34, 0x3A, 0x32, 0x33, 0x2B, 0x30, + 0x30, 0x3A, 0x30, 0x30, 0x8A, 0xEF, 0xF9, 0x19, 0x00, 0x00, 0x00, 0x20, 0x74, 0x45, 0x58, 0x74, + 0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3A, 0x2F, + 0x2F, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x6D, 0x61, 0x67, 0x69, 0x63, 0x6B, 0x2E, 0x6F, 0x72, 0x67, + 0xBC, 0xCF, 0x1D, 0x9D, 0x00, 0x00, 0x00, 0x18, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, + 0x62, 0x3A, 0x3A, 0x44, 0x6F, 0x63, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3A, 0x3A, 0x50, 0x61, 0x67, + 0x65, 0x73, 0x00, 0x31, 0xA7, 0xFF, 0xBB, 0x2F, 0x00, 0x00, 0x00, 0x18, 0x74, 0x45, 0x58, 0x74, + 0x54, 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x49, 0x6D, 0x61, 0x67, 0x65, 0x3A, 0x3A, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x00, 0x31, 0x32, 0x38, 0x43, 0x7C, 0x41, 0x80, 0x00, 0x00, 0x00, 0x17, + 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x49, 0x6D, 0x61, 0x67, 0x65, + 0x3A, 0x3A, 0x57, 0x69, 0x64, 0x74, 0x68, 0x00, 0x31, 0x32, 0x38, 0xD0, 0x8D, 0x11, 0xDD, 0x00, + 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x4D, 0x69, + 0x6D, 0x65, 0x74, 0x79, 0x70, 0x65, 0x00, 0x69, 0x6D, 0x61, 0x67, 0x65, 0x2F, 0x70, 0x6E, 0x67, + 0x3F, 0xB2, 0x56, 0x4E, 0x00, 0x00, 0x00, 0x17, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, 0x6D, + 0x62, 0x3A, 0x3A, 0x4D, 0x54, 0x69, 0x6D, 0x65, 0x00, 0x31, 0x35, 0x34, 0x36, 0x39, 0x36, 0x32, + 0x38, 0x36, 0x33, 0x1F, 0x1E, 0xB3, 0x01, 0x00, 0x00, 0x00, 0x12, 0x74, 0x45, 0x58, 0x74, 0x54, + 0x68, 0x75, 0x6D, 0x62, 0x3A, 0x3A, 0x53, 0x69, 0x7A, 0x65, 0x00, 0x31, 0x39, 0x32, 0x37, 0x34, + 0x42, 0x0A, 0x19, 0xAB, 0x42, 0x00, 0x00, 0x00, 0x56, 0x74, 0x45, 0x58, 0x74, 0x54, 0x68, 0x75, + 0x6D, 0x62, 0x3A, 0x3A, 0x55, 0x52, 0x49, 0x00, 0x66, 0x69, 0x6C, 0x65, 0x3A, 0x2F, 0x2F, 0x2F, + 0x64, 0x61, 0x74, 0x61, 0x2F, 0x77, 0x77, 0x77, 0x72, 0x6F, 0x6F, 0x74, 0x2F, 0x77, 0x77, 0x77, + 0x2E, 0x65, 0x61, 0x73, 0x79, 0x69, 0x63, 0x6F, 0x6E, 0x2E, 0x6E, 0x65, 0x74, 0x2F, 0x63, 0x64, + 0x6E, 0x2D, 0x69, 0x6D, 0x67, 0x2E, 0x65, 0x61, 0x73, 0x79, 0x69, 0x63, 0x6F, 0x6E, 0x2E, 0x63, + 0x6E, 0x2F, 0x66, 0x69, 0x6C, 0x65, 0x73, 0x2F, 0x32, 0x2F, 0x32, 0x39, 0x31, 0x36, 0x35, 0x2E, + 0x70, 0x6E, 0x67, 0xBF, 0x98, 0x5F, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, + 0x42, 0x60, 0x82 +}; + +void *get_window_icon_raw_data(int *len) +{ + *len = (int)sizeof(window_icon_hexData); + return window_icon_hexData; +} + diff --git a/src/gui/QT/main.cpp b/src/gui/QT/main.cpp new file mode 100644 index 0000000..dc2f917 --- /dev/null +++ b/src/gui/QT/main.cpp @@ -0,0 +1,467 @@ +#include "hiperiso2diskwindow.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +extern "C" { +#include "hiperiso_define.h" +#include "hiperiso_util.h" +#include "hiperiso_qt.h" +} + +using namespace std; + +char g_log_file[4096]; +char g_ini_file[4096]; + +/* + * Hiperiso2Disk global stylesheet. + * + * This is a self-contained copy of hiperiso.qss so the binary needs no + * external file at runtime. Keep this in sync with src/gui/QT/hiperiso.qss. + * Brand accent: #2d8e57 (green). + */ +static const char *g_hiperiso_qss = R"CSS( +QWidget { + color: #1f2933; +} + +QMainWindow { + background-color: #eef1f5; +} + +QGroupBox { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 6px; + margin-top: 14px; + padding: 14px 10px 10px 10px; + font-weight: bold; + color: #2d8e57; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 6px; + background-color: #ffffff; + color: #2d8e57; + font-weight: bold; +} + +QComboBox { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 4px 28px 4px 10px; + min-height: 22px; + color: #1f2933; + selection-background-color: #2d8e57; + selection-color: #ffffff; +} + +QComboBox:hover { + border: 1px solid #2d8e57; +} + +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 24px; + border-left: 1px solid #d4d7dd; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + background-color: #f5f6f8; +} + +QComboBox::drop-down:hover { + background-color: #e6efe9; +} + +QComboBox QAbstractItemView { + border: 1px solid #c4c9d2; + border-radius: 4px; + background-color: #ffffff; + selection-background-color: #2d8e57; + selection-color: #ffffff; + outline: none; + padding: 4px; +} + +QProgressBar { + background-color: #e6e9ee; + border: 1px solid #c4c9d2; + border-radius: 4px; + text-align: center; + color: #ffffff; + font-weight: bold; + min-height: 22px; +} + +QProgressBar::chunk { + background-color: #2d8e57; + border-radius: 3px; +} + +QLabel { + color: #1f2933; +} + +QGroupBox QLabel { + background: transparent; +} + +QPushButton { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 6px 16px; + color: #1f2933; + min-height: 20px; +} + +QPushButton:hover { + background-color: #f0f3f6; + border: 1px solid #2d8e57; + color: #2d8e57; +} + +QPushButton:pressed { + background-color: #e3e8ed; +} + +QPushButton:disabled { + color: #a0a6b0; + background-color: #f2f4f7; + border: 1px solid #dde0e6; +} + +QPushButton#ButtonInstall, +QPushButton#ButtonUpdate { + background-color: #2d8e57; + border: 1px solid #256e44; + color: #ffffff; + font-weight: 600; +} + +QPushButton#ButtonInstall:hover, +QPushButton#ButtonUpdate:hover { + background-color: #329f66; + border: 1px solid #256e44; + color: #ffffff; +} + +QPushButton#ButtonInstall:pressed, +QPushButton#ButtonUpdate:pressed { + background-color: #256e44; + color: #ffffff; +} + +QPushButton#ButtonInstall:disabled, +QPushButton#ButtonUpdate:disabled { + background-color: #a9cdb8; + border: 1px solid #94bda3; + color: #f2f7f4; +} + +QPushButton#ButtonRefresh { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; +} + +QPushButton#ButtonRefresh:hover { + background-color: #e6efe9; + border: 1px solid #2d8e57; +} + +QPushButton#ButtonRefresh:pressed { + background-color: #d2e4d9; +} + +QMenuBar { + background-color: #ffffff; + color: #1f2933; + border-bottom: 1px solid #d4d7dd; + padding: 2px; +} + +QMenuBar::item { + background-color: transparent; + padding: 6px 12px; + border-radius: 3px; +} + +QMenuBar::item:selected { + background-color: #e6efe9; + color: #2d8e57; +} + +QMenu { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 4px; + padding: 4px; +} + +QMenu::item { + padding: 6px 24px; + border-radius: 3px; +} + +QMenu::item:selected { + background-color: #2d8e57; + color: #ffffff; +} + +QMenu::separator { + height: 1px; + background: #e3e6eb; + margin: 4px 8px; +} + +QScrollBar:vertical { + background: #eef1f5; + width: 10px; + border: none; +} + +QScrollBar::handle:vertical { + background: #c4c9d2; + border-radius: 4px; + min-height: 24px; +} + +QScrollBar::handle:vertical:hover { + background: #2d8e57; +} + +QScrollBar::add-line:vertical, +QScrollBar::sub-line:vertical { + height: 0px; +} + +QScrollBar::add-page:vertical, +QScrollBar::sub-page:vertical { + background: none; +} + +QToolTip { + background-color: #1f2933; + color: #ffffff; + border: 1px solid #1f2933; + border-radius: 3px; + padding: 4px 8px; +} + +/* ---- Dialog (PartCfg etc.) ---- */ +QDialog { + background-color: #f5f6f8; +} + +QGroupBox { + background-color: #ffffff; + border: 1px solid #d4d7dd; + border-radius: 6px; + margin-top: 14px; + padding: 14px 10px 10px 10px; + font-weight: bold; + color: #2d8e57; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + left: 12px; + padding: 0 6px; + background-color: #ffffff; + color: #2d8e57; +} + +/* ---- Radio buttons & checkboxes ---- */ +QRadioButton { + spacing: 6px; + color: #1f2933; +} +QRadioButton::indicator { + width: 16px; + height: 16px; + border-radius: 8px; + border: 2px solid #c4c9d2; + background: #ffffff; +} +QRadioButton::indicator:hover { + border: 2px solid #2d8e57; +} +QRadioButton::indicator:checked { + border: 2px solid #2d8e57; + background: qradialgradient(cx:0.5, cy:0.5, radius:0.5, + fx:0.5, fy:0.5, + stop:0 #2d8e57, stop:0.5 #2d8e57, + stop:0.6 transparent, stop:1 transparent); +} + +QCheckBox { + spacing: 6px; + color: #1f2933; +} +QCheckBox::indicator { + width: 16px; + height: 16px; + border-radius: 3px; + border: 2px solid #c4c9d2; + background: #ffffff; +} +QCheckBox::indicator:hover { + border: 2px solid #2d8e57; +} +QCheckBox::indicator:checked { + border: 2px solid #2d8e57; + background: #2d8e57; + image: none; +} + +/* ---- Line edits & spin boxes ---- */ +QLineEdit, QSpinBox { + background-color: #ffffff; + border: 1px solid #c4c9d2; + border-radius: 4px; + padding: 4px 8px; + color: #1f2933; + selection-background-color: #2d8e57; + selection-color: #ffffff; +} +QLineEdit:focus, QSpinBox:focus { + border: 1px solid #2d8e57; +} +QSpinBox::up-button, QSpinBox::down-button { + background: #eef1f5; + border: none; + width: 18px; +} +QSpinBox::up-button:hover, QSpinBox::down-button:hover { + background: #d2e4d9; +} + +/* ---- Dialog buttons ---- */ +QDialogButtonBox QPushButton { + min-width: 72px; +} +)CSS"; + +static bool hiso_adjust_cur_dir(const QString &startDir) +{ + QDir dir(startDir); + + for (int i = 0; i < 6; i++) + { + if (QFileInfo::exists(dir.filePath("boot/boot.img"))) + { + return QDir::setCurrent(dir.absolutePath()); + } + + if (!dir.cdUp()) + { + break; + } + } + + return false; +} + +int main(int argc, char *argv[]) +{ + int ret; + long long size; + QApplication a(argc, argv); + a.setStyleSheet(QString::fromUtf8(g_hiperiso_qss)); + Hiperiso2DiskWindow w; + +#ifdef QT_CHECK_EUID + if (geteuid() != 0) + { + QMessageBox::critical(&w, "Error", "Permission denied!\nPlease run with root privileges."); + return 1; + } +#endif + + if (!QFileInfo::exists("./boot/boot.img")) + { + hiso_adjust_cur_dir(a.applicationDirPath()); + } + + if (!QFileInfo::exists("./boot/boot.img")) + { + QMessageBox::critical(&w, "Error", "Please run under the correct directory."); + return 1; + } + + hiperiso_log_init(); + + snprintf(g_log_file, sizeof(g_log_file), "./log.txt"); + snprintf(g_ini_file, sizeof(g_ini_file), "./Hiperiso2Disk.ini"); + for (int i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]); + } + } + + QFileInfo Info(g_log_file); + size = (long long)Info.size(); + if (size >= 4 * SIZE_1MB) + { + QFile::remove(g_log_file); + } + + vlog("===================================================\n"); + vlog("===== Hiperiso2Disk %s powered by QT %s =====\n", hiperiso_get_local_version(), qVersion()); + vlog("===================================================\n"); + vlog("log file is <%s> lastsize:%lld\n", g_log_file, (long long)size); + vlog("ini file is <%s>\n", g_ini_file); + + hiperiso_disk_init(); + hiperiso_http_init(); + + w.setGeometry(QStyle::alignedRect(Qt::LeftToRight, + Qt::AlignCenter, + w.size(), + a.desktop()->availableGeometry())); + + QPixmap pix; + QIcon icon; + int len; + const uchar *data; + + data = (const uchar *)get_window_icon_raw_data(&len); + pix.loadFromData(data, len); + icon.addPixmap(pix); + w.setWindowIcon(icon); + + w.show(); + + ret = a.exec(); + + hiperiso_disk_exit(); + hiperiso_http_exit(); + + vlog("######## Hiperiso2Disk QT %s exit ########\n", hiperiso_get_local_version()); + + /* log exit must at the end */ + hiperiso_log_exit(); + + return ret; +} diff --git a/src/gui/QT/moc_hiperiso2diskwindow.cpp b/src/gui/QT/moc_hiperiso2diskwindow.cpp new file mode 100644 index 0000000..a823f50 --- /dev/null +++ b/src/gui/QT/moc_hiperiso2diskwindow.cpp @@ -0,0 +1,312 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'hiperiso2diskwindow.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.19) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include +#include "hiperiso2diskwindow.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'hiperiso2diskwindow.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.15.19. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_MyQThread_t { + QByteArrayData data[5]; + char stringdata0[33]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_MyQThread_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_MyQThread_t qt_meta_stringdata_MyQThread = { + { +QT_MOC_LITERAL(0, 0, 9), // "MyQThread" +QT_MOC_LITERAL(1, 10, 12), // "thread_event" +QT_MOC_LITERAL(2, 23, 0), // "" +QT_MOC_LITERAL(3, 24, 3), // "msg" +QT_MOC_LITERAL(4, 28, 4) // "data" + + }, + "MyQThread\0thread_event\0\0msg\0data" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_MyQThread[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 1, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 1, // signalCount + + // signals: name, argc, parameters, tag, flags + 1, 2, 19, 2, 0x06 /* Public */, + + // signals: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + + 0 // eod +}; + +void MyQThread::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + default: ; + } + } else if (_c == QMetaObject::IndexOfMethod) { + int *result = reinterpret_cast(_a[0]); + { + using _t = void (MyQThread::*)(int , int ); + if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&MyQThread::thread_event)) { + *result = 0; + return; + } + } + } +} + +QT_INIT_METAOBJECT const QMetaObject MyQThread::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_MyQThread.data, + qt_meta_data_MyQThread, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *MyQThread::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *MyQThread::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_MyQThread.stringdata0)) + return static_cast(this); + return QThread::qt_metacast(_clname); +} + +int MyQThread::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 1) + qt_static_metacall(this, _c, _id, _a); + _id -= 1; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 1) + *reinterpret_cast(_a[0]) = -1; + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void MyQThread::thread_event(int _t1, int _t2) +{ + void *_a[] = { nullptr, const_cast(reinterpret_cast(std::addressof(_t1))), const_cast(reinterpret_cast(std::addressof(_t2))) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} +struct qt_meta_stringdata_Hiperiso2DiskWindow_t { + QByteArrayData data[21]; + char stringdata0[439]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_Hiperiso2DiskWindow_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_Hiperiso2DiskWindow_t qt_meta_stringdata_Hiperiso2DiskWindow = { + { +QT_MOC_LITERAL(0, 0, 19), // "Hiperiso2DiskWindow" +QT_MOC_LITERAL(1, 20, 12), // "thread_event" +QT_MOC_LITERAL(2, 33, 0), // "" +QT_MOC_LITERAL(3, 34, 3), // "msg" +QT_MOC_LITERAL(4, 38, 4), // "data" +QT_MOC_LITERAL(5, 43, 23), // "part_style_check_action" +QT_MOC_LITERAL(6, 67, 8), // "QAction*" +QT_MOC_LITERAL(7, 76, 3), // "act" +QT_MOC_LITERAL(8, 80, 17), // "lang_check_action" +QT_MOC_LITERAL(9, 98, 24), // "on_ButtonInstall_clicked" +QT_MOC_LITERAL(10, 123, 23), // "on_ButtonUpdate_clicked" +QT_MOC_LITERAL(11, 147, 24), // "on_ButtonRefresh_clicked" +QT_MOC_LITERAL(12, 172, 37), // "on_comboBoxDevice_currentInde..." +QT_MOC_LITERAL(13, 210, 5), // "index" +QT_MOC_LITERAL(14, 216, 42), // "on_actionPartition_Configurat..." +QT_MOC_LITERAL(15, 259, 33), // "on_actionClear_Hiperiso_trigg..." +QT_MOC_LITERAL(16, 293, 33), // "on_actionShow_All_Devices_tog..." +QT_MOC_LITERAL(17, 327, 4), // "arg1" +QT_MOC_LITERAL(18, 332, 38), // "on_actionSecure_Boot_Support_..." +QT_MOC_LITERAL(19, 371, 42), // "on_actionInstall_Non_Destruct..." +QT_MOC_LITERAL(20, 414, 24) // "on_actionAbout_triggered" + + }, + "Hiperiso2DiskWindow\0thread_event\0\0msg\0" + "data\0part_style_check_action\0QAction*\0" + "act\0lang_check_action\0on_ButtonInstall_clicked\0" + "on_ButtonUpdate_clicked\0" + "on_ButtonRefresh_clicked\0" + "on_comboBoxDevice_currentIndexChanged\0" + "index\0on_actionPartition_Configuration_triggered\0" + "on_actionClear_Hiperiso_triggered\0" + "on_actionShow_All_Devices_toggled\0" + "arg1\0on_actionSecure_Boot_Support_triggered\0" + "on_actionInstall_Non_Destructive_triggered\0" + "on_actionAbout_triggered" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_Hiperiso2DiskWindow[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 13, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 2, 79, 2, 0x08 /* Private */, + 5, 1, 84, 2, 0x08 /* Private */, + 8, 1, 87, 2, 0x08 /* Private */, + 9, 0, 90, 2, 0x08 /* Private */, + 10, 0, 91, 2, 0x08 /* Private */, + 11, 0, 92, 2, 0x08 /* Private */, + 12, 1, 93, 2, 0x08 /* Private */, + 14, 0, 96, 2, 0x08 /* Private */, + 15, 0, 97, 2, 0x08 /* Private */, + 16, 1, 98, 2, 0x08 /* Private */, + 18, 0, 101, 2, 0x08 /* Private */, + 19, 0, 102, 2, 0x08 /* Private */, + 20, 0, 103, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, QMetaType::Int, QMetaType::Int, 3, 4, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, 0x80000000 | 6, 7, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 13, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Bool, 17, + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, + + 0 // eod +}; + +void Hiperiso2DiskWindow::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->thread_event((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; + case 1: _t->part_style_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 2: _t->lang_check_action((*reinterpret_cast< QAction*(*)>(_a[1]))); break; + case 3: _t->on_ButtonInstall_clicked(); break; + case 4: _t->on_ButtonUpdate_clicked(); break; + case 5: _t->on_ButtonRefresh_clicked(); break; + case 6: _t->on_comboBoxDevice_currentIndexChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + case 7: _t->on_actionPartition_Configuration_triggered(); break; + case 8: _t->on_actionClear_Hiperiso_triggered(); break; + case 9: _t->on_actionShow_All_Devices_toggled((*reinterpret_cast< bool(*)>(_a[1]))); break; + case 10: _t->on_actionSecure_Boot_Support_triggered(); break; + case 11: _t->on_actionInstall_Non_Destructive_triggered(); break; + case 12: _t->on_actionAbout_triggered(); break; + default: ; + } + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + switch (_id) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 1: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + case 2: + switch (*reinterpret_cast(_a[1])) { + default: *reinterpret_cast(_a[0]) = -1; break; + case 0: + *reinterpret_cast(_a[0]) = qRegisterMetaType< QAction* >(); break; + } + break; + } + } +} + +QT_INIT_METAOBJECT const QMetaObject Hiperiso2DiskWindow::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_Hiperiso2DiskWindow.data, + qt_meta_data_Hiperiso2DiskWindow, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *Hiperiso2DiskWindow::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *Hiperiso2DiskWindow::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_Hiperiso2DiskWindow.stringdata0)) + return static_cast(this); + return QMainWindow::qt_metacast(_clname); +} + +int Hiperiso2DiskWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QMainWindow::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 13) + qt_static_metacall(this, _c, _id, _a); + _id -= 13; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 13) + qt_static_metacall(this, _c, _id, _a); + _id -= 13; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/src/gui/QT/moc_partcfgdialog.cpp b/src/gui/QT/moc_partcfgdialog.cpp new file mode 100644 index 0000000..1f6386b --- /dev/null +++ b/src/gui/QT/moc_partcfgdialog.cpp @@ -0,0 +1,129 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'partcfgdialog.h' +** +** Created by: The Qt Meta Object Compiler version 67 (Qt 5.15.19) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include +#include "partcfgdialog.h" +#include +#include +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'partcfgdialog.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 67 +#error "This file was generated using the moc from 5.15.19. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +QT_BEGIN_MOC_NAMESPACE +QT_WARNING_PUSH +QT_WARNING_DISABLE_DEPRECATED +struct qt_meta_stringdata_PartCfgDialog_t { + QByteArrayData data[6]; + char stringdata0[97]; +}; +#define QT_MOC_LITERAL(idx, ofs, len) \ + Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \ + qptrdiff(offsetof(qt_meta_stringdata_PartCfgDialog_t, stringdata0) + ofs \ + - idx * sizeof(QByteArrayData)) \ + ) +static const qt_meta_stringdata_PartCfgDialog_t qt_meta_stringdata_PartCfgDialog = { + { +QT_MOC_LITERAL(0, 0, 13), // "PartCfgDialog" +QT_MOC_LITERAL(1, 14, 23), // "on_pushButtonOK_clicked" +QT_MOC_LITERAL(2, 38, 0), // "" +QT_MOC_LITERAL(3, 39, 27), // "on_pushButtonCancel_clicked" +QT_MOC_LITERAL(4, 67, 24), // "on_checkBox_stateChanged" +QT_MOC_LITERAL(5, 92, 4) // "arg1" + + }, + "PartCfgDialog\0on_pushButtonOK_clicked\0" + "\0on_pushButtonCancel_clicked\0" + "on_checkBox_stateChanged\0arg1" +}; +#undef QT_MOC_LITERAL + +static const uint qt_meta_data_PartCfgDialog[] = { + + // content: + 8, // revision + 0, // classname + 0, 0, // classinfo + 3, 14, // methods + 0, 0, // properties + 0, 0, // enums/sets + 0, 0, // constructors + 0, // flags + 0, // signalCount + + // slots: name, argc, parameters, tag, flags + 1, 0, 29, 2, 0x08 /* Private */, + 3, 0, 30, 2, 0x08 /* Private */, + 4, 1, 31, 2, 0x08 /* Private */, + + // slots: parameters + QMetaType::Void, + QMetaType::Void, + QMetaType::Void, QMetaType::Int, 5, + + 0 // eod +}; + +void PartCfgDialog::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) +{ + if (_c == QMetaObject::InvokeMetaMethod) { + auto *_t = static_cast(_o); + (void)_t; + switch (_id) { + case 0: _t->on_pushButtonOK_clicked(); break; + case 1: _t->on_pushButtonCancel_clicked(); break; + case 2: _t->on_checkBox_stateChanged((*reinterpret_cast< int(*)>(_a[1]))); break; + default: ; + } + } +} + +QT_INIT_METAOBJECT const QMetaObject PartCfgDialog::staticMetaObject = { { + QMetaObject::SuperData::link(), + qt_meta_stringdata_PartCfgDialog.data, + qt_meta_data_PartCfgDialog, + qt_static_metacall, + nullptr, + nullptr +} }; + + +const QMetaObject *PartCfgDialog::metaObject() const +{ + return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject; +} + +void *PartCfgDialog::qt_metacast(const char *_clname) +{ + if (!_clname) return nullptr; + if (!strcmp(_clname, qt_meta_stringdata_PartCfgDialog.stringdata0)) + return static_cast(this); + return QDialog::qt_metacast(_clname); +} + +int PartCfgDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QDialog::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + if (_id < 3) + qt_static_metacall(this, _c, _id, _a); + _id -= 3; + } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) { + if (_id < 3) + *reinterpret_cast(_a[0]) = -1; + _id -= 3; + } + return _id; +} +QT_WARNING_POP +QT_END_MOC_NAMESPACE diff --git a/src/gui/QT/moc_predefs.h b/src/gui/QT/moc_predefs.h new file mode 100644 index 0000000..b38b876 --- /dev/null +++ b/src/gui/QT/moc_predefs.h @@ -0,0 +1,446 @@ +#define __DBL_MIN_EXP__ (-1021) +#define __LDBL_MANT_DIG__ 64 +#define __UINT_LEAST16_MAX__ 0xffff +#define __FLT16_HAS_QUIET_NAN__ 1 +#define __ATOMIC_ACQUIRE 2 +#define __FLT128_MAX_10_EXP__ 4932 +#define __FLT_MIN__ 1.17549435082228750796873653722224568e-38F +#define __GCC_IEC_559_COMPLEX 2 +#define __UINT_LEAST8_TYPE__ unsigned char +#define __SIZEOF_FLOAT80__ 16 +#define __BFLT16_DENORM_MIN__ 9.18354961579912115600575419704879436e-41BF16 +#define __INTMAX_C(c) c ## L +#define __CHAR_BIT__ 8 +#define __UINT8_MAX__ 0xff +#define __SCHAR_WIDTH__ 8 +#define __WINT_MAX__ 0xffffffffU +#define __FLT32_MIN_EXP__ (-125) +#define __cpp_static_assert 200410L +#define __BFLT16_MIN_10_EXP__ (-37) +#define __cpp_inheriting_constructors 201511L +#define __ORDER_LITTLE_ENDIAN__ 1234 +#define __WCHAR_MAX__ 0x7fffffff +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 1 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 1 +#define __GCC_ATOMIC_CHAR_LOCK_FREE 2 +#define __GCC_IEC_559 2 +#define __FLT32X_DECIMAL_DIG__ 17 +#define __FLT_EVAL_METHOD__ 0 +#define __cpp_binary_literals 201304L +#define __FLT64_DECIMAL_DIG__ 17 +#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2 +#define __cpp_variadic_templates 200704L +#define __UINT_FAST64_MAX__ 0xffffffffffffffffUL +#define __SIG_ATOMIC_TYPE__ int +#define __DBL_MIN_10_EXP__ (-307) +#define __FINITE_MATH_ONLY__ 0 +#define __FLT32X_MAX_EXP__ 1024 +#define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 1 +#define __FLT32_HAS_DENORM__ 1 +#define __UINT_FAST8_MAX__ 0xff +#define __cpp_rvalue_reference 200610L +#define __FLT32_MAX_10_EXP__ 38 +#define __DEC64_MAX_EXP__ 385 +#define __INT8_C(c) c +#define __LDBL_HAS_INFINITY__ 1 +#define __INT_LEAST8_WIDTH__ 8 +#define __UINT_LEAST64_MAX__ 0xffffffffffffffffUL +#define __INT_LEAST8_MAX__ 0x7f +#define __cpp_attributes 200809L +#define __SHRT_MAX__ 0x7fff +#define __LDBL_MAX__ 1.18973149535723176502126385303097021e+4932L +#define __FLT64X_MAX_10_EXP__ 4932 +#define __BFLT16_MAX_10_EXP__ 38 +#define __BFLT16_MAX_EXP__ 128 +#define __LDBL_IS_IEC_60559__ 1 +#define __FLT64X_HAS_QUIET_NAN__ 1 +#define __UINT_LEAST8_MAX__ 0xff +#define __GCC_ATOMIC_BOOL_LOCK_FREE 2 +#define __FLT128_DENORM_MIN__ 6.47517511943802511092443895822764655e-4966F128 +#define __UINTMAX_TYPE__ long unsigned int +#define __cpp_nsdmi 200809L +#define __BFLT16_DECIMAL_DIG__ 4 +#define __linux 1 +#define __DEC32_EPSILON__ 1E-6DF +#define __FLT_EVAL_METHOD_TS_18661_3__ 0 +#define __OPTIMIZE__ 1 +#define __UINT32_MAX__ 0xffffffffU +#define __GXX_EXPERIMENTAL_CXX0X__ 1 +#define __DBL_DENORM_MIN__ double(4.94065645841246544176568792868221372e-324L) +#define __FLT128_MIN_EXP__ (-16381) +#define __DEC64X_MAX_EXP__ 6145 +#define __WINT_MIN__ 0U +#define __FLT128_MIN_10_EXP__ (-4931) +#define __FLT32X_IS_IEC_60559__ 1 +#define __INT_LEAST16_WIDTH__ 16 +#define __SCHAR_MAX__ 0x7f +#define __FLT128_MANT_DIG__ 113 +#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) +#define __INT64_C(c) c ## L +#define __SSP_STRONG__ 3 +#define __GCC_ATOMIC_POINTER_LOCK_FREE 2 +#define __ATOMIC_SEQ_CST 5 +#define __unix 1 +#define __INT_LEAST64_MAX__ 0x7fffffffffffffffL +#define __FLT32X_MANT_DIG__ 53 +#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2 +#define __FLT64X_EPSILON__ 1.08420217248550443400745280086994171e-19F64x +#define __STDC_HOSTED__ 1 +#define __DEC64_MIN_EXP__ (-382) +#define __DBL_DIG__ 15 +#define __STDC_EMBED_EMPTY__ 2 +#define __FLT_EPSILON__ 1.19209289550781250000000000000000000e-7F +#define __GXX_WEAK__ 1 +#define __SHRT_WIDTH__ 16 +#define __FLT32_IS_IEC_60559__ 1 +#define __LDBL_MIN__ 3.36210314311209350626267781732175260e-4932L +#define __DBL_IS_IEC_60559__ 1 +#define __DEC32_MAX__ 9.999999E96DF +#define __cpp_threadsafe_static_init 200806L +#define __FLT64X_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951F64x +#define __FLT32X_HAS_INFINITY__ 1 +#define __unix__ 1 +#define __INT_WIDTH__ 32 +#define __STDC_IEC_559__ 1 +#define __STDC_ISO_10646__ 201706L +#define __DECIMAL_DIG__ 21 +#define __STDC_IEC_559_COMPLEX__ 1 +#define __gnu_linux__ 1 +#define __INT16_MAX__ 0x7fff +#define __FLT64_MIN_EXP__ (-1021) +#define __DEC64X_EPSILON__ 1E-33D64x +#define __FLT64X_MIN_10_EXP__ (-4931) +#define __LDBL_HAS_QUIET_NAN__ 1 +#define __FLT16_MIN_EXP__ (-13) +#define __FLT64_MANT_DIG__ 53 +#define __FLT64X_MANT_DIG__ 64 +#define __BFLT16_DIG__ 2 +#define __GNUC__ 16 +#define __GXX_RTTI 1 +#define __pie__ 2 +#define __MMX__ 1 +#define __FLT_HAS_DENORM__ 1 +#define __SIZEOF_LONG_DOUBLE__ 16 +#define __BIGGEST_ALIGNMENT__ 16 +#define __STDC_UTF_16__ 1 +#define __FLT64_MAX_10_EXP__ 308 +#define __BFLT16_IS_IEC_60559__ 0 +#define __FLT16_MAX_10_EXP__ 4 +#define __cpp_delegating_constructors 200604L +#define __DBL_MAX__ double(1.79769313486231570814527423731704357e+308L) +#define __cpp_raw_strings 200710L +#define __INT_FAST32_MAX__ 0x7fffffffffffffffL +#define __DBL_HAS_INFINITY__ 1 +#define __INT64_MAX__ 0x7fffffffffffffffL +#define __SIZEOF_FLOAT__ 4 +#define __HAVE_SPECULATION_SAFE_VALUE 1 +#define __DEC32_MIN_EXP__ (-94) +#define __INTPTR_WIDTH__ 64 +#define __UINT_LEAST32_MAX__ 0xffffffffU +#define __FLT32X_HAS_DENORM__ 1 +#define __INT_FAST16_TYPE__ long int +#define __MMX_WITH_SSE__ 1 +#define __LDBL_HAS_DENORM__ 1 +#define __SEG_GS 1 +#define __BFLT16_EPSILON__ 7.81250000000000000000000000000000000e-3BF16 +#define __cplusplus 201103L +#define __cpp_ref_qualifiers 200710L +#define __DEC32_MIN__ 1E-95DF +#define __DEPRECATED 1 +#define __cpp_rvalue_references 200610L +#define __DBL_MAX_EXP__ 1024 +#define __WCHAR_WIDTH__ 32 +#define __FLT32_MAX__ 3.40282346638528859811704183484516925e+38F32 +#define __DEC128_EPSILON__ 1E-33DL +#define __FLT16_DECIMAL_DIG__ 5 +#define __SSE2_MATH__ 1 +#define __ATOMIC_HLE_RELEASE 131072 +#define __PTRDIFF_MAX__ 0x7fffffffffffffffL +#define __amd64 1 +#define __DEC64X_MAX__ 9.999999999999999999999999999999999E6144D64x +#define __ATOMIC_HLE_ACQUIRE 65536 +#define __GNUG__ 16 +#define __LONG_LONG_MAX__ 0x7fffffffffffffffLL +#define __SIZEOF_SIZE_T__ 8 +#define __BFLT16_HAS_INFINITY__ 1 +#define __FLT64X_MIN_EXP__ (-16381) +#define __SIZEOF_WINT_T__ 4 +#define __FLT32X_DIG__ 15 +#define __LONG_LONG_WIDTH__ 64 +#define __cpp_initializer_lists 200806L +#define __FLT32_MAX_EXP__ 128 +#define __cpp_hex_float 201603L +#define __GXX_ABI_VERSION 1021 +#define __FLT_MIN_EXP__ (-125) +#define __GCC_HAVE_DWARF2_CFI_ASM 1 +#define __x86_64 1 +#define __cpp_lambdas 200907L +#define __INT_FAST64_TYPE__ long int +#define __BFLT16_MAX__ 3.38953138925153547590470800371487867e+38BF16 +#define __FLT64_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F64 +#define __FLT16_DENORM_MIN__ 5.96046447753906250000000000000000000e-8F16 +#define __FLT128_EPSILON__ 1.92592994438723585305597794258492732e-34F128 +#define __FLT64X_NORM_MAX__ 1.18973149535723176502126385303097021e+4932F64x +#define __SIZEOF_POINTER__ 8 +#define __SIZE_TYPE__ long unsigned int +#define __LP64__ 1 +#define __DBL_HAS_QUIET_NAN__ 1 +#define __FLT32X_EPSILON__ 2.22044604925031308084726333618164062e-16F32x +#define __LDBL_MAX_EXP__ 16384 +#define __DECIMAL_BID_FORMAT__ 1 +#define __FLT64_MIN_10_EXP__ (-307) +#define __FLT16_MIN_10_EXP__ (-4) +#define __FLT64X_DECIMAL_DIG__ 21 +#define __DEC128_MIN__ 1E-6143DL +#define __REGISTER_PREFIX__ +#define __UINT16_MAX__ 0xffff +#define __FLT128_HAS_INFINITY__ 1 +#define __FLT32_MIN__ 1.17549435082228750796873653722224568e-38F32 +#define __UINT8_TYPE__ unsigned char +#define __FLT_DIG__ 6 +#define __DEC_EVAL_METHOD__ 2 +#define __FLT_MANT_DIG__ 24 +#define __LDBL_DECIMAL_DIG__ 21 +#define __VERSION__ "16.1.1 20260430" +#define __UINT64_C(c) c ## UL +#define __cpp_unicode_characters 200704L +#define __DEC64X_MIN__ 1E-6143D64x +#define _STDC_PREDEF_H 1 +#define __INT_LEAST32_MAX__ 0x7fffffff +#define __GCC_ATOMIC_INT_LOCK_FREE 2 +#define __FLT128_MAX_EXP__ 16384 +#define __FLT32_MANT_DIG__ 24 +#define __cpp_decltype 200707L +#define __FLOAT_WORD_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __FLT32X_MIN_EXP__ (-1021) +#define __STDC_IEC_60559_COMPLEX__ 201404L +#define __BFLT16_MIN__ 1.17549435082228750796873653722224568e-38BF16 +#define __FLT128_HAS_DENORM__ 1 +#define __FLT32_DECIMAL_DIG__ 9 +#define __FLT128_DIG__ 33 +#define __INT32_C(c) c +#define __DEC64_EPSILON__ 1E-15DD +#define __ORDER_PDP_ENDIAN__ 3412 +#define __DEC128_MIN_EXP__ (-6142) +#define __DEC128_MAX__ 9.999999999999999999999999999999999E6144DL +#define __INT_FAST32_TYPE__ long int +#define __UINT_LEAST16_TYPE__ short unsigned int +#define __DEC64X_MANT_DIG__ 34 +#define __DEC128_MAX_EXP__ 6145 +#define unix 1 +#define __DBL_HAS_DENORM__ 1 +#define __cpp_rtti 199711L +#define __UINT64_MAX__ 0xffffffffffffffffUL +#define __FLT_IS_IEC_60559__ 1 +#define __GNUC_WIDE_EXECUTION_CHARSET_NAME "UTF-32LE" +#define __FLT64X_DIG__ 18 +#define __INT8_TYPE__ signed char +#define __ELF__ 1 +#define __GCC_ASM_FLAG_OUTPUTS__ 1 +#define __UINT32_TYPE__ unsigned int +#define __BFLT16_HAS_QUIET_NAN__ 1 +#define __FLT_RADIX__ 2 +#define __INT_LEAST16_TYPE__ short int +#define __LDBL_EPSILON__ 1.08420217248550443400745280086994171e-19L +#define __UINTMAX_C(c) c ## UL +#define __FLT16_DIG__ 3 +#define __k8 1 +#define __FLT32X_MIN__ 2.22507385850720138309023271733240406e-308F32x +#define __SIG_ATOMIC_MAX__ 0x7fffffff +#define __cpp_constexpr 200704L +#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 +#define __USER_LABEL_PREFIX__ +#define __STDC_IEC_60559_BFP__ 201404L +#define __SIZEOF_PTRDIFF_T__ 8 +#define __FLT64X_HAS_INFINITY__ 1 +#define __SIZEOF_LONG__ 8 +#define __LDBL_DIG__ 18 +#define __FLT64_IS_IEC_60559__ 1 +#define __x86_64__ 1 +#define __FLT16_IS_IEC_60559__ 1 +#define __FLT16_MAX_EXP__ 16 +#define __DEC32_SUBNORMAL_MIN__ 0.000001E-95DF +#define __STDC_EMBED_FOUND__ 1 +#define __INT_FAST16_MAX__ 0x7fffffffffffffffL +#define __GCC_CONSTRUCTIVE_SIZE 64 +#define __FLT64_DIG__ 15 +#define __UINT_FAST32_MAX__ 0xffffffffffffffffUL +#define __UINT_LEAST64_TYPE__ long unsigned int +#define __FLT16_EPSILON__ 9.76562500000000000000000000000000000e-4F16 +#define __FLT_HAS_QUIET_NAN__ 1 +#define __FLT_MAX_10_EXP__ 38 +#define __FLT64X_HAS_DENORM__ 1 +#define __DEC128_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143DL +#define __FLT_HAS_INFINITY__ 1 +#define __GNUC_EXECUTION_CHARSET_NAME "UTF-8" +#define __cpp_unicode_literals 200710L +#define __UINT_FAST16_TYPE__ long unsigned int +#define __DEC64_MAX__ 9.999999999999999E384DD +#define __STDC_EMBED_NOT_FOUND__ 0 +#define __INT_FAST32_WIDTH__ 64 +#define __CHAR16_TYPE__ short unsigned int +#define __PRAGMA_REDEFINE_EXTNAME 1 +#define __DEC64X_SUBNORMAL_MIN__ 0.000000000000000000000000000000001E-6143D64x +#define __SIZE_WIDTH__ 64 +#define __SEG_FS 1 +#define __INT_LEAST16_MAX__ 0x7fff +#define __FLT16_NORM_MAX__ 6.55040000000000000000000000000000000e+4F16 +#define __DEC64_MANT_DIG__ 16 +#define __FLT32_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F32 +#define __SIG_ATOMIC_WIDTH__ 32 +#define __INT_LEAST64_TYPE__ long int +#define __INT16_TYPE__ short int +#define __INT_LEAST8_TYPE__ signed char +#define __FLT16_MAX__ 6.55040000000000000000000000000000000e+4F16 +#define __FLT128_MIN__ 3.36210314311209350626267781732175260e-4932F128 +#define __SIZEOF_INT__ 4 +#define __DEC32_MAX_EXP__ 97 +#define __INT_FAST8_MAX__ 0x7f +#define __FLT128_MAX__ 1.18973149535723176508575932662800702e+4932F128 +#define __INTPTR_MAX__ 0x7fffffffffffffffL +#define linux 1 +#define __FLT64_HAS_QUIET_NAN__ 1 +#define __FLT32_MIN_10_EXP__ (-37) +#define __EXCEPTIONS 1 +#define __UINT16_C(c) c +#define __PTRDIFF_WIDTH__ 64 +#define __cpp_range_based_for 200907L +#define __INT_FAST16_WIDTH__ 64 +#define __FLT64_HAS_INFINITY__ 1 +#define __FLT64X_MAX__ 1.18973149535723176502126385303097021e+4932F64x +#define __FLT16_HAS_INFINITY__ 1 +#define __SIG_ATOMIC_MIN__ (-__SIG_ATOMIC_MAX__ - 1) +#define __code_model_small__ 1 +#define __GCC_ATOMIC_LONG_LOCK_FREE 2 +#define __DEC32_MANT_DIG__ 7 +#define __k8__ 1 +#define __INTPTR_TYPE__ long int +#define __UINT16_TYPE__ short unsigned int +#define __WCHAR_TYPE__ int +#define __pic__ 2 +#define __UINTPTR_MAX__ 0xffffffffffffffffUL +#define __INT_FAST64_WIDTH__ 64 +#define __INT_FAST64_MAX__ 0x7fffffffffffffffL +#define __GCC_ATOMIC_TEST_AND_SET_TRUEVAL 1 +#define __FLT_NORM_MAX__ 3.40282346638528859811704183484516925e+38F +#define __FLT32_HAS_INFINITY__ 1 +#define __FLT64X_MAX_EXP__ 16384 +#define __UINT_FAST64_TYPE__ long unsigned int +#define __BFLT16_MIN_EXP__ (-125) +#define __INT_MAX__ 0x7fffffff +#define __linux__ 1 +#define __INT64_TYPE__ long int +#define __FLT_MAX_EXP__ 128 +#define __ORDER_BIG_ENDIAN__ 4321 +#define __DBL_MANT_DIG__ 53 +#define __SIZEOF_FLOAT128__ 16 +#define __BFLT16_MANT_DIG__ 8 +#define __DEC64_MIN__ 1E-383DD +#define __WINT_TYPE__ unsigned int +#define __UINT_LEAST32_TYPE__ unsigned int +#define __SIZEOF_SHORT__ 2 +#define __FLT32_NORM_MAX__ 3.40282346638528859811704183484516925e+38F32 +#define __SSE__ 1 +#define __LDBL_MIN_EXP__ (-16381) +#define __FLT64_MAX__ 1.79769313486231570814527423731704357e+308F64 +#define __DEC64X_MIN_EXP__ (-6142) +#define __amd64__ 1 +#define __WINT_WIDTH__ 32 +#define __INT_LEAST64_WIDTH__ 64 +#define __FLT32X_MAX_10_EXP__ 308 +#define __SIZEOF_INT128__ 16 +#define __FLT16_MIN__ 6.10351562500000000000000000000000000e-5F16 +#define __FLT64X_IS_IEC_60559__ 1 +#define __GXX_CONSTEXPR_ASM__ 1 +#define __LDBL_MAX_10_EXP__ 4932 +#define __ATOMIC_RELAXED 0 +#define __DBL_EPSILON__ double(2.22044604925031308084726333618164062e-16L) +#define __INT_LEAST32_TYPE__ int +#define _LP64 1 +#define __UINT8_C(c) c +#define __FLT64_MAX_EXP__ 1024 +#define __SIZEOF_WCHAR_T__ 4 +#define __GNUC_PATCHLEVEL__ 1 +#define __FLT128_NORM_MAX__ 1.18973149535723176508575932662800702e+4932F128 +#define __FLT64_NORM_MAX__ 1.79769313486231570814527423731704357e+308F64 +#define __FLT128_HAS_QUIET_NAN__ 1 +#define __INTMAX_MAX__ 0x7fffffffffffffffL +#define __INT_FAST8_TYPE__ signed char +#define __FLT64X_MIN__ 3.36210314311209350626267781732175260e-4932F64x +#define __FLT64_EPSILON__ 2.22044604925031308084726333618164062e-16F64 +#define __STDCPP_THREADS__ 1 +#define __BFLT16_HAS_DENORM__ 1 +#define __GNUC_STDC_INLINE__ 1 +#define __FLT64_HAS_DENORM__ 1 +#define __FLT32_EPSILON__ 1.19209289550781250000000000000000000e-7F32 +#define __FLT16_HAS_DENORM__ 1 +#define __DBL_DECIMAL_DIG__ 17 +#define __STDC_UTF_32__ 1 +#define __INT_FAST8_WIDTH__ 8 +#define __FXSR__ 1 +#define __FLT32X_MAX__ 1.79769313486231570814527423731704357e+308F32x +#define __DBL_NORM_MAX__ double(1.79769313486231570814527423731704357e+308L) +#define __BYTE_ORDER__ __ORDER_LITTLE_ENDIAN__ +#define __GCC_DESTRUCTIVE_SIZE 64 +#define __INTMAX_WIDTH__ 64 +#define __cpp_runtime_arrays 198712L +#define __FLT32_DIG__ 6 +#define __UINT64_TYPE__ long unsigned int +#define __UINT32_C(c) c ## U +#define __cpp_alias_templates 200704L +#define __FLT_DENORM_MIN__ 1.40129846432481707092372958328991613e-45F +#define __FLT128_IS_IEC_60559__ 1 +#define __INT8_MAX__ 0x7f +#define __LONG_WIDTH__ 64 +#define __DBL_MIN__ double(2.22507385850720138309023271733240406e-308L) +#define __PIC__ 2 +#define __INT32_MAX__ 0x7fffffff +#define __UINT_FAST32_TYPE__ long unsigned int +#define __FLT16_MANT_DIG__ 11 +#define __FLT32X_NORM_MAX__ 1.79769313486231570814527423731704357e+308F32x +#define __CHAR32_TYPE__ unsigned int +#define __FLT_MAX__ 3.40282346638528859811704183484516925e+38F +#define __SSE2__ 1 +#define __BFLT16_NORM_MAX__ 3.38953138925153547590470800371487867e+38BF16 +#define __INT32_TYPE__ int +#define __SIZEOF_DOUBLE__ 8 +#define __cpp_exceptions 199711L +#define __FLT_MIN_10_EXP__ (-37) +#define __FLT64_MIN__ 2.22507385850720138309023271733240406e-308F64 +#define __INT_LEAST32_WIDTH__ 32 +#define __INTMAX_TYPE__ long int +#define __GLIBCXX_BITSIZE_INT_N_0 128 +#define __FLT32X_HAS_QUIET_NAN__ 1 +#define __ATOMIC_CONSUME 1 +#define __GNUC_MINOR__ 1 +#define __GLIBCXX_TYPE_INT_N_0 __int128 +#define __UINTMAX_MAX__ 0xffffffffffffffffUL +#define __PIE__ 2 +#define __FLT32X_DENORM_MIN__ 4.94065645841246544176568792868221372e-324F32x +#define __DBL_MAX_10_EXP__ 308 +#define __LDBL_DENORM_MIN__ 3.64519953188247460252840593361941982e-4951L +#define __INT16_C(c) c +#define __STDC__ 1 +#define __PTRDIFF_TYPE__ long int +#define __LONG_MAX__ 0x7fffffffffffffffL +#define __FLT32X_MIN_10_EXP__ (-307) +#define __UINTPTR_TYPE__ long unsigned int +#define __DEC64_SUBNORMAL_MIN__ 0.000000000000001E-383DD +#define __DEC128_MANT_DIG__ 34 +#define __LDBL_MIN_10_EXP__ (-4931) +#define __SSE_MATH__ 1 +#define __SIZEOF_LONG_LONG__ 8 +#define __cpp_user_defined_literals 200809L +#define __FLT128_DECIMAL_DIG__ 36 +#define __GCC_ATOMIC_LLONG_LOCK_FREE 2 +#define __FLT32_HAS_QUIET_NAN__ 1 +#define __FLT_DECIMAL_DIG__ 9 +#define __UINT_FAST16_MAX__ 0xffffffffffffffffUL +#define __LDBL_NORM_MAX__ 1.18973149535723176502126385303097021e+4932L +#define __GCC_ATOMIC_SHORT_LOCK_FREE 2 +#define __SIZE_MAX__ 0xffffffffffffffffUL +#define __UINT_FAST8_TYPE__ unsigned char +#define _GNU_SOURCE 1 +#define __ATOMIC_ACQ_REL 4 +#define __ATOMIC_RELEASE 3 diff --git a/src/gui/QT/partcfgdialog.cpp b/src/gui/QT/partcfgdialog.cpp new file mode 100644 index 0000000..0c50e75 --- /dev/null +++ b/src/gui/QT/partcfgdialog.cpp @@ -0,0 +1,144 @@ +#include "partcfgdialog.h" +#include "ui_partcfgdialog.h" +#include +#include + +PartCfgDialog::PartCfgDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::PartCfgDialog) +{ + reserve = false; + unit = 1; + align = true; + valuestr = ""; + resvalue = 0; + m_fs_type = 0; + m_cluster_size = 0; + + ui->setupUi(this); + + ui->lineEdit->setEnabled(false); + ui->comboBox->setEnabled(false); +} + +PartCfgDialog::~PartCfgDialog() +{ + delete ui; +} + +void PartCfgDialog::update_ui_status() +{ + ui->checkBox->setChecked(reserve); + ui->lineEdit->setEnabled(reserve); + ui->comboBox->setEnabled(reserve); + ui->checkBox_2->setChecked(align); + ui->comboBoxFsType->setCurrentIndex(m_fs_type); + + if (m_cluster_size > 0) + { + ui->lineEditClusterSize->setText(QString::number(m_cluster_size)); + } + else + { + ui->lineEditClusterSize->setText(""); + } +} + +void PartCfgDialog::update_language_ui(QJsonObject &obj) +{ + ui->checkBox->setText(_LANG_STR("STR_PRESERVE_SPACE")); + ui->checkBox_2->setText(_LANG_STR("STR_PART_ALIGN_4KB")); + ui->labelFsType->setText(_LANG_STR("STR_FS_TYPE")); + ui->labelClusterSize->setText(_LANG_STR("STR_CLUSTER_SIZE")); + ui->pushButtonOK->setText(_LANG_STR("STR_BTN_OK")); + ui->pushButtonCancel->setText(_LANG_STR("STR_BTN_CANCEL")); + + invalid_value = _LANG_STR("STR_SPACE_VAL_INVALID"); + invalid_cluster = _LANG_STR("STR_SPACE_VAL_INVALID"); + err_title = _LANG_STR("STR_ERROR"); +} + +void PartCfgDialog::on_pushButtonOK_clicked() +{ + if (ui->checkBox->isChecked()) + { + QString str = ui->lineEdit->text(); + + if (str.isEmpty()) + { + QMessageBox::critical(this, err_title, invalid_value); + return; + } + + for (int i = 0; i < str.size(); i++) + { + if (str[i] < '0' || str[i] > '9') + { + QMessageBox::critical(this, err_title, invalid_value); + return; + } + } + + valuestr = str; + resvalue = str.toLongLong(); + reserve = true; + } + else + { + reserve = false; + } + + align = ui->checkBox_2->isChecked(); + unit = ui->comboBox->currentIndex(); + m_fs_type = ui->comboBoxFsType->currentIndex(); + + { + QString cstr = ui->lineEditClusterSize->text().trimmed(); + + if (cstr.isEmpty()) + { + m_cluster_size = 0; + } + else + { + for (int i = 0; i < cstr.size(); i++) + { + if (cstr[i] < '0' || cstr[i] > '9') + { + QMessageBox::critical(this, err_title, invalid_cluster); + return; + } + } + + m_cluster_size = cstr.toInt(); + if (m_cluster_size <= 0) + { + QMessageBox::critical(this, err_title, invalid_cluster); + return; + } + } + } + + accept(); +} + +void PartCfgDialog::on_pushButtonCancel_clicked() +{ + reject(); +} + +void PartCfgDialog::on_checkBox_stateChanged(int arg1) +{ + (void)arg1; + + if (ui->checkBox->isChecked()) + { + ui->lineEdit->setEnabled(true); + ui->comboBox->setEnabled(true); + } + else + { + ui->lineEdit->setEnabled(false); + ui->comboBox->setEnabled(false); + } +} diff --git a/src/gui/QT/partcfgdialog.h b/src/gui/QT/partcfgdialog.h new file mode 100644 index 0000000..b28aa9c --- /dev/null +++ b/src/gui/QT/partcfgdialog.h @@ -0,0 +1,48 @@ +#ifndef PARTCFGDIALOG_H +#define PARTCFGDIALOG_H + +#include +#include + +namespace Ui { +class PartCfgDialog; +} + +class PartCfgDialog : public QDialog +{ + Q_OBJECT + +public: + + bool reserve; + int unit; + bool align; + QString valuestr; + qint64 resvalue; + + int m_fs_type; + int m_cluster_size; + + QString invalid_value; + QString err_title; + QString invalid_cluster; + void update_ui_status(); + void update_language_ui(QJsonObject &obj); + + explicit PartCfgDialog(QWidget *parent = nullptr); + ~PartCfgDialog(); + +private slots: + void on_pushButtonOK_clicked(); + + void on_pushButtonCancel_clicked(); + + void on_checkBox_stateChanged(int arg1); + +private: + Ui::PartCfgDialog *ui; +}; + +#define _LANG_STR(id) obj.value(id).toString() + +#endif // PARTCFGDIALOG_H diff --git a/src/gui/QT/partcfgdialog.ui b/src/gui/QT/partcfgdialog.ui new file mode 100644 index 0000000..16d8759 --- /dev/null +++ b/src/gui/QT/partcfgdialog.ui @@ -0,0 +1,253 @@ + + + PartCfgDialog + + + + 0 + 0 + 420 + 358 + + + + Partition Configuration + + + + + 90 + 310 + 90 + 30 + + + + OK + + + + + + 230 + 310 + 90 + 30 + + + + Cancel + + + + + + 10 + 10 + 400 + 51 + + + + + + + + + 10 + 10 + 381 + 41 + + + + Preserve some space at the end of the disk + + + 0 + + + + + + + 10 + 60 + 200 + 60 + + + + + + + + + 10 + 20 + 181 + 26 + + + + 14 + + + + + + + 210 + 60 + 200 + 60 + + + + + + + + + 10 + 20 + 181 + 26 + + + + 1 + + + + MB + + + + + GB + + + + + + + + 10 + 130 + 401 + 51 + + + + + + + + + 10 + 18 + 381 + 24 + + + + Align partitions with 4KB + + + true + + + + + + + 10 + 190 + 401 + 51 + + + + + + + + + 10 + 15 + 120 + 21 + + + + Filesystem: + + + + + + 140 + 12 + 241 + 26 + + + + 0 + + + + exFAT + + + + + NTFS + + + + + + + + 10 + 250 + 401 + 51 + + + + + + + + + 10 + 15 + 200 + 21 + + + + Cluster Size (sectors): + + + + + + 220 + 12 + 161 + 26 + + + + 10 + + + + + + + diff --git a/src/gui/QT/refresh_icon_data.c b/src/gui/QT/refresh_icon_data.c new file mode 100644 index 0000000..838371d --- /dev/null +++ b/src/gui/QT/refresh_icon_data.c @@ -0,0 +1,300 @@ +/****************************************************************************** + * refresh_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char refresh_icon_hexData[4286] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0xA8, 0x10, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x27, + 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xD9, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBE, + 0x31, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xB7, 0xCA, 0x59, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC0, 0xD1, + 0x6E, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xAF, 0xC5, 0x48, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xD4, 0xE0, + 0x9D, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFD, 0xFE, + 0xFB, 0xFF, 0xFB, 0xFC, 0xF5, 0xFF, 0xF2, 0xF6, 0xE1, 0xFF, 0xDD, 0xE6, 0xB1, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB2, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA8, 0xC0, 0x37, 0xFF, 0xCB, 0xD9, 0x87, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFA, 0xFB, + 0xF4, 0xFF, 0xD9, 0xE4, 0xA8, 0xFF, 0xAF, 0xC4, 0x46, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x71, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xD5, 0xE0, 0x9D, 0xFF, 0xFD, 0xFE, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, + 0xFD, 0xFF, 0xEE, 0xF3, 0xD9, 0xFF, 0xD9, 0xE3, 0xA8, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xE6, 0xEC, 0xC4, 0xFF, 0xFA, 0xFB, 0xF3, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0xED, 0xC7, 0xFF, 0xB1, 0xC6, 0x4C, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xCD, 0xDB, + 0x8C, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xF7, 0xE7, 0xFF, 0xCB, 0xD9, + 0x87, 0xFF, 0xAE, 0xC3, 0x43, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xBD, 0xCF, 0x66, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xAD, 0xC3, + 0x41, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBC, 0x2D, 0xFF, 0xB8, 0xCB, 0x5C, 0xFF, 0xF6, 0xF9, + 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0xF5, 0xDF, 0xFF, 0xBA, 0xCD, 0x60, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAE, 0xC4, + 0x44, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC7, 0xD6, + 0x7E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA9, 0xC0, + 0x39, 0xFF, 0xC8, 0xD7, 0x80, 0xFF, 0xD0, 0xDC, 0x92, 0xFF, 0xE7, 0xEE, 0xC8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xCC, 0xDA, 0x8A, 0xFF, 0xB0, 0xC5, + 0x49, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB0, 0xC6, 0x4A, 0xFF, 0xE3, 0xEA, 0xBE, 0xFF, 0xEA, 0xEF, 0xCE, 0xFF, 0xB8, 0xCB, + 0x5C, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA8, 0xC0, + 0x37, 0xFF, 0xE0, 0xE8, 0xB8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xF6, 0xE3, 0xFF, 0xB3, 0xC7, + 0x4F, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB6, 0xCA, 0x58, 0xFF, 0xF4, 0xF7, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xC9, 0xD8, 0x84, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x30, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xFE, 0xFE, 0xFD, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xAA, 0xC1, 0x3A, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xBB, 0xCE, 0x63, 0xFF, 0xA7, 0xBF, + 0x35, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xE6, 0xED, 0xC5, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xF7, 0xF9, 0xEC, 0xFF, 0xBD, 0xCF, + 0x67, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xBB, 0xCD, 0x63, 0xFF, 0xF6, 0xF8, + 0xEA, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB7, 0xCB, 0x5A, 0xFF, 0xF5, 0xF8, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE8, 0xEE, + 0xC9, 0xFF, 0xAC, 0xC2, 0x40, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA7, 0xBF, 0x34, 0xFF, 0xBA, 0xCD, + 0x60, 0xFF, 0xAB, 0xC2, 0x3E, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAA, 0xC1, + 0x3A, 0xFF, 0xE2, 0xEA, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xCF, 0xDC, 0x90, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xC9, 0xD8, + 0x84, 0xFF, 0xFD, 0xFE, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xB8, 0xCB, 0x5B, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA9, 0xC0, + 0x38, 0xFF, 0xA8, 0xBF, 0x37, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB2, 0xC7, 0x4F, 0xFF, 0xF2, 0xF6, + 0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB5, 0xC9, 0x54, 0xFF, 0xE4, 0xEB, + 0xC1, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xAF, 0xC5, 0x47, 0xFF, 0xCA, 0xD8, + 0x85, 0xFF, 0xE2, 0xE9, 0xBB, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0xEF, + 0xCD, 0xFF, 0xCE, 0xDB, 0x8F, 0xFF, 0xC7, 0xD6, 0x7E, 0xFF, 0xA9, 0xC0, 0x39, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xC6, 0xD6, 0x7C, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0xE8, 0xB5, 0xFF, 0xAC, 0xC3, 0x40, 0xFF, 0xA5, 0xBD, + 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xB5, 0xC9, + 0x55, 0xFF, 0xED, 0xF2, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9, 0xFB, 0xF1, 0xFF, 0xBC, 0xCE, + 0x65, 0xFF, 0xA4, 0xBC, 0x2C, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xAE, 0xC4, 0x44, 0xFF, 0xE6, 0xED, + 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE4, 0xEB, 0xC1, 0xFF, 0xB9, 0xCC, + 0x5E, 0xFF, 0xA7, 0xBF, 0x35, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xAB, 0xC1, 0x3D, 0xFF, 0xC5, 0xD5, 0x79, 0xFF, 0xF1, 0xF5, + 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xD3, 0xDF, 0x99, 0xFF, 0xA7, 0xBE, + 0x33, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xB3, 0xC8, + 0x51, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xE1, 0xE9, 0xBA, 0xFF, 0xCD, 0xDB, 0x8C, 0xFF, 0xC4, 0xD4, 0x78, 0xFF, 0xC6, 0xD6, + 0x7C, 0xFF, 0xD3, 0xDF, 0x9A, 0xFF, 0xE9, 0xEF, 0xCD, 0xFF, 0xFC, 0xFD, 0xF9, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xDB, 0xE4, 0xAB, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA6, 0xBE, + 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xB1, 0xC6, 0x4B, 0xFF, 0xDD, 0xE6, 0xB2, 0xFF, 0xFC, 0xFD, 0xF8, 0xFF, 0xFF, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0xFA, + 0xEE, 0xFF, 0xD1, 0xDE, 0x96, 0xFF, 0xAA, 0xC1, 0x3C, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA9, 0xC0, 0x38, 0xFF, 0xC1, 0xD2, 0x71, 0xFF, 0xE2, 0xEA, + 0xBC, 0xFF, 0xF5, 0xF8, 0xE9, 0xFF, 0xFD, 0xFD, 0xFA, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFE, 0xFF, + 0xFE, 0xFF, 0xFB, 0xFC, 0xF7, 0xFF, 0xF2, 0xF5, 0xE1, 0xFF, 0xDB, 0xE5, 0xAC, 0xFF, 0xB9, 0xCC, + 0x5F, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x31, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA8, 0xBF, + 0x36, 0xFF, 0xB3, 0xC7, 0x4F, 0xFF, 0xBF, 0xD0, 0x6B, 0xFF, 0xC5, 0xD5, 0x7A, 0xFF, 0xC4, 0xD4, + 0x78, 0xFF, 0xBC, 0xCE, 0x64, 0xFF, 0xB0, 0xC5, 0x48, 0xFF, 0xA6, 0xBE, 0x33, 0xFF, 0xA5, 0xBD, + 0x30, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xCF, 0xA6, 0xBE, 0x32, 0x35, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0xB2, 0xA6, 0xBE, + 0x32, 0xFE, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA5, 0xBD, 0x30, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA4, 0xBD, 0x2E, 0xFF, 0xA4, 0xBD, + 0x2E, 0xFF, 0xA5, 0xBD, 0x2F, 0xFF, 0xA5, 0xBE, 0x31, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFE, 0xA6, 0xBE, + 0x32, 0xB3, 0xA6, 0xBE, 0x32, 0x29, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x10, 0xA6, 0xBE, + 0x32, 0x71, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xDA, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, + 0x32, 0x10, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0xBF, 0xA6, 0xBE, + 0x32, 0xEB, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, + 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFF, 0xA6, 0xBE, 0x32, 0xFC, 0xA6, 0xBE, 0x32, 0xEB, 0xA6, 0xBE, + 0x32, 0xC0, 0xA6, 0xBE, 0x32, 0x73, 0xA6, 0xBE, 0x32, 0x21, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x0C, 0xA6, 0xBE, + 0x32, 0x2D, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x81, 0xA6, 0xBE, + 0x32, 0x81, 0xA6, 0xBE, 0x32, 0x72, 0xA6, 0xBE, 0x32, 0x54, 0xA6, 0xBE, 0x32, 0x2E, 0xA6, 0xBE, + 0x32, 0x0C, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBD, 0x31, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, + 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0xA6, 0xBE, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x80, + 0x01, 0xFF, 0xFE, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x0F, 0xE0, 0x00, + 0x00, 0x07, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, + 0x00, 0x01, 0xC0, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x07, 0xF0, 0x00, + 0x00, 0x0F, 0xF8, 0x00, 0x00, 0x1F, 0xFE, 0x00, 0x00, 0x7F, 0xFF, 0x80, 0x01, 0xFF +}; + +void *get_refresh_icon_raw_data(int *len) +{ + *len = (int)sizeof(refresh_icon_hexData); + return refresh_icon_hexData; +} + diff --git a/src/gui/QT/secure_icon_data.c b/src/gui/QT/secure_icon_data.c new file mode 100644 index 0000000..b3f8b7e --- /dev/null +++ b/src/gui/QT/secure_icon_data.c @@ -0,0 +1,91 @@ +/****************************************************************************** + * secure_icon_data.c + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + +#include +#include + +static unsigned char secure_icon_hexData[958] = { + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xA8, 0x03, + 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x20, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 0x46, 0x5C, + 0x00, 0x00, 0x46, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, + 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x53, 0x00, 0x8C, 0xFB, 0x52, 0x00, 0x8C, 0xFB, 0x2E, 0x00, 0x8C, + 0xFB, 0x01, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, + 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF7, 0x00, 0x8C, 0xFB, 0xF8, 0x00, 0x8C, + 0xFB, 0xDA, 0x00, 0x8C, 0xFB, 0x3E, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x78, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x86, 0xF1, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x7C, 0xDF, 0xFF, 0x00, 0x6C, 0xC4, 0xFF, 0x00, 0x7C, + 0xDF, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x7D, + 0xE1, 0xFF, 0x00, 0x87, 0xF2, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7A, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFC, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0x7B, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, 0xFB, 0xFF, 0x00, 0x8C, + 0xFB, 0x77, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0xD4, 0x01, 0x8B, 0xF9, 0xF7, 0x03, 0x89, + 0xF3, 0xFF, 0x01, 0x8B, 0xF8, 0xF8, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, 0xFB, 0xF4, 0x00, 0x8C, + 0xFB, 0xF4, 0x01, 0x8B, 0xF8, 0xF8, 0x03, 0x89, 0xF3, 0xFF, 0x01, 0x8B, 0xF9, 0xF7, 0x00, 0x8C, + 0xFB, 0xD4, 0x00, 0x8C, 0xFB, 0x3A, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x93, 0xFF, 0x1E, 0x1D, 0x6B, + 0xA9, 0x6B, 0x32, 0x54, 0x6F, 0xF6, 0x22, 0x65, 0x9A, 0x7D, 0x00, 0x90, 0xFF, 0x39, 0x00, 0x8C, + 0xFB, 0x3C, 0x00, 0x90, 0xFF, 0x39, 0x22, 0x65, 0x9A, 0x7D, 0x32, 0x54, 0x6F, 0xF6, 0x1D, 0x6B, + 0xA9, 0x6B, 0x00, 0x93, 0xFF, 0x1E, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x2A, 0x5D, + 0x85, 0x00, 0x46, 0x3D, 0x36, 0x3A, 0x43, 0x41, 0x3F, 0xF3, 0x45, 0x3F, 0x3A, 0x58, 0x26, 0x62, + 0x91, 0x00, 0x00, 0x8D, 0xFD, 0x00, 0x26, 0x62, 0x91, 0x00, 0x45, 0x3F, 0x3A, 0x58, 0x43, 0x41, + 0x3F, 0xF3, 0x46, 0x3D, 0x36, 0x3A, 0x2A, 0x5D, 0x85, 0x00, 0x00, 0x8C, 0xFB, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x01, 0x42, 0x42, + 0x42, 0x94, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x27, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x96, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x8E, 0x42, 0x42, 0x42, 0x53, 0x42, 0x42, + 0x42, 0x8E, 0x42, 0x42, 0x42, 0xF5, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x04, 0x42, 0x42, + 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, + 0x42, 0xF3, 0x42, 0x42, 0x42, 0xE9, 0x42, 0x42, 0x42, 0x96, 0x42, 0x42, 0x42, 0x16, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x31, 0x42, 0x42, 0x42, 0x4B, 0x42, 0x42, 0x42, 0x31, 0x42, 0x42, 0x42, 0x05, 0x42, 0x42, + 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x42, 0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, + 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00 +}; + +void *get_secure_icon_raw_data(int *len) +{ + *len = (int)sizeof(secure_icon_hexData); + return secure_icon_hexData; +} diff --git a/src/gui/QT/ui_hiperiso2diskwindow.h b/src/gui/QT/ui_hiperiso2diskwindow.h new file mode 100644 index 0000000..a1e493b --- /dev/null +++ b/src/gui/QT/ui_hiperiso2diskwindow.h @@ -0,0 +1,212 @@ +/******************************************************************************** +** Form generated from reading UI file 'hiperiso2diskwindow.ui' +** +** Created by: Qt User Interface Compiler version 5.15.19 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_HIPERISO2DISKWINDOW_H +#define UI_HIPERISO2DISKWINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_Hiperiso2DiskWindow +{ +public: + QAction *actionSecure_Boot_Support; + QAction *actionMBR; + QAction *actionGPT; + QAction *actionPartition_Configuration; + QAction *actionClear_Hiperiso; + QAction *actionShow_All_Devices; + QAction *actionAbout; + QWidget *centralwidget; + QGroupBox *groupBoxDevice; + QComboBox *comboBoxDevice; + QPushButton *ButtonRefresh; + QGroupBox *groupBoxHiperisoLocal; + QLabel *labelHiperisoLocalVer; + QLabel *labelHiperisoLocalPartStyle; + QLabel *labelHiperisoLocalSecure; + QGroupBox *groupBoxHiperisoDevice; + QLabel *labelHiperisoDeviceVer; + QLabel *labelHiperisoDevicePartStyle; + QLabel *labelHiperisoDeviceSecure; + QGroupBox *groupBoxStatus; + QProgressBar *progressBar; + QPushButton *ButtonInstall; + QPushButton *ButtonUpdate; + QMenuBar *menubar; + QMenu *menuOption; + QMenu *menuPartition_Style; + QMenu *menuLanguage; + QMenu *menuHelp; + + void setupUi(QMainWindow *Hiperiso2DiskWindow) + { + if (Hiperiso2DiskWindow->objectName().isEmpty()) + Hiperiso2DiskWindow->setObjectName(QString::fromUtf8("Hiperiso2DiskWindow")); + Hiperiso2DiskWindow->resize(696, 418); + Hiperiso2DiskWindow->setMinimumSize(QSize(696, 418)); + actionSecure_Boot_Support = new QAction(Hiperiso2DiskWindow); + actionSecure_Boot_Support->setObjectName(QString::fromUtf8("actionSecure_Boot_Support")); + actionSecure_Boot_Support->setCheckable(true); + actionMBR = new QAction(Hiperiso2DiskWindow); + actionMBR->setObjectName(QString::fromUtf8("actionMBR")); + actionMBR->setCheckable(true); + actionGPT = new QAction(Hiperiso2DiskWindow); + actionGPT->setObjectName(QString::fromUtf8("actionGPT")); + actionGPT->setCheckable(true); + actionPartition_Configuration = new QAction(Hiperiso2DiskWindow); + actionPartition_Configuration->setObjectName(QString::fromUtf8("actionPartition_Configuration")); + actionClear_Hiperiso = new QAction(Hiperiso2DiskWindow); + actionClear_Hiperiso->setObjectName(QString::fromUtf8("actionClear_Hiperiso")); + actionShow_All_Devices = new QAction(Hiperiso2DiskWindow); + actionShow_All_Devices->setObjectName(QString::fromUtf8("actionShow_All_Devices")); + actionShow_All_Devices->setCheckable(true); + actionAbout = new QAction(Hiperiso2DiskWindow); + actionAbout->setObjectName(QString::fromUtf8("actionAbout")); + centralwidget = new QWidget(Hiperiso2DiskWindow); + centralwidget->setObjectName(QString::fromUtf8("centralwidget")); + groupBoxDevice = new QGroupBox(centralwidget); + groupBoxDevice->setObjectName(QString::fromUtf8("groupBoxDevice")); + groupBoxDevice->setGeometry(QRect(12, 11, 672, 88)); + comboBoxDevice = new QComboBox(groupBoxDevice); + comboBoxDevice->setObjectName(QString::fromUtf8("comboBoxDevice")); + comboBoxDevice->setGeometry(QRect(12, 44, 600, 29)); + ButtonRefresh = new QPushButton(groupBoxDevice); + ButtonRefresh->setObjectName(QString::fromUtf8("ButtonRefresh")); + ButtonRefresh->setGeometry(QRect(624, 41, 36, 33)); + QIcon icon; + icon.addFile(QString::fromUtf8("../refresh.ico"), QSize(), QIcon::Normal, QIcon::Off); + ButtonRefresh->setIcon(icon); + ButtonRefresh->setIconSize(QSize(24, 24)); + groupBoxHiperisoLocal = new QGroupBox(centralwidget); + groupBoxHiperisoLocal->setObjectName(QString::fromUtf8("groupBoxHiperisoLocal")); + groupBoxHiperisoLocal->setGeometry(QRect(12, 110, 330, 88)); + groupBoxHiperisoLocal->setAlignment(Qt::AlignCenter); + labelHiperisoLocalVer = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalVer->setObjectName(QString::fromUtf8("labelHiperisoLocalVer")); + labelHiperisoLocalVer->setGeometry(QRect(36, 33, 240, 45)); + labelHiperisoLocalVer->setAlignment(Qt::AlignCenter); + labelHiperisoLocalPartStyle = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalPartStyle->setObjectName(QString::fromUtf8("labelHiperisoLocalPartStyle")); + labelHiperisoLocalPartStyle->setGeometry(QRect(286, 66, 37, 20)); + labelHiperisoLocalSecure = new QLabel(groupBoxHiperisoLocal); + labelHiperisoLocalSecure->setObjectName(QString::fromUtf8("labelHiperisoLocalSecure")); + labelHiperisoLocalSecure->setGeometry(QRect(14, 40, 25, 34)); + labelHiperisoLocalSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxHiperisoDevice = new QGroupBox(centralwidget); + groupBoxHiperisoDevice->setObjectName(QString::fromUtf8("groupBoxHiperisoDevice")); + groupBoxHiperisoDevice->setGeometry(QRect(354, 110, 330, 88)); + groupBoxHiperisoDevice->setAlignment(Qt::AlignCenter); + labelHiperisoDeviceVer = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDeviceVer->setObjectName(QString::fromUtf8("labelHiperisoDeviceVer")); + labelHiperisoDeviceVer->setGeometry(QRect(36, 33, 240, 45)); + labelHiperisoDeviceVer->setAlignment(Qt::AlignCenter); + labelHiperisoDevicePartStyle = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDevicePartStyle->setObjectName(QString::fromUtf8("labelHiperisoDevicePartStyle")); + labelHiperisoDevicePartStyle->setGeometry(QRect(286, 66, 37, 20)); + labelHiperisoDeviceSecure = new QLabel(groupBoxHiperisoDevice); + labelHiperisoDeviceSecure->setObjectName(QString::fromUtf8("labelHiperisoDeviceSecure")); + labelHiperisoDeviceSecure->setGeometry(QRect(14, 40, 25, 34)); + labelHiperisoDeviceSecure->setPixmap(QPixmap(QString::fromUtf8("../secure.ico"))); + groupBoxStatus = new QGroupBox(centralwidget); + groupBoxStatus->setObjectName(QString::fromUtf8("groupBoxStatus")); + groupBoxStatus->setGeometry(QRect(12, 209, 672, 67)); + progressBar = new QProgressBar(groupBoxStatus); + progressBar->setObjectName(QString::fromUtf8("progressBar")); + progressBar->setGeometry(QRect(12, 33, 648, 25)); + progressBar->setValue(0); + progressBar->setTextVisible(true); + ButtonInstall = new QPushButton(centralwidget); + ButtonInstall->setObjectName(QString::fromUtf8("ButtonInstall")); + ButtonInstall->setGeometry(QRect(180, 302, 121, 45)); + ButtonUpdate = new QPushButton(centralwidget); + ButtonUpdate->setObjectName(QString::fromUtf8("ButtonUpdate")); + ButtonUpdate->setGeometry(QRect(396, 302, 121, 45)); + Hiperiso2DiskWindow->setCentralWidget(centralwidget); + menubar = new QMenuBar(Hiperiso2DiskWindow); + menubar->setObjectName(QString::fromUtf8("menubar")); + menubar->setGeometry(QRect(0, 0, 696, 25)); + menuOption = new QMenu(menubar); + menuOption->setObjectName(QString::fromUtf8("menuOption")); + menuPartition_Style = new QMenu(menuOption); + menuPartition_Style->setObjectName(QString::fromUtf8("menuPartition_Style")); + menuLanguage = new QMenu(menubar); + menuLanguage->setObjectName(QString::fromUtf8("menuLanguage")); + menuHelp = new QMenu(menubar); + menuHelp->setObjectName(QString::fromUtf8("menuHelp")); + Hiperiso2DiskWindow->setMenuBar(menubar); + + menubar->addAction(menuOption->menuAction()); + menubar->addAction(menuLanguage->menuAction()); + menubar->addAction(menuHelp->menuAction()); + menuOption->addAction(actionSecure_Boot_Support); + menuOption->addAction(menuPartition_Style->menuAction()); + menuOption->addAction(actionPartition_Configuration); + menuOption->addAction(actionClear_Hiperiso); + menuOption->addAction(actionShow_All_Devices); + menuPartition_Style->addAction(actionMBR); + menuPartition_Style->addAction(actionGPT); + menuHelp->addAction(actionAbout); + + retranslateUi(Hiperiso2DiskWindow); + + QMetaObject::connectSlotsByName(Hiperiso2DiskWindow); + } // setupUi + + void retranslateUi(QMainWindow *Hiperiso2DiskWindow) + { + Hiperiso2DiskWindow->setWindowTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso2Disk", nullptr)); + actionSecure_Boot_Support->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Secure Boot Support", nullptr)); + actionMBR->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "MBR", nullptr)); + actionGPT->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "GPT", nullptr)); + actionPartition_Configuration->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Partition Configuration", nullptr)); + actionClear_Hiperiso->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Clear Hiperiso", nullptr)); + actionShow_All_Devices->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Show All Devices", nullptr)); + actionAbout->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "About", nullptr)); + groupBoxDevice->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Device", nullptr)); + ButtonRefresh->setText(QString()); + groupBoxHiperisoLocal->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso In Package", nullptr)); + labelHiperisoLocalVer->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

1.0.53

", nullptr)); + labelHiperisoLocalPartStyle->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

MBR

", nullptr)); + labelHiperisoLocalSecure->setText(QString()); + groupBoxHiperisoDevice->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Hiperiso In Device", nullptr)); + labelHiperisoDeviceVer->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

1.0.52

", nullptr)); + labelHiperisoDevicePartStyle->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "

GPT

", nullptr)); + labelHiperisoDeviceSecure->setText(QString()); + groupBoxStatus->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Status: READY", nullptr)); + progressBar->setFormat(QCoreApplication::translate("Hiperiso2DiskWindow", "%p%", nullptr)); + ButtonInstall->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Install", nullptr)); + ButtonUpdate->setText(QCoreApplication::translate("Hiperiso2DiskWindow", "Update", nullptr)); + menuOption->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Option", nullptr)); + menuPartition_Style->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Partition Style", nullptr)); + menuLanguage->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Language", nullptr)); + menuHelp->setTitle(QCoreApplication::translate("Hiperiso2DiskWindow", "Help", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class Hiperiso2DiskWindow: public Ui_Hiperiso2DiskWindow {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_HIPERISO2DISKWINDOW_H diff --git a/src/gui/QT/ui_partcfgdialog.h b/src/gui/QT/ui_partcfgdialog.h new file mode 100644 index 0000000..a328b5d --- /dev/null +++ b/src/gui/QT/ui_partcfgdialog.h @@ -0,0 +1,146 @@ +/******************************************************************************** +** Form generated from reading UI file 'partcfgdialog.ui' +** +** Created by: Qt User Interface Compiler version 5.15.19 +** +** WARNING! All changes made in this file will be lost when recompiling UI file! +********************************************************************************/ + +#ifndef UI_PARTCFGDIALOG_H +#define UI_PARTCFGDIALOG_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE + +class Ui_PartCfgDialog +{ +public: + QPushButton *pushButtonOK; + QPushButton *pushButtonCancel; + QGroupBox *groupBox; + QCheckBox *checkBox; + QGroupBox *groupBox_2; + QLineEdit *lineEdit; + QGroupBox *groupBox_3; + QComboBox *comboBox; + QGroupBox *groupBox_4; + QCheckBox *checkBox_2; + QGroupBox *groupBox_5; + QLabel *labelFsType; + QComboBox *comboBoxFsType; + QGroupBox *groupBox_6; + QLabel *labelClusterSize; + QLineEdit *lineEditClusterSize; + + void setupUi(QDialog *PartCfgDialog) + { + if (PartCfgDialog->objectName().isEmpty()) + PartCfgDialog->setObjectName(QString::fromUtf8("PartCfgDialog")); + PartCfgDialog->resize(420, 358); + pushButtonOK = new QPushButton(PartCfgDialog); + pushButtonOK->setObjectName(QString::fromUtf8("pushButtonOK")); + pushButtonOK->setGeometry(QRect(90, 310, 90, 30)); + pushButtonCancel = new QPushButton(PartCfgDialog); + pushButtonCancel->setObjectName(QString::fromUtf8("pushButtonCancel")); + pushButtonCancel->setGeometry(QRect(230, 310, 90, 30)); + groupBox = new QGroupBox(PartCfgDialog); + groupBox->setObjectName(QString::fromUtf8("groupBox")); + groupBox->setGeometry(QRect(10, 10, 400, 51)); + checkBox = new QCheckBox(groupBox); + checkBox->setObjectName(QString::fromUtf8("checkBox")); + checkBox->setGeometry(QRect(10, 10, 381, 41)); + checkBox->setAutoRepeatInterval(0); + groupBox_2 = new QGroupBox(PartCfgDialog); + groupBox_2->setObjectName(QString::fromUtf8("groupBox_2")); + groupBox_2->setGeometry(QRect(10, 60, 200, 60)); + lineEdit = new QLineEdit(groupBox_2); + lineEdit->setObjectName(QString::fromUtf8("lineEdit")); + lineEdit->setGeometry(QRect(10, 20, 181, 26)); + lineEdit->setMaxLength(14); + groupBox_3 = new QGroupBox(PartCfgDialog); + groupBox_3->setObjectName(QString::fromUtf8("groupBox_3")); + groupBox_3->setGeometry(QRect(210, 60, 200, 60)); + comboBox = new QComboBox(groupBox_3); + comboBox->addItem(QString()); + comboBox->addItem(QString()); + comboBox->setObjectName(QString::fromUtf8("comboBox")); + comboBox->setGeometry(QRect(10, 20, 181, 26)); + groupBox_4 = new QGroupBox(PartCfgDialog); + groupBox_4->setObjectName(QString::fromUtf8("groupBox_4")); + groupBox_4->setGeometry(QRect(10, 130, 401, 51)); + checkBox_2 = new QCheckBox(groupBox_4); + checkBox_2->setObjectName(QString::fromUtf8("checkBox_2")); + checkBox_2->setGeometry(QRect(10, 18, 381, 24)); + checkBox_2->setChecked(true); + groupBox_5 = new QGroupBox(PartCfgDialog); + groupBox_5->setObjectName(QString::fromUtf8("groupBox_5")); + groupBox_5->setGeometry(QRect(10, 190, 401, 51)); + labelFsType = new QLabel(groupBox_5); + labelFsType->setObjectName(QString::fromUtf8("labelFsType")); + labelFsType->setGeometry(QRect(10, 15, 120, 21)); + comboBoxFsType = new QComboBox(groupBox_5); + comboBoxFsType->addItem(QString()); + comboBoxFsType->addItem(QString()); + comboBoxFsType->setObjectName(QString::fromUtf8("comboBoxFsType")); + comboBoxFsType->setGeometry(QRect(140, 12, 241, 26)); + groupBox_6 = new QGroupBox(PartCfgDialog); + groupBox_6->setObjectName(QString::fromUtf8("groupBox_6")); + groupBox_6->setGeometry(QRect(10, 250, 401, 51)); + labelClusterSize = new QLabel(groupBox_6); + labelClusterSize->setObjectName(QString::fromUtf8("labelClusterSize")); + labelClusterSize->setGeometry(QRect(10, 15, 200, 21)); + lineEditClusterSize = new QLineEdit(groupBox_6); + lineEditClusterSize->setObjectName(QString::fromUtf8("lineEditClusterSize")); + lineEditClusterSize->setGeometry(QRect(220, 12, 161, 26)); + lineEditClusterSize->setMaxLength(10); + + retranslateUi(PartCfgDialog); + + comboBox->setCurrentIndex(1); + comboBoxFsType->setCurrentIndex(0); + + + QMetaObject::connectSlotsByName(PartCfgDialog); + } // setupUi + + void retranslateUi(QDialog *PartCfgDialog) + { + PartCfgDialog->setWindowTitle(QCoreApplication::translate("PartCfgDialog", "Partition Configuration", nullptr)); + pushButtonOK->setText(QCoreApplication::translate("PartCfgDialog", "OK", nullptr)); + pushButtonCancel->setText(QCoreApplication::translate("PartCfgDialog", "Cancel", nullptr)); + groupBox->setTitle(QString()); + checkBox->setText(QCoreApplication::translate("PartCfgDialog", "Preserve some space at the end of the disk", nullptr)); + groupBox_2->setTitle(QString()); + groupBox_3->setTitle(QString()); + comboBox->setItemText(0, QCoreApplication::translate("PartCfgDialog", "MB", nullptr)); + comboBox->setItemText(1, QCoreApplication::translate("PartCfgDialog", "GB", nullptr)); + + groupBox_4->setTitle(QString()); + checkBox_2->setText(QCoreApplication::translate("PartCfgDialog", "Align partitions with 4KB", nullptr)); + groupBox_5->setTitle(QString()); + labelFsType->setText(QCoreApplication::translate("PartCfgDialog", "Filesystem:", nullptr)); + comboBoxFsType->setItemText(0, QCoreApplication::translate("PartCfgDialog", "exFAT", nullptr)); + comboBoxFsType->setItemText(1, QCoreApplication::translate("PartCfgDialog", "NTFS", nullptr)); + + groupBox_6->setTitle(QString()); + labelClusterSize->setText(QCoreApplication::translate("PartCfgDialog", "Cluster Size (sectors):", nullptr)); + } // retranslateUi + +}; + +namespace Ui { + class PartCfgDialog: public Ui_PartCfgDialog {}; +} // namespace Ui + +QT_END_NAMESPACE + +#endif // UI_PARTCFGDIALOG_H diff --git a/src/gui/Web/hiperiso_http.c b/src/gui/Web/hiperiso_http.c new file mode 100644 index 0000000..41daca7 --- /dev/null +++ b/src/gui/Web/hiperiso_http.c @@ -0,0 +1,1700 @@ +/****************************************************************************** + * hiperiso_http.c ---- hiperiso http + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "fat_filelib.h" + +static char *g_pub_out_buf = NULL; +static int g_pub_out_max = 0; + +static pthread_mutex_t g_api_mutex; +static char g_cur_language[128]; +static int g_cur_part_style = 0; +static int g_cur_show_all = 0; +static char g_cur_server_token[64]; +static struct mg_context *g_hiperiso_http_ctx = NULL; + +static uint32_t g_efi_part_offset = 0; +static uint8_t *g_efi_part_raw_img = NULL; +static uint8_t *g_grub_stg1_raw_img = NULL; + +static char g_cur_process_diskname[64]; +static char g_cur_process_type[64]; +static volatile int g_cur_process_result = 0; +static volatile PROGRESS_POINT g_current_progress = PT_FINISH; + +static int hiperiso_load_mbr_template(void) +{ + FILE *fp = NULL; + + fp = fopen("boot/boot.img", "rb"); + if (fp == NULL) + { + vlog("Failed to open file boot/boot.img\n"); + return 1; + } + + fread(g_mbr_template, 1, 512, fp); + fclose(fp); + + hiperiso_gen_preudo_uuid(g_mbr_template + 0x180); + return 0; +} + +static int hiperiso_disk_xz_flush(void *src, unsigned int size) +{ + memcpy(g_efi_part_raw_img + g_efi_part_offset, src, size); + g_efi_part_offset += size; + + g_current_progress = PT_LOAD_DISK_IMG + (g_efi_part_offset / SIZE_1MB); + return (int)size; +} + +static int hiperiso_unxz_efipart_img(void) +{ + int rc; + int inlen; + int xzlen; + void *xzbuf = NULL; + uint8_t *buf = NULL; + + rc = hiperiso_read_file_to_buf(HIPERISO_FILE_DISK_IMG, 0, &xzbuf, &xzlen); + vdebug("read disk.img.xz rc:%d len:%d\n", rc, xzlen); + + if (g_efi_part_raw_img) + { + buf = g_efi_part_raw_img; + } + else + { + buf = malloc(HISOEFI_PART_BYTES); + if (!buf) + { + check_free(xzbuf); + return 1; + } + } + + g_efi_part_offset = 0; + g_efi_part_raw_img = buf; + + rc = unxz(xzbuf, xzlen, NULL, hiperiso_disk_xz_flush, buf, &inlen, NULL); + vdebug("hiperiso_unxz_efipart_img len:%d rc:%d unxzlen:%u\n", inlen, rc, g_efi_part_offset); + + check_free(xzbuf); + return 0; +} + +static int hiperiso_unxz_stg1_img(void) +{ + int rc; + int inlen; + int xzlen; + void *xzbuf = NULL; + uint8_t *buf = NULL; + + rc = hiperiso_read_file_to_buf(HIPERISO_FILE_STG1_IMG, 0, &xzbuf, &xzlen); + vdebug("read core.img.xz rc:%d len:%d\n", rc, xzlen); + + if (g_grub_stg1_raw_img) + { + buf = g_grub_stg1_raw_img; + } + else + { + buf = zalloc(SIZE_1MB); + if (!buf) + { + check_free(xzbuf); + return 1; + } + } + + rc = unxz(xzbuf, xzlen, NULL, NULL, buf, &inlen, NULL); + vdebug("hiperiso_unxz_stg1_img len:%d rc:%d\n", inlen, rc); + + g_grub_stg1_raw_img = buf; + + check_free(xzbuf); + return 0; +} + + +static int hiperiso_http_save_cfg(void) +{ + FILE *fp; + + fp = fopen(g_ini_file, "w"); + if (!fp) + { + vlog("Failed to open %s code:%d\n", g_ini_file, errno); + return 0; + } + + fprintf(fp, "[Hiperiso]\nLanguage=%s\nPartStyle=%d\nShowAllDevice=%d\n", + g_cur_language, g_cur_part_style, g_cur_show_all); + + fclose(fp); + return 0; +} + +static int hiperiso_http_load_cfg(void) +{ + int i; + int len; + char line[256]; + FILE *fp; + + fp = fopen(g_ini_file, "r"); + if (!fp) + { + return 0; + } + + while (fgets(line, sizeof(line), fp)) + { + len = (int)strlen(line); + for (i = len - 1; i >= 0; i--) + { + if (line[i] == ' ' || line[i] == '\t' || line[i] == '\r' || line[i] == '\n') + { + line[i] = 0; + } + else + { + break; + } + } + + len = (int)strlen("Language="); + if (strncmp(line, "Language=", len) == 0) + { + scnprintf(g_cur_language, "%s", line + len); + } + else if (strncmp(line, "PartStyle=", strlen("PartStyle=")) == 0) + { + g_cur_part_style = (int)strtol(line + strlen("PartStyle="), NULL, 10); + } + else if (strncmp(line, "ShowAllDevice=", strlen("ShowAllDevice=")) == 0) + { + g_cur_show_all = (int)strtol(line + strlen("ShowAllDevice="), NULL, 10); + } + } + + fclose(fp); + return 0; +} + + +static int hiperiso_json_result(struct mg_connection *conn, const char *err) +{ + if (conn) + { + mg_printf(conn, + "HTTP/1.1 200 OK \r\n" + "Content-Type: application/json\r\n" + "Content-Length: %d\r\n" + "\r\n%s", + (int)strlen(err), err); + } + else + { + memcpy(g_pub_out_buf, err, (int)strlen(err) + 1); + } + + return 0; +} + +static int hiperiso_json_buffer(struct mg_connection *conn, const char *json_buf, int json_len) +{ + if (conn) + { + mg_printf(conn, + "HTTP/1.1 200 OK \r\n" + "Content-Type: application/json\r\n" + "Content-Length: %d\r\n" + "\r\n%s", + json_len, json_buf); + } + else + { + if (json_len >= g_pub_out_max) + { + vlog("json buffer overflow\n"); + } + else + { + memcpy(g_pub_out_buf, json_buf, json_len); + g_pub_out_buf[json_len] = 0; + } + } + + return 0; +} + +static int hiperiso_api_sysinfo(struct mg_connection *conn, HISO_JSON *json) +{ + int busy = 0; + int pos = 0; + int buflen = 0; + char buf[512]; + + (void)json; + + busy = (g_current_progress == PT_FINISH) ? 0 : 1; + + buflen = sizeof(buf) - 1; + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("token", g_cur_server_token); + HISO_JSON_FMT_STRN("language", g_cur_language); + HISO_JSON_FMT_STRN("hiperiso_ver", hiperiso_get_local_version()); + HISO_JSON_FMT_UINT("partstyle", g_cur_part_style); + HISO_JSON_FMT_BOOL("busy", busy); + HISO_JSON_FMT_STRN("process_disk", g_cur_process_diskname); + HISO_JSON_FMT_STRN("process_type", g_cur_process_type); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + hiperiso_json_buffer(conn, buf, pos); + return 0; +} + +static int hiperiso_api_get_percent(struct mg_connection *conn, HISO_JSON *json) +{ + int pos = 0; + int buflen = 0; + int percent = 0; + char buf[128]; + + (void)json; + + percent = g_current_progress * 100 / PT_FINISH; + + buflen = sizeof(buf) - 1; + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("result", g_cur_process_result ? "failed" : "success"); + HISO_JSON_FMT_STRN("process_disk", g_cur_process_diskname); + HISO_JSON_FMT_STRN("process_type", g_cur_process_type); + HISO_JSON_FMT_UINT("percent", percent); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + hiperiso_json_buffer(conn, buf, pos); + return 0; +} + +static int hiperiso_api_set_language(struct mg_connection *conn, HISO_JSON *json) +{ + const char *lang = NULL; + + lang = hiso_json_get_string_ex(json, "language"); + if (lang) + { + scnprintf(g_cur_language, "%s", lang); + hiperiso_http_save_cfg(); + } + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_api_set_partstyle(struct mg_connection *conn, HISO_JSON *json) +{ + int ret; + int style = 0; + + ret = hiso_json_get_int(json, "partstyle", &style); + if (JSON_SUCCESS == ret) + { + if ((style == 0) || (style == 1)) + { + g_cur_part_style = style; + hiperiso_http_save_cfg(); + } + } + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_clean_disk(int fd, uint64_t size) +{ + int zerolen; + ssize_t len; + off_t offset; + void *buf = NULL; + + vdebug("hiperiso_clean_disk fd:%d size:%llu\n", fd, (_ull)size); + + zerolen = 64 * 1024; + buf = zalloc(zerolen); + if (!buf) + { + vlog("failed to alloc clean buffer\n"); + return 1; + } + + offset = lseek(fd, 0, SEEK_SET); + len = write(fd, buf, zerolen); + vdebug("write disk at off:%llu writelen:%lld datalen:%d\n", (_ull)offset, (_ll)len, zerolen); + + offset = lseek(fd, size - zerolen, SEEK_SET); + len = write(fd, buf, zerolen); + vdebug("write disk at off:%llu writelen:%lld datalen:%d\n", (_ull)offset, (_ll)len, zerolen); + + fsync(fd); + + free(buf); + return 0; +} + +static int hiperiso_write_legacy_grub(int fd, int partstyle) +{ + ssize_t len; + off_t offset; + + if (partstyle) + { + vlog("Write GPT stage1 ...\n"); + + offset = lseek(fd, 512 * 34, SEEK_SET); + + g_grub_stg1_raw_img[500] = 35;//update blocklist + len = write(fd, g_grub_stg1_raw_img, SIZE_1MB - 512 * 34); + + vlog("lseek offset:%llu(%u) writelen:%llu(%u)\n", (_ull)offset, 512 * 34, (_ull)len, SIZE_1MB - 512 * 34); + if (SIZE_1MB - 512 * 34 != len) + { + vlog("write length error\n"); + return 1; + } + } + else + { + vlog("Write MBR stage1 ...\n"); + offset = lseek(fd, 512, SEEK_SET); + len = write(fd, g_grub_stg1_raw_img, SIZE_1MB - 512); + + vlog("lseek offset:%llu(%u) writelen:%llu(%u)\n", (_ull)offset, 512, (_ull)len, SIZE_1MB - 512); + if (SIZE_1MB - 512 != len) + { + vlog("write length error\n"); + return 1; + } + } + + return 0; +} + +static int HiperisoFatMemRead(uint32 Sector, uint8 *Buffer, uint32 SectorCount) +{ + uint32 i; + uint32 offset; + + for (i = 0; i < SectorCount; i++) + { + offset = (Sector + i) * 512; + memcpy(Buffer + i * 512, g_efi_part_raw_img + offset, 512); + } + + return 1; +} + +static int HiperisoFatMemWrite(uint32 Sector, uint8 *Buffer, uint32 SectorCount) +{ + uint32 i; + uint32 offset; + + for (i = 0; i < SectorCount; i++) + { + offset = (Sector + i) * 512; + memcpy(g_efi_part_raw_img + offset, Buffer + i * 512, 512); + } + + return 1; +} + +static int HiperisoProcSecureBoot(int SecureBoot) +{ + int rc = 0; + int size; + char *filebuf = NULL; + void *file = NULL; + + vlog("HiperisoProcSecureBoot %d ...\n", SecureBoot); + + if (SecureBoot) + { + vlog("Secure boot is enabled ...\n"); + return 0; + } + + fl_init(); + + if (0 == fl_attach_media(HiperisoFatMemRead, HiperisoFatMemWrite)) + { + file = fl_fopen("/EFI/BOOT/grubx64_real.efi", "rb"); + vlog("Open hiperiso efi file %p \n", file); + if (file) + { + fl_fseek(file, 0, SEEK_END); + size = (int)fl_ftell(file); + fl_fseek(file, 0, SEEK_SET); + + vlog("hiperiso efi file size %d ...\n", size); + + filebuf = (char *)malloc(size); + if (filebuf) + { + fl_fread(filebuf, 1, size, file); + } + + fl_fclose(file); + + vlog("Now delete all efi files ...\n"); + fl_remove("/EFI/BOOT/BOOTX64.EFI"); + fl_remove("/EFI/BOOT/grubx64.efi"); + fl_remove("/EFI/BOOT/grubx64_real.efi"); + fl_remove("/EFI/BOOT/MokManager.efi"); + fl_remove("/EFI/BOOT/mmx64.efi"); + fl_remove("/ENROLL_THIS_KEY_IN_MOKMANAGER.cer"); + + file = fl_fopen("/EFI/BOOT/BOOTX64.EFI", "wb"); + vlog("Open bootx64 efi file %p \n", file); + if (file) + { + if (filebuf) + { + fl_fwrite(filebuf, 1, size, file); + } + + fl_fflush(file); + fl_fclose(file); + } + + if (filebuf) + { + free(filebuf); + } + } + + file = fl_fopen("/EFI/BOOT/grubia32_real.efi", "rb"); + vlog("Open hiperiso efi file %p\n", file); + if (file) + { + fl_fseek(file, 0, SEEK_END); + size = (int)fl_ftell(file); + fl_fseek(file, 0, SEEK_SET); + + vlog("hiperiso efi file size %d ...\n", size); + + filebuf = (char *)malloc(size); + if (filebuf) + { + fl_fread(filebuf, 1, size, file); + } + + fl_fclose(file); + + vlog("Now delete all efi files ...\n"); + fl_remove("/EFI/BOOT/BOOTIA32.EFI"); + fl_remove("/EFI/BOOT/grubia32.efi"); + fl_remove("/EFI/BOOT/grubia32_real.efi"); + fl_remove("/EFI/BOOT/mmia32.efi"); + + file = fl_fopen("/EFI/BOOT/BOOTIA32.EFI", "wb"); + vlog("Open bootia32 efi file %p\n", file); + if (file) + { + if (filebuf) + { + fl_fwrite(filebuf, 1, size, file); + } + + fl_fflush(file); + fl_fclose(file); + } + + if (filebuf) + { + free(filebuf); + } + } + + } + else + { + rc = 1; + } + + fl_shutdown(); + + return rc; +} + +static int hiperiso_check_efi_part_data(int fd, uint64_t offset) +{ + int i; + ssize_t len; + char *buf; + + buf = malloc(SIZE_1MB); + if (!buf) + { + return 0; + } + + lseek(fd, offset, SEEK_SET); + for (i = 0; i < 32; i++) + { + len = read(fd, buf, SIZE_1MB); + if (len != SIZE_1MB || memcmp(buf, g_efi_part_raw_img + i * SIZE_1MB, SIZE_1MB)) + { + vlog("part2 data check failed i=%d len:%llu\n", i, (_ull)len); + return 1; + } + + g_current_progress = PT_CHECK_PART2 + (i / 4); + } + + return 0; +} + +static int hiperiso_write_efipart(int fd, uint64_t offset, uint32_t secureboot) +{ + int i; + ssize_t len; + + vlog("Formatting part2 EFI offset:%llu ...\n", (_ull)offset); + lseek(fd, offset, SEEK_SET); + + HiperisoProcSecureBoot((int)secureboot); + + g_current_progress = PT_WRITE_HIPERISO_START; + for (i = 0; i < 32; i++) + { + len = write(fd, g_efi_part_raw_img + i * SIZE_1MB, SIZE_1MB); + vlog("write disk writelen:%lld datalen:%d [ %s ]\n", + (_ll)len, SIZE_1MB, (len == SIZE_1MB) ? "success" : "failed"); + + if (len != SIZE_1MB) + { + vlog("failed to format part2 EFI\n"); + return 1; + } + + g_current_progress = PT_WRITE_HIPERISO_START + i / 4; + } + + return 0; +} + +static int HiperisoFillBackupGptHead(HISO_GPT_INFO *pInfo, HISO_GPT_HDR *pHead) +{ + uint64_t LBA; + uint64_t BackupLBA; + + memcpy(pHead, &pInfo->Head, sizeof(HISO_GPT_HDR)); + + LBA = pHead->EfiStartLBA; + BackupLBA = pHead->EfiBackupLBA; + + pHead->EfiStartLBA = BackupLBA; + pHead->EfiBackupLBA = LBA; + pHead->PartTblStartLBA = BackupLBA + 1 - 33; + + pHead->Crc = 0; + pHead->Crc = hiperiso_crc32(pHead, pHead->Length); + + return 0; +} + +static int hiperiso_write_gpt_part_table(int fd, uint64_t disksize, HISO_GPT_INFO *gpt) +{ + ssize_t len; + off_t offset; + HISO_GPT_HDR BackupHead; + + HiperisoFillBackupGptHead(gpt, &BackupHead); + + offset = lseek(fd, disksize - 512, SEEK_SET); + len = write(fd, &BackupHead, sizeof(HISO_GPT_HDR)); + vlog("write backup gpt part table off:%llu len:%llu\n", (_ull)offset, (_ull)len); + if (offset != disksize - 512 || len != sizeof(HISO_GPT_HDR)) + { + return 1; + } + + offset = lseek(fd, disksize - 512 * 33, SEEK_SET); + len = write(fd, gpt->PartTbl, sizeof(gpt->PartTbl)); + vlog("write main gpt part table off:%llu len:%llu\n", (_ull)offset, (_ull)len); + if (offset != disksize - 512 * 33 || len != sizeof(gpt->PartTbl)) + { + return 1; + } + + offset = lseek(fd, 0, SEEK_SET); + len = write(fd, gpt, sizeof(HISO_GPT_INFO)); + vlog("write gpt part head off:%llu len:%llu\n", (_ull)offset, (_ull)len); + if (offset != 0 || len != sizeof(HISO_GPT_INFO)) + { + return 1; + } + + return 0; +} + +static int hiperiso_mbr_need_update(hiperiso_disk *disk, MBR_HEAD *mbr) +{ + int update = 0; + int partition_style; + MBR_HEAD LocalMBR; + + partition_style = disk->hisodata.partition_style; + memcpy(mbr, &(disk->hisodata.gptinfo.MBR), 512); + + HiperisoGetLocalBootImg(&LocalMBR); + memcpy(LocalMBR.BootCode + 0x180, mbr->BootCode + 0x180, 16); + if (partition_style) + { + LocalMBR.BootCode[92] = 0x22; + } + + if (memcmp(LocalMBR.BootCode, mbr->BootCode, 440)) + { + memcpy(mbr->BootCode, LocalMBR.BootCode, 440); + vlog("MBR boot code different, must update it.\n"); + update = 1; + } + + if (partition_style == 0 && mbr->PartTbl[0].Active == 0) + { + mbr->PartTbl[0].Active = 0x80; + mbr->PartTbl[1].Active = 0; + mbr->PartTbl[2].Active = 0; + mbr->PartTbl[3].Active = 0; + vlog("set MBR partition 1 active flag enabled\n"); + update = 1; + } + + return update; +} + +static void * hiperiso_update_thread(void *data) +{ + int fd; + ssize_t len; + off_t offset; + MBR_HEAD MBR; + hiperiso_disk *disk = NULL; + hiperiso_thread_data *thread = (hiperiso_thread_data *)data; + HISO_GPT_INFO *pstGPT = NULL; + + vdebug("hiperiso_update_thread run ...\n"); + + fd = thread->diskfd; + disk = thread->disk; + + g_current_progress = PT_PRAPARE_FOR_CLEAN; + vdebug("check disk %s\n", disk->disk_name); + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + goto err; + } + else + { + vlog("disk is not mounted now, we can do continue ...\n"); + } + + g_current_progress = PT_LOAD_CORE_IMG; + hiperiso_unxz_stg1_img(); + + g_current_progress = PT_LOAD_DISK_IMG; + hiperiso_unxz_efipart_img(); + + g_current_progress = PT_FORMAT_PART2; + + vlog("Formatting part2 EFI ...\n"); + if (0 != hiperiso_write_efipart(fd, disk->hisodata.part2_start_sector * 512, thread->secure_boot)) + { + vlog("Failed to format part2 efi ...\n"); + goto err; + } + + g_current_progress = PT_WRITE_STG1_IMG; + + vlog("Writing legacy grub ...\n"); + if (0 != hiperiso_write_legacy_grub(fd, disk->hisodata.partition_style)) + { + vlog("hiperiso_write_legacy_grub failed ...\n"); + goto err; + } + + offset = lseek(fd, 512 * 2040, SEEK_SET); + len = write(fd, disk->hisodata.rsvdata, sizeof(disk->hisodata.rsvdata)); + vlog("Writing reserve data offset:%llu len:%llu ...\n", (_ull)offset, (_ull)len); + + if (hiperiso_mbr_need_update(disk, &MBR)) + { + offset = lseek(fd, 0, SEEK_SET); + len = write(fd, &MBR, 512); + vlog("update MBR offset:%llu len:%llu\n", (_ull)offset, (_ull)len); + } + else + { + vlog("No need to update MBR\n"); + } + + + if (disk->hisodata.partition_style) + { + pstGPT = (HISO_GPT_INFO *)malloc(sizeof(HISO_GPT_INFO)); + memset(pstGPT, 0, sizeof(HISO_GPT_INFO)); + + offset = lseek(fd, 0, SEEK_SET); + len = read(fd, pstGPT, sizeof(HISO_GPT_INFO)); + vlog("Read GPT table offset:%llu len:%llu ...\n", (_ull)offset, (_ull)len); + + if (pstGPT->PartTbl[1].Attr != 0x8000000000000000ULL) + { + vlog("Update EFI part attr from 0x%016llx to 0x%016llx\n", + pstGPT->PartTbl[1].Attr, 0x8000000000000000ULL); + + pstGPT->PartTbl[1].Attr = 0x8000000000000000ULL; + + pstGPT->Head.PartTblCrc = hiperiso_crc32(pstGPT->PartTbl, sizeof(pstGPT->PartTbl)); + pstGPT->Head.Crc = 0; + pstGPT->Head.Crc = hiperiso_crc32(&(pstGPT->Head), pstGPT->Head.Length); + hiperiso_write_gpt_part_table(fd, disk->size_in_byte, pstGPT); + } + else + { + vlog("No need to update EFI part attr\n"); + } + free(pstGPT); + } + + + g_current_progress = PT_SYNC_DATA1; + + vlog("fsync data1...\n"); + fsync(fd); + hiso_safe_close_fd(fd); + + g_current_progress = PT_SYNC_DATA2; + + vlog("====================================\n"); + vlog("====== hiperiso update success ======\n"); + vlog("====================================\n"); + goto end; + +err: + g_cur_process_result = 1; + hiso_safe_close_fd(fd); + +end: + g_current_progress = PT_FINISH; + + check_free(thread); + + return NULL; +} + +static void * hiperiso_install_thread(void *data) +{ + int fd; + ssize_t len; + off_t offset; + MBR_HEAD MBR; + hiperiso_disk *disk = NULL; + HISO_GPT_INFO *gpt = NULL; + hiperiso_thread_data *thread = (hiperiso_thread_data *)data; + uint64_t Part1StartSector = 0; + uint64_t Part1SectorCount = 0; + uint64_t Part2StartSector = 0; + + vdebug("hiperiso_install_thread run ...\n"); + + fd = thread->diskfd; + disk = thread->disk; + + g_current_progress = PT_PRAPARE_FOR_CLEAN; + vdebug("check disk %s\n", disk->disk_name); + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + goto err; + } + else + { + vlog("disk is not mounted now, we can do continue ...\n"); + } + + g_current_progress = PT_DEL_ALL_PART; + hiperiso_clean_disk(fd, disk->size_in_byte); + + g_current_progress = PT_LOAD_CORE_IMG; + hiperiso_unxz_stg1_img(); + + g_current_progress = PT_LOAD_DISK_IMG; + hiperiso_unxz_efipart_img(); + + if (thread->partstyle) + { + vdebug("Fill GPT part table\n"); + gpt = zalloc(sizeof(HISO_GPT_INFO)); + hiperiso_fill_gpt(disk->size_in_byte, thread->reserveBytes, thread->align4kb, gpt); + Part1StartSector = gpt->PartTbl[0].StartLBA; + Part1SectorCount = gpt->PartTbl[0].LastLBA - Part1StartSector + 1; + Part2StartSector = gpt->PartTbl[1].StartLBA; + } + else + { + vdebug("Fill MBR part table\n"); + hiperiso_fill_mbr(disk->size_in_byte, thread->reserveBytes, thread->align4kb, &MBR); + Part1StartSector = MBR.PartTbl[0].StartSectorId; + Part1SectorCount = MBR.PartTbl[0].SectorCount; + Part2StartSector = MBR.PartTbl[1].StartSectorId; + } + + vlog("Part1StartSector:%llu Part1SectorCount:%llu Part2StartSector:%llu\n", + (_ull)Part1StartSector, (_ull)Part1SectorCount, (_ull)Part2StartSector); + + if (thread->partstyle != disk->partstyle) + { + vlog("Wait for format part1 (partstyle changed) ...\n"); + sleep(1); + } + + g_current_progress = PT_FORMAT_PART1; + vlog("Formatting part1 exFAT %s ...\n", disk->disk_path); + if (0 != mkexfat_main(disk->disk_path, fd, Part1SectorCount)) + { + vlog("Failed to format exfat ...\n"); + goto err; + } + + g_current_progress = PT_FORMAT_PART2; + vlog("Formatting part2 EFI ...\n"); + if (0 != hiperiso_write_efipart(fd, Part2StartSector * 512, thread->secure_boot)) + { + vlog("Failed to format part2 efi ...\n"); + goto err; + } + + g_current_progress = PT_WRITE_STG1_IMG; + vlog("Writing legacy grub ...\n"); + if (0 != hiperiso_write_legacy_grub(fd, thread->partstyle)) + { + vlog("hiperiso_write_legacy_grub failed ...\n"); + goto err; + } + + g_current_progress = PT_SYNC_DATA1; + vlog("fsync data1...\n"); + fsync(fd); + hiso_safe_close_fd(fd); + + /* reopen for check part2 data */ + vlog("Checking part2 efi data %s ...\n", disk->disk_path); + g_current_progress = PT_CHECK_PART2; + fd = open(disk->disk_path, O_RDONLY | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s for check fd:%d err:%d\n", disk->disk_path, fd, errno); + goto err; + } + + if (0 == hiperiso_check_efi_part_data(fd, Part2StartSector * 512)) + { + vlog("efi part data check success\n"); + } + else + { + vlog("efi part data check failed\n"); + goto err; + } + + hiso_safe_close_fd(fd); + + /* reopen for write part table */ + g_current_progress = PT_WRITE_PART_TABLE; + vlog("Writting Partition Table style:%d...\n", thread->partstyle); + + fd = open(disk->disk_path, O_RDWR | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s for part table fd:%d err:%d\n", disk->disk_path, fd, errno); + goto err; + } + + if (thread->partstyle) + { + hiperiso_write_gpt_part_table(fd, disk->size_in_byte, gpt); + } + else + { + offset = lseek(fd, 0, SEEK_SET); + len = write(fd, &MBR, 512); + vlog("Writting MBR Partition Table %llu %llu\n", (_ull)offset, (_ull)len); + if (offset != 0 || len != 512) + { + goto err; + } + } + + g_current_progress = PT_SYNC_DATA2; + vlog("fsync data2...\n"); + fsync(fd); + hiso_safe_close_fd(fd); + + + vlog("====================================\n"); + vlog("====== hiperiso install success ======\n"); + vlog("====================================\n"); + goto end; + +err: + g_cur_process_result = 1; + hiso_safe_close_fd(fd); + +end: + g_current_progress = PT_FINISH; + + check_free(gpt); + check_free(thread); + + return NULL; +} + +static int hiperiso_api_clean(struct mg_connection *conn, HISO_JSON *json) +{ + int i = 0; + int fd = 0; + hiperiso_disk *disk = NULL; + const char *diskname = NULL; + char path[128]; + + if (g_current_progress != PT_FINISH) + { + hiperiso_json_result(conn, HISO_JSON_BUSY_RET); + return 0; + } + + diskname = hiso_json_get_string_ex(json, "disk"); + if (diskname == NULL) + { + hiperiso_json_result(conn, HISO_JSON_INVALID_RET); + return 0; + } + + for (i = 0; i < g_disk_num; i++) + { + if (strcmp(g_disk_list[i].disk_name, diskname) == 0) + { + disk = g_disk_list + i; + break; + } + } + + if (disk == NULL) + { + vlog("disk %s not found\n", diskname); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + scnprintf(path, "/sys/block/%s", diskname); + if (access(path, F_OK) < 0) + { + vlog("File %s not exist anymore\n", path); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + vlog("==================================\n"); + vlog("===== hiperiso clean %s =====\n", disk->disk_path); + vlog("==================================\n"); + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + else + { + vlog("disk is not mounted now, we can do the clean ...\n"); + } + + fd = open(disk->disk_path, O_RDWR | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s fd:%d err:%d\n", disk->disk_path, fd, errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + vdebug("start clean %s ...\n", disk->disk_model); + hiperiso_clean_disk(fd, disk->size_in_byte); + + hiso_safe_close_fd(fd); + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_api_install(struct mg_connection *conn, HISO_JSON *json) +{ + int i = 0; + int ret = 0; + int fd = 0; + uint32_t align4kb = 0; + uint32_t style = 0; + uint32_t secure_boot = 0; + uint64_t reserveBytes = 0; + hiperiso_disk *disk = NULL; + const char *diskname = NULL; + const char *reserve_space = NULL; + hiperiso_thread_data *thread = NULL; + char path[128]; + + if (g_current_progress != PT_FINISH) + { + hiperiso_json_result(conn, HISO_JSON_BUSY_RET); + return 0; + } + + diskname = hiso_json_get_string_ex(json, "disk"); + reserve_space = hiso_json_get_string_ex(json, "reserve_space"); + ret += hiso_json_get_uint(json, "partstyle", &style); + ret += hiso_json_get_uint(json, "secure_boot", &secure_boot); + ret += hiso_json_get_uint(json, "align_4kb", &align4kb); + + if (diskname == NULL || reserve_space == NULL || ret != JSON_SUCCESS) + { + hiperiso_json_result(conn, HISO_JSON_INVALID_RET); + return 0; + } + + reserveBytes = (uint64_t)strtoull(reserve_space, NULL, 10); + + for (i = 0; i < g_disk_num; i++) + { + if (strcmp(g_disk_list[i].disk_name, diskname) == 0) + { + disk = g_disk_list + i; + break; + } + } + + if (disk == NULL) + { + vlog("disk %s not found\n", diskname); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + if (disk->is4kn) + { + vlog("disk %s is 4k native, not supported.\n", diskname); + hiperiso_json_result(conn, HISO_JSON_4KN_RET); + return 0; + } + + scnprintf(path, "/sys/block/%s", diskname); + if (access(path, F_OK) < 0) + { + vlog("File %s not exist anymore\n", path); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + if (disk->size_in_byte > 2199023255552ULL && style == 0) + { + vlog("disk %s is more than 2TB and GPT is needed\n", path); + hiperiso_json_result(conn, HISO_JSON_MBR_2TB_RET); + return 0; + } + + if ((reserveBytes + HISOEFI_PART_BYTES * 2) > disk->size_in_byte) + { + vlog("reserve space %llu is too big for disk %s %llu\n", (_ull)reserveBytes, path, (_ull)disk->size_in_byte); + hiperiso_json_result(conn, HISO_JSON_INVALID_RSV_RET); + return 0; + } + + vlog("==================================================================================\n"); + vlog("===== hiperiso install %s style:%s secureboot:%u align4K:%u reserve:%llu =========\n", + disk->disk_path, (style ? "GPT" : "MBR"), secure_boot, align4kb, (_ull)reserveBytes); + vlog("==================================================================================\n"); + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + else + { + vlog("disk is not mounted now, we can do the install ...\n"); + } + + fd = open(disk->disk_path, O_RDWR | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s fd:%d err:%d\n", disk->disk_path, fd, errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + vdebug("start install thread %s ...\n", disk->disk_model); + thread = zalloc(sizeof(hiperiso_thread_data)); + if (!thread) + { + hiso_safe_close_fd(fd); + vlog("failed to alloc thread data err:%d\n", errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + g_current_progress = PT_START; + g_cur_process_result = 0; + scnprintf(g_cur_process_type, "%s", "install"); + scnprintf(g_cur_process_diskname, "%s", disk->disk_name); + + thread->disk = disk; + thread->diskfd = fd; + thread->align4kb = align4kb; + thread->partstyle = style; + thread->secure_boot = secure_boot; + thread->reserveBytes = reserveBytes; + + mg_start_thread(hiperiso_install_thread, thread); + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_api_update(struct mg_connection *conn, HISO_JSON *json) +{ + int i = 0; + int ret = 0; + int fd = 0; + uint32_t secure_boot = 0; + hiperiso_disk *disk = NULL; + const char *diskname = NULL; + hiperiso_thread_data *thread = NULL; + char path[128]; + + if (g_current_progress != PT_FINISH) + { + hiperiso_json_result(conn, HISO_JSON_BUSY_RET); + return 0; + } + + diskname = hiso_json_get_string_ex(json, "disk"); + ret += hiso_json_get_uint(json, "secure_boot", &secure_boot); + if (diskname == NULL || ret != JSON_SUCCESS) + { + hiperiso_json_result(conn, HISO_JSON_INVALID_RET); + return 0; + } + + for (i = 0; i < g_disk_num; i++) + { + if (strcmp(g_disk_list[i].disk_name, diskname) == 0) + { + disk = g_disk_list + i; + break; + } + } + + if (disk == NULL) + { + vlog("disk %s not found\n", diskname); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + if (disk->hisodata.hiperiso_valid == 0) + { + vlog("disk %s is not hiperiso disk\n", diskname); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + scnprintf(path, "/sys/block/%s", diskname); + if (access(path, F_OK) < 0) + { + vlog("File %s not exist anymore\n", path); + hiperiso_json_result(conn, HISO_JSON_NOTFOUND_RET); + return 0; + } + + vlog("==========================================================\n"); + vlog("===== hiperiso update %s new_secureboot:%u =========\n", disk->disk_path, secure_boot); + vlog("==========================================================\n"); + + vlog("%s version:%s partstyle:%u oldsecureboot:%u reserve:%llu\n", + disk->disk_path, disk->hisodata.hiperiso_ver, + disk->hisodata.partition_style, + disk->hisodata.secure_boot_flag, + (_ull)(disk->hisodata.preserved_space) + ); + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("disk is mounted, now try to unmount it ...\n"); + hiperiso_try_umount_disk(disk->disk_path); + } + + if (hiperiso_is_disk_mounted(disk->disk_path)) + { + vlog("%s is mounted and can't umount!\n", disk->disk_path); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + else + { + vlog("disk is not mounted now, we can do the update ...\n"); + } + + fd = open(disk->disk_path, O_RDWR | O_BINARY); + if (fd < 0) + { + vlog("failed to open %s fd:%d err:%d\n", disk->disk_path, fd, errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + vdebug("start update thread %s ...\n", disk->disk_model); + thread = zalloc(sizeof(hiperiso_thread_data)); + if (!thread) + { + hiso_safe_close_fd(fd); + vlog("failed to alloc thread data err:%d\n", errno); + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + g_current_progress = PT_START; + g_cur_process_result = 0; + scnprintf(g_cur_process_type, "%s", "update"); + scnprintf(g_cur_process_diskname, "%s", disk->disk_name); + + thread->disk = disk; + thread->diskfd = fd; + thread->secure_boot = secure_boot; + + mg_start_thread(hiperiso_update_thread, thread); + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + + +static int hiperiso_api_refresh_device(struct mg_connection *conn, HISO_JSON *json) +{ + (void)json; + + if (g_current_progress == PT_FINISH) + { + g_disk_num = 0; + hiperiso_disk_enumerate_all(); + } + + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; +} + +static int hiperiso_api_get_dev_list(struct mg_connection *conn, HISO_JSON *json) +{ + int i = 0; + int rc = 0; + int pos = 0; + int buflen = 0; + uint32_t alldev = 0; + char *buf = NULL; + hiperiso_disk *cur = NULL; + + rc = hiso_json_get_uint(json, "alldev", &alldev); + if (JSON_SUCCESS != rc) + { + alldev = 0; + } + + buflen = g_disk_num * 1024; + buf = (char *)malloc(buflen + 1024); + if (!buf) + { + hiperiso_json_result(conn, HISO_JSON_FAILED_RET); + return 0; + } + + HISO_JSON_FMT_BEGIN(pos, buf, buflen); + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_KEY("list"); + HISO_JSON_FMT_ARY_BEGIN(); + + for (i = 0; i < g_disk_num; i++) + { + cur = g_disk_list + i; + + if (alldev == 0 && cur->type != HISO_DEVICE_USB) + { + continue; + } + + HISO_JSON_FMT_OBJ_BEGIN(); + HISO_JSON_FMT_STRN("name", cur->disk_name); + HISO_JSON_FMT_STRN("model", cur->disk_model); + HISO_JSON_FMT_STRN("size", cur->human_readable_size); + HISO_JSON_FMT_UINT("hiso_valid", cur->hisodata.hiperiso_valid); + HISO_JSON_FMT_STRN("hiso_ver", cur->hisodata.hiperiso_ver); + HISO_JSON_FMT_UINT("hiso_secure_boot", cur->hisodata.secure_boot_flag); + HISO_JSON_FMT_UINT("hiso_partstyle", cur->hisodata.partition_style); + HISO_JSON_FMT_OBJ_ENDEX(); + } + + HISO_JSON_FMT_ARY_END(); + HISO_JSON_FMT_OBJ_END(); + HISO_JSON_FMT_END(pos); + + hiperiso_json_buffer(conn, buf, pos); + return 0; +} + +static JSON_CB g_hiperiso_json_cb[] = +{ + { "sysinfo", hiperiso_api_sysinfo }, + { "sel_language", hiperiso_api_set_language }, + { "sel_partstyle", hiperiso_api_set_partstyle }, + { "refresh_device", hiperiso_api_refresh_device }, + { "get_dev_list", hiperiso_api_get_dev_list }, + { "install", hiperiso_api_install }, + { "update", hiperiso_api_update }, + { "clean", hiperiso_api_clean }, + { "get_percent", hiperiso_api_get_percent }, +}; + +static int hiperiso_json_handler(struct mg_connection *conn, HISO_JSON *json) +{ + int i; + const char *token = NULL; + const char *method = NULL; + + method = hiso_json_get_string_ex(json, "method"); + if (!method) + { + hiperiso_json_result(conn, HISO_JSON_SUCCESS_RET); + return 0; + } + + if (strcmp(method, "sysinfo")) + { + token = hiso_json_get_string_ex(json, "token"); + if (token == NULL || strcmp(token, g_cur_server_token)) + { + hiperiso_json_result(conn, HISO_JSON_TOKEN_ERR_RET); + return 0; + } + } + + for (i = 0; i < (int)(sizeof(g_hiperiso_json_cb) / sizeof(g_hiperiso_json_cb[0])); i++) + { + if (strcmp(method, g_hiperiso_json_cb[i].method) == 0) + { + g_hiperiso_json_cb[i].callback(conn, json); + break; + } + } + + return 0; +} + +int hiperiso_func_handler(const char *jsonstr, char *jsonbuf, int buflen) +{ + int i; + const char *method = NULL; + HISO_JSON *json = NULL; + + g_pub_out_buf = jsonbuf; + g_pub_out_max = buflen; + + json = hiso_json_create(); + if (JSON_SUCCESS == hiso_json_parse(json, jsonstr)) + { + pthread_mutex_lock(&g_api_mutex); + + method = hiso_json_get_string_ex(json->pstChild, "method"); + for (i = 0; i < (int)(sizeof(g_hiperiso_json_cb) / sizeof(g_hiperiso_json_cb[0])); i++) + { + if (method && strcmp(method, g_hiperiso_json_cb[i].method) == 0) + { + g_hiperiso_json_cb[i].callback(NULL, json->pstChild); + break; + } + } + + pthread_mutex_unlock(&g_api_mutex); + } + else + { + hiperiso_json_result(NULL, HISO_JSON_INVALID_RET); + } + + hiso_json_destroy(json); + return 0; +} + +static int hiperiso_request_handler(struct mg_connection *conn) +{ + int post_data_len; + int post_buf_len; + HISO_JSON *json = NULL; + char *post_data_buf = NULL; + const struct mg_request_info *ri = NULL; + char stack_buf[512]; + + ri = mg_get_request_info(conn); + + if (strcmp(ri->uri, "/hiso/json") == 0) + { + if (ri->content_length > 500) + { + post_data_buf = malloc(ri->content_length + 4); + post_buf_len = ri->content_length + 1; + } + else + { + post_data_buf = stack_buf; + post_buf_len = sizeof(stack_buf); + } + + post_data_len = mg_read(conn, post_data_buf, post_buf_len); + post_data_buf[post_data_len] = 0; + + json = hiso_json_create(); + if (JSON_SUCCESS == hiso_json_parse(json, post_data_buf)) + { + pthread_mutex_lock(&g_api_mutex); + hiperiso_json_handler(conn, json->pstChild); + pthread_mutex_unlock(&g_api_mutex); + } + else + { + hiperiso_json_result(conn, HISO_JSON_INVALID_RET); + } + + hiso_json_destroy(json); + + if (post_data_buf != stack_buf) + { + free(post_data_buf); + } + return 1; + } + else + { + return 0; + } +} + +int hiperiso_http_start(const char *ip, const char *port) +{ + uint8_t uuid[16]; + char addr[128]; + struct mg_callbacks callbacks; + const char *options[] = + { + "listening_ports", "24680", + "document_root", "WebUI", + "error_log_file", g_log_file, + "request_timeout_ms", "10000", + NULL + }; + + /* unique token */ + hiperiso_gen_preudo_uuid(uuid); + scnprintf(g_cur_server_token, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7], + uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); + + /* option */ + scnprintf(addr, "%s:%s", ip, port); + options[1] = addr; + + memset(&callbacks, 0, sizeof(callbacks)); + callbacks.begin_request = hiperiso_request_handler; + g_hiperiso_http_ctx = mg_start(&callbacks, NULL, options); + + return g_hiperiso_http_ctx ? 0 : 1; +} + +int hiperiso_http_stop(void) +{ + if (g_hiperiso_http_ctx) + { + mg_stop(g_hiperiso_http_ctx); + } + return 0; +} + +int hiperiso_http_init(void) +{ + pthread_mutex_init(&g_api_mutex, NULL); + + hiperiso_http_load_cfg(); + + hiperiso_load_mbr_template(); + + return 0; +} + +void hiperiso_http_exit(void) +{ + pthread_mutex_destroy(&g_api_mutex); + + check_free(g_efi_part_raw_img); + g_efi_part_raw_img = NULL; +} + + +const char * hiperiso_code_get_cur_language(void) +{ + return g_cur_language; +} + +int hiperiso_code_get_cur_part_style(void) +{ + return g_cur_part_style; +} + +void hiperiso_code_set_cur_part_style(int style) +{ + pthread_mutex_lock(&g_api_mutex); + + g_cur_part_style = style; + hiperiso_http_save_cfg(); + + pthread_mutex_unlock(&g_api_mutex); +} + +int hiperiso_code_get_cur_show_all(void) +{ + return g_cur_show_all; +} + +void hiperiso_code_set_cur_show_all(int show_all) +{ + pthread_mutex_lock(&g_api_mutex); + + g_cur_show_all = show_all; + hiperiso_http_save_cfg(); + + pthread_mutex_unlock(&g_api_mutex); +} + +void hiperiso_code_set_cur_language(const char *lang) +{ + pthread_mutex_lock(&g_api_mutex); + + scnprintf(g_cur_language, "%s", lang); + hiperiso_http_save_cfg(); + + pthread_mutex_unlock(&g_api_mutex); +} + +void hiperiso_code_refresh_device(void) +{ + if (g_current_progress == PT_FINISH) + { + g_disk_num = 0; + hiperiso_disk_enumerate_all(); + } +} + +int hiperiso_code_is_busy(void) +{ + return (g_current_progress == PT_FINISH) ? 0 : 1; +} + +int hiperiso_code_get_percent(void) +{ + return g_current_progress * 100 / PT_FINISH; +} + +int hiperiso_code_get_result(void) +{ + return g_cur_process_result; +} + +void hiperiso_code_save_cfg(void) +{ + hiperiso_http_save_cfg(); +} diff --git a/src/gui/Web/hiperiso_http.h b/src/gui/Web/hiperiso_http.h new file mode 100644 index 0000000..7c4a852 --- /dev/null +++ b/src/gui/Web/hiperiso_http.h @@ -0,0 +1,82 @@ +/****************************************************************************** + * hiperiso_http.h + * + * Copyright (c) 2021, longpanda + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU 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 + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ +#ifndef __HIPERISO_HTTP_H__ +#define __HIPERISO_HTTP_H__ + +#include + +typedef enum PROGRESS_POINT +{ + PT_START = 1, + + PT_PRAPARE_FOR_CLEAN, + PT_DEL_ALL_PART, + + PT_LOAD_CORE_IMG, + PT_LOAD_DISK_IMG, + PT_UNXZ_DISK_IMG_FINISH = PT_LOAD_DISK_IMG + 32, + + PT_FORMAT_PART1, //10 + + PT_FORMAT_PART2, + + PT_WRITE_HIPERISO_START, + PT_WRITE_HIPERISO_FINISH = PT_WRITE_HIPERISO_START + 8, + + PT_WRITE_STG1_IMG,//45 + PT_SYNC_DATA1, + + PT_CHECK_PART2, + PT_CHECK_PART2_FINISH = PT_CHECK_PART2 + 8, + + PT_WRITE_PART_TABLE,//52 + PT_SYNC_DATA2, + + PT_FINISH +}PROGRESS_POINT; + +typedef int (*hiperiso_json_callback)(struct mg_connection *conn, HISO_JSON *json); +typedef struct JSON_CB +{ + const char *method; + hiperiso_json_callback callback; +}JSON_CB; + +typedef struct hiperiso_thread_data +{ + int diskfd; + uint32_t align4kb; + uint32_t partstyle; + uint32_t secure_boot; + uint64_t reserveBytes; + hiperiso_disk *disk; +}hiperiso_thread_data; + +extern int g_hiso_exfat_disk_fd; +extern uint64_t g_hiso_exfat_part_size; + +int hiperiso_http_init(void); +void hiperiso_http_exit(void); +int hiperiso_http_start(const char *ip, const char *port); +int hiperiso_http_stop(void); +int mkexfat_main(const char *devpath, int fd, uint64_t part_sector_count); + +#endif /* __HIPERISO_HTTP_H__ */ + diff --git a/src/gui/hiperiso_gui.c b/src/gui/hiperiso_gui.c new file mode 100644 index 0000000..c4f70c2 --- /dev/null +++ b/src/gui/hiperiso_gui.c @@ -0,0 +1,1376 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hiperiso_json.h" + +#define LIB_FLAG_GTK2 (1 << 0) +#define LIB_FLAG_GTK3 (1 << 1) +#define LIB_FLAG_GTK4 (1 << 2) +#define LIB_FLAG_QT4 (1 << 3) +#define LIB_FLAG_QT5 (1 << 4) +#define LIB_FLAG_QT6 (1 << 5) +#define LIB_FLAG_GLADE2 (1 << 30) + +#define LIB_FLAG_GTK (LIB_FLAG_GTK2 | LIB_FLAG_GTK3 | LIB_FLAG_GTK4) +#define LIB_FLAG_QT (LIB_FLAG_QT4 | LIB_FLAG_QT5 | LIB_FLAG_QT6) + +#define MAX_PARAS 64 +#define MAX_LOG_BUF (1024 * 1024) +#define HISO_GUI_PATH "_hiso_gui_path_=" +#define HISO_ENV_STR "_hiso_env_str_=" +#define LD_CACHE_FILE "/etc/ld.so.cache" +#define INT2STR_YN(a) ((a) == 0 ? "NO" : "YES") + +static int g_xdg_log = 0; +static int g_xdg_ini = 0; +static char g_log_file[PATH_MAX]; +static char g_ini_file[PATH_MAX]; +static char *g_log_buf = NULL; +extern char ** environ; + +#define CACHEMAGIC "ld.so-1.7.0" + +struct file_entry +{ + int flags; /* This is 1 for an ELF library. */ + unsigned int key, value; /* String table indices. */ +}; + +struct cache_file +{ + char magic[sizeof CACHEMAGIC - 1]; + unsigned int nlibs; + struct file_entry libs[0]; +}; + +#define CACHEMAGIC_NEW "glibc-ld.so.cache" +#define CACHE_VERSION "1.1" +#define CACHEMAGIC_VERSION_NEW CACHEMAGIC_NEW CACHE_VERSION + +struct file_entry_new +{ + int32_t flags; /* This is 1 for an ELF library. */ + uint32_t key, value; /* String table indices. */ + uint32_t osversion; /* Required OS version. */ + uint64_t hwcap; /* Hwcap entry. */ +}; + +struct cache_file_new +{ + char magic[sizeof CACHEMAGIC_NEW - 1]; + char version[sizeof CACHE_VERSION - 1]; + uint32_t nlibs; /* Number of entries. */ + uint32_t len_strings; /* Size of string table. */ + uint32_t unused[5]; /* Leave space for future extensions + and align to 8 byte boundary. */ + struct file_entry_new libs[0]; /* Entries describing libraries. */ + /* After this the string table of size len_strings is found. */ +}; + +/* Used to align cache_file_new. */ +#define ALIGN_CACHE(addr) \ +(((addr) + __alignof__ (struct cache_file_new) -1) \ + & (~(__alignof__ (struct cache_file_new) - 1))) + +#define vlog(fmt, args...) hiperiso_syslog(0, fmt, ##args) + +void hiperiso_syslog(int level, const char *Fmt, ...) +{ + int buflen; + char *buf = NULL; + char log[512]; + va_list arg; + time_t stamp; + struct tm ttm; + FILE *fp; + + (void)level; + + time(&stamp); + localtime_r(&stamp, &ttm); + + if (g_log_buf) + { + buf = g_log_buf; + buflen = MAX_LOG_BUF; + } + else + { + buf = log; + buflen = sizeof(log); + } + + va_start(arg, Fmt); + vsnprintf(buf, buflen, Fmt, arg); + va_end(arg); + + fp = fopen(g_log_file, "a+"); + if (fp) + { + fprintf(fp, "[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + buf); + fclose(fp); + } + + #if 0 + printf("[%04u/%02u/%02u %02u:%02u:%02u] %s", + ttm.tm_year + 1900, ttm.tm_mon, ttm.tm_mday, + ttm.tm_hour, ttm.tm_min, ttm.tm_sec, + buf); + #endif +} + +static int is_gtk_env(void) +{ + const char *env = NULL; + + env = getenv("GNOME_SETUP_DISPLAY"); + if (env && env[0] == ':') + { + vlog("GNOME_SETUP_DISPLAY=%s\n", env); + return 1; + } + + env = getenv("DESKTOP_SESSION"); + if (env && strcasecmp(env, "xfce") == 0) + { + vlog("DESKTOP_SESSION=%s\n", env); + return 1; + } + + return 0; +} + +static int is_qt_env(void) +{ + return 0; +} + +static int detect_gtk_version(int libflag) +{ + int gtk2; + int gtk3; + int gtk4; + int glade2; + + gtk2 = libflag & LIB_FLAG_GTK2; + gtk3 = libflag & LIB_FLAG_GTK3; + gtk4 = libflag & LIB_FLAG_GTK4; + glade2 = libflag & LIB_FLAG_GLADE2; + + if (gtk2 > 0 && glade2 > 0 && (gtk3 == 0 && gtk4 == 0)) + { + return 2; + } + + if (gtk3 > 0 && (gtk2 == 0 && gtk4 == 0)) + { + return 3; + } + + if (gtk4 > 0 && (gtk2 == 0 && gtk3 == 0)) + { + return 4; + } + + if (gtk3 > 0) + { + return 3; + } + + if (gtk4 > 0) + { + return 4; + } + + if (gtk2 > 0 && glade2 > 0) + { + return 2; + } + + return 0; +} + +static int detect_qt_version(int libflag) +{ + int qt4; + int qt5; + int qt6; + + qt4 = libflag & LIB_FLAG_QT4; + qt5 = libflag & LIB_FLAG_QT5; + qt6 = libflag & LIB_FLAG_QT6; + + if (qt4 > 0 && (qt5 == 0 && qt6 == 0)) + { + return 4; + } + + if (qt5 > 0 && (qt4 == 0 && qt6 == 0)) + { + return 5; + } + + if (qt6 > 0 && (qt4 == 0 && qt5 == 0)) + { + return 6; + } + + if (qt5 > 0) + { + return 5; + } + + if (qt6 > 0) + { + return 6; + } + + if (qt4 > 0) + { + return 4; + } + + return 0; +} + +int bit_from_machine(const char *machine) +{ + if (strstr(machine, "64")) + { + return 64; + } + else + { + return 32; + } +} + +int get_os_bit(int *bit) +{ + int ret; + struct utsname unameData; + + memset(&unameData, 0, sizeof(unameData)); + ret = uname(&unameData); + if (ret != 0) + { + vlog("uname error, code: %d\n", errno); + return 1; + } + + *bit = strstr(unameData.machine, "64") ? 64 : 32; + vlog("uname -m <%s> %dbit\n", unameData.machine, *bit); + + return 0; +} + +int read_file_1st_line(const char *file, char *buffer, int buflen) +{ + FILE *fp = NULL; + + fp = fopen(file, "r"); + if (fp == NULL) + { + vlog("Failed to open file %s code:%d", file, errno); + return 1; + } + + fgets(buffer, buflen, fp); + fclose(fp); + return 0; +} + +static int read_pid_cmdline(long pid, char *Buffer, int BufLen) +{ + char path[256]; + + snprintf(path, sizeof(path), "/proc/%ld/cmdline", pid); + return read_file_1st_line(path, Buffer, BufLen); +} + +static int is_dir_exist(const char *fmt, ...) +{ + va_list arg; + struct stat st; + char path[4096]; + + va_start(arg, fmt); + vsnprintf(path, sizeof(path), fmt, arg); + va_end(arg); + + memset(&st, 0, sizeof(st)); + if (stat(path, &st) < 0) + { + return 0; + } + + if (st.st_mode & S_IFDIR) + { + return 1; + } + + return 0; +} + +static void touch_new_file(char *filename) +{ + char *pos = NULL; + FILE *fp = NULL; + + if (access(filename, F_OK) == -1) + { + for (pos = filename; *pos; pos++) + { + if (*pos == '/') + { + *pos = 0; + if (!is_dir_exist("%s", filename)) + { + mkdir(filename, 0755); + } + *pos = '/'; + } + } + + fp = fopen(filename, "w+"); + if (fp) + { + fclose(fp); + } + } +} + +static int find_exe_path(const char *exe, char *pathbuf, int buflen) +{ + int i; + char path[PATH_MAX]; + char *tmpptr = NULL; + char *saveptr = NULL; + char *newenv = NULL; + const char *env = getenv("PATH"); + + if (NULL == env) + { + return 0; + } + + newenv = strdup(env); + if (!newenv) + { + return 0; + } + + tmpptr = newenv; + while (NULL != (tmpptr = strtok_r(tmpptr, ":", &saveptr))) + { + snprintf(path, sizeof(path), "%s/%s", tmpptr, exe); + if (access(path, F_OK) != -1) + { + snprintf(pathbuf, buflen, "%s", path); + free(newenv); + return 1; + } + tmpptr = NULL; + } + + free(newenv); + return 0; +} + +void dump_args(const char *prefix, char **argv) +{ + int i = 0; + + vlog("=========%s ARGS BEGIN===========\n", prefix); + while (argv[i]) + { + vlog("argv[%d]=<%s>\n", i, argv[i]); + i++; + } + vlog("=========%s ARGS END===========\n", prefix); +} + +int pre_check(void) +{ + int ret; + int bit; + int buildbit; + const char *env = NULL; + + env = getenv("DISPLAY"); + if (NULL == env || env[0] != ':') + { + vlog("DISPLAY not exist(%p). Not in X environment.\n", env); + return 1; + } + + ret = get_os_bit(&bit); + if (ret) + { + vlog("Failed to get os bit.\n"); + return 1; + } + + buildbit = strstr(HISO_GUI_ARCH, "64") ? 64 : 32; + vlog("Build bit is %d (%s)\n", buildbit, HISO_GUI_ARCH); + + if (bit != buildbit) + { + vlog("Current system is %d bit (%s). Please run the correct HiperisoGUI.\n", bit, HISO_GUI_ARCH); + return 1; + } + + return 0; +} + +static char * find_argv(int argc, char **argv, char *key) +{ + int i; + int len; + + len = (int)strlen(key); + for (i = 0; i < argc; i++) + { + if (strncmp(argv[i], key, len) == 0) + { + return argv[i]; + } + } + + return NULL; +} + +static int adjust_cur_dir(char *argv0) +{ + int ret = 2; + char c; + char *pos = NULL; + char *end = NULL; + + if (argv0[0] == '.') + { + return 1; + } + + for (pos = argv0; pos && *pos; pos++) + { + if (*pos == '/') + { + end = pos; + } + } + + if (end) + { + c = *end; + *end = 0; + ret = chdir(argv0); + *end = c; + } + + return ret; +} + + + +static char **recover_environ_param(char *env) +{ + int i = 0; + int j = 0; + int k = 0; + int cnt = 0; + char **newenvs = NULL; + + for (i = 0; env[i]; i++) + { + if (env[i] == '\n') + { + cnt++; + } + } + + newenvs = malloc(sizeof(char *) * (cnt + 1)); + if (!newenvs) + { + vlog("malloc new envs fail %d\n", cnt + 1); + return NULL; + } + memset(newenvs, 0, sizeof(char *) * (cnt + 1)); + + for (j = i = 0; env[i]; i++) + { + if (env[i] == '\n') + { + env[i] = 0; + newenvs[k++] = env + j; + j = i + 1; + } + } + + vlog("recover environ %d %d\n", cnt, k); + return newenvs; +} + +static int restart_main(int argc, char **argv, char *guiexe) +{ + int i = 0; + int j = 0; + char *para = NULL; + char **envs = NULL; + char *newargv[MAX_PARAS + 1] = { NULL }; + + para = find_argv(argc, argv, HISO_ENV_STR); + if (!para) + { + vlog("failed to find %s\n", HISO_ENV_STR); + return 1; + } + + newargv[j++] = guiexe; + for (i = 1; i < argc && j < MAX_PARAS; i++) + { + if (strncmp(argv[i], "_hiso_", 6) != 0) + { + newargv[j++] = argv[i]; + } + } + + envs = recover_environ_param(para + strlen(HISO_ENV_STR)); + if (envs) + { + vlog("recover success, argc=%d evecve <%s>\n", j, guiexe); + dump_args("EXECVE", newargv); + execve(guiexe, newargv, envs); + } + else + { + vlog("recover failed, argc=%d evecv <%s>\n", j, guiexe); + execv(guiexe, newargv); + } + + return 1; +} + +static char *create_environ_param(const char *prefix, char **envs) +{ + int i = 0; + int cnt = 0; + int envlen = 0; + int prelen = 0; + char *cur = NULL; + char *para = NULL; + + prelen = strlen(prefix); + for (i = 0; envs[i]; i++) + { + cnt++; + envlen += strlen(envs[i]) + 1; + } + + para = malloc(prelen + envlen); + if (!para) + { + vlog("failed to malloc env str %d\n", prelen + envlen); + return NULL; + } + + cur = para; + memcpy(cur, prefix, prelen); + cur += prelen; + + for (i = 0; envs[i]; i++) + { + envlen = strlen(envs[i]); + memcpy(cur, envs[i], envlen); + + cur[envlen] = '\n'; + cur += envlen + 1; + } + + vlog("create environment param %d\n", cnt); + return para; +} + +static int restart_by_pkexec(int argc, char **argv, const char *curpath, const char *exe) +{ + int i = 0; + int j = 0; + char envcount[64]; + char path[PATH_MAX]; + char pkexec[PATH_MAX]; + char exepara[PATH_MAX]; + char *newargv[MAX_PARAS + 1] = { NULL }; + + vlog("try restart self by pkexec ...\n"); + + if (find_exe_path("pkexec", pkexec, sizeof(pkexec))) + { + vlog("Find pkexec at <%s>\n", pkexec); + } + else + { + vlog("pkexec not found\n"); + return 1; + } + + if (argv[0][0] != '/') + { + snprintf(path, sizeof(path), "%s/%s", curpath, argv[0]); + } + else + { + snprintf(path, sizeof(path), "%s", argv[0]); + } + snprintf(exepara, sizeof(exepara), "%s%s", HISO_GUI_PATH, exe); + + newargv[j++] = pkexec; + newargv[j++] = path; + for (i = 1; i < argc && j < MAX_PARAS; i++) + { + if (strcmp(argv[i], "--xdg") == 0) + { + continue; + } + newargv[j++] = argv[i]; + } + + if (j < MAX_PARAS) + { + newargv[j++] = create_environ_param(HISO_ENV_STR, environ); + } + + if (j < MAX_PARAS) + { + newargv[j++] = exepara; + } + + if (g_xdg_log && j + 1 < MAX_PARAS) + { + newargv[j++] = "-l"; + newargv[j++] = g_log_file; + } + + if (g_xdg_ini && j + 1 < MAX_PARAS) + { + newargv[j++] = "-i"; + newargv[j++] = g_ini_file; + } + + dump_args("PKEXEC", newargv); + execv(pkexec, newargv); + + return 1; +} + +static int ld_cache_lib_check(const char *lib, int *flag) +{ + if (((*flag) & LIB_FLAG_GTK3) == 0) + { + if (strncmp(lib, "libgtk-3.so", 11) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GTK3; + return 0; + } + } + + if (((*flag) & LIB_FLAG_GTK2) == 0) + { + if (strncmp(lib, "libgtk-x11-2.0.so", 17) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GTK2; + return 0; + } + } + + if (((*flag) & LIB_FLAG_GTK4) == 0) + { + if (strncmp(lib, "libgtk-4.so", 11) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GTK4; + return 0; + } + } + + if (((*flag) & LIB_FLAG_QT4) == 0) + { + if (strncmp(lib, "libQt4", 6) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_QT4; + return 0; + } + } + + if (((*flag) & LIB_FLAG_QT5) == 0) + { + if (strncmp(lib, "libQt5", 6) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_QT5; + return 0; + } + } + + if (((*flag) & LIB_FLAG_QT6) == 0) + { + if (strncmp(lib, "libQt6", 6) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_QT6; + return 0; + } + } + + if (((*flag) & LIB_FLAG_GLADE2) == 0) + { + if (strncmp(lib, "libglade-2", 10) == 0) + { + vlog("LIB:<%s>\n", lib); + *flag |= LIB_FLAG_GLADE2; + return 0; + } + } + + return 0; +} + +static int parse_ld_cache(int *flag) +{ + int fd; + int format; + unsigned int i; + struct stat st; + size_t offset = 0; + size_t cache_size = 0; + const char *cache_data = NULL; + struct cache_file *cache = NULL; + struct cache_file_new *cache_new = NULL; + + *flag = 0; + + fd = open(LD_CACHE_FILE, O_RDONLY); + if (fd < 0) + { + vlog("failed to open %s err:%d\n", LD_CACHE_FILE, errno); + return 1; + } + + if (fstat(fd, &st) < 0 || st.st_size == 0) + { + close(fd); + return 1; + } + + cache = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (cache == MAP_FAILED) + { + close(fd); + return 1; + } + + cache_size = st.st_size; + if (cache_size < sizeof (struct cache_file)) + { + vlog("File is not a cache file.\n"); + munmap (cache, cache_size); + close(fd); + return 1; + } + + if (memcmp(cache->magic, CACHEMAGIC, sizeof CACHEMAGIC - 1)) + { + /* This can only be the new format without the old one. */ + cache_new = (struct cache_file_new *) cache; + + if (memcmp(cache_new->magic, CACHEMAGIC_NEW, sizeof CACHEMAGIC_NEW - 1) || + memcmp (cache_new->version, CACHE_VERSION, sizeof CACHE_VERSION - 1)) + { + munmap (cache, cache_size); + close(fd); + return 1; + } + + format = 1; + /* This is where the strings start. */ + cache_data = (const char *) cache_new; + } + else + { + /* Check for corruption, avoiding overflow. */ + if ((cache_size - sizeof (struct cache_file)) / sizeof (struct file_entry) < cache->nlibs) + { + vlog("File is not a cache file.\n"); + munmap (cache, cache_size); + close(fd); + return 1; + } + + offset = ALIGN_CACHE(sizeof (struct cache_file) + (cache->nlibs * sizeof (struct file_entry))); + + /* This is where the strings start. */ + cache_data = (const char *) &cache->libs[cache->nlibs]; + + /* Check for a new cache embedded in the old format. */ + if (cache_size > (offset + sizeof (struct cache_file_new))) + { + cache_new = (struct cache_file_new *) ((void *)cache + offset); + + if (memcmp(cache_new->magic, CACHEMAGIC_NEW, sizeof CACHEMAGIC_NEW - 1) == 0 && + memcmp(cache_new->version, CACHE_VERSION, sizeof CACHE_VERSION - 1) == 0) + { + cache_data = (const char *) cache_new; + format = 1; + } + } + } + + if (format == 0) + { + vlog("%d libs found in cache format 0\n", cache->nlibs); + for (i = 0; i < cache->nlibs; i++) + { + ld_cache_lib_check(cache_data + cache->libs[i].key, flag); + } + } + else if (format == 1) + { + vlog("%d libs found in cache format 1\n", cache_new->nlibs); + + for (i = 0; i < cache_new->nlibs; i++) + { + ld_cache_lib_check(cache_data + cache_new->libs[i].key, flag); + } + } + + vlog("ldconfig lib flags 0x%x\n", *flag); + vlog("lib flags GLADE2:[%s] GTK2:[%s] GTK3:[%s] GTK4:[%s] QT4:[%s] QT5:[%s] QT6:[%s]\n", + INT2STR_YN((*flag) & LIB_FLAG_GLADE2), INT2STR_YN((*flag) & LIB_FLAG_GTK2), + INT2STR_YN((*flag) & LIB_FLAG_GTK3), INT2STR_YN((*flag) & LIB_FLAG_GTK4), + INT2STR_YN((*flag) & LIB_FLAG_QT4), INT2STR_YN((*flag) & LIB_FLAG_QT5), + INT2STR_YN((*flag) & LIB_FLAG_QT6)); + + munmap (cache, cache_size); + close (fd); + return 0; +} + +static int gui_type_check(HISO_JSON *pstNode) +{ + FILE *fp = NULL; + const char *env = NULL; + const char *arch = NULL; + const char *srctype = NULL; + const char *srcname = NULL; + const char *condition = NULL; + const char *expression = NULL; + char line[1024]; + + arch = hiso_json_get_string_ex(pstNode, "arch"); + srctype = hiso_json_get_string_ex(pstNode, "type"); + srcname = hiso_json_get_string_ex(pstNode, "name"); + condition = hiso_json_get_string_ex(pstNode, "condition"); + expression = hiso_json_get_string_ex(pstNode, "expression"); + + if (srctype == NULL || srcname == NULL || condition == NULL) + { + return 0; + } + + if (arch && NULL == strstr(arch, HISO_GUI_ARCH)) + { + return 0; + } + + vlog("check <%s> <%s> <%s>\n", srctype, srcname, condition); + + if (strcmp(srctype, "file") == 0) + { + if (access(srcname, F_OK) == -1) + { + return 0; + } + + if (strcmp(condition, "exist") == 0) + { + vlog("File %s exist\n", srcname); + return 1; + } + else if (strcmp(condition, "contains") == 0) + { + fp = fopen(srcname, "r"); + if (fp == NULL) + { + return 0; + } + + while (fgets(line, sizeof(line), fp)) + { + if (strstr(line, expression)) + { + vlog("File %s contains %s\n", srcname, expression); + fclose(fp); + return 1; + } + } + + fclose(fp); + return 0; + } + } + else if (strcmp(srctype, "env") == 0) + { + env = getenv(srcname); + if (env == NULL) + { + return 0; + } + + if (strcmp(condition, "exist") == 0) + { + vlog("env %s exist\n", srcname); + return 1; + } + else if (strcmp(condition, "equal") == 0) + { + if (strcmp(expression, env) == 0) + { + vlog("env %s is %s\n", srcname, env); + return 1; + } + return 0; + } + else if (strcmp(condition, "contains") == 0) + { + if (strstr(env, expression)) + { + vlog("env %s is %s contains %s\n", srcname, env, expression); + return 1; + } + return 0; + } + } + + return 0; +} + +static int read_file_to_buf(const char *FileName, int ExtLen, void **Bufer, int *BufLen) +{ + int FileSize; + FILE *fp = NULL; + void *Data = NULL; + + fp = fopen(FileName, "rb"); + if (fp == NULL) + { + vlog("Failed to open file %s", FileName); + return 1; + } + + fseek(fp, 0, SEEK_END); + FileSize = (int)ftell(fp); + + Data = malloc(FileSize + ExtLen); + if (!Data) + { + fclose(fp); + return 1; + } + + fseek(fp, 0, SEEK_SET); + fread(Data, 1, FileSize, fp); + + fclose(fp); + + *Bufer = Data; + *BufLen = FileSize; + + return 0; +} + +static int distro_check_gui_env(char *type, int len, int *pver) +{ + int size; + int length; + char *pBuf = NULL; + HISO_JSON *pstNode = NULL; + HISO_JSON *pstJson = NULL; + + vlog("distro_check_gui_env ...\n"); + + if (access("./tool/distro_gui_type.json", F_OK) == -1) + { + vlog("distro_gui_type.json file not exist\n"); + return 0; + } + + read_file_to_buf("./tool/distro_gui_type.json", 1, (void **)&pBuf, &size); + pBuf[size] = 0; + + pstJson = hiso_json_create(); + hiso_json_parse(pstJson, pBuf); + + for (pstNode = pstJson->pstChild; pstNode; pstNode = pstNode->pstNext) + { + if (gui_type_check(pstNode->pstChild)) + { + length = (int)snprintf(type, len, "%s", hiso_json_get_string_ex(pstNode->pstChild, "gui")); + *pver = type[length - 1] - '0'; + type[length - 1] = 0; + break; + } + } + + hiso_json_destroy(pstJson); + return pstNode ? 1 : 0; +} + +static int detect_gui_exe_path(int argc, char **argv, const char *curpath, char *pathbuf, int buflen) +{ + int i; + int ret; + int ver; + int libflag = 0; + const char *guitype = NULL; + char line[256]; + mode_t mode; + struct stat filestat; + + for (i = 1; i < argc; i++) + { + if (argv[i] && strcmp(argv[i], "--gtk2") == 0) + { + guitype = "gtk"; + ver = 2; + } + else if (argv[i] && strcmp(argv[i], "--gtk3") == 0) + { + guitype = "gtk"; + ver = 3; + } + else if (argv[i] && strcmp(argv[i], "--gtk4") == 0) + { + guitype = "gtk"; + ver = 4; + } + else if (argv[i] && strcmp(argv[i], "--qt4") == 0) + { + guitype = "qt"; + ver = 4; + } + else if (argv[i] && strcmp(argv[i], "--qt5") == 0) + { + guitype = "qt"; + ver = 5; + } + else if (argv[i] && strcmp(argv[i], "--qt6") == 0) + { + guitype = "qt"; + ver = 6; + } + } + + if (guitype) + { + vlog("Get GUI type from param <%s%d>.\n", guitype, ver); + } + else if (access("./hiperiso_gui_type", F_OK) != -1) + { + vlog("Get GUI type from hiperiso_gui_type file.\n"); + + line[0] = 0; + read_file_1st_line("./hiperiso_gui_type", line, sizeof(line)); + if (strncmp(line, "gtk2", 4) == 0) + { + guitype = "gtk"; + ver = 2; + + parse_ld_cache(&libflag); + if ((libflag & LIB_FLAG_GLADE2) == 0) + { + vlog("libglade2 is necessary for GTK2, but not found.\n"); + return 1; + } + } + else if (strncmp(line, "gtk3", 4) == 0) + { + guitype = "gtk"; + ver = 3; + } + else if (strncmp(line, "gtk4", 4) == 0) + { + guitype = "gtk"; + ver = 4; + } + else if (strncmp(line, "qt4", 3) == 0) + { + guitype = "qt"; + ver = 4; + } + else if (strncmp(line, "qt5", 3) == 0) + { + guitype = "qt"; + ver = 5; + } + else if (strncmp(line, "qt6", 3) == 0) + { + guitype = "qt"; + ver = 6; + } + else + { + vlog("Current X environment is NOT supported.\n"); + return 1; + } + } + else + { + vlog("Now detect the GUI type ...\n"); + + parse_ld_cache(&libflag); + + if ((LIB_FLAG_GTK & libflag) > 0 && (LIB_FLAG_QT & libflag) == 0) + { + guitype = "gtk"; + ver = detect_gtk_version(libflag); + } + else if ((LIB_FLAG_GTK & libflag) == 0 && (LIB_FLAG_QT & libflag) > 0) + { + guitype = "qt"; + ver = detect_qt_version(libflag); + } + else if ((LIB_FLAG_GTK & libflag) > 0 && (LIB_FLAG_QT & libflag) > 0) + { + if (distro_check_gui_env(line, sizeof(line), &ver)) + { + guitype = line; + vlog("distro_check_gui <%s%d> ...\n", line, ver); + } + else if (is_gtk_env()) + { + guitype = "gtk"; + ver = detect_gtk_version(libflag); + } + else if (is_qt_env()) + { + guitype = "qt"; + ver = detect_qt_version(libflag); + } + else + { + vlog("Can not distinguish GTK and QT, default use GTK.\n"); + guitype = "gtk"; + ver = detect_gtk_version(libflag); + } + } + else + { + vlog("Current X environment is NOT supported.\n"); + return 1; + } + } + + snprintf(pathbuf, buflen, "%s/tool/%s/Hiperiso2Disk.%s%d", curpath, HISO_GUI_ARCH, guitype, ver); + + vlog("This is %s%d X environment.\n", guitype, ver); + vlog("exe = %s\n", pathbuf); + + if (access(pathbuf, F_OK) == -1) + { + vlog("%s is not exist.\n", pathbuf); + return 1; + } + + if (access(pathbuf, X_OK) == -1) + { + vlog("execute permission check fail, try chmod.\n", pathbuf); + if (stat(pathbuf, &filestat) == 0) + { + mode = filestat.st_mode | S_IXUSR | S_IXGRP | S_IXOTH; + ret = chmod(pathbuf, mode); + vlog("old mode=%o new mode=%o ret=%d\n", filestat.st_mode, mode, ret); + } + } + else + { + vlog("execute permission check success.\n"); + } + + return 0; +} + +int real_main(int argc, char **argv) +{ + int ret; + int euid; + char *exe = NULL; + const char *env = NULL; + char path[PATH_MAX]; + char curpath[PATH_MAX]; + + ret = adjust_cur_dir(argv[0]); + + vlog("\n"); + vlog("=========================================================\n"); + vlog("=========================================================\n"); + vlog("=============== HiperisoGui %s ===============\n", HISO_GUI_ARCH); + vlog("=========================================================\n"); + vlog("=========================================================\n"); + vlog("log file is <%s>\n", g_log_file); + + euid = geteuid(); + getcwd(curpath, sizeof(curpath)); + + vlog("pid:%ld ppid:%ld uid:%d euid:%d\n", (long)getpid(), (long)getppid(), getuid(), euid); + vlog("adjust dir:%d current path:%s\n", ret, curpath); + dump_args("RAW", argv); + + if (access("./boot/boot.img", F_OK) == -1) + { + vlog("Please run under the correct directory!\n"); + return 1; + } + + exe = find_argv(argc, argv, HISO_GUI_PATH); + if (exe) + { + if (euid != 0) + { + vlog("Invalid euid %d when restart.\n", euid); + return 1; + } + + return restart_main(argc, argv, exe + strlen(HISO_GUI_PATH)); + } + else + { + if (pre_check()) + { + return 1; + } + + if (detect_gui_exe_path(argc, argv, curpath, path, sizeof(path))) + { + return 1; + } + + if (strstr(path, "gtk")) + { + env = getenv("XDG_SESSION_TYPE"); + vlog("=== XDG_SESSION_TYPE is <%s> ===\n", env ? env : "NULL"); + + if (env && strncasecmp(env, "wayland", 7) == 0) + { + vlog("Force GDK_BACKEND from %s to x11 for better compatibility\n", env); + setenv("GDK_BACKEND", "x11", 1); + } + } + + if (euid == 0) + { + vlog("We have root privileges, just exec %s\n", path); + argv[0] = path; + execv(argv[0], argv); + } + else + { + vlog("EUID check failed.\n"); + + /* try pkexec */ + restart_by_pkexec(argc, argv, curpath, path); + + vlog("### Please run with root privileges. ###\n"); + return 1; + } + } + + return 1; +} + +int main(int argc, char **argv) +{ + int i; + int ret; + const char *env = NULL; + + snprintf(g_log_file, sizeof(g_log_file), "log.txt"); + for (i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + touch_new_file(argv[i + 1]); + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + touch_new_file(argv[i + 1]); + } + else if (argv[i] && strcmp(argv[i], "--xdg") == 0) + { + env = getenv("XDG_CACHE_HOME"); + if (env) + { + g_xdg_log = 1; + snprintf(g_log_file, sizeof(g_log_file), "%s/hiperiso/hiperiso.log", env); + touch_new_file(g_log_file); + } + else + { + env = getenv("HOME"); + if (env && is_dir_exist("%s/.cache", env)) + { + g_xdg_log = 1; + snprintf(g_log_file, sizeof(g_log_file), "%s/.cache/hiperiso/hiperiso.log", env); + touch_new_file(g_log_file); + } + } + + env = getenv("XDG_CONFIG_HOME"); + if (env) + { + g_xdg_ini = 1; + snprintf(g_ini_file, sizeof(g_ini_file), "%s/hiperiso/Hiperiso2Disk.ini", env); + touch_new_file(g_ini_file); + } + else + { + env = getenv("HOME"); + if (env && is_dir_exist("%s/.config", env)) + { + g_xdg_ini = 1; + snprintf(g_ini_file, sizeof(g_ini_file), "%s/.config/hiperiso/Hiperiso2Disk.ini", env); + touch_new_file(g_ini_file); + } + } + } + } + + g_log_buf = malloc(MAX_LOG_BUF); + if (!g_log_buf) + { + vlog("Failed to malloc log buffer %d\n", MAX_LOG_BUF); + return 1; + } + + ret = real_main(argc, argv); + free(g_log_buf); + return ret; +} + diff --git a/src/gui/main_gtk.c b/src/gui/main_gtk.c new file mode 100644 index 0000000..65ddb50 --- /dev/null +++ b/src/gui/main_gtk.c @@ -0,0 +1,249 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "hiperiso_gtk.h" + +static int g_kiosk_mode = 0; +char g_log_file[PATH_MAX]; +char g_ini_file[PATH_MAX]; + +static int set_image_from_pixbuf(GtkBuilder *pBuilder, const char *id, const void *pData, int len) +{ + GtkImage *pImage = NULL; + GdkPixbuf *pPixbuf = NULL; + GInputStream *pStream = NULL; + + pImage = (GtkImage *)gtk_builder_get_object(pBuilder, id); + pStream = g_memory_input_stream_new_from_data(pData, len, NULL); + pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL); + gtk_image_set_from_pixbuf(pImage, pPixbuf); + + return 0; +} + +static int set_window_icon_from_pixbuf(GtkWindow *window, const void *pData, int len) +{ + GdkPixbuf *pPixbuf = NULL; + GInputStream *pStream = NULL; + + pStream = g_memory_input_stream_new_from_data(pData, len, NULL); + pPixbuf = gdk_pixbuf_new_from_stream(pStream, NULL, NULL); + + gtk_window_set_icon(window, pPixbuf); + return 0; +} + +int early_msgbox(GtkMessageType type, GtkButtonsType buttons, const char *str) +{ + int ret; + GtkWidget *pMsgBox = NULL; + + pMsgBox= gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, type, buttons, str); + + ret = gtk_dialog_run(GTK_DIALOG(pMsgBox)); + gtk_widget_destroy(pMsgBox); + + return ret; +} + +static int adjust_cur_dir(char *argv0) +{ + int i; + char *end = NULL; + char dirbuf[PATH_MAX]; + + if (argv0[0] == '.') + { + return 1; + } + + snprintf(dirbuf, sizeof(dirbuf), "%s", argv0); + + for (end = dirbuf; end && *end; end++) + { + if (*end == '/') + { + /* keep walking to last slash */ + } + } + + while (end > dirbuf && *end != '/') + { + end--; + } + + if (*end == '/') + { + *end = 0; + } + + for (i = 0; i < 6; i++) + { + if (access("./boot/boot.img", F_OK) == 0) + { + return 0; + } + + if (chdir(dirbuf) != 0) + { + return 2; + } + + if (access("./boot/boot.img", F_OK) == 0) + { + return 0; + } + + if (chdir("..") != 0) + { + break; + } + + if (getcwd(dirbuf, sizeof(dirbuf) - 1) == NULL) + { + return 2; + } + } + + return 2; +} + +int main(int argc, char *argv[]) +{ + int i; + int len; + const void *pData = NULL; + GtkWidget *pWidget = NULL; + GtkBuilder *pBuilder = NULL; + GError *error = NULL; + struct stat logstat; + + gtk_init(&argc, &argv); + + if (geteuid() != 0) + { + early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, + "Hiperiso2Disk permission denied!\r\nPlease run with root privileges."); + return EACCES; + } + + if (access("./boot/boot.img", F_OK) == -1) + { + adjust_cur_dir(argv[0]); + } + + if (access("./boot/boot.img", F_OK) == -1) + { + early_msgbox(GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Please run under the correct directory."); + return 1; + } + + for (i = 0; i < argc; i++) + { + if (argv[i] && strcmp(argv[i], "--kiosk") == 0) + { + g_kiosk_mode = 1; + break; + } + } + + snprintf(g_log_file, sizeof(g_log_file), "log.txt"); + snprintf(g_ini_file, sizeof(g_ini_file), "./Hiperiso2Disk.ini"); + for (i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]); + } + } + + memset(&logstat, 0, sizeof(logstat)); + if (0 == stat(g_log_file, &logstat)) + { + if (logstat.st_size >= 4 * SIZE_1MB) + { + remove(g_log_file); + } + } + + hiperiso_log_init(); + + vlog("================================================\n"); + vlog("===== Hiperiso2Disk %s powered by GTK%d.x =====\n", hiperiso_get_local_version(), GTK_MAJOR_VERSION); + vlog("================================================\n"); + vlog("log file is <%s> lastsize:%lld\n", g_log_file, (long long)logstat.st_size); + vlog("ini file is <%s>\n", g_ini_file); + + hiperiso_disk_init(); + + hiperiso_http_init(); + + pBuilder = gtk_builder_new(); + if (!pBuilder) + { + vlog("failed to create builder\n"); + return 1; + } + + if (!gtk_builder_add_from_file(pBuilder, "./tool/HiperisoGTK.glade", &error)) + { + vlog("gtk_builder_add_from_file failed:%s\n", error->message); + g_clear_error(&error); + return 1; + } + + if (g_kiosk_mode) + { + gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_refresh"), "/hiperiso/refresh.png"); + gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_secure_local"), "/hiperiso/secure.png"); + gtk_image_set_from_file((GtkImage *)gtk_builder_get_object(pBuilder, "image_secure_dev"), "/hiperiso/secure.png"); + } + else + { + pData = get_refresh_icon_raw_data(&len); + set_image_from_pixbuf(pBuilder, "image_refresh", pData, len); + pData = get_secure_icon_raw_data(&len); + set_image_from_pixbuf(pBuilder, "image_secure_local", pData, len); + set_image_from_pixbuf(pBuilder, "image_secure_dev", pData, len); + } + + pWidget = GTK_WIDGET(gtk_builder_get_object(pBuilder, "window")); + gtk_widget_show_all(pWidget); + + pData = get_window_icon_raw_data(&len); + set_window_icon_from_pixbuf(GTK_WINDOW(pWidget), pData, len); + + on_init_window(pBuilder); + g_signal_connect(G_OBJECT(pWidget), "delete_event", G_CALLBACK(on_exit_window), NULL); + g_signal_connect(G_OBJECT(pWidget), "destroy", G_CALLBACK(gtk_main_quit), NULL); + + gtk_main(); + + hiperiso_disk_exit(); + hiperiso_http_exit(); + + g_object_unref (G_OBJECT(pBuilder)); + + vlog("######## Hiperiso2Disk GTK %s exit ########\n", hiperiso_get_local_version()); + + /* log exit must at the end */ + hiperiso_log_exit(); + return 0; +} + diff --git a/src/gui/main_webui.c b/src/gui/main_webui.c new file mode 100644 index 0000000..fa21cc0 --- /dev/null +++ b/src/gui/main_webui.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +char g_log_file[PATH_MAX]; +char g_ini_file[PATH_MAX]; + +int hiperiso_log_init(void); +void hiperiso_log_exit(void); + +void hiperiso_signal_stop(int sig) +{ + vlog("hiperiso server exit due to signal ...\n"); + printf("hiperiso server exit ...\n"); + + hiperiso_http_stop(); + hiperiso_http_exit(); + hiperiso_disk_exit(); + hiperiso_log_exit(); + exit(0); +} + +int main(int argc, char **argv) +{ + int i; + int rc; + const char *ip = "127.0.0.1"; + const char *port = "24680"; + + if (argc != 3) + { + printf("Invalid argc %d\n", argc); + return 1; + } + + if (isdigit(argv[1][0])) + { + ip = argv[1]; + } + + if (isdigit(argv[2][0])) + { + port = argv[2]; + } + + snprintf(g_log_file, sizeof(g_log_file), "log.txt"); + snprintf(g_ini_file, sizeof(g_ini_file), "./Hiperiso2Disk.ini"); + for (i = 0; i < argc; i++) + { + if (argv[i] && argv[i + 1] && strcmp(argv[i], "-l") == 0) + { + snprintf(g_log_file, sizeof(g_log_file), "%s", argv[i + 1]); + } + else if (argv[i] && argv[i + 1] && strcmp(argv[i], "-i") == 0) + { + snprintf(g_ini_file, sizeof(g_ini_file), "%s", argv[i + 1]); + } + } + + hiperiso_log_init(); + + vlog("===============================================\n"); + vlog("===== Hiperiso2Disk %s %s:%s =====\n", hiperiso_get_local_version(), ip, port); + vlog("===============================================\n"); + + hiperiso_disk_init(); + + hiperiso_http_init(); + + rc = hiperiso_http_start(ip, port); + if (rc) + { + printf("Hiperiso failed to start http server, check log.txt for detail\n"); + } + else + { + signal(SIGINT, hiperiso_signal_stop); + signal(SIGTSTP, hiperiso_signal_stop); + signal(SIGQUIT, hiperiso_signal_stop); + while (1) + { + sleep(100); + } + } + + return 0; +} +