SerialICE
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
April 2012
- 2 participants
- 24 discussions
April 22, 2012
Kyösti Mälkki (kyosti.malkki(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/918
-gerrit
commit d20332a4a817fc20aa715af2db3212e581c29b28
Author: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
Date: Sat Apr 21 21:18:43 2012 +0300
Fix lua detection
With these changes I can used shared lua library.
Change-Id: I8bb19216aaae61fc04554a63e8b65ee84c298af1
Signed-off-by: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
---
qemu-0.15.x/build.sh | 2 +-
qemu-0.15.x/configure | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/qemu-0.15.x/build.sh b/qemu-0.15.x/build.sh
index 34b564c..2cac6f5 100644
--- a/qemu-0.15.x/build.sh
+++ b/qemu-0.15.x/build.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-./configure --disable-kvm --disable-sdl --enable-serialice \
+./configure --extra-ldflags="-ldl" --disable-kvm --disable-sdl --enable-serialice \
--target-list="x86_64-softmmu, i386-softmmu"
make
diff --git a/qemu-0.15.x/configure b/qemu-0.15.x/configure
index 91ecf5b..3393ab6 100755
--- a/qemu-0.15.x/configure
+++ b/qemu-0.15.x/configure
@@ -1736,7 +1736,7 @@ int main(void) { L=luaL_newstate(); return 0; }
EOF
lua_cflags="-I/usr/local/include"
- lua_ldflags="-L/usr/local/lib -llua"
+ lua_ldflags="-L/usr/local/lib -llua -lm"
if compile_prog "$lua_cflags" "$lua_ldflags" > /dev/null 2> /dev/null ; then
serialice=yes
libs_softmmu="$lua_ldflags $libs_softmmu"
1
0
April 22, 2012
Kyösti Mälkki (kyosti.malkki(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/917
-gerrit
commit f82f6df2c6a0a1cccbec4b879cce82c594cf8c00
Author: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
Date: Sat Apr 21 20:58:06 2012 +0300
Fix build with lua5.2
Reuse the following commit for qemu-0.15.x:
c6fae6554d1fd48780258bef2b3be4b45ef3a588
Change-Id: I8b4ddd12aff3fb4a1799a1b446fdc71162b6b40f
Signed-off-by: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
---
qemu-0.15.x/serialice.c | 34 +++++++++++++++++++---------------
1 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/qemu-0.15.x/serialice.c b/qemu-0.15.x/serialice.c
index 317aaea..4ad082b 100644
--- a/qemu-0.15.x/serialice.c
+++ b/qemu-0.15.x/serialice.c
@@ -221,7 +221,11 @@ static int serialice_lua_registers(void)
lua_newuserdata(L, sizeof(void *));
luaL_newmetatable(L, "registermt");
+#if LUA_VERSION_NUM <= 501
luaL_register(L, NULL, registermt);
+#elif LUA_VERSION_NUM >= 502
+ luaL_setfuncs(L, registermt, 0);
+#endif
lua_setmetatable(L, -2);
lua_setglobal(L, "regs");
@@ -242,7 +246,7 @@ static int serialice_lua_init(void)
/* Set global variable SerialICE_mainboard */
lua_pushstring(L, serialice_mainboard);
- lua_setfield(L, LUA_GLOBALSINDEX, "SerialICE_mainboard");
+ lua_setglobal(L, "SerialICE_mainboard");
/* Enable Register Access */
serialice_lua_registers();
@@ -290,7 +294,7 @@ static int serialice_io_read_filter(uint32_t * data, uint16_t port, int size)
{
int ret, result;
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_io_read_filter");
+ lua_getglobal(L, "SerialICE_io_read_filter");
lua_pushinteger(L, port); // port
lua_pushinteger(L, size); // datasize
result = lua_pcall(L, 2, 2, 0);
@@ -310,7 +314,7 @@ static int serialice_io_write_filter(uint32_t * data, uint16_t port, int size)
{
int ret, result;
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_io_write_filter");
+ lua_getglobal(L, "SerialICE_io_write_filter");
lua_pushinteger(L, port); // port
lua_pushinteger(L, size); // datasize
lua_pushinteger(L, *data); // data
@@ -336,7 +340,7 @@ static int serialice_memory_read_filter(uint32_t addr, uint32_t * data,
{
int ret = 0, result;
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_memory_read_filter");
+ lua_getglobal(L, "SerialICE_memory_read_filter");
lua_pushinteger(L, addr); // addr
lua_pushinteger(L, size); // datasize
result = lua_pcall(L, 2, 3, 0);
@@ -366,7 +370,7 @@ static int serialice_memory_write_filter(uint32_t addr, int size,
int ret = 0, result;
int write_to_qemu, write_to_serialice;
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_memory_write_filter");
+ lua_getglobal(L, "SerialICE_memory_write_filter");
lua_pushinteger(L, addr); // address
lua_pushinteger(L, size); // datasize
lua_pushinteger(L, *data); // data
@@ -397,9 +401,9 @@ static int serialice_msr_filter(int flags, uint32_t addr, uint32_t * hi,
int ret, result;
if (flags & FILTER_WRITE) {
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_msr_write_filter");
+ lua_getglobal(L, "SerialICE_msr_write_filter");
} else {
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_msr_read_filter");
+ lua_getglobal(L, "SerialICE_msr_read_filter");
}
lua_pushinteger(L, addr); // port
@@ -427,7 +431,7 @@ static int serialice_cpuid_filter(uint32_t eax, uint32_t ecx,
{
int ret, result;
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_cpuid_filter");
+ lua_getglobal(L, "SerialICE_cpuid_filter");
lua_pushinteger(L, eax); // eax before calling
lua_pushinteger(L, ecx); // ecx before calling
@@ -471,13 +475,13 @@ static void serialice_log(int flags, uint32_t data, uint32_t addr, int size)
int result;
if ((flags & LOG_WRITE) && (flags & LOG_MEMORY)) {
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_memory_write_log");
+ lua_getglobal(L, "SerialICE_memory_write_log");
} else if (!(flags & LOG_WRITE) && (flags & LOG_MEMORY)) {
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_memory_read_log");
+ lua_getglobal(L, "SerialICE_memory_read_log");
} else if ((flags & LOG_WRITE) && !(flags & LOG_MEMORY)) {
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_io_write_log");
+ lua_getglobal(L, "SerialICE_io_write_log");
} else { // if (!(flags & LOG_WRITE) && !(flags & LOG_MEMORY))
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_io_read_log");
+ lua_getglobal(L, "SerialICE_io_read_log");
}
lua_pushinteger(L, addr); // addr/port
@@ -500,9 +504,9 @@ static void serialice_msr_log(int flags, uint32_t addr, uint32_t hi,
int result;
if (flags & LOG_WRITE) {
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_msr_write_log");
+ lua_getglobal(L, "SerialICE_msr_write_log");
} else { // if (!(flags & LOG_WRITE))
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_msr_read_log");
+ lua_getglobal(L, "SerialICE_msr_read_log");
}
lua_pushinteger(L, addr); // addr/port
@@ -522,7 +526,7 @@ static void serialice_cpuid_log(uint32_t eax, uint32_t ecx, cpuid_regs_t res,
{
int result;
- lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_cpuid_log");
+ lua_getglobal(L, "SerialICE_cpuid_log");
lua_pushinteger(L, eax); // input: eax
lua_pushinteger(L, ecx); // input: ecx
1
0
April 22, 2012
Kyösti Mälkki (kyosti.malkki(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/916
-gerrit
commit 82c89f1a63fa33076ee5e9e4639653d1596281ca
Author: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
Date: Sat Apr 21 20:24:39 2012 +0300
Apply serialice patch
Apply SerialICE/patches/serialice-qemu-0.15.0.diff from commit:
b1ddcd86f4ea27bf8f20020ae24954da5d948b4e
Change-Id: I5b70840516d633ffa7bea644c995fe9d241c372c
Signed-off-by: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
---
qemu-0.15.x/Makefile | 6 +
qemu-0.15.x/Makefile.target | 7 +
qemu-0.15.x/build.sh | 5 +
qemu-0.15.x/configure | 46 +-
qemu-0.15.x/exec-all.h | 4 +
qemu-0.15.x/hmp-commands.hx | 15 +
qemu-0.15.x/monitor.c | 33 +
qemu-0.15.x/qemu-char.c | 4 +-
qemu-0.15.x/qemu-options.hx | 10 +
qemu-0.15.x/serialice.c | 1307 +++
qemu-0.15.x/serialice.h | 73 +
qemu-0.15.x/serialice_banner.h |19237 +++++++++++++++++++++++++++++++++++
qemu-0.15.x/softmmu_template.h | 32 +
qemu-0.15.x/target-i386/op_helper.c | 62 +
qemu-0.15.x/vl.c | 8 +
15 files changed, 20846 insertions(+), 3 deletions(-)
diff --git a/qemu-0.15.x/Makefile b/qemu-0.15.x/Makefile
index 0a31633..076b0ec 100644
--- a/qemu-0.15.x/Makefile
+++ b/qemu-0.15.x/Makefile
@@ -119,6 +119,12 @@ bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS)
version.o: $(SRC_PATH)/version.rc config-host.mak
$(call quiet-command,$(WINDRES) -I. -o $@ $<," RC $(TARGET_DIR)$@")
+ifdef CONFIG_SERIALICE
+serialice.o: serialice.c serialice.h
+endif
+
+serialice.o: QEMU_CFLAGS += $(SERIALICE_CFLAGS)
+
version-obj-$(CONFIG_WIN32) += version.o
######################################################################
# Support building shared library libcacard
diff --git a/qemu-0.15.x/Makefile.target b/qemu-0.15.x/Makefile.target
index cde509b..22c8ff1 100644
--- a/qemu-0.15.x/Makefile.target
+++ b/qemu-0.15.x/Makefile.target
@@ -221,6 +221,13 @@ ifeq ($(CONFIG_KVM), y)
endif
obj-$(CONFIG_IVSHMEM) += ivshmem.o
+# Generic SerialICE support
+ifdef CONFIG_SERIALICE
+QEMU_CFLAGS += $(SERIALICE_CFLAGS)
+LIBS+=-lm
+endif
+obj-$(CONFIG_SERIALICE) += serialice.o
+
# Hardware support
obj-i386-y += vga.o
obj-i386-y += mc146818rtc.o i8259.o pc.o
diff --git a/qemu-0.15.x/build.sh b/qemu-0.15.x/build.sh
new file mode 100644
index 0000000..34b564c
--- /dev/null
+++ b/qemu-0.15.x/build.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+./configure --disable-kvm --disable-sdl --enable-serialice \
+ --target-list="x86_64-softmmu, i386-softmmu"
+
+make
diff --git a/qemu-0.15.x/configure b/qemu-0.15.x/configure
index 29d6212..91ecf5b 100755
--- a/qemu-0.15.x/configure
+++ b/qemu-0.15.x/configure
@@ -165,6 +165,7 @@ guest_base=""
uname_release=""
io_thread="no"
mixemu="no"
+serialice="no"
aix="no"
blobs="yes"
pkgversion=""
@@ -712,6 +713,8 @@ for opt do
;;
--enable-mixemu) mixemu="yes"
;;
+ --enable-serialice) serialice="yes"
+ ;;
--disable-linux-aio) linux_aio="no"
;;
--enable-linux-aio) linux_aio="yes"
@@ -962,6 +965,7 @@ echo " Available cards: $audio_possible_cards"
echo " --block-drv-whitelist=L set block driver whitelist"
echo " (affects only QEMU, not qemu-img)"
echo " --enable-mixemu enable mixer emulation"
+echo " --enable-serialice enable SerialICE debugger support"
echo " --disable-xen disable xen backend driver support"
echo " --enable-xen enable xen backend driver support"
echo " --disable-brlapi disable BrlAPI"
@@ -1717,6 +1721,41 @@ for drv in $audio_drv_list; do
done
##########################################
+# LUA probe
+
+if test "$serialice" != "no" ; then
+ serialice=no
+ cat > $TMPC << EOF
+#include <stdint.h>
+#include <lua.h>
+#include <lauxlib.h>
+#include <stdlib.h>
+#include <stdio.h>
+static lua_State *L;
+int main(void) { L=luaL_newstate(); return 0; }
+EOF
+
+ lua_cflags="-I/usr/local/include"
+ lua_ldflags="-L/usr/local/lib -llua"
+ if compile_prog "$lua_cflags" "$lua_ldflags" > /dev/null 2> /dev/null ; then
+ serialice=yes
+ libs_softmmu="$lua_ldflags $libs_softmmu"
+ else
+ lua_cflags=`$pkg_config --cflags lua`
+ lua_ldflags=`$pkg_config --libs lua`
+ if compile_prog "$lua_cflags" "$lua_ldflags" > /dev/null 2> /dev/null ; then
+ serialice=yes
+ libs_softmmu="$lua_ldflags $libs_softmmu"
+ else
+ echo
+ echo "Error LUA not found, can't build with SerialICE support."
+ echo
+ exit 1
+ fi
+ fi
+fi # test "$serialice"
+
+##########################################
# BrlAPI probe
if test "$brlapi" != "no" ; then
@@ -2675,6 +2714,7 @@ echo "Audio drivers $audio_drv_list"
echo "Extra audio cards $audio_card_list"
echo "Block whitelist $block_drv_whitelist"
echo "Mixer emulation $mixemu"
+echo "SerialICE support $serialice"
echo "VNC support $vnc"
if test "$vnc" = "yes" ; then
echo "VNC TLS support $vnc_tls"
@@ -2841,6 +2881,10 @@ fi
if test "$vnc" = "yes" ; then
echo "CONFIG_VNC=y" >> $config_host_mak
fi
+if test "$serialice" = "yes" ; then
+ echo "CONFIG_SERIALICE=y" >> $config_host_mak
+ echo "SERIALICE_CFLAGS=$lua_cflags" >> $config_host_mak
+fi
if test "$vnc_tls" = "yes" ; then
echo "CONFIG_VNC_TLS=y" >> $config_host_mak
echo "VNC_TLS_CFLAGS=$vnc_tls_cflags" >> $config_host_mak
@@ -3087,7 +3131,7 @@ echo "HELPER_CFLAGS=$helper_cflags" >> $config_host_mak
echo "LDFLAGS=$LDFLAGS" >> $config_host_mak
echo "ARLIBS_BEGIN=$arlibs_begin" >> $config_host_mak
echo "ARLIBS_END=$arlibs_end" >> $config_host_mak
-echo "LIBS+=$LIBS" >> $config_host_mak
+echo "LIBS+= $LIBS" >> $config_host_mak
echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
echo "EXESUF=$EXESUF" >> $config_host_mak
diff --git a/qemu-0.15.x/exec-all.h b/qemu-0.15.x/exec-all.h
index 9b8d62c..3ac2883 100644
--- a/qemu-0.15.x/exec-all.h
+++ b/qemu-0.15.x/exec-all.h
@@ -21,6 +21,7 @@
#define _EXEC_ALL_H_
#include "qemu-common.h"
+#include "serialice.h"
/* allow to see translation results - the slowdown should be negligible, so we leave it */
#define DEBUG_DISAS
@@ -325,6 +326,9 @@ static inline tb_page_addr_t get_page_addr_code(CPUState *env1, target_ulong add
#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SPARC)
cpu_unassigned_access(env1, addr, 0, 1, 0, 4);
#else
+#if defined(CONFIG_SERIALICE)
+ if (!serialice_active)
+#endif
cpu_abort(env1, "Trying to execute code outside RAM or ROM at 0x" TARGET_FMT_lx "\n", addr);
#endif
}
diff --git a/qemu-0.15.x/hmp-commands.hx b/qemu-0.15.x/hmp-commands.hx
index c857827..6e247a3 100644
--- a/qemu-0.15.x/hmp-commands.hx
+++ b/qemu-0.15.x/hmp-commands.hx
@@ -180,6 +180,21 @@ STEXI
Output logs to @var{filename}.
ETEXI
+#ifdef CONFIG_SERIALICE
+ {
+ .name = "lua",
+ .args_type = "",
+ .params = "",
+ .help = "go to lua shell",
+ .mhandler.cmd_lua = do_lua,
+ },
+#endif
+STEXI
+@item lua
+@findex lua
+go to lua shell.
+ETEXI
+
#ifdef CONFIG_SIMPLE_TRACE
{
.name = "trace-event",
diff --git a/qemu-0.15.x/monitor.c b/qemu-0.15.x/monitor.c
index fee572c..c090bd5 100644
--- a/qemu-0.15.x/monitor.c
+++ b/qemu-0.15.x/monitor.c
@@ -41,6 +41,7 @@
#include "console.h"
#include "blockdev.h"
#include "audio/audio.h"
+#include "serialice.h"
#include "disas.h"
#include "balloon.h"
#include "qemu-timer.h"
@@ -115,6 +116,7 @@ typedef struct mon_cmd_t {
void (*info_new)(Monitor *mon, QObject **ret_data);
int (*info_async)(Monitor *mon, MonitorCompletion *cb, void *opaque);
void (*cmd)(Monitor *mon, const QDict *qdict);
+ void (*cmd_lua)(Monitor *mon);
int (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
int (*cmd_async)(Monitor *mon, const QDict *params,
MonitorCompletion *cb, void *opaque);
@@ -2027,6 +2029,37 @@ static int do_system_powerdown(Monitor *mon, const QDict *qdict,
return 0;
}
+#if defined(CONFIG_SERIALICE)
+static void monitor_command_lua(Monitor *mon, const char *cmdline, void *opaque)
+{
+ char *errmsg;
+
+ if (!strncasecmp("quit", cmdline, 5)) {
+ monitor_printf(mon, "Exited LUA shell.\n");
+ readline_start(mon->rs, "(qemu) ", 0, monitor_command_cb, NULL);
+ readline_show_prompt(mon->rs);
+ return;
+ }
+
+ errmsg = (char *)serialice_lua_execute(cmdline);
+ if(errmsg) {
+ monitor_printf(mon, "Lua error: %s\n", errmsg);
+ free (errmsg);
+ }
+
+ readline_show_prompt(mon->rs);
+}
+
+static void do_lua(Monitor *mon)
+{
+ if (serialice_active) {
+ readline_start(mon->rs, "(lua) ", 0, monitor_command_lua, NULL);
+ } else {
+ monitor_printf(mon, "SerialICE is not active.\n");
+ }
+}
+#endif
+
#if defined(TARGET_I386)
static void print_pte(Monitor *mon, target_phys_addr_t addr,
target_phys_addr_t pte,
diff --git a/qemu-0.15.x/qemu-char.c b/qemu-0.15.x/qemu-char.c
index 8e8cf31..76b33e1 100644
--- a/qemu-0.15.x/qemu-char.c
+++ b/qemu-0.15.x/qemu-char.c
@@ -860,7 +860,7 @@ static void cfmakeraw (struct termios *termios_p)
#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
|| defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
- || defined(__GLIBC__)
+ || defined(__GLIBC__) || defined(__APPLE__)
typedef struct {
int fd;
@@ -2536,7 +2536,7 @@ static const struct {
#endif
#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
|| defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
- || defined(__FreeBSD_kernel__)
+ || defined(__FreeBSD_kernel__) || defined(__APPLE__)
{ .name = "tty", .open = qemu_chr_open_tty },
#endif
#if defined(__linux__) || defined(__FreeBSD__) || defined(__DragonFly__) \
diff --git a/qemu-0.15.x/qemu-options.hx b/qemu-0.15.x/qemu-options.hx
index 6238075..9d5582d 100644
--- a/qemu-0.15.x/qemu-options.hx
+++ b/qemu-0.15.x/qemu-options.hx
@@ -2427,6 +2427,16 @@ Specify a trace file to log output traces to.
ETEXI
#endif
+#ifdef CONFIG_SERIALICE
+DEF("serialice", HAS_ARG, QEMU_OPTION_serialice,
+ "-serialice dev Enable SerialICE debugging on serial device 'dev'\n",
+ QEMU_ARCH_ALL)
+#endif
+STEXI
+@item -serialice @var{dev}
+Enable SerialICE debugging on serial device @var{dev}.
+ETEXI
+
HXCOMM This is the last statement. Insert new options before this line!
STEXI
@end table
diff --git a/qemu-0.15.x/serialice.c b/qemu-0.15.x/serialice.c
new file mode 100644
index 0000000..317aaea
--- /dev/null
+++ b/qemu-0.15.x/serialice.c
@@ -0,0 +1,1307 @@
+/*
+ * QEMU PC System Emulator
+ *
+ * Copyright (c) 2009 coresystems GmbH
+ *
+ * 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.
+ */
+
+/* Indented with:
+ * gnuindent -npro -kr -i4 -nut -bap -sob -l80 -ss -ncs serialice.*
+ */
+
+/* System includes */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <string.h>
+#ifdef WIN32
+#include <windows.h>
+#include <conio.h>
+#else
+#include <fcntl.h>
+#include <termios.h>
+#include <sys/ioctl.h>
+#endif
+
+/* LUA includes */
+#include <lua.h>
+#include <lauxlib.h>
+#include <lualib.h>
+
+/* Local includes */
+#include "hw/hw.h"
+#include "hw/loader.h"
+#include "hw/pc.h"
+#include "hw/boards.h"
+#include "console.h"
+#include "serialice.h"
+#include "sysemu.h"
+
+#define SERIALICE_BANNER 1
+#if SERIALICE_BANNER
+#include "serialice_banner.h"
+#endif
+
+#define DEFAULT_RAM_SIZE 128
+#define BIOS_FILENAME "bios.bin"
+
+#define SERIALICE_DEBUG 3
+#define BUFFER_SIZE 1024
+typedef struct {
+#ifdef WIN32
+ HANDLE fd;
+#else
+ int fd;
+#endif
+ DisplayState *ds;
+ char *buffer;
+ char *command;
+} SerialICEState;
+
+static SerialICEState *s;
+
+int serialice_active = 0;
+const char *serialice_lua_script = "serialice.lua";
+
+const char *serialice_mainboard = NULL;
+
+#ifndef WIN32
+static struct termios options;
+#endif
+
+static lua_State *L;
+
+// **************************************************************************
+// LUA scripting interface and callbacks
+
+static int serialice_register_physical(lua_State * luastate)
+{
+ int n = lua_gettop(luastate);
+ static uint8_t num = 1;
+ uint32_t addr, size;
+ ram_addr_t phys;
+ char ram_name[16];
+
+ if (n != 2) {
+ fprintf(stderr,
+ "ERROR: Not called as SerialICE_register_physical(<addr> <size>)\n");
+ return 0;
+ }
+
+ addr = lua_tointeger(luastate, 1);
+ size = lua_tointeger(luastate, 2);
+
+ if (num > 99) {
+ fprintf(stderr,"To much memory ranges registered\n");
+ exit(1);
+ }
+ printf("Registering physical memory at 0x%08x (0x%08x bytes)\n", addr, size);
+ sprintf(ram_name, "serialice_ram%u", num);
+ phys = qemu_ram_alloc(NULL, ram_name, size);
+ cpu_register_physical_memory(addr, size, phys);
+ num++;
+ return 0;
+}
+
+static int serialice_system_reset(lua_State * luastate)
+{
+ printf("Rebooting the emulated host CPU\n");
+ qemu_system_reset_request();
+ return 0;
+}
+
+// **************************************************************************
+// LUA register access
+
+// some macros from target-i386/exec.h, which we can't include directly
+#define env first_cpu
+#define EAX (env->regs[R_EAX])
+#define ECX (env->regs[R_ECX])
+#define EDX (env->regs[R_EDX])
+#define EBX (env->regs[R_EBX])
+#define ESP (env->regs[R_ESP])
+#define EBP (env->regs[R_EBP])
+#define ESI (env->regs[R_ESI])
+#define EDI (env->regs[R_EDI])
+#define EIP (env->eip)
+#define CS (env->segs[R_CS].base)
+static int register_set(lua_State * L)
+{
+ const char *key = luaL_checkstring(L, 2);
+ int val = luaL_checkint(L, 3);
+ int ret = 1;
+
+ if (strcmp(key, "eax") == 0) {
+ EAX = val;
+ } else if (strcmp(key, "ecx") == 0) {
+ ECX = val;
+ } else if (strcmp(key, "edx") == 0) {
+ EDX = val;
+ } else if (strcmp(key, "ebx") == 0) {
+ EBX = val;
+ } else if (strcmp(key, "esp") == 0) {
+ ESP = val;
+ } else if (strcmp(key, "ebp") == 0) {
+ EBP = val;
+ } else if (strcmp(key, "esi") == 0) {
+ ESI = val;
+ } else if (strcmp(key, "edi") == 0) {
+ EDI = val;
+ } else if (strcmp(key, "eip") == 0) {
+ EIP = val;
+ } else if (strcmp(key, "cs") == 0) {
+ CS = (val << 4);
+ } else {
+ lua_pushstring(L, "No such register.");
+ lua_error(L);
+ ret = 0;
+ }
+ return ret;
+}
+
+static int register_get(lua_State * L)
+{
+ const char *key = luaL_checkstring(L, 2);
+ int ret = 1;
+ if (strcmp(key, "eax") == 0) {
+ lua_pushinteger(L, EAX);
+ } else if (strcmp(key, "ecx") == 0) {
+ lua_pushinteger(L, ECX);
+ } else if (strcmp(key, "edx") == 0) {
+ lua_pushinteger(L, EDX);
+ } else if (strcmp(key, "ebx") == 0) {
+ lua_pushinteger(L, EBX);
+ } else if (strcmp(key, "esp") == 0) {
+ lua_pushinteger(L, ESP);
+ } else if (strcmp(key, "ebp") == 0) {
+ lua_pushinteger(L, EBP);
+ } else if (strcmp(key, "esi") == 0) {
+ lua_pushinteger(L, ESI);
+ } else if (strcmp(key, "edi") == 0) {
+ lua_pushinteger(L, EDI);
+ } else if (strcmp(key, "eip") == 0) {
+ lua_pushinteger(L, EIP);
+ } else if (strcmp(key, "cs") == 0) {
+ lua_pushinteger(L, (CS >> 4));
+ } else {
+ lua_pushstring(L, "No such register.");
+ lua_error(L);
+ ret = 0;
+ }
+ return ret;
+}
+
+#undef env
+
+static int serialice_lua_registers(void)
+{
+ const struct luaL_Reg registermt[] = {
+ {"__index", register_get},
+ {"__newindex", register_set},
+ {NULL, NULL}
+ };
+
+ lua_newuserdata(L, sizeof(void *));
+ luaL_newmetatable(L, "registermt");
+ luaL_register(L, NULL, registermt);
+ lua_setmetatable(L, -2);
+ lua_setglobal(L, "regs");
+
+ return 0;
+}
+
+static int serialice_lua_init(void)
+{
+ int status;
+
+ /* Create a LUA context and load LUA libraries */
+ L = luaL_newstate();
+ luaL_openlibs(L);
+
+ /* Register C function callbacks */
+ lua_register(L, "SerialICE_register_physical", serialice_register_physical);
+ lua_register(L, "SerialICE_system_reset", serialice_system_reset);
+
+ /* Set global variable SerialICE_mainboard */
+ lua_pushstring(L, serialice_mainboard);
+ lua_setfield(L, LUA_GLOBALSINDEX, "SerialICE_mainboard");
+
+ /* Enable Register Access */
+ serialice_lua_registers();
+
+ /* Load the script file */
+ status = luaL_loadfile(L, serialice_lua_script);
+ if (status) {
+ fprintf(stderr, "Couldn't load SerialICE script: %s\n",
+ lua_tostring(L, -1));
+ exit(1);
+ }
+
+ /* Ask Lua to run our little script */
+ status = lua_pcall(L, 0, 1, 0);
+ if (status) {
+ fprintf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
+ exit(1);
+ }
+ lua_pop(L, 1);
+
+ return 0;
+}
+
+static int serialice_lua_exit(void)
+{
+ lua_close(L);
+ return 0;
+}
+
+const char *serialice_lua_execute(const char *cmd)
+{
+ int error;
+ char *errstring = NULL;
+ error = luaL_loadbuffer(L, cmd, strlen(cmd), "line")
+ || lua_pcall(L, 0, 0, 0);
+ if (error) {
+ errstring = strdup(lua_tostring(L, -1));
+ lua_pop(L, 1);
+ }
+
+ return errstring;
+}
+
+static int serialice_io_read_filter(uint32_t * data, uint16_t port, int size)
+{
+ int ret, result;
+
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_io_read_filter");
+ lua_pushinteger(L, port); // port
+ lua_pushinteger(L, size); // datasize
+ result = lua_pcall(L, 2, 2, 0);
+ if (result) {
+ fprintf(stderr, "Failed to run function SerialICE_io_read_filter: %s\n",
+ lua_tostring(L, -1));
+ exit(1);
+ }
+ *data = lua_tointeger(L, -1);
+ ret = lua_toboolean(L, -2);
+ lua_pop(L, 2);
+
+ return ret;
+}
+
+static int serialice_io_write_filter(uint32_t * data, uint16_t port, int size)
+{
+ int ret, result;
+
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_io_write_filter");
+ lua_pushinteger(L, port); // port
+ lua_pushinteger(L, size); // datasize
+ lua_pushinteger(L, *data); // data
+
+ result = lua_pcall(L, 3, 2, 0);
+ if (result) {
+ fprintf(stderr,
+ "Failed to run function SerialICE_io_write_filter: %s\n",
+ lua_tostring(L, -1));
+ exit(1);
+ }
+ *data = lua_tointeger(L, -1);
+ ret = lua_toboolean(L, -2);
+ lua_pop(L, 2);
+
+ return ret;
+}
+
+#define READ_FROM_QEMU (1 << 0)
+#define READ_FROM_SERIALICE (1 << 1)
+static int serialice_memory_read_filter(uint32_t addr, uint32_t * data,
+ int size)
+{
+ int ret = 0, result;
+
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_memory_read_filter");
+ lua_pushinteger(L, addr); // addr
+ lua_pushinteger(L, size); // datasize
+ result = lua_pcall(L, 2, 3, 0);
+ if (result) {
+ fprintf(stderr,
+ "Failed to run function SerialICE_memory_read_filter: %s\n",
+ lua_tostring(L, -1));
+ exit(1);
+ }
+
+ *data = lua_tointeger(L, -1); // result
+
+ ret |= lua_toboolean(L, -2) ? READ_FROM_QEMU : 0; // to_qemu
+ ret |= lua_toboolean(L, -3) ? READ_FROM_SERIALICE : 0; // to_hw
+
+ lua_pop(L, 3);
+
+ return ret;
+}
+
+#define WRITE_TO_QEMU (1 << 0)
+#define WRITE_TO_SERIALICE (1 << 1)
+
+static int serialice_memory_write_filter(uint32_t addr, int size,
+ uint32_t * data)
+{
+ int ret = 0, result;
+ int write_to_qemu, write_to_serialice;
+
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_memory_write_filter");
+ lua_pushinteger(L, addr); // address
+ lua_pushinteger(L, size); // datasize
+ lua_pushinteger(L, *data); // data
+ result = lua_pcall(L, 3, 3, 0);
+ if (result) {
+ fprintf(stderr,
+ "Failed to run function SerialICE_memory_write_filter: %s\n",
+ lua_tostring(L, -1));
+ exit(1);
+ }
+ *data = lua_tointeger(L, -1);
+ write_to_qemu = lua_toboolean(L, -2);
+ write_to_serialice = lua_toboolean(L, -3);
+ lua_pop(L, 3);
+
+ ret |= write_to_qemu ? WRITE_TO_QEMU : 0;
+ ret |= write_to_serialice ? WRITE_TO_SERIALICE : 0;
+
+ return ret;
+}
+
+#define FILTER_READ 0
+#define FILTER_WRITE 1
+
+static int serialice_msr_filter(int flags, uint32_t addr, uint32_t * hi,
+ uint32_t * lo)
+{
+ int ret, result;
+
+ if (flags & FILTER_WRITE) {
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_msr_write_filter");
+ } else {
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_msr_read_filter");
+ }
+
+ lua_pushinteger(L, addr); // port
+ lua_pushinteger(L, *hi); // high
+ lua_pushinteger(L, *lo); // low
+ result = lua_pcall(L, 3, 3, 0);
+ if (result) {
+ fprintf(stderr,
+ "Failed to run function SerialICE_msr_%s_filter: %s\n",
+ (flags & FILTER_WRITE) ? "write" : "read", lua_tostring(L, -1));
+ exit(1);
+ }
+ ret = lua_toboolean(L, -3);
+ if (ret) {
+ *hi = lua_tointeger(L, -1);
+ *lo = lua_tointeger(L, -2);
+ }
+ lua_pop(L, 3);
+
+ return ret;
+}
+
+static int serialice_cpuid_filter(uint32_t eax, uint32_t ecx,
+ cpuid_regs_t * regs)
+{
+ int ret, result;
+
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_cpuid_filter");
+
+ lua_pushinteger(L, eax); // eax before calling
+ lua_pushinteger(L, ecx); // ecx before calling
+ // and the registers after calling cpuid
+ lua_pushinteger(L, regs->eax); // eax
+ lua_pushinteger(L, regs->ebx); // ebx
+ lua_pushinteger(L, regs->ecx); // ecx
+ lua_pushinteger(L, regs->edx); // edx
+ result = lua_pcall(L, 6, 5, 0);
+ if (result) {
+ fprintf(stderr,
+ "Failed to run function SerialICE_cpuid_filter: %s\n",
+ lua_tostring(L, -1));
+ exit(1);
+ }
+
+ ret = lua_toboolean(L, -5);
+ if (ret) {
+ regs->eax = lua_tointeger(L, -4);
+ regs->ebx = lua_tointeger(L, -3);
+ regs->ecx = lua_tointeger(L, -2);
+ regs->edx = lua_tointeger(L, -1);
+ }
+ lua_pop(L, 5);
+
+ return ret;
+}
+
+/* SerialICE output loggers */
+
+#define LOG_IO 0
+#define LOG_MEMORY 1
+#define LOG_READ 0
+#define LOG_WRITE 2
+// these two are separate
+#define LOG_QEMU 4
+#define LOG_TARGET 8
+
+static void serialice_log(int flags, uint32_t data, uint32_t addr, int size)
+{
+ int result;
+
+ if ((flags & LOG_WRITE) && (flags & LOG_MEMORY)) {
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_memory_write_log");
+ } else if (!(flags & LOG_WRITE) && (flags & LOG_MEMORY)) {
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_memory_read_log");
+ } else if ((flags & LOG_WRITE) && !(flags & LOG_MEMORY)) {
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_io_write_log");
+ } else { // if (!(flags & LOG_WRITE) && !(flags & LOG_MEMORY))
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_io_read_log");
+ }
+
+ lua_pushinteger(L, addr); // addr/port
+ lua_pushinteger(L, size); // datasize
+ lua_pushinteger(L, data); // data
+ lua_pushboolean(L, ((flags & LOG_TARGET) != 0));
+
+ result = lua_pcall(L, 4, 0, 0);
+ if (result) {
+ fprintf(stderr, "Failed to run function SerialICE_%s_%s_log: %s\n",
+ (flags & LOG_MEMORY) ? "memory" : "io",
+ (flags & LOG_WRITE) ? "write" : "read", lua_tostring(L, -1));
+ exit(1);
+ }
+}
+
+static void serialice_msr_log(int flags, uint32_t addr, uint32_t hi,
+ uint32_t lo, int filtered)
+{
+ int result;
+
+ if (flags & LOG_WRITE) {
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_msr_write_log");
+ } else { // if (!(flags & LOG_WRITE))
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_msr_read_log");
+ }
+
+ lua_pushinteger(L, addr); // addr/port
+ lua_pushinteger(L, hi); // datasize
+ lua_pushinteger(L, lo); // data
+ lua_pushboolean(L, filtered); // data
+ result = lua_pcall(L, 4, 0, 0);
+ if (result) {
+ fprintf(stderr, "Failed to run function SerialICE_msr_%s_log: %s\n",
+ (flags & LOG_WRITE) ? "write" : "read", lua_tostring(L, -1));
+ exit(1);
+ }
+}
+
+static void serialice_cpuid_log(uint32_t eax, uint32_t ecx, cpuid_regs_t res,
+ int filtered)
+{
+ int result;
+
+ lua_getfield(L, LUA_GLOBALSINDEX, "SerialICE_cpuid_log");
+
+ lua_pushinteger(L, eax); // input: eax
+ lua_pushinteger(L, ecx); // input: ecx
+ lua_pushinteger(L, res.eax); // output: eax
+ lua_pushinteger(L, res.ebx); // output: ebx
+ lua_pushinteger(L, res.ecx); // output: ecx
+ lua_pushinteger(L, res.edx); // output: edx
+ lua_pushboolean(L, filtered); // data
+ result = lua_pcall(L, 7, 0, 0);
+ if (result) {
+ fprintf(stderr, "Failed to run function SerialICE_cpuid_log: %s\n",
+ lua_tostring(L, -1));
+ exit(1);
+ }
+}
+
+// **************************************************************************
+// low level communication with the SerialICE shell (serial communication)
+
+static int serialice_read(SerialICEState * state, void *buf, size_t nbyte)
+{
+ int bytes_read = 0;
+
+ while (1) {
+#ifdef WIN32
+ int ret = 0;
+ ReadFile(state->fd, buf, nbyte - bytes_read, &ret, NULL);
+ if (!ret) {
+ break;
+ }
+#else
+ int ret = read(state->fd, buf, nbyte - bytes_read);
+
+ if (ret == -1 && errno == EINTR) {
+ continue;
+ }
+
+ if (ret == -1) {
+ break;
+ }
+#endif
+
+ bytes_read += ret;
+ buf += ret;
+
+ if (bytes_read >= (int)nbyte) {
+ break;
+ }
+ }
+
+ return bytes_read;
+}
+
+static int handshake_mode = 0;
+
+static int serialice_write(SerialICEState * state, const void *buf,
+ size_t nbyte)
+{
+ char *buffer = (char *)buf;
+ char c;
+ int i;
+
+ for (i = 0; i < (int)nbyte; i++) {
+#ifdef WIN32
+ int ret = 0;
+ while (ret == 0) {
+ WriteFile(state->fd, buffer + i, 1, &ret, NULL);
+ }
+ ret = 0;
+ while (ret == 0) {
+ ReadFile(state->fd, &c, 1, &ret, NULL);
+ }
+#else
+ while (write(state->fd, buffer + i, 1) != 1) ;
+ while (read(state->fd, &c, 1) != 1) ;
+#endif
+ if (c != buffer[i] && !handshake_mode) {
+ printf("Readback error! %x/%x\n", c, buffer[i]);
+ }
+ }
+
+ return nbyte;
+}
+
+static int serialice_wait_prompt(void)
+{
+ char buf[3];
+ int l;
+
+ l = serialice_read(s, buf, 3);
+
+ if (l == -1) {
+ perror("SerialICE: Could not read from target");
+ exit(1);
+ }
+
+ while (buf[0] != '\n' || buf[1] != '>' || buf[2] != ' ') {
+ buf[0] = buf[1];
+ buf[1] = buf[2];
+ l = serialice_read(s, buf + 2, 1);
+ if (l == -1) {
+ perror("SerialICE: Could not read from target");
+ exit(1);
+ }
+ }
+
+ return 0;
+}
+
+static void serialice_command(const char *command, int reply_len)
+{
+#if SERIALICE_DEBUG > 5
+ int i;
+#endif
+ int l;
+
+ serialice_wait_prompt();
+
+ serialice_write(s, command, strlen(command));
+
+ memset(s->buffer, 0, reply_len + 1); // clear enough of the buffer
+
+ l = serialice_read(s, s->buffer, reply_len);
+
+ if (l == -1) {
+ perror("SerialICE: Could not read from target");
+ exit(1);
+ }
+ // compensate for CR on the wire. Needed on Win32
+ if (s->buffer[0] == '\r') {
+ memmove(s->buffer, s->buffer + 1, reply_len);
+ serialice_read(s, s->buffer + reply_len - 1, 1);
+ }
+
+ if (l != reply_len) {
+ printf("SerialICE: command was not answered sufficiently: "
+ "(%d/%d bytes)\n'%s'\n", l, reply_len, s->buffer);
+ exit(1);
+ }
+#if SERIALICE_DEBUG > 5
+ for (i = 0; i < reply_len; i++) {
+ printf("%02x ", s->buffer[i]);
+ }
+ printf("\n");
+#endif
+}
+
+// **************************************************************************
+// high level communication with the SerialICE shell
+
+static void serialice_get_version(void)
+{
+ int len = 0;
+ printf("SerialICE: Version.....: ");
+ serialice_command("*vi", 0);
+
+ memset(s->buffer, 0, BUFFER_SIZE);
+ serialice_read(s, s->buffer, 1);
+ serialice_read(s, s->buffer, 1);
+ while (s->buffer[len++] != '\n') {
+ serialice_read(s, s->buffer + len, 1);
+ }
+ s->buffer[len - 1] = '\0';
+
+ printf("%s\n", s->buffer);
+}
+
+static void serialice_get_mainboard(void)
+{
+ int len = 31;
+
+ printf("SerialICE: Mainboard...: ");
+ serialice_command("*mb", 32);
+ while (len && s->buffer[len] == ' ') {
+ s->buffer[len--] = '\0';
+ }
+ serialice_mainboard = strdup(s->buffer + 1);
+ printf("%s\n", serialice_mainboard);
+}
+
+uint8_t serialice_inb(uint16_t port)
+{
+ uint8_t ret;
+ uint32_t data;
+
+ if (serialice_io_read_filter(&data, port, 1)) {
+ return data & 0xff;
+ }
+
+ sprintf(s->command, "*ri%04x.b", port);
+ // command read back: "\n00" (3 characters)
+ serialice_command(s->command, 3);
+ ret = (uint8_t) strtoul(s->buffer + 1, (char **)NULL, 16);
+
+ serialice_log(LOG_READ | LOG_IO, ret, port, 1);
+
+ return ret;
+}
+
+uint16_t serialice_inw(uint16_t port)
+{
+ uint16_t ret;
+ uint32_t data;
+
+ if (serialice_io_read_filter(&data, port, 2)) {
+ return data & 0xffff;
+ }
+
+ sprintf(s->command, "*ri%04x.w", port);
+ // command read back: "\n0000" (5 characters)
+ serialice_command(s->command, 5);
+ ret = (uint16_t) strtoul(s->buffer + 1, (char **)NULL, 16);
+
+ serialice_log(LOG_READ | LOG_IO, ret, port, 2);
+
+ return ret;
+}
+
+uint32_t serialice_inl(uint16_t port)
+{
+ uint32_t ret;
+ uint32_t data;
+
+ if (serialice_io_read_filter(&data, port, 4)) {
+ return data;
+ }
+
+ sprintf(s->command, "*ri%04x.l", port);
+ // command read back: "\n00000000" (9 characters)
+ serialice_command(s->command, 9);
+ ret = (uint32_t) strtoul(s->buffer + 1, (char **)NULL, 16);
+
+ serialice_log(LOG_READ | LOG_IO, ret, port, 4);
+
+ return ret;
+}
+
+void serialice_outb(uint8_t data, uint16_t port)
+{
+ uint32_t filtered_data = (uint32_t) data;
+
+ serialice_log(LOG_WRITE | LOG_IO, data, port, 1);
+
+ if (serialice_io_write_filter(&filtered_data, port, 1)) {
+ return;
+ }
+
+ data = (uint8_t) filtered_data;
+ sprintf(s->command, "*wi%04x.b=%02x", port, data);
+ serialice_command(s->command, 0);
+}
+
+void serialice_outw(uint16_t data, uint16_t port)
+{
+ uint32_t filtered_data = (uint32_t) data;
+
+ serialice_log(LOG_WRITE | LOG_IO, data, port, 2);
+
+ if (serialice_io_write_filter(&filtered_data, port, 2)) {
+ return;
+ }
+
+ data = (uint16_t) filtered_data;
+ sprintf(s->command, "*wi%04x.w=%04x", port, data);
+ serialice_command(s->command, 0);
+}
+
+void serialice_outl(uint32_t data, uint16_t port)
+{
+ uint32_t filtered_data = data;
+
+ serialice_log(LOG_WRITE | LOG_IO, data, port, 4);
+
+ if (serialice_io_write_filter(&filtered_data, port, 4)) {
+ return;
+ }
+
+ data = filtered_data;
+ sprintf(s->command, "*wi%04x.l=%08x", port, data);
+ serialice_command(s->command, 0);
+}
+
+uint8_t serialice_readb(uint32_t addr)
+{
+ uint8_t ret;
+ sprintf(s->command, "*rm%08x.b", addr);
+ // command read back: "\n00" (3 characters)
+ serialice_command(s->command, 3);
+ ret = (uint8_t) strtoul(s->buffer + 1, (char **)NULL, 16);
+ return ret;
+}
+
+uint16_t serialice_readw(uint32_t addr)
+{
+ uint16_t ret;
+ sprintf(s->command, "*rm%08x.w", addr);
+ // command read back: "\n0000" (5 characters)
+ serialice_command(s->command, 5);
+ ret = (uint16_t) strtoul(s->buffer + 1, (char **)NULL, 16);
+ return ret;
+}
+
+uint32_t serialice_readl(uint32_t addr)
+{
+ uint32_t ret;
+ sprintf(s->command, "*rm%08x.l", addr);
+ // command read back: "\n00000000" (9 characters)
+ serialice_command(s->command, 9);
+ ret = (uint32_t) strtoul(s->buffer + 1, (char **)NULL, 16);
+ return ret;
+}
+
+void serialice_writeb(uint8_t data, uint32_t addr)
+{
+ sprintf(s->command, "*wm%08x.b=%02x", addr, data);
+ serialice_command(s->command, 0);
+}
+
+void serialice_writew(uint16_t data, uint32_t addr)
+{
+ sprintf(s->command, "*wm%08x.w=%04x", addr, data);
+ serialice_command(s->command, 0);
+}
+
+void serialice_writel(uint32_t data, uint32_t addr)
+{
+ sprintf(s->command, "*wm%08x.l=%08x", addr, data);
+ serialice_command(s->command, 0);
+}
+
+uint64_t serialice_rdmsr(uint32_t addr, uint32_t key)
+{
+ uint32_t hi, lo;
+ uint64_t ret;
+ int filtered;
+
+ filtered = serialice_msr_filter(FILTER_READ, addr, &hi, &lo);
+ if (!filtered) {
+ sprintf(s->command, "*rc%08x.%08x", addr, key);
+
+ // command read back: "\n00000000.00000000" (18 characters)
+ serialice_command(s->command, 18);
+
+ s->buffer[9] = 0; // . -> \0
+ hi = (uint32_t) strtoul(s->buffer + 1, (char **)NULL, 16);
+ lo = (uint32_t) strtoul(s->buffer + 10, (char **)NULL, 16);
+ }
+
+ ret = hi;
+ ret <<= 32;
+ ret |= lo;
+
+ serialice_msr_log(LOG_READ, addr, hi, lo, filtered);
+
+ return ret;
+}
+
+void serialice_wrmsr(uint64_t data, uint32_t addr, uint32_t key)
+{
+ uint32_t hi, lo;
+ int filtered;
+
+ hi = (data >> 32);
+ lo = (data & 0xffffffff);
+
+ filtered = serialice_msr_filter(FILTER_WRITE, addr, &hi, &lo);
+
+ if (!filtered) {
+ sprintf(s->command, "*wc%08x.%08x=%08x.%08x", addr, key, hi, lo);
+ serialice_command(s->command, 0);
+ }
+
+ serialice_msr_log(LOG_WRITE, addr, hi, lo, filtered);
+}
+
+cpuid_regs_t serialice_cpuid(uint32_t eax, uint32_t ecx)
+{
+ cpuid_regs_t ret;
+ int filtered;
+
+ ret.eax = eax;
+ ret.ebx = 0; // either set by filter or by target
+ ret.ecx = ecx;
+ ret.edx = 0; // either set by filter or by target
+
+ sprintf(s->command, "*ci%08x.%08x", eax, ecx);
+
+ // command read back: "\n000006f2.00000000.00001234.12340324"
+ // (36 characters)
+ serialice_command(s->command, 36);
+
+ s->buffer[9] = 0; // . -> \0
+ s->buffer[18] = 0; // . -> \0
+ s->buffer[27] = 0; // . -> \0
+ ret.eax = (uint32_t) strtoul(s->buffer + 1, (char **)NULL, 16);
+ ret.ebx = (uint32_t) strtoul(s->buffer + 10, (char **)NULL, 16);
+ ret.ecx = (uint32_t) strtoul(s->buffer + 19, (char **)NULL, 16);
+ ret.edx = (uint32_t) strtoul(s->buffer + 28, (char **)NULL, 16);
+
+ filtered = serialice_cpuid_filter(eax, ecx, &ret);
+
+ serialice_cpuid_log(eax, ecx, ret, filtered);
+
+ return ret;
+}
+
+// **************************************************************************
+// memory load handling
+
+static uint32_t serialice_load_wrapper(uint32_t addr, unsigned int size)
+{
+ switch (size) {
+ case 1:
+ return (uint32_t) serialice_readb(addr);
+ case 2:
+ return (uint32_t) serialice_readw(addr);
+ case 4:
+ return (uint32_t) serialice_readl(addr);
+ default:
+ printf("WARNING: unknown read access size %d @%08x\n", size, addr);
+ }
+ return 0;
+}
+
+/**
+ * This function is called by the softmmu engine to update the status
+ * of a load cycle
+ */
+void serialice_log_load(int caught, uint32_t addr, uint32_t result,
+ unsigned int data_size)
+{
+ if (caught) {
+ serialice_log(LOG_READ | LOG_MEMORY | LOG_TARGET, result, addr,
+ data_size);
+ } else {
+ serialice_log(LOG_READ | LOG_MEMORY, result, addr, data_size);
+ }
+}
+
+/* This function can grab Qemu load ops and forward them to the SerialICE
+ * target.
+ *
+ * @return 0: pass on to Qemu; 1: handled locally.
+ */
+int serialice_handle_load(uint32_t addr, uint32_t * result,
+ unsigned int data_size)
+{
+ int source;
+
+ source = serialice_memory_read_filter(addr, result, data_size);
+
+ if (source & READ_FROM_SERIALICE) {
+ *result = serialice_load_wrapper(addr, data_size);
+ return 1;
+ }
+
+ if (source & READ_FROM_QEMU) {
+ return 0;
+ }
+
+ /* No source for load, so the source is the script */
+ return 1;
+}
+
+// **************************************************************************
+// memory store handling
+
+static void serialice_store_wrapper(uint32_t addr, unsigned int size,
+ uint32_t data)
+{
+ switch (size) {
+ case 1:
+ serialice_writeb((uint8_t) data, addr);
+ break;
+ case 2:
+ serialice_writew((uint16_t) data, addr);
+ break;
+ case 4:
+ serialice_writel((uint32_t) data, addr);
+ break;
+ default:
+ printf("WARNING: unknown write access size %d @%08x\n", size, addr);
+ }
+}
+
+static void serialice_log_store(int caught, uint32_t addr, uint32_t val,
+ unsigned int data_size)
+{
+ if (caught) {
+ serialice_log(LOG_WRITE | LOG_MEMORY | LOG_TARGET, val, addr,
+ data_size);
+ } else {
+ serialice_log(LOG_WRITE | LOG_MEMORY, val, addr, data_size);
+ }
+}
+
+/* This function can grab Qemu store ops and forward them to the SerialICE
+ * target
+ *
+ * @return 0: Qemu exclusive or shared; 1: SerialICE exclusive.
+ */
+
+int serialice_handle_store(uint32_t addr, uint32_t val, unsigned int data_size)
+{
+ int write_to_target, write_to_qemu, ret;
+ uint32_t filtered_data = val;
+
+ ret = serialice_memory_write_filter(addr, data_size, &filtered_data);
+
+ write_to_target = ((ret & WRITE_TO_SERIALICE) != 0);
+ write_to_qemu = ((ret & WRITE_TO_QEMU) != 0);
+
+ serialice_log_store(write_to_target, addr, filtered_data, data_size);
+
+ if (write_to_target) {
+ serialice_store_wrapper(addr, data_size, filtered_data);
+ }
+
+ return (write_to_qemu == 0);
+}
+
+static int screen_invalid = 1;
+
+static void serialice_refresh(void *opaque)
+{
+ uint8_t *dest;
+ int bpp, linesize;
+
+ if (!screen_invalid) {
+ return;
+ }
+
+ dest = ds_get_data(s->ds);
+ bpp = (ds_get_bits_per_pixel(s->ds) + 7) >> 3;
+ linesize = ds_get_linesize(s->ds);
+
+ memset(dest, 0x00, linesize * ds_get_height(s->ds));
+#if SERIALICE_BANNER
+ int x, y;
+ if (bpp == 4) {
+ for (y = 0; y < 240; y++) {
+ for (x = 0; x < 320; x++) {
+ int doff = (y * linesize) + (x * bpp);
+ int soff = (y * (320 * 3)) + (x * 3);
+ dest[doff + 0] = serialice_banner[soff + 2]; // blue
+ dest[doff + 1] = serialice_banner[soff + 1]; // green
+ dest[doff + 2] = serialice_banner[soff + 0]; // red
+ }
+ }
+ } else {
+ printf("Banner enabled and BPP = %d (line size = %d)\n", bpp, linesize);
+ }
+#endif
+
+ dpy_update(s->ds, 0, 0, ds_get_width(s->ds), ds_get_height(s->ds));
+ screen_invalid = 0;
+}
+
+static void serialice_invalidate(void *opaque)
+{
+ screen_invalid = 1;
+}
+
+// **************************************************************************
+// initialization and exit
+
+void serialice_init(void)
+{
+ s = qemu_mallocz(sizeof(SerialICEState));
+
+ s->ds = graphic_console_init(serialice_refresh, serialice_invalidate,
+ NULL, NULL, s);
+ qemu_console_resize(s->ds, 320, 240);
+
+ printf("SerialICE: Open connection to target hardware...\n");
+
+ if (serialice_device == NULL) {
+ printf("You need to specify a serial device to use SerialICE.\n");
+ exit(1);
+ }
+#ifdef WIN32
+ s->fd = CreateFile(serialice_device, GENERIC_READ | GENERIC_WRITE,
+ 0, NULL, OPEN_EXISTING, 0, NULL);
+
+ if (s->fd == INVALID_HANDLE_VALUE) {
+ perror("SerialICE: Could not connect to target TTY");
+ exit(1);
+ }
+
+ DCB dcb;
+ if (!GetCommState(s->fd, &dcb)) {
+ perror("SerialICE: Could not load config for target TTY");
+ exit(1);
+ }
+
+ dcb.BaudRate = CBR_115200;
+ dcb.ByteSize = 8;
+ dcb.Parity = NOPARITY;
+ dcb.StopBits = ONESTOPBIT;
+
+ if (!SetCommState(s->fd, &dcb)) {
+ perror("SerialICE: Could not store config for target TTY");
+ exit(1);
+ }
+#else
+ s->fd = open(serialice_device, O_RDWR | O_NOCTTY | O_NONBLOCK);
+
+ if (s->fd == -1) {
+ perror("SerialICE: Could not connect to target TTY");
+ exit(1);
+ }
+
+ if (ioctl(s->fd, TIOCEXCL) == -1) {
+ perror("SerialICE: TTY not exclusively available");
+ exit(1);
+ }
+
+ if (fcntl(s->fd, F_SETFL, 0) == -1) {
+ perror("SerialICE: Could not switch to blocking I/O");
+ exit(1);
+ }
+
+ if (tcgetattr(s->fd, &options) == -1) {
+ perror("SerialICE: Could not get TTY attributes");
+ exit(1);
+ }
+
+ cfsetispeed(&options, B115200);
+ cfsetospeed(&options, B115200);
+
+ /* set raw input, 1 second timeout */
+ options.c_cflag |= (CLOCAL | CREAD);
+ options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
+ options.c_oflag &= ~OPOST;
+ options.c_iflag |= IGNCR;
+ options.c_cc[VMIN] = 0;
+ options.c_cc[VTIME] = 100;
+
+ tcsetattr(s->fd, TCSANOW, &options);
+
+ tcflush(s->fd, TCIOFLUSH);
+#endif
+
+ s->buffer = qemu_mallocz(BUFFER_SIZE);
+ s->command = qemu_mallocz(BUFFER_SIZE);
+
+ printf("SerialICE: Waiting for handshake with target... ");
+
+ handshake_mode = 1; // Readback errors are to be expected in this phase.
+
+ /* Trigger a prompt */
+ serialice_write(s, "@", 1);
+
+ /* ... and wait for it to appear */
+ if (serialice_wait_prompt() == 0) {
+ printf("target alive!\n");
+ } else {
+ printf("target not ok!\n");
+ exit(1);
+ }
+
+ /* Each serialice_command() waits for a prompt, so trigger one for the
+ * first command, as we consumed the last one for the handshake
+ */
+ serialice_write(s, "@", 1);
+
+ handshake_mode = 0; // from now on, warn about readback errors.
+
+ serialice_get_version();
+
+ serialice_get_mainboard();
+
+ printf("SerialICE: LUA init...\n");
+ serialice_lua_init();
+
+ /* Let the rest of Qemu know we're alive */
+ serialice_active = 1;
+}
+
+void serialice_exit(void)
+{
+ serialice_lua_exit();
+ qemu_free(s->command);
+ qemu_free(s->buffer);
+ qemu_free(s);
+}
+
+static void pc_init_serialice(ram_addr_t ram_size,
+ const char *boot_device,
+ const char *kernel_filename,
+ const char *kernel_cmdline,
+ const char *initrd_filename,
+ const char *cpu_model)
+{
+ char *filename;
+ int ret, i, linux_boot;
+ int isa_bios_size, bios_size;
+ ram_addr_t bios_offset;
+ CPUState *env;
+
+ if (ram_size != (DEFAULT_RAM_SIZE * 1024 * 1024)) {
+ printf
+ ("Warning: Running SerialICE with non-default ram size is not supported.\n");
+ exit(1);
+ }
+
+ linux_boot = (kernel_filename != NULL);
+
+ /* init CPUs */
+ if (cpu_model == NULL) {
+ //printf("Warning: Running SerialICE with generic CPU type might fail.\n");
+#ifdef TARGET_X86_64
+ cpu_model = "qemu64";
+#else
+ cpu_model = "qemu32";
+#endif
+ }
+
+ for (i = 0; i < smp_cpus; i++) {
+ env = cpu_init(cpu_model);
+ qemu_register_reset((QEMUResetHandler *) cpu_reset, env);
+ }
+
+ /* Must not happen before CPUs are initialized */
+ serialice_init();
+
+ /* BIOS load */
+ if (bios_name == NULL)
+ bios_name = BIOS_FILENAME;
+ filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
+ if (filename) {
+ bios_size = get_image_size(filename);
+ } else {
+ bios_size = -1;
+ }
+ if (bios_size <= 0 || (bios_size % 65536) != 0) {
+ goto bios_error;
+ }
+ bios_offset = qemu_ram_alloc(NULL, "serialice_bios", bios_size);
+ ret = load_image(filename, qemu_get_ram_ptr(bios_offset));
+ if (ret != bios_size) {
+ bios_error:
+ fprintf(stderr, "qemu: could not load PC BIOS '%s'\n", bios_name);
+ exit(1);
+ }
+ if (filename) {
+ qemu_free(filename);
+ }
+ /* map the last 128KB of the BIOS in ISA space */
+ isa_bios_size = bios_size;
+ if (isa_bios_size > (128 * 1024))
+ isa_bios_size = 128 * 1024;
+
+ cpu_register_physical_memory(0x100000 - isa_bios_size,
+ isa_bios_size,
+ (bios_offset + bios_size - isa_bios_size));
+
+ /* map all the bios at the top of memory */
+ cpu_register_physical_memory((uint32_t) (-bios_size), bios_size,
+ bios_offset | IO_MEM_ROM);
+ if (linux_boot) {
+ printf("Booting Linux in SerialICE mode is currently not supported.\n");
+ exit(1);
+ }
+
+}
+
+static QEMUMachine serialice_machine = {
+ .name = "serialice-x86",
+ .alias = "serialice",
+ .desc = "SerialICE Debugger",
+ .init = pc_init_serialice,
+ .max_cpus = 255,
+ //.is_default = 1,
+};
+
+static void serialice_machine_init(void)
+{
+ qemu_register_machine(&serialice_machine);
+}
+
+machine_init(serialice_machine_init);
diff --git a/qemu-0.15.x/serialice.h b/qemu-0.15.x/serialice.h
new file mode 100644
index 0000000..a651618
--- /dev/null
+++ b/qemu-0.15.x/serialice.h
@@ -0,0 +1,73 @@
+/*
+ * QEMU PC System Emulator
+ *
+ * Copyright (c) 2009 coresystems GmbH
+ *
+ * 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.
+ */
+
+#ifndef SERIALICE_H
+#define SERIALICE_H
+
+#include "config-host.h"
+
+#include "config.h"
+#if !defined(HOST_X86_64) && !defined(HOST_I386)
+#error "SerialICE currently only supports x86 and x64 platforms."
+#endif
+
+extern const char *serialice_device;
+extern int serialice_active;
+
+void serialice_init(void);
+void serialice_exit(void);
+const char *serialice_lua_execute(const char *cmd);
+
+uint8_t serialice_inb(uint16_t port);
+uint16_t serialice_inw(uint16_t port);
+uint32_t serialice_inl(uint16_t port);
+
+void serialice_outb(uint8_t data, uint16_t port);
+void serialice_outw(uint16_t data, uint16_t port);
+void serialice_outl(uint32_t data, uint16_t port);
+
+uint8_t serialice_readb(uint32_t addr);
+uint16_t serialice_readw(uint32_t addr);
+uint32_t serialice_readl(uint32_t addr);
+
+void serialice_writeb(uint8_t data, uint32_t addr);
+void serialice_writew(uint16_t data, uint32_t addr);
+void serialice_writel(uint32_t data, uint32_t addr);
+
+uint64_t serialice_rdmsr(uint32_t addr, uint32_t key);
+void serialice_wrmsr(uint64_t data, uint32_t addr, uint32_t key);
+
+typedef struct {
+ uint32_t eax, ebx, ecx, edx;
+} cpuid_regs_t;
+
+cpuid_regs_t serialice_cpuid(uint32_t eax, uint32_t ecx);
+
+int serialice_handle_load(uint32_t addr, uint32_t * result,
+ unsigned int data_size);
+void serialice_log_load(int caught, uint32_t addr, uint32_t result,
+ unsigned int data_size);
+int serialice_handle_store(uint32_t addr, uint32_t val, unsigned int data_size);
+
+#endif
diff --git a/qemu-0.15.x/serialice_banner.h b/qemu-0.15.x/serialice_banner.h
new file mode 100644
index 0000000..59ec570
--- /dev/null
+++ b/qemu-0.15.x/serialice_banner.h
@@ -0,0 +1,19237 @@
+/*
+ * QEMU PC System Emulator
+ *
+ * Copyright (c) 2009 coresystems GmbH
+ *
+ * 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.
+ */
+
+/* We don't have VGA output in a windows for serialice, and if we don't create
+ * our own virtual console as first screen, the Qemu monitor is somewhat
+ * confused. So create a nice and nifty splash screen to show. Since people
+ * would kill me if I add a jpg decoder here, I go with terrible waste of
+ * memory (230KB)
+ * $ convert image-320x240.jpg serialice_banner.ppm
+ * $ dd if=serialice_banner.ppm of=serialice_banner skip=15
+ * $ xxd -i serialice_banner > serialice_banner.h
+ */
+
+unsigned char serialice_banner[] = {
+ 0x37, 0x3d, 0x3b, 0x34, 0x3a, 0x38, 0x35, 0x3b, 0x3b, 0x34, 0x3a, 0x3a,
+ 0x30, 0x36, 0x36, 0x2a, 0x30, 0x30, 0x28, 0x2e, 0x2e, 0x2b, 0x30, 0x30,
+ 0x31, 0x2d, 0x2e, 0x2e, 0x2d, 0x31, 0x29, 0x2e, 0x33, 0x2a, 0x30, 0x33,
+ 0x2e, 0x32, 0x33, 0x36, 0x36, 0x36, 0x46, 0x42, 0x41, 0x4c, 0x48, 0x47,
+ 0x49, 0x48, 0x44, 0x3d, 0x3d, 0x3d, 0x2f, 0x30, 0x34, 0x2a, 0x30, 0x34,
+ 0x29, 0x30, 0x36, 0x27, 0x2e, 0x34, 0x28, 0x2d, 0x31, 0x28, 0x2c, 0x30,
+ 0x28, 0x28, 0x34, 0x26, 0x28, 0x31, 0x23, 0x28, 0x2e, 0x22, 0x28, 0x31,
+ 0x1e, 0x29, 0x39, 0x23, 0x33, 0x48, 0x2f, 0x42, 0x56, 0xa8, 0xbc, 0xcd,
+ 0xcb, 0xd1, 0xf0, 0x89, 0x92, 0xc1, 0x53, 0x5d, 0x8e, 0x29, 0x32, 0x50,
+ 0x0b, 0x10, 0x15, 0x07, 0x08, 0x02, 0x07, 0x08, 0x05, 0x05, 0x06, 0x09,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08,
+ 0x09, 0x0e, 0x0b, 0x0a, 0x07, 0x0c, 0x0f, 0x08, 0x0a, 0x1b, 0x22, 0x22,
+ 0x2d, 0x4b, 0x4e, 0x36, 0x64, 0x5e, 0x3a, 0x63, 0x53, 0x40, 0x5e, 0x51,
+ 0x51, 0x67, 0x5f, 0x4f, 0x6a, 0x6c, 0x35, 0x49, 0x55, 0x33, 0x38, 0x43,
+ 0x45, 0x49, 0x4a, 0x3f, 0x4c, 0x45, 0x46, 0x55, 0x50, 0x5b, 0x5e, 0x5e,
+ 0x68, 0x68, 0x61, 0x63, 0x65, 0x5e, 0x56, 0x5a, 0x58, 0x42, 0x48, 0x4a,
+ 0x3e, 0x43, 0x47, 0x3c, 0x41, 0x47, 0x3a, 0x3f, 0x45, 0x3d, 0x42, 0x46,
+ 0x3c, 0x41, 0x46, 0x37, 0x3f, 0x42, 0x33, 0x3d, 0x3f, 0x33, 0x3e, 0x3f,
+ 0x33, 0x3f, 0x3f, 0x33, 0x3d, 0x3e, 0x35, 0x3d, 0x3d, 0x38, 0x3e, 0x3e,
+ 0x38, 0x3d, 0x40, 0x38, 0x3e, 0x42, 0x36, 0x3d, 0x43, 0x34, 0x3b, 0x41,
+ 0x35, 0x3d, 0x40, 0x35, 0x3d, 0x40, 0x35, 0x3d, 0x3f, 0x35, 0x3d, 0x3f,
+ 0x37, 0x3d, 0x41, 0x39, 0x3e, 0x44, 0x36, 0x3d, 0x43, 0x35, 0x3d, 0x40,
+ 0x39, 0x41, 0x44, 0x3a, 0x43, 0x45, 0x3a, 0x41, 0x49, 0x3a, 0x41, 0x4c,
+ 0x43, 0x47, 0x4c, 0x43, 0x47, 0x4b, 0x3f, 0x43, 0x48, 0x45, 0x48, 0x4d,
+ 0x44, 0x47, 0x4e, 0x43, 0x45, 0x50, 0x43, 0x45, 0x53, 0x44, 0x47, 0x55,
+ 0x3d, 0x48, 0x47, 0x3d, 0x47, 0x47, 0x3b, 0x43, 0x49, 0x3a, 0x40, 0x47,
+ 0x3f, 0x45, 0x4a, 0x3d, 0x45, 0x48, 0x3d, 0x44, 0x4a, 0x3f, 0x47, 0x4e,
+ 0x42, 0x45, 0x4a, 0x42, 0x45, 0x4a, 0x43, 0x46, 0x4b, 0x40, 0x44, 0x45,
+ 0x3f, 0x43, 0x43, 0x44, 0x48, 0x49, 0x45, 0x48, 0x4d, 0x42, 0x44, 0x4f,
+ 0x3d, 0x43, 0x4f, 0x39, 0x40, 0x4a, 0x34, 0x39, 0x3f, 0x34, 0x39, 0x3d,
+ 0x33, 0x38, 0x3b, 0x35, 0x3d, 0x3f, 0x3d, 0x46, 0x48, 0x3b, 0x44, 0x47,
+ 0x35, 0x3e, 0x48, 0x36, 0x3f, 0x46, 0x34, 0x3e, 0x40, 0x31, 0x3b, 0x40,
+ 0x32, 0x3c, 0x45, 0x32, 0x3c, 0x45, 0x33, 0x3e, 0x42, 0x30, 0x3b, 0x39,
+ 0x2d, 0x35, 0x3b, 0x32, 0x39, 0x42, 0x39, 0x40, 0x48, 0x36, 0x3d, 0x47,
+ 0x34, 0x3b, 0x45, 0x34, 0x3e, 0x47, 0x34, 0x3d, 0x46, 0x31, 0x3b, 0x44,
+ 0x2c, 0x3e, 0x43, 0x37, 0x42, 0x4a, 0x3b, 0x3f, 0x4e, 0x3d, 0x3e, 0x50,
+ 0x38, 0x3b, 0x49, 0x34, 0x3b, 0x45, 0x32, 0x3b, 0x45, 0x33, 0x3b, 0x46,
+ 0x36, 0x3d, 0x47, 0x31, 0x3d, 0x4b, 0x31, 0x3e, 0x4e, 0x3a, 0x42, 0x4f,
+ 0x3b, 0x41, 0x4b, 0x33, 0x41, 0x51, 0x2b, 0x4b, 0x67, 0x2a, 0x5a, 0x83,
+ 0x2e, 0x6b, 0xb3, 0x31, 0x78, 0xc7, 0x28, 0x7b, 0xcc, 0x1f, 0x77, 0xc2,
+ 0x15, 0x65, 0xa4, 0x0e, 0x52, 0x83, 0x10, 0x47, 0x76, 0x14, 0x47, 0x76,
+ 0x13, 0x4b, 0x79, 0x15, 0x4a, 0x74, 0x14, 0x46, 0x6b, 0x16, 0x43, 0x6c,
+ 0x16, 0x3d, 0x6a, 0x0f, 0x33, 0x63, 0x0c, 0x31, 0x5d, 0x0b, 0x2f, 0x55,
+ 0x0d, 0x2d, 0x4d, 0x10, 0x29, 0x47, 0x14, 0x2d, 0x50, 0x0f, 0x31, 0x60,
+ 0x0f, 0x39, 0x6c, 0x10, 0x39, 0x69, 0x10, 0x36, 0x6c, 0x0d, 0x36, 0x73,
+ 0x10, 0x43, 0x69, 0x20, 0x49, 0x55, 0x23, 0x43, 0x40, 0x16, 0x31, 0x32,
+ 0x0d, 0x21, 0x2e, 0x12, 0x21, 0x35, 0x1a, 0x36, 0x4f, 0x20, 0x52, 0x74,
+ 0x23, 0x67, 0xb0, 0x22, 0x6a, 0xc3, 0x18, 0x56, 0xaf, 0x09, 0x31, 0x6d,
+ 0x07, 0x1f, 0x36, 0x13, 0x2f, 0x3c, 0x1b, 0x47, 0x6a, 0x16, 0x4e, 0x8a,
+ 0x1a, 0x4b, 0x8b, 0x2d, 0x5a, 0x87, 0x2a, 0x61, 0x82, 0x20, 0x5f, 0x83,
+ 0x20, 0x57, 0x84, 0x1c, 0x4f, 0x84, 0x19, 0x46, 0x77, 0x15, 0x34, 0x52,
+ 0x16, 0x29, 0x2f, 0x17, 0x28, 0x36, 0x20, 0x3c, 0x5e, 0x1f, 0x4a, 0x78,
+ 0x17, 0x43, 0x6e, 0x1f, 0x43, 0x66, 0x27, 0x4f, 0x75, 0x25, 0x58, 0x87,
+ 0x28, 0x5b, 0x7c, 0x27, 0x5f, 0x90, 0x29, 0x65, 0xa6, 0x35, 0x76, 0xbd,
+ 0x3b, 0x87, 0xd6, 0x35, 0x86, 0xd9, 0x32, 0x78, 0xc1, 0x2f, 0x5d, 0x93,
+ 0x33, 0x3f, 0x4e, 0x1d, 0x25, 0x2d, 0x25, 0x2a, 0x2e, 0x2a, 0x2e, 0x2c,
+ 0x1f, 0x24, 0x20, 0x13, 0x19, 0x16, 0x08, 0x0b, 0x0f, 0x09, 0x0c, 0x12,
+ 0x0c, 0x11, 0x15, 0x17, 0x1a, 0x1f, 0x23, 0x25, 0x29, 0x25, 0x25, 0x2a,
+ 0x21, 0x21, 0x25, 0x24, 0x24, 0x26, 0x23, 0x25, 0x24, 0x41, 0x43, 0x40,
+ 0x45, 0x49, 0x4a, 0x2c, 0x30, 0x33, 0x18, 0x1c, 0x1f, 0x0d, 0x15, 0x15,
+ 0x17, 0x21, 0x1f, 0x60, 0x70, 0x6e, 0x7f, 0x93, 0x96, 0x75, 0x8a, 0x91,
+ 0x6f, 0x80, 0x8a, 0x64, 0x71, 0x84, 0x52, 0x5b, 0x76, 0x3f, 0x44, 0x61,
+ 0x2b, 0x2f, 0x46, 0x24, 0x28, 0x33, 0x20, 0x25, 0x26, 0x1e, 0x24, 0x20,
+ 0x22, 0x26, 0x26, 0x21, 0x23, 0x23, 0x20, 0x20, 0x1e, 0x1c, 0x1b, 0x19,
+ 0x1b, 0x1a, 0x1d, 0x20, 0x23, 0x28, 0x20, 0x28, 0x2b, 0x20, 0x2b, 0x2d,
+ 0x23, 0x29, 0x29, 0x25, 0x2b, 0x2b, 0x22, 0x28, 0x28, 0x15, 0x1b, 0x1b,
+ 0x09, 0x0d, 0x0e, 0x06, 0x0a, 0x0b, 0x0d, 0x12, 0x11, 0x17, 0x1b, 0x1a,
+ 0x1e, 0x23, 0x22, 0x23, 0x27, 0x28, 0x1f, 0x23, 0x25, 0x1c, 0x20, 0x21,
+ 0x1c, 0x1e, 0x1d, 0x19, 0x1d, 0x1a, 0x1e, 0x22, 0x21, 0x24, 0x28, 0x29,
+ 0x1d, 0x25, 0x27, 0x20, 0x28, 0x2a, 0x20, 0x28, 0x2a, 0x25, 0x2f, 0x30,
+ 0x25, 0x2f, 0x30, 0x2a, 0x32, 0x34, 0x2d, 0x35, 0x35, 0x29, 0x32, 0x31,
+ 0x2e, 0x38, 0x37, 0x2d, 0x35, 0x38, 0x28, 0x2c, 0x33, 0x0f, 0x12, 0x19,
+ 0x04, 0x05, 0x09, 0x03, 0x04, 0x05, 0x03, 0x05, 0x04, 0x08, 0x0a, 0x09,
+ 0x17, 0x1f, 0x24, 0x26, 0x2f, 0x32, 0x29, 0x33, 0x34, 0x26, 0x2e, 0x2e,
+ 0x27, 0x2f, 0x2f, 0x24, 0x2a, 0x2a, 0x1c, 0x21, 0x26, 0x12, 0x15, 0x1c,
+ 0x38, 0x3c, 0x3a, 0x35, 0x39, 0x38, 0x36, 0x3a, 0x3b, 0x36, 0x3a, 0x3b,
+ 0x2f, 0x33, 0x34, 0x29, 0x2d, 0x2e, 0x2a, 0x2e, 0x2f, 0x2b, 0x2f, 0x30,
+ 0x2e, 0x2c, 0x31, 0x29, 0x2b, 0x2e, 0x2a, 0x2f, 0x30, 0x2c, 0x31, 0x34,
+ 0x31, 0x33, 0x37, 0x3d, 0x3a, 0x3b, 0x4e, 0x49, 0x46, 0x56, 0x51, 0x4b,
+ 0x4b, 0x4a, 0x47, 0x38, 0x39, 0x39, 0x2c, 0x2f, 0x33, 0x28, 0x2d, 0x31,
+ 0x28, 0x2e, 0x34, 0x28, 0x2d, 0x33, 0x26, 0x2b, 0x2f, 0x26, 0x2a, 0x2d,
+ 0x26, 0x28, 0x30, 0x26, 0x29, 0x2f, 0x26, 0x2b, 0x2e, 0x20, 0x28, 0x2d,
+ 0x1f, 0x29, 0x35, 0x25, 0x32, 0x43, 0x23, 0x35, 0x46, 0x6d, 0x82, 0x8e,
+ 0xf2, 0xfd, 0xf4, 0xe5, 0xf3, 0xfb, 0xbb, 0xc8, 0xe5, 0x7c, 0x85, 0xa3,
+ 0x28, 0x2b, 0x3b, 0x09, 0x09, 0x08, 0x08, 0x08, 0x06, 0x07, 0x08, 0x0a,
+ 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x0d, 0x0a, 0x0a, 0x07, 0x0c, 0x0e, 0x07, 0x09, 0x16, 0x1d, 0x1d,
+ 0x28, 0x45, 0x49, 0x3c, 0x67, 0x62, 0x40, 0x69, 0x59, 0x46, 0x64, 0x57,
+ 0x59, 0x6c, 0x66, 0x59, 0x70, 0x72, 0x42, 0x54, 0x5e, 0x33, 0x38, 0x42,
+ 0x4b, 0x4e, 0x51, 0x49, 0x54, 0x4e, 0x4c, 0x56, 0x51, 0x5e, 0x5f, 0x5c,
+ 0x68, 0x69, 0x64, 0x63, 0x65, 0x62, 0x53, 0x58, 0x57, 0x42, 0x47, 0x49,
+ 0x3c, 0x41, 0x46, 0x3d, 0x42, 0x45, 0x3a, 0x3f, 0x42, 0x38, 0x3d, 0x40,
+ 0x39, 0x3e, 0x44, 0x39, 0x3f, 0x43, 0x34, 0x3c, 0x3f, 0x33, 0x3d, 0x3f,
+ 0x33, 0x3d, 0x3e, 0x34, 0x3c, 0x3e, 0x36, 0x3b, 0x3e, 0x39, 0x3e, 0x41,
+ 0x3b, 0x3f, 0x43, 0x38, 0x3e, 0x42, 0x37, 0x3f, 0x42, 0x37, 0x3f, 0x42,
+ 0x36, 0x3e, 0x41, 0x36, 0x3e, 0x40, 0x37, 0x3f, 0x41, 0x36, 0x3e, 0x3e,
+ 0x38, 0x3e, 0x42, 0x38, 0x3d, 0x44, 0x36, 0x3d, 0x43, 0x36, 0x3e, 0x41,
+ 0x39, 0x43, 0x45, 0x3a, 0x44, 0x46, 0x3d, 0x44, 0x4c, 0x3d, 0x44, 0x4e,
+ 0x3d, 0x44, 0x48, 0x3e, 0x46, 0x49, 0x3e, 0x46, 0x49, 0x40, 0x45, 0x49,
+ 0x3f, 0x44, 0x48, 0x40, 0x45, 0x4b, 0x42, 0x46, 0x4f, 0x41, 0x46, 0x50,
+ 0x41, 0x4a, 0x4a, 0x3e, 0x47, 0x48, 0x3d, 0x43, 0x49, 0x40, 0x45, 0x4b,
+ 0x40, 0x46, 0x4a, 0x3e, 0x46, 0x49, 0x3f, 0x46, 0x4c, 0x3d, 0x46, 0x4d,
+ 0x3f, 0x44, 0x48, 0x42, 0x47, 0x4c, 0x42, 0x47, 0x4d, 0x41, 0x46, 0x4a,
+ 0x3e, 0x43, 0x46, 0x3d, 0x42, 0x45, 0x44, 0x48, 0x4f, 0x42, 0x44, 0x50,
+ 0x39, 0x40, 0x4a, 0x34, 0x3b, 0x43, 0x32, 0x39, 0x3f, 0x33, 0x38, 0x3c,
+ 0x30, 0x35, 0x38, 0x31, 0x39, 0x3c, 0x3b, 0x43, 0x46, 0x3d, 0x46, 0x4a,
+ 0x37, 0x3e, 0x49, 0x37, 0x40, 0x49, 0x37, 0x40, 0x45, 0x33, 0x3e, 0x44,
+ 0x32, 0x3c, 0x46, 0x32, 0x3b, 0x45, 0x32, 0x3b, 0x42, 0x33, 0x3c, 0x3e,
+ 0x32, 0x39, 0x41, 0x35, 0x3c, 0x44, 0x38, 0x3f, 0x48, 0x37, 0x3e, 0x48,
+ 0x34, 0x3c, 0x47, 0x35, 0x3d, 0x48, 0x36, 0x3d, 0x48, 0x32, 0x3a, 0x45,
+ 0x30, 0x3f, 0x46, 0x32, 0x3e, 0x46, 0x37, 0x3e, 0x48, 0x36, 0x3c, 0x45,
+ 0x36, 0x3d, 0x45, 0x33, 0x3d, 0x43, 0x33, 0x3d, 0x49, 0x37, 0x40, 0x51,
+ 0x39, 0x40, 0x50, 0x37, 0x40, 0x4f, 0x38, 0x41, 0x50, 0x3a, 0x44, 0x4f,
+ 0x39, 0x46, 0x58, 0x32, 0x4d, 0x6e, 0x32, 0x5f, 0x94, 0x31, 0x6d, 0xb0,
+ 0x2f, 0x79, 0xc5, 0x2b, 0x79, 0xc4, 0x25, 0x75, 0xba, 0x1a, 0x66, 0xa4,
+ 0x0e, 0x52, 0x87, 0x0c, 0x47, 0x75, 0x10, 0x45, 0x71, 0x14, 0x49, 0x73,
+ 0x16, 0x48, 0x73, 0x16, 0x45, 0x6e, 0x14, 0x41, 0x65, 0x13, 0x3a, 0x63,
+ 0x0e, 0x33, 0x61, 0x0d, 0x2f, 0x60, 0x0e, 0x2f, 0x5c, 0x0d, 0x30, 0x56,
+ 0x0c, 0x2a, 0x53, 0x12, 0x2c, 0x51, 0x13, 0x2e, 0x56, 0x0e, 0x33, 0x63,
+ 0x10, 0x3a, 0x6c, 0x15, 0x3d, 0x6b, 0x10, 0x3b, 0x6d, 0x09, 0x3b, 0x73,
+ 0x17, 0x44, 0x68, 0x24, 0x4c, 0x5b, 0x25, 0x48, 0x48, 0x15, 0x33, 0x35,
+ 0x10, 0x24, 0x2d, 0x13, 0x24, 0x34, 0x1a, 0x3c, 0x59, 0x23, 0x5e, 0x89,
+ 0x2d, 0x75, 0xc0, 0x29, 0x73, 0xcc, 0x17, 0x56, 0xad, 0x09, 0x2f, 0x68,
+ 0x0b, 0x23, 0x3a, 0x18, 0x35, 0x47, 0x1f, 0x4d, 0x73, 0x22, 0x5b, 0x96,
+ 0x2e, 0x61, 0x9c, 0x4b, 0x6f, 0x93, 0x49, 0x6a, 0x88, 0x39, 0x61, 0x85,
+ 0x29, 0x59, 0x7f, 0x24, 0x55, 0x87, 0x1f, 0x47, 0x7e, 0x18, 0x2d, 0x50,
+ 0x14, 0x26, 0x2b, 0x19, 0x2e, 0x3d, 0x1e, 0x40, 0x66, 0x17, 0x49, 0x7d,
+ 0x15, 0x48, 0x7a, 0x22, 0x4d, 0x76, 0x2b, 0x54, 0x7d, 0x2a, 0x5c, 0x8a,
+ 0x29, 0x5f, 0x96, 0x2e, 0x67, 0xaa, 0x35, 0x78, 0xc1, 0x32, 0x82, 0xcc,
+ 0x34, 0x86, 0xd5, 0x34, 0x76, 0xc2, 0x29, 0x58, 0x89, 0x17, 0x38, 0x49,
+ 0x1c, 0x27, 0x30, 0x1a, 0x21, 0x29, 0x1d, 0x1f, 0x24, 0x22, 0x23, 0x23,
+ 0x24, 0x28, 0x27, 0x1e, 0x24, 0x24, 0x16, 0x1a, 0x1d, 0x0f, 0x12, 0x17,
+ 0x0d, 0x11, 0x14, 0x0d, 0x11, 0x14, 0x10, 0x14, 0x17, 0x16, 0x17, 0x1b,
+ 0x17, 0x18, 0x1c, 0x1e, 0x1f, 0x21, 0x21, 0x24, 0x24, 0x34, 0x38, 0x37,
+ 0x34, 0x3a, 0x38, 0x1b, 0x1f, 0x20, 0x12, 0x18, 0x18, 0x11, 0x17, 0x15,
+ 0x11, 0x1a, 0x17, 0x4c, 0x58, 0x54, 0x72, 0x82, 0x82, 0x6d, 0x7e, 0x83,
+ 0x6c, 0x7b, 0x82, 0x6b, 0x79, 0x86, 0x69, 0x74, 0x88, 0x60, 0x66, 0x7e,
+ 0x4b, 0x51, 0x66, 0x39, 0x3f, 0x4d, 0x2c, 0x33, 0x3d, 0x24, 0x2b, 0x33,
+ 0x1f, 0x23, 0x2a, 0x1f, 0x22, 0x25, 0x1f, 0x20, 0x22, 0x1d, 0x1e, 0x1f,
+ 0x23, 0x24, 0x28, 0x27, 0x2a, 0x2f, 0x1c, 0x21, 0x25, 0x18, 0x1d, 0x20,
+ 0x1c, 0x22, 0x22, 0x1d, 0x22, 0x22, 0x1b, 0x1f, 0x20, 0x1e, 0x23, 0x24,
+ 0x16, 0x1a, 0x1b, 0x0f, 0x13, 0x14, 0x0a, 0x0d, 0x0e, 0x0c, 0x0d, 0x0f,
+ 0x11, 0x15, 0x14, 0x24, 0x28, 0x2a, 0x24, 0x28, 0x2b, 0x1c, 0x20, 0x21,
+ 0x1b, 0x1e, 0x1e, 0x1b, 0x1f, 0x1e, 0x1e, 0x24, 0x22, 0x21, 0x27, 0x27,
+ 0x1c, 0x24, 0x26, 0x22, 0x2a, 0x2c, 0x25, 0x2d, 0x2f, 0x27, 0x30, 0x32,
+ 0x26, 0x30, 0x32, 0x29, 0x32, 0x34, 0x2a, 0x32, 0x34, 0x29, 0x32, 0x31,
+ 0x26, 0x30, 0x2f, 0x27, 0x2f, 0x33, 0x28, 0x2d, 0x34, 0x17, 0x1a, 0x21,
+ 0x05, 0x07, 0x0b, 0x04, 0x06, 0x05, 0x05, 0x05, 0x05, 0x07, 0x08, 0x07,
+ 0x17, 0x1d, 0x18, 0x26, 0x2d, 0x2a, 0x29, 0x2e, 0x30, 0x26, 0x2a, 0x31,
+ 0x23, 0x27, 0x30, 0x1b, 0x20, 0x24, 0x11, 0x15, 0x17, 0x0e, 0x13, 0x10,
+ 0x3f, 0x41, 0x40, 0x3b, 0x3d, 0x3d, 0x37, 0x38, 0x3a, 0x35, 0x36, 0x38,
+ 0x2e, 0x2f, 0x31, 0x2b, 0x2c, 0x2e, 0x2d, 0x2e, 0x30, 0x2c, 0x2d, 0x2f,
+ 0x2d, 0x2c, 0x32, 0x29, 0x2d, 0x30, 0x2a, 0x30, 0x30, 0x2c, 0x30, 0x31,
+ 0x32, 0x31, 0x33, 0x49, 0x43, 0x41, 0x57, 0x50, 0x48, 0x58, 0x53, 0x46,
+ 0x48, 0x4a, 0x46, 0x32, 0x34, 0x34, 0x2e, 0x31, 0x34, 0x29, 0x2d, 0x32,
+ 0x29, 0x2e, 0x34, 0x26, 0x2b, 0x2f, 0x26, 0x29, 0x2e, 0x26, 0x28, 0x2c,
+ 0x28, 0x2b, 0x30, 0x28, 0x2d, 0x2e, 0x25, 0x2a, 0x2b, 0x21, 0x29, 0x2a,
+ 0x1d, 0x28, 0x2e, 0x1e, 0x2c, 0x37, 0x26, 0x38, 0x45, 0x32, 0x46, 0x51,
+ 0x87, 0x98, 0x8e, 0xc2, 0xd4, 0xbd, 0xf5, 0xff, 0xf6, 0xdd, 0xe8, 0xea,
+ 0x5d, 0x62, 0x68, 0x14, 0x15, 0x12, 0x09, 0x0a, 0x06, 0x09, 0x08, 0x10,
+ 0x10, 0x10, 0x11, 0x0c, 0x0c, 0x0c, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x0a, 0x0b, 0x0a,
+ 0x0e, 0x12, 0x0f, 0x0a, 0x07, 0x0c, 0x0c, 0x07, 0x09, 0x08, 0x0f, 0x0f,
+ 0x28, 0x43, 0x48, 0x44, 0x6d, 0x69, 0x4e, 0x75, 0x66, 0x55, 0x73, 0x66,
+ 0x62, 0x72, 0x6e, 0x5f, 0x73, 0x73, 0x4e, 0x5e, 0x66, 0x38, 0x3e, 0x49,
+ 0x4c, 0x4f, 0x54, 0x57, 0x5f, 0x58, 0x58, 0x5e, 0x56, 0x63, 0x62, 0x5e,
+ 0x67, 0x68, 0x65, 0x61, 0x63, 0x61, 0x51, 0x55, 0x55, 0x40, 0x45, 0x45,
+ 0x3a, 0x40, 0x42, 0x38, 0x40, 0x40, 0x34, 0x3d, 0x3c, 0x35, 0x3d, 0x3c,
+ 0x38, 0x3d, 0x43, 0x38, 0x3c, 0x42, 0x36, 0x3e, 0x41, 0x35, 0x3f, 0x41,
+ 0x35, 0x3f, 0x41, 0x37, 0x3e, 0x41, 0x37, 0x3c, 0x3f, 0x37, 0x3c, 0x3f,
+ 0x3a, 0x3f, 0x42, 0x39, 0x3e, 0x41, 0x39, 0x40, 0x43, 0x39, 0x41, 0x44,
+ 0x36, 0x3e, 0x40, 0x38, 0x40, 0x42, 0x39, 0x42, 0x42, 0x39, 0x42, 0x41,
+ 0x39, 0x41, 0x44, 0x35, 0x3d, 0x40, 0x35, 0x3c, 0x42, 0x37, 0x40, 0x45,
+ 0x3a, 0x44, 0x46, 0x38, 0x42, 0x43, 0x3c, 0x45, 0x4a, 0x3c, 0x43, 0x4d,
+ 0x38, 0x40, 0x46, 0x38, 0x42, 0x46, 0x3b, 0x45, 0x48, 0x38, 0x42, 0x44,
+ 0x3b, 0x43, 0x45, 0x3e, 0x45, 0x47, 0x3b, 0x40, 0x44, 0x3d, 0x42, 0x46,
+ 0x40, 0x46, 0x46, 0x43, 0x49, 0x4b, 0x46, 0x4b, 0x51, 0x45, 0x49, 0x4f,
+ 0x41, 0x46, 0x4a, 0x41, 0x46, 0x49, 0x41, 0x48, 0x4c, 0x40, 0x48, 0x4d,
+ 0x3d, 0x44, 0x49, 0x3a, 0x40, 0x47, 0x3d, 0x43, 0x4b, 0x3e, 0x45, 0x4b,
+ 0x40, 0x48, 0x4b, 0x3e, 0x46, 0x49, 0x3d, 0x44, 0x4c, 0x3a, 0x40, 0x4c,
+ 0x36, 0x3d, 0x45, 0x33, 0x3a, 0x40, 0x32, 0x3a, 0x3d, 0x33, 0x3b, 0x3e,
+ 0x33, 0x3b, 0x3d, 0x34, 0x3c, 0x3f, 0x37, 0x3f, 0x44, 0x3e, 0x47, 0x4f,
+ 0x3b, 0x44, 0x4e, 0x3b, 0x44, 0x4d, 0x38, 0x41, 0x48, 0x36, 0x40, 0x49,
+ 0x32, 0x3c, 0x46, 0x31, 0x39, 0x44, 0x31, 0x3a, 0x41, 0x33, 0x3c, 0x41,
+ 0x34, 0x3b, 0x43, 0x35, 0x3c, 0x45, 0x36, 0x3e, 0x47, 0x34, 0x3d, 0x46,
+ 0x32, 0x3b, 0x44, 0x33, 0x3b, 0x46, 0x38, 0x40, 0x4b, 0x3a, 0x44, 0x4e,
+ 0x37, 0x41, 0x4a, 0x33, 0x3d, 0x46, 0x33, 0x3d, 0x44, 0x31, 0x3b, 0x3d,
+ 0x33, 0x3e, 0x3f, 0x34, 0x3f, 0x43, 0x37, 0x40, 0x4d, 0x3a, 0x42, 0x54,
+ 0x3b, 0x44, 0x50, 0x38, 0x40, 0x4b, 0x3b, 0x45, 0x4e, 0x38, 0x4a, 0x59,
+ 0x32, 0x51, 0x70, 0x32, 0x63, 0x99, 0x32, 0x72, 0xbd, 0x2a, 0x75, 0xcb,
+ 0x23, 0x78, 0xc7, 0x1d, 0x71, 0xb4, 0x17, 0x62, 0x98, 0x10, 0x4f, 0x7b,
+ 0x11, 0x46, 0x70, 0x15, 0x46, 0x6f, 0x12, 0x46, 0x6e, 0x11, 0x47, 0x6f,
+ 0x17, 0x41, 0x6b, 0x16, 0x3c, 0x64, 0x0e, 0x34, 0x58, 0x0d, 0x30, 0x57,
+ 0x0e, 0x2f, 0x5c, 0x10, 0x2e, 0x60, 0x0d, 0x2c, 0x59, 0x0c, 0x2b, 0x54,
+ 0x0c, 0x2a, 0x55, 0x10, 0x2e, 0x54, 0x0e, 0x2f, 0x54, 0x15, 0x37, 0x5f,
+ 0x25, 0x41, 0x65, 0x2e, 0x44, 0x63, 0x24, 0x41, 0x65, 0x14, 0x3e, 0x69,
+ 0x21, 0x4a, 0x69, 0x28, 0x51, 0x67, 0x24, 0x4d, 0x59, 0x12, 0x32, 0x39,
+ 0x0e, 0x22, 0x27, 0x16, 0x2a, 0x36, 0x18, 0x44, 0x64, 0x1f, 0x67, 0x9b,
+ 0x33, 0x84, 0xcd, 0x32, 0x80, 0xd6, 0x19, 0x56, 0xa9, 0x0a, 0x2c, 0x60,
+ 0x0f, 0x26, 0x3e, 0x1a, 0x3c, 0x51, 0x1f, 0x51, 0x7b, 0x35, 0x6c, 0xa7,
+ 0x5f, 0x81, 0xaa, 0x7f, 0x88, 0x93, 0x77, 0x79, 0x88, 0x52, 0x63, 0x7f,
+ 0x2e, 0x59, 0x73, 0x1f, 0x5a, 0x88, 0x17, 0x4a, 0x86, 0x15, 0x30, 0x52,
+ 0x16, 0x27, 0x2e, 0x19, 0x32, 0x45, 0x1b, 0x44, 0x6d, 0x17, 0x4f, 0x88,
+ 0x19, 0x54, 0x91, 0x23, 0x57, 0x8b, 0x30, 0x60, 0x91, 0x2c, 0x62, 0x97,
+ 0x29, 0x6d, 0xb4, 0x35, 0x76, 0xc9, 0x3a, 0x84, 0xd9, 0x30, 0x88, 0xd5,
+ 0x2a, 0x76, 0xb9, 0x28, 0x52, 0x87, 0x1e, 0x2f, 0x46, 0x17, 0x23, 0x1f,
+ 0x1a, 0x21, 0x25, 0x19, 0x1e, 0x22, 0x16, 0x17, 0x1b, 0x12, 0x14, 0x17,
+ 0x1b, 0x1f, 0x21, 0x24, 0x29, 0x2b, 0x25, 0x29, 0x2c, 0x24, 0x27, 0x2c,
+ 0x1d, 0x21, 0x24, 0x17, 0x1b, 0x1e, 0x17, 0x1b, 0x1e, 0x14, 0x18, 0x1b,
+ 0x13, 0x17, 0x1a, 0x17, 0x1c, 0x1e, 0x21, 0x26, 0x26, 0x1d, 0x23, 0x23,
+ 0x14, 0x1a, 0x17, 0x10, 0x16, 0x14, 0x12, 0x17, 0x16, 0x10, 0x15, 0x11,
+ 0x06, 0x0d, 0x06, 0x13, 0x1d, 0x15, 0x2f, 0x39, 0x36, 0x51, 0x5d, 0x5d,
+ 0x64, 0x72, 0x72, 0x69, 0x76, 0x7a, 0x6d, 0x77, 0x82, 0x66, 0x6f, 0x7e,
+ 0x5f, 0x67, 0x76, 0x51, 0x59, 0x69, 0x45, 0x4e, 0x5f, 0x37, 0x3f, 0x52,
+ 0x2c, 0x30, 0x3f, 0x23, 0x27, 0x31, 0x1e, 0x23, 0x29, 0x22, 0x27, 0x2b,
+ 0x2a, 0x2d, 0x32, 0x20, 0x24, 0x29, 0x0f, 0x10, 0x14, 0x0d, 0x0d, 0x0f,
+ 0x11, 0x14, 0x14, 0x18, 0x1b, 0x1b, 0x1c, 0x20, 0x1f, 0x1d, 0x21, 0x22,
+ 0x21, 0x22, 0x24, 0x23, 0x24, 0x26, 0x16, 0x17, 0x19, 0x15, 0x16, 0x18,
+ 0x1c, 0x1f, 0x20, 0x25, 0x29, 0x2c, 0x1c, 0x1f, 0x24, 0x18, 0x1c, 0x1f,
+ 0x1b, 0x1f, 0x20, 0x1f, 0x26, 0x24, 0x1c, 0x25, 0x24, 0x20, 0x28, 0x2a,
+ 0x22, 0x2a, 0x2c, 0x28, 0x30, 0x32, 0x29, 0x31, 0x33, 0x29, 0x33, 0x35,
+ 0x28, 0x32, 0x34, 0x27, 0x2f, 0x31, 0x28, 0x30, 0x32, 0x2b, 0x33, 0x34,
+ 0x27, 0x30, 0x2f, 0x28, 0x30, 0x34, 0x2b, 0x2f, 0x36, 0x1d, 0x1d, 0x25,
+ 0x07, 0x08, 0x0c, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x05,
+ 0x13, 0x16, 0x0e, 0x28, 0x2c, 0x27, 0x28, 0x2c, 0x2d, 0x24, 0x29, 0x2e,
+ 0x1d, 0x22, 0x28, 0x15, 0x18, 0x1d, 0x10, 0x14, 0x13, 0x0e, 0x13, 0x0f,
+ 0x40, 0x42, 0x41, 0x3b, 0x3d, 0x3c, 0x38, 0x39, 0x3a, 0x31, 0x33, 0x35,
+ 0x2f, 0x30, 0x32, 0x2f, 0x30, 0x32, 0x2e, 0x2f, 0x31, 0x29, 0x2a, 0x2d,
+ 0x2a, 0x2e, 0x2d, 0x2b, 0x30, 0x34, 0x2a, 0x2f, 0x35, 0x2e, 0x31, 0x34,
+ 0x3d, 0x3c, 0x36, 0x59, 0x52, 0x46, 0x5f, 0x56, 0x4b, 0x58, 0x50, 0x46,
+ 0x3e, 0x41, 0x3f, 0x2d, 0x31, 0x32, 0x2d, 0x31, 0x34, 0x2c, 0x31, 0x35,
+ 0x2a, 0x2f, 0x35, 0x28, 0x2b, 0x31, 0x26, 0x27, 0x2c, 0x28, 0x29, 0x2d,
+ 0x25, 0x29, 0x2c, 0x24, 0x28, 0x2a, 0x23, 0x27, 0x29, 0x21, 0x27, 0x29,
+ 0x1b, 0x25, 0x29, 0x1b, 0x28, 0x32, 0x26, 0x36, 0x41, 0x31, 0x44, 0x4e,
+ 0x61, 0x6f, 0x6e, 0x62, 0x71, 0x6d, 0x86, 0x96, 0x81, 0xab, 0xb9, 0x97,
+ 0x79, 0x81, 0x66, 0x3c, 0x3c, 0x38, 0x16, 0x13, 0x16, 0x07, 0x06, 0x03,
+ 0x08, 0x08, 0x07, 0x09, 0x09, 0x09, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0f, 0x0f, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0c, 0x0b, 0x0c,
+ 0x08, 0x0c, 0x0a, 0x0c, 0x0a, 0x0e, 0x0e, 0x09, 0x0b, 0x06, 0x0d, 0x0e,
+ 0x25, 0x3e, 0x44, 0x4d, 0x72, 0x6f, 0x56, 0x7b, 0x6c, 0x5f, 0x7a, 0x6f,
+ 0x67, 0x77, 0x73, 0x62, 0x74, 0x72, 0x54, 0x63, 0x69, 0x39, 0x45, 0x51,
+ 0x39, 0x42, 0x49, 0x54, 0x5b, 0x55, 0x57, 0x5b, 0x50, 0x61, 0x5f, 0x59,
+ 0x60, 0x61, 0x5d, 0x57, 0x5c, 0x56, 0x4d, 0x53, 0x4f, 0x41, 0x47, 0x45,
+ 0x3b, 0x41, 0x41, 0x34, 0x3c, 0x3e, 0x34, 0x3d, 0x3e, 0x35, 0x3e, 0x3e,
+ 0x38, 0x3d, 0x43, 0x3a, 0x3f, 0x44, 0x37, 0x3f, 0x42, 0x37, 0x3f, 0x42,
+ 0x37, 0x3f, 0x42, 0x36, 0x3e, 0x41, 0x38, 0x3e, 0x41, 0x3a, 0x3f, 0x43,
+ 0x39, 0x3e, 0x42, 0x37, 0x3c, 0x40, 0x35, 0x3d, 0x40, 0x37, 0x3f, 0x42,
+ 0x36, 0x3e, 0x41, 0x36, 0x3e, 0x41, 0x3a, 0x42, 0x44, 0x3a, 0x42, 0x44,
+ 0x3a, 0x42, 0x44, 0x36, 0x3e, 0x41, 0x35, 0x3e, 0x43, 0x35, 0x3e, 0x43,
+ 0x38, 0x42, 0x44, 0x38, 0x42, 0x44, 0x3a, 0x44, 0x48, 0x3a, 0x41, 0x49,
+ 0x37, 0x41, 0x4a, 0x36, 0x40, 0x47, 0x37, 0x40, 0x46, 0x38, 0x41, 0x46,
+ 0x38, 0x40, 0x43, 0x3c, 0x41, 0x45, 0x39, 0x3d, 0x40, 0x37, 0x3c, 0x3d,
+ 0x3d, 0x42, 0x42, 0x47, 0x4b, 0x4e, 0x47, 0x4a, 0x51, 0x44, 0x47, 0x4e,
+ 0x41, 0x45, 0x48, 0x43, 0x48, 0x4b, 0x44, 0x49, 0x4d, 0x42, 0x47, 0x4b,
+ 0x3b, 0x43, 0x46, 0x39, 0x40, 0x46, 0x37, 0x3f, 0x45, 0x35, 0x3d, 0x42,
+ 0x36, 0x40, 0x42, 0x39, 0x43, 0x45, 0x37, 0x40, 0x47, 0x36, 0x3f, 0x48,
+ 0x33, 0x3c, 0x42, 0x32, 0x3a, 0x3f, 0x33, 0x3b, 0x3e, 0x33, 0x3b, 0x3e,
+ 0x35, 0x3d, 0x40, 0x37, 0x3e, 0x44, 0x37, 0x40, 0x47, 0x3e, 0x47, 0x4e,
+ 0x3e, 0x47, 0x4f, 0x38, 0x41, 0x48, 0x35, 0x3e, 0x45, 0x37, 0x40, 0x48,
+ 0x32, 0x3b, 0x44, 0x30, 0x39, 0x42, 0x33, 0x3b, 0x42, 0x34, 0x3b, 0x41,
+ 0x37, 0x3e, 0x46, 0x36, 0x3d, 0x45, 0x33, 0x3c, 0x43, 0x34, 0x3d, 0x44,
+ 0x31, 0x3a, 0x41, 0x32, 0x3b, 0x43, 0x35, 0x3f, 0x48, 0x38, 0x42, 0x4b,
+ 0x36, 0x3f, 0x48, 0x35, 0x3f, 0x48, 0x33, 0x3f, 0x47, 0x32, 0x3d, 0x43,
+ 0x33, 0x3c, 0x41, 0x36, 0x3f, 0x44, 0x3d, 0x45, 0x4e, 0x3d, 0x45, 0x51,
+ 0x39, 0x42, 0x45, 0x34, 0x3f, 0x45, 0x35, 0x48, 0x57, 0x34, 0x57, 0x76,
+ 0x30, 0x68, 0x9a, 0x30, 0x77, 0xba, 0x29, 0x79, 0xc5, 0x21, 0x73, 0xc1,
+ 0x17, 0x69, 0xb2, 0x0e, 0x5b, 0x95, 0x0b, 0x4e, 0x79, 0x11, 0x48, 0x6e,
+ 0x19, 0x47, 0x70, 0x19, 0x46, 0x70, 0x18, 0x48, 0x71, 0x13, 0x46, 0x6b,
+ 0x16, 0x39, 0x5e, 0x0f, 0x31, 0x54, 0x0b, 0x2e, 0x4e, 0x0e, 0x2f, 0x54,
+ 0x10, 0x30, 0x5c, 0x10, 0x2f, 0x5e, 0x0e, 0x2d, 0x5b, 0x0b, 0x2a, 0x56,
+ 0x09, 0x29, 0x51, 0x0b, 0x2c, 0x4d, 0x0f, 0x32, 0x4c, 0x2b, 0x46, 0x5e,
+ 0x54, 0x5b, 0x6a, 0x62, 0x5d, 0x63, 0x52, 0x54, 0x61, 0x34, 0x4c, 0x62,
+ 0x29, 0x56, 0x6c, 0x2b, 0x5b, 0x77, 0x21, 0x50, 0x6d, 0x0e, 0x2e, 0x43,
+ 0x0c, 0x1d, 0x29, 0x1b, 0x30, 0x3e, 0x18, 0x4b, 0x6a, 0x1c, 0x6c, 0xa1,
+ 0x31, 0x86, 0xd1, 0x31, 0x81, 0xd5, 0x1c, 0x57, 0xa2, 0x0e, 0x2c, 0x59,
+ 0x14, 0x2b, 0x42, 0x17, 0x3f, 0x5c, 0x22, 0x57, 0x86, 0x37, 0x6a, 0xa2,
+ 0x6d, 0x82, 0x8f, 0x96, 0x97, 0x82, 0x7e, 0x7e, 0x7c, 0x4d, 0x61, 0x78,
+ 0x2b, 0x5a, 0x72, 0x1d, 0x5b, 0x8d, 0x12, 0x47, 0x89, 0x10, 0x2d, 0x50,
+ 0x14, 0x28, 0x31, 0x19, 0x37, 0x4d, 0x1c, 0x49, 0x74, 0x1c, 0x56, 0x91,
+ 0x22, 0x5f, 0xa1, 0x23, 0x61, 0xa1, 0x2b, 0x69, 0xac, 0x30, 0x73, 0xb9,
+ 0x2a, 0x7d, 0xc9, 0x30, 0x81, 0xd5, 0x3c, 0x88, 0xde, 0x32, 0x76, 0xba,
+ 0x1c, 0x4b, 0x75, 0x16, 0x29, 0x3e, 0x19, 0x1a, 0x23, 0x1f, 0x1e, 0x22,
+ 0x1a, 0x20, 0x20, 0x1a, 0x1c, 0x1e, 0x12, 0x10, 0x15, 0x07, 0x06, 0x0b,
+ 0x0b, 0x0d, 0x12, 0x13, 0x18, 0x1c, 0x1e, 0x22, 0x25, 0x28, 0x2c, 0x2f,
+ 0x22, 0x26, 0x27, 0x1e, 0x22, 0x25, 0x24, 0x27, 0x2b, 0x24, 0x27, 0x2c,
+ 0x38, 0x3d, 0x41, 0x23, 0x28, 0x2b, 0x16, 0x1e, 0x20, 0x13, 0x1b, 0x1d,
+ 0x0c, 0x15, 0x12, 0x10, 0x16, 0x14, 0x0f, 0x13, 0x14, 0x0a, 0x0c, 0x0b,
+ 0x03, 0x05, 0x01, 0x00, 0x05, 0x00, 0x04, 0x09, 0x06, 0x1a, 0x20, 0x20,
+ 0x30, 0x3b, 0x37, 0x42, 0x4d, 0x4b, 0x58, 0x62, 0x65, 0x62, 0x6b, 0x70,
+ 0x5f, 0x69, 0x70, 0x56, 0x60, 0x6b, 0x54, 0x60, 0x6f, 0x55, 0x60, 0x74,
+ 0x4d, 0x53, 0x69, 0x35, 0x3c, 0x4c, 0x28, 0x32, 0x3a, 0x44, 0x4f, 0x53,
+ 0x35, 0x3e, 0x42, 0x12, 0x17, 0x1b, 0x08, 0x07, 0x0a, 0x08, 0x05, 0x05,
+ 0x05, 0x07, 0x04, 0x0b, 0x0d, 0x0c, 0x15, 0x17, 0x16, 0x1c, 0x1e, 0x1d,
+ 0x22, 0x23, 0x25, 0x26, 0x27, 0x2a, 0x21, 0x22, 0x26, 0x23, 0x24, 0x28,
+ 0x23, 0x25, 0x29, 0x21, 0x24, 0x29, 0x1a, 0x1d, 0x24, 0x1b, 0x1f, 0x23,
+ 0x1d, 0x22, 0x25, 0x1f, 0x28, 0x27, 0x1f, 0x29, 0x29, 0x24, 0x2e, 0x2f,
+ 0x28, 0x30, 0x30, 0x27, 0x2f, 0x30, 0x2a, 0x32, 0x34, 0x26, 0x30, 0x32,
+ 0x2c, 0x36, 0x38, 0x28, 0x30, 0x32, 0x27, 0x2f, 0x31, 0x29, 0x31, 0x33,
+ 0x2a, 0x32, 0x34, 0x2b, 0x30, 0x34, 0x2b, 0x2f, 0x36, 0x20, 0x20, 0x26,
+ 0x0e, 0x0e, 0x12, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08,
+ 0x12, 0x13, 0x15, 0x26, 0x28, 0x27, 0x25, 0x29, 0x28, 0x1c, 0x21, 0x1e,
+ 0x15, 0x19, 0x18, 0x10, 0x14, 0x15, 0x10, 0x12, 0x15, 0x0f, 0x10, 0x14,
+ 0x3b, 0x3f, 0x3e, 0x38, 0x3c, 0x3b, 0x35, 0x39, 0x3a, 0x30, 0x34, 0x35,
+ 0x2e, 0x32, 0x33, 0x2c, 0x30, 0x31, 0x2a, 0x2e, 0x2f, 0x29, 0x2d, 0x2d,
+ 0x2b, 0x30, 0x2a, 0x2e, 0x32, 0x36, 0x2d, 0x30, 0x3d, 0x37, 0x39, 0x3c,
+ 0x55, 0x54, 0x46, 0x6d, 0x68, 0x52, 0x62, 0x5c, 0x4d, 0x4e, 0x48, 0x46,
+ 0x32, 0x35, 0x37, 0x2b, 0x2f, 0x30, 0x29, 0x2e, 0x31, 0x2b, 0x2e, 0x33,
+ 0x2b, 0x2e, 0x34, 0x28, 0x2b, 0x30, 0x28, 0x29, 0x2e, 0x28, 0x29, 0x2d,
+ 0x22, 0x27, 0x2a, 0x23, 0x27, 0x2b, 0x21, 0x25, 0x29, 0x20, 0x23, 0x2a,
+ 0x1e, 0x25, 0x2d, 0x1e, 0x28, 0x31, 0x29, 0x37, 0x45, 0x20, 0x32, 0x3f,
+ 0x42, 0x50, 0x47, 0x9a, 0xa3, 0xa6, 0x85, 0x8d, 0x93, 0x36, 0x3e, 0x30,
+ 0x39, 0x42, 0x25, 0x53, 0x58, 0x43, 0x31, 0x32, 0x27, 0x0d, 0x0c, 0x06,
+ 0x08, 0x08, 0x06, 0x0a, 0x0a, 0x08, 0x0a, 0x0a, 0x08, 0x07, 0x07, 0x07,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06, 0x08, 0x09, 0x08,
+ 0x08, 0x0a, 0x08, 0x0c, 0x0a, 0x0e, 0x0f, 0x0c, 0x0d, 0x09, 0x10, 0x10,
+ 0x24, 0x39, 0x40, 0x55, 0x73, 0x73, 0x60, 0x7f, 0x72, 0x64, 0x7b, 0x72,
+ 0x67, 0x77, 0x74, 0x62, 0x73, 0x6d, 0x54, 0x66, 0x68, 0x3c, 0x4f, 0x5d,
+ 0x2a, 0x3a, 0x45, 0x35, 0x3e, 0x3a, 0x3a, 0x3e, 0x32, 0x43, 0x43, 0x3d,
+ 0x50, 0x53, 0x48, 0x53, 0x57, 0x4e, 0x4a, 0x4f, 0x49, 0x43, 0x48, 0x44,
+ 0x41, 0x46, 0x47, 0x38, 0x3e, 0x41, 0x36, 0x3d, 0x41, 0x35, 0x3c, 0x42,
+ 0x37, 0x3c, 0x41, 0x3a, 0x3f, 0x43, 0x39, 0x3e, 0x42, 0x38, 0x40, 0x43,
+ 0x37, 0x3f, 0x42, 0x38, 0x3e, 0x42, 0x39, 0x3e, 0x42, 0x3a, 0x3f, 0x43,
+ 0x39, 0x3e, 0x44, 0x37, 0x3c, 0x44, 0x35, 0x3c, 0x44, 0x39, 0x40, 0x47,
+ 0x38, 0x3f, 0x46, 0x36, 0x3d, 0x43, 0x3b, 0x43, 0x46, 0x3e, 0x46, 0x49,
+ 0x3c, 0x44, 0x46, 0x36, 0x40, 0x42, 0x37, 0x40, 0x45, 0x35, 0x3e, 0x43,
+ 0x35, 0x3f, 0x41, 0x38, 0x42, 0x44, 0x3e, 0x46, 0x48, 0x3a, 0x42, 0x47,
+ 0x35, 0x3d, 0x48, 0x35, 0x3d, 0x48, 0x36, 0x3d, 0x47, 0x36, 0x3d, 0x45,
+ 0x3a, 0x3f, 0x45, 0x3b, 0x3e, 0x44, 0x3a, 0x3e, 0x41, 0x3b, 0x3f, 0x41,
+ 0x3d, 0x42, 0x43, 0x41, 0x45, 0x4a, 0x41, 0x44, 0x4c, 0x3f, 0x44, 0x4a,
+ 0x3f, 0x44, 0x48, 0x43, 0x48, 0x4b, 0x46, 0x4b, 0x4d, 0x43, 0x48, 0x4c,
+ 0x39, 0x41, 0x41, 0x3b, 0x44, 0x45, 0x38, 0x42, 0x44, 0x34, 0x3e, 0x40,
+ 0x32, 0x3c, 0x3d, 0x32, 0x3c, 0x3d, 0x35, 0x3e, 0x43, 0x32, 0x3b, 0x42,
+ 0x34, 0x3e, 0x40, 0x32, 0x3c, 0x3d, 0x31, 0x39, 0x3d, 0x33, 0x3a, 0x3f,
+ 0x34, 0x3b, 0x40, 0x36, 0x3e, 0x45, 0x37, 0x40, 0x47, 0x38, 0x41, 0x48,
+ 0x38, 0x42, 0x44, 0x33, 0x3d, 0x41, 0x34, 0x3c, 0x43, 0x34, 0x3d, 0x44,
+ 0x33, 0x3c, 0x41, 0x34, 0x3d, 0x40, 0x35, 0x3d, 0x40, 0x38, 0x40, 0x44,
+ 0x3c, 0x43, 0x48, 0x3b, 0x42, 0x48, 0x37, 0x40, 0x44, 0x35, 0x3f, 0x41,
+ 0x34, 0x3d, 0x40, 0x32, 0x3b, 0x40, 0x38, 0x43, 0x47, 0x3e, 0x49, 0x4f,
+ 0x37, 0x42, 0x48, 0x35, 0x42, 0x4b, 0x39, 0x48, 0x54, 0x38, 0x42, 0x50,
+ 0x37, 0x3d, 0x48, 0x3b, 0x3f, 0x48, 0x3d, 0x42, 0x49, 0x3e, 0x45, 0x4b,
+ 0x39, 0x44, 0x4d, 0x33, 0x47, 0x5d, 0x32, 0x56, 0x7d, 0x31, 0x69, 0xa7,
+ 0x2f, 0x7a, 0xc7, 0x28, 0x7b, 0xc9, 0x22, 0x75, 0xba, 0x1a, 0x67, 0xa3,
+ 0x11, 0x54, 0x8d, 0x08, 0x48, 0x78, 0x10, 0x49, 0x71, 0x14, 0x49, 0x71,
+ 0x18, 0x48, 0x76, 0x18, 0x44, 0x73, 0x16, 0x41, 0x6c, 0x11, 0x3b, 0x5f,
+ 0x0f, 0x2d, 0x51, 0x0b, 0x29, 0x4b, 0x0a, 0x2b, 0x4a, 0x0c, 0x2d, 0x50,
+ 0x0e, 0x2f, 0x5a, 0x0d, 0x2d, 0x5c, 0x0e, 0x2e, 0x5d, 0x0b, 0x2c, 0x57,
+ 0x0b, 0x29, 0x53, 0x0c, 0x2b, 0x4e, 0x12, 0x30, 0x4a, 0x34, 0x48, 0x58,
+ 0x6b, 0x6a, 0x6a, 0x78, 0x6a, 0x61, 0x61, 0x60, 0x5f, 0x3e, 0x56, 0x60,
+ 0x25, 0x5c, 0x70, 0x2b, 0x66, 0x8b, 0x1f, 0x53, 0x84, 0x0a, 0x29, 0x4e,
+ 0x0c, 0x1c, 0x30, 0x1a, 0x31, 0x43, 0x1d, 0x50, 0x73, 0x23, 0x71, 0xa8,
+ 0x32, 0x87, 0xd3, 0x2e, 0x7f, 0xd1, 0x1a, 0x52, 0x95, 0x11, 0x2c, 0x4f,
+ 0x16, 0x30, 0x46, 0x18, 0x46, 0x6a, 0x22, 0x5c, 0x8d, 0x22, 0x4f, 0x83,
+ 0x2e, 0x45, 0x4a, 0x67, 0x77, 0x5e, 0x57, 0x6f, 0x73, 0x29, 0x51, 0x75,
+ 0x22, 0x56, 0x7c, 0x26, 0x5b, 0x95, 0x1b, 0x44, 0x87, 0x16, 0x2b, 0x4b,
+ 0x18, 0x2f, 0x3e, 0x1c, 0x3f, 0x5a, 0x1d, 0x4e, 0x7a, 0x25, 0x5e, 0x97,
+ 0x28, 0x67, 0xaa, 0x26, 0x6c, 0xb9, 0x27, 0x73, 0xc6, 0x2d, 0x7f, 0xd4,
+ 0x2c, 0x84, 0xdd, 0x2a, 0x7f, 0xd0, 0x2c, 0x6e, 0xaf, 0x2a, 0x4a, 0x75,
+ 0x1a, 0x25, 0x35, 0x19, 0x1d, 0x19, 0x1d, 0x1e, 0x1e, 0x1d, 0x1c, 0x26,
+ 0x1f, 0x22, 0x20, 0x22, 0x24, 0x23, 0x1d, 0x1d, 0x20, 0x1b, 0x1b, 0x20,
+ 0x11, 0x14, 0x19, 0x09, 0x0e, 0x12, 0x0e, 0x12, 0x15, 0x11, 0x14, 0x17,
+ 0x15, 0x19, 0x1a, 0x19, 0x1d, 0x20, 0x1f, 0x23, 0x27, 0x2a, 0x2f, 0x32,
+ 0x3a, 0x40, 0x42, 0x1a, 0x22, 0x24, 0x0e, 0x16, 0x18, 0x12, 0x19, 0x1b,
+ 0x10, 0x18, 0x18, 0x0d, 0x13, 0x13, 0x06, 0x0a, 0x0d, 0x04, 0x05, 0x07,
+ 0x04, 0x04, 0x03, 0x05, 0x05, 0x03, 0x08, 0x08, 0x08, 0x0c, 0x0e, 0x0f,
+ 0x10, 0x19, 0x16, 0x18, 0x21, 0x1f, 0x2a, 0x33, 0x32, 0x48, 0x51, 0x50,
+ 0x54, 0x5e, 0x5e, 0x54, 0x5f, 0x61, 0x59, 0x66, 0x6d, 0x64, 0x71, 0x7f,
+ 0x66, 0x6e, 0x83, 0x43, 0x4e, 0x5e, 0x26, 0x34, 0x3d, 0x58, 0x68, 0x6a,
+ 0x3f, 0x4b, 0x4d, 0x06, 0x0d, 0x10, 0x01, 0x03, 0x05, 0x07, 0x04, 0x05,
+ 0x05, 0x05, 0x03, 0x06, 0x07, 0x05, 0x0a, 0x0c, 0x0b, 0x0d, 0x0f, 0x0f,
+ 0x13, 0x14, 0x16, 0x1d, 0x1e, 0x21, 0x22, 0x23, 0x25, 0x2b, 0x2c, 0x30,
+ 0x28, 0x2b, 0x30, 0x21, 0x25, 0x2b, 0x21, 0x24, 0x2b, 0x1f, 0x22, 0x27,
+ 0x1c, 0x21, 0x24, 0x1e, 0x26, 0x26, 0x23, 0x2d, 0x2c, 0x28, 0x32, 0x32,
+ 0x29, 0x30, 0x30, 0x27, 0x2f, 0x31, 0x2a, 0x32, 0x34, 0x28, 0x30, 0x33,
+ 0x29, 0x32, 0x34, 0x29, 0x32, 0x35, 0x29, 0x31, 0x34, 0x2d, 0x33, 0x35,
+ 0x29, 0x31, 0x33, 0x2c, 0x31, 0x35, 0x2c, 0x2f, 0x36, 0x23, 0x24, 0x29,
+ 0x0d, 0x0d, 0x0f, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x08,
+ 0x10, 0x11, 0x15, 0x20, 0x24, 0x25, 0x1f, 0x23, 0x22, 0x14, 0x18, 0x17,
+ 0x11, 0x13, 0x11, 0x0f, 0x10, 0x0e, 0x15, 0x11, 0x10, 0x21, 0x1b, 0x1c,
+ 0x39, 0x3f, 0x3d, 0x37, 0x3d, 0x3b, 0x33, 0x39, 0x39, 0x2e, 0x34, 0x34,
+ 0x2d, 0x33, 0x33, 0x2d, 0x32, 0x33, 0x2b, 0x31, 0x32, 0x2c, 0x32, 0x31,
+ 0x2d, 0x32, 0x2b, 0x31, 0x35, 0x36, 0x38, 0x3b, 0x40, 0x55, 0x56, 0x52,
+ 0x72, 0x71, 0x60, 0x72, 0x6f, 0x5a, 0x58, 0x56, 0x4b, 0x3a, 0x38, 0x3a,
+ 0x2b, 0x2f, 0x30, 0x2a, 0x2f, 0x31, 0x29, 0x2d, 0x30, 0x28, 0x2b, 0x30,
+ 0x26, 0x29, 0x2e, 0x26, 0x29, 0x2e, 0x27, 0x2a, 0x2f, 0x24, 0x27, 0x2c,
+ 0x22, 0x27, 0x2a, 0x21, 0x25, 0x2b, 0x1e, 0x21, 0x2a, 0x21, 0x24, 0x2d,
+ 0x22, 0x26, 0x2e, 0x1e, 0x27, 0x30, 0x28, 0x36, 0x43, 0x25, 0x35, 0x45,
+ 0x0e, 0x19, 0x17, 0x49, 0x51, 0x46, 0xa4, 0xa6, 0xa1, 0x7c, 0x7d, 0x80,
+ 0x1e, 0x23, 0x1e, 0x1f, 0x27, 0x12, 0x36, 0x3a, 0x2b, 0x20, 0x1d, 0x22,
+ 0x0d, 0x0c, 0x0a, 0x0f, 0x0f, 0x0c, 0x13, 0x13, 0x11, 0x0e, 0x0e, 0x0c,
+ 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x13, 0x13, 0x13, 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x07, 0x08, 0x06, 0x0a, 0x08, 0x0c, 0x0c, 0x0a, 0x0b, 0x0a, 0x10, 0x11,
+ 0x20, 0x31, 0x39, 0x51, 0x6a, 0x6b, 0x6b, 0x83, 0x79, 0x6d, 0x80, 0x78,
+ 0x6d, 0x7c, 0x79, 0x61, 0x71, 0x67, 0x4e, 0x60, 0x60, 0x3d, 0x54, 0x64,
+ 0x29, 0x3e, 0x4d, 0x20, 0x2c, 0x2a, 0x20, 0x23, 0x1a, 0x1a, 0x1d, 0x17,
+ 0x2b, 0x2e, 0x23, 0x3f, 0x42, 0x39, 0x49, 0x4c, 0x44, 0x4a, 0x4c, 0x49,
+ 0x43, 0x47, 0x46, 0x39, 0x3e, 0x41, 0x37, 0x3f, 0x42, 0x34, 0x3c, 0x41,
+ 0x35, 0x3c, 0x3f, 0x34, 0x3c, 0x3e, 0x37, 0x3f, 0x41, 0x38, 0x40, 0x42,
+ 0x38, 0x40, 0x43, 0x36, 0x3d, 0x40, 0x38, 0x40, 0x43, 0x3b, 0x43, 0x46,
+ 0x3b, 0x40, 0x48, 0x39, 0x3d, 0x46, 0x37, 0x3e, 0x46, 0x3b, 0x42, 0x4a,
+ 0x3b, 0x42, 0x4a, 0x38, 0x40, 0x45, 0x37, 0x3e, 0x43, 0x3b, 0x42, 0x46,
+ 0x3a, 0x42, 0x44, 0x33, 0x3c, 0x3f, 0x34, 0x3d, 0x44, 0x35, 0x3e, 0x43,
+ 0x35, 0x3f, 0x41, 0x35, 0x3e, 0x40, 0x38, 0x40, 0x42, 0x37, 0x3f, 0x44,
+ 0x37, 0x3d, 0x49, 0x36, 0x3c, 0x48, 0x36, 0x3b, 0x47, 0x38, 0x3c, 0x47,
+ 0x3b, 0x3f, 0x48, 0x3e, 0x41, 0x48, 0x39, 0x3c, 0x41, 0x3b, 0x40, 0x43,
+ 0x3d, 0x42, 0x45, 0x3c, 0x41, 0x46, 0x3d, 0x43, 0x4b, 0x3e, 0x45, 0x4b,
+ 0x3a, 0x41, 0x44, 0x3f, 0x45, 0x46, 0x44, 0x49, 0x4c, 0x42, 0x46, 0x49,
+ 0x3d, 0x45, 0x43, 0x3c, 0x45, 0x44, 0x3b, 0x43, 0x45, 0x38, 0x40, 0x43,
+ 0x33, 0x3d, 0x3e, 0x31, 0x3b, 0x3c, 0x34, 0x3e, 0x41, 0x33, 0x3c, 0x43,
+ 0x31, 0x3b, 0x3e, 0x32, 0x3b, 0x40, 0x32, 0x39, 0x3f, 0x37, 0x3e, 0x44,
+ 0x3c, 0x44, 0x4a, 0x3b, 0x43, 0x4b, 0x36, 0x40, 0x47, 0x31, 0x3c, 0x41,
+ 0x33, 0x3d, 0x3d, 0x34, 0x3d, 0x40, 0x35, 0x3d, 0x44, 0x34, 0x3d, 0x42,
+ 0x33, 0x3d, 0x3f, 0x35, 0x3d, 0x3f, 0x34, 0x3c, 0x3f, 0x3b, 0x41, 0x46,
+ 0x41, 0x48, 0x50, 0x3c, 0x43, 0x4b, 0x39, 0x40, 0x45, 0x37, 0x3f, 0x42,
+ 0x33, 0x3d, 0x3f, 0x33, 0x3c, 0x40, 0x38, 0x41, 0x46, 0x3f, 0x47, 0x4e,
+ 0x3d, 0x46, 0x4d, 0x32, 0x3e, 0x48, 0x3c, 0x49, 0x57, 0x45, 0x4e, 0x5f,
+ 0x40, 0x43, 0x54, 0x39, 0x3c, 0x4b, 0x34, 0x3e, 0x4a, 0x34, 0x45, 0x50,
+ 0x31, 0x4b, 0x6d, 0x36, 0x5c, 0x8e, 0x36, 0x6e, 0xb3, 0x2e, 0x79, 0xcd,
+ 0x24, 0x78, 0xd0, 0x21, 0x72, 0xc0, 0x1b, 0x64, 0xa3, 0x10, 0x51, 0x84,
+ 0x11, 0x46, 0x70, 0x13, 0x46, 0x71, 0x14, 0x46, 0x71, 0x13, 0x46, 0x73,
+ 0x13, 0x44, 0x73, 0x13, 0x40, 0x6f, 0x0e, 0x36, 0x5f, 0x0b, 0x2c, 0x50,
+ 0x0b, 0x28, 0x4a, 0x09, 0x26, 0x46, 0x0b, 0x2a, 0x47, 0x0c, 0x2d, 0x50,
+ 0x0e, 0x2f, 0x5a, 0x0f, 0x2f, 0x5e, 0x0c, 0x2d, 0x5a, 0x09, 0x2a, 0x55,
+ 0x0c, 0x29, 0x59, 0x0e, 0x29, 0x55, 0x13, 0x2b, 0x4f, 0x26, 0x3a, 0x4e,
+ 0x45, 0x4f, 0x4d, 0x5e, 0x62, 0x56, 0x3e, 0x52, 0x53, 0x20, 0x4d, 0x5f,
+ 0x26, 0x66, 0x88, 0x2f, 0x72, 0xa8, 0x1a, 0x50, 0x8e, 0x09, 0x25, 0x53,
+ 0x11, 0x1f, 0x36, 0x1a, 0x37, 0x4a, 0x20, 0x56, 0x7b, 0x2d, 0x76, 0xb1,
+ 0x35, 0x85, 0xd3, 0x28, 0x75, 0xc6, 0x13, 0x48, 0x84, 0x10, 0x2a, 0x45,
+ 0x19, 0x37, 0x4a, 0x1c, 0x51, 0x77, 0x25, 0x5f, 0x95, 0x18, 0x3d, 0x6f,
+ 0x15, 0x26, 0x3a, 0x28, 0x3a, 0x3f, 0x27, 0x4b, 0x6a, 0x15, 0x48, 0x80,
+ 0x1e, 0x53, 0x88, 0x29, 0x5c, 0x96, 0x1d, 0x45, 0x7c, 0x17, 0x31, 0x4a,
+ 0x1d, 0x35, 0x4b, 0x1d, 0x44, 0x66, 0x1d, 0x54, 0x83, 0x2b, 0x68, 0xa3,
+ 0x2c, 0x6f, 0xb6, 0x2a, 0x76, 0xca, 0x2a, 0x7e, 0xd6, 0x2e, 0x82, 0xd9,
+ 0x35, 0x7c, 0xda, 0x26, 0x68, 0xab, 0x14, 0x40, 0x5f, 0x1f, 0x26, 0x35,
+ 0x25, 0x1b, 0x20, 0x1d, 0x1f, 0x16, 0x15, 0x1c, 0x14, 0x0c, 0x10, 0x11,
+ 0x15, 0x18, 0x18, 0x23, 0x25, 0x24, 0x2c, 0x2c, 0x2e, 0x39, 0x3a, 0x3c,
+ 0x20, 0x24, 0x27, 0x18, 0x1d, 0x1f, 0x13, 0x17, 0x1a, 0x10, 0x11, 0x15,
+ 0x12, 0x15, 0x17, 0x19, 0x1e, 0x21, 0x1c, 0x21, 0x24, 0x2f, 0x36, 0x38,
+ 0x1e, 0x26, 0x28, 0x0e, 0x16, 0x17, 0x14, 0x1a, 0x1a, 0x15, 0x1b, 0x1a,
+ 0x11, 0x17, 0x15, 0x04, 0x08, 0x0b, 0x02, 0x03, 0x07, 0x03, 0x02, 0x07,
+ 0x04, 0x02, 0x03, 0x07, 0x05, 0x06, 0x07, 0x06, 0x07, 0x09, 0x09, 0x0b,
+ 0x14, 0x18, 0x17, 0x17, 0x1c, 0x1c, 0x1b, 0x20, 0x20, 0x32, 0x38, 0x36,
+ 0x29, 0x31, 0x2e, 0x49, 0x55, 0x52, 0x65, 0x73, 0x76, 0x68, 0x75, 0x7e,
+ 0x55, 0x5c, 0x6e, 0x2b, 0x34, 0x41, 0x19, 0x25, 0x2b, 0x1d, 0x28, 0x2a,
+ 0x16, 0x20, 0x22, 0x02, 0x09, 0x0b, 0x02, 0x04, 0x06, 0x06, 0x04, 0x05,
+ 0x07, 0x06, 0x06, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x0a, 0x09,
+ 0x0c, 0x0e, 0x0d, 0x19, 0x1a, 0x1b, 0x28, 0x29, 0x2b, 0x3e, 0x3f, 0x40,
+ 0x1f, 0x22, 0x26, 0x21, 0x24, 0x2a, 0x25, 0x28, 0x2f, 0x21, 0x24, 0x29,
+ 0x17, 0x1b, 0x1c, 0x18, 0x1f, 0x1d, 0x24, 0x2d, 0x2c, 0x29, 0x32, 0x33,
+ 0x2a, 0x30, 0x30, 0x2b, 0x30, 0x33, 0x2c, 0x31, 0x35, 0x29, 0x31, 0x34,
+ 0x29, 0x30, 0x33, 0x2b, 0x30, 0x34, 0x2c, 0x30, 0x34, 0x2b, 0x31, 0x34,
+ 0x2a, 0x31, 0x33, 0x29, 0x32, 0x35, 0x2b, 0x30, 0x36, 0x2a, 0x2b, 0x30,
+ 0x0e, 0x0f, 0x11, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x06,
+ 0x09, 0x0d, 0x08, 0x15, 0x19, 0x17, 0x17, 0x19, 0x1c, 0x13, 0x12, 0x18,
+ 0x14, 0x10, 0x13, 0x21, 0x17, 0x14, 0x42, 0x33, 0x28, 0x67, 0x55, 0x45,
+ 0x3c, 0x40, 0x3f, 0x38, 0x3c, 0x3b, 0x34, 0x38, 0x39, 0x30, 0x34, 0x35,
+ 0x30, 0x34, 0x35, 0x30, 0x34, 0x35, 0x2f, 0x34, 0x35, 0x2f, 0x33, 0x34,
+ 0x34, 0x35, 0x38, 0x3c, 0x3e, 0x3c, 0x58, 0x5c, 0x50, 0x73, 0x75, 0x65,
+ 0x77, 0x75, 0x66, 0x61, 0x5e, 0x53, 0x42, 0x42, 0x40, 0x2e, 0x2f, 0x32,
+ 0x28, 0x2b, 0x2f, 0x2b, 0x2f, 0x32, 0x2a, 0x2d, 0x30, 0x27, 0x2a, 0x2f,
+ 0x27, 0x2a, 0x2f, 0x25, 0x28, 0x2d, 0x25, 0x27, 0x2d, 0x25, 0x29, 0x2e,
+ 0x20, 0x28, 0x2a, 0x20, 0x25, 0x2b, 0x23, 0x25, 0x2f, 0x21, 0x22, 0x2b,
+ 0x22, 0x24, 0x2b, 0x1e, 0x26, 0x2e, 0x21, 0x2e, 0x3a, 0x28, 0x38, 0x48,
+ 0x10, 0x18, 0x20, 0x01, 0x05, 0x01, 0x4b, 0x4b, 0x3c, 0x9b, 0x9e, 0x8b,
+ 0x49, 0x4c, 0x46, 0x04, 0x08, 0x0b, 0x15, 0x17, 0x18, 0x25, 0x26, 0x21,
+ 0x14, 0x15, 0x10, 0x10, 0x10, 0x0e, 0x1b, 0x1b, 0x19, 0x15, 0x15, 0x14,
+ 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x0b, 0x0c, 0x0a, 0x0b, 0x0a, 0x0e, 0x07, 0x07, 0x07, 0x0a, 0x0f, 0x10,
+ 0x22, 0x2e, 0x38, 0x4e, 0x62, 0x65, 0x6c, 0x80, 0x77, 0x73, 0x82, 0x7b,
+ 0x6f, 0x7b, 0x7a, 0x66, 0x70, 0x67, 0x4c, 0x5d, 0x5c, 0x3b, 0x54, 0x69,
+ 0x2f, 0x47, 0x5b, 0x20, 0x2b, 0x2d, 0x1a, 0x1c, 0x15, 0x17, 0x1c, 0x18,
+ 0x19, 0x1b, 0x17, 0x1c, 0x1e, 0x19, 0x2d, 0x2f, 0x2a, 0x3f, 0x41, 0x3e,
+ 0x41, 0x44, 0x41, 0x3b, 0x3e, 0x3d, 0x36, 0x3d, 0x3c, 0x34, 0x3d, 0x3c,
+ 0x33, 0x3b, 0x3d, 0x34, 0x3c, 0x3e, 0x37, 0x3f, 0x41, 0x3b, 0x43, 0x45,
+ 0x38, 0x40, 0x42, 0x34, 0x3c, 0x3e, 0x36, 0x3e, 0x40, 0x3a, 0x42, 0x45,
+ 0x3c, 0x41, 0x47, 0x39, 0x3d, 0x43, 0x36, 0x3d, 0x43, 0x39, 0x40, 0x46,
+ 0x3c, 0x43, 0x49, 0x38, 0x40, 0x43, 0x36, 0x3e, 0x40, 0x36, 0x3e, 0x3f,
+ 0x33, 0x3b, 0x3d, 0x34, 0x3b, 0x3f, 0x34, 0x3d, 0x44, 0x34, 0x3c, 0x43,
+ 0x37, 0x3f, 0x42, 0x35, 0x3d, 0x3f, 0x38, 0x3d, 0x40, 0x38, 0x3d, 0x42,
+ 0x37, 0x3e, 0x46, 0x37, 0x3e, 0x46, 0x34, 0x3b, 0x43, 0x33, 0x3a, 0x42,
+ 0x38, 0x3f, 0x47, 0x3b, 0x42, 0x48, 0x38, 0x40, 0x43, 0x35, 0x3d, 0x3f,
+ 0x38, 0x40, 0x44, 0x3a, 0x43, 0x49, 0x37, 0x41, 0x48, 0x38, 0x41, 0x48,
+ 0x36, 0x3e, 0x41, 0x3b, 0x40, 0x43, 0x44, 0x48, 0x4b, 0x44, 0x49, 0x4b,
+ 0x3f, 0x45, 0x43, 0x3d, 0x43, 0x44, 0x3a, 0x3f, 0x44, 0x35, 0x3c, 0x42,
+ 0x34, 0x3c, 0x3f, 0x32, 0x3a, 0x3d, 0x36, 0x3f, 0x43, 0x37, 0x40, 0x47,
+ 0x34, 0x3d, 0x42, 0x34, 0x3d, 0x42, 0x32, 0x3a, 0x40, 0x36, 0x3f, 0x46,
+ 0x41, 0x4a, 0x51, 0x44, 0x4d, 0x54, 0x39, 0x44, 0x49, 0x33, 0x3e, 0x41,
+ 0x34, 0x3e, 0x3e, 0x34, 0x3e, 0x42, 0x37, 0x40, 0x4a, 0x36, 0x3f, 0x46,
+ 0x36, 0x3e, 0x41, 0x37, 0x3f, 0x40, 0x38, 0x3d, 0x41, 0x3b, 0x3f, 0x48,
+ 0x43, 0x47, 0x53, 0x42, 0x46, 0x51, 0x3b, 0x41, 0x4a, 0x35, 0x3c, 0x42,
+ 0x34, 0x3b, 0x41, 0x36, 0x3d, 0x45, 0x3a, 0x43, 0x4c, 0x38, 0x3f, 0x4a,
+ 0x37, 0x3b, 0x47, 0x32, 0x3a, 0x45, 0x35, 0x41, 0x4b, 0x42, 0x4d, 0x55,
+ 0x44, 0x4a, 0x56, 0x33, 0x3e, 0x4f, 0x2d, 0x43, 0x58, 0x34, 0x54, 0x6f,
+ 0x37, 0x67, 0xa0, 0x35, 0x73, 0xb7, 0x2c, 0x7a, 0xc8, 0x25, 0x7b, 0xcb,
+ 0x21, 0x72, 0xba, 0x1c, 0x61, 0x9f, 0x12, 0x4f, 0x84, 0x11, 0x4a, 0x79,
+ 0x16, 0x4a, 0x6d, 0x15, 0x46, 0x6e, 0x17, 0x43, 0x72, 0x16, 0x42, 0x71,
+ 0x12, 0x3e, 0x69, 0x0d, 0x37, 0x5c, 0x0c, 0x2d, 0x54, 0x0c, 0x26, 0x4e,
+ 0x0e, 0x25, 0x4a, 0x0c, 0x26, 0x47, 0x0a, 0x27, 0x45, 0x0d, 0x2b, 0x4c,
+ 0x0e, 0x2d, 0x58, 0x10, 0x2e, 0x5e, 0x0e, 0x2c, 0x5a, 0x0e, 0x2d, 0x59,
+ 0x09, 0x2b, 0x59, 0x0d, 0x28, 0x55, 0x13, 0x28, 0x51, 0x1e, 0x31, 0x4b,
+ 0x23, 0x34, 0x37, 0x26, 0x39, 0x35, 0x1a, 0x3b, 0x4c, 0x1a, 0x51, 0x7c,
+ 0x2b, 0x6d, 0xac, 0x36, 0x78, 0xc4, 0x1f, 0x52, 0x99, 0x0a, 0x25, 0x4d,
+ 0x10, 0x22, 0x2f, 0x17, 0x3c, 0x4a, 0x1f, 0x5b, 0x84, 0x31, 0x77, 0xb9,
+ 0x3b, 0x84, 0xd6, 0x25, 0x6e, 0xbe, 0x0e, 0x41, 0x76, 0x13, 0x2a, 0x3e,
+ 0x1e, 0x3d, 0x4e, 0x23, 0x5d, 0x87, 0x26, 0x5e, 0x99, 0x14, 0x34, 0x64,
+ 0x15, 0x25, 0x39, 0x1c, 0x2c, 0x3f, 0x1c, 0x3b, 0x66, 0x13, 0x41, 0x7b,
+ 0x20, 0x4f, 0x81, 0x28, 0x5b, 0x8a, 0x18, 0x46, 0x70, 0x17, 0x35, 0x4f,
+ 0x21, 0x38, 0x4f, 0x1a, 0x48, 0x6d, 0x1a, 0x5d, 0x94, 0x2f, 0x77, 0xb9,
+ 0x31, 0x7c, 0xcb, 0x2e, 0x7e, 0xd5, 0x2d, 0x7f, 0xd4, 0x33, 0x7c, 0xca,
+ 0x33, 0x60, 0xa2, 0x1f, 0x40, 0x64, 0x16, 0x26, 0x2f, 0x1b, 0x1c, 0x20,
+ 0x1e, 0x1d, 0x1f, 0x1c, 0x1e, 0x1b, 0x13, 0x1a, 0x13, 0x07, 0x0b, 0x0c,
+ 0x06, 0x0a, 0x0b, 0x10, 0x11, 0x13, 0x1c, 0x1e, 0x1d, 0x2c, 0x2e, 0x2d,
+ 0x24, 0x29, 0x27, 0x21, 0x27, 0x27, 0x20, 0x23, 0x26, 0x1e, 0x1d, 0x23,
+ 0x36, 0x3a, 0x3d, 0x3f, 0x44, 0x46, 0x1b, 0x20, 0x23, 0x2d, 0x35, 0x36,
+ 0x19, 0x21, 0x21, 0x0c, 0x12, 0x12, 0x12, 0x17, 0x15, 0x0f, 0x14, 0x10,
+ 0x07, 0x09, 0x06, 0x02, 0x04, 0x03, 0x05, 0x05, 0x07, 0x04, 0x02, 0x05,
+ 0x04, 0x02, 0x03, 0x05, 0x04, 0x03, 0x04, 0x04, 0x04, 0x04, 0x05, 0x07,
+ 0x0a, 0x0c, 0x0c, 0x10, 0x12, 0x14, 0x26, 0x27, 0x2a, 0x27, 0x2b, 0x2c,
+ 0x09, 0x10, 0x0f, 0x29, 0x33, 0x34, 0x61, 0x6c, 0x72, 0x4d, 0x57, 0x61,
+ 0x28, 0x2d, 0x39, 0x1b, 0x20, 0x28, 0x1f, 0x24, 0x26, 0x19, 0x1f, 0x1f,
+ 0x14, 0x18, 0x19, 0x10, 0x11, 0x13, 0x0b, 0x0b, 0x0d, 0x08, 0x07, 0x08,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x07, 0x06, 0x09, 0x0b, 0x0a,
+ 0x15, 0x17, 0x16, 0x1c, 0x1e, 0x1d, 0x24, 0x26, 0x26, 0x2b, 0x2d, 0x2c,
+ 0x1f, 0x22, 0x25, 0x22, 0x25, 0x2b, 0x23, 0x26, 0x2b, 0x1b, 0x1f, 0x22,
+ 0x0b, 0x0f, 0x0e, 0x12, 0x17, 0x13, 0x24, 0x2b, 0x28, 0x28, 0x2e, 0x2f,
+ 0x2b, 0x2f, 0x30, 0x2c, 0x30, 0x32, 0x2a, 0x2f, 0x32, 0x2a, 0x2f, 0x33,
+ 0x2b, 0x30, 0x35, 0x2c, 0x30, 0x35, 0x2b, 0x2e, 0x33, 0x2b, 0x2e, 0x33,
+ 0x2a, 0x34, 0x36, 0x26, 0x2f, 0x31, 0x28, 0x2e, 0x32, 0x28, 0x2c, 0x2f,
+ 0x14, 0x15, 0x17, 0x07, 0x09, 0x08, 0x07, 0x07, 0x08, 0x06, 0x06, 0x0a,
+ 0x0c, 0x0e, 0x0a, 0x12, 0x13, 0x12, 0x15, 0x13, 0x16, 0x1b, 0x15, 0x18,
+ 0x32, 0x25, 0x25, 0x5c, 0x47, 0x3e, 0x83, 0x68, 0x55, 0x9b, 0x7b, 0x62,
+ 0x3d, 0x3f, 0x3e, 0x3a, 0x3c, 0x3b, 0x37, 0x38, 0x3a, 0x31, 0x32, 0x34,
+ 0x30, 0x31, 0x33, 0x31, 0x33, 0x35, 0x30, 0x31, 0x33, 0x34, 0x35, 0x38,
+ 0x44, 0x43, 0x4b, 0x5d, 0x5f, 0x58, 0x72, 0x76, 0x5e, 0x71, 0x74, 0x5b,
+ 0x64, 0x62, 0x57, 0x44, 0x43, 0x44, 0x31, 0x33, 0x36, 0x29, 0x2e, 0x2e,
+ 0x29, 0x2e, 0x30, 0x2a, 0x2f, 0x32, 0x2f, 0x33, 0x36, 0x2e, 0x30, 0x34,
+ 0x29, 0x2c, 0x31, 0x24, 0x27, 0x2c, 0x27, 0x2b, 0x2f, 0x27, 0x2c, 0x2f,
+ 0x23, 0x2b, 0x2a, 0x21, 0x26, 0x2a, 0x23, 0x26, 0x2f, 0x22, 0x22, 0x2a,
+ 0x25, 0x27, 0x2c, 0x21, 0x28, 0x2e, 0x22, 0x2e, 0x39, 0x29, 0x3a, 0x4a,
+ 0x15, 0x1b, 0x23, 0x07, 0x08, 0x07, 0x10, 0x0e, 0x03, 0x50, 0x51, 0x40,
+ 0x56, 0x59, 0x52, 0x0f, 0x14, 0x15, 0x02, 0x05, 0x04, 0x14, 0x16, 0x0c,
+ 0x14, 0x15, 0x10, 0x0f, 0x10, 0x0b, 0x15, 0x15, 0x13, 0x13, 0x13, 0x11,
+ 0x0b, 0x0b, 0x0a, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x08, 0x09, 0x08, 0x07, 0x07, 0x07,
+ 0x0c, 0x0d, 0x0b, 0x0c, 0x0b, 0x0e, 0x08, 0x08, 0x08, 0x07, 0x0a, 0x0b,
+ 0x21, 0x2b, 0x35, 0x57, 0x66, 0x6b, 0x68, 0x77, 0x70, 0x75, 0x81, 0x7b,
+ 0x70, 0x77, 0x78, 0x69, 0x6f, 0x69, 0x4c, 0x59, 0x59, 0x38, 0x51, 0x66,
+ 0x32, 0x4a, 0x62, 0x29, 0x33, 0x39, 0x1e, 0x1f, 0x1b, 0x1a, 0x1e, 0x1f,
+ 0x20, 0x22, 0x23, 0x1e, 0x20, 0x1f, 0x1d, 0x1d, 0x1d, 0x22, 0x22, 0x21,
+ 0x29, 0x2b, 0x27, 0x31, 0x35, 0x30, 0x35, 0x3c, 0x36, 0x36, 0x3f, 0x3a,
+ 0x36, 0x3f, 0x3e, 0x37, 0x40, 0x3f, 0x38, 0x40, 0x40, 0x39, 0x41, 0x43,
+ 0x39, 0x41, 0x43, 0x34, 0x3b, 0x3e, 0x34, 0x3c, 0x3e, 0x37, 0x40, 0x42,
+ 0x38, 0x3f, 0x42, 0x37, 0x3c, 0x40, 0x34, 0x3c, 0x3f, 0x36, 0x3e, 0x41,
+ 0x38, 0x40, 0x42, 0x35, 0x3d, 0x3f, 0x35, 0x3e, 0x3e, 0x33, 0x3c, 0x3c,
+ 0x34, 0x3c, 0x3e, 0x34, 0x3b, 0x3f, 0x36, 0x3e, 0x45, 0x38, 0x40, 0x47,
+ 0x37, 0x3f, 0x42, 0x35, 0x3d, 0x3f, 0x38, 0x3d, 0x40, 0x37, 0x3c, 0x40,
+ 0x35, 0x3f, 0x41, 0x38, 0x41, 0x44, 0x35, 0x3e, 0x43, 0x32, 0x3b, 0x40,
+ 0x35, 0x3e, 0x43, 0x36, 0x40, 0x42, 0x35, 0x41, 0x41, 0x32, 0x3e, 0x3e,
+ 0x31, 0x3c, 0x40, 0x37, 0x41, 0x48, 0x35, 0x3f, 0x47, 0x34, 0x3f, 0x45,
+ 0x35, 0x3f, 0x41, 0x38, 0x3f, 0x41, 0x41, 0x45, 0x48, 0x42, 0x46, 0x49,
+ 0x3e, 0x42, 0x43, 0x3b, 0x40, 0x44, 0x3a, 0x3f, 0x45, 0x37, 0x3b, 0x43,
+ 0x35, 0x3b, 0x41, 0x34, 0x3a, 0x40, 0x35, 0x3c, 0x44, 0x33, 0x3c, 0x45,
+ 0x31, 0x3b, 0x3f, 0x33, 0x3c, 0x41, 0x35, 0x3e, 0x45, 0x35, 0x3e, 0x45,
+ 0x37, 0x40, 0x47, 0x3c, 0x45, 0x4a, 0x37, 0x42, 0x46, 0x34, 0x3f, 0x43,
+ 0x38, 0x41, 0x42, 0x38, 0x41, 0x48, 0x36, 0x3e, 0x49, 0x36, 0x3f, 0x47,
+ 0x35, 0x3c, 0x42, 0x37, 0x3f, 0x42, 0x3c, 0x41, 0x47, 0x3c, 0x3f, 0x4b,
+ 0x3f, 0x43, 0x53, 0x47, 0x4a, 0x58, 0x41, 0x45, 0x50, 0x36, 0x3d, 0x46,
+ 0x35, 0x3b, 0x45, 0x37, 0x3d, 0x48, 0x3b, 0x41, 0x4e, 0x3b, 0x41, 0x4e,
+ 0x37, 0x3b, 0x49, 0x35, 0x3c, 0x46, 0x38, 0x42, 0x47, 0x39, 0x44, 0x44,
+ 0x3b, 0x45, 0x4b, 0x36, 0x48, 0x5b, 0x31, 0x52, 0x72, 0x38, 0x67, 0x93,
+ 0x39, 0x7c, 0xc2, 0x2e, 0x7e, 0xc8, 0x21, 0x7a, 0xc2, 0x17, 0x6e, 0xab,
+ 0x16, 0x61, 0x90, 0x15, 0x50, 0x79, 0x11, 0x46, 0x70, 0x12, 0x46, 0x74,
+ 0x12, 0x4a, 0x6a, 0x13, 0x44, 0x6d, 0x15, 0x3f, 0x71, 0x11, 0x39, 0x68,
+ 0x09, 0x31, 0x56, 0x08, 0x2e, 0x4d, 0x0c, 0x2b, 0x4e, 0x10, 0x27, 0x4f,
+ 0x0f, 0x25, 0x49, 0x0c, 0x24, 0x47, 0x0d, 0x29, 0x47, 0x0b, 0x28, 0x4b,
+ 0x0e, 0x2c, 0x56, 0x11, 0x2e, 0x5d, 0x10, 0x2c, 0x5b, 0x0b, 0x29, 0x54,
+ 0x07, 0x32, 0x55, 0x10, 0x2e, 0x55, 0x10, 0x25, 0x4b, 0x10, 0x21, 0x3b,
+ 0x0f, 0x20, 0x27, 0x13, 0x25, 0x29, 0x16, 0x35, 0x52, 0x29, 0x5b, 0x98,
+ 0x35, 0x79, 0xcb, 0x34, 0x75, 0xcf, 0x1a, 0x48, 0x93, 0x09, 0x21, 0x43,
+ 0x10, 0x27, 0x2a, 0x17, 0x41, 0x4e, 0x20, 0x5f, 0x8b, 0x34, 0x79, 0xc2,
+ 0x3b, 0x80, 0xd5, 0x22, 0x67, 0xb4, 0x0b, 0x3c, 0x6b, 0x15, 0x2c, 0x3c,
+ 0x20, 0x42, 0x54, 0x23, 0x5f, 0x8c, 0x21, 0x58, 0x93, 0x11, 0x2e, 0x5b,
+ 0x0a, 0x2a, 0x28, 0x19, 0x32, 0x3c, 0x1e, 0x3d, 0x60, 0x17, 0x40, 0x6e,
+ 0x24, 0x4d, 0x76, 0x2c, 0x57, 0x7b, 0x1c, 0x3f, 0x65, 0x1c, 0x30, 0x52,
+ 0x21, 0x39, 0x52, 0x1d, 0x51, 0x7b, 0x1d, 0x69, 0xa8, 0x29, 0x7b, 0xc6,
+ 0x2e, 0x80, 0xd5, 0x2f, 0x81, 0xd9, 0x2e, 0x78, 0xc8, 0x21, 0x5b, 0x98,
+ 0x1d, 0x35, 0x4d, 0x21, 0x26, 0x2f, 0x21, 0x1f, 0x20, 0x19, 0x1d, 0x22,
+ 0x17, 0x24, 0x27, 0x1e, 0x26, 0x25, 0x24, 0x24, 0x27, 0x1a, 0x19, 0x24,
+ 0x0c, 0x11, 0x14, 0x07, 0x0b, 0x0c, 0x0f, 0x10, 0x10, 0x11, 0x16, 0x13,
+ 0x14, 0x19, 0x15, 0x19, 0x20, 0x1e, 0x21, 0x23, 0x26, 0x26, 0x25, 0x2b,
+ 0x3b, 0x3f, 0x42, 0x39, 0x3e, 0x40, 0x15, 0x1d, 0x1f, 0x14, 0x1c, 0x1b,
+ 0x13, 0x19, 0x19, 0x11, 0x16, 0x14, 0x0c, 0x11, 0x0d, 0x07, 0x09, 0x06,
+ 0x03, 0x05, 0x01, 0x05, 0x05, 0x03, 0x05, 0x03, 0x04, 0x04, 0x02, 0x03,
+ 0x05, 0x04, 0x03, 0x04, 0x04, 0x02, 0x05, 0x07, 0x05, 0x05, 0x07, 0x06,
+ 0x07, 0x08, 0x05, 0x0d, 0x0d, 0x0f, 0x1f, 0x21, 0x24, 0x1a, 0x1c, 0x20,
+ 0x1a, 0x1e, 0x22, 0x30, 0x37, 0x3d, 0x47, 0x50, 0x5a, 0x2c, 0x35, 0x43,
+ 0x1b, 0x1c, 0x24, 0x19, 0x1a, 0x1e, 0x1d, 0x20, 0x1f, 0x22, 0x23, 0x23,
+ 0x23, 0x23, 0x23, 0x20, 0x1f, 0x21, 0x1b, 0x1a, 0x1c, 0x15, 0x13, 0x14,
+ 0x0b, 0x0b, 0x0d, 0x08, 0x08, 0x0a, 0x09, 0x0b, 0x0a, 0x13, 0x14, 0x14,
+ 0x1c, 0x1d, 0x1d, 0x1a, 0x1c, 0x1b, 0x1c, 0x20, 0x1f, 0x23, 0x27, 0x26,
+ 0x22, 0x27, 0x29, 0x22, 0x25, 0x2a, 0x18, 0x1b, 0x1f, 0x08, 0x0c, 0x0f,
+ 0x04, 0x06, 0x05, 0x0f, 0x14, 0x10, 0x25, 0x2a, 0x27, 0x2f, 0x33, 0x32,
+ 0x2c, 0x2d, 0x2f, 0x29, 0x2c, 0x2e, 0x28, 0x2c, 0x2f, 0x2a, 0x2d, 0x32,
+ 0x29, 0x2d, 0x31, 0x2b, 0x2f, 0x33, 0x2b, 0x2d, 0x32, 0x2f, 0x31, 0x35,
+ 0x27, 0x31, 0x34, 0x25, 0x2d, 0x31, 0x28, 0x2d, 0x32, 0x2b, 0x2f, 0x32,
+ 0x1a, 0x1c, 0x1c, 0x0b, 0x0d, 0x0c, 0x08, 0x09, 0x0a, 0x0a, 0x0b, 0x0f,
+ 0x10, 0x10, 0x15, 0x16, 0x14, 0x17, 0x1b, 0x18, 0x15, 0x3e, 0x32, 0x2a,
+ 0x6a, 0x57, 0x4b, 0x88, 0x6b, 0x59, 0x99, 0x75, 0x5f, 0xa7, 0x7e, 0x68,
+ 0x39, 0x3d, 0x37, 0x39, 0x3b, 0x37, 0x39, 0x3b, 0x38, 0x33, 0x35, 0x34,
+ 0x31, 0x32, 0x34, 0x31, 0x31, 0x33, 0x35, 0x38, 0x3b, 0x45, 0x49, 0x49,
+ 0x64, 0x68, 0x56, 0x70, 0x75, 0x63, 0x6a, 0x6e, 0x61, 0x5b, 0x5d, 0x55,
+ 0x3f, 0x41, 0x40, 0x2f, 0x33, 0x35, 0x2e, 0x32, 0x33, 0x2c, 0x30, 0x31,
+ 0x29, 0x2d, 0x2e, 0x2c, 0x30, 0x32, 0x2e, 0x32, 0x33, 0x2d, 0x30, 0x32,
+ 0x28, 0x2c, 0x2e, 0x26, 0x29, 0x2b, 0x2f, 0x33, 0x34, 0x27, 0x2a, 0x2b,
+ 0x27, 0x29, 0x29, 0x21, 0x25, 0x27, 0x25, 0x29, 0x2c, 0x23, 0x26, 0x2b,
+ 0x22, 0x27, 0x2d, 0x22, 0x2a, 0x34, 0x21, 0x2f, 0x3e, 0x28, 0x39, 0x4b,
+ 0x17, 0x21, 0x26, 0x06, 0x0c, 0x0d, 0x07, 0x09, 0x05, 0x16, 0x16, 0x11,
+ 0x3b, 0x3c, 0x39, 0x21, 0x22, 0x21, 0x03, 0x03, 0x03, 0x08, 0x06, 0x07,
+ 0x0d, 0x0d, 0x0c, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x09,
+ 0x08, 0x08, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x0f, 0x0f,
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x07, 0x09, 0x07, 0x08, 0x0a, 0x07,
+ 0x0d, 0x0c, 0x0c, 0x0f, 0x0e, 0x0c, 0x0a, 0x0a, 0x0a, 0x04, 0x0a, 0x0c,
+ 0x1d, 0x27, 0x2c, 0x67, 0x72, 0x76, 0x66, 0x6e, 0x6c, 0x6b, 0x71, 0x6a,
+ 0x66, 0x74, 0x74, 0x5d, 0x6b, 0x6b, 0x47, 0x56, 0x5a, 0x39, 0x4e, 0x5c,
+ 0x30, 0x4a, 0x5e, 0x24, 0x38, 0x4b, 0x21, 0x24, 0x2f, 0x28, 0x20, 0x22,
+ 0x20, 0x22, 0x1d, 0x1f, 0x22, 0x20, 0x24, 0x27, 0x28, 0x24, 0x28, 0x26,
+ 0x1c, 0x21, 0x1d, 0x1e, 0x22, 0x1f, 0x29, 0x2b, 0x2d, 0x37, 0x38, 0x3f,
+ 0x3d, 0x42, 0x44, 0x40, 0x45, 0x45, 0x3f, 0x43, 0x44, 0x39, 0x3e, 0x3e,
+ 0x37, 0x3d, 0x3e, 0x37, 0x3d, 0x3f, 0x34, 0x3c, 0x3e, 0x36, 0x3f, 0x42,
+ 0x33, 0x3c, 0x40, 0x33, 0x3c, 0x41, 0x35, 0x3f, 0x41, 0x36, 0x40, 0x42,
+ 0x34, 0x3c, 0x3f, 0x34, 0x3c, 0x3e, 0x33, 0x3b, 0x3e, 0x34, 0x3c, 0x3f,
+ 0x35, 0x3b, 0x40, 0x33, 0x3b, 0x3e, 0x36, 0x3f, 0x41, 0x37, 0x41, 0x3e,
+ 0x35, 0x3e, 0x3c, 0x33, 0x3c, 0x3b, 0x37, 0x3c, 0x3f, 0x39, 0x3c, 0x40,
+ 0x38, 0x3d, 0x3c, 0x3a, 0x3f, 0x42, 0x39, 0x3e, 0x44, 0x35, 0x3c, 0x42,
+ 0x33, 0x3b, 0x3e, 0x35, 0x3f, 0x40, 0x35, 0x40, 0x3f, 0x31, 0x3d, 0x3b,
+ 0x32, 0x3b, 0x3d, 0x36, 0x3e, 0x42, 0x37, 0x3f, 0x42, 0x36, 0x3d, 0x43,
+ 0x37, 0x3e, 0x44, 0x39, 0x40, 0x46, 0x3a, 0x41, 0x44, 0x38, 0x40, 0x43,
+ 0x37, 0x3c, 0x42, 0x3a, 0x3e, 0x44, 0x39, 0x3e, 0x42, 0x3a, 0x3f, 0x43,
+ 0x39, 0x3e, 0x42, 0x38, 0x3d, 0x45, 0x38, 0x3c, 0x49, 0x33, 0x37, 0x45,
+ 0x2e, 0x39, 0x3b, 0x31, 0x3c, 0x3e, 0x36, 0x40, 0x45, 0x37, 0x42, 0x47,
+ 0x36, 0x40, 0x45, 0x34, 0x3e, 0x41, 0x35, 0x3d, 0x40, 0x37, 0x3f, 0x42,
+ 0x36, 0x3e, 0x41, 0x39, 0x41, 0x45, 0x36, 0x3e, 0x42, 0x33, 0x3b, 0x3f,
+ 0x34, 0x3b, 0x41, 0x38, 0x3f, 0x47, 0x3b, 0x41, 0x4b, 0x3c, 0x42, 0x4d,
+ 0x37, 0x42, 0x4b, 0x39, 0x45, 0x4b, 0x37, 0x41, 0x44, 0x36, 0x40, 0x43,
+ 0x36, 0x3b, 0x42, 0x37, 0x39, 0x41, 0x39, 0x3e, 0x43, 0x3a, 0x42, 0x46,
+ 0x31, 0x40, 0x4c, 0x35, 0x3e, 0x49, 0x39, 0x40, 0x47, 0x38, 0x41, 0x49,
+ 0x34, 0x48, 0x5a, 0x35, 0x5b, 0x7f, 0x36, 0x70, 0xa5, 0x31, 0x79, 0xbb,
+ 0x23, 0x7d, 0xcb, 0x24, 0x78, 0xc0, 0x21, 0x6b, 0xa7, 0x16, 0x57, 0x89,
+ 0x11, 0x4c, 0x79, 0x12, 0x48, 0x75, 0x10, 0x45, 0x73, 0x11, 0x45, 0x73,
+ 0x10, 0x45, 0x71, 0x12, 0x41, 0x6a, 0x0f, 0x37, 0x5e, 0x0b, 0x2f, 0x55,
+ 0x0a, 0x2a, 0x50, 0x0c, 0x2a, 0x50, 0x0f, 0x2b, 0x50, 0x0e, 0x27, 0x4b,
+ 0x10, 0x24, 0x3f, 0x0c, 0x24, 0x49, 0x0a, 0x28, 0x52, 0x0c, 0x2d, 0x53,
+ 0x14, 0x31, 0x56, 0x12, 0x2d, 0x58, 0x0e, 0x2b, 0x57, 0x0b, 0x2d, 0x53,
+ 0x0e, 0x2f, 0x55, 0x0f, 0x2f, 0x5a, 0x10, 0x2b, 0x4a, 0x12, 0x24, 0x31,
+ 0x0f, 0x1a, 0x25, 0x11, 0x27, 0x34, 0x12, 0x3b, 0x59, 0x2d, 0x68, 0xa1,
+ 0x38, 0x84, 0xce, 0x27, 0x74, 0xc4, 0x0c, 0x42, 0x85, 0x0a, 0x22, 0x42,
+ 0x13, 0x29, 0x33, 0x13, 0x42, 0x59, 0x23, 0x66, 0x95, 0x41, 0x81, 0xc2,
+ 0x42, 0x82, 0xd4, 0x36, 0x62, 0x95, 0x16, 0x37, 0x51, 0x11, 0x33, 0x47,
+ 0x21, 0x4a, 0x6b, 0x27, 0x60, 0x97, 0x1e, 0x53, 0x8a, 0x10, 0x29, 0x49,
+ 0x0f, 0x24, 0x25, 0x1c, 0x33, 0x45, 0x1c, 0x3f, 0x68, 0x12, 0x44, 0x75,
+ 0x1d, 0x4a, 0x79, 0x2b, 0x48, 0x72, 0x1a, 0x35, 0x58, 0x12, 0x36, 0x52,
+ 0x1a, 0x43, 0x74, 0x1f, 0x61, 0xaa, 0x23, 0x77, 0xce, 0x2c, 0x7f, 0xd5,
+ 0x2d, 0x80, 0xd1, 0x28, 0x77, 0xbf, 0x23, 0x57, 0x8b, 0x1c, 0x2e, 0x45,
+ 0x1c, 0x1c, 0x1f, 0x1d, 0x1d, 0x1f, 0x1e, 0x1e, 0x20, 0x17, 0x18, 0x1a,
+ 0x11, 0x13, 0x15, 0x1f, 0x23, 0x24, 0x28, 0x2c, 0x2d, 0x24, 0x28, 0x2a,
+ 0x1c, 0x21, 0x22, 0x16, 0x1a, 0x1c, 0x15, 0x16, 0x1b, 0x10, 0x11, 0x18,
+ 0x0d, 0x0e, 0x13, 0x0e, 0x12, 0x15, 0x18, 0x1c, 0x1d, 0x25, 0x2b, 0x29,
+ 0x20, 0x2a, 0x26, 0x11, 0x1a, 0x17, 0x0d, 0x16, 0x13, 0x10, 0x16, 0x14,
+ 0x13, 0x17, 0x16, 0x0f, 0x11, 0x10, 0x07, 0x07, 0x07, 0x04, 0x05, 0x04,
+ 0x03, 0x04, 0x06, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x03, 0x02,
+ 0x05, 0x04, 0x03, 0x03, 0x03, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x07, 0x05, 0x05, 0x08, 0x08, 0x0a, 0x12, 0x15, 0x18, 0x1f, 0x25, 0x29,
+ 0x2f, 0x36, 0x3c, 0x36, 0x3c, 0x40, 0x30, 0x35, 0x39, 0x39, 0x3e, 0x41,
+ 0x2a, 0x2e, 0x31, 0x13, 0x16, 0x19, 0x16, 0x1a, 0x1c, 0x15, 0x19, 0x1a,
+ 0x1b, 0x1f, 0x20, 0x20, 0x24, 0x23, 0x20, 0x24, 0x23, 0x1f, 0x22, 0x22,
+ 0x1e, 0x22, 0x26, 0x15, 0x18, 0x1c, 0x1b, 0x1a, 0x1e, 0x1f, 0x1b, 0x20,
+ 0x1e, 0x1c, 0x20, 0x24, 0x24, 0x26, 0x30, 0x36, 0x36, 0x24, 0x2c, 0x2b,
+ 0x22, 0x24, 0x26, 0x1a, 0x1b, 0x1b, 0x0b, 0x0d, 0x0c, 0x05, 0x07, 0x06,
+ 0x02, 0x04, 0x03, 0x0e, 0x11, 0x10, 0x25, 0x29, 0x28, 0x2f, 0x33, 0x33,
+ 0x28, 0x2c, 0x2f, 0x2b, 0x2c, 0x30, 0x29, 0x2a, 0x2c, 0x28, 0x2c, 0x2b,
+ 0x25, 0x2d, 0x29, 0x28, 0x30, 0x2e, 0x2a, 0x30, 0x2e, 0x2e, 0x33, 0x32,
+ 0x25, 0x2e, 0x36, 0x24, 0x2e, 0x36, 0x28, 0x31, 0x3a, 0x29, 0x2e, 0x35,
+ 0x1c, 0x20, 0x20, 0x10, 0x12, 0x12, 0x0e, 0x0e, 0x10, 0x12, 0x10, 0x15,
+ 0x15, 0x19, 0x18, 0x20, 0x1b, 0x17, 0x45, 0x32, 0x2a, 0x72, 0x55, 0x4b,
+ 0x83, 0x62, 0x57, 0x88, 0x66, 0x57, 0x8a, 0x66, 0x53, 0x83, 0x5f, 0x4b,
+ 0x3f, 0x42, 0x3c, 0x3b, 0x3d, 0x3c, 0x38, 0x39, 0x3c, 0x34, 0x35, 0x39,
+ 0x34, 0x34, 0x39, 0x39, 0x3b, 0x3b, 0x4e, 0x53, 0x4b, 0x65, 0x6b, 0x5f,
+ 0x71, 0x75, 0x65, 0x67, 0x6b, 0x5e, 0x52, 0x55, 0x4e, 0x3d, 0x3f, 0x3d,
+ 0x2f, 0x33, 0x34, 0x2c, 0x30, 0x34, 0x2e, 0x32, 0x35, 0x2d, 0x31, 0x34,
+ 0x2c, 0x30, 0x31, 0x2e, 0x32, 0x33, 0x2d, 0x31, 0x32, 0x2a, 0x2e, 0x2f,
+ 0x2a, 0x2e, 0x2f, 0x2a, 0x2e, 0x2f, 0x28, 0x2d, 0x2e, 0x25, 0x29, 0x2a,
+ 0x27, 0x28, 0x2a, 0x24, 0x27, 0x2b, 0x24, 0x27, 0x2c, 0x24, 0x28, 0x2c,
+ 0x22, 0x27, 0x2d, 0x21, 0x29, 0x32, 0x1d, 0x2b, 0x39, 0x24, 0x35, 0x46,
+ 0x1b, 0x25, 0x2b, 0x04, 0x0a, 0x0c, 0x07, 0x09, 0x08, 0x09, 0x09, 0x05,
+ 0x1a, 0x1a, 0x18, 0x1f, 0x1f, 0x1f, 0x07, 0x07, 0x07, 0x06, 0x05, 0x06,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x06, 0x06, 0x04,
+ 0x06, 0x06, 0x04, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0f, 0x0f, 0x0f,
+ 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x08, 0x0a, 0x09, 0x0d, 0x0e, 0x0c,
+ 0x0e, 0x0c, 0x0d, 0x0f, 0x0e, 0x0c, 0x0d, 0x0f, 0x0e, 0x07, 0x0d, 0x0f,
+ 0x19, 0x23, 0x28, 0x63, 0x6e, 0x72, 0x68, 0x73, 0x71, 0x5d, 0x64, 0x5d,
+ 0x5e, 0x6c, 0x6c, 0x54, 0x61, 0x65, 0x46, 0x56, 0x5f, 0x37, 0x4d, 0x5d,
+ 0x2b, 0x45, 0x5b, 0x26, 0x3c, 0x4e, 0x2d, 0x34, 0x3b, 0x41, 0x3d, 0x3b,
+ 0x2f, 0x2c, 0x36, 0x1f, 0x21, 0x22, 0x25, 0x28, 0x22, 0x2e, 0x31, 0x2a,
+ 0x24, 0x28, 0x27, 0x1c, 0x1d, 0x1f, 0x1a, 0x1c, 0x19, 0x26, 0x29, 0x20,
+ 0x36, 0x3a, 0x39, 0x45, 0x49, 0x48, 0x47, 0x4b, 0x4a, 0x3e, 0x42, 0x41,
+ 0x37, 0x3b, 0x3a, 0x36, 0x3c, 0x3c, 0x35, 0x3d, 0x3e, 0x39, 0x41, 0x43,
+ 0x35, 0x3f, 0x41, 0x33, 0x3d, 0x3f, 0x34, 0x3e, 0x3f, 0x35, 0x3d, 0x3f,
+ 0x33, 0x3b, 0x3d, 0x34, 0x3c, 0x3e, 0x37, 0x3f, 0x40, 0x37, 0x40, 0x41,
+ 0x36, 0x3c, 0x40, 0x34, 0x3b, 0x3e, 0x38, 0x40, 0x42, 0x35, 0x3e, 0x3d,
+ 0x33, 0x3b, 0x3b, 0x32, 0x39, 0x3b, 0x36, 0x3b, 0x3e, 0x35, 0x39, 0x3d,
+ 0x35, 0x3a, 0x3b, 0x39, 0x3e, 0x42, 0x37, 0x3b, 0x44, 0x36, 0x3c, 0x44,
+ 0x33, 0x3b, 0x40, 0x33, 0x3d, 0x40, 0x33, 0x3d, 0x3f, 0x35, 0x3f, 0x41,
+ 0x35, 0x3d, 0x3f, 0x34, 0x3c, 0x3f, 0x36, 0x3e, 0x41, 0x35, 0x3c, 0x42,
+ 0x35, 0x3c, 0x42, 0x37, 0x3e, 0x44, 0x36, 0x3e, 0x41, 0x35, 0x3d, 0x40,
+ 0x33, 0x3a, 0x40, 0x34, 0x3b, 0x41, 0x32, 0x39, 0x3f, 0x34, 0x3b, 0x41,
+ 0x35, 0x3c, 0x42, 0x38, 0x3f, 0x47, 0x37, 0x3e, 0x48, 0x35, 0x3c, 0x45,
+ 0x34, 0x3d, 0x40, 0x34, 0x3f, 0x41, 0x37, 0x40, 0x45, 0x3e, 0x47, 0x4c,
+ 0x3b, 0x44, 0x47, 0x34, 0x3e, 0x40, 0x32, 0x3c, 0x3e, 0x37, 0x3f, 0x42,
+ 0x35, 0x3d, 0x40, 0x35, 0x3d, 0x40, 0x34, 0x3c, 0x3f, 0x34, 0x3b, 0x41,
+ 0x38, 0x3f, 0x45, 0x37, 0x3e, 0x47, 0x35, 0x3c, 0x46, 0x35, 0x3b, 0x47,
+ 0x33, 0x3c, 0x43, 0x33, 0x3e, 0x42, 0x34, 0x3f, 0x43, 0x36, 0x3f, 0x46,
+ 0x36, 0x3b, 0x45, 0x36, 0x3a, 0x45, 0x36, 0x3d, 0x44, 0x3b, 0x44, 0x4a,
+ 0x38, 0x3f, 0x4e, 0x35, 0x3d, 0x48, 0x33, 0x40, 0x4d, 0x30, 0x46, 0x60,
+ 0x34, 0x58, 0x86, 0x38, 0x6d, 0xac, 0x36, 0x7a, 0xc4, 0x29, 0x78, 0xc4,
+ 0x20, 0x72, 0xb9, 0x1a, 0x66, 0xa5, 0x12, 0x55, 0x8a, 0x0f, 0x4b, 0x78,
+ 0x10, 0x47, 0x72, 0x0f, 0x44, 0x6e, 0x11, 0x41, 0x6c, 0x16, 0x45, 0x6e,
+ 0x14, 0x41, 0x6a, 0x0e, 0x36, 0x5b, 0x0a, 0x2d, 0x4f, 0x09, 0x27, 0x4b,
+ 0x0b, 0x28, 0x4c, 0x0f, 0x2b, 0x4f, 0x10, 0x2a, 0x4d, 0x0e, 0x26, 0x47,
+ 0x0e, 0x26, 0x41, 0x0c, 0x23, 0x43, 0x18, 0x2b, 0x46, 0x2d, 0x3e, 0x4d,
+ 0x32, 0x41, 0x4e, 0x22, 0x34, 0x4e, 0x16, 0x30, 0x54, 0x0e, 0x30, 0x55,
+ 0x0c, 0x2d, 0x53, 0x0d, 0x2c, 0x55, 0x0e, 0x27, 0x43, 0x0f, 0x1f, 0x2a,
+ 0x10, 0x1b, 0x26, 0x13, 0x2a, 0x3a, 0x14, 0x44, 0x62, 0x2c, 0x6d, 0xa6,
+ 0x34, 0x81, 0xcc, 0x27, 0x6e, 0xbd, 0x0d, 0x3c, 0x7b, 0x0f, 0x24, 0x40,
+ 0x1b, 0x2f, 0x3b, 0x19, 0x47, 0x5d, 0x2c, 0x68, 0x93, 0x4d, 0x83, 0xb6,
+ 0x69, 0x85, 0xa6, 0x61, 0x71, 0x89, 0x2d, 0x41, 0x56, 0x14, 0x35, 0x49,
+ 0x22, 0x4e, 0x6b, 0x2a, 0x65, 0x95, 0x18, 0x4d, 0x82, 0x0c, 0x25, 0x47,
+ 0x14, 0x26, 0x33, 0x1c, 0x34, 0x4c, 0x1a, 0x40, 0x6b, 0x17, 0x4c, 0x83,
+ 0x1f, 0x52, 0x87, 0x20, 0x49, 0x76, 0x0f, 0x37, 0x5e, 0x15, 0x49, 0x6f,
+ 0x1d, 0x64, 0xa1, 0x29, 0x79, 0xc7, 0x2c, 0x82, 0xda, 0x2b, 0x7e, 0xd5,
+ 0x2f, 0x71, 0xba, 0x2a, 0x54, 0x85, 0x18, 0x2d, 0x4a, 0x18, 0x1e, 0x2b,
+ 0x1e, 0x1e, 0x20, 0x1f, 0x20, 0x22, 0x1c, 0x1d, 0x1f, 0x0e, 0x10, 0x12,
+ 0x04, 0x07, 0x08, 0x0a, 0x0e, 0x0f, 0x14, 0x18, 0x19, 0x21, 0x25, 0x25,
+ 0x23, 0x28, 0x26, 0x20, 0x24, 0x25, 0x1d, 0x21, 0x24, 0x18, 0x19, 0x1e,
+ 0x18, 0x1b, 0x1e, 0x2e, 0x32, 0x33, 0x21, 0x27, 0x25, 0x1d, 0x26, 0x21,
+ 0x13, 0x1d, 0x19, 0x0d, 0x16, 0x13, 0x0f, 0x15, 0x13, 0x0f, 0x15, 0x13,
+ 0x0d, 0x11, 0x10, 0x06, 0x08, 0x07, 0x06, 0x06, 0x06, 0x05, 0x04, 0x05,
+ 0x08, 0x08, 0x0a, 0x0d, 0x0d, 0x0d, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03,
+ 0x04, 0x04, 0x02, 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x07, 0x07, 0x09, 0x0b, 0x0d, 0x1d, 0x22, 0x25, 0x32, 0x3a, 0x3d,
+ 0x2c, 0x35, 0x38, 0x23, 0x2b, 0x2e, 0x1f, 0x24, 0x27, 0x29, 0x2f, 0x2f,
+ 0x25, 0x29, 0x2a, 0x1c, 0x20, 0x21, 0x0f, 0x13, 0x14, 0x09, 0x0d, 0x0e,
+ 0x0e, 0x12, 0x13, 0x1a, 0x1e, 0x1d, 0x1c, 0x20, 0x1f, 0x1f, 0x23, 0x22,
+ 0x36, 0x3b, 0x3e, 0x28, 0x2c, 0x2f, 0x1e, 0x1f, 0x22, 0x19, 0x19, 0x1c,
+ 0x19, 0x19, 0x1b, 0x3e, 0x3f, 0x41, 0x44, 0x48, 0x4a, 0x22, 0x28, 0x28,
+ 0x1f, 0x21, 0x20, 0x0c, 0x0e, 0x0c, 0x07, 0x08, 0x07, 0x06, 0x08, 0x06,
+ 0x02, 0x04, 0x03, 0x0b, 0x0d, 0x0c, 0x1c, 0x20, 0x1f, 0x25, 0x29, 0x28,
+ 0x26, 0x2a, 0x2c, 0x2c, 0x2d, 0x31, 0x2c, 0x2d, 0x2f, 0x2a, 0x2f, 0x2d,
+ 0x27, 0x30, 0x2d, 0x25, 0x2e, 0x2b, 0x27, 0x2e, 0x2d, 0x2e, 0x32, 0x33,
+ 0x2b, 0x2d, 0x2a, 0x28, 0x2d, 0x2e, 0x29, 0x2d, 0x32, 0x26, 0x29, 0x30,
+ 0x21, 0x23, 0x28, 0x18, 0x14, 0x1a, 0x1c, 0x13, 0x1a, 0x26, 0x1b, 0x22,
+ 0x30, 0x25, 0x25, 0x4f, 0x3c, 0x3a, 0x76, 0x56, 0x51, 0x84, 0x5d, 0x54,
+ 0x79, 0x4f, 0x42, 0x7a, 0x50, 0x41, 0x78, 0x4e, 0x3c, 0x70, 0x46, 0x2f,
+ 0x3e, 0x40, 0x40, 0x3a, 0x3b, 0x3d, 0x37, 0x38, 0x3e, 0x38, 0x39, 0x3e,
+ 0x42, 0x43, 0x45, 0x59, 0x5c, 0x55, 0x65, 0x6b, 0x5c, 0x6a, 0x72, 0x5c,
+ 0x60, 0x65, 0x5c, 0x47, 0x4c, 0x47, 0x37, 0x3b, 0x3a, 0x33, 0x37, 0x38,
+ 0x32, 0x36, 0x39, 0x31, 0x34, 0x39, 0x32, 0x36, 0x3b, 0x30, 0x33, 0x37,
+ 0x2f, 0x33, 0x34, 0x2d, 0x31, 0x32, 0x2e, 0x32, 0x34, 0x2c, 0x30, 0x33,
+ 0x2a, 0x2e, 0x31, 0x2e, 0x32, 0x35, 0x2d, 0x31, 0x34, 0x28, 0x2c, 0x2e,
+ 0x2a, 0x2b, 0x2f, 0x25, 0x28, 0x2d, 0x23, 0x26, 0x2d, 0x25, 0x28, 0x2e,
+ 0x24, 0x29, 0x2e, 0x1d, 0x23, 0x2c, 0x19, 0x25, 0x33, 0x25, 0x36, 0x46,
+ 0x1f, 0x2a, 0x32, 0x07, 0x0e, 0x11, 0x0a, 0x0c, 0x0b, 0x0a, 0x09, 0x07,
+ 0x0c, 0x0c, 0x0a, 0x11, 0x11, 0x11, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x07, 0x07, 0x07, 0x05,
+ 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0f, 0x0e, 0x11, 0x13, 0x13,
+ 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0d, 0x0f, 0x0c, 0x03, 0x09, 0x0a,
+ 0x13, 0x1f, 0x23, 0x54, 0x61, 0x67, 0x71, 0x7c, 0x7c, 0x54, 0x60, 0x5a,
+ 0x53, 0x63, 0x64, 0x4d, 0x5b, 0x62, 0x3f, 0x51, 0x5e, 0x33, 0x4a, 0x5e,
+ 0x2b, 0x44, 0x5b, 0x24, 0x3a, 0x49, 0x3b, 0x44, 0x47, 0x77, 0x76, 0x6e,
+ 0x62, 0x62, 0x59, 0x3f, 0x40, 0x3b, 0x2c, 0x2c, 0x2c, 0x2a, 0x2b, 0x2e,
+ 0x26, 0x28, 0x27, 0x1d, 0x20, 0x1b, 0x16, 0x19, 0x11, 0x21, 0x24, 0x1b,
+ 0x2c, 0x31, 0x2d, 0x35, 0x38, 0x34, 0x3c, 0x3f, 0x3c, 0x41, 0x43, 0x40,
+ 0x3c, 0x41, 0x3d, 0x38, 0x3c, 0x3b, 0x39, 0x3f, 0x3f, 0x3b, 0x40, 0x43,
+ 0x35, 0x3d, 0x3f, 0x33, 0x3b, 0x3d, 0x32, 0x3a, 0x3c, 0x33, 0x3b, 0x3d,
+ 0x33, 0x3b, 0x3d, 0x34, 0x3c, 0x3c, 0x38, 0x41, 0x40, 0x39, 0x41, 0x41,
+ 0x3a, 0x41, 0x40, 0x35, 0x3d, 0x3c, 0x33, 0x3b, 0x3d, 0x35, 0x3d, 0x40,
+ 0x35, 0x3d, 0x40, 0x36, 0x3b, 0x3f, 0x35, 0x3b, 0x3d, 0x33, 0x38, 0x3b,
+ 0x33, 0x3b, 0x3e, 0x34, 0x3b, 0x41, 0x35, 0x3c, 0x46, 0x39, 0x40, 0x4a,
+ 0x37, 0x3e, 0x46, 0x34, 0x3c, 0x41, 0x35, 0x3c, 0x42, 0x3a, 0x41, 0x47,
+ 0x3a, 0x42, 0x45, 0x3a, 0x42, 0x45, 0x38, 0x3f, 0x44, 0x35, 0x3c, 0x42,
+ 0x35, 0x3c, 0x42, 0x36, 0x3d, 0x43, 0x36, 0x3e, 0x41, 0x36, 0x3e, 0x41,
+ 0x35, 0x3e, 0x43, 0x34, 0x3d, 0x42, 0x31, 0x3a, 0x41, 0x34, 0x3d, 0x46,
+ 0x36, 0x3f, 0x46, 0x36, 0x3f, 0x46, 0x38, 0x41, 0x46, 0x37, 0x40, 0x42,
+ 0x36, 0x3e, 0x43, 0x38, 0x3f, 0x45, 0x39, 0x40, 0x44, 0x3a, 0x42, 0x45,
+ 0x37, 0x41, 0x43, 0x34, 0x3f, 0x41, 0x33, 0x3d, 0x3f, 0x32, 0x3c, 0x3e,
+ 0x35, 0x3d, 0x42, 0x34, 0x3d, 0x42, 0x31, 0x3a, 0x3f, 0x31, 0x3a, 0x3f,
+ 0x39, 0x42, 0x49, 0x3a, 0x43, 0x4c, 0x34, 0x3d, 0x46, 0x31, 0x38, 0x43,
+ 0x32, 0x37, 0x3c, 0x33, 0x3b, 0x40, 0x37, 0x41, 0x48, 0x39, 0x42, 0x4b,
+ 0x35, 0x3b, 0x47, 0x33, 0x39, 0x45, 0x36, 0x3e, 0x49, 0x3e, 0x48, 0x51,
+ 0x41, 0x43, 0x51, 0x37, 0x44, 0x51, 0x3b, 0x58, 0x6d, 0x37, 0x63, 0x90,
+ 0x33, 0x6e, 0xb5, 0x30, 0x76, 0xca, 0x28, 0x78, 0xc9, 0x1b, 0x6e, 0xb7,
+ 0x1b, 0x61, 0x9a, 0x13, 0x54, 0x87, 0x11, 0x4c, 0x7a, 0x0f, 0x46, 0x6f,
+ 0x12, 0x45, 0x6e, 0x14, 0x46, 0x6d, 0x15, 0x42, 0x67, 0x12, 0x3c, 0x5f,
+ 0x10, 0x33, 0x54, 0x0e, 0x2c, 0x4c, 0x0b, 0x26, 0x44, 0x0b, 0x26, 0x44,
+ 0x0d, 0x27, 0x48, 0x0f, 0x29, 0x4c, 0x10, 0x28, 0x4a, 0x0e, 0x25, 0x45,
+ 0x0b, 0x26, 0x43, 0x11, 0x26, 0x40, 0x3c, 0x45, 0x4c, 0x64, 0x65, 0x58,
+ 0x66, 0x64, 0x55, 0x48, 0x4e, 0x53, 0x22, 0x38, 0x53, 0x0c, 0x2e, 0x51,
+ 0x0b, 0x2a, 0x51, 0x0e, 0x27, 0x50, 0x0c, 0x21, 0x3c, 0x0c, 0x1b, 0x23,
+ 0x11, 0x1c, 0x27, 0x15, 0x2f, 0x40, 0x17, 0x4c, 0x6b, 0x2b, 0x72, 0xae,
+ 0x31, 0x7f, 0xcf, 0x24, 0x66, 0xb3, 0x10, 0x37, 0x6d, 0x18, 0x29, 0x40,
+ 0x1f, 0x35, 0x41, 0x1d, 0x48, 0x60, 0x31, 0x63, 0x87, 0x54, 0x77, 0x96,
+ 0x7a, 0x7f, 0x75, 0x6c, 0x72, 0x7c, 0x34, 0x4c, 0x6a, 0x13, 0x3c, 0x57,
+ 0x21, 0x53, 0x70, 0x27, 0x61, 0x8f, 0x15, 0x46, 0x79, 0x0b, 0x25, 0x44,
+ 0x11, 0x2a, 0x39, 0x19, 0x39, 0x4c, 0x17, 0x46, 0x6a, 0x25, 0x5f, 0x9b,
+ 0x26, 0x61, 0xa3, 0x1a, 0x50, 0x8d, 0x14, 0x49, 0x85, 0x27, 0x65, 0xa9,
+ 0x27, 0x7f, 0xcb, 0x2b, 0x85, 0xd8, 0x2e, 0x80, 0xd5, 0x2c, 0x6c, 0xb5,
+ 0x26, 0x4d, 0x7b, 0x20, 0x2e, 0x43, 0x1c, 0x1e, 0x25, 0x1e, 0x1e, 0x20,
+ 0x1c, 0x1d, 0x1f, 0x24, 0x24, 0x27, 0x25, 0x26, 0x28, 0x19, 0x1a, 0x1c,
+ 0x0c, 0x10, 0x11, 0x08, 0x0c, 0x0d, 0x08, 0x0c, 0x0d, 0x0f, 0x13, 0x14,
+ 0x15, 0x19, 0x18, 0x1d, 0x21, 0x20, 0x1c, 0x20, 0x20, 0x1a, 0x1e, 0x1f,
+ 0x24, 0x28, 0x29, 0x3f, 0x45, 0x43, 0x24, 0x2d, 0x28, 0x13, 0x1d, 0x16,
+ 0x0f, 0x18, 0x15, 0x13, 0x19, 0x17, 0x0f, 0x14, 0x13, 0x0a, 0x0e, 0x0d,
+ 0x03, 0x05, 0x04, 0x03, 0x05, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x08, 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0a, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05,
+ 0x08, 0x0c, 0x0d, 0x1b, 0x20, 0x23, 0x2e, 0x36, 0x38, 0x35, 0x3d, 0x40,
+ 0x18, 0x20, 0x23, 0x10, 0x18, 0x1a, 0x18, 0x1e, 0x1e, 0x1c, 0x20, 0x21,
+ 0x23, 0x27, 0x26, 0x21, 0x25, 0x24, 0x14, 0x17, 0x16, 0x0d, 0x11, 0x10,
+ 0x09, 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x0c, 0x10, 0x11, 0x15, 0x19, 0x1a,
+ 0x2b, 0x2f, 0x30, 0x25, 0x29, 0x2a, 0x19, 0x1d, 0x1e, 0x16, 0x1c, 0x1c,
+ 0x1c, 0x22, 0x22, 0x31, 0x35, 0x36, 0x28, 0x2c, 0x2d, 0x22, 0x26, 0x27,
+ 0x1d, 0x1f, 0x1e, 0x0d, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x05, 0x04, 0x04,
+ 0x04, 0x05, 0x04, 0x09, 0x0a, 0x09, 0x19, 0x1b, 0x1a, 0x22, 0x26, 0x25,
+ 0x23, 0x27, 0x29, 0x27, 0x29, 0x2b, 0x2b, 0x2c, 0x2e, 0x28, 0x2d, 0x2e,
+ 0x26, 0x2e, 0x30, 0x23, 0x2c, 0x2d, 0x2b, 0x30, 0x33, 0x2c, 0x2f, 0x32,
+ 0x2b, 0x2c, 0x28, 0x2a, 0x2c, 0x29, 0x28, 0x28, 0x2b, 0x28, 0x25, 0x2b,
+ 0x32, 0x2a, 0x2c, 0x3c, 0x2c, 0x2b, 0x51, 0x36, 0x37, 0x64, 0x46, 0x48,
+ 0x74, 0x55, 0x55, 0x8b, 0x67, 0x64, 0x92, 0x68, 0x64, 0x8a, 0x5c, 0x57,
+ 0x7c, 0x4e, 0x49, 0x78, 0x4c, 0x45, 0x7b, 0x50, 0x44, 0x7d, 0x53, 0x44,
+ 0x3e, 0x3f, 0x42, 0x39, 0x3a, 0x3c, 0x3a, 0x3a, 0x3c, 0x4c, 0x4c, 0x4a,
+ 0x62, 0x63, 0x5c, 0x6d, 0x70, 0x65, 0x65, 0x69, 0x5a, 0x59, 0x5f, 0x4e,
+ 0x43, 0x48, 0x44, 0x36, 0x3a, 0x39, 0x34, 0x38, 0x39, 0x38, 0x3c, 0x3e,
+ 0x37, 0x3b, 0x3e, 0x35, 0x39, 0x3c, 0x32, 0x36, 0x39, 0x31, 0x35, 0x37,
+ 0x30, 0x34, 0x35, 0x2f, 0x33, 0x34, 0x2f, 0x33, 0x35, 0x30, 0x34, 0x37,
+ 0x2c, 0x30, 0x33, 0x2c, 0x30, 0x33, 0x2c, 0x30, 0x33, 0x29, 0x2d, 0x30,
+ 0x2a, 0x2b, 0x30, 0x26, 0x29, 0x2f, 0x22, 0x25, 0x2c, 0x24, 0x27, 0x2e,
+ 0x25, 0x28, 0x2e, 0x20, 0x26, 0x2e, 0x1e, 0x2b, 0x37, 0x28, 0x38, 0x49,
+ 0x21, 0x2d, 0x38, 0x09, 0x10, 0x15, 0x0b, 0x0d, 0x0d, 0x0f, 0x0f, 0x0d,
+ 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x09, 0x06, 0x06, 0x04,
+ 0x06, 0x06, 0x04, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0a, 0x0b, 0x0a, 0x0b, 0x0d, 0x0c, 0x12, 0x14, 0x14,
+ 0x0d, 0x0e, 0x10, 0x0a, 0x0a, 0x0a, 0x0d, 0x0f, 0x0c, 0x08, 0x0e, 0x0e,
+ 0x12, 0x1d, 0x23, 0x4b, 0x58, 0x60, 0x62, 0x6f, 0x72, 0x48, 0x55, 0x55,
+ 0x40, 0x51, 0x57, 0x42, 0x54, 0x5e, 0x38, 0x4b, 0x5d, 0x2b, 0x44, 0x5a,
+ 0x29, 0x43, 0x59, 0x23, 0x37, 0x45, 0x2a, 0x34, 0x34, 0x49, 0x4c, 0x3f,
+ 0x6b, 0x6d, 0x49, 0x73, 0x75, 0x5e, 0x57, 0x57, 0x53, 0x47, 0x47, 0x4c,
+ 0x2f, 0x30, 0x34, 0x19, 0x1b, 0x1b, 0x1a, 0x1c, 0x1b, 0x22, 0x22, 0x23,
+ 0x24, 0x27, 0x20, 0x25, 0x28, 0x21, 0x22, 0x24, 0x1f, 0x2a, 0x2c, 0x27,
+ 0x30, 0x32, 0x2f, 0x34, 0x36, 0x35, 0x37, 0x3b, 0x3a, 0x3a, 0x3e, 0x3f,
+ 0x36, 0x3c, 0x3c, 0x35, 0x3c, 0x3e, 0x36, 0x3e, 0x40, 0x35, 0x3d, 0x3f,
+ 0x34, 0x3c, 0x3e, 0x37, 0x3f, 0x41, 0x3a, 0x42, 0x44, 0x38, 0x40, 0x42,
+ 0x38, 0x3e, 0x3c, 0x33, 0x3d, 0x3b, 0x34, 0x3c, 0x3d, 0x35, 0x3b, 0x42,
+ 0x38, 0x3d, 0x43, 0x39, 0x3e, 0x42, 0x37, 0x3c, 0x3f, 0x35, 0x3b, 0x3b,
+ 0x32, 0x3a, 0x3d, 0x31, 0x38, 0x3e, 0x35, 0x3c, 0x44, 0x37, 0x3e, 0x47,
+ 0x37, 0x3e, 0x44, 0x34, 0x3c, 0x3f, 0x36, 0x3d, 0x43, 0x3d, 0x44, 0x49,
+ 0x3f, 0x47, 0x4d, 0x42, 0x49, 0x4f, 0x3e, 0x45, 0x4b, 0x37, 0x3e, 0x44,
+ 0x36, 0x3d, 0x43, 0x36, 0x3d, 0x43, 0x37, 0x3f, 0x42, 0x37, 0x3f, 0x42,
+ 0x39, 0x41, 0x44, 0x3b, 0x43, 0x48, 0x39, 0x3f, 0x49, 0x39, 0x3f, 0x4b,
+ 0x35, 0x3c, 0x46, 0x37, 0x3e, 0x44, 0x3a, 0x43, 0x44, 0x38, 0x41, 0x3f,
+ 0x39, 0x3f, 0x44, 0x3d, 0x42, 0x48, 0x3d, 0x43, 0x47, 0x35, 0x3d, 0x40,
+ 0x34, 0x3c, 0x3f, 0x37, 0x40, 0x43, 0x35, 0x3f, 0x41, 0x33, 0x3d, 0x40,
+ 0x37, 0x40, 0x47, 0x33, 0x3c, 0x42, 0x2e, 0x37, 0x3c, 0x31, 0x3a, 0x3f,
+ 0x34, 0x3d, 0x44, 0x37, 0x40, 0x47, 0x34, 0x3d, 0x46, 0x32, 0x3a, 0x44,
+ 0x34, 0x3a, 0x3d, 0x33, 0x3a, 0x3e, 0x38, 0x41, 0x48, 0x3d, 0x46, 0x4d,
+ 0x3c, 0x43, 0x4b, 0x38, 0x3f, 0x49, 0x35, 0x3c, 0x46, 0x3a, 0x42, 0x4c,
+ 0x38, 0x46, 0x58, 0x36, 0x54, 0x6c, 0x41, 0x72, 0x9a, 0x3a, 0x7e, 0xb9,
+ 0x2a, 0x7b, 0xc6, 0x24, 0x77, 0xc5, 0x1d, 0x6e, 0xb3, 0x0f, 0x5d, 0x96,
+ 0x10, 0x4c, 0x7c, 0x0e, 0x46, 0x73, 0x13, 0x48, 0x72, 0x13, 0x47, 0x70,
+ 0x15, 0x47, 0x6f, 0x15, 0x43, 0x69, 0x15, 0x3e, 0x63, 0x0f, 0x33, 0x55,
+ 0x0b, 0x27, 0x44, 0x0c, 0x25, 0x41, 0x0c, 0x24, 0x40, 0x0b, 0x25, 0x42,
+ 0x0c, 0x27, 0x48, 0x0d, 0x2a, 0x4c, 0x0f, 0x29, 0x4c, 0x0f, 0x27, 0x49,
+ 0x0b, 0x25, 0x47, 0x11, 0x24, 0x3d, 0x54, 0x59, 0x58, 0x8d, 0x8a, 0x71,
+ 0x7c, 0x77, 0x5d, 0x5a, 0x5e, 0x5b, 0x2b, 0x3e, 0x56, 0x0e, 0x2d, 0x4f,
+ 0x0d, 0x2a, 0x4f, 0x0e, 0x25, 0x4e, 0x0b, 0x1d, 0x35, 0x0c, 0x19, 0x20,
+ 0x12, 0x1f, 0x2a, 0x15, 0x33, 0x44, 0x17, 0x4f, 0x71, 0x2b, 0x74, 0xb1,
+ 0x2f, 0x7e, 0xce, 0x20, 0x5e, 0xa6, 0x0f, 0x30, 0x5f, 0x19, 0x2a, 0x3d,
+ 0x1e, 0x37, 0x48, 0x1b, 0x45, 0x60, 0x27, 0x4e, 0x6c, 0x24, 0x3b, 0x49,
+ 0x47, 0x56, 0x4a, 0x47, 0x62, 0x77, 0x20, 0x4d, 0x79, 0x0f, 0x45, 0x69,
+ 0x20, 0x57, 0x7b, 0x26, 0x5a, 0x8e, 0x15, 0x3e, 0x6d, 0x10, 0x2a, 0x42,
+ 0x12, 0x32, 0x45, 0x14, 0x3e, 0x51, 0x17, 0x4f, 0x74, 0x2f, 0x6e, 0xb0,
+ 0x2d, 0x71, 0xbd, 0x20, 0x63, 0xaa, 0x2a, 0x6e, 0xb9, 0x38, 0x7c, 0xd4,
+ 0x37, 0x84, 0xdc, 0x32, 0x81, 0xd6, 0x2e, 0x6b, 0xb1, 0x23, 0x42, 0x69,
+ 0x18, 0x27, 0x35, 0x14, 0x1f, 0x23, 0x1a, 0x22, 0x1f, 0x1c, 0x1d, 0x16,
+ 0x11, 0x12, 0x14, 0x1d, 0x1f, 0x21, 0x25, 0x26, 0x28, 0x22, 0x26, 0x27,
+ 0x20, 0x24, 0x25, 0x1f, 0x23, 0x24, 0x18, 0x1c, 0x1d, 0x15, 0x19, 0x1a,
+ 0x0c, 0x10, 0x10, 0x0f, 0x13, 0x14, 0x13, 0x17, 0x18, 0x21, 0x27, 0x27,
+ 0x2d, 0x33, 0x33, 0x21, 0x2a, 0x27, 0x12, 0x1b, 0x17, 0x0d, 0x18, 0x12,
+ 0x13, 0x19, 0x17, 0x14, 0x1a, 0x18, 0x09, 0x0e, 0x0c, 0x02, 0x05, 0x04,
+ 0x02, 0x04, 0x03, 0x08, 0x0a, 0x09, 0x0b, 0x0c, 0x0c, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x04, 0x05, 0x04, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0b,
+ 0x18, 0x1d, 0x1f, 0x2e, 0x33, 0x36, 0x3b, 0x41, 0x44, 0x2c, 0x31, 0x35,
+ 0x20, 0x25, 0x28, 0x0b, 0x0f, 0x10, 0x0a, 0x0e, 0x0e, 0x14, 0x16, 0x15,
+ 0x1b, 0x1d, 0x1a, 0x1e, 0x20, 0x1d, 0x1e, 0x20, 0x1d, 0x17, 0x19, 0x18,
+ 0x12, 0x14, 0x13, 0x0f, 0x10, 0x12, 0x0e, 0x0f, 0x11, 0x16, 0x17, 0x19,
+ 0x1d, 0x1f, 0x20, 0x1b, 0x1f, 0x20, 0x19, 0x22, 0x21, 0x1c, 0x25, 0x24,
+ 0x1e, 0x26, 0x24, 0x1e, 0x24, 0x22, 0x1d, 0x21, 0x20, 0x24, 0x26, 0x25,
+ 0x26, 0x28, 0x27, 0x12, 0x13, 0x13, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x05, 0x07, 0x06, 0x16, 0x18, 0x17, 0x23, 0x25, 0x24,
+ 0x26, 0x27, 0x29, 0x27, 0x28, 0x2a, 0x29, 0x2b, 0x2e, 0x25, 0x2a, 0x2d,
+ 0x23, 0x2b, 0x2e, 0x25, 0x2d, 0x2f, 0x2c, 0x30, 0x34, 0x2c, 0x2d, 0x31,
+ 0x23, 0x2a, 0x2c, 0x29, 0x2c, 0x2e, 0x39, 0x32, 0x31, 0x4f, 0x3f, 0x39,
+ 0x70, 0x58, 0x4c, 0x8f, 0x6d, 0x5e, 0xa9, 0x81, 0x75, 0xbf, 0x92, 0x88,
+ 0xc9, 0x9a, 0x90, 0xca, 0x9a, 0x8e, 0xc5, 0x93, 0x88, 0xb7, 0x85, 0x7c,
+ 0xa8, 0x77, 0x72, 0x9b, 0x6c, 0x65, 0x98, 0x68, 0x5d, 0x97, 0x66, 0x59,
+ 0x3a, 0x3b, 0x3f, 0x3f, 0x41, 0x3e, 0x54, 0x56, 0x4d, 0x66, 0x68, 0x5b,
+ 0x6e, 0x70, 0x62, 0x63, 0x67, 0x5b, 0x51, 0x53, 0x4c, 0x44, 0x46, 0x43,
+ 0x39, 0x3d, 0x3d, 0x3a, 0x3e, 0x3d, 0x39, 0x3d, 0x3c, 0x3c, 0x40, 0x40,
+ 0x38, 0x3c, 0x3e, 0x38, 0x3d, 0x3c, 0x34, 0x38, 0x37, 0x34, 0x38, 0x37,
+ 0x33, 0x37, 0x38, 0x31, 0x35, 0x36, 0x31, 0x35, 0x36, 0x30, 0x34, 0x37,
+ 0x2d, 0x31, 0x34, 0x29, 0x2d, 0x30, 0x2a, 0x2e, 0x31, 0x2a, 0x2e, 0x32,
+ 0x2a, 0x2b, 0x33, 0x26, 0x29, 0x30, 0x23, 0x26, 0x2d, 0x24, 0x27, 0x2e,
+ 0x23, 0x26, 0x2d, 0x23, 0x29, 0x31, 0x1d, 0x29, 0x35, 0x23, 0x33, 0x43,
+ 0x22, 0x31, 0x3d, 0x09, 0x11, 0x19, 0x0a, 0x0d, 0x0e, 0x13, 0x13, 0x11,
+ 0x12, 0x12, 0x10, 0x0c, 0x0c, 0x0c, 0x05, 0x07, 0x06, 0x05, 0x06, 0x05,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x06, 0x06, 0x04,
+ 0x05, 0x05, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x0a, 0x0a, 0x0a,
+ 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x07, 0x0d, 0x0d, 0x0a, 0x0d, 0x0d, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x07, 0x09, 0x08, 0x07, 0x09, 0x08,
+ 0x0a, 0x0b, 0x0c, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0b, 0x0f, 0x12, 0x13,
+ 0x18, 0x21, 0x28, 0x35, 0x44, 0x4d, 0x3c, 0x4c, 0x52, 0x35, 0x44, 0x47,
+ 0x36, 0x4a, 0x52, 0x33, 0x49, 0x57, 0x30, 0x46, 0x5b, 0x28, 0x40, 0x59,
+ 0x26, 0x3d, 0x52, 0x24, 0x36, 0x41, 0x23, 0x2d, 0x2c, 0x0c, 0x11, 0x05,
+ 0x1e, 0x1e, 0x0b, 0x4d, 0x50, 0x35, 0x6f, 0x72, 0x5a, 0x7f, 0x81, 0x74,
+ 0x58, 0x58, 0x59, 0x29, 0x28, 0x2f, 0x1e, 0x1d, 0x23, 0x1b, 0x1b, 0x1d,
+ 0x1c, 0x1f, 0x18, 0x1c, 0x1f, 0x17, 0x19, 0x1a, 0x14, 0x1c, 0x1d, 0x18,
+ 0x1d, 0x1e, 0x1a, 0x23, 0x25, 0x22, 0x32, 0x34, 0x33, 0x39, 0x3b, 0x3a,
+ 0x37, 0x3d, 0x3d, 0x3a, 0x40, 0x42, 0x3c, 0x41, 0x45, 0x3a, 0x3f, 0x43,
+ 0x36, 0x3d, 0x43, 0x3a, 0x41, 0x47, 0x3b, 0x43, 0x47, 0x39, 0x43, 0x44,
+ 0x35, 0x3d, 0x3b, 0x32, 0x3b, 0x3a, 0x35, 0x3b, 0x3d, 0x35, 0x3a, 0x40,
+ 0x37, 0x3c, 0x42, 0x37, 0x3c, 0x40, 0x38, 0x3d, 0x40, 0x37, 0x3d, 0x3e,
+ 0x32, 0x3a, 0x3b, 0x32, 0x3a, 0x3d, 0x33, 0x3a, 0x40, 0x35, 0x3c, 0x42,
+ 0x35, 0x3d, 0x40, 0x34, 0x3c, 0x3e, 0x35, 0x3d, 0x40, 0x39, 0x41, 0x44,
+ 0x3a, 0x44, 0x48, 0x37, 0x40, 0x45, 0x38, 0x41, 0x46, 0x38, 0x3f, 0x45,
+ 0x38, 0x3f, 0x45, 0x36, 0x3d, 0x43, 0x35, 0x3d, 0x40, 0x35, 0x3d, 0x40,
+ 0x3f, 0x44, 0x47, 0x48, 0x4d, 0x53, 0x46, 0x4a, 0x55, 0x41, 0x45, 0x51,
+ 0x36, 0x3a, 0x45, 0x37, 0x3b, 0x42, 0x3a, 0x40, 0x40, 0x39, 0x40, 0x3e,
+ 0x36, 0x3d, 0x42, 0x3c, 0x42, 0x48, 0x41, 0x46, 0x4a, 0x3e, 0x43, 0x47,
+ 0x39, 0x3f, 0x43, 0x36, 0x3d, 0x41, 0x34, 0x3e, 0x40, 0x33, 0x3e, 0x42,
+ 0x37, 0x40, 0x47, 0x36, 0x3f, 0x46, 0x32, 0x3b, 0x40, 0x32, 0x3b, 0x40,
+ 0x2f, 0x38, 0x3f, 0x31, 0x3a, 0x41, 0x33, 0x3d, 0x44, 0x32, 0x3b, 0x43,
+ 0x32, 0x3b, 0x3d, 0x33, 0x3c, 0x3f, 0x37, 0x40, 0x47, 0x3b, 0x44, 0x49,
+ 0x3d, 0x45, 0x4a, 0x39, 0x41, 0x48, 0x37, 0x40, 0x4c, 0x35, 0x43, 0x53,
+ 0x2e, 0x56, 0x78, 0x34, 0x68, 0x9c, 0x37, 0x7a, 0xbd, 0x2e, 0x7e, 0xc9,
+ 0x21, 0x77, 0xbd, 0x1b, 0x6b, 0xa7, 0x13, 0x59, 0x8c, 0x0a, 0x48, 0x77,
+ 0x0f, 0x44, 0x72, 0x10, 0x43, 0x70, 0x13, 0x44, 0x6f, 0x14, 0x43, 0x6f,
+ 0x15, 0x42, 0x6d, 0x15, 0x3e, 0x68, 0x0d, 0x31, 0x58, 0x08, 0x27, 0x4a,
+ 0x0c, 0x24, 0x40, 0x0c, 0x23, 0x3e, 0x0d, 0x25, 0x41, 0x0d, 0x28, 0x45,
+ 0x0e, 0x2c, 0x4e, 0x0f, 0x2d, 0x51, 0x10, 0x2c, 0x51, 0x0d, 0x27, 0x4a,
+ 0x0a, 0x24, 0x48, 0x0f, 0x21, 0x3c, 0x25, 0x2e, 0x31, 0x56, 0x5a, 0x49,
+ 0x67, 0x6d, 0x5b, 0x45, 0x52, 0x54, 0x21, 0x35, 0x4f, 0x10, 0x2b, 0x4c,
+ 0x0c, 0x29, 0x4b, 0x0f, 0x25, 0x4b, 0x0c, 0x1c, 0x31, 0x0d, 0x1a, 0x20,
+ 0x15, 0x24, 0x2f, 0x15, 0x35, 0x47, 0x1e, 0x56, 0x77, 0x2c, 0x73, 0xad,
+ 0x2e, 0x79, 0xc3, 0x1d, 0x55, 0x97, 0x12, 0x2e, 0x55, 0x18, 0x2d, 0x3b,
+ 0x1d, 0x3b, 0x4d, 0x1e, 0x46, 0x66, 0x18, 0x37, 0x51, 0x09, 0x1a, 0x21,
+ 0x16, 0x31, 0x35, 0x24, 0x52, 0x73, 0x12, 0x4a, 0x77, 0x12, 0x49, 0x6a,
+ 0x25, 0x58, 0x7f, 0x2a, 0x55, 0x8c, 0x15, 0x38, 0x63, 0x12, 0x2f, 0x40,
+ 0x1a, 0x33, 0x4c, 0x16, 0x3c, 0x5a, 0x1e, 0x57, 0x85, 0x33, 0x75, 0xbe,
+ 0x2f, 0x7b, 0xcd, 0x27, 0x7a, 0xc6, 0x2f, 0x82, 0xd1, 0x33, 0x82, 0xd8,
+ 0x38, 0x7b, 0xcf, 0x2f, 0x64, 0xa6, 0x21, 0x3f, 0x64, 0x1a, 0x25, 0x2d,
+ 0x1b, 0x21, 0x1c, 0x17, 0x23, 0x20, 0x1d, 0x26, 0x26, 0x16, 0x18, 0x18,
+ 0x09, 0x0a, 0x0c, 0x07, 0x0b, 0x0c, 0x0f, 0x13, 0x14, 0x1b, 0x1f, 0x20,
+ 0x26, 0x2a, 0x2b, 0x2f, 0x33, 0x34, 0x28, 0x2c, 0x2d, 0x21, 0x25, 0x26,
+ 0x19, 0x1d, 0x20, 0x27, 0x2b, 0x2e, 0x31, 0x35, 0x38, 0x24, 0x29, 0x2c,
+ 0x21, 0x2a, 0x29, 0x10, 0x1a, 0x18, 0x0c, 0x15, 0x13, 0x0e, 0x16, 0x14,
+ 0x10, 0x14, 0x13, 0x09, 0x0d, 0x0c, 0x04, 0x07, 0x06, 0x03, 0x05, 0x04,
+ 0x03, 0x05, 0x04, 0x12, 0x14, 0x13, 0x10, 0x11, 0x11, 0x05, 0x05, 0x05,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03,
+ 0x02, 0x03, 0x02, 0x04, 0x06, 0x05, 0x09, 0x0a, 0x0b, 0x13, 0x15, 0x17,
+ 0x26, 0x2a, 0x2d, 0x27, 0x2b, 0x2e, 0x23, 0x26, 0x2a, 0x26, 0x27, 0x2b,
+ 0x2c, 0x2d, 0x2f, 0x14, 0x14, 0x16, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x11, 0x0e, 0x15, 0x17, 0x14, 0x1e, 0x20, 0x1d, 0x20, 0x22, 0x21,
+ 0x1d, 0x1f, 0x1f, 0x1c, 0x1d, 0x1f, 0x1c, 0x1d, 0x1f, 0x1f, 0x20, 0x22,
+ 0x1c, 0x1e, 0x1d, 0x19, 0x1d, 0x1c, 0x1d, 0x25, 0x23, 0x20, 0x2b, 0x27,
+ 0x1e, 0x27, 0x24, 0x20, 0x27, 0x25, 0x21, 0x24, 0x23, 0x26, 0x26, 0x25,
+ 0x2e, 0x30, 0x2d, 0x12, 0x12, 0x10, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x11, 0x12, 0x10, 0x21, 0x23, 0x20,
+ 0x26, 0x28, 0x27, 0x28, 0x29, 0x2b, 0x27, 0x29, 0x2d, 0x23, 0x28, 0x2c,
+ 0x23, 0x2b, 0x2e, 0x28, 0x2e, 0x31, 0x2b, 0x2d, 0x2e, 0x2b, 0x29, 0x2a,
+ 0x2b, 0x2b, 0x2f, 0x43, 0x3b, 0x3b, 0x60, 0x4d, 0x44, 0x82, 0x62, 0x4f,
+ 0xa3, 0x7d, 0x62, 0xbf, 0x9a, 0x7f, 0xe0, 0xbc, 0xa5, 0xf7, 0xd6, 0xc5,
+ 0xfb, 0xdb, 0xcc, 0xfa, 0xd7, 0xc7, 0xf7, 0xcd, 0xbf, 0xf1, 0xc3, 0xb7,
+ 0xe8, 0xb8, 0xad, 0xda, 0xa8, 0x9a, 0xce, 0x93, 0x81, 0xbf, 0x7f, 0x6a,
+ 0x48, 0x4a, 0x47, 0x5d, 0x5e, 0x57, 0x6c, 0x6e, 0x62, 0x6b, 0x6e, 0x5d,
+ 0x60, 0x62, 0x54, 0x4f, 0x51, 0x48, 0x43, 0x44, 0x44, 0x43, 0x44, 0x48,
+ 0x3e, 0x42, 0x41, 0x3e, 0x42, 0x40, 0x3e, 0x42, 0x41, 0x3d, 0x41, 0x40,
+ 0x3b, 0x40, 0x3c, 0x3a, 0x3f, 0x3b, 0x39, 0x3e, 0x3b, 0x3a, 0x3f, 0x3b,
+ 0x34, 0x38, 0x37, 0x32, 0x36, 0x36, 0x34, 0x38, 0x39, 0x33, 0x37, 0x38,
+ 0x30, 0x34, 0x35, 0x2c, 0x30, 0x33, 0x2b, 0x2f, 0x32, 0x2d, 0x30, 0x33,
+ 0x2e, 0x2f, 0x34, 0x28, 0x2a, 0x31, 0x27, 0x2a, 0x31, 0x25, 0x28, 0x2f,
+ 0x24, 0x27, 0x2c, 0x22, 0x26, 0x2f, 0x1b, 0x25, 0x32, 0x21, 0x31, 0x40,
+ 0x22, 0x32, 0x3f, 0x0c, 0x17, 0x20, 0x0c, 0x0f, 0x12, 0x0f, 0x0f, 0x0d,
+ 0x11, 0x11, 0x0f, 0x0e, 0x0e, 0x0d, 0x07, 0x09, 0x08, 0x05, 0x07, 0x06,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x05,
+ 0x07, 0x07, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x0a, 0x0a, 0x08, 0x0c, 0x0c, 0x0a, 0x0b, 0x0b, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0b, 0x0d, 0x0c, 0x07, 0x08, 0x0a,
+ 0x07, 0x08, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x07, 0x0c, 0x0e, 0x0f,
+ 0x14, 0x1c, 0x24, 0x28, 0x37, 0x42, 0x25, 0x36, 0x40, 0x28, 0x39, 0x41,
+ 0x2f, 0x46, 0x53, 0x28, 0x42, 0x53, 0x29, 0x43, 0x59, 0x25, 0x3d, 0x55,
+ 0x24, 0x38, 0x4b, 0x25, 0x33, 0x3c, 0x26, 0x2f, 0x2f, 0x10, 0x14, 0x0e,
+ 0x04, 0x02, 0x04, 0x08, 0x07, 0x02, 0x29, 0x2c, 0x19, 0x5d, 0x60, 0x49,
+ 0x74, 0x78, 0x63, 0x60, 0x62, 0x58, 0x35, 0x33, 0x34, 0x1b, 0x19, 0x1f,
+ 0x15, 0x17, 0x13, 0x16, 0x18, 0x12, 0x1a, 0x1c, 0x17, 0x1b, 0x1c, 0x17,
+ 0x18, 0x19, 0x15, 0x19, 0x1a, 0x17, 0x22, 0x24, 0x21, 0x2b, 0x2d, 0x2b,
+ 0x38, 0x3c, 0x3b, 0x42, 0x46, 0x46, 0x41, 0x46, 0x48, 0x3c, 0x41, 0x47,
+ 0x38, 0x3f, 0x45, 0x3c, 0x43, 0x49, 0x3b, 0x44, 0x48, 0x38, 0x42, 0x44,
+ 0x38, 0x40, 0x43, 0x34, 0x3c, 0x3e, 0x36, 0x3b, 0x3f, 0x36, 0x3b, 0x3f,
+ 0x36, 0x39, 0x3e, 0x35, 0x3a, 0x3d, 0x35, 0x3b, 0x3c, 0x34, 0x3a, 0x3a,
+ 0x32, 0x3a, 0x39, 0x32, 0x3a, 0x3c, 0x33, 0x3b, 0x3e, 0x33, 0x3b, 0x3e,
+ 0x31, 0x3a, 0x39, 0x32, 0x3b, 0x3b, 0x33, 0x3b, 0x3d, 0x34, 0x3c, 0x3f,
+ 0x33, 0x3b, 0x40, 0x31, 0x3a, 0x3f, 0x33, 0x3c, 0x41, 0x37, 0x40, 0x45,
+ 0x3b, 0x42, 0x48, 0x37, 0x3f, 0x43, 0x33, 0x3b, 0x3d, 0x35, 0x3c, 0x3e,
+ 0x41, 0x46, 0x49, 0x52, 0x57, 0x5b, 0x50, 0x55, 0x5e, 0x43, 0x47, 0x53,
+ 0x37, 0x3a, 0x46, 0x38, 0x3d, 0x43, 0x37, 0x3c, 0x3f, 0x35, 0x3b, 0x3c,
+ 0x31, 0x3a, 0x40, 0x34, 0x3c, 0x42, 0x3f, 0x44, 0x48, 0x41, 0x46, 0x49,
+ 0x3e, 0x43, 0x46, 0x37, 0x3f, 0x42, 0x33, 0x3d, 0x3f, 0x33, 0x3c, 0x41,
+ 0x36, 0x3f, 0x46, 0x36, 0x3f, 0x46, 0x34, 0x3d, 0x42, 0x30, 0x39, 0x3e,
+ 0x32, 0x3b, 0x40, 0x32, 0x3b, 0x40, 0x31, 0x3a, 0x41, 0x34, 0x3d, 0x44,
+ 0x36, 0x40, 0x42, 0x33, 0x3d, 0x42, 0x36, 0x3f, 0x46, 0x38, 0x41, 0x48,
+ 0x39, 0x44, 0x4a, 0x33, 0x42, 0x4f, 0x31, 0x48, 0x60, 0x38, 0x57, 0x78,
+ 0x2f, 0x6f, 0xab, 0x35, 0x7a, 0xc6, 0x2f, 0x79, 0xce, 0x25, 0x72, 0xc2,
+ 0x1a, 0x66, 0xa6, 0x12, 0x55, 0x86, 0x12, 0x49, 0x76, 0x12, 0x40, 0x71,
+ 0x11, 0x44, 0x71, 0x13, 0x44, 0x6f, 0x15, 0x42, 0x6c, 0x15, 0x3e, 0x68,
+ 0x13, 0x3a, 0x65, 0x10, 0x36, 0x5f, 0x0c, 0x2c, 0x52, 0x0b, 0x27, 0x49,
+ 0x0d, 0x24, 0x41, 0x0c, 0x24, 0x3f, 0x0d, 0x27, 0x42, 0x0d, 0x2a, 0x48,
+ 0x0f, 0x2f, 0x53, 0x0d, 0x2d, 0x54, 0x0c, 0x2a, 0x51, 0x0c, 0x26, 0x4c,
+ 0x0c, 0x24, 0x46, 0x0c, 0x20, 0x3d, 0x0d, 0x1b, 0x27, 0x13, 0x1f, 0x1a,
+ 0x2e, 0x3e, 0x3b, 0x2a, 0x3e, 0x4d, 0x18, 0x2f, 0x4d, 0x10, 0x29, 0x49,
+ 0x0e, 0x28, 0x49, 0x0f, 0x23, 0x48, 0x0d, 0x1c, 0x30, 0x0d, 0x19, 0x21,
+ 0x14, 0x25, 0x33, 0x14, 0x34, 0x47, 0x1c, 0x4f, 0x6e, 0x29, 0x68, 0x9b,
+ 0x29, 0x6b, 0xa8, 0x19, 0x49, 0x80, 0x0f, 0x2c, 0x4b, 0x14, 0x2e, 0x38,
+ 0x1d, 0x3b, 0x4d, 0x1e, 0x40, 0x63, 0x13, 0x2d, 0x46, 0x10, 0x1e, 0x22,
+ 0x18, 0x2f, 0x3b, 0x1c, 0x47, 0x68, 0x13, 0x41, 0x64, 0x1a, 0x44, 0x5e,
+ 0x28, 0x53, 0x79, 0x29, 0x4f, 0x83, 0x15, 0x34, 0x5a, 0x15, 0x32, 0x42,
+ 0x21, 0x35, 0x44, 0x19, 0x3e, 0x5b, 0x22, 0x5b, 0x8e, 0x37, 0x7c, 0xc3,
+ 0x2e, 0x7f, 0xd4, 0x29, 0x84, 0xdc, 0x2b, 0x84, 0xd8, 0x2d, 0x7d, 0xce,
+ 0x22, 0x5d, 0x9c, 0x1c, 0x37, 0x57, 0x1e, 0x23, 0x27, 0x1d, 0x23, 0x21,
+ 0x18, 0x22, 0x1e, 0x23, 0x26, 0x21, 0x28, 0x28, 0x29, 0x1c, 0x1e, 0x2a,
+ 0x0e, 0x11, 0x13, 0x06, 0x0a, 0x0b, 0x08, 0x0c, 0x0d, 0x0c, 0x10, 0x11,
+ 0x17, 0x1b, 0x1c, 0x1e, 0x22, 0x23, 0x1e, 0x22, 0x23, 0x1e, 0x22, 0x23,
+ 0x1e, 0x22, 0x26, 0x3a, 0x3f, 0x42, 0x45, 0x4a, 0x4d, 0x1d, 0x25, 0x27,
+ 0x0e, 0x17, 0x16, 0x0c, 0x14, 0x13, 0x10, 0x16, 0x16, 0x0e, 0x13, 0x13,
+ 0x0a, 0x0c, 0x0b, 0x02, 0x04, 0x03, 0x03, 0x05, 0x04, 0x04, 0x06, 0x05,
+ 0x04, 0x05, 0x04, 0x12, 0x14, 0x13, 0x10, 0x10, 0x10, 0x05, 0x05, 0x06,
+ 0x05, 0x05, 0x05, 0x09, 0x09, 0x09, 0x05, 0x05, 0x05, 0x02, 0x04, 0x03,
+ 0x03, 0x05, 0x04, 0x0a, 0x0b, 0x0d, 0x16, 0x17, 0x19, 0x20, 0x22, 0x25,
+ 0x20, 0x21, 0x25, 0x15, 0x16, 0x1a, 0x14, 0x15, 0x19, 0x1a, 0x1a, 0x1c,
+ 0x1f, 0x1f, 0x21, 0x1d, 0x1d, 0x1d, 0x1a, 0x18, 0x19, 0x16, 0x14, 0x15,
+ 0x0c, 0x10, 0x0f, 0x0b, 0x0f, 0x0e, 0x0d, 0x11, 0x10, 0x13, 0x17, 0x16,
+ 0x1d, 0x21, 0x20, 0x25, 0x29, 0x2a, 0x1f, 0x23, 0x24, 0x1c, 0x20, 0x21,
+ 0x1e, 0x20, 0x1f, 0x1a, 0x1e, 0x1d, 0x1c, 0x22, 0x20, 0x1e, 0x24, 0x22,
+ 0x1f, 0x25, 0x21, 0x1f, 0x24, 0x20, 0x20, 0x22, 0x1f, 0x24, 0x24, 0x22,
+ 0x28, 0x28, 0x26, 0x13, 0x13, 0x11, 0x05, 0x05, 0x05, 0x05, 0x04, 0x06,
+ 0x02, 0x02, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x10, 0x0d, 0x1f, 0x21, 0x1e,
+ 0x26, 0x28, 0x25, 0x26, 0x28, 0x29, 0x27, 0x2b, 0x2e, 0x25, 0x2a, 0x2e,
+ 0x26, 0x2b, 0x2f, 0x25, 0x28, 0x29, 0x28, 0x26, 0x25, 0x34, 0x2e, 0x2b,
+ 0x4a, 0x37, 0x33, 0x60, 0x47, 0x3d, 0x77, 0x56, 0x44, 0x93, 0x6c, 0x51,
+ 0xaf, 0x88, 0x68, 0xce, 0xad, 0x8f, 0xf0, 0xd8, 0xbf, 0xff, 0xf7, 0xe4,
+ 0xff, 0xfd, 0xf8, 0xff, 0xfc, 0xf6, 0xff, 0xf8, 0xf3, 0xff, 0xf4, 0xef,
+ 0xff, 0xec, 0xe8, 0xfc, 0xdf, 0xd7, 0xf6, 0xc9, 0xb9, 0xe7, 0xb0, 0x9b,
+ 0x62, 0x64, 0x56, 0x6b, 0x6d, 0x60, 0x68, 0x69, 0x5f, 0x5b, 0x5c, 0x54,
+ 0x4c, 0x4c, 0x47, 0x47, 0x48, 0x43, 0x49, 0x4a, 0x47, 0x46, 0x48, 0x47,
+ 0x41, 0x45, 0x44, 0x41, 0x45, 0x44, 0x41, 0x45, 0x44, 0x40, 0x44, 0x42,
+ 0x3f, 0x41, 0x3e, 0x3e, 0x40, 0x3d, 0x3c, 0x3e, 0x3d, 0x3c, 0x3e, 0x3d,
+ 0x36, 0x3b, 0x38, 0x35, 0x39, 0x37, 0x35, 0x39, 0x38, 0x32, 0x36, 0x35,
+ 0x31, 0x35, 0x36, 0x30, 0x34, 0x35, 0x2f, 0x33, 0x35, 0x2e, 0x32, 0x35,
+ 0x2b, 0x2e, 0x32, 0x2b, 0x2e, 0x33, 0x2a, 0x2d, 0x33, 0x26, 0x29, 0x2e,
+ 0x25, 0x28, 0x2d, 0x25, 0x2a, 0x32, 0x21, 0x2a, 0x37, 0x23, 0x31, 0x41,
+ 0x24, 0x34, 0x43, 0x13, 0x1d, 0x28, 0x14, 0x17, 0x1a, 0x0d, 0x0d, 0x0b,
+ 0x0c, 0x0c, 0x0a, 0x0e, 0x0e, 0x0e, 0x05, 0x07, 0x06, 0x03, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08,
+ 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x09, 0x0a,
+ 0x0a, 0x0a, 0x09, 0x0a, 0x0a, 0x08, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0d, 0x0e, 0x10, 0x0d, 0x0e, 0x10,
+ 0x09, 0x0a, 0x0e, 0x0a, 0x0a, 0x0a, 0x0c, 0x0a, 0x07, 0x0a, 0x0a, 0x0c,
+ 0x11, 0x18, 0x20, 0x26, 0x32, 0x40, 0x26, 0x36, 0x43, 0x20, 0x32, 0x3c,
+ 0x25, 0x3e, 0x4f, 0x21, 0x3e, 0x52, 0x24, 0x41, 0x57, 0x1f, 0x3a, 0x4f,
+ 0x1c, 0x30, 0x40, 0x21, 0x2c, 0x34, 0x22, 0x28, 0x29, 0x12, 0x14, 0x11,
+ 0x06, 0x05, 0x0b, 0x08, 0x08, 0x0d, 0x11, 0x13, 0x0f, 0x1b, 0x1f, 0x0e,
+ 0x3e, 0x42, 0x2a, 0x67, 0x6a, 0x52, 0x62, 0x61, 0x56, 0x44, 0x41, 0x41,
+ 0x17, 0x1b, 0x1a, 0x0f, 0x11, 0x0f, 0x13, 0x15, 0x12, 0x16, 0x16, 0x14,
+ 0x1b, 0x1c, 0x17, 0x1a, 0x1b, 0x18, 0x1c, 0x1e, 0x1b, 0x1f, 0x21, 0x1e,
+ 0x34, 0x36, 0x31, 0x53, 0x57, 0x54, 0x54, 0x58, 0x5a, 0x47, 0x4c, 0x50,
+ 0x3d, 0x45, 0x48, 0x3a, 0x42, 0x45, 0x37, 0x41, 0x43, 0x38, 0x42, 0x43,
+ 0x3b, 0x42, 0x48, 0x38, 0x40, 0x44, 0x35, 0x3a, 0x3e, 0x39, 0x3d, 0x3f,
+ 0x39, 0x3c, 0x3e, 0x36, 0x3a, 0x3b, 0x33, 0x39, 0x39, 0x35, 0x3b, 0x3b,
+ 0x35, 0x3a, 0x3c, 0x32, 0x37, 0x3b, 0x34, 0x39, 0x3d, 0x30, 0x38, 0x3b,
+ 0x31, 0x3a, 0x3a, 0x32, 0x3c, 0x3b, 0x33, 0x3d, 0x3e, 0x35, 0x3f, 0x41,
+ 0x31, 0x3b, 0x3d, 0x33, 0x3d, 0x3f, 0x35, 0x3f, 0x41, 0x39, 0x43, 0x45,
+ 0x3d, 0x45, 0x48, 0x3c, 0x43, 0x46, 0x34, 0x3c, 0x3e, 0x31, 0x3a, 0x39,
+ 0x39, 0x3f, 0x3f, 0x45, 0x4a, 0x4d, 0x49, 0x4f, 0x53, 0x3d, 0x43, 0x49,
+ 0x37, 0x3c, 0x44, 0x39, 0x3f, 0x45, 0x35, 0x3a, 0x40, 0x33, 0x39, 0x3d,
+ 0x30, 0x3b, 0x41, 0x31, 0x3b, 0x40, 0x36, 0x3e, 0x41, 0x3c, 0x41, 0x44,
+ 0x3d, 0x42, 0x45, 0x34, 0x3c, 0x3f, 0x32, 0x3c, 0x3e, 0x33, 0x3c, 0x41,
+ 0x33, 0x3c, 0x43, 0x33, 0x3c, 0x43, 0x33, 0x3b, 0x41, 0x30, 0x39, 0x3e,
+ 0x31, 0x3b, 0x3e, 0x31, 0x3a, 0x3e, 0x33, 0x3c, 0x40, 0x36, 0x3f, 0x43,
+ 0x37, 0x40, 0x45, 0x33, 0x3b, 0x44, 0x31, 0x3a, 0x44, 0x37, 0x3f, 0x4b,
+ 0x35, 0x46, 0x53, 0x32, 0x4f, 0x67, 0x39, 0x62, 0x8d, 0x3a, 0x70, 0xa9,
+ 0x2c, 0x7c, 0xc4, 0x29, 0x78, 0xc2, 0x26, 0x70, 0xb9, 0x1d, 0x61, 0xa1,
+ 0x12, 0x51, 0x83, 0x10, 0x47, 0x72, 0x18, 0x46, 0x74, 0x18, 0x42, 0x74,
+ 0x11, 0x43, 0x6e, 0x12, 0x41, 0x6a, 0x13, 0x3c, 0x62, 0x14, 0x37, 0x5c,
+ 0x0f, 0x2f, 0x54, 0x0c, 0x2a, 0x4e, 0x0f, 0x2a, 0x4b, 0x0e, 0x26, 0x46,
+ 0x0e, 0x23, 0x42, 0x0c, 0x23, 0x3f, 0x0c, 0x26, 0x42, 0x0d, 0x2b, 0x4a,
+ 0x0c, 0x2d, 0x51, 0x0f, 0x2f, 0x55, 0x10, 0x2c, 0x51, 0x0e, 0x26, 0x49,
+ 0x0d, 0x27, 0x46, 0x0b, 0x1e, 0x3b, 0x0e, 0x1a, 0x2a, 0x0f, 0x1d, 0x1f,
+ 0x16, 0x27, 0x2c, 0x1b, 0x32, 0x48, 0x14, 0x2f, 0x4e, 0x0b, 0x29, 0x45,
+ 0x0d, 0x28, 0x46, 0x0a, 0x1e, 0x42, 0x0a, 0x1a, 0x2f, 0x0f, 0x1e, 0x25,
+ 0x17, 0x2a, 0x38, 0x17, 0x36, 0x49, 0x17, 0x43, 0x60, 0x1f, 0x54, 0x83,
+ 0x22, 0x5a, 0x85, 0x14, 0x3c, 0x65, 0x0d, 0x2a, 0x40, 0x15, 0x31, 0x35,
+ 0x20, 0x3f, 0x4f, 0x1e, 0x3b, 0x5d, 0x11, 0x26, 0x41, 0x12, 0x21, 0x22,
+ 0x19, 0x2c, 0x39, 0x18, 0x3d, 0x5b, 0x13, 0x39, 0x59, 0x20, 0x43, 0x5e,
+ 0x25, 0x4f, 0x71, 0x1e, 0x47, 0x6b, 0x17, 0x33, 0x4c, 0x1b, 0x35, 0x45,
+ 0x1a, 0x39, 0x4a, 0x17, 0x47, 0x6d, 0x28, 0x68, 0xa6, 0x36, 0x7d, 0xc7,
+ 0x31, 0x7f, 0xd2, 0x32, 0x84, 0xde, 0x30, 0x79, 0xc6, 0x24, 0x5b, 0x94,
+ 0x14, 0x37, 0x51, 0x1d, 0x27, 0x2c, 0x25, 0x21, 0x1e, 0x1f, 0x25, 0x26,
+ 0x11, 0x1b, 0x1d, 0x1c, 0x1c, 0x17, 0x28, 0x25, 0x23, 0x22, 0x25, 0x2d,
+ 0x20, 0x24, 0x26, 0x19, 0x1d, 0x1e, 0x19, 0x1d, 0x1e, 0x11, 0x15, 0x16,
+ 0x0a, 0x0e, 0x0f, 0x0a, 0x0e, 0x0f, 0x10, 0x14, 0x15, 0x1d, 0x21, 0x22,
+ 0x29, 0x2e, 0x30, 0x26, 0x2c, 0x2c, 0x1a, 0x23, 0x22, 0x11, 0x1a, 0x19,
+ 0x12, 0x18, 0x17, 0x12, 0x18, 0x16, 0x0e, 0x12, 0x11, 0x08, 0x0a, 0x09,
+ 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d,
+ 0x04, 0x04, 0x04, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0c, 0x04, 0x06, 0x05,
+ 0x04, 0x04, 0x04, 0x08, 0x07, 0x07, 0x05, 0x05, 0x05, 0x04, 0x06, 0x05,
+ 0x0c, 0x0d, 0x0d, 0x1b, 0x1c, 0x1e, 0x25, 0x28, 0x2b, 0x24, 0x28, 0x2b,
+ 0x2b, 0x2c, 0x30, 0x20, 0x21, 0x25, 0x0b, 0x0c, 0x0e, 0x0f, 0x0f, 0x11,
+ 0x13, 0x13, 0x15, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x20, 0x19, 0x1a, 0x1c,
+ 0x14, 0x18, 0x19, 0x10, 0x14, 0x15, 0x0c, 0x10, 0x11, 0x0f, 0x13, 0x14,
+ 0x1c, 0x20, 0x21, 0x1f, 0x24, 0x23, 0x1e, 0x22, 0x21, 0x1d, 0x21, 0x1f,
+ 0x1e, 0x23, 0x20, 0x1e, 0x22, 0x1f, 0x1c, 0x21, 0x1d, 0x1f, 0x21, 0x1e,
+ 0x1f, 0x21, 0x1e, 0x21, 0x23, 0x20, 0x23, 0x23, 0x21, 0x24, 0x24, 0x21,
+ 0x24, 0x25, 0x20, 0x19, 0x19, 0x17, 0x07, 0x07, 0x07, 0x04, 0x02, 0x05,
+ 0x03, 0x01, 0x04, 0x04, 0x04, 0x04, 0x0c, 0x0c, 0x0a, 0x1c, 0x1f, 0x19,
+ 0x23, 0x27, 0x23, 0x25, 0x27, 0x26, 0x23, 0x27, 0x2b, 0x26, 0x29, 0x2e,
+ 0x25, 0x29, 0x2c, 0x26, 0x27, 0x27, 0x29, 0x25, 0x20, 0x41, 0x35, 0x30,
+ 0x5a, 0x3b, 0x31, 0x65, 0x42, 0x36, 0x74, 0x51, 0x40, 0x83, 0x5f, 0x46,
+ 0x97, 0x76, 0x59, 0xb2, 0x97, 0x78, 0xd7, 0xc1, 0xa4, 0xf2, 0xe0, 0xc7,
+ 0xfa, 0xf9, 0xf0, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfe, 0xfc, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xfb, 0xff, 0xf4, 0xed, 0xfb, 0xe3, 0xd9,
+ 0x6a, 0x6d, 0x59, 0x60, 0x62, 0x53, 0x4e, 0x4f, 0x48, 0x4a, 0x49, 0x49,
+ 0x48, 0x47, 0x49, 0x49, 0x4a, 0x4a, 0x49, 0x4b, 0x45, 0x46, 0x49, 0x40,
+ 0x45, 0x49, 0x49, 0x43, 0x47, 0x48, 0x43, 0x47, 0x45, 0x43, 0x45, 0x44,
+ 0x41, 0x43, 0x42, 0x41, 0x43, 0x41, 0x3d, 0x3f, 0x3e, 0x3c, 0x3d, 0x3f,
+ 0x3c, 0x40, 0x3c, 0x3b, 0x3f, 0x3c, 0x37, 0x3b, 0x39, 0x36, 0x3a, 0x39,
+ 0x35, 0x39, 0x3a, 0x35, 0x39, 0x3a, 0x31, 0x35, 0x38, 0x2e, 0x32, 0x35,
+ 0x2c, 0x30, 0x32, 0x2b, 0x2f, 0x32, 0x2c, 0x2f, 0x34, 0x2a, 0x2d, 0x32,
+ 0x28, 0x2b, 0x30, 0x27, 0x2c, 0x34, 0x24, 0x2e, 0x3b, 0x21, 0x2f, 0x3f,
+ 0x23, 0x34, 0x44, 0x13, 0x1e, 0x29, 0x0b, 0x0e, 0x11, 0x0c, 0x0c, 0x0a,
+ 0x0c, 0x0b, 0x09, 0x0c, 0x0c, 0x0c, 0x04, 0x06, 0x05, 0x03, 0x04, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x0e, 0x0e, 0x0e, 0x12, 0x12, 0x10,
+ 0x0e, 0x0e, 0x0c, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0a, 0x0b, 0x0a,
+ 0x0d, 0x0d, 0x0c, 0x0b, 0x0c, 0x09, 0x0a, 0x0a, 0x09, 0x0d, 0x0d, 0x0d,
+ 0x12, 0x12, 0x12, 0x19, 0x19, 0x19, 0x17, 0x18, 0x1a, 0x11, 0x12, 0x15,
+ 0x0c, 0x0c, 0x10, 0x0d, 0x0c, 0x0d, 0x0d, 0x0c, 0x08, 0x0c, 0x0c, 0x0d,
+ 0x19, 0x20, 0x27, 0x26, 0x32, 0x3f, 0x2a, 0x3a, 0x49, 0x21, 0x33, 0x40,
+ 0x22, 0x3c, 0x4f, 0x21, 0x3f, 0x55, 0x1f, 0x3e, 0x53, 0x1e, 0x38, 0x4b,
+ 0x19, 0x2b, 0x36, 0x1e, 0x27, 0x2e, 0x1e, 0x21, 0x24, 0x12, 0x12, 0x14,
+ 0x07, 0x08, 0x0b, 0x0f, 0x11, 0x0e, 0x17, 0x1a, 0x14, 0x15, 0x18, 0x11,
+ 0x14, 0x15, 0x0e, 0x28, 0x29, 0x20, 0x43, 0x41, 0x32, 0x51, 0x50, 0x3f,
+ 0x2b, 0x2f, 0x2e, 0x11, 0x14, 0x13, 0x14, 0x16, 0x15, 0x19, 0x1a, 0x18,
+ 0x1d, 0x1e, 0x1b, 0x1d, 0x1f, 0x1c, 0x1e, 0x20, 0x1c, 0x1e, 0x20, 0x1c,
+ 0x2a, 0x2c, 0x24, 0x59, 0x5c, 0x56, 0x61, 0x65, 0x62, 0x55, 0x5a, 0x5a,
+ 0x44, 0x4a, 0x4d, 0x39, 0x41, 0x43, 0x35, 0x3e, 0x3e, 0x38, 0x42, 0x42,
+ 0x3b, 0x42, 0x4b, 0x3a, 0x41, 0x47, 0x38, 0x3c, 0x40, 0x38, 0x3c, 0x3d,
+ 0x39, 0x3d, 0x3c, 0x37, 0x3c, 0x3b, 0x35, 0x3b, 0x3c, 0x36, 0x3c, 0x3e,
+ 0x36, 0x39, 0x3e, 0x33, 0x38, 0x3c, 0x34, 0x38, 0x3e, 0x32, 0x3a, 0x3d,
+ 0x31, 0x3a, 0x3b, 0x33, 0x3d, 0x3e, 0x35, 0x3f, 0x41, 0x33, 0x3e, 0x42,
+ 0x30, 0x3a, 0x3c, 0x31, 0x3b, 0x3e, 0x34, 0x3e, 0x40, 0x38, 0x42, 0x44,
+ 0x39, 0x42, 0x44, 0x37, 0x3e, 0x41, 0x33, 0x3b, 0x3b, 0x31, 0x3a, 0x39,
+ 0x30, 0x39, 0x38, 0x34, 0x3d, 0x3c, 0x39, 0x41, 0x43, 0x37, 0x3e, 0x42,
+ 0x36, 0x3d, 0x43, 0x37, 0x3e, 0x45, 0x35, 0x3c, 0x43, 0x34, 0x3b, 0x43,
+ 0x30, 0x3d, 0x43, 0x31, 0x3b, 0x3f, 0x31, 0x3a, 0x3d, 0x37, 0x3d, 0x40,
+ 0x3a, 0x3f, 0x42, 0x38, 0x40, 0x42, 0x36, 0x3d, 0x43, 0x35, 0x3e, 0x43,
+ 0x35, 0x3c, 0x44, 0x33, 0x3a, 0x42, 0x32, 0x3a, 0x3f, 0x34, 0x3c, 0x3f,
+ 0x34, 0x3c, 0x3f, 0x33, 0x3b, 0x3f, 0x35, 0x3e, 0x41, 0x37, 0x3f, 0x42,
+ 0x37, 0x40, 0x44, 0x35, 0x3d, 0x48, 0x32, 0x3a, 0x49, 0x36, 0x42, 0x53,
+ 0x3a, 0x51, 0x68, 0x40, 0x69, 0x8e, 0x46, 0x80, 0xbc, 0x36, 0x7f, 0xca,
+ 0x25, 0x7b, 0xc0, 0x23, 0x74, 0xb1, 0x19, 0x60, 0x92, 0x10, 0x4c, 0x76,
+ 0x0f, 0x44, 0x6b, 0x16, 0x45, 0x6d, 0x17, 0x43, 0x70, 0x16, 0x43, 0x72,
+ 0x11, 0x43, 0x6b, 0x10, 0x3e, 0x62, 0x0d, 0x33, 0x55, 0x0e, 0x2d, 0x4c,
+ 0x0c, 0x29, 0x49, 0x0e, 0x28, 0x47, 0x10, 0x28, 0x45, 0x0e, 0x24, 0x40,
+ 0x0e, 0x23, 0x42, 0x0e, 0x23, 0x40, 0x0c, 0x26, 0x43, 0x0d, 0x2b, 0x49,
+ 0x0a, 0x2b, 0x4d, 0x0b, 0x2a, 0x4f, 0x0d, 0x27, 0x4b, 0x12, 0x27, 0x48,
+ 0x0a, 0x26, 0x45, 0x08, 0x1c, 0x38, 0x0f, 0x18, 0x28, 0x12, 0x1b, 0x20,
+ 0x16, 0x25, 0x2f, 0x18, 0x2f, 0x47, 0x13, 0x30, 0x4e, 0x0b, 0x2b, 0x44,
+ 0x0c, 0x26, 0x46, 0x09, 0x1d, 0x40, 0x0a, 0x1b, 0x2f, 0x11, 0x21, 0x2b,
+ 0x1a, 0x2d, 0x3e, 0x19, 0x36, 0x4a, 0x19, 0x3f, 0x5b, 0x1c, 0x47, 0x70,
+ 0x20, 0x4b, 0x6a, 0x15, 0x35, 0x54, 0x0f, 0x27, 0x39, 0x14, 0x30, 0x31,
+ 0x22, 0x41, 0x4e, 0x21, 0x38, 0x5b, 0x10, 0x22, 0x3c, 0x11, 0x23, 0x24,
+ 0x19, 0x30, 0x3c, 0x14, 0x3a, 0x5b, 0x13, 0x3a, 0x62, 0x1d, 0x42, 0x64,
+ 0x1c, 0x4b, 0x6c, 0x15, 0x42, 0x5b, 0x17, 0x33, 0x41, 0x22, 0x38, 0x4a,
+ 0x1b, 0x4b, 0x71, 0x21, 0x61, 0xa3, 0x30, 0x7b, 0xcd, 0x33, 0x81, 0xcf,
+ 0x33, 0x7f, 0xca, 0x36, 0x79, 0xc2, 0x2c, 0x5c, 0x8e, 0x1e, 0x37, 0x47,
+ 0x22, 0x29, 0x28, 0x1f, 0x21, 0x22, 0x23, 0x22, 0x25, 0x1c, 0x1d, 0x24,
+ 0x0c, 0x0f, 0x13, 0x06, 0x0b, 0x07, 0x10, 0x16, 0x0f, 0x17, 0x1f, 0x1b,
+ 0x23, 0x28, 0x29, 0x28, 0x2c, 0x2d, 0x23, 0x27, 0x28, 0x1c, 0x20, 0x21,
+ 0x18, 0x1b, 0x1c, 0x1b, 0x1f, 0x20, 0x2f, 0x33, 0x34, 0x2d, 0x31, 0x32,
+ 0x27, 0x2d, 0x2d, 0x16, 0x1d, 0x1b, 0x10, 0x19, 0x16, 0x10, 0x19, 0x14,
+ 0x11, 0x17, 0x13, 0x0f, 0x13, 0x10, 0x06, 0x09, 0x06, 0x04, 0x05, 0x03,
+ 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x1a, 0x1a, 0x1a, 0x0d, 0x0d, 0x0d,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x0a, 0x0c, 0x0b, 0x03, 0x05, 0x04,
+ 0x03, 0x04, 0x03, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x0a, 0x0d, 0x0c,
+ 0x18, 0x19, 0x19, 0x27, 0x29, 0x2a, 0x26, 0x2a, 0x2d, 0x1c, 0x20, 0x22,
+ 0x29, 0x2d, 0x2e, 0x24, 0x27, 0x29, 0x11, 0x12, 0x14, 0x13, 0x15, 0x14,
+ 0x0e, 0x0f, 0x0f, 0x10, 0x13, 0x14, 0x14, 0x17, 0x18, 0x19, 0x1d, 0x1e,
+ 0x1a, 0x1e, 0x21, 0x18, 0x1c, 0x1e, 0x16, 0x1a, 0x1d, 0x18, 0x1c, 0x1e,
+ 0x1d, 0x21, 0x21, 0x1a, 0x1e, 0x1d, 0x1c, 0x1f, 0x1e, 0x1e, 0x22, 0x21,
+ 0x1e, 0x22, 0x1f, 0x1e, 0x22, 0x1e, 0x21, 0x24, 0x21, 0x24, 0x24, 0x22,
+ 0x23, 0x22, 0x20, 0x24, 0x23, 0x21, 0x23, 0x23, 0x21, 0x24, 0x24, 0x22,
+ 0x25, 0x25, 0x21, 0x1d, 0x1d, 0x1b, 0x0a, 0x09, 0x09, 0x06, 0x04, 0x07,
+ 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x08, 0x08, 0x06, 0x19, 0x1b, 0x16,
+ 0x21, 0x26, 0x21, 0x23, 0x28, 0x26, 0x26, 0x29, 0x2c, 0x24, 0x28, 0x2b,
+ 0x21, 0x25, 0x26, 0x25, 0x25, 0x23, 0x2e, 0x28, 0x22, 0x43, 0x34, 0x2d,
+ 0x54, 0x35, 0x2a, 0x57, 0x39, 0x2f, 0x5d, 0x42, 0x36, 0x61, 0x45, 0x35,
+ 0x6b, 0x4f, 0x37, 0x84, 0x67, 0x48, 0xaa, 0x8a, 0x67, 0xcb, 0xaa, 0x87,
+ 0xdf, 0xc4, 0xa7, 0xf1, 0xdd, 0xc3, 0xf9, 0xee, 0xdb, 0xff, 0xfe, 0xf2,
+ 0xfd, 0xff, 0xfe, 0xfc, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xfa, 0xf5,
+ 0x5e, 0x5f, 0x58, 0x4b, 0x4c, 0x46, 0x46, 0x49, 0x42, 0x49, 0x4d, 0x47,
+ 0x4a, 0x4e, 0x49, 0x48, 0x4e, 0x4a, 0x48, 0x4e, 0x4a, 0x47, 0x4d, 0x48,
+ 0x47, 0x4b, 0x4a, 0x44, 0x48, 0x47, 0x45, 0x48, 0x45, 0x46, 0x48, 0x45,
+ 0x43, 0x45, 0x43, 0x43, 0x45, 0x40, 0x40, 0x45, 0x3f, 0x41, 0x46, 0x41,
+ 0x43, 0x45, 0x40, 0x43, 0x46, 0x41, 0x3d, 0x41, 0x3d, 0x39, 0x3f, 0x3d,
+ 0x38, 0x3e, 0x3e, 0x36, 0x3c, 0x3c, 0x32, 0x39, 0x39, 0x30, 0x36, 0x36,
+ 0x30, 0x36, 0x36, 0x2c, 0x31, 0x33, 0x2d, 0x30, 0x35, 0x2d, 0x30, 0x37,
+ 0x29, 0x2e, 0x33, 0x26, 0x2d, 0x35, 0x24, 0x2d, 0x39, 0x25, 0x30, 0x3f,
+ 0x22, 0x37, 0x46, 0x13, 0x21, 0x2d, 0x06, 0x0c, 0x10, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0d, 0x0b, 0x0c, 0x0c, 0x0c, 0x07, 0x07, 0x07, 0x05, 0x05, 0x07,
+ 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x10, 0x10, 0x10, 0x16, 0x16, 0x14,
+ 0x0d, 0x0d, 0x0b, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0d, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x07, 0x09, 0x09, 0x07, 0x0a, 0x0b, 0x07, 0x0b, 0x0d, 0x09,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x11, 0x0d, 0x0d, 0x0f, 0x17, 0x18, 0x19,
+ 0x26, 0x27, 0x28, 0x2b, 0x2c, 0x2e, 0x24, 0x25, 0x29, 0x18, 0x19, 0x1d,
+ 0x0d, 0x0e, 0x12, 0x0e, 0x0d, 0x12, 0x0b, 0x0b, 0x0f, 0x0d, 0x0e, 0x0e,
+ 0x18, 0x1f, 0x1d, 0x22, 0x2e, 0x30, 0x28, 0x35, 0x45, 0x24, 0x34, 0x4e,
+ 0x21, 0x3c, 0x56, 0x22, 0x3a, 0x52, 0x21, 0x37, 0x48, 0x20, 0x30, 0x3c,
+ 0x1c, 0x28, 0x2b, 0x1b, 0x23, 0x24, 0x1b, 0x20, 0x1f, 0x10, 0x14, 0x13,
+ 0x07, 0x07, 0x07, 0x11, 0x11, 0x0f, 0x19, 0x1a, 0x17, 0x1a, 0x1b, 0x16,
+ 0x1e, 0x1f, 0x1a, 0x1d, 0x1e, 0x1a, 0x19, 0x19, 0x16, 0x22, 0x22, 0x1f,
+ 0x26, 0x26, 0x24, 0x1c, 0x1c, 0x1a, 0x18, 0x18, 0x16, 0x21, 0x20, 0x1f,
+ 0x24, 0x25, 0x21, 0x21, 0x22, 0x1d, 0x1d, 0x1f, 0x1a, 0x22, 0x23, 0x1e,
+ 0x2c, 0x2d, 0x25, 0x54, 0x55, 0x4e, 0x61, 0x64, 0x5d, 0x55, 0x5c, 0x54,
+ 0x42, 0x4b, 0x46, 0x3a, 0x45, 0x43, 0x3b, 0x45, 0x47, 0x3f, 0x48, 0x4d,
+ 0x3f, 0x44, 0x4c, 0x3c, 0x41, 0x47, 0x38, 0x3d, 0x40, 0x34, 0x3c, 0x3c,
+ 0x35, 0x3d, 0x3c, 0x33, 0x3c, 0x3c, 0x34, 0x3c, 0x3e, 0x31, 0x39, 0x3c,
+ 0x35, 0x3a, 0x3e, 0x36, 0x3b, 0x40, 0x35, 0x3a, 0x40, 0x33, 0x3b, 0x3e,
+ 0x2f, 0x37, 0x39, 0x33, 0x3b, 0x3c, 0x36, 0x3e, 0x40, 0x36, 0x3d, 0x43,
+ 0x34, 0x3b, 0x46, 0x31, 0x38, 0x41, 0x31, 0x3a, 0x3b, 0x35, 0x3f, 0x3c,
+ 0x36, 0x3c, 0x3a, 0x33, 0x39, 0x39, 0x31, 0x35, 0x3c, 0x34, 0x38, 0x42,
+ 0x34, 0x39, 0x3e, 0x36, 0x3b, 0x3f, 0x3a, 0x3f, 0x45, 0x39, 0x3e, 0x44,
+ 0x34, 0x39, 0x41, 0x34, 0x39, 0x40, 0x36, 0x3b, 0x41, 0x36, 0x3c, 0x42,
+ 0x32, 0x3c, 0x3f, 0x31, 0x3b, 0x3d, 0x31, 0x3b, 0x3c, 0x36, 0x3f, 0x41,
+ 0x39, 0x43, 0x45, 0x3b, 0x45, 0x47, 0x37, 0x3f, 0x45, 0x35, 0x3f, 0x46,
+ 0x33, 0x3b, 0x47, 0x31, 0x3a, 0x40, 0x33, 0x3d, 0x3c, 0x32, 0x3c, 0x3c,
+ 0x2f, 0x38, 0x40, 0x32, 0x39, 0x48, 0x37, 0x40, 0x4c, 0x39, 0x42, 0x4a,
+ 0x3b, 0x42, 0x49, 0x35, 0x3f, 0x49, 0x30, 0x42, 0x56, 0x32, 0x51, 0x78,
+ 0x39, 0x68, 0xa3, 0x3c, 0x7b, 0xc2, 0x34, 0x7e, 0xc9, 0x29, 0x77, 0xbf,
+ 0x1c, 0x6d, 0xa7, 0x18, 0x5b, 0x8e, 0x16, 0x47, 0x76, 0x15, 0x3d, 0x69,
+ 0x17, 0x41, 0x6c, 0x15, 0x41, 0x6e, 0x15, 0x43, 0x6c, 0x14, 0x3f, 0x67,
+ 0x10, 0x36, 0x5e, 0x0b, 0x2f, 0x53, 0x0a, 0x2a, 0x4b, 0x0d, 0x29, 0x46,
+ 0x10, 0x2b, 0x48, 0x0f, 0x2a, 0x47, 0x0e, 0x29, 0x47, 0x0b, 0x25, 0x45,
+ 0x0b, 0x21, 0x43, 0x0d, 0x21, 0x3e, 0x12, 0x27, 0x3f, 0x13, 0x2c, 0x47,
+ 0x10, 0x2e, 0x50, 0x0d, 0x2d, 0x53, 0x0c, 0x28, 0x4b, 0x0e, 0x25, 0x45,
+ 0x0e, 0x24, 0x48, 0x0c, 0x1e, 0x39, 0x0b, 0x19, 0x26, 0x0f, 0x1d, 0x25,
+ 0x14, 0x29, 0x34, 0x16, 0x31, 0x45, 0x11, 0x2c, 0x47, 0x0d, 0x28, 0x46,
+ 0x12, 0x22, 0x4d, 0x0d, 0x22, 0x37, 0x12, 0x25, 0x2a, 0x1a, 0x26, 0x35,
+ 0x1c, 0x2e, 0x48, 0x1c, 0x39, 0x51, 0x34, 0x47, 0x5d, 0x54, 0x55, 0x6c,
+ 0x4e, 0x56, 0x63, 0x2b, 0x39, 0x55, 0x1a, 0x29, 0x40, 0x19, 0x31, 0x39,
+ 0x1d, 0x40, 0x55, 0x1a, 0x33, 0x5b, 0x11, 0x21, 0x3c, 0x11, 0x23, 0x29,
+ 0x1d, 0x32, 0x40, 0x1b, 0x38, 0x5f, 0x19, 0x3f, 0x6c, 0x1e, 0x49, 0x6d,
+ 0x23, 0x4b, 0x6f, 0x19, 0x3c, 0x5c, 0x11, 0x35, 0x53, 0x23, 0x4a, 0x73,
+ 0x33, 0x69, 0xa4, 0x3c, 0x80, 0xc8, 0x36, 0x87, 0xd9, 0x30, 0x82, 0xd2,
+ 0x37, 0x75, 0xb7, 0x3a, 0x5e, 0x86, 0x2a, 0x37, 0x4b, 0x22, 0x23, 0x2a,
+ 0x21, 0x23, 0x27, 0x1e, 0x21, 0x24, 0x22, 0x24, 0x27, 0x20, 0x21, 0x23,
+ 0x16, 0x16, 0x18, 0x09, 0x0b, 0x0d, 0x07, 0x0b, 0x0d, 0x07, 0x0c, 0x0e,
+ 0x10, 0x16, 0x17, 0x19, 0x1d, 0x1e, 0x17, 0x1b, 0x1c, 0x21, 0x22, 0x24,
+ 0x24, 0x25, 0x27, 0x29, 0x2d, 0x2e, 0x4b, 0x51, 0x51, 0x36, 0x3c, 0x3b,
+ 0x14, 0x1e, 0x1b, 0x0f, 0x18, 0x15, 0x12, 0x18, 0x16, 0x13, 0x17, 0x16,
+ 0x0f, 0x11, 0x10, 0x05, 0x08, 0x06, 0x01, 0x03, 0x02, 0x03, 0x07, 0x06,
+ 0x04, 0x05, 0x04, 0x04, 0x06, 0x06, 0x14, 0x16, 0x15, 0x0a, 0x0c, 0x0b,
+ 0x04, 0x06, 0x05, 0x04, 0x06, 0x05, 0x0a, 0x0c, 0x0b, 0x05, 0x06, 0x05,
+ 0x05, 0x05, 0x03, 0x07, 0x08, 0x08, 0x0c, 0x10, 0x0f, 0x17, 0x1b, 0x1a,
+ 0x20, 0x24, 0x25, 0x1b, 0x1f, 0x20, 0x15, 0x16, 0x19, 0x16, 0x15, 0x1a,
+ 0x1c, 0x1c, 0x1f, 0x1d, 0x1e, 0x20, 0x23, 0x24, 0x26, 0x1e, 0x1f, 0x21,
+ 0x0f, 0x11, 0x12, 0x0c, 0x0d, 0x0f, 0x0a, 0x0c, 0x0b, 0x10, 0x13, 0x12,
+ 0x15, 0x1b, 0x1b, 0x1b, 0x1f, 0x1e, 0x1b, 0x1f, 0x1f, 0x1c, 0x1e, 0x1d,
+ 0x1e, 0x20, 0x20, 0x1d, 0x20, 0x1f, 0x1f, 0x21, 0x20, 0x20, 0x22, 0x21,
+ 0x1d, 0x20, 0x1c, 0x20, 0x22, 0x1f, 0x24, 0x26, 0x23, 0x25, 0x25, 0x23,
+ 0x23, 0x22, 0x20, 0x25, 0x24, 0x22, 0x23, 0x22, 0x20, 0x27, 0x23, 0x22,
+ 0x24, 0x25, 0x20, 0x1e, 0x1e, 0x1c, 0x0e, 0x0e, 0x0c, 0x07, 0x07, 0x07,
+ 0x06, 0x05, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x15, 0x15, 0x15,
+ 0x22, 0x24, 0x21, 0x23, 0x25, 0x20, 0x25, 0x27, 0x24, 0x25, 0x27, 0x25,
+ 0x20, 0x22, 0x21, 0x20, 0x1f, 0x1c, 0x2c, 0x24, 0x1c, 0x34, 0x27, 0x1e,
+ 0x38, 0x26, 0x1f, 0x39, 0x2a, 0x21, 0x41, 0x2e, 0x23, 0x53, 0x34, 0x26,
+ 0x65, 0x3a, 0x28, 0x76, 0x47, 0x2d, 0x86, 0x5e, 0x3b, 0x97, 0x76, 0x4d,
+ 0xae, 0x87, 0x68, 0xc4, 0xa0, 0x7d, 0xd6, 0xba, 0x93, 0xec, 0xd7, 0xb3,
+ 0xf6, 0xec, 0xd4, 0xff, 0xfd, 0xf2, 0xff, 0xff, 0xfb, 0xfb, 0xff, 0xfb,
+ 0x4d, 0x4e, 0x49, 0x4b, 0x4c, 0x47, 0x4c, 0x4e, 0x49, 0x4a, 0x4f, 0x49,
+ 0x4b, 0x50, 0x4a, 0x4c, 0x53, 0x4c, 0x4b, 0x51, 0x4d, 0x4a, 0x50, 0x4c,
+ 0x4a, 0x51, 0x4c, 0x49, 0x4f, 0x4b, 0x46, 0x4b, 0x47, 0x4a, 0x4f, 0x4b,
+ 0x4a, 0x4e, 0x4a, 0x47, 0x4c, 0x48, 0x46, 0x4d, 0x46, 0x45, 0x4c, 0x45,
+ 0x45, 0x4a, 0x44, 0x46, 0x4b, 0x45, 0x45, 0x4b, 0x47, 0x3e, 0x47, 0x44,
+ 0x3b, 0x44, 0x42, 0x37, 0x40, 0x3f, 0x36, 0x3f, 0x3d, 0x35, 0x3b, 0x3b,
+ 0x33, 0x39, 0x39, 0x31, 0x36, 0x38, 0x30, 0x34, 0x38, 0x29, 0x2e, 0x34,
+ 0x29, 0x2e, 0x35, 0x28, 0x2f, 0x37, 0x24, 0x2e, 0x39, 0x21, 0x2d, 0x3b,
+ 0x21, 0x35, 0x47, 0x17, 0x25, 0x31, 0x0a, 0x0f, 0x13, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0d, 0x0b, 0x0e, 0x0e, 0x0e, 0x06, 0x06, 0x06, 0x03, 0x03, 0x05,
+ 0x02, 0x02, 0x02, 0x06, 0x06, 0x06, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0d,
+ 0x0c, 0x0c, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x07, 0x07, 0x07, 0x05, 0x0a, 0x0b, 0x08, 0x0e, 0x0f, 0x0c,
+ 0x0f, 0x0f, 0x0d, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x1f, 0x20, 0x20,
+ 0x33, 0x34, 0x36, 0x36, 0x37, 0x3b, 0x2d, 0x2e, 0x32, 0x23, 0x24, 0x29,
+ 0x1a, 0x1b, 0x1f, 0x14, 0x15, 0x19, 0x10, 0x0f, 0x14, 0x0e, 0x0f, 0x11,
+ 0x14, 0x18, 0x18, 0x1d, 0x26, 0x29, 0x27, 0x33, 0x40, 0x2b, 0x3a, 0x4f,
+ 0x26, 0x3f, 0x51, 0x1f, 0x35, 0x44, 0x1d, 0x2f, 0x39, 0x1a, 0x29, 0x2e,
+ 0x19, 0x23, 0x23, 0x1a, 0x21, 0x1f, 0x1a, 0x1f, 0x1b, 0x0e, 0x13, 0x0f,
+ 0x06, 0x06, 0x06, 0x10, 0x10, 0x10, 0x19, 0x19, 0x17, 0x1a, 0x1a, 0x17,
+ 0x21, 0x21, 0x1f, 0x24, 0x24, 0x21, 0x18, 0x18, 0x17, 0x16, 0x16, 0x14,
+ 0x1b, 0x1b, 0x19, 0x1b, 0x1b, 0x19, 0x17, 0x17, 0x15, 0x1d, 0x1d, 0x1b,
+ 0x1e, 0x1e, 0x1b, 0x1a, 0x1c, 0x17, 0x1b, 0x1d, 0x18, 0x2e, 0x30, 0x2b,
+ 0x3b, 0x3d, 0x38, 0x50, 0x52, 0x4d, 0x51, 0x53, 0x4d, 0x44, 0x49, 0x43,
+ 0x41, 0x47, 0x42, 0x49, 0x4f, 0x4d, 0x4f, 0x57, 0x59, 0x53, 0x5b, 0x5e,
+ 0x4c, 0x51, 0x54, 0x40, 0x45, 0x49, 0x38, 0x3d, 0x40, 0x37, 0x3c, 0x3f,
+ 0x35, 0x3b, 0x3c, 0x32, 0x3b, 0x3a, 0x33, 0x3b, 0x3b, 0x32, 0x3a, 0x39,
+ 0x38, 0x41, 0x40, 0x3a, 0x42, 0x44, 0x36, 0x3e, 0x41, 0x35, 0x3e, 0x40,
+ 0x35, 0x3a, 0x3c, 0x36, 0x3c, 0x3d, 0x36, 0x3d, 0x3e, 0x36, 0x3a, 0x41,
+ 0x33, 0x39, 0x42, 0x30, 0x37, 0x3d, 0x2f, 0x37, 0x39, 0x30, 0x39, 0x38,
+ 0x31, 0x39, 0x38, 0x33, 0x39, 0x3b, 0x35, 0x3a, 0x41, 0x36, 0x3a, 0x43,
+ 0x37, 0x3a, 0x44, 0x3a, 0x3e, 0x47, 0x38, 0x3c, 0x45, 0x39, 0x3d, 0x46,
+ 0x37, 0x3c, 0x42, 0x35, 0x3a, 0x3f, 0x34, 0x39, 0x3e, 0x33, 0x38, 0x3c,
+ 0x31, 0x3a, 0x3f, 0x33, 0x3c, 0x41, 0x35, 0x3d, 0x40, 0x35, 0x3d, 0x41,
+ 0x38, 0x3f, 0x45, 0x39, 0x42, 0x48, 0x38, 0x42, 0x49, 0x35, 0x3f, 0x48,
+ 0x34, 0x3e, 0x47, 0x33, 0x3e, 0x44, 0x33, 0x3e, 0x40, 0x31, 0x3c, 0x40,
+ 0x31, 0x3c, 0x42, 0x33, 0x3c, 0x45, 0x37, 0x3e, 0x46, 0x3c, 0x42, 0x49,
+ 0x37, 0x42, 0x4d, 0x35, 0x49, 0x5c, 0x3a, 0x5a, 0x7d, 0x3b, 0x6d, 0xa3,
+ 0x38, 0x77, 0xbd, 0x31, 0x7a, 0xc3, 0x29, 0x75, 0xb9, 0x1f, 0x68, 0xaa,
+ 0x13, 0x56, 0x8c, 0x0b, 0x45, 0x75, 0x0e, 0x3f, 0x6a, 0x10, 0x40, 0x68,
+ 0x12, 0x43, 0x6b, 0x11, 0x42, 0x69, 0x14, 0x40, 0x65, 0x13, 0x39, 0x5c,
+ 0x0d, 0x2d, 0x4e, 0x08, 0x27, 0x46, 0x09, 0x26, 0x44, 0x0e, 0x26, 0x44,
+ 0x0f, 0x27, 0x45, 0x0f, 0x28, 0x46, 0x0c, 0x25, 0x43, 0x09, 0x23, 0x42,
+ 0x0a, 0x22, 0x3d, 0x17, 0x27, 0x3d, 0x31, 0x3a, 0x4c, 0x40, 0x4a, 0x58,
+ 0x2b, 0x3c, 0x4d, 0x18, 0x30, 0x48, 0x0f, 0x2b, 0x4c, 0x0c, 0x28, 0x4e,
+ 0x0d, 0x24, 0x45, 0x0e, 0x1f, 0x37, 0x0b, 0x19, 0x26, 0x0c, 0x1d, 0x24,
+ 0x15, 0x2a, 0x37, 0x18, 0x33, 0x48, 0x12, 0x2d, 0x4a, 0x0d, 0x27, 0x48,
+ 0x11, 0x25, 0x46, 0x0c, 0x24, 0x30, 0x15, 0x28, 0x2b, 0x23, 0x30, 0x3f,
+ 0x20, 0x32, 0x4b, 0x24, 0x40, 0x4f, 0x53, 0x68, 0x6b, 0x7a, 0x7b, 0x79,
+ 0x7c, 0x78, 0x75, 0x45, 0x51, 0x66, 0x1b, 0x31, 0x4b, 0x18, 0x37, 0x45,
+ 0x1d, 0x40, 0x55, 0x1c, 0x31, 0x51, 0x17, 0x22, 0x34, 0x17, 0x28, 0x28,
+ 0x1f, 0x37, 0x4d, 0x19, 0x3b, 0x62, 0x19, 0x46, 0x77, 0x1f, 0x4f, 0x86,
+ 0x1f, 0x4c, 0x7f, 0x16, 0x43, 0x65, 0x22, 0x4f, 0x73, 0x41, 0x6c, 0xab,
+ 0x48, 0x85, 0xd4, 0x3d, 0x87, 0xd9, 0x33, 0x81, 0xd1, 0x2f, 0x71, 0xb1,
+ 0x2c, 0x54, 0x7a, 0x27, 0x35, 0x43, 0x20, 0x26, 0x29, 0x1c, 0x23, 0x25,
+ 0x16, 0x1a, 0x1e, 0x14, 0x18, 0x19, 0x1d, 0x1e, 0x20, 0x27, 0x28, 0x2a,
+ 0x24, 0x25, 0x27, 0x19, 0x1d, 0x1e, 0x16, 0x1a, 0x1b, 0x17, 0x1c, 0x1c,
+ 0x0d, 0x11, 0x13, 0x08, 0x0c, 0x0d, 0x0d, 0x0e, 0x10, 0x1a, 0x1b, 0x1d,
+ 0x1f, 0x20, 0x22, 0x27, 0x2b, 0x2c, 0x23, 0x29, 0x29, 0x16, 0x1d, 0x1b,
+ 0x0f, 0x18, 0x15, 0x12, 0x1b, 0x18, 0x11, 0x17, 0x15, 0x0f, 0x13, 0x11,
+ 0x07, 0x09, 0x08, 0x02, 0x04, 0x03, 0x07, 0x09, 0x08, 0x0c, 0x10, 0x0f,
+ 0x08, 0x09, 0x09, 0x05, 0x05, 0x05, 0x0c, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x0c, 0x0c, 0x0c, 0x08, 0x09, 0x09,
+ 0x0b, 0x0c, 0x0d, 0x13, 0x14, 0x16, 0x1c, 0x20, 0x21, 0x25, 0x2a, 0x2a,
+ 0x23, 0x27, 0x28, 0x16, 0x1a, 0x1b, 0x0b, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e,
+ 0x12, 0x12, 0x15, 0x18, 0x19, 0x1b, 0x21, 0x22, 0x24, 0x20, 0x21, 0x23,
+ 0x19, 0x1a, 0x1c, 0x11, 0x12, 0x14, 0x10, 0x12, 0x11, 0x0d, 0x0f, 0x0e,
+ 0x11, 0x17, 0x15, 0x1b, 0x20, 0x1f, 0x1c, 0x20, 0x1f, 0x1d, 0x1f, 0x1e,
+ 0x1f, 0x21, 0x20, 0x20, 0x22, 0x21, 0x1f, 0x21, 0x20, 0x1f, 0x21, 0x20,
+ 0x1e, 0x20, 0x1d, 0x1f, 0x21, 0x1e, 0x24, 0x24, 0x22, 0x22, 0x22, 0x20,
+ 0x20, 0x20, 0x1d, 0x24, 0x23, 0x20, 0x26, 0x25, 0x22, 0x24, 0x21, 0x1d,
+ 0x21, 0x22, 0x1d, 0x1f, 0x1f, 0x1d, 0x0f, 0x0f, 0x0d, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x13, 0x13, 0x13,
+ 0x1d, 0x1f, 0x1c, 0x20, 0x22, 0x1e, 0x24, 0x25, 0x22, 0x20, 0x22, 0x1f,
+ 0x1a, 0x1c, 0x1b, 0x19, 0x18, 0x15, 0x23, 0x1b, 0x13, 0x28, 0x1a, 0x11,
+ 0x2f, 0x1a, 0x15, 0x33, 0x1e, 0x15, 0x3e, 0x23, 0x16, 0x4f, 0x2e, 0x1a,
+ 0x60, 0x39, 0x1d, 0x73, 0x4b, 0x25, 0x87, 0x64, 0x32, 0x96, 0x76, 0x40,
+ 0xa1, 0x7b, 0x4b, 0xa7, 0x84, 0x4f, 0xad, 0x8e, 0x55, 0xbb, 0x9d, 0x68,
+ 0xcb, 0xaf, 0x84, 0xe4, 0xcb, 0xa9, 0xf0, 0xdb, 0xbe, 0xf6, 0xe6, 0xc7,
+ 0x4a, 0x4b, 0x46, 0x4f, 0x51, 0x4c, 0x4e, 0x50, 0x4b, 0x4c, 0x51, 0x4b,
+ 0x4b, 0x52, 0x4b, 0x4c, 0x53, 0x4c, 0x4e, 0x54, 0x4d, 0x4b, 0x50, 0x4a,
+ 0x4a, 0x54, 0x4c, 0x49, 0x53, 0x4b, 0x4a, 0x52, 0x4a, 0x4e, 0x55, 0x4e,
+ 0x4f, 0x56, 0x4f, 0x4f, 0x56, 0x4f, 0x49, 0x52, 0x4c, 0x46, 0x4f, 0x4a,
+ 0x44, 0x4e, 0x46, 0x45, 0x4e, 0x46, 0x43, 0x4e, 0x48, 0x44, 0x4f, 0x4b,
+ 0x41, 0x4c, 0x48, 0x40, 0x49, 0x46, 0x3d, 0x46, 0x43, 0x37, 0x3f, 0x3d,
+ 0x35, 0x3b, 0x3b, 0x32, 0x37, 0x3a, 0x32, 0x36, 0x3a, 0x2b, 0x30, 0x36,
+ 0x28, 0x2f, 0x34, 0x29, 0x32, 0x39, 0x28, 0x32, 0x3d, 0x23, 0x30, 0x3e,
+ 0x20, 0x34, 0x46, 0x1d, 0x2c, 0x37, 0x0c, 0x12, 0x16, 0x0a, 0x0a, 0x0a,
+ 0x0e, 0x0d, 0x0b, 0x0f, 0x0f, 0x0f, 0x07, 0x07, 0x07, 0x04, 0x04, 0x05,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0a,
+ 0x0c, 0x0c, 0x0a, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0c, 0x0d, 0x0d, 0x0c, 0x0e, 0x0d,
+ 0x0d, 0x0e, 0x09, 0x0c, 0x0d, 0x08, 0x0c, 0x0c, 0x0a, 0x15, 0x15, 0x14,
+ 0x24, 0x24, 0x26, 0x37, 0x38, 0x3b, 0x39, 0x3a, 0x3e, 0x35, 0x37, 0x3a,
+ 0x28, 0x2c, 0x2d, 0x20, 0x22, 0x25, 0x1b, 0x1b, 0x20, 0x12, 0x13, 0x17,
+ 0x15, 0x19, 0x1b, 0x1b, 0x23, 0x27, 0x22, 0x2d, 0x35, 0x2b, 0x37, 0x43,
+ 0x23, 0x36, 0x3c, 0x1a, 0x2d, 0x30, 0x17, 0x27, 0x28, 0x1a, 0x26, 0x24,
+ 0x19, 0x21, 0x1e, 0x19, 0x1e, 0x1a, 0x15, 0x1a, 0x16, 0x0c, 0x0f, 0x0c,
+ 0x08, 0x08, 0x08, 0x11, 0x11, 0x11, 0x18, 0x18, 0x17, 0x1a, 0x1a, 0x18,
+ 0x1c, 0x1c, 0x1a, 0x1d, 0x1d, 0x1c, 0x19, 0x19, 0x17, 0x18, 0x18, 0x18,
+ 0x1a, 0x1b, 0x17, 0x17, 0x18, 0x14, 0x1b, 0x1b, 0x18, 0x19, 0x19, 0x17,
+ 0x17, 0x19, 0x16, 0x18, 0x1a, 0x17, 0x1e, 0x1f, 0x1e, 0x2a, 0x2c, 0x2b,
+ 0x2f, 0x31, 0x30, 0x44, 0x46, 0x43, 0x45, 0x47, 0x44, 0x43, 0x45, 0x40,
+ 0x4d, 0x4f, 0x4c, 0x59, 0x5b, 0x5a, 0x60, 0x61, 0x63, 0x64, 0x65, 0x67,
+ 0x59, 0x5d, 0x5c, 0x46, 0x4a, 0x4b, 0x39, 0x3d, 0x40, 0x36, 0x3b, 0x3e,
+ 0x36, 0x3a, 0x3d, 0x34, 0x3a, 0x3b, 0x34, 0x3a, 0x38, 0x37, 0x3d, 0x39,
+ 0x35, 0x3e, 0x3b, 0x3b, 0x43, 0x44, 0x3e, 0x46, 0x4a, 0x39, 0x41, 0x43,
+ 0x3a, 0x40, 0x41, 0x3b, 0x40, 0x40, 0x37, 0x3c, 0x3f, 0x35, 0x3a, 0x3e,
+ 0x34, 0x3a, 0x3d, 0x34, 0x39, 0x3c, 0x33, 0x37, 0x3a, 0x30, 0x36, 0x39,
+ 0x30, 0x38, 0x3b, 0x2f, 0x38, 0x3b, 0x34, 0x3c, 0x3f, 0x35, 0x3d, 0x42,
+ 0x3a, 0x3e, 0x49, 0x3b, 0x3f, 0x4a, 0x3a, 0x3e, 0x48, 0x37, 0x3b, 0x44,
+ 0x37, 0x3c, 0x42, 0x35, 0x3a, 0x40, 0x38, 0x3c, 0x41, 0x35, 0x3a, 0x3e,
+ 0x34, 0x3c, 0x41, 0x33, 0x3c, 0x42, 0x36, 0x3d, 0x43, 0x38, 0x3f, 0x45,
+ 0x38, 0x3f, 0x46, 0x36, 0x3e, 0x46, 0x35, 0x3f, 0x48, 0x39, 0x42, 0x4c,
+ 0x38, 0x43, 0x48, 0x35, 0x40, 0x46, 0x31, 0x3b, 0x44, 0x33, 0x3e, 0x44,
+ 0x31, 0x3c, 0x3e, 0x35, 0x3f, 0x41, 0x35, 0x3e, 0x43, 0x39, 0x40, 0x4a,
+ 0x32, 0x4c, 0x63, 0x3d, 0x63, 0x89, 0x46, 0x7a, 0xb5, 0x36, 0x7c, 0xc3,
+ 0x29, 0x79, 0xc2, 0x20, 0x71, 0xb4, 0x1b, 0x64, 0x9f, 0x10, 0x50, 0x88,
+ 0x0d, 0x42, 0x72, 0x0e, 0x41, 0x6d, 0x10, 0x41, 0x6a, 0x0f, 0x42, 0x69,
+ 0x0f, 0x45, 0x69, 0x0e, 0x41, 0x61, 0x0f, 0x36, 0x57, 0x0e, 0x2c, 0x4c,
+ 0x0c, 0x27, 0x40, 0x0c, 0x26, 0x41, 0x0d, 0x25, 0x42, 0x0d, 0x24, 0x43,
+ 0x0e, 0x25, 0x44, 0x10, 0x27, 0x47, 0x0e, 0x25, 0x44, 0x0a, 0x23, 0x3f,
+ 0x0d, 0x25, 0x3e, 0x36, 0x43, 0x4e, 0x5e, 0x5e, 0x5a, 0x7b, 0x76, 0x6f,
+ 0x5f, 0x61, 0x64, 0x27, 0x37, 0x4b, 0x0d, 0x29, 0x48, 0x07, 0x27, 0x4d,
+ 0x0e, 0x23, 0x41, 0x0a, 0x1a, 0x2e, 0x0b, 0x19, 0x24, 0x0f, 0x20, 0x28,
+ 0x16, 0x2e, 0x3b, 0x18, 0x34, 0x4d, 0x0f, 0x2c, 0x4d, 0x0e, 0x28, 0x4e,
+ 0x0f, 0x27, 0x43, 0x0e, 0x26, 0x32, 0x14, 0x27, 0x30, 0x1f, 0x2d, 0x42,
+ 0x24, 0x36, 0x53, 0x1e, 0x3a, 0x45, 0x3d, 0x52, 0x49, 0x71, 0x78, 0x67,
+ 0x6b, 0x72, 0x70, 0x3c, 0x54, 0x6d, 0x15, 0x36, 0x55, 0x19, 0x3b, 0x4e,
+ 0x21, 0x40, 0x54, 0x1e, 0x30, 0x49, 0x15, 0x23, 0x31, 0x15, 0x2f, 0x33,
+ 0x17, 0x3a, 0x4c, 0x13, 0x39, 0x65, 0x1b, 0x4a, 0x7e, 0x21, 0x55, 0x85,
+ 0x1d, 0x50, 0x84, 0x22, 0x57, 0x8b, 0x3f, 0x7a, 0xb1, 0x4b, 0x8a, 0xd4,
+ 0x3f, 0x8a, 0xe0, 0x3d, 0x83, 0xd0, 0x3b, 0x73, 0xad, 0x32, 0x56, 0x79,
+ 0x21, 0x31, 0x3c, 0x1d, 0x21, 0x1f, 0x1f, 0x21, 0x1d, 0x1d, 0x21, 0x20,
+ 0x12, 0x16, 0x17, 0x05, 0x08, 0x09, 0x0e, 0x10, 0x11, 0x1c, 0x1f, 0x1e,
+ 0x25, 0x27, 0x26, 0x2a, 0x2e, 0x2d, 0x25, 0x2a, 0x29, 0x24, 0x2a, 0x28,
+ 0x1f, 0x20, 0x22, 0x16, 0x17, 0x19, 0x1f, 0x20, 0x22, 0x2a, 0x2b, 0x2d,
+ 0x1f, 0x23, 0x24, 0x1d, 0x21, 0x22, 0x11, 0x17, 0x15, 0x12, 0x1b, 0x18,
+ 0x14, 0x1a, 0x18, 0x13, 0x19, 0x17, 0x0c, 0x10, 0x0f, 0x07, 0x0a, 0x09,
+ 0x04, 0x06, 0x05, 0x02, 0x04, 0x03, 0x10, 0x12, 0x11, 0x17, 0x19, 0x18,
+ 0x07, 0x08, 0x08, 0x04, 0x04, 0x04, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0b,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x0f, 0x0f, 0x10,
+ 0x22, 0x25, 0x2a, 0x21, 0x25, 0x28, 0x29, 0x2d, 0x30, 0x24, 0x29, 0x2a,
+ 0x22, 0x26, 0x27, 0x27, 0x2b, 0x2a, 0x11, 0x14, 0x13, 0x0f, 0x11, 0x10,
+ 0x10, 0x12, 0x13, 0x14, 0x15, 0x17, 0x16, 0x17, 0x19, 0x1c, 0x1d, 0x1f,
+ 0x20, 0x21, 0x23, 0x1b, 0x1c, 0x1e, 0x18, 0x1a, 0x19, 0x15, 0x18, 0x16,
+ 0x17, 0x1d, 0x1b, 0x1a, 0x1f, 0x1e, 0x17, 0x1b, 0x1a, 0x1f, 0x21, 0x20,
+ 0x22, 0x24, 0x24, 0x21, 0x23, 0x22, 0x1f, 0x21, 0x20, 0x1d, 0x1f, 0x1e,
+ 0x1d, 0x1f, 0x1d, 0x1d, 0x1f, 0x1b, 0x1f, 0x20, 0x1b, 0x22, 0x23, 0x1d,
+ 0x1d, 0x1e, 0x19, 0x1f, 0x1f, 0x1b, 0x23, 0x22, 0x1e, 0x20, 0x1f, 0x1b,
+ 0x1f, 0x20, 0x1b, 0x1f, 0x1f, 0x1d, 0x12, 0x11, 0x10, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x0e, 0x0f, 0x0e,
+ 0x17, 0x19, 0x16, 0x1e, 0x20, 0x1d, 0x20, 0x20, 0x1e, 0x1a, 0x1c, 0x1b,
+ 0x14, 0x15, 0x14, 0x19, 0x18, 0x15, 0x23, 0x1a, 0x13, 0x25, 0x16, 0x0d,
+ 0x2e, 0x18, 0x10, 0x39, 0x1f, 0x14, 0x42, 0x26, 0x16, 0x50, 0x35, 0x1d,
+ 0x5c, 0x45, 0x23, 0x6b, 0x58, 0x2d, 0x82, 0x71, 0x3f, 0x94, 0x83, 0x50,
+ 0x9b, 0x84, 0x52, 0x9c, 0x82, 0x4f, 0x9c, 0x82, 0x4d, 0xa3, 0x86, 0x54,
+ 0xab, 0x8a, 0x5d, 0xb9, 0x92, 0x69, 0xc5, 0x9b, 0x73, 0xd3, 0xa9, 0x80,
+ 0x4a, 0x4c, 0x49, 0x4e, 0x51, 0x4d, 0x4e, 0x52, 0x4c, 0x4b, 0x50, 0x4a,
+ 0x4a, 0x51, 0x4a, 0x4e, 0x55, 0x4d, 0x4e, 0x53, 0x4c, 0x49, 0x4e, 0x47,
+ 0x4a, 0x54, 0x4b, 0x4a, 0x54, 0x4b, 0x4a, 0x51, 0x49, 0x52, 0x59, 0x51,
+ 0x52, 0x58, 0x52, 0x52, 0x59, 0x52, 0x4f, 0x58, 0x51, 0x4a, 0x54, 0x4e,
+ 0x49, 0x55, 0x4c, 0x48, 0x55, 0x4c, 0x45, 0x53, 0x4a, 0x45, 0x52, 0x4b,
+ 0x41, 0x4d, 0x49, 0x42, 0x4d, 0x49, 0x41, 0x4a, 0x47, 0x3c, 0x45, 0x42,
+ 0x39, 0x41, 0x3e, 0x35, 0x3b, 0x3c, 0x35, 0x3a, 0x3f, 0x2f, 0x35, 0x3b,
+ 0x2d, 0x34, 0x39, 0x2c, 0x35, 0x3c, 0x2c, 0x36, 0x41, 0x26, 0x33, 0x41,
+ 0x22, 0x35, 0x46, 0x1f, 0x2e, 0x39, 0x0c, 0x14, 0x17, 0x0a, 0x0c, 0x0b,
+ 0x0d, 0x0c, 0x0a, 0x0e, 0x0e, 0x0e, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x09, 0x09, 0x08,
+ 0x09, 0x09, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x09, 0x0e, 0x0e, 0x0c, 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0b, 0x0e, 0x0e, 0x10, 0x10, 0x11, 0x13, 0x10, 0x11, 0x13,
+ 0x0e, 0x0e, 0x0e, 0x0c, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08,
+ 0x0d, 0x0d, 0x0d, 0x1b, 0x1d, 0x1c, 0x2c, 0x2e, 0x2d, 0x39, 0x3b, 0x3a,
+ 0x32, 0x36, 0x37, 0x2c, 0x30, 0x32, 0x27, 0x28, 0x2c, 0x1f, 0x20, 0x25,
+ 0x1d, 0x20, 0x25, 0x21, 0x26, 0x2a, 0x20, 0x28, 0x2b, 0x24, 0x2e, 0x32,
+ 0x18, 0x26, 0x24, 0x18, 0x24, 0x22, 0x16, 0x21, 0x1e, 0x1a, 0x21, 0x1d,
+ 0x19, 0x1e, 0x1a, 0x13, 0x15, 0x12, 0x0b, 0x0d, 0x0a, 0x07, 0x09, 0x06,
+ 0x09, 0x09, 0x09, 0x13, 0x13, 0x13, 0x18, 0x18, 0x17, 0x1a, 0x1a, 0x18,
+ 0x1a, 0x1a, 0x18, 0x1e, 0x1e, 0x1c, 0x1e, 0x1e, 0x1c, 0x1a, 0x1a, 0x1a,
+ 0x1a, 0x1b, 0x16, 0x1d, 0x1e, 0x19, 0x19, 0x19, 0x17, 0x16, 0x17, 0x15,
+ 0x15, 0x17, 0x15, 0x18, 0x19, 0x19, 0x18, 0x19, 0x1b, 0x14, 0x15, 0x17,
+ 0x19, 0x1d, 0x1e, 0x39, 0x3d, 0x3d, 0x46, 0x49, 0x48, 0x50, 0x50, 0x4e,
+ 0x5c, 0x5d, 0x58, 0x63, 0x63, 0x61, 0x63, 0x62, 0x60, 0x62, 0x60, 0x61,
+ 0x56, 0x58, 0x53, 0x46, 0x49, 0x47, 0x34, 0x37, 0x3a, 0x32, 0x35, 0x3b,
+ 0x37, 0x3a, 0x3f, 0x36, 0x3b, 0x3e, 0x36, 0x3b, 0x39, 0x35, 0x3b, 0x38,
+ 0x32, 0x3b, 0x38, 0x35, 0x3e, 0x3e, 0x3b, 0x43, 0x46, 0x38, 0x40, 0x42,
+ 0x3c, 0x42, 0x42, 0x3e, 0x44, 0x44, 0x3b, 0x3f, 0x40, 0x34, 0x38, 0x3c,
+ 0x32, 0x37, 0x36, 0x33, 0x39, 0x39, 0x35, 0x3a, 0x3c, 0x31, 0x36, 0x3a,
+ 0x34, 0x39, 0x3f, 0x33, 0x3a, 0x40, 0x33, 0x3b, 0x3e, 0x38, 0x3f, 0x43,
+ 0x3a, 0x40, 0x46, 0x3d, 0x42, 0x48, 0x3a, 0x3e, 0x47, 0x36, 0x3b, 0x43,
+ 0x34, 0x38, 0x41, 0x34, 0x38, 0x41, 0x35, 0x3a, 0x40, 0x36, 0x3b, 0x41,
+ 0x31, 0x3a, 0x3e, 0x34, 0x3b, 0x40, 0x39, 0x40, 0x46, 0x3d, 0x44, 0x4a,
+ 0x3c, 0x43, 0x49, 0x3a, 0x41, 0x49, 0x35, 0x3e, 0x46, 0x37, 0x40, 0x49,
+ 0x35, 0x41, 0x45, 0x33, 0x3c, 0x43, 0x34, 0x38, 0x43, 0x38, 0x3b, 0x40,
+ 0x34, 0x3c, 0x3b, 0x30, 0x3e, 0x41, 0x2e, 0x41, 0x50, 0x36, 0x4d, 0x68,
+ 0x32, 0x65, 0x90, 0x3d, 0x79, 0xb3, 0x3d, 0x80, 0xca, 0x2b, 0x78, 0xc6,
+ 0x1d, 0x70, 0xb4, 0x11, 0x60, 0x97, 0x0c, 0x4e, 0x7e, 0x10, 0x47, 0x76,
+ 0x13, 0x46, 0x6f, 0x12, 0x43, 0x6c, 0x11, 0x42, 0x6b, 0x13, 0x44, 0x6c,
+ 0x11, 0x41, 0x65, 0x0a, 0x35, 0x56, 0x0b, 0x2c, 0x4a, 0x0d, 0x24, 0x42,
+ 0x0d, 0x24, 0x39, 0x0d, 0x26, 0x3d, 0x0c, 0x23, 0x40, 0x0d, 0x24, 0x45,
+ 0x0e, 0x26, 0x47, 0x0f, 0x26, 0x47, 0x0f, 0x26, 0x46, 0x09, 0x21, 0x3f,
+ 0x0f, 0x22, 0x40, 0x4c, 0x55, 0x58, 0x7a, 0x7a, 0x63, 0x7e, 0x79, 0x65,
+ 0x65, 0x66, 0x6a, 0x2c, 0x39, 0x58, 0x0d, 0x27, 0x48, 0x07, 0x2a, 0x44,
+ 0x0e, 0x25, 0x3d, 0x09, 0x1a, 0x2a, 0x0a, 0x19, 0x22, 0x11, 0x23, 0x2a,
+ 0x17, 0x2f, 0x3e, 0x16, 0x34, 0x4e, 0x10, 0x2c, 0x51, 0x12, 0x2e, 0x57,
+ 0x11, 0x2a, 0x4d, 0x0e, 0x24, 0x3a, 0x14, 0x27, 0x38, 0x1b, 0x2b, 0x46,
+ 0x21, 0x34, 0x54, 0x1c, 0x32, 0x43, 0x11, 0x22, 0x21, 0x2e, 0x39, 0x30,
+ 0x35, 0x58, 0x6a, 0x20, 0x4d, 0x73, 0x14, 0x39, 0x5c, 0x1d, 0x39, 0x4f,
+ 0x23, 0x3e, 0x53, 0x19, 0x2f, 0x46, 0x13, 0x2a, 0x3c, 0x11, 0x36, 0x44,
+ 0x14, 0x3a, 0x4c, 0x11, 0x3a, 0x5e, 0x1d, 0x4d, 0x75, 0x22, 0x5a, 0x80,
+ 0x26, 0x62, 0x98, 0x36, 0x78, 0xbd, 0x43, 0x90, 0xd6, 0x3b, 0x8e, 0xd8,
+ 0x36, 0x82, 0xc8, 0x34, 0x6b, 0x9b, 0x32, 0x4c, 0x5f, 0x28, 0x31, 0x34,
+ 0x1d, 0x25, 0x24, 0x1c, 0x23, 0x26, 0x22, 0x25, 0x28, 0x26, 0x23, 0x24,
+ 0x17, 0x1a, 0x1b, 0x0b, 0x0f, 0x11, 0x08, 0x0c, 0x0d, 0x07, 0x0b, 0x0c,
+ 0x0f, 0x13, 0x14, 0x1c, 0x20, 0x21, 0x1c, 0x20, 0x21, 0x1b, 0x1f, 0x1f,
+ 0x23, 0x24, 0x26, 0x25, 0x26, 0x28, 0x41, 0x42, 0x44, 0x4c, 0x50, 0x51,
+ 0x1a, 0x1f, 0x1f, 0x13, 0x19, 0x17, 0x11, 0x17, 0x15, 0x15, 0x1d, 0x1a,
+ 0x14, 0x18, 0x17, 0x0c, 0x10, 0x0f, 0x09, 0x0b, 0x0a, 0x05, 0x06, 0x05,
+ 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x0e, 0x0f, 0x0f, 0x14, 0x14, 0x14,
+ 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x09, 0x09, 0x09, 0x0e, 0x0e, 0x0e,
+ 0x07, 0x07, 0x08, 0x05, 0x05, 0x07, 0x0a, 0x0b, 0x0d, 0x1e, 0x20, 0x22,
+ 0x2f, 0x34, 0x39, 0x23, 0x28, 0x2d, 0x1a, 0x1f, 0x23, 0x15, 0x1a, 0x1c,
+ 0x15, 0x1a, 0x1b, 0x18, 0x1c, 0x1b, 0x19, 0x1e, 0x1a, 0x18, 0x1d, 0x19,
+ 0x20, 0x22, 0x23, 0x15, 0x16, 0x18, 0x0a, 0x0b, 0x0d, 0x11, 0x12, 0x14,
+ 0x1a, 0x1b, 0x1d, 0x1d, 0x1e, 0x20, 0x20, 0x21, 0x21, 0x1e, 0x20, 0x1f,
+ 0x19, 0x1f, 0x1d, 0x1a, 0x1e, 0x1d, 0x1e, 0x22, 0x21, 0x26, 0x28, 0x27,
+ 0x22, 0x24, 0x23, 0x1e, 0x20, 0x1d, 0x1f, 0x21, 0x1e, 0x1b, 0x1d, 0x1b,
+ 0x1c, 0x1e, 0x19, 0x1b, 0x1d, 0x18, 0x1e, 0x1f, 0x1a, 0x1f, 0x20, 0x1b,
+ 0x1d, 0x1e, 0x19, 0x1e, 0x1e, 0x1a, 0x1f, 0x1e, 0x1a, 0x1f, 0x1e, 0x1a,
+ 0x1d, 0x1e, 0x19, 0x20, 0x20, 0x1e, 0x14, 0x14, 0x13, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x0a, 0x0b, 0x0a,
+ 0x15, 0x17, 0x14, 0x1c, 0x1c, 0x1a, 0x18, 0x18, 0x16, 0x14, 0x16, 0x15,
+ 0x11, 0x12, 0x11, 0x19, 0x16, 0x15, 0x1f, 0x15, 0x11, 0x27, 0x18, 0x0f,
+ 0x31, 0x1f, 0x0f, 0x3d, 0x28, 0x17, 0x4a, 0x35, 0x22, 0x49, 0x3f, 0x26,
+ 0x48, 0x4b, 0x2b, 0x67, 0x73, 0x4e, 0x7e, 0x87, 0x64, 0x82, 0x86, 0x64,
+ 0x7e, 0x7e, 0x58, 0x7e, 0x7b, 0x55, 0x84, 0x7d, 0x57, 0x8e, 0x80, 0x5a,
+ 0x96, 0x80, 0x5a, 0x99, 0x7d, 0x56, 0xa3, 0x81, 0x58, 0xaa, 0x85, 0x59,
+ 0x4d, 0x4e, 0x4b, 0x4d, 0x50, 0x4b, 0x4c, 0x51, 0x4b, 0x4d, 0x52, 0x4b,
+ 0x4d, 0x54, 0x4c, 0x50, 0x57, 0x4d, 0x50, 0x56, 0x4c, 0x4b, 0x51, 0x47,
+ 0x4c, 0x54, 0x49, 0x4d, 0x55, 0x4a, 0x4c, 0x52, 0x48, 0x55, 0x5a, 0x53,
+ 0x54, 0x59, 0x51, 0x53, 0x58, 0x51, 0x52, 0x59, 0x52, 0x4d, 0x56, 0x4f,
+ 0x47, 0x56, 0x4c, 0x46, 0x56, 0x4b, 0x45, 0x54, 0x4b, 0x46, 0x53, 0x4c,
+ 0x42, 0x4f, 0x48, 0x41, 0x4c, 0x47, 0x44, 0x4d, 0x4a, 0x4b, 0x54, 0x4f,
+ 0x3d, 0x46, 0x43, 0x38, 0x40, 0x42, 0x37, 0x3f, 0x42, 0x32, 0x39, 0x3e,
+ 0x2e, 0x36, 0x3b, 0x2c, 0x36, 0x3c, 0x29, 0x35, 0x3f, 0x27, 0x35, 0x43,
+ 0x26, 0x38, 0x4c, 0x22, 0x30, 0x3e, 0x0f, 0x16, 0x1b, 0x0a, 0x0c, 0x0b,
+ 0x0d, 0x0d, 0x0b, 0x0f, 0x0f, 0x0f, 0x09, 0x09, 0x09, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x07, 0x07, 0x05,
+ 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x0d, 0x0d, 0x0b, 0x0f, 0x0f, 0x0d, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0e, 0x11, 0x11, 0x13, 0x1f, 0x20, 0x22, 0x27, 0x28, 0x2c,
+ 0x1c, 0x1c, 0x20, 0x20, 0x1e, 0x24, 0x12, 0x12, 0x16, 0x06, 0x07, 0x0b,
+ 0x06, 0x07, 0x09, 0x06, 0x08, 0x06, 0x0b, 0x0d, 0x08, 0x1b, 0x1e, 0x17,
+ 0x27, 0x2b, 0x2c, 0x30, 0x34, 0x35, 0x31, 0x32, 0x36, 0x30, 0x30, 0x35,
+ 0x2b, 0x2c, 0x31, 0x22, 0x25, 0x29, 0x1e, 0x24, 0x24, 0x24, 0x2a, 0x28,
+ 0x16, 0x1f, 0x1b, 0x19, 0x20, 0x1c, 0x18, 0x1e, 0x1a, 0x12, 0x16, 0x13,
+ 0x0f, 0x11, 0x0e, 0x08, 0x0a, 0x09, 0x04, 0x06, 0x05, 0x06, 0x08, 0x07,
+ 0x0f, 0x0f, 0x0f, 0x16, 0x15, 0x15, 0x19, 0x19, 0x17, 0x1a, 0x1a, 0x18,
+ 0x1e, 0x1e, 0x1c, 0x20, 0x20, 0x1e, 0x20, 0x20, 0x1e, 0x1c, 0x1c, 0x1c,
+ 0x1b, 0x1c, 0x18, 0x1e, 0x1e, 0x1c, 0x19, 0x19, 0x17, 0x18, 0x1a, 0x18,
+ 0x16, 0x18, 0x17, 0x13, 0x14, 0x16, 0x0d, 0x11, 0x14, 0x0c, 0x10, 0x13,
+ 0x1e, 0x22, 0x25, 0x3f, 0x43, 0x44, 0x52, 0x54, 0x53, 0x5d, 0x5d, 0x5b,
+ 0x64, 0x63, 0x5f, 0x64, 0x63, 0x5f, 0x60, 0x5f, 0x5d, 0x56, 0x56, 0x53,
+ 0x47, 0x49, 0x43, 0x3c, 0x3e, 0x3a, 0x34, 0x36, 0x38, 0x30, 0x33, 0x39,
+ 0x34, 0x38, 0x3d, 0x35, 0x39, 0x3c, 0x39, 0x3d, 0x3c, 0x35, 0x3c, 0x38,
+ 0x31, 0x3a, 0x36, 0x34, 0x3c, 0x3d, 0x34, 0x3c, 0x3f, 0x36, 0x3c, 0x3f,
+ 0x35, 0x3b, 0x3b, 0x39, 0x3f, 0x3f, 0x36, 0x3b, 0x3e, 0x33, 0x37, 0x3b,
+ 0x32, 0x38, 0x36, 0x35, 0x3b, 0x3b, 0x35, 0x3a, 0x3f, 0x35, 0x3a, 0x41,
+ 0x35, 0x39, 0x41, 0x36, 0x3b, 0x41, 0x33, 0x3a, 0x3e, 0x35, 0x3c, 0x3f,
+ 0x3a, 0x41, 0x40, 0x3c, 0x41, 0x44, 0x39, 0x3e, 0x42, 0x35, 0x3a, 0x40,
+ 0x33, 0x37, 0x40, 0x35, 0x39, 0x44, 0x35, 0x39, 0x43, 0x37, 0x3b, 0x46,
+ 0x33, 0x3c, 0x3e, 0x32, 0x3a, 0x3c, 0x34, 0x3c, 0x3f, 0x3d, 0x45, 0x48,
+ 0x3f, 0x47, 0x4a, 0x38, 0x3f, 0x45, 0x32, 0x3b, 0x40, 0x33, 0x3c, 0x41,
+ 0x34, 0x3e, 0x43, 0x36, 0x3b, 0x43, 0x3a, 0x3a, 0x42, 0x3c, 0x3b, 0x41,
+ 0x38, 0x3f, 0x44, 0x2a, 0x42, 0x52, 0x28, 0x4e, 0x71, 0x37, 0x68, 0x9c,
+ 0x2f, 0x7a, 0xb9, 0x30, 0x7a, 0xc0, 0x2b, 0x73, 0xbf, 0x21, 0x68, 0xaf,
+ 0x12, 0x5a, 0x90, 0x09, 0x4c, 0x76, 0x0e, 0x45, 0x6c, 0x13, 0x43, 0x6c,
+ 0x12, 0x49, 0x6d, 0x0f, 0x43, 0x6a, 0x14, 0x41, 0x6b, 0x13, 0x3b, 0x66,
+ 0x12, 0x33, 0x5c, 0x0b, 0x2a, 0x4d, 0x0c, 0x25, 0x44, 0x0c, 0x22, 0x41,
+ 0x0d, 0x23, 0x39, 0x0d, 0x25, 0x3d, 0x0b, 0x24, 0x42, 0x0e, 0x26, 0x48,
+ 0x10, 0x2a, 0x4d, 0x0e, 0x28, 0x4b, 0x0d, 0x25, 0x47, 0x0a, 0x23, 0x43,
+ 0x0e, 0x1d, 0x38, 0x21, 0x2c, 0x2c, 0x4b, 0x52, 0x3d, 0x7a, 0x82, 0x73,
+ 0x5c, 0x67, 0x73, 0x1e, 0x33, 0x54, 0x0d, 0x28, 0x49, 0x09, 0x27, 0x40,
+ 0x0d, 0x23, 0x37, 0x0c, 0x1c, 0x2a, 0x0e, 0x1d, 0x24, 0x13, 0x25, 0x2d,
+ 0x19, 0x32, 0x42, 0x13, 0x31, 0x4d, 0x10, 0x2d, 0x54, 0x15, 0x31, 0x5c,
+ 0x13, 0x2d, 0x54, 0x11, 0x27, 0x3e, 0x14, 0x28, 0x36, 0x1a, 0x2f, 0x45,
+ 0x1e, 0x32, 0x4d, 0x18, 0x2b, 0x3e, 0x14, 0x22, 0x2d, 0x21, 0x30, 0x3a,
+ 0x1f, 0x4f, 0x70, 0x14, 0x44, 0x70, 0x15, 0x36, 0x58, 0x23, 0x39, 0x50,
+ 0x20, 0x3c, 0x54, 0x16, 0x2e, 0x45, 0x17, 0x2d, 0x3b, 0x19, 0x35, 0x43,
+ 0x19, 0x33, 0x52, 0x16, 0x3d, 0x5b, 0x1d, 0x54, 0x73, 0x25, 0x68, 0x9e,
+ 0x2f, 0x78, 0xcc, 0x3a, 0x87, 0xd9, 0x3a, 0x88, 0xcd, 0x34, 0x81, 0xc7,
+ 0x31, 0x62, 0x8e, 0x1d, 0x38, 0x4f, 0x1c, 0x24, 0x25, 0x24, 0x24, 0x1b,
+ 0x20, 0x27, 0x23, 0x14, 0x1f, 0x22, 0x1c, 0x23, 0x28, 0x28, 0x28, 0x2a,
+ 0x24, 0x27, 0x29, 0x1e, 0x22, 0x25, 0x13, 0x17, 0x1a, 0x0e, 0x11, 0x15,
+ 0x0a, 0x0d, 0x12, 0x0b, 0x0e, 0x11, 0x0c, 0x10, 0x11, 0x12, 0x16, 0x17,
+ 0x1d, 0x1e, 0x20, 0x26, 0x28, 0x2a, 0x31, 0x32, 0x34, 0x29, 0x2d, 0x2e,
+ 0x11, 0x15, 0x14, 0x11, 0x17, 0x15, 0x13, 0x19, 0x17, 0x14, 0x1a, 0x18,
+ 0x0f, 0x11, 0x11, 0x07, 0x09, 0x08, 0x07, 0x09, 0x08, 0x0b, 0x0d, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x11, 0x11, 0x11,
+ 0x08, 0x08, 0x08, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x0f, 0x0f, 0x10,
+ 0x07, 0x08, 0x0a, 0x11, 0x12, 0x14, 0x1d, 0x1e, 0x20, 0x32, 0x34, 0x36,
+ 0x36, 0x3a, 0x40, 0x2c, 0x31, 0x37, 0x18, 0x1d, 0x21, 0x0a, 0x0f, 0x11,
+ 0x0d, 0x11, 0x12, 0x12, 0x16, 0x15, 0x1c, 0x21, 0x1d, 0x1c, 0x21, 0x1d,
+ 0x31, 0x32, 0x34, 0x1d, 0x1e, 0x20, 0x0c, 0x0d, 0x0f, 0x0e, 0x0f, 0x11,
+ 0x12, 0x13, 0x15, 0x1b, 0x1c, 0x1e, 0x21, 0x23, 0x23, 0x1e, 0x21, 0x1f,
+ 0x1c, 0x20, 0x1f, 0x1e, 0x22, 0x21, 0x25, 0x28, 0x26, 0x23, 0x25, 0x23,
+ 0x1e, 0x20, 0x1d, 0x1d, 0x1e, 0x1b, 0x1b, 0x1d, 0x1a, 0x1b, 0x1d, 0x1a,
+ 0x1c, 0x1d, 0x19, 0x1c, 0x1d, 0x18, 0x1c, 0x1d, 0x18, 0x1c, 0x1d, 0x18,
+ 0x1d, 0x1e, 0x19, 0x1e, 0x1e, 0x19, 0x1e, 0x1d, 0x19, 0x1f, 0x1e, 0x1a,
+ 0x1f, 0x20, 0x1b, 0x1e, 0x1e, 0x1c, 0x17, 0x17, 0x15, 0x09, 0x09, 0x09,
+ 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09,
+ 0x11, 0x13, 0x10, 0x18, 0x18, 0x16, 0x15, 0x15, 0x13, 0x12, 0x12, 0x12,
+ 0x11, 0x11, 0x11, 0x17, 0x14, 0x13, 0x1d, 0x13, 0x0f, 0x29, 0x19, 0x10,
+ 0x3c, 0x26, 0x18, 0x48, 0x32, 0x21, 0x4b, 0x3c, 0x27, 0x4a, 0x4d, 0x2f,
+ 0x7e, 0x92, 0x6f, 0xab, 0xc9, 0xa3, 0xac, 0xc8, 0xa4, 0xa3, 0xba, 0x99,
+ 0x91, 0xa5, 0x7f, 0x7f, 0x92, 0x6c, 0x76, 0x83, 0x5f, 0x71, 0x78, 0x52,
+ 0x75, 0x75, 0x4e, 0x80, 0x79, 0x4b, 0x8b, 0x7e, 0x4f, 0x94, 0x84, 0x53,
+ 0x4e, 0x50, 0x4b, 0x4c, 0x50, 0x49, 0x4a, 0x4f, 0x48, 0x4d, 0x54, 0x4c,
+ 0x4e, 0x56, 0x4c, 0x51, 0x59, 0x4d, 0x56, 0x5c, 0x50, 0x50, 0x56, 0x4a,
+ 0x4e, 0x56, 0x4b, 0x54, 0x5c, 0x51, 0x55, 0x5c, 0x51, 0x57, 0x5d, 0x53,
+ 0x55, 0x5b, 0x51, 0x52, 0x59, 0x4f, 0x4e, 0x56, 0x4d, 0x50, 0x59, 0x4f,
+ 0x4c, 0x59, 0x4d, 0x4c, 0x59, 0x4f, 0x4b, 0x58, 0x4f, 0x49, 0x56, 0x4d,
+ 0x48, 0x55, 0x4e, 0x43, 0x4e, 0x48, 0x45, 0x4e, 0x49, 0x4b, 0x54, 0x4f,
+ 0x3c, 0x46, 0x42, 0x39, 0x42, 0x43, 0x36, 0x3e, 0x41, 0x32, 0x3a, 0x3d,
+ 0x2e, 0x37, 0x3c, 0x2e, 0x39, 0x3f, 0x27, 0x34, 0x3e, 0x28, 0x35, 0x43,
+ 0x23, 0x35, 0x49, 0x23, 0x31, 0x3f, 0x12, 0x1a, 0x1f, 0x08, 0x0c, 0x0a,
+ 0x0e, 0x0f, 0x0d, 0x0f, 0x11, 0x10, 0x0a, 0x0a, 0x0a, 0x06, 0x04, 0x05,
+ 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, 0x08, 0x08, 0x07, 0x06, 0x06, 0x04,
+ 0x07, 0x07, 0x05, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x0f, 0x0f, 0x0d, 0x13, 0x13, 0x11, 0x0e, 0x0e, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x15, 0x15, 0x17, 0x2d, 0x2e, 0x30, 0x3a, 0x3b, 0x3d,
+ 0x2a, 0x2b, 0x30, 0x2e, 0x2e, 0x33, 0x29, 0x2a, 0x2f, 0x19, 0x1b, 0x20,
+ 0x0b, 0x0c, 0x10, 0x05, 0x06, 0x08, 0x04, 0x06, 0x03, 0x01, 0x06, 0x01,
+ 0x0b, 0x0f, 0x11, 0x1b, 0x1f, 0x20, 0x32, 0x34, 0x34, 0x32, 0x33, 0x35,
+ 0x30, 0x31, 0x35, 0x23, 0x24, 0x28, 0x18, 0x1c, 0x1b, 0x1f, 0x25, 0x1f,
+ 0x19, 0x1f, 0x1d, 0x1c, 0x20, 0x1e, 0x14, 0x16, 0x15, 0x0d, 0x0f, 0x0e,
+ 0x0a, 0x0a, 0x09, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x0e, 0x0e,
+ 0x13, 0x13, 0x13, 0x17, 0x17, 0x17, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x1f,
+ 0x1e, 0x1f, 0x1a, 0x1e, 0x1e, 0x1c, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1a,
+ 0x1b, 0x1b, 0x19, 0x1c, 0x1c, 0x1a, 0x1b, 0x1b, 0x1b, 0x1b, 0x1d, 0x1d,
+ 0x14, 0x15, 0x17, 0x0a, 0x0e, 0x0f, 0x0a, 0x0e, 0x10, 0x0c, 0x10, 0x13,
+ 0x24, 0x28, 0x29, 0x4d, 0x51, 0x50, 0x5e, 0x5e, 0x5c, 0x62, 0x62, 0x5e,
+ 0x62, 0x61, 0x5d, 0x5c, 0x5d, 0x58, 0x54, 0x56, 0x51, 0x49, 0x4b, 0x47,
+ 0x3e, 0x40, 0x3d, 0x38, 0x3a, 0x39, 0x35, 0x39, 0x3a, 0x34, 0x37, 0x3c,
+ 0x33, 0x36, 0x3b, 0x34, 0x37, 0x3c, 0x38, 0x3c, 0x3f, 0x3c, 0x41, 0x43,
+ 0x37, 0x3d, 0x3e, 0x35, 0x3a, 0x3d, 0x35, 0x3a, 0x3e, 0x34, 0x39, 0x3d,
+ 0x34, 0x39, 0x3c, 0x36, 0x3b, 0x3e, 0x35, 0x3a, 0x3f, 0x35, 0x3a, 0x40,
+ 0x36, 0x3b, 0x3e, 0x34, 0x39, 0x3d, 0x37, 0x3c, 0x40, 0x36, 0x3b, 0x41,
+ 0x35, 0x3a, 0x40, 0x34, 0x39, 0x40, 0x35, 0x3a, 0x40, 0x36, 0x3b, 0x3f,
+ 0x37, 0x3d, 0x3c, 0x37, 0x3d, 0x3d, 0x35, 0x3a, 0x3d, 0x36, 0x3b, 0x3f,
+ 0x36, 0x3a, 0x43, 0x33, 0x37, 0x42, 0x35, 0x39, 0x44, 0x35, 0x39, 0x43,
+ 0x34, 0x3d, 0x3c, 0x33, 0x3b, 0x3a, 0x34, 0x39, 0x3c, 0x36, 0x3b, 0x3f,
+ 0x3a, 0x40, 0x44, 0x35, 0x3c, 0x40, 0x2f, 0x37, 0x3b, 0x31, 0x3b, 0x3e,
+ 0x33, 0x3c, 0x42, 0x34, 0x3b, 0x43, 0x36, 0x39, 0x44, 0x35, 0x3d, 0x4a,
+ 0x32, 0x47, 0x5b, 0x30, 0x58, 0x7d, 0x32, 0x6a, 0xa3, 0x32, 0x78, 0xbd,
+ 0x26, 0x7c, 0xc1, 0x24, 0x73, 0xb8, 0x20, 0x65, 0xa6, 0x17, 0x54, 0x8c,
+ 0x10, 0x49, 0x73, 0x0f, 0x45, 0x69, 0x10, 0x42, 0x68, 0x15, 0x43, 0x6a,
+ 0x0f, 0x46, 0x68, 0x0f, 0x42, 0x68, 0x13, 0x3b, 0x66, 0x11, 0x30, 0x5c,
+ 0x10, 0x27, 0x4f, 0x0c, 0x22, 0x44, 0x0d, 0x21, 0x42, 0x0a, 0x21, 0x40,
+ 0x0d, 0x23, 0x3c, 0x0b, 0x23, 0x3f, 0x0d, 0x27, 0x46, 0x0d, 0x2a, 0x4a,
+ 0x0e, 0x2b, 0x4d, 0x0c, 0x28, 0x4a, 0x0b, 0x25, 0x47, 0x0d, 0x25, 0x46,
+ 0x0e, 0x1e, 0x30, 0x0d, 0x19, 0x20, 0x0f, 0x1a, 0x1a, 0x37, 0x48, 0x4a,
+ 0x41, 0x59, 0x65, 0x17, 0x32, 0x4c, 0x0b, 0x27, 0x45, 0x0d, 0x24, 0x44,
+ 0x0c, 0x1e, 0x33, 0x0c, 0x1c, 0x28, 0x0f, 0x1e, 0x24, 0x13, 0x28, 0x2e,
+ 0x16, 0x32, 0x40, 0x15, 0x35, 0x4f, 0x15, 0x35, 0x59, 0x17, 0x34, 0x5d,
+ 0x12, 0x2e, 0x4f, 0x13, 0x29, 0x3b, 0x15, 0x2a, 0x31, 0x1a, 0x32, 0x3e,
+ 0x1e, 0x35, 0x44, 0x17, 0x27, 0x34, 0x19, 0x27, 0x32, 0x22, 0x34, 0x42,
+ 0x1f, 0x43, 0x63, 0x13, 0x39, 0x61, 0x1a, 0x35, 0x56, 0x23, 0x39, 0x54,
+ 0x1b, 0x39, 0x55, 0x16, 0x2e, 0x43, 0x1f, 0x2c, 0x35, 0x23, 0x31, 0x3c,
+ 0x1d, 0x32, 0x59, 0x1d, 0x44, 0x73, 0x26, 0x66, 0x9a, 0x2b, 0x7d, 0xc8,
+ 0x30, 0x82, 0xe8, 0x38, 0x82, 0xde, 0x3a, 0x77, 0xb6, 0x38, 0x67, 0x95,
+ 0x29, 0x38, 0x4b, 0x1a, 0x24, 0x30, 0x1c, 0x23, 0x28, 0x23, 0x26, 0x24,
+ 0x1c, 0x1e, 0x19, 0x0a, 0x0f, 0x08, 0x09, 0x0f, 0x0e, 0x16, 0x1f, 0x1e,
+ 0x23, 0x25, 0x27, 0x28, 0x2b, 0x2e, 0x25, 0x29, 0x2d, 0x1f, 0x24, 0x28,
+ 0x1b, 0x1f, 0x24, 0x1a, 0x1f, 0x22, 0x1e, 0x22, 0x23, 0x28, 0x2c, 0x2c,
+ 0x24, 0x26, 0x28, 0x24, 0x27, 0x28, 0x1c, 0x20, 0x21, 0x14, 0x18, 0x17,
+ 0x11, 0x17, 0x15, 0x16, 0x1a, 0x19, 0x15, 0x19, 0x18, 0x0c, 0x10, 0x0f,
+ 0x06, 0x06, 0x06, 0x05, 0x06, 0x05, 0x07, 0x09, 0x08, 0x17, 0x19, 0x18,
+ 0x0f, 0x11, 0x10, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x10, 0x0e, 0x0f,
+ 0x08, 0x08, 0x08, 0x03, 0x04, 0x03, 0x07, 0x07, 0x07, 0x0a, 0x0b, 0x0d,
+ 0x10, 0x11, 0x14, 0x2c, 0x30, 0x32, 0x35, 0x39, 0x3b, 0x33, 0x37, 0x3a,
+ 0x43, 0x4b, 0x4e, 0x56, 0x5c, 0x5f, 0x2b, 0x2f, 0x32, 0x0a, 0x0e, 0x0f,
+ 0x09, 0x0b, 0x0d, 0x0c, 0x0e, 0x0d, 0x15, 0x17, 0x16, 0x19, 0x1b, 0x1a,
+ 0x23, 0x24, 0x26, 0x20, 0x21, 0x23, 0x1b, 0x1c, 0x1e, 0x16, 0x17, 0x19,
+ 0x16, 0x17, 0x19, 0x1e, 0x1f, 0x21, 0x1f, 0x20, 0x20, 0x1d, 0x1f, 0x1e,
+ 0x1e, 0x23, 0x20, 0x1e, 0x23, 0x1f, 0x1c, 0x1e, 0x1b, 0x1a, 0x1c, 0x19,
+ 0x1b, 0x1c, 0x19, 0x1a, 0x1a, 0x18, 0x1a, 0x1c, 0x19, 0x1f, 0x21, 0x1e,
+ 0x1a, 0x1b, 0x18, 0x1b, 0x1b, 0x18, 0x1c, 0x1d, 0x19, 0x1e, 0x1e, 0x1a,
+ 0x1c, 0x1d, 0x19, 0x1b, 0x1c, 0x17, 0x1c, 0x1d, 0x19, 0x1e, 0x1e, 0x19,
+ 0x1f, 0x20, 0x1c, 0x1b, 0x1b, 0x19, 0x1d, 0x1d, 0x1b, 0x0f, 0x0f, 0x0f,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08,
+ 0x0e, 0x11, 0x0d, 0x16, 0x16, 0x14, 0x14, 0x14, 0x13, 0x13, 0x12, 0x12,
+ 0x12, 0x12, 0x12, 0x18, 0x15, 0x14, 0x1e, 0x15, 0x11, 0x2c, 0x1d, 0x14,
+ 0x43, 0x29, 0x1e, 0x4d, 0x3a, 0x29, 0x5d, 0x58, 0x3c, 0x9b, 0xa8, 0x7f,
+ 0xc4, 0xdf, 0xae, 0xbf, 0xe0, 0xac, 0xbc, 0xdb, 0xa9, 0xb7, 0xd3, 0xa3,
+ 0xaf, 0xc8, 0x9f, 0xa3, 0xb9, 0x94, 0x94, 0xa9, 0x85, 0x81, 0x93, 0x6f,
+ 0x76, 0x83, 0x5b, 0x71, 0x79, 0x4c, 0x74, 0x77, 0x4d, 0x7a, 0x78, 0x4f,
+ 0x49, 0x4f, 0x45, 0x4c, 0x52, 0x48, 0x4d, 0x53, 0x49, 0x4d, 0x55, 0x4a,
+ 0x4c, 0x54, 0x49, 0x4f, 0x57, 0x4a, 0x58, 0x5e, 0x51, 0x53, 0x59, 0x4d,
+ 0x55, 0x5e, 0x53, 0x58, 0x62, 0x57, 0x58, 0x60, 0x55, 0x57, 0x5f, 0x54,
+ 0x54, 0x5c, 0x51, 0x55, 0x5d, 0x52, 0x50, 0x5a, 0x4d, 0x4e, 0x59, 0x4b,
+ 0x4e, 0x5a, 0x4e, 0x4e, 0x5a, 0x4e, 0x4c, 0x59, 0x4f, 0x4a, 0x57, 0x4e,
+ 0x4a, 0x55, 0x4f, 0x42, 0x4d, 0x47, 0x41, 0x4a, 0x45, 0x40, 0x49, 0x44,
+ 0x3b, 0x46, 0x41, 0x38, 0x43, 0x41, 0x36, 0x3e, 0x42, 0x34, 0x3d, 0x3f,
+ 0x30, 0x39, 0x3d, 0x2d, 0x37, 0x3d, 0x28, 0x36, 0x3f, 0x29, 0x37, 0x45,
+ 0x23, 0x35, 0x49, 0x25, 0x33, 0x41, 0x15, 0x1c, 0x21, 0x06, 0x0a, 0x08,
+ 0x0a, 0x0c, 0x09, 0x0d, 0x0f, 0x0e, 0x0c, 0x0c, 0x0c, 0x07, 0x05, 0x06,
+ 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x08, 0x08, 0x07, 0x08, 0x08, 0x06,
+ 0x08, 0x08, 0x06, 0x07, 0x07, 0x06, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0d, 0x0d, 0x0b, 0x12, 0x12, 0x10, 0x0e, 0x0e, 0x0b, 0x0a, 0x0a, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x10, 0x10, 0x10, 0x18, 0x1a, 0x19, 0x28, 0x2a, 0x29,
+ 0x26, 0x28, 0x27, 0x26, 0x28, 0x29, 0x2f, 0x32, 0x35, 0x38, 0x3a, 0x42,
+ 0x2d, 0x30, 0x37, 0x18, 0x1a, 0x21, 0x05, 0x08, 0x0d, 0x02, 0x06, 0x0a,
+ 0x05, 0x07, 0x0a, 0x08, 0x0a, 0x09, 0x17, 0x19, 0x14, 0x1c, 0x1e, 0x1b,
+ 0x29, 0x2a, 0x2c, 0x20, 0x21, 0x23, 0x15, 0x17, 0x16, 0x1c, 0x20, 0x1a,
+ 0x18, 0x1c, 0x1b, 0x15, 0x19, 0x18, 0x10, 0x12, 0x11, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x12, 0x12, 0x10, 0x17, 0x17, 0x15,
+ 0x15, 0x15, 0x13, 0x17, 0x17, 0x15, 0x20, 0x21, 0x1c, 0x20, 0x21, 0x1d,
+ 0x21, 0x22, 0x1c, 0x1c, 0x1d, 0x18, 0x1a, 0x1b, 0x16, 0x18, 0x18, 0x15,
+ 0x19, 0x19, 0x19, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1e, 0x15, 0x16, 0x18,
+ 0x0e, 0x0e, 0x11, 0x09, 0x0d, 0x0e, 0x08, 0x0c, 0x0f, 0x0a, 0x0e, 0x11,
+ 0x21, 0x26, 0x22, 0x58, 0x5a, 0x55, 0x63, 0x64, 0x5f, 0x60, 0x61, 0x5b,
+ 0x5a, 0x5b, 0x55, 0x4f, 0x51, 0x4c, 0x44, 0x49, 0x44, 0x3b, 0x40, 0x3d,
+ 0x39, 0x3a, 0x3c, 0x39, 0x3d, 0x3e, 0x38, 0x3c, 0x3d, 0x36, 0x3a, 0x3e,
+ 0x34, 0x38, 0x3c, 0x36, 0x3a, 0x3f, 0x38, 0x3d, 0x43, 0x3c, 0x41, 0x47,
+ 0x3b, 0x3f, 0x42, 0x37, 0x3b, 0x40, 0x35, 0x38, 0x3f, 0x34, 0x39, 0x3f,
+ 0x36, 0x3b, 0x3f, 0x35, 0x3c, 0x3f, 0x36, 0x3d, 0x43, 0x35, 0x3c, 0x44,
+ 0x34, 0x3b, 0x42, 0x34, 0x3b, 0x42, 0x37, 0x3e, 0x43, 0x34, 0x39, 0x3f,
+ 0x35, 0x3a, 0x40, 0x35, 0x39, 0x3f, 0x35, 0x38, 0x40, 0x37, 0x3b, 0x41,
+ 0x37, 0x3d, 0x3e, 0x35, 0x3a, 0x3d, 0x33, 0x38, 0x3c, 0x36, 0x3b, 0x3f,
+ 0x37, 0x3c, 0x42, 0x36, 0x3b, 0x41, 0x36, 0x3b, 0x41, 0x35, 0x3a, 0x3e,
+ 0x33, 0x3b, 0x3b, 0x34, 0x3c, 0x3d, 0x34, 0x39, 0x3d, 0x35, 0x3a, 0x40,
+ 0x35, 0x3a, 0x40, 0x32, 0x39, 0x3f, 0x33, 0x39, 0x3f, 0x31, 0x38, 0x3e,
+ 0x32, 0x3b, 0x40, 0x33, 0x3f, 0x45, 0x2e, 0x40, 0x4d, 0x2c, 0x49, 0x62,
+ 0x33, 0x5d, 0x89, 0x39, 0x73, 0xaf, 0x32, 0x79, 0xc0, 0x29, 0x7a, 0xc3,
+ 0x21, 0x71, 0xb3, 0x1a, 0x63, 0x9c, 0x13, 0x51, 0x81, 0x10, 0x47, 0x70,
+ 0x13, 0x44, 0x6d, 0x13, 0x44, 0x6d, 0x12, 0x42, 0x6b, 0x11, 0x40, 0x69,
+ 0x13, 0x3f, 0x63, 0x0e, 0x37, 0x5d, 0x0a, 0x2f, 0x58, 0x0a, 0x29, 0x4f,
+ 0x0c, 0x25, 0x46, 0x0e, 0x23, 0x3f, 0x0d, 0x22, 0x40, 0x0b, 0x1f, 0x40,
+ 0x0d, 0x22, 0x3f, 0x0c, 0x24, 0x40, 0x0e, 0x29, 0x46, 0x0d, 0x2b, 0x49,
+ 0x0d, 0x2a, 0x48, 0x0d, 0x27, 0x47, 0x0c, 0x25, 0x44, 0x0f, 0x25, 0x45,
+ 0x10, 0x1f, 0x33, 0x0b, 0x18, 0x27, 0x0d, 0x1a, 0x25, 0x12, 0x25, 0x2d,
+ 0x1a, 0x34, 0x3f, 0x14, 0x2f, 0x44, 0x0d, 0x25, 0x43, 0x10, 0x22, 0x47,
+ 0x0c, 0x1f, 0x33, 0x0b, 0x1b, 0x26, 0x10, 0x1f, 0x26, 0x18, 0x2d, 0x33,
+ 0x17, 0x33, 0x41, 0x13, 0x36, 0x4f, 0x16, 0x37, 0x59, 0x17, 0x36, 0x5d,
+ 0x12, 0x2d, 0x4d, 0x14, 0x28, 0x3b, 0x17, 0x2b, 0x33, 0x1a, 0x34, 0x41,
+ 0x1c, 0x34, 0x44, 0x17, 0x27, 0x34, 0x15, 0x23, 0x2b, 0x17, 0x2d, 0x37,
+ 0x1f, 0x3a, 0x57, 0x15, 0x36, 0x5d, 0x19, 0x35, 0x58, 0x20, 0x39, 0x57,
+ 0x1a, 0x38, 0x54, 0x16, 0x2f, 0x42, 0x1d, 0x2d, 0x3c, 0x19, 0x32, 0x4a,
+ 0x13, 0x41, 0x72, 0x23, 0x5a, 0xa3, 0x30, 0x77, 0xc7, 0x33, 0x86, 0xd5,
+ 0x32, 0x80, 0xd5, 0x32, 0x6e, 0xb6, 0x2c, 0x4e, 0x76, 0x2b, 0x3b, 0x4e,
+ 0x21, 0x23, 0x26, 0x1d, 0x22, 0x25, 0x1e, 0x25, 0x2b, 0x27, 0x2c, 0x2e,
+ 0x22, 0x22, 0x20, 0x0c, 0x0d, 0x08, 0x07, 0x09, 0x06, 0x07, 0x0c, 0x0c,
+ 0x0f, 0x12, 0x10, 0x1c, 0x20, 0x1f, 0x25, 0x2a, 0x2b, 0x26, 0x2b, 0x2e,
+ 0x21, 0x26, 0x29, 0x24, 0x2a, 0x2a, 0x37, 0x3c, 0x3a, 0x5f, 0x64, 0x60,
+ 0x32, 0x36, 0x37, 0x13, 0x17, 0x18, 0x0f, 0x15, 0x13, 0x0f, 0x15, 0x13,
+ 0x14, 0x1a, 0x18, 0x16, 0x1a, 0x19, 0x0d, 0x10, 0x0f, 0x06, 0x08, 0x07,
+ 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x06, 0x07, 0x07, 0x19, 0x1b, 0x1a,
+ 0x0d, 0x0f, 0x0e, 0x04, 0x06, 0x05, 0x07, 0x07, 0x07, 0x0d, 0x0c, 0x0d,
+ 0x09, 0x09, 0x09, 0x02, 0x02, 0x02, 0x05, 0x07, 0x06, 0x0c, 0x0d, 0x0f,
+ 0x19, 0x1d, 0x1e, 0x2e, 0x32, 0x35, 0x32, 0x37, 0x3b, 0x27, 0x2c, 0x30,
+ 0x26, 0x2f, 0x2e, 0x32, 0x38, 0x37, 0x23, 0x27, 0x28, 0x17, 0x18, 0x1a,
+ 0x0e, 0x0e, 0x10, 0x0c, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e, 0x0f, 0x10, 0x12,
+ 0x16, 0x17, 0x19, 0x1d, 0x1e, 0x20, 0x22, 0x23, 0x25, 0x20, 0x21, 0x23,
+ 0x20, 0x21, 0x23, 0x1d, 0x1e, 0x20, 0x1d, 0x1f, 0x1e, 0x21, 0x23, 0x22,
+ 0x1d, 0x22, 0x1e, 0x14, 0x19, 0x15, 0x10, 0x12, 0x0f, 0x13, 0x15, 0x12,
+ 0x1b, 0x1b, 0x19, 0x1b, 0x1b, 0x19, 0x1e, 0x20, 0x1d, 0x1e, 0x20, 0x1d,
+ 0x18, 0x18, 0x16, 0x1a, 0x1a, 0x18, 0x18, 0x19, 0x16, 0x1f, 0x1f, 0x1d,
+ 0x1c, 0x1c, 0x1a, 0x1a, 0x1a, 0x18, 0x1b, 0x1c, 0x18, 0x1a, 0x1b, 0x16,
+ 0x1c, 0x1d, 0x18, 0x1b, 0x1b, 0x19, 0x1e, 0x1e, 0x1c, 0x10, 0x10, 0x10,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08,
+ 0x0d, 0x0f, 0x0c, 0x13, 0x13, 0x11, 0x14, 0x14, 0x12, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x17, 0x14, 0x13, 0x20, 0x16, 0x12, 0x31, 0x22, 0x19,
+ 0x41, 0x31, 0x1f, 0x5f, 0x5d, 0x42, 0xa3, 0xb4, 0x8b, 0xc3, 0xe0, 0xad,
+ 0xc2, 0xe4, 0xab, 0xc0, 0xe0, 0xa7, 0xbf, 0xdc, 0xa6, 0xb9, 0xd4, 0xa2,
+ 0xb7, 0xd0, 0xa7, 0xb1, 0xc9, 0xa4, 0xa8, 0xc0, 0x9e, 0x9d, 0xb5, 0x91,
+ 0x92, 0xa6, 0x7f, 0x85, 0x95, 0x6f, 0x7b, 0x87, 0x67, 0x71, 0x79, 0x5e,
+ 0x46, 0x4b, 0x40, 0x4a, 0x50, 0x45, 0x4e, 0x56, 0x49, 0x4e, 0x56, 0x49,
+ 0x49, 0x51, 0x45, 0x4e, 0x56, 0x49, 0x54, 0x5a, 0x4e, 0x55, 0x5b, 0x4f,
+ 0x56, 0x61, 0x55, 0x56, 0x61, 0x56, 0x52, 0x5d, 0x52, 0x53, 0x5d, 0x52,
+ 0x52, 0x5c, 0x4f, 0x53, 0x5d, 0x4f, 0x52, 0x5e, 0x4f, 0x4d, 0x59, 0x4b,
+ 0x4d, 0x57, 0x4c, 0x4d, 0x57, 0x4d, 0x4c, 0x58, 0x4f, 0x4e, 0x59, 0x51,
+ 0x4a, 0x55, 0x4d, 0x43, 0x4d, 0x48, 0x3f, 0x47, 0x43, 0x3f, 0x47, 0x43,
+ 0x3c, 0x47, 0x42, 0x36, 0x41, 0x40, 0x37, 0x3f, 0x43, 0x35, 0x3d, 0x40,
+ 0x33, 0x3d, 0x41, 0x2c, 0x37, 0x3e, 0x2a, 0x3a, 0x43, 0x2b, 0x3c, 0x49,
+ 0x24, 0x36, 0x4c, 0x26, 0x34, 0x43, 0x1c, 0x24, 0x2a, 0x04, 0x08, 0x08,
+ 0x06, 0x07, 0x04, 0x0a, 0x0c, 0x0a, 0x0e, 0x0e, 0x0d, 0x09, 0x07, 0x08,
+ 0x02, 0x02, 0x02, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x09, 0x08,
+ 0x09, 0x09, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0a, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0b, 0x0a, 0x0a, 0x09,
+ 0x0b, 0x0b, 0x09, 0x0e, 0x0f, 0x0d, 0x06, 0x07, 0x05, 0x0a, 0x0c, 0x09,
+ 0x19, 0x1d, 0x17, 0x25, 0x29, 0x26, 0x29, 0x2d, 0x2e, 0x31, 0x34, 0x3b,
+ 0x3e, 0x40, 0x4c, 0x39, 0x3b, 0x47, 0x20, 0x22, 0x2e, 0x0c, 0x0f, 0x1a,
+ 0x09, 0x08, 0x0f, 0x08, 0x08, 0x08, 0x05, 0x07, 0x00, 0x05, 0x08, 0x03,
+ 0x10, 0x11, 0x12, 0x14, 0x15, 0x17, 0x12, 0x14, 0x13, 0x1a, 0x1d, 0x19,
+ 0x10, 0x14, 0x15, 0x07, 0x0b, 0x0c, 0x08, 0x09, 0x0a, 0x08, 0x07, 0x08,
+ 0x0b, 0x0b, 0x09, 0x0d, 0x0d, 0x0b, 0x15, 0x16, 0x11, 0x19, 0x19, 0x14,
+ 0x16, 0x16, 0x13, 0x15, 0x15, 0x13, 0x17, 0x18, 0x13, 0x1a, 0x1b, 0x16,
+ 0x21, 0x22, 0x1d, 0x1c, 0x1d, 0x18, 0x19, 0x1b, 0x16, 0x1c, 0x1d, 0x19,
+ 0x1c, 0x1c, 0x1d, 0x1a, 0x1a, 0x1c, 0x14, 0x14, 0x16, 0x0e, 0x0f, 0x11,
+ 0x0a, 0x0b, 0x0d, 0x0a, 0x0d, 0x0f, 0x0a, 0x0e, 0x11, 0x09, 0x0d, 0x10,
+ 0x1e, 0x21, 0x1c, 0x56, 0x58, 0x52, 0x5e, 0x5f, 0x59, 0x55, 0x57, 0x51,
+ 0x4b, 0x4c, 0x46, 0x3e, 0x43, 0x3d, 0x37, 0x3d, 0x39, 0x34, 0x3d, 0x3a,
+ 0x37, 0x3a, 0x3f, 0x39, 0x3c, 0x40, 0x38, 0x3c, 0x3f, 0x37, 0x3b, 0x3e,
+ 0x39, 0x3d, 0x40, 0x38, 0x3d, 0x43, 0x3a, 0x3e, 0x46, 0x3b, 0x3f, 0x49,
+ 0x3a, 0x3c, 0x41, 0x35, 0x38, 0x3f, 0x36, 0x39, 0x42, 0x36, 0x3a, 0x43,
+ 0x35, 0x3b, 0x41, 0x35, 0x3d, 0x40, 0x39, 0x3f, 0x45, 0x38, 0x41, 0x47,
+ 0x38, 0x40, 0x49, 0x36, 0x3e, 0x45, 0x35, 0x3c, 0x42, 0x33, 0x38, 0x3c,
+ 0x33, 0x38, 0x3c, 0x37, 0x3a, 0x40, 0x37, 0x38, 0x3f, 0x37, 0x38, 0x41,
+ 0x36, 0x3b, 0x41, 0x36, 0x3b, 0x40, 0x34, 0x39, 0x3e, 0x35, 0x3a, 0x3e,
+ 0x35, 0x3b, 0x3e, 0x37, 0x3c, 0x3f, 0x39, 0x3f, 0x40, 0x39, 0x40, 0x3d,
+ 0x33, 0x3b, 0x3c, 0x35, 0x3a, 0x3e, 0x37, 0x3b, 0x41, 0x36, 0x3a, 0x42,
+ 0x35, 0x39, 0x42, 0x33, 0x3b, 0x42, 0x34, 0x3b, 0x42, 0x34, 0x3b, 0x40,
+ 0x35, 0x3d, 0x40, 0x33, 0x44, 0x4a, 0x30, 0x52, 0x64, 0x30, 0x62, 0x8a,
+ 0x34, 0x73, 0xaf, 0x31, 0x79, 0xc3, 0x26, 0x74, 0xbe, 0x1d, 0x6f, 0xb5,
+ 0x19, 0x5e, 0x98, 0x0e, 0x4e, 0x7e, 0x0c, 0x46, 0x6c, 0x11, 0x45, 0x69,
+ 0x12, 0x42, 0x6c, 0x13, 0x43, 0x70, 0x14, 0x44, 0x71, 0x0e, 0x3b, 0x65,
+ 0x11, 0x30, 0x56, 0x0d, 0x2e, 0x53, 0x07, 0x29, 0x4f, 0x07, 0x29, 0x4a,
+ 0x0b, 0x28, 0x43, 0x0d, 0x24, 0x3c, 0x0d, 0x22, 0x3d, 0x0c, 0x21, 0x40,
+ 0x0c, 0x20, 0x40, 0x0c, 0x23, 0x41, 0x0c, 0x27, 0x42, 0x0b, 0x28, 0x42,
+ 0x0c, 0x2b, 0x47, 0x0c, 0x28, 0x45, 0x0d, 0x25, 0x44, 0x0e, 0x23, 0x42,
+ 0x0c, 0x1d, 0x38, 0x0d, 0x1c, 0x2c, 0x12, 0x1f, 0x26, 0x15, 0x26, 0x2b,
+ 0x1a, 0x30, 0x3c, 0x12, 0x2b, 0x43, 0x0f, 0x25, 0x44, 0x12, 0x22, 0x43,
+ 0x0e, 0x1f, 0x35, 0x0d, 0x1c, 0x2a, 0x12, 0x20, 0x28, 0x1a, 0x2e, 0x35,
+ 0x18, 0x37, 0x42, 0x1b, 0x3d, 0x54, 0x28, 0x48, 0x66, 0x25, 0x42, 0x63,
+ 0x1b, 0x35, 0x58, 0x17, 0x2a, 0x44, 0x18, 0x2a, 0x3f, 0x1a, 0x32, 0x4a,
+ 0x1b, 0x32, 0x49, 0x19, 0x26, 0x39, 0x13, 0x22, 0x2b, 0x15, 0x2d, 0x35,
+ 0x1c, 0x38, 0x58, 0x11, 0x35, 0x60, 0x19, 0x3a, 0x61, 0x23, 0x3e, 0x5d,
+ 0x1e, 0x39, 0x51, 0x13, 0x30, 0x41, 0x12, 0x32, 0x4f, 0x14, 0x46, 0x79,
+ 0x19, 0x65, 0xa8, 0x2e, 0x7a, 0xca, 0x36, 0x81, 0xd4, 0x3a, 0x82, 0xcf,
+ 0x34, 0x6f, 0xaf, 0x27, 0x51, 0x6e, 0x1a, 0x2d, 0x34, 0x1d, 0x1f, 0x29,
+ 0x1c, 0x24, 0x20, 0x18, 0x1f, 0x18, 0x1d, 0x1f, 0x1a, 0x28, 0x2a, 0x29,
+ 0x2d, 0x2e, 0x34, 0x22, 0x22, 0x29, 0x18, 0x18, 0x1c, 0x14, 0x10, 0x13,
+ 0x0f, 0x10, 0x0c, 0x0c, 0x11, 0x0e, 0x1b, 0x21, 0x1f, 0x2d, 0x33, 0x33,
+ 0x1a, 0x20, 0x20, 0x1e, 0x24, 0x22, 0x2b, 0x2f, 0x2a, 0x35, 0x3a, 0x35,
+ 0x1d, 0x21, 0x22, 0x14, 0x1a, 0x18, 0x14, 0x1a, 0x18, 0x13, 0x19, 0x17,
+ 0x10, 0x15, 0x13, 0x0b, 0x0f, 0x0e, 0x05, 0x07, 0x06, 0x09, 0x09, 0x09,
+ 0x0f, 0x0f, 0x0f, 0x09, 0x08, 0x09, 0x04, 0x05, 0x05, 0x0d, 0x0f, 0x0e,
+ 0x0c, 0x0e, 0x0d, 0x05, 0x07, 0x06, 0x05, 0x05, 0x05, 0x0a, 0x0b, 0x0b,
+ 0x07, 0x09, 0x08, 0x03, 0x05, 0x04, 0x0d, 0x10, 0x0f, 0x1c, 0x1f, 0x20,
+ 0x2c, 0x30, 0x31, 0x2e, 0x32, 0x36, 0x1a, 0x1f, 0x22, 0x09, 0x0e, 0x12,
+ 0x07, 0x10, 0x0b, 0x11, 0x18, 0x15, 0x1a, 0x1e, 0x1d, 0x1f, 0x21, 0x21,
+ 0x1c, 0x1c, 0x1e, 0x15, 0x15, 0x17, 0x12, 0x12, 0x15, 0x10, 0x11, 0x15,
+ 0x0d, 0x0e, 0x10, 0x13, 0x14, 0x16, 0x22, 0x23, 0x25, 0x1d, 0x1f, 0x21,
+ 0x21, 0x23, 0x24, 0x20, 0x22, 0x23, 0x21, 0x22, 0x22, 0x22, 0x24, 0x23,
+ 0x15, 0x1a, 0x16, 0x0c, 0x10, 0x0c, 0x08, 0x0a, 0x07, 0x10, 0x12, 0x0f,
+ 0x1a, 0x1a, 0x18, 0x1a, 0x1a, 0x18, 0x1b, 0x1c, 0x19, 0x18, 0x1a, 0x15,
+ 0x18, 0x18, 0x16, 0x18, 0x18, 0x17, 0x17, 0x17, 0x15, 0x1b, 0x1a, 0x18,
+ 0x19, 0x19, 0x17, 0x1a, 0x1a, 0x17, 0x18, 0x18, 0x16, 0x18, 0x17, 0x15,
+ 0x17, 0x17, 0x13, 0x1b, 0x1b, 0x18, 0x1a, 0x1a, 0x18, 0x13, 0x13, 0x14,
+ 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06, 0x08, 0x09, 0x08,
+ 0x0f, 0x10, 0x0e, 0x15, 0x16, 0x13, 0x13, 0x14, 0x12, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x15, 0x11, 0x11, 0x23, 0x18, 0x15, 0x30, 0x23, 0x18,
+ 0x56, 0x59, 0x3a, 0xa8, 0xbd, 0x96, 0xc1, 0xe6, 0xb3, 0xb9, 0xe5, 0xae,
+ 0xba, 0xe2, 0xaa, 0xbc, 0xdb, 0xaa, 0xbe, 0xd8, 0xad, 0xbb, 0xd6, 0xad,
+ 0xb6, 0xd5, 0xa2, 0xb4, 0xd2, 0xa2, 0xae, 0xcd, 0xa2, 0xaa, 0xca, 0x9b,
+ 0xa5, 0xc3, 0x93, 0x9e, 0xb7, 0x8b, 0x94, 0xa7, 0x85, 0x87, 0x97, 0x7d,
+ 0x4b, 0x4c, 0x46, 0x4a, 0x4f, 0x48, 0x4e, 0x55, 0x4d, 0x4d, 0x54, 0x4c,
+ 0x4d, 0x53, 0x49, 0x4e, 0x54, 0x4a, 0x4f, 0x57, 0x4a, 0x53, 0x5d, 0x4e,
+ 0x59, 0x5f, 0x54, 0x55, 0x5c, 0x52, 0x51, 0x59, 0x4e, 0x54, 0x5a, 0x50,
+ 0x5b, 0x5e, 0x55, 0x57, 0x5d, 0x51, 0x4e, 0x5a, 0x4a, 0x4b, 0x5b, 0x49,
+ 0x4d, 0x5a, 0x51, 0x4a, 0x55, 0x4d, 0x4c, 0x57, 0x4f, 0x4d, 0x56, 0x51,
+ 0x4c, 0x53, 0x4e, 0x43, 0x4a, 0x47, 0x3f, 0x45, 0x43, 0x3e, 0x44, 0x42,
+ 0x3c, 0x45, 0x43, 0x39, 0x41, 0x43, 0x36, 0x3e, 0x40, 0x33, 0x3b, 0x3f,
+ 0x31, 0x3b, 0x42, 0x2c, 0x38, 0x43, 0x28, 0x38, 0x46, 0x27, 0x39, 0x48,
+ 0x23, 0x36, 0x48, 0x22, 0x33, 0x42, 0x18, 0x23, 0x2d, 0x02, 0x09, 0x0d,
+ 0x06, 0x07, 0x05, 0x09, 0x09, 0x04, 0x0e, 0x0d, 0x0d, 0x08, 0x09, 0x0b,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0b, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04,
+ 0x06, 0x08, 0x04, 0x12, 0x14, 0x11, 0x20, 0x22, 0x21, 0x24, 0x26, 0x28,
+ 0x27, 0x2a, 0x2e, 0x33, 0x36, 0x3b, 0x36, 0x3b, 0x41, 0x2d, 0x32, 0x38,
+ 0x20, 0x24, 0x27, 0x0e, 0x11, 0x14, 0x07, 0x0a, 0x0d, 0x06, 0x07, 0x08,
+ 0x05, 0x05, 0x08, 0x0b, 0x0b, 0x0c, 0x0e, 0x0e, 0x0e, 0x13, 0x13, 0x13,
+ 0x0c, 0x0c, 0x0e, 0x06, 0x06, 0x08, 0x07, 0x07, 0x08, 0x0c, 0x0c, 0x0c,
+ 0x10, 0x10, 0x0e, 0x0f, 0x0f, 0x0c, 0x13, 0x12, 0x0e, 0x18, 0x17, 0x13,
+ 0x14, 0x15, 0x12, 0x14, 0x16, 0x13, 0x17, 0x17, 0x15, 0x18, 0x18, 0x16,
+ 0x1a, 0x1a, 0x18, 0x19, 0x19, 0x17, 0x1b, 0x1d, 0x19, 0x1b, 0x1d, 0x1b,
+ 0x16, 0x16, 0x18, 0x0e, 0x0e, 0x11, 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0d,
+ 0x0a, 0x0d, 0x0f, 0x0b, 0x0f, 0x12, 0x0c, 0x10, 0x13, 0x0a, 0x0e, 0x11,
+ 0x1f, 0x21, 0x1e, 0x50, 0x52, 0x4f, 0x52, 0x54, 0x4f, 0x46, 0x48, 0x45,
+ 0x3d, 0x3f, 0x3b, 0x37, 0x3b, 0x3a, 0x35, 0x3a, 0x3c, 0x33, 0x39, 0x3b,
+ 0x36, 0x3b, 0x3e, 0x36, 0x3b, 0x3e, 0x33, 0x38, 0x3b, 0x34, 0x3a, 0x3b,
+ 0x37, 0x3d, 0x3d, 0x38, 0x3c, 0x3f, 0x3a, 0x3e, 0x41, 0x3b, 0x3f, 0x43,
+ 0x35, 0x38, 0x3f, 0x31, 0x36, 0x3c, 0x35, 0x3a, 0x3e, 0x37, 0x3c, 0x40,
+ 0x36, 0x3b, 0x3f, 0x37, 0x3d, 0x40, 0x3a, 0x3f, 0x42, 0x3b, 0x40, 0x43,
+ 0x3b, 0x41, 0x42, 0x36, 0x3b, 0x3e, 0x36, 0x3b, 0x3e, 0x33, 0x38, 0x3c,
+ 0x36, 0x3a, 0x3e, 0x39, 0x3c, 0x42, 0x36, 0x39, 0x3e, 0x36, 0x37, 0x3d,
+ 0x36, 0x3a, 0x40, 0x36, 0x3b, 0x3f, 0x34, 0x3b, 0x3b, 0x33, 0x3b, 0x3b,
+ 0x35, 0x3d, 0x3f, 0x34, 0x3c, 0x3f, 0x35, 0x3d, 0x3f, 0x34, 0x3d, 0x3d,
+ 0x34, 0x3e, 0x44, 0x37, 0x3a, 0x3e, 0x39, 0x39, 0x3b, 0x38, 0x3b, 0x3f,
+ 0x30, 0x3b, 0x43, 0x2d, 0x3b, 0x43, 0x32, 0x3d, 0x40, 0x3a, 0x3f, 0x3f,
+ 0x35, 0x46, 0x51, 0x33, 0x55, 0x72, 0x2f, 0x68, 0x9d, 0x2d, 0x75, 0xbc,
+ 0x2a, 0x77, 0xc4, 0x26, 0x72, 0xb9, 0x1d, 0x68, 0xa6, 0x11, 0x59, 0x8e,
+ 0x11, 0x49, 0x78, 0x0d, 0x43, 0x6f, 0x0e, 0x45, 0x6e, 0x11, 0x47, 0x6d,
+ 0x15, 0x45, 0x69, 0x18, 0x44, 0x68, 0x15, 0x3c, 0x60, 0x0e, 0x32, 0x53,
+ 0x0e, 0x27, 0x44, 0x0d, 0x25, 0x44, 0x0e, 0x26, 0x46, 0x0f, 0x27, 0x47,
+ 0x0e, 0x25, 0x44, 0x0b, 0x21, 0x3d, 0x0f, 0x23, 0x3c, 0x0e, 0x23, 0x3b,
+ 0x0b, 0x24, 0x44, 0x14, 0x27, 0x42, 0x1a, 0x29, 0x40, 0x13, 0x26, 0x3f,
+ 0x0d, 0x2a, 0x46, 0x09, 0x2c, 0x4a, 0x0c, 0x28, 0x45, 0x11, 0x24, 0x3f,
+ 0x0b, 0x1c, 0x2f, 0x0c, 0x1c, 0x27, 0x12, 0x21, 0x27, 0x1b, 0x2b, 0x35,
+ 0x1d, 0x30, 0x43, 0x13, 0x28, 0x45, 0x0f, 0x27, 0x44, 0x0e, 0x24, 0x3e,
+ 0x0e, 0x20, 0x39, 0x14, 0x1f, 0x32, 0x19, 0x26, 0x33, 0x1b, 0x31, 0x3e,
+ 0x21, 0x3e, 0x49, 0x39, 0x52, 0x59, 0x5a, 0x68, 0x70, 0x59, 0x61, 0x72,
+ 0x2d, 0x4d, 0x79, 0x14, 0x36, 0x67, 0x0f, 0x30, 0x5e, 0x17, 0x31, 0x59,
+ 0x1d, 0x31, 0x4c, 0x19, 0x2a, 0x39, 0x13, 0x29, 0x31, 0x16, 0x32, 0x3b,
+ 0x19, 0x3a, 0x58, 0x17, 0x3a, 0x63, 0x1d, 0x40, 0x6a, 0x24, 0x43, 0x67,
+ 0x1d, 0x39, 0x51, 0x11, 0x34, 0x52, 0x16, 0x48, 0x7e, 0x24, 0x65, 0xb1,
+ 0x2c, 0x7b, 0xd1, 0x30, 0x82, 0xdb, 0x2c, 0x7c, 0xcd, 0x2e, 0x6a, 0xa6,
+ 0x27, 0x44, 0x63, 0x24, 0x29, 0x31, 0x20, 0x1f, 0x20, 0x1c, 0x1c, 0x1e,
+ 0x19, 0x1e, 0x1e, 0x0c, 0x12, 0x0e, 0x07, 0x0d, 0x07, 0x14, 0x1a, 0x14,
+ 0x2c, 0x31, 0x30, 0x2d, 0x31, 0x35, 0x27, 0x2b, 0x2e, 0x20, 0x23, 0x26,
+ 0x1e, 0x1f, 0x20, 0x14, 0x15, 0x17, 0x10, 0x12, 0x13, 0x1f, 0x23, 0x24,
+ 0x18, 0x1b, 0x1d, 0x1e, 0x20, 0x21, 0x21, 0x22, 0x24, 0x17, 0x19, 0x1a,
+ 0x14, 0x1a, 0x18, 0x17, 0x1d, 0x1b, 0x14, 0x19, 0x18, 0x0e, 0x11, 0x10,
+ 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x07, 0x08, 0x11, 0x0f, 0x10,
+ 0x1b, 0x1b, 0x1b, 0x09, 0x09, 0x09, 0x04, 0x04, 0x04, 0x0b, 0x0b, 0x0d,
+ 0x0d, 0x0d, 0x0e, 0x07, 0x07, 0x06, 0x05, 0x05, 0x03, 0x08, 0x08, 0x05,
+ 0x05, 0x09, 0x0a, 0x0f, 0x13, 0x14, 0x20, 0x21, 0x24, 0x37, 0x38, 0x3c,
+ 0x39, 0x3a, 0x3e, 0x47, 0x48, 0x4c, 0x30, 0x31, 0x33, 0x09, 0x0b, 0x0c,
+ 0x07, 0x09, 0x0a, 0x0c, 0x0e, 0x0f, 0x18, 0x19, 0x1b, 0x1f, 0x20, 0x22,
+ 0x22, 0x23, 0x25, 0x23, 0x24, 0x26, 0x24, 0x24, 0x26, 0x1d, 0x1f, 0x21,
+ 0x18, 0x19, 0x1d, 0x18, 0x19, 0x1d, 0x1a, 0x1e, 0x20, 0x17, 0x1d, 0x1d,
+ 0x20, 0x26, 0x24, 0x25, 0x29, 0x28, 0x1f, 0x22, 0x22, 0x1a, 0x1c, 0x1b,
+ 0x14, 0x15, 0x14, 0x0a, 0x0b, 0x0a, 0x07, 0x07, 0x06, 0x0e, 0x0e, 0x0c,
+ 0x16, 0x16, 0x14, 0x16, 0x16, 0x14, 0x19, 0x1a, 0x17, 0x19, 0x1a, 0x16,
+ 0x17, 0x16, 0x16, 0x19, 0x18, 0x18, 0x17, 0x16, 0x14, 0x16, 0x16, 0x14,
+ 0x15, 0x14, 0x10, 0x18, 0x17, 0x13, 0x18, 0x17, 0x13, 0x18, 0x14, 0x12,
+ 0x19, 0x16, 0x16, 0x1b, 0x1a, 0x1a, 0x18, 0x19, 0x1b, 0x14, 0x17, 0x18,
+ 0x0f, 0x10, 0x11, 0x0a, 0x0c, 0x0b, 0x0a, 0x0c, 0x09, 0x0a, 0x0e, 0x0b,
+ 0x13, 0x0f, 0x15, 0x13, 0x16, 0x13, 0x0c, 0x17, 0x0d, 0x0d, 0x14, 0x0f,
+ 0x12, 0x0e, 0x12, 0x1c, 0x14, 0x16, 0x1c, 0x1d, 0x0f, 0x46, 0x54, 0x33,
+ 0x9f, 0xbe, 0x90, 0xc5, 0xe5, 0xb4, 0xc2, 0xe3, 0xb1, 0xbf, 0xe0, 0xae,
+ 0xbd, 0xde, 0xac, 0xbb, 0xdb, 0xaa, 0xba, 0xda, 0xaa, 0xb9, 0xda, 0xa9,
+ 0xb4, 0xd8, 0xa3, 0xb4, 0xd9, 0xa3, 0xb3, 0xd8, 0xa4, 0xb1, 0xd3, 0xa1,
+ 0xae, 0xce, 0x9e, 0xac, 0xc9, 0x9d, 0xa7, 0xc2, 0x99, 0x9e, 0xb7, 0x90,
+ 0x4c, 0x4d, 0x47, 0x4a, 0x4f, 0x48, 0x4c, 0x53, 0x4a, 0x4f, 0x57, 0x4d,
+ 0x50, 0x57, 0x4d, 0x50, 0x56, 0x4a, 0x50, 0x58, 0x4b, 0x50, 0x5a, 0x4c,
+ 0x56, 0x59, 0x52, 0x54, 0x59, 0x52, 0x4f, 0x54, 0x4c, 0x53, 0x56, 0x4f,
+ 0x5d, 0x60, 0x59, 0x59, 0x5f, 0x55, 0x50, 0x5b, 0x4d, 0x4d, 0x5a, 0x4a,
+ 0x4c, 0x59, 0x4f, 0x4a, 0x56, 0x4d, 0x4d, 0x56, 0x4e, 0x4c, 0x54, 0x4d,
+ 0x4c, 0x52, 0x4e, 0x45, 0x4b, 0x49, 0x3d, 0x43, 0x41, 0x3d, 0x43, 0x41,
+ 0x3b, 0x43, 0x42, 0x37, 0x3d, 0x3d, 0x36, 0x3b, 0x3d, 0x31, 0x39, 0x3d,
+ 0x2e, 0x37, 0x3e, 0x2a, 0x36, 0x41, 0x25, 0x35, 0x42, 0x24, 0x35, 0x45,
+ 0x24, 0x37, 0x48, 0x20, 0x32, 0x42, 0x19, 0x27, 0x32, 0x05, 0x0c, 0x10,
+ 0x05, 0x06, 0x05, 0x0a, 0x09, 0x04, 0x0f, 0x0d, 0x0e, 0x08, 0x09, 0x0b,
+ 0x05, 0x04, 0x04, 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x03, 0x06, 0x06, 0x04, 0x0b, 0x0c, 0x0c, 0x17, 0x18, 0x19,
+ 0x26, 0x27, 0x29, 0x2d, 0x31, 0x34, 0x2f, 0x32, 0x37, 0x3c, 0x40, 0x45,
+ 0x44, 0x48, 0x4e, 0x35, 0x38, 0x3f, 0x1a, 0x1d, 0x22, 0x08, 0x0c, 0x0f,
+ 0x06, 0x07, 0x09, 0x08, 0x09, 0x09, 0x08, 0x08, 0x06, 0x0c, 0x0c, 0x0a,
+ 0x09, 0x09, 0x0b, 0x0a, 0x0a, 0x0a, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x0e, 0x10, 0x0f, 0x0d, 0x11, 0x11, 0x0f, 0x15, 0x14, 0x11,
+ 0x15, 0x17, 0x14, 0x15, 0x17, 0x14, 0x14, 0x14, 0x12, 0x14, 0x14, 0x13,
+ 0x15, 0x15, 0x14, 0x18, 0x18, 0x16, 0x19, 0x1b, 0x18, 0x10, 0x12, 0x10,
+ 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0d, 0x0b, 0x0c, 0x0f, 0x0a, 0x0c, 0x0f,
+ 0x0a, 0x0e, 0x11, 0x0c, 0x10, 0x13, 0x0b, 0x0f, 0x12, 0x0b, 0x0f, 0x12,
+ 0x1a, 0x1e, 0x1d, 0x42, 0x46, 0x42, 0x43, 0x45, 0x42, 0x3b, 0x3d, 0x3a,
+ 0x38, 0x3c, 0x3b, 0x38, 0x3c, 0x3d, 0x38, 0x3d, 0x40, 0x37, 0x3c, 0x40,
+ 0x35, 0x3a, 0x3e, 0x35, 0x3a, 0x3d, 0x36, 0x3b, 0x3e, 0x34, 0x39, 0x3c,
+ 0x31, 0x36, 0x39, 0x34, 0x38, 0x3b, 0x38, 0x3b, 0x40, 0x39, 0x3c, 0x41,
+ 0x35, 0x38, 0x3d, 0x32, 0x37, 0x3b, 0x32, 0x37, 0x3b, 0x36, 0x3b, 0x3f,
+ 0x38, 0x3d, 0x41, 0x37, 0x3c, 0x40, 0x39, 0x3d, 0x41, 0x38, 0x3b, 0x40,
+ 0x38, 0x3d, 0x40, 0x37, 0x3c, 0x3f, 0x35, 0x3a, 0x3e, 0x35, 0x3a, 0x3f,
+ 0x36, 0x3b, 0x3f, 0x3b, 0x40, 0x44, 0x38, 0x3b, 0x40, 0x34, 0x37, 0x3d,
+ 0x32, 0x36, 0x3e, 0x35, 0x3a, 0x3f, 0x37, 0x3c, 0x3f, 0x35, 0x3b, 0x3d,
+ 0x34, 0x3c, 0x3f, 0x33, 0x3a, 0x40, 0x34, 0x3c, 0x3f, 0x33, 0x3c, 0x3e,
+ 0x32, 0x3b, 0x44, 0x35, 0x3d, 0x45, 0x3b, 0x42, 0x4a, 0x39, 0x3e, 0x44,
+ 0x35, 0x3a, 0x40, 0x32, 0x39, 0x41, 0x33, 0x3f, 0x4a, 0x33, 0x44, 0x52,
+ 0x36, 0x55, 0x77, 0x43, 0x72, 0xa1, 0x36, 0x79, 0xb5, 0x26, 0x76, 0xbb,
+ 0x20, 0x70, 0xb3, 0x1d, 0x65, 0xa1, 0x14, 0x53, 0x88, 0x0c, 0x48, 0x76,
+ 0x0e, 0x43, 0x6d, 0x10, 0x42, 0x6d, 0x12, 0x43, 0x6b, 0x13, 0x43, 0x68,
+ 0x14, 0x3f, 0x61, 0x15, 0x3b, 0x5b, 0x0d, 0x2e, 0x4d, 0x09, 0x26, 0x45,
+ 0x0d, 0x24, 0x41, 0x0b, 0x22, 0x41, 0x0e, 0x25, 0x45, 0x0e, 0x25, 0x45,
+ 0x0d, 0x24, 0x44, 0x0d, 0x23, 0x40, 0x0f, 0x23, 0x3c, 0x10, 0x24, 0x3c,
+ 0x21, 0x30, 0x3d, 0x3b, 0x44, 0x4d, 0x3d, 0x43, 0x4d, 0x24, 0x31, 0x40,
+ 0x12, 0x2b, 0x43, 0x0a, 0x2a, 0x48, 0x0c, 0x28, 0x47, 0x0d, 0x22, 0x3f,
+ 0x0c, 0x1c, 0x2e, 0x09, 0x18, 0x23, 0x10, 0x1f, 0x25, 0x1f, 0x2f, 0x39,
+ 0x1f, 0x33, 0x48, 0x0f, 0x27, 0x44, 0x10, 0x29, 0x47, 0x0e, 0x27, 0x41,
+ 0x0e, 0x24, 0x3b, 0x15, 0x26, 0x2a, 0x18, 0x2c, 0x31, 0x18, 0x32, 0x48,
+ 0x37, 0x47, 0x56, 0x6d, 0x70, 0x66, 0x73, 0x7b, 0x7d, 0x67, 0x81, 0xad,
+ 0x49, 0x81, 0xbf, 0x30, 0x67, 0xa7, 0x1c, 0x4f, 0x8c, 0x19, 0x41, 0x79,
+ 0x18, 0x34, 0x62, 0x19, 0x2d, 0x4f, 0x18, 0x2c, 0x44, 0x1d, 0x34, 0x48,
+ 0x19, 0x3a, 0x54, 0x1c, 0x3f, 0x60, 0x22, 0x45, 0x6b, 0x20, 0x43, 0x6b,
+ 0x18, 0x3c, 0x67, 0x1b, 0x4a, 0x80, 0x2a, 0x69, 0xaf, 0x30, 0x7c, 0xd0,
+ 0x31, 0x85, 0xdb, 0x37, 0x80, 0xca, 0x2d, 0x61, 0x96, 0x1f, 0x3c, 0x5b,
+ 0x1b, 0x26, 0x31, 0x1e, 0x21, 0x23, 0x1c, 0x20, 0x23, 0x1c, 0x20, 0x23,
+ 0x19, 0x1b, 0x1d, 0x09, 0x0d, 0x0c, 0x01, 0x07, 0x05, 0x0a, 0x10, 0x0e,
+ 0x26, 0x2b, 0x2d, 0x2d, 0x31, 0x36, 0x24, 0x28, 0x2d, 0x20, 0x25, 0x27,
+ 0x23, 0x24, 0x26, 0x21, 0x22, 0x24, 0x1e, 0x22, 0x23, 0x4c, 0x50, 0x51,
+ 0x37, 0x3b, 0x3c, 0x1f, 0x22, 0x23, 0x15, 0x19, 0x1a, 0x17, 0x1a, 0x1c,
+ 0x17, 0x1b, 0x1a, 0x14, 0x18, 0x17, 0x0f, 0x13, 0x12, 0x07, 0x09, 0x08,
+ 0x04, 0x06, 0x05, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x0d, 0x0d,
+ 0x18, 0x18, 0x18, 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x0b, 0x0b, 0x0b,
+ 0x0f, 0x0f, 0x0f, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x08, 0x08,
+ 0x14, 0x18, 0x18, 0x26, 0x2a, 0x2b, 0x28, 0x29, 0x2d, 0x27, 0x28, 0x2c,
+ 0x22, 0x23, 0x27, 0x2d, 0x2e, 0x32, 0x28, 0x29, 0x2b, 0x15, 0x17, 0x17,
+ 0x0e, 0x0f, 0x11, 0x0b, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e, 0x10, 0x11, 0x13,
+ 0x19, 0x1a, 0x1c, 0x26, 0x27, 0x29, 0x2b, 0x2c, 0x2e, 0x24, 0x27, 0x29,
+ 0x25, 0x26, 0x2a, 0x26, 0x27, 0x2b, 0x1f, 0x23, 0x24, 0x23, 0x29, 0x27,
+ 0x25, 0x2a, 0x28, 0x21, 0x26, 0x25, 0x17, 0x1b, 0x1a, 0x10, 0x12, 0x11,
+ 0x0c, 0x0c, 0x0c, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x0b, 0x0a, 0x08,
+ 0x15, 0x15, 0x13, 0x15, 0x15, 0x13, 0x15, 0x15, 0x13, 0x16, 0x16, 0x15,
+ 0x15, 0x13, 0x14, 0x17, 0x16, 0x14, 0x19, 0x18, 0x16, 0x16, 0x15, 0x13,
+ 0x16, 0x15, 0x11, 0x16, 0x15, 0x11, 0x18, 0x17, 0x13, 0x18, 0x16, 0x13,
+ 0x17, 0x16, 0x14, 0x18, 0x18, 0x17, 0x15, 0x17, 0x16, 0x14, 0x16, 0x15,
+ 0x17, 0x17, 0x17, 0x16, 0x15, 0x16, 0x12, 0x12, 0x10, 0x11, 0x11, 0x0f,
+ 0x14, 0x11, 0x11, 0x12, 0x13, 0x12, 0x10, 0x14, 0x15, 0x0f, 0x13, 0x16,
+ 0x13, 0x14, 0x19, 0x17, 0x1a, 0x15, 0x3d, 0x4b, 0x31, 0xa4, 0xbc, 0x92,
+ 0xc5, 0xe6, 0xb7, 0xc3, 0xe3, 0xb4, 0xc0, 0xe0, 0xaf, 0xbc, 0xdc, 0xaa,
+ 0xbc, 0xde, 0xab, 0xba, 0xdb, 0xa9, 0xb9, 0xdb, 0xa9, 0xb8, 0xda, 0xa8,
+ 0xb7, 0xda, 0xa6, 0xb9, 0xdb, 0xa8, 0xb9, 0xdc, 0xa9, 0xb6, 0xd8, 0xa7,
+ 0xb4, 0xd4, 0xa6, 0xb3, 0xd0, 0xa4, 0xb1, 0xce, 0xa3, 0xad, 0xc8, 0x9f,
+ 0x48, 0x49, 0x43, 0x4b, 0x4e, 0x47, 0x4c, 0x52, 0x48, 0x50, 0x56, 0x4c,
+ 0x50, 0x53, 0x4a, 0x52, 0x55, 0x4b, 0x54, 0x5a, 0x4e, 0x50, 0x58, 0x4b,
+ 0x50, 0x53, 0x4e, 0x52, 0x57, 0x51, 0x4d, 0x53, 0x4d, 0x4b, 0x50, 0x4a,
+ 0x54, 0x58, 0x51, 0x57, 0x5b, 0x52, 0x54, 0x5d, 0x50, 0x50, 0x5c, 0x4e,
+ 0x4c, 0x58, 0x4c, 0x4b, 0x55, 0x4a, 0x4b, 0x54, 0x4b, 0x47, 0x4e, 0x47,
+ 0x46, 0x4c, 0x48, 0x41, 0x45, 0x44, 0x3f, 0x44, 0x42, 0x3c, 0x42, 0x40,
+ 0x3a, 0x40, 0x40, 0x34, 0x3a, 0x3a, 0x36, 0x3b, 0x3d, 0x31, 0x36, 0x3b,
+ 0x2c, 0x33, 0x3b, 0x29, 0x33, 0x3d, 0x27, 0x33, 0x40, 0x27, 0x35, 0x44,
+ 0x22, 0x35, 0x46, 0x1f, 0x32, 0x42, 0x1b, 0x2a, 0x35, 0x05, 0x0e, 0x12,
+ 0x03, 0x05, 0x05, 0x09, 0x07, 0x05, 0x0d, 0x0c, 0x0b, 0x0a, 0x0a, 0x0c,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x03, 0x05, 0x05, 0x03, 0x04, 0x04, 0x04, 0x07, 0x08, 0x08,
+ 0x10, 0x11, 0x12, 0x20, 0x21, 0x23, 0x2e, 0x2f, 0x30, 0x2a, 0x2c, 0x2f,
+ 0x2e, 0x32, 0x3b, 0x48, 0x4b, 0x54, 0x40, 0x43, 0x4a, 0x21, 0x25, 0x2a,
+ 0x0b, 0x0f, 0x12, 0x09, 0x0b, 0x0d, 0x06, 0x08, 0x07, 0x06, 0x08, 0x06,
+ 0x06, 0x08, 0x08, 0x0a, 0x0c, 0x0b, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
+ 0x14, 0x14, 0x12, 0x11, 0x11, 0x0f, 0x10, 0x10, 0x0f, 0x15, 0x15, 0x13,
+ 0x14, 0x16, 0x13, 0x14, 0x16, 0x13, 0x13, 0x13, 0x11, 0x13, 0x13, 0x13,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x0f, 0x11, 0x0f, 0x0b, 0x0d, 0x0c,
+ 0x09, 0x0a, 0x0e, 0x0a, 0x0b, 0x0f, 0x0b, 0x0c, 0x10, 0x0c, 0x0d, 0x11,
+ 0x08, 0x0c, 0x0f, 0x08, 0x0c, 0x0f, 0x08, 0x0c, 0x0f, 0x0a, 0x0e, 0x11,
+ 0x17, 0x1c, 0x1c, 0x31, 0x35, 0x34, 0x36, 0x3a, 0x39, 0x35, 0x39, 0x39,
+ 0x35, 0x39, 0x3a, 0x37, 0x3c, 0x3f, 0x38, 0x3d, 0x41, 0x37, 0x3c, 0x40,
+ 0x35, 0x3a, 0x3e, 0x34, 0x39, 0x3c, 0x34, 0x39, 0x3c, 0x36, 0x3b, 0x3e,
+ 0x34, 0x39, 0x3c, 0x37, 0x3b, 0x3f, 0x36, 0x39, 0x3e, 0x36, 0x39, 0x3f,
+ 0x37, 0x3a, 0x3f, 0x34, 0x37, 0x3c, 0x32, 0x37, 0x3b, 0x36, 0x3b, 0x3f,
+ 0x39, 0x3e, 0x42, 0x37, 0x3c, 0x42, 0x39, 0x3c, 0x43, 0x38, 0x3b, 0x42,
+ 0x38, 0x3b, 0x3f, 0x3b, 0x3e, 0x42, 0x37, 0x3b, 0x3f, 0x36, 0x3b, 0x40,
+ 0x34, 0x39, 0x3f, 0x39, 0x3e, 0x44, 0x39, 0x3e, 0x44, 0x36, 0x3a, 0x3f,
+ 0x31, 0x35, 0x3d, 0x31, 0x36, 0x3c, 0x37, 0x3c, 0x3f, 0x36, 0x3b, 0x3f,
+ 0x35, 0x3a, 0x40, 0x38, 0x3d, 0x43, 0x38, 0x3f, 0x45, 0x35, 0x3d, 0x3f,
+ 0x33, 0x3c, 0x43, 0x30, 0x3d, 0x46, 0x34, 0x3f, 0x48, 0x37, 0x3e, 0x44,
+ 0x3a, 0x3d, 0x44, 0x39, 0x41, 0x4e, 0x33, 0x47, 0x63, 0x35, 0x56, 0x80,
+ 0x36, 0x69, 0xa9, 0x39, 0x79, 0xb9, 0x2b, 0x77, 0xb7, 0x1e, 0x70, 0xac,
+ 0x16, 0x63, 0x98, 0x10, 0x53, 0x81, 0x11, 0x46, 0x70, 0x14, 0x42, 0x6b,
+ 0x11, 0x42, 0x6b, 0x14, 0x44, 0x6c, 0x14, 0x41, 0x66, 0x16, 0x3f, 0x62,
+ 0x13, 0x35, 0x56, 0x0e, 0x2b, 0x49, 0x0d, 0x25, 0x43, 0x0c, 0x22, 0x3f,
+ 0x0b, 0x22, 0x41, 0x0d, 0x24, 0x44, 0x0d, 0x25, 0x47, 0x0c, 0x24, 0x46,
+ 0x0b, 0x23, 0x43, 0x0b, 0x22, 0x41, 0x08, 0x1e, 0x37, 0x16, 0x29, 0x3f,
+ 0x4d, 0x4f, 0x4a, 0x67, 0x64, 0x5b, 0x62, 0x60, 0x58, 0x40, 0x46, 0x4b,
+ 0x1d, 0x31, 0x44, 0x0d, 0x28, 0x45, 0x0c, 0x25, 0x47, 0x0c, 0x21, 0x42,
+ 0x0c, 0x1b, 0x2e, 0x0a, 0x17, 0x24, 0x10, 0x1f, 0x26, 0x20, 0x31, 0x3d,
+ 0x1e, 0x34, 0x4c, 0x12, 0x2b, 0x4a, 0x17, 0x33, 0x52, 0x15, 0x30, 0x4d,
+ 0x17, 0x26, 0x3a, 0x18, 0x26, 0x2f, 0x1a, 0x2f, 0x3a, 0x1c, 0x37, 0x4c,
+ 0x24, 0x37, 0x49, 0x50, 0x5f, 0x6a, 0x64, 0x8a, 0xa5, 0x4e, 0x93, 0xcc,
+ 0x42, 0x93, 0xd6, 0x3f, 0x8e, 0xcf, 0x40, 0x88, 0xc6, 0x43, 0x7c, 0xb9,
+ 0x2c, 0x55, 0x8e, 0x10, 0x2d, 0x5b, 0x19, 0x2f, 0x4e, 0x20, 0x36, 0x4b,
+ 0x17, 0x39, 0x57, 0x1b, 0x3f, 0x5d, 0x20, 0x48, 0x6a, 0x1e, 0x4c, 0x7a,
+ 0x1e, 0x55, 0x94, 0x2c, 0x6f, 0xbd, 0x32, 0x7e, 0xd5, 0x32, 0x83, 0xdc,
+ 0x37, 0x7e, 0xc3, 0x2d, 0x5d, 0x8d, 0x22, 0x35, 0x4a, 0x22, 0x24, 0x28,
+ 0x23, 0x24, 0x24, 0x1e, 0x23, 0x26, 0x1f, 0x24, 0x27, 0x20, 0x24, 0x24,
+ 0x23, 0x24, 0x26, 0x1b, 0x1d, 0x1e, 0x10, 0x14, 0x15, 0x14, 0x18, 0x1c,
+ 0x28, 0x2b, 0x32, 0x18, 0x1c, 0x22, 0x0b, 0x0e, 0x13, 0x13, 0x17, 0x18,
+ 0x1c, 0x1d, 0x1f, 0x21, 0x24, 0x25, 0x26, 0x2b, 0x2c, 0x3a, 0x40, 0x40,
+ 0x2a, 0x30, 0x30, 0x16, 0x1c, 0x1c, 0x15, 0x1c, 0x1c, 0x1c, 0x22, 0x22,
+ 0x1b, 0x1d, 0x1c, 0x11, 0x12, 0x11, 0x04, 0x06, 0x06, 0x03, 0x04, 0x04,
+ 0x09, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x04, 0x04, 0x04, 0x06, 0x07, 0x06,
+ 0x0d, 0x0d, 0x0f, 0x08, 0x08, 0x08, 0x06, 0x06, 0x04, 0x07, 0x07, 0x05,
+ 0x0d, 0x0d, 0x0b, 0x06, 0x06, 0x06, 0x07, 0x07, 0x09, 0x17, 0x16, 0x1a,
+ 0x29, 0x2c, 0x2c, 0x2b, 0x2f, 0x2f, 0x2a, 0x2b, 0x2d, 0x15, 0x16, 0x18,
+ 0x11, 0x12, 0x14, 0x10, 0x11, 0x13, 0x1a, 0x1b, 0x1c, 0x1d, 0x1f, 0x1e,
+ 0x1b, 0x1c, 0x1e, 0x14, 0x15, 0x17, 0x0c, 0x0d, 0x0f, 0x09, 0x0a, 0x0c,
+ 0x0d, 0x0e, 0x10, 0x12, 0x13, 0x15, 0x1e, 0x21, 0x22, 0x37, 0x3b, 0x3c,
+ 0x2c, 0x2d, 0x31, 0x29, 0x2b, 0x2d, 0x24, 0x28, 0x27, 0x24, 0x28, 0x26,
+ 0x1f, 0x24, 0x20, 0x1d, 0x22, 0x1e, 0x18, 0x1d, 0x19, 0x0b, 0x0c, 0x0a,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, 0x09, 0x09, 0x07,
+ 0x14, 0x14, 0x12, 0x17, 0x17, 0x15, 0x15, 0x15, 0x13, 0x16, 0x16, 0x14,
+ 0x17, 0x16, 0x14, 0x16, 0x15, 0x13, 0x15, 0x14, 0x12, 0x16, 0x16, 0x14,
+ 0x15, 0x15, 0x13, 0x16, 0x16, 0x14, 0x15, 0x15, 0x13, 0x14, 0x14, 0x12,
+ 0x13, 0x15, 0x12, 0x14, 0x18, 0x14, 0x14, 0x16, 0x13, 0x16, 0x18, 0x15,
+ 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x15, 0x14, 0x15, 0x16, 0x15, 0x15,
+ 0x15, 0x16, 0x11, 0x12, 0x12, 0x15, 0x11, 0x0f, 0x1a, 0x14, 0x15, 0x1f,
+ 0x26, 0x30, 0x30, 0x3e, 0x52, 0x40, 0x9c, 0xb8, 0x94, 0xc9, 0xe8, 0xba,
+ 0xc3, 0xe4, 0xb5, 0xbf, 0xe0, 0xb1, 0xbc, 0xde, 0xad, 0xba, 0xdc, 0xa9,
+ 0xba, 0xdc, 0xa9, 0xb9, 0xdb, 0xa8, 0xb8, 0xdb, 0xa7, 0xb9, 0xdc, 0xa8,
+ 0xba, 0xdc, 0xaa, 0xba, 0xdc, 0xaa, 0xba, 0xdc, 0xab, 0xba, 0xdb, 0xac,
+ 0xb7, 0xd8, 0xa9, 0xb6, 0xd6, 0xa7, 0xb3, 0xd2, 0xa6, 0xb4, 0xd1, 0xa5,
+ 0x43, 0x45, 0x3f, 0x49, 0x4c, 0x45, 0x4a, 0x50, 0x46, 0x4a, 0x50, 0x46,
+ 0x4b, 0x4e, 0x43, 0x4f, 0x52, 0x47, 0x53, 0x59, 0x4d, 0x55, 0x5c, 0x50,
+ 0x54, 0x59, 0x53, 0x50, 0x57, 0x50, 0x4d, 0x55, 0x4d, 0x4b, 0x52, 0x4a,
+ 0x51, 0x56, 0x4e, 0x52, 0x58, 0x4e, 0x50, 0x5b, 0x4d, 0x4f, 0x5b, 0x4d,
+ 0x4a, 0x54, 0x49, 0x4a, 0x54, 0x49, 0x48, 0x4f, 0x47, 0x48, 0x4d, 0x47,
+ 0x45, 0x4a, 0x44, 0x3c, 0x40, 0x3d, 0x3d, 0x41, 0x40, 0x3a, 0x3f, 0x3e,
+ 0x39, 0x3d, 0x3e, 0x34, 0x38, 0x39, 0x31, 0x34, 0x37, 0x2f, 0x32, 0x39,
+ 0x2c, 0x31, 0x39, 0x28, 0x30, 0x3b, 0x25, 0x2f, 0x3b, 0x24, 0x30, 0x3d,
+ 0x1d, 0x30, 0x40, 0x1e, 0x32, 0x41, 0x1e, 0x2d, 0x3a, 0x09, 0x11, 0x19,
+ 0x03, 0x06, 0x07, 0x07, 0x06, 0x04, 0x0a, 0x09, 0x07, 0x0a, 0x0a, 0x0a,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x07, 0x07, 0x09, 0x09, 0x09, 0x19, 0x1b, 0x1a, 0x21, 0x22, 0x22,
+ 0x22, 0x25, 0x29, 0x29, 0x2c, 0x32, 0x32, 0x35, 0x3a, 0x37, 0x3a, 0x3f,
+ 0x1a, 0x1e, 0x21, 0x0d, 0x10, 0x14, 0x08, 0x0c, 0x0f, 0x09, 0x0d, 0x10,
+ 0x07, 0x09, 0x09, 0x04, 0x06, 0x05, 0x09, 0x0b, 0x0a, 0x12, 0x14, 0x13,
+ 0x17, 0x19, 0x18, 0x12, 0x13, 0x12, 0x11, 0x11, 0x10, 0x14, 0x14, 0x14,
+ 0x11, 0x13, 0x10, 0x14, 0x16, 0x13, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
+ 0x15, 0x15, 0x14, 0x0c, 0x0d, 0x0c, 0x07, 0x09, 0x08, 0x09, 0x0b, 0x0b,
+ 0x0b, 0x0c, 0x10, 0x0a, 0x0b, 0x0f, 0x0a, 0x0b, 0x0f, 0x0b, 0x0c, 0x10,
+ 0x09, 0x0c, 0x0f, 0x07, 0x0b, 0x0e, 0x08, 0x0c, 0x0f, 0x0a, 0x0e, 0x11,
+ 0x16, 0x1c, 0x1c, 0x29, 0x2f, 0x30, 0x32, 0x37, 0x3a, 0x34, 0x38, 0x3b,
+ 0x35, 0x39, 0x3c, 0x35, 0x39, 0x3d, 0x34, 0x39, 0x3d, 0x33, 0x3a, 0x3f,
+ 0x32, 0x37, 0x3b, 0x33, 0x38, 0x3c, 0x35, 0x3a, 0x3e, 0x36, 0x3b, 0x3f,
+ 0x36, 0x3a, 0x3e, 0x32, 0x35, 0x3a, 0x34, 0x37, 0x3e, 0x34, 0x37, 0x3e,
+ 0x34, 0x37, 0x3c, 0x34, 0x37, 0x3c, 0x33, 0x38, 0x3c, 0x3b, 0x40, 0x44,
+ 0x3f, 0x44, 0x4a, 0x3d, 0x42, 0x48, 0x39, 0x3c, 0x43, 0x36, 0x39, 0x40,
+ 0x37, 0x38, 0x3c, 0x3c, 0x3e, 0x43, 0x3b, 0x3e, 0x43, 0x35, 0x3a, 0x40,
+ 0x32, 0x37, 0x3d, 0x34, 0x39, 0x3f, 0x36, 0x3b, 0x41, 0x32, 0x37, 0x3d,
+ 0x32, 0x35, 0x3c, 0x34, 0x37, 0x3c, 0x33, 0x38, 0x3b, 0x36, 0x3b, 0x3e,
+ 0x38, 0x3d, 0x41, 0x37, 0x3c, 0x42, 0x38, 0x3f, 0x45, 0x39, 0x41, 0x44,
+ 0x36, 0x3d, 0x42, 0x30, 0x39, 0x3e, 0x31, 0x38, 0x3e, 0x37, 0x3e, 0x46,
+ 0x3a, 0x44, 0x53, 0x38, 0x4f, 0x6e, 0x3a, 0x64, 0x95, 0x3b, 0x71, 0xb2,
+ 0x29, 0x72, 0xbe, 0x23, 0x6d, 0xb4, 0x1f, 0x6b, 0xa9, 0x13, 0x5d, 0x90,
+ 0x0c, 0x4f, 0x7a, 0x0e, 0x47, 0x70, 0x12, 0x43, 0x6b, 0x15, 0x41, 0x6a,
+ 0x14, 0x41, 0x6a, 0x14, 0x3f, 0x67, 0x14, 0x3c, 0x62, 0x11, 0x34, 0x54,
+ 0x0f, 0x2c, 0x49, 0x0b, 0x23, 0x3f, 0x0f, 0x21, 0x3d, 0x0f, 0x21, 0x3d,
+ 0x0b, 0x22, 0x40, 0x0d, 0x24, 0x45, 0x0d, 0x25, 0x47, 0x0c, 0x26, 0x49,
+ 0x0d, 0x25, 0x47, 0x0d, 0x24, 0x43, 0x09, 0x1e, 0x3a, 0x12, 0x25, 0x3a,
+ 0x4c, 0x4b, 0x40, 0x77, 0x73, 0x64, 0x70, 0x6d, 0x62, 0x42, 0x47, 0x47,
+ 0x1b, 0x2d, 0x3f, 0x0f, 0x27, 0x44, 0x0e, 0x25, 0x46, 0x0c, 0x21, 0x40,
+ 0x0c, 0x1a, 0x2c, 0x0d, 0x1a, 0x27, 0x11, 0x22, 0x29, 0x1b, 0x2e, 0x3b,
+ 0x1b, 0x34, 0x4d, 0x12, 0x2f, 0x4f, 0x17, 0x37, 0x56, 0x17, 0x35, 0x52,
+ 0x16, 0x27, 0x3c, 0x14, 0x29, 0x3a, 0x1b, 0x35, 0x45, 0x1b, 0x38, 0x4c,
+ 0x11, 0x39, 0x5d, 0x30, 0x6e, 0xa5, 0x45, 0x95, 0xd3, 0x3e, 0x98, 0xd3,
+ 0x34, 0x90, 0xd3, 0x34, 0x8d, 0xcb, 0x4c, 0x9c, 0xd7, 0x5c, 0xa0, 0xdd,
+ 0x3c, 0x71, 0xb0, 0x1b, 0x44, 0x7c, 0x18, 0x37, 0x5e, 0x1a, 0x35, 0x52,
+ 0x14, 0x37, 0x62, 0x18, 0x40, 0x66, 0x1f, 0x51, 0x7a, 0x23, 0x64, 0x9c,
+ 0x2a, 0x76, 0xc3, 0x33, 0x82, 0xda, 0x33, 0x7e, 0xd3, 0x30, 0x75, 0xc0,
+ 0x38, 0x5f, 0x86, 0x22, 0x37, 0x4c, 0x1b, 0x20, 0x26, 0x22, 0x21, 0x1f,
+ 0x1d, 0x22, 0x22, 0x13, 0x1b, 0x1e, 0x0f, 0x13, 0x12, 0x1b, 0x18, 0x12,
+ 0x28, 0x29, 0x28, 0x2a, 0x2c, 0x2b, 0x25, 0x26, 0x27, 0x22, 0x23, 0x29,
+ 0x27, 0x2a, 0x33, 0x18, 0x1b, 0x22, 0x0b, 0x0f, 0x11, 0x11, 0x15, 0x14,
+ 0x22, 0x26, 0x27, 0x1e, 0x22, 0x23, 0x1f, 0x26, 0x26, 0x16, 0x1f, 0x1e,
+ 0x11, 0x1a, 0x19, 0x11, 0x1a, 0x19, 0x11, 0x1a, 0x19, 0x12, 0x1b, 0x1a,
+ 0x10, 0x11, 0x11, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x13, 0x15, 0x14, 0x0d, 0x0f, 0x0e, 0x02, 0x04, 0x03, 0x03, 0x05, 0x04,
+ 0x0d, 0x0e, 0x0f, 0x08, 0x08, 0x08, 0x03, 0x03, 0x01, 0x05, 0x07, 0x02,
+ 0x08, 0x0b, 0x07, 0x09, 0x0a, 0x09, 0x19, 0x1a, 0x1e, 0x28, 0x27, 0x2e,
+ 0x29, 0x2c, 0x2c, 0x26, 0x2a, 0x29, 0x45, 0x47, 0x46, 0x29, 0x2b, 0x2c,
+ 0x05, 0x06, 0x08, 0x09, 0x0b, 0x0b, 0x10, 0x12, 0x11, 0x1d, 0x1f, 0x1e,
+ 0x1f, 0x20, 0x22, 0x1e, 0x1e, 0x21, 0x1b, 0x1c, 0x1e, 0x14, 0x15, 0x17,
+ 0x0d, 0x0e, 0x10, 0x0d, 0x11, 0x12, 0x1b, 0x1f, 0x20, 0x32, 0x36, 0x37,
+ 0x26, 0x2a, 0x2b, 0x25, 0x28, 0x27, 0x1c, 0x20, 0x1f, 0x1a, 0x1f, 0x1b,
+ 0x1b, 0x20, 0x1c, 0x1b, 0x20, 0x1c, 0x18, 0x1a, 0x17, 0x0b, 0x0d, 0x0a,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x08, 0x08, 0x07,
+ 0x10, 0x10, 0x0f, 0x15, 0x15, 0x13, 0x14, 0x14, 0x12, 0x14, 0x14, 0x11,
+ 0x13, 0x13, 0x0f, 0x14, 0x13, 0x0f, 0x14, 0x14, 0x12, 0x15, 0x15, 0x13,
+ 0x16, 0x16, 0x14, 0x15, 0x15, 0x13, 0x13, 0x15, 0x12, 0x12, 0x14, 0x11,
+ 0x11, 0x14, 0x13, 0x13, 0x15, 0x14, 0x14, 0x14, 0x14, 0x19, 0x19, 0x19,
+ 0x12, 0x14, 0x13, 0x11, 0x15, 0x17, 0x11, 0x15, 0x18, 0x12, 0x15, 0x19,
+ 0x12, 0x18, 0x16, 0x11, 0x13, 0x19, 0x13, 0x13, 0x1d, 0x18, 0x1f, 0x21,
+ 0x53, 0x67, 0x59, 0x9a, 0xb9, 0x98, 0xc6, 0xe8, 0xbe, 0xc4, 0xe5, 0xba,
+ 0xc1, 0xe2, 0xb5, 0xbc, 0xdd, 0xae, 0xb9, 0xdc, 0xa9, 0xb8, 0xda, 0xa7,
+ 0xb8, 0xda, 0xa7, 0xb9, 0xdd, 0xa9, 0xb8, 0xde, 0xa9, 0xb9, 0xdd, 0xaa,
+ 0xbd, 0xdd, 0xac, 0xbd, 0xdd, 0xae, 0xbc, 0xdd, 0xae, 0xbb, 0xdc, 0xad,
+ 0xba, 0xdb, 0xac, 0xb8, 0xd9, 0xaa, 0xb7, 0xd7, 0xa8, 0xb6, 0xd6, 0xa7,
+ 0x41, 0x42, 0x3d, 0x44, 0x47, 0x40, 0x49, 0x4f, 0x47, 0x49, 0x4f, 0x45,
+ 0x4d, 0x4f, 0x44, 0x4a, 0x4c, 0x41, 0x4f, 0x52, 0x49, 0x54, 0x5a, 0x50,
+ 0x55, 0x5d, 0x52, 0x50, 0x5a, 0x4f, 0x4e, 0x5a, 0x4e, 0x4c, 0x57, 0x49,
+ 0x4e, 0x56, 0x49, 0x4f, 0x57, 0x4a, 0x4c, 0x57, 0x49, 0x4c, 0x58, 0x4a,
+ 0x4b, 0x53, 0x48, 0x49, 0x50, 0x46, 0x44, 0x49, 0x42, 0x46, 0x4a, 0x44,
+ 0x43, 0x46, 0x41, 0x3d, 0x3f, 0x3c, 0x37, 0x3b, 0x3a, 0x38, 0x3c, 0x3b,
+ 0x38, 0x39, 0x3b, 0x39, 0x3a, 0x3c, 0x33, 0x34, 0x37, 0x2f, 0x31, 0x39,
+ 0x2b, 0x2f, 0x38, 0x25, 0x2c, 0x36, 0x23, 0x2b, 0x36, 0x22, 0x2d, 0x37,
+ 0x1e, 0x2f, 0x3d, 0x20, 0x33, 0x41, 0x20, 0x2e, 0x3c, 0x0e, 0x16, 0x1f,
+ 0x08, 0x0b, 0x0e, 0x06, 0x06, 0x05, 0x06, 0x06, 0x04, 0x0a, 0x0a, 0x0a,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x07, 0x06, 0x06, 0x04, 0x04, 0x02, 0x07, 0x07, 0x05, 0x10, 0x10, 0x0e,
+ 0x19, 0x1d, 0x1b, 0x1e, 0x22, 0x21, 0x1e, 0x22, 0x23, 0x25, 0x29, 0x2d,
+ 0x26, 0x29, 0x2e, 0x1f, 0x22, 0x29, 0x21, 0x24, 0x2d, 0x25, 0x28, 0x30,
+ 0x15, 0x19, 0x1a, 0x09, 0x0d, 0x0e, 0x0f, 0x11, 0x12, 0x16, 0x18, 0x19,
+ 0x18, 0x1a, 0x1a, 0x16, 0x19, 0x17, 0x14, 0x16, 0x15, 0x14, 0x15, 0x14,
+ 0x14, 0x16, 0x13, 0x14, 0x16, 0x13, 0x15, 0x17, 0x16, 0x11, 0x12, 0x12,
+ 0x0d, 0x0d, 0x0d, 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0c,
+ 0x0a, 0x0b, 0x0f, 0x0a, 0x0b, 0x0f, 0x0a, 0x0b, 0x0f, 0x08, 0x09, 0x0d,
+ 0x0a, 0x0e, 0x11, 0x0b, 0x0f, 0x12, 0x09, 0x0d, 0x10, 0x09, 0x0e, 0x10,
+ 0x13, 0x1b, 0x1d, 0x2c, 0x31, 0x34, 0x33, 0x38, 0x3b, 0x33, 0x38, 0x3c,
+ 0x34, 0x39, 0x3d, 0x36, 0x3b, 0x3f, 0x38, 0x3d, 0x41, 0x36, 0x3b, 0x3f,
+ 0x33, 0x38, 0x3c, 0x33, 0x38, 0x3c, 0x34, 0x39, 0x3d, 0x33, 0x38, 0x3c,
+ 0x35, 0x3a, 0x3e, 0x34, 0x37, 0x3e, 0x35, 0x38, 0x3f, 0x35, 0x38, 0x41,
+ 0x35, 0x38, 0x3d, 0x36, 0x39, 0x3e, 0x34, 0x39, 0x3d, 0x39, 0x3e, 0x42,
+ 0x41, 0x46, 0x4c, 0x40, 0x45, 0x4b, 0x3c, 0x40, 0x46, 0x38, 0x3b, 0x42,
+ 0x33, 0x34, 0x39, 0x37, 0x3a, 0x3e, 0x39, 0x3c, 0x42, 0x35, 0x3a, 0x40,
+ 0x33, 0x38, 0x3e, 0x31, 0x36, 0x3c, 0x33, 0x38, 0x3e, 0x36, 0x3b, 0x41,
+ 0x35, 0x39, 0x3e, 0x35, 0x39, 0x3c, 0x32, 0x38, 0x38, 0x33, 0x39, 0x3a,
+ 0x37, 0x3d, 0x40, 0x35, 0x3a, 0x3e, 0x34, 0x3c, 0x3f, 0x3b, 0x43, 0x46,
+ 0x3a, 0x42, 0x44, 0x38, 0x3d, 0x3e, 0x37, 0x3a, 0x3d, 0x34, 0x41, 0x4e,
+ 0x36, 0x55, 0x74, 0x36, 0x68, 0x9b, 0x34, 0x73, 0xb5, 0x2e, 0x76, 0xbe,
+ 0x1f, 0x74, 0xb7, 0x19, 0x67, 0xa5, 0x13, 0x55, 0x8b, 0x0f, 0x49, 0x77,
+ 0x10, 0x43, 0x6d, 0x11, 0x41, 0x6b, 0x11, 0x42, 0x6b, 0x13, 0x44, 0x6e,
+ 0x13, 0x3f, 0x68, 0x14, 0x3c, 0x63, 0x10, 0x34, 0x59, 0x0b, 0x2a, 0x4a,
+ 0x0d, 0x27, 0x44, 0x0e, 0x23, 0x3f, 0x0e, 0x20, 0x3b, 0x0f, 0x20, 0x3c,
+ 0x0e, 0x23, 0x40, 0x0e, 0x25, 0x45, 0x10, 0x28, 0x4a, 0x0d, 0x27, 0x4a,
+ 0x0c, 0x24, 0x48, 0x0e, 0x25, 0x43, 0x0d, 0x21, 0x3d, 0x0f, 0x20, 0x36,
+ 0x20, 0x23, 0x21, 0x3a, 0x3c, 0x36, 0x48, 0x4e, 0x4a, 0x28, 0x34, 0x39,
+ 0x12, 0x27, 0x3a, 0x0d, 0x25, 0x42, 0x0e, 0x26, 0x43, 0x0e, 0x22, 0x3c,
+ 0x0d, 0x1a, 0x2c, 0x0e, 0x1c, 0x27, 0x14, 0x25, 0x2c, 0x1a, 0x2f, 0x3d,
+ 0x1b, 0x35, 0x4f, 0x15, 0x34, 0x56, 0x15, 0x36, 0x59, 0x14, 0x35, 0x54,
+ 0x12, 0x2b, 0x41, 0x0c, 0x2d, 0x36, 0x0e, 0x35, 0x42, 0x1c, 0x47, 0x6f,
+ 0x35, 0x71, 0xb5, 0x42, 0x98, 0xe1, 0x3e, 0x98, 0xdf, 0x3e, 0x90, 0xd8,
+ 0x3a, 0x8f, 0xd6, 0x3e, 0x8f, 0xd2, 0x4e, 0x9a, 0xd8, 0x5d, 0xa1, 0xe0,
+ 0x55, 0x8f, 0xd3, 0x3c, 0x6e, 0xb0, 0x1e, 0x49, 0x7f, 0x10, 0x39, 0x66,
+ 0x10, 0x39, 0x68, 0x1c, 0x4d, 0x80, 0x24, 0x65, 0xa1, 0x2e, 0x7b, 0xc8,
+ 0x33, 0x87, 0xe0, 0x35, 0x80, 0xd3, 0x33, 0x6e, 0xa9, 0x24, 0x4f, 0x72,
+ 0x2e, 0x39, 0x46, 0x26, 0x2d, 0x36, 0x1c, 0x21, 0x25, 0x1f, 0x24, 0x26,
+ 0x1f, 0x23, 0x26, 0x0b, 0x10, 0x13, 0x05, 0x07, 0x06, 0x09, 0x07, 0x06,
+ 0x11, 0x12, 0x10, 0x1a, 0x1c, 0x18, 0x2a, 0x2b, 0x2b, 0x2f, 0x30, 0x34,
+ 0x2b, 0x2b, 0x33, 0x22, 0x25, 0x2a, 0x1a, 0x1e, 0x1c, 0x41, 0x46, 0x40,
+ 0x54, 0x5a, 0x59, 0x1f, 0x25, 0x25, 0x12, 0x1a, 0x1a, 0x13, 0x1c, 0x1b,
+ 0x10, 0x19, 0x19, 0x14, 0x1d, 0x1c, 0x11, 0x1a, 0x19, 0x09, 0x10, 0x10,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x18, 0x1a, 0x19, 0x12, 0x14, 0x13, 0x06, 0x09, 0x08, 0x04, 0x06, 0x05,
+ 0x0c, 0x0d, 0x0e, 0x09, 0x09, 0x09, 0x02, 0x04, 0x01, 0x03, 0x05, 0x02,
+ 0x08, 0x0a, 0x07, 0x16, 0x18, 0x19, 0x27, 0x28, 0x2c, 0x1e, 0x1f, 0x24,
+ 0x1b, 0x1f, 0x1f, 0x1a, 0x1e, 0x1d, 0x2b, 0x2d, 0x2c, 0x22, 0x24, 0x23,
+ 0x0d, 0x0f, 0x0e, 0x08, 0x0a, 0x09, 0x0a, 0x0c, 0x0a, 0x10, 0x12, 0x11,
+ 0x17, 0x18, 0x1a, 0x22, 0x23, 0x25, 0x22, 0x23, 0x25, 0x20, 0x22, 0x23,
+ 0x1a, 0x1d, 0x1e, 0x1c, 0x20, 0x21, 0x1a, 0x1e, 0x1f, 0x1a, 0x1e, 0x1f,
+ 0x21, 0x25, 0x24, 0x20, 0x24, 0x23, 0x1e, 0x22, 0x21, 0x20, 0x23, 0x20,
+ 0x21, 0x23, 0x20, 0x18, 0x1b, 0x17, 0x17, 0x19, 0x17, 0x0f, 0x11, 0x0e,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x0d, 0x0d, 0x0b, 0x18, 0x18, 0x16, 0x1a, 0x1a, 0x18, 0x14, 0x14, 0x11,
+ 0x11, 0x12, 0x0d, 0x11, 0x12, 0x0d, 0x13, 0x13, 0x10, 0x13, 0x13, 0x11,
+ 0x13, 0x13, 0x13, 0x13, 0x13, 0x11, 0x15, 0x15, 0x12, 0x13, 0x13, 0x11,
+ 0x14, 0x12, 0x13, 0x1d, 0x17, 0x19, 0x21, 0x18, 0x19, 0x20, 0x1a, 0x19,
+ 0x1b, 0x1b, 0x1a, 0x1e, 0x23, 0x25, 0x20, 0x27, 0x2c, 0x1a, 0x1e, 0x26,
+ 0x14, 0x1a, 0x1e, 0x1e, 0x24, 0x27, 0x29, 0x2e, 0x2d, 0x39, 0x47, 0x38,
+ 0x92, 0xad, 0x8e, 0xc3, 0xe6, 0xbc, 0xc5, 0xe5, 0xbe, 0xc1, 0xe0, 0xbb,
+ 0xbe, 0xdf, 0xb0, 0xba, 0xdb, 0xac, 0xb9, 0xdb, 0xa9, 0xb8, 0xda, 0xa8,
+ 0xb6, 0xdb, 0xa7, 0xb9, 0xde, 0xaa, 0xbb, 0xe0, 0xac, 0xbb, 0xe0, 0xac,
+ 0xbe, 0xde, 0xaf, 0xbe, 0xde, 0xb0, 0xbd, 0xde, 0xaf, 0xbd, 0xde, 0xaf,
+ 0xbb, 0xdc, 0xad, 0xbb, 0xdc, 0xad, 0xbb, 0xdc, 0xad, 0xba, 0xdb, 0xac,
+ 0x3f, 0x3f, 0x3d, 0x41, 0x43, 0x3e, 0x46, 0x4b, 0x44, 0x4c, 0x4f, 0x46,
+ 0x50, 0x51, 0x48, 0x4d, 0x4e, 0x46, 0x4e, 0x50, 0x48, 0x53, 0x56, 0x4f,
+ 0x51, 0x59, 0x4c, 0x4c, 0x57, 0x47, 0x4b, 0x58, 0x47, 0x4c, 0x57, 0x47,
+ 0x4b, 0x53, 0x46, 0x4c, 0x52, 0x46, 0x4a, 0x52, 0x46, 0x4a, 0x54, 0x49,
+ 0x4b, 0x50, 0x49, 0x48, 0x4d, 0x46, 0x42, 0x44, 0x3f, 0x42, 0x44, 0x3f,
+ 0x3f, 0x41, 0x3e, 0x3b, 0x3d, 0x3a, 0x3a, 0x3c, 0x39, 0x36, 0x38, 0x37,
+ 0x33, 0x34, 0x34, 0x36, 0x37, 0x39, 0x34, 0x35, 0x39, 0x2e, 0x31, 0x38,
+ 0x2d, 0x31, 0x3a, 0x25, 0x2c, 0x34, 0x23, 0x2a, 0x33, 0x1f, 0x28, 0x31,
+ 0x1d, 0x2b, 0x36, 0x20, 0x2e, 0x3b, 0x1d, 0x2a, 0x36, 0x11, 0x1a, 0x23,
+ 0x0b, 0x0d, 0x11, 0x0a, 0x0a, 0x0a, 0x07, 0x08, 0x06, 0x0a, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x07, 0x07, 0x07, 0x05, 0x05, 0x03, 0x07, 0x07, 0x05, 0x06, 0x06, 0x04,
+ 0x06, 0x08, 0x03, 0x14, 0x16, 0x11, 0x25, 0x27, 0x24, 0x22, 0x26, 0x27,
+ 0x27, 0x2a, 0x2d, 0x2b, 0x2e, 0x35, 0x35, 0x38, 0x42, 0x34, 0x38, 0x40,
+ 0x28, 0x2b, 0x30, 0x20, 0x23, 0x28, 0x1c, 0x1f, 0x23, 0x1e, 0x22, 0x25,
+ 0x1b, 0x1f, 0x20, 0x16, 0x1a, 0x1a, 0x16, 0x18, 0x17, 0x16, 0x18, 0x17,
+ 0x15, 0x17, 0x15, 0x0f, 0x11, 0x0e, 0x0a, 0x0c, 0x0b, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x09, 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c,
+ 0x07, 0x08, 0x0b, 0x0a, 0x0b, 0x0d, 0x0b, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e,
+ 0x0a, 0x0e, 0x11, 0x09, 0x0d, 0x10, 0x0a, 0x0d, 0x10, 0x09, 0x0e, 0x10,
+ 0x14, 0x1c, 0x1c, 0x2b, 0x31, 0x33, 0x31, 0x36, 0x39, 0x35, 0x39, 0x3d,
+ 0x34, 0x37, 0x3c, 0x36, 0x39, 0x3e, 0x3a, 0x3e, 0x42, 0x38, 0x3d, 0x40,
+ 0x36, 0x3b, 0x3e, 0x32, 0x37, 0x3a, 0x31, 0x36, 0x39, 0x32, 0x37, 0x3a,
+ 0x35, 0x3a, 0x3e, 0x39, 0x3c, 0x42, 0x36, 0x39, 0x40, 0x36, 0x39, 0x42,
+ 0x34, 0x37, 0x3c, 0x33, 0x36, 0x3b, 0x34, 0x38, 0x3d, 0x37, 0x3c, 0x40,
+ 0x3e, 0x43, 0x47, 0x3d, 0x42, 0x46, 0x3d, 0x40, 0x45, 0x38, 0x3c, 0x40,
+ 0x33, 0x37, 0x3a, 0x34, 0x39, 0x3b, 0x37, 0x3c, 0x40, 0x35, 0x3a, 0x3f,
+ 0x35, 0x39, 0x3f, 0x35, 0x3a, 0x40, 0x36, 0x3b, 0x41, 0x39, 0x3e, 0x43,
+ 0x3a, 0x3f, 0x43, 0x35, 0x3b, 0x3d, 0x34, 0x3b, 0x3b, 0x35, 0x3b, 0x3b,
+ 0x38, 0x40, 0x44, 0x36, 0x3d, 0x43, 0x35, 0x3d, 0x40, 0x37, 0x3f, 0x42,
+ 0x36, 0x40, 0x44, 0x35, 0x3e, 0x45, 0x33, 0x42, 0x50, 0x36, 0x55, 0x74,
+ 0x38, 0x6d, 0xa0, 0x30, 0x76, 0xb7, 0x2b, 0x75, 0xb8, 0x25, 0x70, 0xb3,
+ 0x18, 0x65, 0x9b, 0x11, 0x55, 0x86, 0x11, 0x47, 0x75, 0x17, 0x45, 0x6f,
+ 0x18, 0x43, 0x6d, 0x14, 0x41, 0x6b, 0x13, 0x42, 0x6c, 0x12, 0x42, 0x6b,
+ 0x12, 0x3a, 0x61, 0x0e, 0x32, 0x56, 0x0c, 0x2a, 0x4c, 0x0c, 0x25, 0x42,
+ 0x0f, 0x24, 0x3f, 0x0f, 0x22, 0x3d, 0x0c, 0x1f, 0x3a, 0x0d, 0x21, 0x3c,
+ 0x0d, 0x22, 0x3f, 0x0f, 0x27, 0x44, 0x11, 0x2a, 0x4b, 0x0d, 0x27, 0x4b,
+ 0x0e, 0x26, 0x4a, 0x0e, 0x25, 0x43, 0x10, 0x23, 0x3e, 0x0e, 0x1d, 0x33,
+ 0x10, 0x18, 0x21, 0x0e, 0x19, 0x1c, 0x17, 0x26, 0x28, 0x18, 0x2a, 0x35,
+ 0x10, 0x26, 0x3d, 0x0d, 0x24, 0x41, 0x0e, 0x24, 0x3f, 0x0b, 0x1e, 0x34,
+ 0x0b, 0x18, 0x28, 0x0f, 0x1d, 0x27, 0x14, 0x25, 0x2c, 0x1b, 0x30, 0x3e,
+ 0x1a, 0x35, 0x50, 0x17, 0x36, 0x59, 0x16, 0x37, 0x5b, 0x12, 0x31, 0x52,
+ 0x13, 0x25, 0x3a, 0x0b, 0x29, 0x39, 0x17, 0x47, 0x65, 0x3f, 0x7e, 0xb8,
+ 0x4a, 0x96, 0xdf, 0x3f, 0x94, 0xd8, 0x3f, 0x94, 0xd7, 0x3e, 0x94, 0xdc,
+ 0x45, 0x95, 0xd5, 0x4c, 0x97, 0xd1, 0x4c, 0x91, 0xc7, 0x6d, 0xac, 0xe1,
+ 0x73, 0xb0, 0xe7, 0x45, 0x80, 0xb8, 0x29, 0x5f, 0x98, 0x06, 0x3a, 0x73,
+ 0x13, 0x48, 0x7a, 0x26, 0x63, 0xa0, 0x30, 0x77, 0xc7, 0x33, 0x80, 0xda,
+ 0x37, 0x7e, 0xd2, 0x2e, 0x64, 0xa0, 0x24, 0x47, 0x5e, 0x25, 0x39, 0x38,
+ 0x35, 0x36, 0x3b, 0x24, 0x29, 0x2f, 0x1f, 0x26, 0x2c, 0x22, 0x26, 0x28,
+ 0x2c, 0x2d, 0x2a, 0x23, 0x22, 0x20, 0x12, 0x15, 0x18, 0x07, 0x0e, 0x17,
+ 0x08, 0x0a, 0x0a, 0x09, 0x0b, 0x08, 0x17, 0x19, 0x18, 0x1c, 0x1d, 0x1f,
+ 0x27, 0x28, 0x2c, 0x26, 0x2a, 0x2d, 0x21, 0x25, 0x24, 0x50, 0x57, 0x51,
+ 0x47, 0x4e, 0x4d, 0x19, 0x21, 0x20, 0x13, 0x1c, 0x1b, 0x0f, 0x18, 0x17,
+ 0x11, 0x17, 0x17, 0x17, 0x1c, 0x1c, 0x0c, 0x11, 0x12, 0x03, 0x07, 0x08,
+ 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x05, 0x05, 0x05,
+ 0x11, 0x11, 0x11, 0x16, 0x18, 0x17, 0x08, 0x0b, 0x09, 0x02, 0x04, 0x03,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x09, 0x09, 0x03, 0x05, 0x04, 0x0a, 0x0b, 0x0d,
+ 0x16, 0x18, 0x19, 0x20, 0x23, 0x25, 0x21, 0x25, 0x28, 0x10, 0x14, 0x17,
+ 0x0b, 0x0f, 0x10, 0x14, 0x17, 0x18, 0x19, 0x1c, 0x1b, 0x21, 0x23, 0x22,
+ 0x1d, 0x1f, 0x1e, 0x12, 0x14, 0x13, 0x0d, 0x0e, 0x0f, 0x08, 0x09, 0x0b,
+ 0x0c, 0x0d, 0x0f, 0x17, 0x18, 0x1a, 0x1a, 0x1b, 0x1e, 0x20, 0x24, 0x25,
+ 0x22, 0x26, 0x27, 0x21, 0x25, 0x26, 0x1c, 0x20, 0x21, 0x1e, 0x22, 0x23,
+ 0x1f, 0x25, 0x23, 0x1f, 0x24, 0x22, 0x1b, 0x1f, 0x1e, 0x1c, 0x1e, 0x1b,
+ 0x19, 0x1b, 0x18, 0x14, 0x16, 0x13, 0x18, 0x1a, 0x19, 0x0f, 0x11, 0x10,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04,
+ 0x0a, 0x0a, 0x0a, 0x19, 0x19, 0x17, 0x1a, 0x1a, 0x18, 0x10, 0x11, 0x0e,
+ 0x12, 0x13, 0x0e, 0x15, 0x15, 0x11, 0x10, 0x10, 0x0f, 0x13, 0x13, 0x13,
+ 0x14, 0x13, 0x13, 0x14, 0x13, 0x11, 0x13, 0x12, 0x0e, 0x12, 0x10, 0x0d,
+ 0x2e, 0x23, 0x21, 0x48, 0x36, 0x33, 0x49, 0x33, 0x30, 0x46, 0x33, 0x2f,
+ 0x46, 0x3c, 0x37, 0x52, 0x4e, 0x4d, 0x45, 0x43, 0x46, 0x2b, 0x28, 0x2f,
+ 0x1e, 0x1c, 0x23, 0x26, 0x2d, 0x29, 0x2f, 0x3f, 0x2b, 0x8b, 0xa5, 0x83,
+ 0xc3, 0xe2, 0xb8, 0xc7, 0xe8, 0xbd, 0xc4, 0xe3, 0xbc, 0xc2, 0xdd, 0xbb,
+ 0xbb, 0xdc, 0xae, 0xba, 0xdb, 0xac, 0xba, 0xdc, 0xab, 0xbb, 0xdd, 0xab,
+ 0xba, 0xdd, 0xab, 0xba, 0xde, 0xab, 0xba, 0xdf, 0xad, 0xbc, 0xe0, 0xaf,
+ 0xbe, 0xe0, 0xae, 0xbd, 0xdf, 0xaf, 0xbc, 0xde, 0xaf, 0xbb, 0xdf, 0xaf,
+ 0xb9, 0xdd, 0xad, 0xbc, 0xdd, 0xae, 0xbb, 0xdb, 0xad, 0xba, 0xdb, 0xac,
+ 0x3f, 0x3f, 0x3e, 0x40, 0x42, 0x3f, 0x41, 0x45, 0x3f, 0x48, 0x4b, 0x44,
+ 0x4d, 0x4e, 0x46, 0x51, 0x51, 0x49, 0x51, 0x52, 0x4c, 0x4f, 0x51, 0x4b,
+ 0x4d, 0x51, 0x44, 0x4b, 0x52, 0x43, 0x4b, 0x53, 0x44, 0x4d, 0x55, 0x47,
+ 0x48, 0x4c, 0x41, 0x4a, 0x4b, 0x44, 0x47, 0x49, 0x44, 0x48, 0x4a, 0x47,
+ 0x47, 0x49, 0x44, 0x45, 0x47, 0x42, 0x3f, 0x41, 0x3c, 0x3e, 0x3e, 0x3c,
+ 0x3e, 0x3e, 0x3c, 0x3a, 0x3c, 0x39, 0x36, 0x38, 0x35, 0x33, 0x35, 0x32,
+ 0x31, 0x31, 0x31, 0x32, 0x33, 0x35, 0x32, 0x35, 0x38, 0x31, 0x34, 0x3b,
+ 0x2a, 0x2e, 0x37, 0x21, 0x28, 0x30, 0x20, 0x27, 0x30, 0x20, 0x27, 0x30,
+ 0x1e, 0x28, 0x31, 0x1f, 0x2c, 0x35, 0x22, 0x2c, 0x36, 0x19, 0x22, 0x2a,
+ 0x0c, 0x0e, 0x13, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x09, 0x0b, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x09, 0x09, 0x09,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
+ 0x04, 0x05, 0x03, 0x07, 0x07, 0x05, 0x10, 0x11, 0x0e, 0x19, 0x1c, 0x1b,
+ 0x1d, 0x21, 0x22, 0x25, 0x29, 0x2c, 0x2a, 0x2e, 0x31, 0x2c, 0x30, 0x34,
+ 0x2b, 0x2f, 0x37, 0x2a, 0x2d, 0x35, 0x22, 0x26, 0x2d, 0x25, 0x29, 0x2e,
+ 0x20, 0x24, 0x27, 0x1b, 0x1f, 0x20, 0x1d, 0x21, 0x1f, 0x1b, 0x1f, 0x1e,
+ 0x12, 0x17, 0x13, 0x08, 0x0a, 0x07, 0x06, 0x08, 0x07, 0x09, 0x0b, 0x0a,
+ 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x08, 0x0a, 0x0d, 0x08, 0x0c, 0x0f,
+ 0x08, 0x09, 0x0b, 0x08, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0b, 0x0c, 0x0e,
+ 0x07, 0x0b, 0x0d, 0x06, 0x0a, 0x0b, 0x09, 0x0d, 0x0e, 0x09, 0x0d, 0x0e,
+ 0x12, 0x1b, 0x18, 0x29, 0x2f, 0x30, 0x33, 0x38, 0x3a, 0x32, 0x36, 0x39,
+ 0x31, 0x34, 0x39, 0x34, 0x38, 0x3b, 0x36, 0x3a, 0x3d, 0x38, 0x3c, 0x3d,
+ 0x36, 0x3b, 0x3e, 0x32, 0x37, 0x3a, 0x33, 0x38, 0x3b, 0x36, 0x3b, 0x3e,
+ 0x3d, 0x41, 0x45, 0x3c, 0x3f, 0x44, 0x36, 0x39, 0x41, 0x35, 0x38, 0x41,
+ 0x34, 0x37, 0x3c, 0x35, 0x38, 0x3d, 0x34, 0x37, 0x3c, 0x38, 0x3d, 0x41,
+ 0x3b, 0x40, 0x43, 0x3b, 0x3f, 0x42, 0x39, 0x3c, 0x40, 0x34, 0x37, 0x3a,
+ 0x34, 0x39, 0x3c, 0x38, 0x3d, 0x40, 0x3a, 0x3f, 0x43, 0x36, 0x3b, 0x3f,
+ 0x36, 0x3c, 0x3f, 0x38, 0x3d, 0x41, 0x38, 0x3b, 0x40, 0x38, 0x3b, 0x40,
+ 0x38, 0x3e, 0x44, 0x37, 0x3c, 0x40, 0x32, 0x39, 0x3b, 0x32, 0x3a, 0x3d,
+ 0x3b, 0x43, 0x49, 0x3a, 0x41, 0x49, 0x36, 0x3e, 0x45, 0x33, 0x3c, 0x41,
+ 0x2f, 0x40, 0x4c, 0x30, 0x48, 0x61, 0x31, 0x57, 0x82, 0x36, 0x6c, 0xa7,
+ 0x34, 0x77, 0xbb, 0x2a, 0x74, 0xb6, 0x26, 0x6f, 0xab, 0x21, 0x67, 0x9c,
+ 0x15, 0x50, 0x7f, 0x10, 0x44, 0x6e, 0x16, 0x45, 0x6d, 0x15, 0x43, 0x6a,
+ 0x14, 0x42, 0x6b, 0x15, 0x42, 0x6b, 0x14, 0x3e, 0x62, 0x13, 0x39, 0x5a,
+ 0x11, 0x32, 0x55, 0x09, 0x27, 0x47, 0x0c, 0x25, 0x43, 0x12, 0x25, 0x41,
+ 0x11, 0x23, 0x3b, 0x0e, 0x20, 0x38, 0x0d, 0x21, 0x39, 0x0e, 0x22, 0x3b,
+ 0x0f, 0x22, 0x3e, 0x0f, 0x24, 0x42, 0x0f, 0x27, 0x49, 0x0e, 0x26, 0x4b,
+ 0x0e, 0x27, 0x4b, 0x0f, 0x25, 0x43, 0x11, 0x23, 0x3d, 0x0c, 0x1c, 0x32,
+ 0x0e, 0x16, 0x21, 0x0c, 0x19, 0x1e, 0x15, 0x27, 0x2b, 0x19, 0x2d, 0x3a,
+ 0x13, 0x28, 0x43, 0x0e, 0x22, 0x44, 0x0e, 0x23, 0x40, 0x0b, 0x1e, 0x35,
+ 0x0b, 0x19, 0x26, 0x11, 0x1f, 0x28, 0x17, 0x29, 0x30, 0x17, 0x2f, 0x3d,
+ 0x17, 0x34, 0x50, 0x18, 0x37, 0x5c, 0x16, 0x35, 0x5b, 0x13, 0x30, 0x51,
+ 0x0c, 0x27, 0x40, 0x16, 0x40, 0x6a, 0x3f, 0x7e, 0xbb, 0x4e, 0x9a, 0xdc,
+ 0x42, 0x94, 0xd4, 0x3b, 0x91, 0xd1, 0x3b, 0x93, 0xd3, 0x38, 0x90, 0xd1,
+ 0x38, 0x8d, 0xc4, 0x45, 0x93, 0xc7, 0x53, 0x97, 0xc6, 0x6f, 0xaf, 0xd7,
+ 0x80, 0xc1, 0xe5, 0x41, 0x81, 0xab, 0x1c, 0x59, 0x8f, 0x0b, 0x45, 0x86,
+ 0x26, 0x67, 0xa7, 0x37, 0x7d, 0xc8, 0x38, 0x81, 0xd4, 0x39, 0x7d, 0xc8,
+ 0x3c, 0x6f, 0xa2, 0x23, 0x41, 0x5b, 0x14, 0x21, 0x27, 0x25, 0x2b, 0x27,
+ 0x29, 0x2b, 0x2c, 0x14, 0x19, 0x1c, 0x24, 0x29, 0x2c, 0x29, 0x2d, 0x2b,
+ 0x2e, 0x2e, 0x2c, 0x2e, 0x2d, 0x2b, 0x28, 0x2b, 0x30, 0x1d, 0x25, 0x2d,
+ 0x16, 0x18, 0x1c, 0x10, 0x11, 0x13, 0x0a, 0x0c, 0x0b, 0x08, 0x0a, 0x09,
+ 0x19, 0x1a, 0x1c, 0x1f, 0x23, 0x25, 0x24, 0x2a, 0x2b, 0x24, 0x2c, 0x2a,
+ 0x15, 0x1e, 0x1d, 0x12, 0x1b, 0x1a, 0x12, 0x1b, 0x1a, 0x13, 0x19, 0x19,
+ 0x0e, 0x12, 0x13, 0x0c, 0x0d, 0x0f, 0x05, 0x06, 0x08, 0x04, 0x05, 0x07,
+ 0x0f, 0x0f, 0x10, 0x1a, 0x1a, 0x1a, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x07, 0x07, 0x07, 0x06, 0x07, 0x09, 0x09, 0x0a, 0x0e, 0x1b, 0x1c, 0x21,
+ 0x26, 0x29, 0x2e, 0x28, 0x2c, 0x2e, 0x2f, 0x33, 0x33, 0x2a, 0x2f, 0x2e,
+ 0x08, 0x0c, 0x0d, 0x0a, 0x0e, 0x0f, 0x12, 0x14, 0x13, 0x1c, 0x1e, 0x1d,
+ 0x1f, 0x21, 0x20, 0x20, 0x22, 0x21, 0x1d, 0x1e, 0x20, 0x13, 0x14, 0x16,
+ 0x0d, 0x0e, 0x10, 0x08, 0x0a, 0x0c, 0x12, 0x15, 0x17, 0x1e, 0x22, 0x23,
+ 0x20, 0x24, 0x25, 0x20, 0x24, 0x25, 0x1d, 0x21, 0x22, 0x1b, 0x20, 0x20,
+ 0x1a, 0x1f, 0x1e, 0x1b, 0x1f, 0x1d, 0x1d, 0x1f, 0x1e, 0x18, 0x1a, 0x17,
+ 0x16, 0x16, 0x14, 0x15, 0x16, 0x15, 0x18, 0x1a, 0x19, 0x0f, 0x11, 0x10,
+ 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04,
+ 0x08, 0x08, 0x09, 0x10, 0x10, 0x0e, 0x12, 0x12, 0x10, 0x0f, 0x10, 0x0d,
+ 0x10, 0x12, 0x0d, 0x13, 0x13, 0x11, 0x0f, 0x0f, 0x0e, 0x13, 0x13, 0x13,
+ 0x15, 0x13, 0x14, 0x16, 0x14, 0x13, 0x14, 0x11, 0x0e, 0x20, 0x1d, 0x17,
+ 0x5b, 0x49, 0x3c, 0x74, 0x56, 0x4b, 0x76, 0x51, 0x46, 0x7d, 0x59, 0x4d,
+ 0x74, 0x57, 0x4c, 0x72, 0x5e, 0x56, 0x65, 0x50, 0x4e, 0x49, 0x30, 0x33,
+ 0x32, 0x24, 0x25, 0x1f, 0x22, 0x14, 0x67, 0x7c, 0x5b, 0xc3, 0xe5, 0xb9,
+ 0xc9, 0xea, 0xc0, 0xca, 0xe7, 0xc0, 0xc4, 0xe1, 0xb9, 0xbe, 0xde, 0xb2,
+ 0xbb, 0xdc, 0xad, 0xbb, 0xdc, 0xad, 0xba, 0xdc, 0xab, 0xba, 0xdc, 0xaa,
+ 0xbd, 0xde, 0xae, 0xbc, 0xde, 0xae, 0xbc, 0xde, 0xb1, 0xbe, 0xdf, 0xb2,
+ 0xbe, 0xe0, 0xae, 0xbc, 0xe0, 0xad, 0xbc, 0xe0, 0xae, 0xbb, 0xdf, 0xaf,
+ 0xbb, 0xde, 0xaf, 0xbc, 0xdd, 0xae, 0xbc, 0xdd, 0xae, 0xbe, 0xdd, 0xb1,
+ 0x3c, 0x3c, 0x3b, 0x3b, 0x3d, 0x3a, 0x40, 0x42, 0x3d, 0x40, 0x43, 0x3c,
+ 0x45, 0x46, 0x3e, 0x4c, 0x4b, 0x46, 0x4a, 0x4b, 0x46, 0x47, 0x49, 0x43,
+ 0x48, 0x4a, 0x40, 0x4a, 0x4d, 0x42, 0x47, 0x4d, 0x41, 0x4a, 0x4e, 0x43,
+ 0x49, 0x4a, 0x43, 0x48, 0x45, 0x42, 0x46, 0x45, 0x45, 0x46, 0x45, 0x47,
+ 0x40, 0x42, 0x40, 0x3f, 0x41, 0x3e, 0x3f, 0x3f, 0x3d, 0x3a, 0x3a, 0x38,
+ 0x3a, 0x3a, 0x39, 0x39, 0x39, 0x37, 0x34, 0x36, 0x33, 0x31, 0x32, 0x30,
+ 0x2e, 0x2f, 0x2f, 0x2c, 0x2d, 0x2e, 0x28, 0x2b, 0x2e, 0x28, 0x2d, 0x33,
+ 0x22, 0x26, 0x2f, 0x1d, 0x24, 0x2c, 0x1e, 0x25, 0x2c, 0x1e, 0x26, 0x2c,
+ 0x1f, 0x28, 0x2f, 0x1e, 0x28, 0x31, 0x23, 0x2e, 0x37, 0x1f, 0x26, 0x2e,
+ 0x13, 0x16, 0x1a, 0x12, 0x12, 0x14, 0x10, 0x12, 0x11, 0x0d, 0x0f, 0x0e,
+ 0x0a, 0x0a, 0x0a, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x04, 0x06, 0x05, 0x04, 0x06, 0x05, 0x04, 0x05, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x09, 0x08,
+ 0x0e, 0x10, 0x0f, 0x1c, 0x20, 0x1f, 0x26, 0x2b, 0x27, 0x30, 0x34, 0x31,
+ 0x35, 0x39, 0x42, 0x31, 0x35, 0x3f, 0x27, 0x2b, 0x33, 0x2e, 0x31, 0x37,
+ 0x25, 0x29, 0x2c, 0x19, 0x1d, 0x1e, 0x15, 0x19, 0x18, 0x0e, 0x12, 0x10,
+ 0x07, 0x0c, 0x08, 0x07, 0x0a, 0x07, 0x08, 0x0a, 0x09, 0x08, 0x0a, 0x09,
+ 0x08, 0x09, 0x0b, 0x0b, 0x0c, 0x0e, 0x09, 0x0b, 0x0e, 0x07, 0x0b, 0x0e,
+ 0x0a, 0x0c, 0x0c, 0x08, 0x0a, 0x0a, 0x09, 0x0b, 0x0a, 0x0b, 0x0c, 0x0e,
+ 0x08, 0x0c, 0x0d, 0x07, 0x0b, 0x0c, 0x0a, 0x0d, 0x0f, 0x08, 0x0c, 0x0d,
+ 0x10, 0x18, 0x16, 0x2c, 0x32, 0x32, 0x32, 0x38, 0x38, 0x33, 0x37, 0x3a,
+ 0x32, 0x35, 0x39, 0x32, 0x36, 0x39, 0x34, 0x38, 0x39, 0x36, 0x3a, 0x3b,
+ 0x36, 0x3b, 0x3e, 0x35, 0x3a, 0x3d, 0x31, 0x36, 0x39, 0x38, 0x3d, 0x40,
+ 0x3f, 0x44, 0x47, 0x40, 0x43, 0x48, 0x3c, 0x3f, 0x46, 0x36, 0x39, 0x42,
+ 0x34, 0x37, 0x3c, 0x37, 0x39, 0x3e, 0x37, 0x3a, 0x3f, 0x37, 0x3c, 0x3f,
+ 0x39, 0x3e, 0x41, 0x37, 0x3b, 0x3e, 0x34, 0x38, 0x3a, 0x32, 0x37, 0x38,
+ 0x36, 0x3b, 0x3c, 0x3a, 0x3e, 0x42, 0x37, 0x3c, 0x40, 0x37, 0x3b, 0x3f,
+ 0x36, 0x3c, 0x40, 0x3b, 0x3f, 0x43, 0x37, 0x3a, 0x3f, 0x39, 0x3a, 0x3f,
+ 0x36, 0x3d, 0x46, 0x35, 0x3c, 0x42, 0x32, 0x3b, 0x3e, 0x33, 0x3a, 0x40,
+ 0x38, 0x3e, 0x48, 0x37, 0x3e, 0x49, 0x36, 0x3e, 0x48, 0x34, 0x3e, 0x47,
+ 0x35, 0x4b, 0x64, 0x37, 0x5e, 0x89, 0x32, 0x6f, 0xb0, 0x2a, 0x72, 0xc1,
+ 0x25, 0x6e, 0xba, 0x22, 0x67, 0xa6, 0x1b, 0x5b, 0x8d, 0x12, 0x50, 0x79,
+ 0x15, 0x44, 0x6d, 0x18, 0x43, 0x6d, 0x16, 0x42, 0x69, 0x13, 0x43, 0x69,
+ 0x11, 0x44, 0x6b, 0x11, 0x3f, 0x64, 0x11, 0x36, 0x53, 0x10, 0x2c, 0x45,
+ 0x0c, 0x29, 0x47, 0x0e, 0x28, 0x46, 0x0e, 0x23, 0x3e, 0x13, 0x23, 0x3b,
+ 0x12, 0x23, 0x37, 0x0f, 0x20, 0x35, 0x0c, 0x20, 0x35, 0x0e, 0x22, 0x39,
+ 0x11, 0x23, 0x3f, 0x0f, 0x23, 0x43, 0x0e, 0x24, 0x47, 0x0e, 0x26, 0x4a,
+ 0x0b, 0x23, 0x47, 0x0b, 0x21, 0x40, 0x10, 0x22, 0x3d, 0x0d, 0x1b, 0x31,
+ 0x0e, 0x16, 0x1c, 0x10, 0x1a, 0x1d, 0x18, 0x28, 0x2c, 0x19, 0x2d, 0x3b,
+ 0x14, 0x27, 0x43, 0x0f, 0x22, 0x46, 0x10, 0x23, 0x44, 0x0b, 0x1e, 0x38,
+ 0x0f, 0x1e, 0x29, 0x15, 0x23, 0x2c, 0x16, 0x29, 0x31, 0x19, 0x30, 0x3f,
+ 0x1b, 0x36, 0x52, 0x1e, 0x3a, 0x5f, 0x1c, 0x39, 0x5d, 0x12, 0x31, 0x52,
+ 0x15, 0x49, 0x74, 0x3b, 0x88, 0xc1, 0x47, 0x9e, 0xe5, 0x45, 0x96, 0xe0,
+ 0x3e, 0x8e, 0xd1, 0x37, 0x93, 0xd0, 0x3c, 0x92, 0xd2, 0x38, 0x7f, 0xc7,
+ 0x27, 0x80, 0xc0, 0x31, 0x83, 0xc1, 0x48, 0x8c, 0xc5, 0x5f, 0x9f, 0xcd,
+ 0x53, 0x95, 0xbb, 0x22, 0x65, 0x91, 0x16, 0x53, 0x92, 0x26, 0x60, 0xb0,
+ 0x35, 0x7e, 0xd2, 0x39, 0x85, 0xd9, 0x32, 0x79, 0xc2, 0x33, 0x6a, 0x99,
+ 0x33, 0x54, 0x63, 0x25, 0x31, 0x2f, 0x19, 0x1a, 0x1e, 0x11, 0x11, 0x1c,
+ 0x0c, 0x0c, 0x0b, 0x0a, 0x0c, 0x0c, 0x0f, 0x14, 0x14, 0x1b, 0x20, 0x20,
+ 0x25, 0x2b, 0x2a, 0x28, 0x2b, 0x2b, 0x2b, 0x2b, 0x2d, 0x2b, 0x2c, 0x2e,
+ 0x28, 0x28, 0x2f, 0x22, 0x22, 0x26, 0x15, 0x17, 0x18, 0x24, 0x26, 0x25,
+ 0x3d, 0x3f, 0x40, 0x20, 0x23, 0x28, 0x1f, 0x25, 0x28, 0x14, 0x1c, 0x1e,
+ 0x13, 0x1c, 0x1b, 0x14, 0x1d, 0x1c, 0x12, 0x1a, 0x19, 0x0e, 0x14, 0x14,
+ 0x07, 0x0b, 0x0c, 0x03, 0x04, 0x06, 0x05, 0x03, 0x06, 0x03, 0x01, 0x04,
+ 0x10, 0x12, 0x11, 0x1c, 0x1d, 0x1c, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04,
+ 0x0c, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x06, 0x06, 0x06, 0x02, 0x02, 0x02,
+ 0x04, 0x05, 0x03, 0x09, 0x0b, 0x0c, 0x1c, 0x1c, 0x22, 0x29, 0x29, 0x31,
+ 0x22, 0x25, 0x2b, 0x24, 0x27, 0x2a, 0x29, 0x2e, 0x2c, 0x32, 0x38, 0x33,
+ 0x15, 0x1a, 0x1b, 0x13, 0x17, 0x18, 0x0b, 0x0c, 0x0e, 0x10, 0x12, 0x12,
+ 0x17, 0x19, 0x19, 0x22, 0x23, 0x24, 0x23, 0x24, 0x26, 0x20, 0x21, 0x24,
+ 0x19, 0x1a, 0x1c, 0x10, 0x14, 0x15, 0x19, 0x1d, 0x1d, 0x18, 0x1c, 0x1d,
+ 0x1c, 0x20, 0x21, 0x20, 0x24, 0x25, 0x1f, 0x23, 0x24, 0x1b, 0x1f, 0x20,
+ 0x18, 0x1d, 0x1d, 0x16, 0x1a, 0x19, 0x1a, 0x1c, 0x1b, 0x19, 0x19, 0x18,
+ 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x1b, 0x1c, 0x1b, 0x0f, 0x10, 0x11,
+ 0x07, 0x07, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+ 0x07, 0x07, 0x07, 0x10, 0x10, 0x0e, 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x0d,
+ 0x0e, 0x10, 0x0d, 0x10, 0x11, 0x0f, 0x11, 0x12, 0x11, 0x14, 0x12, 0x13,
+ 0x15, 0x13, 0x14, 0x17, 0x14, 0x12, 0x18, 0x14, 0x10, 0x3a, 0x34, 0x2d,
+ 0x78, 0x60, 0x4c, 0x80, 0x5b, 0x48, 0x91, 0x62, 0x51, 0x9d, 0x6f, 0x5d,
+ 0xa2, 0x7a, 0x67, 0xa0, 0x7d, 0x6e, 0x92, 0x6a, 0x64, 0x85, 0x58, 0x58,
+ 0x66, 0x4a, 0x47, 0x70, 0x6d, 0x56, 0xbe, 0xd7, 0xad, 0xc9, 0xef, 0xc0,
+ 0xcd, 0xee, 0xc7, 0xc7, 0xe2, 0xc1, 0xc1, 0xde, 0xb4, 0xbd, 0xde, 0xac,
+ 0xbb, 0xdc, 0xad, 0xbb, 0xdc, 0xad, 0xbd, 0xde, 0xae, 0xbc, 0xdd, 0xae,
+ 0xbd, 0xde, 0xaf, 0xbd, 0xde, 0xb1, 0xbe, 0xde, 0xb3, 0xbe, 0xdf, 0xb4,
+ 0xbc, 0xe1, 0xae, 0xbb, 0xe0, 0xad, 0xbc, 0xe1, 0xae, 0xbb, 0xdf, 0xaf,
+ 0xbc, 0xdf, 0xaf, 0xbd, 0xde, 0xaf, 0xc0, 0xdf, 0xb3, 0xbe, 0xdd, 0xb1,
+ 0x3b, 0x3b, 0x39, 0x3c, 0x3c, 0x3a, 0x3e, 0x3e, 0x3c, 0x3c, 0x3d, 0x38,
+ 0x3b, 0x3d, 0x38, 0x45, 0x46, 0x41, 0x44, 0x45, 0x40, 0x43, 0x44, 0x3f,
+ 0x48, 0x49, 0x41, 0x47, 0x48, 0x40, 0x48, 0x49, 0x41, 0x46, 0x47, 0x3f,
+ 0x46, 0x47, 0x40, 0x42, 0x43, 0x3d, 0x43, 0x44, 0x3f, 0x41, 0x41, 0x3f,
+ 0x3e, 0x3d, 0x3b, 0x3f, 0x3e, 0x3c, 0x3c, 0x3b, 0x39, 0x39, 0x39, 0x37,
+ 0x38, 0x38, 0x37, 0x37, 0x37, 0x37, 0x2f, 0x31, 0x32, 0x2a, 0x2b, 0x2d,
+ 0x2c, 0x2d, 0x30, 0x29, 0x2a, 0x2c, 0x23, 0x27, 0x28, 0x21, 0x25, 0x24,
+ 0x1f, 0x25, 0x25, 0x1c, 0x24, 0x24, 0x1a, 0x23, 0x25, 0x19, 0x21, 0x24,
+ 0x1d, 0x22, 0x2a, 0x1b, 0x25, 0x30, 0x1d, 0x2d, 0x36, 0x1c, 0x28, 0x30,
+ 0x12, 0x17, 0x1c, 0x13, 0x13, 0x14, 0x12, 0x14, 0x11, 0x0d, 0x12, 0x0f,
+ 0x0a, 0x0b, 0x0a, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x0d, 0x0d, 0x0d,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09,
+ 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x03, 0x04, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x05, 0x06, 0x06, 0x0b, 0x0b, 0x0b, 0x15, 0x16, 0x15, 0x27, 0x27, 0x27,
+ 0x35, 0x36, 0x34, 0x2a, 0x2b, 0x29, 0x1f, 0x21, 0x1f, 0x1d, 0x1f, 0x1e,
+ 0x1a, 0x1c, 0x1c, 0x11, 0x12, 0x14, 0x0a, 0x0b, 0x0d, 0x08, 0x09, 0x0b,
+ 0x08, 0x0a, 0x09, 0x07, 0x09, 0x08, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09,
+ 0x08, 0x0a, 0x0b, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c,
+ 0x0a, 0x0b, 0x0d, 0x09, 0x0b, 0x0c, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c,
+ 0x0b, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e, 0x09, 0x0d, 0x0e, 0x0b, 0x0f, 0x10,
+ 0x13, 0x19, 0x18, 0x2c, 0x32, 0x32, 0x34, 0x39, 0x3b, 0x32, 0x37, 0x3a,
+ 0x34, 0x38, 0x3d, 0x33, 0x38, 0x3c, 0x31, 0x36, 0x3a, 0x35, 0x3a, 0x3e,
+ 0x3a, 0x3f, 0x42, 0x37, 0x3b, 0x3e, 0x33, 0x37, 0x3a, 0x36, 0x3b, 0x3e,
+ 0x3a, 0x3e, 0x41, 0x3b, 0x3f, 0x42, 0x3c, 0x40, 0x43, 0x38, 0x3c, 0x3f,
+ 0x35, 0x39, 0x3c, 0x35, 0x39, 0x3c, 0x36, 0x3a, 0x3d, 0x35, 0x39, 0x3c,
+ 0x35, 0x39, 0x3c, 0x33, 0x38, 0x3b, 0x30, 0x37, 0x3a, 0x2d, 0x35, 0x38,
+ 0x35, 0x36, 0x3f, 0x38, 0x39, 0x3f, 0x37, 0x39, 0x3b, 0x34, 0x39, 0x3a,
+ 0x36, 0x3e, 0x40, 0x39, 0x41, 0x44, 0x34, 0x3a, 0x3c, 0x37, 0x38, 0x3b,
+ 0x34, 0x3b, 0x40, 0x31, 0x3c, 0x42, 0x2f, 0x3b, 0x43, 0x31, 0x37, 0x41,
+ 0x35, 0x34, 0x40, 0x37, 0x37, 0x45, 0x32, 0x3f, 0x4c, 0x31, 0x4c, 0x5b,
+ 0x3d, 0x69, 0x9b, 0x3a, 0x75, 0xb1, 0x29, 0x74, 0xb7, 0x1e, 0x71, 0xb5,
+ 0x17, 0x65, 0xa0, 0x12, 0x54, 0x83, 0x15, 0x4a, 0x71, 0x16, 0x45, 0x66,
+ 0x15, 0x46, 0x68, 0x15, 0x47, 0x6b, 0x11, 0x41, 0x67, 0x13, 0x40, 0x69,
+ 0x15, 0x3e, 0x65, 0x0f, 0x32, 0x54, 0x0b, 0x29, 0x47, 0x0d, 0x27, 0x41,
+ 0x0f, 0x26, 0x37, 0x0f, 0x24, 0x3b, 0x0d, 0x20, 0x3e, 0x0d, 0x21, 0x3e,
+ 0x0b, 0x21, 0x37, 0x0b, 0x21, 0x33, 0x0d, 0x22, 0x35, 0x11, 0x24, 0x3a,
+ 0x11, 0x2a, 0x3b, 0x0f, 0x28, 0x44, 0x0e, 0x25, 0x47, 0x0e, 0x26, 0x45,
+ 0x0c, 0x23, 0x42, 0x0d, 0x22, 0x45, 0x10, 0x20, 0x41, 0x0b, 0x1b, 0x30,
+ 0x07, 0x17, 0x1e, 0x0d, 0x1c, 0x22, 0x17, 0x27, 0x32, 0x1a, 0x2c, 0x40,
+ 0x12, 0x27, 0x42, 0x0d, 0x24, 0x43, 0x0d, 0x23, 0x40, 0x0a, 0x1e, 0x35,
+ 0x0f, 0x1e, 0x2f, 0x14, 0x27, 0x37, 0x14, 0x2d, 0x41, 0x26, 0x3a, 0x4e,
+ 0x4a, 0x4d, 0x57, 0x5c, 0x56, 0x5c, 0x3e, 0x4f, 0x61, 0x23, 0x55, 0x7d,
+ 0x40, 0x89, 0xc6, 0x4b, 0x9b, 0xdf, 0x40, 0x93, 0xdc, 0x3c, 0x90, 0xd6,
+ 0x3b, 0x8e, 0xcf, 0x45, 0x97, 0xd5, 0x3c, 0x8e, 0xce, 0x31, 0x81, 0xc6,
+ 0x37, 0x83, 0xc5, 0x34, 0x80, 0xba, 0x30, 0x7c, 0xb6, 0x29, 0x72, 0xab,
+ 0x16, 0x5b, 0x8d, 0x17, 0x57, 0x92, 0x27, 0x68, 0xb3, 0x32, 0x79, 0xc8,
+ 0x31, 0x81, 0xda, 0x37, 0x77, 0xbd, 0x3a, 0x5f, 0x88, 0x2c, 0x3e, 0x4d,
+ 0x20, 0x2b, 0x2b, 0x17, 0x1e, 0x1c, 0x0e, 0x10, 0x12, 0x08, 0x06, 0x0c,
+ 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0e, 0x0f, 0x0f, 0x1b, 0x1d, 0x1d, 0x29, 0x2c, 0x2d, 0x2b, 0x2e, 0x2f,
+ 0x2b, 0x2c, 0x2e, 0x29, 0x2a, 0x2c, 0x1f, 0x22, 0x22, 0x35, 0x3b, 0x37,
+ 0x52, 0x58, 0x54, 0x21, 0x2a, 0x26, 0x10, 0x19, 0x17, 0x11, 0x1a, 0x17,
+ 0x16, 0x1c, 0x1a, 0x15, 0x19, 0x18, 0x13, 0x15, 0x14, 0x0a, 0x0c, 0x0b,
+ 0x04, 0x05, 0x04, 0x08, 0x09, 0x09, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04,
+ 0x07, 0x09, 0x08, 0x10, 0x12, 0x11, 0x09, 0x09, 0x07, 0x06, 0x05, 0x02,
+ 0x0a, 0x09, 0x06, 0x10, 0x0f, 0x0d, 0x06, 0x06, 0x06, 0x04, 0x04, 0x05,
+ 0x08, 0x0c, 0x0f, 0x15, 0x1a, 0x1e, 0x23, 0x25, 0x2a, 0x1d, 0x1f, 0x25,
+ 0x18, 0x1c, 0x1f, 0x1e, 0x1f, 0x21, 0x1d, 0x1e, 0x20, 0x24, 0x27, 0x26,
+ 0x28, 0x2e, 0x2e, 0x22, 0x28, 0x28, 0x09, 0x0d, 0x0e, 0x0a, 0x0b, 0x0d,
+ 0x0c, 0x0e, 0x0d, 0x12, 0x13, 0x13, 0x1b, 0x1d, 0x1c, 0x21, 0x23, 0x22,
+ 0x22, 0x24, 0x24, 0x1f, 0x21, 0x21, 0x1e, 0x21, 0x20, 0x1e, 0x20, 0x1f,
+ 0x20, 0x22, 0x21, 0x20, 0x24, 0x23, 0x1f, 0x23, 0x24, 0x1b, 0x1f, 0x20,
+ 0x1b, 0x1c, 0x1c, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x16, 0x16, 0x16,
+ 0x15, 0x15, 0x13, 0x14, 0x14, 0x12, 0x16, 0x16, 0x14, 0x13, 0x15, 0x12,
+ 0x08, 0x08, 0x08, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x07, 0x07, 0x07, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10,
+ 0x12, 0x11, 0x0f, 0x12, 0x11, 0x0f, 0x10, 0x12, 0x11, 0x12, 0x14, 0x13,
+ 0x14, 0x15, 0x14, 0x13, 0x10, 0x0d, 0x16, 0x10, 0x0d, 0x3d, 0x33, 0x2d,
+ 0x5f, 0x41, 0x2e, 0x71, 0x50, 0x3c, 0x8a, 0x68, 0x53, 0xa0, 0x7b, 0x63,
+ 0xbd, 0x96, 0x7c, 0xd1, 0xa5, 0x8b, 0xce, 0x9a, 0x85, 0xc8, 0x91, 0x81,
+ 0xb3, 0x81, 0x74, 0xb3, 0x9b, 0x84, 0xc4, 0xd0, 0xa9, 0xca, 0xe9, 0xb9,
+ 0xc8, 0xea, 0xb8, 0xc2, 0xdf, 0xb1, 0xc2, 0xdb, 0xb3, 0xc0, 0xdb, 0xb5,
+ 0xb7, 0xdb, 0xab, 0xba, 0xde, 0xad, 0xbe, 0xdf, 0xae, 0xbf, 0xde, 0xb0,
+ 0xc0, 0xe0, 0xb1, 0xbe, 0xde, 0xb1, 0xbd, 0xdc, 0xb1, 0xbe, 0xde, 0xb3,
+ 0xbc, 0xdf, 0xad, 0xbc, 0xde, 0xac, 0xbf, 0xe1, 0xaf, 0xbf, 0xe1, 0xaf,
+ 0xc0, 0xe2, 0xb0, 0xc0, 0xe0, 0xaf, 0xbf, 0xdf, 0xb0, 0xbf, 0xdf, 0xb1,
+ 0x3d, 0x3c, 0x3a, 0x3a, 0x3b, 0x36, 0x3a, 0x3b, 0x36, 0x39, 0x3a, 0x35,
+ 0x39, 0x3a, 0x35, 0x41, 0x42, 0x3d, 0x40, 0x41, 0x3c, 0x41, 0x40, 0x3c,
+ 0x41, 0x42, 0x3c, 0x42, 0x43, 0x3d, 0x43, 0x43, 0x3d, 0x42, 0x43, 0x3d,
+ 0x43, 0x44, 0x3e, 0x41, 0x42, 0x3d, 0x3f, 0x40, 0x3b, 0x3f, 0x3f, 0x3d,
+ 0x3f, 0x3d, 0x3e, 0x3b, 0x3a, 0x39, 0x38, 0x38, 0x36, 0x39, 0x39, 0x37,
+ 0x34, 0x34, 0x34, 0x33, 0x33, 0x33, 0x2e, 0x2e, 0x31, 0x28, 0x29, 0x2d,
+ 0x2a, 0x2c, 0x30, 0x29, 0x2a, 0x2d, 0x24, 0x25, 0x27, 0x1f, 0x23, 0x23,
+ 0x1d, 0x23, 0x23, 0x1d, 0x23, 0x23, 0x18, 0x20, 0x22, 0x17, 0x1e, 0x22,
+ 0x1a, 0x1e, 0x27, 0x18, 0x23, 0x2e, 0x1d, 0x2e, 0x38, 0x1d, 0x2a, 0x33,
+ 0x10, 0x15, 0x1c, 0x10, 0x10, 0x12, 0x10, 0x12, 0x0f, 0x0d, 0x12, 0x0e,
+ 0x0b, 0x0c, 0x0c, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x03, 0x03, 0x03,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x09, 0x09, 0x08,
+ 0x0f, 0x0f, 0x0d, 0x08, 0x08, 0x06, 0x07, 0x09, 0x06, 0x05, 0x07, 0x06,
+ 0x08, 0x0a, 0x09, 0x0a, 0x0b, 0x0d, 0x07, 0x08, 0x0a, 0x08, 0x09, 0x0b,
+ 0x08, 0x0a, 0x09, 0x0a, 0x0c, 0x0a, 0x08, 0x0a, 0x09, 0x08, 0x0a, 0x0a,
+ 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d, 0x09, 0x0a, 0x0c,
+ 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x10,
+ 0x0b, 0x0c, 0x0e, 0x09, 0x0a, 0x0c, 0x06, 0x0a, 0x0b, 0x09, 0x0d, 0x0e,
+ 0x14, 0x19, 0x17, 0x2c, 0x32, 0x31, 0x36, 0x3b, 0x3c, 0x33, 0x38, 0x3a,
+ 0x33, 0x38, 0x3c, 0x33, 0x38, 0x3c, 0x33, 0x38, 0x3c, 0x36, 0x3b, 0x3e,
+ 0x38, 0x3c, 0x3e, 0x34, 0x38, 0x3b, 0x36, 0x3a, 0x3d, 0x36, 0x3a, 0x3d,
+ 0x35, 0x39, 0x3c, 0x35, 0x39, 0x3c, 0x36, 0x3a, 0x3d, 0x36, 0x3a, 0x3c,
+ 0x34, 0x38, 0x3b, 0x34, 0x38, 0x3a, 0x34, 0x38, 0x3a, 0x33, 0x37, 0x3a,
+ 0x34, 0x38, 0x3b, 0x32, 0x37, 0x3a, 0x2f, 0x37, 0x39, 0x2f, 0x36, 0x38,
+ 0x33, 0x37, 0x3c, 0x33, 0x36, 0x3b, 0x33, 0x36, 0x39, 0x32, 0x37, 0x3a,
+ 0x33, 0x3a, 0x3e, 0x34, 0x3b, 0x41, 0x34, 0x39, 0x3d, 0x34, 0x38, 0x3d,
+ 0x34, 0x3a, 0x40, 0x33, 0x3b, 0x40, 0x33, 0x3b, 0x3e, 0x33, 0x38, 0x3b,
+ 0x32, 0x36, 0x3e, 0x2d, 0x39, 0x4d, 0x29, 0x43, 0x62, 0x36, 0x5d, 0x85,
+ 0x3b, 0x77, 0xb1, 0x33, 0x77, 0xb2, 0x23, 0x6b, 0xa7, 0x17, 0x61, 0x97,
+ 0x11, 0x54, 0x83, 0x0e, 0x47, 0x6f, 0x12, 0x46, 0x6a, 0x15, 0x47, 0x6a,
+ 0x15, 0x45, 0x6d, 0x15, 0x43, 0x6c, 0x13, 0x3c, 0x65, 0x12, 0x37, 0x60,
+ 0x0b, 0x2d, 0x52, 0x09, 0x25, 0x45, 0x09, 0x23, 0x3e, 0x0b, 0x23, 0x3b,
+ 0x0c, 0x23, 0x3b, 0x0d, 0x23, 0x3e, 0x0f, 0x23, 0x40, 0x0d, 0x21, 0x3c,
+ 0x0a, 0x20, 0x37, 0x11, 0x25, 0x34, 0x1c, 0x2b, 0x36, 0x2f, 0x37, 0x40,
+ 0x3b, 0x3f, 0x40, 0x27, 0x30, 0x3f, 0x14, 0x26, 0x42, 0x0b, 0x24, 0x42,
+ 0x09, 0x24, 0x45, 0x0b, 0x22, 0x45, 0x0e, 0x1f, 0x3c, 0x0c, 0x1a, 0x29,
+ 0x09, 0x18, 0x1e, 0x10, 0x1f, 0x27, 0x1b, 0x2c, 0x39, 0x1c, 0x30, 0x46,
+ 0x10, 0x29, 0x46, 0x0c, 0x26, 0x45, 0x0f, 0x26, 0x43, 0x0f, 0x22, 0x38,
+ 0x15, 0x21, 0x27, 0x19, 0x2c, 0x36, 0x17, 0x2f, 0x3e, 0x34, 0x48, 0x48,
+ 0x83, 0x83, 0x6e, 0x89, 0x83, 0x71, 0x66, 0x7a, 0x90, 0x4f, 0x8b, 0xca,
+ 0x47, 0x98, 0xd9, 0x42, 0x93, 0xd7, 0x3d, 0x8e, 0xd3, 0x3d, 0x8e, 0xd0,
+ 0x45, 0x95, 0xd2, 0x41, 0x90, 0xcb, 0x30, 0x80, 0xbd, 0x32, 0x82, 0xc1,
+ 0x32, 0x82, 0xc2, 0x29, 0x80, 0xb7, 0x26, 0x78, 0xaf, 0x1a, 0x5f, 0x8f,
+ 0x0f, 0x4e, 0x72, 0x27, 0x69, 0x9a, 0x38, 0x80, 0xc8, 0x34, 0x81, 0xcb,
+ 0x30, 0x6f, 0xb1, 0x21, 0x50, 0x7a, 0x28, 0x41, 0x4f, 0x29, 0x32, 0x35,
+ 0x25, 0x29, 0x31, 0x14, 0x18, 0x26, 0x07, 0x08, 0x13, 0x06, 0x05, 0x0a,
+ 0x04, 0x05, 0x07, 0x06, 0x07, 0x08, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x08, 0x0a, 0x17, 0x1b, 0x1b, 0x29, 0x2d, 0x2e,
+ 0x27, 0x2b, 0x2e, 0x23, 0x29, 0x29, 0x1e, 0x25, 0x23, 0x1e, 0x27, 0x22,
+ 0x1b, 0x24, 0x1f, 0x11, 0x1a, 0x15, 0x0f, 0x19, 0x15, 0x11, 0x1a, 0x17,
+ 0x16, 0x1a, 0x19, 0x0f, 0x13, 0x12, 0x08, 0x0a, 0x09, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x16, 0x16, 0x16, 0x0d, 0x0d, 0x0d, 0x06, 0x07, 0x07,
+ 0x06, 0x07, 0x09, 0x0f, 0x0f, 0x10, 0x0a, 0x0a, 0x0a, 0x06, 0x04, 0x05,
+ 0x06, 0x04, 0x05, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x09, 0x13, 0x14, 0x18,
+ 0x21, 0x26, 0x29, 0x28, 0x2d, 0x30, 0x2e, 0x31, 0x36, 0x4e, 0x52, 0x55,
+ 0x2b, 0x2f, 0x32, 0x0c, 0x0d, 0x0f, 0x11, 0x12, 0x14, 0x1e, 0x20, 0x1f,
+ 0x24, 0x28, 0x28, 0x20, 0x24, 0x25, 0x19, 0x1a, 0x1c, 0x13, 0x13, 0x16,
+ 0x0d, 0x0e, 0x0e, 0x0a, 0x0c, 0x0b, 0x0f, 0x11, 0x10, 0x1c, 0x1e, 0x1d,
+ 0x21, 0x25, 0x26, 0x22, 0x26, 0x27, 0x1e, 0x22, 0x22, 0x1f, 0x22, 0x21,
+ 0x1e, 0x21, 0x20, 0x2f, 0x33, 0x32, 0x1e, 0x22, 0x22, 0x19, 0x1d, 0x1d,
+ 0x1b, 0x1c, 0x1c, 0x1d, 0x1d, 0x1d, 0x1a, 0x19, 0x1a, 0x15, 0x15, 0x15,
+ 0x13, 0x13, 0x11, 0x12, 0x12, 0x10, 0x13, 0x13, 0x11, 0x19, 0x19, 0x17,
+ 0x09, 0x09, 0x09, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x0e, 0x0e, 0x0e, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11,
+ 0x11, 0x10, 0x0d, 0x12, 0x11, 0x0f, 0x0f, 0x10, 0x0f, 0x11, 0x13, 0x12,
+ 0x13, 0x13, 0x13, 0x11, 0x10, 0x0e, 0x17, 0x12, 0x0e, 0x28, 0x1f, 0x1a,
+ 0x47, 0x2a, 0x1d, 0x62, 0x43, 0x30, 0x7d, 0x5e, 0x44, 0xa2, 0x7f, 0x5f,
+ 0xc7, 0xa3, 0x80, 0xe5, 0xc1, 0xa5, 0xf5, 0xd1, 0xc1, 0xf1, 0xcc, 0xc5,
+ 0xec, 0xbc, 0xac, 0xd3, 0xa6, 0x92, 0xc4, 0xa5, 0x89, 0xca, 0xbf, 0x9f,
+ 0xc3, 0xce, 0xaa, 0xbc, 0xd6, 0xad, 0xbc, 0xdb, 0xae, 0xbe, 0xdc, 0xad,
+ 0xba, 0xdf, 0xae, 0xbe, 0xdf, 0xb0, 0xc1, 0xdb, 0xae, 0xc1, 0xdc, 0xaf,
+ 0xbf, 0xe2, 0xb2, 0xba, 0xe2, 0xb1, 0xbb, 0xe0, 0xaf, 0xbd, 0xde, 0xaf,
+ 0xbc, 0xe0, 0xb0, 0xbc, 0xe0, 0xad, 0xbf, 0xe1, 0xaf, 0xbf, 0xe1, 0xaf,
+ 0xbf, 0xe1, 0xaf, 0xbf, 0xe0, 0xaf, 0xbf, 0xe0, 0xb0, 0xc1, 0xe1, 0xb2,
+ 0x3b, 0x3a, 0x36, 0x3b, 0x3b, 0x37, 0x3b, 0x3c, 0x37, 0x39, 0x3a, 0x35,
+ 0x39, 0x3a, 0x35, 0x3d, 0x3d, 0x38, 0x3c, 0x3b, 0x37, 0x3c, 0x3b, 0x37,
+ 0x3e, 0x3e, 0x3a, 0x40, 0x42, 0x3c, 0x40, 0x41, 0x3b, 0x3f, 0x40, 0x3b,
+ 0x3e, 0x3f, 0x3a, 0x3f, 0x40, 0x3b, 0x3d, 0x3d, 0x3b, 0x3c, 0x3c, 0x3a,
+ 0x3c, 0x3c, 0x3d, 0x38, 0x38, 0x38, 0x34, 0x34, 0x34, 0x31, 0x31, 0x31,
+ 0x2e, 0x2e, 0x2e, 0x30, 0x30, 0x31, 0x2b, 0x2b, 0x2e, 0x27, 0x26, 0x2b,
+ 0x28, 0x27, 0x2c, 0x24, 0x24, 0x28, 0x23, 0x24, 0x26, 0x21, 0x23, 0x25,
+ 0x20, 0x24, 0x25, 0x1c, 0x21, 0x24, 0x19, 0x1e, 0x20, 0x19, 0x1f, 0x23,
+ 0x1b, 0x1d, 0x27, 0x19, 0x21, 0x2b, 0x1d, 0x2c, 0x36, 0x1d, 0x29, 0x33,
+ 0x13, 0x17, 0x1e, 0x10, 0x10, 0x12, 0x11, 0x13, 0x12, 0x0f, 0x13, 0x12,
+ 0x0f, 0x0f, 0x0f, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x03, 0x05, 0x05, 0x03, 0x04, 0x06, 0x05, 0x04, 0x06, 0x05,
+ 0x08, 0x0a, 0x09, 0x07, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x09, 0x0a, 0x0c,
+ 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x0a, 0x06, 0x08, 0x06, 0x06, 0x08, 0x07,
+ 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d,
+ 0x0b, 0x0c, 0x0e, 0x0a, 0x0b, 0x0d, 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d,
+ 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c, 0x07, 0x0b, 0x0c, 0x08, 0x0d, 0x0d,
+ 0x15, 0x19, 0x18, 0x2f, 0x33, 0x34, 0x34, 0x38, 0x39, 0x33, 0x37, 0x3a,
+ 0x33, 0x37, 0x3a, 0x37, 0x3b, 0x3e, 0x39, 0x3d, 0x40, 0x39, 0x3d, 0x40,
+ 0x37, 0x3b, 0x3d, 0x34, 0x38, 0x3b, 0x36, 0x3a, 0x3d, 0x35, 0x39, 0x3c,
+ 0x36, 0x3a, 0x3d, 0x34, 0x38, 0x3b, 0x36, 0x3a, 0x3d, 0x33, 0x37, 0x3a,
+ 0x31, 0x35, 0x36, 0x33, 0x37, 0x38, 0x33, 0x37, 0x38, 0x31, 0x35, 0x37,
+ 0x35, 0x39, 0x3b, 0x37, 0x3c, 0x3f, 0x32, 0x39, 0x3c, 0x30, 0x38, 0x3a,
+ 0x31, 0x39, 0x3b, 0x31, 0x38, 0x3b, 0x31, 0x36, 0x3a, 0x32, 0x37, 0x3c,
+ 0x33, 0x38, 0x3f, 0x34, 0x38, 0x40, 0x36, 0x3a, 0x41, 0x36, 0x3a, 0x40,
+ 0x38, 0x3d, 0x42, 0x34, 0x39, 0x3d, 0x32, 0x38, 0x3b, 0x30, 0x3b, 0x3f,
+ 0x2d, 0x43, 0x4f, 0x2b, 0x4e, 0x6d, 0x31, 0x5f, 0x92, 0x36, 0x6c, 0xad,
+ 0x29, 0x74, 0xaf, 0x20, 0x6a, 0xa1, 0x18, 0x5c, 0x8f, 0x0f, 0x4c, 0x76,
+ 0x13, 0x47, 0x6b, 0x14, 0x45, 0x67, 0x16, 0x48, 0x6d, 0x12, 0x46, 0x6e,
+ 0x12, 0x3e, 0x69, 0x15, 0x3d, 0x67, 0x13, 0x36, 0x5d, 0x10, 0x2f, 0x53,
+ 0x0c, 0x25, 0x44, 0x0b, 0x22, 0x3e, 0x0b, 0x21, 0x3b, 0x0c, 0x22, 0x3b,
+ 0x0a, 0x22, 0x43, 0x0b, 0x22, 0x41, 0x0b, 0x23, 0x3e, 0x0d, 0x22, 0x3d,
+ 0x0b, 0x1f, 0x38, 0x1b, 0x28, 0x39, 0x4f, 0x55, 0x58, 0x63, 0x61, 0x59,
+ 0x6d, 0x5e, 0x4e, 0x52, 0x4c, 0x4d, 0x24, 0x2f, 0x44, 0x0c, 0x25, 0x41,
+ 0x07, 0x27, 0x46, 0x09, 0x24, 0x45, 0x10, 0x1f, 0x38, 0x0e, 0x18, 0x22,
+ 0x0c, 0x19, 0x21, 0x14, 0x22, 0x2c, 0x1a, 0x2d, 0x3c, 0x16, 0x2f, 0x47,
+ 0x10, 0x2d, 0x4d, 0x13, 0x2e, 0x4f, 0x15, 0x2d, 0x4a, 0x15, 0x27, 0x3e,
+ 0x18, 0x25, 0x36, 0x1b, 0x2d, 0x39, 0x1c, 0x34, 0x3a, 0x18, 0x2e, 0x2e,
+ 0x5d, 0x6a, 0x68, 0x83, 0x92, 0x9f, 0x69, 0x93, 0xc4, 0x4a, 0x93, 0xdf,
+ 0x3c, 0x92, 0xd4, 0x3c, 0x8f, 0xd1, 0x43, 0x92, 0xd5, 0x49, 0x95, 0xd5,
+ 0x40, 0x8b, 0xc5, 0x34, 0x81, 0xb9, 0x32, 0x81, 0xba, 0x31, 0x81, 0xbc,
+ 0x2b, 0x7d, 0xb9, 0x1f, 0x76, 0xad, 0x13, 0x60, 0x92, 0x10, 0x48, 0x6c,
+ 0x15, 0x48, 0x63, 0x27, 0x67, 0x96, 0x3b, 0x84, 0xc9, 0x33, 0x79, 0xba,
+ 0x2d, 0x51, 0x78, 0x1d, 0x35, 0x4a, 0x22, 0x30, 0x34, 0x2a, 0x2e, 0x30,
+ 0x2e, 0x31, 0x3a, 0x29, 0x2c, 0x3b, 0x1c, 0x1f, 0x2a, 0x11, 0x12, 0x16,
+ 0x09, 0x0a, 0x0c, 0x05, 0x06, 0x08, 0x04, 0x05, 0x07, 0x06, 0x08, 0x07,
+ 0x0a, 0x0b, 0x0b, 0x0e, 0x0f, 0x11, 0x21, 0x24, 0x25, 0x28, 0x2c, 0x2d,
+ 0x1e, 0x25, 0x28, 0x1e, 0x26, 0x28, 0x1c, 0x25, 0x24, 0x12, 0x1d, 0x19,
+ 0x0d, 0x18, 0x14, 0x0f, 0x17, 0x13, 0x10, 0x19, 0x15, 0x12, 0x1a, 0x17,
+ 0x10, 0x12, 0x11, 0x08, 0x0a, 0x09, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x0b, 0x0b, 0x0b, 0x1b, 0x1c, 0x1c, 0x0e, 0x10, 0x0f, 0x03, 0x05, 0x05,
+ 0x03, 0x04, 0x05, 0x0d, 0x0d, 0x0f, 0x0b, 0x0b, 0x0c, 0x05, 0x05, 0x06,
+ 0x04, 0x04, 0x06, 0x05, 0x06, 0x0a, 0x10, 0x11, 0x16, 0x2c, 0x2e, 0x34,
+ 0x2e, 0x32, 0x33, 0x25, 0x29, 0x2a, 0x27, 0x2b, 0x2e, 0x5a, 0x5e, 0x61,
+ 0x2c, 0x30, 0x33, 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0d, 0x0f, 0x11, 0x10,
+ 0x19, 0x1a, 0x1c, 0x21, 0x22, 0x24, 0x24, 0x24, 0x26, 0x23, 0x23, 0x25,
+ 0x1c, 0x1c, 0x1c, 0x10, 0x12, 0x11, 0x1c, 0x1e, 0x1d, 0x1e, 0x21, 0x21,
+ 0x1c, 0x21, 0x24, 0x1f, 0x24, 0x27, 0x1e, 0x22, 0x23, 0x1c, 0x20, 0x1f,
+ 0x1c, 0x20, 0x1f, 0x22, 0x25, 0x24, 0x1c, 0x1e, 0x1d, 0x1b, 0x1d, 0x1c,
+ 0x1b, 0x1c, 0x1c, 0x1b, 0x1b, 0x1b, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x14, 0x14, 0x13, 0x15, 0x15, 0x13, 0x15, 0x15, 0x13, 0x15, 0x15, 0x13,
+ 0x0b, 0x0b, 0x0b, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f,
+ 0x11, 0x10, 0x0c, 0x10, 0x11, 0x0c, 0x10, 0x10, 0x0e, 0x12, 0x14, 0x13,
+ 0x12, 0x12, 0x12, 0x12, 0x11, 0x0f, 0x14, 0x11, 0x0e, 0x1e, 0x18, 0x16,
+ 0x39, 0x23, 0x1c, 0x50, 0x33, 0x25, 0x6f, 0x4f, 0x33, 0x96, 0x74, 0x4e,
+ 0xc0, 0xa0, 0x77, 0xec, 0xd1, 0xb1, 0xff, 0xf1, 0xe5, 0xfe, 0xf4, 0xf2,
+ 0xfc, 0xec, 0xe0, 0xf9, 0xd8, 0xcd, 0xf2, 0xbf, 0xb3, 0xe2, 0xaa, 0x9d,
+ 0xcc, 0xa7, 0x94, 0xbf, 0xb6, 0x95, 0xbd, 0xcc, 0x9c, 0xbd, 0xd7, 0x9e,
+ 0xbe, 0xdc, 0xa9, 0xbf, 0xdf, 0xad, 0xbd, 0xde, 0xae, 0xbe, 0xdf, 0xb2,
+ 0xc0, 0xe1, 0xb4, 0xbd, 0xdf, 0xb0, 0xbd, 0xe2, 0xaf, 0xbf, 0xe3, 0xb0,
+ 0xbd, 0xe1, 0xb2, 0xbc, 0xe0, 0xb1, 0xbd, 0xe1, 0xb1, 0xbb, 0xdf, 0xaf,
+ 0xbf, 0xe0, 0xb1, 0xc0, 0xe1, 0xb2, 0xc0, 0xe1, 0xb2, 0xbf, 0xe0, 0xb1,
+ 0x38, 0x37, 0x33, 0x39, 0x38, 0x34, 0x38, 0x39, 0x34, 0x36, 0x37, 0x32,
+ 0x37, 0x38, 0x33, 0x38, 0x3a, 0x34, 0x3b, 0x3a, 0x35, 0x3b, 0x3a, 0x35,
+ 0x3b, 0x3b, 0x38, 0x3c, 0x3d, 0x39, 0x3d, 0x3e, 0x39, 0x3c, 0x3d, 0x38,
+ 0x3c, 0x3d, 0x38, 0x3b, 0x3b, 0x38, 0x3a, 0x3a, 0x38, 0x38, 0x38, 0x38,
+ 0x35, 0x35, 0x37, 0x33, 0x33, 0x33, 0x32, 0x32, 0x32, 0x2d, 0x2d, 0x2d,
+ 0x2b, 0x2b, 0x2b, 0x2a, 0x2a, 0x2b, 0x2a, 0x2a, 0x2d, 0x28, 0x27, 0x2c,
+ 0x26, 0x25, 0x2a, 0x24, 0x23, 0x28, 0x21, 0x22, 0x25, 0x20, 0x21, 0x25,
+ 0x1e, 0x21, 0x24, 0x1f, 0x23, 0x26, 0x19, 0x1d, 0x20, 0x18, 0x1c, 0x21,
+ 0x1b, 0x1d, 0x27, 0x18, 0x21, 0x2b, 0x1c, 0x29, 0x32, 0x21, 0x2c, 0x36,
+ 0x15, 0x1c, 0x22, 0x0c, 0x0f, 0x12, 0x0f, 0x11, 0x11, 0x11, 0x13, 0x13,
+ 0x12, 0x12, 0x12, 0x0c, 0x0c, 0x0c, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x05, 0x07, 0x09, 0x08,
+ 0x07, 0x09, 0x08, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x0a,
+ 0x09, 0x0b, 0x0a, 0x07, 0x09, 0x08, 0x05, 0x07, 0x06, 0x07, 0x09, 0x08,
+ 0x0a, 0x0b, 0x0d, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c,
+ 0x0a, 0x0b, 0x0d, 0x0b, 0x0c, 0x0e, 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0d,
+ 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0d, 0x0a, 0x0e, 0x0f, 0x09, 0x0d, 0x0e,
+ 0x13, 0x17, 0x16, 0x2e, 0x31, 0x32, 0x32, 0x36, 0x37, 0x33, 0x37, 0x3a,
+ 0x35, 0x39, 0x3c, 0x35, 0x39, 0x3c, 0x37, 0x3a, 0x3d, 0x35, 0x39, 0x3a,
+ 0x35, 0x39, 0x3a, 0x34, 0x38, 0x39, 0x36, 0x3a, 0x3b, 0x37, 0x3b, 0x3e,
+ 0x34, 0x38, 0x3b, 0x34, 0x38, 0x3b, 0x33, 0x37, 0x3a, 0x31, 0x35, 0x38,
+ 0x2f, 0x35, 0x35, 0x32, 0x36, 0x36, 0x32, 0x36, 0x37, 0x33, 0x37, 0x38,
+ 0x39, 0x3e, 0x3f, 0x3f, 0x44, 0x45, 0x36, 0x3b, 0x3e, 0x31, 0x39, 0x3b,
+ 0x32, 0x3b, 0x3a, 0x33, 0x3b, 0x3c, 0x32, 0x37, 0x3e, 0x33, 0x36, 0x3d,
+ 0x35, 0x35, 0x3d, 0x33, 0x34, 0x39, 0x37, 0x3b, 0x3e, 0x3d, 0x42, 0x45,
+ 0x3f, 0x44, 0x47, 0x3a, 0x41, 0x49, 0x35, 0x40, 0x50, 0x2e, 0x49, 0x61,
+ 0x30, 0x5d, 0x7e, 0x31, 0x6c, 0x98, 0x30, 0x70, 0xab, 0x2d, 0x6d, 0xb2,
+ 0x1e, 0x67, 0x9d, 0x16, 0x5b, 0x8d, 0x10, 0x4d, 0x78, 0x12, 0x46, 0x6b,
+ 0x18, 0x46, 0x69, 0x18, 0x44, 0x67, 0x14, 0x44, 0x6a, 0x12, 0x43, 0x6c,
+ 0x11, 0x3b, 0x63, 0x10, 0x34, 0x5a, 0x0d, 0x2b, 0x4d, 0x0d, 0x24, 0x42,
+ 0x10, 0x23, 0x3e, 0x0f, 0x24, 0x3f, 0x0d, 0x20, 0x3e, 0x0e, 0x23, 0x40,
+ 0x0c, 0x23, 0x49, 0x0d, 0x25, 0x45, 0x0a, 0x24, 0x3f, 0x0b, 0x24, 0x3f,
+ 0x0a, 0x1f, 0x3d, 0x18, 0x25, 0x39, 0x5a, 0x5e, 0x5e, 0x7c, 0x7b, 0x69,
+ 0x74, 0x6a, 0x53, 0x54, 0x52, 0x50, 0x28, 0x34, 0x45, 0x0f, 0x27, 0x40,
+ 0x08, 0x25, 0x44, 0x0b, 0x23, 0x45, 0x0f, 0x1f, 0x35, 0x0d, 0x17, 0x20,
+ 0x0c, 0x19, 0x21, 0x14, 0x22, 0x2d, 0x18, 0x2c, 0x3d, 0x14, 0x31, 0x4a,
+ 0x11, 0x32, 0x53, 0x19, 0x37, 0x59, 0x1b, 0x34, 0x50, 0x15, 0x27, 0x3d,
+ 0x0f, 0x25, 0x39, 0x19, 0x2e, 0x3e, 0x1d, 0x34, 0x44, 0x06, 0x26, 0x43,
+ 0x22, 0x4e, 0x7d, 0x57, 0x8f, 0xcc, 0x50, 0x99, 0xdb, 0x3f, 0x92, 0xd6,
+ 0x39, 0x91, 0xd0, 0x41, 0x92, 0xd3, 0x4c, 0x98, 0xd8, 0x41, 0x89, 0xc7,
+ 0x33, 0x7f, 0xb9, 0x36, 0x83, 0xbd, 0x31, 0x82, 0xba, 0x2c, 0x7e, 0xb9,
+ 0x2c, 0x70, 0xa9, 0x18, 0x60, 0x92, 0x0c, 0x46, 0x73, 0x19, 0x41, 0x63,
+ 0x17, 0x47, 0x69, 0x24, 0x65, 0x9f, 0x35, 0x77, 0xbf, 0x38, 0x69, 0x9c,
+ 0x4b, 0x5c, 0x6f, 0x35, 0x40, 0x51, 0x2f, 0x33, 0x41, 0x2d, 0x2f, 0x38,
+ 0x2f, 0x32, 0x37, 0x2e, 0x32, 0x36, 0x2c, 0x31, 0x34, 0x2c, 0x2d, 0x31,
+ 0x1f, 0x22, 0x25, 0x0c, 0x0f, 0x12, 0x06, 0x07, 0x0a, 0x09, 0x0a, 0x0c,
+ 0x10, 0x11, 0x13, 0x19, 0x1b, 0x1c, 0x23, 0x27, 0x28, 0x23, 0x28, 0x2a,
+ 0x20, 0x27, 0x2a, 0x1c, 0x24, 0x27, 0x16, 0x1e, 0x20, 0x0e, 0x17, 0x16,
+ 0x10, 0x19, 0x16, 0x13, 0x1a, 0x18, 0x12, 0x19, 0x17, 0x0b, 0x0f, 0x0c,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x16, 0x18, 0x17, 0x0e, 0x10, 0x0f, 0x02, 0x06, 0x05,
+ 0x02, 0x02, 0x02, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x04, 0x04, 0x05,
+ 0x06, 0x07, 0x09, 0x14, 0x15, 0x19, 0x24, 0x28, 0x2b, 0x23, 0x26, 0x2a,
+ 0x17, 0x1b, 0x1a, 0x16, 0x1a, 0x19, 0x1b, 0x1f, 0x20, 0x1f, 0x22, 0x24,
+ 0x26, 0x28, 0x29, 0x1b, 0x1b, 0x1d, 0x0d, 0x0e, 0x10, 0x09, 0x0b, 0x0a,
+ 0x0c, 0x0c, 0x0e, 0x13, 0x13, 0x15, 0x1f, 0x1f, 0x21, 0x27, 0x27, 0x29,
+ 0x27, 0x27, 0x27, 0x20, 0x22, 0x21, 0x1d, 0x21, 0x20, 0x30, 0x34, 0x34,
+ 0x34, 0x39, 0x3d, 0x1f, 0x24, 0x27, 0x1b, 0x21, 0x21, 0x19, 0x1d, 0x1c,
+ 0x1c, 0x20, 0x1f, 0x1b, 0x1d, 0x1c, 0x19, 0x1b, 0x19, 0x1b, 0x1d, 0x1b,
+ 0x18, 0x1a, 0x19, 0x16, 0x18, 0x17, 0x14, 0x16, 0x15, 0x17, 0x17, 0x17,
+ 0x16, 0x16, 0x15, 0x18, 0x18, 0x16, 0x16, 0x16, 0x14, 0x12, 0x12, 0x10,
+ 0x10, 0x10, 0x0f, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x0e, 0x0d, 0x0d,
+ 0x11, 0x10, 0x0c, 0x11, 0x11, 0x0d, 0x11, 0x11, 0x0f, 0x11, 0x13, 0x12,
+ 0x11, 0x13, 0x12, 0x0f, 0x0f, 0x0f, 0x0e, 0x0d, 0x0b, 0x18, 0x15, 0x14,
+ 0x27, 0x1d, 0x1b, 0x41, 0x2f, 0x25, 0x62, 0x45, 0x31, 0x7f, 0x5c, 0x3b,
+ 0xa7, 0x85, 0x5f, 0xd2, 0xb7, 0x95, 0xf8, 0xe9, 0xd5, 0xff, 0xff, 0xf6,
+ 0xfc, 0xff, 0xff, 0xfc, 0xfb, 0xf9, 0xff, 0xef, 0xec, 0xfd, 0xda, 0xd2,
+ 0xf4, 0xbd, 0xad, 0xde, 0xa9, 0x8c, 0xc6, 0xa8, 0x7f, 0xc2, 0xb9, 0x86,
+ 0xc6, 0xcc, 0x99, 0xc0, 0xd9, 0xa2, 0xb6, 0xe1, 0xa9, 0xb6, 0xe2, 0xad,
+ 0xbf, 0xde, 0xb0, 0xc5, 0xdc, 0xb1, 0xc3, 0xe2, 0xb3, 0xbd, 0xe4, 0xb1,
+ 0xbd, 0xe1, 0xb3, 0xbc, 0xe1, 0xb3, 0xbb, 0xdf, 0xb1, 0xbd, 0xe1, 0xb3,
+ 0xbd, 0xe1, 0xb3, 0xbe, 0xe2, 0xb2, 0xbe, 0xe2, 0xb1, 0xbe, 0xe2, 0xb2,
+ 0x38, 0x37, 0x33, 0x37, 0x36, 0x32, 0x35, 0x35, 0x31, 0x36, 0x38, 0x32,
+ 0x36, 0x37, 0x32, 0x36, 0x36, 0x31, 0x39, 0x38, 0x34, 0x3a, 0x39, 0x34,
+ 0x39, 0x39, 0x37, 0x38, 0x38, 0x36, 0x39, 0x39, 0x37, 0x37, 0x38, 0x33,
+ 0x37, 0x38, 0x33, 0x35, 0x35, 0x32, 0x36, 0x36, 0x34, 0x36, 0x36, 0x35,
+ 0x31, 0x31, 0x33, 0x31, 0x31, 0x32, 0x2e, 0x2f, 0x2f, 0x2c, 0x2c, 0x2c,
+ 0x2b, 0x2b, 0x2b, 0x29, 0x29, 0x29, 0x29, 0x29, 0x2b, 0x29, 0x29, 0x2b,
+ 0x25, 0x25, 0x27, 0x23, 0x22, 0x27, 0x1e, 0x1f, 0x23, 0x20, 0x20, 0x25,
+ 0x23, 0x24, 0x28, 0x20, 0x24, 0x27, 0x1c, 0x20, 0x23, 0x17, 0x1b, 0x1e,
+ 0x16, 0x1a, 0x20, 0x16, 0x1d, 0x26, 0x1c, 0x26, 0x30, 0x23, 0x2d, 0x36,
+ 0x16, 0x1f, 0x24, 0x09, 0x0d, 0x10, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12,
+ 0x13, 0x13, 0x13, 0x0b, 0x0b, 0x0b, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03, 0x03, 0x03,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x0a,
+ 0x08, 0x0a, 0x09, 0x08, 0x0a, 0x09, 0x05, 0x08, 0x06, 0x08, 0x09, 0x09,
+ 0x09, 0x0a, 0x0c, 0x07, 0x08, 0x0a, 0x07, 0x08, 0x0a, 0x08, 0x09, 0x0b,
+ 0x0a, 0x0b, 0x0d, 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d, 0x0b, 0x0c, 0x0e,
+ 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x0a, 0x0e, 0x0f, 0x08, 0x0c, 0x0d,
+ 0x13, 0x17, 0x16, 0x2c, 0x30, 0x31, 0x33, 0x37, 0x38, 0x32, 0x36, 0x39,
+ 0x35, 0x39, 0x3c, 0x38, 0x3c, 0x3e, 0x35, 0x39, 0x3a, 0x33, 0x37, 0x38,
+ 0x33, 0x37, 0x38, 0x33, 0x37, 0x38, 0x34, 0x38, 0x39, 0x36, 0x3a, 0x3d,
+ 0x36, 0x3a, 0x3d, 0x32, 0x37, 0x39, 0x32, 0x36, 0x39, 0x31, 0x35, 0x39,
+ 0x31, 0x36, 0x37, 0x34, 0x38, 0x39, 0x35, 0x39, 0x3a, 0x35, 0x38, 0x39,
+ 0x38, 0x3c, 0x3d, 0x3f, 0x43, 0x44, 0x3a, 0x3f, 0x42, 0x35, 0x3a, 0x3d,
+ 0x33, 0x37, 0x3a, 0x35, 0x3a, 0x40, 0x33, 0x38, 0x41, 0x35, 0x37, 0x3d,
+ 0x35, 0x35, 0x37, 0x32, 0x32, 0x33, 0x34, 0x38, 0x37, 0x39, 0x43, 0x43,
+ 0x3c, 0x45, 0x49, 0x3a, 0x48, 0x5b, 0x34, 0x50, 0x76, 0x30, 0x5f, 0x94,
+ 0x2d, 0x6e, 0xa7, 0x2b, 0x74, 0xaa, 0x27, 0x6e, 0xa4, 0x21, 0x62, 0x99,
+ 0x18, 0x55, 0x81, 0x13, 0x4b, 0x76, 0x11, 0x46, 0x6e, 0x14, 0x46, 0x6d,
+ 0x15, 0x44, 0x6c, 0x17, 0x44, 0x6d, 0x15, 0x40, 0x6a, 0x12, 0x3b, 0x63,
+ 0x0d, 0x33, 0x56, 0x08, 0x2a, 0x48, 0x09, 0x25, 0x3f, 0x0d, 0x23, 0x3b,
+ 0x0d, 0x21, 0x39, 0x0e, 0x22, 0x3d, 0x0a, 0x1f, 0x3f, 0x0d, 0x23, 0x45,
+ 0x0d, 0x23, 0x4a, 0x0e, 0x24, 0x45, 0x0d, 0x27, 0x42, 0x0a, 0x23, 0x41,
+ 0x09, 0x21, 0x3f, 0x0b, 0x1d, 0x33, 0x19, 0x22, 0x24, 0x43, 0x47, 0x38,
+ 0x4d, 0x58, 0x4b, 0x2f, 0x3e, 0x41, 0x18, 0x2c, 0x3e, 0x0f, 0x27, 0x3e,
+ 0x0c, 0x24, 0x40, 0x0f, 0x22, 0x43, 0x10, 0x1d, 0x37, 0x0b, 0x17, 0x23,
+ 0x0d, 0x1a, 0x21, 0x16, 0x26, 0x30, 0x1a, 0x2f, 0x40, 0x18, 0x35, 0x4f,
+ 0x12, 0x33, 0x55, 0x17, 0x38, 0x5b, 0x19, 0x33, 0x50, 0x12, 0x25, 0x3d,
+ 0x12, 0x26, 0x29, 0x18, 0x31, 0x41, 0x14, 0x35, 0x5d, 0x27, 0x5a, 0x92,
+ 0x4a, 0x8f, 0xd0, 0x42, 0x96, 0xd9, 0x3b, 0x95, 0xd4, 0x3e, 0x95, 0xd0,
+ 0x41, 0x95, 0xd2, 0x49, 0x97, 0xd5, 0x3e, 0x88, 0xc5, 0x32, 0x7c, 0xb9,
+ 0x35, 0x84, 0xbf, 0x30, 0x82, 0xbc, 0x2a, 0x7c, 0xb6, 0x22, 0x73, 0xad,
+ 0x20, 0x5a, 0x8b, 0x0e, 0x45, 0x6e, 0x14, 0x3f, 0x64, 0x1e, 0x41, 0x67,
+ 0x1e, 0x57, 0x84, 0x2e, 0x7a, 0xbe, 0x24, 0x60, 0xa2, 0x22, 0x3c, 0x5f,
+ 0x4a, 0x55, 0x5f, 0x4a, 0x53, 0x5f, 0x46, 0x4c, 0x59, 0x38, 0x3e, 0x4a,
+ 0x2d, 0x34, 0x3c, 0x28, 0x2f, 0x33, 0x2b, 0x30, 0x33, 0x2f, 0x34, 0x38,
+ 0x2c, 0x31, 0x35, 0x1f, 0x23, 0x27, 0x16, 0x1a, 0x1c, 0x18, 0x19, 0x1c,
+ 0x1d, 0x1e, 0x20, 0x1a, 0x1e, 0x1f, 0x1c, 0x20, 0x22, 0x21, 0x25, 0x28,
+ 0x27, 0x2c, 0x30, 0x23, 0x28, 0x2c, 0x15, 0x1a, 0x1e, 0x11, 0x16, 0x19,
+ 0x12, 0x17, 0x18, 0x10, 0x14, 0x15, 0x0c, 0x0e, 0x0e, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x10, 0x11, 0x11, 0x16, 0x16, 0x16, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x10, 0x12, 0x11, 0x0e, 0x10, 0x0f, 0x05, 0x07, 0x06,
+ 0x04, 0x04, 0x02, 0x07, 0x07, 0x05, 0x07, 0x09, 0x06, 0x04, 0x07, 0x05,
+ 0x12, 0x16, 0x15, 0x24, 0x28, 0x29, 0x24, 0x28, 0x29, 0x24, 0x28, 0x29,
+ 0x18, 0x1c, 0x1b, 0x0d, 0x10, 0x0f, 0x13, 0x17, 0x16, 0x16, 0x17, 0x1a,
+ 0x25, 0x26, 0x28, 0x26, 0x27, 0x28, 0x1e, 0x20, 0x20, 0x14, 0x15, 0x15,
+ 0x0d, 0x0e, 0x10, 0x0a, 0x0a, 0x0c, 0x0d, 0x0d, 0x0f, 0x1a, 0x1a, 0x1c,
+ 0x29, 0x2a, 0x2a, 0x26, 0x29, 0x28, 0x1a, 0x1e, 0x1d, 0x44, 0x4a, 0x48,
+ 0x49, 0x4e, 0x51, 0x1c, 0x21, 0x24, 0x17, 0x1d, 0x1d, 0x19, 0x1e, 0x1d,
+ 0x1b, 0x1f, 0x1e, 0x1a, 0x1c, 0x1a, 0x19, 0x1b, 0x19, 0x18, 0x1a, 0x18,
+ 0x19, 0x1b, 0x1a, 0x17, 0x19, 0x18, 0x17, 0x1a, 0x19, 0x14, 0x16, 0x15,
+ 0x14, 0x14, 0x12, 0x16, 0x16, 0x14, 0x1b, 0x1b, 0x19, 0x17, 0x17, 0x15,
+ 0x11, 0x11, 0x11, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0f,
+ 0x11, 0x11, 0x0d, 0x0f, 0x10, 0x0b, 0x10, 0x11, 0x0e, 0x10, 0x12, 0x0f,
+ 0x0e, 0x10, 0x0f, 0x0e, 0x0e, 0x0e, 0x0c, 0x0b, 0x0c, 0x10, 0x0e, 0x0f,
+ 0x14, 0x16, 0x16, 0x29, 0x22, 0x1f, 0x44, 0x2f, 0x26, 0x5c, 0x3d, 0x2b,
+ 0x81, 0x5f, 0x45, 0x9d, 0x7e, 0x5f, 0xc8, 0xaf, 0x8f, 0xf5, 0xe5, 0xc7,
+ 0xff, 0xfd, 0xf4, 0xfd, 0xff, 0xff, 0xf4, 0xff, 0xff, 0xf9, 0xfe, 0xfa,
+ 0xff, 0xed, 0xdf, 0xfc, 0xcf, 0xb7, 0xe7, 0xae, 0x90, 0xce, 0x98, 0x78,
+ 0xc0, 0xa1, 0x72, 0xbe, 0xba, 0x85, 0xba, 0xd3, 0x99, 0xba, 0xdd, 0xa5,
+ 0xbf, 0xdd, 0xab, 0xc2, 0xdc, 0xaf, 0xbe, 0xe1, 0xb2, 0xb8, 0xe3, 0xb3,
+ 0xbc, 0xe1, 0xb3, 0xbd, 0xe1, 0xb3, 0xbb, 0xde, 0xb1, 0xbd, 0xe1, 0xb5,
+ 0xbe, 0xe2, 0xb4, 0xbc, 0xe1, 0xb2, 0xbd, 0xe1, 0xb1, 0xbe, 0xe2, 0xb2,
+ 0x36, 0x36, 0x34, 0x38, 0x38, 0x35, 0x36, 0x37, 0x32, 0x34, 0x35, 0x30,
+ 0x35, 0x36, 0x31, 0x34, 0x35, 0x30, 0x35, 0x36, 0x30, 0x35, 0x36, 0x31,
+ 0x36, 0x36, 0x33, 0x38, 0x38, 0x36, 0x35, 0x36, 0x33, 0x37, 0x38, 0x33,
+ 0x37, 0x38, 0x33, 0x33, 0x33, 0x31, 0x32, 0x32, 0x30, 0x32, 0x32, 0x30,
+ 0x31, 0x33, 0x33, 0x30, 0x31, 0x31, 0x2c, 0x2e, 0x2d, 0x2c, 0x2d, 0x2d,
+ 0x2f, 0x30, 0x2f, 0x2d, 0x2d, 0x2c, 0x29, 0x29, 0x29, 0x27, 0x27, 0x28,
+ 0x23, 0x24, 0x26, 0x22, 0x23, 0x25, 0x20, 0x21, 0x25, 0x20, 0x21, 0x25,
+ 0x23, 0x24, 0x28, 0x21, 0x24, 0x28, 0x1c, 0x20, 0x23, 0x1a, 0x1f, 0x20,
+ 0x1b, 0x1e, 0x23, 0x1d, 0x21, 0x28, 0x20, 0x27, 0x31, 0x21, 0x2a, 0x32,
+ 0x19, 0x22, 0x27, 0x0c, 0x12, 0x15, 0x0d, 0x0e, 0x10, 0x10, 0x0e, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0d, 0x0d, 0x0d, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09,
+ 0x0a, 0x0c, 0x0b, 0x09, 0x0b, 0x0a, 0x08, 0x0a, 0x09, 0x05, 0x07, 0x06,
+ 0x07, 0x08, 0x09, 0x08, 0x09, 0x0b, 0x06, 0x07, 0x09, 0x08, 0x09, 0x0b,
+ 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x0b, 0x0c, 0x0e,
+ 0x0b, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e, 0x07, 0x0b, 0x0c, 0x08, 0x0c, 0x0d,
+ 0x15, 0x19, 0x18, 0x2c, 0x30, 0x31, 0x33, 0x37, 0x38, 0x33, 0x37, 0x38,
+ 0x34, 0x38, 0x39, 0x35, 0x39, 0x3a, 0x33, 0x37, 0x38, 0x34, 0x37, 0x37,
+ 0x34, 0x36, 0x37, 0x36, 0x37, 0x39, 0x34, 0x38, 0x39, 0x37, 0x3b, 0x3e,
+ 0x37, 0x3b, 0x3e, 0x37, 0x3b, 0x3e, 0x32, 0x37, 0x3b, 0x32, 0x37, 0x3b,
+ 0x35, 0x3b, 0x3b, 0x37, 0x3d, 0x3d, 0x35, 0x39, 0x3a, 0x33, 0x37, 0x38,
+ 0x34, 0x38, 0x3a, 0x34, 0x37, 0x3b, 0x33, 0x37, 0x3a, 0x34, 0x39, 0x3c,
+ 0x35, 0x37, 0x3c, 0x35, 0x38, 0x3f, 0x36, 0x3a, 0x43, 0x37, 0x39, 0x3f,
+ 0x38, 0x37, 0x38, 0x35, 0x37, 0x36, 0x2f, 0x38, 0x38, 0x2c, 0x3c, 0x42,
+ 0x30, 0x46, 0x5b, 0x36, 0x56, 0x79, 0x34, 0x63, 0x99, 0x2c, 0x6c, 0xaf,
+ 0x27, 0x6f, 0xb0, 0x21, 0x67, 0xa1, 0x1a, 0x5c, 0x8c, 0x15, 0x50, 0x78,
+ 0x14, 0x44, 0x69, 0x14, 0x43, 0x68, 0x15, 0x45, 0x6b, 0x14, 0x44, 0x6c,
+ 0x12, 0x42, 0x6d, 0x14, 0x40, 0x6b, 0x14, 0x38, 0x60, 0x0e, 0x2f, 0x52,
+ 0x07, 0x28, 0x45, 0x08, 0x26, 0x40, 0x0c, 0x26, 0x3d, 0x0e, 0x24, 0x3b,
+ 0x0c, 0x20, 0x39, 0x0b, 0x1f, 0x3c, 0x0b, 0x20, 0x41, 0x0b, 0x23, 0x47,
+ 0x0d, 0x24, 0x47, 0x0f, 0x24, 0x45, 0x0e, 0x24, 0x43, 0x0a, 0x23, 0x41,
+ 0x0a, 0x21, 0x40, 0x08, 0x1c, 0x31, 0x08, 0x17, 0x1d, 0x19, 0x25, 0x20,
+ 0x1d, 0x36, 0x32, 0x17, 0x30, 0x3c, 0x0f, 0x28, 0x3e, 0x0e, 0x27, 0x3d,
+ 0x0e, 0x25, 0x3e, 0x11, 0x22, 0x40, 0x0f, 0x1c, 0x36, 0x0a, 0x18, 0x25,
+ 0x0e, 0x1c, 0x24, 0x18, 0x29, 0x33, 0x1c, 0x31, 0x40, 0x19, 0x35, 0x4c,
+ 0x15, 0x35, 0x57, 0x13, 0x33, 0x58, 0x14, 0x30, 0x51, 0x12, 0x27, 0x43,
+ 0x18, 0x25, 0x36, 0x15, 0x34, 0x59, 0x2d, 0x64, 0x9e, 0x4d, 0x90, 0xd2,
+ 0x4a, 0x94, 0xd6, 0x3f, 0x90, 0xd4, 0x3d, 0x90, 0xd2, 0x46, 0x96, 0xd5,
+ 0x44, 0x94, 0xd1, 0x39, 0x85, 0xc1, 0x33, 0x7d, 0xba, 0x34, 0x81, 0xbd,
+ 0x2e, 0x80, 0xbc, 0x28, 0x7b, 0xb5, 0x22, 0x70, 0xa6, 0x13, 0x59, 0x8d,
+ 0x0f, 0x44, 0x6a, 0x12, 0x42, 0x5d, 0x1c, 0x44, 0x61, 0x16, 0x41, 0x66,
+ 0x2b, 0x6b, 0x9a, 0x33, 0x7f, 0xbb, 0x15, 0x48, 0x7c, 0x09, 0x19, 0x2d,
+ 0x13, 0x1d, 0x23, 0x29, 0x34, 0x33, 0x43, 0x4e, 0x4a, 0x4c, 0x55, 0x58,
+ 0x45, 0x4b, 0x57, 0x31, 0x36, 0x48, 0x2f, 0x35, 0x42, 0x2f, 0x36, 0x3e,
+ 0x2a, 0x30, 0x34, 0x29, 0x2d, 0x31, 0x2c, 0x30, 0x33, 0x2a, 0x2e, 0x31,
+ 0x2a, 0x2e, 0x30, 0x22, 0x26, 0x28, 0x21, 0x25, 0x28, 0x26, 0x2b, 0x2d,
+ 0x2c, 0x30, 0x33, 0x31, 0x34, 0x38, 0x24, 0x27, 0x2c, 0x1f, 0x22, 0x27,
+ 0x17, 0x1a, 0x1e, 0x0a, 0x0c, 0x0f, 0x06, 0x06, 0x08, 0x05, 0x05, 0x07,
+ 0x04, 0x05, 0x04, 0x17, 0x17, 0x17, 0x19, 0x19, 0x19, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x0c, 0x0c, 0x0c, 0x0f, 0x11, 0x10, 0x07, 0x08, 0x07,
+ 0x04, 0x04, 0x02, 0x04, 0x06, 0x03, 0x07, 0x0a, 0x08, 0x0e, 0x12, 0x11,
+ 0x2c, 0x30, 0x2f, 0x2c, 0x30, 0x30, 0x20, 0x24, 0x23, 0x41, 0x46, 0x43,
+ 0x3b, 0x3d, 0x3c, 0x06, 0x08, 0x07, 0x07, 0x08, 0x0a, 0x0e, 0x0e, 0x11,
+ 0x1b, 0x1c, 0x1e, 0x23, 0x25, 0x25, 0x29, 0x2b, 0x29, 0x24, 0x25, 0x25,
+ 0x1b, 0x1c, 0x1e, 0x13, 0x13, 0x15, 0x0e, 0x0e, 0x10, 0x18, 0x19, 0x1b,
+ 0x20, 0x22, 0x21, 0x20, 0x24, 0x23, 0x1f, 0x23, 0x22, 0x25, 0x2b, 0x29,
+ 0x24, 0x28, 0x29, 0x1a, 0x1e, 0x1f, 0x1a, 0x1e, 0x1d, 0x1a, 0x1e, 0x1d,
+ 0x1e, 0x20, 0x1d, 0x1d, 0x1f, 0x1b, 0x1b, 0x1d, 0x1a, 0x1a, 0x1c, 0x19,
+ 0x19, 0x1b, 0x1a, 0x15, 0x17, 0x17, 0x15, 0x17, 0x16, 0x13, 0x15, 0x14,
+ 0x12, 0x14, 0x11, 0x15, 0x15, 0x13, 0x18, 0x18, 0x16, 0x14, 0x14, 0x13,
+ 0x13, 0x13, 0x13, 0x0a, 0x0a, 0x0a, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x0c, 0x0c, 0x0c, 0x12, 0x12, 0x12, 0x13, 0x13, 0x12,
+ 0x12, 0x11, 0x0f, 0x11, 0x11, 0x0f, 0x0f, 0x10, 0x0d, 0x0c, 0x0e, 0x0c,
+ 0x0d, 0x0f, 0x0d, 0x0b, 0x0d, 0x0c, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f,
+ 0x13, 0x19, 0x19, 0x1a, 0x1c, 0x1d, 0x26, 0x1e, 0x1e, 0x3b, 0x27, 0x22,
+ 0x55, 0x3c, 0x2d, 0x72, 0x55, 0x3a, 0x92, 0x73, 0x50, 0xbf, 0x9f, 0x79,
+ 0xe8, 0xce, 0xad, 0xfd, 0xf3, 0xdf, 0xff, 0xff, 0xfa, 0xf8, 0xff, 0xff,
+ 0xfa, 0xfe, 0xf9, 0xfc, 0xee, 0xdf, 0xf9, 0xd3, 0xbd, 0xe7, 0xb2, 0x97,
+ 0xcf, 0x96, 0x6e, 0xb9, 0x8c, 0x61, 0xb5, 0x9d, 0x6d, 0xbd, 0xbe, 0x88,
+ 0xc0, 0xd4, 0x9e, 0xbd, 0xdc, 0xa7, 0xb8, 0xde, 0xac, 0xb8, 0xe0, 0xae,
+ 0xbc, 0xdf, 0xad, 0xbe, 0xdf, 0xb0, 0xbe, 0xdf, 0xb2, 0xbe, 0xdf, 0xb4,
+ 0xbc, 0xe0, 0xb4, 0xbc, 0xdf, 0xb2, 0xbd, 0xe1, 0xb2, 0xbd, 0xe1, 0xb2,
+ 0x34, 0x34, 0x32, 0x34, 0x35, 0x33, 0x33, 0x35, 0x31, 0x30, 0x32, 0x2f,
+ 0x32, 0x34, 0x31, 0x33, 0x34, 0x31, 0x30, 0x32, 0x2d, 0x34, 0x35, 0x30,
+ 0x33, 0x33, 0x30, 0x37, 0x37, 0x35, 0x38, 0x38, 0x36, 0x37, 0x37, 0x33,
+ 0x35, 0x36, 0x31, 0x35, 0x35, 0x31, 0x36, 0x36, 0x34, 0x32, 0x32, 0x31,
+ 0x33, 0x34, 0x34, 0x31, 0x33, 0x32, 0x2f, 0x32, 0x2f, 0x2e, 0x2f, 0x2d,
+ 0x2f, 0x2f, 0x2d, 0x2c, 0x2c, 0x2b, 0x28, 0x28, 0x27, 0x2a, 0x2a, 0x2a,
+ 0x27, 0x28, 0x28, 0x24, 0x26, 0x25, 0x21, 0x23, 0x24, 0x20, 0x24, 0x27,
+ 0x21, 0x25, 0x28, 0x22, 0x26, 0x29, 0x1e, 0x22, 0x23, 0x1a, 0x1e, 0x1f,
+ 0x1a, 0x1e, 0x20, 0x1f, 0x22, 0x28, 0x1e, 0x25, 0x2d, 0x21, 0x2a, 0x31,
+ 0x1b, 0x26, 0x28, 0x10, 0x19, 0x18, 0x12, 0x13, 0x13, 0x11, 0x0e, 0x0f,
+ 0x12, 0x12, 0x12, 0x15, 0x15, 0x15, 0x12, 0x12, 0x12, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0b, 0x0b, 0x0b, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x08, 0x07, 0x07, 0x09, 0x08,
+ 0x09, 0x0b, 0x0a, 0x08, 0x0a, 0x09, 0x07, 0x09, 0x08, 0x06, 0x08, 0x07,
+ 0x07, 0x08, 0x0a, 0x07, 0x08, 0x0b, 0x07, 0x08, 0x0a, 0x08, 0x09, 0x0b,
+ 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d, 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b,
+ 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d, 0x09, 0x0c, 0x0e, 0x09, 0x0d, 0x0e,
+ 0x13, 0x17, 0x16, 0x29, 0x2d, 0x2e, 0x31, 0x35, 0x36, 0x31, 0x35, 0x36,
+ 0x33, 0x37, 0x38, 0x31, 0x35, 0x36, 0x30, 0x34, 0x34, 0x32, 0x36, 0x35,
+ 0x35, 0x37, 0x36, 0x36, 0x37, 0x39, 0x35, 0x36, 0x38, 0x38, 0x3c, 0x3d,
+ 0x38, 0x3c, 0x3f, 0x35, 0x3a, 0x3d, 0x35, 0x3a, 0x3e, 0x35, 0x3a, 0x3e,
+ 0x36, 0x3b, 0x3e, 0x37, 0x3d, 0x3f, 0x32, 0x36, 0x39, 0x32, 0x36, 0x39,
+ 0x34, 0x38, 0x3b, 0x33, 0x37, 0x3a, 0x31, 0x35, 0x39, 0x34, 0x39, 0x3c,
+ 0x38, 0x39, 0x3d, 0x35, 0x3a, 0x40, 0x34, 0x3c, 0x44, 0x34, 0x3a, 0x3e,
+ 0x36, 0x36, 0x38, 0x34, 0x39, 0x3b, 0x2e, 0x3c, 0x46, 0x32, 0x49, 0x5d,
+ 0x36, 0x5c, 0x87, 0x35, 0x67, 0x99, 0x2b, 0x6b, 0xa4, 0x26, 0x6b, 0xa6,
+ 0x25, 0x64, 0x9f, 0x1c, 0x55, 0x8a, 0x15, 0x4a, 0x77, 0x10, 0x46, 0x6c,
+ 0x14, 0x44, 0x66, 0x16, 0x42, 0x64, 0x17, 0x42, 0x64, 0x15, 0x41, 0x65,
+ 0x12, 0x3e, 0x65, 0x10, 0x38, 0x5f, 0x0e, 0x2e, 0x4f, 0x0b, 0x25, 0x40,
+ 0x09, 0x22, 0x3f, 0x0e, 0x26, 0x42, 0x0f, 0x24, 0x3f, 0x0d, 0x21, 0x3a,
+ 0x0b, 0x1e, 0x37, 0x09, 0x1e, 0x39, 0x0a, 0x20, 0x3d, 0x0b, 0x23, 0x42,
+ 0x0d, 0x26, 0x44, 0x0e, 0x24, 0x45, 0x0e, 0x22, 0x43, 0x0e, 0x23, 0x42,
+ 0x0d, 0x21, 0x39, 0x08, 0x1c, 0x2b, 0x09, 0x17, 0x20, 0x17, 0x21, 0x25,
+ 0x1d, 0x2f, 0x30, 0x15, 0x29, 0x38, 0x0f, 0x25, 0x3e, 0x0e, 0x25, 0x40,
+ 0x0e, 0x24, 0x3f, 0x0d, 0x20, 0x3e, 0x0c, 0x1a, 0x2f, 0x0b, 0x1a, 0x21,
+ 0x10, 0x21, 0x29, 0x18, 0x2b, 0x32, 0x1b, 0x2f, 0x3a, 0x1b, 0x34, 0x48,
+ 0x17, 0x35, 0x54, 0x15, 0x33, 0x58, 0x13, 0x2f, 0x53, 0x11, 0x28, 0x4a,
+ 0x13, 0x30, 0x60, 0x33, 0x69, 0xa5, 0x49, 0x95, 0xd6, 0x43, 0x93, 0xd2,
+ 0x43, 0x8f, 0xd3, 0x41, 0x8e, 0xd9, 0x45, 0x92, 0xda, 0x4b, 0x92, 0xd4,
+ 0x36, 0x82, 0xc0, 0x35, 0x80, 0xbc, 0x35, 0x81, 0xbd, 0x2f, 0x7f, 0xbb,
+ 0x29, 0x7c, 0xb7, 0x21, 0x70, 0xa6, 0x18, 0x59, 0x87, 0x12, 0x45, 0x6e,
+ 0x13, 0x3f, 0x5e, 0x1b, 0x44, 0x58, 0x1e, 0x43, 0x5e, 0x18, 0x42, 0x65,
+ 0x27, 0x5d, 0x82, 0x22, 0x55, 0x7f, 0x09, 0x28, 0x47, 0x0d, 0x17, 0x20,
+ 0x0d, 0x12, 0x16, 0x0b, 0x14, 0x11, 0x15, 0x1f, 0x17, 0x37, 0x40, 0x3b,
+ 0x55, 0x59, 0x5f, 0x50, 0x54, 0x60, 0x40, 0x48, 0x53, 0x35, 0x3f, 0x48,
+ 0x2d, 0x35, 0x3a, 0x28, 0x2d, 0x31, 0x29, 0x2e, 0x31, 0x2e, 0x32, 0x35,
+ 0x31, 0x35, 0x38, 0x2d, 0x31, 0x34, 0x26, 0x2b, 0x2e, 0x28, 0x2d, 0x2f,
+ 0x2a, 0x2e, 0x2f, 0x2b, 0x2f, 0x32, 0x2d, 0x31, 0x35, 0x32, 0x35, 0x3a,
+ 0x27, 0x2a, 0x2f, 0x0e, 0x11, 0x16, 0x07, 0x0b, 0x0e, 0x06, 0x07, 0x0b,
+ 0x05, 0x07, 0x06, 0x10, 0x12, 0x11, 0x14, 0x14, 0x14, 0x07, 0x07, 0x07,
+ 0x04, 0x04, 0x04, 0x0a, 0x0a, 0x0a, 0x10, 0x10, 0x10, 0x06, 0x06, 0x06,
+ 0x01, 0x04, 0x03, 0x05, 0x09, 0x0a, 0x19, 0x1e, 0x1e, 0x23, 0x29, 0x29,
+ 0x31, 0x37, 0x37, 0x26, 0x2a, 0x2b, 0x1f, 0x23, 0x22, 0x2a, 0x2c, 0x2a,
+ 0x2a, 0x2b, 0x2d, 0x16, 0x17, 0x19, 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x15,
+ 0x0e, 0x0f, 0x11, 0x14, 0x16, 0x15, 0x1e, 0x20, 0x1e, 0x24, 0x27, 0x24,
+ 0x26, 0x2a, 0x2b, 0x23, 0x24, 0x26, 0x20, 0x21, 0x23, 0x24, 0x25, 0x27,
+ 0x1d, 0x1f, 0x1e, 0x1b, 0x1f, 0x1e, 0x1d, 0x21, 0x20, 0x1b, 0x22, 0x20,
+ 0x1a, 0x1c, 0x1b, 0x1c, 0x1e, 0x1d, 0x1c, 0x1e, 0x1b, 0x1e, 0x20, 0x1d,
+ 0x23, 0x25, 0x22, 0x21, 0x23, 0x20, 0x1f, 0x21, 0x1e, 0x1d, 0x1f, 0x1d,
+ 0x1a, 0x1e, 0x1d, 0x16, 0x1a, 0x19, 0x17, 0x19, 0x18, 0x15, 0x17, 0x15,
+ 0x15, 0x17, 0x14, 0x16, 0x16, 0x14, 0x13, 0x13, 0x11, 0x16, 0x16, 0x14,
+ 0x18, 0x18, 0x18, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0d, 0x0f, 0x0d,
+ 0x0e, 0x10, 0x0f, 0x09, 0x0b, 0x0a, 0x0a, 0x0d, 0x0b, 0x12, 0x14, 0x13,
+ 0x34, 0x38, 0x39, 0x22, 0x26, 0x29, 0x12, 0x13, 0x17, 0x26, 0x23, 0x23,
+ 0x4a, 0x41, 0x38, 0x63, 0x4f, 0x3c, 0x76, 0x59, 0x40, 0x8d, 0x6b, 0x4e,
+ 0xa5, 0x88, 0x61, 0xcf, 0xb1, 0x8e, 0xf0, 0xd7, 0xbd, 0xff, 0xf6, 0xe9,
+ 0xff, 0xff, 0xfb, 0xfe, 0xfc, 0xf4, 0xfc, 0xec, 0xda, 0xf7, 0xd3, 0xb7,
+ 0xf1, 0xb3, 0x92, 0xd5, 0x96, 0x71, 0xbd, 0x84, 0x5b, 0xb1, 0x88, 0x5a,
+ 0xb2, 0xa4, 0x6e, 0xb6, 0xc2, 0x8a, 0xb8, 0xd2, 0x9b, 0xbc, 0xdb, 0xa7,
+ 0xbc, 0xdc, 0xab, 0xbc, 0xde, 0xac, 0xbe, 0xdf, 0xb0, 0xc0, 0xe0, 0xb6,
+ 0xc1, 0xe1, 0xb7, 0xbd, 0xdf, 0xb3, 0xbc, 0xdf, 0xb2, 0xbf, 0xe3, 0xb4,
+ 0x34, 0x34, 0x32, 0x32, 0x34, 0x31, 0x32, 0x34, 0x31, 0x2f, 0x31, 0x2e,
+ 0x31, 0x32, 0x2f, 0x31, 0x34, 0x31, 0x32, 0x34, 0x31, 0x34, 0x34, 0x32,
+ 0x32, 0x31, 0x30, 0x34, 0x34, 0x32, 0x37, 0x38, 0x34, 0x37, 0x38, 0x33,
+ 0x35, 0x36, 0x31, 0x39, 0x3a, 0x35, 0x3f, 0x40, 0x3b, 0x38, 0x39, 0x37,
+ 0x34, 0x36, 0x35, 0x33, 0x35, 0x33, 0x33, 0x35, 0x32, 0x32, 0x34, 0x31,
+ 0x31, 0x31, 0x2f, 0x30, 0x30, 0x2e, 0x2b, 0x2b, 0x2a, 0x2e, 0x2f, 0x2d,
+ 0x2a, 0x2f, 0x2b, 0x26, 0x2a, 0x29, 0x26, 0x2a, 0x2b, 0x22, 0x26, 0x29,
+ 0x22, 0x26, 0x28, 0x23, 0x27, 0x28, 0x1f, 0x23, 0x24, 0x1c, 0x20, 0x1f,
+ 0x1b, 0x1f, 0x20, 0x1e, 0x21, 0x26, 0x1e, 0x23, 0x29, 0x1c, 0x25, 0x2a,
+ 0x1c, 0x27, 0x29, 0x13, 0x1b, 0x1b, 0x14, 0x16, 0x15, 0x13, 0x0f, 0x10,
+ 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x14, 0x14, 0x14,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x09, 0x08,
+ 0x05, 0x07, 0x06, 0x08, 0x0a, 0x09, 0x06, 0x08, 0x07, 0x07, 0x09, 0x08,
+ 0x09, 0x0a, 0x0b, 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c,
+ 0x09, 0x0a, 0x0c, 0x09, 0x0b, 0x0c, 0x0a, 0x0c, 0x0d, 0x0a, 0x0b, 0x0d,
+ 0x0b, 0x0c, 0x0e, 0x0a, 0x0b, 0x0d, 0x08, 0x0b, 0x0d, 0x09, 0x0d, 0x0d,
+ 0x12, 0x16, 0x15, 0x2a, 0x2e, 0x2f, 0x31, 0x35, 0x36, 0x2f, 0x33, 0x34,
+ 0x31, 0x35, 0x36, 0x30, 0x34, 0x35, 0x2f, 0x33, 0x33, 0x32, 0x36, 0x35,
+ 0x33, 0x36, 0x35, 0x36, 0x38, 0x39, 0x37, 0x38, 0x3a, 0x37, 0x3a, 0x3b,
+ 0x38, 0x3c, 0x3f, 0x35, 0x3a, 0x3e, 0x36, 0x3b, 0x3f, 0x32, 0x37, 0x3b,
+ 0x33, 0x38, 0x3b, 0x32, 0x37, 0x3a, 0x33, 0x37, 0x3a, 0x33, 0x37, 0x3b,
+ 0x35, 0x39, 0x3c, 0x36, 0x3a, 0x3d, 0x34, 0x37, 0x3b, 0x35, 0x38, 0x3d,
+ 0x3c, 0x3d, 0x41, 0x3b, 0x42, 0x45, 0x38, 0x42, 0x46, 0x34, 0x3b, 0x3e,
+ 0x32, 0x36, 0x39, 0x34, 0x3e, 0x47, 0x36, 0x4b, 0x60, 0x3c, 0x5b, 0x7d,
+ 0x33, 0x67, 0xa3, 0x2a, 0x6a, 0xa2, 0x20, 0x67, 0x9b, 0x1e, 0x60, 0x91,
+ 0x1f, 0x53, 0x81, 0x1a, 0x46, 0x73, 0x17, 0x42, 0x6f, 0x12, 0x42, 0x6e,
+ 0x10, 0x44, 0x69, 0x13, 0x42, 0x64, 0x17, 0x3f, 0x60, 0x15, 0x3c, 0x5b,
+ 0x0f, 0x36, 0x57, 0x06, 0x2b, 0x4b, 0x07, 0x24, 0x3e, 0x0c, 0x22, 0x39,
+ 0x0f, 0x23, 0x42, 0x0f, 0x23, 0x41, 0x0d, 0x20, 0x3d, 0x0c, 0x20, 0x3b,
+ 0x0b, 0x20, 0x39, 0x0a, 0x1e, 0x37, 0x0b, 0x20, 0x39, 0x0d, 0x23, 0x3d,
+ 0x0a, 0x25, 0x41, 0x0c, 0x25, 0x45, 0x0c, 0x22, 0x44, 0x0f, 0x21, 0x3f,
+ 0x10, 0x20, 0x35, 0x0b, 0x1b, 0x26, 0x0c, 0x17, 0x1e, 0x14, 0x1c, 0x23,
+ 0x20, 0x26, 0x28, 0x1f, 0x29, 0x37, 0x15, 0x27, 0x41, 0x0c, 0x24, 0x41,
+ 0x0b, 0x24, 0x42, 0x0b, 0x21, 0x3e, 0x0c, 0x1d, 0x2d, 0x10, 0x1f, 0x21,
+ 0x15, 0x26, 0x30, 0x1d, 0x2f, 0x37, 0x21, 0x35, 0x3d, 0x27, 0x3d, 0x4d,
+ 0x24, 0x3e, 0x59, 0x1a, 0x37, 0x5a, 0x11, 0x2d, 0x54, 0x16, 0x33, 0x5a,
+ 0x2e, 0x6a, 0x9e, 0x4c, 0x9a, 0xda, 0x42, 0x98, 0xdf, 0x3e, 0x92, 0xd2,
+ 0x3d, 0x90, 0xcd, 0x3c, 0x93, 0xd4, 0x46, 0x94, 0xd8, 0x3e, 0x80, 0xc1,
+ 0x32, 0x7c, 0xbc, 0x36, 0x80, 0xbe, 0x32, 0x7f, 0xbb, 0x2a, 0x7b, 0xb5,
+ 0x1d, 0x6f, 0xa7, 0x10, 0x57, 0x89, 0x10, 0x44, 0x6c, 0x1a, 0x3f, 0x5e,
+ 0x20, 0x41, 0x5d, 0x1f, 0x41, 0x55, 0x1e, 0x40, 0x5b, 0x21, 0x44, 0x67,
+ 0x16, 0x37, 0x53, 0x0b, 0x21, 0x39, 0x0e, 0x18, 0x2a, 0x11, 0x12, 0x19,
+ 0x14, 0x13, 0x17, 0x0d, 0x0f, 0x13, 0x0c, 0x10, 0x13, 0x1b, 0x1d, 0x1c,
+ 0x2f, 0x32, 0x2b, 0x35, 0x3a, 0x36, 0x43, 0x4c, 0x4d, 0x43, 0x50, 0x57,
+ 0x3c, 0x44, 0x4a, 0x31, 0x38, 0x3e, 0x28, 0x2d, 0x32, 0x24, 0x29, 0x2c,
+ 0x2c, 0x30, 0x33, 0x2b, 0x2f, 0x32, 0x28, 0x2c, 0x2f, 0x2a, 0x2e, 0x30,
+ 0x28, 0x2d, 0x2e, 0x2c, 0x32, 0x32, 0x2a, 0x2f, 0x31, 0x2a, 0x2e, 0x32,
+ 0x2f, 0x34, 0x38, 0x22, 0x27, 0x2c, 0x26, 0x2b, 0x2f, 0x18, 0x1d, 0x21,
+ 0x04, 0x07, 0x07, 0x0a, 0x0d, 0x0b, 0x11, 0x13, 0x12, 0x07, 0x07, 0x08,
+ 0x05, 0x04, 0x05, 0x09, 0x07, 0x08, 0x0d, 0x0c, 0x0c, 0x06, 0x05, 0x06,
+ 0x07, 0x0b, 0x0e, 0x19, 0x1e, 0x21, 0x2f, 0x34, 0x38, 0x23, 0x29, 0x2c,
+ 0x1d, 0x22, 0x24, 0x11, 0x15, 0x16, 0x16, 0x18, 0x17, 0x20, 0x22, 0x21,
+ 0x1b, 0x1c, 0x20, 0x21, 0x22, 0x26, 0x1e, 0x1f, 0x22, 0x1e, 0x1f, 0x23,
+ 0x09, 0x0a, 0x0c, 0x08, 0x0a, 0x09, 0x0c, 0x0e, 0x0c, 0x17, 0x1b, 0x18,
+ 0x28, 0x2c, 0x2d, 0x26, 0x2a, 0x2b, 0x29, 0x2c, 0x2d, 0x29, 0x2d, 0x2e,
+ 0x1e, 0x22, 0x21, 0x1e, 0x22, 0x21, 0x1d, 0x21, 0x20, 0x17, 0x1c, 0x1a,
+ 0x18, 0x18, 0x16, 0x1e, 0x1e, 0x1c, 0x1d, 0x1e, 0x1a, 0x1f, 0x21, 0x1c,
+ 0x20, 0x23, 0x1e, 0x20, 0x22, 0x1f, 0x21, 0x22, 0x20, 0x1d, 0x1f, 0x1e,
+ 0x18, 0x1c, 0x1b, 0x17, 0x1b, 0x1a, 0x19, 0x1b, 0x1a, 0x15, 0x17, 0x16,
+ 0x14, 0x16, 0x13, 0x14, 0x14, 0x12, 0x12, 0x12, 0x10, 0x17, 0x17, 0x15,
+ 0x19, 0x19, 0x19, 0x0e, 0x0e, 0x0e, 0x06, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x12, 0x0e, 0x0e, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0e, 0x0e,
+ 0x0d, 0x0f, 0x0c, 0x0a, 0x0c, 0x0b, 0x0a, 0x0e, 0x0d, 0x12, 0x16, 0x15,
+ 0x4c, 0x4a, 0x4b, 0x2c, 0x2f, 0x30, 0x0b, 0x14, 0x15, 0x40, 0x4b, 0x48,
+ 0x77, 0x7e, 0x75, 0x7d, 0x78, 0x6b, 0x7a, 0x65, 0x57, 0x7d, 0x5e, 0x51,
+ 0x89, 0x69, 0x55, 0x99, 0x76, 0x52, 0xb1, 0x90, 0x61, 0xda, 0xc4, 0x9a,
+ 0xf5, 0xed, 0xd8, 0xff, 0xf8, 0xef, 0xff, 0xf1, 0xe1, 0xff, 0xde, 0xc4,
+ 0xfb, 0xc7, 0xa7, 0xee, 0xb3, 0x91, 0xde, 0x9f, 0x78, 0xc7, 0x89, 0x5e,
+ 0xad, 0x7c, 0x4d, 0xa1, 0x89, 0x55, 0xa6, 0xa6, 0x72, 0xb2, 0xc4, 0x8d,
+ 0xb8, 0xd8, 0xa2, 0xbc, 0xdc, 0xa9, 0xbd, 0xdd, 0xae, 0xbe, 0xdf, 0xb2,
+ 0xc1, 0xe2, 0xb7, 0xbf, 0xe0, 0xb5, 0xbe, 0xdf, 0xb3, 0xc3, 0xe3, 0xb7,
+ 0x36, 0x35, 0x33, 0x33, 0x32, 0x30, 0x35, 0x34, 0x32, 0x34, 0x33, 0x31,
+ 0x33, 0x32, 0x30, 0x33, 0x34, 0x32, 0x37, 0x37, 0x35, 0x38, 0x38, 0x37,
+ 0x38, 0x36, 0x39, 0x38, 0x36, 0x38, 0x3b, 0x3b, 0x39, 0x3a, 0x3b, 0x38,
+ 0x39, 0x3a, 0x35, 0x3a, 0x3b, 0x36, 0x40, 0x41, 0x3c, 0x3f, 0x40, 0x3b,
+ 0x36, 0x38, 0x32, 0x38, 0x3a, 0x34, 0x36, 0x39, 0x32, 0x35, 0x38, 0x33,
+ 0x36, 0x38, 0x35, 0x33, 0x35, 0x34, 0x32, 0x33, 0x35, 0x31, 0x31, 0x33,
+ 0x2d, 0x30, 0x2f, 0x29, 0x2d, 0x2e, 0x2b, 0x2f, 0x32, 0x25, 0x29, 0x2c,
+ 0x24, 0x28, 0x29, 0x24, 0x28, 0x27, 0x1e, 0x21, 0x23, 0x1d, 0x1f, 0x24,
+ 0x1c, 0x20, 0x24, 0x1a, 0x1f, 0x22, 0x1e, 0x23, 0x26, 0x1b, 0x23, 0x27,
+ 0x1e, 0x26, 0x2b, 0x12, 0x1a, 0x1d, 0x14, 0x16, 0x15, 0x12, 0x11, 0x0d,
+ 0x13, 0x13, 0x12, 0x16, 0x16, 0x16, 0x14, 0x14, 0x14, 0x11, 0x11, 0x11,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x09, 0x09, 0x09, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x09, 0x0a, 0x0a, 0x08, 0x0a, 0x09, 0x06, 0x08, 0x07,
+ 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c,
+ 0x0a, 0x0c, 0x0c, 0x09, 0x0b, 0x0a, 0x09, 0x0b, 0x0a, 0x09, 0x0b, 0x0a,
+ 0x0a, 0x0c, 0x0c, 0x08, 0x0a, 0x0a, 0x08, 0x09, 0x0b, 0x08, 0x0a, 0x0b,
+ 0x14, 0x18, 0x17, 0x29, 0x2d, 0x2c, 0x2f, 0x33, 0x33, 0x2d, 0x31, 0x30,
+ 0x2f, 0x33, 0x34, 0x31, 0x35, 0x36, 0x31, 0x35, 0x36, 0x31, 0x35, 0x36,
+ 0x32, 0x38, 0x38, 0x34, 0x38, 0x39, 0x36, 0x37, 0x39, 0x34, 0x36, 0x38,
+ 0x35, 0x37, 0x37, 0x36, 0x3a, 0x39, 0x36, 0x3c, 0x3a, 0x2f, 0x38, 0x36,
+ 0x31, 0x3a, 0x34, 0x36, 0x3a, 0x3c, 0x39, 0x39, 0x42, 0x39, 0x39, 0x43,
+ 0x35, 0x39, 0x3c, 0x35, 0x3a, 0x37, 0x33, 0x37, 0x36, 0x36, 0x37, 0x3c,
+ 0x3a, 0x3c, 0x44, 0x3f, 0x40, 0x42, 0x3e, 0x41, 0x3e, 0x35, 0x3c, 0x3e,
+ 0x2e, 0x3e, 0x4e, 0x30, 0x4d, 0x6f, 0x33, 0x5e, 0x8d, 0x31, 0x67, 0x9c,
+ 0x27, 0x67, 0xa5, 0x23, 0x63, 0x9c, 0x1c, 0x5a, 0x88, 0x17, 0x50, 0x78,
+ 0x12, 0x46, 0x6d, 0x12, 0x42, 0x68, 0x15, 0x43, 0x67, 0x15, 0x43, 0x66,
+ 0x13, 0x41, 0x69, 0x13, 0x3d, 0x63, 0x14, 0x3a, 0x5d, 0x12, 0x33, 0x52,
+ 0x0b, 0x27, 0x44, 0x0b, 0x23, 0x3e, 0x0e, 0x24, 0x3c, 0x0c, 0x20, 0x38,
+ 0x0d, 0x22, 0x37, 0x11, 0x22, 0x35, 0x0e, 0x22, 0x36, 0x0a, 0x23, 0x3f,
+ 0x08, 0x1f, 0x3d, 0x11, 0x1f, 0x39, 0x18, 0x26, 0x3f, 0x11, 0x26, 0x41,
+ 0x0f, 0x25, 0x40, 0x0d, 0x27, 0x40, 0x0c, 0x28, 0x41, 0x0e, 0x26, 0x3e,
+ 0x0f, 0x21, 0x37, 0x0c, 0x19, 0x2a, 0x0d, 0x14, 0x22, 0x0d, 0x16, 0x1e,
+ 0x17, 0x21, 0x29, 0x1b, 0x2a, 0x38, 0x15, 0x29, 0x41, 0x0b, 0x23, 0x42,
+ 0x0c, 0x23, 0x42, 0x0d, 0x20, 0x3c, 0x0d, 0x1c, 0x2e, 0x15, 0x1f, 0x2c,
+ 0x1e, 0x27, 0x37, 0x23, 0x35, 0x47, 0x3c, 0x4d, 0x4e, 0x58, 0x5c, 0x4e,
+ 0x5e, 0x5a, 0x5b, 0x3b, 0x48, 0x5e, 0x17, 0x40, 0x6b, 0x35, 0x6e, 0xae,
+ 0x4c, 0x96, 0xda, 0x46, 0x95, 0xd9, 0x3e, 0x8f, 0xd2, 0x38, 0x8c, 0xcc,
+ 0x3a, 0x8e, 0xce, 0x3d, 0x8e, 0xcd, 0x34, 0x84, 0xc1, 0x34, 0x81, 0xbc,
+ 0x37, 0x83, 0xba, 0x33, 0x80, 0xb9, 0x2c, 0x7a, 0xb3, 0x23, 0x6d, 0xa2,
+ 0x15, 0x55, 0x84, 0x10, 0x42, 0x68, 0x19, 0x41, 0x5f, 0x1f, 0x41, 0x5c,
+ 0x1f, 0x40, 0x59, 0x1b, 0x40, 0x5a, 0x1d, 0x44, 0x61, 0x19, 0x39, 0x55,
+ 0x04, 0x18, 0x30, 0x0a, 0x14, 0x23, 0x12, 0x17, 0x1e, 0x0a, 0x0e, 0x11,
+ 0x0c, 0x10, 0x11, 0x09, 0x0c, 0x0e, 0x0c, 0x0d, 0x0d, 0x0c, 0x0e, 0x0d,
+ 0x0a, 0x0c, 0x0b, 0x0b, 0x0f, 0x0d, 0x19, 0x1f, 0x1d, 0x37, 0x3e, 0x3c,
+ 0x47, 0x4f, 0x52, 0x48, 0x51, 0x58, 0x39, 0x42, 0x4c, 0x2a, 0x32, 0x3e,
+ 0x2d, 0x33, 0x3e, 0x25, 0x2a, 0x31, 0x27, 0x28, 0x2a, 0x2a, 0x2a, 0x29,
+ 0x2a, 0x30, 0x37, 0x2a, 0x30, 0x34, 0x28, 0x2d, 0x2b, 0x2d, 0x30, 0x2c,
+ 0x2a, 0x2e, 0x2a, 0x26, 0x2b, 0x2a, 0x3a, 0x41, 0x45, 0x30, 0x39, 0x3f,
+ 0x13, 0x17, 0x1c, 0x12, 0x15, 0x18, 0x14, 0x15, 0x18, 0x0b, 0x0b, 0x0d,
+ 0x04, 0x04, 0x06, 0x04, 0x06, 0x05, 0x0a, 0x0b, 0x0a, 0x16, 0x1b, 0x18,
+ 0x2e, 0x36, 0x3d, 0x2a, 0x32, 0x38, 0x25, 0x2d, 0x2f, 0x28, 0x2e, 0x2d,
+ 0x3d, 0x42, 0x3e, 0x15, 0x18, 0x17, 0x08, 0x08, 0x0a, 0x11, 0x0f, 0x12,
+ 0x15, 0x1a, 0x17, 0x20, 0x24, 0x23, 0x24, 0x28, 0x28, 0x1f, 0x24, 0x24,
+ 0x13, 0x16, 0x17, 0x10, 0x11, 0x12, 0x0c, 0x0d, 0x0f, 0x12, 0x14, 0x15,
+ 0x21, 0x27, 0x27, 0x22, 0x28, 0x26, 0x26, 0x2a, 0x29, 0x24, 0x28, 0x27,
+ 0x24, 0x28, 0x27, 0x20, 0x23, 0x22, 0x1c, 0x1f, 0x1e, 0x11, 0x13, 0x12,
+ 0x0e, 0x0e, 0x0c, 0x1e, 0x1f, 0x1c, 0x21, 0x23, 0x20, 0x1d, 0x21, 0x1c,
+ 0x20, 0x25, 0x1f, 0x1e, 0x20, 0x1b, 0x1c, 0x1e, 0x19, 0x1a, 0x1c, 0x17,
+ 0x1b, 0x1d, 0x1a, 0x19, 0x1b, 0x18, 0x16, 0x18, 0x15, 0x15, 0x17, 0x14,
+ 0x15, 0x17, 0x14, 0x14, 0x15, 0x12, 0x15, 0x17, 0x14, 0x14, 0x15, 0x13,
+ 0x15, 0x16, 0x15, 0x10, 0x12, 0x11, 0x09, 0x0b, 0x0a, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0a, 0x09, 0x08, 0x0e, 0x0d, 0x0b,
+ 0x0f, 0x10, 0x0f, 0x0d, 0x0d, 0x0f, 0x0f, 0x0d, 0x12, 0x10, 0x0f, 0x14,
+ 0x0a, 0x0e, 0x0d, 0x08, 0x0c, 0x09, 0x0c, 0x0e, 0x0d, 0x0e, 0x0e, 0x10,
+ 0x2b, 0x27, 0x27, 0x1b, 0x21, 0x19, 0x2e, 0x43, 0x2f, 0x8d, 0xab, 0x8d,
+ 0xa4, 0xc1, 0xae, 0xa2, 0xb3, 0xb2, 0x97, 0x9a, 0x9d, 0x87, 0x80, 0x7d,
+ 0x8a, 0x6b, 0x61, 0x8c, 0x65, 0x54, 0x91, 0x6a, 0x4d, 0xa5, 0x82, 0x5c,
+ 0xbb, 0xa0, 0x77, 0xd7, 0xbe, 0x95, 0xf2, 0xd3, 0xae, 0xfd, 0xd8, 0xb4,
+ 0xf9, 0xd4, 0xa6, 0xf2, 0xc3, 0x9a, 0xed, 0xb1, 0x8c, 0xe8, 0xa5, 0x80,
+ 0xd2, 0x93, 0x6c, 0xb1, 0x7e, 0x51, 0x9b, 0x77, 0x43, 0x9e, 0x88, 0x4d,
+ 0xab, 0xb1, 0x77, 0xb9, 0xcb, 0x92, 0xba, 0xd9, 0xa0, 0xb8, 0xdf, 0xaa,
+ 0xbc, 0xe2, 0xb2, 0xbe, 0xe0, 0xb3, 0xc2, 0xe0, 0xb4, 0xc6, 0xe1, 0xb4,
+ 0x34, 0x34, 0x32, 0x35, 0x35, 0x33, 0x34, 0x33, 0x31, 0x35, 0x35, 0x33,
+ 0x37, 0x36, 0x35, 0x37, 0x36, 0x34, 0x37, 0x37, 0x35, 0x3b, 0x3a, 0x38,
+ 0x3c, 0x3a, 0x3a, 0x3c, 0x3a, 0x3b, 0x3f, 0x3e, 0x3c, 0x3e, 0x3f, 0x3a,
+ 0x39, 0x3a, 0x35, 0x3d, 0x3e, 0x38, 0x3e, 0x3f, 0x3a, 0x3c, 0x3c, 0x3a,
+ 0x3c, 0x3d, 0x38, 0x3a, 0x3c, 0x36, 0x36, 0x39, 0x32, 0x38, 0x3a, 0x35,
+ 0x38, 0x3a, 0x35, 0x37, 0x39, 0x36, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36,
+ 0x32, 0x34, 0x30, 0x30, 0x31, 0x31, 0x2d, 0x2e, 0x32, 0x28, 0x2c, 0x2d,
+ 0x26, 0x2a, 0x29, 0x25, 0x29, 0x27, 0x23, 0x24, 0x26, 0x1e, 0x1f, 0x24,
+ 0x1a, 0x1f, 0x23, 0x1a, 0x1f, 0x22, 0x1c, 0x21, 0x24, 0x1c, 0x24, 0x27,
+ 0x21, 0x28, 0x2e, 0x0c, 0x14, 0x17, 0x08, 0x0b, 0x0a, 0x0b, 0x0a, 0x06,
+ 0x0c, 0x0c, 0x0b, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x03, 0x03, 0x03,
+ 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x06, 0x08, 0x07, 0x07, 0x09, 0x08,
+ 0x07, 0x09, 0x0a, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0b,
+ 0x09, 0x0b, 0x0a, 0x09, 0x0b, 0x0a, 0x09, 0x0b, 0x0a, 0x0a, 0x0c, 0x0b,
+ 0x0b, 0x0c, 0x0e, 0x09, 0x0a, 0x0b, 0x0a, 0x0a, 0x0d, 0x0a, 0x0b, 0x0d,
+ 0x13, 0x17, 0x16, 0x28, 0x2c, 0x2b, 0x2d, 0x31, 0x30, 0x30, 0x34, 0x33,
+ 0x2e, 0x32, 0x33, 0x30, 0x34, 0x35, 0x32, 0x36, 0x38, 0x33, 0x37, 0x38,
+ 0x32, 0x38, 0x38, 0x33, 0x37, 0x38, 0x34, 0x36, 0x38, 0x33, 0x33, 0x35,
+ 0x33, 0x34, 0x35, 0x34, 0x38, 0x39, 0x34, 0x3a, 0x3a, 0x30, 0x39, 0x38,
+ 0x34, 0x38, 0x3a, 0x38, 0x39, 0x3d, 0x38, 0x3a, 0x3e, 0x3c, 0x3f, 0x44,
+ 0x36, 0x3b, 0x3f, 0x31, 0x36, 0x3a, 0x31, 0x37, 0x37, 0x35, 0x39, 0x38,
+ 0x38, 0x37, 0x3c, 0x38, 0x3b, 0x3e, 0x33, 0x3c, 0x40, 0x30, 0x44, 0x50,
+ 0x31, 0x50, 0x6f, 0x35, 0x60, 0x8e, 0x2d, 0x65, 0x9b, 0x27, 0x66, 0xa0,
+ 0x1f, 0x63, 0x96, 0x14, 0x55, 0x83, 0x10, 0x49, 0x73, 0x12, 0x44, 0x6b,
+ 0x14, 0x41, 0x6a, 0x12, 0x3f, 0x66, 0x11, 0x3f, 0x63, 0x10, 0x41, 0x62,
+ 0x16, 0x3d, 0x60, 0x14, 0x38, 0x5a, 0x0d, 0x2e, 0x4d, 0x0a, 0x25, 0x42,
+ 0x0c, 0x23, 0x3e, 0x10, 0x24, 0x3e, 0x0f, 0x24, 0x3c, 0x0e, 0x22, 0x3c,
+ 0x0d, 0x21, 0x3e, 0x0f, 0x1f, 0x37, 0x10, 0x20, 0x37, 0x0d, 0x21, 0x3a,
+ 0x15, 0x24, 0x39, 0x2c, 0x32, 0x3c, 0x45, 0x49, 0x4f, 0x34, 0x3f, 0x47,
+ 0x1a, 0x2d, 0x44, 0x0e, 0x26, 0x3f, 0x0c, 0x26, 0x3f, 0x0c, 0x24, 0x3e,
+ 0x0d, 0x20, 0x36, 0x08, 0x16, 0x26, 0x0b, 0x15, 0x1f, 0x0f, 0x18, 0x1c,
+ 0x16, 0x23, 0x28, 0x1a, 0x29, 0x36, 0x13, 0x27, 0x3e, 0x0b, 0x24, 0x43,
+ 0x0d, 0x27, 0x46, 0x0e, 0x24, 0x3f, 0x0f, 0x20, 0x32, 0x12, 0x21, 0x2c,
+ 0x11, 0x31, 0x32, 0x2a, 0x42, 0x4b, 0x6c, 0x72, 0x65, 0x8c, 0x7f, 0x57,
+ 0x7d, 0x70, 0x5c, 0x59, 0x6a, 0x7d, 0x41, 0x7d, 0xa8, 0x42, 0x96, 0xd2,
+ 0x46, 0x95, 0xdd, 0x40, 0x90, 0xd7, 0x3c, 0x8e, 0xd3, 0x39, 0x8e, 0xd0,
+ 0x36, 0x89, 0xca, 0x33, 0x83, 0xc2, 0x32, 0x80, 0xbc, 0x39, 0x84, 0xbe,
+ 0x30, 0x81, 0xb9, 0x2d, 0x7c, 0xb5, 0x24, 0x6b, 0xa3, 0x14, 0x52, 0x85,
+ 0x0f, 0x41, 0x6c, 0x16, 0x40, 0x62, 0x1c, 0x43, 0x5e, 0x1b, 0x40, 0x58,
+ 0x1c, 0x3f, 0x55, 0x1c, 0x41, 0x5a, 0x1d, 0x43, 0x5e, 0x16, 0x35, 0x4f,
+ 0x02, 0x15, 0x29, 0x0d, 0x15, 0x20, 0x10, 0x13, 0x16, 0x07, 0x0b, 0x0a,
+ 0x07, 0x0b, 0x0c, 0x0e, 0x10, 0x11, 0x0b, 0x0d, 0x0c, 0x0d, 0x0e, 0x0e,
+ 0x0a, 0x0c, 0x0c, 0x07, 0x0b, 0x0a, 0x05, 0x09, 0x08, 0x10, 0x16, 0x14,
+ 0x21, 0x27, 0x25, 0x40, 0x48, 0x48, 0x4d, 0x55, 0x5b, 0x44, 0x4d, 0x55,
+ 0x3f, 0x48, 0x51, 0x31, 0x36, 0x3f, 0x2a, 0x2d, 0x34, 0x2a, 0x2b, 0x30,
+ 0x2b, 0x33, 0x31, 0x2b, 0x32, 0x32, 0x27, 0x2b, 0x2e, 0x2c, 0x2f, 0x33,
+ 0x2f, 0x33, 0x35, 0x29, 0x2d, 0x2e, 0x2d, 0x33, 0x32, 0x2e, 0x36, 0x33,
+ 0x30, 0x34, 0x37, 0x37, 0x3a, 0x3e, 0x24, 0x25, 0x29, 0x11, 0x12, 0x16,
+ 0x06, 0x07, 0x0a, 0x04, 0x06, 0x07, 0x0f, 0x13, 0x12, 0x42, 0x46, 0x46,
+ 0x45, 0x4c, 0x52, 0x22, 0x2a, 0x2e, 0x23, 0x29, 0x2a, 0x27, 0x2d, 0x2a,
+ 0x3d, 0x42, 0x3e, 0x20, 0x23, 0x21, 0x0d, 0x0d, 0x10, 0x0a, 0x09, 0x0d,
+ 0x0a, 0x0e, 0x0d, 0x16, 0x1a, 0x19, 0x1f, 0x23, 0x23, 0x21, 0x25, 0x27,
+ 0x22, 0x26, 0x27, 0x1c, 0x20, 0x21, 0x17, 0x1a, 0x1b, 0x1b, 0x1f, 0x20,
+ 0x25, 0x2b, 0x2b, 0x1e, 0x24, 0x24, 0x1e, 0x22, 0x21, 0x22, 0x26, 0x25,
+ 0x1e, 0x22, 0x21, 0x1a, 0x1c, 0x1b, 0x12, 0x14, 0x13, 0x0c, 0x0d, 0x0c,
+ 0x0c, 0x0c, 0x0a, 0x1b, 0x1c, 0x19, 0x1f, 0x21, 0x1e, 0x22, 0x24, 0x21,
+ 0x1f, 0x24, 0x1e, 0x1e, 0x20, 0x1b, 0x1c, 0x1e, 0x19, 0x1c, 0x1e, 0x19,
+ 0x1d, 0x1f, 0x1b, 0x17, 0x19, 0x16, 0x16, 0x18, 0x15, 0x16, 0x18, 0x15,
+ 0x18, 0x1a, 0x17, 0x17, 0x19, 0x16, 0x17, 0x17, 0x15, 0x15, 0x15, 0x13,
+ 0x15, 0x16, 0x14, 0x12, 0x14, 0x13, 0x0d, 0x0f, 0x0e, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0d,
+ 0x0d, 0x0d, 0x0b, 0x10, 0x10, 0x10, 0x0f, 0x10, 0x12, 0x0c, 0x0d, 0x0f,
+ 0x08, 0x0c, 0x0a, 0x06, 0x0b, 0x07, 0x0d, 0x0e, 0x0b, 0x11, 0x0f, 0x10,
+ 0x11, 0x13, 0x13, 0x1a, 0x28, 0x13, 0x81, 0x9c, 0x76, 0xba, 0xdc, 0xbc,
+ 0xbd, 0xdc, 0xd0, 0xbe, 0xd6, 0xd5, 0xb6, 0xc4, 0xc0, 0x9c, 0xa2, 0x98,
+ 0x8a, 0x8b, 0x7b, 0x89, 0x7c, 0x6a, 0x8f, 0x6e, 0x5a, 0x96, 0x6d, 0x52,
+ 0x9b, 0x72, 0x52, 0xa5, 0x7f, 0x5b, 0xba, 0x93, 0x6c, 0xd6, 0xad, 0x82,
+ 0xed, 0xbf, 0x95, 0xf2, 0xc4, 0x98, 0xe8, 0xbc, 0x8f, 0xe0, 0xb3, 0x86,
+ 0xd8, 0xab, 0x7e, 0xcc, 0x9c, 0x6e, 0xb4, 0x84, 0x56, 0x9f, 0x6f, 0x41,
+ 0x91, 0x71, 0x41, 0x97, 0x8b, 0x57, 0xae, 0xb7, 0x80, 0xb5, 0xd2, 0x9a,
+ 0xb6, 0xdd, 0xa6, 0xb7, 0xdf, 0xaa, 0xbc, 0xe2, 0xaf, 0xbc, 0xe0, 0xae,
+ 0x35, 0x37, 0x34, 0x36, 0x38, 0x34, 0x34, 0x35, 0x32, 0x39, 0x39, 0x36,
+ 0x3b, 0x3b, 0x38, 0x38, 0x37, 0x35, 0x3a, 0x39, 0x37, 0x3e, 0x3d, 0x3a,
+ 0x40, 0x3f, 0x3c, 0x3f, 0x3e, 0x3c, 0x3f, 0x3e, 0x3b, 0x3c, 0x3b, 0x37,
+ 0x3b, 0x3a, 0x36, 0x3e, 0x3f, 0x3a, 0x3f, 0x3f, 0x3c, 0x40, 0x3f, 0x3d,
+ 0x42, 0x41, 0x3d, 0x3f, 0x40, 0x3b, 0x3c, 0x3d, 0x37, 0x3e, 0x3f, 0x39,
+ 0x3c, 0x3d, 0x38, 0x3b, 0x3c, 0x37, 0x38, 0x38, 0x36, 0x39, 0x38, 0x36,
+ 0x36, 0x36, 0x33, 0x30, 0x30, 0x30, 0x2f, 0x30, 0x32, 0x2e, 0x30, 0x31,
+ 0x2a, 0x2d, 0x2b, 0x27, 0x29, 0x28, 0x27, 0x28, 0x2a, 0x24, 0x24, 0x29,
+ 0x1c, 0x20, 0x24, 0x1a, 0x1e, 0x21, 0x1f, 0x23, 0x26, 0x21, 0x26, 0x2a,
+ 0x20, 0x27, 0x2d, 0x0d, 0x15, 0x18, 0x04, 0x06, 0x07, 0x07, 0x06, 0x04,
+ 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x06, 0x08, 0x07, 0x06, 0x08, 0x07,
+ 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d,
+ 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b,
+ 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d, 0x0b, 0x0c, 0x0e, 0x09, 0x0a, 0x0c,
+ 0x13, 0x17, 0x16, 0x2b, 0x2f, 0x2e, 0x30, 0x34, 0x33, 0x32, 0x36, 0x35,
+ 0x30, 0x34, 0x35, 0x2e, 0x32, 0x33, 0x30, 0x34, 0x35, 0x34, 0x38, 0x39,
+ 0x31, 0x37, 0x37, 0x33, 0x37, 0x38, 0x33, 0x37, 0x38, 0x33, 0x34, 0x36,
+ 0x34, 0x35, 0x37, 0x36, 0x3a, 0x3c, 0x34, 0x38, 0x3b, 0x34, 0x39, 0x3c,
+ 0x39, 0x37, 0x41, 0x36, 0x37, 0x3b, 0x35, 0x3a, 0x36, 0x38, 0x3e, 0x3c,
+ 0x39, 0x3d, 0x43, 0x31, 0x35, 0x3e, 0x31, 0x37, 0x39, 0x36, 0x3a, 0x36,
+ 0x38, 0x3a, 0x3d, 0x32, 0x3a, 0x43, 0x2b, 0x42, 0x54, 0x2f, 0x54, 0x76,
+ 0x2f, 0x61, 0x91, 0x2a, 0x65, 0x9d, 0x22, 0x63, 0x9d, 0x1c, 0x5e, 0x96,
+ 0x14, 0x56, 0x7d, 0x0c, 0x48, 0x6e, 0x10, 0x44, 0x6b, 0x14, 0x3f, 0x69,
+ 0x15, 0x3d, 0x68, 0x12, 0x3c, 0x64, 0x0f, 0x3c, 0x60, 0x0d, 0x3d, 0x5c,
+ 0x16, 0x37, 0x54, 0x10, 0x2c, 0x4a, 0x08, 0x21, 0x3d, 0x0b, 0x21, 0x3c,
+ 0x0c, 0x20, 0x39, 0x0f, 0x23, 0x3c, 0x0f, 0x23, 0x3c, 0x0f, 0x23, 0x3f,
+ 0x0b, 0x22, 0x44, 0x0e, 0x1e, 0x3a, 0x10, 0x1f, 0x36, 0x11, 0x23, 0x38,
+ 0x3e, 0x46, 0x50, 0x68, 0x65, 0x5e, 0x71, 0x6b, 0x5c, 0x64, 0x65, 0x5a,
+ 0x38, 0x4b, 0x59, 0x14, 0x29, 0x3f, 0x0b, 0x23, 0x3e, 0x0b, 0x22, 0x3e,
+ 0x0c, 0x1e, 0x35, 0x0b, 0x19, 0x29, 0x09, 0x13, 0x1a, 0x10, 0x1a, 0x1b,
+ 0x19, 0x26, 0x29, 0x1a, 0x2a, 0x36, 0x12, 0x29, 0x42, 0x0e, 0x29, 0x49,
+ 0x12, 0x2c, 0x4d, 0x12, 0x2a, 0x44, 0x11, 0x24, 0x33, 0x12, 0x23, 0x29,
+ 0x13, 0x30, 0x33, 0x21, 0x33, 0x42, 0x47, 0x49, 0x41, 0x7f, 0x7a, 0x55,
+ 0x6d, 0x77, 0x6c, 0x58, 0x82, 0xac, 0x4f, 0x95, 0xd6, 0x40, 0x93, 0xd6,
+ 0x44, 0x95, 0xdc, 0x40, 0x93, 0xd9, 0x3d, 0x92, 0xd7, 0x3e, 0x93, 0xd6,
+ 0x44, 0x97, 0xd6, 0x34, 0x84, 0xc1, 0x36, 0x80, 0xbb, 0x36, 0x7e, 0xb8,
+ 0x29, 0x7a, 0xb4, 0x1e, 0x6a, 0xa0, 0x15, 0x53, 0x84, 0x11, 0x40, 0x6a,
+ 0x19, 0x3f, 0x62, 0x1c, 0x40, 0x5c, 0x1c, 0x41, 0x5b, 0x18, 0x41, 0x57,
+ 0x1a, 0x3f, 0x55, 0x1a, 0x40, 0x57, 0x1a, 0x3f, 0x57, 0x21, 0x3d, 0x52,
+ 0x08, 0x17, 0x26, 0x0c, 0x12, 0x1a, 0x0c, 0x0e, 0x0d, 0x0a, 0x0c, 0x09,
+ 0x0a, 0x0b, 0x0d, 0x0d, 0x0f, 0x10, 0x0b, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0c, 0x0b, 0x09, 0x0c, 0x0a, 0x09, 0x0d, 0x0c, 0x09, 0x0d, 0x0c,
+ 0x0a, 0x0f, 0x0a, 0x12, 0x17, 0x13, 0x23, 0x29, 0x27, 0x3f, 0x48, 0x49,
+ 0x54, 0x5d, 0x62, 0x44, 0x4c, 0x54, 0x36, 0x3c, 0x47, 0x30, 0x34, 0x3f,
+ 0x2d, 0x36, 0x36, 0x28, 0x30, 0x31, 0x29, 0x2e, 0x32, 0x28, 0x2c, 0x30,
+ 0x29, 0x2c, 0x31, 0x2c, 0x30, 0x30, 0x2b, 0x30, 0x2c, 0x2c, 0x32, 0x2c,
+ 0x2b, 0x2f, 0x31, 0x31, 0x35, 0x38, 0x2f, 0x30, 0x34, 0x23, 0x24, 0x28,
+ 0x14, 0x18, 0x1b, 0x14, 0x18, 0x1b, 0x23, 0x29, 0x29, 0x34, 0x3a, 0x3a,
+ 0x2a, 0x2f, 0x33, 0x1d, 0x22, 0x25, 0x20, 0x24, 0x24, 0x1e, 0x22, 0x21,
+ 0x22, 0x26, 0x24, 0x2b, 0x2d, 0x2d, 0x1c, 0x1d, 0x1f, 0x0f, 0x10, 0x13,
+ 0x0c, 0x0e, 0x0e, 0x0b, 0x0c, 0x0e, 0x0d, 0x0f, 0x11, 0x17, 0x1b, 0x1e,
+ 0x24, 0x28, 0x2b, 0x28, 0x2c, 0x2e, 0x2c, 0x30, 0x31, 0x21, 0x25, 0x26,
+ 0x21, 0x26, 0x29, 0x1f, 0x24, 0x27, 0x1f, 0x23, 0x24, 0x1e, 0x22, 0x21,
+ 0x18, 0x1b, 0x1a, 0x12, 0x14, 0x13, 0x09, 0x0b, 0x0a, 0x07, 0x09, 0x08,
+ 0x07, 0x07, 0x05, 0x17, 0x17, 0x15, 0x21, 0x23, 0x20, 0x23, 0x25, 0x22,
+ 0x1e, 0x22, 0x1d, 0x1d, 0x1f, 0x1a, 0x1b, 0x1d, 0x18, 0x1d, 0x1f, 0x1a,
+ 0x1d, 0x1f, 0x1c, 0x1a, 0x1c, 0x19, 0x18, 0x1a, 0x17, 0x17, 0x19, 0x16,
+ 0x1a, 0x1b, 0x19, 0x16, 0x16, 0x14, 0x15, 0x14, 0x12, 0x16, 0x16, 0x14,
+ 0x13, 0x13, 0x11, 0x12, 0x12, 0x11, 0x0c, 0x0c, 0x0c, 0x0b, 0x0d, 0x0d,
+ 0x0e, 0x0f, 0x0f, 0x0b, 0x0d, 0x0c, 0x0d, 0x0f, 0x0e, 0x0e, 0x10, 0x0f,
+ 0x0d, 0x0e, 0x0a, 0x0e, 0x0f, 0x0c, 0x0f, 0x12, 0x11, 0x0c, 0x10, 0x11,
+ 0x08, 0x0c, 0x0c, 0x08, 0x0a, 0x0a, 0x0c, 0x0c, 0x0a, 0x11, 0x10, 0x0e,
+ 0x0b, 0x17, 0x0e, 0x5d, 0x75, 0x52, 0xba, 0xda, 0xa9, 0xc3, 0xe6, 0xc8,
+ 0xc6, 0xe5, 0xdf, 0xc7, 0xe2, 0xdd, 0xbc, 0xd2, 0xc4, 0xa5, 0xb9, 0xa6,
+ 0x8f, 0xab, 0x95, 0x8f, 0x9b, 0x87, 0x93, 0x87, 0x77, 0x97, 0x79, 0x69,
+ 0x95, 0x72, 0x5e, 0x95, 0x6e, 0x54, 0x99, 0x6f, 0x4b, 0xa8, 0x7c, 0x51,
+ 0xbe, 0x93, 0x68, 0xd1, 0xa6, 0x7a, 0xd8, 0xaf, 0x7f, 0xd7, 0xad, 0x7b,
+ 0xd6, 0xab, 0x7c, 0xd4, 0xa5, 0x79, 0xc8, 0x97, 0x6e, 0xb5, 0x82, 0x5b,
+ 0x9e, 0x6e, 0x45, 0x8a, 0x66, 0x3a, 0x83, 0x74, 0x41, 0x93, 0x97, 0x60,
+ 0xab, 0xbe, 0x85, 0xb9, 0xd6, 0x9e, 0xb8, 0xdd, 0xa7, 0xb6, 0xde, 0xaa,
+ 0x36, 0x38, 0x33, 0x36, 0x38, 0x33, 0x38, 0x39, 0x34, 0x38, 0x39, 0x34,
+ 0x3c, 0x3c, 0x38, 0x3a, 0x39, 0x35, 0x3b, 0x3a, 0x36, 0x41, 0x40, 0x3c,
+ 0x41, 0x40, 0x3c, 0x3e, 0x3d, 0x39, 0x3f, 0x3e, 0x3a, 0x41, 0x40, 0x3b,
+ 0x3f, 0x3e, 0x39, 0x45, 0x44, 0x3f, 0x4a, 0x49, 0x45, 0x4b, 0x4a, 0x46,
+ 0x4c, 0x4b, 0x46, 0x48, 0x47, 0x41, 0x44, 0x45, 0x3f, 0x43, 0x44, 0x3c,
+ 0x44, 0x45, 0x3d, 0x43, 0x44, 0x3e, 0x40, 0x3f, 0x3a, 0x3d, 0x3c, 0x38,
+ 0x3c, 0x3b, 0x37, 0x37, 0x36, 0x34, 0x35, 0x34, 0x35, 0x34, 0x34, 0x35,
+ 0x2e, 0x30, 0x2f, 0x2c, 0x2d, 0x2c, 0x2d, 0x2c, 0x2e, 0x27, 0x26, 0x2b,
+ 0x1f, 0x23, 0x26, 0x19, 0x1d, 0x20, 0x1f, 0x23, 0x26, 0x21, 0x26, 0x2a,
+ 0x1f, 0x26, 0x2c, 0x11, 0x19, 0x1c, 0x02, 0x05, 0x06, 0x04, 0x04, 0x02,
+ 0x07, 0x07, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x0a, 0x08, 0x04, 0x06, 0x05,
+ 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x0a, 0x0b, 0x0d,
+ 0x09, 0x0a, 0x0c, 0x07, 0x08, 0x0a, 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b,
+ 0x0a, 0x0b, 0x0d, 0x08, 0x09, 0x0c, 0x0b, 0x0c, 0x10, 0x0c, 0x0d, 0x11,
+ 0x13, 0x16, 0x16, 0x2b, 0x2f, 0x2e, 0x35, 0x39, 0x38, 0x33, 0x37, 0x36,
+ 0x30, 0x34, 0x34, 0x31, 0x35, 0x36, 0x32, 0x36, 0x37, 0x35, 0x39, 0x3a,
+ 0x31, 0x37, 0x36, 0x2e, 0x33, 0x34, 0x2f, 0x33, 0x34, 0x32, 0x34, 0x36,
+ 0x33, 0x34, 0x38, 0x36, 0x39, 0x3d, 0x33, 0x36, 0x3b, 0x34, 0x37, 0x3c,
+ 0x3a, 0x39, 0x41, 0x37, 0x39, 0x3a, 0x32, 0x38, 0x34, 0x34, 0x3a, 0x36,
+ 0x35, 0x3a, 0x3b, 0x33, 0x35, 0x3b, 0x33, 0x36, 0x3a, 0x34, 0x38, 0x3b,
+ 0x30, 0x3e, 0x48, 0x2e, 0x47, 0x5a, 0x2f, 0x55, 0x78, 0x2c, 0x60, 0x92,
+ 0x25, 0x61, 0x9e, 0x20, 0x5e, 0x98, 0x1a, 0x58, 0x8d, 0x14, 0x50, 0x7d,
+ 0x10, 0x46, 0x6c, 0x10, 0x44, 0x68, 0x12, 0x42, 0x67, 0x13, 0x3e, 0x66,
+ 0x13, 0x3b, 0x66, 0x14, 0x3a, 0x64, 0x14, 0x3b, 0x5e, 0x0d, 0x32, 0x4f,
+ 0x0d, 0x25, 0x3f, 0x0c, 0x24, 0x3e, 0x0a, 0x20, 0x38, 0x0d, 0x21, 0x3a,
+ 0x0b, 0x1e, 0x38, 0x0d, 0x21, 0x3c, 0x0e, 0x23, 0x40, 0x0b, 0x22, 0x40,
+ 0x0b, 0x22, 0x44, 0x0f, 0x20, 0x3d, 0x10, 0x1f, 0x37, 0x10, 0x20, 0x33,
+ 0x44, 0x4b, 0x51, 0x7c, 0x77, 0x6b, 0x85, 0x7e, 0x6a, 0x6f, 0x70, 0x60,
+ 0x3c, 0x4c, 0x56, 0x16, 0x29, 0x3e, 0x0c, 0x21, 0x3e, 0x0d, 0x21, 0x41,
+ 0x0d, 0x1e, 0x37, 0x0c, 0x1a, 0x28, 0x0a, 0x16, 0x19, 0x11, 0x1d, 0x1b,
+ 0x1b, 0x2a, 0x2a, 0x19, 0x2b, 0x36, 0x14, 0x2c, 0x46, 0x11, 0x2e, 0x51,
+ 0x14, 0x30, 0x56, 0x12, 0x2c, 0x48, 0x0f, 0x25, 0x31, 0x14, 0x27, 0x2a,
+ 0x1d, 0x2b, 0x36, 0x1d, 0x25, 0x3c, 0x12, 0x19, 0x1f, 0x1c, 0x2e, 0x26,
+ 0x47, 0x72, 0x89, 0x56, 0x9d, 0xde, 0x47, 0x95, 0xdf, 0x55, 0x9c, 0xdf,
+ 0x4e, 0x99, 0xda, 0x43, 0x93, 0xd2, 0x3c, 0x90, 0xd0, 0x42, 0x98, 0xd5,
+ 0x4f, 0xa3, 0xde, 0x3a, 0x8a, 0xc3, 0x2d, 0x77, 0xaf, 0x2e, 0x74, 0xab,
+ 0x1f, 0x66, 0x9c, 0x11, 0x50, 0x7f, 0x0f, 0x41, 0x68, 0x17, 0x3f, 0x5e,
+ 0x1d, 0x41, 0x5a, 0x1b, 0x3f, 0x59, 0x1c, 0x41, 0x5b, 0x1a, 0x42, 0x5b,
+ 0x19, 0x3d, 0x55, 0x18, 0x3e, 0x56, 0x1e, 0x40, 0x57, 0x18, 0x31, 0x44,
+ 0x07, 0x13, 0x21, 0x0c, 0x0e, 0x14, 0x0a, 0x0b, 0x0a, 0x0a, 0x0c, 0x07,
+ 0x0b, 0x0c, 0x0e, 0x0a, 0x0b, 0x0d, 0x09, 0x09, 0x0a, 0x0b, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0d, 0x0c, 0x0d, 0x0f, 0x0e, 0x0c, 0x0e, 0x0d,
+ 0x0b, 0x0c, 0x0a, 0x0b, 0x0d, 0x0a, 0x0a, 0x0e, 0x0a, 0x14, 0x1a, 0x18,
+ 0x2b, 0x34, 0x35, 0x49, 0x52, 0x57, 0x51, 0x5a, 0x63, 0x45, 0x4b, 0x57,
+ 0x36, 0x3c, 0x47, 0x2b, 0x32, 0x3a, 0x2e, 0x33, 0x37, 0x2a, 0x2f, 0x2e,
+ 0x29, 0x2e, 0x2b, 0x2d, 0x32, 0x30, 0x26, 0x2a, 0x2b, 0x2a, 0x2e, 0x30,
+ 0x2c, 0x30, 0x33, 0x28, 0x2c, 0x2f, 0x2e, 0x32, 0x35, 0x29, 0x2d, 0x30,
+ 0x34, 0x39, 0x3c, 0x34, 0x39, 0x3c, 0x2c, 0x34, 0x36, 0x20, 0x28, 0x2a,
+ 0x1f, 0x24, 0x26, 0x1c, 0x20, 0x21, 0x22, 0x24, 0x23, 0x29, 0x2b, 0x2a,
+ 0x26, 0x28, 0x28, 0x28, 0x29, 0x2b, 0x2c, 0x2d, 0x31, 0x2a, 0x2b, 0x2f,
+ 0x19, 0x19, 0x1b, 0x0c, 0x0d, 0x0f, 0x0a, 0x0c, 0x0f, 0x0b, 0x0f, 0x12,
+ 0x17, 0x1b, 0x1e, 0x26, 0x2a, 0x2e, 0x36, 0x3c, 0x3c, 0x25, 0x2b, 0x2c,
+ 0x24, 0x29, 0x2d, 0x27, 0x2c, 0x2f, 0x20, 0x24, 0x25, 0x1d, 0x21, 0x22,
+ 0x12, 0x14, 0x13, 0x09, 0x0b, 0x0a, 0x07, 0x09, 0x08, 0x06, 0x08, 0x07,
+ 0x04, 0x04, 0x04, 0x12, 0x12, 0x10, 0x25, 0x27, 0x24, 0x23, 0x25, 0x22,
+ 0x20, 0x22, 0x1f, 0x1f, 0x21, 0x1c, 0x1e, 0x20, 0x1c, 0x1c, 0x1f, 0x19,
+ 0x1d, 0x1f, 0x1c, 0x1c, 0x1e, 0x1b, 0x18, 0x1a, 0x17, 0x15, 0x17, 0x14,
+ 0x17, 0x17, 0x15, 0x15, 0x15, 0x13, 0x15, 0x15, 0x13, 0x12, 0x12, 0x11,
+ 0x12, 0x13, 0x0e, 0x12, 0x13, 0x0f, 0x0d, 0x0e, 0x0b, 0x0b, 0x0d, 0x0c,
+ 0x0e, 0x10, 0x0f, 0x0e, 0x0f, 0x10, 0x10, 0x14, 0x15, 0x0d, 0x11, 0x12,
+ 0x0d, 0x0f, 0x0e, 0x0c, 0x10, 0x0f, 0x17, 0x1d, 0x1d, 0x11, 0x16, 0x19,
+ 0x09, 0x0c, 0x11, 0x0a, 0x0b, 0x0f, 0x0d, 0x0e, 0x0e, 0x0b, 0x0e, 0x0a,
+ 0x30, 0x47, 0x2b, 0xa8, 0xc4, 0x9b, 0xc6, 0xe5, 0xb9, 0xc9, 0xe9, 0xcc,
+ 0xc9, 0xe8, 0xda, 0xc3, 0xe0, 0xd5, 0xb4, 0xd1, 0xbd, 0xab, 0xc7, 0xae,
+ 0xa4, 0xc2, 0xaa, 0xa6, 0xbd, 0xaa, 0xa2, 0xad, 0xa0, 0x98, 0x9a, 0x90,
+ 0x91, 0x8a, 0x7f, 0x90, 0x7a, 0x69, 0x95, 0x6f, 0x53, 0x9f, 0x6f, 0x4d,
+ 0xa7, 0x7c, 0x54, 0xae, 0x83, 0x59, 0xbe, 0x91, 0x63, 0xc7, 0x98, 0x68,
+ 0xc7, 0x97, 0x67, 0xc7, 0x98, 0x6c, 0xc4, 0x96, 0x70, 0xb9, 0x8d, 0x69,
+ 0xa6, 0x82, 0x59, 0x99, 0x77, 0x4c, 0x87, 0x6b, 0x3c, 0x7c, 0x66, 0x35,
+ 0x88, 0x7c, 0x4c, 0xa1, 0xa5, 0x74, 0xaf, 0xc4, 0x93, 0xae, 0xcc, 0x9b,
+ 0x3b, 0x3c, 0x37, 0x37, 0x38, 0x33, 0x39, 0x3a, 0x35, 0x3c, 0x3c, 0x38,
+ 0x40, 0x3f, 0x3b, 0x3e, 0x3d, 0x39, 0x3d, 0x3c, 0x38, 0x42, 0x41, 0x3d,
+ 0x46, 0x43, 0x3e, 0x41, 0x3f, 0x39, 0x46, 0x43, 0x3c, 0x4a, 0x48, 0x41,
+ 0x4b, 0x4a, 0x41, 0x4f, 0x4f, 0x47, 0x54, 0x53, 0x4c, 0x54, 0x53, 0x4b,
+ 0x58, 0x56, 0x4f, 0x53, 0x50, 0x49, 0x4f, 0x4e, 0x45, 0x4d, 0x4d, 0x43,
+ 0x4f, 0x50, 0x45, 0x4c, 0x4c, 0x42, 0x46, 0x43, 0x3c, 0x45, 0x42, 0x3b,
+ 0x3e, 0x3b, 0x36, 0x3c, 0x3a, 0x37, 0x37, 0x35, 0x36, 0x35, 0x35, 0x35,
+ 0x30, 0x30, 0x2f, 0x2f, 0x2f, 0x2d, 0x31, 0x31, 0x33, 0x2a, 0x29, 0x2e,
+ 0x21, 0x24, 0x28, 0x1c, 0x1f, 0x22, 0x24, 0x28, 0x2b, 0x23, 0x28, 0x2d,
+ 0x1a, 0x21, 0x27, 0x12, 0x1a, 0x1d, 0x02, 0x05, 0x06, 0x05, 0x04, 0x02,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x08, 0x09, 0x09, 0x08, 0x09, 0x09, 0x06, 0x08, 0x07,
+ 0x08, 0x09, 0x0b, 0x08, 0x08, 0x0b, 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b,
+ 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0c, 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0d,
+ 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0c, 0x0a, 0x0a, 0x0e, 0x0b, 0x0c, 0x10,
+ 0x0f, 0x12, 0x12, 0x28, 0x2c, 0x2b, 0x35, 0x39, 0x38, 0x33, 0x38, 0x37,
+ 0x31, 0x36, 0x36, 0x31, 0x35, 0x36, 0x2f, 0x33, 0x34, 0x33, 0x37, 0x38,
+ 0x31, 0x37, 0x37, 0x2f, 0x35, 0x35, 0x2f, 0x33, 0x34, 0x31, 0x35, 0x38,
+ 0x35, 0x39, 0x3c, 0x39, 0x3c, 0x41, 0x36, 0x39, 0x3e, 0x32, 0x35, 0x3a,
+ 0x36, 0x38, 0x38, 0x32, 0x37, 0x37, 0x31, 0x3a, 0x39, 0x32, 0x38, 0x36,
+ 0x32, 0x37, 0x33, 0x36, 0x38, 0x3a, 0x35, 0x38, 0x42, 0x36, 0x3e, 0x4f,
+ 0x30, 0x51, 0x69, 0x30, 0x5a, 0x7c, 0x2d, 0x60, 0x8f, 0x24, 0x5f, 0x97,
+ 0x1d, 0x5a, 0x94, 0x1a, 0x54, 0x86, 0x16, 0x47, 0x70, 0x14, 0x40, 0x63,
+ 0x14, 0x3e, 0x67, 0x11, 0x3d, 0x66, 0x12, 0x3f, 0x66, 0x14, 0x41, 0x67,
+ 0x11, 0x3c, 0x63, 0x11, 0x34, 0x59, 0x10, 0x2d, 0x4d, 0x0c, 0x23, 0x3f,
+ 0x08, 0x1d, 0x35, 0x0a, 0x20, 0x38, 0x0b, 0x1f, 0x38, 0x0b, 0x1f, 0x38,
+ 0x0a, 0x1e, 0x39, 0x0c, 0x22, 0x3f, 0x0c, 0x25, 0x43, 0x0a, 0x23, 0x42,
+ 0x0a, 0x22, 0x40, 0x0f, 0x21, 0x3b, 0x10, 0x20, 0x39, 0x0e, 0x20, 0x34,
+ 0x12, 0x1f, 0x26, 0x31, 0x34, 0x2b, 0x62, 0x64, 0x59, 0x4a, 0x52, 0x4d,
+ 0x20, 0x31, 0x39, 0x13, 0x26, 0x3a, 0x0e, 0x23, 0x41, 0x0e, 0x21, 0x42,
+ 0x11, 0x21, 0x3a, 0x12, 0x20, 0x2c, 0x0d, 0x18, 0x1b, 0x14, 0x20, 0x20,
+ 0x1a, 0x2b, 0x2d, 0x17, 0x2c, 0x37, 0x17, 0x31, 0x4b, 0x15, 0x31, 0x56,
+ 0x14, 0x32, 0x57, 0x10, 0x2c, 0x47, 0x0f, 0x27, 0x32, 0x13, 0x29, 0x2b,
+ 0x1a, 0x2c, 0x34, 0x1a, 0x25, 0x33, 0x14, 0x1c, 0x21, 0x0a, 0x21, 0x2a,
+ 0x31, 0x6c, 0x96, 0x3d, 0x96, 0xd6, 0x40, 0x9c, 0xd4, 0x5a, 0xa5, 0xd8,
+ 0x6d, 0xb2, 0xe9, 0x4f, 0x98, 0xd0, 0x44, 0x94, 0xcb, 0x4c, 0xa0, 0xd6,
+ 0x4f, 0xa2, 0xd8, 0x39, 0x87, 0xbc, 0x23, 0x6b, 0x9f, 0x1f, 0x62, 0x96,
+ 0x17, 0x4b, 0x79, 0x12, 0x40, 0x67, 0x18, 0x41, 0x5d, 0x1d, 0x43, 0x58,
+ 0x19, 0x42, 0x56, 0x1b, 0x43, 0x5b, 0x1a, 0x42, 0x5c, 0x18, 0x3b, 0x59,
+ 0x1a, 0x3e, 0x58, 0x1b, 0x40, 0x5a, 0x19, 0x37, 0x4f, 0x04, 0x19, 0x2c,
+ 0x06, 0x0e, 0x1b, 0x0e, 0x0e, 0x14, 0x0d, 0x0d, 0x0d, 0x0b, 0x0d, 0x0c,
+ 0x0a, 0x0a, 0x0c, 0x0a, 0x0b, 0x0c, 0x0b, 0x0c, 0x0c, 0x09, 0x0a, 0x09,
+ 0x09, 0x0a, 0x09, 0x0b, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c,
+ 0x0e, 0x0e, 0x10, 0x0c, 0x0c, 0x0c, 0x0b, 0x0d, 0x0c, 0x0a, 0x0e, 0x0b,
+ 0x0b, 0x12, 0x0f, 0x1a, 0x22, 0x22, 0x34, 0x3c, 0x3f, 0x44, 0x4c, 0x52,
+ 0x4a, 0x50, 0x5d, 0x40, 0x47, 0x50, 0x36, 0x3b, 0x42, 0x2c, 0x30, 0x33,
+ 0x2a, 0x2e, 0x2f, 0x2d, 0x31, 0x34, 0x2e, 0x30, 0x35, 0x2c, 0x2d, 0x34,
+ 0x2c, 0x30, 0x33, 0x2d, 0x31, 0x34, 0x30, 0x34, 0x37, 0x2a, 0x2f, 0x32,
+ 0x30, 0x35, 0x38, 0x33, 0x38, 0x3b, 0x2c, 0x31, 0x34, 0x1d, 0x22, 0x25,
+ 0x1e, 0x1f, 0x21, 0x1a, 0x1c, 0x1c, 0x12, 0x14, 0x13, 0x1e, 0x20, 0x1f,
+ 0x28, 0x2a, 0x2a, 0x2a, 0x2c, 0x2d, 0x46, 0x47, 0x4b, 0x31, 0x35, 0x38,
+ 0x23, 0x23, 0x25, 0x1b, 0x1c, 0x1e, 0x17, 0x18, 0x1c, 0x17, 0x1b, 0x1e,
+ 0x1a, 0x1e, 0x21, 0x1d, 0x21, 0x24, 0x27, 0x2d, 0x2d, 0x31, 0x37, 0x37,
+ 0x34, 0x38, 0x3b, 0x21, 0x25, 0x28, 0x20, 0x24, 0x25, 0x1f, 0x23, 0x22,
+ 0x10, 0x12, 0x11, 0x08, 0x0a, 0x09, 0x05, 0x07, 0x06, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x06, 0x0d, 0x0d, 0x0d, 0x22, 0x24, 0x23, 0x22, 0x24, 0x21,
+ 0x20, 0x22, 0x1f, 0x1f, 0x21, 0x1e, 0x1f, 0x20, 0x1d, 0x1e, 0x20, 0x1b,
+ 0x1b, 0x1d, 0x1a, 0x1a, 0x1c, 0x19, 0x19, 0x1a, 0x17, 0x17, 0x18, 0x15,
+ 0x16, 0x16, 0x14, 0x14, 0x14, 0x12, 0x15, 0x15, 0x13, 0x12, 0x12, 0x10,
+ 0x12, 0x13, 0x0e, 0x10, 0x11, 0x0c, 0x0b, 0x0b, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0c, 0x0c, 0x0b, 0x0c, 0x0e, 0x0e, 0x10, 0x12, 0x0e, 0x11, 0x12,
+ 0x0d, 0x0e, 0x10, 0x0d, 0x10, 0x11, 0x37, 0x3d, 0x3d, 0x25, 0x29, 0x2d,
+ 0x0e, 0x0d, 0x16, 0x0c, 0x0d, 0x12, 0x07, 0x0d, 0x0a, 0x0e, 0x1a, 0x0b,
+ 0x80, 0x9f, 0x6c, 0xc2, 0xe1, 0xb7, 0xc5, 0xe2, 0xc3, 0xc8, 0xe5, 0xc7,
+ 0xc3, 0xe2, 0xc5, 0xbd, 0xda, 0xc4, 0xb7, 0xd4, 0xbd, 0xb2, 0xd0, 0xb4,
+ 0xb7, 0xce, 0xb6, 0xb6, 0xcf, 0xba, 0xb2, 0xce, 0xbe, 0xab, 0xc4, 0xbb,
+ 0x9e, 0xae, 0xa9, 0x93, 0x94, 0x8b, 0x94, 0x83, 0x73, 0x99, 0x79, 0x63,
+ 0xa5, 0x75, 0x58, 0xa4, 0x74, 0x52, 0xaa, 0x7c, 0x54, 0xad, 0x81, 0x54,
+ 0xb0, 0x84, 0x56, 0xb0, 0x84, 0x59, 0xb1, 0x86, 0x61, 0xaa, 0x83, 0x60,
+ 0xa1, 0x83, 0x5d, 0x9c, 0x80, 0x58, 0x97, 0x7a, 0x50, 0x8e, 0x71, 0x47,
+ 0x81, 0x68, 0x40, 0x7a, 0x6b, 0x44, 0x84, 0x86, 0x5d, 0x92, 0x9e, 0x74,
+ 0x3d, 0x3c, 0x38, 0x3b, 0x3a, 0x36, 0x3b, 0x3a, 0x36, 0x3d, 0x3c, 0x38,
+ 0x41, 0x40, 0x3c, 0x42, 0x40, 0x3d, 0x40, 0x3f, 0x3b, 0x46, 0x45, 0x41,
+ 0x4a, 0x48, 0x41, 0x4b, 0x48, 0x3f, 0x4e, 0x4b, 0x42, 0x50, 0x4e, 0x42,
+ 0x55, 0x53, 0x46, 0x56, 0x54, 0x48, 0x5b, 0x59, 0x4d, 0x58, 0x57, 0x4b,
+ 0x5f, 0x5d, 0x51, 0x5f, 0x5d, 0x51, 0x59, 0x57, 0x4a, 0x56, 0x57, 0x49,
+ 0x58, 0x58, 0x4b, 0x56, 0x55, 0x49, 0x4e, 0x4b, 0x42, 0x4b, 0x47, 0x3e,
+ 0x43, 0x3f, 0x39, 0x3e, 0x3b, 0x38, 0x38, 0x37, 0x35, 0x34, 0x34, 0x32,
+ 0x2e, 0x2e, 0x2c, 0x2e, 0x2e, 0x2c, 0x2d, 0x2d, 0x2d, 0x28, 0x27, 0x2c,
+ 0x22, 0x23, 0x26, 0x1e, 0x1f, 0x22, 0x1f, 0x23, 0x26, 0x1d, 0x22, 0x26,
+ 0x1a, 0x21, 0x27, 0x15, 0x1d, 0x20, 0x05, 0x08, 0x09, 0x06, 0x06, 0x04,
+ 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x08, 0x09, 0x08, 0x09, 0x09, 0x09, 0x08, 0x09, 0x09, 0x08, 0x0a, 0x09,
+ 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b,
+ 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d, 0x0c, 0x0d, 0x0e, 0x0b, 0x0c, 0x0d,
+ 0x0a, 0x0b, 0x0d, 0x0c, 0x0d, 0x0f, 0x0b, 0x0c, 0x0e, 0x09, 0x0a, 0x0d,
+ 0x0b, 0x0e, 0x0e, 0x1b, 0x1f, 0x1e, 0x28, 0x2c, 0x2b, 0x2e, 0x32, 0x31,
+ 0x33, 0x37, 0x38, 0x32, 0x36, 0x37, 0x30, 0x34, 0x35, 0x31, 0x35, 0x36,
+ 0x31, 0x37, 0x37, 0x33, 0x39, 0x39, 0x31, 0x35, 0x36, 0x33, 0x37, 0x3a,
+ 0x37, 0x3b, 0x3e, 0x39, 0x3c, 0x3f, 0x3a, 0x3c, 0x40, 0x37, 0x38, 0x3b,
+ 0x34, 0x36, 0x32, 0x2f, 0x35, 0x35, 0x30, 0x38, 0x3a, 0x31, 0x37, 0x37,
+ 0x2f, 0x33, 0x32, 0x32, 0x39, 0x3e, 0x31, 0x40, 0x53, 0x36, 0x4f, 0x6d,
+ 0x2e, 0x61, 0x84, 0x29, 0x5f, 0x8b, 0x25, 0x5c, 0x8f, 0x1e, 0x57, 0x8c,
+ 0x17, 0x4e, 0x7e, 0x13, 0x45, 0x6d, 0x14, 0x3f, 0x60, 0x18, 0x3d, 0x5c,
+ 0x19, 0x3c, 0x68, 0x15, 0x3c, 0x65, 0x14, 0x3e, 0x63, 0x12, 0x3e, 0x60,
+ 0x0f, 0x36, 0x59, 0x0a, 0x29, 0x49, 0x0b, 0x20, 0x3d, 0x0f, 0x20, 0x39,
+ 0x0c, 0x21, 0x39, 0x0b, 0x1f, 0x37, 0x08, 0x1c, 0x34, 0x0a, 0x1e, 0x37,
+ 0x0a, 0x1f, 0x3a, 0x0b, 0x22, 0x3f, 0x0c, 0x24, 0x44, 0x0a, 0x24, 0x44,
+ 0x0b, 0x23, 0x3c, 0x0e, 0x20, 0x38, 0x0e, 0x1f, 0x39, 0x0b, 0x1f, 0x37,
+ 0x08, 0x18, 0x23, 0x17, 0x20, 0x1e, 0x29, 0x33, 0x32, 0x1c, 0x2c, 0x34,
+ 0x14, 0x26, 0x2e, 0x10, 0x23, 0x36, 0x0f, 0x24, 0x43, 0x0e, 0x22, 0x43,
+ 0x0e, 0x1f, 0x36, 0x10, 0x1e, 0x29, 0x0e, 0x19, 0x1d, 0x18, 0x23, 0x27,
+ 0x1a, 0x2d, 0x32, 0x1a, 0x2f, 0x3e, 0x18, 0x32, 0x4d, 0x16, 0x34, 0x56,
+ 0x15, 0x33, 0x56, 0x12, 0x2e, 0x48, 0x0f, 0x26, 0x34, 0x14, 0x27, 0x2e,
+ 0x16, 0x2b, 0x38, 0x17, 0x25, 0x34, 0x15, 0x20, 0x24, 0x0b, 0x24, 0x2f,
+ 0x2f, 0x6c, 0x96, 0x24, 0x80, 0xb8, 0x28, 0x84, 0xb8, 0x55, 0x9e, 0xd3,
+ 0x6c, 0xad, 0xe0, 0x4f, 0x94, 0xc7, 0x49, 0x96, 0xc8, 0x47, 0x98, 0xc9,
+ 0x3c, 0x8b, 0xbb, 0x21, 0x69, 0x99, 0x19, 0x57, 0x84, 0x11, 0x49, 0x77,
+ 0x15, 0x3e, 0x63, 0x1c, 0x40, 0x5d, 0x24, 0x47, 0x5b, 0x1d, 0x42, 0x54,
+ 0x16, 0x40, 0x56, 0x19, 0x44, 0x5d, 0x16, 0x3c, 0x57, 0x19, 0x38, 0x55,
+ 0x1a, 0x3c, 0x57, 0x1c, 0x3d, 0x56, 0x1a, 0x35, 0x4c, 0x03, 0x14, 0x25,
+ 0x08, 0x0b, 0x16, 0x0e, 0x0c, 0x11, 0x0d, 0x0d, 0x0f, 0x0a, 0x0d, 0x0e,
+ 0x09, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x0f, 0x10, 0x10, 0x0a, 0x0c, 0x0b,
+ 0x09, 0x0b, 0x0a, 0x08, 0x0a, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b,
+ 0x0d, 0x0c, 0x11, 0x0d, 0x0c, 0x10, 0x0c, 0x0d, 0x0e, 0x0a, 0x0c, 0x0c,
+ 0x07, 0x0b, 0x0a, 0x06, 0x0b, 0x09, 0x09, 0x0f, 0x0d, 0x1a, 0x20, 0x20,
+ 0x34, 0x3a, 0x3a, 0x4c, 0x51, 0x55, 0x4c, 0x51, 0x5a, 0x3d, 0x3f, 0x4b,
+ 0x32, 0x34, 0x40, 0x2e, 0x31, 0x3a, 0x2d, 0x31, 0x35, 0x2d, 0x31, 0x32,
+ 0x29, 0x2d, 0x30, 0x28, 0x2d, 0x30, 0x2d, 0x32, 0x35, 0x2a, 0x2f, 0x32,
+ 0x28, 0x2e, 0x30, 0x2a, 0x2f, 0x31, 0x20, 0x26, 0x26, 0x1d, 0x20, 0x21,
+ 0x1c, 0x1c, 0x1c, 0x0c, 0x0c, 0x0c, 0x04, 0x04, 0x04, 0x04, 0x06, 0x05,
+ 0x0e, 0x10, 0x0f, 0x1f, 0x21, 0x20, 0x39, 0x3a, 0x3c, 0x2b, 0x2d, 0x2e,
+ 0x24, 0x25, 0x27, 0x29, 0x2a, 0x2c, 0x28, 0x29, 0x2d, 0x22, 0x26, 0x29,
+ 0x1f, 0x23, 0x26, 0x1d, 0x21, 0x23, 0x1b, 0x1f, 0x1f, 0x25, 0x29, 0x28,
+ 0x2d, 0x31, 0x32, 0x1d, 0x21, 0x22, 0x1e, 0x22, 0x21, 0x20, 0x24, 0x22,
+ 0x11, 0x13, 0x12, 0x08, 0x0a, 0x09, 0x07, 0x08, 0x07, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x1c, 0x1d, 0x1d, 0x21, 0x23, 0x22,
+ 0x21, 0x23, 0x20, 0x22, 0x24, 0x21, 0x1f, 0x20, 0x1d, 0x20, 0x21, 0x1e,
+ 0x1b, 0x1d, 0x1a, 0x16, 0x18, 0x15, 0x18, 0x18, 0x16, 0x17, 0x17, 0x15,
+ 0x17, 0x17, 0x15, 0x15, 0x15, 0x13, 0x11, 0x11, 0x0f, 0x13, 0x13, 0x10,
+ 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0d, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0b, 0x0c, 0x0c, 0x0c, 0x0e, 0x0d,
+ 0x0d, 0x0b, 0x0e, 0x0e, 0x0e, 0x0e, 0x35, 0x36, 0x34, 0x30, 0x2e, 0x31,
+ 0x18, 0x10, 0x17, 0x10, 0x0e, 0x0e, 0x05, 0x10, 0x01, 0x51, 0x67, 0x4a,
+ 0xb6, 0xda, 0x9e, 0xbe, 0xdd, 0xb6, 0xc2, 0xde, 0xc5, 0xc1, 0xde, 0xbd,
+ 0xbc, 0xdb, 0xb5, 0xbc, 0xda, 0xba, 0xbb, 0xd8, 0xbc, 0xb7, 0xd5, 0xb6,
+ 0xbb, 0xd5, 0xba, 0xb7, 0xd3, 0xbc, 0xb4, 0xd3, 0xc1, 0xb7, 0xd5, 0xcb,
+ 0xb3, 0xc9, 0xc7, 0xa6, 0xb5, 0xaf, 0x9a, 0xa3, 0x97, 0x92, 0x94, 0x81,
+ 0x99, 0x82, 0x6a, 0x97, 0x76, 0x5d, 0x9b, 0x74, 0x57, 0x9f, 0x71, 0x50,
+ 0xa0, 0x6f, 0x4e, 0xa1, 0x76, 0x52, 0x9d, 0x7b, 0x56, 0x98, 0x7a, 0x56,
+ 0xa2, 0x7a, 0x5b, 0xa5, 0x82, 0x62, 0xa3, 0x88, 0x65, 0x9c, 0x85, 0x61,
+ 0x92, 0x7e, 0x5b, 0x81, 0x70, 0x4e, 0x74, 0x67, 0x45, 0x77, 0x6c, 0x4c,
+ 0x3c, 0x37, 0x34, 0x3d, 0x39, 0x36, 0x3d, 0x39, 0x36, 0x3f, 0x3c, 0x38,
+ 0x40, 0x3f, 0x3b, 0x42, 0x41, 0x3d, 0x40, 0x3f, 0x3b, 0x46, 0x46, 0x41,
+ 0x4d, 0x4a, 0x41, 0x54, 0x52, 0x46, 0x54, 0x52, 0x45, 0x56, 0x55, 0x45,
+ 0x5a, 0x59, 0x47, 0x59, 0x58, 0x46, 0x5f, 0x5e, 0x4c, 0x64, 0x63, 0x51,
+ 0x67, 0x65, 0x55, 0x64, 0x62, 0x53, 0x60, 0x5e, 0x4f, 0x5f, 0x5e, 0x4f,
+ 0x5c, 0x5a, 0x4b, 0x5b, 0x59, 0x4c, 0x58, 0x54, 0x49, 0x52, 0x4e, 0x45,
+ 0x49, 0x46, 0x3f, 0x43, 0x40, 0x3b, 0x3a, 0x39, 0x35, 0x34, 0x34, 0x31,
+ 0x30, 0x31, 0x2d, 0x28, 0x2a, 0x27, 0x28, 0x28, 0x28, 0x25, 0x25, 0x27,
+ 0x21, 0x22, 0x24, 0x1b, 0x1c, 0x1e, 0x1d, 0x1e, 0x22, 0x1d, 0x22, 0x26,
+ 0x1c, 0x23, 0x28, 0x18, 0x1f, 0x25, 0x08, 0x0b, 0x0e, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x09, 0x08, 0x06, 0x08, 0x06,
+ 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x07, 0x08, 0x0b, 0x0a, 0x0b, 0x0d,
+ 0x0b, 0x0d, 0x0d, 0x09, 0x0b, 0x0b, 0x0b, 0x0d, 0x0b, 0x09, 0x0b, 0x0a,
+ 0x09, 0x0a, 0x0c, 0x0b, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e, 0x0a, 0x0b, 0x0d,
+ 0x0b, 0x0d, 0x0c, 0x10, 0x12, 0x11, 0x17, 0x1a, 0x18, 0x21, 0x23, 0x22,
+ 0x2b, 0x2c, 0x2e, 0x32, 0x34, 0x36, 0x34, 0x36, 0x37, 0x33, 0x35, 0x37,
+ 0x30, 0x35, 0x35, 0x30, 0x36, 0x36, 0x32, 0x38, 0x38, 0x33, 0x37, 0x38,
+ 0x33, 0x37, 0x38, 0x33, 0x37, 0x38, 0x36, 0x37, 0x39, 0x35, 0x36, 0x38,
+ 0x34, 0x35, 0x37, 0x34, 0x3a, 0x3a, 0x31, 0x3a, 0x38, 0x31, 0x39, 0x39,
+ 0x33, 0x3a, 0x43, 0x33, 0x45, 0x57, 0x30, 0x53, 0x6f, 0x28, 0x5a, 0x7e,
+ 0x22, 0x5d, 0x85, 0x22, 0x5b, 0x88, 0x1d, 0x54, 0x82, 0x17, 0x49, 0x74,
+ 0x13, 0x42, 0x68, 0x14, 0x41, 0x62, 0x13, 0x3e, 0x61, 0x16, 0x40, 0x65,
+ 0x14, 0x3f, 0x62, 0x14, 0x3d, 0x5e, 0x17, 0x3c, 0x5a, 0x11, 0x32, 0x4f,
+ 0x0c, 0x27, 0x46, 0x0a, 0x21, 0x3f, 0x0d, 0x21, 0x3a, 0x0d, 0x1f, 0x37,
+ 0x0a, 0x20, 0x37, 0x0c, 0x20, 0x38, 0x0b, 0x1f, 0x36, 0x0c, 0x1f, 0x37,
+ 0x0b, 0x1f, 0x38, 0x0d, 0x22, 0x3d, 0x0f, 0x27, 0x43, 0x0b, 0x23, 0x41,
+ 0x0a, 0x22, 0x3b, 0x0c, 0x1f, 0x38, 0x10, 0x1f, 0x3c, 0x0e, 0x20, 0x3a,
+ 0x08, 0x18, 0x25, 0x0b, 0x14, 0x13, 0x14, 0x1d, 0x20, 0x13, 0x23, 0x31,
+ 0x13, 0x26, 0x30, 0x0f, 0x24, 0x39, 0x0d, 0x24, 0x44, 0x0b, 0x20, 0x40,
+ 0x0b, 0x1e, 0x31, 0x0a, 0x18, 0x21, 0x11, 0x1b, 0x24, 0x1c, 0x26, 0x2e,
+ 0x18, 0x2c, 0x35, 0x18, 0x2f, 0x40, 0x18, 0x34, 0x4f, 0x15, 0x33, 0x56,
+ 0x15, 0x33, 0x55, 0x14, 0x2e, 0x49, 0x13, 0x28, 0x38, 0x18, 0x28, 0x34,
+ 0x19, 0x2a, 0x39, 0x17, 0x23, 0x3a, 0x14, 0x20, 0x2e, 0x07, 0x23, 0x2b,
+ 0x1f, 0x5b, 0x80, 0x1e, 0x72, 0xb1, 0x1c, 0x6c, 0xad, 0x45, 0x83, 0xc1,
+ 0x3a, 0x7c, 0xb2, 0x3a, 0x80, 0xb5, 0x34, 0x80, 0xb2, 0x33, 0x80, 0xb2,
+ 0x20, 0x69, 0x97, 0x15, 0x52, 0x7e, 0x13, 0x44, 0x6c, 0x13, 0x3f, 0x64,
+ 0x16, 0x42, 0x5d, 0x1d, 0x41, 0x58, 0x26, 0x45, 0x58, 0x24, 0x41, 0x57,
+ 0x1c, 0x40, 0x5a, 0x15, 0x3d, 0x57, 0x18, 0x3c, 0x54, 0x1d, 0x3d, 0x50,
+ 0x17, 0x37, 0x4e, 0x19, 0x38, 0x4e, 0x1c, 0x35, 0x47, 0x05, 0x13, 0x20,
+ 0x09, 0x0b, 0x12, 0x0f, 0x0d, 0x0e, 0x0b, 0x0c, 0x0c, 0x09, 0x0e, 0x0d,
+ 0x0a, 0x0c, 0x0e, 0x0a, 0x0b, 0x0d, 0x0e, 0x12, 0x11, 0x09, 0x0e, 0x0c,
+ 0x07, 0x0b, 0x0a, 0x09, 0x0b, 0x0a, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0d, 0x0c, 0x0c, 0x0f, 0x0f, 0x0e, 0x11,
+ 0x0c, 0x0d, 0x0e, 0x07, 0x09, 0x09, 0x0b, 0x0d, 0x0c, 0x0c, 0x0e, 0x0d,
+ 0x10, 0x15, 0x0f, 0x25, 0x2a, 0x26, 0x3f, 0x44, 0x46, 0x4a, 0x4d, 0x55,
+ 0x4b, 0x4e, 0x57, 0x3e, 0x41, 0x48, 0x34, 0x38, 0x3b, 0x32, 0x36, 0x38,
+ 0x2c, 0x30, 0x33, 0x26, 0x2b, 0x2d, 0x24, 0x2c, 0x2e, 0x28, 0x30, 0x31,
+ 0x29, 0x2f, 0x30, 0x2a, 0x2e, 0x2f, 0x21, 0x23, 0x22, 0x17, 0x19, 0x18,
+ 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x02, 0x02, 0x02, 0x05, 0x05, 0x05,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x14, 0x14, 0x14, 0x21, 0x23, 0x22,
+ 0x2d, 0x31, 0x32, 0x28, 0x2c, 0x2d, 0x24, 0x28, 0x29, 0x25, 0x29, 0x2a,
+ 0x27, 0x2b, 0x2c, 0x25, 0x29, 0x2a, 0x23, 0x26, 0x26, 0x1e, 0x21, 0x20,
+ 0x1e, 0x22, 0x20, 0x23, 0x28, 0x24, 0x22, 0x27, 0x23, 0x26, 0x28, 0x25,
+ 0x18, 0x1a, 0x17, 0x08, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x06, 0x06, 0x08,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x18, 0x18, 0x18, 0x23, 0x25, 0x24,
+ 0x22, 0x24, 0x21, 0x21, 0x23, 0x20, 0x1e, 0x20, 0x1d, 0x1d, 0x1d, 0x1b,
+ 0x1b, 0x1d, 0x1a, 0x17, 0x17, 0x15, 0x15, 0x15, 0x13, 0x18, 0x18, 0x16,
+ 0x15, 0x15, 0x13, 0x13, 0x13, 0x11, 0x11, 0x11, 0x0f, 0x10, 0x10, 0x0e,
+ 0x0e, 0x0e, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0b, 0x0b, 0x0b, 0x0d, 0x0c, 0x0d, 0x0d, 0x0c, 0x0c, 0x0f, 0x0e, 0x0c,
+ 0x19, 0x12, 0x10, 0x1e, 0x17, 0x11, 0x27, 0x20, 0x17, 0x34, 0x27, 0x22,
+ 0x2d, 0x1d, 0x1b, 0x1f, 0x19, 0x0e, 0x30, 0x3d, 0x1d, 0xa0, 0xbe, 0x8b,
+ 0xbd, 0xe3, 0xae, 0xba, 0xdd, 0xb3, 0xba, 0xd9, 0xb7, 0xb9, 0xd8, 0xb5,
+ 0xba, 0xda, 0xb4, 0xbe, 0xdc, 0xb6, 0xbe, 0xdc, 0xb7, 0xbc, 0xd9, 0xb7,
+ 0xbd, 0xdb, 0xbf, 0xbc, 0xdb, 0xc0, 0xb8, 0xd8, 0xc2, 0xb8, 0xd5, 0xc5,
+ 0xba, 0xd2, 0xca, 0xb6, 0xca, 0xc2, 0xaa, 0xc0, 0xb3, 0xa0, 0xb7, 0xa5,
+ 0x99, 0xa5, 0x94, 0x91, 0x91, 0x7f, 0x94, 0x81, 0x6d, 0x97, 0x73, 0x5f,
+ 0x97, 0x6a, 0x53, 0x95, 0x69, 0x4e, 0x8d, 0x6a, 0x4c, 0x93, 0x73, 0x54,
+ 0xa3, 0x78, 0x5b, 0xa6, 0x81, 0x64, 0xab, 0x8f, 0x71, 0xaf, 0x98, 0x7a,
+ 0xaa, 0x94, 0x75, 0x9b, 0x85, 0x67, 0x8f, 0x7a, 0x5b, 0x84, 0x6f, 0x50,
+ 0x3d, 0x36, 0x33, 0x3a, 0x35, 0x33, 0x3e, 0x3a, 0x37, 0x3c, 0x38, 0x35,
+ 0x41, 0x3e, 0x3a, 0x45, 0x44, 0x40, 0x43, 0x42, 0x3e, 0x49, 0x4a, 0x43,
+ 0x4e, 0x4b, 0x40, 0x56, 0x52, 0x47, 0x54, 0x52, 0x45, 0x58, 0x57, 0x46,
+ 0x62, 0x61, 0x4e, 0x5e, 0x5d, 0x49, 0x60, 0x5f, 0x4a, 0x67, 0x65, 0x51,
+ 0x6a, 0x67, 0x54, 0x66, 0x63, 0x50, 0x64, 0x61, 0x4e, 0x64, 0x63, 0x51,
+ 0x60, 0x5d, 0x4e, 0x60, 0x5c, 0x50, 0x5c, 0x57, 0x4d, 0x58, 0x54, 0x49,
+ 0x4c, 0x49, 0x3f, 0x46, 0x43, 0x3e, 0x3c, 0x3a, 0x37, 0x34, 0x34, 0x32,
+ 0x30, 0x31, 0x2e, 0x29, 0x2b, 0x28, 0x28, 0x29, 0x28, 0x24, 0x25, 0x26,
+ 0x20, 0x21, 0x23, 0x1c, 0x1d, 0x1f, 0x1a, 0x1b, 0x1f, 0x1e, 0x23, 0x27,
+ 0x1b, 0x22, 0x27, 0x1a, 0x21, 0x27, 0x15, 0x18, 0x1c, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x06, 0x06, 0x06, 0x04, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x08, 0x06, 0x08, 0x07, 0x05, 0x07, 0x07,
+ 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0d, 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b,
+ 0x08, 0x0a, 0x09, 0x08, 0x0a, 0x09, 0x0b, 0x0d, 0x0c, 0x09, 0x0b, 0x0a,
+ 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0d, 0x0a, 0x0b, 0x0d,
+ 0x0b, 0x0d, 0x0c, 0x0f, 0x11, 0x10, 0x0e, 0x11, 0x0f, 0x12, 0x14, 0x13,
+ 0x19, 0x1a, 0x1c, 0x28, 0x29, 0x2b, 0x31, 0x32, 0x33, 0x35, 0x37, 0x38,
+ 0x31, 0x36, 0x38, 0x30, 0x35, 0x38, 0x31, 0x37, 0x37, 0x2f, 0x34, 0x34,
+ 0x31, 0x35, 0x35, 0x33, 0x37, 0x37, 0x33, 0x35, 0x36, 0x33, 0x34, 0x36,
+ 0x35, 0x33, 0x3c, 0x34, 0x38, 0x39, 0x32, 0x3c, 0x34, 0x34, 0x3e, 0x40,
+ 0x3c, 0x4a, 0x5c, 0x39, 0x54, 0x74, 0x2a, 0x5c, 0x81, 0x1a, 0x5d, 0x81,
+ 0x18, 0x55, 0x7f, 0x19, 0x51, 0x7c, 0x15, 0x46, 0x70, 0x14, 0x3f, 0x64,
+ 0x15, 0x40, 0x61, 0x14, 0x41, 0x61, 0x10, 0x3f, 0x67, 0x0d, 0x40, 0x6d,
+ 0x10, 0x42, 0x5f, 0x14, 0x3f, 0x58, 0x12, 0x33, 0x4b, 0x0e, 0x26, 0x40,
+ 0x0c, 0x1c, 0x39, 0x0e, 0x1f, 0x3b, 0x0d, 0x21, 0x3a, 0x0b, 0x20, 0x38,
+ 0x0b, 0x1f, 0x36, 0x0b, 0x1f, 0x36, 0x0e, 0x21, 0x37, 0x0c, 0x1e, 0x34,
+ 0x0c, 0x1f, 0x34, 0x10, 0x23, 0x3b, 0x10, 0x24, 0x40, 0x0c, 0x22, 0x3d,
+ 0x0a, 0x21, 0x3d, 0x10, 0x20, 0x3c, 0x13, 0x20, 0x40, 0x0b, 0x1b, 0x36,
+ 0x06, 0x14, 0x20, 0x0b, 0x12, 0x10, 0x12, 0x18, 0x19, 0x16, 0x24, 0x2f,
+ 0x17, 0x2a, 0x37, 0x0e, 0x24, 0x3b, 0x0b, 0x22, 0x42, 0x0d, 0x22, 0x41,
+ 0x0b, 0x1e, 0x31, 0x0b, 0x1a, 0x23, 0x16, 0x20, 0x2a, 0x21, 0x2b, 0x37,
+ 0x1a, 0x2e, 0x3c, 0x18, 0x30, 0x41, 0x17, 0x33, 0x4c, 0x15, 0x33, 0x53,
+ 0x14, 0x33, 0x53, 0x12, 0x2c, 0x49, 0x15, 0x28, 0x3b, 0x19, 0x2a, 0x37,
+ 0x19, 0x31, 0x33, 0x17, 0x25, 0x3b, 0x16, 0x1e, 0x30, 0x10, 0x25, 0x2c,
+ 0x16, 0x48, 0x6c, 0x1d, 0x65, 0xa8, 0x1a, 0x63, 0xa6, 0x2d, 0x6b, 0xa4,
+ 0x1c, 0x60, 0x9a, 0x24, 0x6c, 0xa6, 0x29, 0x75, 0xab, 0x26, 0x70, 0xa3,
+ 0x17, 0x5a, 0x87, 0x10, 0x45, 0x6d, 0x16, 0x3e, 0x60, 0x20, 0x41, 0x5f,
+ 0x13, 0x44, 0x5b, 0x19, 0x42, 0x58, 0x23, 0x3f, 0x56, 0x22, 0x3b, 0x55,
+ 0x1d, 0x3a, 0x58, 0x1b, 0x3d, 0x59, 0x1b, 0x3d, 0x52, 0x19, 0x39, 0x46,
+ 0x19, 0x39, 0x4e, 0x1b, 0x39, 0x4b, 0x0d, 0x24, 0x32, 0x02, 0x0d, 0x17,
+ 0x08, 0x09, 0x0c, 0x0d, 0x0c, 0x0a, 0x09, 0x0b, 0x08, 0x07, 0x0d, 0x0b,
+ 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b, 0x0b, 0x0e, 0x0e, 0x0a, 0x0e, 0x0d,
+ 0x07, 0x0b, 0x0a, 0x09, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x0b, 0x09, 0x0b, 0x0c, 0x0b, 0x10, 0x10, 0x12, 0x13, 0x12, 0x16,
+ 0x0d, 0x0c, 0x10, 0x0b, 0x09, 0x0d, 0x0c, 0x0d, 0x0e, 0x0a, 0x0b, 0x0b,
+ 0x0c, 0x0e, 0x0b, 0x08, 0x0d, 0x09, 0x0f, 0x13, 0x0e, 0x23, 0x27, 0x23,
+ 0x40, 0x46, 0x44, 0x4c, 0x51, 0x54, 0x49, 0x4c, 0x53, 0x3f, 0x43, 0x4b,
+ 0x2e, 0x33, 0x38, 0x25, 0x2a, 0x2e, 0x27, 0x2f, 0x31, 0x26, 0x2f, 0x2f,
+ 0x2a, 0x30, 0x30, 0x2f, 0x33, 0x32, 0x24, 0x25, 0x25, 0x10, 0x10, 0x10,
+ 0x07, 0x08, 0x0a, 0x05, 0x05, 0x07, 0x04, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0f, 0x0f, 0x0e,
+ 0x23, 0x27, 0x28, 0x25, 0x29, 0x2b, 0x20, 0x24, 0x25, 0x24, 0x28, 0x2a,
+ 0x2f, 0x33, 0x34, 0x2b, 0x2d, 0x2d, 0x23, 0x25, 0x24, 0x1f, 0x21, 0x1e,
+ 0x20, 0x24, 0x21, 0x25, 0x29, 0x25, 0x23, 0x28, 0x23, 0x27, 0x29, 0x26,
+ 0x1b, 0x1d, 0x1a, 0x0a, 0x0c, 0x0b, 0x09, 0x0a, 0x0b, 0x05, 0x05, 0x07,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x12, 0x12, 0x12, 0x23, 0x25, 0x23,
+ 0x24, 0x27, 0x25, 0x1f, 0x20, 0x1e, 0x1a, 0x1b, 0x18, 0x1c, 0x1c, 0x1a,
+ 0x1c, 0x1c, 0x1a, 0x19, 0x19, 0x17, 0x17, 0x17, 0x15, 0x1a, 0x1a, 0x18,
+ 0x14, 0x14, 0x12, 0x10, 0x10, 0x0f, 0x10, 0x10, 0x0e, 0x0f, 0x0f, 0x0d,
+ 0x0d, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0b, 0x0c, 0x11, 0x0f, 0x0f, 0x19, 0x17, 0x15, 0x29, 0x26, 0x23,
+ 0x3a, 0x2c, 0x25, 0x3b, 0x2e, 0x22, 0x3a, 0x2c, 0x1d, 0x3f, 0x2b, 0x1f,
+ 0x40, 0x29, 0x1e, 0x38, 0x2c, 0x18, 0x84, 0x91, 0x64, 0xbc, 0xdf, 0x9f,
+ 0xb7, 0xdd, 0xb1, 0xb8, 0xde, 0xae, 0xb4, 0xd9, 0xa9, 0xb3, 0xd6, 0xb0,
+ 0xb6, 0xd7, 0xb5, 0xba, 0xdb, 0xb2, 0xbd, 0xdc, 0xb1, 0xbf, 0xdb, 0xb7,
+ 0xbe, 0xdc, 0xbf, 0xbd, 0xde, 0xc1, 0xbc, 0xde, 0xc3, 0xba, 0xd9, 0xc3,
+ 0xb9, 0xd3, 0xc5, 0xb8, 0xcf, 0xc1, 0xb5, 0xcd, 0xbc, 0xb3, 0xca, 0xb9,
+ 0xab, 0xc5, 0xb7, 0xa3, 0xb6, 0xa8, 0x9e, 0xa4, 0x94, 0x95, 0x8c, 0x7b,
+ 0x92, 0x7d, 0x69, 0x92, 0x6f, 0x59, 0x90, 0x65, 0x4d, 0x95, 0x66, 0x4e,
+ 0x99, 0x76, 0x55, 0xa5, 0x86, 0x66, 0xb2, 0x95, 0x79, 0xbb, 0x9d, 0x83,
+ 0xbf, 0xa1, 0x87, 0xb8, 0x9a, 0x80, 0xab, 0x90, 0x73, 0xa0, 0x86, 0x68,
+ 0x38, 0x39, 0x33, 0x36, 0x36, 0x31, 0x3b, 0x3c, 0x36, 0x3d, 0x3d, 0x36,
+ 0x3e, 0x3e, 0x36, 0x44, 0x44, 0x3c, 0x4a, 0x47, 0x41, 0x53, 0x50, 0x47,
+ 0x50, 0x53, 0x46, 0x50, 0x52, 0x45, 0x57, 0x57, 0x4b, 0x5f, 0x5d, 0x52,
+ 0x64, 0x60, 0x54, 0x68, 0x65, 0x56, 0x65, 0x63, 0x51, 0x6b, 0x69, 0x55,
+ 0x6e, 0x69, 0x55, 0x6c, 0x67, 0x53, 0x68, 0x64, 0x51, 0x64, 0x5f, 0x4f,
+ 0x64, 0x5f, 0x4f, 0x62, 0x5c, 0x4e, 0x5d, 0x57, 0x4b, 0x54, 0x4f, 0x43,
+ 0x4c, 0x48, 0x3d, 0x47, 0x43, 0x3b, 0x3d, 0x3a, 0x35, 0x38, 0x34, 0x33,
+ 0x31, 0x2f, 0x31, 0x2d, 0x2c, 0x2c, 0x2b, 0x29, 0x29, 0x22, 0x22, 0x20,
+ 0x20, 0x21, 0x24, 0x20, 0x21, 0x23, 0x18, 0x1b, 0x1a, 0x1b, 0x20, 0x21,
+ 0x1e, 0x21, 0x27, 0x1b, 0x1e, 0x23, 0x13, 0x15, 0x18, 0x0e, 0x0f, 0x0f,
+ 0x19, 0x1a, 0x19, 0x1a, 0x1b, 0x1a, 0x10, 0x12, 0x11, 0x09, 0x0b, 0x0a,
+ 0x08, 0x08, 0x08, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04,
+ 0x04, 0x04, 0x02, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x05, 0x07, 0x06, 0x07, 0x09, 0x08,
+ 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x06, 0x07, 0x09, 0x06, 0x07, 0x09,
+ 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b,
+ 0x08, 0x09, 0x0b, 0x08, 0x0a, 0x0b, 0x08, 0x09, 0x0b, 0x0b, 0x0c, 0x0e,
+ 0x0b, 0x0c, 0x0e, 0x08, 0x09, 0x0b, 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0d,
+ 0x0a, 0x0c, 0x0b, 0x10, 0x12, 0x11, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f,
+ 0x0f, 0x11, 0x10, 0x16, 0x18, 0x17, 0x20, 0x24, 0x23, 0x2a, 0x2f, 0x2e,
+ 0x30, 0x34, 0x35, 0x2f, 0x32, 0x35, 0x31, 0x33, 0x36, 0x32, 0x33, 0x32,
+ 0x2e, 0x2f, 0x2a, 0x31, 0x32, 0x2b, 0x31, 0x31, 0x2f, 0x30, 0x30, 0x34,
+ 0x31, 0x32, 0x2c, 0x2e, 0x34, 0x32, 0x2c, 0x3c, 0x46, 0x31, 0x4d, 0x65,
+ 0x34, 0x59, 0x7b, 0x2a, 0x5a, 0x82, 0x21, 0x59, 0x84, 0x18, 0x55, 0x7e,
+ 0x16, 0x4c, 0x70, 0x12, 0x43, 0x69, 0x11, 0x3e, 0x65, 0x15, 0x3e, 0x66,
+ 0x16, 0x40, 0x66, 0x13, 0x3d, 0x64, 0x12, 0x3d, 0x65, 0x11, 0x3d, 0x64,
+ 0x16, 0x37, 0x57, 0x16, 0x32, 0x4d, 0x0d, 0x23, 0x3c, 0x0e, 0x1f, 0x38,
+ 0x0e, 0x20, 0x38, 0x0c, 0x1d, 0x35, 0x0e, 0x1e, 0x35, 0x11, 0x21, 0x36,
+ 0x11, 0x24, 0x33, 0x0c, 0x1e, 0x36, 0x0a, 0x1e, 0x38, 0x0d, 0x22, 0x32,
+ 0x0f, 0x28, 0x32, 0x0c, 0x25, 0x38, 0x09, 0x22, 0x3f, 0x0a, 0x21, 0x42,
+ 0x0f, 0x21, 0x3c, 0x12, 0x22, 0x3c, 0x10, 0x21, 0x3a, 0x0d, 0x1b, 0x2f,
+ 0x0b, 0x15, 0x20, 0x0a, 0x13, 0x17, 0x11, 0x1b, 0x21, 0x1a, 0x26, 0x30,
+ 0x1a, 0x28, 0x37, 0x12, 0x25, 0x3d, 0x0d, 0x25, 0x43, 0x0b, 0x23, 0x40,
+ 0x0e, 0x20, 0x36, 0x11, 0x21, 0x2e, 0x15, 0x26, 0x30, 0x1d, 0x30, 0x3c,
+ 0x1d, 0x3a, 0x4b, 0x31, 0x42, 0x47, 0x41, 0x4b, 0x4c, 0x28, 0x39, 0x4b,
+ 0x17, 0x2f, 0x52, 0x14, 0x2c, 0x4f, 0x15, 0x2b, 0x42, 0x15, 0x2d, 0x38,
+ 0x17, 0x31, 0x40, 0x16, 0x27, 0x35, 0x1c, 0x22, 0x29, 0x11, 0x2b, 0x3e,
+ 0x2b, 0x67, 0x99, 0x3a, 0x7a, 0xb8, 0x31, 0x69, 0xa6, 0x26, 0x60, 0xa5,
+ 0x13, 0x55, 0x90, 0x17, 0x5b, 0x92, 0x21, 0x62, 0x97, 0x20, 0x5a, 0x8b,
+ 0x15, 0x47, 0x72, 0x16, 0x40, 0x64, 0x1b, 0x42, 0x5f, 0x1a, 0x41, 0x5a,
+ 0x19, 0x3e, 0x58, 0x1d, 0x3f, 0x5b, 0x1c, 0x3d, 0x5b, 0x19, 0x3a, 0x58,
+ 0x1c, 0x3b, 0x5a, 0x1c, 0x3a, 0x56, 0x1c, 0x39, 0x51, 0x1a, 0x37, 0x4c,
+ 0x16, 0x34, 0x50, 0x1b, 0x32, 0x4a, 0x0b, 0x17, 0x27, 0x05, 0x09, 0x12,
+ 0x09, 0x0a, 0x0e, 0x0d, 0x0e, 0x11, 0x0a, 0x0b, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x10, 0x0e, 0x0c, 0x10, 0x0f, 0x08, 0x0c, 0x0b, 0x0c, 0x10, 0x0e,
+ 0x0c, 0x0f, 0x0f, 0x09, 0x0a, 0x0c, 0x0a, 0x0b, 0x0e, 0x0d, 0x0e, 0x11,
+ 0x0d, 0x0f, 0x0e, 0x08, 0x0a, 0x09, 0x09, 0x0a, 0x08, 0x0b, 0x0c, 0x0b,
+ 0x16, 0x18, 0x17, 0x2b, 0x2f, 0x30, 0x48, 0x4e, 0x4e, 0x56, 0x5d, 0x60,
+ 0x43, 0x46, 0x58, 0x31, 0x34, 0x43, 0x2c, 0x31, 0x39, 0x2b, 0x31, 0x34,
+ 0x2e, 0x33, 0x34, 0x2e, 0x32, 0x35, 0x2b, 0x2e, 0x34, 0x21, 0x22, 0x2c,
+ 0x12, 0x15, 0x1a, 0x0d, 0x0e, 0x13, 0x08, 0x09, 0x0d, 0x04, 0x05, 0x06,
+ 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x08, 0x0b, 0x0c, 0x08, 0x18, 0x19, 0x15,
+ 0x21, 0x25, 0x25, 0x27, 0x2b, 0x2e, 0x20, 0x24, 0x27, 0x2b, 0x30, 0x33,
+ 0x35, 0x3a, 0x3d, 0x22, 0x28, 0x28, 0x21, 0x25, 0x23, 0x22, 0x27, 0x23,
+ 0x21, 0x25, 0x23, 0x27, 0x29, 0x28, 0x29, 0x2c, 0x29, 0x29, 0x29, 0x27,
+ 0x21, 0x21, 0x1f, 0x0d, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x04, 0x04, 0x05,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x0d, 0x0d, 0x0b, 0x22, 0x23, 0x1f,
+ 0x21, 0x22, 0x1e, 0x21, 0x21, 0x1f, 0x1e, 0x1e, 0x1c, 0x1b, 0x1b, 0x1a,
+ 0x19, 0x19, 0x17, 0x19, 0x19, 0x17, 0x16, 0x16, 0x14, 0x15, 0x15, 0x13,
+ 0x12, 0x12, 0x11, 0x11, 0x11, 0x11, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0e, 0x0c, 0x0d, 0x0f,
+ 0x16, 0x12, 0x12, 0x26, 0x1b, 0x17, 0x48, 0x35, 0x2e, 0x5a, 0x41, 0x39,
+ 0x5c, 0x3d, 0x32, 0x56, 0x3b, 0x2e, 0x4a, 0x32, 0x22, 0x49, 0x2e, 0x1d,
+ 0x48, 0x2d, 0x17, 0x67, 0x5c, 0x39, 0xb2, 0xca, 0x93, 0xb2, 0xe1, 0xa1,
+ 0xb7, 0xd8, 0xad, 0xb5, 0xd6, 0xab, 0xb3, 0xd5, 0xa9, 0xb3, 0xd4, 0xa9,
+ 0xb5, 0xd6, 0xac, 0xb7, 0xd8, 0xad, 0xb8, 0xd7, 0xae, 0xb9, 0xda, 0xb1,
+ 0xbb, 0xdc, 0xbb, 0xbc, 0xdd, 0xbf, 0xbf, 0xdd, 0xc1, 0xbd, 0xdb, 0xc1,
+ 0xbf, 0xda, 0xc5, 0xbc, 0xd6, 0xc2, 0xb7, 0xd0, 0xbd, 0xb5, 0xce, 0xbb,
+ 0xb3, 0xd0, 0xbc, 0xb5, 0xcf, 0xbf, 0xaf, 0xc4, 0xbb, 0xa4, 0xb2, 0xac,
+ 0x99, 0x9f, 0x96, 0x91, 0x8a, 0x7a, 0x90, 0x7b, 0x64, 0x90, 0x70, 0x55,
+ 0x94, 0x6e, 0x4a, 0xa1, 0x7d, 0x59, 0xaf, 0x91, 0x6d, 0xb9, 0x9b, 0x7d,
+ 0xc1, 0xa1, 0x88, 0xc6, 0xa3, 0x8c, 0xc1, 0xa0, 0x85, 0xbc, 0x9d, 0x7e,
+ 0x36, 0x37, 0x31, 0x33, 0x34, 0x2e, 0x3b, 0x3c, 0x36, 0x3f, 0x40, 0x38,
+ 0x40, 0x40, 0x38, 0x44, 0x43, 0x3b, 0x4a, 0x46, 0x3f, 0x53, 0x4f, 0x46,
+ 0x55, 0x57, 0x49, 0x58, 0x59, 0x4b, 0x61, 0x5f, 0x52, 0x66, 0x62, 0x56,
+ 0x65, 0x61, 0x54, 0x6a, 0x67, 0x57, 0x66, 0x64, 0x51, 0x6a, 0x69, 0x54,
+ 0x69, 0x67, 0x52, 0x6a, 0x68, 0x53, 0x6b, 0x68, 0x54, 0x66, 0x63, 0x50,
+ 0x66, 0x62, 0x51, 0x66, 0x63, 0x54, 0x5f, 0x5b, 0x4c, 0x54, 0x4e, 0x42,
+ 0x4f, 0x4b, 0x40, 0x44, 0x41, 0x38, 0x3a, 0x37, 0x32, 0x36, 0x32, 0x31,
+ 0x31, 0x2f, 0x30, 0x2b, 0x29, 0x2a, 0x27, 0x25, 0x26, 0x22, 0x21, 0x22,
+ 0x20, 0x21, 0x23, 0x1d, 0x1f, 0x20, 0x19, 0x1d, 0x1c, 0x1c, 0x20, 0x22,
+ 0x21, 0x24, 0x2a, 0x1c, 0x1e, 0x23, 0x11, 0x13, 0x16, 0x0b, 0x0c, 0x0e,
+ 0x15, 0x17, 0x16, 0x1f, 0x21, 0x20, 0x1e, 0x20, 0x1f, 0x15, 0x17, 0x16,
+ 0x0c, 0x0c, 0x0c, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x05, 0x07, 0x06, 0x06, 0x08, 0x07,
+ 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x06, 0x07, 0x09, 0x05, 0x06, 0x08,
+ 0x06, 0x07, 0x09, 0x07, 0x08, 0x0a, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c,
+ 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x07, 0x08, 0x0a, 0x0a, 0x0b, 0x0d,
+ 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b, 0x0a, 0x0b, 0x0d, 0x09, 0x0a, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10,
+ 0x0f, 0x11, 0x10, 0x12, 0x14, 0x13, 0x12, 0x14, 0x13, 0x15, 0x19, 0x19,
+ 0x1e, 0x21, 0x25, 0x24, 0x28, 0x27, 0x27, 0x2c, 0x26, 0x26, 0x2a, 0x26,
+ 0x20, 0x23, 0x24, 0x24, 0x25, 0x28, 0x27, 0x27, 0x27, 0x25, 0x24, 0x20,
+ 0x24, 0x2a, 0x32, 0x2a, 0x38, 0x45, 0x2f, 0x4a, 0x5f, 0x2d, 0x56, 0x73,
+ 0x24, 0x57, 0x7a, 0x20, 0x56, 0x7c, 0x1c, 0x51, 0x7a, 0x14, 0x48, 0x70,
+ 0x13, 0x40, 0x67, 0x15, 0x40, 0x67, 0x14, 0x3e, 0x65, 0x17, 0x3e, 0x65,
+ 0x16, 0x3d, 0x64, 0x16, 0x3c, 0x61, 0x14, 0x3b, 0x5e, 0x0d, 0x33, 0x57,
+ 0x0d, 0x2a, 0x46, 0x0a, 0x23, 0x3c, 0x0d, 0x20, 0x38, 0x0f, 0x21, 0x37,
+ 0x0c, 0x1e, 0x34, 0x0b, 0x1c, 0x32, 0x0d, 0x1e, 0x34, 0x0e, 0x1f, 0x33,
+ 0x0a, 0x1f, 0x30, 0x0e, 0x20, 0x38, 0x15, 0x21, 0x39, 0x33, 0x3a, 0x43,
+ 0x4a, 0x4e, 0x50, 0x2f, 0x35, 0x41, 0x17, 0x26, 0x3b, 0x0c, 0x22, 0x39,
+ 0x0e, 0x21, 0x3b, 0x0e, 0x1f, 0x3b, 0x0c, 0x1c, 0x36, 0x0d, 0x1a, 0x2e,
+ 0x0c, 0x16, 0x20, 0x0d, 0x16, 0x1a, 0x12, 0x1c, 0x23, 0x1a, 0x26, 0x2f,
+ 0x19, 0x28, 0x36, 0x11, 0x25, 0x3e, 0x0c, 0x25, 0x44, 0x0d, 0x25, 0x45,
+ 0x0f, 0x21, 0x39, 0x12, 0x22, 0x30, 0x14, 0x26, 0x30, 0x1f, 0x31, 0x3b,
+ 0x49, 0x4d, 0x49, 0x66, 0x5f, 0x4c, 0x75, 0x6d, 0x54, 0x57, 0x5e, 0x56,
+ 0x29, 0x3c, 0x49, 0x18, 0x2c, 0x41, 0x17, 0x2c, 0x3e, 0x17, 0x2f, 0x3b,
+ 0x1d, 0x2e, 0x37, 0x1a, 0x29, 0x30, 0x17, 0x24, 0x2c, 0x19, 0x3f, 0x5a,
+ 0x41, 0x87, 0xbf, 0x42, 0x89, 0xc6, 0x4a, 0x84, 0xbc, 0x25, 0x5d, 0x9a,
+ 0x12, 0x50, 0x87, 0x14, 0x53, 0x88, 0x17, 0x54, 0x84, 0x15, 0x4b, 0x75,
+ 0x13, 0x42, 0x68, 0x1d, 0x45, 0x65, 0x1e, 0x43, 0x5e, 0x19, 0x3d, 0x57,
+ 0x1c, 0x3f, 0x58, 0x1a, 0x3e, 0x58, 0x17, 0x39, 0x54, 0x1b, 0x3b, 0x58,
+ 0x1e, 0x3c, 0x58, 0x18, 0x36, 0x4e, 0x1a, 0x36, 0x4b, 0x19, 0x36, 0x49,
+ 0x13, 0x31, 0x4a, 0x1e, 0x35, 0x4a, 0x10, 0x1c, 0x28, 0x06, 0x0b, 0x11,
+ 0x0a, 0x0d, 0x10, 0x0c, 0x0e, 0x10, 0x0a, 0x0b, 0x0e, 0x0a, 0x0b, 0x0a,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x08, 0x09, 0x09, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d,
+ 0x0b, 0x0d, 0x0c, 0x0a, 0x0c, 0x0b, 0x07, 0x09, 0x06, 0x07, 0x09, 0x07,
+ 0x09, 0x0b, 0x08, 0x09, 0x0b, 0x0a, 0x08, 0x0a, 0x0b, 0x0e, 0x0f, 0x11,
+ 0x0b, 0x0c, 0x0e, 0x0a, 0x0b, 0x0c, 0x0a, 0x0c, 0x0c, 0x0a, 0x0b, 0x0d,
+ 0x0d, 0x0f, 0x11, 0x0e, 0x11, 0x14, 0x16, 0x1b, 0x1e, 0x30, 0x37, 0x3a,
+ 0x4b, 0x52, 0x51, 0x4c, 0x53, 0x57, 0x3c, 0x42, 0x4d, 0x38, 0x3e, 0x4d,
+ 0x30, 0x36, 0x44, 0x27, 0x2e, 0x36, 0x27, 0x2f, 0x2e, 0x27, 0x2e, 0x2a,
+ 0x27, 0x2b, 0x30, 0x27, 0x2a, 0x2f, 0x1a, 0x1b, 0x1f, 0x0e, 0x0f, 0x11,
+ 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0e, 0x17, 0x18, 0x1a, 0x20, 0x21, 0x24,
+ 0x1e, 0x22, 0x23, 0x24, 0x28, 0x2b, 0x23, 0x27, 0x2a, 0x34, 0x39, 0x3c,
+ 0x27, 0x2c, 0x2f, 0x1e, 0x23, 0x24, 0x23, 0x27, 0x26, 0x25, 0x2a, 0x27,
+ 0x25, 0x29, 0x28, 0x27, 0x29, 0x28, 0x2a, 0x2b, 0x28, 0x27, 0x27, 0x25,
+ 0x26, 0x25, 0x24, 0x13, 0x13, 0x12, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x0a, 0x0a, 0x08, 0x1e, 0x1e, 0x1c,
+ 0x21, 0x22, 0x1e, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x1f, 0x1b, 0x1b, 0x1a,
+ 0x18, 0x18, 0x16, 0x17, 0x17, 0x15, 0x11, 0x11, 0x0f, 0x10, 0x10, 0x0e,
+ 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c,
+ 0x0d, 0x0c, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0c, 0x0c, 0x17, 0x15, 0x14,
+ 0x28, 0x20, 0x1c, 0x3a, 0x2b, 0x26, 0x51, 0x3b, 0x35, 0x5f, 0x44, 0x3d,
+ 0x60, 0x42, 0x34, 0x5c, 0x3b, 0x2c, 0x50, 0x2f, 0x1c, 0x51, 0x34, 0x1c,
+ 0x52, 0x46, 0x24, 0x9d, 0xa6, 0x7b, 0xbe, 0xdb, 0xa7, 0xb4, 0xdc, 0xa3,
+ 0xb2, 0xd3, 0xa7, 0xb2, 0xd2, 0xa8, 0xb0, 0xd2, 0xa5, 0xb1, 0xd2, 0xa5,
+ 0xb2, 0xd3, 0xa8, 0xb4, 0xd5, 0xaa, 0xb5, 0xd5, 0xac, 0xb7, 0xd8, 0xae,
+ 0xb8, 0xda, 0xb7, 0xbb, 0xdb, 0xbb, 0xbc, 0xdb, 0xbc, 0xbd, 0xdb, 0xbf,
+ 0xbe, 0xda, 0xc1, 0xbe, 0xd9, 0xc2, 0xbc, 0xd8, 0xc2, 0xb9, 0xd5, 0xbf,
+ 0xb9, 0xd4, 0xbd, 0xbd, 0xd6, 0xc4, 0xb9, 0xd1, 0xc6, 0xb6, 0xcb, 0xc2,
+ 0xaf, 0xbf, 0xb6, 0xa7, 0xae, 0xa2, 0x9d, 0x98, 0x88, 0x96, 0x87, 0x74,
+ 0x8c, 0x79, 0x5f, 0x8e, 0x70, 0x54, 0xa2, 0x7b, 0x5e, 0xb3, 0x8a, 0x6c,
+ 0xbc, 0x9a, 0x79, 0xc0, 0xa1, 0x82, 0xc4, 0xa3, 0x84, 0xc9, 0xa2, 0x83,
+ 0x34, 0x35, 0x2f, 0x32, 0x33, 0x2d, 0x37, 0x38, 0x32, 0x3d, 0x3e, 0x37,
+ 0x40, 0x40, 0x38, 0x45, 0x45, 0x3d, 0x49, 0x46, 0x3d, 0x52, 0x4e, 0x44,
+ 0x5c, 0x5b, 0x4c, 0x5c, 0x5a, 0x4b, 0x63, 0x61, 0x52, 0x68, 0x65, 0x56,
+ 0x64, 0x61, 0x51, 0x64, 0x63, 0x4f, 0x66, 0x65, 0x50, 0x68, 0x67, 0x52,
+ 0x67, 0x66, 0x51, 0x68, 0x68, 0x52, 0x65, 0x63, 0x50, 0x66, 0x63, 0x50,
+ 0x63, 0x60, 0x4f, 0x62, 0x60, 0x4f, 0x5b, 0x58, 0x47, 0x4e, 0x4b, 0x3c,
+ 0x48, 0x46, 0x39, 0x41, 0x3e, 0x33, 0x37, 0x34, 0x2d, 0x34, 0x31, 0x2e,
+ 0x2e, 0x2c, 0x2b, 0x29, 0x27, 0x28, 0x28, 0x26, 0x27, 0x22, 0x22, 0x23,
+ 0x22, 0x23, 0x25, 0x1d, 0x1e, 0x20, 0x18, 0x1c, 0x1b, 0x1b, 0x1f, 0x20,
+ 0x20, 0x23, 0x28, 0x1b, 0x1e, 0x23, 0x16, 0x19, 0x1d, 0x09, 0x0a, 0x0c,
+ 0x0a, 0x0b, 0x0b, 0x0f, 0x12, 0x10, 0x1a, 0x1c, 0x1b, 0x1d, 0x1f, 0x1e,
+ 0x17, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x09, 0x09, 0x09, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03,
+ 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x07, 0x06, 0x06, 0x08, 0x07,
+ 0x07, 0x09, 0x09, 0x09, 0x0b, 0x0a, 0x09, 0x0b, 0x0b, 0x06, 0x08, 0x07,
+ 0x06, 0x08, 0x07, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09, 0x08, 0x0a, 0x09,
+ 0x07, 0x08, 0x0a, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b,
+ 0x07, 0x08, 0x0b, 0x07, 0x08, 0x0b, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f,
+ 0x0e, 0x10, 0x0f, 0x10, 0x12, 0x11, 0x0d, 0x0f, 0x0e, 0x10, 0x12, 0x12,
+ 0x12, 0x15, 0x15, 0x11, 0x17, 0x13, 0x12, 0x19, 0x12, 0x11, 0x17, 0x13,
+ 0x10, 0x15, 0x19, 0x10, 0x15, 0x1a, 0x12, 0x16, 0x19, 0x1a, 0x1e, 0x1f,
+ 0x21, 0x31, 0x4d, 0x2c, 0x48, 0x67, 0x2b, 0x53, 0x75, 0x22, 0x57, 0x7a,
+ 0x1b, 0x56, 0x7b, 0x15, 0x4f, 0x74, 0x14, 0x48, 0x6c, 0x10, 0x3e, 0x62,
+ 0x17, 0x3d, 0x64, 0x18, 0x3e, 0x66, 0x15, 0x3b, 0x63, 0x16, 0x3c, 0x63,
+ 0x16, 0x3a, 0x5f, 0x18, 0x3b, 0x5b, 0x10, 0x31, 0x4e, 0x06, 0x26, 0x41,
+ 0x07, 0x22, 0x3b, 0x0b, 0x21, 0x38, 0x0e, 0x21, 0x35, 0x0e, 0x1f, 0x31,
+ 0x0b, 0x1d, 0x32, 0x0c, 0x1e, 0x35, 0x0c, 0x1d, 0x33, 0x0e, 0x1f, 0x34,
+ 0x0a, 0x21, 0x35, 0x0e, 0x20, 0x34, 0x38, 0x3f, 0x44, 0x71, 0x6a, 0x5b,
+ 0x91, 0x80, 0x6b, 0x6f, 0x62, 0x5c, 0x39, 0x3e, 0x46, 0x0f, 0x24, 0x33,
+ 0x0e, 0x21, 0x3d, 0x0b, 0x1e, 0x3a, 0x0b, 0x1b, 0x36, 0x0b, 0x19, 0x2a,
+ 0x09, 0x13, 0x1c, 0x0d, 0x16, 0x1a, 0x14, 0x1f, 0x23, 0x1a, 0x29, 0x30,
+ 0x17, 0x2a, 0x39, 0x10, 0x27, 0x40, 0x0f, 0x2a, 0x4d, 0x16, 0x2e, 0x52,
+ 0x14, 0x27, 0x41, 0x14, 0x24, 0x33, 0x17, 0x28, 0x31, 0x20, 0x32, 0x38,
+ 0x56, 0x4e, 0x44, 0x81, 0x71, 0x59, 0x7d, 0x71, 0x5c, 0x5d, 0x63, 0x60,
+ 0x34, 0x46, 0x58, 0x1b, 0x2d, 0x45, 0x18, 0x2a, 0x3e, 0x1c, 0x30, 0x40,
+ 0x1c, 0x2e, 0x3b, 0x17, 0x25, 0x2e, 0x13, 0x25, 0x2c, 0x16, 0x44, 0x5d,
+ 0x2c, 0x7a, 0xae, 0x27, 0x75, 0xb1, 0x33, 0x73, 0xae, 0x1f, 0x5b, 0x98,
+ 0x17, 0x51, 0x87, 0x15, 0x50, 0x7f, 0x12, 0x4b, 0x75, 0x14, 0x47, 0x6a,
+ 0x1a, 0x46, 0x64, 0x1c, 0x41, 0x5e, 0x1e, 0x40, 0x5b, 0x1f, 0x42, 0x5d,
+ 0x1c, 0x40, 0x58, 0x17, 0x3b, 0x53, 0x1a, 0x3c, 0x55, 0x1a, 0x39, 0x53,
+ 0x19, 0x38, 0x4f, 0x19, 0x37, 0x4b, 0x17, 0x34, 0x44, 0x13, 0x31, 0x3f,
+ 0x17, 0x34, 0x46, 0x1c, 0x31, 0x40, 0x0d, 0x19, 0x21, 0x04, 0x0a, 0x0c,
+ 0x06, 0x0a, 0x0b, 0x06, 0x0a, 0x0b, 0x06, 0x0a, 0x0a, 0x08, 0x0b, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b,
+ 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x09, 0x09, 0x07, 0x0a, 0x0a, 0x08,
+ 0x0a, 0x0a, 0x08, 0x09, 0x09, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x09, 0x0b, 0x0b, 0x0c, 0x0e, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x10,
+ 0x15, 0x19, 0x1b, 0x17, 0x1b, 0x1e, 0x0d, 0x12, 0x16, 0x0f, 0x16, 0x1b,
+ 0x1e, 0x27, 0x26, 0x37, 0x3e, 0x42, 0x49, 0x51, 0x5c, 0x4c, 0x53, 0x63,
+ 0x39, 0x41, 0x51, 0x2d, 0x35, 0x40, 0x30, 0x39, 0x3e, 0x2e, 0x38, 0x39,
+ 0x29, 0x2d, 0x35, 0x2e, 0x31, 0x38, 0x32, 0x35, 0x3a, 0x26, 0x29, 0x2c,
+ 0x1a, 0x1e, 0x21, 0x19, 0x1c, 0x21, 0x27, 0x2a, 0x31, 0x22, 0x24, 0x2c,
+ 0x1c, 0x20, 0x21, 0x1d, 0x23, 0x23, 0x29, 0x2e, 0x30, 0x2e, 0x33, 0x36,
+ 0x23, 0x29, 0x29, 0x21, 0x28, 0x27, 0x27, 0x2d, 0x2b, 0x26, 0x2a, 0x29,
+ 0x25, 0x29, 0x26, 0x26, 0x28, 0x26, 0x27, 0x29, 0x26, 0x27, 0x28, 0x25,
+ 0x2a, 0x2a, 0x28, 0x18, 0x18, 0x17, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03,
+ 0x05, 0x05, 0x05, 0x03, 0x03, 0x03, 0x07, 0x07, 0x05, 0x19, 0x19, 0x17,
+ 0x21, 0x21, 0x1f, 0x1f, 0x1f, 0x1d, 0x1a, 0x1a, 0x18, 0x18, 0x18, 0x16,
+ 0x19, 0x19, 0x16, 0x14, 0x14, 0x12, 0x10, 0x10, 0x0e, 0x0f, 0x0f, 0x0e,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x09, 0x0b, 0x08, 0x08, 0x08, 0x14, 0x11, 0x0e, 0x2d, 0x24, 0x1f,
+ 0x36, 0x27, 0x1f, 0x42, 0x2d, 0x26, 0x4c, 0x32, 0x2d, 0x58, 0x3d, 0x36,
+ 0x5e, 0x44, 0x36, 0x5c, 0x3a, 0x27, 0x5d, 0x37, 0x1f, 0x55, 0x3e, 0x1a,
+ 0x77, 0x80, 0x4f, 0xb9, 0xd6, 0xa0, 0xb7, 0xd8, 0xa7, 0xb6, 0xd4, 0xa8,
+ 0xb0, 0xd0, 0xa3, 0xb0, 0xd1, 0xa4, 0xaf, 0xd0, 0xa3, 0xb0, 0xd1, 0xa4,
+ 0xb0, 0xd1, 0xa4, 0xb0, 0xd1, 0xa6, 0xb4, 0xd7, 0xab, 0xb4, 0xd7, 0xad,
+ 0xb7, 0xd7, 0xb2, 0xb8, 0xd7, 0xb3, 0xb9, 0xd8, 0xb6, 0xbc, 0xdb, 0xbb,
+ 0xbd, 0xdc, 0xbd, 0xbc, 0xda, 0xbe, 0xbe, 0xdc, 0xc3, 0xbf, 0xdd, 0xc4,
+ 0xbf, 0xd9, 0xc0, 0xbd, 0xd9, 0xc3, 0xb9, 0xd4, 0xc5, 0xb8, 0xd4, 0xc8,
+ 0xbb, 0xd4, 0xcc, 0xbb, 0xce, 0xc7, 0xb1, 0xbb, 0xb4, 0xa0, 0xa5, 0x9e,
+ 0x91, 0x8f, 0x80, 0x88, 0x79, 0x66, 0x8b, 0x6c, 0x53, 0x9b, 0x73, 0x53,
+ 0xad, 0x87, 0x63, 0xb7, 0x95, 0x70, 0xc0, 0x9b, 0x79, 0xc5, 0x9c, 0x7c,
+ 0x32, 0x33, 0x2e, 0x34, 0x35, 0x2f, 0x37, 0x38, 0x32, 0x38, 0x39, 0x33,
+ 0x3c, 0x3c, 0x34, 0x46, 0x45, 0x3d, 0x4e, 0x4c, 0x42, 0x54, 0x50, 0x46,
+ 0x60, 0x5c, 0x4c, 0x63, 0x60, 0x4f, 0x63, 0x60, 0x4f, 0x66, 0x63, 0x50,
+ 0x67, 0x66, 0x52, 0x67, 0x66, 0x51, 0x6a, 0x6b, 0x55, 0x6c, 0x6e, 0x57,
+ 0x6a, 0x6c, 0x56, 0x61, 0x63, 0x4e, 0x5b, 0x5a, 0x46, 0x5e, 0x5d, 0x4a,
+ 0x5e, 0x5d, 0x4b, 0x5c, 0x59, 0x48, 0x56, 0x53, 0x42, 0x48, 0x45, 0x34,
+ 0x3e, 0x3c, 0x2e, 0x3b, 0x39, 0x2e, 0x36, 0x33, 0x2c, 0x30, 0x2f, 0x29,
+ 0x28, 0x27, 0x25, 0x24, 0x22, 0x24, 0x24, 0x23, 0x24, 0x1f, 0x20, 0x20,
+ 0x1e, 0x1f, 0x21, 0x1d, 0x1f, 0x1e, 0x16, 0x1a, 0x18, 0x1a, 0x1e, 0x1f,
+ 0x1f, 0x22, 0x27, 0x19, 0x1c, 0x21, 0x15, 0x19, 0x1c, 0x07, 0x0b, 0x0c,
+ 0x07, 0x09, 0x08, 0x09, 0x0b, 0x0a, 0x0b, 0x0d, 0x0c, 0x15, 0x17, 0x16,
+ 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x16, 0x16, 0x16, 0x11, 0x11, 0x11,
+ 0x0c, 0x0c, 0x0c, 0x05, 0x05, 0x06, 0x03, 0x03, 0x03, 0x05, 0x05, 0x06,
+ 0x04, 0x04, 0x06, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x08, 0x08, 0x06, 0x08, 0x07,
+ 0x06, 0x08, 0x07, 0x09, 0x0b, 0x0a, 0x07, 0x09, 0x08, 0x06, 0x07, 0x06,
+ 0x06, 0x08, 0x07, 0x07, 0x09, 0x08, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09,
+ 0x08, 0x09, 0x0b, 0x0a, 0x0b, 0x0d, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c,
+ 0x07, 0x08, 0x0a, 0x07, 0x08, 0x0a, 0x08, 0x09, 0x0b, 0x0a, 0x0b, 0x0d,
+ 0x0c, 0x0c, 0x0e, 0x0f, 0x10, 0x12, 0x10, 0x12, 0x13, 0x10, 0x11, 0x13,
+ 0x0e, 0x10, 0x11, 0x0e, 0x0f, 0x11, 0x0e, 0x0f, 0x10, 0x0e, 0x0f, 0x11,
+ 0x0d, 0x10, 0x0a, 0x0d, 0x0f, 0x0c, 0x0d, 0x0d, 0x0f, 0x0c, 0x0d, 0x0e,
+ 0x0a, 0x10, 0x10, 0x0a, 0x16, 0x18, 0x11, 0x21, 0x2c, 0x1f, 0x33, 0x49,
+ 0x29, 0x49, 0x74, 0x2e, 0x56, 0x81, 0x24, 0x54, 0x7d, 0x1d, 0x53, 0x7a,
+ 0x17, 0x4e, 0x75, 0x0e, 0x45, 0x68, 0x10, 0x40, 0x62, 0x10, 0x3c, 0x5e,
+ 0x18, 0x3f, 0x64, 0x19, 0x3f, 0x64, 0x14, 0x3b, 0x60, 0x14, 0x38, 0x5d,
+ 0x14, 0x35, 0x56, 0x10, 0x2d, 0x48, 0x0c, 0x24, 0x3c, 0x0c, 0x21, 0x38,
+ 0x0a, 0x20, 0x38, 0x0d, 0x1f, 0x35, 0x0f, 0x20, 0x32, 0x0e, 0x1f, 0x31,
+ 0x0c, 0x1e, 0x34, 0x0a, 0x1e, 0x36, 0x0c, 0x1e, 0x36, 0x0f, 0x1f, 0x37,
+ 0x0b, 0x1e, 0x38, 0x0c, 0x1e, 0x2d, 0x42, 0x4d, 0x3f, 0x8f, 0x89, 0x63,
+ 0x9e, 0x8c, 0x62, 0x76, 0x66, 0x52, 0x42, 0x47, 0x4a, 0x0e, 0x24, 0x33,
+ 0x0c, 0x1f, 0x3d, 0x0b, 0x1e, 0x3c, 0x0b, 0x1b, 0x36, 0x0b, 0x18, 0x2a,
+ 0x0a, 0x14, 0x1c, 0x0c, 0x16, 0x18, 0x14, 0x21, 0x24, 0x1a, 0x2a, 0x33,
+ 0x17, 0x2c, 0x3b, 0x12, 0x2c, 0x47, 0x14, 0x31, 0x56, 0x18, 0x32, 0x58,
+ 0x14, 0x27, 0x44, 0x17, 0x26, 0x35, 0x1d, 0x2c, 0x33, 0x19, 0x2b, 0x2e,
+ 0x1d, 0x24, 0x1d, 0x44, 0x43, 0x3a, 0x5e, 0x61, 0x62, 0x3a, 0x4c, 0x64,
+ 0x1e, 0x38, 0x5d, 0x13, 0x2a, 0x4a, 0x17, 0x29, 0x3c, 0x1b, 0x2f, 0x3d,
+ 0x15, 0x2f, 0x3e, 0x16, 0x28, 0x31, 0x13, 0x29, 0x33, 0x0f, 0x3c, 0x5c,
+ 0x23, 0x6a, 0xa2, 0x1c, 0x69, 0xa7, 0x1f, 0x66, 0xa2, 0x12, 0x59, 0x93,
+ 0x19, 0x51, 0x87, 0x19, 0x51, 0x80, 0x15, 0x4b, 0x72, 0x1a, 0x4a, 0x6a,
+ 0x1b, 0x45, 0x5f, 0x1b, 0x3e, 0x59, 0x20, 0x41, 0x5d, 0x1e, 0x40, 0x5d,
+ 0x1a, 0x3c, 0x56, 0x1a, 0x3c, 0x55, 0x19, 0x3b, 0x52, 0x14, 0x34, 0x4b,
+ 0x16, 0x35, 0x4a, 0x18, 0x35, 0x47, 0x15, 0x32, 0x43, 0x15, 0x31, 0x41,
+ 0x19, 0x2e, 0x3d, 0x0d, 0x1d, 0x26, 0x03, 0x0b, 0x0e, 0x05, 0x09, 0x08,
+ 0x0b, 0x0c, 0x0b, 0x09, 0x0b, 0x0a, 0x07, 0x09, 0x08, 0x09, 0x0b, 0x0a,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0e, 0x0e, 0x0f,
+ 0x13, 0x11, 0x13, 0x15, 0x13, 0x16, 0x19, 0x19, 0x1b, 0x22, 0x22, 0x24,
+ 0x2c, 0x2d, 0x2f, 0x35, 0x36, 0x3a, 0x3f, 0x43, 0x46, 0x49, 0x4c, 0x51,
+ 0x32, 0x35, 0x3f, 0x27, 0x2b, 0x36, 0x31, 0x37, 0x43, 0x4d, 0x53, 0x60,
+ 0x5d, 0x65, 0x72, 0x4f, 0x56, 0x66, 0x3c, 0x43, 0x53, 0x32, 0x39, 0x4a,
+ 0x2c, 0x2f, 0x3c, 0x2b, 0x30, 0x3b, 0x2c, 0x31, 0x37, 0x2d, 0x33, 0x37,
+ 0x2f, 0x34, 0x38, 0x28, 0x2e, 0x31, 0x27, 0x2c, 0x31, 0x25, 0x2a, 0x2f,
+ 0x1f, 0x25, 0x25, 0x24, 0x2a, 0x2a, 0x22, 0x28, 0x28, 0x26, 0x2b, 0x2c,
+ 0x28, 0x2d, 0x2d, 0x27, 0x2e, 0x2c, 0x28, 0x2e, 0x2c, 0x28, 0x2e, 0x2c,
+ 0x27, 0x2c, 0x27, 0x24, 0x27, 0x23, 0x28, 0x2a, 0x27, 0x2a, 0x2a, 0x28,
+ 0x29, 0x29, 0x27, 0x1b, 0x1b, 0x19, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x15, 0x15, 0x14,
+ 0x22, 0x22, 0x20, 0x1f, 0x1f, 0x1c, 0x19, 0x19, 0x17, 0x18, 0x18, 0x16,
+ 0x16, 0x16, 0x14, 0x13, 0x13, 0x11, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a,
+ 0x08, 0x0c, 0x0d, 0x0a, 0x0b, 0x09, 0x1e, 0x17, 0x11, 0x3b, 0x2b, 0x22,
+ 0x43, 0x2d, 0x22, 0x4f, 0x34, 0x2a, 0x52, 0x37, 0x2e, 0x4f, 0x34, 0x2e,
+ 0x57, 0x3e, 0x34, 0x59, 0x3d, 0x2a, 0x5b, 0x40, 0x21, 0x59, 0x52, 0x22,
+ 0xaa, 0xc0, 0x85, 0xb7, 0xdd, 0xa2, 0xb2, 0xd6, 0xa6, 0xb5, 0xd0, 0xa9,
+ 0xb0, 0xce, 0xa3, 0xad, 0xce, 0x9f, 0xae, 0xcf, 0xa0, 0xb0, 0xd1, 0xa2,
+ 0xb0, 0xd2, 0xa3, 0xb1, 0xd2, 0xa5, 0xb3, 0xd7, 0xaa, 0xb4, 0xd8, 0xac,
+ 0xb5, 0xd4, 0xad, 0xb6, 0xd6, 0xae, 0xb9, 0xda, 0xb3, 0xbc, 0xdc, 0xb7,
+ 0xbc, 0xdb, 0xb8, 0xb7, 0xd9, 0xb8, 0xb8, 0xd9, 0xba, 0xb9, 0xda, 0xbd,
+ 0xba, 0xd8, 0xbd, 0xba, 0xd9, 0xc2, 0xbc, 0xd9, 0xc9, 0xbe, 0xde, 0xd1,
+ 0xc1, 0xe0, 0xd8, 0xc3, 0xdf, 0xda, 0xbd, 0xd2, 0xcf, 0xaa, 0xbb, 0xb9,
+ 0x9b, 0xa2, 0x95, 0x8b, 0x8c, 0x77, 0x7e, 0x78, 0x5e, 0x7d, 0x69, 0x4e,
+ 0x8b, 0x69, 0x4e, 0xa3, 0x7b, 0x61, 0xb3, 0x8c, 0x6d, 0xba, 0x95, 0x73,
+ 0x30, 0x31, 0x2c, 0x30, 0x31, 0x2c, 0x3a, 0x3b, 0x35, 0x3c, 0x3d, 0x36,
+ 0x3f, 0x3f, 0x37, 0x46, 0x46, 0x3e, 0x50, 0x4d, 0x44, 0x51, 0x4d, 0x43,
+ 0x5e, 0x58, 0x49, 0x63, 0x60, 0x4f, 0x61, 0x5e, 0x4c, 0x64, 0x63, 0x4f,
+ 0x65, 0x64, 0x4f, 0x68, 0x67, 0x52, 0x6c, 0x6c, 0x56, 0x6a, 0x6c, 0x56,
+ 0x68, 0x6a, 0x55, 0x5f, 0x61, 0x4c, 0x5b, 0x5c, 0x48, 0x5e, 0x5d, 0x4b,
+ 0x5d, 0x5c, 0x4b, 0x54, 0x52, 0x43, 0x4e, 0x4b, 0x3c, 0x43, 0x40, 0x31,
+ 0x3d, 0x3a, 0x30, 0x3b, 0x38, 0x2f, 0x33, 0x33, 0x2b, 0x2c, 0x2c, 0x26,
+ 0x29, 0x28, 0x24, 0x23, 0x23, 0x21, 0x23, 0x23, 0x23, 0x1f, 0x1f, 0x1f,
+ 0x1c, 0x1c, 0x1d, 0x1a, 0x1c, 0x1b, 0x14, 0x18, 0x17, 0x18, 0x1c, 0x1d,
+ 0x1c, 0x20, 0x25, 0x1a, 0x1e, 0x23, 0x17, 0x1a, 0x1f, 0x06, 0x0a, 0x0b,
+ 0x07, 0x07, 0x07, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x10, 0x0f, 0x13, 0x15, 0x14, 0x1a, 0x1c, 0x1b, 0x1e, 0x20, 0x1f,
+ 0x1a, 0x1b, 0x1b, 0x0b, 0x0d, 0x0c, 0x06, 0x07, 0x08, 0x04, 0x04, 0x06,
+ 0x04, 0x04, 0x06, 0x05, 0x05, 0x07, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x05, 0x06, 0x05, 0x05, 0x07, 0x06, 0x05, 0x07, 0x06,
+ 0x07, 0x07, 0x07, 0x09, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x07, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x09,
+ 0x08, 0x0a, 0x09, 0x08, 0x0a, 0x09, 0x08, 0x0a, 0x0a, 0x07, 0x09, 0x08,
+ 0x08, 0x09, 0x09, 0x08, 0x0a, 0x09, 0x06, 0x08, 0x07, 0x08, 0x0a, 0x09,
+ 0x0f, 0x0f, 0x11, 0x18, 0x1a, 0x1b, 0x18, 0x1c, 0x1d, 0x13, 0x17, 0x17,
+ 0x0d, 0x10, 0x12, 0x0d, 0x0e, 0x10, 0x0c, 0x0d, 0x0f, 0x0f, 0x0f, 0x10,
+ 0x0c, 0x0e, 0x0a, 0x0e, 0x0e, 0x0e, 0x12, 0x0d, 0x11, 0x0f, 0x0d, 0x10,
+ 0x12, 0x16, 0x1a, 0x18, 0x2b, 0x38, 0x28, 0x47, 0x65, 0x2c, 0x54, 0x7c,
+ 0x26, 0x57, 0x80, 0x25, 0x55, 0x7f, 0x1e, 0x4e, 0x78, 0x17, 0x46, 0x70,
+ 0x13, 0x41, 0x6a, 0x0f, 0x3d, 0x63, 0x12, 0x40, 0x62, 0x12, 0x40, 0x61,
+ 0x14, 0x3f, 0x61, 0x14, 0x3f, 0x5f, 0x14, 0x3b, 0x5a, 0x10, 0x32, 0x50,
+ 0x0a, 0x27, 0x43, 0x09, 0x21, 0x39, 0x0e, 0x20, 0x35, 0x10, 0x1e, 0x33,
+ 0x0c, 0x1d, 0x36, 0x0e, 0x1e, 0x36, 0x0e, 0x1d, 0x32, 0x0d, 0x1f, 0x32,
+ 0x0d, 0x1e, 0x36, 0x09, 0x1d, 0x36, 0x0b, 0x20, 0x39, 0x0d, 0x1f, 0x38,
+ 0x10, 0x1e, 0x39, 0x0c, 0x1c, 0x2e, 0x13, 0x21, 0x1a, 0x49, 0x4d, 0x31,
+ 0x77, 0x71, 0x55, 0x4a, 0x47, 0x40, 0x1e, 0x29, 0x35, 0x09, 0x22, 0x34,
+ 0x0c, 0x20, 0x3d, 0x0c, 0x20, 0x3c, 0x0e, 0x1e, 0x37, 0x0d, 0x18, 0x2a,
+ 0x0b, 0x13, 0x1c, 0x0e, 0x18, 0x1b, 0x16, 0x23, 0x28, 0x19, 0x2a, 0x33,
+ 0x16, 0x30, 0x3f, 0x13, 0x2f, 0x4a, 0x16, 0x34, 0x58, 0x17, 0x32, 0x57,
+ 0x17, 0x2a, 0x46, 0x15, 0x25, 0x33, 0x19, 0x28, 0x2e, 0x15, 0x27, 0x2c,
+ 0x0d, 0x20, 0x1c, 0x11, 0x21, 0x1d, 0x23, 0x37, 0x3d, 0x1d, 0x3c, 0x58,
+ 0x10, 0x34, 0x59, 0x11, 0x2f, 0x4b, 0x15, 0x2c, 0x3d, 0x17, 0x30, 0x3b,
+ 0x15, 0x30, 0x3c, 0x17, 0x2a, 0x30, 0x11, 0x2b, 0x3f, 0x2f, 0x61, 0x92,
+ 0x35, 0x7a, 0xc1, 0x17, 0x62, 0xa8, 0x16, 0x62, 0x9c, 0x0c, 0x55, 0x85,
+ 0x17, 0x4f, 0x85, 0x19, 0x51, 0x80, 0x1b, 0x51, 0x77, 0x19, 0x49, 0x67,
+ 0x19, 0x42, 0x5c, 0x1c, 0x3f, 0x5a, 0x1a, 0x3b, 0x58, 0x18, 0x3b, 0x58,
+ 0x1a, 0x3c, 0x58, 0x1b, 0x3b, 0x56, 0x18, 0x37, 0x50, 0x17, 0x36, 0x4c,
+ 0x16, 0x33, 0x48, 0x12, 0x2d, 0x42, 0x15, 0x30, 0x44, 0x17, 0x30, 0x44,
+ 0x13, 0x22, 0x2d, 0x04, 0x0c, 0x13, 0x02, 0x06, 0x07, 0x08, 0x08, 0x06,
+ 0x0c, 0x0b, 0x09, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08,
+ 0x14, 0x15, 0x19, 0x1b, 0x1c, 0x20, 0x0e, 0x0f, 0x11, 0x09, 0x0a, 0x0c,
+ 0x06, 0x07, 0x09, 0x0c, 0x0d, 0x0f, 0x14, 0x13, 0x16, 0x20, 0x1f, 0x23,
+ 0x2b, 0x25, 0x27, 0x2d, 0x26, 0x27, 0x2f, 0x2b, 0x2a, 0x34, 0x31, 0x30,
+ 0x45, 0x43, 0x44, 0x4a, 0x48, 0x4a, 0x4d, 0x4d, 0x4f, 0x5f, 0x5e, 0x63,
+ 0x4e, 0x4e, 0x51, 0x3c, 0x3d, 0x41, 0x49, 0x4c, 0x53, 0x6c, 0x6f, 0x79,
+ 0x89, 0x8d, 0x98, 0x5f, 0x63, 0x6f, 0x5a, 0x5e, 0x69, 0x47, 0x4b, 0x55,
+ 0x41, 0x44, 0x53, 0x32, 0x38, 0x46, 0x30, 0x37, 0x42, 0x2b, 0x34, 0x3b,
+ 0x2c, 0x35, 0x38, 0x2f, 0x37, 0x39, 0x32, 0x3a, 0x3a, 0x2c, 0x33, 0x32,
+ 0x22, 0x28, 0x28, 0x22, 0x28, 0x27, 0x23, 0x29, 0x27, 0x2a, 0x2f, 0x2e,
+ 0x29, 0x2d, 0x2c, 0x29, 0x2f, 0x2d, 0x26, 0x2c, 0x2a, 0x25, 0x2b, 0x29,
+ 0x26, 0x2b, 0x28, 0x26, 0x2b, 0x27, 0x28, 0x2a, 0x27, 0x2c, 0x2c, 0x2a,
+ 0x2a, 0x2a, 0x28, 0x22, 0x22, 0x20, 0x0a, 0x0a, 0x0a, 0x04, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x0f, 0x0f, 0x0f,
+ 0x1e, 0x1e, 0x1d, 0x1a, 0x1a, 0x18, 0x18, 0x18, 0x16, 0x17, 0x17, 0x16,
+ 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d,
+ 0x09, 0x0d, 0x10, 0x0e, 0x0d, 0x0b, 0x25, 0x1a, 0x13, 0x42, 0x2e, 0x22,
+ 0x50, 0x34, 0x26, 0x5d, 0x40, 0x32, 0x6f, 0x51, 0x45, 0x66, 0x49, 0x3f,
+ 0x63, 0x4a, 0x46, 0x5e, 0x48, 0x3a, 0x44, 0x3a, 0x19, 0x78, 0x80, 0x4d,
+ 0xbf, 0xda, 0x9c, 0xb7, 0xdb, 0x9f, 0xb5, 0xd5, 0xa4, 0xb4, 0xce, 0xa6,
+ 0xb0, 0xcd, 0x9f, 0xac, 0xcc, 0x9d, 0xae, 0xce, 0x9f, 0xb0, 0xd0, 0xa1,
+ 0xb1, 0xd2, 0xa3, 0xb2, 0xd3, 0xa5, 0xb2, 0xd6, 0xa7, 0xb2, 0xd6, 0xa8,
+ 0xb5, 0xd5, 0xaa, 0xb6, 0xd5, 0xac, 0xb7, 0xd7, 0xad, 0xb9, 0xd9, 0xb0,
+ 0xba, 0xda, 0xb3, 0xb6, 0xd8, 0xb3, 0xb6, 0xd9, 0xb5, 0xb7, 0xd9, 0xb8,
+ 0xb7, 0xd9, 0xbf, 0xb9, 0xd9, 0xc3, 0xbc, 0xdb, 0xca, 0xbf, 0xdf, 0xd2,
+ 0xc6, 0xe7, 0xdc, 0xc8, 0xe5, 0xdc, 0xbf, 0xd6, 0xcf, 0xac, 0xbe, 0xb5,
+ 0x9d, 0xac, 0x94, 0x8f, 0x9e, 0x84, 0x7e, 0x8a, 0x76, 0x6a, 0x6f, 0x60,
+ 0x62, 0x58, 0x4c, 0x77, 0x5d, 0x50, 0x94, 0x73, 0x5e, 0xa6, 0x83, 0x65,
+ 0x2d, 0x2e, 0x29, 0x2b, 0x2c, 0x27, 0x35, 0x36, 0x31, 0x3a, 0x3b, 0x34,
+ 0x3d, 0x3d, 0x35, 0x44, 0x44, 0x3c, 0x4e, 0x4b, 0x42, 0x52, 0x4e, 0x45,
+ 0x5b, 0x56, 0x48, 0x64, 0x61, 0x50, 0x66, 0x63, 0x52, 0x65, 0x64, 0x50,
+ 0x5f, 0x5e, 0x4a, 0x66, 0x65, 0x51, 0x6a, 0x68, 0x55, 0x61, 0x60, 0x4c,
+ 0x62, 0x61, 0x4d, 0x63, 0x63, 0x50, 0x61, 0x60, 0x4e, 0x5c, 0x5a, 0x4b,
+ 0x50, 0x4e, 0x41, 0x4a, 0x48, 0x3c, 0x40, 0x3e, 0x32, 0x39, 0x36, 0x2a,
+ 0x38, 0x36, 0x2f, 0x34, 0x32, 0x2e, 0x2e, 0x2e, 0x28, 0x2a, 0x29, 0x25,
+ 0x25, 0x25, 0x21, 0x23, 0x23, 0x20, 0x22, 0x22, 0x20, 0x1c, 0x1c, 0x1c,
+ 0x1a, 0x1a, 0x1a, 0x19, 0x1b, 0x1a, 0x16, 0x19, 0x18, 0x15, 0x19, 0x19,
+ 0x19, 0x1e, 0x23, 0x1b, 0x20, 0x26, 0x19, 0x1e, 0x22, 0x08, 0x0c, 0x0f,
+ 0x04, 0x05, 0x05, 0x1a, 0x1a, 0x1a, 0x11, 0x10, 0x11, 0x0c, 0x0c, 0x0c,
+ 0x07, 0x09, 0x08, 0x09, 0x0b, 0x0a, 0x0f, 0x11, 0x10, 0x18, 0x1a, 0x19,
+ 0x1e, 0x20, 0x1f, 0x1a, 0x1c, 0x1b, 0x13, 0x14, 0x16, 0x0a, 0x0b, 0x0f,
+ 0x04, 0x03, 0x07, 0x04, 0x04, 0x06, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x06, 0x07, 0x07, 0x06, 0x08, 0x07, 0x06, 0x08, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07, 0x08, 0x08, 0x09, 0x09,
+ 0x07, 0x0a, 0x08, 0x07, 0x09, 0x08, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09,
+ 0x09, 0x0b, 0x0a, 0x08, 0x0a, 0x09, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09,
+ 0x10, 0x12, 0x12, 0x21, 0x25, 0x24, 0x21, 0x27, 0x25, 0x15, 0x1c, 0x1a,
+ 0x10, 0x16, 0x15, 0x0d, 0x11, 0x10, 0x0e, 0x10, 0x0f, 0x10, 0x11, 0x11,
+ 0x0c, 0x0f, 0x14, 0x0c, 0x0e, 0x10, 0x0f, 0x11, 0x11, 0x13, 0x19, 0x21,
+ 0x23, 0x33, 0x48, 0x2b, 0x49, 0x6c, 0x2a, 0x58, 0x83, 0x25, 0x5a, 0x86,
+ 0x20, 0x57, 0x7d, 0x1c, 0x4d, 0x75, 0x17, 0x43, 0x6c, 0x15, 0x3c, 0x67,
+ 0x16, 0x3b, 0x64, 0x15, 0x3c, 0x63, 0x13, 0x3e, 0x60, 0x14, 0x40, 0x63,
+ 0x15, 0x3f, 0x5f, 0x13, 0x39, 0x58, 0x0e, 0x30, 0x4b, 0x07, 0x25, 0x3d,
+ 0x05, 0x1e, 0x34, 0x0b, 0x1e, 0x34, 0x0f, 0x1f, 0x34, 0x10, 0x20, 0x35,
+ 0x0e, 0x1f, 0x38, 0x0e, 0x1e, 0x37, 0x0f, 0x1f, 0x33, 0x0e, 0x1f, 0x33,
+ 0x10, 0x22, 0x39, 0x0c, 0x1f, 0x39, 0x0a, 0x1e, 0x37, 0x0a, 0x1c, 0x35,
+ 0x0d, 0x1b, 0x32, 0x0f, 0x1b, 0x31, 0x09, 0x15, 0x22, 0x0c, 0x15, 0x17,
+ 0x1c, 0x24, 0x26, 0x20, 0x29, 0x39, 0x13, 0x24, 0x3a, 0x0b, 0x24, 0x36,
+ 0x0b, 0x1f, 0x3a, 0x0b, 0x1f, 0x3a, 0x0f, 0x1f, 0x38, 0x0e, 0x19, 0x29,
+ 0x0d, 0x15, 0x1c, 0x12, 0x1b, 0x20, 0x17, 0x26, 0x2c, 0x18, 0x2b, 0x35,
+ 0x15, 0x2e, 0x3f, 0x16, 0x32, 0x4c, 0x13, 0x31, 0x53, 0x16, 0x32, 0x52,
+ 0x16, 0x2c, 0x43, 0x16, 0x27, 0x34, 0x18, 0x29, 0x31, 0x14, 0x27, 0x2e,
+ 0x13, 0x20, 0x26, 0x12, 0x1d, 0x21, 0x16, 0x28, 0x33, 0x18, 0x38, 0x52,
+ 0x12, 0x39, 0x59, 0x15, 0x36, 0x53, 0x18, 0x35, 0x52, 0x15, 0x33, 0x52,
+ 0x17, 0x29, 0x43, 0x1a, 0x28, 0x34, 0x10, 0x32, 0x45, 0x3c, 0x7c, 0xa8,
+ 0x30, 0x7b, 0xba, 0x1c, 0x68, 0xac, 0x1a, 0x60, 0xa0, 0x13, 0x4c, 0x82,
+ 0x16, 0x4b, 0x81, 0x16, 0x4c, 0x7c, 0x17, 0x4b, 0x71, 0x14, 0x42, 0x62,
+ 0x1c, 0x42, 0x5f, 0x1d, 0x41, 0x5b, 0x17, 0x3b, 0x55, 0x18, 0x3c, 0x57,
+ 0x19, 0x39, 0x55, 0x17, 0x35, 0x4f, 0x19, 0x37, 0x4f, 0x16, 0x32, 0x48,
+ 0x15, 0x2f, 0x44, 0x17, 0x30, 0x46, 0x12, 0x2b, 0x42, 0x10, 0x26, 0x3e,
+ 0x0b, 0x16, 0x20, 0x05, 0x09, 0x10, 0x07, 0x07, 0x09, 0x07, 0x06, 0x04,
+ 0x08, 0x06, 0x07, 0x09, 0x08, 0x09, 0x08, 0x08, 0x0a, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x0d, 0x11, 0x14, 0x1b, 0x1f, 0x22, 0x10, 0x12, 0x15, 0x0c, 0x0c, 0x0f,
+ 0x1b, 0x1b, 0x1d, 0x25, 0x25, 0x27, 0x2f, 0x2d, 0x30, 0x34, 0x31, 0x36,
+ 0x34, 0x2b, 0x2c, 0x36, 0x2d, 0x2e, 0x31, 0x2b, 0x2a, 0x2f, 0x2c, 0x2b,
+ 0x31, 0x30, 0x2e, 0x2d, 0x2b, 0x2c, 0x26, 0x24, 0x27, 0x25, 0x23, 0x26,
+ 0x29, 0x27, 0x29, 0x2a, 0x2a, 0x29, 0x37, 0x38, 0x34, 0x56, 0x58, 0x54,
+ 0x62, 0x64, 0x60, 0x41, 0x42, 0x42, 0x4f, 0x50, 0x54, 0x4f, 0x4f, 0x56,
+ 0x5e, 0x61, 0x6d, 0x3e, 0x45, 0x53, 0x3f, 0x47, 0x54, 0x32, 0x3a, 0x47,
+ 0x30, 0x39, 0x42, 0x2f, 0x38, 0x3c, 0x32, 0x3b, 0x39, 0x2a, 0x33, 0x2f,
+ 0x20, 0x26, 0x26, 0x24, 0x28, 0x28, 0x2e, 0x32, 0x30, 0x33, 0x36, 0x35,
+ 0x28, 0x2c, 0x2b, 0x28, 0x2c, 0x2b, 0x26, 0x2a, 0x2a, 0x25, 0x2b, 0x2a,
+ 0x25, 0x2a, 0x28, 0x28, 0x2c, 0x2a, 0x2a, 0x2c, 0x2a, 0x2a, 0x2c, 0x29,
+ 0x27, 0x28, 0x26, 0x26, 0x26, 0x26, 0x0e, 0x0f, 0x0f, 0x04, 0x05, 0x07,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x05, 0x09, 0x09, 0x0a,
+ 0x1b, 0x1b, 0x1b, 0x1a, 0x1a, 0x1a, 0x12, 0x12, 0x10, 0x11, 0x11, 0x10,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c,
+ 0x07, 0x0b, 0x0c, 0x0e, 0x0d, 0x0b, 0x29, 0x1c, 0x14, 0x46, 0x2f, 0x23,
+ 0x5d, 0x3f, 0x2f, 0x68, 0x47, 0x36, 0x7c, 0x5b, 0x4a, 0x88, 0x67, 0x57,
+ 0x83, 0x63, 0x5f, 0x6c, 0x5a, 0x4a, 0x44, 0x46, 0x23, 0xa6, 0xb6, 0x82,
+ 0xbe, 0xd9, 0x9d, 0xb9, 0xd7, 0x9e, 0xb5, 0xd1, 0xa0, 0xb1, 0xcd, 0xa1,
+ 0xaf, 0xcb, 0x9b, 0xad, 0xca, 0x9a, 0xae, 0xcd, 0x9c, 0xb0, 0xcf, 0x9e,
+ 0xb0, 0xd0, 0xa0, 0xb3, 0xd4, 0xa4, 0xb3, 0xd5, 0xa6, 0xb2, 0xd4, 0xa7,
+ 0xb4, 0xd3, 0xa9, 0xb6, 0xd5, 0xa9, 0xb7, 0xd8, 0xab, 0xb7, 0xd9, 0xac,
+ 0xb8, 0xd9, 0xae, 0xb8, 0xd9, 0xb0, 0xb8, 0xda, 0xb4, 0xb8, 0xda, 0xb7,
+ 0xb8, 0xdc, 0xbf, 0xba, 0xdc, 0xc3, 0xbd, 0xdd, 0xca, 0xc7, 0xe6, 0xd7,
+ 0xc9, 0xe8, 0xd9, 0xc2, 0xdf, 0xcf, 0xba, 0xd1, 0xc0, 0xa9, 0xbc, 0xa7,
+ 0x9a, 0xb2, 0x90, 0x8e, 0xa2, 0x89, 0x79, 0x8b, 0x7f, 0x5d, 0x70, 0x70,
+ 0x49, 0x59, 0x5b, 0x49, 0x4c, 0x4b, 0x64, 0x51, 0x46, 0x88, 0x63, 0x53,
+ 0x28, 0x29, 0x26, 0x2b, 0x2c, 0x27, 0x30, 0x31, 0x2c, 0x32, 0x33, 0x2d,
+ 0x37, 0x38, 0x30, 0x3d, 0x3d, 0x35, 0x46, 0x43, 0x3a, 0x4e, 0x4a, 0x41,
+ 0x52, 0x4d, 0x41, 0x5a, 0x56, 0x47, 0x5f, 0x5d, 0x4c, 0x64, 0x63, 0x51,
+ 0x62, 0x61, 0x4e, 0x64, 0x63, 0x51, 0x62, 0x5f, 0x50, 0x62, 0x5e, 0x4f,
+ 0x5e, 0x5b, 0x4a, 0x5f, 0x5c, 0x4b, 0x5c, 0x59, 0x49, 0x4f, 0x4c, 0x3f,
+ 0x43, 0x41, 0x35, 0x38, 0x35, 0x2c, 0x29, 0x29, 0x21, 0x24, 0x23, 0x1e,
+ 0x23, 0x22, 0x1e, 0x25, 0x24, 0x20, 0x2d, 0x2c, 0x28, 0x2b, 0x2b, 0x26,
+ 0x24, 0x25, 0x20, 0x24, 0x24, 0x21, 0x20, 0x21, 0x1f, 0x1d, 0x1f, 0x1c,
+ 0x1b, 0x1b, 0x1b, 0x17, 0x19, 0x18, 0x15, 0x19, 0x18, 0x14, 0x18, 0x19,
+ 0x14, 0x19, 0x1e, 0x19, 0x1e, 0x24, 0x1a, 0x1f, 0x24, 0x0a, 0x0f, 0x12,
+ 0x06, 0x06, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0a, 0x0c, 0x0b, 0x0c, 0x0e, 0x0d, 0x0c, 0x0e, 0x0d, 0x0d, 0x0f, 0x0e,
+ 0x11, 0x14, 0x13, 0x1e, 0x1f, 0x21, 0x26, 0x27, 0x2b, 0x1d, 0x1e, 0x22,
+ 0x0f, 0x0e, 0x14, 0x08, 0x07, 0x0b, 0x04, 0x03, 0x06, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x05, 0x07, 0x06, 0x05, 0x07, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x05, 0x07, 0x05, 0x09, 0x0b, 0x0a, 0x09, 0x0b, 0x0a, 0x08, 0x0a, 0x09,
+ 0x09, 0x0b, 0x0a, 0x06, 0x08, 0x07, 0x06, 0x08, 0x07, 0x06, 0x08, 0x07,
+ 0x0d, 0x11, 0x10, 0x21, 0x27, 0x25, 0x27, 0x2e, 0x2c, 0x20, 0x2a, 0x26,
+ 0x1b, 0x24, 0x21, 0x12, 0x18, 0x16, 0x10, 0x14, 0x13, 0x11, 0x13, 0x12,
+ 0x0c, 0x0f, 0x14, 0x0a, 0x12, 0x19, 0x11, 0x22, 0x2d, 0x20, 0x3b, 0x53,
+ 0x2e, 0x52, 0x78, 0x28, 0x55, 0x82, 0x21, 0x54, 0x81, 0x1c, 0x53, 0x7d,
+ 0x1d, 0x4b, 0x75, 0x18, 0x44, 0x6d, 0x12, 0x3e, 0x67, 0x13, 0x3d, 0x65,
+ 0x13, 0x3c, 0x62, 0x14, 0x3c, 0x60, 0x14, 0x3c, 0x60, 0x14, 0x3c, 0x5f,
+ 0x13, 0x35, 0x56, 0x10, 0x2c, 0x4b, 0x0a, 0x22, 0x3c, 0x07, 0x1c, 0x30,
+ 0x0b, 0x1e, 0x2f, 0x0e, 0x1f, 0x31, 0x0d, 0x1f, 0x33, 0x0c, 0x21, 0x36,
+ 0x0d, 0x1f, 0x37, 0x0f, 0x1f, 0x35, 0x10, 0x21, 0x34, 0x0f, 0x21, 0x32,
+ 0x0d, 0x21, 0x37, 0x0a, 0x1f, 0x37, 0x09, 0x1d, 0x35, 0x0d, 0x1e, 0x36,
+ 0x0b, 0x1f, 0x33, 0x0c, 0x19, 0x2f, 0x0c, 0x11, 0x22, 0x0d, 0x10, 0x18,
+ 0x0c, 0x17, 0x1d, 0x11, 0x21, 0x33, 0x13, 0x26, 0x3b, 0x12, 0x25, 0x35,
+ 0x0c, 0x20, 0x38, 0x0d, 0x21, 0x3a, 0x0e, 0x1f, 0x36, 0x0d, 0x18, 0x27,
+ 0x10, 0x19, 0x20, 0x16, 0x20, 0x24, 0x19, 0x28, 0x30, 0x19, 0x2d, 0x39,
+ 0x17, 0x30, 0x43, 0x14, 0x32, 0x4c, 0x13, 0x32, 0x52, 0x13, 0x30, 0x4d,
+ 0x14, 0x2a, 0x3f, 0x17, 0x2a, 0x35, 0x17, 0x29, 0x33, 0x14, 0x26, 0x32,
+ 0x15, 0x21, 0x30, 0x17, 0x1f, 0x2e, 0x1a, 0x2c, 0x41, 0x19, 0x39, 0x5b,
+ 0x15, 0x39, 0x5e, 0x20, 0x3e, 0x61, 0x21, 0x3f, 0x62, 0x1a, 0x3a, 0x65,
+ 0x1b, 0x2c, 0x4f, 0x1c, 0x27, 0x36, 0x0c, 0x30, 0x3f, 0x20, 0x64, 0x87,
+ 0x30, 0x7c, 0xae, 0x2f, 0x78, 0xb6, 0x1d, 0x5d, 0x9f, 0x1b, 0x4d, 0x88,
+ 0x17, 0x4a, 0x7d, 0x13, 0x46, 0x74, 0x15, 0x44, 0x6c, 0x1a, 0x44, 0x66,
+ 0x1c, 0x3f, 0x5c, 0x19, 0x3b, 0x55, 0x1b, 0x3d, 0x55, 0x19, 0x3d, 0x54,
+ 0x18, 0x36, 0x50, 0x18, 0x34, 0x4c, 0x18, 0x34, 0x49, 0x14, 0x2f, 0x42,
+ 0x17, 0x2f, 0x44, 0x16, 0x2c, 0x43, 0x0d, 0x24, 0x3c, 0x0f, 0x22, 0x3c,
+ 0x06, 0x0f, 0x1a, 0x01, 0x06, 0x0b, 0x07, 0x08, 0x09, 0x08, 0x07, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x06, 0x08, 0x07, 0x09, 0x0a, 0x0c, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x0e, 0x0e, 0x20, 0x1e, 0x1e,
+ 0x39, 0x35, 0x36, 0x36, 0x31, 0x32, 0x35, 0x2f, 0x31, 0x3f, 0x36, 0x39,
+ 0x39, 0x31, 0x34, 0x2f, 0x29, 0x2b, 0x29, 0x25, 0x24, 0x1d, 0x1b, 0x1c,
+ 0x17, 0x17, 0x18, 0x19, 0x19, 0x1c, 0x1b, 0x19, 0x1d, 0x1d, 0x1b, 0x20,
+ 0x20, 0x1d, 0x23, 0x20, 0x1f, 0x21, 0x21, 0x21, 0x1f, 0x27, 0x28, 0x25,
+ 0x2d, 0x2e, 0x2a, 0x35, 0x35, 0x34, 0x40, 0x40, 0x43, 0x4c, 0x49, 0x4f,
+ 0x48, 0x4d, 0x53, 0x5c, 0x63, 0x6f, 0x64, 0x6c, 0x7c, 0x41, 0x49, 0x5c,
+ 0x34, 0x3c, 0x4e, 0x32, 0x3a, 0x46, 0x2b, 0x34, 0x38, 0x27, 0x2f, 0x2e,
+ 0x27, 0x2b, 0x2a, 0x2b, 0x2e, 0x2d, 0x34, 0x36, 0x34, 0x3d, 0x3f, 0x3c,
+ 0x2b, 0x2d, 0x2b, 0x28, 0x2a, 0x2a, 0x27, 0x2a, 0x2a, 0x26, 0x2a, 0x2a,
+ 0x25, 0x29, 0x28, 0x26, 0x2a, 0x29, 0x26, 0x28, 0x27, 0x27, 0x29, 0x28,
+ 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x13, 0x14, 0x16, 0x07, 0x08, 0x09,
+ 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x05, 0x08, 0x08, 0x0a,
+ 0x19, 0x19, 0x1a, 0x19, 0x19, 0x19, 0x11, 0x11, 0x0f, 0x11, 0x11, 0x0f,
+ 0x0d, 0x0f, 0x0e, 0x0e, 0x10, 0x0f, 0x0e, 0x10, 0x0f, 0x0d, 0x0f, 0x0e,
+ 0x0b, 0x0d, 0x0c, 0x09, 0x0b, 0x0a, 0x0c, 0x0e, 0x0d, 0x09, 0x0c, 0x0b,
+ 0x05, 0x07, 0x08, 0x10, 0x0d, 0x0b, 0x2d, 0x20, 0x19, 0x4a, 0x34, 0x28,
+ 0x6a, 0x4d, 0x3b, 0x7c, 0x59, 0x45, 0x82, 0x5d, 0x47, 0x8d, 0x69, 0x54,
+ 0x8e, 0x69, 0x5c, 0x73, 0x5b, 0x45, 0x7a, 0x76, 0x52, 0xb8, 0xc4, 0x94,
+ 0xb9, 0xd0, 0x9a, 0xb3, 0xcf, 0x9a, 0xb2, 0xcd, 0x9c, 0xac, 0xc7, 0x9a,
+ 0xac, 0xc8, 0x98, 0xae, 0xc9, 0x99, 0xaf, 0xcc, 0x9b, 0xb1, 0xcf, 0x9d,
+ 0xb1, 0xce, 0x9e, 0xb2, 0xd1, 0xa1, 0xb1, 0xd2, 0xa2, 0xb3, 0xd4, 0xa5,
+ 0xb3, 0xd3, 0xa7, 0xb4, 0xd3, 0xa7, 0xb6, 0xd6, 0xa7, 0xb5, 0xd6, 0xa7,
+ 0xb7, 0xd8, 0xaa, 0xba, 0xda, 0xaf, 0xba, 0xda, 0xb4, 0xba, 0xda, 0xb5,
+ 0xb8, 0xdc, 0xb6, 0xbd, 0xde, 0xbf, 0xc8, 0xe5, 0xce, 0xcf, 0xec, 0xda,
+ 0xc6, 0xe3, 0xd2, 0xbb, 0xd9, 0xc3, 0xb2, 0xcd, 0xb0, 0xa4, 0xbc, 0x9c,
+ 0x95, 0xaf, 0x91, 0x82, 0x9a, 0x87, 0x6d, 0x83, 0x80, 0x56, 0x6f, 0x78,
+ 0x41, 0x5b, 0x68, 0x37, 0x45, 0x4f, 0x3a, 0x32, 0x34, 0x4c, 0x37, 0x32,
+ 0x25, 0x25, 0x23, 0x2a, 0x2b, 0x28, 0x2c, 0x2d, 0x28, 0x2d, 0x2e, 0x28,
+ 0x30, 0x30, 0x28, 0x36, 0x36, 0x2e, 0x3d, 0x3a, 0x31, 0x45, 0x41, 0x38,
+ 0x4b, 0x47, 0x3d, 0x51, 0x4e, 0x41, 0x4e, 0x4c, 0x3d, 0x5a, 0x59, 0x49,
+ 0x5d, 0x5c, 0x4a, 0x5f, 0x5c, 0x4d, 0x5d, 0x5a, 0x4a, 0x5d, 0x57, 0x4a,
+ 0x59, 0x52, 0x44, 0x57, 0x52, 0x41, 0x4d, 0x4a, 0x3c, 0x41, 0x3d, 0x32,
+ 0x31, 0x2f, 0x26, 0x22, 0x21, 0x1c, 0x1f, 0x1e, 0x1a, 0x1b, 0x1a, 0x16,
+ 0x15, 0x13, 0x13, 0x17, 0x15, 0x14, 0x25, 0x24, 0x22, 0x2c, 0x2b, 0x27,
+ 0x25, 0x26, 0x21, 0x23, 0x23, 0x21, 0x20, 0x22, 0x1f, 0x1c, 0x1d, 0x1b,
+ 0x1a, 0x1b, 0x1a, 0x17, 0x18, 0x18, 0x15, 0x17, 0x16, 0x13, 0x17, 0x18,
+ 0x12, 0x17, 0x1b, 0x17, 0x1c, 0x21, 0x19, 0x1e, 0x22, 0x0a, 0x0e, 0x11,
+ 0x05, 0x06, 0x05, 0x07, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x08,
+ 0x09, 0x0b, 0x0a, 0x09, 0x0c, 0x0b, 0x0a, 0x0c, 0x0b, 0x0b, 0x0d, 0x0c,
+ 0x09, 0x0d, 0x0c, 0x10, 0x13, 0x13, 0x1f, 0x20, 0x24, 0x28, 0x28, 0x2d,
+ 0x24, 0x23, 0x28, 0x18, 0x17, 0x1c, 0x0a, 0x0a, 0x0c, 0x06, 0x06, 0x06,
+ 0x05, 0x06, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x05, 0x06, 0x06, 0x05, 0x06, 0x06, 0x05, 0x07, 0x06,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x08, 0x07,
+ 0x06, 0x07, 0x07, 0x08, 0x0a, 0x09, 0x07, 0x09, 0x07, 0x07, 0x09, 0x07,
+ 0x07, 0x09, 0x08, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09, 0x07, 0x09, 0x08,
+ 0x0e, 0x12, 0x10, 0x1e, 0x24, 0x22, 0x25, 0x2e, 0x2b, 0x25, 0x2f, 0x2b,
+ 0x24, 0x2d, 0x2a, 0x22, 0x28, 0x26, 0x1a, 0x1e, 0x1c, 0x14, 0x17, 0x16,
+ 0x13, 0x18, 0x1a, 0x19, 0x27, 0x35, 0x22, 0x40, 0x61, 0x25, 0x52, 0x7d,
+ 0x20, 0x57, 0x83, 0x1e, 0x57, 0x7f, 0x18, 0x4e, 0x76, 0x13, 0x43, 0x6e,
+ 0x17, 0x3c, 0x6b, 0x18, 0x3f, 0x6b, 0x14, 0x3f, 0x69, 0x0e, 0x3d, 0x63,
+ 0x0f, 0x3e, 0x60, 0x14, 0x3e, 0x61, 0x15, 0x3b, 0x5e, 0x13, 0x35, 0x58,
+ 0x11, 0x27, 0x4b, 0x0b, 0x1d, 0x3c, 0x0d, 0x1d, 0x35, 0x0e, 0x1b, 0x2e,
+ 0x10, 0x1d, 0x2d, 0x0d, 0x1e, 0x31, 0x0a, 0x20, 0x36, 0x07, 0x20, 0x38,
+ 0x0c, 0x1f, 0x36, 0x0e, 0x1f, 0x32, 0x0e, 0x20, 0x30, 0x0d, 0x20, 0x30,
+ 0x0a, 0x1f, 0x32, 0x09, 0x1f, 0x34, 0x0c, 0x1f, 0x34, 0x0f, 0x20, 0x35,
+ 0x09, 0x22, 0x36, 0x0b, 0x17, 0x29, 0x10, 0x10, 0x16, 0x0e, 0x0f, 0x07,
+ 0x11, 0x1b, 0x12, 0x14, 0x26, 0x2a, 0x15, 0x27, 0x36, 0x14, 0x22, 0x33,
+ 0x0a, 0x20, 0x37, 0x0d, 0x21, 0x3b, 0x0d, 0x1d, 0x34, 0x0e, 0x19, 0x27,
+ 0x12, 0x1a, 0x21, 0x18, 0x22, 0x27, 0x1e, 0x2d, 0x36, 0x1c, 0x31, 0x3e,
+ 0x1b, 0x34, 0x47, 0x14, 0x30, 0x4b, 0x13, 0x32, 0x50, 0x13, 0x30, 0x4b,
+ 0x13, 0x2a, 0x3a, 0x15, 0x29, 0x33, 0x1a, 0x2c, 0x36, 0x13, 0x27, 0x33,
+ 0x10, 0x26, 0x2e, 0x13, 0x25, 0x33, 0x17, 0x2f, 0x4a, 0x16, 0x37, 0x60,
+ 0x15, 0x39, 0x61, 0x21, 0x40, 0x5f, 0x26, 0x45, 0x5e, 0x1e, 0x41, 0x5d,
+ 0x19, 0x33, 0x4c, 0x1a, 0x2b, 0x36, 0x14, 0x38, 0x4d, 0x27, 0x64, 0x92,
+ 0x30, 0x70, 0xab, 0x29, 0x69, 0xaa, 0x13, 0x54, 0x8f, 0x15, 0x4e, 0x7c,
+ 0x1c, 0x4e, 0x7f, 0x1a, 0x4b, 0x78, 0x18, 0x46, 0x6e, 0x16, 0x3f, 0x61,
+ 0x1c, 0x3c, 0x5a, 0x1f, 0x3d, 0x56, 0x1d, 0x3d, 0x52, 0x17, 0x39, 0x4d,
+ 0x1a, 0x35, 0x4e, 0x17, 0x33, 0x49, 0x15, 0x30, 0x43, 0x17, 0x31, 0x42,
+ 0x13, 0x2c, 0x3e, 0x0e, 0x24, 0x3a, 0x0c, 0x20, 0x38, 0x0c, 0x1f, 0x37,
+ 0x08, 0x10, 0x1a, 0x09, 0x0e, 0x12, 0x0b, 0x0c, 0x0e, 0x09, 0x08, 0x09,
+ 0x06, 0x08, 0x07, 0x03, 0x07, 0x07, 0x02, 0x08, 0x07, 0x06, 0x0a, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c,
+ 0x09, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07,
+ 0x08, 0x0a, 0x0a, 0x0d, 0x0e, 0x0e, 0x1c, 0x1b, 0x19, 0x2e, 0x2a, 0x29,
+ 0x34, 0x2e, 0x2c, 0x30, 0x26, 0x25, 0x34, 0x28, 0x28, 0x36, 0x2b, 0x2c,
+ 0x2b, 0x26, 0x29, 0x21, 0x1d, 0x20, 0x23, 0x21, 0x22, 0x20, 0x20, 0x22,
+ 0x2a, 0x2a, 0x2c, 0x3a, 0x3b, 0x3e, 0x48, 0x48, 0x4d, 0x50, 0x4f, 0x55,
+ 0x54, 0x54, 0x55, 0x51, 0x50, 0x57, 0x4a, 0x49, 0x58, 0x3d, 0x3b, 0x50,
+ 0x35, 0x32, 0x47, 0x32, 0x31, 0x3f, 0x43, 0x42, 0x49, 0x5c, 0x5b, 0x5b,
+ 0x6a, 0x6d, 0x70, 0x8a, 0x8e, 0x97, 0x74, 0x7b, 0x8c, 0x5c, 0x63, 0x7b,
+ 0x4c, 0x53, 0x6e, 0x36, 0x3e, 0x51, 0x27, 0x30, 0x3b, 0x2a, 0x31, 0x36,
+ 0x2b, 0x2f, 0x2d, 0x2b, 0x2d, 0x2c, 0x32, 0x34, 0x31, 0x38, 0x38, 0x36,
+ 0x2a, 0x2a, 0x27, 0x2a, 0x2a, 0x29, 0x29, 0x2a, 0x29, 0x2a, 0x2e, 0x2f,
+ 0x24, 0x28, 0x29, 0x27, 0x2b, 0x2a, 0x23, 0x25, 0x24, 0x23, 0x25, 0x24,
+ 0x27, 0x27, 0x27, 0x24, 0x25, 0x27, 0x1a, 0x1b, 0x1d, 0x08, 0x09, 0x0b,
+ 0x05, 0x05, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x09,
+ 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x13, 0x13, 0x11, 0x10, 0x10, 0x0e,
+ 0x0b, 0x0e, 0x0c, 0x0b, 0x0d, 0x0c, 0x0d, 0x0f, 0x0e, 0x0d, 0x0f, 0x0e,
+ 0x0d, 0x0f, 0x0e, 0x0b, 0x0d, 0x0c, 0x0a, 0x0c, 0x0b, 0x07, 0x09, 0x08,
+ 0x08, 0x0a, 0x0a, 0x10, 0x0d, 0x0a, 0x2d, 0x20, 0x1a, 0x58, 0x42, 0x35,
+ 0x72, 0x56, 0x43, 0x84, 0x62, 0x4c, 0x9e, 0x79, 0x5e, 0xaa, 0x84, 0x69,
+ 0xa6, 0x7c, 0x66, 0x8e, 0x6c, 0x52, 0x93, 0x84, 0x5f, 0xaa, 0xad, 0x81,
+ 0xae, 0xc1, 0x8f, 0xa9, 0xc5, 0x92, 0xa9, 0xc5, 0x94, 0xa7, 0xc1, 0x92,
+ 0xa7, 0xc3, 0x93, 0xac, 0xc8, 0x97, 0xaf, 0xca, 0x99, 0xb0, 0xcc, 0x9a,
+ 0xb1, 0xcf, 0x9d, 0xb1, 0xd1, 0xa0, 0xb0, 0xd0, 0xa1, 0xb3, 0xd2, 0xa4,
+ 0xb2, 0xd2, 0xa5, 0xb2, 0xd2, 0xa5, 0xb3, 0xd3, 0xa4, 0xb4, 0xd4, 0xa6,
+ 0xb7, 0xd7, 0xa8, 0xb8, 0xd7, 0xac, 0xb9, 0xd8, 0xb1, 0xbb, 0xda, 0xb5,
+ 0xbc, 0xdf, 0xb4, 0xbf, 0xe0, 0xba, 0xc7, 0xe4, 0xc9, 0xc9, 0xe5, 0xd1,
+ 0xc0, 0xdd, 0xc8, 0xb5, 0xd5, 0xbb, 0xaa, 0xca, 0xa7, 0x9e, 0xba, 0x93,
+ 0x8b, 0xa1, 0x8f, 0x73, 0x8d, 0x83, 0x5c, 0x7b, 0x7b, 0x49, 0x67, 0x74,
+ 0x3d, 0x54, 0x67, 0x35, 0x40, 0x52, 0x28, 0x28, 0x31, 0x1b, 0x17, 0x18,
+ 0x22, 0x24, 0x21, 0x22, 0x24, 0x21, 0x26, 0x28, 0x25, 0x2c, 0x2d, 0x28,
+ 0x2b, 0x2b, 0x26, 0x33, 0x30, 0x2b, 0x39, 0x36, 0x31, 0x3a, 0x37, 0x31,
+ 0x3d, 0x40, 0x33, 0x45, 0x47, 0x39, 0x45, 0x48, 0x36, 0x4a, 0x4a, 0x36,
+ 0x54, 0x50, 0x3e, 0x5a, 0x54, 0x44, 0x57, 0x50, 0x40, 0x4e, 0x46, 0x38,
+ 0x46, 0x3f, 0x35, 0x43, 0x3e, 0x36, 0x37, 0x34, 0x2f, 0x2d, 0x2b, 0x27,
+ 0x20, 0x1e, 0x1c, 0x21, 0x20, 0x1e, 0x28, 0x27, 0x25, 0x27, 0x27, 0x23,
+ 0x1b, 0x1b, 0x1c, 0x14, 0x12, 0x13, 0x1e, 0x1d, 0x1a, 0x2a, 0x29, 0x25,
+ 0x28, 0x27, 0x22, 0x23, 0x23, 0x1f, 0x1b, 0x1d, 0x19, 0x1a, 0x1c, 0x1b,
+ 0x17, 0x18, 0x1a, 0x15, 0x16, 0x18, 0x12, 0x15, 0x16, 0x12, 0x16, 0x17,
+ 0x12, 0x16, 0x18, 0x15, 0x19, 0x1d, 0x16, 0x1a, 0x1d, 0x0c, 0x10, 0x12,
+ 0x07, 0x07, 0x04, 0x07, 0x07, 0x05, 0x08, 0x09, 0x07, 0x06, 0x08, 0x04,
+ 0x07, 0x07, 0x05, 0x08, 0x08, 0x0a, 0x09, 0x0a, 0x0c, 0x06, 0x09, 0x08,
+ 0x09, 0x0a, 0x08, 0x0c, 0x0c, 0x0a, 0x0e, 0x0e, 0x0d, 0x19, 0x19, 0x1a,
+ 0x24, 0x25, 0x25, 0x23, 0x24, 0x26, 0x19, 0x1d, 0x1e, 0x0e, 0x12, 0x12,
+ 0x08, 0x0a, 0x0a, 0x04, 0x05, 0x05, 0x03, 0x05, 0x04, 0x04, 0x06, 0x05,
+ 0x03, 0x04, 0x03, 0x03, 0x03, 0x02, 0x03, 0x03, 0x02, 0x06, 0x06, 0x04,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x06, 0x06,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08,
+ 0x07, 0x06, 0x0b, 0x07, 0x08, 0x09, 0x05, 0x07, 0x02, 0x05, 0x08, 0x02,
+ 0x08, 0x0a, 0x07, 0x08, 0x0a, 0x09, 0x08, 0x0a, 0x09, 0x07, 0x08, 0x08,
+ 0x11, 0x12, 0x10, 0x1e, 0x22, 0x23, 0x22, 0x28, 0x2a, 0x25, 0x2b, 0x2b,
+ 0x28, 0x2e, 0x2a, 0x28, 0x32, 0x29, 0x20, 0x2c, 0x28, 0x1b, 0x2b, 0x2d,
+ 0x19, 0x34, 0x52, 0x25, 0x4b, 0x72, 0x24, 0x58, 0x86, 0x1b, 0x54, 0x85,
+ 0x1a, 0x53, 0x80, 0x1a, 0x4d, 0x76, 0x17, 0x46, 0x6c, 0x14, 0x3f, 0x67,
+ 0x17, 0x3d, 0x65, 0x1a, 0x3f, 0x69, 0x1a, 0x3f, 0x69, 0x14, 0x3c, 0x66,
+ 0x13, 0x3a, 0x64, 0x13, 0x38, 0x5d, 0x11, 0x31, 0x4f, 0x0e, 0x28, 0x3f,
+ 0x0d, 0x1f, 0x39, 0x0e, 0x1d, 0x35, 0x0e, 0x1c, 0x32, 0x0e, 0x1c, 0x31,
+ 0x0d, 0x1e, 0x34, 0x09, 0x1d, 0x35, 0x0c, 0x1e, 0x3a, 0x0d, 0x1d, 0x39,
+ 0x0c, 0x1d, 0x34, 0x0a, 0x1f, 0x2e, 0x09, 0x20, 0x30, 0x09, 0x1d, 0x36,
+ 0x0c, 0x1d, 0x39, 0x0e, 0x1c, 0x34, 0x11, 0x1c, 0x33, 0x12, 0x1d, 0x3a,
+ 0x0d, 0x1f, 0x36, 0x0d, 0x1c, 0x25, 0x0b, 0x14, 0x16, 0x09, 0x11, 0x15,
+ 0x13, 0x1e, 0x22, 0x16, 0x27, 0x29, 0x13, 0x28, 0x31, 0x0f, 0x21, 0x38,
+ 0x08, 0x20, 0x3a, 0x0e, 0x20, 0x3f, 0x10, 0x1d, 0x35, 0x11, 0x1b, 0x25,
+ 0x15, 0x1e, 0x25, 0x1a, 0x26, 0x32, 0x20, 0x31, 0x3e, 0x30, 0x45, 0x4e,
+ 0x38, 0x45, 0x4f, 0x1c, 0x35, 0x4c, 0x12, 0x32, 0x4f, 0x17, 0x2d, 0x47,
+ 0x1b, 0x26, 0x3c, 0x18, 0x28, 0x3a, 0x19, 0x2f, 0x3a, 0x15, 0x2c, 0x2f,
+ 0x15, 0x25, 0x29, 0x15, 0x29, 0x36, 0x17, 0x31, 0x4c, 0x14, 0x36, 0x59,
+ 0x12, 0x38, 0x5e, 0x19, 0x3f, 0x62, 0x1d, 0x41, 0x61, 0x1e, 0x3f, 0x5c,
+ 0x18, 0x33, 0x4d, 0x13, 0x37, 0x5c, 0x23, 0x5a, 0x92, 0x3c, 0x81, 0xc3,
+ 0x25, 0x70, 0xb3, 0x1b, 0x60, 0x9f, 0x17, 0x50, 0x8d, 0x18, 0x48, 0x82,
+ 0x1d, 0x51, 0x7b, 0x1d, 0x51, 0x78, 0x16, 0x45, 0x69, 0x15, 0x3c, 0x58,
+ 0x1f, 0x3d, 0x54, 0x21, 0x3c, 0x51, 0x1c, 0x37, 0x4f, 0x19, 0x37, 0x52,
+ 0x18, 0x32, 0x4a, 0x16, 0x30, 0x46, 0x17, 0x30, 0x43, 0x15, 0x2f, 0x42,
+ 0x0b, 0x26, 0x3c, 0x0b, 0x21, 0x38, 0x12, 0x24, 0x37, 0x1f, 0x2b, 0x38,
+ 0x31, 0x2d, 0x2a, 0x43, 0x3e, 0x3f, 0x30, 0x2b, 0x33, 0x0d, 0x0a, 0x13,
+ 0x05, 0x07, 0x08, 0x03, 0x08, 0x02, 0x05, 0x07, 0x02, 0x07, 0x06, 0x03,
+ 0x08, 0x06, 0x07, 0x07, 0x07, 0x08, 0x0c, 0x0e, 0x0d, 0x0d, 0x0f, 0x0e,
+ 0x0f, 0x11, 0x10, 0x0c, 0x0d, 0x0f, 0x0a, 0x0a, 0x0c, 0x08, 0x08, 0x0a,
+ 0x08, 0x0d, 0x12, 0x18, 0x1a, 0x1b, 0x28, 0x25, 0x21, 0x30, 0x27, 0x25,
+ 0x30, 0x25, 0x25, 0x2d, 0x23, 0x22, 0x31, 0x28, 0x25, 0x26, 0x22, 0x1a,
+ 0x1c, 0x1d, 0x17, 0x2d, 0x2c, 0x27, 0x4a, 0x48, 0x43, 0x59, 0x56, 0x51,
+ 0x69, 0x65, 0x62, 0x74, 0x71, 0x70, 0x7f, 0x7e, 0x81, 0x81, 0x80, 0x84,
+ 0x80, 0x83, 0x7a, 0x7f, 0x82, 0x80, 0x7e, 0x7e, 0x85, 0x76, 0x75, 0x83,
+ 0x68, 0x66, 0x76, 0x5c, 0x5e, 0x70, 0x51, 0x55, 0x69, 0x47, 0x4c, 0x60,
+ 0x65, 0x68, 0x78, 0x71, 0x74, 0x7d, 0x75, 0x7a, 0x85, 0x78, 0x7c, 0x96,
+ 0x6a, 0x71, 0x8f, 0x4d, 0x58, 0x69, 0x30, 0x3a, 0x44, 0x28, 0x2e, 0x38,
+ 0x2c, 0x2d, 0x2c, 0x2c, 0x2e, 0x2b, 0x28, 0x2a, 0x25, 0x28, 0x2a, 0x26,
+ 0x29, 0x28, 0x25, 0x29, 0x28, 0x26, 0x35, 0x35, 0x35, 0x34, 0x37, 0x38,
+ 0x27, 0x29, 0x29, 0x26, 0x28, 0x26, 0x23, 0x25, 0x24, 0x23, 0x23, 0x23,
+ 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x1d, 0x1f, 0x1e, 0x08, 0x0a, 0x0a,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07,
+ 0x11, 0x11, 0x11, 0x14, 0x14, 0x14, 0x10, 0x10, 0x10, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x0b, 0x0a, 0x0d, 0x0f, 0x0e, 0x0f, 0x10, 0x11, 0x0c, 0x0d, 0x0f,
+ 0x0d, 0x0d, 0x0f, 0x0b, 0x0b, 0x0b, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06,
+ 0x05, 0x08, 0x10, 0x0e, 0x0c, 0x0c, 0x2a, 0x1e, 0x12, 0x5d, 0x4a, 0x37,
+ 0x6c, 0x53, 0x3f, 0x88, 0x69, 0x52, 0xaf, 0x8a, 0x6c, 0xd5, 0xab, 0x89,
+ 0xdc, 0xac, 0x9a, 0xd2, 0xa0, 0x8f, 0xbc, 0x8f, 0x7a, 0xaf, 0x91, 0x7a,
+ 0xad, 0xa6, 0x87, 0xa7, 0xb5, 0x8c, 0xa3, 0xbd, 0x88, 0xa4, 0xc1, 0x87,
+ 0xa1, 0xc7, 0x90, 0xa7, 0xc7, 0x93, 0xaf, 0xc7, 0x94, 0xb0, 0xc9, 0x95,
+ 0xb0, 0xce, 0x9a, 0xaf, 0xd0, 0x9f, 0xb2, 0xd0, 0xa3, 0xb6, 0xce, 0xa6,
+ 0xb1, 0xd2, 0xa1, 0xb2, 0xd3, 0xa4, 0xb2, 0xd3, 0xa4, 0xb4, 0xd3, 0xa6,
+ 0xb7, 0xd3, 0xaa, 0xba, 0xd6, 0xad, 0xb8, 0xd9, 0xae, 0xb7, 0xdb, 0xb0,
+ 0xb7, 0xdc, 0xb3, 0xbc, 0xe0, 0xba, 0xc2, 0xe4, 0xc3, 0xc2, 0xe1, 0xc1,
+ 0xbc, 0xda, 0xb8, 0xb6, 0xd2, 0xb1, 0xaa, 0xc3, 0xa6, 0x93, 0xab, 0x91,
+ 0x80, 0x96, 0x8d, 0x69, 0x81, 0x83, 0x4e, 0x6b, 0x75, 0x3d, 0x5d, 0x6e,
+ 0x32, 0x4e, 0x60, 0x2a, 0x39, 0x45, 0x20, 0x1c, 0x20, 0x21, 0x12, 0x11,
+ 0x1d, 0x1f, 0x1c, 0x20, 0x22, 0x1f, 0x22, 0x23, 0x21, 0x26, 0x27, 0x22,
+ 0x25, 0x24, 0x20, 0x2a, 0x28, 0x23, 0x31, 0x2f, 0x2a, 0x32, 0x30, 0x2b,
+ 0x30, 0x33, 0x2a, 0x3a, 0x3c, 0x32, 0x3c, 0x3e, 0x31, 0x3f, 0x40, 0x31,
+ 0x44, 0x42, 0x35, 0x4b, 0x47, 0x3b, 0x46, 0x40, 0x36, 0x41, 0x3a, 0x31,
+ 0x37, 0x33, 0x2a, 0x31, 0x2c, 0x26, 0x26, 0x24, 0x1f, 0x21, 0x20, 0x1f,
+ 0x1a, 0x18, 0x19, 0x1d, 0x1d, 0x1b, 0x26, 0x26, 0x24, 0x25, 0x25, 0x21,
+ 0x23, 0x23, 0x24, 0x19, 0x18, 0x18, 0x1c, 0x1c, 0x18, 0x2a, 0x29, 0x24,
+ 0x27, 0x26, 0x21, 0x1e, 0x1f, 0x1a, 0x18, 0x1a, 0x17, 0x18, 0x1a, 0x19,
+ 0x16, 0x17, 0x19, 0x13, 0x14, 0x16, 0x10, 0x14, 0x15, 0x12, 0x16, 0x17,
+ 0x12, 0x16, 0x17, 0x14, 0x17, 0x1a, 0x15, 0x19, 0x1c, 0x11, 0x15, 0x17,
+ 0x09, 0x08, 0x0c, 0x05, 0x04, 0x08, 0x05, 0x06, 0x09, 0x05, 0x06, 0x07,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x09, 0x08, 0x08, 0x09, 0x06, 0x08, 0x06,
+ 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x09, 0x0d, 0x0d, 0x0b, 0x0f, 0x0f, 0x0f,
+ 0x11, 0x14, 0x12, 0x1b, 0x1d, 0x1e, 0x26, 0x27, 0x29, 0x24, 0x28, 0x29,
+ 0x15, 0x17, 0x18, 0x0a, 0x0b, 0x0c, 0x06, 0x08, 0x07, 0x06, 0x08, 0x07,
+ 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x03,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x07,
+ 0x07, 0x07, 0x08, 0x08, 0x09, 0x08, 0x08, 0x0a, 0x07, 0x08, 0x0a, 0x07,
+ 0x09, 0x0a, 0x09, 0x08, 0x09, 0x0b, 0x08, 0x07, 0x0c, 0x07, 0x07, 0x0b,
+ 0x0d, 0x12, 0x0e, 0x1f, 0x23, 0x23, 0x23, 0x27, 0x29, 0x23, 0x28, 0x23,
+ 0x28, 0x30, 0x23, 0x22, 0x32, 0x2b, 0x1f, 0x35, 0x40, 0x29, 0x43, 0x61,
+ 0x2b, 0x52, 0x7a, 0x27, 0x56, 0x82, 0x1f, 0x55, 0x85, 0x18, 0x50, 0x80,
+ 0x14, 0x49, 0x75, 0x14, 0x41, 0x6a, 0x16, 0x41, 0x68, 0x15, 0x3f, 0x66,
+ 0x14, 0x40, 0x67, 0x17, 0x3f, 0x65, 0x18, 0x3e, 0x65, 0x15, 0x38, 0x60,
+ 0x12, 0x34, 0x5b, 0x10, 0x2e, 0x50, 0x0b, 0x23, 0x3e, 0x0b, 0x1e, 0x35,
+ 0x0e, 0x20, 0x38, 0x0f, 0x1f, 0x36, 0x0c, 0x1b, 0x2f, 0x0c, 0x1b, 0x2e,
+ 0x0b, 0x1d, 0x33, 0x0c, 0x1e, 0x37, 0x0d, 0x1e, 0x37, 0x0d, 0x1d, 0x37,
+ 0x11, 0x1d, 0x36, 0x20, 0x2c, 0x39, 0x1f, 0x2d, 0x38, 0x11, 0x20, 0x34,
+ 0x0e, 0x1f, 0x38, 0x0c, 0x20, 0x36, 0x08, 0x1c, 0x31, 0x0d, 0x1f, 0x37,
+ 0x0e, 0x20, 0x38, 0x0d, 0x1b, 0x28, 0x0a, 0x13, 0x1a, 0x0a, 0x11, 0x1c,
+ 0x13, 0x1e, 0x27, 0x17, 0x28, 0x2e, 0x14, 0x28, 0x35, 0x0f, 0x20, 0x3c,
+ 0x0c, 0x20, 0x3c, 0x12, 0x25, 0x45, 0x11, 0x22, 0x3e, 0x0f, 0x21, 0x2e,
+ 0x12, 0x21, 0x26, 0x1f, 0x2b, 0x2f, 0x3f, 0x47, 0x45, 0x66, 0x6b, 0x5d,
+ 0x80, 0x7a, 0x6c, 0x4e, 0x5b, 0x5c, 0x1e, 0x3a, 0x49, 0x15, 0x2d, 0x3f,
+ 0x16, 0x27, 0x37, 0x17, 0x2a, 0x3b, 0x18, 0x2d, 0x40, 0x17, 0x29, 0x38,
+ 0x14, 0x26, 0x2f, 0x16, 0x2b, 0x3b, 0x18, 0x32, 0x4c, 0x13, 0x32, 0x53,
+ 0x16, 0x39, 0x5c, 0x1d, 0x41, 0x65, 0x1e, 0x43, 0x67, 0x1b, 0x3f, 0x64,
+ 0x13, 0x3f, 0x67, 0x21, 0x57, 0x8a, 0x2f, 0x74, 0xb4, 0x2c, 0x7c, 0xc0,
+ 0x21, 0x75, 0xb7, 0x1f, 0x6c, 0xa8, 0x12, 0x52, 0x8b, 0x10, 0x49, 0x80,
+ 0x15, 0x4b, 0x7b, 0x18, 0x47, 0x6f, 0x18, 0x3f, 0x60, 0x1b, 0x3e, 0x59,
+ 0x1a, 0x3c, 0x57, 0x16, 0x38, 0x51, 0x18, 0x36, 0x4d, 0x1a, 0x34, 0x4a,
+ 0x18, 0x2e, 0x45, 0x18, 0x2e, 0x43, 0x17, 0x2d, 0x40, 0x0e, 0x25, 0x3b,
+ 0x08, 0x20, 0x3a, 0x0a, 0x21, 0x39, 0x0b, 0x1e, 0x32, 0x52, 0x60, 0x6c,
+ 0x7b, 0x7b, 0x68, 0x7d, 0x79, 0x6b, 0x54, 0x51, 0x4e, 0x14, 0x14, 0x16,
+ 0x04, 0x05, 0x07, 0x01, 0x05, 0x05, 0x05, 0x05, 0x09, 0x07, 0x04, 0x0b,
+ 0x08, 0x06, 0x07, 0x05, 0x06, 0x05, 0x05, 0x06, 0x06, 0x09, 0x0b, 0x0a,
+ 0x10, 0x12, 0x11, 0x16, 0x17, 0x19, 0x11, 0x11, 0x13, 0x0e, 0x0e, 0x11,
+ 0x16, 0x16, 0x18, 0x27, 0x26, 0x24, 0x2d, 0x27, 0x23, 0x33, 0x2a, 0x28,
+ 0x32, 0x29, 0x2c, 0x30, 0x27, 0x2d, 0x2d, 0x27, 0x27, 0x22, 0x20, 0x18,
+ 0x39, 0x3b, 0x30, 0x5b, 0x5b, 0x51, 0x71, 0x71, 0x69, 0x85, 0x82, 0x7b,
+ 0x87, 0x85, 0x7f, 0x85, 0x84, 0x80, 0x98, 0x97, 0x95, 0x9a, 0x9a, 0x98,
+ 0xa3, 0xa4, 0xa8, 0x8b, 0x8b, 0x91, 0x8a, 0x89, 0x8e, 0x89, 0x89, 0x8b,
+ 0x8a, 0x8a, 0x8c, 0x89, 0x8b, 0x91, 0x87, 0x8a, 0x97, 0x73, 0x76, 0x89,
+ 0x63, 0x68, 0x7c, 0x5d, 0x63, 0x71, 0x85, 0x8c, 0x92, 0x84, 0x8e, 0x97,
+ 0x75, 0x80, 0x94, 0x65, 0x70, 0x8d, 0x45, 0x4e, 0x63, 0x2e, 0x35, 0x3f,
+ 0x2b, 0x2c, 0x31, 0x29, 0x2c, 0x31, 0x27, 0x2b, 0x2c, 0x2a, 0x2e, 0x2d,
+ 0x2a, 0x2c, 0x29, 0x27, 0x28, 0x26, 0x32, 0x36, 0x35, 0x2b, 0x31, 0x2f,
+ 0x22, 0x25, 0x24, 0x27, 0x29, 0x28, 0x26, 0x28, 0x27, 0x21, 0x21, 0x21,
+ 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x20, 0x22, 0x21, 0x0d, 0x0f, 0x0e,
+ 0x05, 0x05, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0e, 0x0d, 0x0e, 0x0f, 0x0f, 0x0d, 0x0e, 0x10, 0x0d, 0x0e, 0x10,
+ 0x0b, 0x0b, 0x0d, 0x08, 0x08, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x06,
+ 0x0a, 0x08, 0x0a, 0x0b, 0x0a, 0x0b, 0x18, 0x15, 0x10, 0x3c, 0x30, 0x22,
+ 0x56, 0x3e, 0x29, 0x81, 0x60, 0x42, 0xb0, 0x8c, 0x68, 0xe2, 0xc0, 0x98,
+ 0xf6, 0xe0, 0xc1, 0xf8, 0xdb, 0xc8, 0xef, 0xc7, 0xbf, 0xdb, 0xae, 0xa9,
+ 0xc7, 0x9f, 0x92, 0xb7, 0x9d, 0x84, 0xb0, 0xaa, 0x84, 0xad, 0xb4, 0x86,
+ 0xaa, 0xbe, 0x90, 0xa9, 0xc1, 0x93, 0xab, 0xc7, 0x97, 0xac, 0xc9, 0x99,
+ 0xaf, 0xcc, 0x9c, 0xae, 0xcd, 0x9a, 0xaf, 0xcf, 0x99, 0xaf, 0xd0, 0x98,
+ 0xb3, 0xce, 0x9e, 0xb4, 0xd1, 0xa1, 0xb7, 0xd2, 0xa5, 0xb5, 0xd0, 0xa5,
+ 0xb7, 0xd0, 0xa6, 0xb9, 0xd3, 0xa9, 0xb8, 0xd5, 0xa9, 0xb7, 0xd9, 0xab,
+ 0xb7, 0xda, 0xb2, 0xc0, 0xe0, 0xbc, 0xc2, 0xe2, 0xbf, 0xbd, 0xdb, 0xb9,
+ 0xbb, 0xd6, 0xb4, 0xb1, 0xca, 0xad, 0x9e, 0xb6, 0x9e, 0x88, 0x9e, 0x8d,
+ 0x6e, 0x83, 0x7e, 0x59, 0x76, 0x78, 0x48, 0x6b, 0x75, 0x37, 0x53, 0x62,
+ 0x37, 0x40, 0x50, 0x3a, 0x33, 0x3b, 0x30, 0x1f, 0x21, 0x31, 0x1f, 0x1b,
+ 0x1b, 0x1b, 0x19, 0x1e, 0x1e, 0x1c, 0x1d, 0x1d, 0x1b, 0x21, 0x21, 0x1f,
+ 0x24, 0x23, 0x1f, 0x22, 0x21, 0x1d, 0x26, 0x25, 0x21, 0x29, 0x29, 0x24,
+ 0x28, 0x29, 0x24, 0x2f, 0x30, 0x2b, 0x2f, 0x2e, 0x29, 0x38, 0x38, 0x30,
+ 0x36, 0x36, 0x2e, 0x39, 0x36, 0x2f, 0x38, 0x35, 0x30, 0x34, 0x31, 0x2c,
+ 0x2a, 0x27, 0x22, 0x23, 0x1f, 0x1c, 0x1d, 0x1c, 0x19, 0x1a, 0x1a, 0x18,
+ 0x17, 0x16, 0x17, 0x1a, 0x1a, 0x18, 0x21, 0x21, 0x1f, 0x1f, 0x20, 0x1b,
+ 0x23, 0x24, 0x24, 0x23, 0x23, 0x22, 0x1f, 0x1f, 0x1d, 0x28, 0x29, 0x24,
+ 0x25, 0x26, 0x21, 0x1e, 0x1f, 0x1c, 0x17, 0x17, 0x17, 0x15, 0x16, 0x16,
+ 0x14, 0x16, 0x17, 0x11, 0x12, 0x14, 0x0e, 0x12, 0x13, 0x0f, 0x13, 0x14,
+ 0x11, 0x15, 0x16, 0x14, 0x18, 0x1b, 0x16, 0x1a, 0x1d, 0x12, 0x16, 0x19,
+ 0x08, 0x09, 0x07, 0x05, 0x06, 0x01, 0x07, 0x08, 0x02, 0x07, 0x07, 0x04,
+ 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x07, 0x09, 0x09, 0x07, 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10,
+ 0x0e, 0x10, 0x0f, 0x0f, 0x11, 0x11, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x29,
+ 0x24, 0x25, 0x27, 0x1e, 0x1f, 0x21, 0x10, 0x11, 0x13, 0x08, 0x09, 0x0b,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x05, 0x07, 0x07, 0x05, 0x09, 0x09, 0x09, 0x08, 0x08, 0x0a,
+ 0x07, 0x07, 0x09, 0x09, 0x08, 0x0c, 0x08, 0x06, 0x0b, 0x07, 0x05, 0x0a,
+ 0x0c, 0x10, 0x0f, 0x1f, 0x24, 0x20, 0x24, 0x2b, 0x23, 0x21, 0x2b, 0x1f,
+ 0x24, 0x33, 0x2c, 0x23, 0x3b, 0x45, 0x24, 0x47, 0x6b, 0x28, 0x54, 0x86,
+ 0x25, 0x58, 0x83, 0x20, 0x56, 0x82, 0x1c, 0x52, 0x81, 0x13, 0x45, 0x75,
+ 0x13, 0x3f, 0x6b, 0x15, 0x3e, 0x66, 0x15, 0x3f, 0x65, 0x17, 0x42, 0x69,
+ 0x12, 0x41, 0x67, 0x13, 0x3d, 0x61, 0x16, 0x39, 0x5c, 0x17, 0x33, 0x55,
+ 0x0e, 0x27, 0x46, 0x0a, 0x1f, 0x3f, 0x0e, 0x1f, 0x39, 0x0e, 0x1d, 0x34,
+ 0x0c, 0x1f, 0x34, 0x0b, 0x1c, 0x2f, 0x0c, 0x1c, 0x2d, 0x0d, 0x1e, 0x2e,
+ 0x0b, 0x1e, 0x32, 0x0c, 0x1e, 0x34, 0x0e, 0x1e, 0x35, 0x10, 0x1e, 0x35,
+ 0x2d, 0x2f, 0x37, 0x5e, 0x5b, 0x53, 0x71, 0x6c, 0x60, 0x43, 0x44, 0x47,
+ 0x18, 0x26, 0x35, 0x09, 0x20, 0x33, 0x07, 0x20, 0x34, 0x0b, 0x1f, 0x37,
+ 0x0c, 0x1c, 0x36, 0x0c, 0x1a, 0x28, 0x0a, 0x12, 0x1c, 0x0c, 0x11, 0x1d,
+ 0x16, 0x20, 0x2a, 0x16, 0x27, 0x2f, 0x14, 0x27, 0x39, 0x0f, 0x22, 0x40,
+ 0x0f, 0x23, 0x3e, 0x15, 0x29, 0x4b, 0x12, 0x29, 0x48, 0x0c, 0x24, 0x34,
+ 0x0e, 0x22, 0x24, 0x27, 0x2f, 0x2b, 0x75, 0x75, 0x61, 0xa6, 0x9e, 0x7b,
+ 0x9d, 0x89, 0x6a, 0x7a, 0x7b, 0x73, 0x32, 0x48, 0x54, 0x13, 0x2d, 0x3a,
+ 0x10, 0x2a, 0x33, 0x12, 0x2b, 0x36, 0x18, 0x2b, 0x3c, 0x17, 0x24, 0x36,
+ 0x12, 0x27, 0x35, 0x14, 0x29, 0x3b, 0x16, 0x2e, 0x46, 0x15, 0x2f, 0x4c,
+ 0x1b, 0x3a, 0x5b, 0x1d, 0x43, 0x69, 0x1d, 0x46, 0x74, 0x1f, 0x4c, 0x7f,
+ 0x20, 0x5d, 0x98, 0x2e, 0x71, 0xb3, 0x2a, 0x76, 0xbe, 0x1c, 0x6d, 0xb7,
+ 0x18, 0x6b, 0xad, 0x1a, 0x66, 0xa0, 0x12, 0x52, 0x89, 0x14, 0x4d, 0x81,
+ 0x12, 0x49, 0x7d, 0x16, 0x41, 0x6b, 0x1f, 0x3f, 0x5e, 0x1e, 0x3c, 0x58,
+ 0x14, 0x37, 0x55, 0x13, 0x38, 0x55, 0x13, 0x34, 0x49, 0x18, 0x31, 0x3f,
+ 0x19, 0x2f, 0x47, 0x17, 0x2b, 0x44, 0x10, 0x25, 0x3c, 0x0e, 0x22, 0x3c,
+ 0x0a, 0x1f, 0x3c, 0x0c, 0x21, 0x3c, 0x0a, 0x1f, 0x34, 0x36, 0x49, 0x52,
+ 0x70, 0x73, 0x5c, 0x91, 0x92, 0x7f, 0x3e, 0x3e, 0x36, 0x0e, 0x0e, 0x0c,
+ 0x04, 0x06, 0x05, 0x03, 0x06, 0x06, 0x07, 0x06, 0x0c, 0x07, 0x04, 0x0d,
+ 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x07, 0x09, 0x08, 0x06, 0x08, 0x07,
+ 0x09, 0x0b, 0x09, 0x0f, 0x11, 0x10, 0x10, 0x12, 0x13, 0x18, 0x17, 0x19,
+ 0x2b, 0x26, 0x23, 0x41, 0x3c, 0x39, 0x3b, 0x37, 0x34, 0x42, 0x3e, 0x40,
+ 0x4d, 0x48, 0x4f, 0x3e, 0x39, 0x40, 0x2b, 0x26, 0x28, 0x43, 0x3f, 0x39,
+ 0x6b, 0x6c, 0x5c, 0x78, 0x79, 0x6b, 0x83, 0x83, 0x79, 0x8d, 0x8d, 0x85,
+ 0x84, 0x83, 0x7e, 0x8a, 0x89, 0x84, 0x9b, 0x9c, 0x96, 0x93, 0x94, 0x8e,
+ 0xc8, 0xc8, 0xcf, 0xa2, 0xa1, 0xa8, 0x9f, 0x9e, 0xa3, 0x93, 0x93, 0x94,
+ 0x94, 0x95, 0x90, 0x95, 0x95, 0x93, 0x9e, 0x9f, 0xa3, 0x9a, 0x9b, 0xa2,
+ 0x8c, 0x93, 0xa0, 0x76, 0x7d, 0x8f, 0x7b, 0x83, 0x8e, 0x75, 0x81, 0x83,
+ 0x75, 0x83, 0x8b, 0x6e, 0x7a, 0x91, 0x5e, 0x67, 0x80, 0x44, 0x4a, 0x5a,
+ 0x34, 0x33, 0x40, 0x29, 0x2b, 0x36, 0x27, 0x2b, 0x32, 0x26, 0x2b, 0x2e,
+ 0x27, 0x2b, 0x2c, 0x25, 0x29, 0x28, 0x22, 0x28, 0x24, 0x20, 0x28, 0x24,
+ 0x25, 0x29, 0x27, 0x24, 0x26, 0x25, 0x23, 0x25, 0x24, 0x21, 0x22, 0x21,
+ 0x23, 0x23, 0x23, 0x1f, 0x1f, 0x1f, 0x1d, 0x1f, 0x1e, 0x12, 0x14, 0x13,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x0b, 0x0b, 0x0b,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0b, 0x0d, 0x0c, 0x0a, 0x0c, 0x0b, 0x09, 0x0a, 0x0c, 0x0b, 0x0c, 0x0e,
+ 0x08, 0x08, 0x09, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x07, 0x07,
+ 0x0e, 0x09, 0x06, 0x0c, 0x0e, 0x0f, 0x0f, 0x14, 0x17, 0x1d, 0x19, 0x14,
+ 0x3c, 0x29, 0x16, 0x6c, 0x4d, 0x2c, 0x9d, 0x7c, 0x53, 0xcf, 0xb5, 0x88,
+ 0xfa, 0xf0, 0xd4, 0xff, 0xfd, 0xf0, 0xff, 0xf3, 0xf1, 0xfc, 0xe5, 0xe5,
+ 0xf1, 0xca, 0xc0, 0xdb, 0xb2, 0x9e, 0xca, 0xa8, 0x92, 0xbe, 0xa6, 0x8d,
+ 0xb4, 0xad, 0x86, 0xae, 0xb7, 0x8b, 0xa7, 0xc1, 0x94, 0xa5, 0xc8, 0x9a,
+ 0xaa, 0xc9, 0x9b, 0xae, 0xc9, 0x98, 0xb2, 0xca, 0x94, 0xb1, 0xce, 0x94,
+ 0xb2, 0xcf, 0x9e, 0xb0, 0xd0, 0x9e, 0xb1, 0xd1, 0xa2, 0xb3, 0xd2, 0xa4,
+ 0xb3, 0xd1, 0xa3, 0xb5, 0xd1, 0xa4, 0xb5, 0xd5, 0xa7, 0xb6, 0xd9, 0xa9,
+ 0xb9, 0xd9, 0xb2, 0xbd, 0xdb, 0xb7, 0xbf, 0xdb, 0xb6, 0xbd, 0xd9, 0xb2,
+ 0xb7, 0xd1, 0xae, 0xa6, 0xbf, 0xa4, 0x91, 0xa7, 0x97, 0x78, 0x8e, 0x87,
+ 0x61, 0x79, 0x77, 0x4d, 0x70, 0x75, 0x3d, 0x64, 0x6f, 0x34, 0x49, 0x55,
+ 0x43, 0x37, 0x3f, 0x51, 0x32, 0x32, 0x43, 0x27, 0x23, 0x3c, 0x28, 0x21,
+ 0x1d, 0x1c, 0x1a, 0x20, 0x1f, 0x1d, 0x1c, 0x1b, 0x19, 0x1e, 0x1e, 0x1b,
+ 0x20, 0x21, 0x1c, 0x20, 0x21, 0x1c, 0x20, 0x20, 0x1b, 0x20, 0x21, 0x1c,
+ 0x24, 0x24, 0x21, 0x28, 0x27, 0x25, 0x29, 0x28, 0x24, 0x2c, 0x2b, 0x27,
+ 0x2f, 0x2f, 0x2a, 0x2f, 0x2e, 0x2a, 0x2d, 0x2c, 0x2a, 0x28, 0x27, 0x25,
+ 0x20, 0x1f, 0x1d, 0x18, 0x16, 0x15, 0x16, 0x16, 0x16, 0x14, 0x15, 0x14,
+ 0x17, 0x17, 0x17, 0x1b, 0x1b, 0x1b, 0x1d, 0x1d, 0x1b, 0x19, 0x19, 0x17,
+ 0x1e, 0x1e, 0x1c, 0x24, 0x24, 0x22, 0x29, 0x29, 0x28, 0x28, 0x29, 0x26,
+ 0x22, 0x22, 0x20, 0x1d, 0x1d, 0x1d, 0x13, 0x13, 0x13, 0x12, 0x14, 0x13,
+ 0x12, 0x14, 0x13, 0x13, 0x15, 0x14, 0x10, 0x14, 0x14, 0x0d, 0x11, 0x13,
+ 0x0e, 0x12, 0x13, 0x12, 0x16, 0x17, 0x13, 0x17, 0x19, 0x11, 0x15, 0x19,
+ 0x08, 0x07, 0x0c, 0x07, 0x07, 0x04, 0x09, 0x08, 0x03, 0x07, 0x06, 0x06,
+ 0x08, 0x07, 0x0c, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x08, 0x06, 0x07,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0f, 0x0f, 0x0d, 0x0f, 0x0e, 0x0b, 0x0d, 0x0c, 0x0f, 0x11, 0x10,
+ 0x18, 0x19, 0x1b, 0x22, 0x22, 0x25, 0x1f, 0x20, 0x22, 0x16, 0x17, 0x19,
+ 0x0c, 0x0c, 0x0e, 0x08, 0x08, 0x0a, 0x05, 0x05, 0x07, 0x05, 0x05, 0x06,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x08, 0x06, 0x09,
+ 0x09, 0x07, 0x09, 0x09, 0x08, 0x09, 0x08, 0x07, 0x07, 0x0a, 0x08, 0x09,
+ 0x11, 0x0f, 0x12, 0x1d, 0x22, 0x1b, 0x1f, 0x2d, 0x20, 0x1e, 0x35, 0x31,
+ 0x22, 0x3f, 0x53, 0x28, 0x4d, 0x77, 0x25, 0x57, 0x89, 0x1f, 0x58, 0x88,
+ 0x1c, 0x55, 0x80, 0x19, 0x51, 0x7c, 0x16, 0x48, 0x75, 0x14, 0x41, 0x6d,
+ 0x17, 0x3f, 0x6b, 0x18, 0x40, 0x6a, 0x14, 0x3e, 0x68, 0x14, 0x3f, 0x69,
+ 0x13, 0x3e, 0x64, 0x15, 0x39, 0x5b, 0x10, 0x2e, 0x4b, 0x0d, 0x23, 0x3e,
+ 0x0b, 0x1e, 0x38, 0x0d, 0x1f, 0x38, 0x11, 0x1f, 0x34, 0x12, 0x1f, 0x32,
+ 0x0c, 0x1d, 0x31, 0x0d, 0x1e, 0x2e, 0x0d, 0x1d, 0x2c, 0x0c, 0x1e, 0x2c,
+ 0x0d, 0x1f, 0x31, 0x0b, 0x1e, 0x32, 0x09, 0x1a, 0x2f, 0x12, 0x1f, 0x32,
+ 0x69, 0x66, 0x50, 0x99, 0x8c, 0x66, 0xa4, 0x91, 0x6a, 0x82, 0x75, 0x63,
+ 0x2a, 0x30, 0x36, 0x0a, 0x1c, 0x2e, 0x0c, 0x1d, 0x34, 0x0f, 0x1b, 0x37,
+ 0x0c, 0x1c, 0x35, 0x0c, 0x17, 0x25, 0x0b, 0x12, 0x1a, 0x0d, 0x13, 0x1f,
+ 0x16, 0x20, 0x2a, 0x15, 0x26, 0x2e, 0x14, 0x27, 0x39, 0x12, 0x25, 0x45,
+ 0x11, 0x29, 0x48, 0x17, 0x2f, 0x52, 0x13, 0x2d, 0x4a, 0x0f, 0x29, 0x36,
+ 0x12, 0x26, 0x27, 0x19, 0x22, 0x1d, 0x4f, 0x4e, 0x3c, 0xab, 0xa4, 0x82,
+ 0x92, 0x85, 0x71, 0x54, 0x59, 0x5e, 0x24, 0x3a, 0x53, 0x12, 0x2c, 0x43,
+ 0x0e, 0x2b, 0x35, 0x11, 0x2c, 0x32, 0x16, 0x2a, 0x33, 0x19, 0x24, 0x30,
+ 0x16, 0x29, 0x35, 0x17, 0x2a, 0x39, 0x17, 0x2b, 0x41, 0x17, 0x31, 0x4a,
+ 0x1b, 0x3c, 0x5d, 0x1c, 0x48, 0x74, 0x20, 0x52, 0x8b, 0x2d, 0x67, 0xa8,
+ 0x2d, 0x71, 0xb9, 0x2d, 0x75, 0xc1, 0x2f, 0x7b, 0xc7, 0x1f, 0x6b, 0xb6,
+ 0x18, 0x61, 0xa4, 0x1b, 0x5b, 0x98, 0x16, 0x4c, 0x84, 0x1b, 0x4e, 0x83,
+ 0x18, 0x4e, 0x7b, 0x1d, 0x49, 0x70, 0x1d, 0x3d, 0x5c, 0x1c, 0x38, 0x54,
+ 0x19, 0x36, 0x53, 0x15, 0x34, 0x50, 0x15, 0x31, 0x47, 0x17, 0x31, 0x43,
+ 0x15, 0x32, 0x50, 0x10, 0x2c, 0x4b, 0x0b, 0x23, 0x40, 0x0c, 0x20, 0x3f,
+ 0x0a, 0x1f, 0x3f, 0x0a, 0x20, 0x3b, 0x0f, 0x25, 0x36, 0x0b, 0x1f, 0x28,
+ 0x20, 0x25, 0x1e, 0x43, 0x43, 0x3f, 0x19, 0x17, 0x15, 0x07, 0x07, 0x06,
+ 0x05, 0x06, 0x04, 0x05, 0x07, 0x04, 0x06, 0x06, 0x04, 0x06, 0x05, 0x03,
+ 0x05, 0x04, 0x04, 0x06, 0x06, 0x06, 0x08, 0x09, 0x09, 0x06, 0x08, 0x07,
+ 0x06, 0x08, 0x07, 0x08, 0x0b, 0x09, 0x0b, 0x0d, 0x0c, 0x1e, 0x20, 0x1f,
+ 0x4e, 0x4d, 0x49, 0x6f, 0x6e, 0x6a, 0x59, 0x5b, 0x5a, 0x73, 0x74, 0x7a,
+ 0x86, 0x86, 0x8f, 0x4f, 0x4f, 0x55, 0x39, 0x35, 0x33, 0x6b, 0x67, 0x5c,
+ 0x79, 0x7b, 0x67, 0x7b, 0x7d, 0x6c, 0x7f, 0x7f, 0x76, 0x82, 0x82, 0x7c,
+ 0x85, 0x84, 0x80, 0x8e, 0x8f, 0x8a, 0x95, 0x96, 0x90, 0x85, 0x86, 0x7f,
+ 0x9e, 0xa2, 0x9c, 0x9c, 0x9d, 0x9d, 0xb5, 0xb6, 0xba, 0x8d, 0x8e, 0x93,
+ 0x94, 0x95, 0x99, 0x90, 0x92, 0x91, 0x96, 0x98, 0x97, 0x9b, 0x9d, 0x9c,
+ 0x99, 0x9e, 0x9f, 0x95, 0x98, 0xa8, 0x71, 0x73, 0x8a, 0x70, 0x76, 0x82,
+ 0x82, 0x8c, 0x8c, 0x94, 0x9e, 0xa1, 0x70, 0x76, 0x83, 0x5f, 0x5f, 0x73,
+ 0x42, 0x3e, 0x4d, 0x2f, 0x2f, 0x3b, 0x29, 0x2c, 0x33, 0x26, 0x2a, 0x2d,
+ 0x27, 0x2a, 0x2b, 0x25, 0x28, 0x27, 0x22, 0x26, 0x25, 0x21, 0x27, 0x25,
+ 0x27, 0x2b, 0x2a, 0x24, 0x26, 0x26, 0x21, 0x23, 0x22, 0x22, 0x24, 0x23,
+ 0x21, 0x21, 0x21, 0x1d, 0x1f, 0x1e, 0x1a, 0x1c, 0x1b, 0x16, 0x18, 0x17,
+ 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0d, 0x0c, 0x09, 0x0b, 0x0a, 0x08, 0x09, 0x0a, 0x07, 0x08, 0x0a,
+ 0x06, 0x07, 0x09, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0a, 0x09, 0x0a, 0x09,
+ 0x0c, 0x0b, 0x08, 0x11, 0x15, 0x16, 0x16, 0x1f, 0x25, 0x17, 0x19, 0x1d,
+ 0x26, 0x1c, 0x14, 0x46, 0x31, 0x1c, 0x73, 0x5a, 0x38, 0xa2, 0x8b, 0x62,
+ 0xde, 0xc6, 0xa8, 0xfb, 0xf1, 0xe0, 0xff, 0xff, 0xfc, 0xfc, 0xff, 0xff,
+ 0xfe, 0xfb, 0xf5, 0xfb, 0xec, 0xdf, 0xf4, 0xd6, 0xc7, 0xe8, 0xc1, 0xb1,
+ 0xd5, 0xb0, 0x90, 0xbf, 0xaa, 0x85, 0xb2, 0xb4, 0x89, 0xae, 0xc0, 0x92,
+ 0xac, 0xc3, 0x93, 0xae, 0xc6, 0x97, 0xaf, 0xc6, 0x98, 0xb1, 0xc9, 0x9a,
+ 0xad, 0xcd, 0x9c, 0xac, 0xce, 0x9d, 0xae, 0xcf, 0x9f, 0xb2, 0xd2, 0xa4,
+ 0xb4, 0xd2, 0xa6, 0xb5, 0xd1, 0xa3, 0xb9, 0xd6, 0xa8, 0xb7, 0xd7, 0xa9,
+ 0xb9, 0xd8, 0xaf, 0xb9, 0xd7, 0xae, 0xbc, 0xd8, 0xae, 0xb9, 0xd4, 0xaa,
+ 0xab, 0xc5, 0x9f, 0x98, 0xb1, 0x97, 0x82, 0x98, 0x8f, 0x6a, 0x7f, 0x80,
+ 0x55, 0x73, 0x77, 0x41, 0x65, 0x6f, 0x2d, 0x50, 0x5d, 0x2a, 0x36, 0x40,
+ 0x40, 0x2b, 0x2b, 0x55, 0x30, 0x28, 0x4b, 0x2c, 0x22, 0x3c, 0x29, 0x1f,
+ 0x19, 0x18, 0x16, 0x1a, 0x19, 0x17, 0x19, 0x18, 0x16, 0x1c, 0x1c, 0x1a,
+ 0x1c, 0x1c, 0x1a, 0x1d, 0x1d, 0x1b, 0x1e, 0x1f, 0x1a, 0x1e, 0x20, 0x1b,
+ 0x24, 0x24, 0x22, 0x24, 0x23, 0x21, 0x25, 0x24, 0x20, 0x24, 0x25, 0x20,
+ 0x26, 0x27, 0x22, 0x24, 0x25, 0x20, 0x25, 0x25, 0x23, 0x1e, 0x1e, 0x1c,
+ 0x1b, 0x1b, 0x1b, 0x13, 0x13, 0x13, 0x11, 0x11, 0x11, 0x13, 0x15, 0x14,
+ 0x17, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x17, 0x17, 0x16, 0x14,
+ 0x1c, 0x1a, 0x16, 0x2f, 0x2e, 0x2a, 0x36, 0x35, 0x33, 0x25, 0x25, 0x23,
+ 0x1a, 0x1a, 0x1a, 0x15, 0x16, 0x15, 0x15, 0x15, 0x15, 0x10, 0x11, 0x11,
+ 0x10, 0x12, 0x10, 0x15, 0x17, 0x16, 0x0f, 0x13, 0x14, 0x0e, 0x12, 0x14,
+ 0x0f, 0x13, 0x14, 0x10, 0x14, 0x15, 0x13, 0x17, 0x19, 0x13, 0x17, 0x1b,
+ 0x14, 0x13, 0x1e, 0x27, 0x23, 0x23, 0x22, 0x1d, 0x17, 0x0e, 0x09, 0x0e,
+ 0x08, 0x06, 0x10, 0x07, 0x08, 0x0a, 0x07, 0x07, 0x03, 0x09, 0x05, 0x07,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0f, 0x11, 0x11, 0x13, 0x1c, 0x1c, 0x1e, 0x22, 0x23, 0x25,
+ 0x1b, 0x1c, 0x1f, 0x10, 0x11, 0x13, 0x07, 0x08, 0x0a, 0x04, 0x05, 0x07,
+ 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x07, 0x06,
+ 0x06, 0x08, 0x06, 0x06, 0x06, 0x08, 0x06, 0x04, 0x0a, 0x09, 0x07, 0x0a,
+ 0x0b, 0x0a, 0x08, 0x07, 0x08, 0x02, 0x06, 0x07, 0x02, 0x07, 0x09, 0x05,
+ 0x13, 0x0e, 0x0e, 0x1c, 0x22, 0x20, 0x1c, 0x34, 0x3b, 0x21, 0x47, 0x60,
+ 0x26, 0x54, 0x83, 0x27, 0x5c, 0x95, 0x23, 0x5d, 0x8f, 0x1b, 0x59, 0x80,
+ 0x15, 0x4d, 0x74, 0x12, 0x44, 0x6d, 0x13, 0x40, 0x69, 0x14, 0x3c, 0x67,
+ 0x18, 0x3f, 0x6a, 0x16, 0x40, 0x6a, 0x13, 0x3d, 0x67, 0x10, 0x3b, 0x65,
+ 0x15, 0x36, 0x5a, 0x13, 0x2d, 0x4c, 0x0c, 0x1f, 0x39, 0x0d, 0x1d, 0x34,
+ 0x0e, 0x1e, 0x33, 0x10, 0x21, 0x35, 0x0d, 0x1e, 0x30, 0x0d, 0x1e, 0x2e,
+ 0x0e, 0x1e, 0x31, 0x0b, 0x1c, 0x2c, 0x0c, 0x1c, 0x2b, 0x0a, 0x1c, 0x2a,
+ 0x0a, 0x1c, 0x2c, 0x0d, 0x20, 0x31, 0x0c, 0x1c, 0x2e, 0x0d, 0x1a, 0x2a,
+ 0x5d, 0x5e, 0x43, 0xa1, 0x9a, 0x6d, 0x8d, 0x7e, 0x52, 0x60, 0x58, 0x40,
+ 0x23, 0x29, 0x2b, 0x0c, 0x1d, 0x2e, 0x0e, 0x1f, 0x36, 0x0f, 0x1a, 0x35,
+ 0x0f, 0x1e, 0x33, 0x09, 0x15, 0x1f, 0x0c, 0x13, 0x19, 0x0f, 0x16, 0x1e,
+ 0x16, 0x21, 0x2a, 0x15, 0x29, 0x2e, 0x13, 0x29, 0x37, 0x13, 0x29, 0x45,
+ 0x12, 0x30, 0x51, 0x15, 0x31, 0x54, 0x16, 0x2e, 0x4a, 0x13, 0x28, 0x32,
+ 0x18, 0x28, 0x2a, 0x14, 0x1d, 0x20, 0x0e, 0x15, 0x12, 0x2c, 0x31, 0x25,
+ 0x45, 0x51, 0x4c, 0x22, 0x3a, 0x4e, 0x12, 0x30, 0x57, 0x14, 0x2e, 0x53,
+ 0x13, 0x2c, 0x42, 0x13, 0x2d, 0x3a, 0x16, 0x2c, 0x37, 0x18, 0x25, 0x2f,
+ 0x17, 0x28, 0x2c, 0x1a, 0x2c, 0x35, 0x17, 0x2e, 0x40, 0x12, 0x30, 0x4c,
+ 0x19, 0x43, 0x6a, 0x23, 0x59, 0x8b, 0x28, 0x69, 0xa9, 0x2e, 0x76, 0xbe,
+ 0x2c, 0x76, 0xc0, 0x2a, 0x78, 0xc0, 0x31, 0x7f, 0xc6, 0x27, 0x72, 0xb8,
+ 0x1a, 0x5e, 0xa2, 0x16, 0x52, 0x90, 0x14, 0x46, 0x7f, 0x19, 0x48, 0x7b,
+ 0x1b, 0x4e, 0x71, 0x18, 0x47, 0x69, 0x16, 0x3c, 0x5b, 0x19, 0x36, 0x52,
+ 0x1b, 0x32, 0x4c, 0x17, 0x2f, 0x48, 0x16, 0x31, 0x4d, 0x15, 0x35, 0x55,
+ 0x0d, 0x36, 0x62, 0x0b, 0x2f, 0x57, 0x09, 0x25, 0x49, 0x09, 0x1f, 0x41,
+ 0x0b, 0x1f, 0x40, 0x0b, 0x20, 0x39, 0x11, 0x24, 0x34, 0x12, 0x25, 0x2c,
+ 0x10, 0x18, 0x1f, 0x0a, 0x0c, 0x12, 0x0b, 0x09, 0x0e, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x04, 0x05, 0x07, 0x04, 0x05, 0x06, 0x02, 0x06, 0x06, 0x02,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x04, 0x05, 0x05, 0x05, 0x07, 0x06, 0x0d, 0x0f, 0x0d, 0x2c, 0x2e, 0x2d,
+ 0x65, 0x6b, 0x67, 0x73, 0x7a, 0x75, 0x6a, 0x72, 0x71, 0x7f, 0x86, 0x8b,
+ 0x8e, 0x91, 0x98, 0x52, 0x51, 0x54, 0x53, 0x4d, 0x45, 0x7b, 0x76, 0x63,
+ 0x7e, 0x7f, 0x6c, 0x85, 0x85, 0x77, 0x8e, 0x8f, 0x85, 0xa6, 0xa5, 0xa1,
+ 0x90, 0x90, 0x8f, 0x88, 0x88, 0x86, 0x8a, 0x8b, 0x86, 0x8f, 0x90, 0x8a,
+ 0x8e, 0x95, 0x87, 0x90, 0x97, 0x8e, 0x94, 0x9a, 0x98, 0x9c, 0xa1, 0xa3,
+ 0xbb, 0xc0, 0xc4, 0xab, 0xb1, 0xb4, 0x91, 0x96, 0x9d, 0x92, 0x95, 0x9e,
+ 0x94, 0x96, 0x95, 0x93, 0x92, 0x98, 0x86, 0x83, 0x96, 0x6e, 0x6c, 0x82,
+ 0x64, 0x67, 0x70, 0x75, 0x7a, 0x74, 0x56, 0x57, 0x53, 0x66, 0x61, 0x6a,
+ 0x67, 0x60, 0x69, 0x46, 0x43, 0x48, 0x2e, 0x2f, 0x31, 0x26, 0x27, 0x29,
+ 0x2a, 0x2c, 0x2c, 0x26, 0x28, 0x29, 0x24, 0x26, 0x28, 0x25, 0x29, 0x2c,
+ 0x21, 0x26, 0x25, 0x1f, 0x23, 0x22, 0x1f, 0x22, 0x21, 0x1f, 0x21, 0x20,
+ 0x1d, 0x1f, 0x1e, 0x1b, 0x1d, 0x1c, 0x1a, 0x1c, 0x1b, 0x14, 0x16, 0x15,
+ 0x0a, 0x0b, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0e, 0x0d, 0x0a, 0x0c, 0x0b, 0x07, 0x09, 0x09, 0x07, 0x08, 0x0a,
+ 0x08, 0x09, 0x0b, 0x07, 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x0b, 0x0c, 0x0d,
+ 0x0f, 0x17, 0x17, 0x16, 0x1f, 0x1e, 0x19, 0x1e, 0x21, 0x1c, 0x21, 0x25,
+ 0x1d, 0x1d, 0x21, 0x28, 0x1f, 0x1a, 0x4a, 0x39, 0x25, 0x7c, 0x64, 0x43,
+ 0xaf, 0x91, 0x60, 0xdd, 0xc4, 0x9e, 0xfa, 0xee, 0xd9, 0xfe, 0xff, 0xfa,
+ 0xf9, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xf7, 0xff, 0xef, 0xe3,
+ 0xf9, 0xd4, 0xc5, 0xe6, 0xb9, 0xa5, 0xce, 0xa7, 0x88, 0xbf, 0xa5, 0x7c,
+ 0xb5, 0xae, 0x7e, 0xaf, 0xba, 0x87, 0xab, 0xc2, 0x92, 0xab, 0xc6, 0x98,
+ 0xae, 0xc7, 0x97, 0xaf, 0xca, 0x99, 0xaf, 0xcc, 0x9c, 0xb1, 0xcf, 0xa1,
+ 0xb6, 0xd1, 0xa4, 0xb9, 0xd0, 0xa4, 0xba, 0xd1, 0xa5, 0xba, 0xd5, 0xa7,
+ 0xb8, 0xd8, 0xa9, 0xb8, 0xd5, 0xa7, 0xb9, 0xd5, 0xa5, 0xb0, 0xcc, 0x9c,
+ 0x9d, 0xb7, 0x8f, 0x85, 0x9d, 0x85, 0x70, 0x87, 0x80, 0x5c, 0x73, 0x77,
+ 0x44, 0x66, 0x6f, 0x34, 0x53, 0x60, 0x28, 0x3b, 0x4b, 0x1a, 0x1d, 0x26,
+ 0x28, 0x17, 0x14, 0x40, 0x25, 0x18, 0x48, 0x30, 0x23, 0x3d, 0x2a, 0x1e,
+ 0x16, 0x16, 0x14, 0x15, 0x15, 0x13, 0x15, 0x15, 0x13, 0x18, 0x18, 0x16,
+ 0x17, 0x17, 0x15, 0x1c, 0x1c, 0x1a, 0x1c, 0x1c, 0x1a, 0x1e, 0x1e, 0x1c,
+ 0x22, 0x21, 0x1d, 0x21, 0x20, 0x1c, 0x22, 0x21, 0x1d, 0x20, 0x20, 0x1b,
+ 0x1e, 0x1f, 0x1a, 0x1a, 0x1a, 0x17, 0x17, 0x17, 0x14, 0x14, 0x14, 0x12,
+ 0x14, 0x14, 0x14, 0x10, 0x12, 0x11, 0x0f, 0x11, 0x10, 0x11, 0x13, 0x12,
+ 0x16, 0x16, 0x16, 0x17, 0x16, 0x16, 0x19, 0x17, 0x18, 0x17, 0x14, 0x15,
+ 0x27, 0x23, 0x1d, 0x47, 0x44, 0x3f, 0x39, 0x35, 0x32, 0x1d, 0x1c, 0x1a,
+ 0x15, 0x15, 0x15, 0x13, 0x14, 0x14, 0x11, 0x13, 0x12, 0x0e, 0x10, 0x0f,
+ 0x0f, 0x11, 0x10, 0x10, 0x12, 0x11, 0x0c, 0x10, 0x10, 0x0e, 0x12, 0x13,
+ 0x0d, 0x11, 0x12, 0x0d, 0x11, 0x12, 0x0f, 0x13, 0x15, 0x14, 0x18, 0x19,
+ 0x2d, 0x2e, 0x1e, 0x6e, 0x6d, 0x4c, 0x63, 0x5e, 0x3e, 0x16, 0x12, 0x08,
+ 0x06, 0x06, 0x08, 0x02, 0x07, 0x04, 0x06, 0x07, 0x04, 0x0a, 0x05, 0x0b,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0f, 0x0e, 0x0e,
+ 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0b, 0x10, 0x10, 0x10, 0x18, 0x18, 0x18,
+ 0x20, 0x21, 0x23, 0x22, 0x23, 0x25, 0x18, 0x19, 0x1b, 0x0c, 0x0d, 0x0f,
+ 0x07, 0x07, 0x09, 0x04, 0x04, 0x06, 0x03, 0x03, 0x05, 0x03, 0x03, 0x05,
+ 0x05, 0x05, 0x06, 0x07, 0x07, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x05, 0x07, 0x06, 0x06, 0x06, 0x0a, 0x06, 0x05, 0x0a, 0x07, 0x07, 0x08,
+ 0x07, 0x08, 0x04, 0x07, 0x0a, 0x02, 0x05, 0x0a, 0x06, 0x03, 0x08, 0x0b,
+ 0x0d, 0x15, 0x17, 0x21, 0x34, 0x45, 0x25, 0x4b, 0x71, 0x26, 0x5a, 0x8f,
+ 0x22, 0x5e, 0x95, 0x22, 0x5e, 0x8f, 0x1c, 0x55, 0x80, 0x15, 0x4c, 0x73,
+ 0x15, 0x44, 0x6c, 0x15, 0x40, 0x67, 0x17, 0x3e, 0x65, 0x19, 0x40, 0x67,
+ 0x17, 0x3e, 0x67, 0x14, 0x3b, 0x64, 0x15, 0x3c, 0x63, 0x13, 0x36, 0x5a,
+ 0x0f, 0x27, 0x46, 0x0b, 0x1e, 0x39, 0x0c, 0x1a, 0x31, 0x11, 0x1e, 0x31,
+ 0x0d, 0x1d, 0x2f, 0x0d, 0x1f, 0x31, 0x0d, 0x1f, 0x30, 0x0b, 0x1d, 0x2d,
+ 0x0b, 0x1c, 0x2e, 0x09, 0x19, 0x2a, 0x0c, 0x1c, 0x2b, 0x0c, 0x1e, 0x2c,
+ 0x0a, 0x1c, 0x2c, 0x0c, 0x1e, 0x2f, 0x11, 0x20, 0x31, 0x0d, 0x18, 0x28,
+ 0x0d, 0x18, 0x11, 0x3f, 0x44, 0x2e, 0x4f, 0x50, 0x3a, 0x24, 0x28, 0x22,
+ 0x13, 0x21, 0x2a, 0x0c, 0x22, 0x31, 0x0c, 0x21, 0x33, 0x0e, 0x1f, 0x36,
+ 0x0e, 0x1d, 0x30, 0x0b, 0x17, 0x1e, 0x0a, 0x14, 0x15, 0x0d, 0x16, 0x1b,
+ 0x15, 0x21, 0x2a, 0x18, 0x2b, 0x31, 0x16, 0x2e, 0x3b, 0x15, 0x2d, 0x49,
+ 0x11, 0x33, 0x54, 0x17, 0x33, 0x56, 0x18, 0x2f, 0x48, 0x16, 0x26, 0x30,
+ 0x18, 0x25, 0x2a, 0x14, 0x21, 0x2c, 0x10, 0x1d, 0x2a, 0x06, 0x17, 0x1d,
+ 0x0b, 0x27, 0x2d, 0x0d, 0x31, 0x49, 0x0e, 0x31, 0x5a, 0x1c, 0x37, 0x5f,
+ 0x1d, 0x35, 0x57, 0x1b, 0x35, 0x53, 0x17, 0x2d, 0x48, 0x17, 0x26, 0x39,
+ 0x17, 0x27, 0x28, 0x17, 0x2c, 0x35, 0x10, 0x2c, 0x45, 0x0c, 0x33, 0x5a,
+ 0x1d, 0x53, 0x85, 0x2a, 0x6b, 0xa6, 0x27, 0x73, 0xb8, 0x27, 0x76, 0xc1,
+ 0x27, 0x77, 0xbc, 0x26, 0x77, 0xb9, 0x25, 0x76, 0xb7, 0x1b, 0x6a, 0xaa,
+ 0x17, 0x5e, 0x9e, 0x15, 0x52, 0x90, 0x12, 0x47, 0x7e, 0x15, 0x44, 0x75,
+ 0x18, 0x45, 0x67, 0x10, 0x3d, 0x5d, 0x12, 0x39, 0x58, 0x14, 0x34, 0x4f,
+ 0x14, 0x2e, 0x47, 0x15, 0x30, 0x4f, 0x13, 0x37, 0x60, 0x17, 0x43, 0x74,
+ 0x0d, 0x3a, 0x6f, 0x06, 0x2f, 0x5d, 0x08, 0x26, 0x4c, 0x0a, 0x22, 0x42,
+ 0x0b, 0x1f, 0x3c, 0x0c, 0x20, 0x37, 0x0f, 0x23, 0x32, 0x10, 0x23, 0x2b,
+ 0x0e, 0x1a, 0x22, 0x0c, 0x13, 0x17, 0x08, 0x09, 0x0b, 0x06, 0x05, 0x06,
+ 0x06, 0x06, 0x08, 0x07, 0x06, 0x0b, 0x05, 0x05, 0x09, 0x07, 0x05, 0x08,
+ 0x06, 0x06, 0x08, 0x07, 0x07, 0x09, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x14, 0x16, 0x16, 0x32, 0x35, 0x33,
+ 0x5d, 0x66, 0x63, 0x7a, 0x84, 0x7f, 0x6d, 0x76, 0x73, 0x84, 0x8a, 0x8b,
+ 0x8a, 0x8c, 0x90, 0x4e, 0x4b, 0x4a, 0x62, 0x5d, 0x50, 0x83, 0x7d, 0x66,
+ 0x8b, 0x89, 0x79, 0x8f, 0x8f, 0x83, 0x92, 0x92, 0x88, 0xb4, 0xb5, 0xaf,
+ 0xb3, 0xb5, 0xb2, 0x94, 0x96, 0x93, 0x8c, 0x8e, 0x8b, 0x92, 0x93, 0x90,
+ 0x95, 0x9b, 0x93, 0x88, 0x8f, 0x88, 0x8e, 0x98, 0x90, 0xb2, 0xbb, 0xb3,
+ 0xc3, 0xcc, 0xc7, 0xdc, 0xe4, 0xe6, 0xbd, 0xc4, 0xd0, 0xaa, 0xad, 0xc1,
+ 0x94, 0x92, 0x9d, 0x8f, 0x8d, 0x8e, 0x91, 0x8f, 0x94, 0x76, 0x74, 0x87,
+ 0x3a, 0x39, 0x4f, 0x2f, 0x2e, 0x37, 0x2d, 0x2a, 0x29, 0x39, 0x32, 0x33,
+ 0x55, 0x4d, 0x4f, 0x41, 0x3c, 0x3d, 0x29, 0x29, 0x28, 0x29, 0x2b, 0x29,
+ 0x28, 0x2b, 0x29, 0x24, 0x24, 0x26, 0x23, 0x24, 0x28, 0x23, 0x27, 0x2b,
+ 0x22, 0x26, 0x26, 0x1f, 0x23, 0x22, 0x21, 0x23, 0x22, 0x21, 0x23, 0x22,
+ 0x1e, 0x20, 0x1f, 0x1b, 0x1d, 0x1c, 0x1a, 0x1c, 0x1b, 0x12, 0x14, 0x13,
+ 0x08, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0f, 0x0f, 0x0f,
+ 0x12, 0x14, 0x11, 0x0b, 0x0e, 0x0c, 0x07, 0x09, 0x08, 0x06, 0x07, 0x09,
+ 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0d, 0x0b, 0x0c, 0x0e, 0x12, 0x15, 0x17,
+ 0x14, 0x1f, 0x21, 0x15, 0x1c, 0x1e, 0x19, 0x1e, 0x1e, 0x21, 0x25, 0x28,
+ 0x22, 0x24, 0x29, 0x20, 0x1b, 0x1c, 0x2f, 0x20, 0x16, 0x53, 0x3d, 0x25,
+ 0x7d, 0x66, 0x3b, 0xae, 0x8f, 0x64, 0xdc, 0xb9, 0x91, 0xfa, 0xdf, 0xc1,
+ 0xff, 0xf7, 0xe8, 0xff, 0xff, 0xfc, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xff,
+ 0xfd, 0xfa, 0xf4, 0xfd, 0xe6, 0xdc, 0xf5, 0xc3, 0xb0, 0xe1, 0xa6, 0x87,
+ 0xcd, 0x9e, 0x72, 0xba, 0xa1, 0x6d, 0xaf, 0xa8, 0x74, 0xaf, 0xb1, 0x7f,
+ 0xae, 0xbc, 0x89, 0xb0, 0xc4, 0x8f, 0xaf, 0xc9, 0x95, 0xae, 0xcc, 0x98,
+ 0xaf, 0xcd, 0x9b, 0xb3, 0xd0, 0xa0, 0xb4, 0xd4, 0xa3, 0xb7, 0xd7, 0xa5,
+ 0xb9, 0xd6, 0xa5, 0xb8, 0xd1, 0xa1, 0xb3, 0xcd, 0x9d, 0xa6, 0xbe, 0x8f,
+ 0x88, 0x9f, 0x79, 0x71, 0x87, 0x72, 0x63, 0x79, 0x76, 0x4c, 0x63, 0x6b,
+ 0x36, 0x54, 0x5e, 0x2d, 0x41, 0x4e, 0x20, 0x26, 0x32, 0x16, 0x11, 0x16,
+ 0x1c, 0x10, 0x0d, 0x2a, 0x1b, 0x10, 0x3e, 0x2b, 0x1e, 0x43, 0x2d, 0x1f,
+ 0x14, 0x15, 0x12, 0x13, 0x13, 0x11, 0x14, 0x14, 0x12, 0x15, 0x15, 0x13,
+ 0x16, 0x16, 0x14, 0x17, 0x17, 0x15, 0x18, 0x18, 0x16, 0x1c, 0x1c, 0x1a,
+ 0x1d, 0x1c, 0x18, 0x1e, 0x1d, 0x19, 0x1e, 0x1d, 0x1b, 0x19, 0x18, 0x16,
+ 0x17, 0x16, 0x14, 0x15, 0x15, 0x13, 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x0e,
+ 0x11, 0x12, 0x10, 0x0f, 0x11, 0x0e, 0x10, 0x12, 0x0f, 0x12, 0x14, 0x11,
+ 0x15, 0x15, 0x14, 0x16, 0x14, 0x14, 0x18, 0x16, 0x17, 0x1e, 0x19, 0x1a,
+ 0x4d, 0x44, 0x3c, 0x50, 0x48, 0x42, 0x2d, 0x28, 0x26, 0x15, 0x14, 0x12,
+ 0x11, 0x11, 0x11, 0x0f, 0x11, 0x10, 0x0c, 0x0e, 0x0d, 0x0e, 0x10, 0x0d,
+ 0x0f, 0x11, 0x10, 0x0d, 0x0f, 0x0e, 0x0c, 0x0f, 0x0f, 0x0e, 0x12, 0x13,
+ 0x0d, 0x11, 0x12, 0x0d, 0x11, 0x12, 0x0e, 0x12, 0x14, 0x1c, 0x20, 0x21,
+ 0x2d, 0x2e, 0x13, 0x7a, 0x77, 0x47, 0x77, 0x71, 0x45, 0x1b, 0x16, 0x04,
+ 0x04, 0x05, 0x04, 0x02, 0x08, 0x01, 0x05, 0x08, 0x03, 0x09, 0x04, 0x0a,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0b, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0d, 0x0d, 0x0e, 0x0d,
+ 0x12, 0x14, 0x13, 0x1c, 0x1e, 0x1d, 0x24, 0x25, 0x27, 0x1e, 0x1e, 0x21,
+ 0x15, 0x14, 0x18, 0x0a, 0x0a, 0x0c, 0x05, 0x05, 0x07, 0x05, 0x05, 0x07,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03,
+ 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x09, 0x08, 0x07, 0x07, 0x06,
+ 0x06, 0x08, 0x04, 0x07, 0x07, 0x09, 0x08, 0x07, 0x0c, 0x06, 0x06, 0x07,
+ 0x05, 0x07, 0x02, 0x04, 0x0a, 0x06, 0x02, 0x09, 0x0e, 0x0a, 0x12, 0x21,
+ 0x17, 0x37, 0x4f, 0x2d, 0x58, 0x7d, 0x29, 0x5e, 0x95, 0x22, 0x5f, 0x9b,
+ 0x20, 0x5f, 0x90, 0x1b, 0x54, 0x7d, 0x17, 0x49, 0x70, 0x14, 0x41, 0x6d,
+ 0x16, 0x3e, 0x69, 0x17, 0x3e, 0x67, 0x18, 0x3f, 0x64, 0x1f, 0x47, 0x6b,
+ 0x18, 0x43, 0x68, 0x13, 0x39, 0x5e, 0x12, 0x31, 0x51, 0x0c, 0x24, 0x3e,
+ 0x0c, 0x1e, 0x38, 0x0b, 0x1a, 0x32, 0x0c, 0x1b, 0x2e, 0x0d, 0x1d, 0x2d,
+ 0x0c, 0x1d, 0x2f, 0x0c, 0x1e, 0x31, 0x0d, 0x1f, 0x31, 0x0b, 0x1b, 0x2c,
+ 0x0b, 0x1c, 0x2e, 0x0d, 0x1d, 0x2d, 0x0c, 0x1c, 0x2b, 0x0c, 0x1d, 0x2d,
+ 0x0b, 0x1e, 0x2f, 0x0b, 0x1c, 0x2e, 0x0f, 0x1d, 0x2e, 0x0c, 0x16, 0x27,
+ 0x08, 0x10, 0x18, 0x07, 0x10, 0x0f, 0x13, 0x1d, 0x1c, 0x14, 0x1f, 0x28,
+ 0x11, 0x22, 0x32, 0x0c, 0x22, 0x2f, 0x0a, 0x1f, 0x2e, 0x09, 0x1d, 0x33,
+ 0x0c, 0x1c, 0x2e, 0x0b, 0x17, 0x1e, 0x0a, 0x13, 0x15, 0x0f, 0x18, 0x1f,
+ 0x19, 0x27, 0x2f, 0x17, 0x2d, 0x33, 0x16, 0x30, 0x40, 0x16, 0x30, 0x4d,
+ 0x10, 0x31, 0x50, 0x16, 0x33, 0x56, 0x16, 0x2d, 0x48, 0x14, 0x26, 0x31,
+ 0x17, 0x27, 0x2d, 0x13, 0x20, 0x2d, 0x0f, 0x1b, 0x2b, 0x0f, 0x1d, 0x26,
+ 0x11, 0x28, 0x38, 0x0f, 0x2f, 0x4b, 0x0d, 0x31, 0x53, 0x1c, 0x3b, 0x5f,
+ 0x22, 0x3e, 0x64, 0x20, 0x3d, 0x65, 0x19, 0x33, 0x54, 0x16, 0x28, 0x3c,
+ 0x18, 0x2b, 0x2f, 0x13, 0x2e, 0x3d, 0x0e, 0x34, 0x58, 0x14, 0x49, 0x80,
+ 0x27, 0x66, 0xa7, 0x28, 0x71, 0xb4, 0x26, 0x74, 0xbb, 0x27, 0x75, 0xbd,
+ 0x2a, 0x75, 0xb9, 0x22, 0x70, 0xb0, 0x1d, 0x6c, 0xaa, 0x15, 0x63, 0xa1,
+ 0x15, 0x5d, 0x9b, 0x14, 0x52, 0x8e, 0x18, 0x4e, 0x80, 0x17, 0x48, 0x74,
+ 0x19, 0x42, 0x6b, 0x15, 0x3b, 0x5d, 0x13, 0x35, 0x51, 0x12, 0x32, 0x4a,
+ 0x0e, 0x32, 0x51, 0x12, 0x40, 0x6a, 0x19, 0x4f, 0x86, 0x12, 0x4c, 0x8b,
+ 0x0d, 0x39, 0x71, 0x0a, 0x2e, 0x5b, 0x08, 0x24, 0x47, 0x0c, 0x21, 0x3b,
+ 0x0c, 0x1e, 0x36, 0x0d, 0x1f, 0x35, 0x0e, 0x20, 0x32, 0x14, 0x28, 0x35,
+ 0x0e, 0x1e, 0x27, 0x07, 0x11, 0x15, 0x06, 0x0a, 0x09, 0x06, 0x06, 0x03,
+ 0x05, 0x05, 0x05, 0x05, 0x04, 0x09, 0x06, 0x05, 0x09, 0x07, 0x05, 0x08,
+ 0x06, 0x06, 0x08, 0x08, 0x09, 0x0b, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x28, 0x2a, 0x29, 0x3b, 0x3f, 0x3d,
+ 0x55, 0x59, 0x53, 0x7b, 0x80, 0x79, 0x71, 0x75, 0x6d, 0x7e, 0x7e, 0x7c,
+ 0x71, 0x6d, 0x6f, 0x3f, 0x39, 0x38, 0x63, 0x5d, 0x50, 0x84, 0x7f, 0x6a,
+ 0x86, 0x84, 0x76, 0x89, 0x8a, 0x7d, 0x87, 0x89, 0x7d, 0x8c, 0x8f, 0x84,
+ 0xb4, 0xb6, 0xaf, 0xb6, 0xb8, 0xb3, 0x90, 0x92, 0x8f, 0x8a, 0x8c, 0x8b,
+ 0x8d, 0x8f, 0x8e, 0x87, 0x8a, 0x89, 0x90, 0x96, 0x92, 0xab, 0xb4, 0xad,
+ 0xb6, 0xc0, 0xb7, 0xb9, 0xc2, 0xbf, 0xcf, 0xd6, 0xd9, 0xea, 0xee, 0xf7,
+ 0xaa, 0xac, 0xbb, 0x8b, 0x8e, 0x94, 0x90, 0x91, 0x92, 0x81, 0x82, 0x8e,
+ 0x60, 0x61, 0x79, 0x3f, 0x3f, 0x59, 0x29, 0x26, 0x38, 0x2d, 0x27, 0x31,
+ 0x2f, 0x26, 0x2b, 0x2c, 0x28, 0x2a, 0x28, 0x2a, 0x29, 0x28, 0x2d, 0x29,
+ 0x24, 0x29, 0x25, 0x23, 0x26, 0x25, 0x23, 0x27, 0x28, 0x21, 0x26, 0x28,
+ 0x22, 0x26, 0x25, 0x1f, 0x23, 0x22, 0x23, 0x25, 0x24, 0x23, 0x25, 0x24,
+ 0x20, 0x22, 0x21, 0x1c, 0x1e, 0x1d, 0x19, 0x1b, 0x1a, 0x11, 0x13, 0x12,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x19, 0x19, 0x19,
+ 0x27, 0x27, 0x25, 0x13, 0x14, 0x13, 0x08, 0x0a, 0x09, 0x09, 0x0a, 0x0c,
+ 0x0a, 0x0b, 0x0d, 0x0a, 0x0b, 0x0f, 0x13, 0x15, 0x18, 0x18, 0x1d, 0x1e,
+ 0x14, 0x18, 0x1c, 0x10, 0x15, 0x18, 0x21, 0x27, 0x27, 0x27, 0x2a, 0x2a,
+ 0x1f, 0x1c, 0x19, 0x27, 0x1f, 0x16, 0x3a, 0x2c, 0x1d, 0x40, 0x2e, 0x1b,
+ 0x4d, 0x3c, 0x27, 0x6f, 0x57, 0x3c, 0x9d, 0x7c, 0x55, 0xc4, 0xa0, 0x71,
+ 0xe6, 0xc6, 0x97, 0xf7, 0xe4, 0xc2, 0xfd, 0xf4, 0xe5, 0xff, 0xfe, 0xfb,
+ 0xf8, 0xff, 0xfe, 0xfe, 0xfc, 0xf3, 0xff, 0xe7, 0xd3, 0xfc, 0xcb, 0xaf,
+ 0xf1, 0xb6, 0x8f, 0xd7, 0xa1, 0x73, 0xc1, 0x94, 0x63, 0xba, 0x95, 0x64,
+ 0xaf, 0x9c, 0x6b, 0xae, 0xa5, 0x72, 0xb1, 0xb3, 0x7e, 0xb3, 0xbf, 0x89,
+ 0xb2, 0xc4, 0x90, 0xb4, 0xcc, 0x98, 0xb5, 0xd3, 0x9d, 0xb8, 0xd5, 0x9f,
+ 0xbc, 0xd3, 0xa2, 0xb8, 0xce, 0x9e, 0xad, 0xc0, 0x94, 0x96, 0xa6, 0x80,
+ 0x7a, 0x8b, 0x6d, 0x67, 0x77, 0x68, 0x50, 0x62, 0x65, 0x39, 0x4b, 0x58,
+ 0x2a, 0x3d, 0x49, 0x22, 0x2c, 0x35, 0x18, 0x18, 0x1a, 0x1d, 0x16, 0x16,
+ 0x20, 0x14, 0x14, 0x27, 0x18, 0x13, 0x3a, 0x23, 0x18, 0x4d, 0x32, 0x21,
+ 0x16, 0x18, 0x15, 0x12, 0x14, 0x11, 0x10, 0x10, 0x0e, 0x12, 0x12, 0x10,
+ 0x15, 0x15, 0x13, 0x16, 0x16, 0x14, 0x14, 0x14, 0x12, 0x18, 0x18, 0x16,
+ 0x17, 0x16, 0x13, 0x17, 0x16, 0x14, 0x19, 0x18, 0x16, 0x15, 0x13, 0x14,
+ 0x15, 0x14, 0x14, 0x11, 0x0f, 0x0f, 0x11, 0x0f, 0x10, 0x11, 0x0f, 0x10,
+ 0x10, 0x10, 0x0f, 0x11, 0x13, 0x10, 0x11, 0x13, 0x10, 0x13, 0x13, 0x11,
+ 0x13, 0x12, 0x11, 0x13, 0x10, 0x11, 0x16, 0x13, 0x14, 0x41, 0x3c, 0x3e,
+ 0x69, 0x60, 0x56, 0x3f, 0x36, 0x2f, 0x1f, 0x1b, 0x16, 0x14, 0x10, 0x0f,
+ 0x0e, 0x0f, 0x0e, 0x0f, 0x11, 0x0f, 0x0e, 0x10, 0x0d, 0x0e, 0x10, 0x0d,
+ 0x0e, 0x10, 0x0f, 0x0d, 0x0f, 0x0e, 0x0e, 0x11, 0x11, 0x0f, 0x13, 0x13,
+ 0x0e, 0x12, 0x13, 0x0e, 0x11, 0x12, 0x0c, 0x10, 0x11, 0x13, 0x17, 0x18,
+ 0x18, 0x12, 0x18, 0x2a, 0x20, 0x13, 0x35, 0x2b, 0x17, 0x17, 0x0e, 0x0e,
+ 0x08, 0x06, 0x0e, 0x03, 0x09, 0x04, 0x05, 0x09, 0x01, 0x07, 0x06, 0x04,
+ 0x06, 0x05, 0x06, 0x07, 0x07, 0x06, 0x07, 0x08, 0x07, 0x06, 0x07, 0x07,
+ 0x07, 0x07, 0x08, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09,
+ 0x0f, 0x0f, 0x0d, 0x0e, 0x0e, 0x0d, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0f, 0x0e, 0x0e, 0x10, 0x0f, 0x18, 0x1a, 0x19, 0x22, 0x24, 0x23,
+ 0x24, 0x24, 0x28, 0x1c, 0x1b, 0x20, 0x0f, 0x0f, 0x11, 0x07, 0x07, 0x09,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x03, 0x03, 0x03, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x06, 0x08, 0x04, 0x07, 0x07, 0x08, 0x09, 0x08, 0x0c, 0x08, 0x08, 0x09,
+ 0x03, 0x07, 0x03, 0x02, 0x0a, 0x0c, 0x0f, 0x1a, 0x2a, 0x29, 0x38, 0x56,
+ 0x28, 0x5d, 0x8d, 0x28, 0x64, 0x98, 0x24, 0x63, 0x99, 0x20, 0x5e, 0x92,
+ 0x1a, 0x52, 0x7f, 0x15, 0x47, 0x6f, 0x18, 0x43, 0x6c, 0x19, 0x40, 0x6c,
+ 0x17, 0x3e, 0x6c, 0x18, 0x3e, 0x6a, 0x19, 0x3f, 0x66, 0x16, 0x40, 0x63,
+ 0x10, 0x3a, 0x5d, 0x0a, 0x2d, 0x4d, 0x0c, 0x22, 0x3c, 0x10, 0x1e, 0x31,
+ 0x0b, 0x1c, 0x30, 0x0d, 0x1d, 0x30, 0x0b, 0x1b, 0x2c, 0x0c, 0x1d, 0x2e,
+ 0x0d, 0x1e, 0x32, 0x0d, 0x1f, 0x33, 0x0e, 0x1d, 0x32, 0x0e, 0x1b, 0x2e,
+ 0x0d, 0x1e, 0x30, 0x0d, 0x1d, 0x2d, 0x0b, 0x1b, 0x2b, 0x0c, 0x1d, 0x2d,
+ 0x0c, 0x1e, 0x30, 0x0d, 0x1e, 0x30, 0x0f, 0x1d, 0x2e, 0x0c, 0x15, 0x26,
+ 0x0f, 0x0e, 0x16, 0x0c, 0x0f, 0x11, 0x10, 0x1a, 0x1e, 0x14, 0x20, 0x2d,
+ 0x14, 0x1f, 0x33, 0x10, 0x1e, 0x2d, 0x0d, 0x1d, 0x2e, 0x0c, 0x1c, 0x34,
+ 0x0a, 0x1b, 0x2f, 0x09, 0x16, 0x1f, 0x0d, 0x16, 0x1b, 0x16, 0x1e, 0x28,
+ 0x1b, 0x2a, 0x33, 0x17, 0x2d, 0x36, 0x19, 0x32, 0x45, 0x16, 0x30, 0x4f,
+ 0x15, 0x32, 0x50, 0x14, 0x30, 0x53, 0x12, 0x2a, 0x46, 0x11, 0x27, 0x33,
+ 0x15, 0x28, 0x2f, 0x14, 0x20, 0x2b, 0x13, 0x1d, 0x27, 0x17, 0x20, 0x24,
+ 0x1d, 0x27, 0x42, 0x17, 0x2e, 0x4f, 0x10, 0x31, 0x50, 0x1b, 0x3c, 0x5b,
+ 0x19, 0x3b, 0x5f, 0x1c, 0x3f, 0x66, 0x17, 0x34, 0x51, 0x17, 0x29, 0x39,
+ 0x19, 0x31, 0x39, 0x14, 0x34, 0x4d, 0x1d, 0x4d, 0x7b, 0x26, 0x64, 0xa6,
+ 0x25, 0x6d, 0xb7, 0x27, 0x72, 0xbd, 0x27, 0x74, 0xba, 0x2a, 0x75, 0xb9,
+ 0x2b, 0x6b, 0xb2, 0x22, 0x66, 0xaa, 0x32, 0x79, 0xb9, 0x1f, 0x67, 0xa6,
+ 0x15, 0x59, 0x98, 0x10, 0x4b, 0x85, 0x18, 0x49, 0x7a, 0x1e, 0x4a, 0x72,
+ 0x1a, 0x44, 0x72, 0x15, 0x37, 0x59, 0x18, 0x32, 0x4b, 0x12, 0x32, 0x4a,
+ 0x13, 0x42, 0x65, 0x1e, 0x5b, 0x90, 0x17, 0x5a, 0x9c, 0x06, 0x48, 0x8d,
+ 0x0d, 0x36, 0x6d, 0x0a, 0x2a, 0x55, 0x0c, 0x23, 0x41, 0x0b, 0x1e, 0x32,
+ 0x0d, 0x1e, 0x32, 0x0c, 0x1f, 0x32, 0x0f, 0x21, 0x34, 0x15, 0x29, 0x3a,
+ 0x18, 0x28, 0x39, 0x09, 0x14, 0x1d, 0x05, 0x08, 0x09, 0x06, 0x06, 0x03,
+ 0x05, 0x04, 0x02, 0x04, 0x04, 0x03, 0x08, 0x07, 0x06, 0x08, 0x07, 0x04,
+ 0x08, 0x09, 0x0b, 0x0a, 0x0a, 0x0d, 0x09, 0x09, 0x0a, 0x08, 0x08, 0x08,
+ 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, 0x3f, 0x41, 0x40, 0x3f, 0x42, 0x41,
+ 0x3a, 0x3a, 0x31, 0x5c, 0x59, 0x4e, 0x73, 0x6f, 0x64, 0x74, 0x6d, 0x67,
+ 0x6f, 0x67, 0x66, 0x44, 0x3c, 0x3a, 0x55, 0x51, 0x46, 0x7b, 0x78, 0x65,
+ 0x83, 0x82, 0x73, 0x87, 0x87, 0x79, 0x8e, 0x90, 0x81, 0x8b, 0x8f, 0x80,
+ 0x94, 0x97, 0x8b, 0xb2, 0xb5, 0xae, 0x8f, 0x91, 0x8e, 0x8d, 0x8f, 0x8d,
+ 0xa6, 0xa6, 0xa6, 0xb1, 0xb0, 0xb5, 0x97, 0x99, 0x9f, 0xa4, 0xaa, 0xad,
+ 0xac, 0xb2, 0xb1, 0x87, 0x8e, 0x87, 0xb6, 0xbd, 0xb5, 0xdd, 0xe4, 0xdb,
+ 0xb1, 0xb8, 0xc1, 0x91, 0x97, 0xa5, 0x97, 0x9d, 0xa8, 0x90, 0x97, 0x9f,
+ 0x8f, 0x98, 0xa7, 0x7a, 0x7d, 0x9d, 0x56, 0x55, 0x79, 0x3a, 0x37, 0x52,
+ 0x33, 0x2a, 0x35, 0x2c, 0x2a, 0x30, 0x27, 0x2b, 0x2c, 0x28, 0x2e, 0x2c,
+ 0x25, 0x2a, 0x28, 0x23, 0x29, 0x27, 0x22, 0x28, 0x26, 0x1d, 0x25, 0x24,
+ 0x21, 0x26, 0x24, 0x1d, 0x21, 0x20, 0x21, 0x23, 0x22, 0x21, 0x23, 0x22,
+ 0x1f, 0x21, 0x20, 0x1b, 0x1d, 0x1c, 0x15, 0x17, 0x16, 0x0e, 0x10, 0x0f,
+ 0x09, 0x09, 0x0a, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x09, 0x1a, 0x1a, 0x1a,
+ 0x29, 0x2a, 0x27, 0x17, 0x17, 0x17, 0x0e, 0x10, 0x11, 0x0b, 0x0c, 0x0f,
+ 0x0d, 0x0e, 0x12, 0x12, 0x16, 0x18, 0x1a, 0x1e, 0x21, 0x1d, 0x21, 0x22,
+ 0x1c, 0x1b, 0x1e, 0x17, 0x1a, 0x1e, 0x15, 0x1d, 0x1f, 0x1e, 0x20, 0x1c,
+ 0x2a, 0x1e, 0x10, 0x4b, 0x38, 0x23, 0x5d, 0x4e, 0x36, 0x58, 0x4e, 0x3a,
+ 0x4a, 0x3b, 0x31, 0x43, 0x37, 0x2b, 0x57, 0x48, 0x33, 0x7a, 0x66, 0x41,
+ 0xa2, 0x88, 0x53, 0xc7, 0xa8, 0x71, 0xe3, 0xc7, 0x95, 0xf7, 0xe4, 0xbd,
+ 0xfc, 0xf5, 0xe9, 0xff, 0xf9, 0xe9, 0xff, 0xf3, 0xd9, 0xfc, 0xdf, 0xbf,
+ 0xf9, 0xca, 0xa5, 0xf2, 0xba, 0x92, 0xe6, 0xae, 0x82, 0xda, 0xa4, 0x76,
+ 0xcb, 0x8e, 0x63, 0xbb, 0x86, 0x5a, 0xae, 0x89, 0x5b, 0xaa, 0x91, 0x61,
+ 0xab, 0x9d, 0x6e, 0xae, 0xaa, 0x7a, 0xb4, 0xb8, 0x85, 0xb7, 0xc1, 0x8d,
+ 0xb4, 0xc4, 0x95, 0xb0, 0xbf, 0x94, 0x9e, 0xa9, 0x83, 0x80, 0x8a, 0x6a,
+ 0x75, 0x81, 0x69, 0x62, 0x6d, 0x63, 0x3d, 0x49, 0x4f, 0x2e, 0x3d, 0x4c,
+ 0x2a, 0x30, 0x3c, 0x23, 0x25, 0x28, 0x2c, 0x2a, 0x25, 0x31, 0x29, 0x24,
+ 0x2c, 0x1c, 0x1d, 0x2e, 0x17, 0x19, 0x43, 0x27, 0x1f, 0x55, 0x37, 0x24,
+ 0x15, 0x17, 0x16, 0x13, 0x15, 0x14, 0x10, 0x11, 0x10, 0x12, 0x14, 0x13,
+ 0x13, 0x15, 0x14, 0x11, 0x13, 0x12, 0x11, 0x13, 0x12, 0x12, 0x13, 0x12,
+ 0x12, 0x12, 0x10, 0x13, 0x13, 0x11, 0x14, 0x14, 0x12, 0x0f, 0x0f, 0x0d,
+ 0x0f, 0x0e, 0x0d, 0x0f, 0x0f, 0x0d, 0x11, 0x11, 0x11, 0x10, 0x0f, 0x10,
+ 0x0e, 0x0d, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x13, 0x12, 0x13,
+ 0x10, 0x0e, 0x0f, 0x13, 0x10, 0x0f, 0x31, 0x2e, 0x25, 0x6c, 0x69, 0x5b,
+ 0x55, 0x52, 0x44, 0x25, 0x22, 0x17, 0x14, 0x13, 0x0d, 0x11, 0x11, 0x0f,
+ 0x0f, 0x0f, 0x0c, 0x0f, 0x10, 0x0b, 0x0f, 0x0f, 0x0d, 0x17, 0x18, 0x17,
+ 0x14, 0x16, 0x15, 0x0b, 0x0d, 0x0c, 0x12, 0x15, 0x14, 0x14, 0x16, 0x15,
+ 0x10, 0x11, 0x13, 0x11, 0x12, 0x14, 0x0e, 0x10, 0x12, 0x11, 0x12, 0x13,
+ 0x16, 0x18, 0x17, 0x12, 0x13, 0x10, 0x14, 0x13, 0x10, 0x0e, 0x0d, 0x0d,
+ 0x07, 0x07, 0x08, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x04,
+ 0x09, 0x07, 0x07, 0x05, 0x07, 0x04, 0x03, 0x09, 0x03, 0x03, 0x08, 0x05,
+ 0x08, 0x07, 0x0b, 0x09, 0x05, 0x0c, 0x08, 0x07, 0x09, 0x0a, 0x0b, 0x08,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f,
+ 0x13, 0x13, 0x13, 0x0f, 0x0f, 0x0f, 0x0d, 0x0f, 0x0e, 0x13, 0x15, 0x14,
+ 0x21, 0x22, 0x26, 0x28, 0x29, 0x2d, 0x20, 0x21, 0x25, 0x13, 0x14, 0x16,
+ 0x0b, 0x0b, 0x0d, 0x06, 0x06, 0x08, 0x05, 0x05, 0x06, 0x05, 0x05, 0x07,
+ 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x05, 0x05, 0x03, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x06, 0x06, 0x08, 0x06, 0x06, 0x08,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x06, 0x07,
+ 0x0a, 0x06, 0x0b, 0x09, 0x09, 0x0a, 0x09, 0x0a, 0x06, 0x09, 0x0a, 0x04,
+ 0x07, 0x08, 0x07, 0x0e, 0x1d, 0x2a, 0x30, 0x55, 0x74, 0x32, 0x68, 0x97,
+ 0x27, 0x67, 0x9b, 0x28, 0x66, 0x9b, 0x24, 0x5e, 0x93, 0x20, 0x53, 0x84,
+ 0x19, 0x46, 0x73, 0x18, 0x42, 0x6a, 0x16, 0x42, 0x67, 0x15, 0x44, 0x69,
+ 0x14, 0x44, 0x6d, 0x16, 0x42, 0x6a, 0x18, 0x3d, 0x66, 0x13, 0x34, 0x5b,
+ 0x0e, 0x2b, 0x4d, 0x0a, 0x22, 0x3e, 0x08, 0x1b, 0x31, 0x0d, 0x1c, 0x30,
+ 0x0c, 0x1c, 0x32, 0x0b, 0x1c, 0x2f, 0x0a, 0x1b, 0x2a, 0x0c, 0x1e, 0x2c,
+ 0x0f, 0x20, 0x30, 0x0e, 0x1e, 0x31, 0x0d, 0x1c, 0x2e, 0x10, 0x1e, 0x2f,
+ 0x0e, 0x1d, 0x34, 0x0c, 0x1b, 0x2e, 0x0d, 0x1d, 0x2c, 0x0d, 0x1e, 0x2e,
+ 0x0a, 0x1b, 0x2d, 0x0b, 0x1d, 0x2f, 0x10, 0x1f, 0x2e, 0x0c, 0x15, 0x20,
+ 0x09, 0x0d, 0x13, 0x08, 0x0e, 0x13, 0x12, 0x1c, 0x22, 0x15, 0x22, 0x2c,
+ 0x15, 0x22, 0x32, 0x12, 0x1f, 0x30, 0x0e, 0x1d, 0x2d, 0x0c, 0x1d, 0x2d,
+ 0x0c, 0x1c, 0x30, 0x0d, 0x17, 0x24, 0x11, 0x1a, 0x23, 0x14, 0x24, 0x31,
+ 0x1a, 0x30, 0x3d, 0x22, 0x34, 0x42, 0x21, 0x32, 0x49, 0x1b, 0x31, 0x50,
+ 0x15, 0x30, 0x4d, 0x14, 0x2e, 0x53, 0x11, 0x29, 0x49, 0x14, 0x2a, 0x37,
+ 0x17, 0x28, 0x2c, 0x16, 0x22, 0x2e, 0x13, 0x1f, 0x2e, 0x16, 0x23, 0x2f,
+ 0x15, 0x2c, 0x47, 0x18, 0x30, 0x4c, 0x19, 0x32, 0x52, 0x1a, 0x39, 0x5d,
+ 0x16, 0x3c, 0x60, 0x17, 0x3d, 0x61, 0x18, 0x34, 0x53, 0x19, 0x2d, 0x45,
+ 0x16, 0x38, 0x55, 0x1c, 0x50, 0x7d, 0x26, 0x6c, 0xa8, 0x26, 0x73, 0xb9,
+ 0x27, 0x74, 0xbc, 0x2a, 0x73, 0xbd, 0x2b, 0x72, 0xbb, 0x27, 0x67, 0xac,
+ 0x12, 0x46, 0x75, 0x27, 0x67, 0x99, 0x32, 0x7c, 0xb8, 0x25, 0x6f, 0xb0,
+ 0x1c, 0x59, 0x99, 0x13, 0x47, 0x7e, 0x11, 0x44, 0x6f, 0x12, 0x47, 0x69,
+ 0x14, 0x3e, 0x60, 0x14, 0x33, 0x4e, 0x18, 0x31, 0x48, 0x0c, 0x30, 0x4f,
+ 0x1e, 0x57, 0x88, 0x1d, 0x63, 0xa1, 0x11, 0x55, 0x97, 0x07, 0x40, 0x82,
+ 0x10, 0x32, 0x6c, 0x0b, 0x27, 0x54, 0x0b, 0x20, 0x3e, 0x0a, 0x1e, 0x31,
+ 0x0c, 0x22, 0x31, 0x0c, 0x24, 0x31, 0x12, 0x27, 0x31, 0x18, 0x27, 0x32,
+ 0x17, 0x2c, 0x42, 0x11, 0x22, 0x32, 0x07, 0x0b, 0x14, 0x07, 0x04, 0x07,
+ 0x06, 0x02, 0x01, 0x07, 0x05, 0x05, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0a,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0a, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x0c, 0x0c, 0x0c, 0x30, 0x30, 0x32, 0x24, 0x24, 0x26,
+ 0x17, 0x17, 0x15, 0x31, 0x2c, 0x26, 0x6a, 0x5f, 0x55, 0x5a, 0x4e, 0x40,
+ 0x4e, 0x45, 0x38, 0x53, 0x4a, 0x41, 0x5d, 0x56, 0x50, 0x70, 0x6a, 0x65,
+ 0x7f, 0x80, 0x6d, 0x87, 0x86, 0x71, 0x89, 0x88, 0x72, 0x8c, 0x8b, 0x79,
+ 0x8a, 0x8d, 0x7f, 0x8a, 0x90, 0x85, 0x87, 0x8d, 0x82, 0xa5, 0xab, 0x9f,
+ 0xb2, 0xb8, 0xaf, 0xce, 0xd2, 0xd8, 0xb6, 0xbd, 0xc6, 0xa7, 0xab, 0xb4,
+ 0x8e, 0x8e, 0x9b, 0x8b, 0x8c, 0x8d, 0xb3, 0xb7, 0xae, 0x9e, 0xa2, 0xa0,
+ 0x90, 0x8d, 0x8f, 0x9e, 0x9e, 0xa3, 0x8f, 0x94, 0x9d, 0x89, 0x94, 0x9f,
+ 0x93, 0xa3, 0xb0, 0x9a, 0xaa, 0xbc, 0x8e, 0x9f, 0xb7, 0x6d, 0x7c, 0x97,
+ 0x46, 0x4d, 0x69, 0x2e, 0x33, 0x46, 0x28, 0x2a, 0x35, 0x27, 0x28, 0x2b,
+ 0x26, 0x28, 0x27, 0x23, 0x27, 0x26, 0x23, 0x27, 0x28, 0x20, 0x25, 0x25,
+ 0x23, 0x26, 0x25, 0x21, 0x23, 0x22, 0x21, 0x23, 0x22, 0x1c, 0x1e, 0x1d,
+ 0x19, 0x1b, 0x1a, 0x14, 0x16, 0x13, 0x11, 0x13, 0x10, 0x0b, 0x0b, 0x09,
+ 0x08, 0x09, 0x0c, 0x08, 0x08, 0x09, 0x07, 0x07, 0x05, 0x08, 0x08, 0x06,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x0b, 0x09, 0x09, 0x0a, 0x0c, 0x0c, 0x0b,
+ 0x1b, 0x1e, 0x17, 0x2b, 0x2b, 0x2c, 0x29, 0x28, 0x34, 0x15, 0x14, 0x23,
+ 0x0e, 0x11, 0x1a, 0x15, 0x1d, 0x1d, 0x19, 0x22, 0x1d, 0x20, 0x26, 0x23,
+ 0x1e, 0x26, 0x25, 0x1e, 0x21, 0x20, 0x14, 0x18, 0x13, 0x2b, 0x1c, 0x13,
+ 0x5b, 0x33, 0x1e, 0x74, 0x55, 0x2e, 0x62, 0x61, 0x3a, 0x5d, 0x6c, 0x51,
+ 0x5e, 0x66, 0x4c, 0x4f, 0x50, 0x3e, 0x45, 0x3d, 0x32, 0x4c, 0x3c, 0x31,
+ 0x65, 0x4c, 0x39, 0x88, 0x6b, 0x4b, 0xad, 0x8e, 0x63, 0xcc, 0xac, 0x7d,
+ 0xe0, 0xc2, 0x93, 0xec, 0xcb, 0x9e, 0xf8, 0xd7, 0xac, 0xfd, 0xd7, 0xab,
+ 0xf9, 0xce, 0xa2, 0xf3, 0xc4, 0x97, 0xf0, 0xba, 0x8d, 0xec, 0xb2, 0x86,
+ 0xe3, 0xaa, 0x7c, 0xd8, 0x9e, 0x72, 0xcb, 0x91, 0x65, 0xbd, 0x86, 0x5b,
+ 0xaf, 0x7b, 0x51, 0xa0, 0x76, 0x47, 0x9e, 0x7e, 0x4c, 0xa5, 0x8a, 0x56,
+ 0xa2, 0x95, 0x65, 0xa6, 0x9a, 0x6f, 0x98, 0x8e, 0x6b, 0x83, 0x7b, 0x61,
+ 0x79, 0x71, 0x63, 0x62, 0x5a, 0x56, 0x53, 0x49, 0x4e, 0x51, 0x47, 0x4f,
+ 0x54, 0x43, 0x49, 0x5b, 0x47, 0x48, 0x5a, 0x40, 0x3c, 0x54, 0x38, 0x34,
+ 0x4d, 0x30, 0x2c, 0x4c, 0x2f, 0x2b, 0x57, 0x39, 0x35, 0x60, 0x41, 0x3b,
+ 0x12, 0x14, 0x13, 0x11, 0x13, 0x12, 0x10, 0x12, 0x11, 0x11, 0x13, 0x12,
+ 0x13, 0x14, 0x14, 0x0f, 0x11, 0x10, 0x0d, 0x0f, 0x0e, 0x0f, 0x11, 0x10,
+ 0x12, 0x12, 0x11, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0a,
+ 0x0f, 0x0f, 0x0d, 0x0e, 0x0e, 0x0c, 0x0d, 0x0e, 0x0d, 0x0d, 0x0d, 0x0e,
+ 0x0e, 0x0e, 0x10, 0x0d, 0x0d, 0x0b, 0x0f, 0x10, 0x0b, 0x10, 0x10, 0x10,
+ 0x15, 0x13, 0x15, 0x34, 0x31, 0x32, 0x6a, 0x67, 0x5c, 0x69, 0x67, 0x52,
+ 0x2f, 0x2d, 0x21, 0x13, 0x10, 0x09, 0x0f, 0x0e, 0x0b, 0x0e, 0x0f, 0x0d,
+ 0x0f, 0x0f, 0x0d, 0x0c, 0x0d, 0x0a, 0x0e, 0x0e, 0x0c, 0x18, 0x18, 0x18,
+ 0x11, 0x13, 0x12, 0x0d, 0x0f, 0x0e, 0x0f, 0x11, 0x10, 0x10, 0x12, 0x11,
+ 0x11, 0x12, 0x13, 0x10, 0x11, 0x13, 0x11, 0x12, 0x15, 0x12, 0x13, 0x15,
+ 0x17, 0x19, 0x17, 0x17, 0x19, 0x16, 0x0e, 0x0f, 0x0d, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x06, 0x07,
+ 0x0a, 0x08, 0x0c, 0x0f, 0x0e, 0x12, 0x10, 0x0f, 0x13, 0x0a, 0x09, 0x0a,
+ 0x08, 0x06, 0x07, 0x07, 0x05, 0x04, 0x08, 0x08, 0x08, 0x0c, 0x0d, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x12, 0x11, 0x0e, 0x10, 0x0f,
+ 0x11, 0x12, 0x14, 0x18, 0x19, 0x1b, 0x23, 0x24, 0x26, 0x23, 0x24, 0x26,
+ 0x1d, 0x1d, 0x1f, 0x10, 0x11, 0x13, 0x08, 0x09, 0x0b, 0x03, 0x04, 0x07,
+ 0x03, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x06, 0x09, 0x07, 0x09, 0x08, 0x06, 0x0a, 0x06, 0x08, 0x09, 0x04,
+ 0x08, 0x09, 0x09, 0x25, 0x30, 0x3e, 0x4c, 0x6d, 0x8c, 0x3a, 0x6e, 0x99,
+ 0x2b, 0x69, 0xa4, 0x2b, 0x69, 0xa1, 0x26, 0x62, 0x94, 0x21, 0x57, 0x83,
+ 0x1a, 0x47, 0x6e, 0x16, 0x3d, 0x65, 0x1c, 0x43, 0x6b, 0x1c, 0x43, 0x70,
+ 0x13, 0x3e, 0x6c, 0x14, 0x3a, 0x64, 0x14, 0x34, 0x5b, 0x0d, 0x28, 0x48,
+ 0x07, 0x1e, 0x38, 0x0b, 0x1f, 0x34, 0x0c, 0x1d, 0x2f, 0x0b, 0x1b, 0x2c,
+ 0x0d, 0x1c, 0x31, 0x0a, 0x1a, 0x2d, 0x0b, 0x1d, 0x2b, 0x0c, 0x1e, 0x2c,
+ 0x0c, 0x1d, 0x2d, 0x0c, 0x1b, 0x2e, 0x0e, 0x1d, 0x30, 0x12, 0x20, 0x31,
+ 0x0e, 0x1e, 0x34, 0x0c, 0x1b, 0x2e, 0x0d, 0x1d, 0x2c, 0x0b, 0x1c, 0x2c,
+ 0x0b, 0x1c, 0x2e, 0x0e, 0x1f, 0x31, 0x0e, 0x1d, 0x2c, 0x0a, 0x14, 0x1e,
+ 0x08, 0x0d, 0x13, 0x08, 0x0f, 0x14, 0x15, 0x1e, 0x22, 0x17, 0x24, 0x2c,
+ 0x15, 0x22, 0x30, 0x0f, 0x1e, 0x31, 0x0d, 0x1e, 0x32, 0x0f, 0x20, 0x34,
+ 0x0e, 0x21, 0x35, 0x0f, 0x1a, 0x28, 0x13, 0x1d, 0x26, 0x17, 0x27, 0x2c,
+ 0x25, 0x38, 0x35, 0x3f, 0x50, 0x44, 0x42, 0x51, 0x4b, 0x28, 0x3a, 0x42,
+ 0x19, 0x30, 0x46, 0x16, 0x2b, 0x4b, 0x11, 0x27, 0x42, 0x14, 0x2a, 0x34,
+ 0x18, 0x29, 0x2b, 0x16, 0x24, 0x2d, 0x10, 0x20, 0x2f, 0x16, 0x28, 0x35,
+ 0x16, 0x2e, 0x45, 0x14, 0x2f, 0x4c, 0x13, 0x33, 0x56, 0x16, 0x3a, 0x5f,
+ 0x16, 0x3a, 0x5c, 0x19, 0x3d, 0x5d, 0x14, 0x36, 0x59, 0x16, 0x38, 0x5c,
+ 0x27, 0x51, 0x85, 0x2d, 0x6c, 0xaf, 0x2a, 0x72, 0xbc, 0x30, 0x74, 0xb8,
+ 0x2f, 0x76, 0xbb, 0x24, 0x72, 0xbb, 0x22, 0x65, 0xa5, 0x13, 0x41, 0x6e,
+ 0x02, 0x22, 0x47, 0x1c, 0x50, 0x7c, 0x22, 0x6c, 0xa2, 0x17, 0x66, 0xa4,
+ 0x17, 0x5a, 0x97, 0x16, 0x4b, 0x81, 0x18, 0x46, 0x72, 0x14, 0x40, 0x65,
+ 0x16, 0x38, 0x56, 0x17, 0x34, 0x50, 0x0f, 0x2e, 0x4b, 0x08, 0x34, 0x5c,
+ 0x1b, 0x5a, 0x92, 0x10, 0x57, 0x98, 0x0a, 0x4b, 0x8a, 0x09, 0x3c, 0x76,
+ 0x0d, 0x36, 0x61, 0x0b, 0x2b, 0x4e, 0x0e, 0x23, 0x3e, 0x0f, 0x1f, 0x35,
+ 0x0d, 0x20, 0x34, 0x11, 0x26, 0x3a, 0x12, 0x28, 0x3a, 0x14, 0x29, 0x3a,
+ 0x18, 0x2f, 0x41, 0x1f, 0x2f, 0x3c, 0x0c, 0x13, 0x19, 0x05, 0x05, 0x05,
+ 0x05, 0x03, 0x02, 0x07, 0x07, 0x07, 0x0d, 0x0f, 0x0e, 0x0c, 0x0e, 0x0d,
+ 0x0e, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x07,
+ 0x04, 0x04, 0x04, 0x0c, 0x0c, 0x0c, 0x16, 0x16, 0x18, 0x14, 0x15, 0x16,
+ 0x1d, 0x1a, 0x19, 0x2a, 0x22, 0x20, 0x43, 0x35, 0x32, 0x45, 0x39, 0x2e,
+ 0x59, 0x50, 0x41, 0x74, 0x6d, 0x5d, 0x71, 0x69, 0x5f, 0x74, 0x6a, 0x66,
+ 0x76, 0x73, 0x6d, 0x76, 0x72, 0x68, 0x80, 0x7a, 0x6f, 0x84, 0x80, 0x76,
+ 0x87, 0x88, 0x81, 0x7d, 0x7f, 0x79, 0x89, 0x8b, 0x85, 0xb4, 0xb8, 0xaf,
+ 0xb0, 0xbb, 0xae, 0xa8, 0xb1, 0xb3, 0xad, 0xb6, 0xbc, 0xc5, 0xcb, 0xcf,
+ 0x95, 0x97, 0xa1, 0x86, 0x87, 0x89, 0x8c, 0x91, 0x8a, 0x85, 0x8a, 0x8d,
+ 0x7f, 0x83, 0x86, 0x97, 0x9b, 0xa1, 0x8f, 0x97, 0xa0, 0x75, 0x84, 0x8f,
+ 0x86, 0x99, 0xa5, 0x99, 0xad, 0xb9, 0x99, 0xac, 0xbe, 0x8b, 0x9d, 0xb4,
+ 0x72, 0x7d, 0x95, 0x4a, 0x51, 0x63, 0x2f, 0x31, 0x3c, 0x27, 0x28, 0x2c,
+ 0x21, 0x25, 0x26, 0x21, 0x25, 0x26, 0x21, 0x25, 0x26, 0x23, 0x27, 0x26,
+ 0x23, 0x25, 0x24, 0x20, 0x22, 0x21, 0x1e, 0x20, 0x1f, 0x16, 0x18, 0x18,
+ 0x14, 0x16, 0x15, 0x10, 0x12, 0x0f, 0x0c, 0x0c, 0x0a, 0x08, 0x08, 0x06,
+ 0x09, 0x08, 0x0c, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x08, 0x09, 0x09, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x09, 0x09, 0x09, 0x10, 0x10, 0x0c,
+ 0x2e, 0x30, 0x24, 0x59, 0x59, 0x54, 0x56, 0x53, 0x59, 0x22, 0x21, 0x2a,
+ 0x0f, 0x12, 0x18, 0x16, 0x1c, 0x1d, 0x17, 0x1d, 0x1c, 0x1c, 0x20, 0x21,
+ 0x14, 0x19, 0x1c, 0x19, 0x17, 0x14, 0x20, 0x1a, 0x11, 0x47, 0x32, 0x25,
+ 0x74, 0x4e, 0x36, 0x69, 0x4f, 0x25, 0x5d, 0x62, 0x34, 0x5e, 0x73, 0x4e,
+ 0x5f, 0x79, 0x54, 0x60, 0x75, 0x57, 0x5a, 0x63, 0x4e, 0x4e, 0x4b, 0x3b,
+ 0x4c, 0x3e, 0x2b, 0x57, 0x3f, 0x26, 0x71, 0x52, 0x33, 0x9a, 0x79, 0x57,
+ 0xb8, 0x95, 0x6c, 0xc6, 0x9f, 0x75, 0xd2, 0xa6, 0x78, 0xdf, 0xb2, 0x81,
+ 0xe7, 0xbc, 0x89, 0xe3, 0xb6, 0x83, 0xe0, 0xad, 0x80, 0xde, 0xa9, 0x7f,
+ 0xdc, 0xab, 0x7d, 0xdc, 0xab, 0x7d, 0xd8, 0xa7, 0x79, 0xd0, 0x9f, 0x72,
+ 0xc2, 0x93, 0x67, 0xab, 0x84, 0x55, 0x9e, 0x7e, 0x4e, 0x98, 0x78, 0x49,
+ 0x93, 0x74, 0x47, 0x95, 0x74, 0x4c, 0x91, 0x71, 0x4c, 0x88, 0x68, 0x4b,
+ 0x80, 0x5f, 0x48, 0x7a, 0x55, 0x46, 0x7b, 0x55, 0x4b, 0x7d, 0x56, 0x4e,
+ 0x76, 0x54, 0x49, 0x74, 0x51, 0x43, 0x76, 0x4e, 0x3d, 0x73, 0x49, 0x38,
+ 0x77, 0x51, 0x41, 0x79, 0x55, 0x4a, 0x7d, 0x58, 0x4f, 0x77, 0x53, 0x48,
+ 0x12, 0x12, 0x12, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x12, 0x12,
+ 0x0e, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12,
+ 0x12, 0x12, 0x12, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0e, 0x0d, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x12, 0x12, 0x0f, 0x12, 0x12, 0x10, 0x0d, 0x0d, 0x0d, 0x17, 0x17, 0x16,
+ 0x3e, 0x3e, 0x3a, 0x6d, 0x6d, 0x65, 0x65, 0x63, 0x53, 0x32, 0x31, 0x1e,
+ 0x15, 0x12, 0x0a, 0x0d, 0x0b, 0x09, 0x0c, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0a, 0x0b, 0x0b, 0x09, 0x10, 0x10, 0x10,
+ 0x0e, 0x0f, 0x0f, 0x0c, 0x0e, 0x0d, 0x0b, 0x0d, 0x0c, 0x0d, 0x0f, 0x0e,
+ 0x11, 0x12, 0x14, 0x0f, 0x10, 0x12, 0x10, 0x11, 0x14, 0x13, 0x14, 0x16,
+ 0x15, 0x17, 0x14, 0x14, 0x16, 0x13, 0x0d, 0x0e, 0x0c, 0x07, 0x07, 0x06,
+ 0x07, 0x07, 0x06, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x08,
+ 0x0a, 0x0b, 0x07, 0x3a, 0x36, 0x2c, 0x5f, 0x56, 0x4a, 0x35, 0x2d, 0x21,
+ 0x0c, 0x09, 0x02, 0x06, 0x08, 0x05, 0x06, 0x08, 0x07, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0f, 0x0e, 0x0e, 0x10, 0x0f,
+ 0x0d, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x12, 0x14, 0x13, 0x1c, 0x1d, 0x1e,
+ 0x25, 0x26, 0x28, 0x22, 0x26, 0x27, 0x14, 0x18, 0x1b, 0x0a, 0x0e, 0x11,
+ 0x06, 0x08, 0x07, 0x03, 0x05, 0x04, 0x03, 0x05, 0x04, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x06,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06,
+ 0x08, 0x08, 0x08, 0x05, 0x08, 0x07, 0x05, 0x08, 0x07, 0x08, 0x08, 0x06,
+ 0x09, 0x09, 0x0a, 0x24, 0x2e, 0x39, 0x2a, 0x46, 0x5c, 0x32, 0x5e, 0x7e,
+ 0x35, 0x6e, 0xa0, 0x34, 0x70, 0xa4, 0x32, 0x6e, 0xa0, 0x2d, 0x68, 0x96,
+ 0x24, 0x57, 0x82, 0x1f, 0x4a, 0x76, 0x21, 0x46, 0x73, 0x1e, 0x40, 0x6e,
+ 0x15, 0x3b, 0x64, 0x0f, 0x2f, 0x54, 0x0b, 0x22, 0x42, 0x0b, 0x1f, 0x36,
+ 0x0d, 0x1e, 0x32, 0x0c, 0x1d, 0x30, 0x0b, 0x1c, 0x2e, 0x0c, 0x1b, 0x2e,
+ 0x0c, 0x1b, 0x2f, 0x0c, 0x1c, 0x2c, 0x0c, 0x1d, 0x2b, 0x0b, 0x1d, 0x2b,
+ 0x0a, 0x1b, 0x2b, 0x0e, 0x1d, 0x30, 0x0e, 0x1d, 0x31, 0x12, 0x1f, 0x32,
+ 0x10, 0x1f, 0x36, 0x0c, 0x1b, 0x2f, 0x0a, 0x1a, 0x29, 0x0b, 0x1d, 0x2d,
+ 0x0e, 0x1f, 0x33, 0x0d, 0x1e, 0x32, 0x0e, 0x1c, 0x2b, 0x0a, 0x14, 0x1e,
+ 0x0a, 0x0e, 0x14, 0x0c, 0x11, 0x15, 0x17, 0x21, 0x22, 0x19, 0x26, 0x2b,
+ 0x11, 0x22, 0x2e, 0x0c, 0x1f, 0x32, 0x0b, 0x20, 0x37, 0x11, 0x25, 0x3f,
+ 0x0e, 0x29, 0x3a, 0x10, 0x20, 0x2e, 0x13, 0x1b, 0x27, 0x20, 0x26, 0x27,
+ 0x59, 0x5b, 0x46, 0x7f, 0x77, 0x55, 0x7b, 0x6c, 0x53, 0x56, 0x4c, 0x45,
+ 0x27, 0x37, 0x48, 0x1b, 0x2d, 0x46, 0x16, 0x29, 0x3f, 0x15, 0x29, 0x32,
+ 0x17, 0x2a, 0x2d, 0x13, 0x24, 0x2c, 0x11, 0x23, 0x31, 0x13, 0x26, 0x34,
+ 0x15, 0x2c, 0x40, 0x12, 0x32, 0x4e, 0x12, 0x37, 0x5a, 0x15, 0x3b, 0x5f,
+ 0x19, 0x3d, 0x5d, 0x1a, 0x3e, 0x60, 0x18, 0x45, 0x6f, 0x1f, 0x55, 0x89,
+ 0x2c, 0x69, 0xaf, 0x2b, 0x70, 0xbe, 0x2a, 0x71, 0xbc, 0x31, 0x72, 0xb7,
+ 0x31, 0x72, 0xb6, 0x1c, 0x61, 0xa4, 0x08, 0x3a, 0x6d, 0x09, 0x22, 0x40,
+ 0x0c, 0x1d, 0x38, 0x0b, 0x30, 0x55, 0x1b, 0x5b, 0x8e, 0x11, 0x5c, 0x97,
+ 0x10, 0x52, 0x8e, 0x15, 0x48, 0x7d, 0x1d, 0x48, 0x74, 0x1b, 0x43, 0x69,
+ 0x19, 0x3a, 0x5a, 0x10, 0x2d, 0x4d, 0x09, 0x27, 0x48, 0x0c, 0x35, 0x5e,
+ 0x16, 0x50, 0x83, 0x11, 0x4f, 0x88, 0x0d, 0x44, 0x7c, 0x0a, 0x38, 0x6a,
+ 0x0b, 0x37, 0x5b, 0x0d, 0x32, 0x52, 0x0f, 0x27, 0x43, 0x13, 0x25, 0x3e,
+ 0x13, 0x24, 0x3d, 0x12, 0x26, 0x3d, 0x10, 0x29, 0x3f, 0x12, 0x2d, 0x3e,
+ 0x18, 0x2e, 0x3a, 0x15, 0x25, 0x2e, 0x07, 0x0e, 0x12, 0x03, 0x05, 0x04,
+ 0x06, 0x06, 0x04, 0x08, 0x09, 0x08, 0x0a, 0x0c, 0x0d, 0x0c, 0x0d, 0x0f,
+ 0x0e, 0x0e, 0x0f, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x05, 0x0e, 0x0e, 0x0e, 0x17, 0x18, 0x19, 0x16, 0x17, 0x18,
+ 0x21, 0x1a, 0x1a, 0x32, 0x25, 0x27, 0x2d, 0x21, 0x21, 0x44, 0x39, 0x35,
+ 0x72, 0x6a, 0x60, 0x78, 0x71, 0x64, 0x78, 0x6e, 0x63, 0x74, 0x66, 0x5f,
+ 0x65, 0x5e, 0x58, 0x5d, 0x54, 0x4d, 0x6d, 0x65, 0x5b, 0x81, 0x7c, 0x70,
+ 0x86, 0x83, 0x78, 0x84, 0x85, 0x78, 0x8d, 0x8e, 0x81, 0xab, 0xad, 0x9d,
+ 0xd4, 0xde, 0xd0, 0xc5, 0xcf, 0xcd, 0x95, 0x9e, 0x9d, 0xd0, 0xd7, 0xd3,
+ 0xa2, 0xa3, 0xa6, 0x87, 0x89, 0x86, 0x90, 0x95, 0x8f, 0x87, 0x8f, 0x93,
+ 0x86, 0x90, 0x98, 0x88, 0x94, 0x9f, 0x9a, 0xa8, 0xb5, 0x8c, 0x9e, 0xaa,
+ 0x71, 0x85, 0x90, 0x80, 0x94, 0x9f, 0x91, 0xa4, 0xb2, 0x82, 0x94, 0xa4,
+ 0x71, 0x7f, 0x90, 0x59, 0x62, 0x71, 0x31, 0x36, 0x3f, 0x27, 0x28, 0x2e,
+ 0x21, 0x25, 0x28, 0x20, 0x24, 0x27, 0x21, 0x25, 0x26, 0x24, 0x26, 0x25,
+ 0x23, 0x25, 0x24, 0x1d, 0x1f, 0x1e, 0x1a, 0x1c, 0x1b, 0x18, 0x1a, 0x19,
+ 0x12, 0x14, 0x13, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x06, 0x09, 0x09, 0x08,
+ 0x0a, 0x0a, 0x0c, 0x07, 0x07, 0x07, 0x09, 0x09, 0x07, 0x0a, 0x0a, 0x08,
+ 0x08, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0a, 0x0b, 0x09, 0x17, 0x18, 0x12,
+ 0x42, 0x44, 0x34, 0x5b, 0x58, 0x4e, 0x55, 0x52, 0x4f, 0x20, 0x1e, 0x1f,
+ 0x17, 0x18, 0x1a, 0x1e, 0x22, 0x23, 0x1b, 0x1d, 0x21, 0x13, 0x12, 0x19,
+ 0x10, 0x10, 0x12, 0x22, 0x15, 0x0d, 0x43, 0x2e, 0x1e, 0x67, 0x4b, 0x38,
+ 0x6a, 0x47, 0x2f, 0x51, 0x43, 0x19, 0x59, 0x67, 0x34, 0x5e, 0x74, 0x46,
+ 0x5c, 0x7c, 0x50, 0x60, 0x7d, 0x56, 0x61, 0x78, 0x57, 0x62, 0x70, 0x54,
+ 0x5d, 0x61, 0x46, 0x56, 0x51, 0x36, 0x53, 0x44, 0x2b, 0x5d, 0x49, 0x32,
+ 0x7e, 0x5e, 0x40, 0x95, 0x71, 0x4d, 0xa5, 0x7b, 0x4f, 0xb4, 0x89, 0x57,
+ 0xc4, 0x99, 0x64, 0xc9, 0x9b, 0x69, 0xc6, 0x96, 0x6a, 0xc2, 0x8f, 0x68,
+ 0xbf, 0x8e, 0x66, 0xc1, 0x92, 0x68, 0xc4, 0x96, 0x6a, 0xc5, 0x99, 0x6c,
+ 0xbf, 0x95, 0x67, 0xb8, 0x8f, 0x64, 0xb5, 0x8e, 0x65, 0xaf, 0x8a, 0x62,
+ 0xa8, 0x87, 0x5f, 0xa3, 0x81, 0x5b, 0xa1, 0x7d, 0x59, 0x9f, 0x79, 0x58,
+ 0x9d, 0x72, 0x54, 0x9f, 0x71, 0x55, 0xa5, 0x74, 0x59, 0xa2, 0x70, 0x56,
+ 0x9f, 0x71, 0x59, 0xa0, 0x71, 0x57, 0xa0, 0x6f, 0x56, 0xa0, 0x71, 0x59,
+ 0x9d, 0x73, 0x60, 0x94, 0x6e, 0x5e, 0x8a, 0x64, 0x57, 0x75, 0x4f, 0x42,
+ 0x15, 0x15, 0x15, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0d, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x0e,
+ 0x0f, 0x0f, 0x0c, 0x12, 0x11, 0x11, 0x20, 0x21, 0x20, 0x46, 0x47, 0x41,
+ 0x6c, 0x6f, 0x5f, 0x5a, 0x5c, 0x47, 0x2c, 0x2d, 0x1e, 0x13, 0x11, 0x0b,
+ 0x11, 0x10, 0x0c, 0x0f, 0x0e, 0x0e, 0x0b, 0x0a, 0x0e, 0x0c, 0x0c, 0x0e,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x0c, 0x0c, 0x0c, 0x11, 0x10, 0x11,
+ 0x12, 0x12, 0x12, 0x0d, 0x0f, 0x0e, 0x0b, 0x0d, 0x0c, 0x0e, 0x10, 0x0f,
+ 0x10, 0x11, 0x12, 0x10, 0x11, 0x13, 0x0e, 0x0f, 0x12, 0x13, 0x14, 0x15,
+ 0x18, 0x1a, 0x17, 0x17, 0x19, 0x16, 0x10, 0x11, 0x0e, 0x09, 0x09, 0x07,
+ 0x06, 0x06, 0x04, 0x08, 0x08, 0x07, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07,
+ 0x06, 0x0b, 0x00, 0x5e, 0x5a, 0x38, 0xc1, 0xb6, 0x89, 0x67, 0x5d, 0x39,
+ 0x0b, 0x09, 0x00, 0x04, 0x07, 0x0e, 0x04, 0x07, 0x0a, 0x08, 0x07, 0x02,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x09, 0x09, 0x0b, 0x0d, 0x0c,
+ 0x0e, 0x0e, 0x0d, 0x0f, 0x0f, 0x0f, 0x0c, 0x0e, 0x0d, 0x0e, 0x10, 0x10,
+ 0x16, 0x1a, 0x1b, 0x24, 0x28, 0x29, 0x2b, 0x2f, 0x32, 0x1f, 0x24, 0x27,
+ 0x0f, 0x10, 0x12, 0x07, 0x08, 0x0a, 0x05, 0x06, 0x08, 0x05, 0x06, 0x08,
+ 0x05, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x05,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x08,
+ 0x09, 0x0b, 0x08, 0x06, 0x0a, 0x08, 0x04, 0x07, 0x08, 0x05, 0x06, 0x05,
+ 0x09, 0x08, 0x0a, 0x19, 0x1f, 0x27, 0x14, 0x29, 0x3a, 0x0e, 0x30, 0x49,
+ 0x1f, 0x4d, 0x68, 0x35, 0x68, 0x8b, 0x3d, 0x73, 0xa0, 0x36, 0x6d, 0xa3,
+ 0x34, 0x69, 0xa0, 0x31, 0x61, 0x94, 0x28, 0x54, 0x84, 0x19, 0x45, 0x72,
+ 0x0e, 0x31, 0x56, 0x07, 0x23, 0x43, 0x0d, 0x20, 0x3a, 0x0f, 0x1e, 0x31,
+ 0x0d, 0x1d, 0x2b, 0x0c, 0x1c, 0x2e, 0x0c, 0x1b, 0x34, 0x0c, 0x1a, 0x36,
+ 0x0b, 0x1a, 0x2e, 0x0a, 0x1a, 0x2a, 0x0b, 0x1c, 0x29, 0x0c, 0x1e, 0x2b,
+ 0x0c, 0x1d, 0x2d, 0x0b, 0x1a, 0x2d, 0x0d, 0x1b, 0x2e, 0x0f, 0x1c, 0x30,
+ 0x0e, 0x1e, 0x34, 0x0b, 0x1b, 0x2e, 0x0c, 0x1c, 0x2b, 0x0e, 0x1d, 0x2e,
+ 0x0c, 0x1d, 0x31, 0x0d, 0x1f, 0x33, 0x0b, 0x1a, 0x29, 0x09, 0x13, 0x1d,
+ 0x0d, 0x0d, 0x15, 0x0e, 0x13, 0x17, 0x18, 0x22, 0x23, 0x19, 0x28, 0x2b,
+ 0x11, 0x24, 0x2f, 0x0d, 0x21, 0x37, 0x0d, 0x24, 0x41, 0x14, 0x2b, 0x4a,
+ 0x0e, 0x2c, 0x3f, 0x11, 0x23, 0x34, 0x14, 0x1c, 0x2c, 0x1f, 0x23, 0x24,
+ 0x6c, 0x68, 0x50, 0x9b, 0x8a, 0x66, 0x85, 0x71, 0x54, 0x60, 0x53, 0x4c,
+ 0x2a, 0x3b, 0x4d, 0x18, 0x2b, 0x42, 0x15, 0x29, 0x3f, 0x17, 0x2b, 0x3a,
+ 0x18, 0x2b, 0x32, 0x13, 0x24, 0x2c, 0x14, 0x24, 0x30, 0x15, 0x26, 0x34,
+ 0x15, 0x2b, 0x3e, 0x15, 0x2f, 0x49, 0x17, 0x37, 0x58, 0x19, 0x3c, 0x60,
+ 0x19, 0x40, 0x67, 0x1d, 0x4e, 0x7c, 0x24, 0x5f, 0x97, 0x25, 0x69, 0xab,
+ 0x24, 0x71, 0xbb, 0x29, 0x71, 0xb6, 0x2b, 0x6e, 0xb3, 0x2a, 0x6e, 0xb3,
+ 0x1c, 0x5a, 0x9a, 0x08, 0x34, 0x67, 0x06, 0x1f, 0x47, 0x0b, 0x1d, 0x3c,
+ 0x09, 0x19, 0x29, 0x05, 0x23, 0x41, 0x23, 0x57, 0x8b, 0x19, 0x56, 0x95,
+ 0x13, 0x4a, 0x88, 0x14, 0x41, 0x75, 0x1a, 0x46, 0x6e, 0x19, 0x45, 0x68,
+ 0x0f, 0x34, 0x5b, 0x09, 0x27, 0x4b, 0x0d, 0x26, 0x44, 0x0f, 0x2a, 0x47,
+ 0x19, 0x3c, 0x5c, 0x21, 0x4b, 0x6f, 0x16, 0x40, 0x66, 0x0d, 0x35, 0x5c,
+ 0x12, 0x36, 0x5b, 0x14, 0x36, 0x5b, 0x11, 0x2d, 0x50, 0x10, 0x29, 0x49,
+ 0x13, 0x2b, 0x45, 0x13, 0x2a, 0x3e, 0x14, 0x2c, 0x3a, 0x15, 0x2d, 0x37,
+ 0x11, 0x22, 0x2a, 0x09, 0x14, 0x18, 0x02, 0x08, 0x08, 0x05, 0x05, 0x03,
+ 0x05, 0x06, 0x04, 0x03, 0x05, 0x04, 0x08, 0x0a, 0x0b, 0x0f, 0x0f, 0x11,
+ 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x0c, 0x0c, 0x0c, 0x13, 0x13, 0x15, 0x19, 0x18, 0x1a,
+ 0x21, 0x17, 0x1d, 0x25, 0x1b, 0x1c, 0x2a, 0x20, 0x1e, 0x51, 0x49, 0x46,
+ 0x78, 0x73, 0x73, 0x70, 0x69, 0x6a, 0x76, 0x6a, 0x67, 0x76, 0x68, 0x5f,
+ 0x64, 0x5a, 0x52, 0x5c, 0x52, 0x46, 0x60, 0x54, 0x47, 0x65, 0x5c, 0x4e,
+ 0x72, 0x6c, 0x5f, 0x7b, 0x79, 0x6a, 0x83, 0x82, 0x71, 0x8b, 0x8b, 0x79,
+ 0x96, 0x98, 0x8a, 0xa0, 0xa0, 0x9d, 0x99, 0x9a, 0x94, 0xa0, 0xa1, 0x99,
+ 0x8b, 0x8a, 0x87, 0x82, 0x84, 0x7f, 0xa2, 0xa9, 0xa3, 0x9d, 0xa9, 0xad,
+ 0x9c, 0xac, 0xbb, 0x7e, 0x8e, 0x9e, 0x83, 0x94, 0xa6, 0x9b, 0xac, 0xbe,
+ 0x8b, 0x9d, 0xac, 0x63, 0x75, 0x81, 0x7b, 0x8c, 0x98, 0x77, 0x87, 0x94,
+ 0x63, 0x73, 0x80, 0x50, 0x5d, 0x66, 0x27, 0x2d, 0x35, 0x23, 0x26, 0x2d,
+ 0x24, 0x27, 0x2c, 0x22, 0x25, 0x28, 0x23, 0x25, 0x26, 0x23, 0x24, 0x22,
+ 0x20, 0x22, 0x21, 0x1b, 0x1d, 0x1c, 0x18, 0x1a, 0x19, 0x14, 0x16, 0x15,
+ 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07,
+ 0x0a, 0x0a, 0x0b, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x09, 0x07, 0x07, 0x06,
+ 0x07, 0x07, 0x07, 0x08, 0x0a, 0x09, 0x0b, 0x0d, 0x0a, 0x12, 0x14, 0x0f,
+ 0x2b, 0x2d, 0x22, 0x33, 0x33, 0x2a, 0x23, 0x22, 0x1d, 0x14, 0x14, 0x12,
+ 0x15, 0x1a, 0x16, 0x22, 0x26, 0x27, 0x18, 0x18, 0x1d, 0x12, 0x10, 0x16,
+ 0x1e, 0x16, 0x11, 0x3d, 0x24, 0x12, 0x66, 0x47, 0x2b, 0x6b, 0x4b, 0x32,
+ 0x51, 0x34, 0x1c, 0x46, 0x43, 0x1c, 0x52, 0x67, 0x34, 0x60, 0x76, 0x46,
+ 0x66, 0x79, 0x4d, 0x65, 0x7a, 0x52, 0x62, 0x7b, 0x54, 0x64, 0x7d, 0x56,
+ 0x62, 0x78, 0x52, 0x60, 0x71, 0x4c, 0x5b, 0x68, 0x47, 0x53, 0x5a, 0x3f,
+ 0x5a, 0x4f, 0x31, 0x61, 0x4e, 0x2e, 0x70, 0x55, 0x30, 0x84, 0x60, 0x38,
+ 0x96, 0x6e, 0x44, 0xa3, 0x77, 0x4e, 0xaa, 0x7a, 0x54, 0xad, 0x7b, 0x58,
+ 0xaa, 0x7c, 0x5b, 0xa9, 0x7e, 0x59, 0xac, 0x83, 0x59, 0xb2, 0x8d, 0x60,
+ 0xb6, 0x92, 0x65, 0xbb, 0x96, 0x6d, 0xc0, 0x9c, 0x78, 0xc4, 0x9e, 0x7f,
+ 0xc1, 0xa3, 0x85, 0xbf, 0xa1, 0x83, 0xbd, 0x9d, 0x80, 0xbb, 0x97, 0x7a,
+ 0xba, 0x94, 0x76, 0xbd, 0x93, 0x75, 0xbe, 0x93, 0x73, 0xbe, 0x91, 0x71,
+ 0xbd, 0x91, 0x77, 0xbd, 0x8f, 0x75, 0xb9, 0x8b, 0x71, 0xb4, 0x88, 0x70,
+ 0xa9, 0x81, 0x6e, 0x96, 0x73, 0x64, 0x82, 0x60, 0x54, 0x66, 0x44, 0x38,
+ 0x12, 0x12, 0x12, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x10, 0x0d, 0x0d, 0x0f,
+ 0x0c, 0x0c, 0x0e, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0b, 0x0e, 0x0e, 0x0d,
+ 0x0e, 0x0b, 0x12, 0x23, 0x22, 0x20, 0x58, 0x5b, 0x4d, 0x6a, 0x6d, 0x58,
+ 0x47, 0x4a, 0x36, 0x27, 0x29, 0x1a, 0x14, 0x14, 0x0e, 0x0f, 0x0d, 0x0b,
+ 0x10, 0x0e, 0x10, 0x0e, 0x0d, 0x10, 0x0b, 0x0a, 0x0f, 0x0b, 0x0b, 0x0d,
+ 0x09, 0x09, 0x09, 0x0b, 0x0a, 0x09, 0x0d, 0x0c, 0x0d, 0x0f, 0x0f, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0c, 0x0d, 0x0f, 0x0e,
+ 0x0f, 0x10, 0x11, 0x0e, 0x0f, 0x11, 0x0e, 0x0f, 0x11, 0x0e, 0x0f, 0x11,
+ 0x16, 0x18, 0x17, 0x1c, 0x1e, 0x1b, 0x15, 0x15, 0x13, 0x0d, 0x0d, 0x0b,
+ 0x09, 0x09, 0x07, 0x0a, 0x0a, 0x08, 0x0c, 0x0b, 0x0c, 0x0a, 0x0a, 0x0c,
+ 0x05, 0x09, 0x00, 0x3d, 0x39, 0x1a, 0x8f, 0x83, 0x55, 0x4d, 0x43, 0x1f,
+ 0x0c, 0x09, 0x00, 0x04, 0x07, 0x0d, 0x04, 0x07, 0x0a, 0x06, 0x06, 0x02,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x05, 0x07, 0x06, 0x08, 0x0a, 0x09,
+ 0x0a, 0x0a, 0x08, 0x0d, 0x0d, 0x0b, 0x0d, 0x0e, 0x0e, 0x0d, 0x0f, 0x0f,
+ 0x0a, 0x0b, 0x0d, 0x0e, 0x12, 0x13, 0x21, 0x25, 0x27, 0x28, 0x2c, 0x2f,
+ 0x26, 0x27, 0x2b, 0x1a, 0x1b, 0x1d, 0x0d, 0x0e, 0x10, 0x07, 0x08, 0x0a,
+ 0x07, 0x07, 0x08, 0x06, 0x06, 0x06, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b,
+ 0x07, 0x0c, 0x06, 0x07, 0x0b, 0x0a, 0x06, 0x08, 0x0a, 0x07, 0x07, 0x09,
+ 0x06, 0x06, 0x07, 0x11, 0x18, 0x1d, 0x16, 0x28, 0x35, 0x0b, 0x24, 0x38,
+ 0x0a, 0x27, 0x33, 0x19, 0x3b, 0x4f, 0x33, 0x5e, 0x7f, 0x3d, 0x6e, 0x9b,
+ 0x3d, 0x73, 0xa5, 0x3a, 0x71, 0xa5, 0x30, 0x6a, 0x9c, 0x21, 0x5a, 0x8c,
+ 0x17, 0x3d, 0x6a, 0x08, 0x27, 0x4e, 0x09, 0x20, 0x3f, 0x0b, 0x1d, 0x35,
+ 0x0d, 0x1d, 0x2f, 0x0b, 0x1d, 0x2f, 0x0b, 0x1c, 0x32, 0x0a, 0x18, 0x31,
+ 0x0e, 0x1b, 0x31, 0x0d, 0x1c, 0x2d, 0x0c, 0x1c, 0x2b, 0x0b, 0x1b, 0x2a,
+ 0x0b, 0x1b, 0x2b, 0x0c, 0x1b, 0x2e, 0x0f, 0x1e, 0x31, 0x0e, 0x1d, 0x31,
+ 0x0b, 0x1b, 0x31, 0x0d, 0x1c, 0x2f, 0x0b, 0x1b, 0x2a, 0x0d, 0x1c, 0x2c,
+ 0x0d, 0x1e, 0x30, 0x0d, 0x1e, 0x30, 0x0c, 0x1a, 0x29, 0x09, 0x12, 0x1d,
+ 0x0e, 0x0e, 0x16, 0x0f, 0x13, 0x18, 0x15, 0x1f, 0x20, 0x14, 0x24, 0x28,
+ 0x12, 0x26, 0x33, 0x11, 0x28, 0x3e, 0x14, 0x2d, 0x4a, 0x17, 0x31, 0x52,
+ 0x14, 0x2e, 0x43, 0x11, 0x23, 0x36, 0x13, 0x21, 0x33, 0x12, 0x1f, 0x24,
+ 0x17, 0x20, 0x11, 0x43, 0x47, 0x2b, 0x50, 0x5a, 0x47, 0x2e, 0x42, 0x47,
+ 0x1b, 0x31, 0x4b, 0x19, 0x30, 0x4b, 0x16, 0x2f, 0x48, 0x12, 0x29, 0x41,
+ 0x16, 0x29, 0x38, 0x16, 0x24, 0x2c, 0x16, 0x24, 0x2e, 0x19, 0x27, 0x36,
+ 0x16, 0x2c, 0x42, 0x14, 0x29, 0x42, 0x1b, 0x34, 0x52, 0x1b, 0x3f, 0x65,
+ 0x1c, 0x4d, 0x81, 0x23, 0x62, 0x9f, 0x2a, 0x6d, 0xb3, 0x26, 0x6c, 0xb6,
+ 0x22, 0x6e, 0xb4, 0x26, 0x6c, 0xad, 0x2b, 0x6d, 0xae, 0x1d, 0x5a, 0x98,
+ 0x05, 0x32, 0x62, 0x07, 0x1f, 0x3e, 0x0d, 0x1b, 0x36, 0x0c, 0x1c, 0x38,
+ 0x08, 0x18, 0x29, 0x08, 0x27, 0x46, 0x2a, 0x5e, 0x91, 0x1c, 0x57, 0x96,
+ 0x11, 0x46, 0x80, 0x12, 0x3e, 0x6f, 0x14, 0x3b, 0x63, 0x0e, 0x36, 0x59,
+ 0x05, 0x28, 0x4c, 0x08, 0x24, 0x45, 0x11, 0x27, 0x41, 0x13, 0x25, 0x37,
+ 0x0d, 0x21, 0x30, 0x20, 0x36, 0x45, 0x19, 0x2f, 0x3f, 0x18, 0x2d, 0x40,
+ 0x1f, 0x36, 0x55, 0x1b, 0x38, 0x5a, 0x15, 0x37, 0x5a, 0x0f, 0x33, 0x53,
+ 0x0f, 0x31, 0x4c, 0x15, 0x30, 0x44, 0x1c, 0x2e, 0x3c, 0x15, 0x23, 0x2d,
+ 0x07, 0x10, 0x17, 0x02, 0x08, 0x0a, 0x06, 0x06, 0x06, 0x06, 0x05, 0x03,
+ 0x06, 0x04, 0x05, 0x05, 0x05, 0x06, 0x08, 0x08, 0x0a, 0x11, 0x10, 0x11,
+ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x10, 0x10, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0f, 0x17, 0x16, 0x19,
+ 0x1f, 0x18, 0x22, 0x24, 0x1d, 0x1c, 0x21, 0x1d, 0x12, 0x41, 0x41, 0x3b,
+ 0xa4, 0xa2, 0xad, 0x83, 0x7e, 0x8e, 0x76, 0x6c, 0x73, 0x74, 0x69, 0x63,
+ 0x70, 0x65, 0x5e, 0x6d, 0x61, 0x57, 0x66, 0x58, 0x4e, 0x5d, 0x50, 0x46,
+ 0x69, 0x5f, 0x58, 0x5c, 0x55, 0x4f, 0x62, 0x5c, 0x55, 0x6a, 0x62, 0x59,
+ 0x6a, 0x61, 0x53, 0x69, 0x5e, 0x5b, 0x6b, 0x62, 0x5b, 0x64, 0x5c, 0x52,
+ 0x60, 0x59, 0x53, 0x45, 0x43, 0x3c, 0x7f, 0x87, 0x7d, 0xa7, 0xb4, 0xb8,
+ 0x9d, 0xae, 0xc0, 0x93, 0xa3, 0xb8, 0x76, 0x86, 0x9f, 0x7e, 0x8d, 0xa4,
+ 0x8f, 0x9e, 0xb1, 0x62, 0x6f, 0x7f, 0x5e, 0x6a, 0x78, 0x6d, 0x79, 0x87,
+ 0x5d, 0x6e, 0x79, 0x42, 0x4f, 0x57, 0x23, 0x29, 0x2f, 0x25, 0x28, 0x2d,
+ 0x26, 0x29, 0x2e, 0x24, 0x25, 0x29, 0x25, 0x26, 0x26, 0x24, 0x25, 0x23,
+ 0x1b, 0x1d, 0x1c, 0x19, 0x1b, 0x1a, 0x18, 0x1a, 0x19, 0x0e, 0x0e, 0x0e,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x1b, 0x1b, 0x1a, 0x16, 0x16, 0x15, 0x09, 0x09, 0x09,
+ 0x07, 0x08, 0x0a, 0x08, 0x09, 0x0b, 0x09, 0x0b, 0x0a, 0x0e, 0x10, 0x0b,
+ 0x17, 0x18, 0x19, 0x1b, 0x1c, 0x1b, 0x0f, 0x11, 0x0e, 0x0b, 0x10, 0x0c,
+ 0x0c, 0x13, 0x10, 0x18, 0x1c, 0x1a, 0x16, 0x17, 0x17, 0x14, 0x11, 0x12,
+ 0x2c, 0x1f, 0x0c, 0x61, 0x40, 0x22, 0x75, 0x51, 0x2e, 0x57, 0x36, 0x1b,
+ 0x3e, 0x28, 0x12, 0x42, 0x46, 0x23, 0x53, 0x6a, 0x3c, 0x61, 0x74, 0x47,
+ 0x6a, 0x78, 0x4d, 0x67, 0x78, 0x4e, 0x66, 0x7c, 0x52, 0x63, 0x7e, 0x51,
+ 0x61, 0x7e, 0x50, 0x61, 0x7e, 0x4f, 0x60, 0x7b, 0x52, 0x5c, 0x76, 0x51,
+ 0x5c, 0x6b, 0x46, 0x5c, 0x61, 0x3f, 0x5e, 0x57, 0x39, 0x63, 0x51, 0x35,
+ 0x6c, 0x51, 0x34, 0x76, 0x54, 0x36, 0x85, 0x5c, 0x3b, 0x93, 0x66, 0x46,
+ 0x93, 0x6b, 0x4e, 0x95, 0x70, 0x50, 0x9e, 0x7b, 0x56, 0xac, 0x8c, 0x63,
+ 0xb6, 0x98, 0x6e, 0xbf, 0xa0, 0x7a, 0xc5, 0xa5, 0x84, 0xc9, 0xa9, 0x8b,
+ 0xcf, 0xac, 0x91, 0xcf, 0xab, 0x90, 0xcd, 0xa9, 0x8e, 0xcc, 0xa4, 0x8b,
+ 0xca, 0xa0, 0x87, 0xca, 0xa1, 0x84, 0xc8, 0x9d, 0x81, 0xc5, 0x9a, 0x7c,
+ 0xbd, 0x97, 0x7d, 0xbc, 0x93, 0x7a, 0xb7, 0x8c, 0x74, 0xae, 0x85, 0x70,
+ 0xa3, 0x7d, 0x6c, 0x91, 0x6d, 0x5d, 0x7b, 0x57, 0x47, 0x6c, 0x49, 0x36,
+ 0x15, 0x15, 0x15, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c,
+ 0x0e, 0x0e, 0x0c, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x11, 0x0d, 0x0d, 0x0f,
+ 0x0e, 0x0e, 0x10, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x09, 0x10, 0x10, 0x0d,
+ 0x2f, 0x2c, 0x35, 0x63, 0x63, 0x5a, 0x69, 0x6e, 0x51, 0x3c, 0x40, 0x25,
+ 0x1a, 0x1c, 0x12, 0x13, 0x12, 0x16, 0x0d, 0x0d, 0x0e, 0x0b, 0x0c, 0x06,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0d, 0x0b, 0x0a, 0x0e, 0x0c, 0x0c, 0x0e,
+ 0x0a, 0x09, 0x09, 0x0a, 0x0a, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0a, 0x0d,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0c,
+ 0x11, 0x12, 0x14, 0x10, 0x11, 0x13, 0x0f, 0x10, 0x12, 0x0e, 0x0f, 0x11,
+ 0x10, 0x12, 0x11, 0x15, 0x17, 0x15, 0x14, 0x14, 0x12, 0x0f, 0x10, 0x0b,
+ 0x0d, 0x0d, 0x0b, 0x14, 0x14, 0x12, 0x1a, 0x1a, 0x1a, 0x12, 0x12, 0x15,
+ 0x0d, 0x0e, 0x0c, 0x12, 0x0d, 0x04, 0x28, 0x1f, 0x10, 0x2a, 0x22, 0x15,
+ 0x0f, 0x0c, 0x03, 0x06, 0x08, 0x05, 0x07, 0x09, 0x09, 0x06, 0x06, 0x08,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x05, 0x07, 0x06,
+ 0x08, 0x08, 0x06, 0x08, 0x08, 0x06, 0x0c, 0x0c, 0x0c, 0x0b, 0x0d, 0x0c,
+ 0x07, 0x09, 0x08, 0x05, 0x06, 0x07, 0x0a, 0x0b, 0x0d, 0x18, 0x19, 0x1b,
+ 0x27, 0x28, 0x2a, 0x30, 0x31, 0x33, 0x25, 0x26, 0x28, 0x16, 0x17, 0x19,
+ 0x0a, 0x0b, 0x0d, 0x05, 0x05, 0x06, 0x05, 0x05, 0x07, 0x07, 0x07, 0x08,
+ 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x0a, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0c, 0x08, 0x09, 0x0b,
+ 0x05, 0x06, 0x08, 0x12, 0x18, 0x1e, 0x17, 0x26, 0x34, 0x12, 0x24, 0x3a,
+ 0x12, 0x23, 0x33, 0x0c, 0x24, 0x33, 0x0e, 0x2d, 0x40, 0x27, 0x4d, 0x64,
+ 0x3e, 0x6b, 0x89, 0x45, 0x79, 0xa1, 0x3a, 0x76, 0xa8, 0x2f, 0x6f, 0xa9,
+ 0x2e, 0x5c, 0x97, 0x1e, 0x45, 0x7b, 0x12, 0x32, 0x60, 0x09, 0x25, 0x49,
+ 0x06, 0x1f, 0x39, 0x07, 0x1e, 0x32, 0x0a, 0x1d, 0x2c, 0x0a, 0x19, 0x2a,
+ 0x0e, 0x19, 0x30, 0x0e, 0x1c, 0x2f, 0x0c, 0x1c, 0x2b, 0x0d, 0x1d, 0x2c,
+ 0x0e, 0x1e, 0x2e, 0x0c, 0x1b, 0x2e, 0x0e, 0x1d, 0x30, 0x0d, 0x1d, 0x2d,
+ 0x0d, 0x1c, 0x32, 0x0b, 0x1b, 0x2c, 0x0c, 0x1b, 0x2b, 0x0d, 0x1d, 0x2c,
+ 0x0c, 0x1e, 0x2f, 0x0c, 0x1c, 0x2e, 0x0f, 0x1a, 0x29, 0x09, 0x13, 0x1d,
+ 0x0d, 0x10, 0x15, 0x0f, 0x14, 0x18, 0x17, 0x22, 0x24, 0x14, 0x25, 0x2b,
+ 0x11, 0x26, 0x35, 0x14, 0x2d, 0x45, 0x15, 0x2f, 0x4e, 0x14, 0x31, 0x51,
+ 0x15, 0x2e, 0x45, 0x12, 0x25, 0x38, 0x13, 0x22, 0x31, 0x0d, 0x1b, 0x24,
+ 0x06, 0x0f, 0x0e, 0x0b, 0x11, 0x0a, 0x19, 0x29, 0x2d, 0x11, 0x2f, 0x45,
+ 0x12, 0x2e, 0x4c, 0x1d, 0x3b, 0x57, 0x1a, 0x38, 0x56, 0x16, 0x31, 0x50,
+ 0x14, 0x28, 0x40, 0x14, 0x23, 0x2e, 0x19, 0x26, 0x2f, 0x18, 0x26, 0x37,
+ 0x12, 0x2a, 0x44, 0x12, 0x2a, 0x46, 0x1b, 0x37, 0x5b, 0x21, 0x4b, 0x7b,
+ 0x22, 0x60, 0x9d, 0x23, 0x6c, 0xb2, 0x27, 0x6f, 0xb9, 0x2b, 0x6e, 0xb9,
+ 0x2d, 0x6d, 0xb2, 0x29, 0x6a, 0xad, 0x1d, 0x57, 0x95, 0x06, 0x30, 0x5e,
+ 0x08, 0x21, 0x3e, 0x0e, 0x1f, 0x31, 0x0d, 0x1d, 0x2d, 0x09, 0x1b, 0x2d,
+ 0x04, 0x14, 0x2f, 0x11, 0x33, 0x5c, 0x29, 0x67, 0x9f, 0x14, 0x5b, 0x97,
+ 0x0a, 0x47, 0x7d, 0x0e, 0x3a, 0x65, 0x0d, 0x2d, 0x52, 0x0b, 0x25, 0x4a,
+ 0x10, 0x26, 0x40, 0x0e, 0x26, 0x40, 0x0f, 0x27, 0x40, 0x10, 0x26, 0x39,
+ 0x0e, 0x1f, 0x29, 0x16, 0x22, 0x26, 0x1d, 0x23, 0x25, 0x1a, 0x1e, 0x21,
+ 0x1c, 0x2b, 0x39, 0x1f, 0x38, 0x4f, 0x19, 0x3c, 0x59, 0x13, 0x3c, 0x5b,
+ 0x15, 0x39, 0x55, 0x18, 0x30, 0x48, 0x17, 0x24, 0x37, 0x0b, 0x11, 0x21,
+ 0x04, 0x0a, 0x0e, 0x05, 0x07, 0x08, 0x07, 0x05, 0x05, 0x08, 0x04, 0x03,
+ 0x06, 0x04, 0x05, 0x05, 0x04, 0x06, 0x07, 0x05, 0x08, 0x0d, 0x0b, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x07,
+ 0x05, 0x05, 0x05, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0e, 0x10, 0x0f, 0x12,
+ 0x18, 0x16, 0x1e, 0x1d, 0x1b, 0x18, 0x20, 0x20, 0x14, 0x1f, 0x20, 0x1b,
+ 0xa0, 0xa0, 0xaa, 0xba, 0xb7, 0xc8, 0x69, 0x63, 0x6d, 0x60, 0x58, 0x57,
+ 0x67, 0x5c, 0x50, 0x67, 0x5a, 0x4c, 0x6b, 0x5d, 0x50, 0x6c, 0x5e, 0x51,
+ 0x69, 0x5c, 0x52, 0x59, 0x4e, 0x48, 0x5d, 0x52, 0x4c, 0x59, 0x4c, 0x44,
+ 0x5c, 0x4b, 0x3e, 0x62, 0x50, 0x4b, 0x5a, 0x49, 0x42, 0x55, 0x44, 0x3a,
+ 0x50, 0x41, 0x3a, 0x33, 0x2c, 0x22, 0x52, 0x56, 0x48, 0xa4, 0xaf, 0xad,
+ 0x99, 0xaa, 0xba, 0x97, 0xa8, 0xbd, 0x8f, 0x9e, 0xb5, 0x65, 0x74, 0x8b,
+ 0x65, 0x72, 0x85, 0x56, 0x62, 0x72, 0x5d, 0x69, 0x77, 0x62, 0x6e, 0x7c,
+ 0x4e, 0x5e, 0x6b, 0x33, 0x3e, 0x48, 0x20, 0x25, 0x2b, 0x26, 0x27, 0x2a,
+ 0x24, 0x25, 0x27, 0x21, 0x22, 0x24, 0x1e, 0x20, 0x1f, 0x18, 0x19, 0x16,
+ 0x17, 0x19, 0x16, 0x17, 0x19, 0x16, 0x11, 0x12, 0x11, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x0c, 0x0c, 0x0c, 0x24, 0x24, 0x22, 0x1c, 0x1d, 0x1a, 0x0e, 0x0f, 0x10,
+ 0x0b, 0x0c, 0x11, 0x09, 0x0a, 0x0e, 0x09, 0x0a, 0x0b, 0x14, 0x16, 0x13,
+ 0x1a, 0x1c, 0x22, 0x14, 0x15, 0x1a, 0x0e, 0x0f, 0x11, 0x09, 0x0d, 0x0e,
+ 0x09, 0x0f, 0x0f, 0x0d, 0x11, 0x0f, 0x10, 0x10, 0x0d, 0x18, 0x15, 0x0d,
+ 0x48, 0x33, 0x15, 0x80, 0x5b, 0x39, 0x65, 0x42, 0x20, 0x40, 0x25, 0x0e,
+ 0x31, 0x22, 0x10, 0x42, 0x4a, 0x29, 0x51, 0x68, 0x3c, 0x5e, 0x6f, 0x44,
+ 0x62, 0x75, 0x47, 0x63, 0x79, 0x4b, 0x64, 0x7b, 0x4f, 0x64, 0x7e, 0x51,
+ 0x63, 0x7e, 0x4f, 0x64, 0x7e, 0x50, 0x65, 0x7f, 0x53, 0x63, 0x7a, 0x52,
+ 0x5c, 0x78, 0x50, 0x60, 0x76, 0x53, 0x65, 0x70, 0x52, 0x63, 0x66, 0x4c,
+ 0x63, 0x5d, 0x45, 0x65, 0x58, 0x3c, 0x6a, 0x55, 0x36, 0x70, 0x55, 0x35,
+ 0x77, 0x52, 0x3a, 0x7c, 0x58, 0x3e, 0x8a, 0x65, 0x48, 0x9d, 0x77, 0x57,
+ 0xac, 0x85, 0x64, 0xb7, 0x91, 0x71, 0xbf, 0x98, 0x7b, 0xc6, 0xa0, 0x82,
+ 0xc8, 0xa4, 0x84, 0xcb, 0xa5, 0x86, 0xcb, 0xa5, 0x87, 0xca, 0xa3, 0x87,
+ 0xc8, 0xa1, 0x84, 0xc7, 0xa0, 0x83, 0xc3, 0x9d, 0x80, 0xbf, 0x9b, 0x7b,
+ 0xbc, 0x94, 0x7a, 0xb9, 0x8f, 0x76, 0xb3, 0x87, 0x6e, 0xaa, 0x80, 0x6a,
+ 0x9a, 0x75, 0x62, 0x87, 0x63, 0x4f, 0x6d, 0x47, 0x33, 0x8d, 0x66, 0x4d,
+ 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x14, 0x14, 0x14, 0x12, 0x12, 0x12,
+ 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0b, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0e,
+ 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0b, 0x12, 0x13, 0x0e, 0x38, 0x39, 0x33,
+ 0x69, 0x68, 0x5d, 0x65, 0x66, 0x55, 0x30, 0x33, 0x1d, 0x13, 0x15, 0x06,
+ 0x0c, 0x0b, 0x0b, 0x0a, 0x09, 0x10, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x06,
+ 0x08, 0x08, 0x06, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0e, 0x0b, 0x0d, 0x0c,
+ 0x09, 0x09, 0x07, 0x0a, 0x0a, 0x06, 0x0c, 0x0b, 0x0a, 0x0b, 0x09, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0f, 0x10, 0x12, 0x11, 0x12, 0x14, 0x0f, 0x10, 0x12, 0x10, 0x11, 0x14,
+ 0x0f, 0x11, 0x10, 0x17, 0x19, 0x18, 0x17, 0x17, 0x15, 0x0f, 0x11, 0x0b,
+ 0x0f, 0x10, 0x0c, 0x18, 0x18, 0x16, 0x23, 0x23, 0x23, 0x21, 0x21, 0x24,
+ 0x19, 0x16, 0x1d, 0x12, 0x10, 0x14, 0x11, 0x11, 0x10, 0x15, 0x14, 0x11,
+ 0x0a, 0x09, 0x04, 0x06, 0x05, 0x02, 0x07, 0x07, 0x08, 0x08, 0x09, 0x0a,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x04, 0x04, 0x05,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x08, 0x07, 0x05, 0x07, 0x06,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0b, 0x0b, 0x0b,
+ 0x15, 0x15, 0x17, 0x22, 0x23, 0x25, 0x2e, 0x2f, 0x31, 0x2e, 0x2f, 0x31,
+ 0x21, 0x23, 0x25, 0x10, 0x11, 0x13, 0x08, 0x09, 0x0b, 0x08, 0x08, 0x0a,
+ 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x0a, 0x08, 0x0a, 0x09,
+ 0x07, 0x09, 0x08, 0x06, 0x07, 0x06, 0x07, 0x08, 0x07, 0x09, 0x0b, 0x0a,
+ 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0c, 0x0a, 0x09, 0x0a,
+ 0x08, 0x0c, 0x0a, 0x0f, 0x18, 0x1d, 0x16, 0x23, 0x34, 0x14, 0x24, 0x3d,
+ 0x13, 0x24, 0x3a, 0x0f, 0x22, 0x36, 0x0c, 0x21, 0x32, 0x0e, 0x25, 0x33,
+ 0x1a, 0x37, 0x49, 0x38, 0x5d, 0x7a, 0x45, 0x77, 0x9e, 0x3b, 0x76, 0xa7,
+ 0x35, 0x6f, 0xaa, 0x32, 0x66, 0xa0, 0x2d, 0x5a, 0x91, 0x1b, 0x43, 0x73,
+ 0x0a, 0x2d, 0x55, 0x04, 0x21, 0x41, 0x08, 0x1b, 0x34, 0x0e, 0x1b, 0x31,
+ 0x0e, 0x19, 0x31, 0x0c, 0x19, 0x2e, 0x0a, 0x1a, 0x2a, 0x0d, 0x1d, 0x2c,
+ 0x0d, 0x1e, 0x2d, 0x0c, 0x1c, 0x2d, 0x0e, 0x1e, 0x2e, 0x0c, 0x1c, 0x2c,
+ 0x0b, 0x1a, 0x2e, 0x0a, 0x1a, 0x2b, 0x10, 0x1f, 0x2c, 0x0d, 0x1d, 0x2c,
+ 0x0c, 0x1c, 0x2d, 0x0c, 0x1b, 0x2c, 0x0f, 0x1a, 0x28, 0x09, 0x14, 0x1b,
+ 0x0a, 0x0f, 0x12, 0x12, 0x19, 0x1b, 0x18, 0x24, 0x28, 0x14, 0x27, 0x30,
+ 0x15, 0x2a, 0x3d, 0x14, 0x2d, 0x49, 0x10, 0x2d, 0x4c, 0x13, 0x31, 0x4f,
+ 0x14, 0x2f, 0x47, 0x12, 0x27, 0x36, 0x15, 0x25, 0x2d, 0x10, 0x1b, 0x23,
+ 0x0c, 0x0e, 0x15, 0x13, 0x0d, 0x14, 0x1b, 0x1f, 0x2f, 0x14, 0x29, 0x48,
+ 0x12, 0x2f, 0x4f, 0x1d, 0x3d, 0x58, 0x1b, 0x3d, 0x5a, 0x1d, 0x3c, 0x60,
+ 0x1a, 0x33, 0x4e, 0x14, 0x2a, 0x36, 0x15, 0x27, 0x30, 0x14, 0x26, 0x39,
+ 0x0e, 0x28, 0x45, 0x0f, 0x31, 0x55, 0x1c, 0x4b, 0x7a, 0x27, 0x63, 0x9f,
+ 0x23, 0x69, 0xac, 0x25, 0x6e, 0xb2, 0x27, 0x6e, 0xb3, 0x2b, 0x6d, 0xb4,
+ 0x2f, 0x69, 0xac, 0x1d, 0x4d, 0x87, 0x06, 0x29, 0x57, 0x06, 0x1e, 0x40,
+ 0x0e, 0x1e, 0x36, 0x10, 0x1e, 0x31, 0x0e, 0x1e, 0x31, 0x03, 0x19, 0x30,
+ 0x07, 0x27, 0x4d, 0x22, 0x54, 0x89, 0x21, 0x67, 0xa7, 0x0c, 0x56, 0x95,
+ 0x08, 0x46, 0x7a, 0x10, 0x39, 0x61, 0x0e, 0x2b, 0x4d, 0x0e, 0x23, 0x47,
+ 0x15, 0x28, 0x41, 0x12, 0x27, 0x42, 0x10, 0x28, 0x42, 0x0f, 0x24, 0x36,
+ 0x16, 0x25, 0x2e, 0x1c, 0x25, 0x28, 0x1c, 0x21, 0x24, 0x1a, 0x1f, 0x24,
+ 0x0d, 0x1a, 0x22, 0x15, 0x2c, 0x3e, 0x19, 0x3b, 0x58, 0x17, 0x3c, 0x5f,
+ 0x1a, 0x3a, 0x57, 0x12, 0x26, 0x3c, 0x0e, 0x1a, 0x28, 0x0d, 0x13, 0x1d,
+ 0x09, 0x0c, 0x10, 0x07, 0x06, 0x09, 0x07, 0x04, 0x06, 0x06, 0x04, 0x05,
+ 0x06, 0x06, 0x08, 0x05, 0x06, 0x08, 0x06, 0x06, 0x06, 0x08, 0x07, 0x05,
+ 0x0a, 0x0a, 0x09, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0f, 0x10, 0x10, 0x12,
+ 0x14, 0x15, 0x17, 0x14, 0x14, 0x14, 0x1a, 0x19, 0x17, 0x1a, 0x19, 0x17,
+ 0x53, 0x53, 0x53, 0xb4, 0xb4, 0xb6, 0x78, 0x76, 0x7b, 0x51, 0x4d, 0x52,
+ 0x58, 0x4f, 0x47, 0x5d, 0x51, 0x43, 0x61, 0x54, 0x45, 0x67, 0x5a, 0x4b,
+ 0x6d, 0x5f, 0x53, 0x65, 0x58, 0x4d, 0x62, 0x54, 0x48, 0x5b, 0x4b, 0x3d,
+ 0x5e, 0x50, 0x40, 0x64, 0x52, 0x4d, 0x62, 0x4e, 0x48, 0x5e, 0x4a, 0x40,
+ 0x50, 0x3d, 0x35, 0x43, 0x36, 0x2a, 0x32, 0x30, 0x1e, 0x86, 0x8c, 0x86,
+ 0x96, 0xaa, 0xb3, 0x91, 0xa3, 0xb1, 0x8d, 0x9d, 0xb0, 0x79, 0x88, 0x9b,
+ 0x5e, 0x6c, 0x7c, 0x5a, 0x68, 0x75, 0x5f, 0x6d, 0x78, 0x56, 0x64, 0x70,
+ 0x47, 0x54, 0x64, 0x2f, 0x37, 0x43, 0x23, 0x26, 0x2b, 0x25, 0x26, 0x25,
+ 0x26, 0x28, 0x27, 0x1e, 0x20, 0x1f, 0x15, 0x17, 0x16, 0x14, 0x15, 0x14,
+ 0x15, 0x17, 0x14, 0x0e, 0x0e, 0x0c, 0x0c, 0x0b, 0x09, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0a, 0x19, 0x19, 0x17, 0x20, 0x20, 0x1e, 0x25, 0x26, 0x28,
+ 0x1a, 0x1b, 0x21, 0x0f, 0x0f, 0x17, 0x0f, 0x12, 0x15, 0x17, 0x1b, 0x1d,
+ 0x15, 0x15, 0x1c, 0x0e, 0x0f, 0x13, 0x0d, 0x0e, 0x0f, 0x0b, 0x0e, 0x10,
+ 0x0c, 0x10, 0x13, 0x0e, 0x10, 0x10, 0x10, 0x0d, 0x09, 0x21, 0x1b, 0x0d,
+ 0x6a, 0x4e, 0x2c, 0x87, 0x5f, 0x3e, 0x4f, 0x2f, 0x15, 0x33, 0x20, 0x11,
+ 0x2b, 0x20, 0x12, 0x40, 0x4b, 0x29, 0x4e, 0x65, 0x37, 0x5b, 0x6b, 0x3f,
+ 0x59, 0x73, 0x41, 0x5c, 0x76, 0x47, 0x60, 0x78, 0x4e, 0x66, 0x7c, 0x52,
+ 0x69, 0x7e, 0x54, 0x6b, 0x80, 0x55, 0x6b, 0x80, 0x57, 0x68, 0x7e, 0x57,
+ 0x64, 0x7d, 0x57, 0x65, 0x7c, 0x56, 0x66, 0x7a, 0x55, 0x64, 0x78, 0x53,
+ 0x63, 0x75, 0x50, 0x64, 0x70, 0x4d, 0x66, 0x6b, 0x48, 0x66, 0x64, 0x43,
+ 0x69, 0x5a, 0x3f, 0x68, 0x56, 0x3a, 0x6b, 0x53, 0x37, 0x79, 0x59, 0x3e,
+ 0x87, 0x64, 0x48, 0x94, 0x70, 0x53, 0xa4, 0x7f, 0x62, 0xb1, 0x8d, 0x6f,
+ 0xb5, 0x96, 0x74, 0xba, 0x9b, 0x79, 0xbe, 0x9c, 0x7d, 0xbe, 0x9a, 0x7d,
+ 0xbe, 0x9a, 0x7f, 0xbd, 0x99, 0x7d, 0xbc, 0x9b, 0x7c, 0xb8, 0x97, 0x78,
+ 0xb6, 0x8e, 0x75, 0xb1, 0x87, 0x6f, 0xa7, 0x7e, 0x68, 0x98, 0x71, 0x5e,
+ 0x84, 0x62, 0x51, 0x67, 0x48, 0x36, 0x5b, 0x3c, 0x29, 0x8e, 0x6e, 0x58,
+ 0x13, 0x13, 0x13, 0x15, 0x15, 0x15, 0x13, 0x12, 0x13, 0x0d, 0x0e, 0x0d,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0c,
+ 0x0d, 0x0d, 0x0b, 0x0c, 0x0c, 0x0a, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0e,
+ 0x0b, 0x0b, 0x0b, 0x18, 0x18, 0x16, 0x45, 0x46, 0x40, 0x6c, 0x6d, 0x63,
+ 0x57, 0x59, 0x39, 0x28, 0x2a, 0x15, 0x12, 0x11, 0x11, 0x0e, 0x0d, 0x12,
+ 0x09, 0x09, 0x0b, 0x07, 0x09, 0x06, 0x08, 0x09, 0x09, 0x0a, 0x09, 0x0e,
+ 0x0a, 0x0a, 0x08, 0x0c, 0x0c, 0x0b, 0x0b, 0x0c, 0x0b, 0x09, 0x0b, 0x08,
+ 0x09, 0x0b, 0x06, 0x0b, 0x0c, 0x07, 0x0f, 0x0f, 0x0d, 0x0a, 0x08, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0c, 0x0e, 0x0e, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x10, 0x10, 0x12, 0x10, 0x11, 0x13, 0x12, 0x13, 0x15, 0x11, 0x12, 0x14,
+ 0x0f, 0x10, 0x12, 0x15, 0x17, 0x16, 0x18, 0x17, 0x16, 0x13, 0x13, 0x0f,
+ 0x11, 0x12, 0x0d, 0x12, 0x12, 0x10, 0x1d, 0x1d, 0x1d, 0x24, 0x24, 0x25,
+ 0x25, 0x23, 0x26, 0x17, 0x19, 0x15, 0x0c, 0x13, 0x09, 0x07, 0x0e, 0x04,
+ 0x08, 0x08, 0x06, 0x09, 0x05, 0x0b, 0x07, 0x06, 0x08, 0x07, 0x08, 0x07,
+ 0x08, 0x08, 0x08, 0x0c, 0x0b, 0x0b, 0x15, 0x14, 0x14, 0x16, 0x14, 0x14,
+ 0x0b, 0x0a, 0x0a, 0x06, 0x06, 0x06, 0x08, 0x0a, 0x09, 0x07, 0x09, 0x08,
+ 0x06, 0x07, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x05, 0x06, 0x06, 0x07, 0x06, 0x05, 0x09, 0x07, 0x05, 0x08, 0x08, 0x06,
+ 0x09, 0x0a, 0x0a, 0x0e, 0x10, 0x10, 0x1a, 0x1b, 0x1d, 0x2a, 0x2a, 0x2c,
+ 0x2f, 0x30, 0x32, 0x25, 0x26, 0x2a, 0x17, 0x18, 0x1c, 0x0d, 0x0e, 0x11,
+ 0x08, 0x0a, 0x0a, 0x08, 0x0a, 0x0a, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09,
+ 0x08, 0x0a, 0x09, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x09, 0x08, 0x0a, 0x09,
+ 0x09, 0x09, 0x07, 0x09, 0x07, 0x08, 0x08, 0x06, 0x07, 0x09, 0x09, 0x09,
+ 0x08, 0x0c, 0x0a, 0x0c, 0x15, 0x1a, 0x15, 0x22, 0x34, 0x12, 0x22, 0x3d,
+ 0x0f, 0x24, 0x3c, 0x0f, 0x23, 0x3a, 0x12, 0x22, 0x37, 0x16, 0x24, 0x37,
+ 0x10, 0x1f, 0x32, 0x14, 0x2d, 0x41, 0x24, 0x4a, 0x62, 0x31, 0x63, 0x81,
+ 0x32, 0x72, 0x9f, 0x35, 0x72, 0xa4, 0x39, 0x70, 0xa6, 0x34, 0x63, 0x9c,
+ 0x23, 0x4d, 0x81, 0x15, 0x34, 0x63, 0x0b, 0x21, 0x4a, 0x0a, 0x1a, 0x3d,
+ 0x0d, 0x17, 0x32, 0x0c, 0x18, 0x2e, 0x0c, 0x1a, 0x2c, 0x0b, 0x1b, 0x2a,
+ 0x0c, 0x1b, 0x2a, 0x0c, 0x1b, 0x2b, 0x0d, 0x1d, 0x2b, 0x0d, 0x1d, 0x2b,
+ 0x0c, 0x1b, 0x2e, 0x0c, 0x1c, 0x2c, 0x0e, 0x1c, 0x29, 0x0c, 0x1c, 0x2a,
+ 0x0a, 0x1b, 0x2b, 0x0c, 0x1b, 0x2c, 0x0d, 0x19, 0x25, 0x09, 0x13, 0x1a,
+ 0x0a, 0x11, 0x11, 0x13, 0x1c, 0x1c, 0x1a, 0x27, 0x2c, 0x18, 0x2b, 0x36,
+ 0x17, 0x2d, 0x43, 0x15, 0x2e, 0x4b, 0x12, 0x2e, 0x4c, 0x13, 0x2f, 0x4e,
+ 0x12, 0x2d, 0x46, 0x14, 0x28, 0x36, 0x16, 0x27, 0x2a, 0x11, 0x1d, 0x1f,
+ 0x0d, 0x12, 0x16, 0x13, 0x13, 0x18, 0x17, 0x24, 0x31, 0x11, 0x2f, 0x46,
+ 0x16, 0x33, 0x4f, 0x1d, 0x3c, 0x54, 0x19, 0x3b, 0x56, 0x1a, 0x3b, 0x5f,
+ 0x1c, 0x38, 0x54, 0x13, 0x2c, 0x38, 0x12, 0x29, 0x35, 0x14, 0x2a, 0x3f,
+ 0x0f, 0x2e, 0x4d, 0x19, 0x46, 0x74, 0x1f, 0x60, 0x9c, 0x24, 0x6d, 0xb3,
+ 0x29, 0x72, 0xb5, 0x2d, 0x72, 0xb2, 0x2d, 0x6f, 0xaf, 0x28, 0x6a, 0xab,
+ 0x13, 0x4f, 0x8a, 0x07, 0x29, 0x4d, 0x0e, 0x1e, 0x35, 0x0c, 0x1f, 0x3a,
+ 0x0b, 0x1d, 0x3b, 0x0c, 0x17, 0x2f, 0x09, 0x17, 0x32, 0x0b, 0x28, 0x4f,
+ 0x2c, 0x5e, 0x8b, 0x33, 0x72, 0xac, 0x18, 0x5e, 0xa4, 0x0e, 0x51, 0x97,
+ 0x0c, 0x42, 0x78, 0x11, 0x37, 0x5e, 0x0e, 0x2b, 0x4b, 0x09, 0x25, 0x45,
+ 0x0b, 0x24, 0x42, 0x0c, 0x26, 0x43, 0x12, 0x29, 0x42, 0x13, 0x23, 0x31,
+ 0x1a, 0x23, 0x28, 0x19, 0x22, 0x26, 0x26, 0x34, 0x3f, 0x1f, 0x32, 0x42,
+ 0x0a, 0x1a, 0x27, 0x13, 0x29, 0x40, 0x15, 0x31, 0x54, 0x10, 0x2e, 0x53,
+ 0x11, 0x28, 0x46, 0x09, 0x18, 0x26, 0x0d, 0x1a, 0x1d, 0x20, 0x2c, 0x2a,
+ 0x17, 0x1b, 0x1e, 0x08, 0x09, 0x0b, 0x07, 0x07, 0x07, 0x04, 0x04, 0x04,
+ 0x04, 0x05, 0x07, 0x02, 0x06, 0x07, 0x08, 0x09, 0x08, 0x06, 0x06, 0x04,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x0e, 0x0e, 0x10, 0x0e, 0x0e, 0x0f,
+ 0x12, 0x13, 0x10, 0x11, 0x0f, 0x13, 0x18, 0x12, 0x1b, 0x20, 0x1b, 0x1d,
+ 0x21, 0x1f, 0x14, 0x5b, 0x5c, 0x4e, 0x6f, 0x6e, 0x6b, 0x61, 0x5b, 0x65,
+ 0x56, 0x4d, 0x52, 0x56, 0x4a, 0x4a, 0x59, 0x49, 0x47, 0x5b, 0x4c, 0x48,
+ 0x64, 0x55, 0x50, 0x63, 0x53, 0x4e, 0x5d, 0x4c, 0x45, 0x5e, 0x4d, 0x44,
+ 0x61, 0x57, 0x45, 0x60, 0x55, 0x4e, 0x5d, 0x4d, 0x46, 0x57, 0x43, 0x3b,
+ 0x4e, 0x3b, 0x34, 0x4f, 0x3f, 0x34, 0x33, 0x2c, 0x19, 0x5b, 0x5c, 0x53,
+ 0x8a, 0x9e, 0xa1, 0x83, 0x97, 0x9f, 0x76, 0x88, 0x96, 0x6b, 0x7d, 0x8b,
+ 0x64, 0x74, 0x81, 0x5e, 0x6f, 0x79, 0x53, 0x64, 0x6c, 0x4b, 0x5e, 0x66,
+ 0x44, 0x4f, 0x62, 0x28, 0x2f, 0x3d, 0x24, 0x26, 0x2a, 0x24, 0x24, 0x22,
+ 0x1b, 0x1d, 0x18, 0x13, 0x15, 0x12, 0x12, 0x14, 0x13, 0x12, 0x12, 0x12,
+ 0x0e, 0x0e, 0x0d, 0x0b, 0x0b, 0x08, 0x09, 0x09, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09,
+ 0x0a, 0x0b, 0x06, 0x14, 0x15, 0x10, 0x35, 0x35, 0x32, 0x52, 0x53, 0x55,
+ 0x37, 0x37, 0x3e, 0x15, 0x15, 0x1f, 0x0f, 0x12, 0x17, 0x12, 0x16, 0x18,
+ 0x0c, 0x0d, 0x0f, 0x0a, 0x0b, 0x0a, 0x0c, 0x0d, 0x0a, 0x0f, 0x10, 0x12,
+ 0x12, 0x13, 0x17, 0x11, 0x12, 0x12, 0x14, 0x10, 0x0a, 0x2c, 0x22, 0x13,
+ 0x81, 0x60, 0x3d, 0x75, 0x4c, 0x2f, 0x41, 0x25, 0x13, 0x2a, 0x1c, 0x13,
+ 0x2b, 0x23, 0x16, 0x45, 0x4e, 0x2b, 0x4b, 0x5f, 0x2f, 0x58, 0x67, 0x38,
+ 0x59, 0x6e, 0x3b, 0x5d, 0x73, 0x44, 0x63, 0x75, 0x4d, 0x66, 0x78, 0x52,
+ 0x69, 0x7b, 0x55, 0x69, 0x7f, 0x57, 0x66, 0x7f, 0x57, 0x67, 0x80, 0x59,
+ 0x6d, 0x7e, 0x5c, 0x70, 0x82, 0x5c, 0x6b, 0x82, 0x56, 0x65, 0x80, 0x50,
+ 0x62, 0x80, 0x50, 0x60, 0x7f, 0x51, 0x62, 0x7a, 0x52, 0x65, 0x78, 0x55,
+ 0x62, 0x77, 0x51, 0x61, 0x70, 0x4b, 0x65, 0x6a, 0x48, 0x69, 0x64, 0x43,
+ 0x6e, 0x62, 0x42, 0x72, 0x62, 0x40, 0x78, 0x68, 0x46, 0x80, 0x71, 0x4c,
+ 0x91, 0x73, 0x58, 0xa0, 0x7e, 0x63, 0xa5, 0x82, 0x6a, 0xad, 0x87, 0x70,
+ 0xaf, 0x87, 0x71, 0xb1, 0x89, 0x72, 0xae, 0x86, 0x6e, 0xaa, 0x82, 0x6a,
+ 0x9f, 0x7b, 0x64, 0x94, 0x70, 0x5b, 0x84, 0x60, 0x50, 0x6f, 0x51, 0x44,
+ 0x58, 0x3f, 0x36, 0x45, 0x2f, 0x26, 0x47, 0x34, 0x26, 0x76, 0x60, 0x51,
+ 0x13, 0x13, 0x14, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c, 0x0e, 0x0b,
+ 0x0d, 0x0e, 0x0c, 0x0a, 0x0a, 0x09, 0x0b, 0x0a, 0x08, 0x0d, 0x0d, 0x0b,
+ 0x0e, 0x0f, 0x12, 0x12, 0x14, 0x13, 0x0e, 0x10, 0x0e, 0x0c, 0x0c, 0x0b,
+ 0x20, 0x1e, 0x1e, 0x53, 0x50, 0x4a, 0x6d, 0x6b, 0x5a, 0x4c, 0x4b, 0x33,
+ 0x1c, 0x1c, 0x16, 0x0d, 0x0d, 0x0b, 0x0d, 0x0d, 0x0c, 0x0f, 0x0f, 0x10,
+ 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0e, 0x0a, 0x0a, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c,
+ 0x10, 0x10, 0x10, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x15, 0x16, 0x16,
+ 0x0e, 0x14, 0x14, 0x2d, 0x2b, 0x29, 0x43, 0x39, 0x36, 0x28, 0x1e, 0x1c,
+ 0x12, 0x10, 0x0e, 0x0e, 0x13, 0x11, 0x16, 0x18, 0x15, 0x1c, 0x1c, 0x18,
+ 0x1f, 0x20, 0x1e, 0x19, 0x1b, 0x16, 0x12, 0x12, 0x0c, 0x0c, 0x0c, 0x08,
+ 0x0a, 0x0a, 0x08, 0x09, 0x0a, 0x0a, 0x09, 0x08, 0x09, 0x08, 0x08, 0x05,
+ 0x06, 0x09, 0x01, 0x19, 0x14, 0x09, 0x61, 0x53, 0x44, 0x6e, 0x5f, 0x51,
+ 0x26, 0x1f, 0x18, 0x07, 0x06, 0x04, 0x07, 0x07, 0x08, 0x09, 0x08, 0x08,
+ 0x04, 0x0a, 0x03, 0x08, 0x04, 0x08, 0x08, 0x04, 0x0a, 0x05, 0x08, 0x09,
+ 0x04, 0x07, 0x08, 0x08, 0x03, 0x09, 0x0a, 0x05, 0x09, 0x05, 0x0b, 0x05,
+ 0x09, 0x09, 0x0b, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x15, 0x15, 0x13,
+ 0x22, 0x23, 0x22, 0x2a, 0x2b, 0x2d, 0x29, 0x2a, 0x2e, 0x20, 0x21, 0x25,
+ 0x13, 0x14, 0x17, 0x0b, 0x0c, 0x0e, 0x08, 0x09, 0x0b, 0x08, 0x0a, 0x0b,
+ 0x08, 0x0a, 0x09, 0x06, 0x08, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x07, 0x09, 0x09, 0x07,
+ 0x08, 0x0a, 0x0a, 0x0d, 0x13, 0x1b, 0x16, 0x23, 0x35, 0x11, 0x23, 0x3b,
+ 0x11, 0x24, 0x3a, 0x10, 0x22, 0x38, 0x10, 0x22, 0x38, 0x14, 0x24, 0x37,
+ 0x12, 0x23, 0x33, 0x0e, 0x21, 0x30, 0x0c, 0x1f, 0x31, 0x16, 0x2b, 0x41,
+ 0x21, 0x4c, 0x68, 0x3a, 0x6a, 0x8f, 0x41, 0x74, 0xa5, 0x3b, 0x6f, 0xaa,
+ 0x34, 0x67, 0xa5, 0x28, 0x57, 0x8f, 0x1b, 0x45, 0x74, 0x0c, 0x30, 0x59,
+ 0x0e, 0x1f, 0x40, 0x0b, 0x1a, 0x36, 0x0c, 0x1b, 0x31, 0x0f, 0x1c, 0x2d,
+ 0x0f, 0x1c, 0x2b, 0x10, 0x1e, 0x2e, 0x0d, 0x1a, 0x2d, 0x0d, 0x1a, 0x2f,
+ 0x0e, 0x1e, 0x2e, 0x0d, 0x1b, 0x2b, 0x0e, 0x1b, 0x2d, 0x0d, 0x1c, 0x2e,
+ 0x0c, 0x1c, 0x2c, 0x0b, 0x1b, 0x2a, 0x0e, 0x18, 0x25, 0x0d, 0x14, 0x1e,
+ 0x0f, 0x14, 0x1c, 0x11, 0x1d, 0x21, 0x18, 0x2f, 0x31, 0x1a, 0x35, 0x3c,
+ 0x18, 0x2f, 0x40, 0x19, 0x2f, 0x48, 0x17, 0x2e, 0x4d, 0x14, 0x2f, 0x4c,
+ 0x11, 0x2d, 0x3e, 0x10, 0x27, 0x39, 0x14, 0x26, 0x35, 0x13, 0x1d, 0x27,
+ 0x0d, 0x14, 0x19, 0x0c, 0x15, 0x1c, 0x15, 0x25, 0x32, 0x17, 0x2d, 0x42,
+ 0x1c, 0x2c, 0x50, 0x1c, 0x37, 0x55, 0x15, 0x39, 0x5b, 0x18, 0x3a, 0x62,
+ 0x1c, 0x38, 0x54, 0x18, 0x2e, 0x3b, 0x14, 0x2a, 0x38, 0x17, 0x2d, 0x4e,
+ 0x17, 0x47, 0x85, 0x25, 0x60, 0xa0, 0x26, 0x6b, 0xad, 0x25, 0x70, 0xb6,
+ 0x25, 0x6f, 0xb8, 0x30, 0x72, 0xb8, 0x2d, 0x6a, 0xa5, 0x12, 0x48, 0x79,
+ 0x08, 0x22, 0x44, 0x07, 0x1c, 0x3b, 0x0d, 0x1e, 0x39, 0x0f, 0x1c, 0x31,
+ 0x0f, 0x1a, 0x2d, 0x05, 0x18, 0x30, 0x0b, 0x2b, 0x4f, 0x32, 0x60, 0x90,
+ 0x45, 0x82, 0xb9, 0x31, 0x72, 0xb1, 0x17, 0x5b, 0x9f, 0x0c, 0x4e, 0x8d,
+ 0x0a, 0x42, 0x74, 0x09, 0x34, 0x59, 0x0a, 0x28, 0x47, 0x0e, 0x25, 0x45,
+ 0x11, 0x22, 0x44, 0x08, 0x26, 0x40, 0x09, 0x2a, 0x45, 0x12, 0x26, 0x35,
+ 0x2d, 0x36, 0x37, 0x3d, 0x48, 0x53, 0x3d, 0x4d, 0x63, 0x16, 0x29, 0x31,
+ 0x07, 0x14, 0x1f, 0x1a, 0x2b, 0x45, 0x13, 0x28, 0x4a, 0x0d, 0x22, 0x38,
+ 0x0a, 0x17, 0x22, 0x09, 0x10, 0x18, 0x12, 0x1b, 0x23, 0x2b, 0x39, 0x3d,
+ 0x20, 0x27, 0x2a, 0x03, 0x08, 0x0b, 0x02, 0x08, 0x08, 0x03, 0x06, 0x05,
+ 0x03, 0x05, 0x04, 0x04, 0x06, 0x05, 0x06, 0x08, 0x07, 0x04, 0x06, 0x05,
+ 0x06, 0x05, 0x0a, 0x04, 0x03, 0x06, 0x06, 0x06, 0x07, 0x05, 0x05, 0x06,
+ 0x06, 0x06, 0x07, 0x08, 0x08, 0x0a, 0x0d, 0x0d, 0x0f, 0x0e, 0x0e, 0x11,
+ 0x0e, 0x0e, 0x10, 0x0e, 0x0e, 0x0f, 0x0f, 0x0e, 0x0e, 0x15, 0x14, 0x12,
+ 0x19, 0x18, 0x15, 0x1b, 0x1a, 0x15, 0x36, 0x33, 0x2e, 0x5d, 0x5a, 0x55,
+ 0x57, 0x50, 0x48, 0x52, 0x49, 0x41, 0x55, 0x48, 0x41, 0x53, 0x44, 0x3d,
+ 0x57, 0x46, 0x3f, 0x59, 0x47, 0x43, 0x58, 0x49, 0x44, 0x58, 0x4b, 0x45,
+ 0x5f, 0x50, 0x4a, 0x57, 0x49, 0x44, 0x4c, 0x3d, 0x3a, 0x47, 0x39, 0x36,
+ 0x42, 0x37, 0x34, 0x41, 0x37, 0x34, 0x37, 0x30, 0x29, 0x3a, 0x37, 0x30,
+ 0x78, 0x83, 0x81, 0x74, 0x85, 0x88, 0x64, 0x77, 0x80, 0x5d, 0x71, 0x7d,
+ 0x5a, 0x6c, 0x76, 0x57, 0x68, 0x70, 0x4c, 0x5e, 0x69, 0x4c, 0x5c, 0x6c,
+ 0x3f, 0x49, 0x57, 0x1d, 0x23, 0x2c, 0x21, 0x22, 0x24, 0x1d, 0x1d, 0x1b,
+ 0x12, 0x12, 0x10, 0x11, 0x13, 0x12, 0x12, 0x14, 0x15, 0x0d, 0x0d, 0x0f,
+ 0x09, 0x09, 0x07, 0x0b, 0x0b, 0x09, 0x0a, 0x0c, 0x0b, 0x0a, 0x0b, 0x0d,
+ 0x08, 0x09, 0x0b, 0x07, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x06,
+ 0x0b, 0x0b, 0x09, 0x17, 0x18, 0x10, 0x3d, 0x3e, 0x31, 0x59, 0x5a, 0x4f,
+ 0x43, 0x42, 0x40, 0x16, 0x15, 0x18, 0x0b, 0x0b, 0x0e, 0x09, 0x0b, 0x0c,
+ 0x08, 0x0c, 0x0e, 0x07, 0x0a, 0x07, 0x0a, 0x0f, 0x09, 0x13, 0x18, 0x15,
+ 0x16, 0x19, 0x1b, 0x12, 0x10, 0x0e, 0x18, 0x10, 0x06, 0x39, 0x2b, 0x16,
+ 0x89, 0x61, 0x39, 0x5f, 0x3c, 0x22, 0x38, 0x24, 0x1a, 0x24, 0x1a, 0x14,
+ 0x2c, 0x27, 0x15, 0x4c, 0x4e, 0x2e, 0x54, 0x5c, 0x32, 0x59, 0x66, 0x3a,
+ 0x5f, 0x6b, 0x40, 0x62, 0x6f, 0x43, 0x68, 0x75, 0x4b, 0x68, 0x77, 0x4f,
+ 0x68, 0x79, 0x50, 0x6a, 0x7d, 0x52, 0x6a, 0x80, 0x53, 0x6b, 0x82, 0x54,
+ 0x6d, 0x83, 0x5a, 0x6e, 0x84, 0x5b, 0x6e, 0x83, 0x58, 0x6f, 0x85, 0x5b,
+ 0x6f, 0x85, 0x5b, 0x6a, 0x81, 0x59, 0x6a, 0x80, 0x59, 0x68, 0x81, 0x5a,
+ 0x66, 0x7f, 0x56, 0x63, 0x7c, 0x51, 0x66, 0x7e, 0x4f, 0x6b, 0x7e, 0x4e,
+ 0x6d, 0x7a, 0x51, 0x72, 0x7a, 0x5a, 0x6f, 0x78, 0x61, 0x65, 0x6f, 0x5f,
+ 0x68, 0x61, 0x57, 0x6e, 0x5f, 0x5a, 0x6e, 0x59, 0x5a, 0x77, 0x5d, 0x56,
+ 0x78, 0x5c, 0x49, 0x76, 0x59, 0x3d, 0x78, 0x57, 0x3b, 0x74, 0x51, 0x37,
+ 0x6c, 0x4d, 0x36, 0x64, 0x43, 0x32, 0x59, 0x42, 0x37, 0x4b, 0x45, 0x3e,
+ 0x3c, 0x3b, 0x35, 0x37, 0x2d, 0x29, 0x43, 0x31, 0x29, 0x69, 0x58, 0x4c,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0e, 0x0d, 0x0e, 0x10, 0x0f, 0x0f, 0x11, 0x10,
+ 0x0c, 0x0e, 0x0e, 0x0b, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0c, 0x16, 0x16, 0x18, 0x12, 0x12, 0x13, 0x28, 0x27, 0x22,
+ 0x5f, 0x5f, 0x51, 0x69, 0x69, 0x57, 0x39, 0x37, 0x29, 0x17, 0x14, 0x0d,
+ 0x0d, 0x0d, 0x0c, 0x0d, 0x0d, 0x0b, 0x0e, 0x0e, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0d, 0x0a, 0x0a, 0x0b,
+ 0x09, 0x09, 0x0a, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x15, 0x17, 0x16,
+ 0x0b, 0x0f, 0x12, 0x3f, 0x3e, 0x35, 0x9f, 0x98, 0x82, 0x51, 0x4a, 0x36,
+ 0x12, 0x11, 0x08, 0x12, 0x14, 0x14, 0x16, 0x17, 0x19, 0x1b, 0x1a, 0x18,
+ 0x16, 0x1a, 0x18, 0x16, 0x17, 0x12, 0x13, 0x11, 0x0d, 0x11, 0x10, 0x0c,
+ 0x0c, 0x0e, 0x0b, 0x0d, 0x0f, 0x0e, 0x0c, 0x0c, 0x0c, 0x09, 0x08, 0x07,
+ 0x05, 0x05, 0x0c, 0x16, 0x12, 0x02, 0x8f, 0x86, 0x57, 0xb0, 0xa9, 0x73,
+ 0x34, 0x33, 0x0f, 0x04, 0x06, 0x00, 0x07, 0x07, 0x06, 0x09, 0x07, 0x0a,
+ 0x05, 0x08, 0x05, 0x0b, 0x07, 0x08, 0x0b, 0x07, 0x08, 0x04, 0x09, 0x05,
+ 0x03, 0x08, 0x05, 0x08, 0x04, 0x05, 0x0b, 0x07, 0x08, 0x06, 0x0a, 0x07,
+ 0x0a, 0x0a, 0x0c, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x08, 0x0c, 0x0c, 0x09,
+ 0x0f, 0x11, 0x0e, 0x16, 0x18, 0x19, 0x24, 0x25, 0x29, 0x2b, 0x2c, 0x31,
+ 0x26, 0x27, 0x29, 0x1a, 0x1b, 0x1d, 0x10, 0x11, 0x13, 0x0b, 0x0c, 0x0e,
+ 0x07, 0x09, 0x08, 0x05, 0x08, 0x06, 0x08, 0x09, 0x08, 0x0a, 0x0a, 0x09,
+ 0x09, 0x09, 0x0a, 0x0b, 0x0b, 0x0a, 0x0c, 0x0c, 0x0b, 0x0a, 0x0a, 0x08,
+ 0x07, 0x08, 0x09, 0x0c, 0x13, 0x1b, 0x16, 0x24, 0x34, 0x0f, 0x22, 0x38,
+ 0x10, 0x23, 0x36, 0x0f, 0x21, 0x37, 0x10, 0x21, 0x38, 0x13, 0x24, 0x38,
+ 0x11, 0x22, 0x34, 0x0f, 0x20, 0x30, 0x10, 0x22, 0x33, 0x0d, 0x1f, 0x32,
+ 0x0a, 0x21, 0x33, 0x1d, 0x3e, 0x52, 0x33, 0x60, 0x7d, 0x3a, 0x72, 0x97,
+ 0x3b, 0x75, 0xa5, 0x37, 0x6e, 0xa5, 0x37, 0x68, 0xa4, 0x2a, 0x56, 0x93,
+ 0x21, 0x44, 0x6d, 0x0c, 0x2a, 0x4c, 0x07, 0x1f, 0x3a, 0x0b, 0x1b, 0x30,
+ 0x0e, 0x1a, 0x2b, 0x0c, 0x19, 0x29, 0x09, 0x19, 0x2b, 0x0a, 0x1c, 0x2f,
+ 0x0d, 0x1b, 0x2b, 0x0e, 0x1a, 0x29, 0x0d, 0x1a, 0x2b, 0x0f, 0x1d, 0x2e,
+ 0x0d, 0x1d, 0x2d, 0x0c, 0x1d, 0x2b, 0x11, 0x1d, 0x2b, 0x11, 0x19, 0x24,
+ 0x10, 0x16, 0x1c, 0x14, 0x21, 0x24, 0x1d, 0x34, 0x38, 0x1e, 0x37, 0x41,
+ 0x19, 0x31, 0x44, 0x17, 0x2c, 0x48, 0x15, 0x2c, 0x4c, 0x11, 0x2c, 0x48,
+ 0x13, 0x2a, 0x3a, 0x15, 0x2a, 0x3a, 0x17, 0x28, 0x37, 0x14, 0x1e, 0x28,
+ 0x0e, 0x17, 0x1c, 0x0d, 0x17, 0x1e, 0x15, 0x24, 0x32, 0x16, 0x2a, 0x40,
+ 0x14, 0x2f, 0x52, 0x17, 0x38, 0x58, 0x18, 0x3b, 0x5b, 0x1b, 0x3a, 0x5e,
+ 0x1d, 0x37, 0x53, 0x17, 0x32, 0x44, 0x19, 0x3a, 0x53, 0x24, 0x4a, 0x78,
+ 0x28, 0x63, 0xa7, 0x30, 0x6d, 0xad, 0x2d, 0x6f, 0xac, 0x27, 0x6e, 0xb2,
+ 0x25, 0x6d, 0xb8, 0x26, 0x65, 0xa8, 0x12, 0x42, 0x71, 0x02, 0x22, 0x43,
+ 0x07, 0x1c, 0x38, 0x09, 0x1a, 0x36, 0x0a, 0x18, 0x32, 0x0c, 0x1b, 0x32,
+ 0x06, 0x19, 0x30, 0x12, 0x31, 0x52, 0x39, 0x65, 0x93, 0x50, 0x86, 0xbc,
+ 0x3f, 0x82, 0xbd, 0x23, 0x69, 0xaa, 0x11, 0x57, 0x9a, 0x0b, 0x4c, 0x88,
+ 0x0a, 0x3f, 0x6d, 0x0a, 0x32, 0x54, 0x0a, 0x28, 0x45, 0x10, 0x25, 0x45,
+ 0x13, 0x22, 0x3c, 0x0a, 0x25, 0x3e, 0x0a, 0x28, 0x46, 0x20, 0x33, 0x46,
+ 0x64, 0x72, 0x71, 0x64, 0x73, 0x78, 0x25, 0x32, 0x43, 0x04, 0x0f, 0x16,
+ 0x0c, 0x15, 0x17, 0x18, 0x27, 0x3a, 0x10, 0x24, 0x3f, 0x07, 0x1a, 0x2b,
+ 0x08, 0x14, 0x1c, 0x0e, 0x15, 0x1d, 0x13, 0x1a, 0x24, 0x16, 0x21, 0x25,
+ 0x12, 0x17, 0x1a, 0x04, 0x07, 0x0a, 0x04, 0x07, 0x08, 0x05, 0x06, 0x06,
+ 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x05, 0x04, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x05,
+ 0x05, 0x05, 0x05, 0x09, 0x09, 0x09, 0x0f, 0x0f, 0x0f, 0x12, 0x12, 0x14,
+ 0x0e, 0x0f, 0x11, 0x0d, 0x0e, 0x0f, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0e, 0x0c, 0x10, 0x0f, 0x0b, 0x1a, 0x19, 0x15, 0x2b, 0x2a, 0x26,
+ 0x3b, 0x37, 0x2e, 0x43, 0x3c, 0x34, 0x46, 0x3b, 0x34, 0x3e, 0x31, 0x2b,
+ 0x37, 0x2a, 0x24, 0x3d, 0x30, 0x2c, 0x41, 0x36, 0x32, 0x41, 0x36, 0x32,
+ 0x43, 0x38, 0x33, 0x39, 0x2e, 0x2a, 0x32, 0x27, 0x23, 0x30, 0x26, 0x24,
+ 0x2c, 0x22, 0x20, 0x2c, 0x24, 0x22, 0x28, 0x22, 0x1f, 0x26, 0x22, 0x1e,
+ 0x5b, 0x65, 0x61, 0x66, 0x74, 0x77, 0x59, 0x6c, 0x76, 0x57, 0x6a, 0x78,
+ 0x51, 0x63, 0x6f, 0x4f, 0x60, 0x6a, 0x4e, 0x60, 0x6c, 0x4c, 0x5d, 0x6e,
+ 0x32, 0x3d, 0x4b, 0x0f, 0x15, 0x1f, 0x15, 0x16, 0x1a, 0x11, 0x11, 0x0f,
+ 0x11, 0x11, 0x0f, 0x12, 0x14, 0x12, 0x0c, 0x0e, 0x0d, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x08, 0x09, 0x09, 0x08, 0x0b, 0x0b, 0x0b, 0x0c, 0x0d, 0x0f,
+ 0x09, 0x0a, 0x0b, 0x07, 0x08, 0x09, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x0a, 0x0c, 0x0b, 0x12, 0x14, 0x0d, 0x31, 0x33, 0x28, 0x34, 0x36, 0x2d,
+ 0x24, 0x24, 0x22, 0x0f, 0x10, 0x12, 0x0a, 0x0b, 0x0d, 0x07, 0x0b, 0x0c,
+ 0x0a, 0x0b, 0x0f, 0x0a, 0x0c, 0x0c, 0x0a, 0x0c, 0x09, 0x13, 0x17, 0x18,
+ 0x16, 0x18, 0x1e, 0x12, 0x0f, 0x12, 0x17, 0x0f, 0x08, 0x3a, 0x2b, 0x1b,
+ 0x77, 0x4f, 0x2c, 0x52, 0x30, 0x1a, 0x36, 0x22, 0x19, 0x21, 0x17, 0x11,
+ 0x2a, 0x24, 0x13, 0x48, 0x49, 0x29, 0x52, 0x59, 0x30, 0x58, 0x63, 0x38,
+ 0x5f, 0x6b, 0x40, 0x61, 0x6e, 0x42, 0x67, 0x74, 0x49, 0x6a, 0x79, 0x4e,
+ 0x6a, 0x7b, 0x4f, 0x6c, 0x7e, 0x52, 0x6f, 0x82, 0x55, 0x6d, 0x83, 0x55,
+ 0x6d, 0x82, 0x57, 0x71, 0x86, 0x5b, 0x71, 0x86, 0x5b, 0x72, 0x87, 0x5c,
+ 0x72, 0x88, 0x5e, 0x70, 0x87, 0x5d, 0x6e, 0x87, 0x5e, 0x6c, 0x84, 0x5d,
+ 0x6b, 0x82, 0x5b, 0x6a, 0x81, 0x57, 0x6a, 0x82, 0x53, 0x6e, 0x84, 0x54,
+ 0x72, 0x82, 0x5a, 0x77, 0x88, 0x6a, 0x70, 0x83, 0x73, 0x5d, 0x74, 0x6c,
+ 0x48, 0x64, 0x6c, 0x41, 0x53, 0x64, 0x39, 0x42, 0x57, 0x36, 0x38, 0x47,
+ 0x28, 0x27, 0x26, 0x28, 0x21, 0x19, 0x30, 0x23, 0x1c, 0x38, 0x25, 0x22,
+ 0x43, 0x24, 0x1a, 0x48, 0x29, 0x1e, 0x49, 0x38, 0x2a, 0x49, 0x48, 0x3b,
+ 0x3d, 0x3d, 0x38, 0x3b, 0x31, 0x33, 0x49, 0x3d, 0x3d, 0x6f, 0x69, 0x65,
+ 0x11, 0x11, 0x11, 0x13, 0x14, 0x14, 0x0f, 0x11, 0x10, 0x0c, 0x0e, 0x0e,
+ 0x0a, 0x0b, 0x0d, 0x11, 0x12, 0x14, 0x09, 0x0a, 0x0c, 0x0c, 0x0c, 0x0d,
+ 0x0b, 0x0a, 0x08, 0x12, 0x11, 0x0f, 0x3a, 0x39, 0x33, 0x65, 0x66, 0x58,
+ 0x5b, 0x5d, 0x49, 0x2a, 0x2b, 0x19, 0x0e, 0x0e, 0x08, 0x0b, 0x09, 0x0d,
+ 0x0f, 0x0e, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x12, 0x14, 0x13, 0x14, 0x16, 0x15,
+ 0x0c, 0x0f, 0x14, 0x2c, 0x2c, 0x1c, 0xab, 0xa9, 0x83, 0x52, 0x50, 0x2a,
+ 0x14, 0x15, 0x01, 0x13, 0x15, 0x14, 0x19, 0x1a, 0x1e, 0x1b, 0x1a, 0x1b,
+ 0x15, 0x18, 0x18, 0x15, 0x16, 0x13, 0x14, 0x13, 0x0f, 0x11, 0x10, 0x0c,
+ 0x11, 0x11, 0x0f, 0x15, 0x17, 0x16, 0x16, 0x17, 0x18, 0x0e, 0x0f, 0x10,
+ 0x07, 0x08, 0x12, 0x0d, 0x0b, 0x02, 0x43, 0x3e, 0x1d, 0x60, 0x5b, 0x31,
+ 0x23, 0x22, 0x06, 0x09, 0x0b, 0x03, 0x06, 0x08, 0x0a, 0x08, 0x07, 0x0d,
+ 0x0a, 0x09, 0x0c, 0x0b, 0x07, 0x06, 0x09, 0x07, 0x04, 0x05, 0x0a, 0x04,
+ 0x03, 0x08, 0x03, 0x08, 0x07, 0x03, 0x0c, 0x08, 0x07, 0x09, 0x09, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x09, 0x06,
+ 0x0a, 0x0b, 0x08, 0x0a, 0x0c, 0x0b, 0x10, 0x11, 0x13, 0x1b, 0x1c, 0x20,
+ 0x25, 0x26, 0x27, 0x2a, 0x2b, 0x2c, 0x23, 0x24, 0x26, 0x12, 0x13, 0x14,
+ 0x0a, 0x0c, 0x0b, 0x09, 0x0b, 0x0a, 0x07, 0x09, 0x09, 0x09, 0x0b, 0x0b,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x06,
+ 0x06, 0x07, 0x07, 0x0d, 0x11, 0x18, 0x15, 0x23, 0x31, 0x10, 0x22, 0x36,
+ 0x10, 0x23, 0x32, 0x0f, 0x21, 0x35, 0x11, 0x21, 0x38, 0x11, 0x21, 0x38,
+ 0x10, 0x21, 0x35, 0x0f, 0x20, 0x30, 0x0d, 0x20, 0x2f, 0x0d, 0x1f, 0x2f,
+ 0x11, 0x1e, 0x2e, 0x0d, 0x20, 0x2e, 0x0c, 0x29, 0x38, 0x1d, 0x48, 0x5a,
+ 0x34, 0x67, 0x84, 0x3f, 0x77, 0xa3, 0x39, 0x74, 0xaf, 0x33, 0x6e, 0xb1,
+ 0x32, 0x68, 0x9f, 0x28, 0x57, 0x87, 0x16, 0x37, 0x62, 0x0c, 0x20, 0x43,
+ 0x0e, 0x1b, 0x35, 0x0e, 0x1b, 0x2e, 0x0d, 0x1d, 0x2b, 0x0a, 0x1c, 0x2a,
+ 0x0d, 0x1a, 0x29, 0x10, 0x1b, 0x2a, 0x0f, 0x1b, 0x29, 0x0e, 0x1b, 0x2b,
+ 0x0f, 0x1f, 0x2f, 0x14, 0x26, 0x35, 0x17, 0x26, 0x34, 0x12, 0x1d, 0x29,
+ 0x10, 0x18, 0x1e, 0x14, 0x23, 0x28, 0x1f, 0x35, 0x3b, 0x1c, 0x34, 0x42,
+ 0x1a, 0x33, 0x4a, 0x17, 0x2e, 0x4d, 0x15, 0x2e, 0x4c, 0x11, 0x2b, 0x47,
+ 0x15, 0x29, 0x3a, 0x17, 0x2a, 0x3b, 0x18, 0x29, 0x38, 0x12, 0x1e, 0x28,
+ 0x11, 0x1c, 0x1f, 0x13, 0x1e, 0x25, 0x19, 0x28, 0x36, 0x18, 0x2b, 0x42,
+ 0x0e, 0x31, 0x51, 0x16, 0x3b, 0x58, 0x1a, 0x3d, 0x5c, 0x1f, 0x3b, 0x5e,
+ 0x1b, 0x38, 0x58, 0x18, 0x3d, 0x5e, 0x24, 0x57, 0x84, 0x2d, 0x69, 0xa9,
+ 0x2a, 0x6d, 0xb2, 0x2d, 0x71, 0xb2, 0x2c, 0x71, 0xb2, 0x2c, 0x71, 0xb1,
+ 0x26, 0x63, 0xa0, 0x0e, 0x3b, 0x6e, 0x01, 0x1c, 0x3e, 0x09, 0x19, 0x2e,
+ 0x08, 0x19, 0x32, 0x09, 0x16, 0x2c, 0x0c, 0x16, 0x2a, 0x03, 0x14, 0x2c,
+ 0x0b, 0x2b, 0x4d, 0x3a, 0x6b, 0x98, 0x49, 0x83, 0xbc, 0x4b, 0x8a, 0xc9,
+ 0x36, 0x81, 0xc2, 0x1c, 0x66, 0xaa, 0x0f, 0x54, 0x96, 0x0b, 0x46, 0x80,
+ 0x0d, 0x3c, 0x68, 0x0d, 0x2f, 0x51, 0x0c, 0x28, 0x44, 0x0f, 0x25, 0x42,
+ 0x13, 0x23, 0x37, 0x12, 0x28, 0x3f, 0x10, 0x29, 0x47, 0x21, 0x35, 0x4b,
+ 0x5f, 0x74, 0x79, 0x3a, 0x4d, 0x51, 0x0b, 0x15, 0x1f, 0x0a, 0x09, 0x0e,
+ 0x0f, 0x18, 0x17, 0x12, 0x20, 0x2f, 0x0c, 0x1f, 0x37, 0x06, 0x18, 0x29,
+ 0x0d, 0x19, 0x23, 0x14, 0x1a, 0x24, 0x12, 0x16, 0x21, 0x0c, 0x12, 0x18,
+ 0x0a, 0x0a, 0x0f, 0x06, 0x06, 0x08, 0x06, 0x05, 0x08, 0x06, 0x04, 0x05,
+ 0x07, 0x05, 0x06, 0x04, 0x03, 0x04, 0x05, 0x05, 0x05, 0x04, 0x05, 0x04,
+ 0x05, 0x05, 0x04, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04, 0x08, 0x08, 0x05,
+ 0x08, 0x08, 0x06, 0x0a, 0x0a, 0x08, 0x0c, 0x0c, 0x0c, 0x15, 0x15, 0x16,
+ 0x10, 0x11, 0x13, 0x0a, 0x0b, 0x0e, 0x0c, 0x0c, 0x0e, 0x0c, 0x0c, 0x0b,
+ 0x0b, 0x0c, 0x0a, 0x0b, 0x0b, 0x09, 0x0d, 0x0c, 0x0a, 0x0f, 0x0e, 0x0b,
+ 0x14, 0x14, 0x0c, 0x1e, 0x1b, 0x14, 0x27, 0x21, 0x1d, 0x27, 0x1f, 0x1c,
+ 0x23, 0x19, 0x16, 0x28, 0x1e, 0x1d, 0x2a, 0x22, 0x1f, 0x28, 0x20, 0x1d,
+ 0x26, 0x21, 0x1d, 0x22, 0x1a, 0x17, 0x1f, 0x17, 0x14, 0x1f, 0x17, 0x15,
+ 0x1f, 0x17, 0x15, 0x1d, 0x17, 0x15, 0x1a, 0x16, 0x13, 0x1e, 0x1b, 0x17,
+ 0x4c, 0x54, 0x4e, 0x5b, 0x69, 0x6c, 0x53, 0x64, 0x70, 0x4d, 0x60, 0x6f,
+ 0x4d, 0x5e, 0x6e, 0x4f, 0x60, 0x6d, 0x4f, 0x61, 0x6d, 0x49, 0x5c, 0x6a,
+ 0x28, 0x32, 0x41, 0x0a, 0x0e, 0x19, 0x0f, 0x11, 0x14, 0x0f, 0x0e, 0x0e,
+ 0x10, 0x10, 0x0e, 0x0d, 0x0f, 0x0e, 0x0b, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, 0x17, 0x17, 0x17,
+ 0x0f, 0x0f, 0x0f, 0x09, 0x09, 0x0b, 0x08, 0x08, 0x0a, 0x07, 0x07, 0x08,
+ 0x05, 0x09, 0x09, 0x0d, 0x11, 0x0f, 0x1c, 0x21, 0x1b, 0x18, 0x1a, 0x15,
+ 0x0e, 0x10, 0x0f, 0x0b, 0x0e, 0x10, 0x09, 0x0d, 0x0e, 0x08, 0x0b, 0x0c,
+ 0x0c, 0x0b, 0x10, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0d, 0x13, 0x15, 0x16,
+ 0x13, 0x15, 0x1a, 0x11, 0x0f, 0x12, 0x17, 0x0f, 0x0c, 0x33, 0x24, 0x18,
+ 0x5c, 0x39, 0x1e, 0x49, 0x2b, 0x19, 0x35, 0x22, 0x19, 0x21, 0x16, 0x0e,
+ 0x27, 0x22, 0x11, 0x43, 0x44, 0x28, 0x4b, 0x52, 0x2d, 0x50, 0x5b, 0x32,
+ 0x55, 0x62, 0x36, 0x59, 0x66, 0x3a, 0x60, 0x6d, 0x41, 0x68, 0x78, 0x4b,
+ 0x6d, 0x7d, 0x50, 0x6d, 0x7e, 0x51, 0x6f, 0x80, 0x53, 0x71, 0x82, 0x56,
+ 0x70, 0x82, 0x57, 0x71, 0x84, 0x57, 0x72, 0x88, 0x5a, 0x71, 0x87, 0x5a,
+ 0x71, 0x88, 0x5c, 0x71, 0x8a, 0x60, 0x72, 0x8b, 0x60, 0x70, 0x89, 0x61,
+ 0x72, 0x89, 0x64, 0x72, 0x88, 0x61, 0x71, 0x88, 0x5b, 0x74, 0x8a, 0x5c,
+ 0x76, 0x89, 0x64, 0x77, 0x8d, 0x74, 0x68, 0x84, 0x78, 0x4e, 0x6f, 0x6d,
+ 0x40, 0x61, 0x6b, 0x38, 0x53, 0x62, 0x36, 0x42, 0x55, 0x27, 0x2b, 0x39,
+ 0x18, 0x16, 0x18, 0x1f, 0x14, 0x0f, 0x2c, 0x19, 0x14, 0x37, 0x1e, 0x1c,
+ 0x42, 0x22, 0x23, 0x49, 0x2c, 0x24, 0x4a, 0x38, 0x26, 0x47, 0x46, 0x34,
+ 0x3e, 0x3f, 0x3b, 0x3c, 0x3a, 0x41, 0x61, 0x5f, 0x6a, 0xb7, 0xc0, 0xc3,
+ 0x12, 0x14, 0x11, 0x11, 0x13, 0x11, 0x0d, 0x0f, 0x0e, 0x0c, 0x0d, 0x0f,
+ 0x0a, 0x0b, 0x0c, 0x0c, 0x0c, 0x0f, 0x0b, 0x0b, 0x0d, 0x09, 0x08, 0x0a,
+ 0x1a, 0x16, 0x16, 0x4b, 0x48, 0x3f, 0x6d, 0x6c, 0x5a, 0x51, 0x51, 0x3d,
+ 0x20, 0x21, 0x14, 0x0b, 0x0a, 0x06, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0d, 0x0d, 0x0b, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x16, 0x16, 0x16, 0x10, 0x10, 0x10,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d,
+ 0x0f, 0x0f, 0x0f, 0x11, 0x13, 0x12, 0x14, 0x16, 0x15, 0x17, 0x19, 0x18,
+ 0x12, 0x15, 0x16, 0x15, 0x16, 0x08, 0x3d, 0x3b, 0x1d, 0x30, 0x30, 0x10,
+ 0x16, 0x17, 0x04, 0x12, 0x13, 0x0f, 0x18, 0x18, 0x1b, 0x1d, 0x1b, 0x1d,
+ 0x1a, 0x1d, 0x1e, 0x1b, 0x1c, 0x19, 0x19, 0x17, 0x13, 0x16, 0x15, 0x0f,
+ 0x12, 0x12, 0x0e, 0x14, 0x16, 0x15, 0x1d, 0x1f, 0x21, 0x1c, 0x1d, 0x1e,
+ 0x10, 0x12, 0x11, 0x0d, 0x0b, 0x0a, 0x0f, 0x08, 0x05, 0x1e, 0x17, 0x12,
+ 0x1d, 0x1a, 0x17, 0x0e, 0x0e, 0x0f, 0x08, 0x08, 0x0f, 0x07, 0x07, 0x0e,
+ 0x0a, 0x09, 0x0e, 0x08, 0x08, 0x08, 0x07, 0x08, 0x06, 0x06, 0x0a, 0x0b,
+ 0x05, 0x09, 0x0a, 0x0a, 0x09, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x0c,
+ 0x09, 0x08, 0x09, 0x0a, 0x0a, 0x08, 0x0a, 0x0a, 0x08, 0x0a, 0x0a, 0x08,
+ 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0d, 0x0d, 0x0f,
+ 0x12, 0x14, 0x13, 0x1c, 0x1e, 0x1d, 0x28, 0x2a, 0x29, 0x22, 0x24, 0x23,
+ 0x14, 0x15, 0x16, 0x0d, 0x0e, 0x10, 0x0a, 0x0b, 0x0c, 0x09, 0x0a, 0x0c,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x06, 0x07, 0x07, 0x0c, 0x10, 0x16, 0x13, 0x1f, 0x2c, 0x10, 0x21, 0x33,
+ 0x11, 0x23, 0x2f, 0x10, 0x21, 0x32, 0x11, 0x20, 0x38, 0x0f, 0x1e, 0x37,
+ 0x0e, 0x1d, 0x32, 0x0f, 0x20, 0x32, 0x0e, 0x20, 0x2e, 0x0d, 0x1f, 0x2d,
+ 0x0e, 0x1f, 0x33, 0x11, 0x20, 0x32, 0x0f, 0x1c, 0x2d, 0x0a, 0x1c, 0x2b,
+ 0x14, 0x31, 0x45, 0x28, 0x52, 0x70, 0x3a, 0x74, 0x99, 0x38, 0x7c, 0xa9,
+ 0x35, 0x72, 0xb0, 0x36, 0x6d, 0xab, 0x30, 0x5a, 0x98, 0x20, 0x3f, 0x77,
+ 0x0f, 0x26, 0x53, 0x0c, 0x1e, 0x3c, 0x0d, 0x1b, 0x2c, 0x0e, 0x1b, 0x25,
+ 0x0d, 0x1a, 0x2b, 0x0b, 0x18, 0x28, 0x0c, 0x19, 0x26, 0x10, 0x1e, 0x2d,
+ 0x14, 0x24, 0x37, 0x19, 0x2a, 0x3c, 0x16, 0x27, 0x37, 0x11, 0x1f, 0x2c,
+ 0x13, 0x1e, 0x20, 0x16, 0x25, 0x29, 0x1d, 0x32, 0x3b, 0x1d, 0x33, 0x46,
+ 0x19, 0x32, 0x4c, 0x18, 0x31, 0x51, 0x15, 0x30, 0x4e, 0x11, 0x2e, 0x48,
+ 0x15, 0x27, 0x3a, 0x17, 0x28, 0x3a, 0x14, 0x26, 0x35, 0x11, 0x22, 0x2a,
+ 0x11, 0x1e, 0x23, 0x15, 0x23, 0x2a, 0x18, 0x27, 0x36, 0x15, 0x28, 0x3f,
+ 0x12, 0x33, 0x4d, 0x1a, 0x3d, 0x5b, 0x1a, 0x3c, 0x61, 0x1b, 0x3d, 0x68,
+ 0x18, 0x3f, 0x6c, 0x22, 0x54, 0x85, 0x27, 0x69, 0xa5, 0x27, 0x73, 0xbb,
+ 0x28, 0x6e, 0xb2, 0x24, 0x71, 0xb6, 0x28, 0x75, 0xb9, 0x23, 0x61, 0x9b,
+ 0x10, 0x36, 0x5f, 0x07, 0x19, 0x34, 0x0c, 0x18, 0x2e, 0x08, 0x17, 0x2d,
+ 0x07, 0x16, 0x2a, 0x0c, 0x16, 0x27, 0x0d, 0x13, 0x23, 0x04, 0x19, 0x2f,
+ 0x2d, 0x59, 0x7e, 0x44, 0x84, 0xb7, 0x39, 0x81, 0xc0, 0x39, 0x80, 0xc4,
+ 0x28, 0x77, 0xba, 0x15, 0x62, 0xa4, 0x0e, 0x51, 0x90, 0x0b, 0x43, 0x78,
+ 0x0f, 0x38, 0x62, 0x0f, 0x2d, 0x4c, 0x0d, 0x27, 0x44, 0x0f, 0x25, 0x41,
+ 0x11, 0x24, 0x3b, 0x13, 0x27, 0x3f, 0x13, 0x2b, 0x43, 0x17, 0x31, 0x48,
+ 0x20, 0x3d, 0x4c, 0x0e, 0x27, 0x31, 0x05, 0x0f, 0x15, 0x0b, 0x09, 0x0a,
+ 0x11, 0x1c, 0x25, 0x11, 0x21, 0x38, 0x0a, 0x1f, 0x3a, 0x07, 0x1b, 0x2e,
+ 0x10, 0x1e, 0x2b, 0x0f, 0x17, 0x24, 0x0e, 0x12, 0x1d, 0x0b, 0x10, 0x13,
+ 0x0b, 0x0b, 0x0d, 0x05, 0x05, 0x07, 0x08, 0x06, 0x09, 0x07, 0x05, 0x06,
+ 0x06, 0x04, 0x05, 0x05, 0x04, 0x05, 0x05, 0x06, 0x06, 0x03, 0x05, 0x04,
+ 0x04, 0x06, 0x05, 0x05, 0x07, 0x06, 0x05, 0x07, 0x04, 0x05, 0x07, 0x04,
+ 0x0a, 0x0b, 0x09, 0x0a, 0x0c, 0x0b, 0x0c, 0x0d, 0x0f, 0x16, 0x17, 0x19,
+ 0x0d, 0x0e, 0x10, 0x0b, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0b, 0x08, 0x08, 0x06, 0x09, 0x09, 0x07,
+ 0x0c, 0x0d, 0x08, 0x0b, 0x0c, 0x07, 0x10, 0x0f, 0x0b, 0x12, 0x0e, 0x0b,
+ 0x13, 0x0f, 0x0d, 0x19, 0x15, 0x13, 0x19, 0x15, 0x14, 0x1b, 0x18, 0x16,
+ 0x1b, 0x1a, 0x16, 0x18, 0x16, 0x13, 0x18, 0x14, 0x13, 0x18, 0x14, 0x13,
+ 0x19, 0x15, 0x14, 0x17, 0x13, 0x12, 0x16, 0x15, 0x11, 0x1d, 0x1c, 0x18,
+ 0x44, 0x4c, 0x46, 0x55, 0x63, 0x67, 0x4f, 0x5f, 0x6e, 0x4d, 0x60, 0x71,
+ 0x4b, 0x5c, 0x6e, 0x4f, 0x62, 0x6f, 0x50, 0x62, 0x6f, 0x45, 0x57, 0x65,
+ 0x1d, 0x25, 0x35, 0x08, 0x0c, 0x17, 0x0e, 0x10, 0x13, 0x10, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0e, 0x0d, 0x0b, 0x0d, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0e, 0x0a, 0x0a, 0x0a, 0x22, 0x22, 0x22, 0x29, 0x29, 0x29,
+ 0x11, 0x11, 0x11, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0c, 0x09, 0x0a, 0x0c,
+ 0x07, 0x0b, 0x0c, 0x14, 0x18, 0x19, 0x1b, 0x1f, 0x1e, 0x12, 0x16, 0x15,
+ 0x0d, 0x0f, 0x0e, 0x0a, 0x0e, 0x0d, 0x0a, 0x0e, 0x0d, 0x0c, 0x0e, 0x0e,
+ 0x13, 0x11, 0x12, 0x11, 0x10, 0x0e, 0x0e, 0x0e, 0x0c, 0x11, 0x13, 0x12,
+ 0x12, 0x13, 0x15, 0x12, 0x11, 0x11, 0x1c, 0x16, 0x11, 0x33, 0x25, 0x1b,
+ 0x50, 0x32, 0x1e, 0x42, 0x28, 0x19, 0x38, 0x25, 0x1c, 0x23, 0x18, 0x10,
+ 0x22, 0x1f, 0x10, 0x3c, 0x3f, 0x28, 0x43, 0x4a, 0x29, 0x49, 0x53, 0x2e,
+ 0x4e, 0x5b, 0x31, 0x54, 0x61, 0x36, 0x58, 0x65, 0x39, 0x60, 0x6d, 0x41,
+ 0x68, 0x76, 0x48, 0x6d, 0x7c, 0x4d, 0x70, 0x80, 0x51, 0x75, 0x84, 0x56,
+ 0x76, 0x86, 0x5b, 0x74, 0x85, 0x59, 0x74, 0x88, 0x5a, 0x73, 0x89, 0x5b,
+ 0x74, 0x8b, 0x5d, 0x74, 0x8d, 0x61, 0x74, 0x8d, 0x62, 0x74, 0x8d, 0x63,
+ 0x75, 0x8d, 0x68, 0x73, 0x8c, 0x63, 0x76, 0x8d, 0x5f, 0x7b, 0x90, 0x63,
+ 0x7d, 0x8e, 0x6d, 0x76, 0x8a, 0x77, 0x60, 0x7c, 0x77, 0x48, 0x6a, 0x6e,
+ 0x38, 0x5a, 0x66, 0x33, 0x4d, 0x5d, 0x30, 0x3f, 0x50, 0x20, 0x26, 0x31,
+ 0x17, 0x16, 0x19, 0x20, 0x14, 0x10, 0x2e, 0x18, 0x13, 0x38, 0x1c, 0x1a,
+ 0x3f, 0x24, 0x23, 0x57, 0x37, 0x2e, 0x5f, 0x45, 0x35, 0x4f, 0x47, 0x3a,
+ 0x40, 0x44, 0x45, 0x53, 0x59, 0x66, 0xb2, 0xba, 0xc4, 0xe6, 0xf4, 0xf9,
+ 0x0f, 0x11, 0x0e, 0x0e, 0x10, 0x0d, 0x0c, 0x0d, 0x0d, 0x0a, 0x0b, 0x0d,
+ 0x0a, 0x0b, 0x0d, 0x0a, 0x0a, 0x0a, 0x0b, 0x09, 0x0a, 0x1f, 0x1d, 0x1d,
+ 0x58, 0x54, 0x4c, 0x6c, 0x69, 0x5b, 0x45, 0x42, 0x34, 0x17, 0x17, 0x0b,
+ 0x08, 0x08, 0x04, 0x09, 0x08, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x0b, 0x07,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x10, 0x10, 0x10, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x12, 0x12, 0x12, 0x0e, 0x0e, 0x0e,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f,
+ 0x10, 0x12, 0x11, 0x12, 0x14, 0x13, 0x16, 0x18, 0x17, 0x19, 0x1b, 0x1a,
+ 0x19, 0x1b, 0x19, 0x14, 0x15, 0x0f, 0x1e, 0x1e, 0x15, 0x23, 0x23, 0x19,
+ 0x16, 0x16, 0x0b, 0x10, 0x12, 0x0a, 0x14, 0x14, 0x12, 0x1a, 0x1a, 0x1b,
+ 0x1a, 0x1c, 0x1d, 0x1b, 0x1c, 0x18, 0x1e, 0x1a, 0x13, 0x1a, 0x18, 0x0f,
+ 0x14, 0x13, 0x0d, 0x14, 0x16, 0x14, 0x1c, 0x1e, 0x1e, 0x23, 0x24, 0x23,
+ 0x16, 0x18, 0x13, 0x0f, 0x0f, 0x0a, 0x11, 0x0d, 0x0a, 0x15, 0x12, 0x0d,
+ 0x15, 0x14, 0x10, 0x0d, 0x0e, 0x0a, 0x09, 0x0a, 0x0b, 0x07, 0x08, 0x0c,
+ 0x07, 0x09, 0x09, 0x06, 0x0a, 0x0b, 0x09, 0x0b, 0x0f, 0x09, 0x08, 0x0e,
+ 0x09, 0x08, 0x0d, 0x08, 0x09, 0x0d, 0x07, 0x0b, 0x0c, 0x05, 0x07, 0x06,
+ 0x09, 0x09, 0x08, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x07, 0x0b, 0x0b, 0x09,
+ 0x0d, 0x0d, 0x0b, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e, 0x1c, 0x1c, 0x1c, 0x22, 0x24, 0x23,
+ 0x24, 0x25, 0x27, 0x21, 0x22, 0x24, 0x11, 0x12, 0x14, 0x0b, 0x0c, 0x0e,
+ 0x07, 0x07, 0x09, 0x08, 0x07, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x0d, 0x12, 0x16, 0x16, 0x23, 0x2d, 0x12, 0x23, 0x33,
+ 0x0f, 0x21, 0x2e, 0x10, 0x21, 0x31, 0x0e, 0x1d, 0x34, 0x0f, 0x1e, 0x35,
+ 0x0f, 0x1e, 0x33, 0x10, 0x20, 0x30, 0x0e, 0x20, 0x2d, 0x0d, 0x1f, 0x2e,
+ 0x0d, 0x20, 0x33, 0x0f, 0x1d, 0x32, 0x12, 0x1a, 0x2f, 0x13, 0x19, 0x2d,
+ 0x0d, 0x1a, 0x2f, 0x05, 0x20, 0x35, 0x17, 0x40, 0x55, 0x36, 0x69, 0x7f,
+ 0x3d, 0x7a, 0xa6, 0x3c, 0x78, 0xad, 0x37, 0x71, 0xad, 0x2e, 0x63, 0xa4,
+ 0x22, 0x4e, 0x8b, 0x14, 0x36, 0x67, 0x09, 0x21, 0x44, 0x07, 0x19, 0x33,
+ 0x09, 0x18, 0x31, 0x0b, 0x1a, 0x2d, 0x0f, 0x1f, 0x2d, 0x13, 0x24, 0x35,
+ 0x18, 0x2a, 0x40, 0x1a, 0x2c, 0x42, 0x18, 0x2a, 0x3c, 0x0f, 0x1f, 0x2b,
+ 0x0e, 0x1c, 0x1f, 0x18, 0x27, 0x2c, 0x1f, 0x31, 0x3c, 0x1d, 0x33, 0x46,
+ 0x17, 0x31, 0x4d, 0x12, 0x2f, 0x4e, 0x14, 0x32, 0x50, 0x13, 0x31, 0x4c,
+ 0x16, 0x29, 0x3f, 0x13, 0x25, 0x3b, 0x11, 0x24, 0x36, 0x10, 0x21, 0x2b,
+ 0x12, 0x21, 0x28, 0x14, 0x23, 0x2a, 0x15, 0x24, 0x35, 0x17, 0x28, 0x40,
+ 0x1d, 0x35, 0x4d, 0x1f, 0x3c, 0x5e, 0x17, 0x3b, 0x6b, 0x21, 0x4d, 0x84,
+ 0x2b, 0x60, 0x9c, 0x27, 0x66, 0xa6, 0x26, 0x6e, 0xb2, 0x21, 0x70, 0xb3,
+ 0x1c, 0x69, 0xae, 0x20, 0x6c, 0xaf, 0x23, 0x64, 0x9e, 0x09, 0x34, 0x5e,
+ 0x05, 0x18, 0x30, 0x0f, 0x16, 0x25, 0x0e, 0x16, 0x28, 0x06, 0x15, 0x2e,
+ 0x07, 0x15, 0x24, 0x0d, 0x15, 0x20, 0x0b, 0x13, 0x1b, 0x07, 0x1d, 0x2d,
+ 0x2c, 0x5b, 0x7b, 0x32, 0x75, 0xa6, 0x2b, 0x75, 0xb3, 0x27, 0x72, 0xb5,
+ 0x1d, 0x67, 0xa8, 0x13, 0x59, 0x98, 0x0c, 0x4a, 0x83, 0x0d, 0x3f, 0x70,
+ 0x0f, 0x34, 0x5c, 0x11, 0x2d, 0x4c, 0x0f, 0x28, 0x45, 0x0e, 0x28, 0x43,
+ 0x0f, 0x28, 0x45, 0x13, 0x2b, 0x43, 0x15, 0x30, 0x41, 0x15, 0x35, 0x48,
+ 0x1a, 0x39, 0x55, 0x17, 0x30, 0x45, 0x03, 0x0f, 0x18, 0x09, 0x0f, 0x11,
+ 0x16, 0x2b, 0x44, 0x14, 0x2a, 0x50, 0x0e, 0x22, 0x4a, 0x0e, 0x21, 0x3b,
+ 0x0c, 0x1b, 0x2c, 0x0a, 0x14, 0x23, 0x0b, 0x11, 0x1a, 0x0a, 0x10, 0x11,
+ 0x09, 0x0b, 0x0c, 0x05, 0x06, 0x08, 0x06, 0x06, 0x07, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x03, 0x05, 0x04, 0x04, 0x06, 0x07, 0x05, 0x06, 0x08,
+ 0x05, 0x05, 0x07, 0x09, 0x09, 0x0a, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08,
+ 0x0e, 0x0e, 0x10, 0x0d, 0x0d, 0x0f, 0x0f, 0x0e, 0x13, 0x10, 0x0f, 0x14,
+ 0x0d, 0x0d, 0x0f, 0x0b, 0x0b, 0x0d, 0x0b, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x07,
+ 0x09, 0x0b, 0x0a, 0x0a, 0x0c, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0a, 0x0b, 0x0c, 0x0b, 0x09, 0x0b, 0x0b, 0x0a, 0x0e, 0x0d, 0x0c,
+ 0x11, 0x11, 0x0f, 0x12, 0x12, 0x10, 0x14, 0x13, 0x12, 0x14, 0x12, 0x13,
+ 0x14, 0x13, 0x13, 0x13, 0x12, 0x11, 0x14, 0x13, 0x11, 0x20, 0x21, 0x1c,
+ 0x49, 0x50, 0x4d, 0x53, 0x60, 0x64, 0x50, 0x60, 0x6f, 0x4d, 0x60, 0x71,
+ 0x4e, 0x5f, 0x6f, 0x51, 0x63, 0x71, 0x4c, 0x5e, 0x6b, 0x45, 0x58, 0x66,
+ 0x19, 0x1e, 0x2c, 0x0a, 0x0d, 0x16, 0x0e, 0x0f, 0x12, 0x0d, 0x0e, 0x0d,
+ 0x0c, 0x0e, 0x0d, 0x0a, 0x0c, 0x0b, 0x0c, 0x0e, 0x0d, 0x0e, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x10, 0x0b, 0x0b, 0x0c, 0x1d, 0x1d, 0x1b, 0x29, 0x28, 0x26,
+ 0x18, 0x17, 0x15, 0x11, 0x11, 0x10, 0x0d, 0x0d, 0x0f, 0x0c, 0x0d, 0x10,
+ 0x15, 0x17, 0x16, 0x1e, 0x1f, 0x21, 0x15, 0x17, 0x19, 0x0f, 0x10, 0x12,
+ 0x0f, 0x11, 0x10, 0x0d, 0x0f, 0x0c, 0x10, 0x10, 0x0e, 0x17, 0x17, 0x15,
+ 0x21, 0x20, 0x1c, 0x1f, 0x1e, 0x1a, 0x13, 0x14, 0x0f, 0x14, 0x16, 0x13,
+ 0x10, 0x12, 0x0f, 0x12, 0x13, 0x0d, 0x1b, 0x15, 0x0d, 0x2f, 0x21, 0x17,
+ 0x4a, 0x30, 0x23, 0x41, 0x28, 0x1c, 0x39, 0x25, 0x1a, 0x2a, 0x1e, 0x15,
+ 0x1c, 0x19, 0x0d, 0x2f, 0x31, 0x21, 0x3b, 0x41, 0x28, 0x43, 0x4a, 0x2c,
+ 0x47, 0x53, 0x2f, 0x4d, 0x59, 0x33, 0x52, 0x5e, 0x36, 0x5b, 0x68, 0x3d,
+ 0x5e, 0x6b, 0x3f, 0x67, 0x74, 0x48, 0x6e, 0x7b, 0x4f, 0x75, 0x82, 0x55,
+ 0x78, 0x87, 0x5c, 0x78, 0x88, 0x5b, 0x76, 0x89, 0x5b, 0x75, 0x8a, 0x5c,
+ 0x76, 0x8e, 0x5f, 0x77, 0x8f, 0x61, 0x77, 0x8d, 0x62, 0x76, 0x8d, 0x63,
+ 0x74, 0x8f, 0x65, 0x75, 0x91, 0x64, 0x7a, 0x92, 0x63, 0x7e, 0x90, 0x65,
+ 0x7d, 0x8e, 0x6e, 0x71, 0x82, 0x73, 0x5e, 0x74, 0x73, 0x4b, 0x66, 0x6f,
+ 0x39, 0x58, 0x6c, 0x2f, 0x47, 0x5a, 0x29, 0x39, 0x4b, 0x1c, 0x24, 0x2f,
+ 0x15, 0x17, 0x19, 0x1f, 0x18, 0x16, 0x2a, 0x19, 0x16, 0x36, 0x20, 0x1b,
+ 0x44, 0x2d, 0x20, 0x69, 0x45, 0x39, 0x7b, 0x56, 0x4e, 0x57, 0x49, 0x47,
+ 0x56, 0x60, 0x67, 0xa7, 0xb8, 0xc3, 0xe7, 0xf3, 0xfa, 0xee, 0xf7, 0xf7,
+ 0x10, 0x10, 0x0e, 0x0f, 0x11, 0x10, 0x0d, 0x0f, 0x0e, 0x0c, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0b, 0x0c, 0x0b, 0x07, 0x29, 0x27, 0x23, 0x5e, 0x5c, 0x54,
+ 0x68, 0x67, 0x54, 0x39, 0x37, 0x2b, 0x10, 0x0c, 0x0b, 0x09, 0x07, 0x09,
+ 0x07, 0x07, 0x05, 0x09, 0x09, 0x05, 0x07, 0x09, 0x07, 0x0a, 0x0b, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x10, 0x11, 0x11, 0x0e, 0x0f, 0x0e,
+ 0x10, 0x12, 0x11, 0x12, 0x14, 0x13, 0x18, 0x1a, 0x19, 0x1a, 0x1b, 0x1a,
+ 0x19, 0x1b, 0x18, 0x11, 0x11, 0x12, 0x11, 0x10, 0x16, 0x13, 0x12, 0x16,
+ 0x13, 0x11, 0x0f, 0x12, 0x11, 0x0b, 0x14, 0x14, 0x10, 0x17, 0x17, 0x18,
+ 0x17, 0x19, 0x18, 0x1a, 0x19, 0x13, 0x23, 0x1f, 0x14, 0x1f, 0x1b, 0x0e,
+ 0x17, 0x15, 0x0b, 0x16, 0x16, 0x10, 0x17, 0x19, 0x16, 0x1e, 0x1e, 0x1f,
+ 0x1b, 0x1a, 0x1c, 0x13, 0x14, 0x0e, 0x12, 0x13, 0x07, 0x10, 0x11, 0x08,
+ 0x10, 0x10, 0x0f, 0x0e, 0x0e, 0x10, 0x09, 0x0b, 0x0a, 0x07, 0x0a, 0x03,
+ 0x06, 0x08, 0x04, 0x05, 0x09, 0x0c, 0x10, 0x0f, 0x12, 0x28, 0x21, 0x1b,
+ 0x26, 0x1f, 0x19, 0x0e, 0x0d, 0x0f, 0x05, 0x09, 0x0c, 0x07, 0x09, 0x06,
+ 0x0a, 0x0a, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x08, 0x0d, 0x0c, 0x0c, 0x14, 0x13, 0x14, 0x15, 0x17, 0x16,
+ 0x1d, 0x1e, 0x20, 0x27, 0x28, 0x2a, 0x24, 0x26, 0x28, 0x19, 0x1c, 0x1f,
+ 0x15, 0x16, 0x18, 0x0f, 0x10, 0x12, 0x0b, 0x0b, 0x0d, 0x0d, 0x0c, 0x0d,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x11, 0x12, 0x17, 0x23, 0x2a, 0x10, 0x22, 0x2f,
+ 0x0d, 0x1f, 0x2a, 0x0f, 0x1f, 0x30, 0x0f, 0x1e, 0x33, 0x0e, 0x1d, 0x32,
+ 0x0f, 0x1e, 0x31, 0x0e, 0x1e, 0x2e, 0x0e, 0x1e, 0x2e, 0x0d, 0x1e, 0x2e,
+ 0x10, 0x1e, 0x2c, 0x0d, 0x1a, 0x2a, 0x0d, 0x1a, 0x2b, 0x0f, 0x1c, 0x2f,
+ 0x0b, 0x1a, 0x2f, 0x09, 0x1a, 0x2e, 0x09, 0x1b, 0x2f, 0x11, 0x28, 0x3a,
+ 0x23, 0x56, 0x65, 0x3e, 0x79, 0x92, 0x3d, 0x7d, 0xa5, 0x32, 0x77, 0xad,
+ 0x2d, 0x6d, 0xa9, 0x2a, 0x60, 0x9b, 0x1c, 0x45, 0x7b, 0x0c, 0x2d, 0x5d,
+ 0x07, 0x1e, 0x3f, 0x08, 0x1e, 0x36, 0x14, 0x26, 0x39, 0x17, 0x29, 0x3e,
+ 0x18, 0x2c, 0x45, 0x19, 0x2d, 0x46, 0x18, 0x2b, 0x3f, 0x10, 0x22, 0x2e,
+ 0x0d, 0x1c, 0x21, 0x17, 0x25, 0x2c, 0x21, 0x31, 0x3c, 0x1c, 0x31, 0x42,
+ 0x16, 0x31, 0x4a, 0x14, 0x34, 0x51, 0x14, 0x34, 0x51, 0x16, 0x35, 0x52,
+ 0x1b, 0x34, 0x4e, 0x17, 0x2f, 0x47, 0x14, 0x29, 0x3e, 0x12, 0x23, 0x31,
+ 0x14, 0x22, 0x2b, 0x16, 0x25, 0x2d, 0x15, 0x26, 0x37, 0x13, 0x28, 0x41,
+ 0x1e, 0x35, 0x52, 0x1e, 0x3d, 0x68, 0x1f, 0x49, 0x83, 0x29, 0x63, 0xa1,
+ 0x2d, 0x72, 0xb5, 0x25, 0x6d, 0xb3, 0x2a, 0x71, 0xb5, 0x29, 0x71, 0xad,
+ 0x23, 0x6d, 0xae, 0x21, 0x5b, 0x90, 0x11, 0x33, 0x57, 0x04, 0x18, 0x2f,
+ 0x08, 0x17, 0x2a, 0x07, 0x17, 0x27, 0x0b, 0x15, 0x26, 0x09, 0x12, 0x23,
+ 0x09, 0x15, 0x21, 0x0a, 0x13, 0x1c, 0x09, 0x11, 0x18, 0x03, 0x15, 0x20,
+ 0x0d, 0x31, 0x47, 0x18, 0x4e, 0x74, 0x1b, 0x5d, 0x91, 0x17, 0x5d, 0x9a,
+ 0x15, 0x54, 0x8f, 0x13, 0x4f, 0x87, 0x0e, 0x45, 0x76, 0x0e, 0x3b, 0x66,
+ 0x14, 0x35, 0x5c, 0x13, 0x2f, 0x51, 0x12, 0x2d, 0x4a, 0x0e, 0x2c, 0x47,
+ 0x10, 0x2d, 0x4d, 0x16, 0x30, 0x4b, 0x18, 0x35, 0x43, 0x13, 0x36, 0x48,
+ 0x1a, 0x39, 0x59, 0x20, 0x35, 0x4d, 0x06, 0x14, 0x1e, 0x0a, 0x1c, 0x2a,
+ 0x15, 0x35, 0x5e, 0x0f, 0x2c, 0x5d, 0x11, 0x27, 0x54, 0x0d, 0x1f, 0x3c,
+ 0x09, 0x17, 0x25, 0x08, 0x10, 0x1d, 0x09, 0x0f, 0x16, 0x0c, 0x10, 0x10,
+ 0x0c, 0x0f, 0x10, 0x07, 0x09, 0x0a, 0x05, 0x06, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x04, 0x05, 0x05, 0x06, 0x07, 0x09, 0x0e, 0x0f, 0x11,
+ 0x1a, 0x18, 0x1a, 0x1a, 0x18, 0x1b, 0x12, 0x10, 0x13, 0x14, 0x12, 0x15,
+ 0x1c, 0x1a, 0x1d, 0x14, 0x12, 0x17, 0x18, 0x15, 0x1c, 0x1b, 0x19, 0x1f,
+ 0x10, 0x10, 0x13, 0x0d, 0x0d, 0x0f, 0x0e, 0x0d, 0x0f, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x0a, 0x09, 0x09, 0x0b, 0x0a, 0x0b, 0x0b, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0c, 0x0d, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0f, 0x10, 0x0e, 0x0e, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11,
+ 0x11, 0x0f, 0x10, 0x12, 0x12, 0x10, 0x14, 0x14, 0x12, 0x2a, 0x2b, 0x28,
+ 0x51, 0x5a, 0x5b, 0x54, 0x61, 0x68, 0x50, 0x62, 0x70, 0x4e, 0x61, 0x70,
+ 0x4d, 0x5f, 0x6d, 0x4f, 0x60, 0x6b, 0x4d, 0x5e, 0x6a, 0x3e, 0x50, 0x5e,
+ 0x11, 0x17, 0x22, 0x0d, 0x10, 0x15, 0x0f, 0x0f, 0x11, 0x0f, 0x0f, 0x0f,
+ 0x10, 0x11, 0x11, 0x0c, 0x0d, 0x0f, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e,
+ 0x0b, 0x0c, 0x0e, 0x0c, 0x0c, 0x0c, 0x11, 0x10, 0x0e, 0x25, 0x24, 0x1f,
+ 0x28, 0x26, 0x23, 0x28, 0x27, 0x25, 0x18, 0x18, 0x1b, 0x0f, 0x10, 0x14,
+ 0x18, 0x1a, 0x19, 0x19, 0x1a, 0x1d, 0x10, 0x11, 0x17, 0x0f, 0x10, 0x15,
+ 0x10, 0x11, 0x13, 0x12, 0x12, 0x12, 0x1c, 0x1c, 0x1c, 0x25, 0x24, 0x25,
+ 0x2a, 0x2c, 0x29, 0x24, 0x26, 0x23, 0x16, 0x18, 0x17, 0x18, 0x1c, 0x1b,
+ 0x14, 0x19, 0x15, 0x13, 0x13, 0x0f, 0x1d, 0x18, 0x12, 0x2d, 0x21, 0x1a,
+ 0x46, 0x2e, 0x24, 0x43, 0x2b, 0x1f, 0x3d, 0x27, 0x1a, 0x30, 0x22, 0x17,
+ 0x17, 0x12, 0x0c, 0x1e, 0x1f, 0x17, 0x30, 0x34, 0x24, 0x3a, 0x40, 0x28,
+ 0x3f, 0x49, 0x30, 0x47, 0x52, 0x34, 0x4c, 0x57, 0x35, 0x55, 0x61, 0x3b,
+ 0x58, 0x64, 0x3c, 0x5e, 0x6b, 0x41, 0x66, 0x73, 0x47, 0x6d, 0x7a, 0x4f,
+ 0x73, 0x80, 0x54, 0x76, 0x86, 0x59, 0x76, 0x87, 0x5a, 0x77, 0x8b, 0x5d,
+ 0x77, 0x8c, 0x5e, 0x79, 0x8e, 0x61, 0x78, 0x8d, 0x62, 0x79, 0x8b, 0x61,
+ 0x74, 0x8d, 0x5f, 0x78, 0x92, 0x63, 0x77, 0x92, 0x63, 0x7b, 0x90, 0x68,
+ 0x78, 0x88, 0x6d, 0x6b, 0x7b, 0x6f, 0x5e, 0x70, 0x73, 0x4c, 0x60, 0x6c,
+ 0x3e, 0x51, 0x66, 0x32, 0x41, 0x52, 0x2f, 0x39, 0x44, 0x26, 0x28, 0x2e,
+ 0x19, 0x17, 0x15, 0x23, 0x19, 0x13, 0x2f, 0x1b, 0x13, 0x3d, 0x23, 0x18,
+ 0x4f, 0x35, 0x1e, 0x75, 0x50, 0x44, 0x81, 0x60, 0x5f, 0x66, 0x5e, 0x63,
+ 0xa6, 0xb6, 0xbc, 0xe3, 0xf3, 0xfa, 0xed, 0xf6, 0xf9, 0xf0, 0xf4, 0xf3,
+ 0x10, 0x0f, 0x10, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0e, 0x0b, 0x0b, 0x0b,
+ 0x11, 0x10, 0x0d, 0x3a, 0x3a, 0x32, 0x66, 0x63, 0x58, 0x58, 0x55, 0x48,
+ 0x2e, 0x2f, 0x21, 0x18, 0x17, 0x10, 0x07, 0x05, 0x07, 0x08, 0x08, 0x0a,
+ 0x08, 0x08, 0x08, 0x07, 0x08, 0x03, 0x07, 0x09, 0x08, 0x09, 0x0a, 0x0e,
+ 0x0a, 0x0a, 0x0a, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x0e, 0x0e, 0x0e, 0x12, 0x12, 0x12, 0x08, 0x08, 0x06,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0f, 0x11, 0x10, 0x13, 0x15, 0x14,
+ 0x14, 0x16, 0x15, 0x14, 0x16, 0x15, 0x19, 0x1b, 0x1a, 0x18, 0x19, 0x19,
+ 0x18, 0x18, 0x19, 0x12, 0x13, 0x14, 0x0e, 0x0f, 0x11, 0x11, 0x11, 0x11,
+ 0x13, 0x12, 0x10, 0x13, 0x12, 0x10, 0x13, 0x12, 0x10, 0x17, 0x17, 0x15,
+ 0x17, 0x17, 0x16, 0x21, 0x1f, 0x18, 0x3d, 0x37, 0x2a, 0x40, 0x3a, 0x2a,
+ 0x21, 0x1e, 0x10, 0x15, 0x15, 0x0d, 0x19, 0x1a, 0x15, 0x1c, 0x1d, 0x1b,
+ 0x1b, 0x19, 0x1b, 0x18, 0x18, 0x16, 0x15, 0x18, 0x12, 0x10, 0x12, 0x10,
+ 0x12, 0x11, 0x16, 0x13, 0x12, 0x19, 0x0d, 0x0d, 0x0d, 0x05, 0x08, 0x01,
+ 0x09, 0x0a, 0x06, 0x07, 0x08, 0x0d, 0x21, 0x1e, 0x14, 0x85, 0x77, 0x55,
+ 0x7f, 0x72, 0x4f, 0x1f, 0x1d, 0x13, 0x07, 0x09, 0x0d, 0x0d, 0x0e, 0x09,
+ 0x0a, 0x0c, 0x0b, 0x0b, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10, 0x0f, 0x0d, 0x0e, 0x0f, 0x0e, 0x0c,
+ 0x0e, 0x0e, 0x0c, 0x0f, 0x0f, 0x0d, 0x15, 0x15, 0x15, 0x14, 0x16, 0x15,
+ 0x15, 0x16, 0x17, 0x16, 0x17, 0x19, 0x21, 0x25, 0x28, 0x2a, 0x2f, 0x32,
+ 0x2d, 0x2e, 0x30, 0x24, 0x25, 0x27, 0x1a, 0x1a, 0x1c, 0x11, 0x10, 0x10,
+ 0x0b, 0x0a, 0x0a, 0x0c, 0x0f, 0x11, 0x11, 0x1d, 0x23, 0x0d, 0x1e, 0x29,
+ 0x0d, 0x1e, 0x2c, 0x0e, 0x1e, 0x2f, 0x0f, 0x1e, 0x31, 0x10, 0x1d, 0x2f,
+ 0x11, 0x1e, 0x2e, 0x0d, 0x1d, 0x2c, 0x0e, 0x1e, 0x2f, 0x0e, 0x1d, 0x2f,
+ 0x0f, 0x1b, 0x2a, 0x0d, 0x1b, 0x29, 0x0c, 0x1b, 0x2a, 0x0b, 0x1c, 0x2c,
+ 0x0c, 0x1c, 0x2d, 0x0a, 0x19, 0x2b, 0x0d, 0x1a, 0x2c, 0x0d, 0x19, 0x2c,
+ 0x09, 0x26, 0x31, 0x1e, 0x43, 0x53, 0x34, 0x63, 0x7e, 0x40, 0x7a, 0x9f,
+ 0x39, 0x77, 0xa5, 0x3e, 0x78, 0xad, 0x36, 0x6a, 0xa1, 0x25, 0x53, 0x8c,
+ 0x1f, 0x3e, 0x68, 0x12, 0x2e, 0x4c, 0x14, 0x2d, 0x43, 0x16, 0x2c, 0x43,
+ 0x16, 0x2b, 0x48, 0x18, 0x2e, 0x4b, 0x18, 0x2b, 0x42, 0x10, 0x22, 0x2d,
+ 0x0d, 0x1e, 0x25, 0x16, 0x27, 0x2e, 0x1f, 0x2f, 0x39, 0x1d, 0x32, 0x41,
+ 0x1a, 0x38, 0x4b, 0x15, 0x38, 0x52, 0x15, 0x36, 0x55, 0x18, 0x37, 0x56,
+ 0x1a, 0x3a, 0x56, 0x1e, 0x3c, 0x58, 0x1c, 0x33, 0x4c, 0x16, 0x27, 0x38,
+ 0x17, 0x24, 0x2f, 0x13, 0x24, 0x2e, 0x11, 0x25, 0x35, 0x11, 0x2a, 0x41,
+ 0x14, 0x39, 0x5e, 0x22, 0x4e, 0x83, 0x2f, 0x64, 0xa4, 0x2a, 0x6e, 0xac,
+ 0x26, 0x71, 0xb4, 0x24, 0x6c, 0xb4, 0x2a, 0x6d, 0xb0, 0x37, 0x77, 0xaf,
+ 0x24, 0x5c, 0x8c, 0x08, 0x2c, 0x50, 0x0b, 0x19, 0x2e, 0x0e, 0x15, 0x25,
+ 0x08, 0x17, 0x28, 0x02, 0x17, 0x28, 0x08, 0x14, 0x23, 0x0f, 0x11, 0x1d,
+ 0x0c, 0x13, 0x1f, 0x09, 0x10, 0x1a, 0x0a, 0x11, 0x19, 0x09, 0x11, 0x18,
+ 0x01, 0x13, 0x1e, 0x10, 0x32, 0x4a, 0x12, 0x43, 0x6d, 0x0e, 0x48, 0x7f,
+ 0x14, 0x46, 0x7a, 0x14, 0x44, 0x74, 0x0f, 0x3e, 0x69, 0x11, 0x38, 0x61,
+ 0x16, 0x37, 0x60, 0x16, 0x34, 0x58, 0x15, 0x33, 0x52, 0x0e, 0x31, 0x4c,
+ 0x10, 0x30, 0x4b, 0x18, 0x33, 0x51, 0x1b, 0x37, 0x4d, 0x19, 0x3b, 0x4e,
+ 0x1f, 0x37, 0x50, 0x15, 0x25, 0x34, 0x02, 0x13, 0x1f, 0x12, 0x30, 0x4d,
+ 0x15, 0x41, 0x6e, 0x0b, 0x30, 0x60, 0x0d, 0x24, 0x4f, 0x0b, 0x1b, 0x31,
+ 0x0c, 0x17, 0x20, 0x0a, 0x0e, 0x19, 0x0a, 0x0d, 0x12, 0x0f, 0x11, 0x0f,
+ 0x11, 0x12, 0x14, 0x08, 0x0a, 0x09, 0x06, 0x07, 0x06, 0x07, 0x07, 0x07,
+ 0x09, 0x07, 0x08, 0x15, 0x13, 0x14, 0x22, 0x20, 0x23, 0x2d, 0x2b, 0x2e,
+ 0x37, 0x33, 0x34, 0x2a, 0x26, 0x27, 0x26, 0x22, 0x23, 0x30, 0x2c, 0x2d,
+ 0x42, 0x3e, 0x41, 0x42, 0x3d, 0x43, 0x3c, 0x37, 0x3d, 0x35, 0x30, 0x37,
+ 0x2a, 0x28, 0x2a, 0x21, 0x1f, 0x20, 0x19, 0x17, 0x19, 0x14, 0x12, 0x13,
+ 0x10, 0x10, 0x10, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0b, 0x0c, 0x0c, 0x0b,
+ 0x0b, 0x0b, 0x0d, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0c, 0x0e, 0x0e, 0x0c,
+ 0x10, 0x10, 0x10, 0x0e, 0x0d, 0x0e, 0x0c, 0x0a, 0x0b, 0x0d, 0x0c, 0x0c,
+ 0x11, 0x10, 0x11, 0x0f, 0x0f, 0x0d, 0x13, 0x15, 0x12, 0x30, 0x33, 0x2e,
+ 0x4f, 0x5a, 0x5d, 0x52, 0x60, 0x6a, 0x51, 0x63, 0x6f, 0x4d, 0x61, 0x6c,
+ 0x4f, 0x62, 0x69, 0x4f, 0x60, 0x67, 0x4c, 0x5d, 0x68, 0x32, 0x42, 0x51,
+ 0x0c, 0x13, 0x1a, 0x0c, 0x0d, 0x11, 0x0e, 0x0e, 0x0e, 0x0f, 0x10, 0x0e,
+ 0x10, 0x12, 0x11, 0x0d, 0x0f, 0x11, 0x0a, 0x0b, 0x0d, 0x08, 0x08, 0x08,
+ 0x09, 0x0a, 0x0c, 0x0b, 0x0b, 0x0b, 0x13, 0x11, 0x0d, 0x31, 0x2e, 0x27,
+ 0x46, 0x43, 0x3d, 0x41, 0x40, 0x3c, 0x23, 0x23, 0x24, 0x0e, 0x0f, 0x13,
+ 0x0f, 0x13, 0x14, 0x13, 0x17, 0x1c, 0x1a, 0x1c, 0x28, 0x15, 0x19, 0x24,
+ 0x19, 0x1c, 0x22, 0x20, 0x22, 0x26, 0x33, 0x34, 0x38, 0x35, 0x34, 0x3a,
+ 0x2b, 0x2f, 0x34, 0x21, 0x26, 0x2c, 0x18, 0x1c, 0x24, 0x19, 0x1e, 0x24,
+ 0x14, 0x19, 0x1c, 0x14, 0x17, 0x16, 0x1d, 0x17, 0x17, 0x2b, 0x1e, 0x20,
+ 0x45, 0x2d, 0x28, 0x48, 0x2f, 0x23, 0x42, 0x2b, 0x1a, 0x36, 0x25, 0x1b,
+ 0x1c, 0x16, 0x12, 0x13, 0x15, 0x13, 0x20, 0x26, 0x1d, 0x2b, 0x32, 0x22,
+ 0x34, 0x3d, 0x2c, 0x3d, 0x46, 0x32, 0x45, 0x4f, 0x35, 0x4b, 0x56, 0x36,
+ 0x4e, 0x5c, 0x37, 0x57, 0x65, 0x3d, 0x5d, 0x6c, 0x43, 0x63, 0x71, 0x47,
+ 0x6c, 0x79, 0x4e, 0x73, 0x80, 0x54, 0x72, 0x83, 0x56, 0x76, 0x89, 0x5c,
+ 0x77, 0x8a, 0x5d, 0x7d, 0x90, 0x63, 0x7d, 0x8e, 0x64, 0x79, 0x89, 0x62,
+ 0x79, 0x8c, 0x5e, 0x7c, 0x93, 0x65, 0x77, 0x91, 0x66, 0x75, 0x8d, 0x6b,
+ 0x70, 0x84, 0x6f, 0x63, 0x76, 0x6f, 0x57, 0x6b, 0x6d, 0x42, 0x56, 0x61,
+ 0x32, 0x47, 0x5f, 0x27, 0x38, 0x4c, 0x26, 0x32, 0x3d, 0x23, 0x27, 0x2d,
+ 0x19, 0x19, 0x18, 0x23, 0x19, 0x15, 0x32, 0x20, 0x18, 0x40, 0x27, 0x1c,
+ 0x61, 0x3c, 0x27, 0x7a, 0x57, 0x4e, 0x79, 0x67, 0x69, 0xa8, 0xb0, 0xb4,
+ 0xe2, 0xf4, 0xf6, 0xed, 0xf6, 0xf9, 0xf0, 0xf4, 0xf7, 0xef, 0xf2, 0xf7,
+ 0x0e, 0x0f, 0x10, 0x12, 0x12, 0x15, 0x12, 0x12, 0x13, 0x18, 0x18, 0x16,
+ 0x48, 0x46, 0x40, 0x6c, 0x6a, 0x5f, 0x4d, 0x49, 0x3a, 0x1e, 0x1b, 0x0b,
+ 0x0d, 0x0c, 0x0d, 0x0c, 0x0b, 0x08, 0x08, 0x09, 0x02, 0x07, 0x08, 0x03,
+ 0x07, 0x06, 0x09, 0x07, 0x07, 0x0c, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x08,
+ 0x09, 0x0a, 0x09, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0a, 0x0c, 0x0b, 0x0c, 0x0d, 0x0d, 0x12, 0x14, 0x13,
+ 0x14, 0x16, 0x15, 0x17, 0x19, 0x18, 0x16, 0x18, 0x17, 0x16, 0x18, 0x18,
+ 0x18, 0x19, 0x1d, 0x11, 0x13, 0x11, 0x0e, 0x14, 0x09, 0x11, 0x15, 0x0a,
+ 0x13, 0x12, 0x0f, 0x14, 0x12, 0x14, 0x18, 0x17, 0x19, 0x1c, 0x1c, 0x1a,
+ 0x1b, 0x1b, 0x18, 0x24, 0x22, 0x19, 0x6c, 0x66, 0x57, 0x82, 0x7c, 0x68,
+ 0x2f, 0x2b, 0x1c, 0x15, 0x14, 0x0a, 0x1b, 0x1c, 0x15, 0x21, 0x22, 0x1d,
+ 0x1f, 0x1f, 0x1d, 0x1b, 0x1b, 0x1e, 0x13, 0x16, 0x17, 0x10, 0x12, 0x0f,
+ 0x12, 0x13, 0x0c, 0x12, 0x12, 0x0c, 0x0e, 0x0f, 0x0e, 0x08, 0x09, 0x0c,
+ 0x0a, 0x0a, 0x07, 0x08, 0x08, 0x0d, 0x1e, 0x17, 0x06, 0xa1, 0x91, 0x5b,
+ 0xa1, 0x91, 0x5b, 0x25, 0x1e, 0x0c, 0x0e, 0x0e, 0x12, 0x0f, 0x0e, 0x0b,
+ 0x0f, 0x11, 0x10, 0x13, 0x14, 0x14, 0x10, 0x0f, 0x11, 0x0e, 0x0d, 0x0f,
+ 0x14, 0x13, 0x14, 0x1d, 0x1b, 0x1b, 0x1f, 0x1c, 0x1d, 0x19, 0x18, 0x16,
+ 0x20, 0x1f, 0x1d, 0x1c, 0x1b, 0x19, 0x1c, 0x1d, 0x1b, 0x1d, 0x1f, 0x1f,
+ 0x23, 0x24, 0x26, 0x39, 0x3a, 0x3e, 0x35, 0x39, 0x3c, 0x21, 0x25, 0x29,
+ 0x28, 0x29, 0x2b, 0x2d, 0x2d, 0x30, 0x2c, 0x2c, 0x2e, 0x1e, 0x1f, 0x1f,
+ 0x11, 0x11, 0x11, 0x0f, 0x12, 0x16, 0x11, 0x1b, 0x22, 0x0c, 0x1c, 0x27,
+ 0x0c, 0x1c, 0x2d, 0x0b, 0x1b, 0x2c, 0x0d, 0x1d, 0x2d, 0x10, 0x1d, 0x2c,
+ 0x0f, 0x1d, 0x2a, 0x0c, 0x1c, 0x29, 0x0c, 0x1c, 0x2d, 0x0b, 0x1a, 0x2f,
+ 0x0b, 0x19, 0x2e, 0x0d, 0x1a, 0x2d, 0x0f, 0x1a, 0x2c, 0x11, 0x1b, 0x2c,
+ 0x0e, 0x1a, 0x29, 0x0c, 0x1a, 0x28, 0x09, 0x1b, 0x29, 0x0c, 0x1d, 0x2c,
+ 0x10, 0x18, 0x2e, 0x0b, 0x18, 0x30, 0x0e, 0x25, 0x3d, 0x27, 0x4a, 0x64,
+ 0x42, 0x6c, 0x8c, 0x4d, 0x7b, 0xa0, 0x3b, 0x6a, 0x96, 0x36, 0x62, 0x92,
+ 0x37, 0x57, 0x82, 0x27, 0x43, 0x65, 0x1d, 0x37, 0x4f, 0x18, 0x30, 0x48,
+ 0x17, 0x2d, 0x4b, 0x19, 0x2f, 0x4d, 0x18, 0x2a, 0x41, 0x10, 0x21, 0x2d,
+ 0x0d, 0x20, 0x27, 0x17, 0x29, 0x30, 0x20, 0x31, 0x39, 0x1e, 0x33, 0x40,
+ 0x1d, 0x3c, 0x4e, 0x18, 0x3b, 0x55, 0x16, 0x38, 0x57, 0x1c, 0x3b, 0x5d,
+ 0x19, 0x3d, 0x5a, 0x1c, 0x3c, 0x5a, 0x20, 0x3a, 0x55, 0x19, 0x2b, 0x3f,
+ 0x18, 0x26, 0x33, 0x17, 0x25, 0x31, 0x12, 0x25, 0x38, 0x0d, 0x2a, 0x45,
+ 0x12, 0x48, 0x75, 0x26, 0x5f, 0x9c, 0x2b, 0x6a, 0xac, 0x28, 0x71, 0xae,
+ 0x21, 0x6d, 0xad, 0x23, 0x6a, 0xb0, 0x30, 0x70, 0xb1, 0x25, 0x5d, 0x8f,
+ 0x09, 0x28, 0x43, 0x06, 0x18, 0x30, 0x0f, 0x18, 0x2b, 0x0d, 0x16, 0x25,
+ 0x08, 0x15, 0x23, 0x06, 0x16, 0x23, 0x08, 0x12, 0x1f, 0x10, 0x12, 0x1e,
+ 0x0d, 0x12, 0x1d, 0x09, 0x0d, 0x17, 0x0a, 0x0d, 0x15, 0x0a, 0x0f, 0x11,
+ 0x09, 0x0f, 0x13, 0x17, 0x29, 0x38, 0x12, 0x35, 0x5b, 0x0a, 0x38, 0x6c,
+ 0x13, 0x3a, 0x67, 0x15, 0x3e, 0x68, 0x0e, 0x38, 0x60, 0x0f, 0x34, 0x5c,
+ 0x18, 0x3a, 0x62, 0x19, 0x39, 0x5f, 0x15, 0x39, 0x58, 0x12, 0x37, 0x51,
+ 0x15, 0x36, 0x4c, 0x1d, 0x36, 0x57, 0x1e, 0x38, 0x56, 0x1d, 0x3b, 0x51,
+ 0x18, 0x2a, 0x3c, 0x09, 0x12, 0x17, 0x0b, 0x20, 0x2b, 0x1f, 0x44, 0x6d,
+ 0x13, 0x45, 0x72, 0x0c, 0x32, 0x60, 0x0c, 0x24, 0x49, 0x0b, 0x18, 0x28,
+ 0x0d, 0x14, 0x19, 0x0b, 0x0d, 0x15, 0x0d, 0x0d, 0x10, 0x0d, 0x0e, 0x09,
+ 0x0c, 0x0d, 0x0e, 0x06, 0x07, 0x07, 0x0d, 0x0b, 0x0d, 0x17, 0x15, 0x16,
+ 0x21, 0x1d, 0x1e, 0x2b, 0x27, 0x29, 0x33, 0x2d, 0x31, 0x2d, 0x27, 0x2a,
+ 0x31, 0x2b, 0x2c, 0x2f, 0x29, 0x29, 0x2a, 0x24, 0x24, 0x2f, 0x29, 0x29,
+ 0x3e, 0x39, 0x3a, 0x46, 0x40, 0x43, 0x3d, 0x37, 0x3c, 0x39, 0x33, 0x39,
+ 0x3a, 0x37, 0x38, 0x36, 0x34, 0x34, 0x31, 0x2f, 0x30, 0x2b, 0x29, 0x2a,
+ 0x21, 0x1f, 0x1f, 0x19, 0x18, 0x16, 0x11, 0x10, 0x0e, 0x0c, 0x0b, 0x0a,
+ 0x0b, 0x0a, 0x0c, 0x09, 0x08, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0a, 0x0b, 0x0b, 0x09, 0x0f, 0x0e, 0x0c,
+ 0x10, 0x0f, 0x0f, 0x0e, 0x0c, 0x0d, 0x0d, 0x0b, 0x0c, 0x0f, 0x0d, 0x0e,
+ 0x11, 0x0f, 0x10, 0x0e, 0x0e, 0x0c, 0x14, 0x16, 0x13, 0x39, 0x3c, 0x37,
+ 0x50, 0x5c, 0x62, 0x4d, 0x5e, 0x69, 0x4b, 0x5e, 0x6a, 0x4a, 0x5e, 0x67,
+ 0x50, 0x62, 0x69, 0x51, 0x5f, 0x65, 0x4b, 0x5a, 0x65, 0x2a, 0x37, 0x47,
+ 0x0d, 0x14, 0x17, 0x0c, 0x0e, 0x0f, 0x0d, 0x0d, 0x0b, 0x0e, 0x0e, 0x0c,
+ 0x0b, 0x0d, 0x0c, 0x09, 0x0d, 0x0e, 0x09, 0x0b, 0x0c, 0x0a, 0x09, 0x0a,
+ 0x08, 0x09, 0x0b, 0x0c, 0x0c, 0x0b, 0x11, 0x10, 0x0b, 0x27, 0x25, 0x1f,
+ 0x47, 0x44, 0x3d, 0x3c, 0x3c, 0x38, 0x29, 0x29, 0x2a, 0x22, 0x23, 0x27,
+ 0x2a, 0x30, 0x30, 0x35, 0x3a, 0x41, 0x40, 0x46, 0x54, 0x44, 0x4a, 0x57,
+ 0x4d, 0x53, 0x5a, 0x54, 0x58, 0x5b, 0x64, 0x66, 0x6c, 0x64, 0x65, 0x6e,
+ 0x55, 0x5b, 0x66, 0x49, 0x4f, 0x5d, 0x3d, 0x42, 0x51, 0x36, 0x3c, 0x4a,
+ 0x2d, 0x33, 0x3d, 0x2a, 0x2b, 0x33, 0x30, 0x29, 0x31, 0x36, 0x29, 0x32,
+ 0x42, 0x2b, 0x25, 0x4b, 0x31, 0x24, 0x45, 0x2e, 0x1f, 0x3f, 0x2d, 0x21,
+ 0x2a, 0x23, 0x22, 0x11, 0x13, 0x15, 0x14, 0x18, 0x14, 0x21, 0x26, 0x1b,
+ 0x29, 0x2f, 0x25, 0x31, 0x39, 0x2a, 0x36, 0x40, 0x2a, 0x40, 0x4b, 0x2f,
+ 0x46, 0x54, 0x32, 0x4e, 0x5d, 0x36, 0x54, 0x65, 0x3b, 0x5d, 0x6d, 0x42,
+ 0x66, 0x72, 0x48, 0x6e, 0x7b, 0x50, 0x6e, 0x7f, 0x52, 0x71, 0x84, 0x56,
+ 0x76, 0x89, 0x5b, 0x7a, 0x8c, 0x61, 0x7d, 0x8d, 0x64, 0x81, 0x8e, 0x67,
+ 0x80, 0x8f, 0x63, 0x7e, 0x91, 0x66, 0x77, 0x8e, 0x69, 0x73, 0x8b, 0x6f,
+ 0x6a, 0x82, 0x71, 0x5b, 0x71, 0x6c, 0x4d, 0x64, 0x68, 0x39, 0x51, 0x5c,
+ 0x2a, 0x40, 0x58, 0x23, 0x34, 0x45, 0x1f, 0x2a, 0x32, 0x1e, 0x20, 0x24,
+ 0x1f, 0x1c, 0x1b, 0x29, 0x1c, 0x17, 0x3b, 0x23, 0x1b, 0x54, 0x34, 0x28,
+ 0x75, 0x48, 0x38, 0x82, 0x65, 0x60, 0xaf, 0xae, 0xb1, 0xe1, 0xf4, 0xf4,
+ 0xe9, 0xfb, 0xf8, 0xf0, 0xf2, 0xf2, 0xf2, 0xf2, 0xf8, 0xed, 0xf3, 0xfd,
+ 0x09, 0x0e, 0x0b, 0x10, 0x10, 0x13, 0x28, 0x24, 0x29, 0x59, 0x51, 0x4d,
+ 0x69, 0x65, 0x52, 0x40, 0x3f, 0x2b, 0x15, 0x15, 0x0b, 0x0b, 0x0b, 0x0e,
+ 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x08, 0x08, 0x07,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x0a, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e, 0x12, 0x12, 0x12,
+ 0x15, 0x16, 0x15, 0x16, 0x18, 0x17, 0x15, 0x18, 0x17, 0x13, 0x17, 0x16,
+ 0x13, 0x17, 0x18, 0x0f, 0x12, 0x13, 0x10, 0x13, 0x11, 0x0f, 0x10, 0x0d,
+ 0x14, 0x14, 0x11, 0x18, 0x18, 0x15, 0x1f, 0x20, 0x1b, 0x21, 0x23, 0x1e,
+ 0x1f, 0x21, 0x1c, 0x1d, 0x1e, 0x10, 0x50, 0x50, 0x36, 0x68, 0x65, 0x47,
+ 0x29, 0x24, 0x0e, 0x17, 0x14, 0x07, 0x1d, 0x1d, 0x16, 0x22, 0x23, 0x1e,
+ 0x1d, 0x23, 0x1f, 0x1c, 0x1d, 0x23, 0x1a, 0x17, 0x1c, 0x17, 0x12, 0x0f,
+ 0x15, 0x11, 0x0b, 0x12, 0x11, 0x12, 0x13, 0x14, 0x18, 0x10, 0x15, 0x16,
+ 0x0e, 0x0e, 0x12, 0x0b, 0x0b, 0x0c, 0x0e, 0x0c, 0x02, 0x2d, 0x29, 0x12,
+ 0x41, 0x3f, 0x21, 0x23, 0x20, 0x0b, 0x18, 0x15, 0x0f, 0x0f, 0x0a, 0x11,
+ 0x11, 0x11, 0x12, 0x1b, 0x18, 0x1b, 0x20, 0x17, 0x1a, 0x20, 0x18, 0x19,
+ 0x23, 0x1c, 0x1a, 0x28, 0x20, 0x1e, 0x2e, 0x25, 0x23, 0x2d, 0x22, 0x21,
+ 0x2b, 0x21, 0x1d, 0x2e, 0x26, 0x21, 0x2b, 0x26, 0x25, 0x3e, 0x3c, 0x3f,
+ 0x60, 0x5f, 0x63, 0x7d, 0x7b, 0x81, 0x6b, 0x68, 0x70, 0x22, 0x20, 0x27,
+ 0x1e, 0x1c, 0x22, 0x25, 0x23, 0x28, 0x30, 0x2f, 0x33, 0x26, 0x27, 0x2a,
+ 0x1e, 0x22, 0x26, 0x1d, 0x20, 0x28, 0x19, 0x1d, 0x29, 0x12, 0x16, 0x26,
+ 0x0e, 0x1a, 0x28, 0x0a, 0x18, 0x26, 0x0c, 0x1b, 0x28, 0x0f, 0x1d, 0x28,
+ 0x10, 0x1d, 0x28, 0x0e, 0x1b, 0x28, 0x0e, 0x1b, 0x2d, 0x0a, 0x19, 0x2e,
+ 0x0d, 0x1a, 0x2c, 0x0e, 0x19, 0x2b, 0x0c, 0x17, 0x29, 0x0f, 0x1a, 0x2c,
+ 0x11, 0x1c, 0x2d, 0x0e, 0x1b, 0x2b, 0x0c, 0x1c, 0x2b, 0x0c, 0x1d, 0x2d,
+ 0x13, 0x23, 0x38, 0x12, 0x1f, 0x32, 0x1a, 0x25, 0x35, 0x24, 0x2c, 0x3b,
+ 0x39, 0x3f, 0x4e, 0x42, 0x46, 0x55, 0x35, 0x39, 0x49, 0x38, 0x39, 0x4a,
+ 0x37, 0x37, 0x42, 0x35, 0x34, 0x3c, 0x38, 0x38, 0x41, 0x34, 0x37, 0x42,
+ 0x2a, 0x32, 0x42, 0x25, 0x30, 0x42, 0x1e, 0x28, 0x3a, 0x16, 0x21, 0x32,
+ 0x16, 0x23, 0x2d, 0x1a, 0x2a, 0x31, 0x19, 0x30, 0x36, 0x18, 0x32, 0x3f,
+ 0x1c, 0x37, 0x51, 0x1b, 0x37, 0x5a, 0x19, 0x39, 0x5e, 0x1b, 0x3e, 0x60,
+ 0x1f, 0x3d, 0x59, 0x24, 0x38, 0x55, 0x20, 0x38, 0x54, 0x0c, 0x2e, 0x41,
+ 0x12, 0x29, 0x33, 0x1c, 0x25, 0x2c, 0x13, 0x26, 0x41, 0x0d, 0x3d, 0x72,
+ 0x19, 0x5c, 0x9f, 0x24, 0x69, 0xaf, 0x23, 0x6a, 0xaf, 0x24, 0x6e, 0xaf,
+ 0x20, 0x6e, 0xb0, 0x26, 0x6d, 0xb2, 0x23, 0x53, 0x89, 0x0e, 0x24, 0x43,
+ 0x08, 0x15, 0x25, 0x0c, 0x19, 0x29, 0x0b, 0x17, 0x27, 0x0c, 0x16, 0x24,
+ 0x0a, 0x13, 0x21, 0x0b, 0x13, 0x20, 0x0b, 0x11, 0x1d, 0x0a, 0x10, 0x1c,
+ 0x08, 0x0f, 0x18, 0x0a, 0x0d, 0x10, 0x0c, 0x0e, 0x0b, 0x07, 0x0d, 0x0e,
+ 0x0b, 0x19, 0x24, 0x15, 0x2d, 0x45, 0x10, 0x31, 0x52, 0x0b, 0x2f, 0x55,
+ 0x13, 0x31, 0x58, 0x17, 0x35, 0x5b, 0x11, 0x32, 0x56, 0x10, 0x32, 0x55,
+ 0x13, 0x36, 0x59, 0x16, 0x3c, 0x60, 0x16, 0x40, 0x63, 0x13, 0x3e, 0x5f,
+ 0x15, 0x3a, 0x56, 0x1b, 0x3d, 0x5f, 0x1c, 0x39, 0x5b, 0x1b, 0x2c, 0x41,
+ 0x0e, 0x17, 0x1d, 0x06, 0x15, 0x1b, 0x20, 0x41, 0x5e, 0x23, 0x51, 0x87,
+ 0x14, 0x41, 0x7a, 0x13, 0x34, 0x63, 0x12, 0x23, 0x43, 0x0d, 0x13, 0x24,
+ 0x0c, 0x0f, 0x16, 0x0b, 0x0e, 0x0f, 0x0e, 0x0f, 0x0d, 0x0d, 0x0e, 0x08,
+ 0x0a, 0x0e, 0x0b, 0x13, 0x14, 0x17, 0x2c, 0x27, 0x30, 0x35, 0x2b, 0x33,
+ 0x38, 0x2d, 0x2b, 0x31, 0x26, 0x20, 0x31, 0x24, 0x21, 0x2e, 0x22, 0x25,
+ 0x32, 0x2b, 0x2f, 0x30, 0x28, 0x2c, 0x2c, 0x23, 0x28, 0x23, 0x1b, 0x1c,
+ 0x1f, 0x1a, 0x17, 0x20, 0x1c, 0x19, 0x1d, 0x1c, 0x1b, 0x21, 0x20, 0x22,
+ 0x2d, 0x22, 0x23, 0x3d, 0x33, 0x34, 0x39, 0x31, 0x34, 0x32, 0x2b, 0x2b,
+ 0x29, 0x24, 0x21, 0x22, 0x1d, 0x17, 0x20, 0x1b, 0x17, 0x1b, 0x14, 0x11,
+ 0x0f, 0x0e, 0x0a, 0x0a, 0x09, 0x0a, 0x0a, 0x0b, 0x10, 0x0c, 0x0d, 0x0e,
+ 0x0b, 0x0d, 0x08, 0x0b, 0x0d, 0x05, 0x0b, 0x0a, 0x08, 0x0f, 0x0d, 0x11,
+ 0x0e, 0x0e, 0x0d, 0x0d, 0x0f, 0x0e, 0x0d, 0x0f, 0x10, 0x10, 0x10, 0x12,
+ 0x10, 0x0f, 0x0d, 0x10, 0x0f, 0x0b, 0x18, 0x19, 0x14, 0x3e, 0x46, 0x3f,
+ 0x51, 0x60, 0x62, 0x50, 0x5f, 0x65, 0x4e, 0x5e, 0x64, 0x4d, 0x60, 0x67,
+ 0x4e, 0x61, 0x6c, 0x4b, 0x5c, 0x6a, 0x48, 0x56, 0x66, 0x22, 0x2a, 0x3c,
+ 0x0d, 0x11, 0x15, 0x0b, 0x0f, 0x10, 0x0d, 0x10, 0x11, 0x0e, 0x0f, 0x0f,
+ 0x11, 0x12, 0x14, 0x11, 0x11, 0x13, 0x0c, 0x0b, 0x10, 0x0b, 0x0a, 0x10,
+ 0x0a, 0x0b, 0x0d, 0x0d, 0x0e, 0x10, 0x10, 0x11, 0x12, 0x21, 0x22, 0x23,
+ 0x3d, 0x40, 0x3f, 0x47, 0x4a, 0x49, 0x4f, 0x51, 0x50, 0x58, 0x5a, 0x59,
+ 0x63, 0x68, 0x64, 0x6b, 0x71, 0x71, 0x73, 0x77, 0x7b, 0x77, 0x77, 0x7b,
+ 0x85, 0x83, 0x81, 0x85, 0x82, 0x80, 0x89, 0x85, 0x88, 0x8e, 0x8c, 0x95,
+ 0x84, 0x8c, 0x91, 0x7e, 0x84, 0x8b, 0x7d, 0x7d, 0x8b, 0x80, 0x7e, 0x90,
+ 0x6d, 0x6c, 0x80, 0x63, 0x63, 0x74, 0x73, 0x72, 0x7e, 0x61, 0x5e, 0x65,
+ 0x55, 0x49, 0x49, 0x56, 0x44, 0x44, 0x50, 0x3a, 0x3b, 0x43, 0x30, 0x30,
+ 0x36, 0x2c, 0x2a, 0x1c, 0x1b, 0x19, 0x13, 0x13, 0x13, 0x1c, 0x19, 0x1b,
+ 0x1e, 0x24, 0x1c, 0x26, 0x2a, 0x1e, 0x2c, 0x30, 0x22, 0x32, 0x3c, 0x29,
+ 0x39, 0x49, 0x30, 0x41, 0x54, 0x32, 0x4b, 0x5c, 0x31, 0x59, 0x65, 0x37,
+ 0x5c, 0x6c, 0x45, 0x64, 0x73, 0x4c, 0x69, 0x79, 0x4d, 0x6e, 0x7f, 0x4f,
+ 0x72, 0x85, 0x52, 0x76, 0x8a, 0x59, 0x79, 0x8e, 0x60, 0x7d, 0x94, 0x65,
+ 0x81, 0x91, 0x6b, 0x7f, 0x8d, 0x68, 0x7e, 0x8b, 0x68, 0x78, 0x85, 0x6d,
+ 0x68, 0x78, 0x6d, 0x54, 0x66, 0x69, 0x44, 0x57, 0x66, 0x35, 0x48, 0x5d,
+ 0x26, 0x3a, 0x53, 0x1e, 0x2d, 0x3c, 0x1a, 0x20, 0x24, 0x20, 0x1d, 0x1e,
+ 0x2a, 0x21, 0x23, 0x35, 0x23, 0x22, 0x4c, 0x31, 0x26, 0x69, 0x4a, 0x35,
+ 0x76, 0x58, 0x45, 0xa0, 0x99, 0x8e, 0xe6, 0xf1, 0xf2, 0xec, 0xf7, 0xff,
+ 0xec, 0xf4, 0xfb, 0xed, 0xf5, 0xf7, 0xed, 0xf4, 0xf6, 0xed, 0xf2, 0xf6,
+ 0x10, 0x10, 0x10, 0x2e, 0x2d, 0x26, 0x5f, 0x5e, 0x4c, 0x61, 0x5f, 0x4d,
+ 0x34, 0x30, 0x27, 0x11, 0x0e, 0x0c, 0x09, 0x08, 0x06, 0x0a, 0x0b, 0x06,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x09, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x10, 0x0f, 0x10, 0x13, 0x12, 0x13, 0x15, 0x14, 0x13, 0x17, 0x16,
+ 0x11, 0x15, 0x15, 0x0d, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x13, 0x13, 0x12,
+ 0x16, 0x17, 0x12, 0x1a, 0x1b, 0x16, 0x22, 0x23, 0x1e, 0x23, 0x25, 0x21,
+ 0x1e, 0x21, 0x1f, 0x16, 0x17, 0x0e, 0x13, 0x13, 0x01, 0x2b, 0x28, 0x13,
+ 0x21, 0x1e, 0x0f, 0x18, 0x15, 0x0c, 0x1b, 0x1a, 0x17, 0x1f, 0x20, 0x1d,
+ 0x21, 0x22, 0x1e, 0x1f, 0x1f, 0x21, 0x1b, 0x1c, 0x1a, 0x19, 0x1c, 0x0f,
+ 0x15, 0x18, 0x08, 0x0f, 0x10, 0x0a, 0x15, 0x14, 0x15, 0x1a, 0x1b, 0x19,
+ 0x16, 0x19, 0x18, 0x12, 0x12, 0x12, 0x0f, 0x0e, 0x0b, 0x11, 0x0e, 0x05,
+ 0x23, 0x20, 0x10, 0x21, 0x1e, 0x11, 0x1a, 0x15, 0x0f, 0x17, 0x13, 0x15,
+ 0x1d, 0x1c, 0x1a, 0x24, 0x20, 0x1f, 0x29, 0x20, 0x21, 0x29, 0x21, 0x1f,
+ 0x28, 0x20, 0x1e, 0x2a, 0x22, 0x20, 0x2c, 0x23, 0x21, 0x2d, 0x21, 0x21,
+ 0x29, 0x20, 0x18, 0x31, 0x29, 0x22, 0x37, 0x32, 0x2c, 0x64, 0x61, 0x5b,
+ 0x62, 0x61, 0x5c, 0x7e, 0x7d, 0x78, 0x57, 0x54, 0x4e, 0x29, 0x26, 0x20,
+ 0x29, 0x27, 0x26, 0x3d, 0x3d, 0x3c, 0x53, 0x53, 0x52, 0x28, 0x2a, 0x29,
+ 0x24, 0x28, 0x28, 0x29, 0x2d, 0x2f, 0x25, 0x2a, 0x2b, 0x19, 0x1e, 0x21,
+ 0x12, 0x1a, 0x25, 0x0b, 0x17, 0x23, 0x09, 0x17, 0x22, 0x0d, 0x1b, 0x25,
+ 0x10, 0x1c, 0x26, 0x0e, 0x1a, 0x26, 0x0e, 0x1b, 0x2b, 0x0c, 0x1b, 0x2e,
+ 0x0b, 0x1b, 0x2b, 0x0d, 0x1c, 0x2b, 0x0d, 0x1b, 0x2a, 0x0d, 0x1b, 0x29,
+ 0x0e, 0x1b, 0x29, 0x10, 0x1b, 0x28, 0x11, 0x1d, 0x29, 0x19, 0x24, 0x2f,
+ 0x34, 0x35, 0x41, 0x30, 0x2e, 0x39, 0x32, 0x2f, 0x36, 0x3b, 0x36, 0x3a,
+ 0x41, 0x38, 0x3d, 0x37, 0x2d, 0x32, 0x39, 0x2d, 0x33, 0x3d, 0x30, 0x36,
+ 0x3d, 0x30, 0x36, 0x3d, 0x31, 0x34, 0x3e, 0x32, 0x36, 0x3f, 0x35, 0x3a,
+ 0x3c, 0x37, 0x3f, 0x39, 0x36, 0x3f, 0x35, 0x32, 0x39, 0x2b, 0x28, 0x2f,
+ 0x28, 0x28, 0x34, 0x22, 0x29, 0x32, 0x1c, 0x2c, 0x36, 0x18, 0x30, 0x40,
+ 0x1a, 0x36, 0x4f, 0x1c, 0x39, 0x59, 0x1c, 0x3b, 0x5a, 0x1b, 0x3d, 0x59,
+ 0x1c, 0x3f, 0x5e, 0x20, 0x3c, 0x5f, 0x20, 0x36, 0x53, 0x14, 0x2a, 0x38,
+ 0x16, 0x29, 0x2f, 0x16, 0x2a, 0x3f, 0x1c, 0x42, 0x6e, 0x1b, 0x5a, 0x97,
+ 0x1c, 0x67, 0xab, 0x2b, 0x6c, 0xb5, 0x28, 0x68, 0xaf, 0x25, 0x71, 0xab,
+ 0x2a, 0x75, 0xae, 0x19, 0x4e, 0x88, 0x06, 0x23, 0x4a, 0x07, 0x19, 0x27,
+ 0x0a, 0x17, 0x26, 0x0b, 0x19, 0x26, 0x0b, 0x17, 0x24, 0x0a, 0x15, 0x21,
+ 0x0b, 0x13, 0x1e, 0x0b, 0x12, 0x1d, 0x09, 0x10, 0x1a, 0x09, 0x10, 0x1a,
+ 0x0a, 0x0d, 0x12, 0x09, 0x0c, 0x0f, 0x07, 0x0e, 0x0f, 0x0d, 0x19, 0x22,
+ 0x1a, 0x2d, 0x41, 0x17, 0x31, 0x50, 0x12, 0x2f, 0x54, 0x0f, 0x2a, 0x51,
+ 0x0d, 0x29, 0x4e, 0x13, 0x2d, 0x50, 0x0f, 0x29, 0x4a, 0x0d, 0x2a, 0x48,
+ 0x11, 0x30, 0x4d, 0x15, 0x38, 0x55, 0x1b, 0x42, 0x63, 0x1b, 0x43, 0x66,
+ 0x1d, 0x40, 0x62, 0x1c, 0x3d, 0x5b, 0x14, 0x30, 0x48, 0x0c, 0x1f, 0x30,
+ 0x07, 0x18, 0x25, 0x1a, 0x30, 0x45, 0x2c, 0x51, 0x73, 0x26, 0x55, 0x83,
+ 0x1c, 0x47, 0x77, 0x12, 0x31, 0x5a, 0x0d, 0x1d, 0x38, 0x0d, 0x14, 0x22,
+ 0x0a, 0x0f, 0x15, 0x0b, 0x0f, 0x11, 0x0b, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f,
+ 0x22, 0x20, 0x23, 0x31, 0x2c, 0x30, 0x3b, 0x34, 0x39, 0x38, 0x2d, 0x2e,
+ 0x33, 0x27, 0x26, 0x33, 0x27, 0x27, 0x33, 0x27, 0x2d, 0x31, 0x25, 0x2f,
+ 0x2f, 0x29, 0x2d, 0x29, 0x22, 0x27, 0x20, 0x17, 0x1c, 0x20, 0x17, 0x1a,
+ 0x1f, 0x19, 0x19, 0x1f, 0x1b, 0x19, 0x1c, 0x1b, 0x1c, 0x1d, 0x1b, 0x20,
+ 0x1f, 0x19, 0x1e, 0x33, 0x2c, 0x33, 0x2c, 0x27, 0x2d, 0x2d, 0x28, 0x2c,
+ 0x2e, 0x28, 0x28, 0x29, 0x21, 0x1f, 0x2c, 0x22, 0x23, 0x2d, 0x22, 0x26,
+ 0x23, 0x1f, 0x1e, 0x16, 0x12, 0x13, 0x0c, 0x0a, 0x0d, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0c, 0x09, 0x0c, 0x0e, 0x08, 0x0d, 0x0d, 0x0b, 0x0e, 0x0d, 0x0f,
+ 0x0e, 0x0e, 0x0c, 0x0d, 0x0f, 0x0e, 0x0d, 0x0f, 0x10, 0x0c, 0x0c, 0x0d,
+ 0x0f, 0x0e, 0x0c, 0x11, 0x10, 0x0c, 0x21, 0x22, 0x1f, 0x45, 0x4c, 0x49,
+ 0x53, 0x5e, 0x62, 0x54, 0x5f, 0x66, 0x52, 0x5f, 0x67, 0x50, 0x61, 0x69,
+ 0x4c, 0x60, 0x69, 0x47, 0x5b, 0x66, 0x40, 0x50, 0x5d, 0x17, 0x22, 0x2f,
+ 0x0b, 0x0f, 0x13, 0x0c, 0x10, 0x11, 0x0c, 0x0e, 0x10, 0x14, 0x16, 0x15,
+ 0x28, 0x2a, 0x2a, 0x1b, 0x1c, 0x1e, 0x0f, 0x0f, 0x11, 0x0c, 0x0b, 0x10,
+ 0x0f, 0x10, 0x12, 0x1c, 0x1e, 0x1d, 0x2b, 0x2e, 0x2c, 0x3e, 0x43, 0x3f,
+ 0x5b, 0x60, 0x5c, 0x6f, 0x74, 0x6e, 0x7a, 0x7d, 0x77, 0x81, 0x83, 0x7e,
+ 0x83, 0x85, 0x83, 0x81, 0x86, 0x81, 0x80, 0x86, 0x7f, 0x82, 0x8a, 0x84,
+ 0x8b, 0x92, 0x90, 0x80, 0x88, 0x86, 0x89, 0x90, 0x8b, 0x93, 0x9c, 0x92,
+ 0x9b, 0xa2, 0xa3, 0x9f, 0xa4, 0xa3, 0x95, 0x99, 0x96, 0x90, 0x95, 0x96,
+ 0x88, 0x90, 0x94, 0x89, 0x91, 0x97, 0x8a, 0x8c, 0x92, 0x8a, 0x88, 0x8e,
+ 0x82, 0x7f, 0x89, 0x79, 0x74, 0x7c, 0x6f, 0x62, 0x64, 0x5a, 0x49, 0x47,
+ 0x4f, 0x3d, 0x39, 0x39, 0x2c, 0x2b, 0x21, 0x1a, 0x1d, 0x16, 0x15, 0x1a,
+ 0x16, 0x1d, 0x17, 0x1d, 0x20, 0x19, 0x21, 0x24, 0x1d, 0x24, 0x2a, 0x20,
+ 0x2c, 0x38, 0x2a, 0x36, 0x43, 0x30, 0x42, 0x4c, 0x32, 0x4d, 0x54, 0x37,
+ 0x55, 0x61, 0x3c, 0x5e, 0x6c, 0x42, 0x66, 0x73, 0x46, 0x6b, 0x79, 0x48,
+ 0x71, 0x80, 0x4d, 0x78, 0x87, 0x56, 0x7b, 0x8b, 0x5c, 0x7f, 0x8f, 0x62,
+ 0x85, 0x95, 0x6c, 0x80, 0x8e, 0x68, 0x79, 0x88, 0x65, 0x6f, 0x81, 0x67,
+ 0x5c, 0x73, 0x67, 0x46, 0x5f, 0x61, 0x34, 0x4e, 0x5a, 0x28, 0x41, 0x51,
+ 0x21, 0x30, 0x3f, 0x1a, 0x26, 0x2e, 0x1b, 0x23, 0x23, 0x25, 0x24, 0x1c,
+ 0x36, 0x25, 0x1c, 0x50, 0x34, 0x27, 0x6d, 0x4a, 0x39, 0x82, 0x5e, 0x4c,
+ 0x77, 0x61, 0x54, 0xbb, 0xbb, 0xb3, 0xe3, 0xf2, 0xf3, 0xe5, 0xef, 0xf6,
+ 0xee, 0xf3, 0xfa, 0xee, 0xf5, 0xf8, 0xee, 0xf6, 0xf8, 0xee, 0xf4, 0xf9,
+ 0x3f, 0x3c, 0x35, 0x68, 0x67, 0x54, 0x55, 0x58, 0x3b, 0x24, 0x26, 0x12,
+ 0x0d, 0x0b, 0x0a, 0x0b, 0x08, 0x10, 0x0c, 0x0a, 0x0d, 0x0b, 0x0b, 0x04,
+ 0x09, 0x09, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0d, 0x0c, 0x0f, 0x10, 0x0f, 0x0f, 0x11, 0x10, 0x10, 0x13, 0x12,
+ 0x0f, 0x11, 0x11, 0x0e, 0x10, 0x0f, 0x0f, 0x10, 0x0e, 0x13, 0x13, 0x11,
+ 0x15, 0x16, 0x10, 0x1a, 0x1b, 0x16, 0x20, 0x21, 0x1c, 0x22, 0x23, 0x1e,
+ 0x1c, 0x1e, 0x1f, 0x13, 0x14, 0x11, 0x0b, 0x0b, 0x03, 0x1b, 0x19, 0x0f,
+ 0x1d, 0x1a, 0x13, 0x16, 0x13, 0x10, 0x16, 0x16, 0x14, 0x1c, 0x1c, 0x19,
+ 0x1e, 0x1b, 0x15, 0x19, 0x17, 0x18, 0x1a, 0x1c, 0x1c, 0x18, 0x20, 0x13,
+ 0x13, 0x1a, 0x0c, 0x0f, 0x12, 0x0b, 0x18, 0x16, 0x15, 0x20, 0x1d, 0x18,
+ 0x1a, 0x1f, 0x18, 0x1a, 0x1d, 0x1a, 0x16, 0x14, 0x17, 0x16, 0x11, 0x15,
+ 0x19, 0x13, 0x12, 0x1d, 0x18, 0x14, 0x2d, 0x27, 0x23, 0x29, 0x24, 0x20,
+ 0x28, 0x27, 0x22, 0x28, 0x25, 0x21, 0x2d, 0x25, 0x24, 0x2e, 0x26, 0x24,
+ 0x27, 0x1f, 0x1d, 0x24, 0x1e, 0x1e, 0x28, 0x1f, 0x20, 0x31, 0x27, 0x28,
+ 0x2f, 0x25, 0x23, 0x2d, 0x25, 0x22, 0x33, 0x2e, 0x2a, 0x3d, 0x3a, 0x33,
+ 0x37, 0x34, 0x2c, 0x51, 0x4f, 0x44, 0x30, 0x2c, 0x20, 0x30, 0x2c, 0x22,
+ 0x55, 0x54, 0x57, 0x6d, 0x6c, 0x70, 0x51, 0x51, 0x56, 0x48, 0x48, 0x4f,
+ 0x31, 0x32, 0x39, 0x20, 0x23, 0x29, 0x29, 0x2d, 0x32, 0x24, 0x29, 0x2f,
+ 0x1b, 0x22, 0x2a, 0x0e, 0x17, 0x21, 0x0a, 0x16, 0x1f, 0x0b, 0x18, 0x21,
+ 0x0b, 0x18, 0x21, 0x0b, 0x18, 0x21, 0x0c, 0x1a, 0x26, 0x0c, 0x1b, 0x2b,
+ 0x09, 0x1b, 0x29, 0x0c, 0x1d, 0x2a, 0x0b, 0x1b, 0x28, 0x0b, 0x1a, 0x23,
+ 0x0f, 0x1a, 0x23, 0x19, 0x1f, 0x27, 0x21, 0x24, 0x2c, 0x2d, 0x2d, 0x35,
+ 0x45, 0x3a, 0x3e, 0x43, 0x37, 0x3a, 0x45, 0x38, 0x39, 0x46, 0x38, 0x38,
+ 0x3e, 0x2f, 0x2f, 0x3e, 0x2e, 0x2f, 0x3d, 0x2d, 0x2d, 0x38, 0x2a, 0x2c,
+ 0x37, 0x28, 0x2f, 0x3a, 0x29, 0x2f, 0x40, 0x2d, 0x32, 0x41, 0x31, 0x34,
+ 0x3f, 0x33, 0x37, 0x3e, 0x34, 0x38, 0x3e, 0x33, 0x35, 0x36, 0x28, 0x29,
+ 0x38, 0x2a, 0x33, 0x30, 0x2b, 0x31, 0x26, 0x2d, 0x34, 0x1e, 0x30, 0x3d,
+ 0x1e, 0x34, 0x4d, 0x1b, 0x37, 0x56, 0x1c, 0x3b, 0x5b, 0x1a, 0x3c, 0x5b,
+ 0x19, 0x3e, 0x5c, 0x1e, 0x3d, 0x63, 0x1d, 0x35, 0x57, 0x19, 0x2b, 0x3f,
+ 0x16, 0x2f, 0x42, 0x1d, 0x46, 0x70, 0x26, 0x62, 0xa0, 0x24, 0x6b, 0xab,
+ 0x24, 0x6b, 0xad, 0x27, 0x6a, 0xb4, 0x2a, 0x6d, 0xb3, 0x2c, 0x70, 0xa3,
+ 0x1e, 0x53, 0x79, 0x03, 0x1f, 0x3f, 0x07, 0x15, 0x2a, 0x0a, 0x19, 0x21,
+ 0x0a, 0x18, 0x25, 0x0a, 0x16, 0x24, 0x0a, 0x16, 0x22, 0x0a, 0x15, 0x1f,
+ 0x0a, 0x13, 0x1c, 0x0a, 0x11, 0x1a, 0x08, 0x0f, 0x17, 0x08, 0x0f, 0x16,
+ 0x0c, 0x0e, 0x10, 0x07, 0x0b, 0x0d, 0x03, 0x0e, 0x16, 0x13, 0x23, 0x34,
+ 0x24, 0x3e, 0x58, 0x1d, 0x3a, 0x5d, 0x16, 0x30, 0x58, 0x17, 0x2f, 0x58,
+ 0x10, 0x2c, 0x53, 0x0e, 0x29, 0x4c, 0x0d, 0x24, 0x44, 0x0a, 0x21, 0x3e,
+ 0x0f, 0x27, 0x41, 0x14, 0x30, 0x4b, 0x1a, 0x3d, 0x57, 0x22, 0x45, 0x62,
+ 0x1f, 0x40, 0x63, 0x13, 0x2f, 0x47, 0x07, 0x1e, 0x2d, 0x08, 0x1e, 0x2b,
+ 0x12, 0x2c, 0x42, 0x22, 0x44, 0x64, 0x25, 0x4d, 0x73, 0x21, 0x4d, 0x72,
+ 0x1c, 0x41, 0x63, 0x0b, 0x27, 0x42, 0x0a, 0x17, 0x2a, 0x0c, 0x11, 0x1c,
+ 0x0c, 0x11, 0x16, 0x0d, 0x10, 0x14, 0x0b, 0x0d, 0x11, 0x1c, 0x1b, 0x21,
+ 0x38, 0x2d, 0x37, 0x3b, 0x2e, 0x33, 0x3a, 0x2f, 0x2d, 0x34, 0x29, 0x25,
+ 0x35, 0x29, 0x2b, 0x39, 0x2e, 0x35, 0x34, 0x2b, 0x36, 0x24, 0x1c, 0x26,
+ 0x21, 0x1d, 0x1e, 0x28, 0x23, 0x25, 0x33, 0x2d, 0x2f, 0x3f, 0x39, 0x3b,
+ 0x46, 0x40, 0x40, 0x4d, 0x49, 0x48, 0x4d, 0x48, 0x4c, 0x42, 0x3d, 0x45,
+ 0x34, 0x32, 0x37, 0x2f, 0x2e, 0x34, 0x28, 0x25, 0x2d, 0x24, 0x21, 0x28,
+ 0x2f, 0x28, 0x2f, 0x39, 0x30, 0x35, 0x35, 0x2a, 0x32, 0x30, 0x23, 0x2d,
+ 0x2c, 0x23, 0x28, 0x28, 0x22, 0x24, 0x1a, 0x16, 0x13, 0x0f, 0x0e, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0e, 0x0d, 0x0f, 0x11, 0x0d,
+ 0x0f, 0x10, 0x0b, 0x0d, 0x0f, 0x0e, 0x0e, 0x10, 0x10, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0e, 0x0c, 0x0f, 0x0e, 0x0c, 0x2c, 0x2e, 0x2d, 0x4f, 0x55, 0x56,
+ 0x55, 0x5e, 0x66, 0x55, 0x5e, 0x67, 0x55, 0x5f, 0x69, 0x4f, 0x5d, 0x66,
+ 0x4a, 0x5b, 0x65, 0x44, 0x56, 0x60, 0x39, 0x48, 0x53, 0x12, 0x1c, 0x25,
+ 0x0e, 0x0f, 0x13, 0x0c, 0x0e, 0x0f, 0x0b, 0x0d, 0x0d, 0x14, 0x16, 0x15,
+ 0x34, 0x36, 0x35, 0x24, 0x26, 0x25, 0x13, 0x14, 0x13, 0x18, 0x1a, 0x19,
+ 0x2e, 0x30, 0x2d, 0x49, 0x4b, 0x45, 0x5c, 0x5f, 0x58, 0x6b, 0x6e, 0x65,
+ 0x76, 0x79, 0x6e, 0x80, 0x83, 0x78, 0x89, 0x8b, 0x80, 0x94, 0x95, 0x8b,
+ 0x97, 0x94, 0x90, 0x8f, 0x90, 0x8b, 0x86, 0x8b, 0x83, 0x91, 0x94, 0x8b,
+ 0x9a, 0x98, 0x91, 0x8c, 0x8f, 0x8f, 0x77, 0x8c, 0x94, 0x68, 0x8c, 0x9b,
+ 0x72, 0x91, 0xa5, 0x86, 0x97, 0xa3, 0x97, 0x9f, 0x9e, 0x92, 0x97, 0x91,
+ 0x91, 0x96, 0x91, 0x9b, 0x9e, 0x9e, 0x95, 0x93, 0x95, 0x9a, 0x92, 0x94,
+ 0x98, 0x94, 0xa1, 0x95, 0x94, 0x9b, 0x91, 0x90, 0x90, 0x8a, 0x81, 0x7f,
+ 0x81, 0x6f, 0x6f, 0x60, 0x4d, 0x51, 0x3e, 0x35, 0x3b, 0x21, 0x22, 0x27,
+ 0x14, 0x18, 0x19, 0x16, 0x16, 0x18, 0x1a, 0x1c, 0x1b, 0x1d, 0x21, 0x20,
+ 0x21, 0x2a, 0x24, 0x28, 0x32, 0x24, 0x34, 0x3d, 0x2a, 0x3f, 0x48, 0x31,
+ 0x46, 0x55, 0x36, 0x51, 0x60, 0x3f, 0x5a, 0x68, 0x43, 0x63, 0x72, 0x49,
+ 0x6b, 0x7a, 0x4f, 0x72, 0x81, 0x55, 0x76, 0x85, 0x5a, 0x7c, 0x8b, 0x61,
+ 0x88, 0x93, 0x68, 0x84, 0x8f, 0x65, 0x79, 0x87, 0x64, 0x68, 0x7a, 0x63,
+ 0x54, 0x6c, 0x62, 0x45, 0x5d, 0x5f, 0x32, 0x4a, 0x50, 0x24, 0x37, 0x41,
+ 0x21, 0x26, 0x2f, 0x1c, 0x22, 0x28, 0x24, 0x28, 0x27, 0x36, 0x2e, 0x22,
+ 0x4d, 0x33, 0x23, 0x6d, 0x48, 0x38, 0x8a, 0x64, 0x59, 0x90, 0x6f, 0x6b,
+ 0x84, 0x78, 0x73, 0xc9, 0xd1, 0xcd, 0xde, 0xed, 0xef, 0xe5, 0xee, 0xf5,
+ 0xf2, 0xf5, 0xfa, 0xf0, 0xf6, 0xf8, 0xed, 0xf5, 0xf9, 0xec, 0xf1, 0xfa,
+ 0x66, 0x64, 0x4f, 0x49, 0x48, 0x36, 0x1c, 0x1d, 0x11, 0x0a, 0x0c, 0x04,
+ 0x07, 0x0a, 0x05, 0x09, 0x0b, 0x08, 0x0e, 0x0d, 0x10, 0x0a, 0x08, 0x0d,
+ 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0c, 0x0d, 0x0c, 0x0e, 0x10, 0x0f, 0x0f, 0x10, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x0e, 0x11, 0x12, 0x0d,
+ 0x13, 0x14, 0x0f, 0x19, 0x1a, 0x15, 0x21, 0x22, 0x1d, 0x21, 0x22, 0x1e,
+ 0x1f, 0x20, 0x22, 0x17, 0x18, 0x18, 0x0b, 0x0b, 0x09, 0x0d, 0x0d, 0x0a,
+ 0x17, 0x16, 0x14, 0x14, 0x13, 0x11, 0x14, 0x14, 0x12, 0x15, 0x16, 0x12,
+ 0x19, 0x19, 0x11, 0x18, 0x16, 0x18, 0x1f, 0x1c, 0x21, 0x21, 0x20, 0x1e,
+ 0x1b, 0x1a, 0x15, 0x14, 0x12, 0x12, 0x17, 0x15, 0x14, 0x1d, 0x1e, 0x16,
+ 0x19, 0x1e, 0x18, 0x1a, 0x1d, 0x1a, 0x1a, 0x19, 0x1b, 0x19, 0x15, 0x19,
+ 0x1f, 0x19, 0x1a, 0x28, 0x22, 0x22, 0x2d, 0x28, 0x25, 0x28, 0x23, 0x1e,
+ 0x29, 0x27, 0x25, 0x27, 0x21, 0x21, 0x29, 0x20, 0x21, 0x26, 0x1d, 0x1e,
+ 0x21, 0x1b, 0x1b, 0x22, 0x1d, 0x1a, 0x3a, 0x34, 0x31, 0x43, 0x3a, 0x38,
+ 0x3c, 0x32, 0x39, 0x32, 0x2b, 0x30, 0x32, 0x2c, 0x30, 0x33, 0x2d, 0x31,
+ 0x30, 0x2a, 0x2c, 0x31, 0x2a, 0x2a, 0x36, 0x2d, 0x2e, 0x3d, 0x35, 0x33,
+ 0x86, 0x86, 0x81, 0x6d, 0x6d, 0x69, 0x40, 0x40, 0x40, 0x57, 0x57, 0x5a,
+ 0x45, 0x46, 0x4a, 0x22, 0x23, 0x28, 0x2c, 0x2f, 0x31, 0x2e, 0x32, 0x34,
+ 0x1e, 0x22, 0x26, 0x0e, 0x15, 0x1e, 0x10, 0x1a, 0x23, 0x0a, 0x17, 0x1f,
+ 0x0a, 0x17, 0x1f, 0x0b, 0x18, 0x20, 0x0d, 0x1b, 0x25, 0x0a, 0x1a, 0x27,
+ 0x08, 0x18, 0x27, 0x0e, 0x1c, 0x29, 0x0e, 0x1b, 0x26, 0x13, 0x1b, 0x25,
+ 0x1e, 0x21, 0x2a, 0x2c, 0x29, 0x2f, 0x36, 0x2d, 0x34, 0x41, 0x34, 0x3c,
+ 0x44, 0x39, 0x3e, 0x4a, 0x3e, 0x42, 0x48, 0x3c, 0x3f, 0x36, 0x2a, 0x2c,
+ 0x2f, 0x25, 0x26, 0x31, 0x27, 0x28, 0x35, 0x2c, 0x2d, 0x38, 0x31, 0x32,
+ 0x3b, 0x35, 0x3b, 0x48, 0x3f, 0x44, 0x49, 0x3d, 0x40, 0x3e, 0x34, 0x37,
+ 0x35, 0x2f, 0x33, 0x39, 0x31, 0x38, 0x3c, 0x34, 0x39, 0x3c, 0x30, 0x34,
+ 0x45, 0x32, 0x35, 0x46, 0x3a, 0x3a, 0x2f, 0x2b, 0x2c, 0x2d, 0x30, 0x37,
+ 0x2c, 0x35, 0x45, 0x23, 0x35, 0x51, 0x1c, 0x38, 0x5d, 0x1a, 0x3c, 0x64,
+ 0x1d, 0x3d, 0x5a, 0x1f, 0x3d, 0x62, 0x17, 0x34, 0x5c, 0x12, 0x33, 0x55,
+ 0x1f, 0x4b, 0x75, 0x29, 0x65, 0xa3, 0x26, 0x6c, 0xb3, 0x26, 0x70, 0xaf,
+ 0x28, 0x6c, 0xaa, 0x22, 0x6f, 0xb1, 0x27, 0x70, 0xad, 0x1b, 0x49, 0x76,
+ 0x09, 0x1e, 0x32, 0x0d, 0x16, 0x1f, 0x0c, 0x18, 0x22, 0x0a, 0x17, 0x27,
+ 0x0a, 0x17, 0x25, 0x08, 0x14, 0x22, 0x0b, 0x15, 0x21, 0x08, 0x12, 0x1c,
+ 0x0a, 0x12, 0x1d, 0x0b, 0x11, 0x1b, 0x0a, 0x0f, 0x18, 0x0a, 0x0e, 0x17,
+ 0x09, 0x0d, 0x0e, 0x07, 0x0b, 0x0d, 0x06, 0x0e, 0x18, 0x15, 0x24, 0x34,
+ 0x1d, 0x35, 0x4d, 0x26, 0x43, 0x62, 0x27, 0x44, 0x6a, 0x21, 0x3e, 0x68,
+ 0x15, 0x36, 0x62, 0x10, 0x30, 0x57, 0x0f, 0x29, 0x4c, 0x0f, 0x26, 0x44,
+ 0x0e, 0x23, 0x3b, 0x10, 0x27, 0x3f, 0x12, 0x2c, 0x42, 0x19, 0x35, 0x4d,
+ 0x16, 0x32, 0x4e, 0x0b, 0x1f, 0x32, 0x0b, 0x1b, 0x25, 0x0f, 0x23, 0x2f,
+ 0x14, 0x33, 0x4a, 0x1a, 0x43, 0x63, 0x1e, 0x45, 0x68, 0x17, 0x3d, 0x5c,
+ 0x14, 0x2f, 0x46, 0x0a, 0x1d, 0x2f, 0x0d, 0x15, 0x20, 0x0d, 0x10, 0x15,
+ 0x0d, 0x10, 0x13, 0x0c, 0x0e, 0x12, 0x1a, 0x19, 0x1d, 0x2d, 0x28, 0x2d,
+ 0x3c, 0x29, 0x33, 0x3e, 0x2c, 0x2f, 0x3a, 0x2b, 0x27, 0x38, 0x2a, 0x29,
+ 0x3c, 0x2f, 0x36, 0x31, 0x28, 0x30, 0x22, 0x1e, 0x1f, 0x25, 0x24, 0x1f,
+ 0x40, 0x3d, 0x38, 0x59, 0x55, 0x52, 0x64, 0x60, 0x5d, 0x6c, 0x68, 0x65,
+ 0x68, 0x64, 0x60, 0x74, 0x70, 0x6f, 0x78, 0x73, 0x77, 0x74, 0x6f, 0x76,
+ 0x76, 0x76, 0x76, 0x69, 0x69, 0x6d, 0x53, 0x52, 0x58, 0x4c, 0x49, 0x50,
+ 0x3a, 0x35, 0x3c, 0x38, 0x31, 0x39, 0x3f, 0x37, 0x44, 0x3a, 0x2f, 0x3f,
+ 0x2a, 0x1f, 0x2b, 0x2c, 0x23, 0x25, 0x24, 0x1e, 0x18, 0x18, 0x15, 0x10,
+ 0x0e, 0x0c, 0x0f, 0x0b, 0x0a, 0x10, 0x0b, 0x0d, 0x0c, 0x0b, 0x10, 0x09,
+ 0x0e, 0x0f, 0x0a, 0x0d, 0x0f, 0x0c, 0x0c, 0x0e, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0e, 0x0c, 0x12, 0x12, 0x10, 0x31, 0x35, 0x35, 0x51, 0x57, 0x5a,
+ 0x51, 0x5b, 0x65, 0x54, 0x5d, 0x68, 0x51, 0x5c, 0x66, 0x4c, 0x59, 0x62,
+ 0x48, 0x56, 0x5f, 0x44, 0x52, 0x5a, 0x33, 0x3e, 0x46, 0x12, 0x18, 0x20,
+ 0x11, 0x10, 0x16, 0x0e, 0x0e, 0x10, 0x0d, 0x0f, 0x0e, 0x0c, 0x0e, 0x0d,
+ 0x20, 0x22, 0x1f, 0x20, 0x22, 0x1d, 0x26, 0x28, 0x23, 0x3f, 0x41, 0x3c,
+ 0x58, 0x5a, 0x4f, 0x68, 0x6a, 0x5d, 0x74, 0x76, 0x68, 0x82, 0x83, 0x73,
+ 0x8a, 0x8b, 0x79, 0x8d, 0x8e, 0x7c, 0x8d, 0x8e, 0x7c, 0x93, 0x94, 0x82,
+ 0x9c, 0x9d, 0x8b, 0x9b, 0x9c, 0x90, 0x94, 0x96, 0x92, 0x8d, 0x93, 0x91,
+ 0x87, 0x92, 0x95, 0x6c, 0x83, 0x8f, 0x4d, 0x71, 0x93, 0x40, 0x6f, 0x9e,
+ 0x3b, 0x78, 0x9e, 0x5b, 0x84, 0x9e, 0x8d, 0x9d, 0xa6, 0x9b, 0x9f, 0xa1,
+ 0x96, 0x9c, 0xa1, 0x8d, 0x9a, 0xa5, 0x84, 0x96, 0xa4, 0x89, 0x99, 0xa4,
+ 0x9a, 0x9a, 0x9e, 0x98, 0x98, 0x9a, 0x99, 0x9a, 0x9a, 0x9d, 0x99, 0x98,
+ 0x9c, 0x92, 0x95, 0x8d, 0x82, 0x87, 0x70, 0x68, 0x6f, 0x49, 0x46, 0x4d,
+ 0x28, 0x27, 0x2d, 0x17, 0x16, 0x1c, 0x12, 0x13, 0x17, 0x15, 0x19, 0x19,
+ 0x1b, 0x22, 0x18, 0x1e, 0x29, 0x17, 0x28, 0x34, 0x1d, 0x2f, 0x3c, 0x23,
+ 0x3a, 0x45, 0x2f, 0x41, 0x4d, 0x35, 0x4c, 0x59, 0x3b, 0x57, 0x65, 0x40,
+ 0x60, 0x6e, 0x45, 0x6d, 0x79, 0x4d, 0x74, 0x80, 0x54, 0x7a, 0x87, 0x58,
+ 0x82, 0x8a, 0x5d, 0x80, 0x87, 0x5e, 0x75, 0x7e, 0x5f, 0x61, 0x6e, 0x5c,
+ 0x4c, 0x5b, 0x56, 0x3a, 0x49, 0x4d, 0x2c, 0x35, 0x3d, 0x24, 0x29, 0x30,
+ 0x29, 0x26, 0x2d, 0x32, 0x2b, 0x2e, 0x3e, 0x30, 0x2c, 0x4f, 0x38, 0x2f,
+ 0x68, 0x4a, 0x42, 0x88, 0x6b, 0x66, 0xb0, 0x98, 0x9a, 0xb5, 0xa4, 0xac,
+ 0xb1, 0xb1, 0xb4, 0xdb, 0xe7, 0xe9, 0xe1, 0xf1, 0xf4, 0xec, 0xf3, 0xf8,
+ 0xf4, 0xf5, 0xf9, 0xef, 0xf4, 0xf6, 0xea, 0xf3, 0xf8, 0xe8, 0xee, 0xf7,
+ 0x3e, 0x3b, 0x28, 0x18, 0x16, 0x0e, 0x0e, 0x0d, 0x10, 0x0e, 0x0f, 0x13,
+ 0x09, 0x0d, 0x08, 0x0a, 0x0e, 0x05, 0x0b, 0x0c, 0x0a, 0x08, 0x06, 0x0e,
+ 0x07, 0x07, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0d, 0x11, 0x11, 0x0f, 0x18, 0x19, 0x15,
+ 0x19, 0x1a, 0x15, 0x18, 0x19, 0x15, 0x1f, 0x20, 0x1d, 0x23, 0x24, 0x22,
+ 0x25, 0x26, 0x24, 0x1f, 0x21, 0x20, 0x0f, 0x0f, 0x11, 0x0d, 0x0b, 0x0e,
+ 0x12, 0x10, 0x11, 0x11, 0x11, 0x0f, 0x14, 0x15, 0x10, 0x17, 0x1a, 0x14,
+ 0x17, 0x1c, 0x16, 0x1b, 0x1a, 0x1c, 0x2a, 0x21, 0x20, 0x50, 0x44, 0x38,
+ 0x4a, 0x3e, 0x30, 0x1f, 0x17, 0x10, 0x16, 0x15, 0x13, 0x18, 0x1c, 0x17,
+ 0x18, 0x1a, 0x19, 0x1a, 0x1c, 0x19, 0x1e, 0x1d, 0x19, 0x1e, 0x1b, 0x16,
+ 0x28, 0x23, 0x1f, 0x29, 0x24, 0x20, 0x29, 0x24, 0x21, 0x2b, 0x26, 0x23,
+ 0x24, 0x1f, 0x22, 0x20, 0x19, 0x1c, 0x27, 0x1e, 0x20, 0x2d, 0x24, 0x25,
+ 0x44, 0x3f, 0x3c, 0x63, 0x5f, 0x5a, 0x8e, 0x89, 0x83, 0x9b, 0x94, 0x8e,
+ 0x9e, 0x98, 0x9b, 0x95, 0x90, 0x93, 0x7f, 0x79, 0x7c, 0x65, 0x5f, 0x63,
+ 0x4a, 0x44, 0x49, 0x37, 0x2f, 0x37, 0x3f, 0x35, 0x3e, 0x53, 0x49, 0x51,
+ 0x72, 0x72, 0x6c, 0x6d, 0x6e, 0x67, 0x66, 0x65, 0x63, 0x42, 0x40, 0x44,
+ 0x28, 0x27, 0x2d, 0x32, 0x32, 0x38, 0x37, 0x38, 0x3d, 0x1e, 0x20, 0x26,
+ 0x0f, 0x10, 0x12, 0x10, 0x15, 0x1a, 0x16, 0x1f, 0x28, 0x0f, 0x1c, 0x24,
+ 0x0b, 0x18, 0x20, 0x09, 0x16, 0x1e, 0x0d, 0x1a, 0x22, 0x0b, 0x19, 0x25,
+ 0x0e, 0x18, 0x29, 0x12, 0x19, 0x29, 0x17, 0x1b, 0x29, 0x22, 0x22, 0x2e,
+ 0x33, 0x2d, 0x35, 0x3e, 0x33, 0x38, 0x45, 0x33, 0x39, 0x4b, 0x39, 0x3d,
+ 0x3a, 0x30, 0x33, 0x3c, 0x32, 0x35, 0x57, 0x4e, 0x4f, 0x54, 0x4c, 0x4c,
+ 0x6c, 0x66, 0x65, 0x81, 0x7d, 0x7c, 0x7d, 0x7c, 0x79, 0x82, 0x81, 0x7e,
+ 0x93, 0x94, 0x8f, 0xa0, 0x9f, 0x9a, 0x94, 0x91, 0x8c, 0x81, 0x7d, 0x7b,
+ 0x76, 0x74, 0x77, 0x69, 0x67, 0x6b, 0x52, 0x4d, 0x53, 0x43, 0x3a, 0x3f,
+ 0x41, 0x33, 0x3c, 0x44, 0x35, 0x3c, 0x32, 0x23, 0x26, 0x35, 0x29, 0x2b,
+ 0x38, 0x32, 0x37, 0x30, 0x38, 0x46, 0x20, 0x37, 0x52, 0x1a, 0x3d, 0x5f,
+ 0x1b, 0x3e, 0x5d, 0x1e, 0x3f, 0x63, 0x20, 0x42, 0x6e, 0x24, 0x53, 0x84,
+ 0x2c, 0x66, 0xa1, 0x2e, 0x6f, 0xb5, 0x27, 0x6f, 0xb5, 0x1f, 0x6e, 0xae,
+ 0x24, 0x6e, 0xad, 0x26, 0x6f, 0xa3, 0x13, 0x4b, 0x72, 0x07, 0x20, 0x3c,
+ 0x0e, 0x15, 0x23, 0x0f, 0x16, 0x1c, 0x0b, 0x17, 0x23, 0x08, 0x14, 0x2a,
+ 0x0a, 0x16, 0x26, 0x0a, 0x16, 0x26, 0x0a, 0x14, 0x23, 0x0a, 0x12, 0x1f,
+ 0x0b, 0x11, 0x1d, 0x09, 0x10, 0x1a, 0x09, 0x0d, 0x17, 0x08, 0x0c, 0x15,
+ 0x08, 0x0c, 0x10, 0x06, 0x09, 0x0e, 0x0a, 0x0d, 0x14, 0x15, 0x1d, 0x26,
+ 0x13, 0x26, 0x33, 0x19, 0x35, 0x4c, 0x25, 0x49, 0x6b, 0x2c, 0x53, 0x7d,
+ 0x21, 0x4c, 0x79, 0x15, 0x3d, 0x68, 0x0f, 0x30, 0x58, 0x0e, 0x28, 0x4b,
+ 0x0e, 0x25, 0x43, 0x0e, 0x24, 0x3c, 0x0f, 0x25, 0x3c, 0x10, 0x26, 0x3c,
+ 0x0a, 0x21, 0x33, 0x0a, 0x1a, 0x2a, 0x14, 0x1d, 0x2b, 0x16, 0x26, 0x34,
+ 0x0c, 0x29, 0x3a, 0x10, 0x36, 0x4b, 0x17, 0x38, 0x52, 0x13, 0x2c, 0x48,
+ 0x0e, 0x1d, 0x2f, 0x0c, 0x15, 0x22, 0x0f, 0x11, 0x18, 0x10, 0x10, 0x10,
+ 0x0d, 0x0f, 0x0c, 0x14, 0x15, 0x13, 0x2d, 0x27, 0x27, 0x3b, 0x30, 0x32,
+ 0x42, 0x2d, 0x34, 0x40, 0x2c, 0x2f, 0x3d, 0x2b, 0x2b, 0x3d, 0x2f, 0x31,
+ 0x3a, 0x2f, 0x36, 0x26, 0x21, 0x20, 0x35, 0x33, 0x25, 0x5f, 0x62, 0x48,
+ 0x7e, 0x7c, 0x70, 0x7d, 0x7d, 0x73, 0x74, 0x74, 0x6b, 0x73, 0x73, 0x6b,
+ 0x75, 0x75, 0x6d, 0x8a, 0x87, 0x81, 0x7f, 0x7b, 0x7a, 0x83, 0x7f, 0x82,
+ 0x90, 0x8f, 0x89, 0x84, 0x83, 0x7f, 0x85, 0x83, 0x84, 0x7b, 0x79, 0x7c,
+ 0x6c, 0x6b, 0x6f, 0x52, 0x4f, 0x56, 0x44, 0x42, 0x4e, 0x47, 0x44, 0x53,
+ 0x3f, 0x35, 0x43, 0x2d, 0x24, 0x29, 0x2a, 0x22, 0x1f, 0x24, 0x1f, 0x1c,
+ 0x17, 0x13, 0x17, 0x0b, 0x09, 0x0f, 0x0c, 0x0e, 0x0d, 0x0a, 0x0f, 0x08,
+ 0x0d, 0x0d, 0x0a, 0x0e, 0x0e, 0x0c, 0x0c, 0x0e, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0d, 0x0b, 0x10, 0x10, 0x10, 0x36, 0x39, 0x3a, 0x50, 0x57, 0x5b,
+ 0x50, 0x5d, 0x66, 0x4f, 0x5c, 0x65, 0x49, 0x56, 0x5f, 0x45, 0x52, 0x5b,
+ 0x37, 0x45, 0x4c, 0x3f, 0x48, 0x4f, 0x31, 0x33, 0x3a, 0x13, 0x12, 0x1a,
+ 0x0f, 0x0f, 0x12, 0x0e, 0x0e, 0x0f, 0x0c, 0x0d, 0x0c, 0x0d, 0x0f, 0x0c,
+ 0x1b, 0x1d, 0x18, 0x2c, 0x2f, 0x28, 0x44, 0x47, 0x3e, 0x60, 0x63, 0x57,
+ 0x73, 0x74, 0x64, 0x81, 0x82, 0x70, 0x87, 0x86, 0x73, 0x8c, 0x8b, 0x76,
+ 0x93, 0x91, 0x7b, 0x94, 0x93, 0x7e, 0x94, 0x94, 0x80, 0x95, 0x94, 0x80,
+ 0x98, 0x99, 0x7f, 0x9b, 0x9d, 0x89, 0x96, 0x9f, 0x98, 0x6f, 0x89, 0x91,
+ 0x4e, 0x77, 0x8d, 0x41, 0x72, 0x8e, 0x52, 0x7d, 0x9b, 0x50, 0x76, 0x95,
+ 0x38, 0x75, 0x99, 0x60, 0x8d, 0xa3, 0x8c, 0xa0, 0xa7, 0x92, 0xa0, 0xa5,
+ 0x70, 0x8c, 0x9b, 0x4e, 0x7a, 0x95, 0x4f, 0x82, 0xa2, 0x51, 0x82, 0x9d,
+ 0x75, 0x8e, 0x98, 0x90, 0x9d, 0xa4, 0x9c, 0x9e, 0xa1, 0x9f, 0x9b, 0x98,
+ 0xa2, 0x9c, 0x96, 0xa0, 0x9c, 0x97, 0x98, 0x92, 0x92, 0x83, 0x7a, 0x7f,
+ 0x60, 0x5b, 0x61, 0x3d, 0x3a, 0x41, 0x26, 0x25, 0x2e, 0x17, 0x18, 0x1c,
+ 0x16, 0x18, 0x13, 0x18, 0x1e, 0x12, 0x20, 0x2a, 0x1b, 0x24, 0x2f, 0x22,
+ 0x2f, 0x34, 0x27, 0x36, 0x3c, 0x2b, 0x41, 0x47, 0x2f, 0x4c, 0x55, 0x35,
+ 0x59, 0x62, 0x3a, 0x64, 0x6d, 0x3f, 0x6e, 0x77, 0x44, 0x75, 0x7e, 0x4a,
+ 0x79, 0x82, 0x55, 0x77, 0x7f, 0x58, 0x6c, 0x75, 0x58, 0x58, 0x63, 0x54,
+ 0x40, 0x4a, 0x45, 0x2c, 0x33, 0x34, 0x29, 0x26, 0x29, 0x2f, 0x27, 0x28,
+ 0x38, 0x30, 0x2c, 0x4d, 0x39, 0x2f, 0x5e, 0x3c, 0x30, 0x70, 0x4c, 0x41,
+ 0x87, 0x6f, 0x6b, 0xb4, 0xac, 0xae, 0xdc, 0xde, 0xe4, 0xe2, 0xe7, 0xec,
+ 0xe0, 0xe5, 0xee, 0xdf, 0xee, 0xf3, 0xe1, 0xf0, 0xf3, 0xec, 0xf2, 0xf6,
+ 0xf2, 0xf2, 0xf7, 0xec, 0xf3, 0xf6, 0xe7, 0xf2, 0xf6, 0xdf, 0xe6, 0xee,
+ 0x18, 0x16, 0x10, 0x11, 0x0f, 0x0e, 0x10, 0x10, 0x12, 0x0f, 0x10, 0x13,
+ 0x0c, 0x0d, 0x0f, 0x0a, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x10, 0x10, 0x0e, 0x23, 0x25, 0x22,
+ 0x30, 0x32, 0x2f, 0x1e, 0x20, 0x1d, 0x1f, 0x21, 0x1e, 0x25, 0x25, 0x23,
+ 0x27, 0x29, 0x24, 0x26, 0x28, 0x25, 0x10, 0x10, 0x12, 0x0b, 0x0b, 0x0c,
+ 0x11, 0x10, 0x0e, 0x12, 0x13, 0x0e, 0x17, 0x18, 0x11, 0x1a, 0x1b, 0x17,
+ 0x1a, 0x1f, 0x1f, 0x1b, 0x19, 0x18, 0x2f, 0x26, 0x17, 0x97, 0x8a, 0x69,
+ 0x8a, 0x7e, 0x59, 0x26, 0x1d, 0x07, 0x15, 0x14, 0x0f, 0x1a, 0x1f, 0x1e,
+ 0x20, 0x20, 0x24, 0x21, 0x1f, 0x1e, 0x1f, 0x1c, 0x13, 0x24, 0x20, 0x15,
+ 0x2b, 0x26, 0x1e, 0x2a, 0x25, 0x21, 0x2e, 0x29, 0x26, 0x25, 0x20, 0x1d,
+ 0x1f, 0x1c, 0x1a, 0x33, 0x2d, 0x2b, 0x63, 0x59, 0x57, 0x8b, 0x83, 0x80,
+ 0xc0, 0xbb, 0xb5, 0xdc, 0xd9, 0xd1, 0xf3, 0xf1, 0xe5, 0xf6, 0xf3, 0xe8,
+ 0xf7, 0xf3, 0xe9, 0xf9, 0xf5, 0xea, 0xed, 0xe9, 0xe0, 0xce, 0xc9, 0xc3,
+ 0xc1, 0xbc, 0xba, 0x8d, 0x88, 0x88, 0x4e, 0x47, 0x4c, 0x4f, 0x48, 0x4f,
+ 0x5b, 0x5a, 0x5c, 0x60, 0x5e, 0x60, 0x6f, 0x6c, 0x6f, 0x6b, 0x66, 0x6c,
+ 0x5f, 0x59, 0x62, 0x5b, 0x58, 0x62, 0x50, 0x4e, 0x5a, 0x19, 0x18, 0x24,
+ 0x07, 0x09, 0x09, 0x10, 0x16, 0x19, 0x15, 0x20, 0x28, 0x13, 0x20, 0x2a,
+ 0x0e, 0x1b, 0x24, 0x0b, 0x16, 0x1f, 0x0c, 0x18, 0x21, 0x0b, 0x18, 0x21,
+ 0x10, 0x15, 0x25, 0x14, 0x15, 0x25, 0x27, 0x23, 0x31, 0x3b, 0x32, 0x3d,
+ 0x3c, 0x2e, 0x37, 0x44, 0x33, 0x38, 0x48, 0x35, 0x37, 0x40, 0x2e, 0x2e,
+ 0x50, 0x45, 0x41, 0x7c, 0x71, 0x6d, 0x9c, 0x92, 0x8c, 0xa0, 0x97, 0x90,
+ 0xad, 0xa5, 0x9c, 0xbc, 0xb5, 0xab, 0xb1, 0xae, 0xa2, 0xa7, 0xa5, 0x99,
+ 0xb1, 0xaf, 0xa0, 0xb9, 0xb6, 0xa5, 0xb9, 0xb4, 0xa4, 0xa9, 0xa3, 0x97,
+ 0xa7, 0xa3, 0x9c, 0xa7, 0xa4, 0xa0, 0x95, 0x8f, 0x8b, 0x84, 0x79, 0x79,
+ 0x67, 0x5f, 0x6e, 0x4f, 0x44, 0x52, 0x44, 0x33, 0x3c, 0x36, 0x23, 0x25,
+ 0x30, 0x23, 0x21, 0x35, 0x33, 0x33, 0x2d, 0x3b, 0x41, 0x21, 0x3b, 0x49,
+ 0x17, 0x3e, 0x60, 0x1b, 0x42, 0x6d, 0x30, 0x5d, 0x8e, 0x3c, 0x73, 0xa9,
+ 0x32, 0x6f, 0xab, 0x2d, 0x6c, 0xb1, 0x26, 0x6b, 0xb0, 0x20, 0x70, 0xaf,
+ 0x1e, 0x6a, 0xa4, 0x12, 0x42, 0x68, 0x07, 0x1f, 0x31, 0x0b, 0x1b, 0x27,
+ 0x08, 0x18, 0x29, 0x08, 0x15, 0x28, 0x0a, 0x14, 0x27, 0x09, 0x14, 0x26,
+ 0x0b, 0x14, 0x25, 0x0e, 0x16, 0x26, 0x0b, 0x14, 0x23, 0x0b, 0x13, 0x20,
+ 0x0b, 0x12, 0x1c, 0x0a, 0x0f, 0x18, 0x0a, 0x0e, 0x17, 0x08, 0x0b, 0x12,
+ 0x07, 0x0c, 0x10, 0x07, 0x0a, 0x0f, 0x0e, 0x0d, 0x13, 0x13, 0x15, 0x1c,
+ 0x0f, 0x1c, 0x24, 0x0d, 0x27, 0x36, 0x11, 0x34, 0x4e, 0x22, 0x4a, 0x6d,
+ 0x2a, 0x57, 0x80, 0x28, 0x51, 0x7c, 0x1b, 0x3f, 0x69, 0x11, 0x32, 0x59,
+ 0x0f, 0x2b, 0x4e, 0x11, 0x2a, 0x49, 0x11, 0x27, 0x42, 0x0e, 0x22, 0x3b,
+ 0x09, 0x1f, 0x2e, 0x11, 0x1f, 0x2f, 0x18, 0x21, 0x32, 0x16, 0x23, 0x30,
+ 0x0c, 0x23, 0x2d, 0x0e, 0x2b, 0x34, 0x11, 0x29, 0x39, 0x0f, 0x1d, 0x34,
+ 0x0c, 0x16, 0x23, 0x0f, 0x14, 0x1c, 0x11, 0x12, 0x15, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x10, 0x0e, 0x22, 0x20, 0x1f, 0x37, 0x2f, 0x30, 0x42, 0x34, 0x37,
+ 0x4b, 0x3a, 0x3f, 0x44, 0x34, 0x37, 0x3f, 0x30, 0x33, 0x44, 0x38, 0x3a,
+ 0x32, 0x28, 0x27, 0x45, 0x3e, 0x33, 0x64, 0x62, 0x4a, 0x8b, 0x8b, 0x6b,
+ 0xaa, 0xa8, 0x99, 0x9f, 0x9d, 0x92, 0x80, 0x80, 0x74, 0x80, 0x80, 0x74,
+ 0x8f, 0x8f, 0x82, 0x96, 0x96, 0x8c, 0xaa, 0xa9, 0xa6, 0x87, 0x85, 0x86,
+ 0x73, 0x71, 0x69, 0x89, 0x86, 0x80, 0x88, 0x84, 0x83, 0x76, 0x74, 0x75,
+ 0x75, 0x74, 0x74, 0x76, 0x76, 0x79, 0x6c, 0x6d, 0x74, 0x5d, 0x5d, 0x67,
+ 0x5a, 0x55, 0x62, 0x3c, 0x36, 0x3f, 0x2b, 0x24, 0x29, 0x29, 0x20, 0x21,
+ 0x24, 0x1e, 0x20, 0x16, 0x12, 0x13, 0x0e, 0x0e, 0x0e, 0x0d, 0x0f, 0x0c,
+ 0x0e, 0x0e, 0x0c, 0x0d, 0x0d, 0x0d, 0x0c, 0x0e, 0x0d, 0x0c, 0x0d, 0x0c,
+ 0x0d, 0x0d, 0x0b, 0x11, 0x11, 0x11, 0x3a, 0x3d, 0x40, 0x51, 0x58, 0x5d,
+ 0x4a, 0x58, 0x61, 0x49, 0x56, 0x60, 0x42, 0x4f, 0x58, 0x37, 0x44, 0x4c,
+ 0x25, 0x31, 0x37, 0x38, 0x3f, 0x44, 0x27, 0x28, 0x2e, 0x12, 0x0d, 0x14,
+ 0x0d, 0x0d, 0x10, 0x0b, 0x0c, 0x0d, 0x0c, 0x0e, 0x0d, 0x19, 0x1b, 0x18,
+ 0x2f, 0x31, 0x2b, 0x41, 0x44, 0x3a, 0x5c, 0x60, 0x52, 0x73, 0x77, 0x68,
+ 0x83, 0x84, 0x70, 0x8c, 0x8c, 0x78, 0x8e, 0x8d, 0x78, 0x8f, 0x8d, 0x77,
+ 0x95, 0x93, 0x7e, 0x94, 0x94, 0x80, 0x93, 0x94, 0x84, 0x94, 0x95, 0x88,
+ 0x9f, 0x98, 0x8f, 0x93, 0x97, 0x94, 0x7d, 0x91, 0x94, 0x73, 0x8f, 0x9c,
+ 0x68, 0x82, 0x94, 0x69, 0x83, 0x94, 0x7b, 0x97, 0xa5, 0x66, 0x87, 0x94,
+ 0x4c, 0x78, 0x99, 0x78, 0x94, 0xa8, 0x97, 0xa4, 0xa7, 0x90, 0xa2, 0xa8,
+ 0x55, 0x79, 0x8f, 0x43, 0x75, 0x96, 0x5b, 0x89, 0xab, 0x5c, 0x82, 0x9f,
+ 0x47, 0x78, 0x93, 0x71, 0x93, 0xaa, 0x98, 0xa5, 0xb1, 0xa2, 0xa3, 0xa3,
+ 0x9e, 0x9e, 0x94, 0x9e, 0x9f, 0x95, 0xa1, 0x9c, 0x98, 0x9e, 0x93, 0x96,
+ 0x92, 0x8c, 0x8c, 0x7c, 0x77, 0x7c, 0x5e, 0x5b, 0x65, 0x3d, 0x39, 0x40,
+ 0x2a, 0x24, 0x28, 0x20, 0x1a, 0x1b, 0x1e, 0x1a, 0x1d, 0x22, 0x21, 0x26,
+ 0x25, 0x29, 0x28, 0x2a, 0x30, 0x2b, 0x30, 0x3a, 0x2d, 0x3b, 0x47, 0x33,
+ 0x44, 0x50, 0x34, 0x51, 0x5f, 0x3b, 0x5e, 0x69, 0x43, 0x65, 0x6f, 0x45,
+ 0x67, 0x72, 0x46, 0x65, 0x6c, 0x46, 0x54, 0x5a, 0x3d, 0x42, 0x46, 0x35,
+ 0x35, 0x37, 0x2f, 0x37, 0x34, 0x30, 0x3f, 0x36, 0x2f, 0x48, 0x39, 0x2e,
+ 0x55, 0x44, 0x30, 0x6d, 0x4f, 0x36, 0x86, 0x5e, 0x45, 0x96, 0x75, 0x65,
+ 0xb7, 0xac, 0xa7, 0xdb, 0xe6, 0xe6, 0xe2, 0xf4, 0xf4, 0xe5, 0xf6, 0xf3,
+ 0xeb, 0xf0, 0xf8, 0xe3, 0xf0, 0xf4, 0xe4, 0xf2, 0xf3, 0xeb, 0xf1, 0xf4,
+ 0xee, 0xef, 0xf5, 0xe8, 0xf0, 0xf6, 0xdc, 0xe7, 0xed, 0xce, 0xd5, 0xdd,
+ 0x15, 0x16, 0x17, 0x13, 0x13, 0x11, 0x12, 0x13, 0x0e, 0x10, 0x10, 0x0e,
+ 0x0c, 0x0b, 0x0e, 0x0c, 0x0b, 0x10, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x08,
+ 0x0e, 0x0e, 0x0d, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0c, 0x0e, 0x0d, 0x1f, 0x24, 0x20,
+ 0x41, 0x46, 0x42, 0x35, 0x3a, 0x36, 0x2b, 0x2d, 0x2c, 0x26, 0x28, 0x26,
+ 0x2a, 0x2b, 0x25, 0x2b, 0x2c, 0x29, 0x15, 0x15, 0x17, 0x0b, 0x0b, 0x0b,
+ 0x11, 0x12, 0x0d, 0x16, 0x17, 0x11, 0x1a, 0x1b, 0x17, 0x1f, 0x1f, 0x1f,
+ 0x1e, 0x21, 0x20, 0x1d, 0x1b, 0x1a, 0x1f, 0x19, 0x0b, 0x61, 0x58, 0x3a,
+ 0x5c, 0x55, 0x31, 0x22, 0x1c, 0x07, 0x16, 0x16, 0x0e, 0x1c, 0x21, 0x1e,
+ 0x26, 0x24, 0x27, 0x23, 0x1f, 0x1c, 0x24, 0x20, 0x17, 0x2e, 0x27, 0x1f,
+ 0x28, 0x21, 0x1e, 0x2a, 0x24, 0x25, 0x28, 0x23, 0x20, 0x28, 0x25, 0x20,
+ 0x4c, 0x4a, 0x3d, 0x9c, 0x96, 0x8b, 0xd2, 0xca, 0xbf, 0xea, 0xe3, 0xd8,
+ 0xfe, 0xfb, 0xef, 0xfd, 0xfb, 0xee, 0xfd, 0xfb, 0xee, 0xfd, 0xfb, 0xed,
+ 0xfd, 0xfa, 0xe7, 0xfd, 0xfa, 0xe8, 0xff, 0xfe, 0xed, 0xfa, 0xf7, 0xe8,
+ 0xff, 0xfd, 0xf2, 0xf5, 0xf2, 0xeb, 0xc9, 0xc6, 0xc1, 0x7c, 0x78, 0x77,
+ 0x62, 0x5f, 0x62, 0x72, 0x6e, 0x6e, 0x66, 0x63, 0x5f, 0x54, 0x4f, 0x4a,
+ 0x56, 0x52, 0x4a, 0x56, 0x53, 0x4d, 0x5c, 0x5b, 0x57, 0x38, 0x38, 0x35,
+ 0x08, 0x09, 0x09, 0x12, 0x17, 0x1c, 0x1a, 0x25, 0x2d, 0x16, 0x24, 0x2f,
+ 0x11, 0x1d, 0x28, 0x0d, 0x17, 0x21, 0x0c, 0x17, 0x21, 0x0b, 0x18, 0x21,
+ 0x12, 0x15, 0x21, 0x1d, 0x1b, 0x28, 0x37, 0x2e, 0x39, 0x44, 0x35, 0x3f,
+ 0x44, 0x30, 0x37, 0x3d, 0x2d, 0x2d, 0x42, 0x37, 0x33, 0x6c, 0x63, 0x5c,
+ 0xa6, 0x9f, 0x95, 0xc8, 0xc1, 0xb8, 0xbc, 0xb4, 0xa9, 0xb4, 0xac, 0xa1,
+ 0xb9, 0xb3, 0xa5, 0xbb, 0xb6, 0xa6, 0xbd, 0xba, 0xa7, 0xb2, 0xb0, 0x9c,
+ 0xaa, 0xa6, 0x94, 0xb5, 0xb1, 0x9d, 0xb7, 0xb1, 0x9d, 0xb3, 0xae, 0x9d,
+ 0xac, 0xa9, 0x9c, 0xad, 0xaa, 0x9f, 0xa6, 0xa2, 0x97, 0xb0, 0xaa, 0x9f,
+ 0xa5, 0xa1, 0xa2, 0x81, 0x79, 0x81, 0x69, 0x5d, 0x66, 0x43, 0x34, 0x3d,
+ 0x30, 0x21, 0x24, 0x2d, 0x25, 0x23, 0x33, 0x33, 0x30, 0x30, 0x38, 0x38,
+ 0x26, 0x44, 0x5f, 0x29, 0x59, 0x8e, 0x26, 0x66, 0xa3, 0x2d, 0x6e, 0xa6,
+ 0x2f, 0x6d, 0xa8, 0x2b, 0x6a, 0xb0, 0x2a, 0x6a, 0xab, 0x24, 0x63, 0x95,
+ 0x0f, 0x3e, 0x67, 0x03, 0x1f, 0x37, 0x0e, 0x1b, 0x29, 0x13, 0x22, 0x34,
+ 0x0b, 0x20, 0x37, 0x04, 0x17, 0x2a, 0x0b, 0x16, 0x23, 0x0c, 0x14, 0x1f,
+ 0x0b, 0x15, 0x21, 0x0b, 0x14, 0x20, 0x0b, 0x14, 0x1f, 0x09, 0x11, 0x1a,
+ 0x09, 0x10, 0x18, 0x0c, 0x12, 0x17, 0x0c, 0x0f, 0x14, 0x09, 0x0d, 0x0f,
+ 0x06, 0x0c, 0x0a, 0x07, 0x0a, 0x0e, 0x0d, 0x0f, 0x19, 0x10, 0x16, 0x21,
+ 0x0d, 0x1b, 0x24, 0x0b, 0x20, 0x2b, 0x0d, 0x26, 0x39, 0x16, 0x30, 0x4b,
+ 0x1b, 0x42, 0x5e, 0x23, 0x4a, 0x6c, 0x24, 0x4a, 0x70, 0x1e, 0x44, 0x6e,
+ 0x15, 0x39, 0x61, 0x12, 0x30, 0x56, 0x0f, 0x29, 0x4c, 0x0d, 0x23, 0x44,
+ 0x0f, 0x24, 0x39, 0x13, 0x24, 0x37, 0x11, 0x1f, 0x2f, 0x0f, 0x1b, 0x27,
+ 0x0f, 0x1f, 0x26, 0x0f, 0x20, 0x27, 0x0f, 0x1c, 0x26, 0x0b, 0x16, 0x22,
+ 0x0c, 0x15, 0x1c, 0x0d, 0x12, 0x16, 0x0e, 0x10, 0x11, 0x0d, 0x0f, 0x10,
+ 0x14, 0x18, 0x1a, 0x2e, 0x2d, 0x33, 0x42, 0x38, 0x41, 0x49, 0x38, 0x43,
+ 0x48, 0x3c, 0x45, 0x3d, 0x32, 0x3a, 0x41, 0x36, 0x3a, 0x3d, 0x36, 0x30,
+ 0x44, 0x3f, 0x2f, 0x65, 0x61, 0x4a, 0x79, 0x75, 0x5b, 0x89, 0x82, 0x6d,
+ 0xa2, 0x9e, 0x91, 0x88, 0x85, 0x7b, 0x7b, 0x7b, 0x70, 0x97, 0x99, 0x8b,
+ 0xa7, 0xa9, 0x9b, 0x76, 0x78, 0x6d, 0xc7, 0xc8, 0xc2, 0xb3, 0xb2, 0xb0,
+ 0x90, 0x91, 0x8d, 0x89, 0x8a, 0x87, 0x74, 0x72, 0x73, 0x75, 0x73, 0x73,
+ 0x76, 0x75, 0x73, 0x82, 0x81, 0x7c, 0x83, 0x83, 0x80, 0x7c, 0x7c, 0x7f,
+ 0x66, 0x66, 0x72, 0x57, 0x54, 0x61, 0x31, 0x2b, 0x37, 0x2b, 0x22, 0x29,
+ 0x2d, 0x24, 0x25, 0x21, 0x1c, 0x19, 0x16, 0x14, 0x13, 0x11, 0x10, 0x12,
+ 0x0e, 0x0d, 0x0e, 0x0d, 0x0d, 0x0e, 0x0b, 0x0c, 0x0e, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0f, 0x0d, 0x10, 0x12, 0x0f, 0x3d, 0x42, 0x42, 0x4b, 0x54, 0x58,
+ 0x49, 0x52, 0x5d, 0x44, 0x4d, 0x58, 0x34, 0x3c, 0x47, 0x40, 0x4a, 0x53,
+ 0x2d, 0x38, 0x3e, 0x30, 0x3a, 0x3f, 0x1a, 0x1f, 0x23, 0x0f, 0x0e, 0x13,
+ 0x0c, 0x0d, 0x0f, 0x0e, 0x0f, 0x11, 0x1c, 0x1e, 0x1d, 0x33, 0x35, 0x32,
+ 0x40, 0x41, 0x3b, 0x56, 0x58, 0x4b, 0x73, 0x76, 0x64, 0x84, 0x86, 0x73,
+ 0x8b, 0x8d, 0x7a, 0x8c, 0x8f, 0x7a, 0x91, 0x93, 0x7e, 0x8f, 0x91, 0x7c,
+ 0x90, 0x91, 0x80, 0x8e, 0x92, 0x85, 0x8c, 0x91, 0x88, 0x8c, 0x92, 0x8c,
+ 0x7b, 0x88, 0x94, 0x61, 0x79, 0x8c, 0x5c, 0x7c, 0x90, 0x6e, 0x87, 0x95,
+ 0x85, 0x8e, 0x95, 0x9b, 0x9e, 0xa3, 0x93, 0xa1, 0xa6, 0x6a, 0x85, 0x90,
+ 0x54, 0x78, 0x95, 0x81, 0x93, 0xa5, 0x9a, 0x9e, 0xa4, 0x87, 0x93, 0xa0,
+ 0x61, 0x82, 0xa0, 0x4a, 0x77, 0x9e, 0x6b, 0x90, 0xae, 0x7d, 0x96, 0xaa,
+ 0x64, 0x8d, 0xa9, 0x64, 0x8a, 0xa6, 0x6b, 0x8c, 0xa2, 0x82, 0x9c, 0xac,
+ 0x94, 0xa7, 0xb0, 0x99, 0xa4, 0xa8, 0x98, 0x9a, 0x9b, 0x9e, 0x9a, 0x9b,
+ 0x9f, 0x9e, 0x9a, 0x96, 0x94, 0x97, 0x8b, 0x88, 0x90, 0x7b, 0x71, 0x76,
+ 0x6f, 0x5e, 0x5b, 0x5c, 0x44, 0x40, 0x47, 0x32, 0x2f, 0x3e, 0x2b, 0x2b,
+ 0x31, 0x2c, 0x29, 0x31, 0x30, 0x2a, 0x32, 0x34, 0x28, 0x38, 0x3c, 0x29,
+ 0x3e, 0x43, 0x2c, 0x4a, 0x4f, 0x35, 0x53, 0x59, 0x3a, 0x59, 0x5b, 0x3c,
+ 0x5e, 0x58, 0x33, 0x5b, 0x52, 0x2f, 0x54, 0x48, 0x2d, 0x52, 0x45, 0x32,
+ 0x54, 0x45, 0x36, 0x58, 0x46, 0x39, 0x64, 0x4d, 0x3d, 0x70, 0x53, 0x3f,
+ 0x81, 0x60, 0x48, 0x93, 0x72, 0x5a, 0xa3, 0x86, 0x71, 0xbc, 0xae, 0xa1,
+ 0xdf, 0xe4, 0xdd, 0xe4, 0xf3, 0xf2, 0xe7, 0xf5, 0xf5, 0xeb, 0xf2, 0xf3,
+ 0xed, 0xf0, 0xf6, 0xe8, 0xf3, 0xf5, 0xe8, 0xf3, 0xf3, 0xeb, 0xf0, 0xf2,
+ 0xec, 0xef, 0xf6, 0xe4, 0xee, 0xf5, 0xd7, 0xe2, 0xe8, 0xca, 0xce, 0xd7,
+ 0x14, 0x18, 0x15, 0x16, 0x17, 0x14, 0x17, 0x18, 0x14, 0x15, 0x15, 0x12,
+ 0x0e, 0x0e, 0x0d, 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x0b, 0x07, 0x09, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x0a, 0x09, 0x09, 0x09, 0x0b, 0x0d, 0x0c, 0x10, 0x14, 0x12,
+ 0x23, 0x27, 0x25, 0x38, 0x3c, 0x3b, 0x3c, 0x40, 0x40, 0x32, 0x33, 0x34,
+ 0x2d, 0x2e, 0x28, 0x2b, 0x2b, 0x29, 0x1b, 0x1b, 0x1d, 0x10, 0x10, 0x0f,
+ 0x15, 0x16, 0x11, 0x1b, 0x1b, 0x15, 0x1d, 0x1c, 0x1a, 0x21, 0x20, 0x21,
+ 0x20, 0x21, 0x1c, 0x1d, 0x1b, 0x1c, 0x14, 0x10, 0x10, 0x12, 0x0f, 0x05,
+ 0x28, 0x26, 0x18, 0x21, 0x1e, 0x16, 0x16, 0x15, 0x10, 0x1b, 0x1c, 0x15,
+ 0x20, 0x1c, 0x1b, 0x23, 0x1d, 0x1a, 0x2e, 0x27, 0x23, 0x2e, 0x26, 0x25,
+ 0x2a, 0x21, 0x25, 0x2e, 0x28, 0x2b, 0x2c, 0x26, 0x24, 0x6c, 0x69, 0x5f,
+ 0xbd, 0xba, 0xa3, 0xf4, 0xef, 0xd9, 0xfe, 0xf8, 0xe2, 0xf9, 0xf4, 0xe1,
+ 0xf9, 0xf6, 0xe5, 0xf9, 0xf9, 0xe9, 0xfb, 0xf9, 0xec, 0xf7, 0xf4, 0xe7,
+ 0xfb, 0xf8, 0xe7, 0xf1, 0xee, 0xdc, 0xe9, 0xe6, 0xd5, 0xee, 0xeb, 0xdb,
+ 0xf8, 0xf5, 0xe8, 0xf8, 0xf6, 0xec, 0xff, 0xff, 0xf9, 0xe5, 0xe3, 0xe1,
+ 0x91, 0x8d, 0x9a, 0x62, 0x5d, 0x65, 0x45, 0x3f, 0x41, 0x2c, 0x25, 0x21,
+ 0x24, 0x1e, 0x15, 0x24, 0x20, 0x16, 0x2f, 0x2f, 0x27, 0x35, 0x34, 0x2d,
+ 0x11, 0x13, 0x12, 0x10, 0x17, 0x1b, 0x1c, 0x2a, 0x31, 0x18, 0x26, 0x31,
+ 0x15, 0x21, 0x2d, 0x10, 0x1a, 0x25, 0x0e, 0x18, 0x21, 0x0e, 0x18, 0x21,
+ 0x1b, 0x1d, 0x26, 0x2e, 0x2a, 0x32, 0x41, 0x35, 0x3e, 0x47, 0x36, 0x3c,
+ 0x41, 0x2e, 0x30, 0x50, 0x44, 0x3d, 0x89, 0x83, 0x78, 0xab, 0xab, 0x9d,
+ 0xbf, 0xbe, 0xb4, 0xc9, 0xc8, 0xbe, 0xc7, 0xc6, 0xbc, 0xc1, 0xbf, 0xb3,
+ 0xbe, 0xbc, 0xae, 0xbd, 0xbe, 0xae, 0xbf, 0xc0, 0xac, 0xb6, 0xb8, 0xa3,
+ 0xb0, 0xb1, 0xa1, 0xb5, 0xb3, 0xa4, 0xb9, 0xb5, 0xa6, 0xbc, 0xba, 0xab,
+ 0xb5, 0xb6, 0xa9, 0xaa, 0xac, 0xa1, 0xad, 0xb0, 0xa2, 0xb7, 0xb9, 0xaa,
+ 0xb3, 0xb1, 0x9e, 0xa3, 0xa0, 0x97, 0x9c, 0x97, 0x9d, 0x62, 0x5a, 0x67,
+ 0x3a, 0x30, 0x3b, 0x30, 0x24, 0x2a, 0x31, 0x26, 0x29, 0x33, 0x28, 0x29,
+ 0x2c, 0x38, 0x49, 0x2d, 0x63, 0x96, 0x1a, 0x6a, 0xb1, 0x20, 0x6d, 0xac,
+ 0x27, 0x6a, 0xa8, 0x2b, 0x6e, 0xb4, 0x28, 0x62, 0x9c, 0x0f, 0x35, 0x56,
+ 0x0d, 0x17, 0x2f, 0x0b, 0x20, 0x30, 0x0f, 0x29, 0x3c, 0x1a, 0x2d, 0x4c,
+ 0x14, 0x23, 0x3e, 0x04, 0x18, 0x21, 0x08, 0x18, 0x1c, 0x0b, 0x12, 0x1f,
+ 0x0b, 0x14, 0x1f, 0x09, 0x13, 0x1c, 0x09, 0x12, 0x19, 0x09, 0x10, 0x17,
+ 0x09, 0x11, 0x14, 0x09, 0x0f, 0x11, 0x0a, 0x0e, 0x10, 0x09, 0x0c, 0x0b,
+ 0x07, 0x0c, 0x06, 0x07, 0x0b, 0x0d, 0x0c, 0x11, 0x1d, 0x0c, 0x17, 0x27,
+ 0x0a, 0x19, 0x26, 0x09, 0x1b, 0x27, 0x10, 0x1e, 0x2f, 0x18, 0x24, 0x3a,
+ 0x10, 0x2e, 0x42, 0x0f, 0x32, 0x4a, 0x19, 0x3d, 0x5f, 0x22, 0x48, 0x72,
+ 0x23, 0x49, 0x76, 0x1c, 0x40, 0x6c, 0x16, 0x34, 0x5d, 0x13, 0x2d, 0x53,
+ 0x15, 0x2b, 0x49, 0x10, 0x23, 0x38, 0x0b, 0x1d, 0x29, 0x0a, 0x19, 0x1f,
+ 0x0f, 0x1a, 0x22, 0x10, 0x19, 0x22, 0x0f, 0x18, 0x1f, 0x0c, 0x15, 0x1a,
+ 0x0c, 0x16, 0x18, 0x0a, 0x12, 0x13, 0x0b, 0x10, 0x0f, 0x0c, 0x12, 0x14,
+ 0x1e, 0x25, 0x2c, 0x43, 0x45, 0x51, 0x5f, 0x56, 0x66, 0x55, 0x45, 0x58,
+ 0x48, 0x3e, 0x4c, 0x42, 0x39, 0x45, 0x4e, 0x48, 0x4b, 0x42, 0x3e, 0x31,
+ 0x61, 0x5d, 0x44, 0x6f, 0x6a, 0x4e, 0x7c, 0x73, 0x62, 0x81, 0x78, 0x70,
+ 0x7f, 0x7b, 0x70, 0x7b, 0x78, 0x70, 0x7a, 0x7a, 0x71, 0x80, 0x81, 0x77,
+ 0x94, 0x96, 0x8b, 0x71, 0x74, 0x6b, 0x91, 0x92, 0x8e, 0x9b, 0x9b, 0x9b,
+ 0xbc, 0xc1, 0xc2, 0xb8, 0xbc, 0xbf, 0x7f, 0x80, 0x84, 0x7d, 0x7b, 0x7c,
+ 0x80, 0x7c, 0x7a, 0x80, 0x7e, 0x77, 0x7d, 0x7a, 0x72, 0x83, 0x80, 0x7b,
+ 0x7d, 0x80, 0x8a, 0x6a, 0x69, 0x79, 0x40, 0x3a, 0x4b, 0x29, 0x20, 0x2a,
+ 0x2a, 0x21, 0x20, 0x29, 0x24, 0x1d, 0x24, 0x21, 0x1e, 0x12, 0x10, 0x15,
+ 0x0d, 0x0b, 0x0e, 0x0d, 0x0d, 0x10, 0x0b, 0x0d, 0x0f, 0x0b, 0x0c, 0x0b,
+ 0x0e, 0x0e, 0x0c, 0x15, 0x17, 0x15, 0x40, 0x46, 0x46, 0x48, 0x52, 0x55,
+ 0x4a, 0x4f, 0x5a, 0x36, 0x3a, 0x46, 0x34, 0x3b, 0x46, 0x43, 0x4c, 0x55,
+ 0x26, 0x32, 0x38, 0x26, 0x33, 0x37, 0x1c, 0x25, 0x28, 0x0f, 0x14, 0x17,
+ 0x0b, 0x0e, 0x10, 0x16, 0x17, 0x19, 0x32, 0x35, 0x34, 0x4a, 0x4d, 0x49,
+ 0x50, 0x52, 0x49, 0x68, 0x6a, 0x5c, 0x7e, 0x80, 0x71, 0x89, 0x8d, 0x7c,
+ 0x8c, 0x95, 0x83, 0x8e, 0x92, 0x81, 0x8e, 0x91, 0x80, 0x95, 0x98, 0x86,
+ 0x94, 0x99, 0x8a, 0x8d, 0x94, 0x8b, 0x83, 0x8d, 0x8a, 0x6a, 0x7a, 0x7e,
+ 0x3e, 0x73, 0x86, 0x40, 0x70, 0x85, 0x57, 0x7c, 0x8e, 0x5b, 0x7e, 0x8f,
+ 0x5a, 0x7c, 0x89, 0x78, 0x95, 0x9e, 0x8d, 0x9e, 0xa3, 0x7c, 0x85, 0x89,
+ 0x63, 0x88, 0x96, 0x87, 0x9c, 0xa2, 0x91, 0x94, 0x96, 0x7f, 0x8a, 0x97,
+ 0x66, 0x8a, 0xad, 0x3c, 0x74, 0x9f, 0x3d, 0x74, 0x93, 0x64, 0x8e, 0x9d,
+ 0x8e, 0x9c, 0xab, 0x68, 0x84, 0x97, 0x56, 0x83, 0x9d, 0x5f, 0x91, 0xb0,
+ 0x60, 0x89, 0xa9, 0x77, 0x91, 0xa9, 0x94, 0xa0, 0xaa, 0x9e, 0xa1, 0xa2,
+ 0xa0, 0xa0, 0xa0, 0x9c, 0x9c, 0x9f, 0x95, 0x92, 0x96, 0x94, 0x88, 0x84,
+ 0xae, 0x95, 0x86, 0xb8, 0x97, 0x7e, 0xa3, 0x80, 0x67, 0x8f, 0x6f, 0x59,
+ 0x7a, 0x5f, 0x49, 0x6f, 0x55, 0x3e, 0x68, 0x53, 0x39, 0x64, 0x51, 0x33,
+ 0x66, 0x54, 0x33, 0x6d, 0x5a, 0x39, 0x72, 0x5e, 0x3c, 0x75, 0x60, 0x3e,
+ 0x7a, 0x60, 0x3f, 0x7e, 0x5e, 0x40, 0x7f, 0x5d, 0x43, 0x7b, 0x57, 0x43,
+ 0x7d, 0x59, 0x48, 0x81, 0x5c, 0x4c, 0x96, 0x6e, 0x5a, 0xa4, 0x7a, 0x62,
+ 0xb4, 0x88, 0x72, 0xb4, 0x93, 0x84, 0xba, 0xac, 0xa4, 0xd7, 0xdc, 0xd8,
+ 0xe7, 0xf3, 0xf1, 0xe8, 0xf4, 0xf4, 0xf0, 0xf2, 0xf7, 0xf3, 0xef, 0xf8,
+ 0xf0, 0xf0, 0xf5, 0xe9, 0xf1, 0xf3, 0xe9, 0xf3, 0xf2, 0xed, 0xf1, 0xf4,
+ 0xea, 0xef, 0xf5, 0xe5, 0xf0, 0xf6, 0xe2, 0xed, 0xf3, 0xda, 0xde, 0xe4,
+ 0x17, 0x19, 0x16, 0x15, 0x17, 0x14, 0x16, 0x16, 0x14, 0x17, 0x17, 0x15,
+ 0x13, 0x13, 0x12, 0x0f, 0x0f, 0x0f, 0x0b, 0x0a, 0x0a, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x09, 0x08, 0x08, 0x0c, 0x0c, 0x0c, 0x0f, 0x11, 0x10,
+ 0x0b, 0x0d, 0x0c, 0x16, 0x19, 0x18, 0x2d, 0x31, 0x30, 0x3b, 0x3f, 0x3e,
+ 0x3c, 0x3e, 0x3c, 0x2e, 0x2f, 0x2e, 0x1d, 0x1d, 0x1c, 0x17, 0x16, 0x12,
+ 0x1a, 0x19, 0x14, 0x20, 0x1f, 0x1a, 0x24, 0x24, 0x1c, 0x26, 0x26, 0x1e,
+ 0x21, 0x23, 0x21, 0x1b, 0x1c, 0x1c, 0x10, 0x10, 0x11, 0x0d, 0x0b, 0x0c,
+ 0x1b, 0x1a, 0x18, 0x18, 0x17, 0x15, 0x13, 0x12, 0x0e, 0x1d, 0x1c, 0x17,
+ 0x22, 0x1c, 0x14, 0x2e, 0x23, 0x1e, 0x31, 0x23, 0x24, 0x32, 0x25, 0x28,
+ 0x32, 0x2c, 0x2b, 0x25, 0x25, 0x1c, 0x6c, 0x68, 0x5a, 0xde, 0xd8, 0xc7,
+ 0xff, 0xf9, 0xe9, 0xff, 0xf9, 0xe7, 0xf7, 0xf2, 0xdc, 0xf2, 0xef, 0xd6,
+ 0xf3, 0xf1, 0xd8, 0xf2, 0xf1, 0xda, 0xea, 0xe9, 0xd5, 0xdc, 0xdb, 0xc8,
+ 0xd5, 0xd2, 0xc1, 0xd7, 0xd4, 0xc3, 0xdb, 0xd8, 0xc7, 0xd1, 0xce, 0xbc,
+ 0xf2, 0xef, 0xdd, 0xf3, 0xf1, 0xe3, 0xf7, 0xf7, 0xeb, 0xfd, 0xfd, 0xf3,
+ 0xe5, 0xe4, 0xde, 0x7d, 0x79, 0x7c, 0x2e, 0x26, 0x30, 0x29, 0x1e, 0x24,
+ 0x28, 0x1f, 0x18, 0x29, 0x22, 0x14, 0x27, 0x20, 0x17, 0x23, 0x1f, 0x1a,
+ 0x16, 0x1b, 0x17, 0x0e, 0x14, 0x16, 0x18, 0x21, 0x2a, 0x18, 0x25, 0x33,
+ 0x1b, 0x2b, 0x3a, 0x0f, 0x1d, 0x2a, 0x0c, 0x14, 0x1e, 0x17, 0x1a, 0x1f,
+ 0x2c, 0x27, 0x25, 0x3b, 0x35, 0x37, 0x48, 0x3f, 0x44, 0x49, 0x3f, 0x3f,
+ 0x4d, 0x44, 0x3b, 0xa1, 0x9a, 0x88, 0xb9, 0xb4, 0xa1, 0xbe, 0xb9, 0xa9,
+ 0xbe, 0xbd, 0xac, 0xc2, 0xc0, 0xb1, 0xce, 0xcd, 0xbf, 0xcc, 0xca, 0xbd,
+ 0xbd, 0xbd, 0xb0, 0xbf, 0xbf, 0xb3, 0xba, 0xbb, 0xae, 0xae, 0xaf, 0xa2,
+ 0xb7, 0xba, 0xa7, 0xb9, 0xb9, 0xa7, 0xb6, 0xb5, 0xa6, 0xc1, 0xbf, 0xb2,
+ 0xbd, 0xbb, 0xaf, 0xb7, 0xb6, 0xaa, 0xb6, 0xb7, 0xa9, 0xb8, 0xb9, 0xaa,
+ 0xb8, 0xb4, 0xa8, 0xa8, 0xa5, 0x99, 0xab, 0xa7, 0xa1, 0x8f, 0x87, 0x8b,
+ 0x59, 0x4f, 0x5b, 0x33, 0x27, 0x33, 0x30, 0x23, 0x2a, 0x31, 0x22, 0x22,
+ 0x2c, 0x25, 0x2b, 0x2e, 0x4d, 0x68, 0x29, 0x6b, 0xa1, 0x1f, 0x6a, 0xb1,
+ 0x28, 0x6a, 0xad, 0x2c, 0x61, 0x92, 0x13, 0x32, 0x4f, 0x0a, 0x18, 0x29,
+ 0x0d, 0x1b, 0x28, 0x14, 0x26, 0x37, 0x19, 0x2f, 0x44, 0x14, 0x2a, 0x40,
+ 0x09, 0x1c, 0x2d, 0x09, 0x17, 0x27, 0x08, 0x15, 0x24, 0x0a, 0x15, 0x23,
+ 0x0d, 0x13, 0x1f, 0x0d, 0x13, 0x1f, 0x0c, 0x13, 0x1d, 0x0c, 0x11, 0x1b,
+ 0x0a, 0x0e, 0x17, 0x09, 0x0e, 0x14, 0x09, 0x0c, 0x11, 0x08, 0x0c, 0x10,
+ 0x07, 0x0b, 0x0c, 0x07, 0x0c, 0x0e, 0x0a, 0x11, 0x15, 0x0e, 0x18, 0x20,
+ 0x0d, 0x1a, 0x24, 0x0c, 0x1a, 0x27, 0x0d, 0x1c, 0x2d, 0x0f, 0x1e, 0x31,
+ 0x0e, 0x27, 0x38, 0x0e, 0x27, 0x3d, 0x12, 0x2c, 0x47, 0x16, 0x34, 0x57,
+ 0x1e, 0x42, 0x67, 0x22, 0x49, 0x70, 0x1e, 0x45, 0x6e, 0x16, 0x3b, 0x65,
+ 0x14, 0x29, 0x4d, 0x0c, 0x1c, 0x32, 0x0c, 0x19, 0x21, 0x0d, 0x18, 0x18,
+ 0x0f, 0x16, 0x1c, 0x0f, 0x16, 0x20, 0x0e, 0x12, 0x1d, 0x0e, 0x11, 0x19,
+ 0x0f, 0x15, 0x18, 0x0a, 0x13, 0x12, 0x0b, 0x10, 0x0a, 0x12, 0x11, 0x16,
+ 0x48, 0x4b, 0x5e, 0x73, 0x83, 0x8d, 0x96, 0xa0, 0xab, 0x6b, 0x60, 0x7d,
+ 0x63, 0x52, 0x60, 0x66, 0x5b, 0x64, 0x60, 0x5b, 0x60, 0x4f, 0x4b, 0x41,
+ 0x6f, 0x69, 0x51, 0x7b, 0x75, 0x5d, 0x82, 0x7f, 0x6e, 0x89, 0x89, 0x7c,
+ 0x81, 0x85, 0x72, 0xa5, 0xa7, 0xa2, 0x86, 0x86, 0x8c, 0x77, 0x74, 0x7c,
+ 0x75, 0x74, 0x74, 0x7d, 0x7e, 0x78, 0x89, 0x8a, 0x85, 0xa9, 0xa9, 0xa9,
+ 0xa9, 0xaf, 0xaf, 0xbf, 0xc5, 0xc6, 0xb8, 0xbd, 0xc3, 0xa8, 0xa9, 0xb5,
+ 0x7f, 0x7f, 0x8a, 0x78, 0x77, 0x7b, 0x7b, 0x78, 0x72, 0x80, 0x7c, 0x71,
+ 0x85, 0x84, 0x88, 0x77, 0x75, 0x83, 0x51, 0x4a, 0x5e, 0x2e, 0x25, 0x34,
+ 0x2d, 0x24, 0x24, 0x2a, 0x25, 0x1e, 0x24, 0x26, 0x21, 0x14, 0x1a, 0x1c,
+ 0x0f, 0x0e, 0x11, 0x0c, 0x0d, 0x0f, 0x09, 0x0f, 0x0e, 0x0b, 0x0f, 0x0e,
+ 0x0f, 0x0f, 0x0f, 0x1c, 0x1c, 0x1e, 0x3f, 0x45, 0x48, 0x47, 0x52, 0x54,
+ 0x42, 0x4d, 0x52, 0x29, 0x33, 0x3a, 0x37, 0x42, 0x49, 0x37, 0x40, 0x48,
+ 0x24, 0x29, 0x33, 0x2a, 0x2d, 0x36, 0x35, 0x36, 0x3e, 0x18, 0x18, 0x1d,
+ 0x13, 0x17, 0x13, 0x35, 0x39, 0x3a, 0x47, 0x4d, 0x4c, 0x46, 0x53, 0x45,
+ 0x57, 0x62, 0x4f, 0x60, 0x69, 0x62, 0x55, 0x6a, 0x72, 0x4d, 0x72, 0x81,
+ 0x5b, 0x81, 0x7e, 0x82, 0x8f, 0x8d, 0x99, 0x95, 0x89, 0x95, 0x9a, 0x82,
+ 0x92, 0x9f, 0x8f, 0x9d, 0x9e, 0x9a, 0x71, 0x7f, 0x88, 0x3c, 0x70, 0x88,
+ 0x40, 0x72, 0x8a, 0x67, 0x86, 0x8f, 0x8c, 0x9b, 0x98, 0x85, 0x9b, 0x9f,
+ 0x4d, 0x73, 0x84, 0x51, 0x77, 0x8b, 0x82, 0x93, 0x9b, 0x93, 0x90, 0x8b,
+ 0x8f, 0x97, 0x9b, 0x97, 0xa5, 0xac, 0x9b, 0xa5, 0xa3, 0x9e, 0xa3, 0x9e,
+ 0x7b, 0x8d, 0x98, 0x5c, 0x85, 0xa0, 0x67, 0x8b, 0xa2, 0x8b, 0x99, 0x9d,
+ 0x96, 0x9e, 0xa1, 0x8a, 0x98, 0xa0, 0x93, 0xa1, 0xa6, 0x90, 0xa0, 0xab,
+ 0x63, 0x83, 0xa5, 0x4f, 0x82, 0xa8, 0x69, 0x92, 0xa7, 0x7f, 0x91, 0x9d,
+ 0x8b, 0x9e, 0xa2, 0x9d, 0xa1, 0xab, 0x9c, 0x9a, 0x9e, 0x96, 0x97, 0x94,
+ 0xa5, 0x9a, 0x92, 0xdd, 0xbf, 0xa0, 0xf6, 0xcc, 0xa2, 0xdc, 0xae, 0x93,
+ 0xc3, 0x95, 0x75, 0xb8, 0x85, 0x66, 0xb1, 0x83, 0x62, 0xaa, 0x85, 0x5a,
+ 0xac, 0x88, 0x57, 0xaf, 0x84, 0x53, 0xb1, 0x82, 0x56, 0xaf, 0x84, 0x59,
+ 0xb0, 0x7e, 0x50, 0xa8, 0x79, 0x51, 0x9e, 0x76, 0x56, 0x9c, 0x75, 0x56,
+ 0xa3, 0x78, 0x57, 0xad, 0x82, 0x61, 0xbc, 0x91, 0x76, 0xc2, 0x9d, 0x85,
+ 0xbf, 0x9f, 0x8a, 0xc5, 0xb2, 0xa7, 0xd7, 0xd6, 0xd5, 0xe2, 0xeb, 0xee,
+ 0xea, 0xf0, 0xf3, 0xee, 0xf2, 0xf3, 0xee, 0xf2, 0xf7, 0xec, 0xf2, 0xfa,
+ 0xea, 0xf3, 0xf5, 0xe9, 0xf1, 0xf2, 0xeb, 0xf1, 0xf1, 0xea, 0xef, 0xf1,
+ 0xe6, 0xf0, 0xf3, 0xe6, 0xf1, 0xf5, 0xe7, 0xf1, 0xf3, 0xe7, 0xf0, 0xf0,
+ 0x18, 0x1a, 0x17, 0x17, 0x19, 0x16, 0x14, 0x14, 0x12, 0x17, 0x17, 0x15,
+ 0x15, 0x15, 0x15, 0x12, 0x12, 0x12, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0d,
+ 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x0f, 0x11, 0x10,
+ 0x07, 0x09, 0x08, 0x05, 0x07, 0x06, 0x10, 0x13, 0x12, 0x22, 0x26, 0x25,
+ 0x3b, 0x3d, 0x3c, 0x3e, 0x40, 0x3e, 0x2d, 0x2d, 0x2b, 0x1b, 0x1b, 0x18,
+ 0x19, 0x18, 0x14, 0x1d, 0x1c, 0x17, 0x21, 0x22, 0x1c, 0x27, 0x28, 0x22,
+ 0x26, 0x28, 0x27, 0x27, 0x28, 0x28, 0x1a, 0x1a, 0x1a, 0x0b, 0x09, 0x0a,
+ 0x0e, 0x0d, 0x0b, 0x11, 0x10, 0x0e, 0x10, 0x10, 0x0c, 0x19, 0x18, 0x13,
+ 0x2b, 0x24, 0x1e, 0x32, 0x26, 0x24, 0x34, 0x25, 0x26, 0x33, 0x28, 0x27,
+ 0x2f, 0x2a, 0x24, 0x4c, 0x49, 0x3e, 0xd8, 0xd6, 0xc3, 0xff, 0xfb, 0xe8,
+ 0xf8, 0xf3, 0xdf, 0xeb, 0xe6, 0xd0, 0xe9, 0xe4, 0xce, 0xe3, 0xe1, 0xcc,
+ 0xda, 0xd7, 0xc4, 0xe3, 0xe2, 0xd0, 0xc1, 0xc0, 0xb0, 0xdb, 0xd9, 0xcb,
+ 0xd6, 0xd3, 0xc0, 0xdd, 0xda, 0xc7, 0xe6, 0xe3, 0xd0, 0xd1, 0xce, 0xba,
+ 0xec, 0xe9, 0xd8, 0xef, 0xed, 0xe0, 0xf7, 0xf7, 0xeb, 0xf9, 0xf9, 0xee,
+ 0xff, 0xff, 0xfe, 0xbe, 0xbb, 0xbc, 0x38, 0x2e, 0x36, 0x28, 0x1d, 0x23,
+ 0x33, 0x2a, 0x27, 0x30, 0x27, 0x20, 0x2b, 0x22, 0x1d, 0x28, 0x20, 0x1f,
+ 0x20, 0x21, 0x21, 0x10, 0x15, 0x19, 0x13, 0x1c, 0x26, 0x19, 0x26, 0x35,
+ 0x17, 0x28, 0x38, 0x0e, 0x1d, 0x2a, 0x11, 0x16, 0x22, 0x23, 0x23, 0x2c,
+ 0x33, 0x2e, 0x2f, 0x3a, 0x33, 0x37, 0x4e, 0x46, 0x49, 0x48, 0x3f, 0x3c,
+ 0x95, 0x8d, 0x81, 0xcc, 0xc7, 0xb4, 0xc1, 0xbe, 0xab, 0xc9, 0xc6, 0xb5,
+ 0xc1, 0xbf, 0xb0, 0xc5, 0xc3, 0xb4, 0xcb, 0xc9, 0xbc, 0xce, 0xcd, 0xc0,
+ 0xcc, 0xcc, 0xbf, 0xbd, 0xbe, 0xb0, 0xb9, 0xba, 0xac, 0xb2, 0xb3, 0xa4,
+ 0xb9, 0xbc, 0xac, 0xc0, 0xc2, 0xb3, 0xc3, 0xc2, 0xb5, 0xcd, 0xcc, 0xbf,
+ 0xc3, 0xc2, 0xb6, 0xc7, 0xc5, 0xb9, 0xbb, 0xbb, 0xaf, 0xb4, 0xb3, 0xa8,
+ 0xb6, 0xb4, 0xaa, 0xae, 0xac, 0xa0, 0xab, 0xa8, 0x9d, 0xaa, 0xa4, 0xa2,
+ 0x77, 0x6e, 0x75, 0x3b, 0x2f, 0x3a, 0x30, 0x23, 0x28, 0x2f, 0x21, 0x20,
+ 0x2b, 0x25, 0x26, 0x1c, 0x2f, 0x41, 0x2c, 0x5b, 0x87, 0x2d, 0x6f, 0xa8,
+ 0x26, 0x60, 0x95, 0x0d, 0x32, 0x59, 0x03, 0x17, 0x2d, 0x09, 0x17, 0x22,
+ 0x0d, 0x17, 0x21, 0x17, 0x25, 0x32, 0x16, 0x27, 0x38, 0x0c, 0x1e, 0x2f,
+ 0x08, 0x18, 0x27, 0x0b, 0x16, 0x24, 0x0c, 0x15, 0x22, 0x0b, 0x15, 0x21,
+ 0x0c, 0x14, 0x21, 0x0b, 0x13, 0x1e, 0x0c, 0x13, 0x1e, 0x0c, 0x12, 0x1d,
+ 0x0c, 0x10, 0x19, 0x0a, 0x0d, 0x14, 0x08, 0x0b, 0x10, 0x09, 0x0c, 0x11,
+ 0x07, 0x0b, 0x0e, 0x06, 0x0b, 0x0e, 0x0c, 0x13, 0x17, 0x0e, 0x17, 0x1e,
+ 0x0e, 0x18, 0x20, 0x0c, 0x18, 0x24, 0x0d, 0x1b, 0x2b, 0x10, 0x21, 0x30,
+ 0x0e, 0x23, 0x32, 0x10, 0x25, 0x38, 0x11, 0x26, 0x3f, 0x0f, 0x28, 0x45,
+ 0x0f, 0x2f, 0x50, 0x19, 0x3b, 0x5e, 0x21, 0x43, 0x68, 0x18, 0x38, 0x5e,
+ 0x0f, 0x23, 0x3f, 0x0b, 0x19, 0x2a, 0x0e, 0x18, 0x1f, 0x0f, 0x18, 0x19,
+ 0x0d, 0x15, 0x1a, 0x0e, 0x14, 0x1d, 0x0e, 0x12, 0x1a, 0x0e, 0x12, 0x16,
+ 0x11, 0x12, 0x17, 0x0e, 0x13, 0x16, 0x0a, 0x0e, 0x0a, 0x1d, 0x1d, 0x22,
+ 0x84, 0x89, 0x9b, 0x76, 0x88, 0x94, 0xad, 0xba, 0xc7, 0x77, 0x71, 0x92,
+ 0x6a, 0x5a, 0x67, 0x71, 0x68, 0x6d, 0x77, 0x71, 0x80, 0x5c, 0x58, 0x65,
+ 0x70, 0x6c, 0x5d, 0x7d, 0x79, 0x60, 0x84, 0x80, 0x73, 0x83, 0x84, 0x76,
+ 0x8e, 0x91, 0x80, 0xcf, 0xd1, 0xc8, 0xc3, 0xc2, 0xc3, 0x7f, 0x7e, 0x83,
+ 0x82, 0x82, 0x81, 0x81, 0x82, 0x7c, 0x87, 0x88, 0x82, 0xb5, 0xb6, 0xb1,
+ 0xac, 0xb2, 0xac, 0xac, 0xb3, 0xac, 0xb7, 0xbd, 0xba, 0xe3, 0xe6, 0xea,
+ 0xb9, 0xb9, 0xc1, 0x89, 0x88, 0x90, 0x7d, 0x7b, 0x80, 0x81, 0x7d, 0x7d,
+ 0x87, 0x85, 0x87, 0x84, 0x82, 0x8f, 0x56, 0x51, 0x65, 0x32, 0x28, 0x38,
+ 0x2d, 0x22, 0x25, 0x29, 0x20, 0x1b, 0x2a, 0x24, 0x20, 0x28, 0x24, 0x25,
+ 0x12, 0x11, 0x14, 0x0a, 0x0b, 0x0d, 0x0a, 0x0e, 0x0d, 0x0f, 0x12, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x25, 0x24, 0x27, 0x40, 0x45, 0x4a, 0x41, 0x4d, 0x4f,
+ 0x38, 0x43, 0x4b, 0x27, 0x31, 0x3a, 0x35, 0x3e, 0x47, 0x27, 0x2f, 0x37,
+ 0x1c, 0x20, 0x26, 0x29, 0x2d, 0x30, 0x31, 0x32, 0x34, 0x1d, 0x1d, 0x1d,
+ 0x29, 0x29, 0x24, 0x53, 0x55, 0x54, 0x5b, 0x5f, 0x5d, 0x56, 0x5f, 0x59,
+ 0x47, 0x60, 0x61, 0x30, 0x5d, 0x6a, 0x34, 0x65, 0x75, 0x4d, 0x7a, 0x81,
+ 0x3e, 0x6e, 0x80, 0x5d, 0x7b, 0x90, 0x92, 0x92, 0x93, 0xa1, 0x98, 0x83,
+ 0x9b, 0x9c, 0x88, 0x91, 0x98, 0x91, 0x5b, 0x7c, 0x7f, 0x39, 0x79, 0x88,
+ 0x6c, 0x87, 0x9c, 0x95, 0x96, 0x97, 0xa0, 0x9d, 0x96, 0x87, 0x99, 0xa2,
+ 0x49, 0x73, 0x89, 0x50, 0x77, 0x8b, 0x84, 0x9a, 0xa2, 0x8b, 0x96, 0x98,
+ 0x76, 0x87, 0x8f, 0x83, 0x9b, 0xa8, 0x91, 0xa7, 0xac, 0xa0, 0xa7, 0xa1,
+ 0xa6, 0xa6, 0xa0, 0x98, 0xa0, 0xa3, 0x99, 0xa5, 0xaa, 0xa6, 0xab, 0xaa,
+ 0x9a, 0xa3, 0xac, 0x88, 0x97, 0xae, 0x77, 0x90, 0xa2, 0x6a, 0x8e, 0x98,
+ 0x62, 0x8d, 0xa4, 0x5d, 0x8d, 0xb1, 0x44, 0x79, 0xa1, 0x3d, 0x74, 0x9f,
+ 0x5f, 0x83, 0x97, 0x8b, 0x94, 0x9f, 0x9c, 0x99, 0x9c, 0x93, 0x9b, 0xa0,
+ 0x70, 0x7f, 0x87, 0x8e, 0x8d, 0x84, 0xf7, 0xd8, 0xbb, 0xff, 0xcd, 0xab,
+ 0xe6, 0xb3, 0x84, 0xdd, 0xa2, 0x7d, 0xd8, 0xa0, 0x7e, 0xd0, 0xa2, 0x7b,
+ 0xce, 0xa1, 0x75, 0xd1, 0x9f, 0x6f, 0xd4, 0xa0, 0x76, 0xcc, 0x9f, 0x77,
+ 0xc6, 0x9b, 0x6f, 0xbc, 0x94, 0x6d, 0xbb, 0x94, 0x75, 0xbe, 0x97, 0x7a,
+ 0xc6, 0x9b, 0x7d, 0xce, 0xa2, 0x85, 0xcc, 0xa6, 0x8d, 0xc3, 0xa0, 0x8e,
+ 0xc6, 0xb3, 0xa8, 0xe0, 0xd9, 0xd4, 0xe8, 0xee, 0xf0, 0xe7, 0xf1, 0xf6,
+ 0xeb, 0xf3, 0xf5, 0xef, 0xf2, 0xf3, 0xee, 0xf2, 0xf5, 0xea, 0xf1, 0xf7,
+ 0xe9, 0xf1, 0xf8, 0xea, 0xf0, 0xf4, 0xe7, 0xeb, 0xec, 0xe4, 0xea, 0xea,
+ 0xe4, 0xee, 0xef, 0xe6, 0xf0, 0xf2, 0xe7, 0xf1, 0xf3, 0xe9, 0xf1, 0xf4,
+ 0x16, 0x18, 0x15, 0x16, 0x17, 0x15, 0x15, 0x15, 0x13, 0x17, 0x17, 0x15,
+ 0x16, 0x16, 0x16, 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x0e, 0x0e, 0x0e,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0b, 0x09, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0e, 0x0e, 0x0e,
+ 0x0a, 0x0a, 0x0a, 0x03, 0x05, 0x04, 0x05, 0x07, 0x06, 0x09, 0x0b, 0x0a,
+ 0x18, 0x1a, 0x19, 0x34, 0x36, 0x33, 0x42, 0x44, 0x41, 0x33, 0x33, 0x31,
+ 0x21, 0x21, 0x1f, 0x1b, 0x1c, 0x17, 0x1c, 0x1d, 0x18, 0x24, 0x25, 0x21,
+ 0x29, 0x2a, 0x29, 0x2d, 0x2d, 0x2d, 0x22, 0x22, 0x22, 0x0d, 0x0d, 0x0c,
+ 0x0c, 0x0b, 0x09, 0x10, 0x0f, 0x0d, 0x10, 0x0f, 0x0b, 0x18, 0x17, 0x12,
+ 0x2d, 0x26, 0x20, 0x34, 0x29, 0x27, 0x32, 0x26, 0x26, 0x2f, 0x26, 0x23,
+ 0x28, 0x23, 0x19, 0x9c, 0x9a, 0x8b, 0xff, 0xff, 0xf1, 0xf0, 0xeb, 0xd7,
+ 0xe3, 0xdf, 0xc6, 0xe0, 0xdc, 0xc5, 0xe2, 0xdf, 0xcd, 0xf8, 0xf5, 0xe5,
+ 0xd8, 0xd4, 0xc7, 0xe7, 0xe5, 0xd8, 0xcd, 0xcb, 0xbf, 0xd0, 0xce, 0xc1,
+ 0xdc, 0xd7, 0xc4, 0xf4, 0xef, 0xdb, 0xe5, 0xe0, 0xcc, 0xdb, 0xd6, 0xc2,
+ 0xf0, 0xec, 0xdb, 0xf6, 0xf3, 0xe5, 0xfa, 0xf8, 0xed, 0xfa, 0xf9, 0xf0,
+ 0xff, 0xff, 0xfd, 0xe7, 0xe4, 0xe2, 0x4d, 0x47, 0x47, 0x2c, 0x23, 0x26,
+ 0x3c, 0x31, 0x36, 0x2e, 0x24, 0x27, 0x2b, 0x20, 0x24, 0x2b, 0x21, 0x22,
+ 0x2a, 0x29, 0x2b, 0x1a, 0x1b, 0x22, 0x14, 0x1d, 0x28, 0x14, 0x22, 0x31,
+ 0x15, 0x25, 0x35, 0x13, 0x1f, 0x2d, 0x17, 0x1a, 0x27, 0x2e, 0x2a, 0x35,
+ 0x39, 0x33, 0x3b, 0x40, 0x39, 0x40, 0x42, 0x3b, 0x3e, 0x6f, 0x68, 0x62,
+ 0xd2, 0xcc, 0xbe, 0xc3, 0xc1, 0xae, 0xbe, 0xbd, 0xab, 0xcb, 0xcc, 0xbc,
+ 0xc8, 0xc6, 0xb7, 0xc3, 0xc2, 0xb5, 0xcf, 0xcd, 0xc0, 0xcf, 0xce, 0xc0,
+ 0xc7, 0xc8, 0xba, 0xc9, 0xcb, 0xbc, 0xcd, 0xce, 0xbf, 0xc6, 0xc7, 0xb8,
+ 0xb9, 0xbb, 0xb0, 0xc1, 0xc3, 0xb7, 0xcc, 0xcc, 0xc0, 0xcd, 0xcd, 0xc1,
+ 0xd3, 0xd3, 0xc7, 0xd7, 0xd7, 0xcd, 0xd5, 0xd5, 0xcd, 0xb7, 0xb7, 0xaf,
+ 0xba, 0xba, 0xb0, 0xb4, 0xb4, 0xa7, 0xaf, 0xad, 0x9f, 0xa7, 0xa3, 0x9a,
+ 0x92, 0x8a, 0x89, 0x46, 0x38, 0x3e, 0x31, 0x22, 0x27, 0x2d, 0x1e, 0x1f,
+ 0x2d, 0x29, 0x26, 0x1e, 0x22, 0x2d, 0x2f, 0x49, 0x67, 0x2d, 0x5c, 0x7f,
+ 0x09, 0x30, 0x51, 0x07, 0x18, 0x35, 0x0d, 0x16, 0x26, 0x0a, 0x18, 0x1e,
+ 0x0d, 0x13, 0x18, 0x0c, 0x14, 0x1d, 0x0d, 0x19, 0x25, 0x0b, 0x19, 0x26,
+ 0x0c, 0x18, 0x24, 0x0c, 0x14, 0x1f, 0x0c, 0x14, 0x1f, 0x0b, 0x14, 0x1f,
+ 0x0a, 0x14, 0x20, 0x0a, 0x13, 0x1e, 0x0b, 0x13, 0x1e, 0x0a, 0x11, 0x1b,
+ 0x0c, 0x10, 0x19, 0x0c, 0x0e, 0x15, 0x0a, 0x0b, 0x10, 0x09, 0x0b, 0x0f,
+ 0x08, 0x0c, 0x0f, 0x06, 0x0a, 0x0d, 0x0d, 0x12, 0x16, 0x0e, 0x15, 0x1d,
+ 0x0d, 0x17, 0x1f, 0x0b, 0x18, 0x21, 0x0c, 0x1a, 0x25, 0x11, 0x1f, 0x2c,
+ 0x0f, 0x21, 0x2e, 0x11, 0x21, 0x31, 0x12, 0x22, 0x38, 0x10, 0x24, 0x3e,
+ 0x0f, 0x27, 0x44, 0x11, 0x2c, 0x4a, 0x14, 0x2d, 0x4b, 0x10, 0x28, 0x47,
+ 0x09, 0x1b, 0x2e, 0x0b, 0x19, 0x23, 0x0d, 0x16, 0x1a, 0x0f, 0x17, 0x19,
+ 0x0e, 0x15, 0x1b, 0x0d, 0x14, 0x1a, 0x0d, 0x13, 0x16, 0x0c, 0x11, 0x12,
+ 0x10, 0x11, 0x16, 0x0d, 0x11, 0x15, 0x07, 0x0c, 0x07, 0x37, 0x3b, 0x40,
+ 0x95, 0x9e, 0xb0, 0x5a, 0x6c, 0x7b, 0xa9, 0xb7, 0xca, 0x70, 0x6f, 0x94,
+ 0x58, 0x4c, 0x5a, 0x5e, 0x58, 0x58, 0xae, 0xab, 0xc3, 0x71, 0x6c, 0x8f,
+ 0x6b, 0x6a, 0x66, 0x7d, 0x7e, 0x63, 0x7d, 0x7b, 0x6e, 0x86, 0x83, 0x7a,
+ 0x86, 0x87, 0x79, 0x98, 0x99, 0x8c, 0xd9, 0xdb, 0xd2, 0xb4, 0xb6, 0xb2,
+ 0x88, 0x8a, 0x87, 0x84, 0x86, 0x83, 0x85, 0x86, 0x80, 0x83, 0x84, 0x7c,
+ 0x80, 0x84, 0x79, 0xad, 0xb3, 0xa7, 0xa2, 0xa7, 0x9d, 0xc7, 0xcc, 0xc6,
+ 0xd4, 0xd8, 0xd9, 0xd0, 0xd1, 0xd8, 0xa9, 0xa8, 0xb5, 0x82, 0x80, 0x8d,
+ 0x8c, 0x8a, 0x8c, 0x86, 0x86, 0x8f, 0x5d, 0x5b, 0x6e, 0x38, 0x33, 0x45,
+ 0x2c, 0x23, 0x2c, 0x2d, 0x22, 0x24, 0x2f, 0x23, 0x23, 0x37, 0x2b, 0x2d,
+ 0x1a, 0x18, 0x1b, 0x0f, 0x0f, 0x0f, 0x0b, 0x0d, 0x0c, 0x12, 0x13, 0x11,
+ 0x0e, 0x0e, 0x0d, 0x2b, 0x2d, 0x2f, 0x3f, 0x44, 0x49, 0x3c, 0x47, 0x4c,
+ 0x32, 0x3b, 0x45, 0x27, 0x2f, 0x3a, 0x2f, 0x36, 0x40, 0x20, 0x25, 0x2b,
+ 0x1a, 0x1e, 0x21, 0x1f, 0x21, 0x20, 0x1d, 0x1f, 0x1a, 0x20, 0x22, 0x1c,
+ 0x38, 0x42, 0x3a, 0x4d, 0x57, 0x4f, 0x58, 0x5e, 0x5b, 0x5a, 0x66, 0x6c,
+ 0x3b, 0x5c, 0x69, 0x33, 0x63, 0x71, 0x4a, 0x72, 0x75, 0x77, 0x92, 0x8c,
+ 0x4e, 0x74, 0x85, 0x57, 0x7e, 0x89, 0x7f, 0x9c, 0x97, 0x82, 0x97, 0x89,
+ 0x84, 0x94, 0x8e, 0x8f, 0x96, 0x98, 0x67, 0x79, 0x87, 0x4b, 0x74, 0x91,
+ 0x7b, 0x93, 0x9c, 0x92, 0x9b, 0x99, 0x82, 0x93, 0x96, 0x5a, 0x80, 0x96,
+ 0x4c, 0x78, 0x93, 0x74, 0x8d, 0x98, 0x98, 0xa0, 0xa0, 0x94, 0x9c, 0x9f,
+ 0x6a, 0x8a, 0x9c, 0x5c, 0x84, 0x9b, 0x65, 0x8e, 0xa2, 0x80, 0x9d, 0xa7,
+ 0x9b, 0xa9, 0xac, 0xa0, 0xa6, 0xa8, 0x9d, 0xa4, 0xa6, 0x9b, 0xa3, 0xa3,
+ 0x83, 0x92, 0x9d, 0x5a, 0x79, 0x9e, 0x46, 0x79, 0xa0, 0x54, 0x8a, 0xa1,
+ 0x67, 0x90, 0xa5, 0x76, 0x94, 0xaa, 0x6c, 0x8c, 0xa4, 0x66, 0x8d, 0xad,
+ 0x68, 0x8c, 0xa2, 0x8a, 0x95, 0x99, 0x9e, 0x9d, 0x9f, 0x73, 0x88, 0x9b,
+ 0x3f, 0x6f, 0x8d, 0x3b, 0x64, 0x7d, 0x91, 0x91, 0x95, 0xdc, 0xb8, 0x9f,
+ 0xdf, 0xb2, 0x80, 0xdc, 0xa4, 0x7c, 0xdb, 0xa0, 0x7e, 0xcf, 0x9d, 0x78,
+ 0xcd, 0xa0, 0x76, 0xd3, 0xa2, 0x77, 0xd6, 0xa4, 0x7d, 0xd1, 0xa8, 0x82,
+ 0xcc, 0xab, 0x81, 0xcb, 0xa8, 0x85, 0xce, 0xa8, 0x8c, 0xd3, 0xa9, 0x90,
+ 0xd5, 0xa9, 0x90, 0xcc, 0xa6, 0x8f, 0xbe, 0x9f, 0x8f, 0xc1, 0xaa, 0xa0,
+ 0xd6, 0xd4, 0xd3, 0xe4, 0xeb, 0xed, 0xe8, 0xf3, 0xf7, 0xe9, 0xf5, 0xf8,
+ 0xec, 0xf3, 0xf5, 0xee, 0xf2, 0xf2, 0xee, 0xf2, 0xf4, 0xeb, 0xf1, 0xf7,
+ 0xe9, 0xf0, 0xfa, 0xe6, 0xea, 0xef, 0xdb, 0xdd, 0xdc, 0xd6, 0xdb, 0xd7,
+ 0xdd, 0xe6, 0xe3, 0xe4, 0xee, 0xee, 0xe7, 0xf1, 0xf5, 0xe9, 0xf0, 0xf8,
+ 0x14, 0x16, 0x13, 0x15, 0x17, 0x14, 0x15, 0x15, 0x13, 0x16, 0x16, 0x14,
+ 0x15, 0x15, 0x15, 0x13, 0x13, 0x13, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07,
+ 0x08, 0x06, 0x07, 0x0a, 0x08, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x07, 0x08, 0x07, 0x06, 0x06, 0x06, 0x05, 0x06, 0x05,
+ 0x04, 0x08, 0x05, 0x10, 0x13, 0x10, 0x2a, 0x2c, 0x29, 0x3f, 0x3f, 0x3d,
+ 0x3a, 0x3a, 0x38, 0x28, 0x29, 0x27, 0x1e, 0x20, 0x1d, 0x21, 0x23, 0x20,
+ 0x27, 0x27, 0x27, 0x2c, 0x2c, 0x2c, 0x27, 0x27, 0x27, 0x0f, 0x0f, 0x0f,
+ 0x0c, 0x0c, 0x0a, 0x12, 0x11, 0x0f, 0x16, 0x12, 0x0f, 0x1e, 0x1b, 0x16,
+ 0x29, 0x22, 0x1d, 0x2e, 0x25, 0x23, 0x3b, 0x31, 0x31, 0x40, 0x39, 0x34,
+ 0x40, 0x3c, 0x2d, 0xd8, 0xd7, 0xc1, 0xff, 0xff, 0xef, 0xe8, 0xe6, 0xd1,
+ 0xd9, 0xd7, 0xc0, 0xeb, 0xe9, 0xd6, 0xf9, 0xf6, 0xe7, 0xfc, 0xf8, 0xec,
+ 0xf0, 0xec, 0xe1, 0xf8, 0xf4, 0xe9, 0xe0, 0xde, 0xd0, 0xd1, 0xcf, 0xc0,
+ 0xdc, 0xd7, 0xc2, 0xf5, 0xf0, 0xda, 0xee, 0xe9, 0xd3, 0xe6, 0xe1, 0xcd,
+ 0xf1, 0xec, 0xda, 0xf7, 0xf3, 0xe5, 0xfa, 0xf7, 0xec, 0xfc, 0xf9, 0xf0,
+ 0xff, 0xfe, 0xfa, 0xe4, 0xe3, 0xde, 0x69, 0x68, 0x62, 0x5f, 0x5b, 0x5c,
+ 0x56, 0x51, 0x59, 0x3f, 0x36, 0x42, 0x2f, 0x28, 0x2f, 0x26, 0x1e, 0x21,
+ 0x25, 0x20, 0x23, 0x1c, 0x1a, 0x21, 0x15, 0x1c, 0x25, 0x13, 0x21, 0x2d,
+ 0x16, 0x26, 0x33, 0x17, 0x23, 0x2f, 0x23, 0x25, 0x30, 0x4e, 0x48, 0x54,
+ 0x47, 0x41, 0x4f, 0x6e, 0x69, 0x73, 0x4c, 0x47, 0x46, 0xad, 0xa9, 0x9e,
+ 0xd9, 0xd6, 0xc3, 0xc2, 0xc1, 0xad, 0xb9, 0xba, 0xa8, 0xc1, 0xc3, 0xb4,
+ 0xca, 0xca, 0xbc, 0xc3, 0xc4, 0xb6, 0xc7, 0xc8, 0xba, 0xc4, 0xc5, 0xb7,
+ 0xba, 0xbb, 0xad, 0xc4, 0xc5, 0xb6, 0xc5, 0xc6, 0xb6, 0xc9, 0xca, 0xba,
+ 0xbb, 0xbc, 0xb3, 0xcc, 0xce, 0xc4, 0xcc, 0xce, 0xc1, 0xc7, 0xc8, 0xbb,
+ 0xc7, 0xc7, 0xbb, 0xc4, 0xc4, 0xb9, 0xde, 0xde, 0xd6, 0xbe, 0xbd, 0xb8,
+ 0xb9, 0xb9, 0xb0, 0xb9, 0xb7, 0xaa, 0xb1, 0xb0, 0x9e, 0xa7, 0xa4, 0x95,
+ 0x9f, 0x97, 0x91, 0x46, 0x3a, 0x3c, 0x2f, 0x1e, 0x24, 0x33, 0x20, 0x24,
+ 0x2d, 0x26, 0x24, 0x27, 0x26, 0x2b, 0x27, 0x35, 0x43, 0x12, 0x2c, 0x3e,
+ 0x06, 0x1b, 0x2c, 0x0e, 0x18, 0x26, 0x0f, 0x17, 0x21, 0x0b, 0x17, 0x1d,
+ 0x0d, 0x12, 0x14, 0x0b, 0x12, 0x19, 0x0d, 0x17, 0x21, 0x0e, 0x18, 0x22,
+ 0x0b, 0x15, 0x1f, 0x0b, 0x13, 0x1c, 0x0e, 0x16, 0x20, 0x0d, 0x16, 0x21,
+ 0x0b, 0x15, 0x21, 0x0c, 0x15, 0x20, 0x0a, 0x12, 0x1d, 0x09, 0x10, 0x1a,
+ 0x0a, 0x0e, 0x17, 0x0a, 0x0d, 0x14, 0x0b, 0x0c, 0x11, 0x0b, 0x0a, 0x10,
+ 0x05, 0x07, 0x0b, 0x07, 0x0a, 0x0d, 0x0e, 0x13, 0x17, 0x0d, 0x14, 0x1d,
+ 0x0d, 0x16, 0x20, 0x0d, 0x19, 0x22, 0x0c, 0x1a, 0x23, 0x0f, 0x1d, 0x27,
+ 0x0f, 0x1f, 0x2b, 0x11, 0x1f, 0x30, 0x12, 0x20, 0x33, 0x10, 0x21, 0x38,
+ 0x0f, 0x23, 0x3b, 0x13, 0x28, 0x40, 0x10, 0x25, 0x3d, 0x0d, 0x20, 0x36,
+ 0x0c, 0x1a, 0x24, 0x0c, 0x16, 0x1c, 0x0d, 0x14, 0x1a, 0x0e, 0x15, 0x1b,
+ 0x0c, 0x13, 0x19, 0x0b, 0x13, 0x18, 0x0c, 0x14, 0x16, 0x0c, 0x12, 0x12,
+ 0x0f, 0x10, 0x15, 0x0d, 0x10, 0x14, 0x02, 0x07, 0x04, 0x48, 0x4f, 0x55,
+ 0x9a, 0xa5, 0xb9, 0x73, 0x83, 0x95, 0xac, 0xb9, 0xd0, 0x77, 0x7a, 0xa2,
+ 0x63, 0x5a, 0x70, 0x64, 0x5f, 0x64, 0xb6, 0xb3, 0xc4, 0x91, 0x8e, 0xad,
+ 0x68, 0x69, 0x6f, 0x87, 0x88, 0x75, 0x82, 0x80, 0x71, 0x7e, 0x79, 0x75,
+ 0x83, 0x7f, 0x76, 0x84, 0x82, 0x75, 0x96, 0x98, 0x8a, 0xd2, 0xd7, 0xce,
+ 0xaf, 0xb2, 0xaf, 0x8e, 0x90, 0x8f, 0x92, 0x92, 0x8f, 0x85, 0x84, 0x7d,
+ 0x80, 0x82, 0x7c, 0x9a, 0x9d, 0x97, 0xa0, 0xa3, 0x9c, 0x9a, 0x9d, 0x94,
+ 0x8f, 0x94, 0x8c, 0xd8, 0xdc, 0xdd, 0xcc, 0xcf, 0xd9, 0x7a, 0x7c, 0x89,
+ 0x86, 0x85, 0x82, 0x7d, 0x7d, 0x83, 0x81, 0x84, 0x95, 0x61, 0x67, 0x7a,
+ 0x3d, 0x3f, 0x4e, 0x2e, 0x2a, 0x33, 0x2f, 0x27, 0x2f, 0x37, 0x2e, 0x37,
+ 0x1d, 0x1c, 0x21, 0x10, 0x11, 0x12, 0x0f, 0x10, 0x0f, 0x12, 0x12, 0x10,
+ 0x0d, 0x0d, 0x0a, 0x2d, 0x31, 0x32, 0x3e, 0x44, 0x48, 0x39, 0x42, 0x47,
+ 0x26, 0x2d, 0x35, 0x23, 0x29, 0x31, 0x28, 0x2e, 0x34, 0x19, 0x1d, 0x20,
+ 0x1b, 0x1f, 0x1f, 0x19, 0x1b, 0x18, 0x14, 0x16, 0x12, 0x29, 0x2d, 0x26,
+ 0x3e, 0x51, 0x4b, 0x4e, 0x5f, 0x50, 0x58, 0x69, 0x62, 0x41, 0x5e, 0x6e,
+ 0x3c, 0x62, 0x78, 0x5a, 0x7c, 0x83, 0x6e, 0x86, 0x85, 0x68, 0x7c, 0x85,
+ 0x51, 0x73, 0x82, 0x6e, 0x8f, 0x93, 0x72, 0x90, 0x90, 0x53, 0x7a, 0x89,
+ 0x58, 0x7d, 0x93, 0x87, 0x99, 0x9a, 0x88, 0x90, 0x8d, 0x66, 0x81, 0x94,
+ 0x5a, 0x87, 0x97, 0x5c, 0x85, 0x94, 0x53, 0x7c, 0x8b, 0x50, 0x7b, 0x8c,
+ 0x78, 0x99, 0xa8, 0x89, 0xa0, 0xa8, 0x7a, 0x96, 0xa4, 0x6e, 0x94, 0xae,
+ 0x69, 0x95, 0xaf, 0x58, 0x85, 0x9f, 0x43, 0x71, 0x8d, 0x4c, 0x7b, 0x96,
+ 0x69, 0x8c, 0xa2, 0x8d, 0x9e, 0xab, 0xa3, 0xa6, 0xaa, 0xa5, 0xa4, 0xa1,
+ 0x77, 0x8c, 0x9b, 0x54, 0x7c, 0x99, 0x70, 0x99, 0xb2, 0x9b, 0xae, 0xbc,
+ 0xab, 0xac, 0xb6, 0xa5, 0xac, 0xac, 0x9e, 0xa7, 0xa1, 0xa7, 0xab, 0xad,
+ 0x9e, 0xaa, 0xb3, 0x9c, 0xa2, 0x9f, 0x8d, 0x99, 0xa2, 0x4d, 0x76, 0x9a,
+ 0x27, 0x6d, 0x9b, 0x27, 0x6c, 0x9d, 0x41, 0x67, 0x8b, 0x7d, 0x83, 0x88,
+ 0xa6, 0x8e, 0x73, 0xb2, 0x8c, 0x6c, 0xb7, 0x89, 0x63, 0xb6, 0x8c, 0x60,
+ 0xb8, 0x91, 0x67, 0xc4, 0x99, 0x71, 0xcb, 0xa0, 0x7b, 0xca, 0xa7, 0x7d,
+ 0xc9, 0xa8, 0x83, 0xcc, 0xa8, 0x88, 0xcc, 0xa3, 0x89, 0xcd, 0xa2, 0x8b,
+ 0xc5, 0x9f, 0x8a, 0xb1, 0x96, 0x85, 0xb3, 0xa2, 0x9a, 0xd8, 0xd1, 0xce,
+ 0xe5, 0xec, 0xf0, 0xe7, 0xf1, 0xf6, 0xe9, 0xf4, 0xf7, 0xea, 0xf4, 0xf6,
+ 0xee, 0xf3, 0xf3, 0xee, 0xf2, 0xf3, 0xec, 0xf1, 0xf4, 0xe9, 0xf1, 0xf7,
+ 0xe7, 0xea, 0xf5, 0xd7, 0xd8, 0xdc, 0xc4, 0xc5, 0xbe, 0xc6, 0xca, 0xbc,
+ 0xd3, 0xda, 0xcf, 0xdd, 0xe6, 0xe1, 0xe3, 0xeb, 0xed, 0xe7, 0xee, 0xf4,
+ 0x16, 0x18, 0x15, 0x16, 0x18, 0x15, 0x17, 0x17, 0x15, 0x15, 0x15, 0x13,
+ 0x13, 0x13, 0x13, 0x0f, 0x0f, 0x0f, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x07, 0x05, 0x06, 0x08, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x06, 0x08, 0x05, 0x03, 0x06, 0x03, 0x09, 0x0b, 0x08, 0x20, 0x22, 0x21,
+ 0x37, 0x39, 0x38, 0x3e, 0x40, 0x3f, 0x36, 0x38, 0x37, 0x29, 0x2d, 0x2c,
+ 0x2a, 0x2a, 0x2a, 0x2b, 0x2d, 0x2c, 0x28, 0x2a, 0x29, 0x14, 0x14, 0x14,
+ 0x0d, 0x0d, 0x0b, 0x15, 0x13, 0x11, 0x19, 0x15, 0x12, 0x22, 0x1d, 0x19,
+ 0x25, 0x1e, 0x18, 0x3d, 0x36, 0x34, 0x66, 0x61, 0x5f, 0x65, 0x61, 0x59,
+ 0x64, 0x61, 0x4e, 0xec, 0xea, 0xd0, 0xfa, 0xf8, 0xe1, 0xee, 0xed, 0xda,
+ 0xec, 0xe9, 0xd8, 0xf1, 0xee, 0xdf, 0xfd, 0xfa, 0xed, 0xfd, 0xf9, 0xed,
+ 0xfc, 0xf8, 0xec, 0xf0, 0xed, 0xde, 0xea, 0xe7, 0xd4, 0xef, 0xed, 0xd8,
+ 0xee, 0xea, 0xd1, 0xec, 0xe8, 0xce, 0xe9, 0xe5, 0xcc, 0xdb, 0xd7, 0xc1,
+ 0xe7, 0xe2, 0xd0, 0xf2, 0xef, 0xde, 0xf3, 0xf1, 0xe4, 0xfb, 0xf8, 0xee,
+ 0xff, 0xff, 0xf7, 0xd4, 0xd5, 0xcb, 0x7b, 0x7e, 0x75, 0x87, 0x89, 0x88,
+ 0x83, 0x83, 0x8b, 0x72, 0x70, 0x7b, 0x65, 0x62, 0x69, 0x4a, 0x48, 0x4b,
+ 0x2d, 0x2b, 0x2b, 0x16, 0x15, 0x18, 0x11, 0x16, 0x1d, 0x11, 0x1c, 0x23,
+ 0x11, 0x20, 0x27, 0x1b, 0x27, 0x2e, 0x3b, 0x3c, 0x46, 0x77, 0x72, 0x7b,
+ 0x67, 0x63, 0x74, 0x86, 0x83, 0x8d, 0x5c, 0x58, 0x53, 0xd6, 0xd3, 0xc4,
+ 0xd5, 0xd4, 0xc0, 0xc5, 0xc5, 0xb0, 0xbe, 0xbf, 0xaf, 0xbf, 0xc1, 0xb3,
+ 0xc8, 0xc9, 0xbb, 0xc4, 0xc5, 0xb6, 0xbf, 0xc0, 0xb3, 0xb8, 0xb9, 0xab,
+ 0xb9, 0xba, 0xac, 0xba, 0xbb, 0xac, 0xbd, 0xbe, 0xad, 0xc2, 0xc4, 0xb2,
+ 0xc0, 0xc2, 0xb5, 0xc9, 0xcb, 0xbf, 0xca, 0xcc, 0xbe, 0xc6, 0xc8, 0xba,
+ 0xbb, 0xbc, 0xaf, 0xba, 0xbb, 0xad, 0xc9, 0xc9, 0xbd, 0xbc, 0xbc, 0xb2,
+ 0xb3, 0xaf, 0xa6, 0xb3, 0xaf, 0xa1, 0xa9, 0xa6, 0x92, 0xab, 0xa6, 0x95,
+ 0xa2, 0x9a, 0x92, 0x3f, 0x34, 0x36, 0x29, 0x18, 0x21, 0x30, 0x1e, 0x26,
+ 0x2c, 0x22, 0x22, 0x22, 0x24, 0x25, 0x19, 0x23, 0x27, 0x19, 0x22, 0x2b,
+ 0x13, 0x19, 0x25, 0x0e, 0x18, 0x21, 0x0d, 0x18, 0x20, 0x0f, 0x15, 0x1f,
+ 0x0e, 0x11, 0x16, 0x0d, 0x13, 0x1b, 0x0f, 0x19, 0x23, 0x0d, 0x17, 0x21,
+ 0x0c, 0x16, 0x1f, 0x0c, 0x15, 0x1e, 0x0d, 0x17, 0x21, 0x0d, 0x16, 0x22,
+ 0x0c, 0x16, 0x20, 0x0c, 0x16, 0x20, 0x09, 0x12, 0x1b, 0x0a, 0x11, 0x19,
+ 0x0b, 0x10, 0x17, 0x0a, 0x0d, 0x13, 0x0b, 0x0c, 0x11, 0x0b, 0x0a, 0x0f,
+ 0x08, 0x09, 0x0d, 0x0a, 0x0e, 0x10, 0x11, 0x14, 0x1b, 0x0d, 0x14, 0x1c,
+ 0x0c, 0x15, 0x1e, 0x0b, 0x16, 0x1f, 0x0b, 0x18, 0x20, 0x0e, 0x1e, 0x25,
+ 0x0f, 0x1f, 0x2d, 0x0f, 0x1d, 0x2e, 0x13, 0x20, 0x32, 0x11, 0x20, 0x35,
+ 0x0f, 0x21, 0x37, 0x10, 0x25, 0x38, 0x11, 0x24, 0x37, 0x0f, 0x1e, 0x2f,
+ 0x0c, 0x19, 0x1f, 0x0d, 0x16, 0x1c, 0x0d, 0x13, 0x1c, 0x0e, 0x14, 0x1c,
+ 0x0b, 0x12, 0x19, 0x0a, 0x11, 0x18, 0x0c, 0x13, 0x17, 0x0c, 0x11, 0x14,
+ 0x0c, 0x0f, 0x13, 0x0b, 0x0d, 0x10, 0x04, 0x08, 0x07, 0x4d, 0x56, 0x5b,
+ 0x96, 0xa0, 0xb4, 0x77, 0x80, 0x92, 0xa6, 0xaf, 0xc1, 0x99, 0x9e, 0xc0,
+ 0x6a, 0x64, 0x84, 0x5d, 0x58, 0x68, 0x9f, 0x9d, 0x9e, 0xb1, 0xb0, 0xb8,
+ 0x75, 0x73, 0x81, 0x78, 0x78, 0x6e, 0x83, 0x7f, 0x6b, 0x89, 0x81, 0x7e,
+ 0x8d, 0x87, 0x82, 0x89, 0x87, 0x7b, 0x7d, 0x7f, 0x70, 0x9a, 0x9d, 0x92,
+ 0xbe, 0xc1, 0xbd, 0x9b, 0x9c, 0x9e, 0xb3, 0xb3, 0xb3, 0xbc, 0xbb, 0xb8,
+ 0xb6, 0xb7, 0xbc, 0x8f, 0x90, 0x94, 0x7a, 0x7c, 0x7c, 0x83, 0x85, 0x7e,
+ 0x94, 0x97, 0x8c, 0xc9, 0xcc, 0xc3, 0x99, 0x9e, 0x9d, 0x7d, 0x7f, 0x84,
+ 0x85, 0x84, 0x7f, 0x92, 0x95, 0x97, 0x96, 0xa1, 0xaf, 0x89, 0x99, 0xab,
+ 0x7e, 0x8c, 0xa0, 0x64, 0x6d, 0x7e, 0x43, 0x48, 0x59, 0x34, 0x38, 0x48,
+ 0x23, 0x23, 0x2a, 0x11, 0x10, 0x15, 0x14, 0x14, 0x16, 0x13, 0x13, 0x11,
+ 0x0f, 0x11, 0x0e, 0x2f, 0x34, 0x34, 0x38, 0x3e, 0x40, 0x33, 0x39, 0x3f,
+ 0x1d, 0x23, 0x26, 0x1d, 0x22, 0x25, 0x1f, 0x23, 0x24, 0x19, 0x1a, 0x1c,
+ 0x1b, 0x1d, 0x1c, 0x16, 0x19, 0x17, 0x16, 0x19, 0x18, 0x32, 0x36, 0x35,
+ 0x3b, 0x4a, 0x49, 0x51, 0x5f, 0x52, 0x5f, 0x71, 0x69, 0x3e, 0x63, 0x70,
+ 0x3c, 0x6c, 0x82, 0x4d, 0x7a, 0x89, 0x51, 0x76, 0x87, 0x4e, 0x6d, 0x8a,
+ 0x6b, 0x83, 0x90, 0x7a, 0x8f, 0x95, 0x62, 0x78, 0x85, 0x58, 0x7e, 0x9c,
+ 0x44, 0x7b, 0x98, 0x6c, 0x91, 0x8e, 0x97, 0xa3, 0x93, 0x8e, 0x98, 0x9e,
+ 0x76, 0x8a, 0x95, 0x69, 0x83, 0x8f, 0x6d, 0x84, 0x8e, 0x82, 0x95, 0x9a,
+ 0x8b, 0xa3, 0xa9, 0x69, 0x8f, 0xa1, 0x55, 0x86, 0x9d, 0x58, 0x85, 0x9a,
+ 0x70, 0x8d, 0x9e, 0x6e, 0x8c, 0x9e, 0x68, 0x89, 0x9c, 0x64, 0x83, 0x98,
+ 0x70, 0x85, 0x98, 0x8c, 0x95, 0x9f, 0xa4, 0xa3, 0xa4, 0xa6, 0xa3, 0xa1,
+ 0x85, 0x9c, 0xa9, 0x62, 0x83, 0x9c, 0x80, 0x9e, 0xb1, 0x94, 0xa8, 0xb7,
+ 0x8e, 0xa1, 0xba, 0x7f, 0x9c, 0xb0, 0x8c, 0xa1, 0xa6, 0xa4, 0xa4, 0xa5,
+ 0xa7, 0xa7, 0xa7, 0x8e, 0xa0, 0xa2, 0x59, 0x81, 0x9f, 0x3c, 0x78, 0xac,
+ 0x24, 0x6e, 0xa0, 0x25, 0x6e, 0xa3, 0x30, 0x6b, 0xa1, 0x3d, 0x69, 0x8e,
+ 0x6f, 0x6e, 0x7d, 0x82, 0x6d, 0x67, 0x8d, 0x6d, 0x4d, 0x96, 0x75, 0x49,
+ 0x9d, 0x7c, 0x57, 0xa9, 0x81, 0x64, 0xae, 0x85, 0x67, 0xae, 0x8c, 0x64,
+ 0xb1, 0x8d, 0x6c, 0xb1, 0x8a, 0x6f, 0xb2, 0x87, 0x70, 0xac, 0x85, 0x72,
+ 0x9e, 0x82, 0x74, 0x99, 0x8c, 0x82, 0xc9, 0xca, 0xc8, 0xe4, 0xee, 0xef,
+ 0xec, 0xf1, 0xf4, 0xed, 0xf2, 0xf4, 0xed, 0xf3, 0xf3, 0xed, 0xf3, 0xf3,
+ 0xee, 0xf2, 0xf2, 0xee, 0xf1, 0xf4, 0xeb, 0xf0, 0xf6, 0xe6, 0xec, 0xf7,
+ 0xd7, 0xd8, 0xe0, 0xc0, 0xbe, 0xbc, 0xb4, 0xb2, 0xa5, 0xb8, 0xba, 0xa5,
+ 0xc7, 0xcc, 0xb8, 0xd3, 0xdb, 0xce, 0xda, 0xe4, 0xdf, 0xe1, 0xe9, 0xeb,
+ 0x17, 0x19, 0x16, 0x14, 0x16, 0x13, 0x13, 0x14, 0x11, 0x12, 0x12, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x06, 0x07,
+ 0x05, 0x07, 0x06, 0x04, 0x06, 0x05, 0x06, 0x06, 0x06, 0x0a, 0x0a, 0x0a,
+ 0x16, 0x17, 0x16, 0x2d, 0x2f, 0x2e, 0x41, 0x43, 0x41, 0x3e, 0x42, 0x41,
+ 0x36, 0x37, 0x37, 0x2e, 0x30, 0x2f, 0x26, 0x28, 0x27, 0x18, 0x1a, 0x19,
+ 0x11, 0x12, 0x10, 0x15, 0x13, 0x11, 0x1b, 0x17, 0x15, 0x22, 0x1d, 0x19,
+ 0x20, 0x19, 0x14, 0x4b, 0x46, 0x43, 0x4b, 0x48, 0x44, 0x5f, 0x5c, 0x51,
+ 0x86, 0x82, 0x6b, 0xf7, 0xf4, 0xd8, 0xef, 0xed, 0xd6, 0xf1, 0xf0, 0xe1,
+ 0xf8, 0xf6, 0xe7, 0xfa, 0xf8, 0xe8, 0xf8, 0xf5, 0xe6, 0xf8, 0xf5, 0xe4,
+ 0xf5, 0xf2, 0xdf, 0xef, 0xea, 0xd6, 0xf6, 0xf2, 0xda, 0xf6, 0xf1, 0xd9,
+ 0xdc, 0xd7, 0xc1, 0xde, 0xda, 0xc1, 0xcb, 0xc7, 0xb0, 0xcf, 0xcb, 0xb4,
+ 0xce, 0xcc, 0xb7, 0xe5, 0xe2, 0xd1, 0xf2, 0xf0, 0xe2, 0xf8, 0xf7, 0xeb,
+ 0xfd, 0xfe, 0xf0, 0xc1, 0xc2, 0xb7, 0x7d, 0x80, 0x79, 0x85, 0x8a, 0x89,
+ 0x84, 0x89, 0x8c, 0x80, 0x84, 0x87, 0x82, 0x83, 0x87, 0x74, 0x74, 0x76,
+ 0x52, 0x52, 0x51, 0x20, 0x21, 0x20, 0x0f, 0x12, 0x15, 0x12, 0x19, 0x1f,
+ 0x11, 0x1d, 0x23, 0x22, 0x2c, 0x31, 0x5c, 0x5f, 0x66, 0x7a, 0x78, 0x7f,
+ 0x6e, 0x6c, 0x7a, 0x7d, 0x7a, 0x80, 0x73, 0x72, 0x6b, 0xea, 0xe8, 0xd8,
+ 0xd6, 0xd5, 0xc1, 0xc9, 0xc8, 0xb6, 0xc6, 0xc7, 0xb7, 0xc6, 0xc8, 0xb8,
+ 0xc6, 0xc7, 0xb7, 0xbe, 0xbf, 0xaf, 0xc6, 0xc7, 0xb9, 0xc4, 0xc5, 0xb7,
+ 0xc0, 0xc1, 0xb3, 0xbd, 0xbe, 0xaf, 0xbe, 0xbf, 0xaf, 0xc7, 0xc8, 0xb7,
+ 0xc5, 0xc5, 0xb7, 0xc2, 0xc3, 0xb5, 0xbd, 0xbf, 0xb1, 0xc1, 0xc3, 0xb5,
+ 0xbc, 0xbe, 0xb0, 0xbb, 0xbc, 0xae, 0xb9, 0xb9, 0xab, 0xbb, 0xb9, 0xac,
+ 0xb5, 0xb1, 0xa6, 0xb0, 0xad, 0x9e, 0xa6, 0xa3, 0x8f, 0xae, 0xab, 0x9c,
+ 0xa0, 0x99, 0x93, 0x42, 0x39, 0x3e, 0x2f, 0x24, 0x2d, 0x2c, 0x20, 0x28,
+ 0x2a, 0x20, 0x23, 0x20, 0x24, 0x22, 0x22, 0x2b, 0x2b, 0x29, 0x2c, 0x33,
+ 0x1f, 0x22, 0x2b, 0x0d, 0x19, 0x21, 0x0c, 0x1a, 0x23, 0x0f, 0x16, 0x1f,
+ 0x0b, 0x10, 0x15, 0x0b, 0x14, 0x1b, 0x0c, 0x17, 0x20, 0x0d, 0x17, 0x21,
+ 0x0c, 0x15, 0x1e, 0x0c, 0x15, 0x1d, 0x0d, 0x17, 0x21, 0x0a, 0x15, 0x21,
+ 0x0b, 0x15, 0x1f, 0x0c, 0x16, 0x1e, 0x0a, 0x12, 0x1a, 0x0a, 0x10, 0x18,
+ 0x0d, 0x12, 0x18, 0x0b, 0x0e, 0x12, 0x09, 0x0a, 0x0e, 0x0a, 0x0b, 0x0f,
+ 0x09, 0x0a, 0x0c, 0x09, 0x0d, 0x10, 0x0e, 0x12, 0x19, 0x0c, 0x13, 0x1c,
+ 0x0d, 0x16, 0x1f, 0x0c, 0x18, 0x21, 0x0c, 0x1a, 0x23, 0x0d, 0x1b, 0x23,
+ 0x0b, 0x1b, 0x27, 0x0f, 0x1c, 0x2c, 0x12, 0x1f, 0x31, 0x13, 0x22, 0x35,
+ 0x11, 0x22, 0x36, 0x11, 0x24, 0x35, 0x12, 0x23, 0x33, 0x0e, 0x1e, 0x2c,
+ 0x0d, 0x18, 0x1f, 0x0f, 0x17, 0x1e, 0x10, 0x13, 0x1d, 0x0f, 0x14, 0x1c,
+ 0x0d, 0x14, 0x1a, 0x0a, 0x11, 0x17, 0x0b, 0x10, 0x16, 0x0d, 0x10, 0x15,
+ 0x08, 0x0c, 0x0d, 0x08, 0x08, 0x0a, 0x06, 0x09, 0x08, 0x4e, 0x57, 0x5c,
+ 0x73, 0x7a, 0x8d, 0x55, 0x57, 0x66, 0x7d, 0x80, 0x88, 0xb5, 0xb9, 0xce,
+ 0x88, 0x85, 0xa9, 0x5a, 0x54, 0x6b, 0x77, 0x71, 0x6c, 0x9e, 0x9a, 0x93,
+ 0x88, 0x82, 0x8f, 0x64, 0x61, 0x5e, 0x93, 0x8e, 0x7a, 0x90, 0x86, 0x83,
+ 0x8a, 0x86, 0x7f, 0x8b, 0x89, 0x81, 0x80, 0x80, 0x76, 0x7f, 0x80, 0x75,
+ 0x85, 0x85, 0x7f, 0xaa, 0xac, 0xa7, 0xb3, 0xb5, 0xb2, 0xc1, 0xc3, 0xc2,
+ 0xc3, 0xc6, 0xcd, 0xbb, 0xbb, 0xc4, 0x85, 0x85, 0x8d, 0x82, 0x83, 0x82,
+ 0x86, 0x87, 0x7c, 0x81, 0x83, 0x76, 0x7f, 0x80, 0x78, 0x85, 0x86, 0x84,
+ 0x86, 0x87, 0x82, 0x9f, 0xa6, 0xa7, 0x99, 0xa9, 0xb4, 0x8c, 0xa1, 0xb2,
+ 0x8f, 0xa3, 0xb8, 0x8c, 0x9c, 0xb1, 0x74, 0x83, 0x96, 0x4b, 0x58, 0x6b,
+ 0x28, 0x2c, 0x37, 0x12, 0x11, 0x1a, 0x1b, 0x19, 0x1e, 0x16, 0x16, 0x16,
+ 0x12, 0x17, 0x13, 0x2c, 0x32, 0x30, 0x33, 0x39, 0x3b, 0x2e, 0x31, 0x36,
+ 0x1b, 0x21, 0x1f, 0x22, 0x26, 0x25, 0x1d, 0x1f, 0x1e, 0x16, 0x18, 0x17,
+ 0x18, 0x1a, 0x19, 0x13, 0x17, 0x18, 0x21, 0x25, 0x28, 0x3c, 0x40, 0x44,
+ 0x4b, 0x50, 0x58, 0x5c, 0x64, 0x66, 0x74, 0x7c, 0x79, 0x76, 0x86, 0x85,
+ 0x61, 0x84, 0x8c, 0x4f, 0x7d, 0x8d, 0x5c, 0x82, 0x90, 0x75, 0x88, 0x93,
+ 0x7b, 0x8a, 0x97, 0x56, 0x7d, 0x89, 0x4e, 0x7c, 0x87, 0x60, 0x85, 0x95,
+ 0x5f, 0x81, 0x94, 0x77, 0x8e, 0x94, 0x9d, 0xa3, 0xa0, 0x9c, 0x9f, 0xa4,
+ 0x87, 0x95, 0x9e, 0x78, 0x89, 0x94, 0x8a, 0x92, 0x99, 0x9a, 0xa0, 0xa3,
+ 0x71, 0x88, 0x99, 0x55, 0x80, 0xa1, 0x79, 0x9a, 0xaf, 0x9a, 0xa2, 0xa3,
+ 0x9c, 0xa3, 0xa4, 0x97, 0xa5, 0xab, 0x8d, 0xa0, 0xa7, 0x90, 0x99, 0x9f,
+ 0x95, 0x99, 0x9f, 0x89, 0x94, 0x9e, 0x6e, 0x86, 0x99, 0x69, 0x88, 0x9e,
+ 0x78, 0x8f, 0xa1, 0x79, 0x91, 0xae, 0x7a, 0x9d, 0xb6, 0x64, 0x97, 0xad,
+ 0x53, 0x8c, 0xb0, 0x57, 0x87, 0xae, 0x7d, 0x97, 0xad, 0x9b, 0xa1, 0xab,
+ 0x86, 0x94, 0x9c, 0x53, 0x7e, 0x99, 0x2f, 0x74, 0xa7, 0x2b, 0x76, 0xaf,
+ 0x2a, 0x6f, 0xa1, 0x29, 0x69, 0x9b, 0x27, 0x65, 0x9b, 0x29, 0x64, 0x95,
+ 0x4e, 0x63, 0x90, 0x61, 0x5c, 0x73, 0x68, 0x52, 0x49, 0x70, 0x54, 0x3b,
+ 0x73, 0x55, 0x41, 0x7a, 0x55, 0x48, 0x7b, 0x57, 0x45, 0x7e, 0x5f, 0x43,
+ 0x81, 0x62, 0x4e, 0x81, 0x61, 0x50, 0x84, 0x64, 0x54, 0x78, 0x5f, 0x54,
+ 0x77, 0x6d, 0x65, 0xb6, 0xb9, 0xb4, 0xe1, 0xec, 0xeb, 0xe6, 0xf5, 0xf5,
+ 0xef, 0xf1, 0xf3, 0xf0, 0xf1, 0xf1, 0xef, 0xf1, 0xf1, 0xee, 0xf2, 0xf1,
+ 0xed, 0xf1, 0xf3, 0xec, 0xf0, 0xf7, 0xe8, 0xec, 0xf5, 0xd6, 0xda, 0xe5,
+ 0xc2, 0xc0, 0xc4, 0xb1, 0xac, 0xa5, 0xaf, 0xa9, 0x97, 0xb3, 0xb1, 0x97,
+ 0xbc, 0xbf, 0xa6, 0xca, 0xd1, 0xbf, 0xd5, 0xdd, 0xd3, 0xdc, 0xe2, 0xdf,
+ 0x13, 0x15, 0x12, 0x11, 0x13, 0x10, 0x0d, 0x0e, 0x0b, 0x0c, 0x0c, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x08, 0x08, 0x07,
+ 0x08, 0x08, 0x06, 0x0d, 0x0f, 0x0d, 0x21, 0x23, 0x20, 0x39, 0x3d, 0x3a,
+ 0x43, 0x44, 0x43, 0x3b, 0x3d, 0x3c, 0x2c, 0x2e, 0x2d, 0x1a, 0x1c, 0x1b,
+ 0x15, 0x15, 0x13, 0x13, 0x12, 0x10, 0x1d, 0x17, 0x14, 0x22, 0x1a, 0x17,
+ 0x1f, 0x16, 0x12, 0x2e, 0x29, 0x26, 0x4a, 0x49, 0x45, 0x5d, 0x5c, 0x4f,
+ 0x89, 0x86, 0x6d, 0xff, 0xff, 0xe1, 0xf5, 0xf2, 0xdd, 0xf8, 0xf8, 0xeb,
+ 0xfa, 0xf8, 0xe5, 0xef, 0xed, 0xd8, 0xed, 0xea, 0xd5, 0xf0, 0xec, 0xd6,
+ 0xf0, 0xec, 0xd3, 0xea, 0xe6, 0xcd, 0xf4, 0xee, 0xd6, 0xe5, 0xde, 0xc7,
+ 0xc9, 0xc6, 0xaf, 0xe5, 0xe3, 0xcc, 0xd5, 0xd2, 0xbb, 0xd9, 0xd7, 0xc0,
+ 0xce, 0xcc, 0xb6, 0xde, 0xdc, 0xcb, 0xf2, 0xf3, 0xe4, 0xf7, 0xf8, 0xea,
+ 0xfe, 0xfc, 0xe9, 0x91, 0x8e, 0x83, 0x63, 0x63, 0x61, 0x7c, 0x80, 0x80,
+ 0x86, 0x8c, 0x88, 0x80, 0x87, 0x80, 0x78, 0x7c, 0x79, 0x6d, 0x6e, 0x70,
+ 0x5a, 0x5d, 0x5d, 0x34, 0x36, 0x37, 0x12, 0x13, 0x16, 0x11, 0x14, 0x1b,
+ 0x14, 0x1a, 0x21, 0x26, 0x2d, 0x35, 0x60, 0x65, 0x6b, 0x78, 0x7b, 0x82,
+ 0x70, 0x70, 0x7a, 0x8a, 0x8a, 0x8d, 0x8c, 0x8c, 0x82, 0xf4, 0xf2, 0xe3,
+ 0xda, 0xd8, 0xc7, 0xce, 0xcc, 0xbc, 0xd0, 0xce, 0xbf, 0xc3, 0xc3, 0xb1,
+ 0xc2, 0xc5, 0xb2, 0xbf, 0xc2, 0xb0, 0xca, 0xcb, 0xbb, 0xcf, 0xcf, 0xc1,
+ 0xc9, 0xca, 0xbc, 0xc2, 0xc3, 0xb5, 0xc0, 0xc1, 0xb3, 0xc0, 0xbf, 0xb0,
+ 0xc9, 0xc8, 0xb8, 0xc0, 0xc1, 0xb3, 0xb7, 0xb7, 0xab, 0xb7, 0xb9, 0xae,
+ 0xbc, 0xbc, 0xb2, 0xb6, 0xb6, 0xaa, 0xbb, 0xba, 0xab, 0xba, 0xb8, 0xa8,
+ 0xb9, 0xb6, 0xa9, 0xb0, 0xad, 0x9d, 0xa8, 0xa7, 0x94, 0xaa, 0xaa, 0x9c,
+ 0xa0, 0x9f, 0x9d, 0x79, 0x78, 0x7f, 0x55, 0x52, 0x5c, 0x31, 0x2e, 0x36,
+ 0x31, 0x29, 0x2b, 0x2a, 0x27, 0x27, 0x1c, 0x20, 0x21, 0x18, 0x20, 0x25,
+ 0x17, 0x20, 0x2b, 0x0c, 0x17, 0x24, 0x0d, 0x17, 0x22, 0x0f, 0x18, 0x20,
+ 0x09, 0x10, 0x16, 0x0b, 0x14, 0x1b, 0x0c, 0x16, 0x1f, 0x0b, 0x15, 0x1e,
+ 0x0c, 0x15, 0x1c, 0x0d, 0x14, 0x1c, 0x0d, 0x16, 0x1f, 0x0b, 0x15, 0x1f,
+ 0x0c, 0x16, 0x1e, 0x0c, 0x15, 0x1c, 0x0a, 0x11, 0x19, 0x0a, 0x11, 0x16,
+ 0x0a, 0x0f, 0x13, 0x09, 0x0d, 0x10, 0x07, 0x0a, 0x0b, 0x08, 0x0b, 0x0c,
+ 0x08, 0x0a, 0x0b, 0x09, 0x0c, 0x0f, 0x0c, 0x11, 0x18, 0x0b, 0x12, 0x1c,
+ 0x0c, 0x16, 0x21, 0x0a, 0x16, 0x22, 0x0b, 0x19, 0x22, 0x0d, 0x1b, 0x24,
+ 0x0e, 0x1c, 0x26, 0x10, 0x1c, 0x2a, 0x11, 0x1d, 0x2d, 0x12, 0x1f, 0x30,
+ 0x0f, 0x1f, 0x2f, 0x11, 0x23, 0x31, 0x0f, 0x1f, 0x2c, 0x0b, 0x1a, 0x24,
+ 0x0b, 0x15, 0x1b, 0x0d, 0x13, 0x1b, 0x10, 0x15, 0x1b, 0x0f, 0x14, 0x18,
+ 0x0d, 0x15, 0x17, 0x0c, 0x14, 0x15, 0x0f, 0x12, 0x17, 0x0c, 0x0c, 0x13,
+ 0x04, 0x09, 0x06, 0x07, 0x08, 0x09, 0x0f, 0x11, 0x10, 0x59, 0x62, 0x69,
+ 0x3e, 0x43, 0x55, 0x36, 0x30, 0x3c, 0x57, 0x53, 0x52, 0xa1, 0xa4, 0xab,
+ 0xa8, 0xa9, 0xc6, 0x70, 0x6a, 0x82, 0x69, 0x5e, 0x62, 0x6a, 0x5f, 0x5b,
+ 0x70, 0x65, 0x6c, 0x5f, 0x57, 0x56, 0x77, 0x70, 0x61, 0x7f, 0x77, 0x6f,
+ 0x7d, 0x7d, 0x71, 0x8c, 0x89, 0x82, 0x8d, 0x8a, 0x85, 0x84, 0x81, 0x78,
+ 0x7d, 0x7b, 0x6e, 0xb2, 0xb4, 0xa6, 0xba, 0xc0, 0xb8, 0x9a, 0xa1, 0xa0,
+ 0xa0, 0xa6, 0xa4, 0xd1, 0xd4, 0xd9, 0xbc, 0xbc, 0xc6, 0x82, 0x81, 0x87,
+ 0x79, 0x78, 0x75, 0x7d, 0x7a, 0x71, 0x89, 0x86, 0x7e, 0x82, 0x80, 0x7d,
+ 0x90, 0x92, 0x93, 0x9d, 0xa7, 0xab, 0x98, 0xa8, 0xb2, 0x92, 0xa5, 0xb5,
+ 0x8d, 0xa0, 0xb1, 0x88, 0x99, 0xab, 0x7c, 0x8c, 0x9c, 0x69, 0x79, 0x87,
+ 0x2e, 0x37, 0x44, 0x0d, 0x11, 0x1c, 0x1a, 0x19, 0x1f, 0x13, 0x13, 0x15,
+ 0x16, 0x1a, 0x19, 0x2f, 0x35, 0x33, 0x2c, 0x31, 0x33, 0x25, 0x27, 0x2c,
+ 0x18, 0x1d, 0x1d, 0x20, 0x24, 0x25, 0x1c, 0x1f, 0x1e, 0x16, 0x18, 0x17,
+ 0x17, 0x19, 0x18, 0x15, 0x19, 0x1a, 0x2b, 0x30, 0x33, 0x43, 0x4b, 0x4c,
+ 0x5a, 0x61, 0x67, 0x6c, 0x72, 0x7e, 0x82, 0x85, 0x8b, 0x99, 0x9b, 0x95,
+ 0x96, 0x9f, 0x99, 0x88, 0x99, 0x9a, 0x97, 0xa1, 0xa0, 0x91, 0x91, 0x88,
+ 0x5c, 0x75, 0x83, 0x49, 0x78, 0x8c, 0x5b, 0x85, 0x92, 0x7a, 0x8c, 0x96,
+ 0x8c, 0x92, 0xa0, 0x91, 0x98, 0xa2, 0x88, 0x98, 0x99, 0x70, 0x92, 0x95,
+ 0x50, 0x82, 0x9d, 0x5d, 0x84, 0x99, 0x8d, 0x9f, 0xa5, 0x9e, 0xa3, 0xa1,
+ 0x82, 0x92, 0x9e, 0x58, 0x7b, 0x97, 0x65, 0x87, 0xa2, 0x85, 0x99, 0xa9,
+ 0x87, 0x9a, 0xa2, 0x79, 0x92, 0x9d, 0x82, 0x95, 0x9d, 0x96, 0x9c, 0x9c,
+ 0x93, 0x9d, 0xa2, 0x5c, 0x7b, 0x94, 0x4d, 0x7d, 0x9e, 0x5e, 0x8c, 0xa9,
+ 0x6c, 0x87, 0x99, 0x71, 0x8b, 0xa9, 0x83, 0xa1, 0xb6, 0x83, 0xa0, 0xa7,
+ 0x83, 0x99, 0xa2, 0x8a, 0x9a, 0xa8, 0x97, 0xa4, 0xb0, 0x8a, 0x97, 0xa6,
+ 0x4f, 0x79, 0x97, 0x29, 0x6d, 0x9f, 0x1f, 0x72, 0xac, 0x25, 0x72, 0xa6,
+ 0x2a, 0x6b, 0xa1, 0x29, 0x68, 0x9d, 0x23, 0x62, 0x95, 0x27, 0x64, 0x97,
+ 0x37, 0x66, 0x92, 0x63, 0x74, 0x99, 0x54, 0x4c, 0x61, 0x4b, 0x3b, 0x40,
+ 0x4d, 0x3d, 0x39, 0x4d, 0x3a, 0x36, 0x4d, 0x3a, 0x34, 0x4c, 0x3e, 0x36,
+ 0x49, 0x3d, 0x39, 0x49, 0x3b, 0x38, 0x47, 0x3b, 0x37, 0x4f, 0x4c, 0x48,
+ 0x9f, 0xa7, 0xa4, 0xe0, 0xea, 0xea, 0xe8, 0xf3, 0xf3, 0xec, 0xf3, 0xf3,
+ 0xef, 0xf3, 0xf6, 0xee, 0xf2, 0xf3, 0xef, 0xf1, 0xf2, 0xed, 0xf1, 0xf3,
+ 0xec, 0xf0, 0xf7, 0xe9, 0xed, 0xf7, 0xda, 0xdc, 0xe7, 0xc3, 0xc3, 0xcd,
+ 0xb5, 0xaf, 0xaf, 0xab, 0xa5, 0x9b, 0xae, 0xa6, 0x92, 0xb0, 0xaa, 0x8f,
+ 0xb6, 0xb6, 0x9c, 0xc2, 0xc6, 0xb2, 0xce, 0xd4, 0xc8, 0xd8, 0xdd, 0xd6,
+ 0x12, 0x13, 0x11, 0x10, 0x11, 0x0f, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x0e,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x09, 0x09, 0x07, 0x09, 0x08, 0x09, 0x0a, 0x09, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x07, 0x09, 0x09, 0x07,
+ 0x0b, 0x0b, 0x09, 0x07, 0x09, 0x06, 0x09, 0x0b, 0x06, 0x16, 0x1a, 0x15,
+ 0x30, 0x31, 0x31, 0x43, 0x45, 0x45, 0x3f, 0x40, 0x40, 0x26, 0x28, 0x27,
+ 0x16, 0x16, 0x15, 0x13, 0x11, 0x10, 0x1d, 0x17, 0x15, 0x22, 0x19, 0x16,
+ 0x1f, 0x16, 0x11, 0x30, 0x2b, 0x28, 0x70, 0x6f, 0x6b, 0x3c, 0x3a, 0x2d,
+ 0x56, 0x52, 0x39, 0xfa, 0xf5, 0xd8, 0xfc, 0xfa, 0xe7, 0xfd, 0xfc, 0xf1,
+ 0xf5, 0xf3, 0xde, 0xd5, 0xd3, 0xba, 0xde, 0xdc, 0xc1, 0xe3, 0xdf, 0xc3,
+ 0xdd, 0xd9, 0xbc, 0xda, 0xd5, 0xbb, 0xed, 0xe6, 0xd2, 0xef, 0xe7, 0xd6,
+ 0xd7, 0xd4, 0xbf, 0xd4, 0xd2, 0xbc, 0xd0, 0xce, 0xb8, 0xce, 0xcd, 0xb7,
+ 0xd8, 0xd6, 0xc0, 0xed, 0xec, 0xda, 0xf6, 0xf7, 0xe7, 0xff, 0xff, 0xf2,
+ 0xd4, 0xcd, 0xba, 0x78, 0x71, 0x68, 0x6a, 0x68, 0x69, 0x5f, 0x60, 0x61,
+ 0x68, 0x6d, 0x67, 0x71, 0x77, 0x6b, 0x76, 0x78, 0x72, 0x68, 0x69, 0x6a,
+ 0x51, 0x57, 0x57, 0x34, 0x38, 0x3a, 0x13, 0x15, 0x19, 0x0e, 0x0f, 0x16,
+ 0x0e, 0x12, 0x1a, 0x23, 0x2a, 0x32, 0x5c, 0x62, 0x6a, 0x7b, 0x80, 0x88,
+ 0x78, 0x7a, 0x80, 0x62, 0x63, 0x63, 0x86, 0x85, 0x7a, 0xf7, 0xf5, 0xe6,
+ 0xe9, 0xe6, 0xd8, 0xd4, 0xd1, 0xc1, 0xcd, 0xca, 0xb9, 0xc5, 0xc4, 0xb0,
+ 0xc9, 0xcb, 0xb6, 0xc0, 0xc3, 0xb0, 0xbc, 0xbe, 0xad, 0xca, 0xcb, 0xbb,
+ 0xcf, 0xd0, 0xc2, 0xc6, 0xc7, 0xb8, 0xbb, 0xba, 0xac, 0xbd, 0xbc, 0xae,
+ 0xcb, 0xca, 0xb8, 0xd0, 0xce, 0xc0, 0xbe, 0xbd, 0xb6, 0xbe, 0xbd, 0xb9,
+ 0xba, 0xb9, 0xb4, 0xb2, 0xb2, 0xa8, 0xb5, 0xb3, 0xa6, 0xbb, 0xb8, 0xa8,
+ 0xb6, 0xb4, 0xa6, 0xb3, 0xb2, 0xa0, 0xa8, 0xab, 0x99, 0x9c, 0x9f, 0x93,
+ 0x96, 0x9b, 0x99, 0x93, 0x97, 0x9e, 0x88, 0x8c, 0x97, 0x66, 0x69, 0x71,
+ 0x44, 0x40, 0x41, 0x28, 0x1f, 0x22, 0x18, 0x18, 0x1c, 0x13, 0x1f, 0x25,
+ 0x0b, 0x1b, 0x24, 0x0d, 0x15, 0x24, 0x0f, 0x16, 0x24, 0x0b, 0x17, 0x1e,
+ 0x0a, 0x11, 0x15, 0x0f, 0x17, 0x1c, 0x0d, 0x16, 0x1d, 0x0b, 0x14, 0x1b,
+ 0x0e, 0x14, 0x1a, 0x0f, 0x14, 0x1b, 0x0d, 0x14, 0x1c, 0x09, 0x12, 0x1b,
+ 0x0b, 0x12, 0x1a, 0x0b, 0x12, 0x1a, 0x0a, 0x11, 0x17, 0x0b, 0x10, 0x15,
+ 0x09, 0x0e, 0x11, 0x0b, 0x10, 0x13, 0x09, 0x0d, 0x0e, 0x06, 0x09, 0x0a,
+ 0x04, 0x08, 0x07, 0x09, 0x0d, 0x0e, 0x0d, 0x11, 0x18, 0x0c, 0x13, 0x1d,
+ 0x0a, 0x14, 0x20, 0x0b, 0x17, 0x23, 0x0a, 0x19, 0x24, 0x0b, 0x1b, 0x25,
+ 0x10, 0x1a, 0x23, 0x12, 0x1b, 0x26, 0x12, 0x1d, 0x2c, 0x10, 0x1c, 0x2b,
+ 0x11, 0x21, 0x2e, 0x0f, 0x20, 0x2d, 0x10, 0x1e, 0x27, 0x0d, 0x1a, 0x23,
+ 0x0e, 0x17, 0x1d, 0x10, 0x16, 0x1c, 0x11, 0x16, 0x1b, 0x0d, 0x12, 0x15,
+ 0x0b, 0x13, 0x11, 0x0d, 0x13, 0x12, 0x0c, 0x0f, 0x12, 0x09, 0x09, 0x0e,
+ 0x06, 0x0b, 0x06, 0x09, 0x08, 0x08, 0x20, 0x23, 0x23, 0x57, 0x61, 0x68,
+ 0x2b, 0x2c, 0x40, 0x22, 0x19, 0x20, 0x38, 0x2f, 0x28, 0x65, 0x65, 0x62,
+ 0xb1, 0xb6, 0xc7, 0x96, 0x90, 0xa7, 0x66, 0x57, 0x68, 0x5e, 0x4c, 0x53,
+ 0x5f, 0x50, 0x53, 0x5e, 0x53, 0x51, 0x60, 0x57, 0x4e, 0x67, 0x5e, 0x52,
+ 0x80, 0x82, 0x71, 0x8a, 0x88, 0x80, 0x83, 0x7d, 0x79, 0x89, 0x83, 0x78,
+ 0x88, 0x86, 0x73, 0x8e, 0x92, 0x7c, 0xbc, 0xc4, 0xb8, 0xcf, 0xd7, 0xd5,
+ 0x9b, 0xa5, 0x99, 0xad, 0xb4, 0xb2, 0xd1, 0xd2, 0xd9, 0x84, 0x81, 0x89,
+ 0x78, 0x73, 0x76, 0x84, 0x7f, 0x7c, 0x86, 0x82, 0x7f, 0x86, 0x82, 0x84,
+ 0x8c, 0x8f, 0x96, 0x8f, 0x99, 0xa2, 0x95, 0xa5, 0xb0, 0x94, 0xa6, 0xb4,
+ 0x90, 0xa1, 0xb0, 0x84, 0x93, 0xa2, 0x78, 0x83, 0x90, 0x69, 0x76, 0x80,
+ 0x31, 0x3d, 0x4c, 0x0a, 0x10, 0x1c, 0x14, 0x14, 0x1b, 0x0e, 0x0f, 0x11,
+ 0x1a, 0x20, 0x1e, 0x29, 0x32, 0x2f, 0x2a, 0x2e, 0x30, 0x23, 0x22, 0x28,
+ 0x18, 0x1c, 0x20, 0x1b, 0x1e, 0x23, 0x19, 0x1a, 0x1d, 0x17, 0x18, 0x1a,
+ 0x1b, 0x1d, 0x1c, 0x1c, 0x20, 0x1f, 0x2f, 0x38, 0x37, 0x49, 0x54, 0x52,
+ 0x66, 0x74, 0x71, 0x7a, 0x83, 0x8c, 0x8c, 0x94, 0xa3, 0x99, 0xa3, 0xa8,
+ 0xa3, 0xa4, 0x9f, 0x9e, 0x96, 0x8f, 0x9c, 0x99, 0x94, 0x93, 0x9d, 0x98,
+ 0x78, 0x8c, 0x8c, 0x7d, 0x8d, 0x95, 0x93, 0x97, 0xa1, 0x8c, 0x99, 0xa4,
+ 0x6b, 0x8c, 0x9b, 0x59, 0x7e, 0x8a, 0x58, 0x7d, 0x8b, 0x59, 0x84, 0x9c,
+ 0x76, 0x92, 0x99, 0x91, 0xa3, 0xa6, 0xa4, 0xac, 0xa8, 0x9f, 0xa0, 0x96,
+ 0x97, 0x9e, 0x96, 0x7e, 0x94, 0x96, 0x62, 0x89, 0x93, 0x56, 0x85, 0x97,
+ 0x4f, 0x7d, 0x9a, 0x4e, 0x7b, 0x95, 0x6e, 0x8a, 0x98, 0x91, 0x9c, 0x9e,
+ 0x7f, 0x95, 0xa1, 0x4e, 0x77, 0x94, 0x68, 0x8f, 0xa6, 0x90, 0xa7, 0xad,
+ 0x8c, 0xa0, 0xaa, 0x61, 0x88, 0xa4, 0x5e, 0x8a, 0xa7, 0x96, 0xa8, 0xb5,
+ 0xab, 0xa6, 0xac, 0xa0, 0xa4, 0xa5, 0x92, 0xa7, 0xac, 0x69, 0x86, 0x9f,
+ 0x35, 0x74, 0xa1, 0x21, 0x6e, 0xab, 0x23, 0x74, 0xaa, 0x26, 0x70, 0x9f,
+ 0x26, 0x6b, 0xa5, 0x22, 0x6b, 0xa7, 0x22, 0x68, 0x9d, 0x28, 0x66, 0x99,
+ 0x2c, 0x71, 0x92, 0x5b, 0x84, 0xab, 0x40, 0x4a, 0x72, 0x28, 0x29, 0x43,
+ 0x27, 0x29, 0x31, 0x27, 0x29, 0x28, 0x25, 0x27, 0x29, 0x21, 0x27, 0x2c,
+ 0x21, 0x25, 0x2c, 0x25, 0x2a, 0x2e, 0x35, 0x3b, 0x3e, 0x89, 0x95, 0x98,
+ 0xd8, 0xe7, 0xe9, 0xe6, 0xf3, 0xf5, 0xed, 0xf3, 0xf3, 0xf1, 0xf2, 0xf1,
+ 0xeb, 0xf1, 0xf7, 0xed, 0xf2, 0xf5, 0xed, 0xf1, 0xf5, 0xec, 0xf0, 0xf7,
+ 0xe9, 0xf0, 0xfa, 0xe3, 0xe8, 0xf3, 0xd0, 0xd1, 0xdc, 0xbd, 0xbb, 0xc3,
+ 0xb0, 0xa9, 0xa9, 0xac, 0xa4, 0x9b, 0xad, 0xa2, 0x90, 0xae, 0xa5, 0x8e,
+ 0xb4, 0xb1, 0x9a, 0xbb, 0xbe, 0xab, 0xc9, 0xcd, 0xc0, 0xd3, 0xd9, 0xcf,
+ 0x0e, 0x0e, 0x0e, 0x09, 0x0a, 0x09, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07,
+ 0x11, 0x10, 0x12, 0x29, 0x29, 0x2b, 0x3f, 0x40, 0x42, 0x3d, 0x40, 0x41,
+ 0x2d, 0x2e, 0x30, 0x1b, 0x1b, 0x1d, 0x1a, 0x18, 0x19, 0x1d, 0x19, 0x1a,
+ 0x21, 0x17, 0x16, 0x26, 0x1c, 0x1a, 0x36, 0x2c, 0x26, 0x25, 0x1c, 0x10,
+ 0x22, 0x19, 0x09, 0xae, 0xa8, 0x8f, 0xff, 0xfe, 0xe2, 0xfa, 0xf8, 0xdb,
+ 0xf8, 0xf4, 0xe6, 0xd8, 0xd5, 0xc4, 0xe9, 0xe7, 0xd1, 0xf2, 0xf0, 0xd9,
+ 0xf0, 0xee, 0xd8, 0xed, 0xea, 0xd9, 0xfb, 0xf7, 0xec, 0xfa, 0xf5, 0xec,
+ 0xf2, 0xed, 0xd6, 0xdd, 0xd9, 0xc4, 0xda, 0xd9, 0xc7, 0xe4, 0xe5, 0xd3,
+ 0xf1, 0xf2, 0xde, 0xf2, 0xf1, 0xdd, 0xfb, 0xf8, 0xe5, 0xec, 0xe7, 0xd7,
+ 0x81, 0x81, 0x7c, 0x7c, 0x7b, 0x7c, 0x88, 0x88, 0x8a, 0x7a, 0x7b, 0x7d,
+ 0x5c, 0x5e, 0x5b, 0x4b, 0x4e, 0x48, 0x5e, 0x63, 0x5d, 0x5e, 0x63, 0x5f,
+ 0x46, 0x4b, 0x49, 0x2b, 0x2f, 0x30, 0x14, 0x17, 0x1a, 0x08, 0x0c, 0x11,
+ 0x07, 0x0c, 0x11, 0x22, 0x26, 0x2a, 0x66, 0x66, 0x6a, 0x67, 0x63, 0x68,
+ 0x5a, 0x50, 0x52, 0x34, 0x2b, 0x29, 0x5b, 0x54, 0x4c, 0xe2, 0xdd, 0xd1,
+ 0xf8, 0xf4, 0xe7, 0xd9, 0xd5, 0xc5, 0xce, 0xcd, 0xb8, 0xcb, 0xca, 0xb0,
+ 0xc6, 0xc5, 0xaf, 0xc1, 0xbf, 0xab, 0xc5, 0xc3, 0xb2, 0xc7, 0xc5, 0xb6,
+ 0xcc, 0xc9, 0xba, 0xc8, 0xc7, 0xb6, 0xa9, 0xaa, 0x96, 0xc5, 0xc7, 0xb3,
+ 0xbe, 0xc0, 0xb2, 0xd1, 0xd1, 0xc9, 0xc5, 0xc4, 0xbf, 0xd1, 0xce, 0xc9,
+ 0xca, 0xc5, 0xbf, 0xb6, 0xb2, 0xa7, 0xb7, 0xb3, 0xa8, 0xb6, 0xb2, 0xa6,
+ 0xb1, 0xac, 0x9a, 0xae, 0xaa, 0x9b, 0xa3, 0xa5, 0x9c, 0x92, 0x97, 0x93,
+ 0x8b, 0x93, 0x94, 0x8c, 0x94, 0x98, 0x8d, 0x93, 0x96, 0x81, 0x86, 0x8b,
+ 0x5f, 0x66, 0x6b, 0x29, 0x2e, 0x34, 0x12, 0x16, 0x1c, 0x16, 0x1d, 0x23,
+ 0x12, 0x1b, 0x21, 0x0f, 0x1a, 0x1f, 0x0e, 0x17, 0x1d, 0x0b, 0x13, 0x1b,
+ 0x09, 0x12, 0x19, 0x0e, 0x16, 0x1d, 0x0e, 0x17, 0x20, 0x0c, 0x15, 0x1e,
+ 0x0d, 0x15, 0x1e, 0x0f, 0x15, 0x1f, 0x0d, 0x12, 0x1b, 0x0d, 0x12, 0x1a,
+ 0x0e, 0x14, 0x1b, 0x0b, 0x10, 0x16, 0x0b, 0x10, 0x16, 0x0c, 0x11, 0x16,
+ 0x0c, 0x0f, 0x14, 0x0f, 0x10, 0x15, 0x0b, 0x0d, 0x10, 0x08, 0x09, 0x0b,
+ 0x0a, 0x0a, 0x0b, 0x0f, 0x11, 0x13, 0x0e, 0x12, 0x19, 0x0c, 0x14, 0x1d,
+ 0x0b, 0x15, 0x1f, 0x0a, 0x16, 0x21, 0x0c, 0x18, 0x24, 0x0d, 0x19, 0x25,
+ 0x12, 0x1a, 0x25, 0x12, 0x1c, 0x26, 0x10, 0x1d, 0x2a, 0x0e, 0x1e, 0x2d,
+ 0x10, 0x20, 0x2f, 0x0f, 0x1f, 0x2e, 0x0f, 0x1e, 0x2b, 0x0d, 0x19, 0x24,
+ 0x10, 0x18, 0x1f, 0x0f, 0x16, 0x1c, 0x10, 0x15, 0x19, 0x10, 0x14, 0x17,
+ 0x0f, 0x14, 0x15, 0x0c, 0x10, 0x11, 0x07, 0x0b, 0x0c, 0x06, 0x0a, 0x0b,
+ 0x09, 0x09, 0x08, 0x06, 0x09, 0x09, 0x37, 0x3f, 0x48, 0x4f, 0x56, 0x68,
+ 0x1d, 0x1c, 0x31, 0x21, 0x19, 0x20, 0x2e, 0x24, 0x21, 0x3e, 0x35, 0x33,
+ 0x7f, 0x7b, 0x7b, 0xb6, 0xb2, 0xbe, 0x6c, 0x69, 0x77, 0x58, 0x50, 0x57,
+ 0x5d, 0x4e, 0x51, 0x62, 0x50, 0x53, 0x61, 0x52, 0x50, 0x5c, 0x50, 0x44,
+ 0x66, 0x5f, 0x53, 0x7d, 0x76, 0x6b, 0x7b, 0x76, 0x6b, 0x91, 0x8f, 0x82,
+ 0x87, 0x87, 0x78, 0x7e, 0x7e, 0x70, 0x83, 0x86, 0x78, 0xab, 0xad, 0xa0,
+ 0xa0, 0xa8, 0x9a, 0xb3, 0xbb, 0xb2, 0xa2, 0xa4, 0xa2, 0x87, 0x85, 0x81,
+ 0x86, 0x82, 0x7e, 0x89, 0x88, 0x86, 0x88, 0x8f, 0x93, 0x8a, 0x95, 0x9f,
+ 0x86, 0x93, 0x9f, 0x8c, 0x9c, 0xa8, 0x92, 0xa2, 0xaf, 0x8d, 0x9d, 0xac,
+ 0x89, 0x99, 0xa8, 0x7b, 0x8b, 0x9a, 0x6b, 0x78, 0x87, 0x61, 0x6e, 0x7d,
+ 0x2b, 0x30, 0x41, 0x0d, 0x0f, 0x1a, 0x12, 0x11, 0x15, 0x0f, 0x10, 0x0f,
+ 0x21, 0x23, 0x22, 0x26, 0x2c, 0x2c, 0x23, 0x29, 0x2b, 0x1b, 0x1f, 0x22,
+ 0x18, 0x1a, 0x1f, 0x19, 0x1d, 0x20, 0x12, 0x16, 0x19, 0x15, 0x16, 0x18,
+ 0x20, 0x21, 0x23, 0x24, 0x28, 0x29, 0x36, 0x3f, 0x3e, 0x55, 0x63, 0x61,
+ 0x78, 0x85, 0x8e, 0x89, 0x98, 0xa0, 0x9b, 0xaa, 0xae, 0xac, 0xb7, 0xb8,
+ 0xb0, 0xb2, 0xb1, 0xa2, 0xa0, 0x9e, 0x97, 0x98, 0x94, 0x9e, 0xa6, 0x9e,
+ 0xa2, 0xa7, 0x9e, 0xa2, 0xa2, 0x9e, 0x9c, 0xa0, 0xa7, 0x69, 0x83, 0x97,
+ 0x47, 0x7a, 0x94, 0x49, 0x80, 0x99, 0x61, 0x87, 0x9c, 0x83, 0x94, 0xa1,
+ 0x9c, 0xa4, 0x9a, 0xa0, 0xa2, 0x9d, 0xa2, 0xa1, 0x9f, 0xa4, 0xa2, 0xa2,
+ 0xa1, 0xa2, 0x9f, 0x9f, 0xa4, 0xa0, 0x97, 0x9f, 0x9d, 0x8b, 0x94, 0x96,
+ 0x83, 0x95, 0x9c, 0x84, 0x99, 0xa1, 0x85, 0x93, 0xa1, 0x70, 0x84, 0x9c,
+ 0x56, 0x80, 0x9b, 0x55, 0x86, 0x9f, 0x5d, 0x87, 0x9b, 0x6b, 0x96, 0xa0,
+ 0x6d, 0x95, 0xad, 0x4d, 0x7d, 0xa5, 0x58, 0x85, 0xa1, 0x94, 0xa6, 0xab,
+ 0xa2, 0xa0, 0xa4, 0x93, 0xa1, 0xaa, 0x63, 0x8e, 0xa4, 0x3f, 0x7b, 0xa8,
+ 0x2c, 0x75, 0xa9, 0x2b, 0x75, 0xaa, 0x2d, 0x76, 0xad, 0x2b, 0x72, 0xab,
+ 0x26, 0x6c, 0xa6, 0x2a, 0x71, 0xab, 0x1d, 0x65, 0x9c, 0x24, 0x6c, 0xa2,
+ 0x36, 0x74, 0xa4, 0x47, 0x7e, 0xad, 0x34, 0x59, 0x87, 0x19, 0x26, 0x4b,
+ 0x19, 0x1d, 0x33, 0x17, 0x21, 0x2b, 0x15, 0x1f, 0x27, 0x1a, 0x21, 0x2d,
+ 0x1b, 0x1e, 0x30, 0x27, 0x32, 0x39, 0x88, 0x9d, 0x96, 0xce, 0xe1, 0xda,
+ 0xe4, 0xf0, 0xf0, 0xeb, 0xf1, 0xf7, 0xed, 0xf2, 0xf5, 0xed, 0xf2, 0xf2,
+ 0xec, 0xf1, 0xf5, 0xec, 0xf1, 0xf4, 0xeb, 0xf0, 0xf4, 0xe9, 0xef, 0xf5,
+ 0xe8, 0xef, 0xf7, 0xe6, 0xed, 0xf5, 0xdc, 0xe2, 0xec, 0xc9, 0xcf, 0xd9,
+ 0xb9, 0xb9, 0xc1, 0xae, 0xaa, 0xad, 0xab, 0xa3, 0x9e, 0xad, 0xa5, 0x97,
+ 0xb3, 0xad, 0x9a, 0xb9, 0xb8, 0xa5, 0xc1, 0xc6, 0xb5, 0xcc, 0xd5, 0xc4,
+ 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x07, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0d, 0x1c, 0x1e, 0x1d, 0x32, 0x34, 0x33,
+ 0x45, 0x47, 0x44, 0x3b, 0x3b, 0x39, 0x17, 0x17, 0x15, 0x1a, 0x17, 0x15,
+ 0x23, 0x19, 0x15, 0x23, 0x17, 0x14, 0x23, 0x18, 0x16, 0x28, 0x1d, 0x19,
+ 0x21, 0x16, 0x0c, 0x3a, 0x31, 0x1d, 0xbc, 0xb8, 0x97, 0xf9, 0xf6, 0xcf,
+ 0xff, 0xff, 0xe1, 0xea, 0xe9, 0xcf, 0xec, 0xe9, 0xd5, 0xfd, 0xfa, 0xeb,
+ 0xfc, 0xfa, 0xed, 0xf9, 0xf7, 0xea, 0xfc, 0xfa, 0xec, 0xf9, 0xf7, 0xe5,
+ 0xf9, 0xf3, 0xe5, 0xfa, 0xf6, 0xec, 0xf7, 0xf3, 0xe9, 0xf5, 0xf2, 0xe8,
+ 0xf2, 0xf1, 0xe2, 0xef, 0xf0, 0xde, 0xe0, 0xdf, 0xcb, 0x99, 0x98, 0x85,
+ 0x64, 0x64, 0x61, 0x6f, 0x6f, 0x70, 0x83, 0x83, 0x85, 0x87, 0x88, 0x89,
+ 0x7b, 0x7d, 0x7a, 0x5c, 0x61, 0x5b, 0x3a, 0x3f, 0x3b, 0x42, 0x47, 0x43,
+ 0x3e, 0x42, 0x40, 0x27, 0x28, 0x2a, 0x17, 0x18, 0x1c, 0x08, 0x0b, 0x10,
+ 0x04, 0x07, 0x0c, 0x21, 0x25, 0x28, 0x6e, 0x6d, 0x6f, 0x41, 0x3c, 0x3f,
+ 0x33, 0x28, 0x2f, 0x38, 0x2d, 0x2a, 0x3a, 0x33, 0x1f, 0x96, 0x91, 0x75,
+ 0xff, 0xfe, 0xe5, 0xef, 0xea, 0xd9, 0xd7, 0xd3, 0xc6, 0xd1, 0xcd, 0xc2,
+ 0xc7, 0xc6, 0xb4, 0xbf, 0xbd, 0xad, 0xc4, 0xc2, 0xb5, 0xc9, 0xc7, 0xbb,
+ 0xc9, 0xc7, 0xbd, 0xc1, 0xc1, 0xb5, 0xac, 0xaf, 0xa1, 0xb8, 0xba, 0xab,
+ 0xbd, 0xbd, 0xaf, 0xdb, 0xdb, 0xcf, 0xce, 0xcb, 0xc2, 0xcd, 0xc9, 0xbe,
+ 0xc6, 0xc3, 0xb4, 0xb7, 0xb4, 0xa3, 0xb6, 0xb5, 0xa3, 0xb6, 0xb5, 0xa5,
+ 0xbb, 0xb7, 0xac, 0xac, 0xab, 0xa3, 0x97, 0x99, 0x96, 0x8b, 0x90, 0x92,
+ 0x89, 0x90, 0x95, 0x87, 0x8e, 0x94, 0x83, 0x88, 0x8c, 0x75, 0x79, 0x7d,
+ 0x5e, 0x66, 0x69, 0x38, 0x41, 0x44, 0x14, 0x19, 0x1f, 0x13, 0x1a, 0x20,
+ 0x0f, 0x1a, 0x20, 0x0e, 0x1a, 0x1f, 0x0e, 0x16, 0x1d, 0x0a, 0x11, 0x1a,
+ 0x0b, 0x14, 0x1b, 0x0c, 0x15, 0x1d, 0x0d, 0x17, 0x20, 0x0e, 0x16, 0x21,
+ 0x0a, 0x13, 0x1d, 0x0e, 0x15, 0x1f, 0x0f, 0x16, 0x1e, 0x0e, 0x13, 0x1c,
+ 0x0d, 0x13, 0x1a, 0x0c, 0x11, 0x16, 0x0c, 0x11, 0x17, 0x0e, 0x13, 0x19,
+ 0x0c, 0x0f, 0x14, 0x0d, 0x0e, 0x12, 0x0a, 0x0b, 0x0e, 0x0a, 0x0a, 0x0d,
+ 0x0b, 0x0c, 0x0d, 0x11, 0x12, 0x15, 0x0d, 0x12, 0x18, 0x0c, 0x14, 0x1c,
+ 0x0c, 0x16, 0x20, 0x0b, 0x15, 0x1f, 0x0c, 0x16, 0x22, 0x0f, 0x19, 0x25,
+ 0x0d, 0x16, 0x1f, 0x0f, 0x19, 0x23, 0x0e, 0x1b, 0x29, 0x0d, 0x1d, 0x2c,
+ 0x0f, 0x1f, 0x2e, 0x11, 0x1f, 0x2d, 0x0f, 0x1c, 0x28, 0x0c, 0x17, 0x23,
+ 0x0f, 0x16, 0x1f, 0x10, 0x17, 0x1d, 0x11, 0x16, 0x1b, 0x10, 0x14, 0x17,
+ 0x0c, 0x10, 0x11, 0x0b, 0x0d, 0x0e, 0x08, 0x0a, 0x09, 0x06, 0x0a, 0x09,
+ 0x0d, 0x0c, 0x0d, 0x08, 0x0c, 0x0c, 0x44, 0x4d, 0x57, 0x4c, 0x52, 0x68,
+ 0x16, 0x16, 0x29, 0x1e, 0x16, 0x1d, 0x29, 0x21, 0x1f, 0x35, 0x2c, 0x2d,
+ 0x49, 0x43, 0x43, 0x9e, 0x9a, 0x9b, 0x83, 0x80, 0x87, 0x5a, 0x53, 0x5d,
+ 0x60, 0x51, 0x5a, 0x62, 0x50, 0x52, 0x5e, 0x4f, 0x4c, 0x5c, 0x4e, 0x4a,
+ 0x5b, 0x4e, 0x48, 0x5c, 0x4f, 0x49, 0x69, 0x60, 0x59, 0x7b, 0x74, 0x6c,
+ 0x83, 0x7f, 0x76, 0x7d, 0x79, 0x70, 0x7d, 0x78, 0x6f, 0x81, 0x7d, 0x73,
+ 0x7f, 0x80, 0x70, 0x85, 0x85, 0x7b, 0x7e, 0x7b, 0x76, 0x87, 0x84, 0x7e,
+ 0x7c, 0x78, 0x75, 0x91, 0x92, 0x92, 0x92, 0x9e, 0xa5, 0x8e, 0xa0, 0xac,
+ 0x8c, 0x9d, 0xaa, 0x90, 0xa0, 0xad, 0x92, 0xa2, 0xb1, 0x8a, 0x9a, 0xa9,
+ 0x7f, 0x8f, 0x9e, 0x6f, 0x7f, 0x8e, 0x64, 0x71, 0x81, 0x58, 0x65, 0x73,
+ 0x1b, 0x21, 0x2f, 0x0e, 0x0f, 0x19, 0x10, 0x0f, 0x12, 0x12, 0x12, 0x12,
+ 0x23, 0x25, 0x24, 0x26, 0x2a, 0x2d, 0x22, 0x27, 0x2a, 0x18, 0x1c, 0x1f,
+ 0x1a, 0x1c, 0x20, 0x1a, 0x1e, 0x21, 0x13, 0x17, 0x1a, 0x16, 0x17, 0x19,
+ 0x1d, 0x1e, 0x20, 0x24, 0x28, 0x29, 0x40, 0x49, 0x48, 0x62, 0x6e, 0x6d,
+ 0x88, 0x95, 0x9d, 0xa1, 0xb0, 0xb7, 0xb5, 0xc3, 0xc8, 0xc5, 0xcd, 0xd0,
+ 0xbf, 0xc0, 0xc4, 0xab, 0xaa, 0xab, 0x9c, 0x9e, 0x9a, 0x98, 0x9f, 0x98,
+ 0xa0, 0xa6, 0x9f, 0xaa, 0xab, 0xa5, 0xa1, 0xa2, 0xa2, 0x82, 0x91, 0x9b,
+ 0x62, 0x84, 0x94, 0x5d, 0x84, 0x97, 0x66, 0x84, 0x95, 0x83, 0x94, 0x9f,
+ 0x9c, 0xa1, 0x99, 0xa1, 0xa3, 0x9e, 0xa2, 0xa2, 0xa0, 0xa3, 0xa3, 0xa1,
+ 0xa7, 0xa9, 0xa6, 0xaa, 0xaf, 0xa9, 0xa7, 0xab, 0xa8, 0xa0, 0xa3, 0xa4,
+ 0x9e, 0xa8, 0xa1, 0x9e, 0xaa, 0xa0, 0x97, 0x9e, 0x9f, 0x6f, 0x82, 0x97,
+ 0x63, 0x8c, 0xa7, 0x7a, 0xa1, 0xbd, 0x80, 0xa0, 0xbb, 0x60, 0x86, 0x9e,
+ 0x58, 0x86, 0xa4, 0x61, 0x89, 0xa8, 0x7c, 0x94, 0xa6, 0x92, 0x9f, 0xa4,
+ 0x8a, 0x99, 0xa1, 0x69, 0x88, 0x9e, 0x3d, 0x74, 0x99, 0x2c, 0x72, 0xa3,
+ 0x3a, 0x83, 0xb1, 0x34, 0x7e, 0xac, 0x29, 0x73, 0xa3, 0x30, 0x7a, 0xac,
+ 0x2f, 0x79, 0xaa, 0x25, 0x6f, 0xa1, 0x1e, 0x67, 0x99, 0x24, 0x6c, 0x9d,
+ 0x33, 0x74, 0xa9, 0x47, 0x83, 0xb5, 0x46, 0x72, 0xa0, 0x1f, 0x31, 0x59,
+ 0x1a, 0x21, 0x3a, 0x17, 0x23, 0x31, 0x16, 0x22, 0x2e, 0x1e, 0x25, 0x33,
+ 0x1e, 0x23, 0x36, 0x2c, 0x38, 0x3e, 0xb1, 0xc4, 0xc0, 0xd7, 0xeb, 0xe5,
+ 0xe3, 0xee, 0xf0, 0xec, 0xf0, 0xf7, 0xed, 0xf2, 0xf6, 0xec, 0xf2, 0xf3,
+ 0xec, 0xf1, 0xf4, 0xec, 0xf2, 0xf5, 0xe9, 0xef, 0xf3, 0xe9, 0xee, 0xf2,
+ 0xeb, 0xf0, 0xf6, 0xe9, 0xf0, 0xf8, 0xe7, 0xee, 0xf6, 0xe2, 0xe9, 0xf1,
+ 0xd8, 0xdb, 0xe4, 0xc5, 0xc6, 0xcd, 0xb8, 0xb5, 0xb5, 0xb1, 0xac, 0xa6,
+ 0xb0, 0xac, 0xa2, 0xb6, 0xb4, 0xa8, 0xbe, 0xbe, 0xb4, 0xcc, 0xcd, 0xc3,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x09, 0x0a, 0x0c, 0x09, 0x12, 0x14, 0x0f,
+ 0x2a, 0x2c, 0x27, 0x42, 0x43, 0x3e, 0x1d, 0x1c, 0x18, 0x16, 0x13, 0x0f,
+ 0x25, 0x1b, 0x12, 0x29, 0x1d, 0x19, 0x28, 0x1c, 0x1e, 0x2b, 0x1f, 0x21,
+ 0x2a, 0x1f, 0x1b, 0x1f, 0x15, 0x07, 0x3a, 0x34, 0x18, 0xb0, 0xac, 0x87,
+ 0xfd, 0xfb, 0xd9, 0xff, 0xff, 0xe6, 0xf9, 0xf7, 0xdf, 0xfe, 0xfd, 0xea,
+ 0xf9, 0xf7, 0xe9, 0xfc, 0xfb, 0xf0, 0xfd, 0xfd, 0xf3, 0xf5, 0xf5, 0xeb,
+ 0xf8, 0xf4, 0xec, 0xfc, 0xf7, 0xec, 0xff, 0xfa, 0xe7, 0xf8, 0xf5, 0xd9,
+ 0xf1, 0xf0, 0xd3, 0xd3, 0xd2, 0xbc, 0x94, 0x95, 0x8b, 0x7e, 0x80, 0x7f,
+ 0x82, 0x84, 0x81, 0x6c, 0x6e, 0x6d, 0x6f, 0x70, 0x72, 0x7a, 0x7b, 0x7d,
+ 0x76, 0x7b, 0x77, 0x6f, 0x74, 0x6e, 0x4b, 0x50, 0x4c, 0x23, 0x27, 0x24,
+ 0x2c, 0x2e, 0x2c, 0x21, 0x23, 0x22, 0x1b, 0x1b, 0x1d, 0x0a, 0x0c, 0x10,
+ 0x09, 0x0c, 0x11, 0x23, 0x25, 0x28, 0x45, 0x43, 0x46, 0x33, 0x2e, 0x30,
+ 0x38, 0x2c, 0x2c, 0x37, 0x2b, 0x2b, 0x37, 0x2c, 0x25, 0x39, 0x31, 0x1a,
+ 0xb6, 0xaf, 0x8c, 0xff, 0xff, 0xe2, 0xf2, 0xee, 0xdb, 0xda, 0xd3, 0xce,
+ 0xd2, 0xd0, 0xbd, 0xc9, 0xc8, 0xb6, 0xcd, 0xcc, 0xbc, 0xcd, 0xcb, 0xbd,
+ 0xc3, 0xc3, 0xb5, 0xc0, 0xc0, 0xb2, 0xbf, 0xc1, 0xb3, 0xa9, 0xad, 0x9c,
+ 0xae, 0xae, 0x9c, 0xc1, 0xc0, 0xae, 0xc4, 0xc1, 0xb0, 0xcb, 0xc7, 0xb5,
+ 0xbe, 0xbc, 0xa7, 0xb8, 0xb7, 0xa1, 0xb1, 0xb3, 0xa0, 0xb5, 0xb6, 0xa7,
+ 0xab, 0xab, 0xa8, 0x95, 0x96, 0x96, 0x8e, 0x92, 0x95, 0x8a, 0x90, 0x97,
+ 0x85, 0x8d, 0x93, 0x80, 0x86, 0x8c, 0x77, 0x7b, 0x81, 0x67, 0x6b, 0x6f,
+ 0x50, 0x58, 0x5a, 0x39, 0x40, 0x43, 0x18, 0x1d, 0x24, 0x10, 0x19, 0x20,
+ 0x0f, 0x1a, 0x22, 0x0e, 0x1b, 0x23, 0x10, 0x19, 0x23, 0x0b, 0x13, 0x1d,
+ 0x09, 0x12, 0x1a, 0x0e, 0x17, 0x20, 0x0d, 0x17, 0x21, 0x0b, 0x15, 0x1f,
+ 0x0a, 0x14, 0x1e, 0x0c, 0x15, 0x1f, 0x0d, 0x14, 0x1e, 0x0d, 0x14, 0x1c,
+ 0x0c, 0x13, 0x19, 0x0d, 0x12, 0x18, 0x0b, 0x10, 0x16, 0x0a, 0x0f, 0x15,
+ 0x0a, 0x0d, 0x12, 0x0b, 0x0c, 0x10, 0x08, 0x09, 0x0d, 0x0a, 0x0b, 0x0d,
+ 0x0b, 0x0b, 0x0d, 0x0f, 0x10, 0x13, 0x0f, 0x12, 0x17, 0x0f, 0x16, 0x1e,
+ 0x0e, 0x17, 0x20, 0x0d, 0x17, 0x21, 0x0c, 0x16, 0x20, 0x10, 0x1a, 0x24,
+ 0x11, 0x1a, 0x23, 0x10, 0x1a, 0x25, 0x0d, 0x1a, 0x27, 0x0e, 0x1c, 0x29,
+ 0x0d, 0x1d, 0x2a, 0x10, 0x1f, 0x2b, 0x0f, 0x1c, 0x25, 0x0e, 0x18, 0x22,
+ 0x11, 0x17, 0x20, 0x13, 0x17, 0x1e, 0x13, 0x17, 0x1c, 0x0f, 0x13, 0x16,
+ 0x0c, 0x0d, 0x0f, 0x0a, 0x0c, 0x0b, 0x0c, 0x0e, 0x0d, 0x0c, 0x0e, 0x0d,
+ 0x0c, 0x0a, 0x0d, 0x11, 0x15, 0x17, 0x52, 0x5b, 0x67, 0x41, 0x45, 0x5c,
+ 0x13, 0x12, 0x25, 0x19, 0x15, 0x18, 0x25, 0x21, 0x1e, 0x33, 0x2e, 0x30,
+ 0x32, 0x29, 0x2a, 0x57, 0x52, 0x4c, 0x8f, 0x8a, 0x89, 0x69, 0x60, 0x6b,
+ 0x60, 0x51, 0x5b, 0x5e, 0x4d, 0x4d, 0x5c, 0x4e, 0x4b, 0x5a, 0x4c, 0x51,
+ 0x5f, 0x4d, 0x4c, 0x60, 0x4e, 0x4c, 0x60, 0x51, 0x4d, 0x5f, 0x52, 0x4e,
+ 0x64, 0x59, 0x55, 0x61, 0x57, 0x52, 0x64, 0x59, 0x55, 0x6e, 0x63, 0x5e,
+ 0x62, 0x5a, 0x49, 0x61, 0x59, 0x4d, 0x5d, 0x55, 0x4f, 0x53, 0x4b, 0x48,
+ 0x3f, 0x3b, 0x37, 0x84, 0x88, 0x87, 0x96, 0xa5, 0xaa, 0x8c, 0xa1, 0xae,
+ 0x91, 0xa4, 0xb0, 0x8f, 0xa0, 0xae, 0x8a, 0x9c, 0xaa, 0x7f, 0x8f, 0x9e,
+ 0x71, 0x81, 0x90, 0x67, 0x75, 0x82, 0x65, 0x71, 0x7f, 0x42, 0x4e, 0x5a,
+ 0x0e, 0x13, 0x1e, 0x0e, 0x0f, 0x15, 0x0f, 0x0f, 0x11, 0x12, 0x12, 0x12,
+ 0x25, 0x26, 0x28, 0x26, 0x2a, 0x2d, 0x22, 0x25, 0x2a, 0x17, 0x1a, 0x1e,
+ 0x18, 0x1a, 0x1e, 0x18, 0x1b, 0x1e, 0x14, 0x19, 0x1b, 0x17, 0x1a, 0x1c,
+ 0x19, 0x1a, 0x1c, 0x1a, 0x1e, 0x1f, 0x37, 0x40, 0x3f, 0x62, 0x6e, 0x6d,
+ 0x8d, 0x9c, 0x9f, 0xb4, 0xc3, 0xc8, 0xce, 0xd9, 0xe0, 0xd4, 0xdb, 0xe3,
+ 0xcb, 0xcc, 0xd3, 0xb5, 0xb3, 0xb9, 0x9f, 0xa0, 0xa2, 0x97, 0x9b, 0x9a,
+ 0x9d, 0xa4, 0xa1, 0xa3, 0xa5, 0x9f, 0xa6, 0xa6, 0x9e, 0xa0, 0xa4, 0x9f,
+ 0x91, 0x9e, 0xa0, 0x8b, 0x9d, 0xa5, 0x77, 0x89, 0x94, 0x88, 0x9a, 0xa0,
+ 0x9c, 0x9f, 0x9b, 0x9f, 0xa1, 0x9d, 0xaa, 0xac, 0xa9, 0xac, 0xae, 0xaa,
+ 0xa7, 0xa9, 0xa4, 0xa7, 0xa9, 0xa4, 0xa5, 0xa7, 0xa4, 0xa6, 0xa6, 0xa5,
+ 0xa7, 0xa9, 0xa4, 0xa1, 0xab, 0xa6, 0x99, 0xa4, 0xaa, 0x86, 0x98, 0xaa,
+ 0x77, 0x98, 0xab, 0x7c, 0x9c, 0xb1, 0x6d, 0x8f, 0xac, 0x51, 0x81, 0xa5,
+ 0x64, 0x91, 0xaf, 0x8f, 0xa6, 0xb4, 0xa5, 0xa9, 0xb1, 0x9c, 0xa8, 0xb3,
+ 0x6a, 0x8d, 0x9f, 0x43, 0x7c, 0x9d, 0x2c, 0x71, 0xa2, 0x25, 0x70, 0xa8,
+ 0x3a, 0x81, 0xb6, 0x33, 0x7a, 0xb0, 0x2b, 0x77, 0xab, 0x2e, 0x7b, 0xb1,
+ 0x31, 0x7e, 0xb4, 0x28, 0x72, 0xa9, 0x25, 0x6b, 0xa3, 0x23, 0x68, 0xa1,
+ 0x2a, 0x72, 0xa8, 0x3b, 0x7f, 0xb3, 0x4c, 0x7d, 0xae, 0x29, 0x40, 0x6a,
+ 0x18, 0x22, 0x42, 0x17, 0x23, 0x38, 0x19, 0x25, 0x36, 0x1f, 0x26, 0x38,
+ 0x1f, 0x27, 0x35, 0x41, 0x4f, 0x54, 0xb6, 0xc6, 0xc5, 0xd4, 0xe4, 0xe1,
+ 0xdc, 0xe8, 0xeb, 0xe4, 0xea, 0xf2, 0xe9, 0xee, 0xf4, 0xea, 0xef, 0xf2,
+ 0xe9, 0xf1, 0xf3, 0xe8, 0xf1, 0xf3, 0xe7, 0xef, 0xf2, 0xeb, 0xf0, 0xf4,
+ 0xec, 0xf1, 0xf5, 0xec, 0xf1, 0xf6, 0xec, 0xf1, 0xf5, 0xec, 0xf0, 0xf5,
+ 0xe8, 0xee, 0xf6, 0xe2, 0xe7, 0xee, 0xd5, 0xd8, 0xdc, 0xc1, 0xc3, 0xc5,
+ 0xb6, 0xb5, 0xb6, 0xb6, 0xb2, 0xb3, 0xbd, 0xb9, 0xb8, 0xcc, 0xc7, 0xc6,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x09, 0x0c, 0x0c, 0x0a, 0x0b, 0x0d, 0x0a, 0x07, 0x09, 0x06,
+ 0x0a, 0x0c, 0x09, 0x1e, 0x1e, 0x1a, 0x17, 0x17, 0x13, 0x12, 0x11, 0x0d,
+ 0x27, 0x1e, 0x19, 0x2d, 0x21, 0x1f, 0x29, 0x1d, 0x1f, 0x29, 0x1c, 0x1e,
+ 0x2d, 0x1f, 0x20, 0x29, 0x1e, 0x18, 0x1f, 0x16, 0x08, 0x2a, 0x22, 0x0e,
+ 0x6e, 0x6a, 0x3d, 0xc6, 0xc2, 0x95, 0xf4, 0xf0, 0xcf, 0xff, 0xff, 0xe8,
+ 0xff, 0xfc, 0xee, 0xff, 0xfe, 0xf0, 0xff, 0xff, 0xf3, 0xfd, 0xfc, 0xeb,
+ 0xfd, 0xfc, 0xe3, 0xf8, 0xf5, 0xd8, 0xf2, 0xec, 0xcb, 0xe3, 0xdd, 0xb8,
+ 0x9c, 0x97, 0x76, 0x70, 0x6d, 0x58, 0x80, 0x81, 0x7d, 0x82, 0x85, 0x8a,
+ 0x87, 0x89, 0x86, 0x86, 0x87, 0x86, 0x69, 0x6a, 0x6d, 0x5e, 0x5f, 0x61,
+ 0x6e, 0x73, 0x70, 0x64, 0x69, 0x64, 0x51, 0x55, 0x52, 0x20, 0x24, 0x23,
+ 0x1c, 0x1e, 0x1b, 0x20, 0x21, 0x20, 0x1a, 0x1a, 0x1c, 0x0c, 0x0d, 0x11,
+ 0x0d, 0x0e, 0x12, 0x18, 0x19, 0x1b, 0x1e, 0x1d, 0x1d, 0x29, 0x22, 0x22,
+ 0x34, 0x28, 0x25, 0x35, 0x28, 0x2c, 0x39, 0x29, 0x33, 0x30, 0x22, 0x20,
+ 0x3e, 0x34, 0x1f, 0xa5, 0x9f, 0x7e, 0xfb, 0xf9, 0xd7, 0xfb, 0xf7, 0xdb,
+ 0xe5, 0xe4, 0xca, 0xd7, 0xd5, 0xbd, 0xd7, 0xd5, 0xbf, 0xd2, 0xd0, 0xba,
+ 0xc8, 0xc7, 0xb2, 0xc1, 0xc1, 0xad, 0xc2, 0xc4, 0xaf, 0xbf, 0xc1, 0xaa,
+ 0xc1, 0xc0, 0xa8, 0xbf, 0xbd, 0xa6, 0xc9, 0xc4, 0xae, 0xc6, 0xc1, 0xab,
+ 0xc6, 0xc3, 0xac, 0xbd, 0xbc, 0xa8, 0xb2, 0xb4, 0xa5, 0xa1, 0xa4, 0x9b,
+ 0x8f, 0x92, 0x96, 0x8a, 0x8f, 0x93, 0x88, 0x90, 0x93, 0x87, 0x8f, 0x94,
+ 0x80, 0x87, 0x8d, 0x79, 0x7e, 0x84, 0x6c, 0x6f, 0x74, 0x5a, 0x5e, 0x61,
+ 0x47, 0x4e, 0x50, 0x30, 0x36, 0x39, 0x14, 0x1a, 0x20, 0x12, 0x1a, 0x23,
+ 0x10, 0x1d, 0x26, 0x0e, 0x1b, 0x25, 0x0f, 0x19, 0x25, 0x0b, 0x14, 0x1f,
+ 0x0c, 0x15, 0x1e, 0x0e, 0x18, 0x21, 0x0d, 0x17, 0x21, 0x0b, 0x15, 0x1f,
+ 0x0a, 0x14, 0x1e, 0x0b, 0x13, 0x1e, 0x0c, 0x15, 0x1e, 0x0a, 0x13, 0x1c,
+ 0x0b, 0x12, 0x18, 0x0e, 0x13, 0x19, 0x0c, 0x11, 0x17, 0x0b, 0x10, 0x16,
+ 0x0c, 0x0f, 0x14, 0x0e, 0x0f, 0x14, 0x0a, 0x0b, 0x0f, 0x08, 0x09, 0x0b,
+ 0x0a, 0x0b, 0x0d, 0x0b, 0x0c, 0x10, 0x0d, 0x10, 0x15, 0x0f, 0x14, 0x1a,
+ 0x0e, 0x15, 0x1d, 0x0c, 0x14, 0x1d, 0x0e, 0x17, 0x20, 0x10, 0x19, 0x23,
+ 0x0f, 0x18, 0x21, 0x10, 0x1b, 0x25, 0x0f, 0x1b, 0x27, 0x0e, 0x1c, 0x29,
+ 0x0f, 0x1d, 0x2a, 0x11, 0x1d, 0x28, 0x12, 0x1d, 0x25, 0x11, 0x19, 0x21,
+ 0x11, 0x15, 0x1e, 0x12, 0x16, 0x1c, 0x10, 0x13, 0x18, 0x0c, 0x0e, 0x10,
+ 0x09, 0x0b, 0x0a, 0x0a, 0x0c, 0x0b, 0x0d, 0x0f, 0x0c, 0x11, 0x13, 0x11,
+ 0x0e, 0x0d, 0x0f, 0x18, 0x1b, 0x1f, 0x58, 0x60, 0x6e, 0x36, 0x3a, 0x52,
+ 0x14, 0x13, 0x24, 0x17, 0x15, 0x15, 0x20, 0x1f, 0x1b, 0x3c, 0x3b, 0x3e,
+ 0x34, 0x2b, 0x2d, 0x3c, 0x34, 0x32, 0x86, 0x7d, 0x80, 0x85, 0x7a, 0x84,
+ 0x5f, 0x53, 0x59, 0x5e, 0x50, 0x4f, 0x5b, 0x4d, 0x4c, 0x5a, 0x4a, 0x4f,
+ 0x62, 0x4f, 0x4e, 0x65, 0x52, 0x50, 0x62, 0x51, 0x4f, 0x5d, 0x4e, 0x4c,
+ 0x5b, 0x4d, 0x4b, 0x59, 0x4b, 0x49, 0x51, 0x44, 0x41, 0x4d, 0x40, 0x3c,
+ 0x4a, 0x3d, 0x30, 0x48, 0x3c, 0x34, 0x46, 0x3a, 0x37, 0x3d, 0x33, 0x2f,
+ 0x2c, 0x26, 0x21, 0x61, 0x63, 0x60, 0x9f, 0xab, 0xaf, 0x8e, 0xa0, 0xaa,
+ 0x8e, 0xa0, 0xae, 0x88, 0x9a, 0xa8, 0x7e, 0x8e, 0x9d, 0x71, 0x80, 0x8f,
+ 0x65, 0x73, 0x80, 0x61, 0x6d, 0x79, 0x59, 0x63, 0x6e, 0x25, 0x2f, 0x39,
+ 0x0c, 0x0f, 0x16, 0x10, 0x10, 0x14, 0x0f, 0x0d, 0x0e, 0x15, 0x15, 0x15,
+ 0x26, 0x27, 0x2a, 0x24, 0x27, 0x2c, 0x22, 0x25, 0x2c, 0x18, 0x19, 0x1e,
+ 0x16, 0x17, 0x1b, 0x14, 0x18, 0x1b, 0x16, 0x1a, 0x1d, 0x15, 0x19, 0x1a,
+ 0x16, 0x1a, 0x1b, 0x1a, 0x1e, 0x1f, 0x35, 0x3d, 0x3f, 0x65, 0x71, 0x71,
+ 0x92, 0xa5, 0xa3, 0xc6, 0xd4, 0xd6, 0xe1, 0xea, 0xf1, 0xe7, 0xec, 0xf7,
+ 0xdc, 0xdc, 0xe6, 0xc0, 0xbf, 0xc7, 0xac, 0xad, 0xb1, 0xa2, 0xa5, 0xa6,
+ 0x9f, 0xa1, 0x9e, 0xa0, 0xa3, 0x9c, 0x9f, 0xa0, 0x96, 0x9e, 0xa0, 0x98,
+ 0xa8, 0xa8, 0xa6, 0xa9, 0xac, 0xb0, 0x9c, 0xa4, 0xa8, 0x96, 0xa3, 0xa3,
+ 0x9f, 0xa0, 0x9e, 0xa0, 0xa2, 0x9f, 0xa2, 0xa7, 0xa3, 0xa7, 0xac, 0xa6,
+ 0xa9, 0xae, 0xa6, 0xa5, 0xa8, 0xa2, 0xa3, 0xa3, 0xa3, 0xad, 0xac, 0xae,
+ 0xab, 0xac, 0xad, 0x91, 0xa8, 0xb3, 0x7b, 0x9b, 0xb4, 0x75, 0x94, 0xad,
+ 0x7c, 0xa0, 0xb1, 0x7a, 0x9b, 0xac, 0x66, 0x86, 0x9d, 0x75, 0x9f, 0xb8,
+ 0x8c, 0xa9, 0xbc, 0x9e, 0xa7, 0xa9, 0xa9, 0xa9, 0xb0, 0x7a, 0x93, 0xab,
+ 0x52, 0x8c, 0xa9, 0x3b, 0x85, 0xac, 0x2e, 0x7a, 0xb1, 0x26, 0x74, 0xad,
+ 0x2c, 0x72, 0xab, 0x2d, 0x74, 0xad, 0x29, 0x76, 0xad, 0x28, 0x77, 0xae,
+ 0x2a, 0x79, 0xb0, 0x28, 0x73, 0xac, 0x27, 0x6d, 0xa9, 0x2c, 0x70, 0xac,
+ 0x27, 0x76, 0xaf, 0x36, 0x81, 0xb6, 0x4e, 0x84, 0xb6, 0x38, 0x51, 0x81,
+ 0x1a, 0x27, 0x4d, 0x18, 0x27, 0x42, 0x1a, 0x28, 0x3d, 0x1e, 0x27, 0x39,
+ 0x1e, 0x28, 0x32, 0x85, 0x92, 0x97, 0xd0, 0xde, 0xdf, 0xd1, 0xdf, 0xe0,
+ 0xd3, 0xde, 0xe2, 0xd8, 0xe1, 0xe8, 0xe0, 0xe6, 0xee, 0xe5, 0xea, 0xee,
+ 0xe3, 0xec, 0xee, 0xe6, 0xef, 0xf2, 0xe9, 0xf0, 0xf3, 0xeb, 0xf0, 0xf4,
+ 0xec, 0xf1, 0xf4, 0xed, 0xf1, 0xf4, 0xee, 0xf2, 0xf5, 0xed, 0xf1, 0xf4,
+ 0xec, 0xf1, 0xf7, 0xea, 0xf1, 0xf9, 0xe6, 0xed, 0xf5, 0xdd, 0xe1, 0xe9,
+ 0xce, 0xd1, 0xd8, 0xc1, 0xc2, 0xc8, 0xc3, 0xbf, 0xc5, 0xd8, 0xd3, 0xd7,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e,
+ 0x0b, 0x0c, 0x0b, 0x0a, 0x0c, 0x0b, 0x0a, 0x0c, 0x0b, 0x07, 0x09, 0x08,
+ 0x09, 0x0b, 0x0a, 0x0a, 0x0c, 0x0b, 0x0d, 0x0f, 0x0e, 0x0c, 0x0d, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x13, 0x11, 0x11,
+ 0x23, 0x1b, 0x1b, 0x27, 0x1d, 0x1c, 0x22, 0x17, 0x16, 0x25, 0x1a, 0x18,
+ 0x2d, 0x21, 0x20, 0x2a, 0x1e, 0x1e, 0x2e, 0x22, 0x25, 0x27, 0x1b, 0x1f,
+ 0x27, 0x19, 0x16, 0x3c, 0x2e, 0x20, 0x6c, 0x63, 0x48, 0xa0, 0x9a, 0x73,
+ 0xcb, 0xc7, 0x9a, 0xda, 0xd8, 0xaa, 0xde, 0xdd, 0xb2, 0xd3, 0xd1, 0xaa,
+ 0xb4, 0xb2, 0x8d, 0x93, 0x8d, 0x6d, 0x73, 0x69, 0x52, 0x58, 0x4b, 0x3d,
+ 0x47, 0x3b, 0x30, 0x4d, 0x45, 0x3b, 0x7e, 0x7c, 0x73, 0x85, 0x87, 0x7e,
+ 0x83, 0x85, 0x80, 0x83, 0x85, 0x83, 0x79, 0x7a, 0x7c, 0x57, 0x58, 0x5a,
+ 0x52, 0x55, 0x52, 0x58, 0x5d, 0x59, 0x40, 0x44, 0x41, 0x23, 0x26, 0x25,
+ 0x18, 0x18, 0x16, 0x1f, 0x1f, 0x1f, 0x19, 0x19, 0x1b, 0x0f, 0x0e, 0x13,
+ 0x0c, 0x0c, 0x10, 0x16, 0x17, 0x19, 0x1d, 0x1c, 0x1c, 0x21, 0x1c, 0x1c,
+ 0x2f, 0x24, 0x2b, 0x35, 0x28, 0x29, 0x3f, 0x31, 0x30, 0x36, 0x27, 0x29,
+ 0x30, 0x21, 0x25, 0x30, 0x25, 0x20, 0x79, 0x73, 0x58, 0xc4, 0xc3, 0x98,
+ 0xe6, 0xe2, 0xca, 0xe8, 0xe1, 0xcd, 0xe6, 0xdf, 0xca, 0xe3, 0xdc, 0xc8,
+ 0xcf, 0xc9, 0xb6, 0xcf, 0xca, 0xb6, 0xd0, 0xcb, 0xb6, 0xcd, 0xcb, 0xb6,
+ 0xce, 0xcb, 0xb2, 0xcc, 0xc8, 0xaf, 0xc8, 0xc2, 0xac, 0xbd, 0xb6, 0xa2,
+ 0xa8, 0xa4, 0x92, 0x94, 0x92, 0x85, 0x9d, 0x9d, 0x98, 0x91, 0x95, 0x97,
+ 0x8d, 0x92, 0x97, 0x8c, 0x92, 0x96, 0x85, 0x8d, 0x90, 0x7f, 0x87, 0x8a,
+ 0x79, 0x81, 0x83, 0x6e, 0x74, 0x76, 0x5f, 0x62, 0x64, 0x4e, 0x50, 0x52,
+ 0x3e, 0x44, 0x44, 0x2c, 0x32, 0x33, 0x13, 0x18, 0x1e, 0x12, 0x1a, 0x23,
+ 0x10, 0x1d, 0x26, 0x0e, 0x1b, 0x26, 0x0e, 0x18, 0x24, 0x0d, 0x13, 0x21,
+ 0x0c, 0x15, 0x1e, 0x10, 0x19, 0x22, 0x0e, 0x17, 0x21, 0x0d, 0x17, 0x21,
+ 0x0a, 0x14, 0x1e, 0x08, 0x12, 0x1c, 0x0c, 0x15, 0x1f, 0x0b, 0x14, 0x1d,
+ 0x0c, 0x13, 0x19, 0x0b, 0x11, 0x16, 0x0c, 0x11, 0x18, 0x0b, 0x10, 0x16,
+ 0x0a, 0x0d, 0x12, 0x0d, 0x0f, 0x13, 0x0c, 0x0d, 0x11, 0x09, 0x0a, 0x0d,
+ 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c, 0x0e, 0x0f, 0x13, 0x0f, 0x12, 0x17,
+ 0x0e, 0x13, 0x19, 0x0f, 0x16, 0x1e, 0x0f, 0x18, 0x21, 0x0f, 0x18, 0x21,
+ 0x10, 0x19, 0x22, 0x0e, 0x18, 0x22, 0x0f, 0x1b, 0x26, 0x0f, 0x1d, 0x28,
+ 0x13, 0x1f, 0x2b, 0x13, 0x1d, 0x27, 0x12, 0x1b, 0x22, 0x12, 0x19, 0x1f,
+ 0x13, 0x16, 0x1d, 0x0f, 0x12, 0x17, 0x0c, 0x0d, 0x11, 0x09, 0x0a, 0x0b,
+ 0x09, 0x0b, 0x0a, 0x0a, 0x0c, 0x0b, 0x10, 0x12, 0x10, 0x13, 0x15, 0x14,
+ 0x0f, 0x0f, 0x11, 0x24, 0x29, 0x2d, 0x64, 0x6c, 0x79, 0x33, 0x37, 0x4e,
+ 0x12, 0x11, 0x1f, 0x19, 0x17, 0x16, 0x31, 0x31, 0x2f, 0x41, 0x43, 0x48,
+ 0x4e, 0x49, 0x4c, 0x30, 0x28, 0x31, 0x38, 0x2d, 0x39, 0x5e, 0x54, 0x58,
+ 0x68, 0x5e, 0x5c, 0x5c, 0x51, 0x50, 0x57, 0x4c, 0x4a, 0x5b, 0x4e, 0x48,
+ 0x61, 0x50, 0x4d, 0x60, 0x51, 0x4d, 0x5f, 0x50, 0x4c, 0x5c, 0x4e, 0x4b,
+ 0x5b, 0x4d, 0x4a, 0x58, 0x4a, 0x47, 0x55, 0x47, 0x44, 0x52, 0x44, 0x41,
+ 0x4c, 0x41, 0x3b, 0x48, 0x3e, 0x3a, 0x49, 0x3f, 0x3e, 0x3f, 0x35, 0x33,
+ 0x37, 0x30, 0x2a, 0x3c, 0x3a, 0x34, 0x94, 0x9a, 0x9a, 0x8f, 0x9b, 0xa0,
+ 0x87, 0x95, 0xa2, 0x7d, 0x8c, 0x99, 0x72, 0x7f, 0x8c, 0x69, 0x77, 0x84,
+ 0x62, 0x6e, 0x7a, 0x55, 0x60, 0x6a, 0x3d, 0x46, 0x4f, 0x13, 0x1a, 0x24,
+ 0x0b, 0x0e, 0x11, 0x11, 0x11, 0x10, 0x10, 0x0f, 0x0f, 0x1a, 0x1a, 0x1a,
+ 0x27, 0x29, 0x2c, 0x23, 0x26, 0x2d, 0x22, 0x23, 0x2a, 0x1c, 0x1b, 0x21,
+ 0x19, 0x18, 0x1d, 0x18, 0x19, 0x1d, 0x14, 0x18, 0x1b, 0x15, 0x19, 0x1a,
+ 0x15, 0x19, 0x1a, 0x1c, 0x20, 0x23, 0x2f, 0x37, 0x39, 0x5f, 0x6a, 0x6a,
+ 0x99, 0xab, 0xa8, 0xd9, 0xe7, 0xe6, 0xec, 0xf3, 0xf9, 0xf5, 0xf5, 0xfe,
+ 0xf1, 0xee, 0xf8, 0xd1, 0xd0, 0xd8, 0xb8, 0xb9, 0xbe, 0xab, 0xac, 0xb0,
+ 0xa6, 0xa5, 0xa1, 0xa5, 0xa8, 0xa1, 0xa0, 0xa5, 0x9f, 0x9b, 0xa0, 0x9a,
+ 0x9f, 0xa1, 0x9e, 0xa5, 0xa6, 0xa5, 0xaa, 0xac, 0xa9, 0xa7, 0xab, 0xa5,
+ 0xa8, 0xa8, 0xa6, 0xa5, 0xa7, 0xa6, 0xa1, 0xa7, 0xa3, 0xa7, 0xae, 0xa8,
+ 0xac, 0xb1, 0xaa, 0xab, 0xad, 0xaa, 0xb0, 0xb3, 0xb6, 0xaf, 0xb3, 0xb9,
+ 0x94, 0xa0, 0x9f, 0x73, 0x95, 0xa3, 0x7b, 0xa0, 0xb9, 0x82, 0xa2, 0xb7,
+ 0x6d, 0x96, 0xa9, 0x67, 0x93, 0xac, 0x8a, 0xa0, 0xb3, 0xa1, 0xa7, 0xaa,
+ 0x9d, 0xa8, 0xac, 0x9b, 0xa4, 0xa1, 0x88, 0x9b, 0xac, 0x46, 0x78, 0x9f,
+ 0x48, 0x92, 0xb7, 0x33, 0x81, 0xab, 0x2d, 0x79, 0xaf, 0x28, 0x78, 0xaf,
+ 0x2b, 0x75, 0xa7, 0x2c, 0x78, 0xa9, 0x2a, 0x78, 0xa8, 0x2b, 0x7c, 0xac,
+ 0x27, 0x78, 0xa7, 0x23, 0x71, 0xa3, 0x34, 0x7d, 0xb1, 0x37, 0x7e, 0xb3,
+ 0x27, 0x7c, 0xb5, 0x3b, 0x8b, 0xc0, 0x53, 0x8e, 0xc0, 0x43, 0x60, 0x92,
+ 0x1d, 0x2b, 0x56, 0x19, 0x29, 0x48, 0x19, 0x2a, 0x40, 0x1a, 0x26, 0x37,
+ 0x38, 0x47, 0x4c, 0xbb, 0xc8, 0xcc, 0xd2, 0xdd, 0xe1, 0xd0, 0xdb, 0xdf,
+ 0xcf, 0xd9, 0xe0, 0xd1, 0xda, 0xe3, 0xd6, 0xdd, 0xe5, 0xd8, 0xdf, 0xe6,
+ 0xda, 0xe3, 0xe8, 0xe1, 0xea, 0xef, 0xe7, 0xef, 0xf2, 0xea, 0xf1, 0xf4,
+ 0xeb, 0xf0, 0xf3, 0xed, 0xf1, 0xf4, 0xee, 0xf2, 0xf5, 0xee, 0xf2, 0xf3,
+ 0xef, 0xf0, 0xf4, 0xed, 0xf0, 0xf5, 0xed, 0xf1, 0xfa, 0xea, 0xf0, 0xf8,
+ 0xe5, 0xec, 0xf4, 0xdb, 0xe0, 0xe7, 0xda, 0xdd, 0xe2, 0xe7, 0xe8, 0xec,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0d, 0x0c,
+ 0x0a, 0x0c, 0x0b, 0x09, 0x0b, 0x0a, 0x0b, 0x0d, 0x0c, 0x0a, 0x0c, 0x0b,
+ 0x0a, 0x0c, 0x0b, 0x10, 0x12, 0x11, 0x1a, 0x1c, 0x1b, 0x16, 0x18, 0x17,
+ 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0d, 0x0b, 0x0b, 0x0d, 0x0b, 0x0b, 0x0d, 0x0a, 0x0a, 0x0c,
+ 0x09, 0x09, 0x0b, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x19, 0x13, 0x17, 0x26, 0x1d, 0x1e, 0x23, 0x1b, 0x18, 0x21, 0x19, 0x14,
+ 0x28, 0x1f, 0x1a, 0x2a, 0x20, 0x21, 0x2b, 0x1f, 0x28, 0x2b, 0x1f, 0x2a,
+ 0x31, 0x20, 0x21, 0x33, 0x24, 0x1f, 0x45, 0x38, 0x2d, 0x4d, 0x42, 0x30,
+ 0x55, 0x4d, 0x37, 0x56, 0x4e, 0x37, 0x4d, 0x46, 0x30, 0x3b, 0x34, 0x21,
+ 0x30, 0x29, 0x1b, 0x30, 0x26, 0x1f, 0x35, 0x28, 0x28, 0x46, 0x36, 0x39,
+ 0x52, 0x45, 0x44, 0x4e, 0x44, 0x3f, 0x64, 0x61, 0x56, 0x82, 0x82, 0x77,
+ 0x7e, 0x80, 0x7b, 0x7a, 0x7c, 0x79, 0x73, 0x74, 0x76, 0x60, 0x62, 0x61,
+ 0x3e, 0x40, 0x3e, 0x3d, 0x3f, 0x3c, 0x2e, 0x30, 0x2d, 0x1f, 0x21, 0x21,
+ 0x15, 0x15, 0x13, 0x1b, 0x1b, 0x1b, 0x17, 0x17, 0x19, 0x0f, 0x10, 0x13,
+ 0x0d, 0x10, 0x13, 0x19, 0x1b, 0x1d, 0x1d, 0x1d, 0x1d, 0x1e, 0x1a, 0x1a,
+ 0x2c, 0x23, 0x26, 0x37, 0x2d, 0x2b, 0x43, 0x39, 0x30, 0x35, 0x29, 0x27,
+ 0x2e, 0x21, 0x28, 0x31, 0x25, 0x2b, 0x4a, 0x42, 0x3d, 0x6a, 0x66, 0x54,
+ 0x70, 0x6a, 0x4d, 0x8d, 0x86, 0x68, 0xa8, 0x9e, 0x82, 0xb9, 0xaf, 0x93,
+ 0xb0, 0xa6, 0x8a, 0xb9, 0xb1, 0x94, 0xb8, 0xb2, 0x94, 0xb3, 0xae, 0x90,
+ 0xa7, 0xa1, 0x8b, 0x9c, 0x95, 0x82, 0x89, 0x80, 0x71, 0x74, 0x6a, 0x5e,
+ 0x56, 0x4d, 0x44, 0x5d, 0x58, 0x52, 0x93, 0x93, 0x92, 0x8f, 0x91, 0x96,
+ 0x8b, 0x90, 0x94, 0x89, 0x8e, 0x91, 0x81, 0x87, 0x89, 0x77, 0x7d, 0x7d,
+ 0x6d, 0x73, 0x72, 0x61, 0x65, 0x64, 0x54, 0x56, 0x57, 0x45, 0x45, 0x47,
+ 0x3b, 0x3f, 0x40, 0x2f, 0x32, 0x35, 0x16, 0x1a, 0x21, 0x11, 0x19, 0x23,
+ 0x0f, 0x1c, 0x25, 0x0d, 0x19, 0x24, 0x0f, 0x19, 0x24, 0x0c, 0x12, 0x1e,
+ 0x0b, 0x14, 0x1c, 0x10, 0x18, 0x21, 0x0d, 0x16, 0x20, 0x0c, 0x15, 0x20,
+ 0x0b, 0x15, 0x1f, 0x0c, 0x14, 0x1f, 0x0d, 0x16, 0x1f, 0x0c, 0x15, 0x1c,
+ 0x0c, 0x13, 0x19, 0x0c, 0x11, 0x17, 0x0c, 0x11, 0x17, 0x0b, 0x10, 0x16,
+ 0x0a, 0x0d, 0x12, 0x09, 0x0b, 0x0e, 0x0c, 0x0d, 0x11, 0x0a, 0x0b, 0x0d,
+ 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x11, 0x10, 0x11, 0x15,
+ 0x0f, 0x12, 0x17, 0x10, 0x15, 0x1b, 0x11, 0x18, 0x20, 0x0f, 0x18, 0x21,
+ 0x0f, 0x19, 0x22, 0x0e, 0x18, 0x22, 0x0e, 0x1a, 0x24, 0x0f, 0x1b, 0x27,
+ 0x11, 0x1e, 0x27, 0x13, 0x1c, 0x25, 0x14, 0x1a, 0x20, 0x14, 0x17, 0x1c,
+ 0x0f, 0x12, 0x16, 0x0c, 0x0d, 0x11, 0x09, 0x0a, 0x0c, 0x0a, 0x0a, 0x0b,
+ 0x09, 0x0a, 0x09, 0x0a, 0x0b, 0x0a, 0x0f, 0x10, 0x10, 0x0f, 0x11, 0x10,
+ 0x0e, 0x10, 0x11, 0x2e, 0x32, 0x37, 0x5a, 0x60, 0x6e, 0x23, 0x26, 0x3b,
+ 0x18, 0x15, 0x22, 0x15, 0x14, 0x0f, 0x59, 0x5a, 0x56, 0x67, 0x6a, 0x71,
+ 0x6c, 0x6c, 0x6f, 0x50, 0x49, 0x58, 0x2c, 0x20, 0x31, 0x2c, 0x24, 0x25,
+ 0x52, 0x4b, 0x45, 0x55, 0x4d, 0x4b, 0x50, 0x45, 0x43, 0x51, 0x43, 0x3b,
+ 0x55, 0x46, 0x41, 0x5a, 0x4d, 0x47, 0x5d, 0x4f, 0x4a, 0x5c, 0x51, 0x4b,
+ 0x59, 0x4e, 0x48, 0x56, 0x4b, 0x45, 0x57, 0x4a, 0x45, 0x52, 0x45, 0x3f,
+ 0x49, 0x3f, 0x3c, 0x46, 0x3c, 0x3d, 0x47, 0x3d, 0x3e, 0x40, 0x36, 0x35,
+ 0x3f, 0x36, 0x31, 0x34, 0x2f, 0x28, 0x72, 0x73, 0x6f, 0x8d, 0x93, 0x96,
+ 0x7c, 0x86, 0x92, 0x71, 0x7b, 0x87, 0x65, 0x6f, 0x7b, 0x5f, 0x69, 0x74,
+ 0x53, 0x5b, 0x66, 0x43, 0x4c, 0x55, 0x2c, 0x34, 0x3c, 0x0c, 0x11, 0x19,
+ 0x0e, 0x10, 0x11, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0c, 0x1f, 0x1f, 0x21,
+ 0x26, 0x29, 0x2f, 0x20, 0x23, 0x2a, 0x21, 0x22, 0x27, 0x1b, 0x1a, 0x20,
+ 0x1a, 0x19, 0x1e, 0x17, 0x17, 0x1c, 0x12, 0x17, 0x1a, 0x14, 0x1a, 0x1b,
+ 0x16, 0x1a, 0x1d, 0x1f, 0x23, 0x26, 0x29, 0x31, 0x33, 0x4f, 0x5a, 0x5c,
+ 0x8d, 0xa0, 0x9e, 0xde, 0xed, 0xec, 0xf5, 0xfa, 0xfc, 0xfd, 0xfc, 0xff,
+ 0xfb, 0xf9, 0xff, 0xe4, 0xe5, 0xea, 0xc6, 0xc7, 0xcc, 0xb6, 0xb5, 0xba,
+ 0xad, 0xad, 0xa9, 0xa5, 0xa7, 0xa4, 0xa5, 0xaa, 0xa8, 0xa3, 0xa9, 0xa8,
+ 0x9f, 0xa5, 0xa3, 0x9f, 0xa1, 0x9e, 0xa8, 0xa9, 0xa3, 0xab, 0xab, 0xa3,
+ 0xab, 0xa9, 0xa8, 0xa5, 0xa8, 0xa7, 0xa2, 0xab, 0xa6, 0xa8, 0xae, 0xaa,
+ 0xa7, 0xac, 0xa8, 0xa8, 0xac, 0xad, 0xa1, 0xab, 0xb2, 0x83, 0x93, 0xa0,
+ 0x79, 0x93, 0xa4, 0x89, 0xa4, 0xaf, 0xa4, 0xab, 0xb0, 0xad, 0xaf, 0xb1,
+ 0x72, 0x95, 0xa4, 0x49, 0x7f, 0x9e, 0x84, 0xa2, 0xb6, 0x9d, 0xa3, 0x9d,
+ 0xa8, 0xae, 0xae, 0x81, 0x96, 0xa1, 0x4d, 0x7e, 0x9e, 0x35, 0x7c, 0xab,
+ 0x2a, 0x78, 0xa7, 0x2a, 0x75, 0xa3, 0x27, 0x73, 0xa5, 0x28, 0x78, 0xab,
+ 0x2b, 0x79, 0xad, 0x2b, 0x79, 0xad, 0x26, 0x75, 0xa8, 0x22, 0x72, 0xa5,
+ 0x21, 0x71, 0xa4, 0x22, 0x6f, 0xa4, 0x29, 0x75, 0xab, 0x2a, 0x75, 0xad,
+ 0x2a, 0x80, 0xb8, 0x3c, 0x8e, 0xc3, 0x5e, 0x9a, 0xcc, 0x4e, 0x6d, 0x9e,
+ 0x1e, 0x2d, 0x5a, 0x18, 0x28, 0x4b, 0x1a, 0x2c, 0x43, 0x19, 0x27, 0x35,
+ 0x69, 0x7b, 0x7c, 0xce, 0xdb, 0xde, 0xd0, 0xd8, 0xe0, 0xcd, 0xd6, 0xdf,
+ 0xcb, 0xd5, 0xde, 0xcb, 0xd5, 0xde, 0xcd, 0xd6, 0xdf, 0xcf, 0xd6, 0xdf,
+ 0xd3, 0xdc, 0xe2, 0xda, 0xe3, 0xe9, 0xe0, 0xe9, 0xee, 0xe6, 0xed, 0xf3,
+ 0xe9, 0xf0, 0xf4, 0xec, 0xf2, 0xf5, 0xed, 0xf2, 0xf5, 0xef, 0xf2, 0xf5,
+ 0xf1, 0xf1, 0xf3, 0xf0, 0xf1, 0xf5, 0xf0, 0xf3, 0xf8, 0xed, 0xf2, 0xf9,
+ 0xec, 0xf2, 0xf9, 0xea, 0xf1, 0xf7, 0xe9, 0xf1, 0xf4, 0xeb, 0xf2, 0xf5,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0b, 0x0a, 0x0a, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x10, 0x0f, 0x0b, 0x0d, 0x0c, 0x0a, 0x0c, 0x0b, 0x0b, 0x0d, 0x0c,
+ 0x10, 0x12, 0x11, 0x18, 0x1a, 0x19, 0x1d, 0x1f, 0x1e, 0x1d, 0x1f, 0x1e,
+ 0x1b, 0x1c, 0x1b, 0x12, 0x12, 0x12, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0d, 0x0b, 0x0b, 0x0d, 0x09, 0x09, 0x0b, 0x09, 0x09, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x0a, 0x0a, 0x0a, 0x0c, 0x0b,
+ 0x12, 0x0e, 0x0f, 0x1d, 0x19, 0x18, 0x28, 0x23, 0x20, 0x22, 0x1d, 0x19,
+ 0x21, 0x1a, 0x17, 0x27, 0x1f, 0x1b, 0x29, 0x22, 0x1f, 0x2e, 0x25, 0x25,
+ 0x32, 0x23, 0x2e, 0x40, 0x31, 0x38, 0x55, 0x49, 0x48, 0x55, 0x4a, 0x44,
+ 0x53, 0x48, 0x42, 0x50, 0x45, 0x41, 0x4d, 0x42, 0x42, 0x3b, 0x31, 0x35,
+ 0x3d, 0x33, 0x3a, 0x4e, 0x43, 0x4a, 0x55, 0x4a, 0x4e, 0x57, 0x4c, 0x4a,
+ 0x55, 0x4c, 0x45, 0x51, 0x4a, 0x40, 0x50, 0x4b, 0x44, 0x6d, 0x6a, 0x66,
+ 0x7a, 0x7b, 0x75, 0x6b, 0x6d, 0x6a, 0x61, 0x63, 0x62, 0x55, 0x57, 0x56,
+ 0x3b, 0x3c, 0x3c, 0x22, 0x22, 0x20, 0x24, 0x24, 0x24, 0x1f, 0x1f, 0x20,
+ 0x14, 0x14, 0x12, 0x19, 0x19, 0x19, 0x17, 0x17, 0x1a, 0x1c, 0x1d, 0x21,
+ 0x19, 0x1d, 0x21, 0x12, 0x16, 0x19, 0x10, 0x0f, 0x12, 0x1c, 0x18, 0x19,
+ 0x26, 0x23, 0x1d, 0x2d, 0x27, 0x25, 0x3e, 0x35, 0x35, 0x37, 0x2d, 0x2c,
+ 0x36, 0x2d, 0x27, 0x32, 0x2b, 0x26, 0x6e, 0x68, 0x6a, 0x82, 0x7c, 0x84,
+ 0x4d, 0x42, 0x41, 0x54, 0x48, 0x46, 0x5a, 0x4d, 0x4a, 0x54, 0x46, 0x43,
+ 0x48, 0x3a, 0x36, 0x49, 0x3c, 0x37, 0x4a, 0x3e, 0x38, 0x4d, 0x42, 0x3a,
+ 0x4e, 0x46, 0x37, 0x52, 0x48, 0x3d, 0x56, 0x49, 0x43, 0x52, 0x44, 0x41,
+ 0x4b, 0x3f, 0x3c, 0x4b, 0x44, 0x40, 0x82, 0x80, 0x7c, 0x8e, 0x90, 0x8f,
+ 0x84, 0x88, 0x8b, 0x7e, 0x82, 0x85, 0x76, 0x7a, 0x7b, 0x6c, 0x70, 0x6f,
+ 0x60, 0x64, 0x62, 0x53, 0x55, 0x55, 0x45, 0x46, 0x48, 0x43, 0x43, 0x48,
+ 0x40, 0x41, 0x43, 0x32, 0x33, 0x36, 0x15, 0x19, 0x22, 0x10, 0x18, 0x22,
+ 0x0f, 0x1c, 0x25, 0x0f, 0x1c, 0x25, 0x12, 0x1a, 0x24, 0x0f, 0x13, 0x1e,
+ 0x0c, 0x12, 0x1a, 0x10, 0x18, 0x20, 0x10, 0x18, 0x22, 0x0e, 0x16, 0x21,
+ 0x0c, 0x14, 0x1f, 0x0e, 0x17, 0x20, 0x0d, 0x16, 0x1d, 0x0b, 0x14, 0x1b,
+ 0x0c, 0x13, 0x19, 0x0d, 0x12, 0x18, 0x0c, 0x11, 0x17, 0x0a, 0x0f, 0x15,
+ 0x0a, 0x0d, 0x12, 0x09, 0x0a, 0x0e, 0x0b, 0x0c, 0x10, 0x0b, 0x0c, 0x0e,
+ 0x0a, 0x0b, 0x0d, 0x0b, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e, 0x0a, 0x0b, 0x0d,
+ 0x0c, 0x0d, 0x11, 0x0e, 0x13, 0x17, 0x11, 0x18, 0x1e, 0x0e, 0x15, 0x1e,
+ 0x0d, 0x17, 0x20, 0x0f, 0x1a, 0x24, 0x0f, 0x1b, 0x24, 0x0d, 0x1a, 0x23,
+ 0x11, 0x1c, 0x25, 0x11, 0x1b, 0x22, 0x14, 0x19, 0x1d, 0x10, 0x14, 0x17,
+ 0x0c, 0x0e, 0x0f, 0x0c, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x0d, 0x0e, 0x0e, 0x0c, 0x0c, 0x0e, 0x0b, 0x0c, 0x0e,
+ 0x10, 0x14, 0x13, 0x25, 0x2b, 0x2f, 0x52, 0x58, 0x67, 0x1c, 0x1c, 0x32,
+ 0x17, 0x13, 0x1d, 0x1b, 0x18, 0x12, 0x66, 0x66, 0x63, 0x8c, 0x8f, 0x97,
+ 0x78, 0x7c, 0x83, 0x70, 0x6f, 0x79, 0x4e, 0x46, 0x51, 0x2a, 0x23, 0x28,
+ 0x2c, 0x28, 0x25, 0x3e, 0x39, 0x35, 0x3f, 0x34, 0x32, 0x3b, 0x2d, 0x2c,
+ 0x3d, 0x2f, 0x2c, 0x46, 0x38, 0x35, 0x4c, 0x3e, 0x3a, 0x4d, 0x41, 0x3d,
+ 0x4f, 0x43, 0x3f, 0x50, 0x42, 0x3f, 0x51, 0x43, 0x40, 0x4f, 0x40, 0x3d,
+ 0x4b, 0x3f, 0x3e, 0x45, 0x38, 0x3b, 0x40, 0x35, 0x38, 0x3e, 0x34, 0x33,
+ 0x3c, 0x33, 0x2e, 0x30, 0x2b, 0x24, 0x4d, 0x4e, 0x4b, 0x7b, 0x81, 0x84,
+ 0x68, 0x6f, 0x79, 0x62, 0x69, 0x73, 0x5a, 0x61, 0x6b, 0x4d, 0x54, 0x5e,
+ 0x3f, 0x45, 0x4f, 0x3d, 0x42, 0x4b, 0x24, 0x29, 0x2f, 0x09, 0x0d, 0x13,
+ 0x0d, 0x0f, 0x0e, 0x0e, 0x0f, 0x0d, 0x0d, 0x0e, 0x0d, 0x20, 0x22, 0x23,
+ 0x25, 0x28, 0x2d, 0x1f, 0x24, 0x2a, 0x1d, 0x20, 0x24, 0x1c, 0x1b, 0x20,
+ 0x1b, 0x1a, 0x1f, 0x17, 0x18, 0x1c, 0x18, 0x1e, 0x1e, 0x18, 0x1e, 0x1e,
+ 0x17, 0x1c, 0x1f, 0x21, 0x26, 0x29, 0x26, 0x2d, 0x30, 0x3e, 0x49, 0x4a,
+ 0x78, 0x8e, 0x8c, 0xd3, 0xe1, 0xe1, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xfe,
+ 0xff, 0xff, 0xff, 0xf7, 0xf8, 0xfb, 0xde, 0xdf, 0xe5, 0xc3, 0xc3, 0xca,
+ 0xb2, 0xb7, 0xb6, 0xa9, 0xab, 0xac, 0xab, 0xaa, 0xac, 0xa8, 0xa8, 0xa7,
+ 0xa1, 0xa6, 0xa0, 0x9f, 0xa6, 0x9e, 0xa1, 0xa4, 0x9d, 0xa5, 0xa5, 0xa1,
+ 0xa8, 0xa7, 0xa5, 0xa8, 0xac, 0xa8, 0xa1, 0xa9, 0xa4, 0xa1, 0xa7, 0xa2,
+ 0xa7, 0xaa, 0xaa, 0xa2, 0xa8, 0xad, 0x8f, 0x9f, 0xaa, 0x62, 0x7e, 0x91,
+ 0x5c, 0x86, 0xa7, 0x8e, 0xa3, 0xb0, 0xab, 0xa5, 0xa3, 0xa3, 0xa3, 0xa8,
+ 0x65, 0x88, 0x9c, 0x58, 0x86, 0xa2, 0x82, 0xa0, 0xb3, 0x95, 0xa9, 0xac,
+ 0x8c, 0xa1, 0xad, 0x53, 0x81, 0x9f, 0x31, 0x7e, 0xa4, 0x2e, 0x81, 0xae,
+ 0x2b, 0x76, 0xab, 0x29, 0x72, 0xa6, 0x28, 0x76, 0xa5, 0x26, 0x78, 0xa9,
+ 0x2a, 0x7c, 0xb4, 0x27, 0x78, 0xaf, 0x26, 0x75, 0xad, 0x24, 0x71, 0xa9,
+ 0x24, 0x71, 0xa9, 0x23, 0x71, 0xa9, 0x20, 0x6f, 0xa9, 0x27, 0x77, 0xb3,
+ 0x30, 0x86, 0xbd, 0x41, 0x92, 0xc4, 0x6f, 0xab, 0xdb, 0x58, 0x77, 0xa7,
+ 0x1f, 0x2f, 0x5c, 0x1b, 0x2a, 0x4d, 0x1a, 0x2c, 0x3f, 0x29, 0x38, 0x42,
+ 0xa1, 0xb5, 0xb3, 0xce, 0xde, 0xe0, 0xcd, 0xd5, 0xdf, 0xcc, 0xd1, 0xde,
+ 0xc9, 0xd3, 0xdd, 0xc6, 0xd1, 0xda, 0xc9, 0xd1, 0xdc, 0xcc, 0xd2, 0xde,
+ 0xcc, 0xd5, 0xdc, 0xd2, 0xdb, 0xe2, 0xd7, 0xe0, 0xe7, 0xdd, 0xe6, 0xeb,
+ 0xe4, 0xeb, 0xf1, 0xe8, 0xef, 0xf4, 0xea, 0xf2, 0xf5, 0xeb, 0xf2, 0xf6,
+ 0xee, 0xf2, 0xf4, 0xef, 0xf2, 0xf5, 0xef, 0xf2, 0xf7, 0xee, 0xf1, 0xf6,
+ 0xee, 0xf1, 0xf6, 0xed, 0xf3, 0xf7, 0xec, 0xf4, 0xf7, 0xec, 0xf4, 0xf7,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0f, 0x0f, 0x0d, 0x0e, 0x0d, 0x0e, 0x0f, 0x0f, 0x15, 0x17, 0x16,
+ 0x1a, 0x1c, 0x1b, 0x1b, 0x1d, 0x1c, 0x1c, 0x1e, 0x1c, 0x1d, 0x1f, 0x1e,
+ 0x1e, 0x1f, 0x1e, 0x21, 0x21, 0x21, 0x1b, 0x1b, 0x1b, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x0a, 0x0b, 0x09, 0x0b, 0x0d, 0x0a,
+ 0x0d, 0x0c, 0x09, 0x11, 0x10, 0x0e, 0x27, 0x23, 0x22, 0x2b, 0x26, 0x26,
+ 0x1d, 0x18, 0x16, 0x24, 0x1f, 0x17, 0x28, 0x24, 0x18, 0x26, 0x22, 0x13,
+ 0x34, 0x2c, 0x24, 0x4a, 0x41, 0x3b, 0x52, 0x49, 0x45, 0x51, 0x47, 0x44,
+ 0x52, 0x48, 0x45, 0x54, 0x4b, 0x47, 0x59, 0x4f, 0x48, 0x59, 0x51, 0x48,
+ 0x58, 0x53, 0x4b, 0x5e, 0x57, 0x53, 0x5b, 0x52, 0x51, 0x54, 0x4f, 0x4c,
+ 0x52, 0x4c, 0x46, 0x4f, 0x4b, 0x42, 0x44, 0x40, 0x38, 0x42, 0x3d, 0x37,
+ 0x66, 0x69, 0x62, 0x5b, 0x5c, 0x5a, 0x52, 0x52, 0x52, 0x42, 0x42, 0x42,
+ 0x2f, 0x2f, 0x2f, 0x20, 0x1f, 0x1e, 0x28, 0x28, 0x28, 0x24, 0x24, 0x26,
+ 0x22, 0x23, 0x20, 0x24, 0x24, 0x23, 0x22, 0x22, 0x25, 0x33, 0x33, 0x38,
+ 0x28, 0x2b, 0x2f, 0x14, 0x18, 0x1a, 0x13, 0x12, 0x15, 0x21, 0x1e, 0x1f,
+ 0x1c, 0x19, 0x1a, 0x1b, 0x17, 0x18, 0x29, 0x22, 0x24, 0x2d, 0x24, 0x23,
+ 0x31, 0x29, 0x24, 0x29, 0x24, 0x1d, 0x7b, 0x77, 0x74, 0x7f, 0x7d, 0x7c,
+ 0x55, 0x4a, 0x4e, 0x5c, 0x4f, 0x52, 0x6e, 0x61, 0x61, 0x59, 0x4b, 0x4a,
+ 0x4e, 0x40, 0x3e, 0x4b, 0x40, 0x3a, 0x4d, 0x42, 0x3c, 0x52, 0x47, 0x42,
+ 0x53, 0x4a, 0x41, 0x51, 0x46, 0x42, 0x57, 0x49, 0x49, 0x56, 0x47, 0x47,
+ 0x50, 0x42, 0x41, 0x44, 0x3c, 0x35, 0x5f, 0x5c, 0x53, 0x88, 0x89, 0x81,
+ 0x79, 0x7d, 0x80, 0x72, 0x76, 0x79, 0x6a, 0x6e, 0x6f, 0x61, 0x64, 0x63,
+ 0x53, 0x54, 0x54, 0x45, 0x46, 0x47, 0x43, 0x42, 0x46, 0x48, 0x47, 0x4c,
+ 0x40, 0x41, 0x43, 0x2f, 0x31, 0x34, 0x15, 0x17, 0x21, 0x0e, 0x16, 0x20,
+ 0x0c, 0x19, 0x23, 0x10, 0x1d, 0x26, 0x10, 0x18, 0x21, 0x0e, 0x13, 0x1c,
+ 0x0f, 0x15, 0x1d, 0x10, 0x18, 0x20, 0x11, 0x1a, 0x23, 0x11, 0x1a, 0x23,
+ 0x0e, 0x17, 0x20, 0x0d, 0x16, 0x1f, 0x0d, 0x15, 0x1d, 0x0c, 0x14, 0x1c,
+ 0x0c, 0x12, 0x19, 0x0e, 0x14, 0x19, 0x0f, 0x13, 0x19, 0x0d, 0x11, 0x16,
+ 0x0e, 0x11, 0x16, 0x0d, 0x0e, 0x13, 0x0c, 0x0c, 0x10, 0x0b, 0x0c, 0x0e,
+ 0x09, 0x0a, 0x0c, 0x0b, 0x0c, 0x0e, 0x0c, 0x0d, 0x0d, 0x0b, 0x0c, 0x0d,
+ 0x0a, 0x0b, 0x0f, 0x0b, 0x0e, 0x12, 0x0e, 0x13, 0x18, 0x0d, 0x14, 0x1b,
+ 0x0c, 0x16, 0x1e, 0x0f, 0x1a, 0x23, 0x0f, 0x1c, 0x25, 0x10, 0x1e, 0x27,
+ 0x12, 0x1e, 0x26, 0x13, 0x1a, 0x21, 0x13, 0x15, 0x1a, 0x0d, 0x0e, 0x11,
+ 0x0d, 0x0f, 0x0e, 0x0f, 0x11, 0x0f, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x12, 0x0e, 0x0f, 0x11, 0x0a, 0x0b, 0x0f,
+ 0x19, 0x1f, 0x1e, 0x46, 0x4e, 0x52, 0x4b, 0x52, 0x60, 0x16, 0x17, 0x2b,
+ 0x17, 0x13, 0x1c, 0x26, 0x20, 0x1a, 0x74, 0x72, 0x6f, 0x87, 0x89, 0x92,
+ 0x73, 0x79, 0x81, 0x6c, 0x6d, 0x70, 0x61, 0x5c, 0x61, 0x42, 0x3d, 0x44,
+ 0x23, 0x21, 0x24, 0x1c, 0x19, 0x12, 0x26, 0x1d, 0x19, 0x2f, 0x21, 0x27,
+ 0x2f, 0x22, 0x21, 0x2f, 0x21, 0x20, 0x30, 0x23, 0x22, 0x35, 0x27, 0x26,
+ 0x35, 0x27, 0x26, 0x36, 0x28, 0x27, 0x37, 0x28, 0x28, 0x39, 0x29, 0x29,
+ 0x39, 0x2a, 0x28, 0x33, 0x25, 0x26, 0x31, 0x25, 0x27, 0x2f, 0x26, 0x24,
+ 0x2c, 0x23, 0x1e, 0x25, 0x21, 0x1c, 0x33, 0x36, 0x34, 0x5f, 0x66, 0x6b,
+ 0x57, 0x5b, 0x64, 0x55, 0x58, 0x61, 0x4a, 0x4e, 0x57, 0x3f, 0x44, 0x4d,
+ 0x3e, 0x42, 0x4c, 0x3c, 0x40, 0x49, 0x19, 0x1c, 0x24, 0x0c, 0x0f, 0x15,
+ 0x0c, 0x10, 0x0f, 0x0e, 0x10, 0x0e, 0x10, 0x10, 0x0f, 0x20, 0x21, 0x22,
+ 0x22, 0x25, 0x2a, 0x1d, 0x22, 0x28, 0x1b, 0x1e, 0x23, 0x1d, 0x1c, 0x1f,
+ 0x1a, 0x18, 0x1d, 0x15, 0x17, 0x1a, 0x1d, 0x23, 0x23, 0x1c, 0x22, 0x22,
+ 0x1c, 0x21, 0x24, 0x20, 0x25, 0x28, 0x22, 0x29, 0x2c, 0x2f, 0x39, 0x3b,
+ 0x5d, 0x72, 0x70, 0xb1, 0xc0, 0xbe, 0xfa, 0xfc, 0xfc, 0xff, 0xff, 0xfc,
+ 0xff, 0xff, 0xfd, 0xfe, 0xff, 0xff, 0xf5, 0xf5, 0xfa, 0xd8, 0xd7, 0xe1,
+ 0xb6, 0xc2, 0xc5, 0xaa, 0xad, 0xb1, 0xaf, 0xa9, 0xac, 0xaf, 0xaa, 0xa6,
+ 0xa4, 0xa6, 0x9c, 0xa0, 0xa7, 0x9c, 0x9e, 0xa4, 0x9f, 0xa4, 0xa5, 0xa6,
+ 0xa4, 0xa4, 0xa3, 0xa8, 0xad, 0xa9, 0xa6, 0xac, 0xa8, 0xa1, 0xa6, 0xa5,
+ 0x95, 0x9b, 0x9f, 0x83, 0x8d, 0x98, 0x8b, 0xa2, 0xb0, 0x6f, 0x93, 0xa7,
+ 0x55, 0x89, 0xa4, 0x76, 0x96, 0xa4, 0x8e, 0xa2, 0xb1, 0x6b, 0x8f, 0xb2,
+ 0x4d, 0x7f, 0xa6, 0x7a, 0x95, 0xae, 0x9e, 0xa2, 0xaf, 0x8d, 0x97, 0xa2,
+ 0x57, 0x7e, 0x98, 0x39, 0x7c, 0xa9, 0x2f, 0x88, 0xb2, 0x33, 0x88, 0xae,
+ 0x2d, 0x77, 0xab, 0x2e, 0x79, 0xb3, 0x2e, 0x7f, 0xaf, 0x29, 0x7c, 0xab,
+ 0x2e, 0x83, 0xb5, 0x27, 0x7c, 0xab, 0x26, 0x75, 0xa6, 0x3b, 0x88, 0xba,
+ 0x37, 0x85, 0xb7, 0x26, 0x76, 0xaa, 0x27, 0x79, 0xae, 0x28, 0x7f, 0xb2,
+ 0x3a, 0x8f, 0xc6, 0x47, 0x98, 0xca, 0x72, 0xaf, 0xdd, 0x57, 0x75, 0xa5,
+ 0x21, 0x30, 0x5d, 0x1f, 0x30, 0x52, 0x19, 0x2b, 0x3d, 0x52, 0x61, 0x68,
+ 0xc2, 0xd8, 0xd3, 0xca, 0xda, 0xdc, 0xcc, 0xd3, 0xdd, 0xc9, 0xd0, 0xdc,
+ 0xc6, 0xd0, 0xda, 0xc3, 0xd0, 0xd9, 0xc5, 0xcf, 0xda, 0xc8, 0xcf, 0xdc,
+ 0xc8, 0xd1, 0xd9, 0xcc, 0xd4, 0xdc, 0xce, 0xd7, 0xdf, 0xd3, 0xdc, 0xe3,
+ 0xda, 0xe3, 0xea, 0xe0, 0xe9, 0xef, 0xe4, 0xed, 0xf2, 0xe9, 0xf0, 0xf5,
+ 0xe9, 0xf1, 0xf4, 0xec, 0xf2, 0xf5, 0xee, 0xf1, 0xf6, 0xf0, 0xf1, 0xf5,
+ 0xef, 0xf1, 0xf5, 0xee, 0xf1, 0xf6, 0xef, 0xf2, 0xf7, 0xed, 0xf2, 0xf6,
+ 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11, 0x1c, 0x1c, 0x1c, 0x21, 0x21, 0x21,
+ 0x1c, 0x1c, 0x1b, 0x1f, 0x1f, 0x1d, 0x21, 0x21, 0x1f, 0x21, 0x20, 0x1e,
+ 0x1e, 0x1d, 0x19, 0x2b, 0x2c, 0x28, 0x28, 0x28, 0x26, 0x16, 0x17, 0x15,
+ 0x0e, 0x10, 0x0f, 0x0c, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e,
+ 0x11, 0x12, 0x10, 0x0f, 0x11, 0x10, 0x10, 0x11, 0x10, 0x10, 0x11, 0x10,
+ 0x0c, 0x0e, 0x0d, 0x08, 0x0a, 0x09, 0x0b, 0x0b, 0x0a, 0x09, 0x0a, 0x08,
+ 0x0d, 0x11, 0x10, 0x12, 0x15, 0x15, 0x0f, 0x11, 0x10, 0x09, 0x0b, 0x0a,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0f, 0x10, 0x13, 0x13, 0x14, 0x11, 0x11, 0x11, 0x16, 0x14, 0x14,
+ 0x1e, 0x1a, 0x18, 0x22, 0x1d, 0x1a, 0x2a, 0x22, 0x1f, 0x3a, 0x32, 0x2e,
+ 0x3c, 0x32, 0x30, 0x4e, 0x44, 0x42, 0x52, 0x49, 0x44, 0x54, 0x4b, 0x46,
+ 0x52, 0x49, 0x44, 0x53, 0x49, 0x47, 0x56, 0x4c, 0x4b, 0x59, 0x4f, 0x4e,
+ 0x58, 0x4d, 0x47, 0x58, 0x4d, 0x48, 0x53, 0x49, 0x47, 0x49, 0x41, 0x3f,
+ 0x3f, 0x39, 0x38, 0x35, 0x30, 0x2d, 0x2a, 0x22, 0x20, 0x21, 0x1a, 0x17,
+ 0x3f, 0x43, 0x3f, 0x4e, 0x50, 0x4e, 0x46, 0x43, 0x42, 0x3d, 0x38, 0x39,
+ 0x3c, 0x36, 0x37, 0x36, 0x31, 0x33, 0x34, 0x2f, 0x32, 0x32, 0x2d, 0x2f,
+ 0x2d, 0x28, 0x23, 0x2c, 0x27, 0x23, 0x35, 0x30, 0x2e, 0x35, 0x2f, 0x2e,
+ 0x33, 0x2b, 0x2a, 0x31, 0x29, 0x28, 0x2c, 0x24, 0x23, 0x2d, 0x25, 0x24,
+ 0x21, 0x1b, 0x1f, 0x19, 0x13, 0x17, 0x16, 0x13, 0x16, 0x17, 0x16, 0x16,
+ 0x1d, 0x1c, 0x19, 0x25, 0x21, 0x1e, 0x4b, 0x47, 0x41, 0x76, 0x70, 0x68,
+ 0x68, 0x5d, 0x59, 0x58, 0x4c, 0x49, 0x63, 0x55, 0x52, 0x5c, 0x4e, 0x4b,
+ 0x59, 0x4b, 0x48, 0x57, 0x4a, 0x46, 0x57, 0x4c, 0x48, 0x59, 0x4e, 0x4a,
+ 0x53, 0x48, 0x44, 0x4a, 0x3d, 0x3a, 0x4b, 0x3e, 0x3b, 0x46, 0x39, 0x37,
+ 0x41, 0x36, 0x34, 0x32, 0x29, 0x26, 0x36, 0x2e, 0x2c, 0x76, 0x71, 0x6e,
+ 0x6f, 0x71, 0x70, 0x66, 0x69, 0x68, 0x5c, 0x5e, 0x5e, 0x4f, 0x50, 0x52,
+ 0x43, 0x44, 0x46, 0x40, 0x42, 0x41, 0x43, 0x45, 0x44, 0x46, 0x48, 0x45,
+ 0x40, 0x42, 0x42, 0x2e, 0x33, 0x35, 0x13, 0x1b, 0x21, 0x0e, 0x18, 0x23,
+ 0x0f, 0x1a, 0x26, 0x0f, 0x1b, 0x27, 0x0e, 0x18, 0x23, 0x0b, 0x13, 0x1e,
+ 0x0d, 0x18, 0x1e, 0x0f, 0x1a, 0x20, 0x10, 0x19, 0x23, 0x0f, 0x18, 0x21,
+ 0x0f, 0x17, 0x21, 0x0e, 0x15, 0x20, 0x0e, 0x14, 0x1f, 0x0c, 0x13, 0x1c,
+ 0x0e, 0x13, 0x1a, 0x0e, 0x13, 0x17, 0x0c, 0x11, 0x14, 0x0b, 0x0f, 0x13,
+ 0x0e, 0x10, 0x16, 0x0e, 0x0f, 0x16, 0x0c, 0x0d, 0x11, 0x0b, 0x0c, 0x0e,
+ 0x0c, 0x0c, 0x0d, 0x0f, 0x0f, 0x0f, 0x10, 0x11, 0x11, 0x0e, 0x0f, 0x0f,
+ 0x0e, 0x10, 0x0e, 0x0f, 0x11, 0x0f, 0x0c, 0x0d, 0x09, 0x0d, 0x0e, 0x0b,
+ 0x0d, 0x11, 0x13, 0x0e, 0x16, 0x1b, 0x11, 0x1c, 0x22, 0x12, 0x1e, 0x26,
+ 0x10, 0x1c, 0x22, 0x0c, 0x16, 0x19, 0x0c, 0x10, 0x0f, 0x0c, 0x0d, 0x0b,
+ 0x0d, 0x0e, 0x10, 0x0e, 0x0e, 0x10, 0x0b, 0x0b, 0x0b, 0x0d, 0x0c, 0x0a,
+ 0x0d, 0x0d, 0x0b, 0x10, 0x10, 0x0e, 0x0d, 0x0f, 0x0e, 0x0f, 0x13, 0x12,
+ 0x27, 0x32, 0x32, 0x5c, 0x63, 0x6c, 0x39, 0x3a, 0x4b, 0x17, 0x15, 0x22,
+ 0x1c, 0x17, 0x19, 0x2b, 0x28, 0x23, 0x79, 0x78, 0x76, 0x84, 0x84, 0x8b,
+ 0x70, 0x6f, 0x7a, 0x74, 0x73, 0x7d, 0x60, 0x5f, 0x66, 0x41, 0x40, 0x46,
+ 0x22, 0x21, 0x26, 0x13, 0x13, 0x12, 0x13, 0x12, 0x10, 0x16, 0x15, 0x12,
+ 0x1c, 0x18, 0x17, 0x1c, 0x17, 0x16, 0x1e, 0x1a, 0x19, 0x24, 0x1e, 0x20,
+ 0x27, 0x1e, 0x21, 0x26, 0x1d, 0x1d, 0x26, 0x1c, 0x1d, 0x26, 0x1b, 0x1c,
+ 0x23, 0x18, 0x17, 0x23, 0x1a, 0x19, 0x22, 0x1d, 0x1a, 0x1c, 0x17, 0x14,
+ 0x1d, 0x18, 0x15, 0x1f, 0x1d, 0x1b, 0x27, 0x29, 0x26, 0x48, 0x51, 0x4d,
+ 0x44, 0x4d, 0x51, 0x3d, 0x46, 0x4d, 0x3b, 0x45, 0x4e, 0x39, 0x43, 0x4c,
+ 0x3a, 0x43, 0x4c, 0x30, 0x35, 0x3d, 0x12, 0x12, 0x18, 0x0f, 0x0e, 0x13,
+ 0x12, 0x12, 0x12, 0x0f, 0x11, 0x0f, 0x13, 0x15, 0x14, 0x22, 0x25, 0x24,
+ 0x20, 0x23, 0x23, 0x1f, 0x21, 0x23, 0x1b, 0x1d, 0x20, 0x19, 0x1a, 0x1e,
+ 0x14, 0x18, 0x19, 0x13, 0x17, 0x18, 0x21, 0x25, 0x27, 0x1c, 0x20, 0x23,
+ 0x1c, 0x21, 0x24, 0x23, 0x28, 0x2b, 0x26, 0x2b, 0x2f, 0x25, 0x2b, 0x2f,
+ 0x42, 0x52, 0x51, 0x87, 0x97, 0x94, 0xe2, 0xee, 0xec, 0xfe, 0xff, 0xff,
+ 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xff, 0xfe, 0xfc, 0xff, 0xec, 0xed, 0xef,
+ 0xd5, 0xd5, 0xdc, 0xbd, 0xbd, 0xc4, 0xac, 0xaa, 0xb0, 0xa5, 0xa4, 0xa8,
+ 0xa9, 0xa9, 0xaa, 0xa9, 0xaa, 0xa8, 0xa6, 0xa7, 0xa2, 0xa5, 0xa7, 0xa2,
+ 0xad, 0xb6, 0xb7, 0xb4, 0xb7, 0xb6, 0xaa, 0xae, 0xb0, 0x83, 0x93, 0xa3,
+ 0x53, 0x79, 0x97, 0x4b, 0x7c, 0xa0, 0x67, 0x91, 0xac, 0x73, 0x94, 0xa5,
+ 0x75, 0x99, 0xb2, 0x79, 0x97, 0xb0, 0x77, 0x9b, 0xb6, 0x64, 0x90, 0xb0,
+ 0x79, 0x98, 0xad, 0x9c, 0xa4, 0xab, 0x8b, 0x9d, 0xac, 0x59, 0x87, 0xab,
+ 0x37, 0x7a, 0xac, 0x36, 0x7c, 0xaf, 0x32, 0x7d, 0xad, 0x32, 0x7f, 0xb0,
+ 0x2e, 0x7c, 0xad, 0x2b, 0x7b, 0xaf, 0x33, 0x83, 0xb6, 0x37, 0x85, 0xb9,
+ 0x37, 0x83, 0xb9, 0x28, 0x7b, 0xa9, 0x32, 0x83, 0xae, 0x54, 0x9c, 0xcc,
+ 0x3b, 0x86, 0xbe, 0x20, 0x77, 0xb1, 0x21, 0x7f, 0xb5, 0x30, 0x8d, 0xc0,
+ 0x42, 0x97, 0xce, 0x47, 0x95, 0xd3, 0x77, 0xb0, 0xde, 0x52, 0x6b, 0x99,
+ 0x26, 0x32, 0x5e, 0x1d, 0x30, 0x4f, 0x1a, 0x2f, 0x45, 0x84, 0x95, 0x92,
+ 0xd0, 0xdd, 0xe1, 0xca, 0xd7, 0xdd, 0xc7, 0xd4, 0xdc, 0xc4, 0xd0, 0xd9,
+ 0xc2, 0xce, 0xd8, 0xc3, 0xce, 0xd8, 0xc3, 0xcd, 0xd7, 0xc5, 0xcf, 0xd9,
+ 0xc7, 0xcf, 0xdb, 0xc6, 0xce, 0xdb, 0xc9, 0xd1, 0xdc, 0xcd, 0xd5, 0xe0,
+ 0xd0, 0xd9, 0xe2, 0xd5, 0xde, 0xe7, 0xda, 0xe3, 0xea, 0xe1, 0xea, 0xf1,
+ 0xe6, 0xef, 0xf4, 0xe8, 0xf1, 0xf4, 0xea, 0xf2, 0xf4, 0xed, 0xf2, 0xf5,
+ 0xee, 0xf2, 0xf5, 0xee, 0xf1, 0xf5, 0xee, 0xf1, 0xf6, 0xee, 0xf1, 0xf6,
+ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x10, 0x0f,
+ 0x15, 0x15, 0x15, 0x1a, 0x1a, 0x1a, 0x1d, 0x1d, 0x1e, 0x20, 0x20, 0x1f,
+ 0x1e, 0x1e, 0x1c, 0x21, 0x21, 0x1f, 0x22, 0x22, 0x20, 0x1e, 0x1e, 0x1c,
+ 0x1f, 0x1e, 0x1a, 0x21, 0x23, 0x1d, 0x1f, 0x20, 0x1d, 0x1c, 0x1e, 0x1b,
+ 0x1c, 0x1e, 0x1b, 0x13, 0x15, 0x14, 0x10, 0x10, 0x10, 0x12, 0x12, 0x12,
+ 0x1a, 0x1c, 0x19, 0x1c, 0x1e, 0x1d, 0x16, 0x18, 0x17, 0x0f, 0x11, 0x10,
+ 0x0e, 0x10, 0x0f, 0x0c, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b, 0x13, 0x13, 0x12,
+ 0x1b, 0x1f, 0x1d, 0x1f, 0x21, 0x20, 0x1b, 0x1d, 0x1c, 0x10, 0x12, 0x11,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x10, 0x10, 0x12, 0x15, 0x15, 0x15, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x09,
+ 0x16, 0x12, 0x11, 0x1b, 0x17, 0x14, 0x25, 0x20, 0x1e, 0x61, 0x5c, 0x59,
+ 0x63, 0x58, 0x57, 0x52, 0x48, 0x45, 0x4d, 0x44, 0x3f, 0x51, 0x48, 0x41,
+ 0x52, 0x49, 0x42, 0x55, 0x4c, 0x47, 0x47, 0x3d, 0x3c, 0x3d, 0x33, 0x32,
+ 0x3a, 0x2f, 0x2b, 0x37, 0x2d, 0x2a, 0x30, 0x28, 0x25, 0x27, 0x20, 0x1e,
+ 0x20, 0x1b, 0x18, 0x1c, 0x17, 0x14, 0x21, 0x19, 0x17, 0x28, 0x21, 0x1f,
+ 0x35, 0x2f, 0x31, 0x3f, 0x37, 0x39, 0x41, 0x38, 0x38, 0x46, 0x3a, 0x3a,
+ 0x4a, 0x3c, 0x3b, 0x41, 0x36, 0x33, 0x3c, 0x31, 0x2c, 0x3d, 0x34, 0x2f,
+ 0x36, 0x2b, 0x2e, 0x35, 0x2a, 0x2e, 0x36, 0x2b, 0x30, 0x38, 0x2d, 0x32,
+ 0x39, 0x2e, 0x32, 0x40, 0x34, 0x38, 0x38, 0x2d, 0x30, 0x30, 0x26, 0x27,
+ 0x2f, 0x25, 0x29, 0x2f, 0x26, 0x28, 0x25, 0x1f, 0x1f, 0x19, 0x15, 0x14,
+ 0x15, 0x13, 0x11, 0x19, 0x15, 0x12, 0x1e, 0x1a, 0x17, 0x3a, 0x34, 0x32,
+ 0x52, 0x49, 0x46, 0x50, 0x47, 0x44, 0x50, 0x45, 0x43, 0x4e, 0x43, 0x41,
+ 0x43, 0x38, 0x36, 0x3f, 0x33, 0x31, 0x3d, 0x33, 0x31, 0x3e, 0x35, 0x32,
+ 0x38, 0x2e, 0x2a, 0x32, 0x27, 0x24, 0x32, 0x27, 0x25, 0x2f, 0x24, 0x22,
+ 0x29, 0x1f, 0x1e, 0x26, 0x1d, 0x1c, 0x1e, 0x18, 0x16, 0x54, 0x50, 0x4e,
+ 0x5f, 0x61, 0x5f, 0x55, 0x57, 0x56, 0x4c, 0x4e, 0x4e, 0x40, 0x41, 0x43,
+ 0x3d, 0x3f, 0x3f, 0x3e, 0x40, 0x40, 0x40, 0x42, 0x41, 0x45, 0x47, 0x44,
+ 0x40, 0x42, 0x41, 0x2f, 0x34, 0x37, 0x12, 0x1b, 0x22, 0x0c, 0x16, 0x21,
+ 0x0d, 0x19, 0x26, 0x10, 0x1c, 0x28, 0x0f, 0x18, 0x23, 0x0c, 0x14, 0x1f,
+ 0x0d, 0x17, 0x20, 0x0f, 0x19, 0x23, 0x0f, 0x17, 0x22, 0x0f, 0x18, 0x21,
+ 0x10, 0x19, 0x22, 0x0f, 0x16, 0x1e, 0x0d, 0x15, 0x1a, 0x0c, 0x13, 0x19,
+ 0x0f, 0x12, 0x21, 0x0f, 0x13, 0x1f, 0x0d, 0x10, 0x17, 0x0d, 0x10, 0x15,
+ 0x0c, 0x0f, 0x13, 0x0d, 0x0e, 0x11, 0x0d, 0x0f, 0x0d, 0x0f, 0x11, 0x0b,
+ 0x11, 0x10, 0x14, 0x12, 0x11, 0x15, 0x10, 0x10, 0x14, 0x10, 0x11, 0x14,
+ 0x10, 0x11, 0x14, 0x10, 0x0f, 0x13, 0x10, 0x10, 0x11, 0x10, 0x10, 0x11,
+ 0x0d, 0x0f, 0x0e, 0x0b, 0x0f, 0x10, 0x0f, 0x14, 0x19, 0x12, 0x18, 0x1f,
+ 0x12, 0x19, 0x1f, 0x0c, 0x12, 0x16, 0x0c, 0x0d, 0x11, 0x0e, 0x0e, 0x10,
+ 0x0f, 0x10, 0x11, 0x0c, 0x0d, 0x0f, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0b,
+ 0x0e, 0x0e, 0x0c, 0x0f, 0x11, 0x10, 0x14, 0x16, 0x15, 0x1f, 0x23, 0x24,
+ 0x26, 0x2f, 0x30, 0x56, 0x5b, 0x65, 0x2e, 0x2d, 0x3e, 0x17, 0x13, 0x20,
+ 0x1c, 0x18, 0x18, 0x32, 0x31, 0x2b, 0x76, 0x76, 0x72, 0x85, 0x84, 0x88,
+ 0x73, 0x72, 0x7a, 0x7a, 0x79, 0x81, 0x61, 0x60, 0x66, 0x40, 0x3f, 0x45,
+ 0x26, 0x25, 0x2a, 0x13, 0x13, 0x13, 0x10, 0x11, 0x0f, 0x11, 0x11, 0x0e,
+ 0x12, 0x11, 0x0f, 0x10, 0x0f, 0x0d, 0x12, 0x11, 0x0f, 0x12, 0x10, 0x10,
+ 0x1c, 0x18, 0x19, 0x1a, 0x16, 0x15, 0x18, 0x14, 0x13, 0x1a, 0x13, 0x14,
+ 0x1b, 0x13, 0x14, 0x19, 0x13, 0x13, 0x1a, 0x17, 0x15, 0x1a, 0x16, 0x15,
+ 0x1c, 0x18, 0x17, 0x17, 0x17, 0x15, 0x1e, 0x20, 0x1c, 0x3e, 0x44, 0x42,
+ 0x39, 0x40, 0x46, 0x39, 0x42, 0x47, 0x3d, 0x46, 0x4e, 0x35, 0x3e, 0x47,
+ 0x2c, 0x33, 0x3b, 0x25, 0x2a, 0x30, 0x0d, 0x0f, 0x13, 0x0e, 0x0e, 0x10,
+ 0x15, 0x15, 0x15, 0x12, 0x13, 0x12, 0x17, 0x19, 0x18, 0x23, 0x26, 0x26,
+ 0x1f, 0x23, 0x24, 0x1e, 0x22, 0x23, 0x1b, 0x1d, 0x20, 0x19, 0x1a, 0x1e,
+ 0x14, 0x18, 0x19, 0x14, 0x19, 0x19, 0x2a, 0x2e, 0x2f, 0x21, 0x25, 0x28,
+ 0x1c, 0x21, 0x24, 0x21, 0x26, 0x29, 0x22, 0x27, 0x2b, 0x23, 0x29, 0x2d,
+ 0x2e, 0x3b, 0x3b, 0x60, 0x6f, 0x6c, 0xb6, 0xc4, 0xc2, 0xfa, 0xff, 0xfe,
+ 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe, 0xfe, 0xff, 0xfc, 0xfb, 0xfd,
+ 0xee, 0xed, 0xf3, 0xd7, 0xd6, 0xdc, 0xbf, 0xbe, 0xc3, 0xad, 0xac, 0xb1,
+ 0xa7, 0xa7, 0xa9, 0xa5, 0xa5, 0xa5, 0xa8, 0xa8, 0xa4, 0xac, 0xad, 0xa8,
+ 0xc8, 0xca, 0xc2, 0xb3, 0xb5, 0xae, 0x98, 0xa0, 0xa4, 0x63, 0x7e, 0x91,
+ 0x4c, 0x78, 0x9c, 0x4a, 0x7c, 0xa5, 0x63, 0x8d, 0xaf, 0x5f, 0x82, 0x9b,
+ 0x66, 0x93, 0x9f, 0x86, 0xa2, 0xb7, 0x94, 0xa3, 0xb0, 0x9a, 0xa4, 0x9f,
+ 0xa7, 0xad, 0xa7, 0x97, 0xa4, 0xac, 0x6c, 0x8e, 0xa4, 0x4d, 0x8a, 0x9e,
+ 0x3c, 0x86, 0xb0, 0x37, 0x81, 0xaf, 0x31, 0x7d, 0xab, 0x32, 0x81, 0xb1,
+ 0x43, 0x94, 0xc5, 0x2c, 0x7b, 0xb1, 0x29, 0x78, 0xb0, 0x2e, 0x7d, 0xb5,
+ 0x2b, 0x77, 0xb1, 0x24, 0x77, 0xab, 0x4d, 0x9e, 0xce, 0x4e, 0x97, 0xca,
+ 0x2d, 0x7a, 0xb2, 0x26, 0x7f, 0xb7, 0x2a, 0x88, 0xbe, 0x39, 0x93, 0xcb,
+ 0x42, 0x99, 0xd0, 0x54, 0x9b, 0xd5, 0x80, 0xae, 0xdf, 0x3e, 0x56, 0x84,
+ 0x23, 0x31, 0x5a, 0x1a, 0x2d, 0x49, 0x31, 0x46, 0x55, 0xb4, 0xc4, 0xc4,
+ 0xce, 0xda, 0xe0, 0xc9, 0xd6, 0xde, 0xc4, 0xd1, 0xda, 0xc1, 0xcf, 0xd8,
+ 0xc0, 0xcc, 0xd8, 0xc2, 0xcd, 0xd9, 0xc4, 0xcd, 0xd9, 0xc1, 0xcb, 0xd7,
+ 0xc3, 0xcc, 0xd9, 0xc5, 0xcf, 0xdc, 0xc4, 0xce, 0xda, 0xc8, 0xd0, 0xda,
+ 0xca, 0xd2, 0xdd, 0xcd, 0xd6, 0xdf, 0xd2, 0xdb, 0xe4, 0xd7, 0xe0, 0xe9,
+ 0xde, 0xe7, 0xee, 0xe4, 0xed, 0xf2, 0xe8, 0xf0, 0xf3, 0xea, 0xf1, 0xf4,
+ 0xeb, 0xf1, 0xf5, 0xec, 0xf1, 0xf5, 0xec, 0xf1, 0xf5, 0xec, 0xf1, 0xf6,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0f, 0x11, 0x10, 0x13, 0x15, 0x14,
+ 0x1b, 0x1b, 0x1a, 0x1d, 0x1d, 0x1d, 0x1f, 0x1f, 0x1e, 0x1f, 0x1f, 0x1f,
+ 0x1f, 0x1f, 0x1d, 0x1c, 0x1c, 0x1a, 0x1d, 0x1d, 0x1b, 0x1e, 0x1e, 0x1c,
+ 0x22, 0x21, 0x1d, 0x1d, 0x1e, 0x19, 0x1c, 0x1d, 0x19, 0x1b, 0x1d, 0x1a,
+ 0x1e, 0x20, 0x1d, 0x1c, 0x1e, 0x1b, 0x19, 0x19, 0x17, 0x18, 0x18, 0x18,
+ 0x19, 0x1a, 0x18, 0x1e, 0x20, 0x1d, 0x1b, 0x1d, 0x1c, 0x13, 0x15, 0x14,
+ 0x0f, 0x11, 0x10, 0x11, 0x13, 0x12, 0x17, 0x17, 0x15, 0x1b, 0x1c, 0x1a,
+ 0x1b, 0x1e, 0x1b, 0x1c, 0x1e, 0x1b, 0x1c, 0x1e, 0x1b, 0x1a, 0x1c, 0x19,
+ 0x15, 0x15, 0x13, 0x0f, 0x0f, 0x0d, 0x0a, 0x0a, 0x08, 0x09, 0x09, 0x07,
+ 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x0e, 0x0e, 0x0d, 0x0b, 0x0a, 0x08,
+ 0x0d, 0x0c, 0x0a, 0x11, 0x10, 0x0e, 0x15, 0x14, 0x12, 0x2a, 0x28, 0x26,
+ 0x50, 0x47, 0x44, 0x5b, 0x51, 0x4c, 0x4d, 0x44, 0x3d, 0x3c, 0x33, 0x2c,
+ 0x38, 0x2f, 0x28, 0x40, 0x37, 0x32, 0x32, 0x28, 0x25, 0x26, 0x1c, 0x1b,
+ 0x28, 0x1f, 0x1f, 0x26, 0x1e, 0x1c, 0x1f, 0x19, 0x16, 0x19, 0x14, 0x10,
+ 0x19, 0x13, 0x10, 0x22, 0x1a, 0x18, 0x30, 0x27, 0x27, 0x3b, 0x31, 0x32,
+ 0x3b, 0x33, 0x31, 0x35, 0x2b, 0x29, 0x44, 0x39, 0x37, 0x41, 0x34, 0x33,
+ 0x39, 0x2b, 0x2a, 0x2d, 0x22, 0x22, 0x2f, 0x24, 0x26, 0x31, 0x27, 0x29,
+ 0x31, 0x25, 0x2d, 0x34, 0x27, 0x2f, 0x38, 0x2b, 0x33, 0x35, 0x28, 0x2f,
+ 0x35, 0x28, 0x2f, 0x3d, 0x30, 0x36, 0x43, 0x35, 0x3b, 0x37, 0x29, 0x2e,
+ 0x33, 0x24, 0x27, 0x32, 0x25, 0x27, 0x33, 0x29, 0x28, 0x2e, 0x26, 0x24,
+ 0x21, 0x1d, 0x1b, 0x1b, 0x17, 0x16, 0x16, 0x14, 0x15, 0x17, 0x14, 0x17,
+ 0x1d, 0x19, 0x17, 0x2f, 0x2a, 0x27, 0x37, 0x32, 0x2f, 0x30, 0x28, 0x26,
+ 0x2e, 0x24, 0x23, 0x2f, 0x25, 0x24, 0x2d, 0x24, 0x23, 0x2b, 0x23, 0x21,
+ 0x2b, 0x23, 0x20, 0x28, 0x20, 0x1d, 0x26, 0x1f, 0x1d, 0x2b, 0x23, 0x21,
+ 0x21, 0x1c, 0x19, 0x22, 0x1d, 0x1c, 0x16, 0x11, 0x10, 0x3c, 0x38, 0x37,
+ 0x4c, 0x4e, 0x4d, 0x42, 0x44, 0x43, 0x3f, 0x41, 0x41, 0x3c, 0x3e, 0x3f,
+ 0x3e, 0x40, 0x3f, 0x3d, 0x3f, 0x3e, 0x39, 0x3b, 0x38, 0x3f, 0x41, 0x3e,
+ 0x40, 0x42, 0x43, 0x30, 0x34, 0x39, 0x15, 0x1d, 0x25, 0x0e, 0x18, 0x22,
+ 0x0d, 0x19, 0x25, 0x11, 0x1b, 0x26, 0x11, 0x1a, 0x23, 0x0e, 0x15, 0x1f,
+ 0x0e, 0x16, 0x23, 0x10, 0x18, 0x24, 0x0e, 0x16, 0x22, 0x10, 0x18, 0x22,
+ 0x11, 0x19, 0x22, 0x11, 0x1a, 0x20, 0x0e, 0x18, 0x1a, 0x0e, 0x18, 0x1a,
+ 0x10, 0x14, 0x22, 0x0f, 0x12, 0x1f, 0x0e, 0x12, 0x1b, 0x0e, 0x12, 0x19,
+ 0x10, 0x13, 0x1a, 0x12, 0x15, 0x1a, 0x10, 0x14, 0x14, 0x0d, 0x12, 0x0f,
+ 0x0c, 0x10, 0x10, 0x10, 0x12, 0x11, 0x0e, 0x0f, 0x0f, 0x0f, 0x12, 0x11,
+ 0x0f, 0x12, 0x11, 0x0f, 0x10, 0x10, 0x12, 0x14, 0x13, 0x11, 0x13, 0x12,
+ 0x13, 0x14, 0x14, 0x10, 0x12, 0x11, 0x0d, 0x0e, 0x10, 0x10, 0x11, 0x13,
+ 0x16, 0x17, 0x1b, 0x12, 0x12, 0x16, 0x0e, 0x0e, 0x13, 0x0f, 0x0e, 0x12,
+ 0x0c, 0x0d, 0x0f, 0x0a, 0x0b, 0x0d, 0x09, 0x0b, 0x0a, 0x0b, 0x0d, 0x0c,
+ 0x0c, 0x0e, 0x0d, 0x16, 0x18, 0x17, 0x22, 0x26, 0x27, 0x29, 0x2e, 0x2e,
+ 0x20, 0x25, 0x27, 0x4a, 0x4c, 0x56, 0x1e, 0x1e, 0x2c, 0x18, 0x14, 0x1e,
+ 0x19, 0x18, 0x16, 0x2e, 0x2e, 0x26, 0x6d, 0x6e, 0x67, 0x7f, 0x7f, 0x7f,
+ 0x78, 0x77, 0x7c, 0x70, 0x6f, 0x75, 0x56, 0x55, 0x5a, 0x3f, 0x3f, 0x43,
+ 0x26, 0x26, 0x28, 0x13, 0x13, 0x14, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0d,
+ 0x0f, 0x0f, 0x0d, 0x11, 0x11, 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f,
+ 0x16, 0x16, 0x16, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0b,
+ 0x12, 0x0d, 0x0d, 0x11, 0x10, 0x0e, 0x16, 0x15, 0x13, 0x1a, 0x19, 0x17,
+ 0x1b, 0x17, 0x17, 0x15, 0x13, 0x14, 0x22, 0x24, 0x22, 0x3c, 0x41, 0x41,
+ 0x3c, 0x40, 0x45, 0x3f, 0x44, 0x4b, 0x3a, 0x41, 0x49, 0x33, 0x3a, 0x42,
+ 0x2f, 0x33, 0x3c, 0x1c, 0x1f, 0x24, 0x0b, 0x0c, 0x10, 0x0e, 0x0e, 0x10,
+ 0x12, 0x14, 0x13, 0x0e, 0x10, 0x0f, 0x16, 0x1a, 0x19, 0x21, 0x25, 0x26,
+ 0x20, 0x24, 0x25, 0x1c, 0x20, 0x21, 0x17, 0x1b, 0x1d, 0x14, 0x18, 0x1b,
+ 0x11, 0x15, 0x16, 0x16, 0x1a, 0x1b, 0x23, 0x27, 0x28, 0x1d, 0x21, 0x22,
+ 0x1e, 0x23, 0x26, 0x21, 0x27, 0x2a, 0x22, 0x27, 0x2b, 0x25, 0x2a, 0x2e,
+ 0x29, 0x32, 0x33, 0x42, 0x4e, 0x4c, 0x81, 0x90, 0x8d, 0xd2, 0xe0, 0xdb,
+ 0xf9, 0xff, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xfc, 0xfb, 0xfe, 0xee, 0xed, 0xf2, 0xdb, 0xda, 0xdf, 0xc7, 0xc6, 0xca,
+ 0xb5, 0xb5, 0xb7, 0xa7, 0xa7, 0xa7, 0xa6, 0xa6, 0xa5, 0xab, 0xab, 0xa9,
+ 0xb3, 0xb1, 0xa6, 0xa9, 0xac, 0xa4, 0x9d, 0xa8, 0xaa, 0x80, 0x97, 0xa5,
+ 0x5d, 0x7f, 0x99, 0x56, 0x7d, 0x9f, 0x63, 0x8b, 0xae, 0x60, 0x87, 0xac,
+ 0x41, 0x76, 0x9d, 0x5b, 0x82, 0xa6, 0x90, 0x9f, 0xae, 0xa2, 0xa9, 0x9f,
+ 0x93, 0xa5, 0xa2, 0x69, 0x92, 0xad, 0x53, 0x8b, 0xb7, 0x4a, 0x8a, 0xad,
+ 0x3e, 0x8b, 0xb2, 0x32, 0x81, 0xaa, 0x2e, 0x7d, 0xa8, 0x31, 0x82, 0xb1,
+ 0x38, 0x8a, 0xbc, 0x2b, 0x7c, 0xb1, 0x2a, 0x7b, 0xb3, 0x2b, 0x7b, 0xb4,
+ 0x26, 0x73, 0xae, 0x22, 0x73, 0xab, 0x2c, 0x7e, 0xb4, 0x32, 0x82, 0xb7,
+ 0x2a, 0x7e, 0xb2, 0x28, 0x86, 0xba, 0x36, 0x94, 0xcd, 0x41, 0x98, 0xd6,
+ 0x43, 0x9a, 0xcf, 0x6d, 0xab, 0xda, 0x84, 0xa3, 0xd7, 0x2c, 0x40, 0x6e,
+ 0x1e, 0x32, 0x55, 0x19, 0x2c, 0x43, 0x5f, 0x73, 0x76, 0xc9, 0xda, 0xdd,
+ 0xc8, 0xd5, 0xdd, 0xc6, 0xd2, 0xdb, 0xc3, 0xd0, 0xd9, 0xc2, 0xce, 0xda,
+ 0xc0, 0xcc, 0xd9, 0xbf, 0xcb, 0xd8, 0xc2, 0xcd, 0xd9, 0xc2, 0xcc, 0xd8,
+ 0xc2, 0xcb, 0xda, 0xc2, 0xcc, 0xda, 0xc3, 0xcd, 0xda, 0xc5, 0xcf, 0xdb,
+ 0xc6, 0xcf, 0xda, 0xc8, 0xd2, 0xdc, 0xcd, 0xd6, 0xe1, 0xcf, 0xd7, 0xe2,
+ 0xd3, 0xdc, 0xe5, 0xd9, 0xe3, 0xea, 0xdf, 0xe8, 0xef, 0xe5, 0xee, 0xf3,
+ 0xe8, 0xf1, 0xf5, 0xe8, 0xf1, 0xf6, 0xe7, 0xf0, 0xf7, 0xe7, 0xef, 0xf6,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0c, 0x0b, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0f, 0x11, 0x10, 0x15, 0x17, 0x16, 0x1a, 0x1c, 0x1b,
+ 0x1a, 0x1a, 0x18, 0x1d, 0x1d, 0x1c, 0x25, 0x25, 0x24, 0x1e, 0x1e, 0x1c,
+ 0x1e, 0x1e, 0x1c, 0x1a, 0x1a, 0x18, 0x1a, 0x1a, 0x18, 0x1d, 0x1d, 0x1b,
+ 0x1d, 0x1c, 0x18, 0x1c, 0x1d, 0x18, 0x1d, 0x1e, 0x19, 0x1d, 0x20, 0x1c,
+ 0x20, 0x22, 0x1f, 0x21, 0x23, 0x20, 0x20, 0x20, 0x1e, 0x1c, 0x1c, 0x1a,
+ 0x15, 0x17, 0x14, 0x13, 0x15, 0x13, 0x17, 0x19, 0x18, 0x14, 0x16, 0x15,
+ 0x14, 0x16, 0x15, 0x1a, 0x1c, 0x1b, 0x1f, 0x1f, 0x1d, 0x1f, 0x1f, 0x1d,
+ 0x1b, 0x1d, 0x1a, 0x1d, 0x1f, 0x1c, 0x1e, 0x1f, 0x1c, 0x1d, 0x1d, 0x1b,
+ 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x17, 0x17, 0x17, 0x14, 0x16, 0x16, 0x15,
+ 0x0b, 0x0b, 0x0a, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x0e, 0x0e, 0x0d, 0x19, 0x19, 0x17, 0x11, 0x11, 0x0f, 0x0b, 0x0b, 0x09,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0b,
+ 0x17, 0x10, 0x0e, 0x2a, 0x23, 0x1f, 0x2f, 0x28, 0x24, 0x29, 0x21, 0x1e,
+ 0x21, 0x19, 0x16, 0x21, 0x19, 0x16, 0x23, 0x1c, 0x19, 0x25, 0x1e, 0x1d,
+ 0x22, 0x1d, 0x20, 0x1d, 0x19, 0x1a, 0x18, 0x14, 0x13, 0x16, 0x11, 0x0e,
+ 0x21, 0x1a, 0x17, 0x31, 0x29, 0x27, 0x31, 0x27, 0x28, 0x32, 0x27, 0x2b,
+ 0x3a, 0x34, 0x35, 0x37, 0x31, 0x2f, 0x30, 0x28, 0x26, 0x2d, 0x24, 0x22,
+ 0x3c, 0x33, 0x31, 0x49, 0x43, 0x42, 0x60, 0x5b, 0x5c, 0x70, 0x6b, 0x6d,
+ 0x7f, 0x75, 0x71, 0x85, 0x79, 0x75, 0x88, 0x7d, 0x7a, 0x84, 0x79, 0x77,
+ 0x70, 0x64, 0x64, 0x65, 0x59, 0x59, 0x5f, 0x51, 0x53, 0x3d, 0x2e, 0x33,
+ 0x3e, 0x2b, 0x32, 0x37, 0x26, 0x2c, 0x34, 0x25, 0x28, 0x30, 0x24, 0x26,
+ 0x32, 0x29, 0x2a, 0x29, 0x24, 0x25, 0x12, 0x10, 0x13, 0x0e, 0x0e, 0x0f,
+ 0x11, 0x10, 0x0e, 0x12, 0x11, 0x0f, 0x16, 0x15, 0x13, 0x1a, 0x16, 0x15,
+ 0x1f, 0x19, 0x18, 0x27, 0x21, 0x21, 0x2c, 0x26, 0x26, 0x28, 0x22, 0x21,
+ 0x22, 0x1e, 0x1b, 0x20, 0x1b, 0x1a, 0x20, 0x1c, 0x1b, 0x21, 0x1e, 0x1c,
+ 0x16, 0x13, 0x12, 0x17, 0x16, 0x14, 0x11, 0x10, 0x0e, 0x27, 0x26, 0x24,
+ 0x3d, 0x3f, 0x3e, 0x39, 0x3b, 0x3a, 0x3b, 0x3d, 0x3c, 0x3c, 0x3e, 0x3d,
+ 0x3a, 0x3c, 0x3b, 0x35, 0x37, 0x36, 0x36, 0x38, 0x35, 0x3f, 0x41, 0x3e,
+ 0x3f, 0x40, 0x43, 0x30, 0x33, 0x3a, 0x15, 0x1b, 0x25, 0x0d, 0x17, 0x21,
+ 0x0c, 0x18, 0x24, 0x11, 0x1c, 0x26, 0x0e, 0x17, 0x20, 0x0d, 0x14, 0x1c,
+ 0x10, 0x18, 0x25, 0x0f, 0x17, 0x24, 0x0f, 0x17, 0x24, 0x0e, 0x16, 0x21,
+ 0x0f, 0x18, 0x22, 0x10, 0x19, 0x22, 0x11, 0x1a, 0x21, 0x0f, 0x18, 0x1e,
+ 0x10, 0x17, 0x1f, 0x0e, 0x15, 0x1b, 0x0e, 0x15, 0x1b, 0x11, 0x18, 0x20,
+ 0x11, 0x18, 0x24, 0x14, 0x19, 0x29, 0x15, 0x1a, 0x29, 0x15, 0x19, 0x27,
+ 0x13, 0x1a, 0x1e, 0x16, 0x1b, 0x1e, 0x14, 0x19, 0x1c, 0x11, 0x16, 0x19,
+ 0x11, 0x15, 0x19, 0x0e, 0x12, 0x16, 0x0e, 0x13, 0x18, 0x0f, 0x13, 0x18,
+ 0x0f, 0x12, 0x16, 0x0f, 0x11, 0x14, 0x0f, 0x0f, 0x12, 0x10, 0x0e, 0x0f,
+ 0x13, 0x11, 0x12, 0x11, 0x11, 0x13, 0x10, 0x11, 0x13, 0x0f, 0x11, 0x13,
+ 0x0c, 0x10, 0x11, 0x0c, 0x0d, 0x0f, 0x0a, 0x0b, 0x0d, 0x0c, 0x0d, 0x0f,
+ 0x11, 0x15, 0x16, 0x24, 0x28, 0x29, 0x2d, 0x31, 0x32, 0x2a, 0x2e, 0x2f,
+ 0x24, 0x28, 0x29, 0x54, 0x55, 0x5c, 0x18, 0x16, 0x21, 0x19, 0x17, 0x1e,
+ 0x1a, 0x19, 0x17, 0x2a, 0x2a, 0x22, 0x5b, 0x5c, 0x54, 0x6e, 0x6e, 0x6a,
+ 0x68, 0x66, 0x65, 0x5b, 0x59, 0x5a, 0x4a, 0x49, 0x4a, 0x34, 0x34, 0x36,
+ 0x1f, 0x1f, 0x21, 0x12, 0x12, 0x12, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0c, 0x0f, 0x0f, 0x0d, 0x0e, 0x0e, 0x0e, 0x0d, 0x0f, 0x0e,
+ 0x0d, 0x0f, 0x0e, 0x0c, 0x0e, 0x0d, 0x0d, 0x11, 0x0d, 0x0b, 0x0f, 0x0c,
+ 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x0f, 0x11, 0x13, 0x10, 0x13, 0x13, 0x11,
+ 0x11, 0x10, 0x10, 0x18, 0x17, 0x18, 0x30, 0x31, 0x33, 0x3e, 0x43, 0x46,
+ 0x3d, 0x41, 0x45, 0x3d, 0x42, 0x48, 0x32, 0x36, 0x3f, 0x3b, 0x3f, 0x48,
+ 0x2f, 0x33, 0x3a, 0x13, 0x16, 0x1b, 0x0c, 0x0d, 0x0f, 0x0d, 0x0f, 0x0e,
+ 0x0f, 0x11, 0x10, 0x0c, 0x0e, 0x0d, 0x19, 0x1d, 0x1e, 0x1f, 0x23, 0x24,
+ 0x1d, 0x23, 0x23, 0x19, 0x1d, 0x1e, 0x16, 0x1a, 0x1b, 0x14, 0x18, 0x19,
+ 0x15, 0x19, 0x1a, 0x19, 0x1e, 0x1f, 0x1a, 0x1e, 0x1f, 0x19, 0x1d, 0x1e,
+ 0x1f, 0x23, 0x25, 0x1f, 0x24, 0x27, 0x20, 0x26, 0x29, 0x24, 0x29, 0x2d,
+ 0x2b, 0x2f, 0x32, 0x30, 0x38, 0x38, 0x52, 0x61, 0x5e, 0x9e, 0xad, 0xa8,
+ 0xe7, 0xf1, 0xee, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xf9, 0xf9, 0xfb, 0xed, 0xed, 0xef, 0xdf, 0xdf, 0xe1,
+ 0xce, 0xce, 0xd0, 0xbc, 0xbc, 0xbe, 0xaf, 0xaf, 0xaf, 0xa7, 0xa7, 0xa7,
+ 0xa3, 0xa7, 0xa3, 0xa4, 0xaa, 0xa8, 0xa7, 0xb0, 0xaf, 0xa1, 0xab, 0xab,
+ 0x92, 0x9d, 0xa3, 0x7c, 0x90, 0x9f, 0x64, 0x82, 0x9f, 0x51, 0x79, 0xa1,
+ 0x41, 0x76, 0xa3, 0x64, 0x8c, 0xa8, 0x93, 0xa5, 0xb2, 0x93, 0x9b, 0xa7,
+ 0x70, 0x87, 0x9a, 0x61, 0x93, 0xb2, 0x4c, 0x8e, 0xb6, 0x41, 0x88, 0xb6,
+ 0x3e, 0x8d, 0xb8, 0x35, 0x84, 0xb0, 0x2c, 0x7d, 0xaa, 0x35, 0x85, 0xb4,
+ 0x2e, 0x7e, 0xb1, 0x2a, 0x7b, 0xb0, 0x2e, 0x7f, 0xb6, 0x2c, 0x7c, 0xb3,
+ 0x27, 0x74, 0xac, 0x21, 0x73, 0xab, 0x21, 0x76, 0xae, 0x2d, 0x80, 0xb8,
+ 0x2c, 0x88, 0xbb, 0x2d, 0x93, 0xc4, 0x3c, 0x9f, 0xd9, 0x46, 0x9e, 0xe0,
+ 0x4d, 0x9c, 0xcf, 0x89, 0xbb, 0xe3, 0x6c, 0x81, 0xb5, 0x23, 0x36, 0x63,
+ 0x1b, 0x34, 0x53, 0x21, 0x35, 0x45, 0x96, 0xa9, 0xa4, 0xcd, 0xdd, 0xe2,
+ 0xc8, 0xd5, 0xde, 0xc4, 0xd1, 0xda, 0xc2, 0xce, 0xda, 0xc1, 0xcd, 0xd9,
+ 0xc0, 0xcc, 0xda, 0xbf, 0xcb, 0xd9, 0xbf, 0xcb, 0xd9, 0xbf, 0xcb, 0xd9,
+ 0xc0, 0xcc, 0xda, 0xc0, 0xcc, 0xda, 0xc3, 0xcc, 0xdb, 0xc5, 0xce, 0xdc,
+ 0xc4, 0xce, 0xda, 0xc5, 0xcf, 0xdb, 0xc9, 0xd3, 0xdf, 0xca, 0xd4, 0xe0,
+ 0xcd, 0xd5, 0xe0, 0xd0, 0xda, 0xe3, 0xd3, 0xdd, 0xe7, 0xdb, 0xe5, 0xee,
+ 0xe0, 0xea, 0xf3, 0xe5, 0xef, 0xf8, 0xe4, 0xee, 0xf7, 0xe0, 0xe9, 0xf2,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0d,
+ 0x13, 0x15, 0x14, 0x18, 0x1a, 0x19, 0x23, 0x25, 0x24, 0x1c, 0x1e, 0x1d,
+ 0x1b, 0x1b, 0x19, 0x1f, 0x1f, 0x1d, 0x1f, 0x1f, 0x1d, 0x1d, 0x1d, 0x1b,
+ 0x1d, 0x1d, 0x1b, 0x1a, 0x1a, 0x18, 0x1a, 0x1a, 0x18, 0x1e, 0x1e, 0x1c,
+ 0x1f, 0x1e, 0x1b, 0x1c, 0x1d, 0x1a, 0x1b, 0x1b, 0x19, 0x1c, 0x1e, 0x1b,
+ 0x26, 0x28, 0x25, 0x1f, 0x21, 0x1e, 0x21, 0x22, 0x1f, 0x1f, 0x1f, 0x1d,
+ 0x1d, 0x1f, 0x1c, 0x16, 0x18, 0x15, 0x12, 0x14, 0x13, 0x16, 0x18, 0x16,
+ 0x18, 0x1a, 0x19, 0x1f, 0x21, 0x20, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x1f,
+ 0x1b, 0x1b, 0x19, 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x17, 0x1c, 0x1c, 0x1a,
+ 0x20, 0x20, 0x1e, 0x1d, 0x1d, 0x1b, 0x1e, 0x1e, 0x1b, 0x1e, 0x1e, 0x1c,
+ 0x0e, 0x0e, 0x0d, 0x05, 0x05, 0x03, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05,
+ 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0b, 0x13, 0x13, 0x11, 0x10, 0x10, 0x0d, 0x0d, 0x0d, 0x0b,
+ 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0a,
+ 0x0a, 0x09, 0x07, 0x09, 0x08, 0x06, 0x0d, 0x0c, 0x0a, 0x13, 0x12, 0x10,
+ 0x10, 0x0f, 0x0d, 0x10, 0x0f, 0x0d, 0x14, 0x12, 0x12, 0x13, 0x11, 0x12,
+ 0x0f, 0x0f, 0x11, 0x0c, 0x0a, 0x0b, 0x11, 0x0d, 0x0c, 0x20, 0x1b, 0x18,
+ 0x2d, 0x26, 0x23, 0x2d, 0x24, 0x22, 0x2f, 0x25, 0x24, 0x33, 0x28, 0x28,
+ 0x31, 0x27, 0x2f, 0x38, 0x2f, 0x33, 0x58, 0x4f, 0x4e, 0x8b, 0x84, 0x7b,
+ 0xae, 0xa8, 0x99, 0xc1, 0xbd, 0xaa, 0xcf, 0xcd, 0xb8, 0xd9, 0xd8, 0xc1,
+ 0xde, 0xd8, 0xc0, 0xde, 0xd8, 0xc0, 0xdf, 0xd9, 0xc3, 0xe0, 0xda, 0xc6,
+ 0xdc, 0xd4, 0xc5, 0xd4, 0xcc, 0xc1, 0xaf, 0xa4, 0x9e, 0x7b, 0x6f, 0x6d,
+ 0x51, 0x3e, 0x46, 0x3d, 0x2b, 0x33, 0x39, 0x28, 0x2e, 0x30, 0x21, 0x26,
+ 0x2d, 0x22, 0x26, 0x31, 0x29, 0x2a, 0x23, 0x1f, 0x20, 0x0d, 0x0b, 0x0b,
+ 0x09, 0x09, 0x08, 0x0c, 0x0d, 0x0b, 0x0d, 0x0d, 0x0b, 0x0e, 0x0d, 0x0c,
+ 0x12, 0x11, 0x0f, 0x13, 0x12, 0x10, 0x19, 0x15, 0x14, 0x15, 0x11, 0x10,
+ 0x13, 0x12, 0x10, 0x10, 0x0f, 0x0d, 0x15, 0x14, 0x13, 0x1b, 0x1b, 0x19,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0c, 0x0c, 0x0c, 0x1e, 0x1e, 0x1e,
+ 0x3a, 0x3c, 0x3b, 0x38, 0x3a, 0x39, 0x37, 0x39, 0x38, 0x37, 0x39, 0x38,
+ 0x31, 0x33, 0x32, 0x3b, 0x3d, 0x3c, 0x3f, 0x41, 0x3e, 0x3f, 0x41, 0x3e,
+ 0x3f, 0x40, 0x45, 0x2f, 0x32, 0x3a, 0x13, 0x19, 0x24, 0x0d, 0x17, 0x22,
+ 0x0e, 0x1a, 0x25, 0x10, 0x1b, 0x25, 0x0e, 0x17, 0x1f, 0x11, 0x18, 0x20,
+ 0x15, 0x1e, 0x27, 0x10, 0x18, 0x23, 0x0f, 0x17, 0x22, 0x0c, 0x14, 0x20,
+ 0x0f, 0x16, 0x23, 0x11, 0x17, 0x23, 0x10, 0x16, 0x22, 0x11, 0x17, 0x23,
+ 0x13, 0x1b, 0x25, 0x1c, 0x24, 0x2c, 0x2c, 0x35, 0x3c, 0x3a, 0x42, 0x4d,
+ 0x4c, 0x53, 0x63, 0x59, 0x60, 0x72, 0x62, 0x69, 0x7b, 0x67, 0x6e, 0x7f,
+ 0x6a, 0x71, 0x82, 0x64, 0x6b, 0x7c, 0x5f, 0x65, 0x75, 0x54, 0x59, 0x6b,
+ 0x46, 0x4b, 0x5d, 0x33, 0x38, 0x4b, 0x2e, 0x34, 0x49, 0x1e, 0x24, 0x3a,
+ 0x0f, 0x15, 0x20, 0x0e, 0x12, 0x1b, 0x0e, 0x11, 0x18, 0x10, 0x11, 0x15,
+ 0x11, 0x11, 0x13, 0x0f, 0x11, 0x10, 0x0e, 0x13, 0x0f, 0x10, 0x15, 0x11,
+ 0x13, 0x14, 0x15, 0x0f, 0x10, 0x12, 0x0c, 0x10, 0x11, 0x14, 0x18, 0x19,
+ 0x21, 0x25, 0x27, 0x23, 0x27, 0x2a, 0x27, 0x2b, 0x2e, 0x20, 0x23, 0x26,
+ 0x1e, 0x1f, 0x21, 0x36, 0x36, 0x3a, 0x16, 0x13, 0x1a, 0x19, 0x17, 0x1a,
+ 0x1b, 0x1a, 0x16, 0x26, 0x26, 0x1e, 0x45, 0x46, 0x3e, 0x5b, 0x5c, 0x56,
+ 0x5a, 0x59, 0x55, 0x51, 0x50, 0x4c, 0x3d, 0x3c, 0x3b, 0x29, 0x28, 0x28,
+ 0x19, 0x18, 0x19, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0e, 0x0c, 0x0f, 0x0e, 0x0c, 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0c, 0x0c, 0x0e, 0x0b, 0x0b, 0x0d, 0x0a,
+ 0x0f, 0x0f, 0x11, 0x11, 0x13, 0x12, 0x0f, 0x12, 0x10, 0x12, 0x13, 0x10,
+ 0x12, 0x11, 0x11, 0x1c, 0x1c, 0x1d, 0x39, 0x3d, 0x40, 0x3a, 0x42, 0x45,
+ 0x3d, 0x41, 0x46, 0x34, 0x38, 0x3f, 0x35, 0x38, 0x41, 0x3e, 0x41, 0x49,
+ 0x25, 0x28, 0x2f, 0x0e, 0x12, 0x15, 0x0f, 0x10, 0x12, 0x0f, 0x11, 0x10,
+ 0x0f, 0x11, 0x10, 0x10, 0x12, 0x12, 0x1d, 0x22, 0x23, 0x1f, 0x24, 0x26,
+ 0x1a, 0x1f, 0x22, 0x17, 0x1b, 0x1c, 0x15, 0x19, 0x1a, 0x14, 0x18, 0x18,
+ 0x18, 0x1a, 0x1a, 0x1b, 0x1f, 0x1f, 0x1a, 0x1e, 0x1f, 0x1c, 0x20, 0x21,
+ 0x20, 0x24, 0x26, 0x1f, 0x24, 0x27, 0x1d, 0x23, 0x26, 0x20, 0x25, 0x28,
+ 0x2b, 0x2c, 0x30, 0x2b, 0x33, 0x34, 0x2d, 0x3c, 0x39, 0x62, 0x71, 0x6c,
+ 0xb1, 0xbe, 0xba, 0xef, 0xf5, 0xf3, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe,
+ 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xf8, 0xf8, 0xf9, 0xee, 0xee, 0xf0,
+ 0xe3, 0xe3, 0xe5, 0xd4, 0xd4, 0xd6, 0xc6, 0xc6, 0xc6, 0xba, 0xbb, 0xbb,
+ 0xb0, 0xb3, 0xb6, 0xa7, 0xab, 0xae, 0xa4, 0xa9, 0xaa, 0xa9, 0xa9, 0xa6,
+ 0xac, 0xaa, 0xa3, 0xa3, 0xa7, 0xa6, 0x90, 0xa1, 0xac, 0x76, 0x91, 0xa6,
+ 0x71, 0x8a, 0x9a, 0x8c, 0xa2, 0xa9, 0x8f, 0xaa, 0xb4, 0x69, 0x8d, 0xa9,
+ 0x53, 0x81, 0xa4, 0x4e, 0x89, 0xa6, 0x39, 0x80, 0xa3, 0x2c, 0x7c, 0xac,
+ 0x33, 0x81, 0xb3, 0x39, 0x87, 0xb8, 0x38, 0x87, 0xb7, 0x2d, 0x7c, 0xae,
+ 0x28, 0x77, 0xaa, 0x2d, 0x7e, 0xb1, 0x31, 0x83, 0xb5, 0x31, 0x83, 0xb6,
+ 0x2c, 0x7c, 0xb1, 0x28, 0x7c, 0xb2, 0x27, 0x7e, 0xb4, 0x2f, 0x87, 0xbf,
+ 0x33, 0x94, 0xc9, 0x34, 0xa0, 0xd3, 0x40, 0xa5, 0xdc, 0x4e, 0xa1, 0xe1,
+ 0x6d, 0xaf, 0xdb, 0x96, 0xba, 0xdf, 0x44, 0x53, 0x87, 0x20, 0x33, 0x5d,
+ 0x1a, 0x34, 0x4c, 0x40, 0x55, 0x5f, 0xbd, 0xcd, 0xc7, 0xca, 0xd8, 0xe0,
+ 0xc7, 0xd4, 0xdd, 0xc5, 0xd1, 0xdb, 0xc2, 0xce, 0xda, 0xc0, 0xcc, 0xda,
+ 0xc0, 0xcc, 0xda, 0xc0, 0xcc, 0xda, 0xbe, 0xcb, 0xd8, 0xbe, 0xcb, 0xd9,
+ 0xc0, 0xcc, 0xdc, 0xc0, 0xcc, 0xdb, 0xc1, 0xcd, 0xdb, 0xc3, 0xcf, 0xdd,
+ 0xc2, 0xce, 0xdc, 0xc3, 0xce, 0xdd, 0xc7, 0xd0, 0xdf, 0xc6, 0xd0, 0xdc,
+ 0xc9, 0xd3, 0xdf, 0xcc, 0xd6, 0xe2, 0xcb, 0xd6, 0xe2, 0xce, 0xda, 0xe6,
+ 0xd3, 0xe0, 0xe9, 0xda, 0xe4, 0xee, 0xda, 0xe4, 0xee, 0xcd, 0xd5, 0xe0,
+ 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x11, 0x11, 0x10, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x12, 0x14, 0x13,
+ 0x1e, 0x20, 0x1f, 0x1f, 0x21, 0x20, 0x2a, 0x2c, 0x2b, 0x21, 0x23, 0x22,
+ 0x1d, 0x1d, 0x1b, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1a, 0x1c, 0x1c, 0x1a,
+ 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x17, 0x1a, 0x1a, 0x18, 0x1f, 0x1f, 0x1d,
+ 0x20, 0x1f, 0x1d, 0x1d, 0x1d, 0x1b, 0x1a, 0x1a, 0x18, 0x22, 0x23, 0x21,
+ 0x25, 0x27, 0x24, 0x19, 0x1b, 0x19, 0x1c, 0x1d, 0x1a, 0x20, 0x20, 0x1e,
+ 0x1c, 0x1e, 0x1b, 0x1c, 0x1e, 0x1b, 0x19, 0x1b, 0x1a, 0x1d, 0x1f, 0x1e,
+ 0x1c, 0x1e, 0x1d, 0x1d, 0x1f, 0x1e, 0x22, 0x22, 0x20, 0x1d, 0x1d, 0x1b,
+ 0x1e, 0x1e, 0x1c, 0x1e, 0x1e, 0x1c, 0x1d, 0x1d, 0x1b, 0x20, 0x20, 0x1e,
+ 0x28, 0x28, 0x26, 0x1c, 0x1c, 0x1a, 0x1e, 0x1e, 0x1c, 0x1f, 0x1f, 0x1d,
+ 0x19, 0x19, 0x16, 0x0d, 0x0d, 0x0b, 0x08, 0x08, 0x06, 0x07, 0x07, 0x06,
+ 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x09, 0x11, 0x11, 0x0f, 0x0d, 0x0d, 0x0c, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x0a, 0x09, 0x09, 0x0a, 0x0c, 0x0c, 0x0e, 0x0d, 0x0d, 0x0f,
+ 0x0a, 0x0a, 0x0a, 0x0d, 0x0b, 0x0b, 0x1f, 0x1b, 0x1b, 0x2a, 0x24, 0x24,
+ 0x2c, 0x24, 0x22, 0x36, 0x2c, 0x2a, 0x35, 0x2a, 0x27, 0x38, 0x2d, 0x27,
+ 0x63, 0x56, 0x4d, 0xa2, 0x96, 0x8a, 0xd3, 0xc7, 0xb6, 0xe7, 0xdd, 0xc4,
+ 0xec, 0xe3, 0xc6, 0xf0, 0xe7, 0xc8, 0xeb, 0xe3, 0xc4, 0xeb, 0xe3, 0xc4,
+ 0xe9, 0xe6, 0xc1, 0xec, 0xea, 0xc5, 0xee, 0xeb, 0xc8, 0xeb, 0xe7, 0xc6,
+ 0xeb, 0xe6, 0xca, 0xec, 0xe6, 0xce, 0xe6, 0xdf, 0xcb, 0xdb, 0xd3, 0xc5,
+ 0xb1, 0xa5, 0xa4, 0x6f, 0x62, 0x62, 0x4a, 0x3a, 0x3d, 0x35, 0x24, 0x2a,
+ 0x30, 0x21, 0x26, 0x2d, 0x23, 0x24, 0x30, 0x2b, 0x29, 0x1f, 0x1c, 0x18,
+ 0x0b, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08, 0x09, 0x09,
+ 0x0b, 0x0c, 0x0b, 0x0c, 0x0c, 0x0c, 0x0b, 0x09, 0x0a, 0x0b, 0x09, 0x09,
+ 0x0b, 0x09, 0x0a, 0x09, 0x09, 0x09, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11,
+ 0x09, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x1f, 0x1f, 0x1f,
+ 0x39, 0x3b, 0x38, 0x38, 0x3a, 0x39, 0x37, 0x39, 0x38, 0x2e, 0x30, 0x2f,
+ 0x31, 0x33, 0x32, 0x3f, 0x41, 0x40, 0x3f, 0x41, 0x3e, 0x40, 0x42, 0x3f,
+ 0x40, 0x41, 0x44, 0x2f, 0x32, 0x39, 0x13, 0x1a, 0x24, 0x0e, 0x18, 0x23,
+ 0x0e, 0x19, 0x25, 0x0f, 0x19, 0x23, 0x0d, 0x16, 0x1f, 0x13, 0x1a, 0x21,
+ 0x14, 0x1d, 0x25, 0x11, 0x1a, 0x23, 0x10, 0x17, 0x21, 0x0f, 0x15, 0x21,
+ 0x0f, 0x15, 0x21, 0x12, 0x16, 0x21, 0x1d, 0x20, 0x2b, 0x38, 0x3c, 0x47,
+ 0x58, 0x5e, 0x6a, 0x77, 0x7d, 0x89, 0x93, 0x9a, 0xa4, 0xa4, 0xaa, 0xb2,
+ 0xb0, 0xb7, 0xc1, 0xb6, 0xbd, 0xc5, 0xb8, 0xbf, 0xc4, 0xb4, 0xbc, 0xc0,
+ 0xb4, 0xbc, 0xc8, 0xaf, 0xb5, 0xc2, 0xab, 0xb1, 0xbd, 0xab, 0xae, 0xbc,
+ 0xa3, 0xa8, 0xb6, 0x8c, 0x93, 0xa4, 0x7b, 0x83, 0x96, 0x5a, 0x65, 0x79,
+ 0x3b, 0x44, 0x54, 0x25, 0x2b, 0x3b, 0x13, 0x18, 0x25, 0x0f, 0x14, 0x1d,
+ 0x11, 0x14, 0x19, 0x0f, 0x13, 0x14, 0x0e, 0x13, 0x0f, 0x10, 0x15, 0x0e,
+ 0x11, 0x12, 0x12, 0x0f, 0x10, 0x12, 0x17, 0x1b, 0x1c, 0x2f, 0x33, 0x36,
+ 0x30, 0x34, 0x37, 0x1b, 0x1f, 0x22, 0x14, 0x18, 0x1b, 0x15, 0x16, 0x1a,
+ 0x19, 0x19, 0x1a, 0x19, 0x19, 0x1b, 0x19, 0x17, 0x1a, 0x19, 0x18, 0x18,
+ 0x1a, 0x19, 0x16, 0x1e, 0x1d, 0x18, 0x37, 0x36, 0x31, 0x4c, 0x4a, 0x46,
+ 0x4d, 0x4c, 0x48, 0x45, 0x44, 0x40, 0x30, 0x2f, 0x2d, 0x21, 0x1f, 0x20,
+ 0x16, 0x14, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0e, 0x0c, 0x0e, 0x0d, 0x0b, 0x10, 0x0e, 0x0f, 0x0e, 0x0c, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d, 0x0a, 0x0a, 0x08, 0x0b, 0x0b, 0x09,
+ 0x10, 0x10, 0x11, 0x11, 0x13, 0x12, 0x12, 0x14, 0x11, 0x0f, 0x11, 0x0e,
+ 0x10, 0x10, 0x10, 0x22, 0x22, 0x24, 0x3e, 0x42, 0x47, 0x3a, 0x40, 0x47,
+ 0x3d, 0x43, 0x48, 0x30, 0x35, 0x3b, 0x39, 0x3d, 0x46, 0x33, 0x36, 0x3f,
+ 0x1c, 0x1e, 0x25, 0x0e, 0x0f, 0x14, 0x0f, 0x10, 0x12, 0x0d, 0x0f, 0x0c,
+ 0x0e, 0x10, 0x0f, 0x13, 0x14, 0x16, 0x23, 0x26, 0x29, 0x1f, 0x23, 0x27,
+ 0x1c, 0x20, 0x23, 0x17, 0x1b, 0x1e, 0x15, 0x19, 0x1a, 0x17, 0x1b, 0x1a,
+ 0x18, 0x1a, 0x19, 0x1f, 0x21, 0x21, 0x23, 0x27, 0x28, 0x1a, 0x1e, 0x1f,
+ 0x1c, 0x20, 0x23, 0x1f, 0x23, 0x26, 0x20, 0x25, 0x28, 0x23, 0x28, 0x2b,
+ 0x28, 0x29, 0x2e, 0x2b, 0x30, 0x34, 0x28, 0x34, 0x34, 0x37, 0x46, 0x43,
+ 0x72, 0x7d, 0x79, 0xbd, 0xc5, 0xc3, 0xf8, 0xfc, 0xfc, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xfd, 0xf8, 0xf8, 0xfa,
+ 0xf0, 0xf0, 0xf2, 0xe5, 0xe5, 0xe7, 0xda, 0xda, 0xda, 0xd0, 0xd0, 0xcf,
+ 0xc8, 0xc5, 0xc4, 0xbd, 0xbd, 0xbf, 0xae, 0xaf, 0xb1, 0xa7, 0xa9, 0xa8,
+ 0xa7, 0xa8, 0xa4, 0xab, 0xac, 0xa6, 0xab, 0xae, 0xaa, 0xa4, 0xaa, 0xa9,
+ 0xa3, 0x9f, 0x9c, 0x91, 0x9c, 0xa3, 0x5d, 0x83, 0x9e, 0x42, 0x82, 0xaa,
+ 0x34, 0x7e, 0xaa, 0x33, 0x7c, 0xaa, 0x2d, 0x7b, 0xae, 0x27, 0x7c, 0xb4,
+ 0x30, 0x7f, 0xb6, 0x32, 0x81, 0xb7, 0x3a, 0x8a, 0xbf, 0x2d, 0x7d, 0xb1,
+ 0x27, 0x77, 0xab, 0x30, 0x82, 0xb4, 0x30, 0x84, 0xb3, 0x35, 0x8a, 0xba,
+ 0x2f, 0x83, 0xb7, 0x25, 0x7f, 0xb1, 0x2f, 0x8b, 0xbc, 0x41, 0x9c, 0xd3,
+ 0x42, 0xa4, 0xde, 0x3e, 0xa6, 0xdd, 0x4a, 0xa4, 0xd8, 0x62, 0xa6, 0xda,
+ 0x9d, 0xc6, 0xed, 0x74, 0x90, 0xb7, 0x27, 0x3c, 0x6b, 0x20, 0x34, 0x5a,
+ 0x1b, 0x32, 0x44, 0x71, 0x85, 0x8a, 0xcd, 0xdd, 0xdc, 0xcb, 0xd7, 0xdf,
+ 0xc6, 0xd3, 0xdc, 0xc2, 0xcf, 0xd8, 0xc0, 0xcc, 0xd8, 0xbf, 0xcb, 0xd9,
+ 0xbf, 0xcb, 0xd9, 0xc0, 0xcc, 0xda, 0xbf, 0xcd, 0xda, 0xbe, 0xcc, 0xda,
+ 0xbf, 0xcc, 0xdb, 0xbe, 0xcc, 0xd9, 0xc1, 0xce, 0xdb, 0xc0, 0xcc, 0xda,
+ 0xc1, 0xce, 0xdc, 0xc2, 0xce, 0xdc, 0xc2, 0xcd, 0xdc, 0xc3, 0xce, 0xdc,
+ 0xc6, 0xd0, 0xdc, 0xc6, 0xd1, 0xdd, 0xc6, 0xd2, 0xe0, 0xc8, 0xd4, 0xe2,
+ 0xca, 0xd6, 0xe4, 0xcd, 0xd7, 0xe3, 0xc9, 0xd1, 0xdd, 0xb6, 0xbc, 0xc8,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0f, 0x0f, 0x0d, 0x0a, 0x0a, 0x08, 0x12, 0x14, 0x11, 0x1b, 0x1d, 0x1a,
+ 0x1d, 0x1f, 0x1d, 0x1c, 0x1e, 0x1b, 0x1e, 0x20, 0x1e, 0x1e, 0x20, 0x1d,
+ 0x1c, 0x1d, 0x18, 0x1c, 0x1d, 0x19, 0x1c, 0x1c, 0x19, 0x1b, 0x1b, 0x19,
+ 0x1a, 0x1a, 0x18, 0x1a, 0x1a, 0x17, 0x13, 0x13, 0x12, 0x17, 0x17, 0x17,
+ 0x1f, 0x1d, 0x1e, 0x1e, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x28, 0x2a, 0x29,
+ 0x21, 0x23, 0x22, 0x1a, 0x1c, 0x1a, 0x1b, 0x1b, 0x1b, 0x1e, 0x1e, 0x1d,
+ 0x1c, 0x1e, 0x1a, 0x25, 0x27, 0x24, 0x27, 0x29, 0x26, 0x1c, 0x1e, 0x1d,
+ 0x1f, 0x21, 0x20, 0x1f, 0x21, 0x1e, 0x1e, 0x1e, 0x1c, 0x1b, 0x1b, 0x19,
+ 0x20, 0x20, 0x1e, 0x2d, 0x2d, 0x2b, 0x20, 0x20, 0x1e, 0x1d, 0x1d, 0x1c,
+ 0x23, 0x23, 0x21, 0x1b, 0x1b, 0x19, 0x20, 0x20, 0x1e, 0x1f, 0x1f, 0x1d,
+ 0x20, 0x21, 0x1c, 0x1e, 0x1f, 0x1c, 0x11, 0x12, 0x0f, 0x08, 0x08, 0x06,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x10, 0x10, 0x10, 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10,
+ 0x11, 0x11, 0x11, 0x0a, 0x0a, 0x0a, 0x08, 0x06, 0x07, 0x0a, 0x08, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x09, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x07, 0x21, 0x20, 0x1f, 0x2b, 0x28, 0x27, 0x29, 0x20, 0x23,
+ 0x34, 0x2a, 0x2a, 0x3a, 0x2f, 0x2b, 0x5d, 0x53, 0x4b, 0x9b, 0x91, 0x84,
+ 0xd6, 0xce, 0xb2, 0xeb, 0xe3, 0xc5, 0xf2, 0xe9, 0xc9, 0xea, 0xe2, 0xbf,
+ 0xf0, 0xe8, 0xc6, 0xef, 0xe6, 0xc9, 0xec, 0xe2, 0xc9, 0xee, 0xe4, 0xcd,
+ 0xed, 0xe8, 0xc9, 0xea, 0xe5, 0xc4, 0xe7, 0xe3, 0xc0, 0xe4, 0xdf, 0xbc,
+ 0xea, 0xe5, 0xc5, 0xeb, 0xe6, 0xc7, 0xe7, 0xe1, 0xc6, 0xe8, 0xe1, 0xca,
+ 0xe8, 0xe4, 0xcf, 0xce, 0xc7, 0xba, 0x78, 0x6b, 0x66, 0x43, 0x32, 0x34,
+ 0x37, 0x27, 0x2a, 0x31, 0x22, 0x25, 0x30, 0x25, 0x23, 0x2d, 0x26, 0x1e,
+ 0x17, 0x13, 0x14, 0x0c, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08,
+ 0x0a, 0x0b, 0x0a, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0c, 0x0a, 0x0a, 0x0b,
+ 0x0a, 0x08, 0x09, 0x09, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0a, 0x0c, 0x0b,
+ 0x09, 0x0b, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x09, 0x08, 0x20, 0x1f, 0x1d,
+ 0x35, 0x37, 0x34, 0x35, 0x37, 0x36, 0x35, 0x37, 0x36, 0x2e, 0x30, 0x2f,
+ 0x36, 0x38, 0x37, 0x3d, 0x3f, 0x3c, 0x41, 0x43, 0x3f, 0x41, 0x43, 0x40,
+ 0x40, 0x41, 0x44, 0x2e, 0x32, 0x37, 0x14, 0x1b, 0x23, 0x11, 0x1b, 0x25,
+ 0x0d, 0x19, 0x25, 0x0d, 0x16, 0x21, 0x0b, 0x14, 0x1e, 0x0f, 0x16, 0x1e,
+ 0x12, 0x1a, 0x23, 0x11, 0x1a, 0x24, 0x10, 0x17, 0x21, 0x0f, 0x16, 0x1f,
+ 0x1b, 0x20, 0x26, 0x3d, 0x41, 0x45, 0x73, 0x75, 0x77, 0x9f, 0xa1, 0xa0,
+ 0xb8, 0xb9, 0xbd, 0xc1, 0xc2, 0xc6, 0xc9, 0xcc, 0xcb, 0xcd, 0xd1, 0xd0,
+ 0xcd, 0xd1, 0xd0, 0xcb, 0xcf, 0xce, 0xca, 0xce, 0xc9, 0xc9, 0xce, 0xc8,
+ 0xc5, 0xc9, 0xc8, 0xc3, 0xc8, 0xc5, 0xc1, 0xc3, 0xc1, 0xbc, 0xbe, 0xbc,
+ 0xbe, 0xc2, 0xc2, 0xb9, 0xc1, 0xc3, 0xa9, 0xb2, 0xb7, 0x97, 0xa4, 0xab,
+ 0x89, 0x93, 0xa2, 0x72, 0x7a, 0x8b, 0x50, 0x58, 0x69, 0x2e, 0x36, 0x45,
+ 0x16, 0x1b, 0x28, 0x14, 0x16, 0x20, 0x16, 0x17, 0x1a, 0x15, 0x15, 0x15,
+ 0x14, 0x14, 0x14, 0x1b, 0x1c, 0x1e, 0x30, 0x32, 0x35, 0x3d, 0x41, 0x44,
+ 0x37, 0x3a, 0x3f, 0x23, 0x26, 0x2b, 0x11, 0x12, 0x16, 0x11, 0x11, 0x15,
+ 0x19, 0x19, 0x17, 0x16, 0x16, 0x14, 0x18, 0x16, 0x17, 0x1a, 0x19, 0x17,
+ 0x1a, 0x16, 0x14, 0x1d, 0x19, 0x16, 0x2b, 0x27, 0x24, 0x3a, 0x36, 0x33,
+ 0x3e, 0x3a, 0x37, 0x35, 0x31, 0x2e, 0x25, 0x24, 0x22, 0x1b, 0x19, 0x1a,
+ 0x11, 0x0e, 0x10, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0e,
+ 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x09, 0x09, 0x09, 0x0e, 0x0e, 0x0c,
+ 0x0f, 0x0f, 0x11, 0x11, 0x12, 0x12, 0x13, 0x15, 0x12, 0x11, 0x13, 0x10,
+ 0x11, 0x12, 0x10, 0x2d, 0x2f, 0x30, 0x3e, 0x43, 0x48, 0x3a, 0x43, 0x48,
+ 0x36, 0x3f, 0x44, 0x2f, 0x36, 0x3e, 0x3a, 0x3e, 0x47, 0x2b, 0x2e, 0x38,
+ 0x1a, 0x1a, 0x22, 0x12, 0x13, 0x18, 0x13, 0x13, 0x15, 0x11, 0x11, 0x11,
+ 0x0f, 0x10, 0x0f, 0x16, 0x17, 0x19, 0x23, 0x24, 0x28, 0x1e, 0x21, 0x26,
+ 0x19, 0x1d, 0x20, 0x14, 0x18, 0x1b, 0x15, 0x16, 0x18, 0x17, 0x19, 0x18,
+ 0x15, 0x17, 0x16, 0x25, 0x27, 0x26, 0x29, 0x2d, 0x2e, 0x16, 0x1a, 0x1b,
+ 0x18, 0x1c, 0x1d, 0x1c, 0x20, 0x23, 0x1e, 0x23, 0x26, 0x21, 0x25, 0x29,
+ 0x27, 0x28, 0x2f, 0x2a, 0x2f, 0x34, 0x2c, 0x36, 0x38, 0x2e, 0x39, 0x39,
+ 0x43, 0x4d, 0x4c, 0x7c, 0x85, 0x84, 0xc6, 0xcf, 0xce, 0xf9, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0xfe, 0xff, 0xfd, 0xfc, 0xff,
+ 0xf7, 0xf7, 0xf9, 0xef, 0xef, 0xef, 0xe8, 0xe8, 0xe8, 0xe0, 0xe0, 0xe0,
+ 0xd8, 0xd8, 0xd7, 0xd1, 0xd1, 0xcf, 0xc4, 0xc4, 0xc4, 0xbe, 0xbe, 0xc0,
+ 0xb6, 0xba, 0xbb, 0xaa, 0xae, 0xad, 0xac, 0xae, 0xa9, 0xae, 0xb0, 0xa8,
+ 0x9a, 0xa7, 0xab, 0x67, 0x88, 0x9d, 0x46, 0x78, 0x9e, 0x47, 0x80, 0xb0,
+ 0x35, 0x73, 0xa5, 0x2c, 0x77, 0xac, 0x27, 0x7b, 0xb1, 0x27, 0x7f, 0xb1,
+ 0x2c, 0x7d, 0xb2, 0x2b, 0x7b, 0xb0, 0x35, 0x86, 0xbb, 0x2f, 0x81, 0xb6,
+ 0x28, 0x7b, 0xaf, 0x34, 0x8a, 0xbd, 0x2a, 0x83, 0xb5, 0x2f, 0x89, 0xbc,
+ 0x2f, 0x8a, 0xc3, 0x30, 0x90, 0xc2, 0x3b, 0x9a, 0xc8, 0x49, 0xa5, 0xda,
+ 0x51, 0xae, 0xec, 0x4a, 0xa6, 0xe0, 0x5b, 0xa3, 0xd1, 0x92, 0xc1, 0xe5,
+ 0xa2, 0xb5, 0xd6, 0x4d, 0x65, 0x90, 0x21, 0x3d, 0x66, 0x1d, 0x34, 0x55,
+ 0x2a, 0x3d, 0x4a, 0xa3, 0xb6, 0xb8, 0xce, 0xde, 0xe5, 0xcc, 0xd5, 0xdc,
+ 0xc5, 0xd2, 0xdb, 0xc1, 0xce, 0xd8, 0xc0, 0xcc, 0xd8, 0xc0, 0xcc, 0xd8,
+ 0xbf, 0xcb, 0xd9, 0xbf, 0xcd, 0xda, 0xbf, 0xcd, 0xda, 0xbe, 0xcc, 0xd9,
+ 0xc0, 0xcd, 0xdb, 0xbe, 0xcc, 0xd9, 0xc0, 0xce, 0xdb, 0xc0, 0xce, 0xdb,
+ 0xc1, 0xcf, 0xdc, 0xc3, 0xcf, 0xdd, 0xc2, 0xce, 0xdc, 0xc3, 0xcf, 0xdd,
+ 0xc5, 0xd0, 0xdb, 0xc4, 0xd0, 0xdd, 0xc4, 0xd0, 0xdf, 0xc4, 0xd0, 0xe0,
+ 0xc7, 0xd1, 0xe0, 0xc5, 0xcd, 0xdc, 0xbb, 0xbe, 0xcd, 0xa8, 0xaa, 0xb9,
+ 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0f, 0x0d, 0x1d, 0x1f, 0x1c, 0x1d, 0x1f, 0x1c, 0x1e, 0x1f, 0x1c,
+ 0x1a, 0x1c, 0x19, 0x1b, 0x1d, 0x1a, 0x1d, 0x1f, 0x1c, 0x1c, 0x1e, 0x1b,
+ 0x1e, 0x1f, 0x1a, 0x1c, 0x1d, 0x18, 0x1c, 0x1d, 0x19, 0x1e, 0x1e, 0x1c,
+ 0x17, 0x17, 0x15, 0x10, 0x10, 0x0e, 0x09, 0x09, 0x09, 0x0c, 0x0b, 0x0b,
+ 0x14, 0x12, 0x13, 0x1b, 0x1b, 0x1b, 0x1e, 0x1e, 0x1e, 0x24, 0x26, 0x25,
+ 0x21, 0x23, 0x22, 0x1c, 0x1e, 0x1d, 0x1c, 0x1c, 0x1c, 0x1e, 0x1e, 0x1e,
+ 0x1e, 0x20, 0x1e, 0x29, 0x2b, 0x28, 0x28, 0x2a, 0x27, 0x1e, 0x20, 0x1f,
+ 0x21, 0x23, 0x22, 0x1b, 0x1d, 0x1a, 0x1c, 0x1c, 0x1a, 0x1c, 0x1c, 0x1a,
+ 0x1c, 0x1c, 0x1b, 0x1e, 0x1e, 0x1e, 0x23, 0x23, 0x23, 0x1e, 0x1e, 0x1e,
+ 0x1f, 0x1f, 0x1f, 0x1b, 0x1b, 0x1b, 0x22, 0x22, 0x21, 0x1e, 0x1e, 0x1e,
+ 0x1f, 0x20, 0x1b, 0x22, 0x23, 0x1e, 0x1e, 0x1f, 0x1c, 0x16, 0x16, 0x14,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0d, 0x0e, 0x0e,
+ 0x0c, 0x0e, 0x0d, 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x09, 0x07, 0x07, 0x09, 0x08, 0x06, 0x09, 0x08, 0x06,
+ 0x09, 0x09, 0x07, 0x09, 0x09, 0x07, 0x09, 0x09, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x07,
+ 0x18, 0x18, 0x13, 0x2c, 0x2a, 0x27, 0x2d, 0x26, 0x27, 0x38, 0x2e, 0x30,
+ 0x35, 0x2b, 0x2c, 0x62, 0x58, 0x54, 0xc4, 0xbb, 0xae, 0xe6, 0xde, 0xcc,
+ 0xed, 0xea, 0xd3, 0xf0, 0xee, 0xd4, 0xef, 0xee, 0xd0, 0xe9, 0xe8, 0xc9,
+ 0xed, 0xec, 0xcd, 0xea, 0xe8, 0xca, 0xe5, 0xe1, 0xc6, 0xe1, 0xdc, 0xc4,
+ 0xe0, 0xd9, 0xc3, 0xe3, 0xdc, 0xc3, 0xdd, 0xd6, 0xba, 0xe2, 0xdb, 0xbd,
+ 0xeb, 0xe6, 0xc6, 0xeb, 0xe5, 0xc6, 0xeb, 0xe4, 0xc7, 0xe8, 0xe2, 0xc5,
+ 0xe4, 0xe5, 0xc1, 0xe3, 0xe2, 0xc6, 0xd1, 0xc8, 0xb9, 0x75, 0x65, 0x62,
+ 0x3f, 0x2c, 0x30, 0x32, 0x22, 0x25, 0x2f, 0x21, 0x1f, 0x2d, 0x23, 0x1d,
+ 0x24, 0x1e, 0x1f, 0x12, 0x0e, 0x0f, 0x09, 0x07, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x0b, 0x0a, 0x0d, 0x0e, 0x0e, 0x0d, 0x0d, 0x0c, 0x0c, 0x0b, 0x0c,
+ 0x0b, 0x09, 0x0a, 0x0a, 0x08, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x0b, 0x0a,
+ 0x08, 0x0a, 0x09, 0x0b, 0x0b, 0x09, 0x0d, 0x0c, 0x0a, 0x21, 0x20, 0x1e,
+ 0x34, 0x36, 0x33, 0x30, 0x32, 0x30, 0x31, 0x33, 0x32, 0x2c, 0x2d, 0x2d,
+ 0x37, 0x39, 0x37, 0x3c, 0x3e, 0x3b, 0x41, 0x43, 0x40, 0x42, 0x43, 0x40,
+ 0x3f, 0x3f, 0x41, 0x2e, 0x31, 0x36, 0x15, 0x1c, 0x24, 0x11, 0x1b, 0x26,
+ 0x0f, 0x19, 0x25, 0x0e, 0x18, 0x24, 0x0c, 0x14, 0x1f, 0x0e, 0x16, 0x1f,
+ 0x12, 0x1b, 0x26, 0x13, 0x1b, 0x25, 0x18, 0x20, 0x27, 0x32, 0x37, 0x3b,
+ 0x64, 0x68, 0x68, 0x94, 0x96, 0x91, 0xb7, 0xb8, 0xb0, 0xc2, 0xc3, 0xb8,
+ 0xce, 0xce, 0xc3, 0xd0, 0xd1, 0xc4, 0xcd, 0xce, 0xc0, 0xc9, 0xca, 0xbe,
+ 0xcd, 0xcd, 0xc5, 0xce, 0xcf, 0xca, 0xce, 0xcf, 0xc8, 0xce, 0xcf, 0xc8,
+ 0xcb, 0xcb, 0xc6, 0xc9, 0xc9, 0xc3, 0xc5, 0xc4, 0xbf, 0xc6, 0xc6, 0xc1,
+ 0xbf, 0xc0, 0xbe, 0xc6, 0xca, 0xcc, 0xc4, 0xcb, 0xce, 0xb8, 0xc2, 0xc8,
+ 0xad, 0xb7, 0xc4, 0xa1, 0xaa, 0xb9, 0x90, 0x99, 0xa9, 0x72, 0x7a, 0x8d,
+ 0x4a, 0x50, 0x62, 0x2b, 0x2d, 0x3d, 0x1d, 0x1c, 0x27, 0x1a, 0x18, 0x1f,
+ 0x24, 0x24, 0x24, 0x30, 0x30, 0x32, 0x37, 0x38, 0x3c, 0x2e, 0x31, 0x36,
+ 0x27, 0x2a, 0x2f, 0x30, 0x33, 0x37, 0x1e, 0x1f, 0x25, 0x15, 0x16, 0x1a,
+ 0x16, 0x17, 0x13, 0x18, 0x18, 0x15, 0x16, 0x16, 0x14, 0x19, 0x17, 0x15,
+ 0x19, 0x15, 0x14, 0x19, 0x15, 0x14, 0x20, 0x1b, 0x18, 0x26, 0x22, 0x1f,
+ 0x29, 0x25, 0x23, 0x27, 0x24, 0x21, 0x1e, 0x1d, 0x1b, 0x15, 0x13, 0x14,
+ 0x10, 0x0e, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0c, 0x0e, 0x0b, 0x0d, 0x0f, 0x0e, 0x0d, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d, 0x0f, 0x0e, 0x0d,
+ 0x12, 0x10, 0x13, 0x11, 0x11, 0x11, 0x10, 0x12, 0x0f, 0x0f, 0x10, 0x0b,
+ 0x17, 0x18, 0x15, 0x35, 0x37, 0x38, 0x3a, 0x3f, 0x43, 0x39, 0x42, 0x47,
+ 0x30, 0x39, 0x40, 0x32, 0x3b, 0x42, 0x38, 0x3e, 0x47, 0x26, 0x27, 0x32,
+ 0x13, 0x12, 0x1c, 0x12, 0x13, 0x18, 0x13, 0x13, 0x15, 0x10, 0x10, 0x10,
+ 0x0e, 0x0f, 0x0f, 0x1a, 0x1a, 0x1d, 0x21, 0x22, 0x26, 0x20, 0x22, 0x27,
+ 0x17, 0x1a, 0x1f, 0x15, 0x16, 0x1a, 0x15, 0x17, 0x16, 0x17, 0x18, 0x17,
+ 0x16, 0x17, 0x16, 0x22, 0x24, 0x23, 0x25, 0x28, 0x29, 0x16, 0x1a, 0x1b,
+ 0x1a, 0x1e, 0x1f, 0x1a, 0x1e, 0x21, 0x1d, 0x21, 0x24, 0x21, 0x25, 0x29,
+ 0x22, 0x26, 0x2c, 0x27, 0x2c, 0x32, 0x27, 0x30, 0x33, 0x2c, 0x37, 0x37,
+ 0x37, 0x40, 0x3f, 0x48, 0x51, 0x50, 0x75, 0x7f, 0x7e, 0xc7, 0xd2, 0xd1,
+ 0xf8, 0xfa, 0xf9, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xfd, 0xfd, 0xfe,
+ 0xfa, 0xfa, 0xfc, 0xf4, 0xf3, 0xf4, 0xf0, 0xf0, 0xf0, 0xec, 0xed, 0xec,
+ 0xe1, 0xe9, 0xe8, 0xdc, 0xe0, 0xdd, 0xda, 0xd8, 0xd3, 0xd8, 0xd4, 0xd1,
+ 0xcc, 0xcd, 0xce, 0xb8, 0xbf, 0xc2, 0xb4, 0xbe, 0xbf, 0xa9, 0xb6, 0xb9,
+ 0x63, 0x93, 0xb3, 0x38, 0x84, 0xa9, 0x2e, 0x84, 0xae, 0x32, 0x7d, 0xb0,
+ 0x31, 0x7e, 0xb0, 0x25, 0x83, 0xb2, 0x26, 0x84, 0xb5, 0x2b, 0x7e, 0xb2,
+ 0x31, 0x85, 0xb7, 0x2c, 0x7f, 0xb1, 0x2c, 0x80, 0xb2, 0x2c, 0x81, 0xb5,
+ 0x29, 0x80, 0xb5, 0x33, 0x8d, 0xc2, 0x31, 0x8f, 0xc3, 0x33, 0x92, 0xc8,
+ 0x36, 0x94, 0xd3, 0x44, 0xa7, 0xd9, 0x4d, 0xae, 0xdc, 0x50, 0xaa, 0xe0,
+ 0x4d, 0xa3, 0xe3, 0x59, 0xa6, 0xe2, 0x88, 0xbf, 0xe6, 0xa5, 0xc2, 0xda,
+ 0x82, 0x89, 0xa6, 0x3c, 0x53, 0x80, 0x1a, 0x3c, 0x61, 0x1c, 0x35, 0x52,
+ 0x4c, 0x5f, 0x69, 0xc1, 0xd5, 0xd5, 0xc9, 0xd7, 0xe4, 0xc8, 0xd0, 0xda,
+ 0xc4, 0xd0, 0xd8, 0xc1, 0xce, 0xd8, 0xc0, 0xcc, 0xd8, 0xc0, 0xcc, 0xd8,
+ 0xbf, 0xcb, 0xd9, 0xbe, 0xcb, 0xd9, 0xbe, 0xcc, 0xd9, 0xbe, 0xcc, 0xd9,
+ 0xbe, 0xcc, 0xd9, 0xbf, 0xce, 0xdb, 0xbf, 0xce, 0xdb, 0xc0, 0xce, 0xdb,
+ 0xc0, 0xcf, 0xdc, 0xc2, 0xd0, 0xdd, 0xc1, 0xcf, 0xdc, 0xc1, 0xcf, 0xdc,
+ 0xc4, 0xce, 0xdb, 0xc3, 0xcf, 0xde, 0xc3, 0xcf, 0xdd, 0xc2, 0xcf, 0xdf,
+ 0xc5, 0xce, 0xdf, 0xc0, 0xc6, 0xd6, 0xb1, 0xb2, 0xc2, 0xa2, 0xa1, 0xb1,
+ 0x06, 0x06, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x09, 0x06, 0x06, 0x04, 0x06, 0x06, 0x05, 0x0c, 0x0d, 0x0b,
+ 0x17, 0x19, 0x18, 0x29, 0x2a, 0x29, 0x20, 0x20, 0x1e, 0x1e, 0x1f, 0x1a,
+ 0x1f, 0x20, 0x1b, 0x1c, 0x1e, 0x1b, 0x19, 0x1c, 0x1b, 0x18, 0x1c, 0x1b,
+ 0x1d, 0x1f, 0x1c, 0x1c, 0x1e, 0x1b, 0x1d, 0x1d, 0x1b, 0x1a, 0x1a, 0x18,
+ 0x0f, 0x0f, 0x0d, 0x09, 0x09, 0x07, 0x05, 0x05, 0x03, 0x08, 0x08, 0x06,
+ 0x0a, 0x0a, 0x0a, 0x10, 0x10, 0x10, 0x17, 0x17, 0x17, 0x1d, 0x1d, 0x1d,
+ 0x22, 0x22, 0x22, 0x20, 0x20, 0x20, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c,
+ 0x1e, 0x1e, 0x1e, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x1f,
+ 0x1e, 0x1e, 0x1d, 0x1a, 0x1b, 0x19, 0x1c, 0x1c, 0x1a, 0x1a, 0x1b, 0x17,
+ 0x1a, 0x1a, 0x1a, 0x17, 0x17, 0x15, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1a,
+ 0x1b, 0x1b, 0x19, 0x1c, 0x1c, 0x1a, 0x1c, 0x1c, 0x1a, 0x1c, 0x1c, 0x1b,
+ 0x1a, 0x1b, 0x17, 0x1b, 0x1b, 0x18, 0x22, 0x21, 0x20, 0x23, 0x23, 0x21,
+ 0x1c, 0x1c, 0x1a, 0x11, 0x11, 0x11, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0c, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14,
+ 0x10, 0x10, 0x10, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x09, 0x08, 0x08, 0x09, 0x07, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x0a, 0x09, 0x08, 0x06, 0x13, 0x0e, 0x0d,
+ 0x2c, 0x1f, 0x1f, 0x34, 0x27, 0x26, 0x38, 0x2d, 0x2c, 0x3b, 0x30, 0x2a,
+ 0x5c, 0x53, 0x45, 0xcf, 0xc9, 0xb4, 0xf0, 0xea, 0xd2, 0xf1, 0xeb, 0xd3,
+ 0xf2, 0xec, 0xd5, 0xf4, 0xee, 0xd6, 0xef, 0xea, 0xd1, 0xec, 0xe8, 0xcd,
+ 0xee, 0xeb, 0xcf, 0xe4, 0xe0, 0xc5, 0xd7, 0xd4, 0xb9, 0xdb, 0xd9, 0xbe,
+ 0xd2, 0xcf, 0xb3, 0xd4, 0xd0, 0xb3, 0xdd, 0xd8, 0xbc, 0xec, 0xe6, 0xc9,
+ 0xef, 0xea, 0xcc, 0xed, 0xe6, 0xc9, 0xe0, 0xd9, 0xbd, 0xe0, 0xd9, 0xbd,
+ 0xe4, 0xe0, 0xbd, 0xe1, 0xdd, 0xbc, 0xea, 0xe4, 0xca, 0xb9, 0xb1, 0xa3,
+ 0x50, 0x45, 0x43, 0x32, 0x26, 0x2a, 0x2f, 0x23, 0x23, 0x2d, 0x22, 0x1e,
+ 0x2a, 0x22, 0x20, 0x17, 0x13, 0x11, 0x0a, 0x0a, 0x08, 0x0a, 0x0a, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0a, 0x0b, 0x0a, 0x09, 0x07, 0x08, 0x09, 0x07,
+ 0x09, 0x09, 0x0b, 0x08, 0x08, 0x0a, 0x07, 0x08, 0x0a, 0x09, 0x0a, 0x0c,
+ 0x06, 0x08, 0x08, 0x07, 0x09, 0x08, 0x09, 0x0b, 0x0a, 0x1d, 0x1f, 0x1e,
+ 0x32, 0x33, 0x31, 0x32, 0x32, 0x30, 0x34, 0x34, 0x34, 0x28, 0x28, 0x28,
+ 0x34, 0x34, 0x34, 0x3b, 0x3b, 0x3b, 0x40, 0x40, 0x3e, 0x3d, 0x3d, 0x3b,
+ 0x38, 0x3d, 0x37, 0x2f, 0x32, 0x2f, 0x1a, 0x1e, 0x21, 0x16, 0x1b, 0x24,
+ 0x12, 0x1a, 0x27, 0x0e, 0x18, 0x24, 0x0e, 0x17, 0x20, 0x0d, 0x14, 0x1a,
+ 0x10, 0x19, 0x21, 0x1d, 0x25, 0x2a, 0x4c, 0x53, 0x51, 0x86, 0x89, 0x80,
+ 0xa9, 0xab, 0x9d, 0xb6, 0xb7, 0xa5, 0xbc, 0xbc, 0xab, 0xc4, 0xc5, 0xb3,
+ 0xc8, 0xc7, 0xb9, 0xca, 0xcb, 0xbd, 0xcb, 0xcc, 0xbd, 0xc7, 0xc9, 0xbb,
+ 0xc6, 0xc8, 0xbb, 0xc8, 0xc9, 0xbc, 0xce, 0xd0, 0xc4, 0xac, 0xae, 0xa1,
+ 0x9f, 0xa0, 0x93, 0xce, 0xcf, 0xc1, 0xcd, 0xce, 0xc3, 0xcd, 0xcf, 0xca,
+ 0xc6, 0xc9, 0xca, 0xcb, 0xcf, 0xd2, 0xcb, 0xcf, 0xd0, 0xc7, 0xcb, 0xcb,
+ 0xc2, 0xc7, 0xcb, 0xb6, 0xbb, 0xc0, 0xaa, 0xb1, 0xb9, 0x9c, 0xa3, 0xaf,
+ 0x86, 0x8e, 0x9c, 0x6a, 0x70, 0x80, 0x3b, 0x40, 0x53, 0x2e, 0x33, 0x44,
+ 0x3a, 0x3c, 0x39, 0x3b, 0x3b, 0x40, 0x31, 0x34, 0x40, 0x1f, 0x23, 0x2c,
+ 0x17, 0x1c, 0x1d, 0x2a, 0x2f, 0x2b, 0x2d, 0x31, 0x33, 0x1b, 0x1b, 0x22,
+ 0x18, 0x18, 0x19, 0x18, 0x17, 0x17, 0x18, 0x16, 0x17, 0x19, 0x17, 0x17,
+ 0x19, 0x17, 0x16, 0x17, 0x16, 0x14, 0x16, 0x15, 0x13, 0x18, 0x17, 0x15,
+ 0x1b, 0x1b, 0x1a, 0x1b, 0x1b, 0x1b, 0x15, 0x15, 0x15, 0x10, 0x10, 0x10,
+ 0x0f, 0x0e, 0x0f, 0x0e, 0x0e, 0x0d, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x0e, 0x0e, 0x0e, 0x0f, 0x10, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0d,
+ 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x11, 0x12, 0x11, 0x15, 0x0f, 0x0f, 0x10,
+ 0x21, 0x23, 0x20, 0x3b, 0x40, 0x3e, 0x37, 0x3e, 0x44, 0x38, 0x40, 0x4b,
+ 0x2d, 0x35, 0x3d, 0x37, 0x3e, 0x44, 0x35, 0x3a, 0x40, 0x1d, 0x20, 0x26,
+ 0x0d, 0x0d, 0x12, 0x0d, 0x0d, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x11, 0x10, 0x15, 0x1f, 0x1f, 0x23, 0x1f, 0x20, 0x25, 0x1b, 0x1c, 0x22,
+ 0x16, 0x17, 0x1c, 0x13, 0x13, 0x15, 0x12, 0x12, 0x12, 0x15, 0x16, 0x14,
+ 0x18, 0x18, 0x18, 0x28, 0x28, 0x28, 0x1f, 0x21, 0x20, 0x1d, 0x1e, 0x20,
+ 0x1f, 0x20, 0x22, 0x1b, 0x1d, 0x20, 0x1b, 0x1e, 0x21, 0x21, 0x25, 0x28,
+ 0x22, 0x26, 0x29, 0x25, 0x29, 0x2c, 0x2a, 0x30, 0x30, 0x2a, 0x33, 0x31,
+ 0x31, 0x3a, 0x37, 0x38, 0x42, 0x41, 0x40, 0x4c, 0x4c, 0x6d, 0x79, 0x79,
+ 0xb7, 0xc7, 0xc1, 0xe5, 0xf3, 0xec, 0xf5, 0xfe, 0xfa, 0xfa, 0xfe, 0xfa,
+ 0xf7, 0xf9, 0xf8, 0xf3, 0xf3, 0xf7, 0xf2, 0xf0, 0xf6, 0xee, 0xef, 0xf5,
+ 0xeb, 0xee, 0xf0, 0xe5, 0xeb, 0xea, 0xde, 0xe6, 0xdf, 0xdf, 0xe2, 0xd6,
+ 0xdf, 0xdd, 0xd1, 0xd2, 0xd8, 0xd6, 0xb8, 0xcb, 0xda, 0x7c, 0xa1, 0xbd,
+ 0x49, 0x96, 0xbd, 0x3b, 0x8f, 0xb9, 0x34, 0x8d, 0xbb, 0x2e, 0x87, 0xb9,
+ 0x2f, 0x88, 0xba, 0x31, 0x8c, 0xbf, 0x2a, 0x85, 0xba, 0x2a, 0x85, 0xbc,
+ 0x2d, 0x8c, 0xc0, 0x27, 0x85, 0xb9, 0x2c, 0x89, 0xbc, 0x2e, 0x8c, 0xbf,
+ 0x36, 0x96, 0xc8, 0x40, 0x9f, 0xd2, 0x40, 0x9f, 0xd4, 0x51, 0xad, 0xe3,
+ 0x4e, 0xa5, 0xdd, 0x4d, 0xa7, 0xe0, 0x53, 0xb0, 0xe8, 0x54, 0xac, 0xdf,
+ 0x68, 0xae, 0xdb, 0x95, 0xc6, 0xeb, 0xab, 0xc7, 0xe5, 0x8c, 0x9c, 0xb8,
+ 0x57, 0x6d, 0x8c, 0x2a, 0x44, 0x66, 0x1f, 0x3b, 0x5a, 0x1d, 0x36, 0x4c,
+ 0x7b, 0x90, 0x98, 0xce, 0xdf, 0xe3, 0xc7, 0xd5, 0xdf, 0xc3, 0xcf, 0xdf,
+ 0xc1, 0xcd, 0xd7, 0xc0, 0xcc, 0xd8, 0xbf, 0xcb, 0xd7, 0xbf, 0xcb, 0xd7,
+ 0xbd, 0xcb, 0xd7, 0xbd, 0xcb, 0xd8, 0xbc, 0xcb, 0xd8, 0xbc, 0xcc, 0xd9,
+ 0xc0, 0xcd, 0xdd, 0xbe, 0xcd, 0xdd, 0xbe, 0xce, 0xdc, 0xbe, 0xce, 0xdd,
+ 0xbf, 0xcf, 0xdd, 0xbe, 0xce, 0xdd, 0xbf, 0xce, 0xdd, 0xc0, 0xce, 0xde,
+ 0xc4, 0xcd, 0xde, 0xc3, 0xce, 0xdf, 0xc3, 0xd0, 0xe0, 0xbf, 0xcf, 0xdf,
+ 0xc1, 0xcc, 0xdc, 0xb7, 0xbe, 0xcc, 0xa8, 0xaa, 0xb6, 0x9a, 0x99, 0xa4,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x06, 0x0f, 0x0f, 0x0d, 0x1a, 0x1a, 0x18,
+ 0x1c, 0x1c, 0x1c, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1a, 0x1e, 0x1f, 0x1a,
+ 0x1e, 0x1f, 0x1a, 0x1f, 0x20, 0x1d, 0x1a, 0x1d, 0x1b, 0x1a, 0x1e, 0x1d,
+ 0x1d, 0x1f, 0x1c, 0x1b, 0x1d, 0x1a, 0x19, 0x1a, 0x18, 0x0e, 0x0e, 0x0c,
+ 0x08, 0x08, 0x06, 0x08, 0x08, 0x06, 0x07, 0x07, 0x06, 0x08, 0x08, 0x07,
+ 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x16, 0x16, 0x16,
+ 0x1e, 0x1e, 0x1e, 0x22, 0x22, 0x22, 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e,
+ 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x25, 0x25, 0x25, 0x1d, 0x1d, 0x1c,
+ 0x1c, 0x1c, 0x1a, 0x1a, 0x1a, 0x18, 0x1d, 0x1d, 0x1b, 0x1a, 0x1a, 0x17,
+ 0x18, 0x18, 0x19, 0x0f, 0x0f, 0x0d, 0x0f, 0x0f, 0x0d, 0x17, 0x17, 0x15,
+ 0x1a, 0x1a, 0x18, 0x1c, 0x1c, 0x1a, 0x19, 0x19, 0x17, 0x1a, 0x1a, 0x19,
+ 0x1c, 0x1c, 0x1a, 0x19, 0x19, 0x17, 0x1c, 0x1c, 0x1a, 0x23, 0x23, 0x21,
+ 0x26, 0x26, 0x24, 0x22, 0x22, 0x22, 0x18, 0x18, 0x18, 0x0d, 0x0d, 0x0d,
+ 0x08, 0x08, 0x07, 0x0c, 0x0c, 0x0b, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x15, 0x15, 0x15, 0x1b, 0x1b, 0x1b,
+ 0x10, 0x10, 0x10, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x09, 0x08, 0x08, 0x09, 0x07, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x08, 0x07, 0x08, 0x09, 0x09, 0x0a, 0x09, 0x07, 0x1f, 0x18, 0x18,
+ 0x31, 0x23, 0x22, 0x34, 0x26, 0x25, 0x3f, 0x34, 0x2e, 0x4c, 0x43, 0x38,
+ 0xce, 0xc7, 0xb3, 0xf8, 0xf2, 0xd9, 0xef, 0xea, 0xcd, 0xf0, 0xeb, 0xce,
+ 0xf1, 0xeb, 0xd2, 0xef, 0xea, 0xcf, 0xed, 0xe7, 0xcd, 0xeb, 0xe5, 0xcb,
+ 0xee, 0xe9, 0xcd, 0xcb, 0xc7, 0xaa, 0xd2, 0xcd, 0xb2, 0xe9, 0xe5, 0xca,
+ 0xe1, 0xdd, 0xbf, 0xd7, 0xd4, 0xb5, 0xee, 0xe9, 0xcb, 0xef, 0xea, 0xcc,
+ 0xf0, 0xeb, 0xce, 0xe4, 0xdf, 0xc2, 0xd1, 0xcb, 0xb0, 0xd9, 0xd3, 0xb9,
+ 0xe3, 0xde, 0xc1, 0xe1, 0xdc, 0xbf, 0xe5, 0xe0, 0xc5, 0xe2, 0xda, 0xc9,
+ 0x82, 0x77, 0x73, 0x36, 0x27, 0x2b, 0x2f, 0x20, 0x23, 0x2f, 0x21, 0x20,
+ 0x2b, 0x21, 0x20, 0x22, 0x1d, 0x1b, 0x0f, 0x0e, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x09, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x0a, 0x07,
+ 0x0a, 0x08, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x1e, 0x1e, 0x1e,
+ 0x2f, 0x2f, 0x2d, 0x2d, 0x2d, 0x2b, 0x30, 0x30, 0x30, 0x27, 0x27, 0x27,
+ 0x33, 0x33, 0x33, 0x3d, 0x3b, 0x3b, 0x3e, 0x3d, 0x3b, 0x37, 0x36, 0x34,
+ 0x37, 0x3b, 0x3a, 0x2b, 0x2f, 0x2e, 0x18, 0x1d, 0x21, 0x12, 0x18, 0x22,
+ 0x11, 0x1a, 0x27, 0x10, 0x1a, 0x26, 0x0e, 0x15, 0x1d, 0x0e, 0x12, 0x16,
+ 0x23, 0x28, 0x29, 0x5b, 0x5f, 0x5e, 0x96, 0x99, 0x90, 0xb3, 0xb5, 0xa6,
+ 0xba, 0xb9, 0xa6, 0xbc, 0xbb, 0xa6, 0xbc, 0xba, 0xa5, 0xc0, 0xbe, 0xa9,
+ 0xc3, 0xc2, 0xae, 0xc2, 0xc1, 0xae, 0xc5, 0xc7, 0xb4, 0xc9, 0xcc, 0xbb,
+ 0xcb, 0xcd, 0xbf, 0xc9, 0xcb, 0xbe, 0xcb, 0xcd, 0xc2, 0x99, 0x99, 0x8f,
+ 0x5d, 0x5e, 0x50, 0xc4, 0xc5, 0xb7, 0xd3, 0xd5, 0xc6, 0xcd, 0xd0, 0xc7,
+ 0xcb, 0xd0, 0xcb, 0xce, 0xd3, 0xd2, 0xce, 0xd2, 0xd1, 0xcb, 0xcf, 0xcd,
+ 0xca, 0xcf, 0xcf, 0xc3, 0xc8, 0xcb, 0xbc, 0xc2, 0xc6, 0xb2, 0xb9, 0xc1,
+ 0xa4, 0xab, 0xb5, 0x96, 0x9c, 0xa8, 0x79, 0x7f, 0x8d, 0x61, 0x64, 0x74,
+ 0x4a, 0x4a, 0x53, 0x32, 0x35, 0x3c, 0x35, 0x3a, 0x40, 0x22, 0x28, 0x2e,
+ 0x11, 0x16, 0x1a, 0x1f, 0x23, 0x26, 0x2c, 0x30, 0x33, 0x19, 0x1a, 0x1e,
+ 0x1b, 0x1b, 0x1c, 0x17, 0x17, 0x17, 0x17, 0x15, 0x16, 0x17, 0x15, 0x16,
+ 0x17, 0x15, 0x16, 0x18, 0x17, 0x15, 0x17, 0x16, 0x14, 0x13, 0x12, 0x10,
+ 0x14, 0x14, 0x14, 0x17, 0x17, 0x17, 0x13, 0x13, 0x13, 0x12, 0x12, 0x12,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0c, 0x0d, 0x0d, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0f, 0x10, 0x11, 0x11, 0x12, 0x10, 0x0f, 0x12, 0x11, 0x11, 0x11,
+ 0x2a, 0x2c, 0x29, 0x3c, 0x42, 0x40, 0x36, 0x3e, 0x44, 0x34, 0x3c, 0x47,
+ 0x2e, 0x35, 0x3d, 0x3a, 0x3f, 0x45, 0x2b, 0x2e, 0x35, 0x15, 0x16, 0x1b,
+ 0x0c, 0x0d, 0x11, 0x0b, 0x0b, 0x0d, 0x0c, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x14, 0x15, 0x17, 0x1c, 0x20, 0x23, 0x19, 0x1c, 0x21, 0x17, 0x1a, 0x1f,
+ 0x12, 0x15, 0x1a, 0x13, 0x14, 0x16, 0x10, 0x12, 0x11, 0x13, 0x15, 0x12,
+ 0x19, 0x1b, 0x1a, 0x2a, 0x2c, 0x2b, 0x1d, 0x1f, 0x1e, 0x1d, 0x1e, 0x20,
+ 0x19, 0x1c, 0x1e, 0x19, 0x1d, 0x20, 0x1b, 0x1f, 0x22, 0x1e, 0x22, 0x25,
+ 0x23, 0x26, 0x2b, 0x23, 0x26, 0x2b, 0x27, 0x2b, 0x2e, 0x2b, 0x31, 0x31,
+ 0x2f, 0x38, 0x37, 0x34, 0x3e, 0x3e, 0x35, 0x3f, 0x41, 0x41, 0x4c, 0x4e,
+ 0x5c, 0x6c, 0x6b, 0x90, 0x9f, 0x9e, 0xc4, 0xcf, 0xcc, 0xe6, 0xec, 0xea,
+ 0xed, 0xf1, 0xf0, 0xee, 0xf1, 0xf0, 0xef, 0xf1, 0xf0, 0xe8, 0xec, 0xed,
+ 0xe8, 0xea, 0xe8, 0xe8, 0xec, 0xea, 0xe3, 0xe8, 0xe4, 0xe3, 0xe4, 0xdf,
+ 0xe3, 0xe5, 0xe3, 0xcd, 0xe0, 0xe9, 0x83, 0xb4, 0xcc, 0x68, 0xad, 0xd1,
+ 0x67, 0xb0, 0xdc, 0x50, 0x9d, 0xcc, 0x45, 0x98, 0xc9, 0x3e, 0x98, 0xc8,
+ 0x3f, 0x9c, 0xcb, 0x36, 0x95, 0xc4, 0x33, 0x95, 0xc4, 0x36, 0x9b, 0xca,
+ 0x25, 0x95, 0xc9, 0x26, 0x92, 0xc7, 0x29, 0x91, 0xc6, 0x2f, 0x96, 0xca,
+ 0x3d, 0xa3, 0xd4, 0x47, 0xa9, 0xd9, 0x4e, 0xaa, 0xd8, 0x55, 0xae, 0xdd,
+ 0x4d, 0xae, 0xe8, 0x51, 0xac, 0xe6, 0x5c, 0xaa, 0xde, 0x7d, 0xb7, 0xe3,
+ 0xa4, 0xcb, 0xeb, 0xac, 0xc5, 0xdd, 0x90, 0xa2, 0xb5, 0x73, 0x83, 0x97,
+ 0x3d, 0x56, 0x78, 0x23, 0x3d, 0x60, 0x1d, 0x38, 0x55, 0x32, 0x4b, 0x5c,
+ 0xae, 0xc3, 0xca, 0xcb, 0xda, 0xdd, 0xc4, 0xd3, 0xda, 0xc1, 0xcd, 0xdd,
+ 0xc2, 0xcd, 0xd9, 0xbf, 0xcb, 0xd7, 0xbf, 0xcb, 0xd7, 0xbe, 0xca, 0xd6,
+ 0xbd, 0xca, 0xd7, 0xbd, 0xcb, 0xd8, 0xbe, 0xcc, 0xd9, 0xbf, 0xcd, 0xda,
+ 0xc0, 0xcd, 0xdd, 0xbf, 0xcc, 0xdc, 0xbd, 0xcd, 0xdc, 0xbd, 0xcd, 0xdc,
+ 0xbd, 0xce, 0xdd, 0xbe, 0xce, 0xdd, 0xc0, 0xce, 0xde, 0xc1, 0xce, 0xde,
+ 0xc2, 0xce, 0xde, 0xc1, 0xce, 0xde, 0xc1, 0xce, 0xdf, 0xc0, 0xcd, 0xdd,
+ 0xbc, 0xc8, 0xd7, 0xaf, 0xb4, 0xc2, 0x9f, 0xa1, 0xac, 0x96, 0x95, 0x9d,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x11, 0x11, 0x0f, 0x1c, 0x1c, 0x1a, 0x1f, 0x1f, 0x1d,
+ 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1a, 0x1f, 0x1f, 0x1d, 0x1e, 0x1d, 0x1b,
+ 0x1c, 0x1c, 0x19, 0x1e, 0x1e, 0x1c, 0x1d, 0x1f, 0x1c, 0x1b, 0x1d, 0x1c,
+ 0x1b, 0x1d, 0x1c, 0x13, 0x15, 0x14, 0x0c, 0x0c, 0x0b, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x14, 0x14, 0x14, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1e, 0x1e, 0x1e,
+ 0x1d, 0x1d, 0x1d, 0x22, 0x22, 0x22, 0x25, 0x25, 0x25, 0x1d, 0x1d, 0x1b,
+ 0x1c, 0x1c, 0x1a, 0x18, 0x18, 0x16, 0x19, 0x19, 0x17, 0x1a, 0x1a, 0x18,
+ 0x10, 0x10, 0x10, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x08, 0x0c, 0x0c, 0x0a,
+ 0x12, 0x12, 0x10, 0x1a, 0x1a, 0x19, 0x1b, 0x1b, 0x1b, 0x1d, 0x1d, 0x1d,
+ 0x1c, 0x1c, 0x1b, 0x1b, 0x1b, 0x19, 0x1a, 0x1a, 0x18, 0x1e, 0x1e, 0x1c,
+ 0x20, 0x20, 0x1f, 0x26, 0x26, 0x26, 0x2a, 0x2a, 0x2a, 0x23, 0x23, 0x22,
+ 0x11, 0x11, 0x0f, 0x08, 0x08, 0x06, 0x0c, 0x0c, 0x0a, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x15, 0x15, 0x15, 0x1f, 0x1f, 0x1f,
+ 0x11, 0x11, 0x11, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x07, 0x08, 0x09, 0x08, 0x08,
+ 0x09, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x19, 0x16, 0x15, 0x29, 0x21, 0x21,
+ 0x34, 0x27, 0x21, 0x37, 0x2d, 0x24, 0x3b, 0x31, 0x27, 0xac, 0xa5, 0x95,
+ 0xff, 0xf9, 0xe3, 0xf9, 0xf3, 0xd8, 0xec, 0xe7, 0xc9, 0xea, 0xe5, 0xc5,
+ 0xec, 0xe6, 0xc9, 0xed, 0xe8, 0xcb, 0xf0, 0xeb, 0xce, 0xed, 0xe8, 0xcb,
+ 0xec, 0xe7, 0xca, 0xc4, 0xbf, 0xa2, 0xde, 0xd9, 0xbc, 0xe0, 0xdb, 0xbe,
+ 0xe2, 0xdd, 0xbd, 0xeb, 0xe6, 0xc6, 0xed, 0xe8, 0xc8, 0xe5, 0xe1, 0xc3,
+ 0xe4, 0xe1, 0xc3, 0xcc, 0xc8, 0xad, 0xd0, 0xcc, 0xb3, 0xcd, 0xc8, 0xb2,
+ 0xea, 0xe5, 0xd0, 0xec, 0xe6, 0xce, 0xe2, 0xdd, 0xc2, 0xe6, 0xde, 0xc9,
+ 0xba, 0xae, 0xa4, 0x42, 0x33, 0x32, 0x30, 0x20, 0x21, 0x30, 0x21, 0x22,
+ 0x2d, 0x22, 0x24, 0x27, 0x22, 0x22, 0x13, 0x11, 0x11, 0x0a, 0x0a, 0x0b,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a,
+ 0x0c, 0x0a, 0x09, 0x09, 0x08, 0x06, 0x0b, 0x0a, 0x09, 0x0b, 0x0a, 0x09,
+ 0x0a, 0x0a, 0x08, 0x0c, 0x0c, 0x0a, 0x09, 0x09, 0x07, 0x1e, 0x1e, 0x1d,
+ 0x2b, 0x2b, 0x2a, 0x2e, 0x2e, 0x2e, 0x30, 0x30, 0x30, 0x27, 0x27, 0x27,
+ 0x31, 0x31, 0x31, 0x3d, 0x3b, 0x3b, 0x39, 0x37, 0x37, 0x2a, 0x29, 0x27,
+ 0x35, 0x38, 0x39, 0x2d, 0x31, 0x34, 0x17, 0x1e, 0x23, 0x10, 0x1a, 0x23,
+ 0x0d, 0x1a, 0x25, 0x0f, 0x1a, 0x24, 0x10, 0x15, 0x1b, 0x21, 0x22, 0x23,
+ 0x60, 0x63, 0x5a, 0xa0, 0xa2, 0x96, 0xb4, 0xb4, 0xa4, 0xb7, 0xb6, 0xa1,
+ 0xbb, 0xb9, 0xa2, 0xc0, 0xbd, 0xa5, 0xc0, 0xbb, 0xa2, 0xc1, 0xbd, 0xa4,
+ 0xc3, 0xc2, 0xa9, 0xc3, 0xc3, 0xab, 0xc2, 0xc3, 0xad, 0xc5, 0xc6, 0xb2,
+ 0xcc, 0xcd, 0xbe, 0xac, 0xad, 0x9f, 0xa3, 0xa3, 0x97, 0xa4, 0xa4, 0x9a,
+ 0x5a, 0x59, 0x4c, 0xa1, 0xa2, 0x94, 0xd7, 0xda, 0xca, 0xd5, 0xd7, 0xca,
+ 0xd1, 0xd4, 0xcb, 0xcd, 0xd0, 0xcb, 0xd0, 0xd2, 0xd0, 0xd1, 0xd3, 0xd0,
+ 0xce, 0xd3, 0xcf, 0xca, 0xce, 0xcd, 0xc5, 0xcb, 0xcb, 0xc1, 0xc6, 0xc9,
+ 0xb8, 0xbd, 0xc1, 0xa8, 0xad, 0xb3, 0x9b, 0xa0, 0xa8, 0x87, 0x89, 0x95,
+ 0x5a, 0x5d, 0x6e, 0x2d, 0x31, 0x3c, 0x33, 0x3b, 0x3e, 0x2f, 0x37, 0x3a,
+ 0x24, 0x2b, 0x32, 0x24, 0x27, 0x30, 0x30, 0x33, 0x3a, 0x1f, 0x20, 0x24,
+ 0x1b, 0x1b, 0x1c, 0x16, 0x16, 0x18, 0x18, 0x16, 0x19, 0x17, 0x15, 0x16,
+ 0x17, 0x15, 0x16, 0x17, 0x15, 0x15, 0x16, 0x14, 0x15, 0x14, 0x13, 0x14,
+ 0x15, 0x14, 0x15, 0x14, 0x14, 0x14, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0b,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0f, 0x0f, 0x0e, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x14, 0x16, 0x15,
+ 0x31, 0x35, 0x31, 0x39, 0x40, 0x3d, 0x37, 0x3f, 0x43, 0x30, 0x37, 0x41,
+ 0x31, 0x37, 0x3f, 0x35, 0x39, 0x42, 0x23, 0x26, 0x2b, 0x0e, 0x10, 0x13,
+ 0x0b, 0x0c, 0x0e, 0x0d, 0x0d, 0x0f, 0x0c, 0x0c, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x15, 0x19, 0x1a, 0x1c, 0x20, 0x21, 0x18, 0x1d, 0x20, 0x16, 0x1b, 0x1f,
+ 0x10, 0x15, 0x18, 0x13, 0x17, 0x1a, 0x10, 0x14, 0x14, 0x15, 0x17, 0x17,
+ 0x14, 0x18, 0x17, 0x1d, 0x21, 0x20, 0x16, 0x1a, 0x1a, 0x16, 0x1a, 0x1b,
+ 0x19, 0x1f, 0x1f, 0x17, 0x1c, 0x1f, 0x18, 0x1e, 0x21, 0x1d, 0x22, 0x25,
+ 0x20, 0x23, 0x29, 0x24, 0x27, 0x2d, 0x27, 0x2a, 0x2f, 0x2d, 0x31, 0x34,
+ 0x2e, 0x36, 0x38, 0x31, 0x39, 0x3c, 0x36, 0x3f, 0x44, 0x3a, 0x44, 0x4a,
+ 0x37, 0x44, 0x4a, 0x48, 0x53, 0x59, 0x6b, 0x76, 0x78, 0x98, 0xa0, 0xa2,
+ 0xc1, 0xca, 0xc8, 0xd2, 0xd8, 0xd6, 0xd4, 0xda, 0xd6, 0xd6, 0xdb, 0xd8,
+ 0xd8, 0xda, 0xd6, 0xd6, 0xda, 0xd9, 0xdb, 0xdd, 0xde, 0xde, 0xde, 0xe2,
+ 0xd6, 0xdf, 0xe9, 0x98, 0xbd, 0xd0, 0x65, 0xad, 0xcc, 0x64, 0xc3, 0xeb,
+ 0x5b, 0xb5, 0xe1, 0x4c, 0xa8, 0xd5, 0x43, 0xa3, 0xd3, 0x42, 0xa4, 0xd6,
+ 0x3c, 0x9e, 0xcd, 0x3a, 0x9d, 0xcc, 0x39, 0x9e, 0xcd, 0x34, 0x9a, 0xca,
+ 0x32, 0x9b, 0xcb, 0x3b, 0xa0, 0xd4, 0x40, 0xa0, 0xd7, 0x44, 0xa4, 0xdd,
+ 0x4c, 0xaa, 0xe4, 0x56, 0xb3, 0xea, 0x56, 0xae, 0xe4, 0x59, 0xad, 0xe3,
+ 0x57, 0xaa, 0xdd, 0x64, 0xad, 0xdc, 0x91, 0xc5, 0xea, 0xb0, 0xcd, 0xea,
+ 0xae, 0xbc, 0xcf, 0x95, 0x9f, 0xae, 0x7e, 0x8c, 0x9b, 0x5f, 0x73, 0x84,
+ 0x2f, 0x49, 0x6d, 0x24, 0x3e, 0x62, 0x1f, 0x3a, 0x54, 0x5e, 0x76, 0x84,
+ 0xc8, 0xdc, 0xdf, 0xc7, 0xd7, 0xd7, 0xc3, 0xd1, 0xd8, 0xc1, 0xcd, 0xdb,
+ 0xc2, 0xcc, 0xd9, 0xc1, 0xcb, 0xd8, 0xbd, 0xc9, 0xd6, 0xbd, 0xc9, 0xd7,
+ 0xbe, 0xca, 0xd8, 0xbd, 0xcb, 0xd8, 0xbe, 0xcb, 0xdb, 0xbf, 0xcc, 0xdb,
+ 0xbd, 0xcb, 0xdb, 0xc0, 0xcd, 0xdd, 0xc0, 0xcd, 0xdd, 0xbe, 0xcd, 0xdc,
+ 0xbf, 0xcf, 0xde, 0xc0, 0xce, 0xdd, 0xc1, 0xce, 0xdd, 0xc1, 0xce, 0xde,
+ 0xc1, 0xce, 0xde, 0xc1, 0xce, 0xde, 0xc1, 0xce, 0xde, 0xc0, 0xcc, 0xdc,
+ 0xb6, 0xc0, 0xcf, 0xaa, 0xad, 0xba, 0x9c, 0x9c, 0xa7, 0x94, 0x91, 0x9a,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x14, 0x14, 0x13, 0x1e, 0x1e, 0x1c, 0x1f, 0x1f, 0x1d, 0x1c, 0x1c, 0x1a,
+ 0x21, 0x21, 0x1f, 0x1d, 0x1d, 0x1b, 0x1c, 0x1b, 0x19, 0x1e, 0x1d, 0x1b,
+ 0x1e, 0x1d, 0x1b, 0x1c, 0x1c, 0x1a, 0x1a, 0x1a, 0x18, 0x1b, 0x1b, 0x19,
+ 0x12, 0x13, 0x12, 0x0a, 0x0c, 0x0b, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0f, 0x0f, 0x0f, 0x19, 0x19, 0x19, 0x1e, 0x1e, 0x1e,
+ 0x1f, 0x1f, 0x1f, 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x1d, 0x1d, 0x1c,
+ 0x1b, 0x1b, 0x1a, 0x21, 0x21, 0x1f, 0x1a, 0x1a, 0x18, 0x14, 0x14, 0x13,
+ 0x0c, 0x0c, 0x0c, 0x05, 0x05, 0x05, 0x07, 0x07, 0x05, 0x08, 0x08, 0x06,
+ 0x0d, 0x0d, 0x0b, 0x14, 0x14, 0x12, 0x19, 0x19, 0x19, 0x1e, 0x1e, 0x1e,
+ 0x1f, 0x20, 0x1e, 0x1f, 0x1f, 0x1d, 0x1d, 0x1e, 0x1c, 0x22, 0x22, 0x20,
+ 0x1e, 0x1e, 0x1c, 0x20, 0x20, 0x20, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28,
+ 0x25, 0x25, 0x23, 0x16, 0x16, 0x14, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10, 0x1e, 0x1e, 0x1e,
+ 0x15, 0x15, 0x15, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x0a, 0x09, 0x07, 0x08, 0x08, 0x08, 0x06, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0e, 0x0c, 0x0c, 0x27, 0x20, 0x21, 0x35, 0x2b, 0x2c,
+ 0x36, 0x29, 0x24, 0x38, 0x2e, 0x25, 0x5a, 0x52, 0x45, 0xf4, 0xf0, 0xdd,
+ 0xfc, 0xf7, 0xe2, 0xf7, 0xf3, 0xd9, 0xea, 0xe6, 0xc9, 0xe8, 0xe3, 0xc3,
+ 0xe9, 0xe3, 0xc5, 0xef, 0xe8, 0xcb, 0xf0, 0xea, 0xcd, 0xec, 0xe6, 0xca,
+ 0xec, 0xe7, 0xca, 0xc2, 0xbd, 0xa0, 0xe5, 0xe0, 0xc3, 0xda, 0xd4, 0xb7,
+ 0xd5, 0xd1, 0xae, 0xe9, 0xe5, 0xc2, 0xec, 0xe7, 0xc7, 0xe5, 0xe2, 0xc2,
+ 0xd0, 0xcd, 0xb0, 0xd2, 0xd0, 0xb7, 0xde, 0xdc, 0xc6, 0xcd, 0xca, 0xb5,
+ 0xed, 0xe8, 0xd6, 0xeb, 0xe5, 0xcd, 0xe3, 0xde, 0xc0, 0xe5, 0xde, 0xc2,
+ 0xd5, 0xc9, 0xb9, 0x53, 0x46, 0x40, 0x2d, 0x1e, 0x1d, 0x31, 0x21, 0x23,
+ 0x2f, 0x23, 0x24, 0x2a, 0x22, 0x23, 0x17, 0x15, 0x16, 0x08, 0x08, 0x0a,
+ 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0c, 0x08, 0x0a, 0x0b, 0x07, 0x0a, 0x0a,
+ 0x0b, 0x0a, 0x08, 0x09, 0x08, 0x07, 0x0a, 0x09, 0x07, 0x09, 0x08, 0x07,
+ 0x08, 0x07, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x1c, 0x1c, 0x1c,
+ 0x28, 0x29, 0x28, 0x2c, 0x2e, 0x2d, 0x2b, 0x2c, 0x2c, 0x25, 0x25, 0x27,
+ 0x2f, 0x2f, 0x31, 0x38, 0x38, 0x38, 0x34, 0x34, 0x34, 0x23, 0x23, 0x23,
+ 0x32, 0x33, 0x36, 0x2a, 0x2d, 0x32, 0x16, 0x1e, 0x23, 0x10, 0x1a, 0x22,
+ 0x10, 0x1d, 0x26, 0x11, 0x1a, 0x21, 0x1b, 0x1e, 0x1f, 0x52, 0x51, 0x4c,
+ 0x97, 0x99, 0x88, 0xb6, 0xb8, 0xa3, 0xb3, 0xb2, 0x9d, 0xb6, 0xb4, 0x9b,
+ 0xbb, 0xb7, 0x9c, 0xbe, 0xba, 0xa0, 0xc0, 0xbc, 0xa3, 0xc3, 0xbe, 0xa6,
+ 0xc2, 0xc0, 0xa7, 0xc5, 0xc3, 0xac, 0xc7, 0xc6, 0xb1, 0xbd, 0xbc, 0xa8,
+ 0xa6, 0xa7, 0x95, 0x9a, 0x9b, 0x8b, 0xa0, 0xa1, 0x90, 0xa2, 0xa1, 0x93,
+ 0x8d, 0x8a, 0x81, 0x86, 0x86, 0x7a, 0xb4, 0xb5, 0xa7, 0xd0, 0xd3, 0xc4,
+ 0xd5, 0xd7, 0xcf, 0xd3, 0xd6, 0xd1, 0xd1, 0xd3, 0xd0, 0xd3, 0xd4, 0xd1,
+ 0xd1, 0xd3, 0xcd, 0xd0, 0xd2, 0xcd, 0xc9, 0xce, 0xc8, 0xc6, 0xcb, 0xc7,
+ 0xc3, 0xc7, 0xc6, 0xbc, 0xc0, 0xc1, 0xb0, 0xb4, 0xb6, 0x9d, 0x9e, 0xa4,
+ 0x7d, 0x80, 0x90, 0x53, 0x59, 0x66, 0x3c, 0x43, 0x4c, 0x3d, 0x46, 0x4b,
+ 0x36, 0x3d, 0x45, 0x27, 0x2b, 0x33, 0x37, 0x3b, 0x43, 0x26, 0x26, 0x2e,
+ 0x1d, 0x1d, 0x20, 0x19, 0x18, 0x1a, 0x1c, 0x1a, 0x1d, 0x19, 0x17, 0x19,
+ 0x17, 0x15, 0x18, 0x15, 0x13, 0x14, 0x14, 0x12, 0x13, 0x14, 0x14, 0x14,
+ 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f,
+ 0x13, 0x11, 0x12, 0x12, 0x12, 0x12, 0x0f, 0x0f, 0x0f, 0x18, 0x1a, 0x19,
+ 0x37, 0x3b, 0x39, 0x39, 0x3e, 0x3e, 0x38, 0x3f, 0x43, 0x2b, 0x32, 0x3a,
+ 0x37, 0x3c, 0x45, 0x32, 0x36, 0x3e, 0x1c, 0x1f, 0x24, 0x0c, 0x0d, 0x11,
+ 0x0c, 0x0d, 0x0f, 0x0e, 0x0e, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x11,
+ 0x1a, 0x1e, 0x1f, 0x1e, 0x22, 0x23, 0x1a, 0x1e, 0x21, 0x16, 0x1a, 0x1d,
+ 0x14, 0x18, 0x1b, 0x15, 0x18, 0x1b, 0x12, 0x14, 0x17, 0x15, 0x16, 0x18,
+ 0x12, 0x15, 0x14, 0x14, 0x18, 0x17, 0x15, 0x1b, 0x1b, 0x18, 0x1e, 0x1e,
+ 0x17, 0x1d, 0x1d, 0x18, 0x1e, 0x1e, 0x19, 0x21, 0x23, 0x1d, 0x24, 0x27,
+ 0x1f, 0x21, 0x25, 0x21, 0x24, 0x29, 0x25, 0x29, 0x2d, 0x29, 0x2e, 0x31,
+ 0x2c, 0x31, 0x34, 0x31, 0x38, 0x3b, 0x35, 0x3c, 0x42, 0x37, 0x40, 0x48,
+ 0x39, 0x43, 0x4d, 0x3a, 0x44, 0x4d, 0x3f, 0x4a, 0x50, 0x49, 0x54, 0x58,
+ 0x6b, 0x75, 0x78, 0x8c, 0x95, 0x96, 0xa0, 0xaa, 0xaa, 0xab, 0xb2, 0xb2,
+ 0xb2, 0xb5, 0xb7, 0xb6, 0xbb, 0xbe, 0xb9, 0xbe, 0xc2, 0xbf, 0xc3, 0xca,
+ 0xaf, 0xbb, 0xc9, 0x78, 0x9c, 0xb2, 0x64, 0xa5, 0xc3, 0x4b, 0xa1, 0xc5,
+ 0x41, 0x9e, 0xc2, 0x3d, 0x9b, 0xc5, 0x3a, 0x9b, 0xc8, 0x35, 0x99, 0xc7,
+ 0x2c, 0x90, 0xbe, 0x32, 0x96, 0xc4, 0x38, 0x9d, 0xcd, 0x35, 0x9b, 0xcb,
+ 0x3e, 0xa5, 0xd1, 0x46, 0xaa, 0xd9, 0x4c, 0xab, 0xdf, 0x4f, 0xab, 0xe4,
+ 0x53, 0xad, 0xe4, 0x5e, 0xb4, 0xe9, 0x61, 0xb4, 0xe5, 0x70, 0xbc, 0xeb,
+ 0x95, 0xc1, 0xe2, 0xa3, 0xc8, 0xe4, 0xad, 0xca, 0xe1, 0x9f, 0xb2, 0xc2,
+ 0x90, 0x9c, 0xa7, 0x84, 0x8d, 0x9c, 0x76, 0x85, 0x97, 0x50, 0x63, 0x7d,
+ 0x29, 0x41, 0x67, 0x24, 0x3f, 0x5f, 0x25, 0x40, 0x54, 0x93, 0xaa, 0xb2,
+ 0xcd, 0xdf, 0xde, 0xc7, 0xd5, 0xd6, 0xc2, 0xcf, 0xd7, 0xbf, 0xcb, 0xd9,
+ 0xc0, 0xca, 0xd9, 0xbe, 0xca, 0xd7, 0xbd, 0xc9, 0xd7, 0xbe, 0xca, 0xd8,
+ 0xbe, 0xca, 0xda, 0xbe, 0xca, 0xda, 0xbe, 0xca, 0xda, 0xbe, 0xca, 0xdb,
+ 0xc0, 0xcc, 0xdc, 0xc0, 0xcd, 0xdd, 0xc0, 0xcd, 0xdd, 0xc0, 0xcd, 0xdd,
+ 0xc0, 0xcd, 0xdd, 0xc0, 0xcd, 0xdd, 0xc1, 0xcd, 0xde, 0xc2, 0xce, 0xde,
+ 0xc0, 0xcf, 0xdd, 0xbf, 0xcf, 0xde, 0xc0, 0xce, 0xde, 0xbe, 0xc8, 0xd8,
+ 0xb1, 0xb8, 0xc6, 0xa2, 0xa4, 0xb0, 0x98, 0x96, 0x9e, 0x95, 0x90, 0x96,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x16, 0x16, 0x16,
+ 0x1c, 0x1c, 0x1a, 0x1c, 0x1c, 0x1a, 0x1f, 0x1f, 0x1d, 0x1c, 0x1c, 0x1a,
+ 0x1d, 0x1d, 0x1b, 0x1b, 0x1b, 0x19, 0x1b, 0x1b, 0x19, 0x1d, 0x1d, 0x1b,
+ 0x1f, 0x1e, 0x1c, 0x1a, 0x1a, 0x18, 0x17, 0x17, 0x15, 0x10, 0x10, 0x0e,
+ 0x07, 0x09, 0x08, 0x07, 0x09, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x10, 0x10, 0x10, 0x17, 0x17, 0x17,
+ 0x20, 0x20, 0x1e, 0x20, 0x20, 0x1e, 0x22, 0x22, 0x20, 0x1c, 0x1c, 0x1c,
+ 0x1b, 0x1b, 0x1b, 0x2d, 0x2d, 0x2d, 0x23, 0x23, 0x23, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x06, 0x06, 0x04, 0x09, 0x09, 0x07,
+ 0x0c, 0x0c, 0x0a, 0x0d, 0x0d, 0x0b, 0x0e, 0x0e, 0x0e, 0x16, 0x16, 0x16,
+ 0x1d, 0x1f, 0x1e, 0x20, 0x21, 0x20, 0x1e, 0x20, 0x1f, 0x26, 0x26, 0x26,
+ 0x27, 0x27, 0x27, 0x1f, 0x1f, 0x1e, 0x22, 0x22, 0x20, 0x26, 0x26, 0x24,
+ 0x2a, 0x2a, 0x28, 0x28, 0x28, 0x26, 0x1e, 0x1e, 0x1c, 0x0e, 0x0e, 0x0c,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x0e, 0x0e, 0x0e, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x0b, 0x0a, 0x07, 0x07, 0x07, 0x08, 0x05, 0x06, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x0b, 0x09, 0x09, 0x37, 0x30, 0x30, 0x62, 0x57, 0x59,
+ 0x44, 0x36, 0x34, 0x33, 0x28, 0x20, 0x98, 0x90, 0x83, 0xff, 0xfe, 0xed,
+ 0xf8, 0xf5, 0xe2, 0xf0, 0xee, 0xd9, 0xf0, 0xec, 0xd1, 0xef, 0xea, 0xcb,
+ 0xeb, 0xe6, 0xc8, 0xef, 0xea, 0xcc, 0xee, 0xe9, 0xcc, 0xed, 0xe6, 0xca,
+ 0xf2, 0xeb, 0xcf, 0xdc, 0xd5, 0xb9, 0xd3, 0xcc, 0xaf, 0xdd, 0xd6, 0xb9,
+ 0xe5, 0xdf, 0xbd, 0xe5, 0xe1, 0xbe, 0xe5, 0xe0, 0xc0, 0xe1, 0xde, 0xbe,
+ 0xb6, 0xb3, 0x96, 0xd5, 0xd3, 0xba, 0xc2, 0xc0, 0xab, 0xd8, 0xd7, 0xc4,
+ 0xef, 0xea, 0xd7, 0xea, 0xe4, 0xc9, 0xe8, 0xe4, 0xc1, 0xe7, 0xe0, 0xc0,
+ 0xda, 0xcf, 0xbb, 0x5a, 0x4d, 0x44, 0x2b, 0x1c, 0x1b, 0x32, 0x22, 0x24,
+ 0x2f, 0x22, 0x24, 0x2c, 0x24, 0x27, 0x1c, 0x1a, 0x1b, 0x09, 0x09, 0x0b,
+ 0x08, 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x07, 0x08, 0x0a, 0x07, 0x0a, 0x0b,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0b, 0x0a, 0x0b,
+ 0x09, 0x09, 0x0a, 0x07, 0x08, 0x0a, 0x08, 0x09, 0x0b, 0x1f, 0x1f, 0x21,
+ 0x2a, 0x2c, 0x29, 0x27, 0x29, 0x28, 0x2b, 0x2d, 0x2c, 0x25, 0x27, 0x26,
+ 0x28, 0x29, 0x29, 0x31, 0x33, 0x32, 0x2b, 0x2d, 0x2b, 0x1d, 0x1f, 0x1c,
+ 0x2f, 0x30, 0x34, 0x26, 0x27, 0x2c, 0x18, 0x1d, 0x23, 0x13, 0x1c, 0x25,
+ 0x13, 0x1d, 0x26, 0x17, 0x1f, 0x23, 0x37, 0x3a, 0x35, 0x82, 0x80, 0x74,
+ 0xa6, 0xa8, 0x92, 0xb4, 0xb5, 0x9d, 0xb7, 0xb7, 0x9d, 0xb6, 0xb4, 0x9b,
+ 0xb2, 0xb0, 0x97, 0xbb, 0xb7, 0x9e, 0xc0, 0xbc, 0xa5, 0xc1, 0xbc, 0xa6,
+ 0xc1, 0xbf, 0xaa, 0xc9, 0xc6, 0xb3, 0xba, 0xb9, 0xa5, 0x7e, 0x7d, 0x6b,
+ 0x87, 0x86, 0x74, 0x8e, 0x8d, 0x7a, 0xab, 0xaa, 0x96, 0xcd, 0xcc, 0xb8,
+ 0xd1, 0xce, 0xc8, 0xb3, 0xb2, 0xa9, 0x8e, 0x8e, 0x82, 0xc1, 0xc2, 0xb8,
+ 0xd7, 0xd8, 0xd1, 0xbe, 0xbf, 0xba, 0xab, 0xab, 0xa9, 0xb7, 0xb7, 0xb4,
+ 0xcc, 0xcd, 0xc5, 0xd3, 0xd4, 0xcc, 0xcd, 0xd0, 0xc7, 0xcc, 0xcf, 0xc8,
+ 0xc9, 0xcb, 0xc6, 0xc5, 0xc7, 0xc4, 0xbe, 0xc0, 0xbe, 0xae, 0xaf, 0xb1,
+ 0x96, 0x9a, 0xa3, 0x7c, 0x82, 0x91, 0x58, 0x5e, 0x6f, 0x3d, 0x44, 0x51,
+ 0x25, 0x2c, 0x33, 0x1f, 0x26, 0x29, 0x40, 0x45, 0x4e, 0x28, 0x2a, 0x39,
+ 0x19, 0x19, 0x1e, 0x1a, 0x1a, 0x1c, 0x1a, 0x19, 0x1b, 0x18, 0x16, 0x19,
+ 0x18, 0x16, 0x19, 0x14, 0x12, 0x13, 0x13, 0x12, 0x13, 0x14, 0x13, 0x13,
+ 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x12, 0x12, 0x12, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f,
+ 0x12, 0x11, 0x12, 0x11, 0x11, 0x11, 0x0f, 0x11, 0x0e, 0x1f, 0x23, 0x22,
+ 0x39, 0x3d, 0x3e, 0x38, 0x3d, 0x40, 0x37, 0x3f, 0x42, 0x2c, 0x33, 0x39,
+ 0x35, 0x3a, 0x45, 0x2e, 0x32, 0x3a, 0x15, 0x17, 0x1d, 0x0c, 0x0d, 0x11,
+ 0x0e, 0x0e, 0x10, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x10, 0x13, 0x13, 0x15,
+ 0x1d, 0x1e, 0x20, 0x20, 0x21, 0x24, 0x1d, 0x1e, 0x22, 0x17, 0x18, 0x1c,
+ 0x19, 0x1a, 0x1e, 0x1a, 0x1b, 0x1f, 0x16, 0x15, 0x1a, 0x13, 0x13, 0x15,
+ 0x0e, 0x13, 0x12, 0x11, 0x15, 0x16, 0x16, 0x1c, 0x1c, 0x17, 0x1d, 0x1d,
+ 0x16, 0x1c, 0x1c, 0x17, 0x1e, 0x1d, 0x19, 0x21, 0x21, 0x1b, 0x23, 0x24,
+ 0x20, 0x24, 0x27, 0x21, 0x25, 0x28, 0x25, 0x29, 0x2a, 0x27, 0x2c, 0x2c,
+ 0x2a, 0x30, 0x30, 0x2b, 0x33, 0x35, 0x32, 0x3a, 0x3d, 0x35, 0x3d, 0x43,
+ 0x38, 0x41, 0x4a, 0x37, 0x41, 0x4a, 0x39, 0x45, 0x4d, 0x38, 0x45, 0x4d,
+ 0x3c, 0x48, 0x50, 0x49, 0x53, 0x5c, 0x5e, 0x68, 0x71, 0x72, 0x7a, 0x83,
+ 0x7f, 0x84, 0x8b, 0x8d, 0x94, 0x9a, 0x93, 0x9d, 0xa3, 0x97, 0xa1, 0xa7,
+ 0x8f, 0x9d, 0xa8, 0x84, 0x9c, 0xac, 0x77, 0x9a, 0xb0, 0x5c, 0x88, 0xa1,
+ 0x57, 0x87, 0xa3, 0x52, 0x87, 0xa7, 0x46, 0x82, 0xa5, 0x3c, 0x7e, 0xa4,
+ 0x3c, 0x83, 0xa9, 0x36, 0x83, 0xa8, 0x35, 0x8a, 0xae, 0x3d, 0x96, 0xbd,
+ 0x43, 0x9d, 0xc6, 0x51, 0xa5, 0xcf, 0x61, 0xac, 0xd9, 0x71, 0xb5, 0xe1,
+ 0x7e, 0xbb, 0xe2, 0x8e, 0xc3, 0xe4, 0xa2, 0xce, 0xe9, 0xae, 0xd3, 0xea,
+ 0xb9, 0xc8, 0xd8, 0xaa, 0xba, 0xc9, 0x98, 0xa8, 0xb7, 0x8d, 0x9a, 0xa8,
+ 0x82, 0x8e, 0x9b, 0x78, 0x85, 0x93, 0x67, 0x77, 0x8b, 0x4d, 0x62, 0x7a,
+ 0x37, 0x4e, 0x70, 0x27, 0x3f, 0x5c, 0x41, 0x59, 0x69, 0xbc, 0xd1, 0xd6,
+ 0xc8, 0xd8, 0xd8, 0xc7, 0xd2, 0xd5, 0xc3, 0xce, 0xd6, 0xbf, 0xcb, 0xd9,
+ 0xbe, 0xca, 0xd9, 0xbc, 0xc8, 0xd6, 0xbd, 0xc9, 0xd7, 0xbd, 0xca, 0xd8,
+ 0xbd, 0xc9, 0xda, 0xbe, 0xca, 0xda, 0xbe, 0xca, 0xda, 0xbf, 0xcb, 0xdb,
+ 0xc1, 0xcd, 0xdd, 0xbf, 0xcc, 0xdc, 0xbf, 0xcc, 0xdc, 0xc1, 0xce, 0xde,
+ 0xbf, 0xcc, 0xdc, 0xc1, 0xce, 0xde, 0xc2, 0xcf, 0xdf, 0xc2, 0xce, 0xde,
+ 0xbf, 0xcf, 0xdc, 0xbe, 0xcf, 0xdd, 0xc1, 0xcd, 0xdd, 0xb9, 0xc1, 0xd0,
+ 0xa9, 0xae, 0xba, 0x9d, 0x9e, 0xa8, 0x95, 0x92, 0x98, 0x96, 0x91, 0x95,
+ 0x05, 0x05, 0x05, 0x0a, 0x0a, 0x0a, 0x1b, 0x1b, 0x1b, 0x28, 0x28, 0x26,
+ 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1a, 0x1c, 0x1c, 0x1a, 0x19, 0x19, 0x17,
+ 0x1b, 0x1d, 0x1a, 0x1e, 0x1f, 0x1c, 0x1e, 0x1e, 0x1c, 0x1d, 0x1d, 0x1c,
+ 0x1e, 0x1c, 0x1d, 0x19, 0x19, 0x17, 0x12, 0x12, 0x10, 0x08, 0x08, 0x06,
+ 0x06, 0x08, 0x07, 0x07, 0x09, 0x08, 0x05, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0f, 0x0f, 0x0f,
+ 0x14, 0x14, 0x13, 0x1a, 0x1a, 0x18, 0x21, 0x21, 0x1f, 0x17, 0x17, 0x17,
+ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x09, 0x09, 0x09,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x06, 0x09, 0x09, 0x07,
+ 0x09, 0x09, 0x07, 0x0b, 0x0b, 0x09, 0x0a, 0x0a, 0x0a, 0x0f, 0x0f, 0x0f,
+ 0x15, 0x17, 0x16, 0x1a, 0x1c, 0x1b, 0x1e, 0x20, 0x1f, 0x1e, 0x20, 0x1f,
+ 0x24, 0x24, 0x24, 0x22, 0x22, 0x21, 0x1c, 0x1c, 0x1a, 0x21, 0x21, 0x1f,
+ 0x26, 0x26, 0x24, 0x28, 0x28, 0x26, 0x2b, 0x2b, 0x29, 0x23, 0x23, 0x21,
+ 0x13, 0x13, 0x11, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x14, 0x14, 0x14,
+ 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x19, 0x19, 0x19, 0x52, 0x4f, 0x4e, 0x6b, 0x62, 0x63,
+ 0x4a, 0x3c, 0x3c, 0x34, 0x2a, 0x23, 0xc5, 0xbf, 0xb1, 0xff, 0xff, 0xf1,
+ 0xf4, 0xf1, 0xe2, 0xed, 0xea, 0xd9, 0xf3, 0xee, 0xd7, 0xf2, 0xed, 0xd0,
+ 0xef, 0xea, 0xcc, 0xf0, 0xeb, 0xce, 0xf1, 0xec, 0xcf, 0xee, 0xe8, 0xcd,
+ 0xf0, 0xeb, 0xce, 0xe7, 0xe0, 0xc3, 0xdc, 0xd5, 0xb6, 0xe9, 0xe3, 0xc2,
+ 0xef, 0xe9, 0xc7, 0xe8, 0xe3, 0xc3, 0xe5, 0xe0, 0xc1, 0xe7, 0xe2, 0xc4,
+ 0xc7, 0xc3, 0xa6, 0xcf, 0xce, 0xb4, 0xc2, 0xbf, 0xa9, 0xe5, 0xe3, 0xce,
+ 0xf3, 0xed, 0xd7, 0xeb, 0xe6, 0xc9, 0xe4, 0xe0, 0xbc, 0xe4, 0xde, 0xbe,
+ 0xd8, 0xcf, 0xba, 0x52, 0x47, 0x40, 0x2e, 0x20, 0x21, 0x32, 0x23, 0x27,
+ 0x2e, 0x23, 0x24, 0x2f, 0x29, 0x29, 0x1b, 0x19, 0x1a, 0x09, 0x09, 0x0b,
+ 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0c, 0x09, 0x09, 0x0a, 0x07, 0x09, 0x08,
+ 0x08, 0x09, 0x0b, 0x08, 0x09, 0x0a, 0x08, 0x08, 0x0a, 0x08, 0x08, 0x08,
+ 0x0a, 0x09, 0x09, 0x10, 0x0f, 0x10, 0x13, 0x11, 0x12, 0x27, 0x25, 0x26,
+ 0x31, 0x31, 0x2f, 0x26, 0x26, 0x24, 0x2b, 0x2b, 0x2a, 0x25, 0x25, 0x25,
+ 0x23, 0x23, 0x23, 0x28, 0x28, 0x28, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x20,
+ 0x28, 0x28, 0x2c, 0x23, 0x22, 0x27, 0x1d, 0x1c, 0x23, 0x1b, 0x1e, 0x27,
+ 0x18, 0x1d, 0x24, 0x25, 0x29, 0x2a, 0x5a, 0x5b, 0x51, 0x99, 0x98, 0x86,
+ 0xa4, 0xa6, 0x8e, 0xb0, 0xaf, 0x96, 0xba, 0xb9, 0x9f, 0xb8, 0xb6, 0x9d,
+ 0xb9, 0xb6, 0x9e, 0xbe, 0xbc, 0xa4, 0xbd, 0xbb, 0xa6, 0xbe, 0xbc, 0xa8,
+ 0xc2, 0xbf, 0xad, 0xbb, 0xb8, 0xa7, 0xa1, 0x9f, 0x90, 0x75, 0x74, 0x64,
+ 0xaf, 0xb0, 0x9e, 0x87, 0x86, 0x72, 0x80, 0x7f, 0x6a, 0xa2, 0xa1, 0x8d,
+ 0xb4, 0xb4, 0xac, 0xd0, 0xd0, 0xc8, 0xc4, 0xc6, 0xbb, 0xc7, 0xc9, 0xc0,
+ 0xa2, 0xa2, 0x9f, 0x7b, 0x7b, 0x79, 0x92, 0x93, 0x8e, 0x88, 0x89, 0x83,
+ 0x8a, 0x8b, 0x83, 0xb3, 0xb4, 0xab, 0xd0, 0xd2, 0xc8, 0xd0, 0xd3, 0xc8,
+ 0xcc, 0xcf, 0xc6, 0xc8, 0xcb, 0xc4, 0xc3, 0xc5, 0xc0, 0xb9, 0xb9, 0xb6,
+ 0xa3, 0xa9, 0xa7, 0x91, 0x96, 0x9f, 0x80, 0x85, 0x98, 0x4b, 0x52, 0x64,
+ 0x19, 0x21, 0x2a, 0x24, 0x2c, 0x2f, 0x4c, 0x50, 0x5b, 0x28, 0x2b, 0x3d,
+ 0x15, 0x17, 0x1a, 0x1d, 0x1d, 0x1f, 0x19, 0x19, 0x1b, 0x19, 0x17, 0x1a,
+ 0x16, 0x14, 0x16, 0x14, 0x12, 0x13, 0x13, 0x13, 0x13, 0x15, 0x15, 0x15,
+ 0x17, 0x17, 0x19, 0x14, 0x14, 0x14, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x10, 0x10, 0x10,
+ 0x12, 0x10, 0x13, 0x10, 0x10, 0x0f, 0x0d, 0x0f, 0x0c, 0x26, 0x2b, 0x29,
+ 0x39, 0x3d, 0x40, 0x36, 0x3d, 0x43, 0x35, 0x3d, 0x41, 0x2f, 0x36, 0x3b,
+ 0x34, 0x39, 0x43, 0x29, 0x2c, 0x35, 0x11, 0x12, 0x17, 0x0d, 0x0e, 0x10,
+ 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x11, 0x17, 0x17, 0x1a,
+ 0x21, 0x21, 0x25, 0x22, 0x22, 0x27, 0x20, 0x20, 0x25, 0x17, 0x18, 0x1c,
+ 0x1b, 0x1c, 0x1e, 0x1c, 0x1c, 0x1e, 0x12, 0x12, 0x15, 0x15, 0x14, 0x16,
+ 0x10, 0x13, 0x14, 0x12, 0x16, 0x17, 0x17, 0x1b, 0x1c, 0x18, 0x1c, 0x1d,
+ 0x17, 0x1d, 0x1d, 0x1a, 0x20, 0x20, 0x1c, 0x22, 0x22, 0x1d, 0x23, 0x23,
+ 0x20, 0x25, 0x27, 0x21, 0x25, 0x26, 0x22, 0x28, 0x28, 0x28, 0x2e, 0x2c,
+ 0x2a, 0x30, 0x30, 0x2a, 0x32, 0x34, 0x2e, 0x36, 0x38, 0x31, 0x39, 0x3f,
+ 0x34, 0x3d, 0x46, 0x36, 0x40, 0x49, 0x37, 0x44, 0x4d, 0x39, 0x47, 0x51,
+ 0x3b, 0x49, 0x54, 0x3a, 0x46, 0x52, 0x3e, 0x48, 0x54, 0x43, 0x4a, 0x57,
+ 0x4e, 0x54, 0x5f, 0x5d, 0x65, 0x6e, 0x6c, 0x79, 0x7f, 0x77, 0x83, 0x89,
+ 0x7d, 0x88, 0x8e, 0x82, 0x8b, 0x96, 0x7c, 0x85, 0x93, 0x79, 0x83, 0x92,
+ 0x77, 0x82, 0x8e, 0x70, 0x7f, 0x8e, 0x69, 0x7d, 0x91, 0x64, 0x7b, 0x94,
+ 0x5f, 0x79, 0x93, 0x5b, 0x79, 0x93, 0x5c, 0x80, 0x9a, 0x63, 0x8b, 0xa7,
+ 0x6d, 0x99, 0xaf, 0x81, 0xaa, 0xc1, 0x96, 0xb8, 0xd1, 0xaa, 0xc6, 0xdf,
+ 0xb3, 0xcc, 0xe1, 0xb6, 0xc9, 0xd9, 0xb4, 0xc0, 0xcc, 0xae, 0xb5, 0xc0,
+ 0x9d, 0xad, 0xb5, 0x93, 0xa2, 0xad, 0x8d, 0x98, 0xa9, 0x88, 0x8f, 0xa0,
+ 0x7f, 0x84, 0x95, 0x72, 0x79, 0x89, 0x5b, 0x69, 0x76, 0x5f, 0x74, 0x82,
+ 0x5f, 0x73, 0x8d, 0x36, 0x4b, 0x61, 0x75, 0x8a, 0x95, 0xcc, 0xdc, 0xe1,
+ 0xc8, 0xd4, 0xd8, 0xc5, 0xce, 0xd5, 0xc0, 0xca, 0xd5, 0xbd, 0xc9, 0xd8,
+ 0xbc, 0xc9, 0xd6, 0xbb, 0xc8, 0xd6, 0xbb, 0xc9, 0xd6, 0xbc, 0xca, 0xd7,
+ 0xbe, 0xca, 0xda, 0xbe, 0xca, 0xda, 0xbf, 0xcb, 0xdb, 0xbe, 0xcb, 0xdb,
+ 0xbf, 0xcc, 0xdc, 0xc0, 0xcd, 0xdd, 0xbe, 0xcc, 0xdc, 0xbe, 0xce, 0xdd,
+ 0xbd, 0xcc, 0xdc, 0xc0, 0xcd, 0xdd, 0xc1, 0xce, 0xde, 0xc1, 0xce, 0xdd,
+ 0xbe, 0xce, 0xdb, 0xbf, 0xce, 0xdb, 0xc0, 0xca, 0xd9, 0xb4, 0xb9, 0xc7,
+ 0xa4, 0xa5, 0xb2, 0x98, 0x97, 0x9f, 0x94, 0x91, 0x95, 0x95, 0x93, 0x94,
+ 0x0e, 0x0e, 0x0e, 0x1a, 0x1a, 0x1a, 0x21, 0x21, 0x21, 0x28, 0x28, 0x27,
+ 0x22, 0x22, 0x20, 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x17, 0x1b, 0x1b, 0x19,
+ 0x19, 0x1e, 0x18, 0x22, 0x25, 0x21, 0x1f, 0x21, 0x20, 0x1a, 0x1b, 0x1b,
+ 0x19, 0x19, 0x19, 0x10, 0x10, 0x0f, 0x08, 0x08, 0x06, 0x06, 0x07, 0x02,
+ 0x08, 0x0a, 0x08, 0x07, 0x08, 0x08, 0x05, 0x06, 0x05, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0a, 0x10, 0x10, 0x0e, 0x17, 0x17, 0x15, 0x0e, 0x0e, 0x0e,
+ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06,
+ 0x09, 0x09, 0x07, 0x0c, 0x0c, 0x0b, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x10, 0x0f, 0x10, 0x12, 0x11, 0x16, 0x18, 0x17, 0x1e, 0x20, 0x1f,
+ 0x22, 0x22, 0x22, 0x1f, 0x1f, 0x1d, 0x1f, 0x1f, 0x1d, 0x20, 0x20, 0x1e,
+ 0x22, 0x22, 0x20, 0x22, 0x22, 0x20, 0x26, 0x26, 0x24, 0x2e, 0x2e, 0x2c,
+ 0x2a, 0x2a, 0x28, 0x18, 0x18, 0x16, 0x0d, 0x0d, 0x0b, 0x0a, 0x0a, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0d,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x06, 0x07, 0x09, 0x07, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x08, 0x07, 0x30, 0x32, 0x31, 0x56, 0x55, 0x53, 0x66, 0x5e, 0x5f,
+ 0x44, 0x36, 0x36, 0x3f, 0x36, 0x2d, 0xdf, 0xda, 0xca, 0xfe, 0xfe, 0xee,
+ 0xf6, 0xf4, 0xe5, 0xf4, 0xf1, 0xe2, 0xf4, 0xef, 0xda, 0xf1, 0xec, 0xcf,
+ 0xed, 0xe9, 0xcc, 0xf2, 0xec, 0xd2, 0xf2, 0xec, 0xd2, 0xf4, 0xee, 0xd5,
+ 0xf0, 0xea, 0xd0, 0xdc, 0xd6, 0xb9, 0xde, 0xd9, 0xb8, 0xeb, 0xe5, 0xc4,
+ 0xf0, 0xe9, 0xcb, 0xed, 0xe8, 0xca, 0xea, 0xe5, 0xc7, 0xec, 0xe7, 0xc9,
+ 0xe2, 0xdd, 0xc0, 0xd4, 0xd0, 0xb5, 0xe7, 0xe3, 0xca, 0xef, 0xea, 0xd4,
+ 0xef, 0xe9, 0xd1, 0xeb, 0xe6, 0xca, 0xe4, 0xe0, 0xbf, 0xe8, 0xe2, 0xc6,
+ 0xd0, 0xc9, 0xb9, 0x50, 0x46, 0x44, 0x33, 0x27, 0x2e, 0x2d, 0x21, 0x2a,
+ 0x2d, 0x24, 0x25, 0x30, 0x2a, 0x2a, 0x1c, 0x1a, 0x1b, 0x0b, 0x0b, 0x0c,
+ 0x08, 0x08, 0x08, 0x0b, 0x0a, 0x0b, 0x0a, 0x0a, 0x0a, 0x08, 0x09, 0x08,
+ 0x06, 0x08, 0x07, 0x09, 0x0a, 0x0a, 0x09, 0x0a, 0x0a, 0x11, 0x10, 0x0e,
+ 0x1d, 0x1a, 0x18, 0x2b, 0x27, 0x25, 0x2c, 0x27, 0x24, 0x2c, 0x27, 0x24,
+ 0x2f, 0x2b, 0x29, 0x2a, 0x26, 0x24, 0x27, 0x23, 0x22, 0x27, 0x23, 0x22,
+ 0x28, 0x24, 0x23, 0x27, 0x22, 0x21, 0x25, 0x1f, 0x1f, 0x25, 0x1f, 0x1f,
+ 0x22, 0x21, 0x21, 0x24, 0x22, 0x25, 0x24, 0x1f, 0x25, 0x23, 0x1e, 0x25,
+ 0x20, 0x1f, 0x25, 0x33, 0x33, 0x31, 0x69, 0x6a, 0x5c, 0x94, 0x93, 0x7d,
+ 0xa5, 0xa3, 0x89, 0xb0, 0xad, 0x94, 0xba, 0xb6, 0x9d, 0xbc, 0xb8, 0x9f,
+ 0xc2, 0xbd, 0xa6, 0xc5, 0xc0, 0xaa, 0xc1, 0xbd, 0xa8, 0xc3, 0xbf, 0xaa,
+ 0xb2, 0xb0, 0x9c, 0x7b, 0x78, 0x66, 0x80, 0x7e, 0x6f, 0xbf, 0xbd, 0xb0,
+ 0x9d, 0x9e, 0x91, 0x7a, 0x7b, 0x6d, 0xb5, 0xb5, 0xa5, 0xb4, 0xb3, 0xa1,
+ 0x99, 0x99, 0x8c, 0xc4, 0xc6, 0xba, 0xcf, 0xd1, 0xc6, 0xcb, 0xcd, 0xc7,
+ 0x6a, 0x6c, 0x69, 0x95, 0x97, 0x92, 0xd6, 0xd7, 0xcf, 0xc6, 0xc8, 0xbc,
+ 0x9b, 0x9c, 0x95, 0x77, 0x78, 0x70, 0xaf, 0xb1, 0xa6, 0xcd, 0xd1, 0xc5,
+ 0xcf, 0xd2, 0xc7, 0xcc, 0xd0, 0xc8, 0xc9, 0xca, 0xc6, 0xc0, 0xc0, 0xbe,
+ 0xb1, 0xb4, 0xae, 0xa1, 0xa5, 0xa7, 0x96, 0x99, 0xa6, 0x70, 0x76, 0x87,
+ 0x30, 0x37, 0x47, 0x2d, 0x33, 0x41, 0x49, 0x4f, 0x5d, 0x24, 0x29, 0x36,
+ 0x17, 0x19, 0x1b, 0x1e, 0x1d, 0x1f, 0x18, 0x18, 0x1a, 0x17, 0x15, 0x16,
+ 0x15, 0x13, 0x14, 0x13, 0x12, 0x12, 0x12, 0x13, 0x12, 0x15, 0x15, 0x15,
+ 0x17, 0x17, 0x18, 0x13, 0x13, 0x15, 0x13, 0x13, 0x14, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0d, 0x0c, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x10, 0x10, 0x10,
+ 0x12, 0x10, 0x15, 0x10, 0x0f, 0x10, 0x0f, 0x11, 0x0e, 0x2d, 0x31, 0x30,
+ 0x37, 0x3c, 0x41, 0x35, 0x3c, 0x45, 0x30, 0x37, 0x3d, 0x2e, 0x36, 0x39,
+ 0x37, 0x39, 0x45, 0x22, 0x24, 0x2e, 0x0d, 0x0e, 0x13, 0x0e, 0x0f, 0x11,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x11, 0x13, 0x13, 0x16, 0x1e, 0x1f, 0x23,
+ 0x24, 0x25, 0x2a, 0x23, 0x24, 0x29, 0x1f, 0x21, 0x25, 0x15, 0x19, 0x1a,
+ 0x1a, 0x1c, 0x1d, 0x15, 0x16, 0x17, 0x11, 0x12, 0x14, 0x16, 0x16, 0x17,
+ 0x12, 0x12, 0x14, 0x16, 0x17, 0x19, 0x1a, 0x1b, 0x1d, 0x1a, 0x1b, 0x1d,
+ 0x17, 0x1b, 0x1c, 0x19, 0x1e, 0x1e, 0x1f, 0x23, 0x24, 0x1f, 0x23, 0x24,
+ 0x1e, 0x23, 0x26, 0x1e, 0x23, 0x26, 0x20, 0x27, 0x27, 0x24, 0x2c, 0x2b,
+ 0x25, 0x2e, 0x2f, 0x2b, 0x33, 0x36, 0x2f, 0x36, 0x3c, 0x32, 0x39, 0x41,
+ 0x33, 0x3b, 0x44, 0x35, 0x3f, 0x48, 0x34, 0x42, 0x4b, 0x37, 0x47, 0x50,
+ 0x3f, 0x4e, 0x57, 0x3a, 0x46, 0x4f, 0x3c, 0x45, 0x4e, 0x3d, 0x44, 0x4e,
+ 0x3e, 0x46, 0x4f, 0x3f, 0x48, 0x4f, 0x42, 0x4d, 0x51, 0x4b, 0x56, 0x5d,
+ 0x54, 0x5d, 0x64, 0x5a, 0x61, 0x6a, 0x61, 0x65, 0x6e, 0x69, 0x6d, 0x74,
+ 0x64, 0x69, 0x6c, 0x63, 0x6a, 0x70, 0x62, 0x6b, 0x77, 0x63, 0x69, 0x78,
+ 0x65, 0x69, 0x78, 0x69, 0x6e, 0x7d, 0x6e, 0x76, 0x86, 0x79, 0x82, 0x93,
+ 0x83, 0x97, 0x9a, 0x92, 0xa5, 0xaa, 0x9e, 0xb0, 0xb5, 0xa3, 0xb4, 0xbb,
+ 0xa0, 0xb3, 0xbb, 0x9d, 0xb0, 0xb9, 0x9a, 0xaa, 0xb4, 0x98, 0xa4, 0xaf,
+ 0x8f, 0x9f, 0xa9, 0x8c, 0x9c, 0xa6, 0x85, 0x91, 0x9e, 0x7e, 0x86, 0x93,
+ 0x78, 0x7f, 0x8a, 0x69, 0x71, 0x7c, 0x55, 0x64, 0x6f, 0x5b, 0x6d, 0x7c,
+ 0x5d, 0x6e, 0x83, 0x47, 0x58, 0x67, 0xa7, 0xba, 0xc1, 0xc9, 0xd9, 0xdd,
+ 0xc6, 0xcf, 0xd8, 0xc3, 0xcb, 0xd6, 0xc0, 0xc9, 0xd6, 0xbc, 0xca, 0xd7,
+ 0xbb, 0xc9, 0xd4, 0xbb, 0xc9, 0xd6, 0xbb, 0xc9, 0xd6, 0xbd, 0xcb, 0xd8,
+ 0xbd, 0xcb, 0xd8, 0xbc, 0xca, 0xd7, 0xbd, 0xcb, 0xda, 0xbe, 0xcb, 0xdb,
+ 0xc0, 0xcd, 0xdd, 0xbf, 0xcd, 0xdc, 0xbc, 0xcb, 0xda, 0xbc, 0xcc, 0xdc,
+ 0xbe, 0xce, 0xdd, 0xbf, 0xce, 0xde, 0xc1, 0xcf, 0xdf, 0xc0, 0xce, 0xdd,
+ 0xbe, 0xce, 0xdb, 0xc0, 0xce, 0xdc, 0xbc, 0xc4, 0xd3, 0xac, 0xb0, 0xbf,
+ 0x9f, 0x9e, 0xab, 0x94, 0x93, 0x9a, 0x93, 0x91, 0x94, 0x97, 0x96, 0x94,
+ 0x1c, 0x1c, 0x1c, 0x1b, 0x1b, 0x1b, 0x1e, 0x1e, 0x1e, 0x20, 0x20, 0x1e,
+ 0x20, 0x20, 0x1e, 0x1c, 0x1c, 0x1a, 0x1b, 0x1b, 0x18, 0x1b, 0x1c, 0x18,
+ 0x19, 0x1e, 0x18, 0x1a, 0x1e, 0x1b, 0x1a, 0x1d, 0x1b, 0x17, 0x17, 0x17,
+ 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x09, 0x08, 0x08, 0x06, 0x05, 0x07, 0x03,
+ 0x07, 0x09, 0x08, 0x09, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0a, 0x0b, 0x0b, 0x09, 0x0e, 0x0e, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x05, 0x05, 0x07,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x05, 0x09, 0x09, 0x07,
+ 0x08, 0x08, 0x07, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0c, 0x0d, 0x0d,
+ 0x0d, 0x0e, 0x10, 0x0a, 0x0c, 0x0b, 0x11, 0x13, 0x11, 0x19, 0x1b, 0x1a,
+ 0x1f, 0x21, 0x20, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x1f,
+ 0x1f, 0x1f, 0x1d, 0x1f, 0x1f, 0x1d, 0x21, 0x21, 0x1f, 0x2a, 0x2a, 0x28,
+ 0x2d, 0x2d, 0x2c, 0x2d, 0x2d, 0x2b, 0x24, 0x24, 0x22, 0x11, 0x12, 0x10,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x12, 0x12, 0x12,
+ 0x1a, 0x1b, 0x1b, 0x0f, 0x10, 0x0f, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0b, 0x0a, 0x08, 0x09, 0x09, 0x07, 0x08, 0x09, 0x09, 0x09,
+ 0x06, 0x08, 0x07, 0x47, 0x49, 0x48, 0x56, 0x56, 0x54, 0x65, 0x61, 0x60,
+ 0x3c, 0x2d, 0x2d, 0x4b, 0x42, 0x37, 0xed, 0xe9, 0xd6, 0xfb, 0xfa, 0xe6,
+ 0xf9, 0xf8, 0xe8, 0xf5, 0xf3, 0xe4, 0xef, 0xeb, 0xd4, 0xf2, 0xec, 0xcf,
+ 0xec, 0xe8, 0xcc, 0xec, 0xe8, 0xcd, 0xf0, 0xec, 0xd3, 0xf1, 0xeb, 0xd3,
+ 0xf0, 0xea, 0xd0, 0xde, 0xd9, 0xbc, 0xe8, 0xe3, 0xc1, 0xef, 0xe9, 0xc6,
+ 0xec, 0xe7, 0xc9, 0xe8, 0xe3, 0xc6, 0xed, 0xe8, 0xca, 0xf1, 0xec, 0xd0,
+ 0xe4, 0xe0, 0xc3, 0xe9, 0xe3, 0xc8, 0xf7, 0xf1, 0xd8, 0xf1, 0xec, 0xd4,
+ 0xed, 0xe5, 0xce, 0xef, 0xe9, 0xcd, 0xeb, 0xe6, 0xc7, 0xea, 0xe4, 0xcc,
+ 0xc0, 0xb8, 0xac, 0x80, 0x77, 0x78, 0x66, 0x5d, 0x67, 0x42, 0x3a, 0x43,
+ 0x30, 0x28, 0x28, 0x29, 0x26, 0x25, 0x1e, 0x1e, 0x1c, 0x0d, 0x0e, 0x0d,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x08, 0x07, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x06, 0x0d, 0x0b, 0x09, 0x18, 0x16, 0x14, 0x2c, 0x28, 0x25,
+ 0x36, 0x30, 0x2c, 0x39, 0x32, 0x2d, 0x35, 0x2d, 0x27, 0x32, 0x28, 0x23,
+ 0x2f, 0x28, 0x26, 0x34, 0x2c, 0x2a, 0x2f, 0x27, 0x28, 0x29, 0x20, 0x21,
+ 0x2a, 0x21, 0x21, 0x27, 0x1e, 0x1e, 0x26, 0x1d, 0x1c, 0x27, 0x1f, 0x1e,
+ 0x33, 0x32, 0x30, 0x4f, 0x4b, 0x4c, 0x36, 0x2d, 0x32, 0x34, 0x2a, 0x32,
+ 0x33, 0x2f, 0x34, 0x2c, 0x2b, 0x28, 0x40, 0x41, 0x33, 0x74, 0x76, 0x5f,
+ 0xa3, 0xa0, 0x85, 0xb2, 0xae, 0x93, 0xba, 0xb5, 0x9a, 0xbd, 0xb7, 0x9e,
+ 0xc0, 0xba, 0xa2, 0xc4, 0xbe, 0xa8, 0xcb, 0xc5, 0xaf, 0xbf, 0xba, 0xa4,
+ 0x7d, 0x7a, 0x65, 0x93, 0x92, 0x7e, 0x7e, 0x7d, 0x6d, 0xb8, 0xb8, 0xac,
+ 0xc9, 0xc9, 0xbe, 0xac, 0xac, 0xa2, 0xa2, 0xa2, 0x96, 0xc8, 0xc8, 0xbc,
+ 0xcb, 0xce, 0xbe, 0xcc, 0xce, 0xbf, 0xcd, 0xcf, 0xc4, 0xcf, 0xd1, 0xcb,
+ 0x95, 0x97, 0x93, 0x82, 0x85, 0x7e, 0xc4, 0xc7, 0xba, 0xd6, 0xd9, 0xc6,
+ 0xd6, 0xd7, 0xd0, 0xaa, 0xaa, 0xa3, 0x80, 0x82, 0x78, 0xc0, 0xc3, 0xb8,
+ 0xd0, 0xd3, 0xc7, 0xcc, 0xcf, 0xc6, 0xcc, 0xce, 0xc9, 0xc8, 0xc8, 0xc6,
+ 0xbd, 0xbf, 0xb9, 0xad, 0xaf, 0xad, 0xa4, 0xa8, 0xae, 0x84, 0x8a, 0x98,
+ 0x4b, 0x52, 0x67, 0x34, 0x3b, 0x50, 0x3a, 0x40, 0x51, 0x1d, 0x24, 0x2c,
+ 0x19, 0x1c, 0x1d, 0x1d, 0x1c, 0x1e, 0x19, 0x18, 0x19, 0x19, 0x16, 0x17,
+ 0x17, 0x15, 0x16, 0x13, 0x12, 0x13, 0x15, 0x14, 0x14, 0x17, 0x17, 0x15,
+ 0x14, 0x14, 0x16, 0x14, 0x14, 0x16, 0x13, 0x13, 0x15, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x0f, 0x0f, 0x10, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x12, 0x12, 0x12,
+ 0x13, 0x11, 0x16, 0x0f, 0x0e, 0x0f, 0x17, 0x1a, 0x16, 0x34, 0x3a, 0x3a,
+ 0x36, 0x3b, 0x42, 0x35, 0x3c, 0x45, 0x2d, 0x34, 0x3c, 0x32, 0x39, 0x3d,
+ 0x34, 0x37, 0x43, 0x17, 0x19, 0x22, 0x0b, 0x0c, 0x11, 0x0d, 0x0d, 0x0f,
+ 0x0f, 0x0f, 0x0e, 0x10, 0x10, 0x10, 0x15, 0x16, 0x17, 0x22, 0x23, 0x27,
+ 0x23, 0x26, 0x2d, 0x22, 0x25, 0x2a, 0x1b, 0x1f, 0x22, 0x13, 0x18, 0x19,
+ 0x14, 0x19, 0x19, 0x11, 0x15, 0x14, 0x12, 0x16, 0x15, 0x18, 0x1a, 0x19,
+ 0x18, 0x18, 0x1b, 0x19, 0x19, 0x1b, 0x1a, 0x1b, 0x1d, 0x1b, 0x1c, 0x1e,
+ 0x19, 0x1a, 0x1d, 0x1c, 0x1d, 0x1f, 0x1c, 0x20, 0x22, 0x20, 0x24, 0x25,
+ 0x1e, 0x23, 0x27, 0x1d, 0x23, 0x26, 0x21, 0x29, 0x2b, 0x23, 0x2b, 0x2c,
+ 0x25, 0x2d, 0x30, 0x2a, 0x31, 0x36, 0x2c, 0x35, 0x3c, 0x30, 0x39, 0x42,
+ 0x33, 0x3d, 0x46, 0x31, 0x3b, 0x44, 0x2f, 0x3d, 0x46, 0x32, 0x43, 0x4a,
+ 0x35, 0x46, 0x4d, 0x37, 0x44, 0x49, 0x3b, 0x44, 0x49, 0x3e, 0x43, 0x48,
+ 0x3d, 0x44, 0x4b, 0x3f, 0x47, 0x4d, 0x42, 0x49, 0x4e, 0x42, 0x49, 0x52,
+ 0x42, 0x4a, 0x54, 0x41, 0x49, 0x54, 0x45, 0x4f, 0x58, 0x47, 0x51, 0x57,
+ 0x44, 0x4d, 0x52, 0x47, 0x52, 0x59, 0x4a, 0x55, 0x61, 0x4d, 0x59, 0x64,
+ 0x53, 0x5f, 0x69, 0x58, 0x64, 0x6c, 0x5b, 0x6b, 0x72, 0x6a, 0x7c, 0x82,
+ 0x7e, 0x8a, 0x93, 0x8c, 0x96, 0x9f, 0x93, 0x9d, 0xa5, 0x94, 0xa1, 0xa9,
+ 0x93, 0xa2, 0xa9, 0x94, 0xa3, 0xac, 0x93, 0xa0, 0xab, 0x91, 0x99, 0xa6,
+ 0x8f, 0x95, 0xa1, 0x86, 0x90, 0x99, 0x7c, 0x89, 0x8f, 0x76, 0x85, 0x88,
+ 0x6c, 0x7a, 0x7e, 0x60, 0x6e, 0x77, 0x45, 0x54, 0x66, 0x33, 0x43, 0x5b,
+ 0x36, 0x45, 0x53, 0x5b, 0x6b, 0x74, 0xc6, 0xd5, 0xdc, 0xc6, 0xd3, 0xd9,
+ 0xc4, 0xcc, 0xd7, 0xc2, 0xca, 0xd7, 0xbf, 0xc9, 0xd7, 0xbc, 0xca, 0xd7,
+ 0xb9, 0xca, 0xd4, 0xb8, 0xc9, 0xd3, 0xb8, 0xc9, 0xd3, 0xbc, 0xca, 0xd7,
+ 0xbd, 0xcb, 0xd8, 0xbb, 0xca, 0xd7, 0xbb, 0xc9, 0xd8, 0xbd, 0xca, 0xda,
+ 0xbf, 0xcc, 0xdc, 0xbc, 0xcc, 0xdb, 0xbc, 0xcc, 0xda, 0xbd, 0xcd, 0xdc,
+ 0xbe, 0xce, 0xdc, 0xbf, 0xcf, 0xde, 0xc0, 0xcf, 0xdf, 0xc1, 0xce, 0xde,
+ 0xbe, 0xce, 0xdb, 0xc1, 0xcd, 0xdb, 0xb5, 0xbc, 0xcc, 0xa5, 0xa6, 0xb5,
+ 0x96, 0x95, 0xa1, 0x92, 0x91, 0x97, 0x94, 0x94, 0x95, 0x99, 0x98, 0x97,
+ 0x1c, 0x1e, 0x1b, 0x18, 0x1a, 0x17, 0x23, 0x25, 0x22, 0x21, 0x23, 0x20,
+ 0x1c, 0x1c, 0x1a, 0x1b, 0x1b, 0x19, 0x1b, 0x1b, 0x19, 0x1e, 0x1e, 0x1c,
+ 0x1f, 0x1f, 0x1d, 0x16, 0x17, 0x15, 0x12, 0x12, 0x12, 0x0d, 0x0d, 0x0d,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x08, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x09, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x09, 0x08, 0x07, 0x09, 0x08, 0x0b, 0x0d, 0x0c,
+ 0x0c, 0x0b, 0x10, 0x0d, 0x0d, 0x0f, 0x0e, 0x0e, 0x0c, 0x10, 0x10, 0x0e,
+ 0x17, 0x18, 0x18, 0x1f, 0x20, 0x21, 0x22, 0x24, 0x23, 0x1e, 0x20, 0x1e,
+ 0x1f, 0x20, 0x1f, 0x21, 0x20, 0x20, 0x24, 0x24, 0x24, 0x26, 0x26, 0x26,
+ 0x29, 0x29, 0x29, 0x2b, 0x2b, 0x2b, 0x2e, 0x2e, 0x2c, 0x28, 0x2a, 0x27,
+ 0x13, 0x14, 0x15, 0x09, 0x0b, 0x0a, 0x08, 0x0a, 0x09, 0x10, 0x11, 0x11,
+ 0x21, 0x23, 0x22, 0x14, 0x16, 0x15, 0x0c, 0x0e, 0x0d, 0x0a, 0x0c, 0x0b,
+ 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x09, 0x08, 0x09, 0x08, 0x07, 0x09, 0x08,
+ 0x08, 0x0a, 0x09, 0x4a, 0x4a, 0x4a, 0x61, 0x61, 0x5f, 0x5f, 0x5c, 0x5a,
+ 0x37, 0x26, 0x27, 0x41, 0x36, 0x2f, 0xe4, 0xe1, 0xd0, 0xfd, 0xfe, 0xed,
+ 0xf9, 0xf8, 0xe6, 0xfa, 0xf7, 0xe6, 0xf3, 0xf0, 0xde, 0xf3, 0xf1, 0xda,
+ 0xef, 0xeb, 0xcf, 0xe8, 0xe4, 0xc7, 0xf0, 0xec, 0xd0, 0xf6, 0xf1, 0xd9,
+ 0xec, 0xe6, 0xd0, 0xe2, 0xdd, 0xc6, 0xe7, 0xe3, 0xc6, 0xeb, 0xe7, 0xc5,
+ 0xe9, 0xe1, 0xc2, 0xeb, 0xe4, 0xc7, 0xef, 0xe8, 0xcc, 0xe5, 0xdf, 0xc5,
+ 0xe4, 0xe0, 0xc3, 0xf4, 0xf0, 0xd3, 0xf1, 0xed, 0xd2, 0xf1, 0xec, 0xd6,
+ 0xeb, 0xe4, 0xca, 0xee, 0xe7, 0xcb, 0xed, 0xe8, 0xcb, 0xe3, 0xdd, 0xc8,
+ 0x9f, 0x9b, 0x90, 0x8c, 0x8c, 0x8a, 0x8a, 0x8e, 0x8e, 0x73, 0x7a, 0x78,
+ 0x4d, 0x4d, 0x51, 0x2d, 0x2c, 0x30, 0x20, 0x20, 0x21, 0x0c, 0x0c, 0x0e,
+ 0x09, 0x09, 0x09, 0x08, 0x09, 0x07, 0x06, 0x08, 0x05, 0x09, 0x0a, 0x08,
+ 0x16, 0x13, 0x12, 0x26, 0x1f, 0x1f, 0x32, 0x28, 0x27, 0x3b, 0x30, 0x2e,
+ 0x3a, 0x2d, 0x29, 0x3d, 0x32, 0x2e, 0x37, 0x2d, 0x2c, 0x2d, 0x24, 0x28,
+ 0x24, 0x1e, 0x20, 0x23, 0x1e, 0x1f, 0x1e, 0x19, 0x1a, 0x19, 0x15, 0x14,
+ 0x18, 0x16, 0x12, 0x19, 0x17, 0x13, 0x1c, 0x1a, 0x16, 0x1c, 0x1b, 0x19,
+ 0x2a, 0x28, 0x24, 0x51, 0x4f, 0x4e, 0x5a, 0x57, 0x5a, 0x6c, 0x69, 0x6f,
+ 0x5b, 0x59, 0x5e, 0x42, 0x41, 0x45, 0x39, 0x39, 0x3e, 0x44, 0x44, 0x49,
+ 0x5e, 0x60, 0x51, 0x96, 0x98, 0x7f, 0xbd, 0xbc, 0x9d, 0xbf, 0xbb, 0x9c,
+ 0xbf, 0xb9, 0xa3, 0xc6, 0xbf, 0xae, 0xbc, 0xb7, 0xa4, 0xab, 0xa8, 0x92,
+ 0xb1, 0xac, 0x9a, 0xd1, 0xce, 0xbd, 0xa9, 0xa8, 0x97, 0x91, 0x92, 0x81,
+ 0xcc, 0xce, 0xba, 0xcf, 0xd0, 0xbc, 0xbe, 0xbf, 0xaf, 0xce, 0xcf, 0xc4,
+ 0xcd, 0xcd, 0xc7, 0xba, 0xba, 0xac, 0xc0, 0xc3, 0xae, 0xcd, 0xcf, 0xbf,
+ 0xc7, 0xc8, 0xc4, 0x95, 0x95, 0x95, 0x8a, 0x8b, 0x84, 0xaf, 0xb0, 0xa2,
+ 0xc8, 0xc8, 0xc2, 0xb7, 0xb6, 0xb1, 0x77, 0x76, 0x6f, 0xc0, 0xc1, 0xb7,
+ 0xcf, 0xd0, 0xc3, 0xcd, 0xcf, 0xc1, 0xcb, 0xcf, 0xc3, 0xc9, 0xcc, 0xc5,
+ 0xc5, 0xc1, 0xc3, 0xb8, 0xb7, 0xbb, 0xb1, 0xb6, 0xbc, 0x96, 0x9e, 0xa8,
+ 0x64, 0x6e, 0x79, 0x43, 0x4a, 0x58, 0x37, 0x39, 0x48, 0x23, 0x23, 0x31,
+ 0x25, 0x20, 0x26, 0x27, 0x21, 0x25, 0x2e, 0x25, 0x28, 0x2e, 0x25, 0x26,
+ 0x2d, 0x24, 0x25, 0x2a, 0x23, 0x24, 0x2a, 0x26, 0x27, 0x27, 0x24, 0x27,
+ 0x22, 0x1d, 0x23, 0x1d, 0x18, 0x1e, 0x18, 0x14, 0x19, 0x14, 0x14, 0x16,
+ 0x10, 0x11, 0x10, 0x0f, 0x10, 0x0e, 0x10, 0x14, 0x10, 0x12, 0x16, 0x11,
+ 0x10, 0x11, 0x13, 0x0f, 0x10, 0x12, 0x10, 0x12, 0x11, 0x0f, 0x0f, 0x0f,
+ 0x0c, 0x0c, 0x0d, 0x11, 0x11, 0x13, 0x10, 0x10, 0x12, 0x12, 0x11, 0x13,
+ 0x13, 0x11, 0x12, 0x0f, 0x0f, 0x0f, 0x20, 0x22, 0x21, 0x38, 0x3c, 0x3d,
+ 0x36, 0x3b, 0x3c, 0x37, 0x3e, 0x42, 0x35, 0x3c, 0x43, 0x34, 0x3a, 0x42,
+ 0x2a, 0x2e, 0x37, 0x0f, 0x12, 0x19, 0x0c, 0x0c, 0x11, 0x0d, 0x0d, 0x0d,
+ 0x10, 0x10, 0x0e, 0x12, 0x12, 0x10, 0x16, 0x18, 0x18, 0x21, 0x25, 0x24,
+ 0x24, 0x23, 0x28, 0x22, 0x22, 0x27, 0x1a, 0x1b, 0x1f, 0x13, 0x14, 0x18,
+ 0x11, 0x15, 0x16, 0x11, 0x15, 0x14, 0x17, 0x19, 0x18, 0x1e, 0x20, 0x1e,
+ 0x1f, 0x22, 0x25, 0x18, 0x1c, 0x20, 0x16, 0x19, 0x1e, 0x17, 0x1c, 0x20,
+ 0x18, 0x1d, 0x21, 0x1b, 0x20, 0x23, 0x1c, 0x21, 0x24, 0x1d, 0x21, 0x24,
+ 0x1e, 0x22, 0x23, 0x1e, 0x24, 0x25, 0x24, 0x2a, 0x2a, 0x26, 0x2c, 0x2d,
+ 0x23, 0x2b, 0x2d, 0x27, 0x31, 0x33, 0x2b, 0x36, 0x39, 0x2b, 0x39, 0x3c,
+ 0x30, 0x3f, 0x42, 0x30, 0x3e, 0x41, 0x33, 0x3e, 0x45, 0x35, 0x40, 0x46,
+ 0x35, 0x3f, 0x46, 0x36, 0x3f, 0x46, 0x3a, 0x43, 0x4a, 0x39, 0x42, 0x49,
+ 0x3d, 0x44, 0x4b, 0x3f, 0x46, 0x4e, 0x42, 0x49, 0x51, 0x41, 0x48, 0x52,
+ 0x43, 0x4b, 0x54, 0x41, 0x49, 0x51, 0x3e, 0x47, 0x4e, 0x3e, 0x49, 0x4f,
+ 0x47, 0x54, 0x5a, 0x40, 0x4f, 0x56, 0x42, 0x50, 0x59, 0x46, 0x56, 0x60,
+ 0x4c, 0x5a, 0x63, 0x53, 0x62, 0x67, 0x5c, 0x6a, 0x6b, 0x6d, 0x79, 0x7a,
+ 0x7f, 0x8d, 0x90, 0x8b, 0x98, 0x9c, 0x90, 0x9d, 0xa3, 0x91, 0x9e, 0xa6,
+ 0x8e, 0x9b, 0xa4, 0x8e, 0x9b, 0xa4, 0x8d, 0x97, 0xa1, 0x88, 0x92, 0x9c,
+ 0x7e, 0x8d, 0x9a, 0x7c, 0x88, 0x90, 0x78, 0x82, 0x84, 0x72, 0x7b, 0x7e,
+ 0x67, 0x70, 0x78, 0x57, 0x63, 0x72, 0x35, 0x40, 0x57, 0x26, 0x31, 0x49,
+ 0x32, 0x3a, 0x37, 0x98, 0xa1, 0x9f, 0xd0, 0xd9, 0xe0, 0xc4, 0xd0, 0xda,
+ 0xbe, 0xcb, 0xd4, 0xbc, 0xc9, 0xd3, 0xbc, 0xc8, 0xd4, 0xbc, 0xc8, 0xd6,
+ 0xbb, 0xc7, 0xd5, 0xba, 0xc6, 0xd4, 0xbb, 0xc7, 0xd5, 0xbb, 0xc7, 0xd5,
+ 0xbc, 0xca, 0xd7, 0xbc, 0xc9, 0xd9, 0xbd, 0xc9, 0xd9, 0xbd, 0xcb, 0xda,
+ 0xba, 0xcc, 0xda, 0xbd, 0xcd, 0xdc, 0xbf, 0xcd, 0xdc, 0xbf, 0xcd, 0xda,
+ 0xbe, 0xce, 0xdb, 0xbe, 0xd0, 0xdc, 0xbe, 0xce, 0xdb, 0xbe, 0xce, 0xdb,
+ 0xbd, 0xcd, 0xdf, 0xbd, 0xc7, 0xd9, 0xb0, 0xb1, 0xc2, 0x9f, 0x9d, 0xaa,
+ 0x93, 0x92, 0x99, 0x90, 0x90, 0x95, 0x96, 0x97, 0x98, 0x99, 0x99, 0x98,
+ 0x1c, 0x1e, 0x1b, 0x20, 0x22, 0x1f, 0x1f, 0x21, 0x1e, 0x19, 0x1b, 0x18,
+ 0x19, 0x19, 0x17, 0x1b, 0x1b, 0x19, 0x1b, 0x1b, 0x1a, 0x20, 0x20, 0x1e,
+ 0x1b, 0x1b, 0x19, 0x10, 0x10, 0x0e, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x08, 0x07, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x05, 0x07, 0x06, 0x0b, 0x0c, 0x0c,
+ 0x14, 0x14, 0x16, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0a, 0x0d, 0x0d, 0x0a,
+ 0x0e, 0x0e, 0x0e, 0x13, 0x13, 0x15, 0x1b, 0x1d, 0x1c, 0x1f, 0x21, 0x1e,
+ 0x1f, 0x21, 0x1f, 0x1d, 0x1d, 0x1d, 0x21, 0x21, 0x21, 0x25, 0x25, 0x25,
+ 0x22, 0x22, 0x22, 0x23, 0x23, 0x23, 0x28, 0x28, 0x26, 0x30, 0x32, 0x2f,
+ 0x2a, 0x2b, 0x2b, 0x18, 0x1a, 0x19, 0x09, 0x0b, 0x09, 0x09, 0x0b, 0x0a,
+ 0x14, 0x16, 0x15, 0x10, 0x12, 0x11, 0x0e, 0x10, 0x0f, 0x0d, 0x0f, 0x0e,
+ 0x0d, 0x0b, 0x0c, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x06, 0x08, 0x08,
+ 0x0c, 0x0d, 0x0d, 0x3c, 0x3b, 0x3a, 0x66, 0x65, 0x63, 0x3c, 0x38, 0x35,
+ 0x35, 0x27, 0x25, 0x29, 0x20, 0x16, 0xb9, 0xb6, 0xa3, 0xff, 0xff, 0xf4,
+ 0xfc, 0xfb, 0xeb, 0xf9, 0xf7, 0xeb, 0xfa, 0xf8, 0xec, 0xf7, 0xf5, 0xe6,
+ 0xf4, 0xef, 0xde, 0xf0, 0xec, 0xd8, 0xf4, 0xef, 0xda, 0xfb, 0xf6, 0xe1,
+ 0xf0, 0xeb, 0xd5, 0xe6, 0xe2, 0xc8, 0xe5, 0xe2, 0xc2, 0xed, 0xea, 0xc5,
+ 0xe2, 0xdb, 0xbf, 0xe1, 0xdb, 0xc1, 0xe1, 0xdb, 0xc3, 0xdf, 0xd9, 0xbf,
+ 0xf1, 0xed, 0xd0, 0xf3, 0xef, 0xd1, 0xf1, 0xed, 0xd2, 0xf1, 0xeb, 0xd5,
+ 0xec, 0xe5, 0xc9, 0xee, 0xe9, 0xcc, 0xf0, 0xec, 0xd0, 0xbd, 0xba, 0xa9,
+ 0x89, 0x89, 0x83, 0x8a, 0x8c, 0x8d, 0x83, 0x87, 0x8a, 0x7d, 0x83, 0x83,
+ 0x70, 0x72, 0x75, 0x46, 0x47, 0x4b, 0x20, 0x20, 0x22, 0x0b, 0x0b, 0x0d,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x07, 0x17, 0x16, 0x14,
+ 0x2e, 0x27, 0x22, 0x39, 0x2f, 0x2d, 0x38, 0x2c, 0x2c, 0x3a, 0x2f, 0x2d,
+ 0x37, 0x2c, 0x2a, 0x39, 0x2e, 0x2d, 0x34, 0x29, 0x2d, 0x24, 0x19, 0x21,
+ 0x1b, 0x14, 0x18, 0x1f, 0x19, 0x1d, 0x26, 0x20, 0x24, 0x32, 0x2e, 0x2f,
+ 0x34, 0x30, 0x2f, 0x36, 0x33, 0x2f, 0x3a, 0x39, 0x37, 0x3a, 0x38, 0x3a,
+ 0x36, 0x32, 0x31, 0x35, 0x31, 0x34, 0x39, 0x35, 0x3a, 0x49, 0x44, 0x4a,
+ 0x56, 0x54, 0x57, 0x60, 0x5e, 0x61, 0x5c, 0x5b, 0x61, 0x46, 0x45, 0x4c,
+ 0x34, 0x34, 0x37, 0x43, 0x43, 0x3b, 0x94, 0x91, 0x7b, 0xc3, 0xbf, 0xa1,
+ 0xc4, 0xbf, 0xa2, 0xad, 0xa9, 0x90, 0x77, 0x72, 0x5f, 0x70, 0x6c, 0x5b,
+ 0xb3, 0xaf, 0x97, 0xcf, 0xcc, 0xb6, 0xce, 0xcd, 0xb9, 0x87, 0x88, 0x74,
+ 0xb0, 0xb2, 0x9d, 0xd3, 0xd4, 0xc3, 0xd2, 0xd2, 0xc7, 0xbd, 0xbd, 0xb5,
+ 0x90, 0x91, 0x87, 0x8e, 0x8f, 0x81, 0x86, 0x89, 0x77, 0xab, 0xae, 0x9e,
+ 0xcd, 0xce, 0xc6, 0xc9, 0xc9, 0xc4, 0xa9, 0xaa, 0xa1, 0x96, 0x98, 0x8b,
+ 0x9e, 0x9f, 0x97, 0x8b, 0x8c, 0x84, 0xad, 0xac, 0xa7, 0xc5, 0xc6, 0xbc,
+ 0x94, 0x96, 0x89, 0xc2, 0xc4, 0xb6, 0xce, 0xd1, 0xc3, 0xca, 0xcd, 0xc2,
+ 0xc4, 0xc5, 0xbe, 0xbd, 0xbf, 0xbd, 0xc0, 0xc3, 0xca, 0xa2, 0xa4, 0xb2,
+ 0x69, 0x6b, 0x7a, 0x4b, 0x49, 0x57, 0x3b, 0x36, 0x42, 0x39, 0x31, 0x39,
+ 0x3d, 0x31, 0x38, 0x40, 0x34, 0x38, 0x43, 0x37, 0x3a, 0x42, 0x34, 0x36,
+ 0x46, 0x37, 0x38, 0x49, 0x3d, 0x3f, 0x48, 0x3d, 0x41, 0x46, 0x3c, 0x42,
+ 0x40, 0x34, 0x3b, 0x39, 0x2e, 0x36, 0x37, 0x2d, 0x35, 0x2c, 0x22, 0x2a,
+ 0x20, 0x18, 0x1f, 0x18, 0x12, 0x19, 0x17, 0x13, 0x19, 0x18, 0x13, 0x17,
+ 0x12, 0x12, 0x14, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11,
+ 0x0e, 0x0e, 0x0f, 0x10, 0x12, 0x11, 0x14, 0x15, 0x17, 0x12, 0x12, 0x14,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x2a, 0x2c, 0x2c, 0x35, 0x39, 0x3b,
+ 0x35, 0x3a, 0x3d, 0x35, 0x3c, 0x40, 0x34, 0x3b, 0x42, 0x32, 0x39, 0x41,
+ 0x20, 0x25, 0x2b, 0x0c, 0x0f, 0x14, 0x0b, 0x0d, 0x10, 0x0c, 0x0c, 0x0c,
+ 0x10, 0x10, 0x0f, 0x10, 0x10, 0x10, 0x19, 0x1b, 0x1a, 0x1f, 0x22, 0x23,
+ 0x1e, 0x1e, 0x20, 0x1c, 0x1b, 0x20, 0x16, 0x16, 0x1b, 0x13, 0x14, 0x18,
+ 0x10, 0x14, 0x16, 0x11, 0x15, 0x16, 0x19, 0x1b, 0x1a, 0x24, 0x26, 0x23,
+ 0x23, 0x25, 0x26, 0x19, 0x1d, 0x21, 0x14, 0x18, 0x1b, 0x15, 0x1a, 0x1e,
+ 0x18, 0x1e, 0x22, 0x1c, 0x20, 0x24, 0x1c, 0x20, 0x23, 0x1d, 0x21, 0x24,
+ 0x1f, 0x23, 0x26, 0x21, 0x25, 0x28, 0x23, 0x27, 0x2a, 0x26, 0x2b, 0x2d,
+ 0x24, 0x2c, 0x2e, 0x28, 0x32, 0x33, 0x2b, 0x36, 0x38, 0x2b, 0x37, 0x39,
+ 0x2b, 0x39, 0x3c, 0x2f, 0x3d, 0x40, 0x32, 0x3d, 0x43, 0x33, 0x3c, 0x43,
+ 0x38, 0x40, 0x47, 0x38, 0x41, 0x48, 0x37, 0x40, 0x47, 0x37, 0x42, 0x48,
+ 0x3b, 0x42, 0x48, 0x3e, 0x45, 0x4b, 0x3f, 0x46, 0x4e, 0x3f, 0x46, 0x4e,
+ 0x41, 0x49, 0x50, 0x3f, 0x48, 0x4f, 0x3c, 0x45, 0x4a, 0x40, 0x4b, 0x4f,
+ 0x49, 0x56, 0x5c, 0x40, 0x4f, 0x56, 0x3f, 0x4d, 0x56, 0x45, 0x53, 0x5c,
+ 0x4c, 0x5a, 0x63, 0x56, 0x63, 0x69, 0x60, 0x6b, 0x6f, 0x72, 0x7d, 0x7e,
+ 0x7e, 0x8a, 0x8d, 0x84, 0x91, 0x97, 0x8b, 0x98, 0x9e, 0x8c, 0x99, 0xa1,
+ 0x8a, 0x97, 0x9f, 0x89, 0x95, 0x9e, 0x86, 0x90, 0x9a, 0x82, 0x8d, 0x96,
+ 0x7c, 0x89, 0x91, 0x78, 0x82, 0x87, 0x74, 0x7b, 0x7e, 0x6a, 0x72, 0x75,
+ 0x5f, 0x68, 0x6f, 0x52, 0x5b, 0x68, 0x2f, 0x36, 0x46, 0x2f, 0x36, 0x45,
+ 0x52, 0x5b, 0x57, 0xc0, 0xca, 0xca, 0xc9, 0xd4, 0xda, 0xc2, 0xce, 0xd9,
+ 0xbe, 0xcb, 0xd7, 0xbc, 0xc9, 0xd4, 0xbb, 0xc7, 0xd3, 0xba, 0xc6, 0xd4,
+ 0xbb, 0xc6, 0xd5, 0xbb, 0xc7, 0xd5, 0xbb, 0xc7, 0xd5, 0xbb, 0xc7, 0xd5,
+ 0xbb, 0xc8, 0xd7, 0xbc, 0xc9, 0xd9, 0xbd, 0xc9, 0xd9, 0xbd, 0xca, 0xda,
+ 0xbb, 0xcb, 0xda, 0xbe, 0xcc, 0xdc, 0xc0, 0xcc, 0xdc, 0xbf, 0xcc, 0xdb,
+ 0xbd, 0xcd, 0xda, 0xbd, 0xcf, 0xda, 0xbc, 0xce, 0xda, 0xbe, 0xce, 0xdb,
+ 0xbe, 0xcd, 0xe0, 0xb6, 0xc0, 0xd1, 0xa8, 0xa8, 0xb8, 0x99, 0x97, 0xa4,
+ 0x92, 0x91, 0x98, 0x93, 0x93, 0x97, 0x98, 0x98, 0x9a, 0x9b, 0x9b, 0x9b,
+ 0x1b, 0x1d, 0x1a, 0x1c, 0x1e, 0x1b, 0x17, 0x19, 0x16, 0x16, 0x18, 0x15,
+ 0x19, 0x19, 0x17, 0x1c, 0x1c, 0x1a, 0x1f, 0x1f, 0x1d, 0x19, 0x19, 0x17,
+ 0x0d, 0x0d, 0x0b, 0x09, 0x09, 0x08, 0x0c, 0x0c, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x0b, 0x0b, 0x0b,
+ 0x22, 0x23, 0x21, 0x26, 0x27, 0x22, 0x16, 0x17, 0x11, 0x10, 0x11, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x10, 0x14, 0x15, 0x15, 0x1b, 0x1b, 0x19,
+ 0x1e, 0x20, 0x1f, 0x20, 0x22, 0x21, 0x22, 0x22, 0x22, 0x24, 0x24, 0x24,
+ 0x23, 0x23, 0x23, 0x21, 0x21, 0x21, 0x21, 0x23, 0x20, 0x24, 0x26, 0x23,
+ 0x2c, 0x2e, 0x2b, 0x2a, 0x2c, 0x29, 0x1c, 0x1e, 0x1b, 0x0b, 0x0d, 0x0a,
+ 0x0d, 0x0f, 0x0d, 0x0f, 0x11, 0x10, 0x11, 0x13, 0x12, 0x0f, 0x11, 0x10,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x08, 0x0a, 0x09, 0x09, 0x0b, 0x0a,
+ 0x0f, 0x0f, 0x0f, 0x2f, 0x2d, 0x2c, 0x40, 0x3d, 0x39, 0x24, 0x1e, 0x1c,
+ 0x30, 0x27, 0x22, 0x25, 0x1e, 0x12, 0x73, 0x6d, 0x5a, 0xfe, 0xfc, 0xea,
+ 0xff, 0xff, 0xf1, 0xfa, 0xf7, 0xee, 0xfb, 0xf8, 0xef, 0xf7, 0xf7, 0xec,
+ 0xf4, 0xf2, 0xdc, 0xee, 0xec, 0xd3, 0xf1, 0xef, 0xd6, 0xf5, 0xf0, 0xda,
+ 0xf5, 0xf0, 0xdc, 0xf2, 0xed, 0xd9, 0xec, 0xe7, 0xd1, 0xf0, 0xec, 0xd2,
+ 0xef, 0xeb, 0xd2, 0xde, 0xda, 0xc1, 0xdb, 0xd6, 0xbf, 0xe7, 0xe1, 0xc9,
+ 0xe3, 0xde, 0xc1, 0xea, 0xe5, 0xc8, 0xf1, 0xeb, 0xd1, 0xeb, 0xe5, 0xcd,
+ 0xf1, 0xec, 0xd0, 0xf2, 0xee, 0xd2, 0xc9, 0xc9, 0xb3, 0x8e, 0x8f, 0x85,
+ 0x88, 0x89, 0x89, 0x85, 0x89, 0x8e, 0x81, 0x83, 0x8a, 0x78, 0x7a, 0x7f,
+ 0x68, 0x6c, 0x6f, 0x50, 0x51, 0x55, 0x1e, 0x1f, 0x21, 0x08, 0x08, 0x09,
+ 0x0a, 0x09, 0x0a, 0x0b, 0x08, 0x09, 0x18, 0x14, 0x13, 0x34, 0x2f, 0x2e,
+ 0x3a, 0x2f, 0x27, 0x32, 0x26, 0x22, 0x3e, 0x32, 0x33, 0x4c, 0x42, 0x41,
+ 0x34, 0x2a, 0x29, 0x28, 0x1e, 0x1d, 0x29, 0x1d, 0x21, 0x30, 0x23, 0x2a,
+ 0x3c, 0x34, 0x31, 0x4f, 0x47, 0x44, 0x5b, 0x56, 0x52, 0x71, 0x6c, 0x67,
+ 0x72, 0x6e, 0x67, 0x7c, 0x79, 0x6f, 0x74, 0x71, 0x6a, 0x71, 0x6e, 0x6b,
+ 0x73, 0x6f, 0x6e, 0x67, 0x62, 0x63, 0x4f, 0x49, 0x4d, 0x41, 0x3c, 0x3f,
+ 0x36, 0x32, 0x33, 0x50, 0x4c, 0x4d, 0x8a, 0x88, 0x8b, 0x63, 0x60, 0x68,
+ 0x30, 0x2d, 0x40, 0x26, 0x24, 0x2f, 0x38, 0x35, 0x2e, 0x8d, 0x89, 0x71,
+ 0xa0, 0x9d, 0x79, 0x67, 0x64, 0x42, 0x94, 0x92, 0x7b, 0xad, 0xab, 0x9c,
+ 0x7a, 0x79, 0x5c, 0xa3, 0xa2, 0x87, 0xd5, 0xd4, 0xbe, 0xb3, 0xb2, 0x9e,
+ 0xaf, 0xb0, 0x9e, 0xd3, 0xd4, 0xc6, 0xca, 0xc9, 0xc2, 0x73, 0x72, 0x6d,
+ 0x97, 0x98, 0x8b, 0xc9, 0xc9, 0xbd, 0xa3, 0xa5, 0x9a, 0x73, 0x75, 0x6a,
+ 0xc4, 0xc6, 0xb8, 0xcc, 0xce, 0xc0, 0xce, 0xd0, 0xc3, 0xc7, 0xc9, 0xbf,
+ 0xbf, 0xc1, 0xb6, 0xba, 0xbb, 0xb3, 0xcb, 0xcb, 0xc5, 0xc9, 0xca, 0xc2,
+ 0x80, 0x83, 0x76, 0x94, 0x96, 0x88, 0xd1, 0xd3, 0xc4, 0xcd, 0xcf, 0xc0,
+ 0xc3, 0xc9, 0xbc, 0xc4, 0xc6, 0xc2, 0xb4, 0xb1, 0xb8, 0x75, 0x6e, 0x80,
+ 0x4d, 0x42, 0x55, 0x49, 0x3a, 0x4b, 0x49, 0x3a, 0x42, 0x46, 0x38, 0x38,
+ 0x44, 0x33, 0x3a, 0x44, 0x33, 0x39, 0x45, 0x33, 0x37, 0x44, 0x31, 0x35,
+ 0x48, 0x36, 0x3a, 0x4b, 0x3a, 0x40, 0x52, 0x41, 0x49, 0x54, 0x45, 0x4c,
+ 0x5a, 0x4d, 0x56, 0x65, 0x59, 0x63, 0x4d, 0x41, 0x4c, 0x46, 0x3b, 0x47,
+ 0x3d, 0x32, 0x40, 0x2d, 0x26, 0x33, 0x23, 0x1b, 0x28, 0x1c, 0x15, 0x21,
+ 0x13, 0x10, 0x12, 0x12, 0x11, 0x12, 0x12, 0x12, 0x12, 0x10, 0x10, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x12, 0x10, 0x18, 0x1a, 0x1b, 0x14, 0x15, 0x17,
+ 0x0f, 0x10, 0x0e, 0x15, 0x17, 0x15, 0x30, 0x34, 0x35, 0x33, 0x38, 0x3b,
+ 0x35, 0x3c, 0x3f, 0x34, 0x3b, 0x41, 0x32, 0x39, 0x42, 0x2c, 0x33, 0x3d,
+ 0x18, 0x1b, 0x23, 0x0a, 0x0d, 0x12, 0x0d, 0x0e, 0x12, 0x0e, 0x0e, 0x10,
+ 0x12, 0x12, 0x12, 0x0f, 0x0f, 0x0f, 0x19, 0x1b, 0x1a, 0x1d, 0x1e, 0x1f,
+ 0x19, 0x1b, 0x1a, 0x12, 0x13, 0x15, 0x12, 0x13, 0x15, 0x12, 0x16, 0x17,
+ 0x14, 0x18, 0x1a, 0x18, 0x1c, 0x1d, 0x1e, 0x21, 0x20, 0x23, 0x26, 0x24,
+ 0x1a, 0x1c, 0x1b, 0x16, 0x17, 0x19, 0x16, 0x19, 0x1b, 0x18, 0x1c, 0x1f,
+ 0x1b, 0x1f, 0x23, 0x1c, 0x1f, 0x24, 0x1b, 0x1e, 0x23, 0x1e, 0x22, 0x25,
+ 0x1f, 0x22, 0x27, 0x20, 0x23, 0x27, 0x23, 0x27, 0x2a, 0x26, 0x2a, 0x2d,
+ 0x26, 0x2b, 0x2e, 0x28, 0x30, 0x32, 0x2b, 0x35, 0x36, 0x2d, 0x38, 0x3a,
+ 0x2e, 0x39, 0x3d, 0x2f, 0x3a, 0x3e, 0x34, 0x3e, 0x44, 0x35, 0x3d, 0x45,
+ 0x36, 0x3f, 0x46, 0x37, 0x42, 0x48, 0x34, 0x3f, 0x45, 0x36, 0x41, 0x46,
+ 0x38, 0x42, 0x45, 0x3c, 0x44, 0x49, 0x3e, 0x46, 0x4c, 0x40, 0x47, 0x4d,
+ 0x40, 0x47, 0x4d, 0x3c, 0x45, 0x4a, 0x3f, 0x48, 0x4c, 0x45, 0x50, 0x52,
+ 0x3f, 0x4c, 0x51, 0x3e, 0x4c, 0x52, 0x40, 0x4f, 0x56, 0x43, 0x51, 0x5a,
+ 0x4c, 0x5b, 0x62, 0x58, 0x65, 0x6b, 0x63, 0x6e, 0x72, 0x72, 0x7d, 0x7f,
+ 0x7d, 0x88, 0x8e, 0x81, 0x8c, 0x92, 0x83, 0x8f, 0x97, 0x86, 0x93, 0x9b,
+ 0x83, 0x90, 0x98, 0x84, 0x8e, 0x97, 0x83, 0x8d, 0x96, 0x7c, 0x86, 0x8c,
+ 0x7a, 0x83, 0x86, 0x76, 0x7d, 0x7f, 0x6f, 0x74, 0x78, 0x62, 0x69, 0x6f,
+ 0x5e, 0x67, 0x70, 0x4f, 0x58, 0x61, 0x34, 0x39, 0x40, 0x3d, 0x41, 0x44,
+ 0x7e, 0x89, 0x85, 0xcd, 0xd9, 0xda, 0xc6, 0xd1, 0xd9, 0xbf, 0xcc, 0xd5,
+ 0xbd, 0xc9, 0xd5, 0xbc, 0xc7, 0xd4, 0xbc, 0xc6, 0xd2, 0xba, 0xc4, 0xd2,
+ 0xba, 0xc6, 0xd4, 0xbb, 0xc7, 0xd5, 0xba, 0xc6, 0xd4, 0xbb, 0xc7, 0xd5,
+ 0xba, 0xc6, 0xd6, 0xba, 0xc7, 0xd7, 0xbc, 0xc9, 0xd9, 0xbc, 0xc9, 0xd9,
+ 0xbb, 0xca, 0xd9, 0xbe, 0xcb, 0xdb, 0xc0, 0xcc, 0xdc, 0xbf, 0xcc, 0xdc,
+ 0xbd, 0xcd, 0xda, 0xbc, 0xcd, 0xd9, 0xbd, 0xcf, 0xdb, 0xbe, 0xce, 0xdb,
+ 0xbc, 0xca, 0xda, 0xaf, 0xb7, 0xc7, 0x9f, 0xa0, 0xae, 0x94, 0x92, 0x9d,
+ 0x92, 0x91, 0x97, 0x95, 0x95, 0x97, 0x98, 0x98, 0x9a, 0x9c, 0x9c, 0x9e,
+ 0x1e, 0x20, 0x1d, 0x19, 0x1b, 0x18, 0x16, 0x18, 0x15, 0x17, 0x19, 0x16,
+ 0x1a, 0x1a, 0x18, 0x18, 0x18, 0x16, 0x16, 0x16, 0x14, 0x0e, 0x0e, 0x0c,
+ 0x09, 0x09, 0x07, 0x09, 0x09, 0x07, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x0a, 0x0a, 0x0a,
+ 0x23, 0x24, 0x1f, 0x39, 0x3a, 0x34, 0x34, 0x35, 0x2e, 0x19, 0x1a, 0x16,
+ 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x13, 0x12, 0x12, 0x12, 0x0f, 0x0f, 0x0e,
+ 0x13, 0x15, 0x14, 0x1a, 0x1c, 0x1b, 0x26, 0x26, 0x26, 0x29, 0x29, 0x29,
+ 0x28, 0x28, 0x28, 0x25, 0x25, 0x25, 0x20, 0x22, 0x1f, 0x20, 0x22, 0x1f,
+ 0x26, 0x28, 0x23, 0x2b, 0x2d, 0x28, 0x28, 0x29, 0x25, 0x21, 0x23, 0x20,
+ 0x18, 0x1a, 0x18, 0x12, 0x14, 0x13, 0x10, 0x12, 0x11, 0x0e, 0x10, 0x0f,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x08, 0x0a, 0x09, 0x08, 0x08, 0x08,
+ 0x0b, 0x0c, 0x0c, 0x1f, 0x1c, 0x1b, 0x1e, 0x19, 0x16, 0x27, 0x20, 0x1e,
+ 0x29, 0x22, 0x20, 0x2f, 0x27, 0x1e, 0x33, 0x2a, 0x19, 0xbb, 0xb2, 0x9e,
+ 0xff, 0xff, 0xf6, 0xfe, 0xfc, 0xee, 0xfc, 0xfa, 0xea, 0xf2, 0xf1, 0xdf,
+ 0xef, 0xee, 0xd3, 0xea, 0xe9, 0xcc, 0xe7, 0xe6, 0xc8, 0xf1, 0xed, 0xd4,
+ 0xf4, 0xef, 0xda, 0xf1, 0xec, 0xda, 0xed, 0xe9, 0xd5, 0xf2, 0xed, 0xd8,
+ 0xf0, 0xee, 0xd5, 0xe9, 0xe7, 0xce, 0xe5, 0xe1, 0xc8, 0xe3, 0xde, 0xc3,
+ 0xdf, 0xda, 0xbc, 0xe6, 0xe1, 0xc3, 0xf0, 0xea, 0xcf, 0xef, 0xe9, 0xd1,
+ 0xec, 0xe7, 0xd3, 0xc1, 0xbe, 0xad, 0x8f, 0x90, 0x86, 0x84, 0x89, 0x85,
+ 0x83, 0x87, 0x8a, 0x81, 0x84, 0x89, 0x7e, 0x7f, 0x84, 0x72, 0x71, 0x76,
+ 0x58, 0x5d, 0x60, 0x40, 0x44, 0x45, 0x1a, 0x1b, 0x1d, 0x0a, 0x0a, 0x0c,
+ 0x0a, 0x08, 0x09, 0x14, 0x0e, 0x10, 0x23, 0x1d, 0x1d, 0x35, 0x2d, 0x2d,
+ 0x36, 0x27, 0x22, 0x35, 0x28, 0x26, 0x4b, 0x41, 0x42, 0x48, 0x40, 0x40,
+ 0x20, 0x1a, 0x17, 0x24, 0x1c, 0x19, 0x43, 0x39, 0x37, 0x64, 0x5b, 0x58,
+ 0x7b, 0x75, 0x64, 0x7c, 0x76, 0x67, 0x7b, 0x75, 0x65, 0x88, 0x83, 0x70,
+ 0x8d, 0x8b, 0x76, 0x9a, 0x99, 0x84, 0x98, 0x96, 0x83, 0x84, 0x80, 0x72,
+ 0x88, 0x86, 0x7c, 0x94, 0x8f, 0x89, 0x8b, 0x86, 0x84, 0x7e, 0x79, 0x76,
+ 0x64, 0x5e, 0x5c, 0x5a, 0x55, 0x54, 0x73, 0x6f, 0x72, 0x75, 0x73, 0x7b,
+ 0x4e, 0x4d, 0x5f, 0x32, 0x30, 0x3f, 0x26, 0x22, 0x27, 0x30, 0x2d, 0x1f,
+ 0x4a, 0x47, 0x29, 0x95, 0x93, 0x71, 0xcf, 0xcd, 0xb3, 0x9c, 0x9b, 0x88,
+ 0x76, 0x75, 0x59, 0xa8, 0xa7, 0x8e, 0x9d, 0x9c, 0x86, 0xc6, 0xc5, 0xb1,
+ 0xd3, 0xd5, 0xc2, 0xd3, 0xd4, 0xc4, 0xc9, 0xc9, 0xbe, 0x6d, 0x6a, 0x63,
+ 0xaa, 0xac, 0x9a, 0xd7, 0xd6, 0xcc, 0xcd, 0xce, 0xc9, 0x73, 0x75, 0x6c,
+ 0xb2, 0xb5, 0xa3, 0xcc, 0xcf, 0xba, 0xbf, 0xc2, 0xb3, 0xcc, 0xcc, 0xc6,
+ 0xce, 0xd0, 0xc3, 0xc1, 0xc3, 0xb9, 0xad, 0xae, 0xa8, 0xab, 0xad, 0xa6,
+ 0x93, 0x95, 0x8a, 0x65, 0x67, 0x59, 0xb3, 0xb6, 0xa5, 0xd2, 0xd4, 0xc3,
+ 0xcd, 0xce, 0xc5, 0xa1, 0x9e, 0x9d, 0x61, 0x56, 0x5e, 0x4a, 0x3b, 0x4a,
+ 0x54, 0x3f, 0x50, 0x4a, 0x36, 0x43, 0x4e, 0x3b, 0x41, 0x48, 0x38, 0x39,
+ 0x48, 0x35, 0x3d, 0x4d, 0x3a, 0x40, 0x41, 0x2e, 0x34, 0x41, 0x2d, 0x33,
+ 0x3f, 0x2c, 0x32, 0x41, 0x2e, 0x37, 0x48, 0x36, 0x40, 0x48, 0x38, 0x42,
+ 0x6b, 0x63, 0x6d, 0x81, 0x7b, 0x87, 0x55, 0x4f, 0x5b, 0x78, 0x74, 0x82,
+ 0x5c, 0x58, 0x66, 0x48, 0x45, 0x53, 0x3b, 0x39, 0x46, 0x2b, 0x29, 0x35,
+ 0x1f, 0x1a, 0x1f, 0x15, 0x12, 0x15, 0x15, 0x14, 0x15, 0x11, 0x11, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x10, 0x12, 0x11, 0x12, 0x14, 0x14, 0x10, 0x11, 0x12,
+ 0x0d, 0x0e, 0x0c, 0x1d, 0x1f, 0x1e, 0x36, 0x3a, 0x3a, 0x31, 0x37, 0x3b,
+ 0x33, 0x3a, 0x41, 0x33, 0x3a, 0x42, 0x32, 0x39, 0x43, 0x26, 0x2d, 0x36,
+ 0x14, 0x17, 0x1c, 0x10, 0x10, 0x15, 0x10, 0x11, 0x15, 0x10, 0x10, 0x12,
+ 0x11, 0x11, 0x13, 0x0f, 0x10, 0x12, 0x11, 0x13, 0x14, 0x11, 0x12, 0x14,
+ 0x12, 0x14, 0x14, 0x13, 0x15, 0x14, 0x15, 0x18, 0x19, 0x15, 0x19, 0x1a,
+ 0x1a, 0x1e, 0x1f, 0x1f, 0x23, 0x24, 0x23, 0x27, 0x26, 0x20, 0x22, 0x22,
+ 0x14, 0x16, 0x14, 0x18, 0x1a, 0x19, 0x19, 0x1d, 0x1e, 0x1b, 0x1f, 0x21,
+ 0x1b, 0x1f, 0x23, 0x1d, 0x20, 0x25, 0x1e, 0x21, 0x26, 0x20, 0x21, 0x26,
+ 0x1f, 0x22, 0x28, 0x20, 0x23, 0x29, 0x21, 0x24, 0x29, 0x24, 0x28, 0x2b,
+ 0x29, 0x2d, 0x30, 0x2b, 0x30, 0x33, 0x2b, 0x33, 0x35, 0x2f, 0x38, 0x3b,
+ 0x31, 0x3a, 0x3f, 0x32, 0x3b, 0x40, 0x33, 0x3c, 0x43, 0x34, 0x3c, 0x44,
+ 0x35, 0x3e, 0x45, 0x36, 0x41, 0x47, 0x34, 0x3f, 0x45, 0x35, 0x42, 0x45,
+ 0x37, 0x41, 0x43, 0x3a, 0x44, 0x46, 0x3b, 0x44, 0x49, 0x3d, 0x46, 0x4b,
+ 0x3b, 0x44, 0x49, 0x3c, 0x45, 0x4a, 0x42, 0x4c, 0x4e, 0x41, 0x4c, 0x4e,
+ 0x41, 0x4c, 0x52, 0x40, 0x4d, 0x53, 0x43, 0x52, 0x59, 0x48, 0x56, 0x5e,
+ 0x4c, 0x5a, 0x61, 0x56, 0x63, 0x69, 0x65, 0x70, 0x74, 0x73, 0x7d, 0x80,
+ 0x7b, 0x86, 0x8b, 0x80, 0x8b, 0x91, 0x81, 0x8b, 0x94, 0x81, 0x8e, 0x96,
+ 0x81, 0x8c, 0x94, 0x7e, 0x89, 0x8f, 0x7d, 0x87, 0x8e, 0x79, 0x82, 0x88,
+ 0x74, 0x7d, 0x7c, 0x72, 0x78, 0x79, 0x67, 0x6e, 0x74, 0x58, 0x61, 0x6a,
+ 0x5f, 0x69, 0x74, 0x41, 0x4b, 0x52, 0x4d, 0x54, 0x51, 0x7e, 0x81, 0x7a,
+ 0xb5, 0xc2, 0xbf, 0xc9, 0xd6, 0xda, 0xbf, 0xcc, 0xd4, 0xbd, 0xc9, 0xd4,
+ 0xbb, 0xc6, 0xd2, 0xbd, 0xc7, 0xd3, 0xbc, 0xc6, 0xd2, 0xbc, 0xc5, 0xd4,
+ 0xba, 0xc6, 0xd4, 0xba, 0xc6, 0xd4, 0xba, 0xc6, 0xd5, 0xbb, 0xc7, 0xd7,
+ 0xba, 0xc6, 0xd7, 0xba, 0xc7, 0xd7, 0xbc, 0xc9, 0xd9, 0xbd, 0xca, 0xda,
+ 0xbe, 0xcb, 0xdb, 0xbe, 0xca, 0xda, 0xbf, 0xcb, 0xdb, 0xbf, 0xcc, 0xdc,
+ 0xbd, 0xcd, 0xdc, 0xbd, 0xce, 0xdb, 0xbe, 0xce, 0xdb, 0xbf, 0xce, 0xdb,
+ 0xb9, 0xc5, 0xd3, 0xa6, 0xad, 0xbb, 0x98, 0x99, 0xa4, 0x92, 0x90, 0x96,
+ 0x95, 0x94, 0x98, 0x97, 0x97, 0x99, 0x9a, 0x9a, 0x9c, 0x9d, 0x9d, 0xa0,
+ 0x1e, 0x20, 0x1d, 0x1e, 0x20, 0x1d, 0x1a, 0x1d, 0x19, 0x1b, 0x1d, 0x1a,
+ 0x1b, 0x1b, 0x19, 0x15, 0x15, 0x13, 0x13, 0x13, 0x11, 0x10, 0x10, 0x0e,
+ 0x0e, 0x0e, 0x0c, 0x09, 0x09, 0x07, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x07, 0x08, 0x08, 0x0b, 0x15, 0x15, 0x17,
+ 0x26, 0x28, 0x23, 0x34, 0x36, 0x31, 0x37, 0x39, 0x34, 0x1a, 0x1c, 0x19,
+ 0x12, 0x13, 0x15, 0x11, 0x11, 0x14, 0x10, 0x10, 0x10, 0x0f, 0x10, 0x0d,
+ 0x0d, 0x0f, 0x0e, 0x0d, 0x0f, 0x0e, 0x1a, 0x1b, 0x1a, 0x25, 0x25, 0x25,
+ 0x26, 0x26, 0x26, 0x25, 0x25, 0x25, 0x20, 0x22, 0x1f, 0x20, 0x22, 0x1f,
+ 0x23, 0x24, 0x20, 0x26, 0x27, 0x22, 0x26, 0x26, 0x23, 0x2f, 0x2f, 0x2d,
+ 0x2c, 0x2c, 0x2a, 0x23, 0x23, 0x21, 0x18, 0x18, 0x17, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x08, 0x0a, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x19, 0x15, 0x14, 0x1b, 0x16, 0x13, 0x2a, 0x22, 0x20,
+ 0x2c, 0x23, 0x27, 0x30, 0x24, 0x22, 0x30, 0x22, 0x19, 0x46, 0x3b, 0x2a,
+ 0xc6, 0xbf, 0xae, 0xff, 0xff, 0xef, 0xff, 0xfe, 0xe5, 0xf4, 0xf3, 0xd4,
+ 0xf6, 0xf1, 0xdf, 0xee, 0xea, 0xd5, 0xeb, 0xe7, 0xce, 0xed, 0xe9, 0xce,
+ 0xf4, 0xf0, 0xd5, 0xf0, 0xeb, 0xcf, 0xeb, 0xe8, 0xc9, 0xec, 0xe9, 0xc8,
+ 0xf0, 0xef, 0xd3, 0xea, 0xe9, 0xcd, 0xec, 0xe9, 0xcd, 0xf3, 0xee, 0xd1,
+ 0xf2, 0xed, 0xcf, 0xf1, 0xec, 0xcf, 0xf4, 0xef, 0xd6, 0xe5, 0xe1, 0xcb,
+ 0xb3, 0xae, 0xa5, 0x8b, 0x8a, 0x84, 0x86, 0x88, 0x87, 0x85, 0x8a, 0x8d,
+ 0x81, 0x86, 0x8a, 0x7d, 0x80, 0x83, 0x73, 0x74, 0x76, 0x64, 0x64, 0x64,
+ 0x4a, 0x4e, 0x51, 0x2e, 0x32, 0x34, 0x15, 0x17, 0x18, 0x08, 0x08, 0x08,
+ 0x18, 0x14, 0x14, 0x27, 0x1f, 0x1f, 0x2f, 0x26, 0x25, 0x33, 0x29, 0x28,
+ 0x3a, 0x2c, 0x2c, 0x3d, 0x31, 0x33, 0x3e, 0x35, 0x36, 0x27, 0x22, 0x20,
+ 0x29, 0x26, 0x1d, 0x4c, 0x4a, 0x3d, 0x72, 0x6e, 0x62, 0x8b, 0x85, 0x78,
+ 0x8c, 0x87, 0x72, 0x88, 0x84, 0x70, 0x89, 0x84, 0x70, 0x83, 0x7e, 0x6a,
+ 0x7e, 0x7c, 0x65, 0x83, 0x81, 0x6a, 0x8a, 0x87, 0x73, 0x85, 0x82, 0x71,
+ 0x83, 0x82, 0x6f, 0x8f, 0x8e, 0x7e, 0x95, 0x91, 0x87, 0x95, 0x91, 0x88,
+ 0x93, 0x8f, 0x88, 0x85, 0x7f, 0x7d, 0x65, 0x60, 0x64, 0x60, 0x5c, 0x62,
+ 0x78, 0x79, 0x7d, 0x54, 0x53, 0x5b, 0x26, 0x20, 0x2a, 0x29, 0x22, 0x23,
+ 0x28, 0x23, 0x13, 0x7e, 0x7a, 0x5f, 0x92, 0x91, 0x74, 0x71, 0x71, 0x59,
+ 0xb5, 0xb3, 0x9d, 0xc3, 0xc0, 0xad, 0x98, 0x96, 0x85, 0xc6, 0xc5, 0xb3,
+ 0xcd, 0xce, 0xba, 0xd3, 0xd3, 0xbf, 0xd8, 0xd7, 0xc5, 0xb0, 0xae, 0x9f,
+ 0xb5, 0xb6, 0xa2, 0xd2, 0xd2, 0xc8, 0xd4, 0xd3, 0xcf, 0x7e, 0x80, 0x77,
+ 0xa2, 0xa5, 0x92, 0xa8, 0xac, 0x94, 0x9d, 0x9f, 0x8f, 0xd0, 0xcf, 0xc9,
+ 0xcd, 0xcf, 0xc1, 0xc5, 0xc7, 0xbc, 0xba, 0xbd, 0xb4, 0xab, 0xae, 0xa5,
+ 0x96, 0x99, 0x8e, 0x76, 0x77, 0x6b, 0x9c, 0x9d, 0x90, 0xd2, 0xcf, 0xc7,
+ 0x95, 0x8d, 0x94, 0x53, 0x46, 0x4f, 0x4c, 0x3b, 0x42, 0x57, 0x41, 0x4b,
+ 0x57, 0x40, 0x4a, 0x4d, 0x3a, 0x40, 0x4c, 0x3b, 0x41, 0x3e, 0x32, 0x36,
+ 0x3a, 0x2b, 0x30, 0x3f, 0x30, 0x35, 0x3b, 0x2c, 0x31, 0x44, 0x35, 0x3c,
+ 0x4a, 0x3b, 0x42, 0x4a, 0x3a, 0x44, 0x52, 0x43, 0x4d, 0x48, 0x3b, 0x46,
+ 0x4b, 0x44, 0x50, 0x4e, 0x48, 0x56, 0x53, 0x4d, 0x5b, 0x7d, 0x78, 0x87,
+ 0x7b, 0x76, 0x85, 0x80, 0x7d, 0x8b, 0x68, 0x66, 0x74, 0x3e, 0x3b, 0x48,
+ 0x36, 0x31, 0x39, 0x2c, 0x28, 0x2e, 0x20, 0x1d, 0x23, 0x16, 0x13, 0x17,
+ 0x12, 0x12, 0x12, 0x11, 0x13, 0x12, 0x0e, 0x10, 0x10, 0x0c, 0x0e, 0x0d,
+ 0x0d, 0x10, 0x0c, 0x26, 0x2a, 0x29, 0x35, 0x38, 0x3b, 0x30, 0x35, 0x3c,
+ 0x32, 0x38, 0x43, 0x33, 0x3a, 0x44, 0x32, 0x39, 0x43, 0x22, 0x29, 0x31,
+ 0x14, 0x15, 0x1a, 0x13, 0x14, 0x18, 0x14, 0x15, 0x19, 0x14, 0x15, 0x17,
+ 0x11, 0x12, 0x14, 0x11, 0x12, 0x14, 0x11, 0x12, 0x15, 0x10, 0x13, 0x15,
+ 0x14, 0x18, 0x17, 0x18, 0x1b, 0x1b, 0x19, 0x1d, 0x1d, 0x1b, 0x21, 0x21,
+ 0x1f, 0x25, 0x25, 0x26, 0x2b, 0x2b, 0x27, 0x2b, 0x2c, 0x19, 0x1d, 0x1c,
+ 0x17, 0x19, 0x16, 0x19, 0x1b, 0x1a, 0x1a, 0x1e, 0x1f, 0x1a, 0x1e, 0x21,
+ 0x19, 0x1d, 0x20, 0x1c, 0x1f, 0x24, 0x20, 0x23, 0x28, 0x1f, 0x21, 0x25,
+ 0x1f, 0x22, 0x29, 0x21, 0x24, 0x2b, 0x24, 0x27, 0x2c, 0x26, 0x29, 0x2e,
+ 0x28, 0x2c, 0x2f, 0x2c, 0x32, 0x35, 0x2e, 0x36, 0x39, 0x2f, 0x37, 0x3a,
+ 0x31, 0x3a, 0x3f, 0x32, 0x3b, 0x42, 0x33, 0x3c, 0x43, 0x35, 0x3e, 0x45,
+ 0x33, 0x3c, 0x43, 0x32, 0x3d, 0x43, 0x34, 0x3f, 0x43, 0x34, 0x3f, 0x43,
+ 0x37, 0x42, 0x45, 0x39, 0x43, 0x45, 0x3b, 0x44, 0x49, 0x3c, 0x43, 0x4a,
+ 0x3d, 0x44, 0x4a, 0x3b, 0x44, 0x49, 0x40, 0x4a, 0x4c, 0x41, 0x4b, 0x4d,
+ 0x42, 0x4d, 0x51, 0x43, 0x4e, 0x54, 0x46, 0x53, 0x59, 0x48, 0x55, 0x5c,
+ 0x4f, 0x5c, 0x62, 0x59, 0x64, 0x6a, 0x68, 0x71, 0x76, 0x73, 0x7d, 0x80,
+ 0x79, 0x83, 0x89, 0x7d, 0x88, 0x8e, 0x7f, 0x8a, 0x90, 0x7e, 0x89, 0x91,
+ 0x7d, 0x87, 0x8f, 0x78, 0x82, 0x89, 0x74, 0x7d, 0x84, 0x73, 0x7c, 0x81,
+ 0x6f, 0x78, 0x7a, 0x67, 0x6f, 0x73, 0x5e, 0x67, 0x6e, 0x54, 0x5e, 0x69,
+ 0x55, 0x61, 0x6d, 0x36, 0x43, 0x49, 0x50, 0x5a, 0x56, 0xac, 0xb4, 0xa9,
+ 0xd0, 0xde, 0xde, 0xc3, 0xd1, 0xd7, 0xbe, 0xcb, 0xd5, 0xbb, 0xc7, 0xd3,
+ 0xba, 0xc4, 0xd0, 0xbc, 0xc6, 0xd2, 0xbd, 0xc6, 0xd5, 0xbc, 0xc6, 0xd6,
+ 0xb9, 0xc5, 0xd3, 0xb9, 0xc5, 0xd4, 0xbb, 0xc6, 0xd7, 0xbb, 0xc7, 0xd7,
+ 0xbb, 0xc8, 0xd8, 0xbd, 0xca, 0xda, 0xbc, 0xc9, 0xd9, 0xbc, 0xc9, 0xd9,
+ 0xbd, 0xca, 0xda, 0xbe, 0xca, 0xda, 0xc0, 0xcb, 0xdc, 0xbe, 0xcb, 0xdb,
+ 0xbd, 0xcd, 0xdc, 0xbd, 0xcf, 0xdd, 0xc0, 0xce, 0xdd, 0xbf, 0xca, 0xd8,
+ 0xb1, 0xb9, 0xc6, 0x9e, 0xa2, 0xaf, 0x93, 0x94, 0x9b, 0x92, 0x91, 0x95,
+ 0x95, 0x95, 0x97, 0x98, 0x9a, 0x9a, 0x9b, 0x9c, 0x9e, 0xa1, 0xa1, 0xa3,
+ 0x18, 0x1a, 0x17, 0x1b, 0x1d, 0x1a, 0x1b, 0x1d, 0x1a, 0x1d, 0x1f, 0x1c,
+ 0x1f, 0x1f, 0x1d, 0x19, 0x19, 0x17, 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x17,
+ 0x15, 0x15, 0x13, 0x0e, 0x0e, 0x0c, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x05, 0x07, 0x06,
+ 0x04, 0x06, 0x07, 0x0c, 0x0e, 0x0f, 0x24, 0x25, 0x27, 0x2a, 0x2c, 0x2e,
+ 0x36, 0x3b, 0x38, 0x41, 0x46, 0x42, 0x2e, 0x33, 0x2f, 0x14, 0x19, 0x17,
+ 0x19, 0x1a, 0x1f, 0x17, 0x18, 0x1c, 0x10, 0x12, 0x11, 0x11, 0x13, 0x10,
+ 0x0f, 0x11, 0x10, 0x0c, 0x0e, 0x0d, 0x0f, 0x10, 0x0f, 0x18, 0x18, 0x18,
+ 0x21, 0x21, 0x21, 0x23, 0x23, 0x23, 0x24, 0x27, 0x24, 0x23, 0x25, 0x22,
+ 0x23, 0x23, 0x21, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x1f, 0x28, 0x28, 0x27,
+ 0x2d, 0x2d, 0x2b, 0x2f, 0x2f, 0x2d, 0x26, 0x26, 0x24, 0x16, 0x16, 0x14,
+ 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x09, 0x0b, 0x0a, 0x06, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x14, 0x12, 0x12, 0x17, 0x13, 0x12, 0x24, 0x1f, 0x1f,
+ 0x29, 0x21, 0x27, 0x2f, 0x21, 0x24, 0x35, 0x26, 0x22, 0x30, 0x24, 0x1e,
+ 0x54, 0x4f, 0x45, 0xb4, 0xb3, 0xa5, 0xeb, 0xe9, 0xd2, 0xff, 0xfd, 0xe1,
+ 0xff, 0xfd, 0xe9, 0xfb, 0xf6, 0xdf, 0xf7, 0xf3, 0xd8, 0xf0, 0xec, 0xcf,
+ 0xf4, 0xf0, 0xd3, 0xf3, 0xed, 0xd3, 0xf0, 0xeb, 0xcf, 0xec, 0xe7, 0xca,
+ 0xf2, 0xee, 0xd1, 0xe9, 0xe5, 0xc9, 0xf5, 0xef, 0xd5, 0xf9, 0xf3, 0xd9,
+ 0xf8, 0xf2, 0xd8, 0xea, 0xe5, 0xce, 0xc8, 0xc5, 0xb4, 0x9d, 0x9c, 0x8f,
+ 0x8a, 0x8a, 0x87, 0x89, 0x8b, 0x8d, 0x84, 0x87, 0x8e, 0x82, 0x85, 0x8c,
+ 0x7d, 0x81, 0x84, 0x74, 0x77, 0x77, 0x65, 0x67, 0x64, 0x55, 0x55, 0x56,
+ 0x37, 0x3c, 0x3f, 0x22, 0x26, 0x27, 0x15, 0x17, 0x18, 0x0d, 0x0b, 0x09,
+ 0x21, 0x1b, 0x19, 0x2d, 0x25, 0x22, 0x44, 0x3b, 0x36, 0x57, 0x4c, 0x48,
+ 0x49, 0x3d, 0x40, 0x47, 0x3b, 0x40, 0x39, 0x30, 0x2f, 0x2b, 0x26, 0x1e,
+ 0x57, 0x54, 0x45, 0x78, 0x75, 0x62, 0x8b, 0x89, 0x75, 0x8c, 0x89, 0x76,
+ 0x7d, 0x7a, 0x69, 0x89, 0x86, 0x77, 0x94, 0x90, 0x83, 0x86, 0x83, 0x76,
+ 0x8e, 0x8a, 0x7b, 0x8b, 0x88, 0x78, 0x80, 0x7c, 0x71, 0x7e, 0x7c, 0x71,
+ 0x86, 0x88, 0x73, 0x90, 0x8e, 0x7d, 0x95, 0x93, 0x86, 0x9d, 0x9b, 0x8f,
+ 0x9e, 0x9b, 0x92, 0xa2, 0x9f, 0x9a, 0x98, 0x93, 0x95, 0x68, 0x66, 0x6a,
+ 0x65, 0x66, 0x61, 0x5f, 0x5e, 0x5e, 0x33, 0x2e, 0x36, 0x34, 0x29, 0x32,
+ 0x2c, 0x24, 0x22, 0x30, 0x2a, 0x1c, 0x77, 0x75, 0x5b, 0xbc, 0xbd, 0x9d,
+ 0xd2, 0xcf, 0xbb, 0xd3, 0xcf, 0xc1, 0xce, 0xcc, 0xbf, 0xa0, 0x9e, 0x8e,
+ 0x90, 0x8f, 0x7b, 0x97, 0x96, 0x81, 0xbf, 0xbe, 0xa9, 0xd6, 0xd5, 0xc1,
+ 0xd0, 0xcf, 0xbb, 0xcc, 0xcc, 0xc0, 0xd0, 0xcf, 0xca, 0x7e, 0x7f, 0x77,
+ 0x78, 0x7a, 0x6a, 0xa2, 0xa5, 0x90, 0xc0, 0xc0, 0xb3, 0xa5, 0xa4, 0x9e,
+ 0xc5, 0xc7, 0xba, 0xcc, 0xce, 0xc1, 0xcc, 0xcf, 0xc4, 0xcd, 0xd0, 0xc6,
+ 0xcb, 0xcd, 0xc2, 0xc7, 0xc7, 0xbf, 0xc7, 0xc4, 0xc1, 0x8a, 0x83, 0x84,
+ 0x4f, 0x40, 0x4d, 0x53, 0x41, 0x4d, 0x55, 0x40, 0x47, 0x51, 0x3b, 0x3e,
+ 0x57, 0x43, 0x44, 0x4c, 0x3c, 0x3d, 0x3b, 0x2f, 0x31, 0x38, 0x2f, 0x31,
+ 0x4e, 0x45, 0x43, 0x68, 0x60, 0x5e, 0x7a, 0x71, 0x72, 0x89, 0x80, 0x82,
+ 0x94, 0x8b, 0x8e, 0x90, 0x87, 0x8b, 0x9d, 0x94, 0x99, 0x8f, 0x85, 0x8d,
+ 0x7e, 0x75, 0x7d, 0x74, 0x6b, 0x73, 0x6b, 0x61, 0x6c, 0x5d, 0x52, 0x60,
+ 0x62, 0x5a, 0x69, 0x6c, 0x65, 0x74, 0x73, 0x6b, 0x7a, 0x66, 0x5f, 0x6e,
+ 0x49, 0x44, 0x51, 0x47, 0x42, 0x4e, 0x3a, 0x37, 0x40, 0x1d, 0x1b, 0x21,
+ 0x14, 0x13, 0x16, 0x14, 0x14, 0x16, 0x11, 0x11, 0x12, 0x0e, 0x0e, 0x0e,
+ 0x11, 0x14, 0x13, 0x2e, 0x32, 0x33, 0x32, 0x37, 0x3d, 0x32, 0x37, 0x41,
+ 0x33, 0x39, 0x45, 0x32, 0x39, 0x43, 0x30, 0x37, 0x3f, 0x1d, 0x23, 0x29,
+ 0x15, 0x16, 0x1a, 0x15, 0x16, 0x19, 0x15, 0x16, 0x1a, 0x14, 0x18, 0x1b,
+ 0x15, 0x19, 0x1c, 0x15, 0x19, 0x1c, 0x18, 0x1c, 0x1f, 0x1a, 0x1e, 0x21,
+ 0x1b, 0x21, 0x21, 0x1e, 0x24, 0x24, 0x22, 0x27, 0x28, 0x27, 0x2c, 0x2e,
+ 0x23, 0x29, 0x29, 0x24, 0x2a, 0x2a, 0x24, 0x29, 0x29, 0x16, 0x1a, 0x19,
+ 0x1d, 0x1e, 0x1e, 0x1e, 0x20, 0x21, 0x1a, 0x1e, 0x20, 0x1b, 0x1f, 0x22,
+ 0x1c, 0x20, 0x23, 0x1e, 0x21, 0x25, 0x20, 0x23, 0x27, 0x20, 0x24, 0x27,
+ 0x20, 0x23, 0x2a, 0x22, 0x25, 0x2a, 0x24, 0x27, 0x2c, 0x28, 0x2b, 0x30,
+ 0x29, 0x2e, 0x32, 0x2d, 0x32, 0x36, 0x2b, 0x33, 0x36, 0x30, 0x37, 0x3d,
+ 0x30, 0x3a, 0x40, 0x30, 0x3a, 0x40, 0x31, 0x3a, 0x41, 0x33, 0x3c, 0x43,
+ 0x31, 0x3a, 0x41, 0x31, 0x3a, 0x41, 0x32, 0x3d, 0x41, 0x37, 0x42, 0x46,
+ 0x38, 0x41, 0x46, 0x39, 0x42, 0x47, 0x3c, 0x45, 0x4a, 0x3a, 0x41, 0x49,
+ 0x3b, 0x42, 0x4a, 0x3e, 0x45, 0x4c, 0x41, 0x48, 0x4e, 0x41, 0x4a, 0x4f,
+ 0x40, 0x4b, 0x4f, 0x42, 0x4d, 0x51, 0x44, 0x51, 0x57, 0x49, 0x56, 0x5c,
+ 0x50, 0x5d, 0x63, 0x5a, 0x65, 0x69, 0x69, 0x72, 0x77, 0x73, 0x7a, 0x80,
+ 0x76, 0x7f, 0x84, 0x7a, 0x83, 0x88, 0x7c, 0x87, 0x8c, 0x78, 0x83, 0x89,
+ 0x77, 0x82, 0x88, 0x76, 0x80, 0x87, 0x6f, 0x78, 0x7e, 0x6f, 0x76, 0x7e,
+ 0x69, 0x72, 0x79, 0x60, 0x67, 0x6f, 0x58, 0x5f, 0x67, 0x52, 0x5b, 0x65,
+ 0x61, 0x6e, 0x77, 0x68, 0x77, 0x7c, 0x47, 0x54, 0x53, 0x98, 0xa4, 0x9e,
+ 0xcd, 0xdc, 0xde, 0xbf, 0xcc, 0xd4, 0xbc, 0xc8, 0xd4, 0xbc, 0xc7, 0xd3,
+ 0xba, 0xc5, 0xd1, 0xb9, 0xc3, 0xcf, 0xb9, 0xc4, 0xd2, 0xb8, 0xc4, 0xd4,
+ 0xb9, 0xc5, 0xd4, 0xb9, 0xc5, 0xd5, 0xbb, 0xc6, 0xd6, 0xba, 0xc6, 0xd6,
+ 0xbb, 0xc8, 0xd8, 0xbd, 0xca, 0xda, 0xbd, 0xca, 0xda, 0xbd, 0xca, 0xda,
+ 0xbb, 0xca, 0xd9, 0xbe, 0xcb, 0xdb, 0xc0, 0xcc, 0xdd, 0xbe, 0xcb, 0xdb,
+ 0xbd, 0xcd, 0xdc, 0xbc, 0xcd, 0xdc, 0xc2, 0xcd, 0xdd, 0xbd, 0xc4, 0xd6,
+ 0xa6, 0xaa, 0xb7, 0x98, 0x99, 0xa2, 0x92, 0x91, 0x97, 0x93, 0x93, 0x95,
+ 0x95, 0x97, 0x96, 0x96, 0x9a, 0x99, 0x99, 0x9d, 0x9e, 0xa2, 0xa3, 0xa7,
+ 0x12, 0x14, 0x13, 0x15, 0x17, 0x16, 0x1b, 0x1d, 0x1c, 0x1c, 0x1e, 0x1d,
+ 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1e, 0x1e, 0x1e, 0x23, 0x23, 0x22,
+ 0x18, 0x1a, 0x17, 0x12, 0x14, 0x11, 0x10, 0x11, 0x11, 0x0a, 0x0c, 0x0b,
+ 0x05, 0x07, 0x06, 0x05, 0x07, 0x06, 0x07, 0x09, 0x08, 0x05, 0x07, 0x06,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05,
+ 0x06, 0x06, 0x06, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x03, 0x03, 0x03, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x05, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x04, 0x06, 0x05,
+ 0x0b, 0x0f, 0x10, 0x24, 0x28, 0x29, 0x45, 0x4b, 0x4b, 0x47, 0x4c, 0x4f,
+ 0x41, 0x47, 0x47, 0x4a, 0x50, 0x4e, 0x31, 0x37, 0x35, 0x15, 0x1a, 0x1c,
+ 0x12, 0x15, 0x1a, 0x11, 0x14, 0x19, 0x14, 0x15, 0x17, 0x15, 0x17, 0x15,
+ 0x10, 0x12, 0x11, 0x0c, 0x0e, 0x0d, 0x0b, 0x0d, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x13, 0x13, 0x13, 0x18, 0x1a, 0x19, 0x1f, 0x21, 0x1e, 0x22, 0x23, 0x21,
+ 0x23, 0x23, 0x23, 0x24, 0x24, 0x24, 0x1f, 0x1f, 0x1f, 0x23, 0x23, 0x22,
+ 0x2b, 0x2b, 0x29, 0x30, 0x30, 0x2e, 0x2c, 0x2c, 0x2a, 0x2c, 0x2d, 0x28,
+ 0x1e, 0x1d, 0x19, 0x10, 0x10, 0x0e, 0x0d, 0x0d, 0x0b, 0x08, 0x0a, 0x09,
+ 0x07, 0x09, 0x08, 0x11, 0x11, 0x11, 0x14, 0x12, 0x13, 0x16, 0x12, 0x13,
+ 0x25, 0x1d, 0x1d, 0x30, 0x24, 0x24, 0x31, 0x24, 0x26, 0x30, 0x27, 0x2d,
+ 0x5d, 0x5c, 0x63, 0x66, 0x68, 0x6c, 0x80, 0x7e, 0x7b, 0xc3, 0xba, 0xaf,
+ 0xdb, 0xd4, 0xc1, 0xe9, 0xe2, 0xcb, 0xe9, 0xe4, 0xc8, 0xfb, 0xf6, 0xd9,
+ 0xfd, 0xf7, 0xdc, 0xfe, 0xf7, 0xe1, 0xfe, 0xf7, 0xe3, 0xf6, 0xf0, 0xda,
+ 0xf7, 0xf2, 0xd5, 0xe9, 0xe2, 0xc7, 0xf8, 0xf0, 0xd9, 0xe0, 0xd8, 0xc3,
+ 0xad, 0xa8, 0x93, 0x83, 0x81, 0x72, 0x8e, 0x8e, 0x86, 0x8a, 0x8b, 0x89,
+ 0x8b, 0x8f, 0x8f, 0x87, 0x8a, 0x8f, 0x83, 0x86, 0x8d, 0x80, 0x82, 0x87,
+ 0x77, 0x78, 0x7a, 0x69, 0x6b, 0x6a, 0x56, 0x57, 0x59, 0x41, 0x42, 0x46,
+ 0x2a, 0x2d, 0x31, 0x20, 0x21, 0x25, 0x17, 0x18, 0x18, 0x17, 0x15, 0x13,
+ 0x2c, 0x26, 0x22, 0x2e, 0x25, 0x20, 0x5c, 0x51, 0x4b, 0x71, 0x67, 0x5f,
+ 0x43, 0x39, 0x39, 0x45, 0x3b, 0x3b, 0x37, 0x2c, 0x28, 0x54, 0x4a, 0x3d,
+ 0x87, 0x7f, 0x6c, 0x84, 0x7e, 0x67, 0x9b, 0x96, 0x81, 0x80, 0x7d, 0x6c,
+ 0x7d, 0x7b, 0x6c, 0x8e, 0x8c, 0x7f, 0xa2, 0xa0, 0x94, 0xb4, 0xb2, 0xa6,
+ 0x97, 0x95, 0x88, 0xae, 0xac, 0xa0, 0x9f, 0x9c, 0x94, 0x7d, 0x7a, 0x75,
+ 0xae, 0xaf, 0xa3, 0xc7, 0xc7, 0xbd, 0xb1, 0xb0, 0xa7, 0xbb, 0xb8, 0xaf,
+ 0xcd, 0xcb, 0xbf, 0xbc, 0xbc, 0xb2, 0xa6, 0xa5, 0xa2, 0x90, 0x8e, 0x90,
+ 0x71, 0x71, 0x70, 0x81, 0x80, 0x80, 0x4d, 0x46, 0x4b, 0x2f, 0x25, 0x2d,
+ 0x31, 0x26, 0x2c, 0x23, 0x1b, 0x16, 0x60, 0x5c, 0x46, 0xd1, 0xd1, 0xaf,
+ 0xcf, 0xcd, 0xb9, 0xd1, 0xce, 0xbe, 0x92, 0x90, 0x81, 0x7f, 0x7d, 0x6e,
+ 0xaf, 0xae, 0x9a, 0x98, 0x97, 0x82, 0x7b, 0x7a, 0x64, 0xca, 0xc7, 0xb4,
+ 0xd2, 0xd1, 0xc1, 0xcc, 0xcc, 0xbf, 0xcc, 0xcc, 0xc2, 0x89, 0x8b, 0x81,
+ 0x99, 0x9c, 0x8e, 0xcc, 0xce, 0xc0, 0xc7, 0xc7, 0xbd, 0x7b, 0x7b, 0x73,
+ 0xb8, 0xb9, 0xab, 0xcd, 0xcf, 0xc2, 0xc3, 0xc5, 0xb8, 0xc4, 0xc6, 0xb8,
+ 0xcc, 0xcd, 0xc3, 0xd3, 0xd1, 0xcd, 0x8f, 0x89, 0x8f, 0x4c, 0x41, 0x4d,
+ 0x60, 0x4f, 0x58, 0x60, 0x4e, 0x56, 0x58, 0x45, 0x4b, 0x5a, 0x47, 0x4b,
+ 0x53, 0x42, 0x43, 0x3d, 0x2f, 0x2d, 0x4d, 0x43, 0x3e, 0x74, 0x6d, 0x64,
+ 0x99, 0x94, 0x8a, 0xac, 0xa8, 0x9f, 0xb5, 0xb1, 0xa9, 0xb5, 0xb3, 0xab,
+ 0xb3, 0xb0, 0xab, 0xaf, 0xab, 0xa8, 0xb1, 0xad, 0xaa, 0xbd, 0xb9, 0xb8,
+ 0xbe, 0xb9, 0xb3, 0xb5, 0xb0, 0xab, 0xbd, 0xb7, 0xb8, 0xa6, 0xa0, 0xa6,
+ 0x75, 0x6f, 0x7b, 0x5b, 0x55, 0x65, 0x68, 0x62, 0x74, 0x7a, 0x73, 0x88,
+ 0x78, 0x73, 0x87, 0x4e, 0x49, 0x5b, 0x44, 0x40, 0x4e, 0x33, 0x30, 0x3a,
+ 0x23, 0x20, 0x26, 0x15, 0x14, 0x16, 0x14, 0x13, 0x13, 0x10, 0x0f, 0x0f,
+ 0x19, 0x1d, 0x1c, 0x32, 0x36, 0x39, 0x32, 0x36, 0x3f, 0x31, 0x37, 0x44,
+ 0x31, 0x37, 0x43, 0x31, 0x38, 0x42, 0x2a, 0x32, 0x39, 0x1a, 0x21, 0x24,
+ 0x1a, 0x1c, 0x1e, 0x19, 0x1c, 0x1d, 0x18, 0x1c, 0x1f, 0x1a, 0x1e, 0x21,
+ 0x1a, 0x1f, 0x22, 0x1d, 0x22, 0x25, 0x1f, 0x24, 0x27, 0x20, 0x25, 0x28,
+ 0x22, 0x27, 0x2a, 0x27, 0x2c, 0x2f, 0x29, 0x2f, 0x32, 0x26, 0x2c, 0x2f,
+ 0x19, 0x1e, 0x21, 0x22, 0x28, 0x28, 0x21, 0x25, 0x24, 0x15, 0x19, 0x18,
+ 0x2a, 0x2c, 0x2d, 0x26, 0x2a, 0x2d, 0x1b, 0x1f, 0x22, 0x1d, 0x22, 0x25,
+ 0x1d, 0x22, 0x26, 0x1d, 0x22, 0x26, 0x1f, 0x23, 0x26, 0x20, 0x24, 0x28,
+ 0x21, 0x26, 0x2a, 0x23, 0x28, 0x2c, 0x24, 0x29, 0x2d, 0x29, 0x2e, 0x32,
+ 0x28, 0x2d, 0x31, 0x2a, 0x2f, 0x35, 0x2c, 0x33, 0x39, 0x2f, 0x37, 0x3e,
+ 0x2e, 0x39, 0x40, 0x2f, 0x3a, 0x40, 0x30, 0x3a, 0x40, 0x33, 0x3c, 0x43,
+ 0x33, 0x3c, 0x43, 0x33, 0x3c, 0x42, 0x34, 0x3d, 0x42, 0x36, 0x3f, 0x44,
+ 0x36, 0x3f, 0x46, 0x37, 0x40, 0x48, 0x3a, 0x42, 0x4a, 0x3a, 0x40, 0x4a,
+ 0x3e, 0x42, 0x4d, 0x40, 0x44, 0x4d, 0x3f, 0x46, 0x4e, 0x40, 0x47, 0x4f,
+ 0x3f, 0x48, 0x4d, 0x41, 0x4c, 0x50, 0x46, 0x51, 0x55, 0x4b, 0x59, 0x5c,
+ 0x52, 0x5d, 0x62, 0x59, 0x63, 0x68, 0x69, 0x72, 0x77, 0x74, 0x7b, 0x81,
+ 0x75, 0x7f, 0x82, 0x76, 0x7f, 0x83, 0x76, 0x7f, 0x84, 0x72, 0x7b, 0x82,
+ 0x73, 0x7c, 0x83, 0x72, 0x7c, 0x83, 0x6e, 0x76, 0x7d, 0x68, 0x6f, 0x77,
+ 0x62, 0x6b, 0x74, 0x5b, 0x62, 0x6a, 0x52, 0x57, 0x5d, 0x56, 0x5d, 0x63,
+ 0x77, 0x82, 0x87, 0x6e, 0x7b, 0x80, 0x5b, 0x6b, 0x6b, 0xb6, 0xc6, 0xc5,
+ 0xc7, 0xd4, 0xd9, 0xbf, 0xcb, 0xd6, 0xbe, 0xc8, 0xd4, 0xbc, 0xc6, 0xd2,
+ 0xba, 0xc5, 0xd1, 0xb8, 0xc3, 0xd0, 0xb5, 0xc2, 0xd0, 0xb6, 0xc3, 0xd2,
+ 0xb8, 0xc4, 0xd4, 0xb9, 0xc5, 0xd5, 0xbb, 0xc7, 0xd7, 0xbb, 0xc7, 0xd7,
+ 0xba, 0xc7, 0xd7, 0xbc, 0xc9, 0xd9, 0xbd, 0xca, 0xda, 0xbe, 0xcb, 0xdb,
+ 0xbb, 0xcb, 0xda, 0xbb, 0xcb, 0xda, 0xbc, 0xca, 0xda, 0xbc, 0xcc, 0xdb,
+ 0xbc, 0xcd, 0xdc, 0xbe, 0xcd, 0xdc, 0xc0, 0xca, 0xdb, 0xb1, 0xb6, 0xc8,
+ 0x9e, 0x9d, 0xaa, 0x95, 0x93, 0x9b, 0x93, 0x91, 0x96, 0x96, 0x95, 0x96,
+ 0x98, 0x9a, 0x97, 0x99, 0x9d, 0x9c, 0x9c, 0xa1, 0xa2, 0xa3, 0xa7, 0xaa,
+ 0x13, 0x15, 0x14, 0x12, 0x14, 0x13, 0x16, 0x18, 0x17, 0x19, 0x1b, 0x1a,
+ 0x1c, 0x1c, 0x1c, 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1e, 0x21, 0x22, 0x21,
+ 0x1b, 0x1d, 0x1a, 0x14, 0x16, 0x13, 0x15, 0x17, 0x15, 0x10, 0x12, 0x11,
+ 0x0b, 0x0d, 0x0b, 0x06, 0x08, 0x07, 0x07, 0x09, 0x08, 0x07, 0x09, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x04, 0x04, 0x05, 0x07, 0x07, 0x08,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0a, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x07, 0x05, 0x06, 0x07, 0x07, 0x07, 0x05, 0x06, 0x05, 0x11, 0x13, 0x12,
+ 0x2f, 0x34, 0x34, 0x3d, 0x43, 0x43, 0x42, 0x4a, 0x4c, 0x53, 0x5a, 0x5d,
+ 0x50, 0x58, 0x59, 0x4a, 0x4f, 0x50, 0x2c, 0x31, 0x33, 0x14, 0x19, 0x1c,
+ 0x10, 0x13, 0x19, 0x12, 0x15, 0x1a, 0x12, 0x16, 0x17, 0x15, 0x18, 0x15,
+ 0x12, 0x14, 0x12, 0x0b, 0x0d, 0x0c, 0x0c, 0x0e, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0d, 0x0d, 0x10, 0x11, 0x10, 0x1a, 0x1c, 0x19, 0x22, 0x24, 0x21,
+ 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x24, 0x25, 0x26, 0x24, 0x24, 0x24,
+ 0x26, 0x25, 0x24, 0x29, 0x29, 0x27, 0x31, 0x32, 0x2e, 0x33, 0x33, 0x2f,
+ 0x2e, 0x2d, 0x29, 0x20, 0x20, 0x1c, 0x12, 0x12, 0x10, 0x07, 0x09, 0x07,
+ 0x06, 0x08, 0x07, 0x0d, 0x0d, 0x0d, 0x16, 0x14, 0x15, 0x13, 0x11, 0x11,
+ 0x21, 0x1c, 0x17, 0x2d, 0x25, 0x22, 0x32, 0x27, 0x2b, 0x34, 0x30, 0x3d,
+ 0x64, 0x67, 0x79, 0x78, 0x7c, 0x8f, 0x97, 0x95, 0xa4, 0x7e, 0x75, 0x7d,
+ 0x63, 0x59, 0x55, 0x76, 0x6d, 0x62, 0x86, 0x7f, 0x6b, 0xa5, 0x9f, 0x87,
+ 0xaa, 0xa3, 0x8a, 0xb5, 0xad, 0x95, 0xb6, 0xae, 0x95, 0xa2, 0x9b, 0x80,
+ 0xa1, 0x9a, 0x7f, 0x8b, 0x80, 0x69, 0x7b, 0x70, 0x5d, 0x62, 0x59, 0x49,
+ 0x4e, 0x47, 0x3a, 0x4f, 0x4d, 0x45, 0x86, 0x88, 0x89, 0x8b, 0x8e, 0x94,
+ 0x84, 0x8d, 0x8b, 0x85, 0x8a, 0x8d, 0x80, 0x81, 0x87, 0x76, 0x76, 0x7b,
+ 0x69, 0x69, 0x6a, 0x59, 0x59, 0x58, 0x45, 0x46, 0x4a, 0x2e, 0x2f, 0x38,
+ 0x21, 0x24, 0x28, 0x1d, 0x1f, 0x22, 0x18, 0x17, 0x17, 0x1f, 0x1c, 0x1a,
+ 0x2f, 0x29, 0x25, 0x44, 0x3b, 0x34, 0x7b, 0x71, 0x68, 0x7e, 0x75, 0x6b,
+ 0x56, 0x4c, 0x4a, 0x4b, 0x3f, 0x3c, 0x3f, 0x33, 0x28, 0x79, 0x6c, 0x5a,
+ 0x92, 0x86, 0x71, 0x87, 0x7c, 0x67, 0x87, 0x80, 0x6f, 0x81, 0x7b, 0x6e,
+ 0x7f, 0x80, 0x6c, 0xaf, 0xaf, 0x9d, 0x8f, 0x90, 0x80, 0xaa, 0xaa, 0x99,
+ 0x97, 0x95, 0x84, 0x98, 0x96, 0x87, 0xbe, 0xbc, 0xaf, 0x9e, 0x9c, 0x93,
+ 0xc2, 0xc2, 0xbf, 0xb9, 0xb9, 0xb6, 0xcc, 0xcc, 0xc7, 0xaa, 0xa9, 0xa1,
+ 0xc5, 0xc5, 0xbb, 0xde, 0xdd, 0xd4, 0x9b, 0x9b, 0x93, 0x9a, 0x9a, 0x97,
+ 0x9c, 0x9c, 0xa2, 0x87, 0x85, 0x89, 0x46, 0x3f, 0x42, 0x33, 0x29, 0x2f,
+ 0x30, 0x25, 0x2b, 0x2d, 0x23, 0x23, 0x26, 0x21, 0x0e, 0x9c, 0x9c, 0x7d,
+ 0xd6, 0xd5, 0xbd, 0xc9, 0xc7, 0xb4, 0x64, 0x62, 0x53, 0xa1, 0x9f, 0x90,
+ 0xd8, 0xd7, 0xc5, 0xcc, 0xca, 0xb7, 0x6f, 0x6d, 0x59, 0xac, 0xa9, 0x98,
+ 0xd8, 0xd6, 0xc9, 0xcd, 0xcf, 0xc0, 0xcc, 0xcd, 0xbf, 0xc1, 0xc3, 0xb6,
+ 0xc8, 0xca, 0xbd, 0xcb, 0xcd, 0xc2, 0xc4, 0xc4, 0xbb, 0xa0, 0xa0, 0x97,
+ 0xa3, 0xa5, 0x97, 0x93, 0x95, 0x88, 0x87, 0x89, 0x7c, 0x8d, 0x8e, 0x81,
+ 0xb9, 0xba, 0xb0, 0xa7, 0xa3, 0xa3, 0x51, 0x47, 0x53, 0x5e, 0x50, 0x62,
+ 0x75, 0x66, 0x67, 0x62, 0x52, 0x55, 0x5b, 0x4c, 0x51, 0x52, 0x43, 0x47,
+ 0x44, 0x35, 0x37, 0x6d, 0x61, 0x5d, 0x8f, 0x85, 0x78, 0xa0, 0x99, 0x87,
+ 0xb0, 0xaf, 0x9d, 0xb8, 0xb6, 0xa7, 0xbe, 0xbf, 0xb1, 0xc0, 0xc1, 0xb5,
+ 0xb8, 0xb8, 0xae, 0xac, 0xac, 0xa4, 0xae, 0xae, 0xa7, 0xc4, 0xc4, 0xbc,
+ 0xd3, 0xd7, 0xc5, 0xb8, 0xbc, 0xad, 0xda, 0xdd, 0xd4, 0xea, 0xee, 0xed,
+ 0xc3, 0xc5, 0xcc, 0x9a, 0x9c, 0xaa, 0x8c, 0x8c, 0xa0, 0x6a, 0x6a, 0x81,
+ 0x74, 0x6f, 0x86, 0x61, 0x5c, 0x72, 0x46, 0x42, 0x54, 0x47, 0x43, 0x4f,
+ 0x35, 0x32, 0x38, 0x1c, 0x1a, 0x1d, 0x16, 0x14, 0x15, 0x13, 0x11, 0x13,
+ 0x24, 0x28, 0x29, 0x34, 0x39, 0x3e, 0x35, 0x39, 0x42, 0x30, 0x37, 0x43,
+ 0x30, 0x36, 0x44, 0x30, 0x37, 0x41, 0x2b, 0x33, 0x39, 0x1e, 0x26, 0x29,
+ 0x1f, 0x24, 0x25, 0x21, 0x25, 0x26, 0x21, 0x26, 0x28, 0x20, 0x25, 0x28,
+ 0x22, 0x28, 0x2b, 0x26, 0x2c, 0x2f, 0x26, 0x2b, 0x2e, 0x2a, 0x2f, 0x32,
+ 0x2d, 0x32, 0x36, 0x2a, 0x30, 0x33, 0x22, 0x2a, 0x2d, 0x14, 0x1c, 0x1f,
+ 0x0e, 0x13, 0x16, 0x25, 0x2a, 0x2a, 0x20, 0x24, 0x23, 0x17, 0x1b, 0x1a,
+ 0x31, 0x36, 0x38, 0x2e, 0x32, 0x35, 0x1d, 0x20, 0x26, 0x1e, 0x22, 0x26,
+ 0x1d, 0x22, 0x26, 0x20, 0x25, 0x29, 0x20, 0x25, 0x28, 0x1f, 0x23, 0x27,
+ 0x1f, 0x24, 0x28, 0x24, 0x29, 0x2d, 0x25, 0x2a, 0x2d, 0x28, 0x2d, 0x31,
+ 0x28, 0x2d, 0x31, 0x2a, 0x30, 0x36, 0x2d, 0x34, 0x3b, 0x2e, 0x37, 0x3e,
+ 0x2a, 0x36, 0x3c, 0x2d, 0x39, 0x3f, 0x2f, 0x39, 0x40, 0x31, 0x3a, 0x41,
+ 0x34, 0x3b, 0x43, 0x35, 0x3c, 0x44, 0x36, 0x3d, 0x43, 0x35, 0x3d, 0x43,
+ 0x35, 0x3e, 0x45, 0x39, 0x40, 0x4a, 0x3a, 0x41, 0x4b, 0x3c, 0x40, 0x4b,
+ 0x3c, 0x41, 0x4c, 0x3f, 0x44, 0x4e, 0x40, 0x44, 0x4f, 0x41, 0x46, 0x4f,
+ 0x41, 0x4a, 0x4f, 0x40, 0x4b, 0x50, 0x46, 0x50, 0x55, 0x47, 0x55, 0x58,
+ 0x4f, 0x5a, 0x5e, 0x59, 0x63, 0x67, 0x68, 0x6f, 0x75, 0x70, 0x77, 0x7d,
+ 0x70, 0x79, 0x7b, 0x71, 0x7b, 0x7d, 0x70, 0x79, 0x7e, 0x6e, 0x77, 0x7d,
+ 0x6d, 0x76, 0x7d, 0x6b, 0x74, 0x7d, 0x69, 0x70, 0x79, 0x64, 0x6b, 0x75,
+ 0x5e, 0x64, 0x70, 0x54, 0x5a, 0x62, 0x51, 0x52, 0x56, 0x60, 0x64, 0x65,
+ 0x71, 0x7a, 0x7c, 0x4c, 0x5a, 0x5d, 0x76, 0x85, 0x87, 0xc7, 0xd7, 0xda,
+ 0xc0, 0xcd, 0xd4, 0xbd, 0xca, 0xd3, 0xbd, 0xc7, 0xd3, 0xba, 0xc4, 0xd2,
+ 0xb9, 0xc3, 0xcf, 0xb7, 0xc3, 0xcf, 0xb6, 0xc4, 0xd1, 0xb6, 0xc3, 0xd3,
+ 0xb7, 0xc3, 0xd3, 0xb7, 0xc3, 0xd3, 0xb9, 0xc5, 0xd5, 0xb9, 0xc5, 0xd5,
+ 0xb9, 0xc6, 0xd6, 0xbb, 0xc8, 0xd8, 0xbc, 0xc9, 0xd8, 0xbd, 0xcb, 0xda,
+ 0xba, 0xcc, 0xda, 0xbc, 0xcc, 0xdb, 0xbc, 0xcc, 0xdb, 0xbc, 0xcd, 0xdc,
+ 0xbd, 0xce, 0xdd, 0xc0, 0xce, 0xdd, 0xbd, 0xc4, 0xd6, 0xa7, 0xa9, 0xbc,
+ 0x9a, 0x98, 0xa3, 0x93, 0x90, 0x99, 0x95, 0x92, 0x95, 0x98, 0x97, 0x96,
+ 0x98, 0x9a, 0x97, 0x99, 0x9f, 0x9d, 0x9f, 0xa4, 0xa5, 0xa6, 0xab, 0xae,
+ 0x13, 0x15, 0x14, 0x13, 0x15, 0x14, 0x14, 0x16, 0x15, 0x15, 0x17, 0x16,
+ 0x17, 0x19, 0x18, 0x18, 0x1a, 0x19, 0x1e, 0x21, 0x20, 0x18, 0x1a, 0x19,
+ 0x15, 0x16, 0x14, 0x19, 0x19, 0x17, 0x1a, 0x1a, 0x18, 0x15, 0x15, 0x13,
+ 0x13, 0x13, 0x11, 0x0d, 0x0d, 0x0b, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x04, 0x05, 0x05, 0x05, 0x06, 0x06, 0x07, 0x06, 0x06, 0x08,
+ 0x06, 0x06, 0x08, 0x05, 0x05, 0x07, 0x04, 0x04, 0x06, 0x05, 0x05, 0x07,
+ 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0a,
+ 0x07, 0x07, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e,
+ 0x0b, 0x0b, 0x0b, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x13, 0x15, 0x14, 0x35, 0x38, 0x38,
+ 0x4e, 0x54, 0x54, 0x4a, 0x52, 0x51, 0x44, 0x4c, 0x4f, 0x49, 0x51, 0x54,
+ 0x53, 0x59, 0x5a, 0x40, 0x46, 0x44, 0x20, 0x25, 0x21, 0x1b, 0x1d, 0x18,
+ 0x21, 0x23, 0x1f, 0x2a, 0x2c, 0x29, 0x20, 0x22, 0x21, 0x16, 0x18, 0x19,
+ 0x12, 0x15, 0x14, 0x0e, 0x10, 0x0f, 0x0d, 0x0e, 0x0e, 0x0c, 0x0e, 0x0d,
+ 0x09, 0x0c, 0x0b, 0x0b, 0x0c, 0x0b, 0x10, 0x10, 0x10, 0x1a, 0x17, 0x18,
+ 0x1b, 0x1d, 0x1c, 0x22, 0x24, 0x23, 0x26, 0x28, 0x27, 0x24, 0x26, 0x25,
+ 0x24, 0x26, 0x26, 0x26, 0x2a, 0x2b, 0x30, 0x34, 0x35, 0x2f, 0x32, 0x33,
+ 0x2d, 0x2d, 0x2a, 0x2d, 0x2c, 0x28, 0x20, 0x1f, 0x1c, 0x10, 0x0f, 0x0b,
+ 0x0b, 0x0a, 0x08, 0x0a, 0x0a, 0x08, 0x11, 0x11, 0x11, 0x0e, 0x10, 0x0f,
+ 0x18, 0x14, 0x16, 0x1d, 0x1b, 0x1f, 0x25, 0x21, 0x28, 0x67, 0x66, 0x6e,
+ 0x7e, 0x7d, 0x86, 0x7b, 0x7c, 0x84, 0xc2, 0xc4, 0xc9, 0x87, 0x86, 0x8b,
+ 0x55, 0x4a, 0x4d, 0x57, 0x4c, 0x4f, 0x55, 0x4c, 0x4b, 0x58, 0x4d, 0x4d,
+ 0x50, 0x40, 0x40, 0x44, 0x32, 0x33, 0x3f, 0x30, 0x31, 0x3c, 0x2d, 0x2e,
+ 0x43, 0x30, 0x2e, 0x3d, 0x2e, 0x2b, 0x3c, 0x31, 0x2f, 0x50, 0x46, 0x43,
+ 0x54, 0x49, 0x45, 0x4e, 0x44, 0x3f, 0x6c, 0x6c, 0x66, 0x8a, 0x8e, 0x8b,
+ 0x7f, 0x83, 0x87, 0x7e, 0x81, 0x86, 0x75, 0x77, 0x7d, 0x6a, 0x6a, 0x71,
+ 0x5a, 0x5a, 0x61, 0x45, 0x45, 0x4a, 0x33, 0x32, 0x38, 0x29, 0x28, 0x2e,
+ 0x1f, 0x21, 0x24, 0x19, 0x19, 0x1d, 0x1f, 0x19, 0x1a, 0x2b, 0x21, 0x20,
+ 0x38, 0x2d, 0x29, 0x66, 0x5c, 0x54, 0x86, 0x7f, 0x6e, 0x81, 0x7a, 0x69,
+ 0x60, 0x51, 0x4f, 0x4b, 0x3d, 0x39, 0x52, 0x46, 0x33, 0x87, 0x80, 0x64,
+ 0x8d, 0x85, 0x73, 0x84, 0x7d, 0x6d, 0x8a, 0x84, 0x6f, 0x94, 0x8c, 0x7c,
+ 0x88, 0x80, 0x69, 0xb7, 0xb1, 0x9d, 0x9a, 0x95, 0x85, 0x86, 0x80, 0x72,
+ 0x94, 0x8c, 0x7f, 0x95, 0x8e, 0x81, 0xb0, 0xac, 0xa0, 0xa2, 0xa3, 0x98,
+ 0xba, 0xb9, 0xb5, 0xb5, 0xb5, 0xab, 0xb8, 0xb8, 0xab, 0xab, 0xac, 0xa0,
+ 0xb0, 0xaf, 0xa7, 0xcd, 0xca, 0xc6, 0x9e, 0x9c, 0x92, 0x9a, 0x98, 0x89,
+ 0xa7, 0xa7, 0x9c, 0x92, 0x91, 0x8e, 0x4e, 0x47, 0x4d, 0x37, 0x2b, 0x35,
+ 0x33, 0x24, 0x2c, 0x31, 0x26, 0x23, 0x28, 0x24, 0x16, 0x5f, 0x61, 0x49,
+ 0xce, 0xcf, 0xb0, 0xd0, 0xd1, 0xb4, 0x91, 0x93, 0x7a, 0xa1, 0xa2, 0x90,
+ 0xd0, 0xd1, 0xc3, 0xd2, 0xd3, 0xc4, 0x82, 0x83, 0x71, 0x9c, 0x9e, 0x89,
+ 0xbf, 0xc1, 0xab, 0x9f, 0xa1, 0x8c, 0xca, 0xcc, 0xb7, 0xd0, 0xd1, 0xbd,
+ 0xcd, 0xcf, 0xbf, 0xc9, 0xcb, 0xc0, 0xc8, 0xc8, 0xc5, 0xa0, 0xa0, 0x9e,
+ 0x8e, 0x91, 0x81, 0x9b, 0x9d, 0x8f, 0xb8, 0xb8, 0xac, 0x78, 0x75, 0x6f,
+ 0x80, 0x7a, 0x7d, 0x64, 0x5a, 0x62, 0x59, 0x50, 0x57, 0x79, 0x6e, 0x74,
+ 0x7a, 0x68, 0x6e, 0x5b, 0x46, 0x51, 0x60, 0x4d, 0x54, 0x50, 0x44, 0x3b,
+ 0x70, 0x69, 0x58, 0x95, 0x91, 0x83, 0x9f, 0x9a, 0x90, 0xa6, 0xa1, 0x93,
+ 0xb3, 0xb5, 0xa2, 0xca, 0xcd, 0xbd, 0xc5, 0xc6, 0xbb, 0xca, 0xcb, 0xc4,
+ 0xd1, 0xd1, 0xcf, 0xad, 0xad, 0xad, 0xb9, 0xb9, 0xba, 0xd0, 0xd0, 0xd1,
+ 0xd4, 0xd6, 0xd4, 0xc5, 0xc7, 0xc5, 0xc6, 0xc8, 0xc7, 0xf5, 0xf7, 0xf8,
+ 0xde, 0xdf, 0xe2, 0xbf, 0xbf, 0xc7, 0xc3, 0xc2, 0xd1, 0x81, 0x7f, 0x90,
+ 0x75, 0x74, 0x85, 0x80, 0x7f, 0x91, 0x71, 0x6e, 0x82, 0x4d, 0x44, 0x55,
+ 0x3e, 0x33, 0x3d, 0x30, 0x26, 0x2b, 0x1c, 0x15, 0x1b, 0x16, 0x13, 0x1c,
+ 0x30, 0x30, 0x3a, 0x37, 0x3c, 0x44, 0x34, 0x3d, 0x43, 0x31, 0x3c, 0x42,
+ 0x30, 0x39, 0x40, 0x2f, 0x38, 0x3f, 0x2f, 0x39, 0x3e, 0x2b, 0x35, 0x39,
+ 0x29, 0x31, 0x36, 0x28, 0x30, 0x33, 0x28, 0x30, 0x33, 0x2a, 0x32, 0x35,
+ 0x2b, 0x32, 0x34, 0x2c, 0x34, 0x36, 0x29, 0x31, 0x34, 0x2a, 0x32, 0x35,
+ 0x25, 0x2f, 0x30, 0x18, 0x22, 0x25, 0x12, 0x19, 0x20, 0x10, 0x15, 0x1b,
+ 0x13, 0x17, 0x1a, 0x27, 0x2d, 0x2d, 0x1b, 0x21, 0x20, 0x17, 0x1d, 0x1d,
+ 0x33, 0x38, 0x38, 0x34, 0x39, 0x3e, 0x1f, 0x23, 0x2e, 0x21, 0x24, 0x2d,
+ 0x21, 0x26, 0x29, 0x20, 0x26, 0x26, 0x1e, 0x24, 0x25, 0x1f, 0x24, 0x28,
+ 0x22, 0x27, 0x2a, 0x23, 0x28, 0x2b, 0x27, 0x2c, 0x2e, 0x28, 0x30, 0x32,
+ 0x29, 0x33, 0x35, 0x2b, 0x35, 0x38, 0x2b, 0x33, 0x39, 0x2d, 0x35, 0x3a,
+ 0x2c, 0x36, 0x38, 0x2e, 0x35, 0x3d, 0x30, 0x37, 0x41, 0x34, 0x39, 0x41,
+ 0x35, 0x3a, 0x3d, 0x35, 0x3b, 0x3b, 0x3a, 0x42, 0x46, 0x3f, 0x46, 0x4e,
+ 0x39, 0x40, 0x46, 0x39, 0x40, 0x46, 0x39, 0x42, 0x49, 0x37, 0x41, 0x4a,
+ 0x38, 0x42, 0x4a, 0x3a, 0x44, 0x4b, 0x3d, 0x48, 0x4c, 0x42, 0x4d, 0x52,
+ 0x3e, 0x4a, 0x51, 0x40, 0x4d, 0x55, 0x44, 0x4f, 0x55, 0x49, 0x53, 0x59,
+ 0x52, 0x5b, 0x60, 0x5c, 0x65, 0x6a, 0x67, 0x6f, 0x74, 0x6b, 0x72, 0x78,
+ 0x6c, 0x75, 0x7a, 0x6b, 0x73, 0x78, 0x6c, 0x74, 0x78, 0x6c, 0x73, 0x77,
+ 0x6a, 0x6f, 0x73, 0x66, 0x6d, 0x74, 0x63, 0x6a, 0x72, 0x61, 0x68, 0x70,
+ 0x59, 0x60, 0x67, 0x4c, 0x52, 0x5d, 0x48, 0x51, 0x58, 0x4f, 0x58, 0x5f,
+ 0x4d, 0x57, 0x62, 0x51, 0x60, 0x5e, 0x9e, 0xae, 0xa8, 0xc7, 0xd4, 0xe0,
+ 0xbd, 0xc9, 0xd3, 0xbb, 0xc8, 0xd0, 0xb8, 0xc5, 0xcf, 0xb8, 0xc4, 0xd0,
+ 0xb7, 0xc3, 0xcf, 0xb7, 0xc3, 0xd1, 0xb7, 0xc3, 0xd1, 0xb7, 0xc3, 0xd3,
+ 0xb7, 0xc3, 0xd1, 0xb7, 0xc3, 0xd1, 0xb7, 0xc3, 0xd3, 0xb8, 0xc4, 0xd4,
+ 0xba, 0xc7, 0xd7, 0xba, 0xc7, 0xd7, 0xba, 0xca, 0xd8, 0xbb, 0xca, 0xd8,
+ 0xbe, 0xcb, 0xd8, 0xbe, 0xcc, 0xd9, 0xbc, 0xcd, 0xda, 0xbc, 0xce, 0xdc,
+ 0xbe, 0xce, 0xdd, 0xc1, 0xcc, 0xdd, 0xb6, 0xbb, 0xcd, 0xa1, 0xa1, 0xb3,
+ 0x95, 0x92, 0x99, 0x90, 0x8f, 0x93, 0x90, 0x93, 0x94, 0x92, 0x96, 0x95,
+ 0x99, 0x9b, 0x99, 0x9d, 0xa0, 0xa0, 0xa3, 0xa6, 0xab, 0xa9, 0xae, 0xb4,
+ 0x14, 0x16, 0x15, 0x15, 0x17, 0x16, 0x14, 0x16, 0x15, 0x14, 0x16, 0x15,
+ 0x14, 0x16, 0x15, 0x16, 0x18, 0x17, 0x1e, 0x20, 0x1f, 0x1e, 0x20, 0x1f,
+ 0x18, 0x1a, 0x17, 0x19, 0x19, 0x17, 0x1a, 0x1a, 0x18, 0x20, 0x20, 0x1e,
+ 0x18, 0x18, 0x16, 0x16, 0x16, 0x14, 0x0f, 0x0f, 0x0f, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x07,
+ 0x06, 0x06, 0x08, 0x05, 0x05, 0x07, 0x05, 0x05, 0x05, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07,
+ 0x05, 0x05, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x06,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x05, 0x05, 0x05, 0x0e, 0x0e, 0x0e, 0x30, 0x32, 0x31, 0x41, 0x45, 0x44,
+ 0x4f, 0x55, 0x53, 0x50, 0x56, 0x56, 0x50, 0x58, 0x5a, 0x48, 0x50, 0x53,
+ 0x38, 0x3e, 0x3c, 0x22, 0x28, 0x24, 0x1c, 0x21, 0x1b, 0x2d, 0x30, 0x29,
+ 0x3e, 0x40, 0x39, 0x46, 0x47, 0x41, 0x32, 0x33, 0x2e, 0x21, 0x22, 0x1f,
+ 0x16, 0x17, 0x16, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x14, 0x15, 0x15,
+ 0x0c, 0x0e, 0x0d, 0x0b, 0x0d, 0x0c, 0x0e, 0x0e, 0x0f, 0x0d, 0x0c, 0x0d,
+ 0x12, 0x13, 0x13, 0x1e, 0x20, 0x1f, 0x29, 0x2b, 0x2a, 0x2a, 0x2c, 0x2b,
+ 0x2b, 0x2d, 0x2e, 0x2f, 0x33, 0x34, 0x28, 0x2d, 0x2e, 0x2c, 0x30, 0x31,
+ 0x31, 0x33, 0x30, 0x2e, 0x2f, 0x2c, 0x28, 0x28, 0x26, 0x20, 0x20, 0x1e,
+ 0x10, 0x10, 0x0e, 0x0c, 0x0c, 0x09, 0x10, 0x10, 0x10, 0x0b, 0x0d, 0x0c,
+ 0x0e, 0x0b, 0x0b, 0x15, 0x11, 0x12, 0x1b, 0x17, 0x1b, 0x3b, 0x38, 0x3d,
+ 0x3b, 0x38, 0x3d, 0x44, 0x41, 0x44, 0xa1, 0x9f, 0xa0, 0x89, 0x87, 0x88,
+ 0x56, 0x4b, 0x4b, 0x5c, 0x52, 0x51, 0x5b, 0x51, 0x50, 0x61, 0x55, 0x53,
+ 0x5c, 0x4c, 0x4c, 0x50, 0x3d, 0x3f, 0x41, 0x31, 0x33, 0x3e, 0x30, 0x30,
+ 0x4b, 0x3a, 0x3b, 0x44, 0x36, 0x36, 0x42, 0x38, 0x37, 0x47, 0x3d, 0x3b,
+ 0x47, 0x3c, 0x38, 0x3e, 0x34, 0x30, 0x40, 0x3d, 0x3a, 0x81, 0x82, 0x80,
+ 0x78, 0x7a, 0x7f, 0x70, 0x73, 0x78, 0x69, 0x6a, 0x6f, 0x5c, 0x5c, 0x64,
+ 0x49, 0x49, 0x51, 0x36, 0x37, 0x3c, 0x2e, 0x2d, 0x33, 0x26, 0x26, 0x2b,
+ 0x1c, 0x20, 0x23, 0x19, 0x19, 0x1c, 0x1e, 0x19, 0x1b, 0x2f, 0x25, 0x24,
+ 0x3b, 0x30, 0x2c, 0x66, 0x5c, 0x51, 0x83, 0x7a, 0x6a, 0x77, 0x6e, 0x5e,
+ 0x53, 0x44, 0x3f, 0x4b, 0x3c, 0x36, 0x61, 0x56, 0x42, 0x93, 0x8c, 0x70,
+ 0x8e, 0x88, 0x75, 0x81, 0x7b, 0x69, 0x83, 0x7d, 0x65, 0x8f, 0x88, 0x75,
+ 0x8d, 0x84, 0x72, 0x89, 0x83, 0x72, 0x8c, 0x87, 0x7b, 0x83, 0x7e, 0x72,
+ 0x8c, 0x86, 0x7a, 0xa0, 0x9a, 0x8e, 0xbe, 0xba, 0xaf, 0x9c, 0x9c, 0x92,
+ 0x9e, 0x9d, 0x98, 0x9f, 0x9f, 0x95, 0x88, 0x86, 0x7a, 0xa2, 0xa0, 0x94,
+ 0x99, 0x96, 0x8f, 0x94, 0x8f, 0x8a, 0xa5, 0xa1, 0x98, 0x9f, 0x9c, 0x8d,
+ 0x9e, 0x9b, 0x8e, 0xa1, 0x9e, 0x99, 0x4d, 0x47, 0x4d, 0x30, 0x26, 0x32,
+ 0x30, 0x23, 0x2c, 0x30, 0x25, 0x25, 0x33, 0x2d, 0x23, 0x3d, 0x39, 0x2a,
+ 0x9f, 0x9f, 0x80, 0xca, 0xcb, 0xaa, 0xca, 0xcb, 0xae, 0xc2, 0xc3, 0xad,
+ 0xc9, 0xca, 0xba, 0xd5, 0xd6, 0xc8, 0x8c, 0x8d, 0x7f, 0x7c, 0x7d, 0x6c,
+ 0x90, 0x8f, 0x7b, 0xac, 0xab, 0x96, 0xd0, 0xcf, 0xba, 0xce, 0xcd, 0xb8,
+ 0xcb, 0xcb, 0xb8, 0xc8, 0xc8, 0xba, 0xcb, 0xca, 0xc1, 0x9c, 0x9b, 0x96,
+ 0x72, 0x74, 0x6a, 0xac, 0xac, 0xa2, 0xb3, 0xb0, 0xa9, 0x6d, 0x67, 0x66,
+ 0x67, 0x5e, 0x61, 0x49, 0x3e, 0x42, 0x6e, 0x65, 0x66, 0x82, 0x78, 0x77,
+ 0x73, 0x63, 0x69, 0x5c, 0x4a, 0x55, 0x5e, 0x4e, 0x51, 0x6d, 0x64, 0x56,
+ 0x98, 0x93, 0x7f, 0xa0, 0x9e, 0x90, 0x9d, 0x9a, 0x91, 0xa6, 0xa3, 0x97,
+ 0xb6, 0xb8, 0xaf, 0xc9, 0xca, 0xc4, 0xcd, 0xce, 0xc9, 0xb0, 0xb0, 0xae,
+ 0xdd, 0xde, 0xdd, 0xd3, 0xd4, 0xd4, 0xd6, 0xd8, 0xd7, 0xe7, 0xe9, 0xe8,
+ 0xc9, 0xcb, 0xca, 0xcb, 0xcd, 0xcc, 0xb9, 0xbb, 0xba, 0xdb, 0xdd, 0xdc,
+ 0xca, 0xcb, 0xcc, 0xb3, 0xb3, 0xb9, 0xb1, 0xb0, 0xba, 0xa7, 0xa5, 0xb2,
+ 0x91, 0x90, 0x9c, 0x81, 0x80, 0x90, 0x89, 0x86, 0x99, 0x58, 0x4e, 0x61,
+ 0x3f, 0x33, 0x3f, 0x3a, 0x2f, 0x36, 0x2c, 0x25, 0x2c, 0x23, 0x1d, 0x26,
+ 0x37, 0x37, 0x42, 0x36, 0x3b, 0x43, 0x32, 0x3a, 0x42, 0x31, 0x3c, 0x42,
+ 0x30, 0x39, 0x40, 0x2b, 0x32, 0x3a, 0x26, 0x2f, 0x36, 0x29, 0x34, 0x3a,
+ 0x2b, 0x33, 0x3a, 0x28, 0x2f, 0x35, 0x26, 0x2d, 0x33, 0x25, 0x2d, 0x30,
+ 0x23, 0x2c, 0x2f, 0x20, 0x28, 0x2b, 0x1d, 0x25, 0x28, 0x28, 0x30, 0x33,
+ 0x1e, 0x29, 0x2b, 0x14, 0x1d, 0x22, 0x10, 0x17, 0x21, 0x10, 0x14, 0x1d,
+ 0x13, 0x18, 0x1d, 0x2b, 0x30, 0x33, 0x19, 0x1f, 0x22, 0x15, 0x1c, 0x1e,
+ 0x2c, 0x31, 0x31, 0x38, 0x3c, 0x41, 0x20, 0x23, 0x2d, 0x23, 0x26, 0x2f,
+ 0x22, 0x26, 0x29, 0x20, 0x24, 0x25, 0x22, 0x26, 0x29, 0x22, 0x25, 0x2a,
+ 0x25, 0x2a, 0x2d, 0x28, 0x2c, 0x2f, 0x2b, 0x2f, 0x32, 0x27, 0x2f, 0x31,
+ 0x2a, 0x34, 0x36, 0x2c, 0x37, 0x3a, 0x2b, 0x34, 0x39, 0x2d, 0x35, 0x3a,
+ 0x2a, 0x34, 0x36, 0x2b, 0x34, 0x3b, 0x2e, 0x36, 0x40, 0x31, 0x36, 0x3d,
+ 0x33, 0x38, 0x3b, 0x30, 0x38, 0x37, 0x3e, 0x47, 0x4b, 0x44, 0x4b, 0x52,
+ 0x3b, 0x43, 0x46, 0x3b, 0x44, 0x46, 0x3a, 0x44, 0x48, 0x39, 0x42, 0x49,
+ 0x38, 0x42, 0x4b, 0x37, 0x41, 0x4a, 0x3b, 0x45, 0x4e, 0x3f, 0x49, 0x52,
+ 0x3b, 0x48, 0x4f, 0x3e, 0x4b, 0x51, 0x45, 0x50, 0x56, 0x4b, 0x56, 0x5c,
+ 0x53, 0x5c, 0x61, 0x5b, 0x64, 0x69, 0x64, 0x6c, 0x71, 0x68, 0x70, 0x73,
+ 0x67, 0x70, 0x75, 0x67, 0x6e, 0x74, 0x67, 0x6e, 0x72, 0x65, 0x6d, 0x70,
+ 0x65, 0x6a, 0x6e, 0x62, 0x69, 0x6f, 0x5f, 0x66, 0x6c, 0x59, 0x60, 0x68,
+ 0x51, 0x58, 0x5e, 0x45, 0x4e, 0x55, 0x3b, 0x46, 0x4e, 0x35, 0x41, 0x4e,
+ 0x33, 0x40, 0x4b, 0x5c, 0x6a, 0x69, 0xc1, 0xd0, 0xce, 0xc2, 0xce, 0xd9,
+ 0xbd, 0xc7, 0xd1, 0xb9, 0xc3, 0xcd, 0xb7, 0xc4, 0xcd, 0xb7, 0xc3, 0xcf,
+ 0xb7, 0xc3, 0xcf, 0xb7, 0xc3, 0xd0, 0xb6, 0xc1, 0xd0, 0xb7, 0xc3, 0xd3,
+ 0xb8, 0xc4, 0xd2, 0xb7, 0xc3, 0xd3, 0xb7, 0xc4, 0xd4, 0xb9, 0xc6, 0xd6,
+ 0xba, 0xc7, 0xd7, 0xbb, 0xc9, 0xd8, 0xb9, 0xc9, 0xd8, 0xb9, 0xc9, 0xd6,
+ 0xbe, 0xcb, 0xd8, 0xbe, 0xcd, 0xda, 0xbc, 0xcc, 0xdb, 0xbc, 0xcc, 0xdb,
+ 0xbe, 0xcc, 0xdb, 0xbd, 0xc7, 0xd7, 0xac, 0xaf, 0xc1, 0x9a, 0x9a, 0xab,
+ 0x91, 0x8f, 0x95, 0x91, 0x91, 0x93, 0x91, 0x95, 0x94, 0x93, 0x98, 0x96,
+ 0x99, 0x9b, 0x9a, 0xa0, 0xa2, 0xa3, 0xa6, 0xaa, 0xaf, 0xae, 0xb3, 0xba,
+ 0x15, 0x17, 0x16, 0x15, 0x17, 0x16, 0x15, 0x17, 0x16, 0x18, 0x1a, 0x19,
+ 0x17, 0x18, 0x18, 0x17, 0x19, 0x18, 0x16, 0x18, 0x17, 0x1b, 0x1d, 0x1c,
+ 0x22, 0x24, 0x22, 0x1b, 0x1d, 0x1a, 0x17, 0x19, 0x16, 0x26, 0x26, 0x24,
+ 0x22, 0x22, 0x20, 0x27, 0x27, 0x27, 0x1f, 0x1f, 0x1e, 0x13, 0x13, 0x13,
+ 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x04,
+ 0x03, 0x03, 0x03, 0x05, 0x05, 0x04, 0x06, 0x06, 0x06, 0x03, 0x03, 0x04,
+ 0x04, 0x04, 0x04, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x08, 0x07, 0x13, 0x13, 0x11, 0x29, 0x2b, 0x28, 0x36, 0x3b, 0x37,
+ 0x4a, 0x50, 0x4e, 0x52, 0x58, 0x56, 0x4c, 0x52, 0x52, 0x35, 0x3b, 0x3d,
+ 0x1f, 0x25, 0x21, 0x1c, 0x21, 0x1c, 0x21, 0x25, 0x1f, 0x41, 0x44, 0x3b,
+ 0x51, 0x54, 0x49, 0x3e, 0x40, 0x36, 0x2e, 0x2e, 0x26, 0x2b, 0x2b, 0x23,
+ 0x23, 0x22, 0x20, 0x1d, 0x1c, 0x1a, 0x1c, 0x1a, 0x18, 0x23, 0x23, 0x21,
+ 0x19, 0x1b, 0x1a, 0x0a, 0x0e, 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x0e, 0x0f,
+ 0x0c, 0x0e, 0x0d, 0x15, 0x17, 0x16, 0x1f, 0x21, 0x20, 0x26, 0x28, 0x28,
+ 0x2b, 0x2c, 0x2e, 0x33, 0x34, 0x36, 0x2c, 0x30, 0x31, 0x2f, 0x33, 0x34,
+ 0x36, 0x39, 0x3a, 0x2b, 0x2e, 0x2d, 0x27, 0x29, 0x28, 0x29, 0x29, 0x27,
+ 0x23, 0x23, 0x21, 0x1b, 0x1b, 0x19, 0x12, 0x12, 0x12, 0x0e, 0x0e, 0x0d,
+ 0x0b, 0x0a, 0x06, 0x10, 0x0f, 0x0c, 0x15, 0x12, 0x11, 0x18, 0x14, 0x16,
+ 0x20, 0x1b, 0x1b, 0x28, 0x22, 0x21, 0x42, 0x3d, 0x39, 0x73, 0x6e, 0x6a,
+ 0x66, 0x5b, 0x59, 0x5a, 0x50, 0x4d, 0x5d, 0x54, 0x50, 0x60, 0x55, 0x51,
+ 0x5d, 0x4d, 0x4d, 0x4f, 0x3f, 0x3f, 0x42, 0x32, 0x33, 0x3a, 0x2d, 0x2d,
+ 0x3c, 0x2d, 0x2d, 0x37, 0x2a, 0x2a, 0x33, 0x29, 0x28, 0x2d, 0x23, 0x22,
+ 0x2f, 0x24, 0x22, 0x2d, 0x23, 0x21, 0x25, 0x20, 0x1d, 0x67, 0x65, 0x64,
+ 0x6f, 0x70, 0x74, 0x63, 0x64, 0x6a, 0x59, 0x5a, 0x5f, 0x4c, 0x4d, 0x52,
+ 0x39, 0x3a, 0x3f, 0x30, 0x31, 0x36, 0x2e, 0x2f, 0x34, 0x24, 0x26, 0x2a,
+ 0x1c, 0x20, 0x21, 0x17, 0x17, 0x17, 0x24, 0x20, 0x20, 0x30, 0x25, 0x25,
+ 0x36, 0x28, 0x25, 0x57, 0x4b, 0x41, 0x72, 0x66, 0x58, 0x69, 0x5d, 0x4d,
+ 0x4c, 0x3c, 0x33, 0x42, 0x33, 0x2c, 0x63, 0x58, 0x45, 0x9f, 0x9a, 0x7e,
+ 0x8f, 0x88, 0x76, 0x7c, 0x77, 0x63, 0x8c, 0x87, 0x6b, 0x8d, 0x87, 0x71,
+ 0x8c, 0x85, 0x75, 0x92, 0x8b, 0x7f, 0x93, 0x8f, 0x85, 0x88, 0x84, 0x7b,
+ 0x87, 0x83, 0x78, 0x90, 0x8c, 0x81, 0xb1, 0xaf, 0xa3, 0xa6, 0xa6, 0x9c,
+ 0x9c, 0x99, 0x94, 0x8e, 0x8b, 0x84, 0x91, 0x8e, 0x83, 0x92, 0x8e, 0x85,
+ 0x82, 0x7d, 0x77, 0x87, 0x81, 0x7b, 0x98, 0x91, 0x89, 0x96, 0x8f, 0x84,
+ 0x9c, 0x97, 0x8a, 0x9f, 0x9b, 0x96, 0x66, 0x63, 0x68, 0x40, 0x3b, 0x45,
+ 0x2e, 0x26, 0x2f, 0x2e, 0x23, 0x29, 0x35, 0x2b, 0x2b, 0x34, 0x2c, 0x28,
+ 0x61, 0x5f, 0x41, 0x97, 0x97, 0x75, 0xc4, 0xc4, 0xa3, 0xcf, 0xcf, 0xb3,
+ 0xcc, 0xcb, 0xb8, 0xd2, 0xd2, 0xc5, 0x8e, 0x8e, 0x82, 0x76, 0x76, 0x6a,
+ 0xbb, 0xb9, 0xa8, 0xb9, 0xb6, 0xa4, 0xa7, 0xa4, 0x92, 0xc7, 0xc6, 0xb2,
+ 0xcd, 0xcd, 0xb9, 0xc9, 0xc9, 0xb7, 0xc2, 0xc0, 0xb1, 0xc5, 0xc4, 0xb7,
+ 0x87, 0x88, 0x82, 0x7e, 0x7e, 0x79, 0x6e, 0x6c, 0x67, 0x8b, 0x84, 0x82,
+ 0x5b, 0x51, 0x52, 0x57, 0x4b, 0x4d, 0x81, 0x76, 0x74, 0x85, 0x78, 0x73,
+ 0x74, 0x69, 0x6d, 0x66, 0x59, 0x63, 0x68, 0x5a, 0x5c, 0x92, 0x8a, 0x7c,
+ 0x9f, 0x9d, 0x88, 0x99, 0x99, 0x8b, 0xa2, 0xa2, 0x99, 0xc2, 0xc2, 0xb9,
+ 0xde, 0xde, 0xde, 0xc6, 0xc7, 0xc9, 0xe8, 0xe8, 0xec, 0xad, 0xae, 0xb2,
+ 0xca, 0xcb, 0xcf, 0xdd, 0xde, 0xe0, 0xc5, 0xc7, 0xc5, 0xc9, 0xcb, 0xc8,
+ 0xbc, 0xbe, 0xbd, 0xb5, 0xb7, 0xb7, 0xbb, 0xbd, 0xba, 0xc3, 0xc5, 0xc2,
+ 0xbe, 0xbe, 0xbb, 0xb4, 0xb4, 0xb4, 0xa4, 0xa2, 0xa7, 0xa4, 0xa2, 0xa7,
+ 0x9f, 0x9f, 0xa5, 0x8f, 0x8f, 0x9b, 0x77, 0x74, 0x87, 0x60, 0x56, 0x6c,
+ 0x47, 0x3a, 0x49, 0x3c, 0x2f, 0x38, 0x41, 0x38, 0x3d, 0x38, 0x32, 0x37,
+ 0x3b, 0x39, 0x43, 0x36, 0x39, 0x43, 0x33, 0x3a, 0x43, 0x31, 0x3a, 0x43,
+ 0x2d, 0x34, 0x3e, 0x20, 0x27, 0x31, 0x15, 0x1e, 0x25, 0x15, 0x1e, 0x25,
+ 0x19, 0x20, 0x2a, 0x15, 0x1d, 0x26, 0x15, 0x1c, 0x23, 0x16, 0x1d, 0x23,
+ 0x12, 0x1b, 0x20, 0x11, 0x1b, 0x1d, 0x25, 0x2f, 0x31, 0x31, 0x3b, 0x3c,
+ 0x2b, 0x36, 0x3c, 0x29, 0x33, 0x3d, 0x25, 0x2d, 0x38, 0x1a, 0x21, 0x2b,
+ 0x15, 0x1c, 0x24, 0x31, 0x38, 0x3d, 0x1d, 0x23, 0x29, 0x13, 0x1a, 0x20,
+ 0x22, 0x26, 0x29, 0x34, 0x37, 0x3c, 0x23, 0x26, 0x2f, 0x20, 0x23, 0x2a,
+ 0x1e, 0x22, 0x25, 0x21, 0x25, 0x27, 0x24, 0x27, 0x2a, 0x25, 0x28, 0x2d,
+ 0x28, 0x2d, 0x30, 0x29, 0x2d, 0x30, 0x28, 0x2c, 0x2f, 0x29, 0x30, 0x33,
+ 0x2a, 0x34, 0x36, 0x2d, 0x37, 0x3b, 0x2e, 0x37, 0x3c, 0x2e, 0x35, 0x3b,
+ 0x2c, 0x34, 0x39, 0x2f, 0x37, 0x3d, 0x2e, 0x36, 0x3d, 0x30, 0x37, 0x3d,
+ 0x31, 0x38, 0x3a, 0x30, 0x39, 0x3a, 0x34, 0x3c, 0x40, 0x39, 0x42, 0x46,
+ 0x3f, 0x49, 0x49, 0x3c, 0x46, 0x45, 0x3c, 0x46, 0x49, 0x3c, 0x45, 0x4c,
+ 0x38, 0x42, 0x4b, 0x37, 0x41, 0x4b, 0x3c, 0x46, 0x51, 0x3c, 0x46, 0x51,
+ 0x3b, 0x47, 0x4e, 0x3e, 0x49, 0x4f, 0x41, 0x4c, 0x52, 0x46, 0x51, 0x56,
+ 0x52, 0x5b, 0x60, 0x59, 0x63, 0x67, 0x5d, 0x67, 0x69, 0x63, 0x6c, 0x6e,
+ 0x63, 0x6c, 0x70, 0x64, 0x6b, 0x71, 0x64, 0x6c, 0x6f, 0x65, 0x6c, 0x6f,
+ 0x63, 0x68, 0x6c, 0x5e, 0x65, 0x6b, 0x5b, 0x62, 0x68, 0x52, 0x59, 0x61,
+ 0x46, 0x4f, 0x54, 0x40, 0x4c, 0x4c, 0x3f, 0x4d, 0x56, 0x34, 0x44, 0x56,
+ 0x29, 0x3a, 0x42, 0x7a, 0x8b, 0x8a, 0xcc, 0xd9, 0xdd, 0xc1, 0xc9, 0xd3,
+ 0xbc, 0xc6, 0xd0, 0xb9, 0xc3, 0xcd, 0xb8, 0xc2, 0xce, 0xb5, 0xc1, 0xcd,
+ 0xb5, 0xc1, 0xcf, 0xb7, 0xc3, 0xd1, 0xb5, 0xc3, 0xd1, 0xb4, 0xc1, 0xd1,
+ 0xb7, 0xc3, 0xd2, 0xb9, 0xc5, 0xd5, 0xb9, 0xc5, 0xd5, 0xb8, 0xc5, 0xd5,
+ 0xb9, 0xc6, 0xd6, 0xbc, 0xc9, 0xd9, 0xba, 0xc8, 0xd7, 0xba, 0xca, 0xd7,
+ 0xbd, 0xcb, 0xd8, 0xbd, 0xcc, 0xdb, 0xbc, 0xcc, 0xdb, 0xbc, 0xcc, 0xdc,
+ 0xbf, 0xcd, 0xdc, 0xb7, 0xbf, 0xce, 0xa3, 0xa4, 0xb4, 0x95, 0x94, 0xa4,
+ 0x91, 0x8f, 0x92, 0x90, 0x90, 0x92, 0x92, 0x96, 0x95, 0x95, 0x9a, 0x96,
+ 0x9b, 0x9e, 0x9d, 0xa1, 0xa4, 0xa6, 0xa9, 0xae, 0xb2, 0xb3, 0xb9, 0xc0,
+ 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x19, 0x19, 0x19,
+ 0x19, 0x19, 0x19, 0x17, 0x17, 0x17, 0x1a, 0x1a, 0x1a, 0x19, 0x19, 0x19,
+ 0x1a, 0x1c, 0x19, 0x19, 0x1b, 0x18, 0x1b, 0x1d, 0x1a, 0x22, 0x24, 0x21,
+ 0x24, 0x24, 0x24, 0x1b, 0x1b, 0x1c, 0x14, 0x14, 0x14, 0x0d, 0x0d, 0x0d,
+ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x04, 0x04, 0x04, 0x05, 0x05, 0x06,
+ 0x06, 0x06, 0x05, 0x06, 0x06, 0x04, 0x1d, 0x1d, 0x19, 0x2e, 0x2f, 0x29,
+ 0x0f, 0x0f, 0x0d, 0x04, 0x04, 0x03, 0x06, 0x06, 0x06, 0x04, 0x04, 0x05,
+ 0x05, 0x05, 0x05, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x0d, 0x0d, 0x0c,
+ 0x0f, 0x10, 0x0d, 0x0e, 0x0e, 0x0c, 0x14, 0x16, 0x13, 0x28, 0x2d, 0x29,
+ 0x45, 0x4a, 0x46, 0x45, 0x49, 0x48, 0x29, 0x2d, 0x2c, 0x16, 0x1a, 0x1a,
+ 0x19, 0x1e, 0x1c, 0x24, 0x28, 0x24, 0x22, 0x24, 0x1f, 0x2e, 0x2f, 0x29,
+ 0x35, 0x36, 0x2e, 0x2c, 0x2c, 0x24, 0x2b, 0x2b, 0x23, 0x2c, 0x2c, 0x24,
+ 0x27, 0x26, 0x23, 0x26, 0x22, 0x1f, 0x24, 0x20, 0x1d, 0x22, 0x22, 0x20,
+ 0x1a, 0x1c, 0x19, 0x0b, 0x0e, 0x0d, 0x0c, 0x0e, 0x0d, 0x11, 0x11, 0x11,
+ 0x0d, 0x0f, 0x0e, 0x0f, 0x11, 0x11, 0x11, 0x13, 0x12, 0x19, 0x1b, 0x1b,
+ 0x27, 0x28, 0x29, 0x2d, 0x2e, 0x30, 0x39, 0x3a, 0x3c, 0x2d, 0x2f, 0x30,
+ 0x2c, 0x30, 0x31, 0x33, 0x37, 0x38, 0x33, 0x35, 0x34, 0x2e, 0x2e, 0x2e,
+ 0x2f, 0x2f, 0x2d, 0x2e, 0x2e, 0x2c, 0x1f, 0x1f, 0x1d, 0x12, 0x12, 0x12,
+ 0x08, 0x09, 0x04, 0x0c, 0x0c, 0x09, 0x0d, 0x0c, 0x0a, 0x13, 0x0f, 0x0e,
+ 0x18, 0x14, 0x11, 0x21, 0x1c, 0x18, 0x26, 0x1f, 0x1a, 0x42, 0x3b, 0x36,
+ 0x67, 0x5d, 0x5a, 0x5e, 0x54, 0x52, 0x51, 0x48, 0x45, 0x48, 0x3d, 0x3b,
+ 0x43, 0x35, 0x34, 0x3d, 0x2d, 0x2e, 0x38, 0x29, 0x2c, 0x31, 0x27, 0x28,
+ 0x30, 0x25, 0x24, 0x2d, 0x23, 0x24, 0x2d, 0x22, 0x24, 0x2a, 0x20, 0x1f,
+ 0x27, 0x1d, 0x1b, 0x27, 0x1d, 0x1a, 0x1f, 0x17, 0x17, 0x49, 0x43, 0x45,
+ 0x64, 0x64, 0x68, 0x54, 0x53, 0x5a, 0x46, 0x46, 0x4b, 0x3c, 0x3b, 0x41,
+ 0x34, 0x34, 0x39, 0x2f, 0x2f, 0x35, 0x29, 0x2a, 0x2f, 0x21, 0x22, 0x26,
+ 0x1a, 0x1e, 0x1d, 0x19, 0x1a, 0x19, 0x2e, 0x2a, 0x29, 0x2e, 0x24, 0x22,
+ 0x30, 0x22, 0x1f, 0x48, 0x38, 0x31, 0x63, 0x52, 0x48, 0x5d, 0x4d, 0x40,
+ 0x4e, 0x3d, 0x34, 0x3b, 0x2c, 0x27, 0x54, 0x4a, 0x3c, 0x8f, 0x89, 0x73,
+ 0x96, 0x90, 0x82, 0x88, 0x82, 0x70, 0x8e, 0x8a, 0x6f, 0x8a, 0x84, 0x6f,
+ 0x81, 0x7c, 0x6b, 0xae, 0xab, 0x9e, 0xb7, 0xb5, 0xa9, 0xa6, 0xa4, 0x98,
+ 0x99, 0x95, 0x89, 0x8c, 0x88, 0x7c, 0x8a, 0x88, 0x7c, 0x87, 0x87, 0x7d,
+ 0x99, 0x98, 0x91, 0xb1, 0xb1, 0xa9, 0xa0, 0x9f, 0x95, 0xa7, 0xa4, 0x9b,
+ 0xb2, 0xae, 0xa5, 0xaa, 0xa6, 0x9d, 0x9b, 0x94, 0x8c, 0x90, 0x89, 0x7f,
+ 0x91, 0x8d, 0x81, 0x92, 0x92, 0x8c, 0x82, 0x83, 0x87, 0x76, 0x79, 0x82,
+ 0x55, 0x54, 0x5e, 0x3a, 0x35, 0x3d, 0x33, 0x2c, 0x33, 0x2f, 0x27, 0x2b,
+ 0x57, 0x52, 0x3c, 0x6a, 0x66, 0x48, 0x83, 0x80, 0x5f, 0xb8, 0xb7, 0x97,
+ 0xcf, 0xcd, 0xb4, 0xd1, 0xd0, 0xbc, 0xac, 0xac, 0x9c, 0xb9, 0xba, 0xac,
+ 0xd4, 0xd1, 0xc4, 0xa3, 0xa1, 0x92, 0x5e, 0x5c, 0x4d, 0x8d, 0x8c, 0x7a,
+ 0xbd, 0xbc, 0xaa, 0xcd, 0xcd, 0xbb, 0xca, 0xcb, 0xb8, 0xce, 0xcf, 0xbd,
+ 0xc8, 0xc9, 0xc2, 0xad, 0xad, 0xa7, 0xb4, 0xae, 0xaa, 0x94, 0x8c, 0x8c,
+ 0x4b, 0x40, 0x44, 0x6b, 0x5f, 0x64, 0x89, 0x7d, 0x7c, 0x83, 0x78, 0x75,
+ 0x7e, 0x74, 0x79, 0x6c, 0x61, 0x6a, 0x72, 0x66, 0x68, 0x9d, 0x95, 0x88,
+ 0xa5, 0xa3, 0x8e, 0xa5, 0xa6, 0x99, 0xae, 0xad, 0xa8, 0xc0, 0xc0, 0xb9,
+ 0xdc, 0xdc, 0xde, 0xc4, 0xc5, 0xc7, 0xe7, 0xe8, 0xeb, 0xc5, 0xc6, 0xca,
+ 0xb7, 0xb8, 0xbc, 0xc6, 0xc7, 0xc9, 0xbb, 0xbd, 0xbc, 0xac, 0xae, 0xad,
+ 0xab, 0xaf, 0xad, 0xb5, 0xb7, 0xb6, 0xba, 0xbc, 0xb9, 0xb4, 0xb6, 0xb1,
+ 0xbb, 0xbc, 0xb7, 0xb6, 0xb5, 0xb2, 0xaa, 0xa9, 0xa7, 0xa1, 0x9e, 0x9c,
+ 0xa3, 0xa4, 0xa2, 0x9a, 0x9b, 0xa2, 0x7f, 0x7c, 0x8d, 0x6c, 0x63, 0x79,
+ 0x4e, 0x42, 0x52, 0x3a, 0x2c, 0x35, 0x3e, 0x33, 0x36, 0x45, 0x3d, 0x3e,
+ 0x3c, 0x3a, 0x42, 0x39, 0x3a, 0x44, 0x32, 0x39, 0x43, 0x2d, 0x36, 0x3f,
+ 0x23, 0x29, 0x35, 0x17, 0x1e, 0x28, 0x13, 0x1a, 0x24, 0x11, 0x19, 0x23,
+ 0x11, 0x19, 0x24, 0x11, 0x19, 0x24, 0x10, 0x19, 0x22, 0x12, 0x1b, 0x24,
+ 0x12, 0x1b, 0x22, 0x1b, 0x24, 0x29, 0x38, 0x42, 0x44, 0x3d, 0x48, 0x49,
+ 0x38, 0x44, 0x4c, 0x24, 0x2e, 0x39, 0x2b, 0x35, 0x41, 0x32, 0x3b, 0x46,
+ 0x1a, 0x23, 0x2c, 0x35, 0x3d, 0x45, 0x20, 0x27, 0x2f, 0x16, 0x1d, 0x26,
+ 0x1e, 0x21, 0x26, 0x2f, 0x32, 0x37, 0x2c, 0x2f, 0x35, 0x1d, 0x21, 0x26,
+ 0x1e, 0x22, 0x25, 0x22, 0x26, 0x29, 0x24, 0x28, 0x2b, 0x26, 0x2a, 0x2d,
+ 0x27, 0x2c, 0x2f, 0x29, 0x2d, 0x30, 0x2a, 0x2d, 0x32, 0x2c, 0x31, 0x35,
+ 0x2b, 0x34, 0x39, 0x2b, 0x36, 0x3a, 0x2d, 0x36, 0x3b, 0x30, 0x38, 0x3d,
+ 0x2d, 0x38, 0x3c, 0x2f, 0x39, 0x3e, 0x2f, 0x38, 0x3d, 0x30, 0x38, 0x3b,
+ 0x30, 0x38, 0x3a, 0x31, 0x39, 0x3b, 0x31, 0x3b, 0x3d, 0x35, 0x3e, 0x42,
+ 0x39, 0x43, 0x45, 0x3c, 0x46, 0x47, 0x3d, 0x47, 0x49, 0x3e, 0x47, 0x4c,
+ 0x3c, 0x45, 0x4c, 0x38, 0x41, 0x4a, 0x3a, 0x44, 0x4e, 0x3c, 0x46, 0x50,
+ 0x3e, 0x49, 0x4f, 0x40, 0x4b, 0x51, 0x40, 0x4c, 0x51, 0x45, 0x50, 0x55,
+ 0x51, 0x5a, 0x5f, 0x5a, 0x64, 0x67, 0x5e, 0x68, 0x6a, 0x5f, 0x69, 0x6b,
+ 0x60, 0x6a, 0x6c, 0x62, 0x6a, 0x6e, 0x61, 0x69, 0x6c, 0x62, 0x69, 0x6c,
+ 0x5e, 0x63, 0x67, 0x57, 0x5e, 0x64, 0x53, 0x59, 0x60, 0x49, 0x50, 0x56,
+ 0x41, 0x4a, 0x4e, 0x47, 0x56, 0x52, 0x53, 0x64, 0x6d, 0x30, 0x42, 0x58,
+ 0x33, 0x48, 0x4e, 0xb0, 0xc3, 0xc2, 0xc7, 0xd2, 0xda, 0xc0, 0xc7, 0xcf,
+ 0xba, 0xc2, 0xcc, 0xb9, 0xc2, 0xcc, 0xb6, 0xc0, 0xcc, 0xb5, 0xbf, 0xcb,
+ 0xb5, 0xc1, 0xce, 0xb5, 0xc3, 0xd0, 0xb4, 0xc2, 0xd1, 0xb4, 0xc1, 0xd1,
+ 0xb5, 0xc1, 0xcf, 0xb8, 0xc4, 0xd4, 0xba, 0xc6, 0xd6, 0xb9, 0xc6, 0xd6,
+ 0xb9, 0xc6, 0xd6, 0xbb, 0xc8, 0xd8, 0xba, 0xc7, 0xd6, 0xbb, 0xc9, 0xd6,
+ 0xbb, 0xcb, 0xd9, 0xb9, 0xca, 0xd9, 0xb9, 0xca, 0xda, 0xbc, 0xcc, 0xdc,
+ 0xbd, 0xc8, 0xd9, 0xae, 0xb3, 0xc3, 0x9c, 0x9c, 0xaa, 0x91, 0x8f, 0x9b,
+ 0x8f, 0x8e, 0x91, 0x91, 0x93, 0x92, 0x93, 0x98, 0x94, 0x97, 0x9c, 0x97,
+ 0x9c, 0xa1, 0x9f, 0xa4, 0xa8, 0xab, 0xac, 0xb3, 0xb7, 0xb4, 0xbd, 0xc2,
+ 0x15, 0x15, 0x15, 0x14, 0x15, 0x15, 0x13, 0x14, 0x14, 0x16, 0x16, 0x16,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1e, 0x1e, 0x1e, 0x25, 0x25, 0x25,
+ 0x15, 0x16, 0x14, 0x16, 0x18, 0x15, 0x1e, 0x20, 0x1d, 0x2b, 0x2c, 0x2b,
+ 0x16, 0x16, 0x16, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x04, 0x05, 0x02, 0x0a, 0x0a, 0x06, 0x49, 0x4a, 0x45, 0x61, 0x62, 0x5c,
+ 0x24, 0x24, 0x22, 0x06, 0x06, 0x05, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x14, 0x14, 0x14,
+ 0x12, 0x12, 0x11, 0x14, 0x14, 0x12, 0x12, 0x14, 0x11, 0x13, 0x15, 0x12,
+ 0x27, 0x2c, 0x28, 0x29, 0x2b, 0x2a, 0x13, 0x14, 0x14, 0x10, 0x12, 0x11,
+ 0x13, 0x17, 0x18, 0x1c, 0x20, 0x1f, 0x18, 0x1a, 0x19, 0x11, 0x11, 0x0f,
+ 0x11, 0x10, 0x0c, 0x1e, 0x1d, 0x18, 0x2b, 0x2a, 0x25, 0x2c, 0x2b, 0x26,
+ 0x27, 0x26, 0x21, 0x31, 0x2d, 0x2a, 0x3b, 0x37, 0x34, 0x2e, 0x2e, 0x2c,
+ 0x15, 0x1a, 0x16, 0x0d, 0x12, 0x10, 0x0b, 0x0f, 0x0e, 0x0e, 0x0f, 0x10,
+ 0x0f, 0x10, 0x12, 0x0f, 0x10, 0x12, 0x0f, 0x10, 0x12, 0x0d, 0x0e, 0x10,
+ 0x16, 0x18, 0x18, 0x23, 0x25, 0x24, 0x2f, 0x31, 0x30, 0x2b, 0x2d, 0x2c,
+ 0x28, 0x2c, 0x2d, 0x2a, 0x2e, 0x2f, 0x2a, 0x2c, 0x2b, 0x2a, 0x2a, 0x2a,
+ 0x2d, 0x2d, 0x2b, 0x32, 0x32, 0x30, 0x25, 0x25, 0x23, 0x15, 0x16, 0x15,
+ 0x06, 0x09, 0x09, 0x06, 0x09, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0a, 0x08,
+ 0x10, 0x0f, 0x0c, 0x18, 0x14, 0x12, 0x19, 0x15, 0x12, 0x21, 0x1c, 0x18,
+ 0x34, 0x2c, 0x2a, 0x47, 0x3f, 0x3d, 0x41, 0x3c, 0x39, 0x33, 0x2c, 0x2a,
+ 0x30, 0x23, 0x25, 0x34, 0x28, 0x2c, 0x3b, 0x30, 0x34, 0x37, 0x2e, 0x32,
+ 0x32, 0x2d, 0x2b, 0x2e, 0x26, 0x27, 0x2c, 0x21, 0x25, 0x2a, 0x20, 0x21,
+ 0x24, 0x1c, 0x1a, 0x23, 0x1e, 0x1b, 0x1d, 0x18, 0x17, 0x30, 0x2a, 0x2e,
+ 0x52, 0x51, 0x56, 0x45, 0x44, 0x49, 0x3f, 0x3e, 0x44, 0x37, 0x36, 0x3c,
+ 0x34, 0x33, 0x39, 0x2d, 0x2e, 0x33, 0x20, 0x21, 0x25, 0x14, 0x16, 0x19,
+ 0x14, 0x18, 0x19, 0x18, 0x18, 0x18, 0x2c, 0x28, 0x27, 0x2d, 0x24, 0x23,
+ 0x31, 0x23, 0x22, 0x38, 0x29, 0x24, 0x50, 0x3f, 0x37, 0x4e, 0x3c, 0x32,
+ 0x4b, 0x3c, 0x34, 0x3a, 0x2c, 0x2c, 0x3d, 0x34, 0x2d, 0x75, 0x6e, 0x63,
+ 0xa9, 0xa4, 0x9c, 0x8c, 0x86, 0x78, 0x87, 0x81, 0x6a, 0x8c, 0x85, 0x73,
+ 0x87, 0x80, 0x6e, 0xb5, 0xb2, 0xa1, 0xaa, 0xa9, 0x99, 0x9c, 0x9c, 0x8c,
+ 0xab, 0xa9, 0x97, 0xaa, 0xa7, 0x96, 0xa2, 0x9f, 0x90, 0x8e, 0x8c, 0x81,
+ 0xb6, 0xb7, 0xad, 0xbb, 0xbd, 0xb2, 0xa1, 0xa3, 0x98, 0xb5, 0xb5, 0xab,
+ 0xb2, 0xb1, 0xa5, 0xd9, 0xd7, 0xcd, 0xb5, 0xb2, 0xab, 0x8b, 0x87, 0x82,
+ 0x98, 0x97, 0x8e, 0x91, 0x95, 0x91, 0x82, 0x8b, 0x8f, 0x88, 0x92, 0x9b,
+ 0x88, 0x8f, 0x99, 0x71, 0x71, 0x7b, 0x51, 0x4f, 0x58, 0x2f, 0x2d, 0x34,
+ 0x4f, 0x4a, 0x3b, 0x6a, 0x64, 0x4d, 0x6e, 0x69, 0x4d, 0x75, 0x70, 0x51,
+ 0xa2, 0x9f, 0x82, 0xc9, 0xc8, 0xae, 0xcd, 0xcc, 0xb7, 0xca, 0xc9, 0xb5,
+ 0xc6, 0xc6, 0xb8, 0x89, 0x8a, 0x7c, 0x87, 0x88, 0x79, 0x88, 0x89, 0x7b,
+ 0x78, 0x79, 0x6b, 0xa6, 0xa8, 0x98, 0xc6, 0xc9, 0xb6, 0xc9, 0xcc, 0xba,
+ 0xcb, 0xce, 0xc0, 0xce, 0xce, 0xc4, 0xd2, 0xcc, 0xc8, 0x6f, 0x66, 0x69,
+ 0x51, 0x47, 0x51, 0x78, 0x6e, 0x79, 0x85, 0x7b, 0x84, 0x7d, 0x77, 0x7b,
+ 0x82, 0x7f, 0x86, 0x81, 0x78, 0x86, 0x8d, 0x80, 0x85, 0x9e, 0x94, 0x87,
+ 0xa3, 0x9e, 0x8a, 0xb0, 0xad, 0xa2, 0xb6, 0xb5, 0xb1, 0xb8, 0xb7, 0xb2,
+ 0xbd, 0xbe, 0xb9, 0xbf, 0xc1, 0xbb, 0xc2, 0xc2, 0xc2, 0xd4, 0xd5, 0xd7,
+ 0xb6, 0xb7, 0xb9, 0xb8, 0xb9, 0xbb, 0xbb, 0xbc, 0xbe, 0xb3, 0xb5, 0xb6,
+ 0xb4, 0xb7, 0xb5, 0xb5, 0xb7, 0xb4, 0xae, 0xb0, 0xad, 0xae, 0xaf, 0xaa,
+ 0xbb, 0xbc, 0xb7, 0xb6, 0xb5, 0xb1, 0xae, 0xac, 0xa9, 0xa9, 0xa5, 0xa2,
+ 0xb4, 0xb5, 0xae, 0xa7, 0xa7, 0xaa, 0x8a, 0x87, 0x98, 0x57, 0x50, 0x65,
+ 0x42, 0x36, 0x48, 0x3e, 0x31, 0x3a, 0x38, 0x2d, 0x30, 0x43, 0x3a, 0x3b,
+ 0x3c, 0x39, 0x40, 0x3a, 0x3a, 0x42, 0x32, 0x36, 0x3f, 0x2b, 0x31, 0x3d,
+ 0x20, 0x26, 0x32, 0x13, 0x19, 0x25, 0x14, 0x1b, 0x25, 0x12, 0x1b, 0x24,
+ 0x10, 0x18, 0x23, 0x12, 0x1a, 0x25, 0x10, 0x18, 0x23, 0x0f, 0x17, 0x22,
+ 0x14, 0x1e, 0x27, 0x30, 0x3b, 0x3f, 0x3a, 0x45, 0x47, 0x3c, 0x46, 0x49,
+ 0x32, 0x3e, 0x48, 0x1c, 0x27, 0x33, 0x30, 0x3a, 0x46, 0x37, 0x41, 0x4d,
+ 0x16, 0x20, 0x29, 0x36, 0x3f, 0x47, 0x28, 0x31, 0x3a, 0x16, 0x1c, 0x29,
+ 0x1c, 0x1f, 0x27, 0x29, 0x2c, 0x31, 0x38, 0x3c, 0x3f, 0x25, 0x29, 0x2c,
+ 0x20, 0x24, 0x27, 0x20, 0x24, 0x27, 0x23, 0x27, 0x2a, 0x27, 0x2b, 0x2e,
+ 0x28, 0x2d, 0x30, 0x2a, 0x2e, 0x31, 0x2c, 0x2f, 0x34, 0x2e, 0x33, 0x39,
+ 0x2d, 0x35, 0x3b, 0x2c, 0x36, 0x3a, 0x2b, 0x34, 0x39, 0x2f, 0x36, 0x3c,
+ 0x2c, 0x37, 0x3b, 0x2c, 0x36, 0x38, 0x2d, 0x36, 0x37, 0x2f, 0x37, 0x39,
+ 0x30, 0x38, 0x3b, 0x31, 0x3a, 0x3d, 0x32, 0x3c, 0x3e, 0x3d, 0x47, 0x49,
+ 0x3e, 0x47, 0x4d, 0x38, 0x41, 0x48, 0x3d, 0x44, 0x4b, 0x3e, 0x45, 0x4c,
+ 0x3a, 0x42, 0x49, 0x39, 0x42, 0x47, 0x39, 0x44, 0x4a, 0x39, 0x45, 0x4b,
+ 0x3c, 0x48, 0x4e, 0x3e, 0x49, 0x4f, 0x42, 0x4e, 0x53, 0x48, 0x53, 0x58,
+ 0x50, 0x5a, 0x5e, 0x59, 0x63, 0x66, 0x5b, 0x65, 0x67, 0x5a, 0x64, 0x66,
+ 0x5c, 0x65, 0x68, 0x60, 0x68, 0x6a, 0x5e, 0x66, 0x69, 0x5b, 0x62, 0x67,
+ 0x5a, 0x5f, 0x65, 0x53, 0x59, 0x5f, 0x4a, 0x51, 0x57, 0x40, 0x48, 0x4e,
+ 0x3d, 0x46, 0x4a, 0x58, 0x67, 0x61, 0x5d, 0x6e, 0x76, 0x2a, 0x3c, 0x4f,
+ 0x5e, 0x72, 0x78, 0xc8, 0xd8, 0xd9, 0xc2, 0xcb, 0xd3, 0xbc, 0xc3, 0xcd,
+ 0xba, 0xc2, 0xcd, 0xb8, 0xc0, 0xcb, 0xb6, 0xc0, 0xcc, 0xb6, 0xc0, 0xcc,
+ 0xb5, 0xc1, 0xcf, 0xb5, 0xc2, 0xd0, 0xb5, 0xc2, 0xd2, 0xb4, 0xc1, 0xd2,
+ 0xb4, 0xc1, 0xd1, 0xb7, 0xc3, 0xd3, 0xb7, 0xc4, 0xd5, 0xb9, 0xc6, 0xd7,
+ 0xb9, 0xc6, 0xd7, 0xbb, 0xc8, 0xd8, 0xbb, 0xc8, 0xd8, 0xba, 0xc8, 0xd7,
+ 0xba, 0xc9, 0xd8, 0xb9, 0xca, 0xd9, 0xba, 0xcb, 0xdb, 0xbe, 0xcc, 0xdd,
+ 0xb7, 0xc0, 0xd0, 0xa2, 0xa6, 0xb3, 0x94, 0x94, 0x9e, 0x8f, 0x8c, 0x95,
+ 0x92, 0x92, 0x94, 0x94, 0x96, 0x95, 0x94, 0x99, 0x95, 0x98, 0x9d, 0x99,
+ 0x9e, 0xa3, 0xa1, 0xa8, 0xac, 0xaf, 0xb1, 0xb8, 0xbe, 0xb6, 0xc1, 0xc7,
+ 0x11, 0x12, 0x11, 0x16, 0x18, 0x17, 0x13, 0x15, 0x14, 0x15, 0x17, 0x16,
+ 0x17, 0x19, 0x18, 0x19, 0x1b, 0x1a, 0x16, 0x18, 0x17, 0x1a, 0x1b, 0x1b,
+ 0x14, 0x16, 0x13, 0x14, 0x16, 0x14, 0x15, 0x17, 0x16, 0x19, 0x1b, 0x1a,
+ 0x09, 0x0b, 0x0a, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x05, 0x05, 0x05, 0x0b, 0x0b, 0x09, 0x2e, 0x2f, 0x2b, 0x3f, 0x40, 0x3a,
+ 0x21, 0x22, 0x1d, 0x0f, 0x0f, 0x0d, 0x04, 0x04, 0x02, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x14, 0x14, 0x14, 0x18, 0x18, 0x18,
+ 0x13, 0x14, 0x13, 0x14, 0x16, 0x15, 0x14, 0x16, 0x13, 0x12, 0x14, 0x11,
+ 0x14, 0x16, 0x13, 0x13, 0x14, 0x14, 0x17, 0x17, 0x17, 0x1f, 0x20, 0x20,
+ 0x14, 0x18, 0x19, 0x12, 0x14, 0x16, 0x11, 0x12, 0x14, 0x0d, 0x0d, 0x0d,
+ 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0a, 0x17, 0x17, 0x15, 0x23, 0x23, 0x20,
+ 0x3a, 0x3a, 0x35, 0x55, 0x53, 0x4e, 0x4b, 0x4a, 0x46, 0x29, 0x29, 0x27,
+ 0x12, 0x16, 0x15, 0x13, 0x19, 0x17, 0x0f, 0x13, 0x14, 0x0e, 0x0f, 0x11,
+ 0x13, 0x14, 0x16, 0x14, 0x15, 0x17, 0x0f, 0x10, 0x12, 0x0c, 0x0d, 0x0f,
+ 0x0a, 0x0c, 0x0b, 0x11, 0x13, 0x12, 0x25, 0x25, 0x25, 0x2c, 0x2c, 0x2d,
+ 0x20, 0x24, 0x25, 0x21, 0x23, 0x22, 0x28, 0x2a, 0x29, 0x2a, 0x2a, 0x28,
+ 0x2a, 0x2b, 0x29, 0x22, 0x22, 0x20, 0x11, 0x11, 0x11, 0x13, 0x13, 0x13,
+ 0x0c, 0x10, 0x10, 0x06, 0x08, 0x08, 0x07, 0x08, 0x08, 0x07, 0x09, 0x08,
+ 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0d, 0x0e, 0x0e, 0x0c, 0x12, 0x10, 0x0f,
+ 0x15, 0x0f, 0x11, 0x1c, 0x18, 0x19, 0x22, 0x1f, 0x1f, 0x22, 0x1c, 0x1e,
+ 0x2c, 0x23, 0x26, 0x39, 0x30, 0x33, 0x39, 0x33, 0x37, 0x35, 0x30, 0x34,
+ 0x2e, 0x2c, 0x2a, 0x28, 0x23, 0x24, 0x29, 0x20, 0x23, 0x24, 0x1c, 0x1e,
+ 0x1e, 0x1a, 0x19, 0x1b, 0x1a, 0x18, 0x1b, 0x19, 0x1a, 0x23, 0x1f, 0x23,
+ 0x42, 0x43, 0x47, 0x3d, 0x3e, 0x42, 0x3d, 0x3e, 0x43, 0x38, 0x38, 0x3d,
+ 0x30, 0x30, 0x36, 0x24, 0x25, 0x2a, 0x1c, 0x1d, 0x21, 0x11, 0x12, 0x16,
+ 0x13, 0x15, 0x17, 0x16, 0x16, 0x19, 0x2b, 0x28, 0x29, 0x2b, 0x23, 0x24,
+ 0x31, 0x24, 0x24, 0x33, 0x23, 0x20, 0x3b, 0x29, 0x25, 0x53, 0x42, 0x3b,
+ 0x59, 0x4c, 0x44, 0x45, 0x39, 0x3c, 0x52, 0x49, 0x4a, 0x8c, 0x86, 0x83,
+ 0x91, 0x8b, 0x8a, 0x83, 0x7d, 0x73, 0x94, 0x8c, 0x7a, 0x9d, 0x93, 0x85,
+ 0x8e, 0x88, 0x73, 0xb3, 0xae, 0x9a, 0x96, 0x95, 0x81, 0x84, 0x83, 0x6f,
+ 0x89, 0x87, 0x72, 0x93, 0x8e, 0x7b, 0xa3, 0x9d, 0x8d, 0x97, 0x94, 0x87,
+ 0xb6, 0xb7, 0xab, 0xbb, 0xbd, 0xb1, 0xad, 0xaf, 0xa4, 0xb6, 0xb8, 0xac,
+ 0x9c, 0x9c, 0x90, 0xd3, 0xd3, 0xc9, 0xb0, 0xb0, 0xaa, 0x8a, 0x89, 0x87,
+ 0x96, 0x98, 0x93, 0x90, 0x99, 0x98, 0x85, 0x93, 0x98, 0x89, 0x96, 0x9e,
+ 0x89, 0x94, 0x9c, 0x89, 0x8e, 0x96, 0x74, 0x76, 0x7e, 0x3c, 0x3d, 0x43,
+ 0x47, 0x41, 0x38, 0x79, 0x71, 0x61, 0x76, 0x70, 0x58, 0x72, 0x6c, 0x4f,
+ 0x6a, 0x65, 0x47, 0x8b, 0x87, 0x6b, 0xba, 0xb9, 0x9d, 0xcc, 0xcb, 0xaf,
+ 0xc7, 0xc8, 0xb5, 0xaf, 0xb0, 0xa0, 0xc3, 0xc5, 0xb6, 0xc5, 0xc7, 0xb8,
+ 0x9d, 0x9f, 0x91, 0x71, 0x73, 0x65, 0x89, 0x8c, 0x7b, 0xb8, 0xbb, 0xaa,
+ 0xc8, 0xcb, 0xb9, 0xcd, 0xcd, 0xbf, 0xbe, 0xbb, 0xb6, 0x50, 0x4a, 0x50,
+ 0x64, 0x5e, 0x6e, 0x8d, 0x88, 0x9c, 0x86, 0x85, 0x95, 0x82, 0x84, 0x91,
+ 0x9f, 0xa1, 0xb0, 0xab, 0xa7, 0xb9, 0x98, 0x8e, 0x97, 0xa5, 0x9c, 0x92,
+ 0xa5, 0xa0, 0x8c, 0xa9, 0xa5, 0x9a, 0xb5, 0xb1, 0xae, 0xbd, 0xba, 0xb6,
+ 0xc5, 0xc7, 0xbc, 0xce, 0xcf, 0xc7, 0xc4, 0xc4, 0xc1, 0xc4, 0xc5, 0xc4,
+ 0xbc, 0xbc, 0xbc, 0xb7, 0xb7, 0xb9, 0xb6, 0xb7, 0xb9, 0xb8, 0xba, 0xbb,
+ 0xb8, 0xba, 0xb7, 0xb2, 0xb4, 0xb1, 0xba, 0xbc, 0xb9, 0xc7, 0xc9, 0xc6,
+ 0xd2, 0xd3, 0xd1, 0xc6, 0xc6, 0xc5, 0xb7, 0xb6, 0xb4, 0xa1, 0xa0, 0x9d,
+ 0xa1, 0xa1, 0x9a, 0x9d, 0x9c, 0x9e, 0x8c, 0x8a, 0x99, 0x58, 0x52, 0x66,
+ 0x3f, 0x34, 0x44, 0x3f, 0x33, 0x3d, 0x3b, 0x32, 0x35, 0x3b, 0x35, 0x37,
+ 0x3a, 0x38, 0x3c, 0x3a, 0x3a, 0x40, 0x31, 0x35, 0x3e, 0x27, 0x2e, 0x3a,
+ 0x19, 0x1f, 0x2b, 0x14, 0x1a, 0x26, 0x12, 0x1a, 0x24, 0x11, 0x1b, 0x24,
+ 0x12, 0x1c, 0x25, 0x13, 0x1d, 0x27, 0x11, 0x1b, 0x25, 0x13, 0x1d, 0x27,
+ 0x14, 0x1e, 0x27, 0x34, 0x3e, 0x45, 0x42, 0x4d, 0x50, 0x3d, 0x48, 0x4b,
+ 0x30, 0x3a, 0x43, 0x2a, 0x34, 0x3e, 0x2e, 0x3a, 0x46, 0x1f, 0x2b, 0x34,
+ 0x13, 0x1e, 0x24, 0x30, 0x39, 0x40, 0x30, 0x38, 0x42, 0x14, 0x19, 0x28,
+ 0x1c, 0x1e, 0x28, 0x21, 0x25, 0x29, 0x39, 0x3d, 0x3e, 0x2f, 0x33, 0x34,
+ 0x1e, 0x21, 0x25, 0x1f, 0x22, 0x27, 0x25, 0x29, 0x2c, 0x28, 0x2d, 0x2e,
+ 0x27, 0x2d, 0x2d, 0x26, 0x2a, 0x2d, 0x29, 0x2d, 0x32, 0x2e, 0x33, 0x39,
+ 0x2e, 0x37, 0x3d, 0x2e, 0x38, 0x3d, 0x2c, 0x35, 0x3a, 0x2c, 0x34, 0x38,
+ 0x2d, 0x36, 0x3b, 0x2e, 0x38, 0x39, 0x2d, 0x36, 0x35, 0x2f, 0x38, 0x37,
+ 0x31, 0x38, 0x3c, 0x32, 0x39, 0x3f, 0x34, 0x3c, 0x3f, 0x3a, 0x44, 0x46,
+ 0x3b, 0x45, 0x4e, 0x3b, 0x44, 0x4d, 0x3b, 0x42, 0x4a, 0x39, 0x40, 0x47,
+ 0x39, 0x40, 0x46, 0x37, 0x40, 0x45, 0x38, 0x43, 0x47, 0x38, 0x45, 0x4a,
+ 0x3b, 0x46, 0x4e, 0x3d, 0x48, 0x4e, 0x42, 0x4d, 0x53, 0x48, 0x53, 0x59,
+ 0x4e, 0x57, 0x5c, 0x52, 0x5b, 0x60, 0x56, 0x5f, 0x64, 0x58, 0x62, 0x64,
+ 0x5a, 0x64, 0x65, 0x58, 0x60, 0x63, 0x57, 0x5f, 0x62, 0x54, 0x5b, 0x61,
+ 0x52, 0x57, 0x5d, 0x4a, 0x51, 0x57, 0x44, 0x4c, 0x4f, 0x3b, 0x43, 0x47,
+ 0x40, 0x4a, 0x4c, 0x5f, 0x6b, 0x69, 0x62, 0x70, 0x76, 0x34, 0x44, 0x52,
+ 0x94, 0xa5, 0xac, 0xc8, 0xd7, 0xd6, 0xbe, 0xc7, 0xce, 0xbc, 0xc2, 0xd0,
+ 0xb8, 0xc1, 0xcb, 0xb7, 0xc1, 0xcc, 0xb6, 0xc0, 0xcc, 0xb4, 0xc0, 0xcc,
+ 0xb5, 0xc1, 0xcf, 0xb5, 0xc1, 0xd0, 0xb5, 0xc2, 0xd2, 0xb4, 0xc1, 0xd1,
+ 0xb5, 0xc2, 0xd2, 0xb6, 0xc3, 0xd3, 0xb6, 0xc3, 0xd3, 0xb7, 0xc4, 0xd5,
+ 0xb8, 0xc5, 0xd6, 0xb9, 0xc6, 0xd6, 0xbc, 0xc9, 0xd9, 0xba, 0xc8, 0xd8,
+ 0xba, 0xc9, 0xd8, 0xba, 0xca, 0xd9, 0xbd, 0xcb, 0xdb, 0xbe, 0xc9, 0xd9,
+ 0xae, 0xb6, 0xc5, 0x9a, 0x9e, 0xa9, 0x8f, 0x90, 0x95, 0x8f, 0x8f, 0x91,
+ 0x93, 0x94, 0x96, 0x95, 0x97, 0x96, 0x97, 0x9b, 0x9a, 0x9c, 0xa0, 0x9e,
+ 0xa2, 0xa6, 0xa6, 0xab, 0xb0, 0xb4, 0xb4, 0xbd, 0xc4, 0xb9, 0xc6, 0xcd,
+ 0x12, 0x14, 0x13, 0x14, 0x17, 0x15, 0x14, 0x16, 0x15, 0x16, 0x18, 0x17,
+ 0x18, 0x1a, 0x19, 0x19, 0x1b, 0x1a, 0x18, 0x1a, 0x19, 0x19, 0x1b, 0x1a,
+ 0x18, 0x1a, 0x17, 0x14, 0x16, 0x15, 0x12, 0x14, 0x13, 0x13, 0x15, 0x14,
+ 0x0b, 0x0d, 0x0c, 0x06, 0x08, 0x07, 0x0a, 0x0b, 0x0b, 0x08, 0x08, 0x08,
+ 0x08, 0x09, 0x08, 0x05, 0x07, 0x06, 0x05, 0x07, 0x06, 0x07, 0x09, 0x08,
+ 0x0b, 0x0c, 0x0b, 0x17, 0x19, 0x17, 0x11, 0x13, 0x10, 0x17, 0x19, 0x14,
+ 0x1d, 0x1f, 0x19, 0x1d, 0x1e, 0x19, 0x0a, 0x0a, 0x08, 0x04, 0x04, 0x04,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x10, 0x10, 0x10, 0x1a, 0x1a, 0x1a, 0x18, 0x18, 0x18,
+ 0x14, 0x15, 0x14, 0x13, 0x15, 0x14, 0x15, 0x17, 0x16, 0x14, 0x16, 0x14,
+ 0x15, 0x17, 0x14, 0x12, 0x13, 0x13, 0x18, 0x17, 0x17, 0x2d, 0x2b, 0x2c,
+ 0x23, 0x24, 0x26, 0x14, 0x15, 0x17, 0x0f, 0x0f, 0x11, 0x0b, 0x0b, 0x0d,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x06, 0x07, 0x06, 0x0e, 0x10, 0x0d,
+ 0x3d, 0x3f, 0x39, 0x61, 0x62, 0x5b, 0x38, 0x39, 0x34, 0x13, 0x16, 0x13,
+ 0x0d, 0x12, 0x11, 0x11, 0x17, 0x17, 0x12, 0x16, 0x18, 0x10, 0x11, 0x15,
+ 0x15, 0x16, 0x18, 0x20, 0x21, 0x23, 0x12, 0x13, 0x15, 0x10, 0x11, 0x12,
+ 0x0f, 0x10, 0x10, 0x0e, 0x0f, 0x0e, 0x1b, 0x1a, 0x1b, 0x26, 0x26, 0x26,
+ 0x24, 0x25, 0x23, 0x26, 0x26, 0x24, 0x2b, 0x2b, 0x29, 0x2d, 0x2c, 0x2a,
+ 0x1f, 0x1f, 0x1d, 0x0f, 0x0f, 0x0d, 0x0a, 0x0a, 0x0a, 0x13, 0x15, 0x14,
+ 0x12, 0x12, 0x12, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0a, 0x0c, 0x0b, 0x0b, 0x0d, 0x0c,
+ 0x0d, 0x0b, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x13, 0x11, 0x12,
+ 0x1a, 0x16, 0x17, 0x20, 0x1c, 0x1d, 0x21, 0x1f, 0x20, 0x1e, 0x1e, 0x20,
+ 0x1d, 0x1e, 0x1c, 0x1f, 0x1c, 0x1d, 0x20, 0x19, 0x1d, 0x1c, 0x18, 0x19,
+ 0x1a, 0x1a, 0x18, 0x17, 0x19, 0x16, 0x12, 0x13, 0x14, 0x1e, 0x1d, 0x22,
+ 0x41, 0x44, 0x47, 0x3d, 0x40, 0x44, 0x3a, 0x3c, 0x40, 0x36, 0x37, 0x3c,
+ 0x27, 0x28, 0x2d, 0x22, 0x23, 0x28, 0x28, 0x28, 0x2d, 0x16, 0x15, 0x1a,
+ 0x11, 0x12, 0x16, 0x1a, 0x1a, 0x1e, 0x3b, 0x37, 0x3b, 0x28, 0x20, 0x25,
+ 0x30, 0x26, 0x28, 0x31, 0x23, 0x23, 0x33, 0x24, 0x21, 0x45, 0x34, 0x31,
+ 0x5b, 0x50, 0x48, 0x7a, 0x6f, 0x75, 0xb4, 0xad, 0xb4, 0xca, 0xc6, 0xc7,
+ 0xaa, 0xa7, 0xa8, 0x6e, 0x67, 0x5f, 0x84, 0x7b, 0x69, 0x97, 0x89, 0x7d,
+ 0x8a, 0x82, 0x6b, 0x9d, 0x98, 0x81, 0x96, 0x94, 0x7f, 0x94, 0x93, 0x7e,
+ 0x85, 0x81, 0x6d, 0x88, 0x81, 0x6f, 0xa3, 0x9b, 0x8e, 0x87, 0x81, 0x76,
+ 0x97, 0x95, 0x86, 0xab, 0xab, 0x9f, 0xa5, 0xa5, 0x9c, 0xab, 0xab, 0xa1,
+ 0xa5, 0xa5, 0x99, 0xa1, 0xa0, 0x96, 0x89, 0x88, 0x85, 0x92, 0x90, 0x92,
+ 0x8c, 0x91, 0x94, 0x8c, 0x96, 0x9b, 0x8b, 0x98, 0xa0, 0x8b, 0x98, 0xa1,
+ 0x89, 0x92, 0x9b, 0x82, 0x87, 0x8e, 0x73, 0x76, 0x7b, 0x4a, 0x4d, 0x51,
+ 0x50, 0x4c, 0x41, 0x72, 0x6c, 0x5b, 0x6d, 0x67, 0x4f, 0x7a, 0x73, 0x59,
+ 0x77, 0x70, 0x54, 0x64, 0x5e, 0x43, 0x78, 0x74, 0x57, 0xac, 0xa8, 0x8b,
+ 0xc9, 0xc9, 0xae, 0xd0, 0xd0, 0xb8, 0xcd, 0xce, 0xba, 0xce, 0xcf, 0xbf,
+ 0xcc, 0xcd, 0xc0, 0xa9, 0xaa, 0x9c, 0x75, 0x77, 0x66, 0xa9, 0xac, 0x9b,
+ 0xc6, 0xc8, 0xb7, 0xcb, 0xcb, 0xbf, 0xb2, 0xb1, 0xae, 0x4a, 0x47, 0x51,
+ 0x7e, 0x7c, 0x8f, 0xac, 0xad, 0xc5, 0xa5, 0xab, 0xc1, 0x9f, 0xaa, 0xbc,
+ 0xae, 0xba, 0xcd, 0xaa, 0xad, 0xc5, 0xa5, 0xa1, 0xae, 0xa5, 0xa0, 0x98,
+ 0xa6, 0xa3, 0x92, 0xa7, 0xa4, 0x9b, 0xa7, 0xa6, 0xa2, 0xae, 0xad, 0xa9,
+ 0xca, 0xca, 0xc2, 0xda, 0xd9, 0xd4, 0xd1, 0xd1, 0xcd, 0xc9, 0xca, 0xc7,
+ 0xca, 0xca, 0xca, 0xc2, 0xc2, 0xc2, 0xbc, 0xbc, 0xbb, 0xbb, 0xbb, 0xb9,
+ 0xad, 0xaf, 0xaa, 0xb1, 0xb3, 0xaf, 0xd3, 0xd5, 0xd2, 0xc6, 0xc8, 0xc7,
+ 0xe5, 0xe6, 0xe8, 0xec, 0xed, 0xee, 0xc4, 0xc4, 0xc6, 0xa1, 0xa2, 0xa2,
+ 0x93, 0x90, 0x8b, 0x94, 0x92, 0x94, 0x92, 0x90, 0x9d, 0x4f, 0x4b, 0x5c,
+ 0x3a, 0x31, 0x3d, 0x3c, 0x32, 0x3b, 0x3e, 0x37, 0x3c, 0x3c, 0x38, 0x3b,
+ 0x3c, 0x3a, 0x3c, 0x37, 0x38, 0x3b, 0x2f, 0x37, 0x3c, 0x1e, 0x26, 0x30,
+ 0x13, 0x1b, 0x27, 0x15, 0x1d, 0x28, 0x14, 0x1d, 0x26, 0x13, 0x1d, 0x26,
+ 0x15, 0x1f, 0x26, 0x17, 0x21, 0x2a, 0x2d, 0x37, 0x41, 0x2a, 0x35, 0x3f,
+ 0x13, 0x1d, 0x27, 0x29, 0x36, 0x3e, 0x47, 0x55, 0x58, 0x3d, 0x4a, 0x4c,
+ 0x36, 0x40, 0x48, 0x25, 0x2f, 0x38, 0x14, 0x21, 0x2a, 0x11, 0x1e, 0x26,
+ 0x11, 0x1c, 0x21, 0x24, 0x2d, 0x33, 0x37, 0x3d, 0x47, 0x1a, 0x1f, 0x2c,
+ 0x18, 0x1b, 0x25, 0x1c, 0x21, 0x25, 0x29, 0x2f, 0x2d, 0x3e, 0x43, 0x43,
+ 0x28, 0x2d, 0x30, 0x1f, 0x24, 0x28, 0x23, 0x28, 0x2b, 0x27, 0x2d, 0x2d,
+ 0x27, 0x2b, 0x2c, 0x27, 0x2b, 0x2d, 0x2b, 0x2f, 0x34, 0x2f, 0x33, 0x3c,
+ 0x2d, 0x36, 0x3d, 0x2c, 0x35, 0x3c, 0x2d, 0x36, 0x3b, 0x30, 0x36, 0x3a,
+ 0x2d, 0x36, 0x3b, 0x2c, 0x36, 0x37, 0x2e, 0x38, 0x34, 0x30, 0x38, 0x38,
+ 0x33, 0x38, 0x3d, 0x34, 0x3b, 0x41, 0x37, 0x3f, 0x42, 0x39, 0x41, 0x44,
+ 0x38, 0x42, 0x4b, 0x39, 0x42, 0x4a, 0x38, 0x3f, 0x45, 0x38, 0x3f, 0x45,
+ 0x3b, 0x42, 0x48, 0x39, 0x43, 0x48, 0x38, 0x43, 0x49, 0x36, 0x42, 0x4a,
+ 0x3b, 0x46, 0x4f, 0x3e, 0x47, 0x51, 0x41, 0x4b, 0x53, 0x44, 0x4f, 0x56,
+ 0x4c, 0x55, 0x5b, 0x4f, 0x58, 0x5d, 0x51, 0x5a, 0x5f, 0x57, 0x60, 0x64,
+ 0x5d, 0x67, 0x68, 0x54, 0x5d, 0x5f, 0x4f, 0x57, 0x5b, 0x4e, 0x55, 0x5b,
+ 0x4a, 0x4f, 0x55, 0x42, 0x49, 0x4f, 0x3c, 0x44, 0x47, 0x3d, 0x45, 0x47,
+ 0x44, 0x4d, 0x4f, 0x5f, 0x69, 0x6a, 0x64, 0x6f, 0x71, 0x57, 0x64, 0x69,
+ 0xbe, 0xca, 0xd2, 0xc1, 0xcd, 0xcd, 0xbc, 0xc7, 0xca, 0xba, 0xc1, 0xd3,
+ 0xb7, 0xc1, 0xcc, 0xb6, 0xc0, 0xcc, 0xb2, 0xbe, 0xca, 0xb3, 0xbf, 0xcd,
+ 0xb4, 0xc0, 0xce, 0xb5, 0xc1, 0xd1, 0xb8, 0xc3, 0xd4, 0xb8, 0xc4, 0xd4,
+ 0xb6, 0xc3, 0xd3, 0xb5, 0xc2, 0xd2, 0xb7, 0xc4, 0xd4, 0xb8, 0xc5, 0xd6,
+ 0xb8, 0xc5, 0xd6, 0xb9, 0xc6, 0xd6, 0xbc, 0xc8, 0xd9, 0xbd, 0xca, 0xd9,
+ 0xbc, 0xc9, 0xd7, 0xbc, 0xc9, 0xd9, 0xbf, 0xcb, 0xdb, 0xb9, 0xc3, 0xd4,
+ 0xa3, 0xab, 0xb9, 0x93, 0x98, 0xa1, 0x8d, 0x8e, 0x91, 0x8f, 0x8f, 0x8e,
+ 0x93, 0x94, 0x96, 0x94, 0x98, 0x97, 0x97, 0x9b, 0x9a, 0x9e, 0xa2, 0xa1,
+ 0xa7, 0xaa, 0xac, 0xaf, 0xb3, 0xba, 0xb4, 0xbf, 0xc7, 0xb7, 0xc6, 0xcf,
+ 0x13, 0x15, 0x14, 0x14, 0x16, 0x15, 0x16, 0x18, 0x17, 0x16, 0x18, 0x17,
+ 0x17, 0x19, 0x18, 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x1a, 0x1c, 0x1b,
+ 0x17, 0x19, 0x18, 0x15, 0x17, 0x16, 0x13, 0x15, 0x14, 0x15, 0x17, 0x16,
+ 0x0d, 0x0f, 0x0e, 0x06, 0x08, 0x07, 0x08, 0x0a, 0x09, 0x07, 0x09, 0x08,
+ 0x07, 0x08, 0x07, 0x08, 0x0a, 0x09, 0x07, 0x09, 0x08, 0x0f, 0x11, 0x10,
+ 0x1a, 0x1c, 0x1b, 0x1d, 0x1f, 0x1e, 0x12, 0x14, 0x12, 0x0f, 0x11, 0x0e,
+ 0x14, 0x15, 0x10, 0x19, 0x1a, 0x15, 0x0d, 0x0d, 0x0b, 0x03, 0x03, 0x03,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
+ 0x07, 0x07, 0x06, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0d, 0x0d, 0x0d, 0x17, 0x17, 0x17, 0x16, 0x16, 0x16, 0x15, 0x15, 0x15,
+ 0x14, 0x14, 0x16, 0x13, 0x14, 0x14, 0x17, 0x19, 0x18, 0x17, 0x19, 0x18,
+ 0x18, 0x1a, 0x19, 0x17, 0x17, 0x17, 0x12, 0x10, 0x11, 0x19, 0x18, 0x1a,
+ 0x25, 0x27, 0x26, 0x1e, 0x20, 0x1f, 0x18, 0x18, 0x18, 0x14, 0x15, 0x15,
+ 0x15, 0x17, 0x16, 0x16, 0x18, 0x17, 0x09, 0x0c, 0x0b, 0x03, 0x08, 0x04,
+ 0x1a, 0x1d, 0x17, 0x2d, 0x2e, 0x29, 0x20, 0x21, 0x1c, 0x16, 0x19, 0x15,
+ 0x12, 0x17, 0x15, 0x11, 0x17, 0x17, 0x14, 0x16, 0x1a, 0x13, 0x13, 0x18,
+ 0x12, 0x13, 0x16, 0x1d, 0x1e, 0x20, 0x1e, 0x1f, 0x21, 0x13, 0x14, 0x15,
+ 0x13, 0x15, 0x14, 0x1c, 0x1c, 0x1c, 0x22, 0x22, 0x22, 0x2a, 0x2a, 0x2a,
+ 0x2a, 0x2a, 0x28, 0x2c, 0x2b, 0x27, 0x2b, 0x2b, 0x27, 0x23, 0x22, 0x1e,
+ 0x0e, 0x0e, 0x0c, 0x0b, 0x0b, 0x09, 0x0a, 0x0a, 0x09, 0x10, 0x11, 0x10,
+ 0x17, 0x14, 0x15, 0x0c, 0x08, 0x07, 0x09, 0x08, 0x06, 0x09, 0x09, 0x07,
+ 0x09, 0x09, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0c, 0x0b, 0x0d, 0x0e, 0x0f,
+ 0x0c, 0x0d, 0x0d, 0x0e, 0x10, 0x0f, 0x0d, 0x0e, 0x0d, 0x0d, 0x0d, 0x0b,
+ 0x0f, 0x0e, 0x0c, 0x12, 0x11, 0x0f, 0x15, 0x15, 0x13, 0x14, 0x19, 0x15,
+ 0x18, 0x1a, 0x1a, 0x1c, 0x19, 0x1c, 0x1d, 0x16, 0x1b, 0x1a, 0x15, 0x19,
+ 0x17, 0x19, 0x17, 0x12, 0x18, 0x14, 0x11, 0x14, 0x15, 0x20, 0x1f, 0x24,
+ 0x40, 0x43, 0x47, 0x3b, 0x3f, 0x42, 0x38, 0x3b, 0x40, 0x33, 0x34, 0x39,
+ 0x21, 0x22, 0x26, 0x2e, 0x2f, 0x34, 0x29, 0x28, 0x2d, 0x18, 0x17, 0x1b,
+ 0x10, 0x10, 0x15, 0x1e, 0x1d, 0x22, 0x3d, 0x39, 0x3f, 0x21, 0x1b, 0x1f,
+ 0x2c, 0x22, 0x25, 0x33, 0x26, 0x27, 0x35, 0x25, 0x25, 0x35, 0x25, 0x24,
+ 0x6f, 0x67, 0x5d, 0xa5, 0x9c, 0x9f, 0x9a, 0x94, 0x9a, 0x81, 0x7b, 0x7e,
+ 0x6f, 0x68, 0x6c, 0x5e, 0x57, 0x4f, 0x62, 0x56, 0x46, 0x76, 0x68, 0x5c,
+ 0x8b, 0x80, 0x6c, 0x90, 0x89, 0x73, 0x92, 0x90, 0x7b, 0x91, 0x8f, 0x7a,
+ 0x83, 0x7e, 0x6a, 0x86, 0x7f, 0x6d, 0x98, 0x8f, 0x82, 0x8d, 0x85, 0x7b,
+ 0x96, 0x92, 0x82, 0x9a, 0x97, 0x8a, 0x9f, 0x9c, 0x92, 0x97, 0x95, 0x8b,
+ 0x8f, 0x8d, 0x81, 0x87, 0x85, 0x7c, 0x8c, 0x8a, 0x8a, 0x92, 0x90, 0x97,
+ 0x8c, 0x91, 0x98, 0x8d, 0x96, 0x9f, 0x8d, 0x97, 0xa2, 0x86, 0x91, 0x9a,
+ 0x82, 0x89, 0x91, 0x79, 0x7e, 0x82, 0x64, 0x69, 0x6c, 0x47, 0x4c, 0x4e,
+ 0x6b, 0x68, 0x5a, 0x7e, 0x78, 0x65, 0x74, 0x6e, 0x56, 0x81, 0x77, 0x5e,
+ 0x80, 0x76, 0x5d, 0x74, 0x6b, 0x54, 0x69, 0x62, 0x49, 0x6b, 0x67, 0x4b,
+ 0x95, 0x93, 0x75, 0xc0, 0xbd, 0xa2, 0xce, 0xcc, 0xb5, 0xcc, 0xcb, 0xb8,
+ 0xcc, 0xca, 0xbb, 0xcc, 0xca, 0xbb, 0xc1, 0xc0, 0xb1, 0xc8, 0xc9, 0xb8,
+ 0xc2, 0xc4, 0xb4, 0xc7, 0xc8, 0xbd, 0xb0, 0xb0, 0xaf, 0x69, 0x67, 0x74,
+ 0x8e, 0x8e, 0xa5, 0xb2, 0xb8, 0xd2, 0xb4, 0xc0, 0xd6, 0xb1, 0xc2, 0xd5,
+ 0xaf, 0xbf, 0xd7, 0xa7, 0xaf, 0xca, 0xaf, 0xb0, 0xbf, 0x9f, 0x9f, 0x97,
+ 0xa2, 0xa1, 0x8f, 0xa9, 0xa9, 0x9f, 0xa9, 0xaa, 0xa5, 0x96, 0x97, 0x92,
+ 0xc0, 0xc0, 0xbc, 0xde, 0xde, 0xda, 0xc8, 0xc7, 0xc5, 0xc2, 0xc1, 0xc1,
+ 0xc6, 0xc5, 0xc5, 0xcb, 0xca, 0xc9, 0xd3, 0xd3, 0xcf, 0xba, 0xbb, 0xb5,
+ 0xae, 0xb0, 0xab, 0xc7, 0xc9, 0xc4, 0xe6, 0xe8, 0xe5, 0xba, 0xbc, 0xbe,
+ 0xd7, 0xd8, 0xdc, 0xf0, 0xf2, 0xf5, 0xb8, 0xb9, 0xbe, 0x9f, 0xa0, 0xa4,
+ 0x98, 0x95, 0x91, 0x9c, 0x9a, 0x9c, 0x99, 0x98, 0xa4, 0x61, 0x5e, 0x6d,
+ 0x43, 0x3b, 0x48, 0x3b, 0x34, 0x3c, 0x39, 0x34, 0x3b, 0x37, 0x34, 0x3a,
+ 0x3f, 0x3d, 0x3f, 0x31, 0x33, 0x36, 0x2e, 0x36, 0x3c, 0x20, 0x28, 0x32,
+ 0x16, 0x1e, 0x2a, 0x17, 0x1f, 0x2a, 0x17, 0x21, 0x2a, 0x13, 0x1f, 0x26,
+ 0x16, 0x22, 0x27, 0x2b, 0x36, 0x3c, 0x3e, 0x48, 0x51, 0x3e, 0x4a, 0x53,
+ 0x20, 0x2d, 0x35, 0x1f, 0x2c, 0x34, 0x38, 0x45, 0x4b, 0x24, 0x32, 0x36,
+ 0x1d, 0x28, 0x2e, 0x18, 0x22, 0x2b, 0x13, 0x20, 0x28, 0x11, 0x1e, 0x24,
+ 0x12, 0x1d, 0x21, 0x1b, 0x24, 0x29, 0x39, 0x40, 0x48, 0x24, 0x2a, 0x36,
+ 0x14, 0x18, 0x23, 0x1a, 0x20, 0x24, 0x20, 0x26, 0x24, 0x39, 0x40, 0x3d,
+ 0x44, 0x49, 0x4b, 0x29, 0x2e, 0x34, 0x23, 0x28, 0x2c, 0x25, 0x2b, 0x2c,
+ 0x29, 0x2e, 0x2f, 0x2a, 0x2d, 0x31, 0x2e, 0x32, 0x39, 0x32, 0x37, 0x3f,
+ 0x2d, 0x36, 0x3c, 0x2c, 0x35, 0x3b, 0x2c, 0x35, 0x3a, 0x2e, 0x34, 0x39,
+ 0x2c, 0x35, 0x3a, 0x2d, 0x35, 0x37, 0x2d, 0x36, 0x34, 0x32, 0x38, 0x38,
+ 0x36, 0x3b, 0x3f, 0x37, 0x3c, 0x42, 0x38, 0x3f, 0x42, 0x3a, 0x43, 0x43,
+ 0x37, 0x42, 0x46, 0x37, 0x40, 0x42, 0x38, 0x40, 0x43, 0x38, 0x40, 0x43,
+ 0x3a, 0x42, 0x47, 0x3a, 0x42, 0x4b, 0x37, 0x41, 0x4b, 0x36, 0x41, 0x4d,
+ 0x3b, 0x44, 0x4d, 0x3c, 0x45, 0x4d, 0x3f, 0x48, 0x51, 0x44, 0x4e, 0x56,
+ 0x48, 0x53, 0x59, 0x4b, 0x56, 0x5b, 0x4b, 0x56, 0x5a, 0x4e, 0x58, 0x5c,
+ 0x4f, 0x59, 0x5a, 0x4e, 0x56, 0x58, 0x4b, 0x53, 0x56, 0x47, 0x4e, 0x53,
+ 0x41, 0x46, 0x4c, 0x39, 0x3f, 0x45, 0x3e, 0x46, 0x49, 0x4a, 0x52, 0x55,
+ 0x4a, 0x54, 0x55, 0x5e, 0x67, 0x6d, 0x60, 0x6b, 0x6c, 0x8c, 0x96, 0x98,
+ 0xca, 0xd4, 0xdc, 0xc0, 0xca, 0xca, 0xb9, 0xc5, 0xc6, 0xb6, 0xbf, 0xd2,
+ 0xb4, 0xc0, 0xcb, 0xb2, 0xbe, 0xc9, 0xb3, 0xbf, 0xcc, 0xb4, 0xc0, 0xce,
+ 0xb3, 0xc0, 0xce, 0xb4, 0xc1, 0xd1, 0xb5, 0xc2, 0xd2, 0xb6, 0xc2, 0xd2,
+ 0xb7, 0xc4, 0xd4, 0xb5, 0xc2, 0xd3, 0xb8, 0xc5, 0xd5, 0xb8, 0xc5, 0xd6,
+ 0xb7, 0xc5, 0xd6, 0xb9, 0xc6, 0xd6, 0xbb, 0xc7, 0xd7, 0xbc, 0xc9, 0xd9,
+ 0xbb, 0xc9, 0xd7, 0xbd, 0xca, 0xd9, 0xbf, 0xca, 0xda, 0xaf, 0xb8, 0xc7,
+ 0x99, 0xa1, 0xad, 0x8c, 0x90, 0x97, 0x8d, 0x8d, 0x8f, 0x91, 0x93, 0x8f,
+ 0x95, 0x96, 0x97, 0x96, 0x9a, 0x9a, 0x96, 0x9b, 0x9a, 0x9f, 0xa3, 0xa4,
+ 0xab, 0xb0, 0xb2, 0xb5, 0xb9, 0xc0, 0xb6, 0xc1, 0xcb, 0xb9, 0xc7, 0xd2,
+ 0x10, 0x12, 0x13, 0x13, 0x15, 0x14, 0x14, 0x16, 0x13, 0x14, 0x16, 0x13,
+ 0x19, 0x1b, 0x18, 0x17, 0x19, 0x16, 0x17, 0x19, 0x18, 0x16, 0x18, 0x18,
+ 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x14, 0x16, 0x15, 0x17, 0x19, 0x18,
+ 0x12, 0x13, 0x13, 0x07, 0x06, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x0a, 0x09, 0x15, 0x18, 0x16, 0x18, 0x1a, 0x19,
+ 0x18, 0x1a, 0x19, 0x16, 0x18, 0x17, 0x15, 0x17, 0x14, 0x16, 0x18, 0x15,
+ 0x12, 0x12, 0x12, 0x12, 0x12, 0x11, 0x0f, 0x0f, 0x0f, 0x07, 0x07, 0x07,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x04, 0x07, 0x07, 0x05, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x13, 0x13, 0x12, 0x15, 0x15, 0x14, 0x16, 0x16, 0x14,
+ 0x14, 0x14, 0x12, 0x16, 0x16, 0x14, 0x17, 0x17, 0x16, 0x19, 0x19, 0x17,
+ 0x16, 0x16, 0x14, 0x0d, 0x0d, 0x0b, 0x09, 0x08, 0x07, 0x0e, 0x0e, 0x0c,
+ 0x21, 0x25, 0x20, 0x24, 0x26, 0x21, 0x20, 0x22, 0x1f, 0x1f, 0x21, 0x1e,
+ 0x1e, 0x20, 0x1f, 0x1e, 0x20, 0x1f, 0x12, 0x14, 0x14, 0x06, 0x0a, 0x09,
+ 0x09, 0x0c, 0x0f, 0x0e, 0x0f, 0x11, 0x21, 0x21, 0x20, 0x2b, 0x2a, 0x28,
+ 0x27, 0x27, 0x25, 0x23, 0x23, 0x23, 0x20, 0x21, 0x25, 0x14, 0x16, 0x1b,
+ 0x16, 0x15, 0x1c, 0x1b, 0x1c, 0x20, 0x26, 0x27, 0x2a, 0x26, 0x27, 0x29,
+ 0x23, 0x24, 0x22, 0x25, 0x25, 0x23, 0x28, 0x28, 0x26, 0x2b, 0x2b, 0x28,
+ 0x29, 0x2a, 0x25, 0x26, 0x27, 0x22, 0x18, 0x19, 0x16, 0x0c, 0x0e, 0x0b,
+ 0x09, 0x0b, 0x08, 0x0c, 0x0c, 0x0a, 0x07, 0x07, 0x05, 0x0d, 0x0d, 0x0b,
+ 0x14, 0x16, 0x15, 0x0a, 0x0c, 0x0a, 0x08, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0c, 0x0d, 0x0d,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0f, 0x0f, 0x0f, 0x15, 0x15, 0x15, 0x16, 0x17, 0x16, 0x18, 0x18, 0x18,
+ 0x18, 0x17, 0x18, 0x19, 0x17, 0x18, 0x1b, 0x19, 0x1c, 0x18, 0x16, 0x19,
+ 0x17, 0x17, 0x19, 0x18, 0x19, 0x18, 0x12, 0x12, 0x11, 0x21, 0x21, 0x1f,
+ 0x3f, 0x40, 0x42, 0x3b, 0x3c, 0x40, 0x3b, 0x3c, 0x40, 0x2c, 0x2d, 0x30,
+ 0x1e, 0x20, 0x21, 0x30, 0x30, 0x30, 0x29, 0x29, 0x2a, 0x19, 0x18, 0x1b,
+ 0x0f, 0x0f, 0x10, 0x1b, 0x1b, 0x1d, 0x34, 0x33, 0x35, 0x1b, 0x1a, 0x1a,
+ 0x20, 0x1c, 0x1a, 0x31, 0x27, 0x25, 0x36, 0x27, 0x27, 0x32, 0x21, 0x22,
+ 0x7d, 0x78, 0x70, 0xb6, 0xae, 0xa9, 0x5a, 0x4b, 0x49, 0x52, 0x3e, 0x3c,
+ 0x5a, 0x43, 0x40, 0x60, 0x4b, 0x47, 0x60, 0x4e, 0x49, 0x60, 0x51, 0x4d,
+ 0x6e, 0x63, 0x57, 0x86, 0x7d, 0x6e, 0x89, 0x82, 0x70, 0x8c, 0x87, 0x73,
+ 0x9b, 0x98, 0x84, 0x9b, 0x98, 0x84, 0x97, 0x94, 0x80, 0xae, 0xaa, 0x98,
+ 0xb8, 0xb6, 0xa2, 0xb6, 0xb4, 0xa1, 0x93, 0x90, 0x82, 0x8b, 0x8a, 0x81,
+ 0x8d, 0x8f, 0x8c, 0x88, 0x8c, 0x90, 0x89, 0x8d, 0x99, 0x8c, 0x8d, 0x9e,
+ 0x8d, 0x94, 0x9f, 0x8d, 0x96, 0x9f, 0x89, 0x93, 0x9b, 0x87, 0x8f, 0x96,
+ 0x7c, 0x84, 0x87, 0x6a, 0x72, 0x74, 0x54, 0x59, 0x59, 0x3d, 0x42, 0x3f,
+ 0x7d, 0x78, 0x5f, 0x9a, 0x92, 0x78, 0x87, 0x80, 0x66, 0x86, 0x7c, 0x63,
+ 0x89, 0x7e, 0x68, 0x87, 0x7c, 0x68, 0x78, 0x6f, 0x5c, 0x6c, 0x66, 0x52,
+ 0x6d, 0x63, 0x4c, 0x85, 0x7e, 0x64, 0xb5, 0xb2, 0x95, 0xcf, 0xcd, 0xb0,
+ 0xce, 0xcc, 0xb3, 0xcf, 0xcd, 0xba, 0xcd, 0xce, 0xbf, 0xcb, 0xcc, 0xc0,
+ 0xca, 0xc9, 0xb5, 0xcb, 0xca, 0xbc, 0xb4, 0xb4, 0xb0, 0x75, 0x77, 0x7f,
+ 0x7b, 0x80, 0x91, 0xb5, 0xc1, 0xd3, 0xb7, 0xc6, 0xda, 0xba, 0xcb, 0xdd,
+ 0xbd, 0xc6, 0xe1, 0xb6, 0xbd, 0xda, 0xac, 0xb3, 0xc7, 0x9a, 0x9c, 0xa3,
+ 0xa0, 0x9f, 0x97, 0xa7, 0xa4, 0x97, 0xb7, 0xb3, 0xad, 0xaa, 0xa6, 0xa5,
+ 0xc2, 0xc3, 0xbe, 0xf9, 0xfb, 0xf6, 0xcd, 0xcf, 0xcc, 0xbe, 0xbf, 0xbf,
+ 0xb9, 0xb8, 0xb8, 0xbc, 0xba, 0xbb, 0xc4, 0xc5, 0xc2, 0xae, 0xb0, 0xab,
+ 0xb8, 0xba, 0xb5, 0xc0, 0xc2, 0xbf, 0xc2, 0xc3, 0xc3, 0xaf, 0xb2, 0xb5,
+ 0xb5, 0xb8, 0xbd, 0xbc, 0xbe, 0xc3, 0x9f, 0xa2, 0xa6, 0xa2, 0xa3, 0xa6,
+ 0xa7, 0xa8, 0xa2, 0x9f, 0xa0, 0x9f, 0x9f, 0xa5, 0xae, 0x8d, 0x95, 0xa4,
+ 0x70, 0x75, 0x87, 0x4f, 0x50, 0x61, 0x3b, 0x38, 0x4a, 0x3c, 0x36, 0x48,
+ 0x46, 0x45, 0x4d, 0x34, 0x34, 0x3f, 0x35, 0x38, 0x47, 0x29, 0x2f, 0x3d,
+ 0x1e, 0x27, 0x30, 0x1d, 0x28, 0x2e, 0x1a, 0x25, 0x2a, 0x17, 0x21, 0x27,
+ 0x23, 0x2d, 0x34, 0x39, 0x45, 0x4a, 0x25, 0x30, 0x34, 0x31, 0x3c, 0x3e,
+ 0x38, 0x43, 0x47, 0x1b, 0x26, 0x2e, 0x1b, 0x25, 0x31, 0x18, 0x21, 0x2f,
+ 0x15, 0x20, 0x27, 0x18, 0x21, 0x28, 0x19, 0x22, 0x27, 0x15, 0x1e, 0x23,
+ 0x16, 0x1f, 0x24, 0x16, 0x1f, 0x26, 0x32, 0x3b, 0x44, 0x30, 0x39, 0x43,
+ 0x14, 0x1d, 0x29, 0x14, 0x1c, 0x26, 0x1f, 0x26, 0x29, 0x29, 0x30, 0x2d,
+ 0x4b, 0x4f, 0x4f, 0x4a, 0x4e, 0x50, 0x2f, 0x33, 0x3c, 0x27, 0x2b, 0x36,
+ 0x26, 0x2d, 0x32, 0x2b, 0x32, 0x37, 0x30, 0x3a, 0x3c, 0x2f, 0x39, 0x3a,
+ 0x2c, 0x36, 0x37, 0x2b, 0x34, 0x39, 0x2b, 0x35, 0x3d, 0x2b, 0x34, 0x3e,
+ 0x2b, 0x35, 0x38, 0x2e, 0x36, 0x39, 0x30, 0x38, 0x3b, 0x33, 0x3b, 0x3d,
+ 0x35, 0x3a, 0x3d, 0x38, 0x3d, 0x41, 0x3a, 0x3e, 0x42, 0x3b, 0x3f, 0x43,
+ 0x38, 0x40, 0x43, 0x3a, 0x40, 0x44, 0x3c, 0x41, 0x46, 0x3d, 0x41, 0x45,
+ 0x3b, 0x40, 0x44, 0x3c, 0x41, 0x47, 0x3b, 0x42, 0x48, 0x3a, 0x43, 0x49,
+ 0x3a, 0x45, 0x47, 0x3b, 0x47, 0x47, 0x3e, 0x49, 0x4a, 0x41, 0x4c, 0x4e,
+ 0x41, 0x4c, 0x4f, 0x43, 0x4e, 0x52, 0x45, 0x50, 0x56, 0x45, 0x51, 0x56,
+ 0x45, 0x51, 0x51, 0x45, 0x4f, 0x50, 0x45, 0x4c, 0x50, 0x41, 0x46, 0x4b,
+ 0x39, 0x3c, 0x43, 0x39, 0x3d, 0x44, 0x4b, 0x53, 0x58, 0x47, 0x51, 0x54,
+ 0x4b, 0x59, 0x59, 0x5b, 0x69, 0x67, 0x64, 0x72, 0x6e, 0xab, 0xba, 0xbb,
+ 0xc1, 0xce, 0xd8, 0xbc, 0xc5, 0xd5, 0xb8, 0xc1, 0xce, 0xb7, 0xbf, 0xca,
+ 0xb3, 0xbc, 0xcb, 0xb1, 0xbc, 0xcb, 0xb3, 0xbf, 0xcd, 0xb4, 0xc0, 0xce,
+ 0xb3, 0xbf, 0xcf, 0xb3, 0xc2, 0xd1, 0xb2, 0xc3, 0xd1, 0xb3, 0xc3, 0xd2,
+ 0xb7, 0xc4, 0xd4, 0xb6, 0xc3, 0xd3, 0xb7, 0xc4, 0xd4, 0xb8, 0xc5, 0xd5,
+ 0xb8, 0xc7, 0xd6, 0xb8, 0xc7, 0xd7, 0xb8, 0xc8, 0xd7, 0xba, 0xc9, 0xda,
+ 0xb8, 0xc8, 0xd8, 0xbb, 0xca, 0xdb, 0xba, 0xc4, 0xd4, 0xa5, 0xa9, 0xb8,
+ 0x95, 0x95, 0xa2, 0x8c, 0x8b, 0x92, 0x8e, 0x8e, 0x90, 0x94, 0x94, 0x91,
+ 0x98, 0x98, 0x96, 0x9b, 0x9d, 0x9a, 0x9d, 0xa2, 0xa0, 0xa2, 0xab, 0xaa,
+ 0xaa, 0xb5, 0xb8, 0xb2, 0xbf, 0xc4, 0xb8, 0xc6, 0xcf, 0xbc, 0xca, 0xd5,
+ 0x0e, 0x0e, 0x0e, 0x14, 0x14, 0x14, 0x14, 0x16, 0x13, 0x16, 0x18, 0x15,
+ 0x15, 0x17, 0x14, 0x17, 0x19, 0x16, 0x19, 0x1b, 0x1a, 0x15, 0x17, 0x16,
+ 0x16, 0x18, 0x17, 0x17, 0x19, 0x18, 0x15, 0x17, 0x16, 0x15, 0x17, 0x16,
+ 0x12, 0x12, 0x12, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x19, 0x1b, 0x1a, 0x1b, 0x1d, 0x1c,
+ 0x19, 0x1b, 0x1a, 0x17, 0x19, 0x18, 0x19, 0x1b, 0x18, 0x19, 0x1b, 0x18,
+ 0x14, 0x16, 0x15, 0x13, 0x14, 0x13, 0x13, 0x13, 0x12, 0x0c, 0x0c, 0x0c,
+ 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04,
+ 0x05, 0x05, 0x05, 0x07, 0x07, 0x07, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0c,
+ 0x0b, 0x0b, 0x0d, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0f, 0x12, 0x12, 0x12,
+ 0x11, 0x11, 0x0f, 0x16, 0x16, 0x14, 0x19, 0x19, 0x17, 0x18, 0x18, 0x16,
+ 0x0f, 0x0f, 0x0d, 0x07, 0x07, 0x06, 0x06, 0x06, 0x04, 0x0c, 0x0c, 0x0a,
+ 0x23, 0x25, 0x20, 0x25, 0x27, 0x21, 0x26, 0x28, 0x23, 0x3e, 0x3f, 0x3a,
+ 0x43, 0x45, 0x40, 0x22, 0x23, 0x21, 0x10, 0x11, 0x13, 0x0b, 0x0c, 0x0e,
+ 0x09, 0x0a, 0x0e, 0x0e, 0x0f, 0x11, 0x25, 0x25, 0x25, 0x40, 0x3f, 0x3d,
+ 0x3e, 0x3d, 0x3b, 0x2d, 0x2c, 0x2c, 0x20, 0x21, 0x23, 0x15, 0x19, 0x1c,
+ 0x23, 0x24, 0x28, 0x28, 0x29, 0x2d, 0x1d, 0x1e, 0x22, 0x24, 0x25, 0x27,
+ 0x24, 0x25, 0x25, 0x26, 0x27, 0x24, 0x2b, 0x2b, 0x27, 0x2c, 0x2b, 0x27,
+ 0x29, 0x29, 0x26, 0x1a, 0x1a, 0x18, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x0e, 0x0e, 0x0e,
+ 0x14, 0x16, 0x15, 0x0a, 0x0c, 0x0b, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x16, 0x16, 0x17, 0x1a, 0x1a, 0x1a,
+ 0x1e, 0x1d, 0x1e, 0x19, 0x17, 0x18, 0x1c, 0x1a, 0x1d, 0x18, 0x16, 0x19,
+ 0x16, 0x15, 0x17, 0x15, 0x15, 0x15, 0x10, 0x10, 0x10, 0x1f, 0x1f, 0x1d,
+ 0x40, 0x40, 0x45, 0x3b, 0x3c, 0x41, 0x38, 0x38, 0x40, 0x2a, 0x2b, 0x30,
+ 0x20, 0x21, 0x25, 0x2e, 0x2e, 0x30, 0x2a, 0x2a, 0x2c, 0x1a, 0x19, 0x1e,
+ 0x0e, 0x0e, 0x10, 0x1d, 0x1d, 0x20, 0x33, 0x33, 0x37, 0x19, 0x1a, 0x1a,
+ 0x1b, 0x18, 0x17, 0x28, 0x21, 0x1e, 0x33, 0x26, 0x26, 0x39, 0x29, 0x2b,
+ 0x6f, 0x70, 0x74, 0xb8, 0xb6, 0xbc, 0x59, 0x4e, 0x56, 0x5a, 0x49, 0x4f,
+ 0x61, 0x4c, 0x4c, 0x62, 0x4e, 0x4b, 0x61, 0x4e, 0x4a, 0x5e, 0x4c, 0x4a,
+ 0x5b, 0x4c, 0x47, 0x5f, 0x52, 0x4a, 0x5f, 0x52, 0x49, 0x64, 0x5a, 0x4e,
+ 0x7e, 0x74, 0x68, 0x8d, 0x85, 0x78, 0x83, 0x7a, 0x6d, 0x89, 0x7f, 0x75,
+ 0x88, 0x7e, 0x75, 0x7d, 0x73, 0x69, 0x56, 0x4c, 0x45, 0x66, 0x62, 0x5e,
+ 0x8e, 0x91, 0x90, 0x8a, 0x94, 0x97, 0x88, 0x92, 0x9c, 0x86, 0x90, 0x9c,
+ 0x84, 0x8e, 0x98, 0x87, 0x90, 0x9a, 0x85, 0x8e, 0x97, 0x7f, 0x86, 0x8e,
+ 0x75, 0x7b, 0x7f, 0x5d, 0x60, 0x64, 0x46, 0x46, 0x49, 0x3d, 0x3e, 0x3c,
+ 0x81, 0x7e, 0x63, 0x8a, 0x84, 0x69, 0x88, 0x82, 0x68, 0x93, 0x89, 0x70,
+ 0x85, 0x7b, 0x63, 0x8c, 0x81, 0x6b, 0x8a, 0x82, 0x6b, 0x82, 0x7a, 0x65,
+ 0x7f, 0x74, 0x60, 0x73, 0x6b, 0x54, 0x7d, 0x79, 0x5e, 0xaf, 0xab, 0x8d,
+ 0xd5, 0xd1, 0xb6, 0xd6, 0xd4, 0xbd, 0xd4, 0xd3, 0xc0, 0xcf, 0xd2, 0xc1,
+ 0xd0, 0xd0, 0xbe, 0xd0, 0xcf, 0xc4, 0xa9, 0xa9, 0xa9, 0x70, 0x73, 0x7e,
+ 0x5d, 0x62, 0x75, 0xb4, 0xbc, 0xd1, 0xba, 0xc7, 0xda, 0xb5, 0xc4, 0xd6,
+ 0xc0, 0xc8, 0xdf, 0xc2, 0xc9, 0xe3, 0xc2, 0xc9, 0xdf, 0x98, 0x9a, 0xa7,
+ 0xa4, 0xa3, 0xa1, 0xa8, 0xa5, 0x9b, 0xb3, 0xb0, 0xa9, 0xb5, 0xb4, 0xb0,
+ 0xba, 0xba, 0xb5, 0xda, 0xdb, 0xd6, 0xc3, 0xc5, 0xc2, 0xbf, 0xc0, 0xbf,
+ 0xb8, 0xb6, 0xb7, 0xb4, 0xb3, 0xb3, 0xb8, 0xb8, 0xb6, 0xbf, 0xc0, 0xbe,
+ 0xb4, 0xb4, 0xb2, 0xb8, 0xb9, 0xb8, 0xb0, 0xb0, 0xb1, 0xaa, 0xaa, 0xac,
+ 0xab, 0xab, 0xad, 0xa5, 0xa5, 0xa6, 0x99, 0x99, 0x99, 0xa5, 0xa4, 0xa2,
+ 0xad, 0xac, 0xa7, 0xa2, 0xa1, 0xa3, 0xa3, 0xa8, 0xb3, 0x9e, 0xa5, 0xb7,
+ 0x98, 0xa1, 0xb3, 0x86, 0x8e, 0xa0, 0x67, 0x6b, 0x7d, 0x49, 0x4a, 0x5c,
+ 0x4b, 0x4b, 0x56, 0x35, 0x35, 0x41, 0x35, 0x38, 0x47, 0x29, 0x2f, 0x3b,
+ 0x1b, 0x24, 0x2b, 0x19, 0x22, 0x27, 0x1b, 0x25, 0x27, 0x2c, 0x36, 0x38,
+ 0x3a, 0x44, 0x4b, 0x27, 0x32, 0x38, 0x16, 0x1f, 0x24, 0x1d, 0x26, 0x2b,
+ 0x43, 0x4c, 0x52, 0x2c, 0x35, 0x3c, 0x13, 0x1c, 0x25, 0x14, 0x1c, 0x27,
+ 0x19, 0x20, 0x28, 0x1a, 0x21, 0x29, 0x1a, 0x21, 0x29, 0x18, 0x1f, 0x29,
+ 0x17, 0x20, 0x29, 0x15, 0x1f, 0x26, 0x24, 0x2f, 0x35, 0x3c, 0x47, 0x4c,
+ 0x1d, 0x25, 0x34, 0x14, 0x1a, 0x27, 0x1d, 0x22, 0x2a, 0x29, 0x2d, 0x30,
+ 0x39, 0x3d, 0x3e, 0x59, 0x5e, 0x60, 0x43, 0x46, 0x4c, 0x2e, 0x33, 0x39,
+ 0x2b, 0x32, 0x34, 0x28, 0x30, 0x32, 0x32, 0x3a, 0x3b, 0x31, 0x39, 0x3b,
+ 0x33, 0x3b, 0x3e, 0x2f, 0x36, 0x3c, 0x2b, 0x33, 0x3b, 0x2c, 0x35, 0x3c,
+ 0x2c, 0x36, 0x38, 0x2d, 0x37, 0x39, 0x30, 0x39, 0x3b, 0x33, 0x3b, 0x3d,
+ 0x36, 0x3e, 0x40, 0x38, 0x40, 0x42, 0x34, 0x3b, 0x3d, 0x33, 0x3b, 0x3e,
+ 0x35, 0x3d, 0x40, 0x3a, 0x40, 0x44, 0x3a, 0x3f, 0x43, 0x39, 0x3e, 0x42,
+ 0x3a, 0x3f, 0x43, 0x39, 0x40, 0x46, 0x3a, 0x43, 0x49, 0x3a, 0x43, 0x4a,
+ 0x3a, 0x43, 0x49, 0x36, 0x3f, 0x46, 0x39, 0x43, 0x47, 0x3b, 0x45, 0x47,
+ 0x3b, 0x46, 0x48, 0x3c, 0x47, 0x49, 0x3e, 0x49, 0x4b, 0x3e, 0x49, 0x4d,
+ 0x3f, 0x4a, 0x50, 0x3e, 0x47, 0x4e, 0x3b, 0x41, 0x4a, 0x39, 0x3d, 0x46,
+ 0x35, 0x3a, 0x40, 0x3f, 0x44, 0x49, 0x4e, 0x56, 0x59, 0x3d, 0x48, 0x48,
+ 0x51, 0x5f, 0x5f, 0x5a, 0x69, 0x66, 0x7c, 0x8b, 0x88, 0xbe, 0xcc, 0xcd,
+ 0xb7, 0xc3, 0xcd, 0xb3, 0xbc, 0xcb, 0xb2, 0xbc, 0xc8, 0xb4, 0xbd, 0xc7,
+ 0xb1, 0xbb, 0xca, 0xb0, 0xbb, 0xca, 0xb1, 0xbd, 0xcb, 0xb4, 0xc0, 0xce,
+ 0xb4, 0xc1, 0xd1, 0xb4, 0xc2, 0xd2, 0xb3, 0xc3, 0xd2, 0xb4, 0xc4, 0xd3,
+ 0xb6, 0xc3, 0xd4, 0xb7, 0xc4, 0xd4, 0xb7, 0xc4, 0xd4, 0xb7, 0xc4, 0xd4,
+ 0xb8, 0xc6, 0xd5, 0xb9, 0xc7, 0xd7, 0xb9, 0xc7, 0xd6, 0xb9, 0xc6, 0xd7,
+ 0xb7, 0xc8, 0xd9, 0xb9, 0xc7, 0xd8, 0xae, 0xb8, 0xc7, 0x99, 0x9d, 0xaa,
+ 0x8e, 0x8e, 0x99, 0x8d, 0x8c, 0x92, 0x90, 0x91, 0x91, 0x94, 0x94, 0x92,
+ 0x97, 0x97, 0x95, 0x9c, 0x9e, 0x9b, 0xa1, 0xa7, 0xa5, 0xa7, 0xb0, 0xb1,
+ 0xb1, 0xbc, 0xc0, 0xb3, 0xc1, 0xc7, 0xb7, 0xc5, 0xce, 0xbb, 0xc9, 0xd5,
+ 0x0d, 0x0d, 0x0d, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, 0x17, 0x15,
+ 0x17, 0x17, 0x16, 0x18, 0x18, 0x17, 0x17, 0x18, 0x18, 0x16, 0x18, 0x17,
+ 0x17, 0x19, 0x18, 0x17, 0x19, 0x18, 0x15, 0x17, 0x16, 0x15, 0x16, 0x15,
+ 0x15, 0x15, 0x15, 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x08, 0x08, 0x0f, 0x11, 0x10, 0x17, 0x19, 0x18,
+ 0x1b, 0x1d, 0x1c, 0x1c, 0x1e, 0x1d, 0x1b, 0x1d, 0x1a, 0x1b, 0x1d, 0x1a,
+ 0x15, 0x17, 0x14, 0x16, 0x18, 0x15, 0x16, 0x18, 0x16, 0x11, 0x11, 0x11,
+ 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04,
+ 0x06, 0x06, 0x07, 0x08, 0x08, 0x0a, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0c,
+ 0x0c, 0x0c, 0x0e, 0x0b, 0x0b, 0x0d, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0d,
+ 0x11, 0x11, 0x11, 0x15, 0x15, 0x15, 0x17, 0x17, 0x16, 0x12, 0x12, 0x12,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x0a, 0x0a, 0x09,
+ 0x20, 0x22, 0x1d, 0x2a, 0x2b, 0x25, 0x3f, 0x40, 0x38, 0x6e, 0x6f, 0x67,
+ 0x6f, 0x70, 0x68, 0x26, 0x27, 0x22, 0x14, 0x13, 0x16, 0x11, 0x11, 0x16,
+ 0x0e, 0x0f, 0x11, 0x11, 0x12, 0x14, 0x2f, 0x2f, 0x2d, 0x64, 0x64, 0x62,
+ 0x52, 0x52, 0x50, 0x26, 0x26, 0x24, 0x1a, 0x1b, 0x1c, 0x21, 0x24, 0x28,
+ 0x31, 0x35, 0x35, 0x28, 0x2c, 0x2d, 0x1d, 0x21, 0x24, 0x29, 0x2c, 0x30,
+ 0x34, 0x35, 0x39, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2a, 0x2e, 0x2d, 0x29,
+ 0x2f, 0x2e, 0x2c, 0x27, 0x27, 0x25, 0x1c, 0x1c, 0x1b, 0x0d, 0x0d, 0x0d,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0c, 0x0a, 0x0a, 0x0c, 0x0b, 0x0b, 0x0d,
+ 0x18, 0x1a, 0x19, 0x17, 0x19, 0x18, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x15, 0x15, 0x15, 0x1b, 0x1a, 0x1b,
+ 0x22, 0x20, 0x21, 0x19, 0x17, 0x17, 0x1c, 0x1a, 0x1d, 0x19, 0x17, 0x1b,
+ 0x16, 0x16, 0x17, 0x14, 0x14, 0x14, 0x11, 0x10, 0x10, 0x1d, 0x1d, 0x1b,
+ 0x41, 0x41, 0x47, 0x3d, 0x3c, 0x47, 0x3a, 0x3a, 0x45, 0x2e, 0x2e, 0x38,
+ 0x21, 0x22, 0x27, 0x29, 0x2a, 0x2e, 0x28, 0x27, 0x2c, 0x1b, 0x1a, 0x20,
+ 0x0d, 0x0e, 0x11, 0x1a, 0x1b, 0x1f, 0x31, 0x32, 0x36, 0x1d, 0x1d, 0x1f,
+ 0x1a, 0x17, 0x16, 0x1d, 0x17, 0x15, 0x29, 0x1f, 0x1d, 0x46, 0x39, 0x3c,
+ 0x8d, 0x93, 0xa2, 0xb5, 0xb8, 0xca, 0x6a, 0x65, 0x75, 0x5b, 0x4e, 0x5a,
+ 0x64, 0x53, 0x59, 0x61, 0x4f, 0x4e, 0x5d, 0x4b, 0x49, 0x5e, 0x4c, 0x4a,
+ 0x5e, 0x4c, 0x4c, 0x5f, 0x4e, 0x4b, 0x5c, 0x4d, 0x48, 0x59, 0x4a, 0x45,
+ 0x59, 0x4a, 0x43, 0x52, 0x43, 0x3e, 0x4e, 0x3f, 0x3a, 0x52, 0x40, 0x3e,
+ 0x4e, 0x3a, 0x3b, 0x4c, 0x37, 0x38, 0x44, 0x34, 0x34, 0x49, 0x41, 0x41,
+ 0x90, 0x92, 0x94, 0x91, 0x9e, 0xa0, 0x8f, 0x9f, 0xa4, 0x8b, 0x9c, 0xa4,
+ 0x85, 0x92, 0x9a, 0x7c, 0x85, 0x8f, 0x76, 0x80, 0x89, 0x6f, 0x76, 0x7e,
+ 0x63, 0x66, 0x6d, 0x50, 0x50, 0x55, 0x3c, 0x38, 0x3b, 0x3f, 0x39, 0x3a,
+ 0x7b, 0x7b, 0x64, 0x85, 0x84, 0x6c, 0x84, 0x7f, 0x67, 0x95, 0x8d, 0x76,
+ 0x87, 0x80, 0x66, 0x83, 0x7c, 0x62, 0x8f, 0x89, 0x6e, 0x90, 0x8a, 0x71,
+ 0x8d, 0x83, 0x70, 0x8c, 0x86, 0x70, 0x7d, 0x7a, 0x60, 0x77, 0x76, 0x5a,
+ 0xa7, 0xa4, 0x89, 0xd5, 0xd3, 0xba, 0xdb, 0xdb, 0xc3, 0xd1, 0xd4, 0xbd,
+ 0xca, 0xcb, 0xbe, 0xc1, 0xc2, 0xbc, 0x90, 0x91, 0x95, 0x74, 0x78, 0x85,
+ 0x53, 0x58, 0x6d, 0x9a, 0xa2, 0xb7, 0xbf, 0xc8, 0xdb, 0xbb, 0xc6, 0xd6,
+ 0xb9, 0xc2, 0xd1, 0xbf, 0xc8, 0xdb, 0xd1, 0xd7, 0xed, 0xb1, 0xb2, 0xc3,
+ 0x9a, 0x98, 0x9e, 0xa8, 0xa4, 0xa1, 0xa6, 0xa6, 0x9c, 0xac, 0xad, 0xa2,
+ 0xb0, 0xae, 0xa7, 0xbc, 0xbb, 0xb6, 0xb9, 0xb9, 0xb5, 0xb6, 0xb6, 0xb3,
+ 0xb0, 0xae, 0xaf, 0xb3, 0xb1, 0xb0, 0xbd, 0xbc, 0xba, 0xba, 0xbb, 0xb9,
+ 0xb5, 0xb5, 0xb5, 0xba, 0xb9, 0xba, 0xbd, 0xbc, 0xbb, 0xb2, 0xb1, 0xaf,
+ 0xaa, 0xa9, 0xa7, 0xa1, 0x9d, 0x9a, 0x9a, 0x97, 0x92, 0xa2, 0x9f, 0x98,
+ 0xa6, 0xa4, 0xa4, 0xa7, 0xa7, 0xae, 0xa3, 0xa9, 0xb7, 0x9d, 0xa6, 0xb9,
+ 0x98, 0xa5, 0xb6, 0x94, 0xa1, 0xb1, 0x85, 0x92, 0xa2, 0x68, 0x70, 0x81,
+ 0x52, 0x55, 0x61, 0x32, 0x34, 0x41, 0x36, 0x39, 0x48, 0x24, 0x28, 0x35,
+ 0x17, 0x1e, 0x23, 0x11, 0x19, 0x1b, 0x25, 0x2d, 0x2d, 0x44, 0x4b, 0x4b,
+ 0x33, 0x3d, 0x43, 0x19, 0x23, 0x29, 0x17, 0x20, 0x27, 0x1d, 0x26, 0x2f,
+ 0x33, 0x3a, 0x42, 0x33, 0x37, 0x40, 0x19, 0x1e, 0x24, 0x23, 0x28, 0x2c,
+ 0x2e, 0x31, 0x35, 0x25, 0x28, 0x2f, 0x1b, 0x1f, 0x2a, 0x1c, 0x21, 0x2d,
+ 0x1e, 0x26, 0x31, 0x23, 0x2d, 0x34, 0x27, 0x32, 0x36, 0x38, 0x45, 0x46,
+ 0x34, 0x3a, 0x49, 0x1a, 0x1f, 0x2d, 0x22, 0x27, 0x31, 0x2e, 0x32, 0x39,
+ 0x26, 0x29, 0x2e, 0x34, 0x38, 0x3b, 0x36, 0x3a, 0x3b, 0x30, 0x34, 0x35,
+ 0x2e, 0x32, 0x31, 0x27, 0x2b, 0x2a, 0x2d, 0x32, 0x33, 0x33, 0x38, 0x3c,
+ 0x3d, 0x42, 0x47, 0x3a, 0x3f, 0x45, 0x2f, 0x34, 0x38, 0x2e, 0x33, 0x37,
+ 0x30, 0x37, 0x3b, 0x33, 0x3b, 0x3e, 0x34, 0x3c, 0x3f, 0x32, 0x3a, 0x3c,
+ 0x34, 0x3e, 0x3d, 0x38, 0x42, 0x43, 0x33, 0x3d, 0x3e, 0x34, 0x3e, 0x3f,
+ 0x32, 0x3b, 0x3d, 0x35, 0x3d, 0x40, 0x36, 0x3d, 0x41, 0x34, 0x3b, 0x41,
+ 0x37, 0x3e, 0x44, 0x36, 0x3e, 0x45, 0x38, 0x41, 0x48, 0x38, 0x41, 0x48,
+ 0x38, 0x3f, 0x4a, 0x3a, 0x40, 0x4c, 0x3a, 0x42, 0x4a, 0x39, 0x42, 0x47,
+ 0x3a, 0x43, 0x46, 0x38, 0x42, 0x44, 0x3a, 0x44, 0x45, 0x39, 0x43, 0x44,
+ 0x38, 0x40, 0x4a, 0x35, 0x3d, 0x48, 0x34, 0x3b, 0x45, 0x33, 0x38, 0x40,
+ 0x35, 0x3a, 0x40, 0x4e, 0x54, 0x58, 0x41, 0x4a, 0x49, 0x3f, 0x49, 0x48,
+ 0x57, 0x65, 0x64, 0x57, 0x66, 0x63, 0xa0, 0xae, 0xac, 0xc0, 0xcd, 0xd1,
+ 0xb5, 0xbf, 0xca, 0xaf, 0xb9, 0xc5, 0xaf, 0xb9, 0xc5, 0xb2, 0xbb, 0xc5,
+ 0xaf, 0xbb, 0xc9, 0xb0, 0xbc, 0xcb, 0xb2, 0xbe, 0xcc, 0xb2, 0xc0, 0xcd,
+ 0xb4, 0xc1, 0xd1, 0xb4, 0xc1, 0xd1, 0xb2, 0xc2, 0xd1, 0xb4, 0xc4, 0xd3,
+ 0xb4, 0xc3, 0xd4, 0xb6, 0xc3, 0xd3, 0xb7, 0xc4, 0xd4, 0xb8, 0xc5, 0xd5,
+ 0xb9, 0xc6, 0xd6, 0xba, 0xc6, 0xd6, 0xba, 0xc6, 0xd6, 0xb9, 0xc4, 0xd6,
+ 0xba, 0xc9, 0xdc, 0xb9, 0xc4, 0xd6, 0xa3, 0xaa, 0xba, 0x92, 0x96, 0xa3,
+ 0x8b, 0x8b, 0x93, 0x8d, 0x8c, 0x91, 0x91, 0x92, 0x92, 0x94, 0x95, 0x93,
+ 0x97, 0x99, 0x97, 0x9b, 0x9e, 0x9d, 0xa3, 0xa9, 0xa9, 0xac, 0xb5, 0xb8,
+ 0xb6, 0xc1, 0xc5, 0xb8, 0xc5, 0xcc, 0xb9, 0xc6, 0xcf, 0xbc, 0xca, 0xd5,
+ 0x0f, 0x0f, 0x0f, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x16, 0x16, 0x16,
+ 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x16, 0x16, 0x16,
+ 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x16, 0x19, 0x18, 0x17, 0x19, 0x18,
+ 0x17, 0x17, 0x17, 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0e, 0x0e, 0x0e, 0x13, 0x15, 0x14,
+ 0x12, 0x14, 0x13, 0x1d, 0x1f, 0x1e, 0x1f, 0x21, 0x1e, 0x18, 0x1a, 0x17,
+ 0x16, 0x18, 0x15, 0x17, 0x19, 0x16, 0x19, 0x1c, 0x18, 0x18, 0x19, 0x17,
+ 0x13, 0x13, 0x13, 0x0a, 0x0a, 0x0a, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07,
+ 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x06,
+ 0x0a, 0x0a, 0x08, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x11, 0x11, 0x11, 0x13, 0x13, 0x13, 0x0f, 0x0f, 0x0f,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x13, 0x13, 0x11, 0x33, 0x35, 0x2e, 0x6b, 0x6c, 0x62, 0x7d, 0x7d, 0x72,
+ 0x4d, 0x4d, 0x43, 0x1b, 0x1c, 0x16, 0x15, 0x15, 0x15, 0x17, 0x17, 0x1c,
+ 0x14, 0x15, 0x17, 0x14, 0x15, 0x15, 0x28, 0x28, 0x26, 0x66, 0x65, 0x63,
+ 0x4f, 0x4f, 0x4d, 0x2b, 0x2d, 0x2a, 0x25, 0x27, 0x26, 0x2e, 0x32, 0x33,
+ 0x2d, 0x31, 0x30, 0x28, 0x2c, 0x2d, 0x33, 0x36, 0x3c, 0x36, 0x39, 0x43,
+ 0x41, 0x43, 0x4c, 0x43, 0x44, 0x4a, 0x3b, 0x3b, 0x3d, 0x30, 0x30, 0x2f,
+ 0x2b, 0x2b, 0x29, 0x2f, 0x2f, 0x2d, 0x30, 0x30, 0x2e, 0x1c, 0x1c, 0x1a,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0a, 0x0c, 0x0b, 0x07, 0x09, 0x0a,
+ 0x18, 0x1a, 0x19, 0x1c, 0x1d, 0x1c, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x18, 0x18, 0x18, 0x1b, 0x1b, 0x1b,
+ 0x1c, 0x1a, 0x1b, 0x17, 0x14, 0x16, 0x1c, 0x1a, 0x1d, 0x1b, 0x19, 0x1c,
+ 0x19, 0x19, 0x1b, 0x17, 0x16, 0x17, 0x11, 0x11, 0x11, 0x1b, 0x1c, 0x1a,
+ 0x40, 0x40, 0x47, 0x39, 0x39, 0x44, 0x38, 0x38, 0x44, 0x31, 0x31, 0x3b,
+ 0x20, 0x20, 0x27, 0x29, 0x2a, 0x2e, 0x25, 0x26, 0x2a, 0x1a, 0x1b, 0x1f,
+ 0x0b, 0x0c, 0x0e, 0x1c, 0x1d, 0x20, 0x30, 0x31, 0x35, 0x1d, 0x1e, 0x20,
+ 0x19, 0x17, 0x17, 0x18, 0x12, 0x11, 0x20, 0x17, 0x17, 0x2d, 0x23, 0x27,
+ 0xac, 0xb0, 0xc2, 0xc5, 0xc6, 0xd8, 0x8e, 0x89, 0x9b, 0x63, 0x59, 0x64,
+ 0x61, 0x53, 0x57, 0x5f, 0x4f, 0x4f, 0x5b, 0x4c, 0x4a, 0x5c, 0x4c, 0x4a,
+ 0x5e, 0x4c, 0x4c, 0x5f, 0x4d, 0x4b, 0x61, 0x4f, 0x4b, 0x64, 0x53, 0x4e,
+ 0x61, 0x51, 0x4a, 0x5e, 0x4c, 0x48, 0x5e, 0x4c, 0x48, 0x5d, 0x49, 0x48,
+ 0x56, 0x42, 0x42, 0x54, 0x40, 0x41, 0x51, 0x3f, 0x3f, 0x38, 0x2d, 0x2e,
+ 0x78, 0x78, 0x79, 0x9a, 0xa3, 0xa6, 0x8c, 0x9c, 0xa1, 0x88, 0x99, 0xa0,
+ 0x85, 0x90, 0x99, 0x7c, 0x86, 0x8f, 0x6b, 0x74, 0x7d, 0x5b, 0x62, 0x6a,
+ 0x50, 0x52, 0x59, 0x41, 0x41, 0x46, 0x31, 0x2f, 0x32, 0x39, 0x36, 0x36,
+ 0x51, 0x54, 0x44, 0x66, 0x67, 0x56, 0x78, 0x75, 0x64, 0x82, 0x7d, 0x69,
+ 0x86, 0x7f, 0x6c, 0x80, 0x7a, 0x64, 0x89, 0x84, 0x6d, 0x8d, 0x88, 0x72,
+ 0x92, 0x8b, 0x78, 0x8a, 0x85, 0x6f, 0x7d, 0x7c, 0x64, 0x76, 0x76, 0x5e,
+ 0x6e, 0x6e, 0x56, 0x93, 0x93, 0x7e, 0xc0, 0xc3, 0xae, 0xbe, 0xc3, 0xad,
+ 0xaa, 0xab, 0xa4, 0x9c, 0x9d, 0x9d, 0x77, 0x7a, 0x83, 0x68, 0x6e, 0x7e,
+ 0x6b, 0x70, 0x84, 0x7a, 0x7f, 0x93, 0xa0, 0xa5, 0xb8, 0xbb, 0xc1, 0xce,
+ 0xc2, 0xc9, 0xd0, 0xbd, 0xc3, 0xd1, 0xbf, 0xc2, 0xd6, 0xc1, 0xc0, 0xd3,
+ 0xa1, 0x9c, 0xa8, 0x95, 0x8f, 0x8f, 0xa0, 0x9e, 0x92, 0xaa, 0xab, 0x9a,
+ 0xb0, 0xae, 0xa3, 0xaf, 0xae, 0xa5, 0xb6, 0xb7, 0xaf, 0xb3, 0xb4, 0xae,
+ 0xb5, 0xb4, 0xaf, 0xb0, 0xaf, 0xab, 0xb7, 0xb7, 0xb2, 0xb8, 0xba, 0xb4,
+ 0xb1, 0xb2, 0xad, 0xb3, 0xb3, 0xaf, 0xb9, 0xb8, 0xb4, 0xae, 0xac, 0xa8,
+ 0xa0, 0x9d, 0x98, 0x9c, 0x99, 0x95, 0xa1, 0x9e, 0x99, 0xa8, 0xa5, 0xa0,
+ 0xa4, 0xa7, 0xa9, 0xa5, 0xaa, 0xb3, 0xa0, 0xa9, 0xb8, 0x9b, 0xa9, 0xba,
+ 0x95, 0xa5, 0xb5, 0x8d, 0x9a, 0xab, 0x7f, 0x8c, 0x9c, 0x71, 0x7a, 0x8b,
+ 0x5a, 0x5d, 0x6a, 0x32, 0x36, 0x42, 0x31, 0x35, 0x43, 0x1f, 0x23, 0x2e,
+ 0x18, 0x1d, 0x21, 0x13, 0x19, 0x19, 0x2c, 0x31, 0x2f, 0x47, 0x4c, 0x4b,
+ 0x26, 0x31, 0x36, 0x19, 0x22, 0x29, 0x1c, 0x25, 0x2e, 0x2a, 0x31, 0x3b,
+ 0x25, 0x29, 0x32, 0x24, 0x26, 0x2b, 0x23, 0x24, 0x27, 0x39, 0x39, 0x39,
+ 0x51, 0x50, 0x4b, 0x49, 0x4a, 0x48, 0x35, 0x36, 0x3c, 0x25, 0x29, 0x34,
+ 0x2c, 0x33, 0x3d, 0x3d, 0x46, 0x4d, 0x32, 0x3d, 0x3f, 0x47, 0x53, 0x52,
+ 0x5e, 0x63, 0x6d, 0x55, 0x59, 0x64, 0x4a, 0x4d, 0x58, 0x35, 0x38, 0x41,
+ 0x27, 0x2a, 0x31, 0x2b, 0x2c, 0x31, 0x2a, 0x2b, 0x2f, 0x26, 0x27, 0x2a,
+ 0x29, 0x2b, 0x27, 0x23, 0x25, 0x22, 0x1f, 0x23, 0x24, 0x25, 0x29, 0x2d,
+ 0x2b, 0x2e, 0x33, 0x24, 0x27, 0x2c, 0x24, 0x28, 0x2b, 0x26, 0x2a, 0x2d,
+ 0x28, 0x2c, 0x2f, 0x30, 0x34, 0x37, 0x32, 0x37, 0x3a, 0x34, 0x39, 0x3a,
+ 0x35, 0x3d, 0x3c, 0x37, 0x40, 0x3f, 0x32, 0x3b, 0x3b, 0x31, 0x3b, 0x3c,
+ 0x30, 0x38, 0x3b, 0x32, 0x3a, 0x3d, 0x31, 0x39, 0x3e, 0x32, 0x39, 0x3f,
+ 0x34, 0x3d, 0x44, 0x35, 0x3e, 0x45, 0x35, 0x3f, 0x45, 0x36, 0x40, 0x47,
+ 0x37, 0x3d, 0x49, 0x37, 0x3e, 0x48, 0x37, 0x3e, 0x46, 0x37, 0x3e, 0x44,
+ 0x35, 0x3c, 0x42, 0x35, 0x3c, 0x40, 0x37, 0x3e, 0x42, 0x35, 0x3d, 0x41,
+ 0x32, 0x3a, 0x41, 0x30, 0x39, 0x40, 0x31, 0x38, 0x40, 0x30, 0x37, 0x3e,
+ 0x47, 0x4c, 0x52, 0x49, 0x51, 0x54, 0x35, 0x3e, 0x3d, 0x4b, 0x56, 0x55,
+ 0x57, 0x66, 0x63, 0x64, 0x72, 0x72, 0xb5, 0xc0, 0xc1, 0xbc, 0xc7, 0xcb,
+ 0xb5, 0xbf, 0xc7, 0xaf, 0xb9, 0xc4, 0xaf, 0xb9, 0xc3, 0xb1, 0xbb, 0xc5,
+ 0xaf, 0xbb, 0xc9, 0xb0, 0xbc, 0xca, 0xb2, 0xbe, 0xcc, 0xb4, 0xc2, 0xcf,
+ 0xb4, 0xc1, 0xd1, 0xb5, 0xc1, 0xd2, 0xb4, 0xc2, 0xd1, 0xb4, 0xc4, 0xd3,
+ 0xb4, 0xc4, 0xd4, 0xb5, 0xc4, 0xd4, 0xb8, 0xc5, 0xd5, 0xb8, 0xc5, 0xd5,
+ 0xbb, 0xc7, 0xd7, 0xbb, 0xc7, 0xd7, 0xbb, 0xc7, 0xd7, 0xbd, 0xc6, 0xd9,
+ 0xbc, 0xc8, 0xdb, 0xb1, 0xba, 0xcc, 0x9b, 0xa0, 0xaf, 0x8d, 0x8f, 0x98,
+ 0x8b, 0x8b, 0x90, 0x8d, 0x8e, 0x90, 0x90, 0x92, 0x8f, 0x95, 0x98, 0x94,
+ 0x97, 0x9b, 0x99, 0x9b, 0xa1, 0xa1, 0xa4, 0xad, 0xad, 0xaf, 0xb8, 0xbd,
+ 0xb5, 0xbf, 0xc6, 0xb9, 0xc6, 0xcf, 0xbf, 0xcc, 0xd5, 0xbf, 0xcd, 0xd8,
+ 0x0f, 0x0f, 0x0f, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17,
+ 0x19, 0x1b, 0x1a, 0x16, 0x19, 0x17, 0x16, 0x18, 0x17, 0x17, 0x19, 0x18,
+ 0x18, 0x18, 0x18, 0x11, 0x11, 0x11, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0d, 0x0d, 0x0d, 0x14, 0x14, 0x15,
+ 0x14, 0x14, 0x14, 0x15, 0x17, 0x16, 0x1c, 0x1e, 0x1d, 0x1d, 0x1f, 0x1c,
+ 0x18, 0x1a, 0x17, 0x16, 0x18, 0x15, 0x16, 0x19, 0x15, 0x17, 0x19, 0x16,
+ 0x18, 0x18, 0x18, 0x13, 0x13, 0x13, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x06, 0x06, 0x04, 0x07, 0x07, 0x04, 0x0f, 0x0f, 0x0b, 0x2a, 0x2b, 0x25,
+ 0x1e, 0x1f, 0x19, 0x0e, 0x0f, 0x0a, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x07, 0x26, 0x27, 0x22, 0x5f, 0x5f, 0x55, 0x51, 0x51, 0x46,
+ 0x27, 0x27, 0x1d, 0x1b, 0x1b, 0x14, 0x15, 0x15, 0x15, 0x19, 0x18, 0x1d,
+ 0x17, 0x18, 0x1a, 0x18, 0x19, 0x1b, 0x18, 0x1a, 0x19, 0x27, 0x29, 0x26,
+ 0x2e, 0x30, 0x2d, 0x44, 0x46, 0x43, 0x44, 0x48, 0x47, 0x2f, 0x33, 0x32,
+ 0x2d, 0x31, 0x30, 0x39, 0x3d, 0x3f, 0x3f, 0x44, 0x4c, 0x41, 0x45, 0x51,
+ 0x41, 0x43, 0x50, 0x46, 0x48, 0x54, 0x41, 0x41, 0x49, 0x38, 0x39, 0x3d,
+ 0x2e, 0x30, 0x30, 0x2c, 0x2e, 0x2c, 0x2f, 0x30, 0x2e, 0x1e, 0x1e, 0x1c,
+ 0x0b, 0x0b, 0x09, 0x0a, 0x0a, 0x08, 0x08, 0x0b, 0x08, 0x07, 0x09, 0x08,
+ 0x14, 0x16, 0x16, 0x20, 0x22, 0x21, 0x0f, 0x10, 0x10, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x11, 0x11, 0x11, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19,
+ 0x16, 0x15, 0x16, 0x15, 0x14, 0x15, 0x1b, 0x1b, 0x1d, 0x18, 0x18, 0x1a,
+ 0x18, 0x17, 0x1a, 0x17, 0x16, 0x17, 0x13, 0x11, 0x12, 0x1b, 0x1a, 0x18,
+ 0x3e, 0x3f, 0x42, 0x39, 0x38, 0x41, 0x35, 0x35, 0x3f, 0x2e, 0x2e, 0x38,
+ 0x20, 0x20, 0x26, 0x29, 0x2a, 0x2c, 0x23, 0x24, 0x26, 0x1b, 0x1c, 0x1e,
+ 0x0a, 0x0b, 0x0c, 0x23, 0x24, 0x28, 0x36, 0x36, 0x3b, 0x21, 0x21, 0x23,
+ 0x17, 0x15, 0x15, 0x16, 0x12, 0x11, 0x1a, 0x14, 0x13, 0x20, 0x18, 0x1b,
+ 0x3a, 0x37, 0x40, 0x57, 0x51, 0x5b, 0x77, 0x70, 0x79, 0x77, 0x6e, 0x74,
+ 0x5d, 0x51, 0x51, 0x5d, 0x4f, 0x4c, 0x5b, 0x4d, 0x4b, 0x5d, 0x4f, 0x4d,
+ 0x62, 0x50, 0x4d, 0x61, 0x51, 0x4c, 0x5f, 0x50, 0x49, 0x62, 0x54, 0x4b,
+ 0x61, 0x53, 0x4a, 0x61, 0x53, 0x4a, 0x60, 0x4f, 0x48, 0x5f, 0x4d, 0x49,
+ 0x5a, 0x4b, 0x45, 0x56, 0x47, 0x42, 0x52, 0x43, 0x3e, 0x3c, 0x30, 0x2e,
+ 0x53, 0x4f, 0x4e, 0x95, 0x99, 0x9c, 0x8b, 0x94, 0x99, 0x85, 0x8e, 0x97,
+ 0x7b, 0x82, 0x8a, 0x70, 0x77, 0x7f, 0x5f, 0x66, 0x6e, 0x4d, 0x52, 0x58,
+ 0x3c, 0x41, 0x45, 0x2b, 0x2e, 0x31, 0x25, 0x26, 0x27, 0x2c, 0x2c, 0x2c,
+ 0x2e, 0x31, 0x2a, 0x3b, 0x3d, 0x34, 0x57, 0x55, 0x4c, 0x62, 0x5d, 0x52,
+ 0x6e, 0x68, 0x5c, 0x70, 0x69, 0x5c, 0x7c, 0x76, 0x68, 0x7a, 0x77, 0x66,
+ 0x83, 0x81, 0x6d, 0x7a, 0x79, 0x65, 0x78, 0x7a, 0x66, 0x6c, 0x6f, 0x5c,
+ 0x5b, 0x5c, 0x4c, 0x52, 0x54, 0x47, 0x73, 0x77, 0x68, 0x91, 0x96, 0x8a,
+ 0x86, 0x87, 0x84, 0x78, 0x79, 0x7d, 0x62, 0x66, 0x72, 0x5a, 0x5f, 0x72,
+ 0x78, 0x7d, 0x93, 0x61, 0x64, 0x79, 0x5d, 0x5d, 0x6e, 0xa7, 0xa5, 0xb0,
+ 0xc9, 0xcb, 0xd0, 0xc5, 0xc5, 0xcf, 0xac, 0xab, 0xbb, 0xa4, 0x9e, 0xb0,
+ 0x97, 0x8d, 0x9a, 0x75, 0x6a, 0x6c, 0x90, 0x89, 0x7f, 0xa9, 0xa6, 0x95,
+ 0xb8, 0xb6, 0xa9, 0xab, 0xac, 0x9e, 0xae, 0xb0, 0xa3, 0xb7, 0xb9, 0xae,
+ 0xb4, 0xb4, 0xaa, 0xab, 0xab, 0xa3, 0xb1, 0xb2, 0xaa, 0xb2, 0xb5, 0xac,
+ 0xae, 0xb0, 0xa5, 0xae, 0xb0, 0xa5, 0xb2, 0xb2, 0xa8, 0xa1, 0xa1, 0x99,
+ 0x9f, 0x9e, 0x98, 0x9e, 0x9e, 0x9c, 0xa6, 0xa5, 0xa8, 0xa9, 0xab, 0xaf,
+ 0xa0, 0xab, 0xb1, 0xa1, 0xad, 0xb9, 0x9e, 0xac, 0xbd, 0x98, 0xa6, 0xb9,
+ 0x91, 0x9e, 0xaf, 0x89, 0x94, 0xa4, 0x7a, 0x81, 0x91, 0x69, 0x6f, 0x7f,
+ 0x58, 0x5e, 0x6b, 0x36, 0x3c, 0x4a, 0x2d, 0x30, 0x3f, 0x1e, 0x22, 0x2d,
+ 0x14, 0x19, 0x1d, 0x13, 0x19, 0x19, 0x1d, 0x21, 0x20, 0x39, 0x3d, 0x3d,
+ 0x3b, 0x45, 0x49, 0x30, 0x39, 0x40, 0x2b, 0x32, 0x3a, 0x23, 0x27, 0x30,
+ 0x1f, 0x21, 0x29, 0x2b, 0x2b, 0x2d, 0x33, 0x33, 0x31, 0x3c, 0x3b, 0x35,
+ 0x5e, 0x5e, 0x4e, 0x70, 0x72, 0x65, 0x64, 0x66, 0x63, 0x3c, 0x3f, 0x45,
+ 0x30, 0x36, 0x3f, 0x52, 0x59, 0x61, 0x6c, 0x76, 0x78, 0x7b, 0x85, 0x85,
+ 0x8d, 0x91, 0x92, 0x90, 0x94, 0x97, 0x91, 0x94, 0x99, 0x70, 0x73, 0x79,
+ 0x43, 0x46, 0x4d, 0x2b, 0x2c, 0x34, 0x2f, 0x2e, 0x37, 0x27, 0x27, 0x2e,
+ 0x29, 0x2b, 0x27, 0x28, 0x2a, 0x27, 0x27, 0x28, 0x28, 0x24, 0x25, 0x2a,
+ 0x21, 0x22, 0x26, 0x23, 0x24, 0x28, 0x23, 0x24, 0x26, 0x21, 0x22, 0x24,
+ 0x1f, 0x1f, 0x23, 0x24, 0x24, 0x26, 0x28, 0x29, 0x2b, 0x2c, 0x2e, 0x2f,
+ 0x3b, 0x3e, 0x3e, 0x3e, 0x42, 0x42, 0x32, 0x38, 0x38, 0x2f, 0x35, 0x35,
+ 0x2c, 0x33, 0x36, 0x2f, 0x37, 0x3a, 0x2f, 0x36, 0x3c, 0x2d, 0x36, 0x3d,
+ 0x30, 0x39, 0x41, 0x31, 0x3a, 0x43, 0x31, 0x3a, 0x43, 0x33, 0x3c, 0x43,
+ 0x35, 0x3c, 0x42, 0x33, 0x3b, 0x40, 0x32, 0x39, 0x3f, 0x32, 0x39, 0x3f,
+ 0x32, 0x39, 0x3f, 0x34, 0x38, 0x40, 0x32, 0x36, 0x3f, 0x35, 0x39, 0x43,
+ 0x32, 0x3a, 0x3c, 0x2d, 0x36, 0x37, 0x33, 0x3b, 0x3d, 0x4a, 0x52, 0x55,
+ 0x4d, 0x55, 0x58, 0x34, 0x3c, 0x3f, 0x3e, 0x48, 0x49, 0x55, 0x5f, 0x60,
+ 0x54, 0x63, 0x5f, 0x8a, 0x98, 0x97, 0xbc, 0xc7, 0xcb, 0xb3, 0xbe, 0xc4,
+ 0xb1, 0xbb, 0xc2, 0xaf, 0xb9, 0xc2, 0xae, 0xb8, 0xc1, 0xae, 0xba, 0xc4,
+ 0xaf, 0xbb, 0xc9, 0xb0, 0xbc, 0xca, 0xb1, 0xbd, 0xcb, 0xb3, 0xc1, 0xce,
+ 0xb3, 0xc0, 0xd0, 0xb3, 0xc0, 0xd1, 0xb4, 0xc1, 0xd1, 0xb6, 0xc4, 0xd4,
+ 0xb5, 0xc5, 0xd5, 0xb5, 0xc5, 0xd5, 0xb6, 0xc5, 0xd4, 0xb9, 0xc6, 0xd6,
+ 0xba, 0xc7, 0xd7, 0xba, 0xc6, 0xd6, 0xbc, 0xc8, 0xd8, 0xbd, 0xc7, 0xd9,
+ 0xb9, 0xc2, 0xd5, 0xa6, 0xad, 0xbd, 0x93, 0x97, 0xa4, 0x89, 0x8b, 0x92,
+ 0x8a, 0x8b, 0x8d, 0x90, 0x92, 0x91, 0x93, 0x95, 0x94, 0x92, 0x96, 0x94,
+ 0x97, 0x9d, 0x9c, 0x9e, 0xa7, 0xa7, 0xa7, 0xb1, 0xb3, 0xb1, 0xbb, 0xc2,
+ 0xb5, 0xc2, 0xcb, 0xb7, 0xc4, 0xcd, 0xbc, 0xc9, 0xd4, 0xc0, 0xcc, 0xd8,
+ 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10, 0x17, 0x17, 0x18, 0x17, 0x17, 0x19,
+ 0x17, 0x16, 0x18, 0x15, 0x15, 0x15, 0x16, 0x18, 0x17, 0x19, 0x1b, 0x1a,
+ 0x19, 0x1b, 0x1a, 0x18, 0x1a, 0x19, 0x16, 0x18, 0x17, 0x16, 0x18, 0x17,
+ 0x18, 0x18, 0x18, 0x12, 0x12, 0x12, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0c, 0x12, 0x12, 0x14,
+ 0x15, 0x15, 0x16, 0x14, 0x14, 0x14, 0x12, 0x13, 0x12, 0x19, 0x1b, 0x17,
+ 0x1d, 0x1f, 0x1c, 0x1c, 0x1e, 0x1b, 0x19, 0x1b, 0x18, 0x1a, 0x1c, 0x19,
+ 0x1b, 0x1d, 0x1a, 0x16, 0x17, 0x14, 0x13, 0x13, 0x11, 0x0f, 0x0f, 0x0d,
+ 0x09, 0x09, 0x07, 0x07, 0x08, 0x03, 0x41, 0x42, 0x3a, 0x7e, 0x80, 0x75,
+ 0x61, 0x63, 0x58, 0x19, 0x1a, 0x12, 0x0c, 0x0c, 0x08, 0x0c, 0x0c, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x07, 0x08, 0x08, 0x10, 0x10, 0x0e, 0x1e, 0x1f, 0x19, 0x26, 0x26, 0x1e,
+ 0x2a, 0x2a, 0x22, 0x26, 0x27, 0x20, 0x1f, 0x1f, 0x1d, 0x1b, 0x1b, 0x1d,
+ 0x17, 0x1b, 0x1c, 0x18, 0x1c, 0x1c, 0x14, 0x18, 0x18, 0x1a, 0x1e, 0x1d,
+ 0x38, 0x3d, 0x39, 0x5e, 0x63, 0x5f, 0x52, 0x56, 0x55, 0x27, 0x2c, 0x2a,
+ 0x1b, 0x1f, 0x1f, 0x31, 0x34, 0x37, 0x43, 0x45, 0x4e, 0x49, 0x4c, 0x59,
+ 0x47, 0x4a, 0x58, 0x3d, 0x40, 0x4f, 0x42, 0x46, 0x52, 0x46, 0x49, 0x54,
+ 0x3e, 0x42, 0x47, 0x38, 0x3d, 0x40, 0x31, 0x33, 0x33, 0x2d, 0x2d, 0x2b,
+ 0x1c, 0x1c, 0x1a, 0x0c, 0x0c, 0x0a, 0x07, 0x09, 0x06, 0x09, 0x0b, 0x08,
+ 0x0c, 0x0e, 0x0c, 0x2a, 0x2c, 0x2b, 0x1a, 0x1b, 0x1b, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x14, 0x14, 0x14,
+ 0x12, 0x12, 0x12, 0x16, 0x16, 0x16, 0x18, 0x18, 0x1a, 0x14, 0x14, 0x16,
+ 0x18, 0x16, 0x19, 0x18, 0x16, 0x17, 0x14, 0x13, 0x13, 0x18, 0x17, 0x15,
+ 0x3b, 0x3b, 0x3b, 0x3b, 0x3a, 0x3f, 0x37, 0x37, 0x3f, 0x30, 0x30, 0x38,
+ 0x1e, 0x1f, 0x24, 0x26, 0x27, 0x2a, 0x24, 0x25, 0x27, 0x1b, 0x1c, 0x1e,
+ 0x0a, 0x0c, 0x0b, 0x27, 0x28, 0x2a, 0x2c, 0x2b, 0x30, 0x1e, 0x1c, 0x1f,
+ 0x19, 0x16, 0x16, 0x18, 0x14, 0x13, 0x17, 0x10, 0x11, 0x1a, 0x13, 0x16,
+ 0x1e, 0x16, 0x17, 0x27, 0x1d, 0x1e, 0x36, 0x2c, 0x2d, 0x65, 0x5a, 0x5a,
+ 0x60, 0x55, 0x51, 0x56, 0x4a, 0x45, 0x59, 0x4b, 0x48, 0x57, 0x49, 0x48,
+ 0x58, 0x49, 0x43, 0x5d, 0x4e, 0x47, 0x60, 0x52, 0x4a, 0x5f, 0x52, 0x49,
+ 0x5f, 0x52, 0x49, 0x5e, 0x51, 0x48, 0x5d, 0x50, 0x48, 0x5b, 0x4e, 0x47,
+ 0x55, 0x4c, 0x42, 0x4f, 0x45, 0x3d, 0x4c, 0x3f, 0x38, 0x43, 0x38, 0x34,
+ 0x41, 0x3b, 0x39, 0x83, 0x83, 0x85, 0x86, 0x86, 0x8d, 0x79, 0x7c, 0x85,
+ 0x6f, 0x70, 0x78, 0x5f, 0x62, 0x69, 0x4f, 0x52, 0x59, 0x3d, 0x40, 0x46,
+ 0x2a, 0x2d, 0x32, 0x20, 0x21, 0x24, 0x26, 0x27, 0x27, 0x26, 0x26, 0x26,
+ 0x28, 0x26, 0x27, 0x35, 0x31, 0x30, 0x42, 0x3c, 0x39, 0x48, 0x40, 0x3d,
+ 0x4d, 0x44, 0x3f, 0x50, 0x47, 0x42, 0x57, 0x50, 0x4a, 0x5a, 0x53, 0x4d,
+ 0x5a, 0x56, 0x4a, 0x58, 0x58, 0x4c, 0x5a, 0x5b, 0x51, 0x51, 0x52, 0x4c,
+ 0x44, 0x45, 0x40, 0x3e, 0x3d, 0x3c, 0x3b, 0x3d, 0x3b, 0x55, 0x59, 0x57,
+ 0x57, 0x59, 0x58, 0x4a, 0x4d, 0x52, 0x59, 0x5d, 0x6a, 0x5b, 0x60, 0x75,
+ 0x5d, 0x60, 0x77, 0x4b, 0x4a, 0x5f, 0x49, 0x43, 0x53, 0x81, 0x7a, 0x86,
+ 0xb2, 0xb2, 0xba, 0xb7, 0xb6, 0xc1, 0x8e, 0x8b, 0x96, 0x79, 0x70, 0x7e,
+ 0x78, 0x6a, 0x77, 0x70, 0x61, 0x67, 0x71, 0x66, 0x62, 0x84, 0x7b, 0x72,
+ 0x9d, 0x96, 0x8c, 0xa5, 0xa3, 0x97, 0xa9, 0xa9, 0x9d, 0xac, 0xac, 0xa0,
+ 0xac, 0xa9, 0xa0, 0xa9, 0xa6, 0x9d, 0xab, 0xab, 0xa1, 0xaa, 0xac, 0xa1,
+ 0xa7, 0xa8, 0x9e, 0xa1, 0xa1, 0x97, 0xa8, 0xa7, 0x9d, 0x9f, 0x9f, 0x97,
+ 0x98, 0x99, 0x96, 0x9d, 0x9f, 0xa2, 0xa1, 0xa6, 0xac, 0xa4, 0xab, 0xb5,
+ 0x9f, 0xae, 0xb9, 0x9c, 0xac, 0xbb, 0x99, 0xa7, 0xba, 0x91, 0xa0, 0xb3,
+ 0x89, 0x95, 0xa5, 0x81, 0x89, 0x96, 0x73, 0x77, 0x84, 0x64, 0x66, 0x72,
+ 0x4e, 0x55, 0x60, 0x35, 0x3b, 0x49, 0x2f, 0x34, 0x42, 0x1c, 0x20, 0x2b,
+ 0x12, 0x17, 0x1d, 0x17, 0x1c, 0x1f, 0x16, 0x1b, 0x1e, 0x1b, 0x21, 0x25,
+ 0x28, 0x30, 0x37, 0x36, 0x3f, 0x44, 0x35, 0x3c, 0x42, 0x22, 0x28, 0x2c,
+ 0x27, 0x28, 0x2a, 0x34, 0x34, 0x32, 0x3b, 0x3a, 0x35, 0x3b, 0x3b, 0x33,
+ 0x48, 0x4b, 0x36, 0x6c, 0x6f, 0x5e, 0x6c, 0x71, 0x69, 0x53, 0x58, 0x58,
+ 0x5d, 0x62, 0x67, 0x78, 0x7d, 0x81, 0x8f, 0x95, 0x97, 0x96, 0x9d, 0x9d,
+ 0x9a, 0x9d, 0x9a, 0x93, 0x97, 0x93, 0x93, 0x98, 0x96, 0x97, 0x9a, 0x9e,
+ 0x87, 0x8a, 0x8f, 0x62, 0x65, 0x6c, 0x3c, 0x3c, 0x44, 0x2d, 0x2d, 0x36,
+ 0x2a, 0x2b, 0x2e, 0x2f, 0x30, 0x31, 0x2a, 0x2c, 0x2d, 0x25, 0x26, 0x28,
+ 0x27, 0x28, 0x29, 0x2d, 0x2e, 0x30, 0x25, 0x25, 0x28, 0x22, 0x21, 0x26,
+ 0x26, 0x25, 0x28, 0x20, 0x20, 0x22, 0x20, 0x1f, 0x20, 0x25, 0x25, 0x25,
+ 0x2d, 0x2f, 0x2e, 0x2f, 0x31, 0x30, 0x2e, 0x30, 0x30, 0x30, 0x34, 0x35,
+ 0x2e, 0x33, 0x36, 0x2b, 0x32, 0x34, 0x2d, 0x35, 0x3a, 0x2c, 0x35, 0x3c,
+ 0x2d, 0x36, 0x3f, 0x2e, 0x37, 0x40, 0x2e, 0x37, 0x40, 0x2f, 0x38, 0x3f,
+ 0x30, 0x3a, 0x3c, 0x30, 0x3a, 0x3c, 0x30, 0x3a, 0x3c, 0x30, 0x38, 0x3b,
+ 0x32, 0x39, 0x3f, 0x32, 0x39, 0x41, 0x31, 0x37, 0x41, 0x30, 0x35, 0x40,
+ 0x31, 0x39, 0x39, 0x38, 0x40, 0x40, 0x52, 0x5a, 0x5c, 0x54, 0x5c, 0x5f,
+ 0x37, 0x41, 0x43, 0x35, 0x3e, 0x40, 0x4a, 0x54, 0x56, 0x53, 0x5e, 0x5f,
+ 0x59, 0x68, 0x65, 0xa6, 0xb2, 0xb3, 0xb7, 0xc2, 0xc8, 0xb0, 0xb9, 0xc0,
+ 0xaf, 0xb8, 0xbd, 0xae, 0xb9, 0xbd, 0xac, 0xb8, 0xbf, 0xad, 0xb9, 0xc3,
+ 0xae, 0xbb, 0xc8, 0xaf, 0xbd, 0xcb, 0xb1, 0xbe, 0xcc, 0xb2, 0xbf, 0xcd,
+ 0xb2, 0xbf, 0xcf, 0xb4, 0xc1, 0xd1, 0xb5, 0xc2, 0xd2, 0xb6, 0xc3, 0xd3,
+ 0xb6, 0xc5, 0xd5, 0xb7, 0xc7, 0xd6, 0xb6, 0xc6, 0xd5, 0xb9, 0xc6, 0xd6,
+ 0xb8, 0xc5, 0xd5, 0xb9, 0xc7, 0xd7, 0xba, 0xc7, 0xd7, 0xba, 0xc7, 0xd8,
+ 0xb1, 0xb9, 0xcb, 0x9d, 0xa2, 0xb1, 0x90, 0x92, 0x9b, 0x8a, 0x8a, 0x8e,
+ 0x8e, 0x8e, 0x8e, 0x92, 0x93, 0x92, 0x94, 0x96, 0x95, 0x93, 0x97, 0x98,
+ 0x98, 0xa1, 0xa0, 0xa1, 0xab, 0xac, 0xab, 0xb5, 0xb9, 0xb4, 0xbe, 0xc6,
+ 0xb4, 0xc1, 0xcb, 0xb8, 0xc5, 0xd0, 0xbd, 0xc9, 0xd5, 0xc2, 0xce, 0xda,
+ 0x08, 0x08, 0x07, 0x0c, 0x0c, 0x0c, 0x14, 0x15, 0x17, 0x14, 0x15, 0x17,
+ 0x13, 0x14, 0x16, 0x15, 0x16, 0x17, 0x17, 0x19, 0x18, 0x17, 0x19, 0x17,
+ 0x17, 0x19, 0x18, 0x18, 0x1a, 0x19, 0x16, 0x18, 0x17, 0x1a, 0x1c, 0x1b,
+ 0x1a, 0x19, 0x1a, 0x11, 0x11, 0x11, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x10, 0x10, 0x12,
+ 0x16, 0x16, 0x17, 0x1a, 0x1a, 0x1a, 0x15, 0x16, 0x15, 0x13, 0x15, 0x12,
+ 0x1b, 0x1d, 0x1c, 0x22, 0x24, 0x23, 0x1c, 0x1e, 0x1d, 0x18, 0x1a, 0x17,
+ 0x1a, 0x1c, 0x19, 0x1b, 0x1d, 0x1a, 0x1f, 0x21, 0x1c, 0x17, 0x18, 0x14,
+ 0x0d, 0x0d, 0x0d, 0x10, 0x10, 0x0e, 0x46, 0x47, 0x41, 0x6c, 0x6e, 0x63,
+ 0x4f, 0x51, 0x46, 0x1c, 0x1d, 0x15, 0x0c, 0x0c, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x0a, 0x0b, 0x0c, 0x0a, 0x0a, 0x0a, 0x12, 0x13, 0x11, 0x22, 0x23, 0x1e,
+ 0x2c, 0x2d, 0x28, 0x2b, 0x2c, 0x27, 0x2e, 0x2f, 0x2a, 0x2b, 0x2c, 0x2a,
+ 0x20, 0x24, 0x27, 0x1a, 0x1f, 0x20, 0x1e, 0x24, 0x24, 0x34, 0x3b, 0x39,
+ 0x46, 0x4c, 0x4a, 0x5b, 0x61, 0x5f, 0x56, 0x5c, 0x5a, 0x28, 0x2d, 0x2c,
+ 0x0a, 0x0c, 0x0d, 0x1a, 0x1b, 0x1e, 0x31, 0x34, 0x39, 0x43, 0x47, 0x4e,
+ 0x47, 0x4d, 0x57, 0x48, 0x4e, 0x5b, 0x46, 0x4c, 0x5a, 0x46, 0x4c, 0x59,
+ 0x41, 0x49, 0x53, 0x4e, 0x55, 0x5d, 0x3c, 0x41, 0x45, 0x31, 0x32, 0x34,
+ 0x38, 0x37, 0x38, 0x25, 0x25, 0x25, 0x10, 0x10, 0x10, 0x08, 0x0a, 0x0b,
+ 0x0d, 0x0f, 0x0e, 0x23, 0x25, 0x24, 0x17, 0x17, 0x17, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0e, 0x0e, 0x0e, 0x13, 0x13, 0x13,
+ 0x11, 0x11, 0x11, 0x17, 0x17, 0x17, 0x18, 0x18, 0x1a, 0x14, 0x14, 0x16,
+ 0x15, 0x13, 0x16, 0x14, 0x12, 0x13, 0x13, 0x11, 0x12, 0x16, 0x15, 0x13,
+ 0x39, 0x3a, 0x39, 0x3b, 0x3b, 0x3f, 0x36, 0x35, 0x3e, 0x31, 0x31, 0x3c,
+ 0x1d, 0x1d, 0x25, 0x22, 0x23, 0x27, 0x23, 0x24, 0x28, 0x1c, 0x1d, 0x21,
+ 0x0d, 0x0d, 0x0d, 0x2a, 0x2a, 0x2c, 0x27, 0x25, 0x2a, 0x1a, 0x18, 0x1b,
+ 0x16, 0x12, 0x12, 0x16, 0x12, 0x11, 0x17, 0x11, 0x11, 0x17, 0x11, 0x13,
+ 0x1e, 0x16, 0x13, 0x26, 0x1e, 0x1c, 0x2d, 0x25, 0x23, 0x3b, 0x31, 0x2f,
+ 0x56, 0x4b, 0x47, 0x53, 0x46, 0x40, 0x48, 0x3a, 0x37, 0x43, 0x32, 0x32,
+ 0x3f, 0x2e, 0x2c, 0x41, 0x32, 0x2e, 0x47, 0x3a, 0x34, 0x51, 0x43, 0x3c,
+ 0x4e, 0x44, 0x3b, 0x4c, 0x41, 0x3b, 0x4c, 0x41, 0x3d, 0x49, 0x3e, 0x3c,
+ 0x42, 0x39, 0x34, 0x3a, 0x2f, 0x2b, 0x3a, 0x2c, 0x29, 0x3b, 0x2d, 0x2c,
+ 0x33, 0x2b, 0x29, 0x60, 0x5f, 0x5f, 0x78, 0x78, 0x7b, 0x67, 0x67, 0x6d,
+ 0x59, 0x5a, 0x61, 0x4a, 0x4a, 0x52, 0x3a, 0x3a, 0x40, 0x2d, 0x2c, 0x32,
+ 0x29, 0x26, 0x2c, 0x2f, 0x2a, 0x2e, 0x37, 0x31, 0x33, 0x37, 0x2e, 0x2f,
+ 0x3c, 0x31, 0x35, 0x42, 0x35, 0x39, 0x46, 0x37, 0x3a, 0x43, 0x34, 0x37,
+ 0x42, 0x32, 0x35, 0x43, 0x33, 0x36, 0x43, 0x34, 0x37, 0x44, 0x38, 0x3a,
+ 0x45, 0x3c, 0x3f, 0x44, 0x3d, 0x42, 0x40, 0x3d, 0x43, 0x3f, 0x3c, 0x43,
+ 0x3b, 0x35, 0x3f, 0x35, 0x2f, 0x39, 0x30, 0x2d, 0x34, 0x2d, 0x2e, 0x32,
+ 0x29, 0x2b, 0x2a, 0x30, 0x34, 0x38, 0x52, 0x56, 0x63, 0x5a, 0x5f, 0x73,
+ 0x50, 0x52, 0x68, 0x2d, 0x2a, 0x3d, 0x44, 0x3a, 0x49, 0x6a, 0x5e, 0x68,
+ 0x9d, 0x9b, 0xa9, 0xa7, 0xa8, 0xb4, 0x7e, 0x7d, 0x88, 0x6c, 0x64, 0x6f,
+ 0x6f, 0x61, 0x6c, 0x70, 0x60, 0x6a, 0x6d, 0x5e, 0x63, 0x67, 0x5a, 0x5a,
+ 0x6e, 0x60, 0x5f, 0x7c, 0x72, 0x70, 0x8c, 0x85, 0x80, 0x9c, 0x94, 0x8e,
+ 0xa5, 0x9c, 0x97, 0xa2, 0x99, 0x94, 0x9f, 0x99, 0x93, 0x9d, 0x9a, 0x93,
+ 0xa4, 0x9f, 0x9b, 0x97, 0x92, 0x8e, 0x91, 0x8c, 0x88, 0x87, 0x84, 0x7f,
+ 0x95, 0x94, 0x94, 0x9d, 0xa1, 0xa6, 0xa0, 0xa7, 0xb0, 0xa2, 0xac, 0xb8,
+ 0x9f, 0xad, 0xbc, 0x9b, 0xa8, 0xba, 0x94, 0xa1, 0xb4, 0x8d, 0x9a, 0xac,
+ 0x81, 0x8c, 0x9a, 0x73, 0x7c, 0x85, 0x66, 0x6b, 0x73, 0x5a, 0x5d, 0x64,
+ 0x41, 0x49, 0x53, 0x3a, 0x41, 0x4d, 0x31, 0x37, 0x44, 0x19, 0x1d, 0x28,
+ 0x17, 0x1c, 0x22, 0x16, 0x1b, 0x21, 0x16, 0x1d, 0x23, 0x1b, 0x23, 0x2a,
+ 0x1a, 0x23, 0x2a, 0x1d, 0x25, 0x2a, 0x24, 0x29, 0x2c, 0x30, 0x34, 0x33,
+ 0x3c, 0x3e, 0x39, 0x3a, 0x3b, 0x36, 0x3f, 0x3e, 0x39, 0x44, 0x44, 0x3b,
+ 0x3f, 0x43, 0x35, 0x44, 0x47, 0x3b, 0x57, 0x5b, 0x56, 0x71, 0x78, 0x76,
+ 0x83, 0x89, 0x89, 0x90, 0x96, 0x96, 0x9d, 0x9f, 0x9f, 0x9d, 0x9f, 0x9e,
+ 0x94, 0x97, 0x95, 0x8f, 0x94, 0x90, 0x8b, 0x91, 0x8c, 0x90, 0x96, 0x92,
+ 0x98, 0x9d, 0x9b, 0x9a, 0x9e, 0x9f, 0x77, 0x78, 0x7e, 0x4a, 0x4b, 0x50,
+ 0x2f, 0x32, 0x39, 0x2b, 0x2e, 0x34, 0x31, 0x34, 0x35, 0x31, 0x34, 0x32,
+ 0x2b, 0x2d, 0x2a, 0x2b, 0x2c, 0x2b, 0x2b, 0x2c, 0x30, 0x22, 0x23, 0x28,
+ 0x22, 0x22, 0x24, 0x20, 0x21, 0x22, 0x1e, 0x1f, 0x1f, 0x24, 0x25, 0x25,
+ 0x25, 0x27, 0x26, 0x20, 0x23, 0x21, 0x22, 0x24, 0x23, 0x2b, 0x2e, 0x2d,
+ 0x31, 0x37, 0x37, 0x30, 0x35, 0x38, 0x2c, 0x33, 0x37, 0x2c, 0x35, 0x3d,
+ 0x29, 0x33, 0x3c, 0x2c, 0x35, 0x3e, 0x2e, 0x37, 0x3e, 0x2d, 0x34, 0x3c,
+ 0x2d, 0x38, 0x3c, 0x2c, 0x37, 0x3c, 0x2d, 0x37, 0x3b, 0x32, 0x3c, 0x3e,
+ 0x31, 0x3b, 0x3d, 0x30, 0x37, 0x3d, 0x31, 0x37, 0x3e, 0x34, 0x3a, 0x40,
+ 0x45, 0x4c, 0x52, 0x5d, 0x64, 0x6a, 0x57, 0x5e, 0x64, 0x37, 0x40, 0x45,
+ 0x2f, 0x38, 0x3d, 0x42, 0x4c, 0x4e, 0x51, 0x5b, 0x5d, 0x54, 0x5f, 0x60,
+ 0x75, 0x84, 0x81, 0xb5, 0xc0, 0xc2, 0xb3, 0xbc, 0xc3, 0xb0, 0xb8, 0xc0,
+ 0xae, 0xb7, 0xbc, 0xac, 0xb7, 0xb9, 0xaa, 0xb7, 0xbd, 0xac, 0xb9, 0xc3,
+ 0xac, 0xba, 0xc6, 0xad, 0xbb, 0xc8, 0xaf, 0xbd, 0xca, 0xb3, 0xc1, 0xce,
+ 0xb3, 0xc0, 0xd0, 0xb4, 0xc1, 0xd1, 0xb5, 0xc2, 0xd2, 0xb7, 0xc4, 0xd4,
+ 0xb5, 0xc5, 0xd5, 0xb7, 0xc7, 0xd6, 0xb6, 0xc6, 0xd5, 0xb6, 0xc6, 0xd5,
+ 0xb7, 0xc7, 0xd6, 0xb8, 0xc7, 0xd6, 0xb9, 0xc9, 0xd7, 0xb6, 0xc6, 0xd6,
+ 0xaa, 0xb0, 0xc0, 0x95, 0x98, 0xa6, 0x8a, 0x8d, 0x94, 0x8b, 0x8c, 0x8d,
+ 0x90, 0x90, 0x90, 0x92, 0x94, 0x94, 0x93, 0x96, 0x97, 0x97, 0x9c, 0x9e,
+ 0x9b, 0xa5, 0xa6, 0xa3, 0xad, 0xb0, 0xaf, 0xba, 0xc0, 0xb2, 0xbe, 0xc9,
+ 0xb5, 0xc1, 0xcd, 0xba, 0xc6, 0xd2, 0xbe, 0xca, 0xd6, 0xc2, 0xce, 0xda,
+ 0x08, 0x0a, 0x08, 0x09, 0x0a, 0x0a, 0x13, 0x14, 0x16, 0x15, 0x16, 0x18,
+ 0x14, 0x15, 0x17, 0x16, 0x17, 0x18, 0x16, 0x18, 0x17, 0x17, 0x19, 0x17,
+ 0x18, 0x1a, 0x19, 0x19, 0x1b, 0x1a, 0x16, 0x18, 0x17, 0x17, 0x19, 0x18,
+ 0x17, 0x18, 0x17, 0x15, 0x15, 0x15, 0x0b, 0x0b, 0x0b, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x15, 0x15, 0x17,
+ 0x18, 0x18, 0x1a, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x16,
+ 0x17, 0x18, 0x1a, 0x1b, 0x1c, 0x1d, 0x23, 0x25, 0x24, 0x21, 0x23, 0x21,
+ 0x1b, 0x1d, 0x1a, 0x1a, 0x1c, 0x18, 0x1c, 0x1e, 0x19, 0x1a, 0x1c, 0x18,
+ 0x12, 0x12, 0x14, 0x12, 0x12, 0x12, 0x1b, 0x1c, 0x17, 0x24, 0x25, 0x1d,
+ 0x1f, 0x20, 0x18, 0x1c, 0x1d, 0x17, 0x13, 0x13, 0x13, 0x0b, 0x0b, 0x0e,
+ 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x09,
+ 0x0b, 0x0c, 0x0e, 0x12, 0x13, 0x15, 0x1c, 0x1c, 0x1d, 0x22, 0x22, 0x21,
+ 0x33, 0x33, 0x31, 0x3a, 0x3b, 0x38, 0x3c, 0x3e, 0x39, 0x35, 0x38, 0x33,
+ 0x2a, 0x2f, 0x31, 0x2e, 0x33, 0x36, 0x3f, 0x45, 0x45, 0x4b, 0x54, 0x52,
+ 0x36, 0x3f, 0x3c, 0x36, 0x3f, 0x3c, 0x43, 0x4a, 0x48, 0x31, 0x36, 0x35,
+ 0x0f, 0x0f, 0x10, 0x0e, 0x0f, 0x0f, 0x15, 0x1a, 0x1a, 0x2f, 0x34, 0x36,
+ 0x38, 0x3f, 0x45, 0x41, 0x49, 0x52, 0x44, 0x4b, 0x59, 0x3f, 0x47, 0x57,
+ 0x3d, 0x49, 0x57, 0x47, 0x4f, 0x5d, 0x46, 0x4b, 0x55, 0x40, 0x41, 0x47,
+ 0x3d, 0x3c, 0x41, 0x36, 0x36, 0x38, 0x2f, 0x2f, 0x31, 0x20, 0x20, 0x24,
+ 0x22, 0x24, 0x23, 0x2a, 0x2c, 0x2b, 0x16, 0x16, 0x16, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0b, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0f, 0x0f, 0x0f,
+ 0x12, 0x12, 0x12, 0x18, 0x18, 0x18, 0x1b, 0x1b, 0x1d, 0x12, 0x12, 0x14,
+ 0x14, 0x12, 0x15, 0x13, 0x11, 0x12, 0x13, 0x11, 0x12, 0x13, 0x12, 0x10,
+ 0x39, 0x39, 0x38, 0x3a, 0x39, 0x3e, 0x33, 0x31, 0x3b, 0x2f, 0x2e, 0x3a,
+ 0x1e, 0x1e, 0x28, 0x21, 0x21, 0x29, 0x20, 0x21, 0x26, 0x18, 0x19, 0x1e,
+ 0x0f, 0x10, 0x11, 0x2d, 0x2e, 0x2f, 0x27, 0x26, 0x28, 0x1b, 0x17, 0x1a,
+ 0x16, 0x11, 0x11, 0x16, 0x12, 0x10, 0x19, 0x13, 0x13, 0x17, 0x13, 0x13,
+ 0x17, 0x12, 0x10, 0x1b, 0x15, 0x14, 0x27, 0x22, 0x22, 0x2c, 0x24, 0x22,
+ 0x34, 0x2b, 0x26, 0x47, 0x3a, 0x34, 0x4b, 0x3a, 0x38, 0x42, 0x2f, 0x31,
+ 0x37, 0x25, 0x27, 0x33, 0x21, 0x23, 0x33, 0x24, 0x24, 0x35, 0x27, 0x26,
+ 0x33, 0x26, 0x24, 0x32, 0x27, 0x25, 0x30, 0x25, 0x24, 0x2c, 0x20, 0x22,
+ 0x2b, 0x20, 0x22, 0x2a, 0x1c, 0x1e, 0x2d, 0x1e, 0x20, 0x2c, 0x1e, 0x1e,
+ 0x23, 0x19, 0x18, 0x43, 0x40, 0x40, 0x64, 0x65, 0x65, 0x52, 0x53, 0x55,
+ 0x41, 0x42, 0x48, 0x33, 0x33, 0x38, 0x2d, 0x2c, 0x32, 0x34, 0x2f, 0x35,
+ 0x3a, 0x30, 0x38, 0x45, 0x38, 0x3e, 0x45, 0x36, 0x3a, 0x43, 0x33, 0x35,
+ 0x44, 0x33, 0x38, 0x48, 0x35, 0x3a, 0x49, 0x34, 0x39, 0x4b, 0x37, 0x3b,
+ 0x49, 0x35, 0x3a, 0x49, 0x35, 0x3a, 0x48, 0x36, 0x3b, 0x45, 0x34, 0x3c,
+ 0x43, 0x37, 0x44, 0x59, 0x4f, 0x5e, 0x7a, 0x72, 0x82, 0x48, 0x40, 0x51,
+ 0x44, 0x3c, 0x4d, 0x3f, 0x38, 0x47, 0x37, 0x32, 0x3e, 0x27, 0x25, 0x2c,
+ 0x1a, 0x1c, 0x1b, 0x29, 0x2b, 0x30, 0x44, 0x48, 0x55, 0x56, 0x5b, 0x6e,
+ 0x43, 0x44, 0x59, 0x26, 0x22, 0x35, 0x37, 0x2a, 0x38, 0x50, 0x41, 0x4b,
+ 0x9b, 0x9b, 0xaf, 0xab, 0xad, 0xbd, 0x86, 0x85, 0x8f, 0x69, 0x63, 0x6c,
+ 0x6d, 0x63, 0x6b, 0x70, 0x60, 0x6b, 0x70, 0x61, 0x6b, 0x66, 0x58, 0x60,
+ 0x65, 0x53, 0x57, 0x63, 0x53, 0x56, 0x65, 0x58, 0x58, 0x69, 0x5b, 0x5b,
+ 0x6d, 0x60, 0x5f, 0x73, 0x65, 0x64, 0x7a, 0x6f, 0x6c, 0x78, 0x6d, 0x6c,
+ 0x78, 0x6c, 0x6f, 0x6d, 0x61, 0x62, 0x5f, 0x55, 0x54, 0x57, 0x4e, 0x4e,
+ 0x8f, 0x8d, 0x8d, 0xa3, 0xa7, 0xac, 0xa1, 0xa9, 0xb2, 0x9f, 0xa8, 0xb6,
+ 0x9e, 0xa7, 0xba, 0x9a, 0xa2, 0xb8, 0x8b, 0x95, 0xac, 0x80, 0x8b, 0x9e,
+ 0x77, 0x81, 0x8d, 0x67, 0x70, 0x77, 0x5b, 0x60, 0x64, 0x52, 0x57, 0x5a,
+ 0x3e, 0x47, 0x4f, 0x40, 0x48, 0x54, 0x24, 0x2a, 0x38, 0x17, 0x1b, 0x27,
+ 0x17, 0x1b, 0x24, 0x14, 0x1a, 0x23, 0x18, 0x21, 0x2a, 0x1c, 0x24, 0x2f,
+ 0x1b, 0x22, 0x2a, 0x1a, 0x22, 0x25, 0x2c, 0x31, 0x31, 0x54, 0x59, 0x52,
+ 0x5c, 0x5f, 0x58, 0x56, 0x56, 0x4e, 0x49, 0x49, 0x41, 0x4e, 0x4e, 0x48,
+ 0x49, 0x4d, 0x49, 0x54, 0x5a, 0x56, 0x79, 0x7f, 0x7d, 0x8b, 0x94, 0x93,
+ 0x8f, 0x96, 0x95, 0x93, 0x98, 0x96, 0x9d, 0x9d, 0x9b, 0xa1, 0xa0, 0x9d,
+ 0x97, 0x99, 0x9a, 0x8f, 0x93, 0x92, 0x91, 0x96, 0x92, 0x92, 0x99, 0x92,
+ 0x90, 0x97, 0x90, 0x94, 0x99, 0x96, 0x98, 0x9b, 0x9b, 0x88, 0x8a, 0x8c,
+ 0x5c, 0x5f, 0x6b, 0x33, 0x35, 0x3f, 0x2f, 0x32, 0x35, 0x30, 0x34, 0x32,
+ 0x2e, 0x31, 0x2d, 0x2a, 0x2b, 0x2b, 0x2c, 0x2d, 0x31, 0x22, 0x23, 0x27,
+ 0x24, 0x25, 0x27, 0x20, 0x24, 0x23, 0x1e, 0x22, 0x20, 0x21, 0x25, 0x22,
+ 0x20, 0x25, 0x21, 0x20, 0x25, 0x22, 0x1f, 0x23, 0x22, 0x1d, 0x22, 0x20,
+ 0x26, 0x2c, 0x2a, 0x2f, 0x34, 0x35, 0x2f, 0x36, 0x3a, 0x2a, 0x33, 0x3a,
+ 0x2b, 0x33, 0x3d, 0x2c, 0x34, 0x3d, 0x2e, 0x35, 0x3d, 0x2c, 0x34, 0x3c,
+ 0x2c, 0x35, 0x3e, 0x2b, 0x35, 0x3e, 0x2c, 0x37, 0x3d, 0x2c, 0x37, 0x38,
+ 0x30, 0x3a, 0x3b, 0x39, 0x43, 0x44, 0x4a, 0x52, 0x54, 0x62, 0x69, 0x6d,
+ 0x68, 0x6d, 0x78, 0x52, 0x58, 0x64, 0x36, 0x3c, 0x47, 0x2f, 0x38, 0x41,
+ 0x3c, 0x46, 0x4c, 0x4d, 0x57, 0x5a, 0x55, 0x5f, 0x60, 0x59, 0x64, 0x65,
+ 0x93, 0xa2, 0x9d, 0xb5, 0xc1, 0xc3, 0xac, 0xb5, 0xbe, 0xad, 0xb4, 0xbe,
+ 0xab, 0xb3, 0xb9, 0xaa, 0xb5, 0xb7, 0xaa, 0xb7, 0xbc, 0xab, 0xba, 0xc3,
+ 0xac, 0xba, 0xc7, 0xad, 0xbb, 0xc8, 0xae, 0xbc, 0xc9, 0xb1, 0xbe, 0xcc,
+ 0xb2, 0xbf, 0xcf, 0xb4, 0xc1, 0xd1, 0xb6, 0xc3, 0xd3, 0xb7, 0xc4, 0xd4,
+ 0xb6, 0xc6, 0xd6, 0xb7, 0xc7, 0xd6, 0xb6, 0xc6, 0xd5, 0xb6, 0xc6, 0xd5,
+ 0xb8, 0xc8, 0xd7, 0xb9, 0xc9, 0xd8, 0xba, 0xcb, 0xda, 0xb0, 0xc1, 0xd1,
+ 0x9f, 0xa6, 0xb4, 0x8d, 0x91, 0x9b, 0x88, 0x89, 0x8f, 0x8e, 0x8d, 0x8d,
+ 0x91, 0x91, 0x90, 0x95, 0x97, 0x96, 0x96, 0x99, 0x9a, 0x9a, 0x9f, 0xa2,
+ 0xa0, 0xaa, 0xab, 0xa9, 0xb4, 0xb6, 0xb0, 0xbb, 0xc1, 0xb3, 0xbe, 0xc9,
+ 0xb7, 0xc3, 0xcf, 0xba, 0xc6, 0xd4, 0xbc, 0xc8, 0xd5, 0xc1, 0xcd, 0xd9,
+ 0x07, 0x07, 0x09, 0x06, 0x06, 0x08, 0x12, 0x12, 0x14, 0x15, 0x15, 0x17,
+ 0x14, 0x14, 0x17, 0x16, 0x16, 0x18, 0x18, 0x18, 0x1a, 0x18, 0x19, 0x1a,
+ 0x18, 0x1a, 0x19, 0x17, 0x19, 0x18, 0x17, 0x19, 0x18, 0x16, 0x18, 0x17,
+ 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x10, 0x10, 0x10, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x14, 0x14, 0x14,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x19, 0x19, 0x1b, 0x1b, 0x1b, 0x1d,
+ 0x18, 0x19, 0x1a, 0x19, 0x1a, 0x1c, 0x1f, 0x20, 0x24, 0x22, 0x23, 0x27,
+ 0x1e, 0x1f, 0x23, 0x18, 0x19, 0x1b, 0x17, 0x19, 0x18, 0x18, 0x19, 0x17,
+ 0x21, 0x21, 0x23, 0x1b, 0x1b, 0x1b, 0x10, 0x12, 0x0f, 0x11, 0x13, 0x0f,
+ 0x16, 0x17, 0x14, 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x19, 0x0f, 0x0f, 0x0f,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x06, 0x06, 0x07,
+ 0x0b, 0x0b, 0x0a, 0x15, 0x16, 0x15, 0x1c, 0x1e, 0x1e, 0x18, 0x1b, 0x18,
+ 0x37, 0x39, 0x34, 0x4f, 0x51, 0x4d, 0x32, 0x34, 0x30, 0x32, 0x32, 0x32,
+ 0x42, 0x43, 0x47, 0x52, 0x53, 0x55, 0x52, 0x56, 0x56, 0x45, 0x4a, 0x49,
+ 0x3d, 0x43, 0x41, 0x38, 0x40, 0x3f, 0x2c, 0x33, 0x37, 0x20, 0x27, 0x2c,
+ 0x11, 0x13, 0x12, 0x0f, 0x10, 0x0f, 0x11, 0x12, 0x12, 0x1b, 0x1b, 0x1c,
+ 0x1f, 0x20, 0x26, 0x36, 0x3a, 0x43, 0x3f, 0x46, 0x53, 0x3f, 0x48, 0x57,
+ 0x42, 0x4d, 0x61, 0x48, 0x53, 0x65, 0x44, 0x50, 0x5d, 0x46, 0x51, 0x5b,
+ 0x48, 0x4d, 0x55, 0x3c, 0x3f, 0x44, 0x36, 0x36, 0x3a, 0x38, 0x36, 0x39,
+ 0x35, 0x37, 0x36, 0x37, 0x39, 0x36, 0x29, 0x29, 0x27, 0x0f, 0x0f, 0x0d,
+ 0x07, 0x07, 0x05, 0x08, 0x08, 0x06, 0x07, 0x07, 0x06, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e,
+ 0x11, 0x11, 0x11, 0x17, 0x17, 0x17, 0x1b, 0x1b, 0x1b, 0x11, 0x11, 0x11,
+ 0x15, 0x15, 0x15, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f,
+ 0x36, 0x36, 0x37, 0x3a, 0x3a, 0x3c, 0x33, 0x32, 0x37, 0x2f, 0x2e, 0x33,
+ 0x1d, 0x1d, 0x22, 0x1e, 0x1e, 0x23, 0x20, 0x21, 0x23, 0x15, 0x15, 0x15,
+ 0x0f, 0x12, 0x13, 0x2e, 0x2f, 0x2f, 0x21, 0x21, 0x21, 0x19, 0x17, 0x17,
+ 0x12, 0x10, 0x0f, 0x1a, 0x16, 0x15, 0x18, 0x14, 0x13, 0x17, 0x14, 0x11,
+ 0x14, 0x14, 0x11, 0x14, 0x14, 0x12, 0x1f, 0x1f, 0x1f, 0x25, 0x24, 0x24,
+ 0x22, 0x1f, 0x20, 0x29, 0x24, 0x23, 0x2f, 0x28, 0x28, 0x30, 0x2a, 0x28,
+ 0x30, 0x26, 0x27, 0x32, 0x28, 0x2a, 0x39, 0x2f, 0x30, 0x35, 0x2b, 0x2b,
+ 0x30, 0x26, 0x26, 0x2f, 0x25, 0x24, 0x2b, 0x21, 0x20, 0x26, 0x1c, 0x1b,
+ 0x28, 0x1e, 0x1d, 0x26, 0x1c, 0x1b, 0x26, 0x1e, 0x1c, 0x25, 0x1b, 0x1c,
+ 0x1e, 0x19, 0x1a, 0x35, 0x32, 0x35, 0x4a, 0x4b, 0x4f, 0x3b, 0x3f, 0x41,
+ 0x38, 0x34, 0x38, 0x34, 0x2b, 0x32, 0x40, 0x33, 0x3d, 0x49, 0x38, 0x42,
+ 0x4a, 0x37, 0x40, 0x49, 0x38, 0x3c, 0x48, 0x3b, 0x38, 0x4b, 0x3f, 0x39,
+ 0x4c, 0x3e, 0x3f, 0x4c, 0x3d, 0x3e, 0x4d, 0x3f, 0x3f, 0x55, 0x48, 0x47,
+ 0x56, 0x4b, 0x4a, 0x4c, 0x40, 0x41, 0x50, 0x43, 0x48, 0x58, 0x4c, 0x54,
+ 0x68, 0x66, 0x6e, 0x84, 0x84, 0x8d, 0x80, 0x7f, 0x8b, 0x49, 0x48, 0x56,
+ 0x7a, 0x78, 0x86, 0x62, 0x63, 0x6f, 0x4d, 0x4f, 0x59, 0x38, 0x3a, 0x42,
+ 0x29, 0x23, 0x2b, 0x28, 0x23, 0x30, 0x4e, 0x4d, 0x60, 0x5b, 0x5e, 0x71,
+ 0x35, 0x38, 0x48, 0x22, 0x20, 0x2b, 0x2c, 0x24, 0x2a, 0x37, 0x2c, 0x30,
+ 0x6e, 0x64, 0x73, 0x8a, 0x83, 0x92, 0x88, 0x82, 0x8e, 0x73, 0x6d, 0x77,
+ 0x63, 0x5e, 0x65, 0x68, 0x5f, 0x64, 0x66, 0x5a, 0x61, 0x62, 0x56, 0x5b,
+ 0x64, 0x56, 0x56, 0x63, 0x55, 0x55, 0x64, 0x55, 0x56, 0x5d, 0x51, 0x53,
+ 0x5a, 0x50, 0x51, 0x5d, 0x53, 0x54, 0x62, 0x56, 0x56, 0x5a, 0x4b, 0x4c,
+ 0x53, 0x44, 0x47, 0x58, 0x45, 0x49, 0x58, 0x45, 0x48, 0x4b, 0x40, 0x3f,
+ 0x75, 0x7b, 0x76, 0x9f, 0xad, 0xae, 0x9b, 0xa6, 0xb4, 0x9b, 0xa4, 0xba,
+ 0x96, 0xa3, 0xb4, 0x8f, 0x99, 0xad, 0x82, 0x89, 0x9d, 0x76, 0x79, 0x8a,
+ 0x6b, 0x6f, 0x7a, 0x5a, 0x5f, 0x65, 0x54, 0x59, 0x5f, 0x4d, 0x55, 0x5a,
+ 0x46, 0x50, 0x57, 0x3a, 0x45, 0x4b, 0x17, 0x1f, 0x27, 0x14, 0x1c, 0x25,
+ 0x1b, 0x20, 0x2e, 0x1a, 0x20, 0x2e, 0x1c, 0x22, 0x2e, 0x1a, 0x22, 0x2c,
+ 0x17, 0x22, 0x28, 0x1a, 0x24, 0x29, 0x22, 0x2b, 0x2a, 0x48, 0x4e, 0x43,
+ 0x6f, 0x72, 0x60, 0x74, 0x75, 0x64, 0x64, 0x63, 0x5b, 0x66, 0x65, 0x66,
+ 0x64, 0x6d, 0x6e, 0x7c, 0x86, 0x85, 0x95, 0x9d, 0x9c, 0x94, 0x9b, 0x99,
+ 0x92, 0x98, 0x94, 0x8f, 0x96, 0x90, 0x94, 0x9b, 0x94, 0x90, 0x96, 0x90,
+ 0x92, 0x97, 0x93, 0x98, 0x9d, 0x99, 0x9c, 0xa1, 0x9d, 0x98, 0x9d, 0x9a,
+ 0x92, 0x97, 0x95, 0x91, 0x96, 0x94, 0x90, 0x94, 0x95, 0x93, 0x97, 0x97,
+ 0x93, 0x98, 0x96, 0x78, 0x7b, 0x7d, 0x48, 0x4b, 0x51, 0x2a, 0x2d, 0x36,
+ 0x2e, 0x32, 0x38, 0x27, 0x2b, 0x2e, 0x26, 0x2a, 0x29, 0x20, 0x22, 0x22,
+ 0x24, 0x26, 0x27, 0x26, 0x28, 0x27, 0x27, 0x2a, 0x27, 0x22, 0x25, 0x23,
+ 0x22, 0x23, 0x25, 0x23, 0x24, 0x26, 0x21, 0x23, 0x21, 0x20, 0x22, 0x1e,
+ 0x1f, 0x20, 0x22, 0x24, 0x28, 0x29, 0x2d, 0x31, 0x33, 0x32, 0x36, 0x38,
+ 0x30, 0x35, 0x39, 0x28, 0x31, 0x34, 0x28, 0x33, 0x37, 0x2a, 0x35, 0x3b,
+ 0x2e, 0x36, 0x39, 0x37, 0x3f, 0x41, 0x3f, 0x48, 0x48, 0x48, 0x51, 0x4f,
+ 0x59, 0x62, 0x5f, 0x67, 0x73, 0x73, 0x6c, 0x79, 0x80, 0x5c, 0x6a, 0x76,
+ 0x46, 0x4f, 0x5e, 0x33, 0x3b, 0x44, 0x34, 0x3c, 0x40, 0x39, 0x43, 0x44,
+ 0x46, 0x53, 0x57, 0x4d, 0x5a, 0x60, 0x52, 0x5f, 0x62, 0x6b, 0x76, 0x76,
+ 0xa9, 0xb4, 0xb5, 0xaf, 0xba, 0xbe, 0xab, 0xb4, 0xbd, 0xab, 0xb2, 0xbc,
+ 0xac, 0xb3, 0xbb, 0xab, 0xb4, 0xbb, 0xad, 0xb7, 0xbf, 0xaf, 0xb9, 0xc3,
+ 0xaf, 0xb9, 0xc8, 0xae, 0xba, 0xc8, 0xae, 0xbc, 0xc9, 0xb1, 0xbf, 0xce,
+ 0xb2, 0xbf, 0xcf, 0xb4, 0xc0, 0xd2, 0xb7, 0xc2, 0xd4, 0xb7, 0xc3, 0xd4,
+ 0xb6, 0xc8, 0xd6, 0xb8, 0xc7, 0xd6, 0xb9, 0xc6, 0xd4, 0xbb, 0xc7, 0xd7,
+ 0xb9, 0xc7, 0xd7, 0xba, 0xc8, 0xdb, 0xb9, 0xc9, 0xda, 0xa9, 0xb7, 0xc6,
+ 0x95, 0x9c, 0xa5, 0x8a, 0x90, 0x97, 0x89, 0x8e, 0x91, 0x8c, 0x91, 0x91,
+ 0x90, 0x95, 0x94, 0x93, 0x98, 0x97, 0x97, 0x9d, 0x9c, 0x9c, 0xa2, 0xa4,
+ 0xa7, 0xae, 0xb5, 0xb0, 0xb8, 0xbf, 0xb3, 0xbd, 0xc5, 0xb7, 0xc1, 0xcb,
+ 0xb7, 0xc3, 0xcf, 0xb9, 0xc5, 0xd3, 0xbd, 0xca, 0xd7, 0xc0, 0xce, 0xdb,
+ 0x07, 0x07, 0x09, 0x08, 0x08, 0x0a, 0x12, 0x12, 0x13, 0x17, 0x17, 0x19,
+ 0x16, 0x16, 0x18, 0x16, 0x16, 0x18, 0x17, 0x17, 0x19, 0x18, 0x19, 0x1a,
+ 0x18, 0x1a, 0x19, 0x18, 0x1a, 0x19, 0x15, 0x18, 0x17, 0x16, 0x18, 0x17,
+ 0x1b, 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x11, 0x11, 0x11, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0c,
+ 0x15, 0x15, 0x15, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1e, 0x1c, 0x1c, 0x1e,
+ 0x1a, 0x1b, 0x1d, 0x1b, 0x1c, 0x1e, 0x1b, 0x1c, 0x1f, 0x1f, 0x20, 0x24,
+ 0x24, 0x25, 0x27, 0x22, 0x23, 0x26, 0x1e, 0x20, 0x1f, 0x16, 0x18, 0x15,
+ 0x39, 0x3a, 0x3b, 0x2a, 0x2c, 0x2b, 0x13, 0x15, 0x12, 0x0f, 0x12, 0x0f,
+ 0x13, 0x15, 0x12, 0x14, 0x14, 0x12, 0x0d, 0x0d, 0x0c, 0x0d, 0x0d, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x08, 0x06, 0x06, 0x08,
+ 0x0b, 0x0d, 0x0c, 0x15, 0x19, 0x1a, 0x14, 0x18, 0x1b, 0x11, 0x16, 0x16,
+ 0x2c, 0x32, 0x30, 0x40, 0x46, 0x43, 0x2c, 0x30, 0x2f, 0x36, 0x3a, 0x3b,
+ 0x49, 0x4b, 0x4d, 0x56, 0x58, 0x57, 0x50, 0x54, 0x52, 0x41, 0x46, 0x43,
+ 0x39, 0x3d, 0x3c, 0x45, 0x4b, 0x4a, 0x3c, 0x41, 0x44, 0x1a, 0x1f, 0x23,
+ 0x0e, 0x11, 0x10, 0x0f, 0x10, 0x0f, 0x14, 0x14, 0x14, 0x13, 0x13, 0x14,
+ 0x10, 0x11, 0x14, 0x1a, 0x1e, 0x24, 0x2b, 0x32, 0x3c, 0x3d, 0x45, 0x51,
+ 0x4e, 0x59, 0x68, 0x4d, 0x59, 0x67, 0x44, 0x50, 0x5e, 0x48, 0x54, 0x62,
+ 0x49, 0x53, 0x5f, 0x4b, 0x51, 0x5d, 0x3f, 0x42, 0x4c, 0x33, 0x36, 0x3e,
+ 0x35, 0x36, 0x36, 0x30, 0x32, 0x2f, 0x30, 0x31, 0x2e, 0x27, 0x27, 0x24,
+ 0x11, 0x11, 0x0f, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0f, 0x0f, 0x0f,
+ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x16, 0x16, 0x16, 0x13, 0x13, 0x13,
+ 0x14, 0x14, 0x14, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10,
+ 0x2f, 0x30, 0x32, 0x39, 0x3a, 0x3e, 0x33, 0x34, 0x38, 0x2f, 0x30, 0x35,
+ 0x1f, 0x20, 0x25, 0x11, 0x12, 0x16, 0x18, 0x19, 0x1b, 0x16, 0x17, 0x17,
+ 0x12, 0x14, 0x15, 0x27, 0x28, 0x29, 0x1e, 0x1e, 0x1e, 0x16, 0x14, 0x15,
+ 0x12, 0x0f, 0x10, 0x19, 0x16, 0x15, 0x14, 0x12, 0x10, 0x14, 0x13, 0x11,
+ 0x14, 0x13, 0x11, 0x14, 0x13, 0x14, 0x1f, 0x1f, 0x1f, 0x25, 0x24, 0x24,
+ 0x1f, 0x1d, 0x1e, 0x23, 0x1f, 0x20, 0x24, 0x20, 0x1f, 0x23, 0x1d, 0x1d,
+ 0x28, 0x22, 0x22, 0x2d, 0x27, 0x26, 0x30, 0x27, 0x28, 0x2f, 0x26, 0x27,
+ 0x2d, 0x24, 0x25, 0x29, 0x21, 0x21, 0x29, 0x21, 0x1f, 0x25, 0x1d, 0x1b,
+ 0x20, 0x18, 0x16, 0x1e, 0x19, 0x16, 0x1c, 0x16, 0x16, 0x1d, 0x17, 0x17,
+ 0x1a, 0x16, 0x16, 0x27, 0x23, 0x25, 0x36, 0x34, 0x37, 0x35, 0x33, 0x36,
+ 0x45, 0x3c, 0x43, 0x50, 0x43, 0x4a, 0x59, 0x48, 0x4b, 0x54, 0x42, 0x43,
+ 0x52, 0x3f, 0x41, 0x51, 0x3e, 0x42, 0x4e, 0x3d, 0x44, 0x4b, 0x3b, 0x46,
+ 0x40, 0x32, 0x40, 0x3f, 0x32, 0x3f, 0x41, 0x34, 0x3f, 0x49, 0x3b, 0x47,
+ 0x4e, 0x42, 0x4d, 0x41, 0x36, 0x44, 0x51, 0x44, 0x56, 0x6f, 0x63, 0x76,
+ 0x6e, 0x6b, 0x7d, 0x7b, 0x78, 0x89, 0x5e, 0x5c, 0x69, 0x76, 0x74, 0x7f,
+ 0x94, 0x94, 0x9e, 0x8a, 0x8a, 0x97, 0x83, 0x82, 0x93, 0x6d, 0x6b, 0x7d,
+ 0x51, 0x4b, 0x58, 0x31, 0x2d, 0x3c, 0x45, 0x43, 0x58, 0x4a, 0x4b, 0x5e,
+ 0x29, 0x2b, 0x39, 0x1f, 0x1e, 0x26, 0x27, 0x22, 0x27, 0x2d, 0x27, 0x2b,
+ 0x3e, 0x34, 0x3e, 0x4b, 0x41, 0x4b, 0x5e, 0x56, 0x5e, 0x73, 0x6c, 0x73,
+ 0x69, 0x61, 0x66, 0x64, 0x5a, 0x5e, 0x65, 0x56, 0x5b, 0x65, 0x55, 0x58,
+ 0x5e, 0x51, 0x51, 0x63, 0x55, 0x55, 0x63, 0x54, 0x57, 0x63, 0x57, 0x59,
+ 0x64, 0x5b, 0x5c, 0x5e, 0x56, 0x57, 0x5c, 0x51, 0x52, 0x5f, 0x50, 0x53,
+ 0x5b, 0x4d, 0x50, 0x5d, 0x4a, 0x4e, 0x5e, 0x4a, 0x4c, 0x4f, 0x42, 0x42,
+ 0x64, 0x67, 0x64, 0x99, 0xa6, 0xa7, 0x97, 0xa3, 0xaf, 0x92, 0x9b, 0xb0,
+ 0x8a, 0x95, 0xa5, 0x81, 0x8a, 0x9b, 0x76, 0x7c, 0x8e, 0x6a, 0x6d, 0x7c,
+ 0x5c, 0x5f, 0x68, 0x51, 0x54, 0x5a, 0x4c, 0x51, 0x57, 0x4a, 0x51, 0x57,
+ 0x43, 0x4a, 0x54, 0x27, 0x2e, 0x36, 0x15, 0x1c, 0x23, 0x18, 0x21, 0x2a,
+ 0x1f, 0x28, 0x33, 0x1f, 0x28, 0x34, 0x1c, 0x26, 0x30, 0x1b, 0x28, 0x2f,
+ 0x18, 0x25, 0x2d, 0x1b, 0x26, 0x2f, 0x1f, 0x27, 0x2b, 0x27, 0x2d, 0x27,
+ 0x4a, 0x4f, 0x41, 0x6e, 0x72, 0x63, 0x70, 0x73, 0x69, 0x6d, 0x71, 0x6f,
+ 0x81, 0x89, 0x89, 0x98, 0x9f, 0x9f, 0x9a, 0xa0, 0x9e, 0x9e, 0xa2, 0xa0,
+ 0x9c, 0x9e, 0x9b, 0x94, 0x96, 0x93, 0x95, 0x97, 0x92, 0x90, 0x93, 0x8e,
+ 0x8f, 0x94, 0x90, 0x98, 0x9d, 0x99, 0x96, 0x9b, 0x97, 0x9a, 0x9e, 0x9d,
+ 0x95, 0x99, 0x98, 0x7b, 0x7f, 0x7e, 0x6f, 0x73, 0x74, 0x91, 0x95, 0x96,
+ 0x94, 0x99, 0x92, 0x97, 0x9b, 0x99, 0x87, 0x8a, 0x8e, 0x5a, 0x5d, 0x62,
+ 0x39, 0x3d, 0x41, 0x28, 0x2c, 0x2f, 0x26, 0x27, 0x2b, 0x24, 0x25, 0x2a,
+ 0x2b, 0x2d, 0x2c, 0x24, 0x26, 0x25, 0x23, 0x25, 0x22, 0x35, 0x37, 0x36,
+ 0x2b, 0x2b, 0x30, 0x25, 0x25, 0x29, 0x22, 0x23, 0x25, 0x23, 0x23, 0x23,
+ 0x21, 0x21, 0x23, 0x23, 0x24, 0x26, 0x20, 0x24, 0x25, 0x38, 0x3c, 0x3d,
+ 0x43, 0x48, 0x4b, 0x47, 0x4f, 0x52, 0x4d, 0x56, 0x5b, 0x50, 0x5a, 0x5f,
+ 0x5c, 0x64, 0x66, 0x6b, 0x73, 0x76, 0x71, 0x78, 0x7c, 0x76, 0x7e, 0x81,
+ 0x74, 0x7c, 0x7e, 0x64, 0x6e, 0x71, 0x4d, 0x57, 0x5f, 0x38, 0x43, 0x4f,
+ 0x2f, 0x38, 0x43, 0x2f, 0x38, 0x3e, 0x3b, 0x45, 0x47, 0x43, 0x4d, 0x4f,
+ 0x4a, 0x58, 0x5b, 0x51, 0x60, 0x64, 0x53, 0x61, 0x62, 0x81, 0x8d, 0x8b,
+ 0xaf, 0xbb, 0xbc, 0xa9, 0xb3, 0xb8, 0xa9, 0xb2, 0xbb, 0xab, 0xb2, 0xbc,
+ 0xab, 0xb3, 0xba, 0xab, 0xb4, 0xbc, 0xad, 0xb7, 0xbf, 0xad, 0xb7, 0xc2,
+ 0xaf, 0xb8, 0xc6, 0xae, 0xb9, 0xc7, 0xad, 0xbb, 0xc8, 0xb1, 0xbe, 0xcc,
+ 0xb2, 0xbf, 0xcf, 0xb4, 0xc1, 0xd2, 0xb7, 0xc4, 0xd4, 0xb7, 0xc2, 0xd4,
+ 0xb5, 0xc6, 0xd6, 0xb7, 0xc7, 0xd6, 0xba, 0xc7, 0xd5, 0xbb, 0xc8, 0xd8,
+ 0xba, 0xc9, 0xda, 0xb9, 0xc8, 0xd9, 0xb4, 0xc2, 0xd2, 0x9d, 0xa9, 0xb6,
+ 0x8f, 0x96, 0x9e, 0x88, 0x8d, 0x93, 0x8a, 0x8f, 0x92, 0x8f, 0x93, 0x92,
+ 0x92, 0x96, 0x95, 0x95, 0x9b, 0x99, 0x9a, 0xa0, 0xa0, 0xa2, 0xa7, 0xaa,
+ 0xab, 0xb2, 0xba, 0xb2, 0xbb, 0xc2, 0xb6, 0xbf, 0xc8, 0xb8, 0xc2, 0xcc,
+ 0xb8, 0xc4, 0xd0, 0xbb, 0xc8, 0xd5, 0xbf, 0xcd, 0xda, 0xc3, 0xd1, 0xde,
+ 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x10, 0x10, 0x10, 0x16, 0x16, 0x16,
+ 0x17, 0x17, 0x17, 0x14, 0x15, 0x14, 0x14, 0x15, 0x14, 0x15, 0x17, 0x16,
+ 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x16, 0x19, 0x17, 0x17, 0x18, 0x17,
+ 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x14, 0x14, 0x14, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x16, 0x16, 0x16, 0x1d, 0x1d, 0x1d, 0x1c, 0x1c, 0x1e, 0x1d, 0x1d, 0x1f,
+ 0x1e, 0x1e, 0x20, 0x1c, 0x1c, 0x1e, 0x20, 0x20, 0x22, 0x22, 0x22, 0x25,
+ 0x26, 0x26, 0x28, 0x29, 0x29, 0x2b, 0x29, 0x29, 0x2a, 0x20, 0x20, 0x20,
+ 0x1e, 0x1e, 0x20, 0x1e, 0x20, 0x1f, 0x19, 0x1b, 0x19, 0x14, 0x16, 0x13,
+ 0x13, 0x15, 0x12, 0x11, 0x12, 0x10, 0x0d, 0x0d, 0x0b, 0x0c, 0x0c, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x06, 0x06, 0x08, 0x08, 0x08, 0x0a,
+ 0x08, 0x0c, 0x0f, 0x16, 0x1b, 0x1f, 0x19, 0x1e, 0x22, 0x18, 0x20, 0x22,
+ 0x1f, 0x28, 0x27, 0x27, 0x2f, 0x2c, 0x31, 0x3a, 0x39, 0x3f, 0x47, 0x48,
+ 0x3e, 0x42, 0x41, 0x3a, 0x3d, 0x3c, 0x4c, 0x51, 0x4d, 0x46, 0x4b, 0x47,
+ 0x2e, 0x33, 0x2f, 0x3a, 0x3e, 0x3d, 0x32, 0x36, 0x37, 0x1b, 0x1e, 0x21,
+ 0x0f, 0x11, 0x10, 0x0e, 0x10, 0x0f, 0x10, 0x10, 0x10, 0x13, 0x12, 0x13,
+ 0x13, 0x13, 0x15, 0x10, 0x11, 0x15, 0x14, 0x17, 0x1e, 0x25, 0x2a, 0x32,
+ 0x41, 0x4b, 0x51, 0x48, 0x55, 0x5c, 0x43, 0x4e, 0x5c, 0x42, 0x4e, 0x5e,
+ 0x41, 0x4c, 0x5e, 0x4a, 0x53, 0x64, 0x4d, 0x54, 0x64, 0x40, 0x47, 0x53,
+ 0x38, 0x3a, 0x3a, 0x2f, 0x31, 0x2e, 0x2a, 0x2a, 0x28, 0x2a, 0x2a, 0x28,
+ 0x26, 0x26, 0x24, 0x21, 0x21, 0x1f, 0x15, 0x15, 0x14, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x11, 0x11, 0x11,
+ 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12,
+ 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f,
+ 0x2b, 0x2c, 0x2f, 0x38, 0x39, 0x3d, 0x33, 0x34, 0x39, 0x2d, 0x2e, 0x33,
+ 0x26, 0x27, 0x2c, 0x17, 0x18, 0x1c, 0x1a, 0x1b, 0x1f, 0x1a, 0x1b, 0x1d,
+ 0x13, 0x14, 0x16, 0x2b, 0x2b, 0x2d, 0x1f, 0x1f, 0x21, 0x13, 0x12, 0x13,
+ 0x11, 0x0f, 0x10, 0x14, 0x12, 0x13, 0x12, 0x11, 0x0f, 0x12, 0x11, 0x0f,
+ 0x15, 0x11, 0x12, 0x14, 0x12, 0x13, 0x1f, 0x1d, 0x1e, 0x24, 0x22, 0x24,
+ 0x20, 0x1e, 0x1f, 0x21, 0x1f, 0x20, 0x20, 0x1e, 0x1f, 0x22, 0x1e, 0x1e,
+ 0x2c, 0x28, 0x27, 0x25, 0x21, 0x20, 0x1c, 0x16, 0x18, 0x1d, 0x17, 0x1a,
+ 0x21, 0x1b, 0x1d, 0x1c, 0x16, 0x16, 0x1c, 0x16, 0x16, 0x1c, 0x17, 0x15,
+ 0x17, 0x13, 0x12, 0x17, 0x13, 0x12, 0x16, 0x15, 0x13, 0x15, 0x14, 0x12,
+ 0x13, 0x0f, 0x0f, 0x27, 0x21, 0x21, 0x3d, 0x33, 0x34, 0x47, 0x3b, 0x3d,
+ 0x5f, 0x51, 0x55, 0x72, 0x62, 0x63, 0x76, 0x64, 0x64, 0x6d, 0x59, 0x58,
+ 0x58, 0x44, 0x44, 0x47, 0x34, 0x38, 0x45, 0x35, 0x3e, 0x53, 0x44, 0x50,
+ 0x63, 0x58, 0x5d, 0x76, 0x6c, 0x6f, 0x83, 0x7a, 0x7a, 0x85, 0x7c, 0x7d,
+ 0x8a, 0x80, 0x83, 0x89, 0x81, 0x86, 0x8d, 0x85, 0x8c, 0x93, 0x8c, 0x95,
+ 0x70, 0x6b, 0x7b, 0x5f, 0x5b, 0x69, 0x6d, 0x69, 0x78, 0x7b, 0x79, 0x87,
+ 0x81, 0x7f, 0x8d, 0x90, 0x8d, 0x9e, 0x7f, 0x7c, 0x91, 0x77, 0x75, 0x89,
+ 0x62, 0x5f, 0x70, 0x3f, 0x3c, 0x4f, 0x35, 0x32, 0x45, 0x3c, 0x39, 0x4b,
+ 0x25, 0x23, 0x2e, 0x1f, 0x1e, 0x24, 0x22, 0x20, 0x25, 0x22, 0x20, 0x25,
+ 0x2e, 0x24, 0x2a, 0x3a, 0x31, 0x36, 0x3b, 0x33, 0x36, 0x59, 0x50, 0x53,
+ 0x6c, 0x62, 0x65, 0x64, 0x56, 0x59, 0x62, 0x51, 0x54, 0x5d, 0x4b, 0x4e,
+ 0x57, 0x4b, 0x4d, 0x67, 0x5a, 0x5c, 0x67, 0x58, 0x5d, 0x66, 0x5a, 0x5e,
+ 0x62, 0x59, 0x5d, 0x5a, 0x51, 0x54, 0x5c, 0x51, 0x55, 0x60, 0x54, 0x56,
+ 0x5d, 0x51, 0x52, 0x5f, 0x4d, 0x51, 0x61, 0x4c, 0x4f, 0x55, 0x47, 0x47,
+ 0x56, 0x54, 0x51, 0x8d, 0x95, 0x96, 0x8f, 0x9a, 0xa2, 0x83, 0x8e, 0x9e,
+ 0x79, 0x84, 0x90, 0x71, 0x79, 0x86, 0x67, 0x6b, 0x79, 0x5d, 0x5f, 0x6b,
+ 0x50, 0x52, 0x5a, 0x4a, 0x4d, 0x52, 0x4c, 0x51, 0x55, 0x49, 0x50, 0x56,
+ 0x32, 0x35, 0x42, 0x1a, 0x1e, 0x29, 0x19, 0x20, 0x29, 0x1f, 0x28, 0x31,
+ 0x1f, 0x29, 0x33, 0x19, 0x26, 0x2f, 0x1a, 0x29, 0x30, 0x1b, 0x2d, 0x31,
+ 0x1f, 0x2a, 0x34, 0x26, 0x2e, 0x38, 0x27, 0x2d, 0x35, 0x27, 0x2c, 0x2e,
+ 0x28, 0x2f, 0x2a, 0x3c, 0x43, 0x3b, 0x4f, 0x58, 0x50, 0x79, 0x82, 0x7d,
+ 0xa3, 0xa7, 0xa8, 0xa4, 0xa7, 0xa7, 0x9b, 0x9d, 0x9c, 0xa0, 0xa0, 0x9e,
+ 0xa0, 0xa0, 0x9e, 0x9c, 0x9c, 0x9a, 0x9a, 0x9a, 0x98, 0x97, 0x98, 0x96,
+ 0x93, 0x97, 0x96, 0x92, 0x96, 0x95, 0x91, 0x95, 0x93, 0x96, 0x9a, 0x99,
+ 0x95, 0x99, 0x98, 0x90, 0x94, 0x94, 0x62, 0x66, 0x68, 0x7c, 0x80, 0x80,
+ 0x92, 0x98, 0x8e, 0x95, 0x9a, 0x94, 0x93, 0x97, 0x96, 0x90, 0x94, 0x93,
+ 0x75, 0x79, 0x7a, 0x48, 0x4a, 0x4d, 0x2d, 0x2d, 0x35, 0x2a, 0x2a, 0x36,
+ 0x29, 0x2a, 0x2c, 0x26, 0x28, 0x27, 0x21, 0x23, 0x22, 0x50, 0x52, 0x54,
+ 0x2f, 0x30, 0x35, 0x22, 0x23, 0x28, 0x21, 0x21, 0x26, 0x24, 0x24, 0x26,
+ 0x23, 0x25, 0x25, 0x1f, 0x21, 0x20, 0x23, 0x25, 0x24, 0x28, 0x2c, 0x2c,
+ 0x42, 0x47, 0x47, 0x70, 0x75, 0x78, 0x7e, 0x86, 0x89, 0x7d, 0x87, 0x89,
+ 0x7c, 0x83, 0x88, 0x77, 0x7e, 0x86, 0x6b, 0x72, 0x7c, 0x5f, 0x64, 0x6e,
+ 0x4d, 0x54, 0x5c, 0x3c, 0x43, 0x49, 0x2e, 0x36, 0x3d, 0x30, 0x39, 0x41,
+ 0x30, 0x3e, 0x41, 0x38, 0x43, 0x46, 0x45, 0x4f, 0x51, 0x4d, 0x58, 0x5c,
+ 0x52, 0x60, 0x65, 0x5c, 0x6a, 0x6e, 0x52, 0x60, 0x60, 0x97, 0xa4, 0xa0,
+ 0xab, 0xb5, 0xb7, 0xa6, 0xb0, 0xb5, 0xa6, 0xb0, 0xb9, 0xa6, 0xaf, 0xb8,
+ 0xa7, 0xb0, 0xb7, 0xaa, 0xb3, 0xba, 0xad, 0xb7, 0xbf, 0xad, 0xb7, 0xc1,
+ 0xae, 0xb9, 0xc5, 0xae, 0xba, 0xc6, 0xaf, 0xbd, 0xc8, 0xb1, 0xbf, 0xcb,
+ 0xb1, 0xc1, 0xce, 0xb2, 0xc2, 0xcf, 0xb4, 0xc4, 0xd2, 0xb5, 0xc5, 0xd4,
+ 0xb6, 0xc5, 0xd7, 0xb9, 0xc6, 0xd7, 0xba, 0xc7, 0xd7, 0xb9, 0xc9, 0xd8,
+ 0xb6, 0xc7, 0xd7, 0xb8, 0xc7, 0xd7, 0xad, 0xb7, 0xc6, 0x98, 0x9e, 0xab,
+ 0x8c, 0x90, 0x97, 0x89, 0x8e, 0x92, 0x8d, 0x91, 0x92, 0x91, 0x95, 0x94,
+ 0x94, 0x99, 0x97, 0x96, 0x9c, 0x9b, 0x9d, 0xa3, 0xa2, 0xa7, 0xad, 0xb0,
+ 0xaf, 0xb7, 0xbf, 0xb3, 0xbc, 0xc4, 0xb5, 0xbf, 0xc8, 0xb8, 0xc3, 0xcc,
+ 0xba, 0xc6, 0xd2, 0xbd, 0xcb, 0xd6, 0xc0, 0xce, 0xda, 0xc2, 0xd0, 0xdd,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x15, 0x15, 0x15,
+ 0x18, 0x18, 0x18, 0x16, 0x18, 0x17, 0x15, 0x17, 0x16, 0x15, 0x17, 0x16,
+ 0x19, 0x1b, 0x1a, 0x18, 0x1a, 0x19, 0x17, 0x19, 0x18, 0x19, 0x1b, 0x1a,
+ 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0b, 0x0b, 0x0b,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x16, 0x16, 0x16, 0x1b, 0x1b, 0x1b, 0x1c, 0x1c, 0x1e, 0x1f, 0x1f, 0x21,
+ 0x1f, 0x1f, 0x21, 0x1f, 0x1f, 0x21, 0x25, 0x24, 0x27, 0x23, 0x23, 0x25,
+ 0x24, 0x24, 0x26, 0x25, 0x25, 0x27, 0x2a, 0x2a, 0x2c, 0x2d, 0x2d, 0x2e,
+ 0x23, 0x24, 0x26, 0x1b, 0x1c, 0x1e, 0x1a, 0x1c, 0x1b, 0x17, 0x19, 0x18,
+ 0x15, 0x17, 0x14, 0x13, 0x15, 0x12, 0x12, 0x12, 0x10, 0x0d, 0x0d, 0x0b,
+ 0x0c, 0x0c, 0x0a, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x0b,
+ 0x06, 0x06, 0x08, 0x06, 0x06, 0x08, 0x08, 0x07, 0x09, 0x07, 0x07, 0x09,
+ 0x07, 0x0b, 0x0c, 0x16, 0x19, 0x1c, 0x1a, 0x1f, 0x23, 0x1e, 0x26, 0x28,
+ 0x28, 0x31, 0x30, 0x38, 0x41, 0x3e, 0x40, 0x49, 0x46, 0x37, 0x40, 0x3f,
+ 0x2b, 0x2f, 0x2e, 0x2e, 0x32, 0x31, 0x43, 0x48, 0x44, 0x4f, 0x52, 0x4e,
+ 0x41, 0x43, 0x40, 0x23, 0x25, 0x23, 0x18, 0x1a, 0x1a, 0x16, 0x17, 0x18,
+ 0x0d, 0x0f, 0x0e, 0x0e, 0x10, 0x0f, 0x11, 0x11, 0x11, 0x14, 0x14, 0x13,
+ 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x10, 0x10, 0x11, 0x13, 0x14, 0x15, 0x19,
+ 0x20, 0x28, 0x2a, 0x37, 0x3f, 0x44, 0x44, 0x4b, 0x59, 0x42, 0x4b, 0x5c,
+ 0x3f, 0x4a, 0x5c, 0x44, 0x4e, 0x5e, 0x45, 0x4f, 0x5c, 0x3d, 0x46, 0x4e,
+ 0x33, 0x35, 0x34, 0x29, 0x2b, 0x28, 0x29, 0x29, 0x27, 0x26, 0x26, 0x24,
+ 0x32, 0x32, 0x30, 0x35, 0x35, 0x33, 0x1e, 0x1e, 0x1e, 0x0a, 0x0a, 0x0a,
+ 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x11, 0x11, 0x11,
+ 0x14, 0x14, 0x14, 0x13, 0x13, 0x13, 0x12, 0x12, 0x12, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c,
+ 0x2b, 0x2b, 0x2f, 0x39, 0x3a, 0x3f, 0x32, 0x33, 0x38, 0x2e, 0x2e, 0x36,
+ 0x2a, 0x2a, 0x32, 0x23, 0x24, 0x29, 0x1e, 0x1f, 0x23, 0x1a, 0x1b, 0x1d,
+ 0x18, 0x17, 0x1c, 0x2b, 0x2b, 0x2d, 0x1c, 0x1a, 0x1d, 0x12, 0x10, 0x13,
+ 0x12, 0x10, 0x11, 0x10, 0x0e, 0x0f, 0x12, 0x12, 0x12, 0x11, 0x11, 0x0f,
+ 0x16, 0x11, 0x12, 0x18, 0x14, 0x15, 0x22, 0x20, 0x22, 0x1f, 0x1d, 0x20,
+ 0x1d, 0x1b, 0x1e, 0x1e, 0x1d, 0x1f, 0x1e, 0x1d, 0x1e, 0x21, 0x20, 0x20,
+ 0x28, 0x27, 0x25, 0x22, 0x20, 0x21, 0x17, 0x15, 0x16, 0x1a, 0x16, 0x17,
+ 0x1e, 0x1a, 0x1b, 0x19, 0x15, 0x16, 0x18, 0x16, 0x15, 0x16, 0x15, 0x13,
+ 0x14, 0x12, 0x12, 0x13, 0x12, 0x12, 0x13, 0x14, 0x13, 0x10, 0x10, 0x0e,
+ 0x15, 0x12, 0x11, 0x36, 0x2d, 0x2c, 0x4e, 0x3f, 0x40, 0x66, 0x53, 0x55,
+ 0x7b, 0x6c, 0x6a, 0x80, 0x70, 0x6e, 0x7a, 0x68, 0x68, 0x5a, 0x47, 0x48,
+ 0x49, 0x39, 0x3a, 0x6a, 0x5c, 0x5a, 0x95, 0x8a, 0x84, 0xb7, 0xae, 0xa6,
+ 0xc7, 0xc3, 0xb2, 0xd0, 0xcd, 0xbb, 0xd6, 0xd3, 0xc1, 0xd7, 0xd4, 0xc2,
+ 0xd6, 0xd3, 0xc3, 0xd9, 0xd7, 0xc9, 0xd9, 0xd7, 0xca, 0xd4, 0xd2, 0xc7,
+ 0xcb, 0xc7, 0xc2, 0xb8, 0xb4, 0xb5, 0xaf, 0xab, 0xb7, 0x84, 0x7f, 0x92,
+ 0x79, 0x75, 0x8a, 0x6f, 0x6b, 0x80, 0x61, 0x5e, 0x6f, 0x7b, 0x79, 0x87,
+ 0x83, 0x81, 0x93, 0x64, 0x61, 0x74, 0x3e, 0x3a, 0x4b, 0x3b, 0x33, 0x42,
+ 0x26, 0x1f, 0x27, 0x20, 0x1a, 0x1f, 0x1d, 0x1b, 0x1e, 0x1e, 0x1d, 0x21,
+ 0x23, 0x1d, 0x20, 0x26, 0x20, 0x21, 0x2d, 0x27, 0x28, 0x44, 0x3b, 0x3e,
+ 0x56, 0x4c, 0x4d, 0x59, 0x4d, 0x4f, 0x57, 0x48, 0x4b, 0x4f, 0x3f, 0x42,
+ 0x53, 0x47, 0x4b, 0x5d, 0x50, 0x55, 0x53, 0x44, 0x4b, 0x4e, 0x41, 0x48,
+ 0x50, 0x45, 0x4c, 0x55, 0x4a, 0x4f, 0x57, 0x4b, 0x4f, 0x5a, 0x4b, 0x50,
+ 0x53, 0x47, 0x47, 0x52, 0x41, 0x44, 0x52, 0x3e, 0x42, 0x4d, 0x3d, 0x3e,
+ 0x47, 0x40, 0x3e, 0x7d, 0x81, 0x81, 0x7f, 0x89, 0x8e, 0x6f, 0x79, 0x83,
+ 0x68, 0x72, 0x7a, 0x5e, 0x65, 0x6f, 0x56, 0x58, 0x63, 0x4c, 0x4c, 0x56,
+ 0x45, 0x46, 0x4b, 0x43, 0x47, 0x4a, 0x4c, 0x51, 0x55, 0x39, 0x3f, 0x48,
+ 0x1c, 0x20, 0x2c, 0x18, 0x1e, 0x2a, 0x1e, 0x27, 0x30, 0x1f, 0x29, 0x32,
+ 0x1b, 0x28, 0x31, 0x16, 0x23, 0x2d, 0x1d, 0x2c, 0x33, 0x20, 0x2e, 0x33,
+ 0x2c, 0x34, 0x37, 0x3c, 0x42, 0x48, 0x42, 0x47, 0x4d, 0x38, 0x3d, 0x41,
+ 0x32, 0x38, 0x3a, 0x30, 0x38, 0x37, 0x5a, 0x65, 0x61, 0xa0, 0xab, 0xa8,
+ 0xb8, 0xbc, 0xbb, 0xa7, 0xa8, 0xa7, 0x9a, 0x9c, 0x99, 0x9b, 0x9b, 0x99,
+ 0x9d, 0x9e, 0x9a, 0x9d, 0x9d, 0x9b, 0x97, 0x97, 0x97, 0x9a, 0x9a, 0x9a,
+ 0x9a, 0x9c, 0x9c, 0x93, 0x97, 0x96, 0x97, 0x9b, 0x9a, 0x93, 0x97, 0x96,
+ 0x93, 0x97, 0x96, 0x9f, 0xa3, 0xa2, 0x9e, 0xa2, 0xa2, 0x5f, 0x63, 0x61,
+ 0x8c, 0x91, 0x8c, 0x8d, 0x91, 0x8c, 0x66, 0x6b, 0x68, 0x86, 0x8b, 0x87,
+ 0x98, 0x9b, 0x97, 0x92, 0x94, 0x93, 0x66, 0x67, 0x6d, 0x34, 0x34, 0x40,
+ 0x2f, 0x2f, 0x37, 0x29, 0x2a, 0x2f, 0x29, 0x2a, 0x2e, 0x38, 0x39, 0x3e,
+ 0x32, 0x33, 0x38, 0x29, 0x2a, 0x2f, 0x22, 0x23, 0x27, 0x25, 0x25, 0x26,
+ 0x25, 0x26, 0x27, 0x26, 0x28, 0x27, 0x23, 0x24, 0x24, 0x26, 0x29, 0x28,
+ 0x26, 0x2a, 0x2a, 0x43, 0x49, 0x49, 0x56, 0x5d, 0x5f, 0x55, 0x5d, 0x60,
+ 0x50, 0x57, 0x5c, 0x47, 0x4e, 0x56, 0x40, 0x46, 0x52, 0x39, 0x3f, 0x4b,
+ 0x32, 0x39, 0x43, 0x31, 0x39, 0x3f, 0x32, 0x39, 0x3d, 0x35, 0x3d, 0x40,
+ 0x38, 0x48, 0x47, 0x43, 0x51, 0x52, 0x4e, 0x59, 0x5d, 0x57, 0x62, 0x68,
+ 0x5f, 0x6c, 0x72, 0x4a, 0x58, 0x5c, 0x5e, 0x6c, 0x6a, 0xa4, 0xb2, 0xab,
+ 0xa5, 0xae, 0xb0, 0xa0, 0xaa, 0xaf, 0xa4, 0xad, 0xb6, 0xa6, 0xaf, 0xb8,
+ 0xa8, 0xb1, 0xb8, 0xaa, 0xb3, 0xba, 0xac, 0xb6, 0xbe, 0xac, 0xb6, 0xc0,
+ 0xad, 0xb9, 0xc3, 0xae, 0xba, 0xc4, 0xaf, 0xbd, 0xc8, 0xb0, 0xbf, 0xca,
+ 0xb1, 0xc1, 0xcc, 0xb1, 0xc2, 0xce, 0xb4, 0xc4, 0xd1, 0xb5, 0xc5, 0xd3,
+ 0xb7, 0xc5, 0xd7, 0xb8, 0xc6, 0xd7, 0xb8, 0xc7, 0xd6, 0xb7, 0xc9, 0xd8,
+ 0xb6, 0xc9, 0xd8, 0xb5, 0xc3, 0xd2, 0xa6, 0xab, 0xba, 0x96, 0x96, 0xa2,
+ 0x8a, 0x8d, 0x92, 0x8d, 0x91, 0x94, 0x8f, 0x93, 0x93, 0x93, 0x97, 0x96,
+ 0x97, 0x9b, 0x9a, 0x98, 0x9e, 0x9e, 0xa0, 0xa6, 0xa8, 0xa9, 0xb1, 0xb5,
+ 0xb0, 0xba, 0xc1, 0xb5, 0xbe, 0xc7, 0xb7, 0xc2, 0xcb, 0xb8, 0xc4, 0xce,
+ 0xbb, 0xc7, 0xd3, 0xbe, 0xcc, 0xd7, 0xc1, 0xcf, 0xda, 0xc2, 0xd2, 0xdd,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x12, 0x12, 0x12,
+ 0x15, 0x17, 0x16, 0x16, 0x18, 0x17, 0x15, 0x17, 0x16, 0x17, 0x19, 0x18,
+ 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x18, 0x1b, 0x1a,
+ 0x18, 0x18, 0x18, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x0e, 0x0e, 0x0e,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x12, 0x12, 0x12, 0x1b, 0x1b, 0x1b, 0x1e, 0x1e, 0x20, 0x1f, 0x1f, 0x21,
+ 0x20, 0x20, 0x22, 0x21, 0x21, 0x22, 0x23, 0x23, 0x25, 0x22, 0x22, 0x24,
+ 0x22, 0x22, 0x24, 0x23, 0x23, 0x25, 0x24, 0x24, 0x26, 0x2b, 0x2b, 0x2d,
+ 0x2e, 0x2f, 0x31, 0x28, 0x29, 0x2b, 0x1f, 0x20, 0x22, 0x1a, 0x1b, 0x1d,
+ 0x1b, 0x1d, 0x1c, 0x1a, 0x1c, 0x1a, 0x15, 0x15, 0x13, 0x12, 0x12, 0x10,
+ 0x13, 0x13, 0x11, 0x0d, 0x0d, 0x0c, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x0b,
+ 0x07, 0x07, 0x09, 0x08, 0x07, 0x09, 0x09, 0x09, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x08, 0x03, 0x15, 0x17, 0x16, 0x1e, 0x22, 0x23, 0x1f, 0x23, 0x24,
+ 0x37, 0x3d, 0x3b, 0x55, 0x5b, 0x57, 0x5c, 0x62, 0x5f, 0x43, 0x49, 0x46,
+ 0x2b, 0x30, 0x2c, 0x2b, 0x30, 0x2c, 0x3d, 0x40, 0x3d, 0x45, 0x47, 0x44,
+ 0x24, 0x25, 0x22, 0x1a, 0x1a, 0x18, 0x19, 0x19, 0x19, 0x15, 0x15, 0x15,
+ 0x0d, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x11, 0x12, 0x11, 0x0f, 0x0e, 0x0d,
+ 0x11, 0x11, 0x0f, 0x11, 0x11, 0x11, 0x10, 0x10, 0x11, 0x10, 0x10, 0x10,
+ 0x11, 0x13, 0x14, 0x1d, 0x1e, 0x24, 0x2d, 0x31, 0x3c, 0x40, 0x46, 0x55,
+ 0x42, 0x48, 0x56, 0x36, 0x3d, 0x47, 0x2f, 0x37, 0x3a, 0x25, 0x2c, 0x2e,
+ 0x22, 0x24, 0x23, 0x25, 0x26, 0x24, 0x2a, 0x2a, 0x28, 0x2f, 0x2f, 0x2d,
+ 0x2e, 0x2e, 0x2c, 0x18, 0x18, 0x16, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0f, 0x0f, 0x0f,
+ 0x14, 0x14, 0x14, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x24, 0x25, 0x28, 0x38, 0x39, 0x3f, 0x30, 0x31, 0x36, 0x2d, 0x2d, 0x35,
+ 0x28, 0x28, 0x30, 0x24, 0x25, 0x2a, 0x1f, 0x21, 0x24, 0x1a, 0x1b, 0x1d,
+ 0x19, 0x18, 0x1d, 0x2a, 0x2a, 0x2c, 0x19, 0x17, 0x1a, 0x12, 0x10, 0x13,
+ 0x11, 0x0f, 0x10, 0x11, 0x10, 0x10, 0x11, 0x11, 0x11, 0x12, 0x12, 0x10,
+ 0x15, 0x0f, 0x11, 0x18, 0x14, 0x15, 0x29, 0x25, 0x26, 0x1f, 0x1d, 0x20,
+ 0x20, 0x1e, 0x21, 0x1a, 0x1a, 0x1c, 0x1e, 0x1c, 0x1f, 0x1f, 0x1d, 0x20,
+ 0x29, 0x29, 0x27, 0x24, 0x23, 0x21, 0x18, 0x16, 0x16, 0x17, 0x15, 0x16,
+ 0x1a, 0x17, 0x18, 0x15, 0x13, 0x14, 0x16, 0x16, 0x16, 0x15, 0x15, 0x14,
+ 0x15, 0x15, 0x16, 0x12, 0x13, 0x13, 0x11, 0x12, 0x11, 0x13, 0x11, 0x0f,
+ 0x25, 0x1f, 0x1d, 0x4b, 0x3f, 0x3d, 0x69, 0x59, 0x58, 0x82, 0x6f, 0x6f,
+ 0x85, 0x75, 0x75, 0x76, 0x66, 0x66, 0x51, 0x43, 0x3f, 0x61, 0x56, 0x4f,
+ 0xa1, 0x98, 0x8d, 0xcd, 0xc8, 0xb5, 0xd8, 0xd6, 0xbd, 0xdd, 0xdb, 0xc1,
+ 0xe1, 0xde, 0xca, 0xdd, 0xdb, 0xc8, 0xdd, 0xdc, 0xc8, 0xdd, 0xdc, 0xc8,
+ 0xdb, 0xdb, 0xc9, 0xde, 0xde, 0xce, 0xdf, 0xe0, 0xd0, 0xdf, 0xe0, 0xd1,
+ 0xe3, 0xe1, 0xcf, 0xdd, 0xdb, 0xce, 0xe3, 0xdf, 0xdc, 0xcc, 0xc7, 0xcc,
+ 0xa5, 0xa1, 0xac, 0x85, 0x81, 0x8f, 0x90, 0x8d, 0x99, 0x89, 0x86, 0x91,
+ 0x77, 0x75, 0x87, 0x94, 0x90, 0xa1, 0x54, 0x4c, 0x5c, 0x3c, 0x31, 0x3d,
+ 0x32, 0x28, 0x2e, 0x25, 0x1c, 0x1f, 0x20, 0x1c, 0x1d, 0x1d, 0x1b, 0x1e,
+ 0x1d, 0x1b, 0x1d, 0x1e, 0x1c, 0x1d, 0x32, 0x2f, 0x30, 0x38, 0x34, 0x35,
+ 0x33, 0x2d, 0x31, 0x3c, 0x33, 0x38, 0x46, 0x3b, 0x41, 0x4e, 0x43, 0x49,
+ 0x4d, 0x42, 0x48, 0x4b, 0x3f, 0x45, 0x45, 0x36, 0x3d, 0x42, 0x32, 0x3c,
+ 0x41, 0x34, 0x3b, 0x3f, 0x33, 0x39, 0x40, 0x34, 0x38, 0x42, 0x33, 0x38,
+ 0x3e, 0x33, 0x34, 0x3f, 0x33, 0x35, 0x40, 0x31, 0x34, 0x3f, 0x32, 0x34,
+ 0x36, 0x30, 0x2f, 0x64, 0x64, 0x64, 0x6e, 0x74, 0x79, 0x59, 0x62, 0x6b,
+ 0x54, 0x5a, 0x61, 0x4a, 0x4d, 0x56, 0x42, 0x42, 0x4c, 0x3c, 0x3c, 0x42,
+ 0x3d, 0x3e, 0x42, 0x43, 0x47, 0x4a, 0x47, 0x4c, 0x52, 0x27, 0x2d, 0x38,
+ 0x17, 0x20, 0x2c, 0x1c, 0x27, 0x31, 0x1c, 0x29, 0x32, 0x1b, 0x28, 0x32,
+ 0x1c, 0x29, 0x34, 0x1b, 0x27, 0x32, 0x20, 0x2a, 0x35, 0x30, 0x3a, 0x40,
+ 0x47, 0x4d, 0x4a, 0x59, 0x5f, 0x5d, 0x67, 0x6b, 0x6c, 0x5f, 0x63, 0x66,
+ 0x52, 0x56, 0x5a, 0x46, 0x4b, 0x4f, 0x8d, 0x95, 0x97, 0xc5, 0xd0, 0xce,
+ 0xbc, 0xc2, 0xc1, 0xa0, 0xa4, 0xa3, 0x94, 0x99, 0x95, 0x96, 0x98, 0x94,
+ 0x9d, 0x9f, 0x9a, 0x98, 0x9a, 0x97, 0x9a, 0x9c, 0x9b, 0x9b, 0x9d, 0x9c,
+ 0x9b, 0x9c, 0x9e, 0x9a, 0x9b, 0x9d, 0x8c, 0x8e, 0x8f, 0x84, 0x88, 0x87,
+ 0x86, 0x8a, 0x89, 0x94, 0x98, 0x97, 0xad, 0xb1, 0xb0, 0x72, 0x76, 0x75,
+ 0x6c, 0x70, 0x70, 0x5e, 0x63, 0x63, 0x6e, 0x72, 0x71, 0x94, 0x97, 0x92,
+ 0x92, 0x95, 0x8f, 0xa1, 0xa3, 0x9e, 0xa1, 0xa2, 0xa2, 0x72, 0x72, 0x79,
+ 0x44, 0x46, 0x52, 0x2b, 0x2e, 0x37, 0x2b, 0x2b, 0x33, 0x38, 0x39, 0x3e,
+ 0x3d, 0x3e, 0x43, 0x27, 0x29, 0x2d, 0x26, 0x28, 0x27, 0x27, 0x29, 0x27,
+ 0x23, 0x24, 0x26, 0x24, 0x24, 0x26, 0x21, 0x22, 0x24, 0x24, 0x25, 0x25,
+ 0x24, 0x25, 0x27, 0x21, 0x25, 0x26, 0x2f, 0x35, 0x36, 0x37, 0x3f, 0x41,
+ 0x37, 0x40, 0x43, 0x34, 0x3d, 0x44, 0x2e, 0x37, 0x42, 0x31, 0x39, 0x44,
+ 0x32, 0x3b, 0x44, 0x36, 0x3f, 0x44, 0x3d, 0x47, 0x49, 0x41, 0x4b, 0x4c,
+ 0x46, 0x56, 0x55, 0x52, 0x5f, 0x63, 0x5c, 0x66, 0x70, 0x5e, 0x69, 0x71,
+ 0x4a, 0x57, 0x5d, 0x43, 0x51, 0x53, 0x89, 0x95, 0x93, 0xa6, 0xb1, 0xad,
+ 0xa1, 0xa9, 0xac, 0x9f, 0xa7, 0xad, 0xa2, 0xab, 0xb4, 0xa5, 0xaf, 0xb7,
+ 0xa7, 0xb1, 0xb8, 0xa6, 0xb1, 0xb7, 0xa8, 0xb2, 0xbb, 0xab, 0xb5, 0xbf,
+ 0xab, 0xb8, 0xc1, 0xad, 0xba, 0xc3, 0xaf, 0xbd, 0xc6, 0xb1, 0xbe, 0xc9,
+ 0xb2, 0xc0, 0xcb, 0xb2, 0xc2, 0xcd, 0xb4, 0xc4, 0xd0, 0xb3, 0xc4, 0xd0,
+ 0xb7, 0xc3, 0xd4, 0xb8, 0xc5, 0xd5, 0xb8, 0xc8, 0xd7, 0xb7, 0xc9, 0xd7,
+ 0xb7, 0xc9, 0xd7, 0xac, 0xba, 0xc7, 0x9c, 0xa0, 0xad, 0x93, 0x91, 0x9b,
+ 0x8e, 0x91, 0x94, 0x90, 0x94, 0x95, 0x93, 0x97, 0x97, 0x98, 0x9c, 0x9b,
+ 0x99, 0x9e, 0x9d, 0x9d, 0xa3, 0xa4, 0xa6, 0xad, 0xb1, 0xae, 0xb7, 0xbd,
+ 0xb4, 0xbe, 0xc6, 0xb5, 0xbf, 0xc8, 0xb7, 0xc4, 0xcd, 0xb9, 0xc6, 0xd0,
+ 0xbb, 0xc9, 0xd4, 0xbf, 0xcd, 0xd8, 0xc0, 0xd1, 0xdb, 0xc2, 0xd3, 0xdd,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x10, 0x11, 0x11,
+ 0x15, 0x17, 0x16, 0x16, 0x18, 0x17, 0x14, 0x16, 0x15, 0x15, 0x17, 0x16,
+ 0x14, 0x16, 0x15, 0x16, 0x18, 0x17, 0x15, 0x17, 0x16, 0x15, 0x17, 0x16,
+ 0x15, 0x15, 0x15, 0x17, 0x17, 0x17, 0x1a, 0x1a, 0x1a, 0x10, 0x10, 0x10,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08,
+ 0x10, 0x10, 0x10, 0x1c, 0x1c, 0x1c, 0x1d, 0x1d, 0x1f, 0x1d, 0x1d, 0x20,
+ 0x21, 0x21, 0x23, 0x22, 0x22, 0x23, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22,
+ 0x24, 0x24, 0x24, 0x24, 0x24, 0x26, 0x25, 0x25, 0x28, 0x28, 0x27, 0x2c,
+ 0x28, 0x29, 0x2d, 0x31, 0x32, 0x36, 0x2f, 0x30, 0x34, 0x21, 0x25, 0x28,
+ 0x1b, 0x1c, 0x1e, 0x1c, 0x1e, 0x1d, 0x18, 0x18, 0x18, 0x16, 0x16, 0x14,
+ 0x13, 0x13, 0x11, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0d, 0x08, 0x08, 0x0a,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x04, 0x0f, 0x10, 0x0b,
+ 0x10, 0x10, 0x07, 0x1a, 0x1a, 0x14, 0x2e, 0x2f, 0x2d, 0x2c, 0x2e, 0x2d,
+ 0x3e, 0x43, 0x3f, 0x57, 0x5c, 0x56, 0x61, 0x66, 0x60, 0x5e, 0x63, 0x5f,
+ 0x4b, 0x50, 0x4c, 0x40, 0x45, 0x41, 0x49, 0x4b, 0x48, 0x2e, 0x30, 0x2d,
+ 0x11, 0x13, 0x10, 0x1e, 0x1e, 0x1c, 0x21, 0x21, 0x1f, 0x1c, 0x1c, 0x1a,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x0e,
+ 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0f, 0x0e,
+ 0x11, 0x10, 0x12, 0x12, 0x11, 0x15, 0x15, 0x17, 0x1c, 0x2b, 0x2e, 0x35,
+ 0x35, 0x38, 0x3f, 0x29, 0x2d, 0x30, 0x26, 0x28, 0x27, 0x28, 0x2b, 0x27,
+ 0x27, 0x2a, 0x28, 0x2a, 0x2c, 0x29, 0x2a, 0x2a, 0x28, 0x24, 0x24, 0x22,
+ 0x12, 0x12, 0x10, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d,
+ 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10,
+ 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x1f, 0x20, 0x24, 0x38, 0x39, 0x3e, 0x30, 0x30, 0x36, 0x2a, 0x2a, 0x32,
+ 0x27, 0x27, 0x2f, 0x23, 0x24, 0x29, 0x1f, 0x20, 0x23, 0x19, 0x1a, 0x1c,
+ 0x18, 0x19, 0x1b, 0x23, 0x24, 0x26, 0x16, 0x16, 0x18, 0x10, 0x0e, 0x10,
+ 0x10, 0x0e, 0x0f, 0x11, 0x0f, 0x10, 0x14, 0x13, 0x11, 0x14, 0x13, 0x11,
+ 0x15, 0x0f, 0x10, 0x17, 0x13, 0x14, 0x23, 0x20, 0x21, 0x1d, 0x1b, 0x1e,
+ 0x25, 0x23, 0x26, 0x22, 0x20, 0x23, 0x1d, 0x1b, 0x1e, 0x24, 0x21, 0x24,
+ 0x2a, 0x29, 0x27, 0x25, 0x24, 0x23, 0x18, 0x16, 0x17, 0x16, 0x14, 0x15,
+ 0x17, 0x15, 0x16, 0x15, 0x13, 0x14, 0x17, 0x16, 0x17, 0x14, 0x14, 0x14,
+ 0x14, 0x14, 0x14, 0x11, 0x12, 0x12, 0x11, 0x0f, 0x0e, 0x22, 0x1c, 0x1b,
+ 0x3c, 0x34, 0x33, 0x62, 0x56, 0x54, 0x81, 0x73, 0x70, 0x89, 0x7a, 0x77,
+ 0x7e, 0x6f, 0x73, 0x55, 0x47, 0x46, 0x7c, 0x73, 0x66, 0xc8, 0xc3, 0xab,
+ 0xde, 0xdd, 0xbf, 0xdf, 0xe0, 0xc2, 0xde, 0xde, 0xc1, 0xdc, 0xdc, 0xc2,
+ 0xe1, 0xe0, 0xcc, 0xde, 0xdd, 0xc9, 0xdd, 0xdc, 0xca, 0xdc, 0xdb, 0xc9,
+ 0xdb, 0xd9, 0xc9, 0xdd, 0xdd, 0xce, 0xde, 0xe0, 0xd1, 0xe0, 0xe0, 0xd2,
+ 0xe1, 0xe0, 0xd1, 0xda, 0xd9, 0xc7, 0xdc, 0xda, 0xc8, 0xe0, 0xde, 0xce,
+ 0xdb, 0xd9, 0xce, 0xc6, 0xc4, 0xc3, 0x9d, 0x9a, 0xa2, 0x78, 0x74, 0x82,
+ 0x81, 0x7f, 0x90, 0x8a, 0x86, 0x97, 0x54, 0x4c, 0x5c, 0x40, 0x35, 0x43,
+ 0x3f, 0x36, 0x3d, 0x2a, 0x24, 0x26, 0x20, 0x1c, 0x1d, 0x1d, 0x1b, 0x1c,
+ 0x17, 0x17, 0x19, 0x28, 0x28, 0x2a, 0x27, 0x26, 0x28, 0x1e, 0x1c, 0x1f,
+ 0x22, 0x20, 0x25, 0x26, 0x21, 0x27, 0x2e, 0x29, 0x2f, 0x3f, 0x3b, 0x40,
+ 0x3b, 0x34, 0x3b, 0x45, 0x3a, 0x43, 0x47, 0x39, 0x42, 0x44, 0x37, 0x40,
+ 0x3f, 0x34, 0x3c, 0x3a, 0x30, 0x36, 0x38, 0x2d, 0x31, 0x37, 0x2b, 0x2f,
+ 0x34, 0x2b, 0x2e, 0x34, 0x2c, 0x2f, 0x35, 0x2c, 0x30, 0x30, 0x2a, 0x2c,
+ 0x29, 0x26, 0x26, 0x4e, 0x4e, 0x50, 0x56, 0x58, 0x5e, 0x49, 0x4e, 0x54,
+ 0x40, 0x43, 0x48, 0x36, 0x39, 0x40, 0x38, 0x38, 0x40, 0x3a, 0x39, 0x3f,
+ 0x3d, 0x3e, 0x42, 0x43, 0x47, 0x4b, 0x3d, 0x43, 0x4e, 0x1f, 0x28, 0x35,
+ 0x1b, 0x27, 0x33, 0x1b, 0x29, 0x32, 0x1c, 0x2a, 0x33, 0x1f, 0x2d, 0x38,
+ 0x1f, 0x2d, 0x3a, 0x1e, 0x2a, 0x38, 0x24, 0x2e, 0x3a, 0x31, 0x39, 0x42,
+ 0x4f, 0x58, 0x53, 0x76, 0x7d, 0x76, 0x8c, 0x91, 0x8d, 0x84, 0x89, 0x87,
+ 0x6a, 0x6e, 0x73, 0x6b, 0x70, 0x74, 0xba, 0xc0, 0xc2, 0xd2, 0xda, 0xd9,
+ 0xb7, 0xbd, 0xbd, 0x9a, 0x9e, 0x9d, 0x94, 0x99, 0x95, 0x9c, 0xa1, 0x9b,
+ 0x9a, 0x9e, 0x97, 0x97, 0x9c, 0x96, 0x99, 0x9e, 0x9a, 0x9b, 0x9f, 0x9e,
+ 0x9f, 0xa0, 0xa3, 0x81, 0x82, 0x84, 0x65, 0x67, 0x66, 0x6e, 0x70, 0x6f,
+ 0x68, 0x6b, 0x6a, 0x78, 0x7d, 0x79, 0x9a, 0x9f, 0x9a, 0x8b, 0x8f, 0x8c,
+ 0x47, 0x4b, 0x4e, 0x6a, 0x6d, 0x71, 0x9e, 0x9f, 0xa1, 0x8d, 0x8e, 0x8c,
+ 0x87, 0x89, 0x84, 0x91, 0x94, 0x8d, 0x92, 0x94, 0x8f, 0x93, 0x95, 0x95,
+ 0x85, 0x87, 0x92, 0x56, 0x59, 0x61, 0x32, 0x35, 0x3a, 0x35, 0x38, 0x3d,
+ 0x39, 0x3c, 0x41, 0x2d, 0x30, 0x35, 0x29, 0x2d, 0x2e, 0x2e, 0x33, 0x30,
+ 0x26, 0x28, 0x2b, 0x21, 0x22, 0x24, 0x24, 0x25, 0x27, 0x21, 0x22, 0x24,
+ 0x24, 0x25, 0x27, 0x22, 0x26, 0x27, 0x29, 0x2f, 0x2f, 0x38, 0x3e, 0x3e,
+ 0x30, 0x3b, 0x3d, 0x30, 0x3c, 0x42, 0x32, 0x3e, 0x48, 0x33, 0x40, 0x49,
+ 0x3a, 0x47, 0x4f, 0x41, 0x4e, 0x54, 0x48, 0x56, 0x5a, 0x4d, 0x5b, 0x60,
+ 0x56, 0x65, 0x6a, 0x5f, 0x6c, 0x74, 0x57, 0x61, 0x6b, 0x41, 0x4b, 0x54,
+ 0x3c, 0x49, 0x4d, 0x6f, 0x7e, 0x7d, 0x9c, 0xa8, 0xa6, 0x9f, 0xa8, 0xa7,
+ 0x9e, 0xa5, 0xa9, 0x9d, 0xa5, 0xaa, 0x9e, 0xa7, 0xb0, 0xa0, 0xaa, 0xb3,
+ 0xa4, 0xaf, 0xb5, 0xa5, 0xb0, 0xb6, 0xa8, 0xb2, 0xba, 0xac, 0xb6, 0xc0,
+ 0xaa, 0xb8, 0xc1, 0xac, 0xba, 0xc3, 0xad, 0xbb, 0xc4, 0xb1, 0xbd, 0xc8,
+ 0xb2, 0xc0, 0xcb, 0xb5, 0xc3, 0xce, 0xb5, 0xc4, 0xd0, 0xb4, 0xc3, 0xd0,
+ 0xb9, 0xc5, 0xd3, 0xb9, 0xc6, 0xd3, 0xba, 0xc8, 0xd5, 0xb9, 0xc9, 0xd6,
+ 0xb3, 0xc3, 0xd2, 0xa3, 0xaf, 0xbd, 0x93, 0x99, 0xa3, 0x90, 0x90, 0x98,
+ 0x91, 0x94, 0x97, 0x93, 0x97, 0x98, 0x96, 0x9a, 0x99, 0x98, 0x9e, 0x9c,
+ 0x9a, 0xa0, 0xa0, 0xa2, 0xaa, 0xab, 0xaa, 0xb4, 0xb8, 0xaf, 0xba, 0xc1,
+ 0xb2, 0xbf, 0xc6, 0xb4, 0xc1, 0xc9, 0xb7, 0xc5, 0xcd, 0xb8, 0xc7, 0xd1,
+ 0xbc, 0xca, 0xd5, 0xc0, 0xcf, 0xda, 0xc2, 0xd3, 0xdd, 0xc3, 0xd4, 0xde,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0c, 0x0e, 0x0d, 0x10, 0x11, 0x10,
+ 0x13, 0x15, 0x14, 0x15, 0x17, 0x16, 0x18, 0x1a, 0x19, 0x14, 0x16, 0x15,
+ 0x12, 0x14, 0x13, 0x15, 0x17, 0x16, 0x18, 0x1a, 0x19, 0x16, 0x17, 0x16,
+ 0x15, 0x15, 0x15, 0x14, 0x14, 0x14, 0x1a, 0x1a, 0x1a, 0x12, 0x12, 0x12,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x10, 0x10, 0x10, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1e, 0x1c, 0x1c, 0x1e,
+ 0x1e, 0x1f, 0x21, 0x20, 0x21, 0x23, 0x20, 0x22, 0x21, 0x1e, 0x20, 0x1f,
+ 0x23, 0x25, 0x24, 0x25, 0x26, 0x28, 0x23, 0x24, 0x28, 0x25, 0x25, 0x2a,
+ 0x26, 0x27, 0x2c, 0x27, 0x28, 0x2d, 0x30, 0x31, 0x36, 0x2d, 0x30, 0x35,
+ 0x22, 0x24, 0x28, 0x1f, 0x20, 0x22, 0x14, 0x16, 0x15, 0x0d, 0x0d, 0x0b,
+ 0x0b, 0x0b, 0x0a, 0x08, 0x08, 0x09, 0x0b, 0x0b, 0x0d, 0x0a, 0x0a, 0x0c,
+ 0x07, 0x07, 0x07, 0x07, 0x08, 0x04, 0x0e, 0x0f, 0x09, 0x56, 0x57, 0x4f,
+ 0x67, 0x66, 0x5a, 0x27, 0x26, 0x1e, 0x26, 0x26, 0x23, 0x3c, 0x3e, 0x3b,
+ 0x44, 0x47, 0x43, 0x33, 0x37, 0x32, 0x41, 0x46, 0x41, 0x5a, 0x5f, 0x5b,
+ 0x64, 0x66, 0x65, 0x59, 0x5b, 0x5a, 0x3a, 0x3c, 0x3b, 0x18, 0x1a, 0x19,
+ 0x13, 0x15, 0x14, 0x19, 0x1b, 0x1a, 0x20, 0x22, 0x1f, 0x1e, 0x20, 0x1d,
+ 0x12, 0x12, 0x12, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x10, 0x0f, 0x10, 0x11,
+ 0x0e, 0x10, 0x0f, 0x0a, 0x0c, 0x0b, 0x0d, 0x0f, 0x0e, 0x0f, 0x10, 0x0f,
+ 0x12, 0x13, 0x12, 0x11, 0x11, 0x12, 0x15, 0x16, 0x17, 0x20, 0x22, 0x24,
+ 0x2c, 0x2d, 0x2f, 0x29, 0x2a, 0x2a, 0x29, 0x28, 0x27, 0x2c, 0x2b, 0x29,
+ 0x2a, 0x2c, 0x2b, 0x26, 0x27, 0x25, 0x1a, 0x1b, 0x18, 0x10, 0x10, 0x0e,
+ 0x0b, 0x0b, 0x09, 0x0d, 0x0d, 0x0b, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x10, 0x10, 0x10,
+ 0x12, 0x12, 0x12, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x13, 0x13, 0x13,
+ 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c,
+ 0x1a, 0x1a, 0x1e, 0x38, 0x37, 0x3c, 0x32, 0x31, 0x37, 0x2c, 0x2b, 0x32,
+ 0x2a, 0x29, 0x2f, 0x24, 0x23, 0x29, 0x20, 0x1f, 0x24, 0x19, 0x19, 0x1b,
+ 0x19, 0x19, 0x1b, 0x21, 0x22, 0x24, 0x15, 0x15, 0x15, 0x10, 0x0e, 0x0f,
+ 0x11, 0x0f, 0x10, 0x12, 0x0f, 0x0e, 0x12, 0x11, 0x0f, 0x12, 0x10, 0x0e,
+ 0x17, 0x13, 0x12, 0x1b, 0x18, 0x17, 0x20, 0x1e, 0x1f, 0x24, 0x22, 0x23,
+ 0x2a, 0x28, 0x2b, 0x28, 0x26, 0x29, 0x20, 0x1e, 0x21, 0x24, 0x20, 0x23,
+ 0x29, 0x28, 0x25, 0x24, 0x23, 0x21, 0x17, 0x16, 0x14, 0x16, 0x12, 0x13,
+ 0x14, 0x12, 0x13, 0x15, 0x14, 0x15, 0x1a, 0x1a, 0x1a, 0x16, 0x17, 0x15,
+ 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0x18, 0x12, 0x12, 0x34, 0x29, 0x29,
+ 0x57, 0x4c, 0x4a, 0x7d, 0x71, 0x6f, 0x89, 0x7e, 0x79, 0x85, 0x7b, 0x76,
+ 0x5b, 0x4d, 0x47, 0x7e, 0x72, 0x66, 0xd5, 0xce, 0xb8, 0xe1, 0xde, 0xc1,
+ 0xdd, 0xdc, 0xbe, 0xe0, 0xe0, 0xc4, 0xdd, 0xdd, 0xc7, 0xde, 0xdb, 0xcb,
+ 0xe0, 0xdd, 0xca, 0xe1, 0xdf, 0xcb, 0xe0, 0xdf, 0xcc, 0xdd, 0xdc, 0xca,
+ 0xdd, 0xdc, 0xcb, 0xde, 0xdf, 0xcf, 0xde, 0xdf, 0xcf, 0xdf, 0xe0, 0xd1,
+ 0xe2, 0xdf, 0xd8, 0xdf, 0xdd, 0xd1, 0xdc, 0xdb, 0xc7, 0xdd, 0xdc, 0xc7,
+ 0xe5, 0xe4, 0xd0, 0xd8, 0xd8, 0xce, 0xc5, 0xc4, 0xc4, 0xac, 0xaa, 0xb0,
+ 0x8d, 0x8c, 0x9c, 0x78, 0x75, 0x88, 0x72, 0x6d, 0x81, 0x5b, 0x57, 0x69,
+ 0x44, 0x3f, 0x4b, 0x32, 0x30, 0x35, 0x22, 0x20, 0x23, 0x19, 0x19, 0x1b,
+ 0x1b, 0x1b, 0x1d, 0x2b, 0x2c, 0x2e, 0x1b, 0x1b, 0x1d, 0x1a, 0x18, 0x1b,
+ 0x1a, 0x18, 0x1c, 0x1c, 0x1a, 0x1d, 0x2b, 0x29, 0x2c, 0x29, 0x29, 0x2b,
+ 0x27, 0x27, 0x2c, 0x37, 0x31, 0x38, 0x3b, 0x32, 0x39, 0x36, 0x2c, 0x34,
+ 0x35, 0x2f, 0x35, 0x32, 0x2d, 0x31, 0x30, 0x2a, 0x2d, 0x33, 0x2d, 0x2f,
+ 0x2f, 0x29, 0x2d, 0x2f, 0x2a, 0x30, 0x2b, 0x29, 0x2e, 0x2d, 0x2d, 0x31,
+ 0x28, 0x28, 0x29, 0x3f, 0x3d, 0x40, 0x3f, 0x3e, 0x43, 0x3b, 0x3b, 0x42,
+ 0x34, 0x37, 0x3c, 0x34, 0x36, 0x3b, 0x38, 0x39, 0x3e, 0x3b, 0x3a, 0x40,
+ 0x3e, 0x3f, 0x43, 0x43, 0x48, 0x4e, 0x35, 0x3c, 0x48, 0x24, 0x2d, 0x3c,
+ 0x23, 0x2c, 0x39, 0x20, 0x2b, 0x35, 0x21, 0x2f, 0x38, 0x1e, 0x2e, 0x39,
+ 0x1f, 0x2e, 0x3d, 0x1d, 0x2b, 0x3a, 0x24, 0x30, 0x3e, 0x24, 0x30, 0x3b,
+ 0x34, 0x40, 0x42, 0x60, 0x6b, 0x69, 0x9f, 0xa8, 0xa2, 0xa0, 0xa6, 0xa4,
+ 0x6c, 0x71, 0x74, 0x83, 0x88, 0x8b, 0xd8, 0xdf, 0xde, 0xd6, 0xde, 0xda,
+ 0xb0, 0xb5, 0xb7, 0x92, 0x96, 0x97, 0x9a, 0x9c, 0x99, 0x9b, 0x9e, 0x98,
+ 0x98, 0x9b, 0x94, 0x9f, 0xa1, 0x9b, 0x97, 0x99, 0x94, 0x98, 0x9c, 0x99,
+ 0x95, 0x96, 0x99, 0x57, 0x59, 0x5a, 0x71, 0x73, 0x72, 0x89, 0x8b, 0x8a,
+ 0x98, 0x9c, 0x98, 0x6f, 0x74, 0x6e, 0x71, 0x76, 0x6f, 0x98, 0x9d, 0x97,
+ 0x7e, 0x83, 0x81, 0x93, 0x94, 0x96, 0x96, 0x97, 0x9b, 0x50, 0x51, 0x53,
+ 0x7d, 0x7f, 0x7c, 0x92, 0x94, 0x8f, 0x8e, 0x90, 0x8d, 0x8f, 0x91, 0x8f,
+ 0x96, 0x9b, 0x9d, 0x92, 0x98, 0x98, 0x6e, 0x74, 0x73, 0x46, 0x4b, 0x4e,
+ 0x4e, 0x53, 0x57, 0x34, 0x37, 0x3e, 0x26, 0x29, 0x2f, 0x2f, 0x33, 0x36,
+ 0x35, 0x37, 0x3b, 0x2c, 0x2d, 0x31, 0x26, 0x27, 0x2a, 0x22, 0x23, 0x25,
+ 0x20, 0x23, 0x25, 0x22, 0x26, 0x27, 0x28, 0x2e, 0x2e, 0x3c, 0x43, 0x43,
+ 0x3b, 0x48, 0x4e, 0x3b, 0x48, 0x51, 0x3f, 0x4d, 0x56, 0x3d, 0x4e, 0x56,
+ 0x49, 0x5c, 0x63, 0x51, 0x63, 0x6b, 0x5b, 0x6c, 0x75, 0x5d, 0x6d, 0x7a,
+ 0x5b, 0x69, 0x74, 0x49, 0x55, 0x64, 0x2f, 0x38, 0x47, 0x38, 0x42, 0x4d,
+ 0x62, 0x6e, 0x70, 0x89, 0x95, 0x93, 0x9a, 0xa4, 0xa4, 0x9b, 0xa2, 0xa5,
+ 0x9b, 0xa0, 0xa4, 0x9a, 0xa2, 0xa8, 0x9c, 0xa5, 0xae, 0x9c, 0xa6, 0xaf,
+ 0x9e, 0xa9, 0xaf, 0xa3, 0xae, 0xb4, 0xa6, 0xb1, 0xb9, 0xa7, 0xb1, 0xbb,
+ 0xa6, 0xb7, 0xbf, 0xaa, 0xb8, 0xc1, 0xaa, 0xb8, 0xc2, 0xaf, 0xbb, 0xc7,
+ 0xad, 0xb9, 0xc5, 0xa9, 0xb5, 0xc1, 0xa9, 0xb6, 0xc4, 0xa8, 0xb6, 0xc3,
+ 0xab, 0xb9, 0xc4, 0xaf, 0xbc, 0xc5, 0xb2, 0xbf, 0xca, 0xb4, 0xc2, 0xcf,
+ 0xaf, 0xbd, 0xca, 0x98, 0xa4, 0xb0, 0x8e, 0x94, 0x9d, 0x8f, 0x92, 0x97,
+ 0x94, 0x97, 0x9a, 0x96, 0x9b, 0x9b, 0x98, 0x9e, 0x9c, 0x9a, 0xa0, 0x9e,
+ 0x9c, 0xa5, 0xa4, 0xa6, 0xaf, 0xb1, 0xac, 0xb6, 0xbd, 0xaf, 0xbc, 0xc5,
+ 0xb3, 0xc1, 0xc8, 0xb5, 0xc3, 0xca, 0xb9, 0xc7, 0xd0, 0xb9, 0xc7, 0xd3,
+ 0xbd, 0xcb, 0xd6, 0xbe, 0xcf, 0xd9, 0xc0, 0xd0, 0xda, 0xc8, 0xd9, 0xe2,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0e, 0x10, 0x0f, 0x10, 0x12, 0x11,
+ 0x14, 0x16, 0x15, 0x15, 0x17, 0x16, 0x18, 0x1a, 0x19, 0x16, 0x18, 0x17,
+ 0x16, 0x18, 0x17, 0x15, 0x17, 0x16, 0x17, 0x19, 0x18, 0x18, 0x1a, 0x19,
+ 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x12, 0x12, 0x12,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x0c, 0x0c, 0x0c, 0x19, 0x19, 0x19, 0x1b, 0x1b, 0x1d, 0x1d, 0x1d, 0x1f,
+ 0x1e, 0x1f, 0x21, 0x1f, 0x21, 0x22, 0x22, 0x24, 0x23, 0x1f, 0x21, 0x20,
+ 0x1e, 0x20, 0x20, 0x25, 0x26, 0x28, 0x25, 0x26, 0x2a, 0x22, 0x24, 0x28,
+ 0x26, 0x28, 0x2c, 0x31, 0x33, 0x38, 0x2a, 0x2a, 0x32, 0x2b, 0x2e, 0x35,
+ 0x2c, 0x2f, 0x34, 0x17, 0x18, 0x1c, 0x07, 0x08, 0x0a, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x08, 0x0c, 0x0c, 0x0e, 0x0c, 0x0c, 0x0c,
+ 0x09, 0x09, 0x07, 0x03, 0x03, 0x00, 0x28, 0x29, 0x22, 0x88, 0x8a, 0x7e,
+ 0x89, 0x8a, 0x7d, 0x30, 0x30, 0x26, 0x30, 0x31, 0x2d, 0x40, 0x43, 0x40,
+ 0x29, 0x2e, 0x2a, 0x14, 0x19, 0x15, 0x1d, 0x21, 0x1f, 0x36, 0x3a, 0x39,
+ 0x59, 0x5b, 0x5a, 0x5a, 0x5b, 0x5b, 0x28, 0x2a, 0x29, 0x11, 0x13, 0x12,
+ 0x11, 0x13, 0x12, 0x13, 0x15, 0x14, 0x1a, 0x1c, 0x19, 0x1a, 0x1c, 0x19,
+ 0x12, 0x13, 0x12, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x10, 0x11, 0x13,
+ 0x0d, 0x0e, 0x10, 0x0c, 0x0d, 0x0f, 0x0b, 0x0c, 0x0e, 0x0b, 0x0c, 0x0c,
+ 0x13, 0x14, 0x12, 0x17, 0x19, 0x17, 0x1a, 0x1c, 0x19, 0x24, 0x28, 0x25,
+ 0x2b, 0x2d, 0x2c, 0x29, 0x29, 0x29, 0x28, 0x26, 0x28, 0x30, 0x2c, 0x2f,
+ 0x31, 0x32, 0x31, 0x19, 0x1b, 0x18, 0x0d, 0x0d, 0x0b, 0x0c, 0x0c, 0x0a,
+ 0x0b, 0x0b, 0x09, 0x0c, 0x0c, 0x0a, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x05, 0x05, 0x05, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0c,
+ 0x11, 0x11, 0x11, 0x14, 0x14, 0x14, 0x16, 0x16, 0x16, 0x12, 0x12, 0x12,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d,
+ 0x15, 0x15, 0x17, 0x34, 0x33, 0x38, 0x34, 0x33, 0x38, 0x2b, 0x2a, 0x31,
+ 0x28, 0x27, 0x2d, 0x24, 0x23, 0x28, 0x1f, 0x1e, 0x21, 0x18, 0x18, 0x1a,
+ 0x17, 0x1a, 0x1b, 0x23, 0x25, 0x24, 0x12, 0x12, 0x12, 0x0d, 0x0b, 0x0c,
+ 0x10, 0x0e, 0x0d, 0x12, 0x0f, 0x0d, 0x13, 0x0f, 0x0e, 0x14, 0x10, 0x0e,
+ 0x15, 0x11, 0x0f, 0x1b, 0x1a, 0x18, 0x23, 0x22, 0x20, 0x26, 0x24, 0x25,
+ 0x29, 0x27, 0x2b, 0x2a, 0x28, 0x2b, 0x21, 0x1d, 0x20, 0x27, 0x23, 0x24,
+ 0x2d, 0x2b, 0x28, 0x27, 0x23, 0x20, 0x1a, 0x16, 0x15, 0x16, 0x12, 0x12,
+ 0x16, 0x12, 0x13, 0x17, 0x15, 0x16, 0x1c, 0x1c, 0x1c, 0x18, 0x18, 0x16,
+ 0x14, 0x14, 0x14, 0x16, 0x12, 0x12, 0x2c, 0x21, 0x23, 0x49, 0x3b, 0x3b,
+ 0x72, 0x64, 0x63, 0x8a, 0x7f, 0x7d, 0x8a, 0x83, 0x7e, 0x6c, 0x65, 0x5f,
+ 0x6e, 0x63, 0x4a, 0xd3, 0xc9, 0xaf, 0xe5, 0xdf, 0xc7, 0xe1, 0xdd, 0xc8,
+ 0xe1, 0xde, 0xcb, 0xe0, 0xde, 0xce, 0xdc, 0xda, 0xca, 0xe2, 0xdc, 0xd0,
+ 0xe0, 0xdd, 0xce, 0xe4, 0xe0, 0xd3, 0xe3, 0xe0, 0xd3, 0xde, 0xdc, 0xcf,
+ 0xd9, 0xd7, 0xcd, 0xd7, 0xd4, 0xcb, 0xe3, 0xe1, 0xd8, 0xe8, 0xe8, 0xde,
+ 0xe2, 0xdf, 0xda, 0xdf, 0xdc, 0xd5, 0xdc, 0xda, 0xce, 0xdc, 0xda, 0xcc,
+ 0xe1, 0xdf, 0xd1, 0xd8, 0xd8, 0xcc, 0xd5, 0xd5, 0xcd, 0xcd, 0xcc, 0xc8,
+ 0xac, 0xac, 0xbb, 0x8e, 0x8e, 0xa2, 0x8c, 0x8a, 0xa0, 0x8f, 0x8d, 0xa2,
+ 0x57, 0x56, 0x66, 0x37, 0x37, 0x41, 0x27, 0x27, 0x2c, 0x16, 0x16, 0x1b,
+ 0x27, 0x26, 0x29, 0x22, 0x20, 0x23, 0x18, 0x17, 0x19, 0x18, 0x16, 0x19,
+ 0x18, 0x16, 0x19, 0x22, 0x20, 0x23, 0x23, 0x23, 0x25, 0x1b, 0x1b, 0x1d,
+ 0x21, 0x24, 0x27, 0x26, 0x25, 0x2a, 0x26, 0x23, 0x29, 0x25, 0x20, 0x26,
+ 0x21, 0x1f, 0x22, 0x1f, 0x1e, 0x21, 0x21, 0x22, 0x22, 0x26, 0x23, 0x24,
+ 0x26, 0x1f, 0x25, 0x23, 0x20, 0x28, 0x27, 0x28, 0x2d, 0x28, 0x2a, 0x30,
+ 0x23, 0x24, 0x28, 0x37, 0x36, 0x3b, 0x3b, 0x38, 0x40, 0x3b, 0x39, 0x42,
+ 0x3c, 0x3f, 0x44, 0x44, 0x44, 0x4a, 0x3d, 0x3d, 0x42, 0x3d, 0x3d, 0x42,
+ 0x42, 0x43, 0x48, 0x48, 0x4c, 0x54, 0x38, 0x3f, 0x4d, 0x39, 0x40, 0x52,
+ 0x41, 0x45, 0x54, 0x32, 0x3a, 0x47, 0x24, 0x30, 0x3c, 0x20, 0x2f, 0x3c,
+ 0x1d, 0x2e, 0x3d, 0x1d, 0x2e, 0x3e, 0x25, 0x35, 0x44, 0x25, 0x35, 0x42,
+ 0x25, 0x33, 0x3e, 0x2c, 0x3a, 0x3f, 0x59, 0x65, 0x64, 0x75, 0x80, 0x7d,
+ 0x59, 0x62, 0x61, 0x9b, 0xa1, 0xa0, 0xe5, 0xee, 0xe8, 0xd7, 0xdf, 0xd8,
+ 0xab, 0xac, 0xb0, 0x94, 0x95, 0x97, 0x9c, 0x9d, 0x9a, 0x9c, 0x9c, 0x97,
+ 0x9b, 0x9c, 0x96, 0x9f, 0xa0, 0x9a, 0x8f, 0x91, 0x8d, 0x8a, 0x8c, 0x8a,
+ 0x98, 0x9a, 0x9b, 0x7d, 0x7f, 0x7e, 0x5c, 0x5e, 0x5d, 0x77, 0x7a, 0x78,
+ 0xa3, 0xa6, 0xa3, 0x7f, 0x84, 0x7e, 0x5b, 0x61, 0x5a, 0xa3, 0xa8, 0xa1,
+ 0xa9, 0xac, 0xa6, 0x9b, 0x9d, 0x9d, 0x99, 0x99, 0x9d, 0x60, 0x61, 0x63,
+ 0x79, 0x7b, 0x7a, 0x91, 0x93, 0x90, 0x93, 0x96, 0x95, 0x94, 0x96, 0x96,
+ 0x96, 0x9d, 0x96, 0x95, 0x9c, 0x96, 0x97, 0x9e, 0x97, 0x83, 0x89, 0x89,
+ 0x63, 0x68, 0x6e, 0x41, 0x44, 0x4f, 0x29, 0x2d, 0x38, 0x31, 0x35, 0x3f,
+ 0x3b, 0x3e, 0x43, 0x2b, 0x2b, 0x2f, 0x25, 0x26, 0x2a, 0x26, 0x27, 0x2a,
+ 0x34, 0x38, 0x39, 0x30, 0x34, 0x35, 0x2b, 0x31, 0x31, 0x32, 0x3a, 0x3a,
+ 0x4b, 0x58, 0x5f, 0x55, 0x63, 0x6c, 0x57, 0x68, 0x72, 0x55, 0x68, 0x73,
+ 0x5f, 0x73, 0x7c, 0x62, 0x75, 0x81, 0x5d, 0x70, 0x80, 0x4b, 0x5c, 0x70,
+ 0x36, 0x44, 0x53, 0x25, 0x30, 0x40, 0x32, 0x3c, 0x4b, 0x64, 0x6e, 0x79,
+ 0x73, 0x7f, 0x80, 0x8e, 0x9b, 0x96, 0x9a, 0xa2, 0xa3, 0x96, 0x9b, 0xa2,
+ 0x98, 0x9d, 0xa0, 0x99, 0xa0, 0xa6, 0x98, 0xa1, 0xaa, 0x98, 0xa2, 0xab,
+ 0x9c, 0xa7, 0xad, 0xa1, 0xad, 0xb3, 0xa4, 0xae, 0xb7, 0xa3, 0xae, 0xb7,
+ 0x9b, 0xab, 0xb4, 0x93, 0xa3, 0xab, 0x8f, 0x9d, 0xa5, 0x87, 0x93, 0x9e,
+ 0x7f, 0x89, 0x95, 0x79, 0x82, 0x91, 0x73, 0x7f, 0x8d, 0x76, 0x82, 0x8f,
+ 0x80, 0x8d, 0x97, 0x7d, 0x89, 0x92, 0x7c, 0x86, 0x90, 0x8e, 0x9a, 0xa6,
+ 0xa3, 0xaf, 0xbd, 0x99, 0xa5, 0xb1, 0x92, 0x9b, 0xa3, 0x93, 0x9a, 0x9e,
+ 0x99, 0x9d, 0xa0, 0x98, 0x9e, 0x9f, 0x9a, 0xa0, 0xa1, 0x9f, 0xa5, 0xa5,
+ 0xa3, 0xab, 0xad, 0xaa, 0xb6, 0xb9, 0xae, 0xbb, 0xc1, 0xb1, 0xbe, 0xc8,
+ 0xb3, 0xc2, 0xc9, 0xb5, 0xc4, 0xcb, 0xb9, 0xc7, 0xd0, 0xbb, 0xc9, 0xd4,
+ 0xbf, 0xce, 0xd8, 0xbe, 0xcf, 0xd9, 0xc2, 0xd3, 0xdd, 0xce, 0xde, 0xe7,
+ 0x0e, 0x0e, 0x10, 0x0e, 0x0f, 0x11, 0x0f, 0x12, 0x13, 0x15, 0x18, 0x19,
+ 0x16, 0x1a, 0x1b, 0x13, 0x17, 0x18, 0x15, 0x16, 0x18, 0x14, 0x15, 0x16,
+ 0x14, 0x16, 0x15, 0x15, 0x17, 0x16, 0x15, 0x17, 0x16, 0x17, 0x19, 0x18,
+ 0x15, 0x17, 0x16, 0x18, 0x1a, 0x19, 0x17, 0x19, 0x18, 0x13, 0x14, 0x13,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x16, 0x16, 0x16, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21,
+ 0x1e, 0x20, 0x1f, 0x1c, 0x1e, 0x1e, 0x23, 0x24, 0x26, 0x22, 0x23, 0x25,
+ 0x21, 0x22, 0x24, 0x22, 0x26, 0x27, 0x23, 0x27, 0x28, 0x20, 0x23, 0x23,
+ 0x23, 0x24, 0x28, 0x2e, 0x31, 0x36, 0x28, 0x2b, 0x32, 0x2a, 0x2d, 0x34,
+ 0x2d, 0x30, 0x35, 0x0d, 0x0e, 0x12, 0x05, 0x05, 0x05, 0x08, 0x08, 0x07,
+ 0x08, 0x08, 0x0a, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x08, 0x08, 0x08, 0x06, 0x18, 0x18, 0x15, 0x43, 0x44, 0x41,
+ 0x40, 0x3e, 0x3e, 0x1b, 0x1b, 0x1a, 0x2d, 0x2f, 0x2e, 0x2a, 0x2e, 0x2d,
+ 0x18, 0x1c, 0x1d, 0x13, 0x17, 0x18, 0x17, 0x18, 0x1b, 0x1d, 0x1e, 0x22,
+ 0x31, 0x35, 0x37, 0x46, 0x48, 0x49, 0x1d, 0x1d, 0x1e, 0x0f, 0x0f, 0x0f,
+ 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x16, 0x18, 0x1a, 0x19,
+ 0x0e, 0x10, 0x0f, 0x0b, 0x0d, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0f, 0x0e, 0x0b, 0x0d, 0x0c, 0x0f, 0x13, 0x12,
+ 0x18, 0x19, 0x1b, 0x1f, 0x21, 0x20, 0x23, 0x26, 0x24, 0x28, 0x2a, 0x29,
+ 0x2f, 0x2f, 0x2f, 0x2c, 0x2c, 0x2c, 0x28, 0x27, 0x27, 0x27, 0x27, 0x26,
+ 0x18, 0x18, 0x18, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0b, 0x08, 0x08, 0x07, 0x05, 0x05, 0x04,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x10, 0x10, 0x10, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x10, 0x10, 0x10,
+ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x10, 0x10, 0x0c, 0x0c, 0x0c,
+ 0x11, 0x11, 0x13, 0x32, 0x32, 0x34, 0x31, 0x32, 0x34, 0x2b, 0x2c, 0x2e,
+ 0x27, 0x27, 0x29, 0x23, 0x24, 0x26, 0x1f, 0x20, 0x24, 0x1a, 0x19, 0x1e,
+ 0x17, 0x16, 0x18, 0x1d, 0x1b, 0x1c, 0x13, 0x11, 0x12, 0x0e, 0x0d, 0x0c,
+ 0x0d, 0x0d, 0x0b, 0x0e, 0x0e, 0x0c, 0x11, 0x11, 0x10, 0x11, 0x11, 0x11,
+ 0x12, 0x10, 0x10, 0x1b, 0x19, 0x1a, 0x22, 0x20, 0x21, 0x1f, 0x1d, 0x20,
+ 0x28, 0x26, 0x29, 0x29, 0x27, 0x29, 0x1e, 0x1c, 0x1d, 0x22, 0x21, 0x1f,
+ 0x2e, 0x2a, 0x28, 0x26, 0x22, 0x22, 0x18, 0x14, 0x15, 0x14, 0x11, 0x12,
+ 0x17, 0x15, 0x16, 0x1a, 0x19, 0x17, 0x26, 0x25, 0x23, 0x21, 0x20, 0x1e,
+ 0x1b, 0x1a, 0x1b, 0x1c, 0x14, 0x1e, 0x46, 0x39, 0x45, 0x6b, 0x63, 0x66,
+ 0x84, 0x7f, 0x81, 0x8f, 0x8c, 0x91, 0x91, 0x89, 0x91, 0x60, 0x55, 0x55,
+ 0xb4, 0xad, 0x8d, 0xe7, 0xe1, 0xc4, 0xe3, 0xde, 0xc8, 0xe3, 0xdf, 0xcd,
+ 0xe1, 0xe0, 0xcc, 0xe0, 0xdf, 0xcb, 0xe0, 0xdd, 0xcb, 0xe2, 0xdf, 0xcd,
+ 0xde, 0xdf, 0xcb, 0xdf, 0xe0, 0xcf, 0xe0, 0xe3, 0xd2, 0xd8, 0xda, 0xcc,
+ 0xd2, 0xd4, 0xc8, 0xd2, 0xd3, 0xcb, 0xdc, 0xda, 0xd6, 0xec, 0xeb, 0xe7,
+ 0xe7, 0xe8, 0xe4, 0xd9, 0xda, 0xd2, 0xdc, 0xdc, 0xd1, 0xdc, 0xda, 0xcd,
+ 0xd9, 0xd7, 0xc8, 0xda, 0xd9, 0xcc, 0xd7, 0xd7, 0xcc, 0xdc, 0xdb, 0xd1,
+ 0xcc, 0xc1, 0xc7, 0x8e, 0x88, 0x94, 0x84, 0x84, 0x93, 0x92, 0x94, 0xa3,
+ 0x61, 0x5f, 0x6e, 0x3c, 0x34, 0x41, 0x36, 0x29, 0x33, 0x25, 0x17, 0x20,
+ 0x22, 0x22, 0x24, 0x16, 0x17, 0x19, 0x14, 0x16, 0x15, 0x12, 0x14, 0x13,
+ 0x1a, 0x1a, 0x1a, 0x21, 0x21, 0x21, 0x18, 0x18, 0x1a, 0x1b, 0x1b, 0x1d,
+ 0x24, 0x23, 0x25, 0x23, 0x22, 0x25, 0x21, 0x20, 0x25, 0x1e, 0x1d, 0x22,
+ 0x19, 0x19, 0x1d, 0x19, 0x17, 0x1c, 0x1f, 0x1a, 0x20, 0x22, 0x1e, 0x23,
+ 0x20, 0x1f, 0x21, 0x24, 0x23, 0x29, 0x33, 0x31, 0x3c, 0x38, 0x35, 0x40,
+ 0x38, 0x36, 0x3e, 0x63, 0x60, 0x69, 0x65, 0x61, 0x70, 0x3f, 0x3c, 0x50,
+ 0x47, 0x42, 0x4e, 0x4f, 0x49, 0x51, 0x47, 0x42, 0x44, 0x41, 0x3d, 0x3c,
+ 0x44, 0x43, 0x44, 0x6a, 0x6c, 0x72, 0x75, 0x79, 0x86, 0x68, 0x70, 0x80,
+ 0x64, 0x65, 0x7e, 0x50, 0x52, 0x69, 0x30, 0x35, 0x48, 0x27, 0x30, 0x42,
+ 0x24, 0x31, 0x44, 0x21, 0x31, 0x45, 0x25, 0x36, 0x48, 0x24, 0x36, 0x46,
+ 0x24, 0x33, 0x41, 0x27, 0x33, 0x46, 0x2c, 0x38, 0x4c, 0x36, 0x40, 0x4c,
+ 0x48, 0x50, 0x50, 0xa6, 0xaa, 0xa4, 0xeb, 0xef, 0xe7, 0xd8, 0xda, 0xd9,
+ 0xa7, 0xa6, 0xac, 0x9c, 0x9c, 0x9a, 0x9b, 0x9d, 0x92, 0x9e, 0xa1, 0x96,
+ 0x9a, 0x9c, 0x95, 0x9a, 0x9c, 0x9b, 0x88, 0x8a, 0x89, 0x67, 0x67, 0x65,
+ 0x96, 0x98, 0x90, 0xa1, 0xa3, 0x9e, 0x88, 0x89, 0x89, 0x83, 0x86, 0x89,
+ 0x6f, 0x72, 0x75, 0x63, 0x67, 0x68, 0x7c, 0x81, 0x7d, 0x9e, 0xa4, 0x9c,
+ 0xa0, 0xa9, 0xa4, 0x92, 0x9a, 0x9b, 0x9e, 0xa3, 0xa7, 0x93, 0x98, 0x98,
+ 0x68, 0x6d, 0x68, 0x6f, 0x74, 0x6e, 0x92, 0x97, 0x96, 0x93, 0x98, 0x9c,
+ 0x92, 0x9b, 0x94, 0x91, 0x98, 0x91, 0x8f, 0x95, 0x90, 0xa2, 0xa8, 0xa6,
+ 0x93, 0x97, 0x9a, 0x6b, 0x6d, 0x77, 0x3b, 0x3e, 0x4c, 0x33, 0x35, 0x45,
+ 0x31, 0x33, 0x38, 0x27, 0x28, 0x2b, 0x2c, 0x2d, 0x2f, 0x25, 0x29, 0x29,
+ 0x3f, 0x43, 0x44, 0x2b, 0x2f, 0x32, 0x22, 0x25, 0x2c, 0x2d, 0x30, 0x39,
+ 0x4e, 0x53, 0x5a, 0x66, 0x73, 0x77, 0x5e, 0x71, 0x80, 0x53, 0x69, 0x7f,
+ 0x48, 0x60, 0x6c, 0x3f, 0x52, 0x62, 0x33, 0x41, 0x5b, 0x27, 0x33, 0x49,
+ 0x1b, 0x2a, 0x34, 0x2a, 0x3b, 0x37, 0x60, 0x6f, 0x6c, 0x65, 0x71, 0x7e,
+ 0x6c, 0x76, 0x82, 0x93, 0x9e, 0x9b, 0x91, 0x9a, 0x97, 0x91, 0x97, 0xa2,
+ 0x94, 0x9a, 0x9d, 0x95, 0x9d, 0xa0, 0x95, 0x9e, 0xa4, 0x98, 0xa1, 0xa8,
+ 0x9c, 0xa6, 0xac, 0x97, 0xa0, 0xa7, 0x90, 0x99, 0xa0, 0x83, 0x89, 0x91,
+ 0x7a, 0x7d, 0x8f, 0x76, 0x7b, 0x86, 0x73, 0x78, 0x7c, 0x72, 0x78, 0x7b,
+ 0x6f, 0x74, 0x7b, 0x72, 0x76, 0x82, 0x6f, 0x76, 0x7e, 0x70, 0x77, 0x7e,
+ 0x72, 0x75, 0x83, 0x66, 0x6b, 0x77, 0x78, 0x80, 0x89, 0x9d, 0xa8, 0xaf,
+ 0xad, 0xba, 0xc1, 0xa7, 0xb5, 0xc0, 0xa4, 0xb1, 0xc0, 0xa1, 0xad, 0xc0,
+ 0x9c, 0xa4, 0xb1, 0x9b, 0xa4, 0xad, 0x9c, 0xa3, 0xab, 0x9f, 0xa7, 0xaa,
+ 0xa6, 0xaf, 0xb3, 0xaf, 0xba, 0xc0, 0xb2, 0xbf, 0xc9, 0xb2, 0xc0, 0xcd,
+ 0xb5, 0xc3, 0xce, 0xb7, 0xc5, 0xd0, 0xb8, 0xc6, 0xd0, 0xbb, 0xc9, 0xd2,
+ 0xbc, 0xcd, 0xd5, 0xbe, 0xcf, 0xd9, 0xc5, 0xd6, 0xe2, 0xce, 0xde, 0xed,
+ 0x10, 0x11, 0x13, 0x14, 0x15, 0x17, 0x1c, 0x1d, 0x1f, 0x1a, 0x1e, 0x20,
+ 0x15, 0x19, 0x1a, 0x13, 0x15, 0x17, 0x15, 0x16, 0x18, 0x14, 0x15, 0x16,
+ 0x14, 0x16, 0x16, 0x14, 0x16, 0x15, 0x14, 0x16, 0x15, 0x16, 0x18, 0x17,
+ 0x17, 0x19, 0x18, 0x15, 0x17, 0x16, 0x18, 0x1a, 0x19, 0x19, 0x1b, 0x1a,
+ 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x17, 0x17, 0x17, 0x21, 0x21, 0x21, 0x1e, 0x1e, 0x1e,
+ 0x1d, 0x1e, 0x1f, 0x1b, 0x1c, 0x1e, 0x21, 0x21, 0x24, 0x21, 0x22, 0x25,
+ 0x22, 0x23, 0x26, 0x21, 0x22, 0x26, 0x23, 0x27, 0x28, 0x21, 0x24, 0x26,
+ 0x24, 0x25, 0x29, 0x1f, 0x22, 0x27, 0x28, 0x2b, 0x31, 0x2e, 0x31, 0x38,
+ 0x2f, 0x32, 0x37, 0x13, 0x14, 0x18, 0x07, 0x07, 0x07, 0x09, 0x09, 0x07,
+ 0x09, 0x09, 0x0a, 0x08, 0x08, 0x0a, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0a, 0x13, 0x13, 0x11, 0x15, 0x17, 0x14,
+ 0x17, 0x17, 0x18, 0x1a, 0x1a, 0x1a, 0x18, 0x1a, 0x19, 0x16, 0x1a, 0x19,
+ 0x19, 0x1d, 0x1e, 0x16, 0x19, 0x1b, 0x19, 0x1a, 0x1c, 0x19, 0x1a, 0x1e,
+ 0x19, 0x1d, 0x1e, 0x22, 0x26, 0x28, 0x11, 0x13, 0x12, 0x0e, 0x0e, 0x0e,
+ 0x15, 0x15, 0x15, 0x13, 0x13, 0x13, 0x13, 0x15, 0x14, 0x16, 0x18, 0x17,
+ 0x0c, 0x0e, 0x0d, 0x09, 0x0a, 0x0a, 0x0c, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0b, 0x0d, 0x0c, 0x16, 0x18, 0x17, 0x1b, 0x1e, 0x1d,
+ 0x1f, 0x21, 0x20, 0x29, 0x2b, 0x2a, 0x28, 0x2b, 0x2a, 0x27, 0x29, 0x28,
+ 0x31, 0x31, 0x31, 0x36, 0x36, 0x36, 0x25, 0x25, 0x25, 0x15, 0x15, 0x14,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e,
+ 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x0d, 0x0d, 0x0d, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x12, 0x12, 0x12,
+ 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x0c,
+ 0x11, 0x11, 0x13, 0x31, 0x31, 0x33, 0x31, 0x31, 0x34, 0x2a, 0x2b, 0x2f,
+ 0x27, 0x28, 0x2c, 0x22, 0x24, 0x27, 0x1e, 0x1f, 0x23, 0x19, 0x18, 0x1d,
+ 0x18, 0x16, 0x19, 0x1a, 0x18, 0x19, 0x12, 0x10, 0x11, 0x0f, 0x0e, 0x0c,
+ 0x0f, 0x0e, 0x0c, 0x0f, 0x0e, 0x0c, 0x13, 0x12, 0x12, 0x11, 0x10, 0x11,
+ 0x11, 0x0f, 0x10, 0x1c, 0x1a, 0x1b, 0x1f, 0x1d, 0x1e, 0x1f, 0x1d, 0x20,
+ 0x2a, 0x28, 0x29, 0x2a, 0x28, 0x28, 0x1d, 0x1b, 0x1c, 0x24, 0x22, 0x20,
+ 0x2d, 0x29, 0x28, 0x23, 0x1f, 0x20, 0x15, 0x11, 0x12, 0x16, 0x13, 0x14,
+ 0x17, 0x16, 0x16, 0x1b, 0x1a, 0x18, 0x29, 0x28, 0x25, 0x20, 0x1f, 0x1c,
+ 0x17, 0x16, 0x16, 0x29, 0x23, 0x2d, 0x76, 0x6e, 0x7c, 0xa3, 0xa1, 0xa6,
+ 0x9b, 0x9c, 0xa0, 0xa9, 0xa8, 0xb0, 0xa0, 0x9a, 0xa3, 0x7f, 0x74, 0x73,
+ 0xe0, 0xd9, 0xba, 0xe6, 0xe1, 0xc5, 0xe2, 0xdd, 0xc8, 0xe0, 0xdd, 0xca,
+ 0xe1, 0xe0, 0xcc, 0xe0, 0xdf, 0xca, 0xe3, 0xe1, 0xce, 0xe1, 0xdf, 0xce,
+ 0xde, 0xdf, 0xcf, 0xdc, 0xdd, 0xcf, 0xd1, 0xd1, 0xc5, 0xcc, 0xce, 0xc3,
+ 0xd0, 0xd1, 0xc9, 0xe6, 0xe7, 0xe1, 0xd9, 0xd9, 0xd4, 0xd5, 0xd5, 0xcf,
+ 0xe9, 0xea, 0xe4, 0xd8, 0xd9, 0xd0, 0xd9, 0xd9, 0xce, 0xdd, 0xdb, 0xce,
+ 0xdb, 0xd9, 0xca, 0xdc, 0xda, 0xcd, 0xda, 0xda, 0xce, 0xdb, 0xda, 0xd0,
+ 0xd6, 0xd1, 0xd2, 0xaf, 0xac, 0xb3, 0x7f, 0x7e, 0x8d, 0x69, 0x6a, 0x7c,
+ 0x4c, 0x4a, 0x5a, 0x3b, 0x33, 0x40, 0x39, 0x2e, 0x37, 0x28, 0x1e, 0x25,
+ 0x19, 0x19, 0x1b, 0x17, 0x18, 0x1a, 0x16, 0x18, 0x17, 0x19, 0x19, 0x19,
+ 0x28, 0x28, 0x28, 0x1a, 0x1a, 0x1a, 0x16, 0x16, 0x18, 0x1b, 0x1b, 0x1d,
+ 0x21, 0x20, 0x24, 0x20, 0x20, 0x23, 0x22, 0x22, 0x24, 0x1d, 0x1d, 0x1f,
+ 0x1b, 0x19, 0x1d, 0x1a, 0x18, 0x1d, 0x1d, 0x1a, 0x21, 0x24, 0x21, 0x28,
+ 0x39, 0x39, 0x39, 0x5c, 0x5d, 0x62, 0x73, 0x73, 0x7f, 0x7b, 0x7c, 0x8a,
+ 0x52, 0x54, 0x60, 0x7c, 0x7e, 0x8a, 0x8d, 0x8f, 0xa0, 0x3e, 0x3f, 0x55,
+ 0x44, 0x3c, 0x47, 0x48, 0x3e, 0x45, 0x45, 0x3c, 0x3f, 0x3b, 0x35, 0x35,
+ 0x47, 0x44, 0x45, 0x95, 0x98, 0x9e, 0xa5, 0xaf, 0xb9, 0x97, 0xa4, 0xb4,
+ 0x8b, 0x93, 0xaa, 0x73, 0x7b, 0x90, 0x58, 0x60, 0x73, 0x40, 0x4a, 0x5d,
+ 0x2d, 0x38, 0x4c, 0x28, 0x34, 0x48, 0x29, 0x36, 0x49, 0x28, 0x35, 0x47,
+ 0x26, 0x36, 0x44, 0x2c, 0x3a, 0x4a, 0x31, 0x3d, 0x4d, 0x2c, 0x37, 0x3f,
+ 0x44, 0x4d, 0x4a, 0xa8, 0xae, 0xa6, 0xf1, 0xf3, 0xee, 0xdb, 0xdd, 0xdd,
+ 0xaa, 0xa9, 0xae, 0x9e, 0x9e, 0x9c, 0x9c, 0x9f, 0x96, 0xa0, 0xa3, 0x98,
+ 0x9b, 0x9d, 0x96, 0x94, 0x96, 0x93, 0xa8, 0xab, 0xa8, 0x7d, 0x7e, 0x79,
+ 0x6e, 0x70, 0x6b, 0x9b, 0x9d, 0x9a, 0x9f, 0xa1, 0xa0, 0x8b, 0x8c, 0x8e,
+ 0x85, 0x86, 0x88, 0x91, 0x95, 0x94, 0x92, 0x97, 0x91, 0xae, 0xb3, 0xae,
+ 0x9a, 0xa1, 0xa6, 0x7b, 0x81, 0x82, 0x92, 0x98, 0x92, 0xa3, 0xa8, 0xa4,
+ 0x94, 0x99, 0x99, 0x71, 0x75, 0x77, 0x85, 0x89, 0x89, 0x83, 0x89, 0x84,
+ 0x92, 0x98, 0x98, 0x8f, 0x95, 0x93, 0x7e, 0x84, 0x82, 0x83, 0x89, 0x87,
+ 0x95, 0x99, 0x98, 0x91, 0x94, 0x97, 0x7f, 0x82, 0x88, 0x51, 0x53, 0x5b,
+ 0x30, 0x30, 0x38, 0x29, 0x2a, 0x2f, 0x2b, 0x2e, 0x33, 0x23, 0x26, 0x2b,
+ 0x28, 0x2c, 0x2f, 0x25, 0x29, 0x2c, 0x23, 0x27, 0x2a, 0x32, 0x36, 0x39,
+ 0x40, 0x47, 0x4c, 0x4b, 0x58, 0x5c, 0x39, 0x4a, 0x5a, 0x2c, 0x41, 0x59,
+ 0x25, 0x39, 0x45, 0x1f, 0x2e, 0x3d, 0x1f, 0x2b, 0x41, 0x1e, 0x2b, 0x3b,
+ 0x28, 0x37, 0x3f, 0x5d, 0x6c, 0x71, 0x6b, 0x79, 0x7c, 0x43, 0x4e, 0x54,
+ 0x76, 0x80, 0x85, 0x90, 0x9a, 0x9c, 0x8c, 0x94, 0x98, 0x8c, 0x93, 0x99,
+ 0x8e, 0x95, 0x99, 0x90, 0x98, 0x9b, 0x93, 0x9c, 0xa1, 0x91, 0x9a, 0xa1,
+ 0x83, 0x8b, 0x93, 0x75, 0x7c, 0x84, 0x6f, 0x76, 0x7d, 0x71, 0x76, 0x7d,
+ 0x71, 0x74, 0x83, 0x71, 0x76, 0x7e, 0x70, 0x73, 0x76, 0x73, 0x77, 0x7a,
+ 0x77, 0x7b, 0x82, 0x7a, 0x7e, 0x87, 0x72, 0x79, 0x7e, 0x6f, 0x76, 0x7a,
+ 0x69, 0x6f, 0x74, 0x7a, 0x81, 0x86, 0xa9, 0xb2, 0xb7, 0xba, 0xc5, 0xca,
+ 0xb4, 0xc1, 0xc8, 0xae, 0xbc, 0xc7, 0xae, 0xbc, 0xcc, 0xab, 0xb8, 0xcc,
+ 0xa5, 0xb2, 0xc0, 0xa3, 0xaf, 0xb8, 0xa0, 0xab, 0xb3, 0xa3, 0xae, 0xb4,
+ 0xab, 0xb6, 0xbc, 0xb0, 0xbd, 0xc4, 0xb3, 0xc1, 0xcc, 0xb4, 0xc2, 0xd0,
+ 0xb7, 0xc5, 0xd0, 0xb7, 0xc5, 0xd0, 0xb9, 0xc8, 0xd2, 0xbb, 0xca, 0xd3,
+ 0xbc, 0xca, 0xd5, 0xbe, 0xcf, 0xd9, 0xc9, 0xd9, 0xe6, 0xcd, 0xdd, 0xec,
+ 0x1c, 0x1d, 0x1f, 0x1c, 0x1d, 0x1f, 0x1d, 0x1e, 0x20, 0x15, 0x19, 0x1a,
+ 0x12, 0x16, 0x17, 0x14, 0x15, 0x17, 0x13, 0x14, 0x16, 0x12, 0x14, 0x15,
+ 0x14, 0x16, 0x16, 0x13, 0x15, 0x14, 0x15, 0x17, 0x16, 0x16, 0x18, 0x17,
+ 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x16, 0x17, 0x16,
+ 0x10, 0x10, 0x10, 0x09, 0x09, 0x09, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x13, 0x13, 0x13, 0x1e, 0x1e, 0x1e, 0x1d, 0x1d, 0x1d,
+ 0x1f, 0x20, 0x21, 0x20, 0x21, 0x23, 0x22, 0x23, 0x27, 0x20, 0x21, 0x25,
+ 0x1f, 0x20, 0x24, 0x21, 0x22, 0x26, 0x26, 0x27, 0x2b, 0x21, 0x24, 0x27,
+ 0x21, 0x22, 0x26, 0x21, 0x24, 0x29, 0x24, 0x27, 0x2c, 0x2d, 0x30, 0x37,
+ 0x30, 0x33, 0x38, 0x1f, 0x20, 0x23, 0x07, 0x07, 0x07, 0x06, 0x06, 0x04,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b,
+ 0x08, 0x08, 0x09, 0x0a, 0x0a, 0x08, 0x11, 0x13, 0x10, 0x17, 0x19, 0x14,
+ 0x1d, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x13, 0x15, 0x14, 0x1c, 0x1e, 0x1e,
+ 0x23, 0x27, 0x27, 0x19, 0x1c, 0x1d, 0x19, 0x1a, 0x1d, 0x1a, 0x1b, 0x1d,
+ 0x17, 0x1f, 0x1f, 0x22, 0x29, 0x28, 0x13, 0x17, 0x16, 0x08, 0x08, 0x08,
+ 0x0c, 0x0c, 0x0c, 0x13, 0x13, 0x13, 0x16, 0x17, 0x16, 0x19, 0x1b, 0x1a,
+ 0x0e, 0x10, 0x10, 0x0a, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x18, 0x18, 0x18, 0x1f, 0x21, 0x20, 0x1e, 0x20, 0x1f, 0x1f, 0x22, 0x21,
+ 0x24, 0x26, 0x23, 0x2a, 0x2c, 0x29, 0x29, 0x2b, 0x2a, 0x2c, 0x2e, 0x2d,
+ 0x2e, 0x2e, 0x2e, 0x26, 0x26, 0x27, 0x14, 0x14, 0x15, 0x0f, 0x0f, 0x11,
+ 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0e, 0x0d, 0x0d, 0x0f, 0x0a, 0x0a, 0x0c, 0x08, 0x08, 0x09,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0c, 0x11, 0x11, 0x11, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14,
+ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0f, 0x2b, 0x2b, 0x2d, 0x34, 0x35, 0x38, 0x2d, 0x2e, 0x32,
+ 0x25, 0x26, 0x2a, 0x22, 0x23, 0x27, 0x1f, 0x1f, 0x23, 0x19, 0x18, 0x1d,
+ 0x17, 0x17, 0x19, 0x18, 0x18, 0x18, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0b,
+ 0x0f, 0x0d, 0x0b, 0x0f, 0x0e, 0x0c, 0x10, 0x0d, 0x0f, 0x13, 0x11, 0x12,
+ 0x14, 0x12, 0x13, 0x1c, 0x1a, 0x1a, 0x1f, 0x1d, 0x1e, 0x25, 0x23, 0x26,
+ 0x26, 0x24, 0x25, 0x22, 0x21, 0x21, 0x1a, 0x19, 0x18, 0x21, 0x20, 0x1e,
+ 0x2b, 0x27, 0x28, 0x23, 0x1f, 0x20, 0x15, 0x11, 0x12, 0x17, 0x15, 0x16,
+ 0x16, 0x14, 0x16, 0x1d, 0x1b, 0x1b, 0x26, 0x25, 0x23, 0x1c, 0x1b, 0x19,
+ 0x0f, 0x0e, 0x0c, 0x47, 0x44, 0x4d, 0x87, 0x86, 0x93, 0x84, 0x88, 0x91,
+ 0xa8, 0xae, 0xb8, 0x9a, 0x9c, 0xa9, 0x8f, 0x8b, 0x93, 0xb3, 0xab, 0xa4,
+ 0xea, 0xe4, 0xcb, 0xe6, 0xe3, 0xc9, 0xe4, 0xe2, 0xcb, 0xe4, 0xe2, 0xcd,
+ 0xe3, 0xe2, 0xcd, 0xe0, 0xdf, 0xca, 0xe3, 0xe2, 0xd1, 0xdf, 0xdd, 0xcf,
+ 0xde, 0xdc, 0xcf, 0xdb, 0xdc, 0xcf, 0xc4, 0xc4, 0xbc, 0xe3, 0xe4, 0xde,
+ 0xdf, 0xe0, 0xdb, 0xde, 0xdf, 0xd9, 0xde, 0xde, 0xd6, 0xd5, 0xd5, 0xcb,
+ 0xe2, 0xe3, 0xdb, 0xdd, 0xdd, 0xd4, 0xdb, 0xdb, 0xcf, 0xdb, 0xd9, 0xcc,
+ 0xdf, 0xdd, 0xd0, 0xdb, 0xd9, 0xcd, 0xda, 0xd8, 0xcc, 0xdb, 0xd9, 0xcd,
+ 0xda, 0xd9, 0xd2, 0xb2, 0xb1, 0xb5, 0x7e, 0x7d, 0x8d, 0x75, 0x72, 0x88,
+ 0x6f, 0x68, 0x7d, 0x4e, 0x45, 0x52, 0x37, 0x31, 0x38, 0x2a, 0x25, 0x2b,
+ 0x16, 0x16, 0x18, 0x16, 0x16, 0x18, 0x1a, 0x1a, 0x1a, 0x1c, 0x1c, 0x1b,
+ 0x1d, 0x1d, 0x1d, 0x15, 0x15, 0x15, 0x18, 0x16, 0x17, 0x1e, 0x1c, 0x1d,
+ 0x22, 0x22, 0x26, 0x20, 0x20, 0x24, 0x21, 0x1f, 0x22, 0x1e, 0x1c, 0x1d,
+ 0x1d, 0x1b, 0x1e, 0x1e, 0x1d, 0x22, 0x2c, 0x2d, 0x35, 0x34, 0x37, 0x40,
+ 0x61, 0x63, 0x65, 0xa4, 0xa7, 0xad, 0x80, 0x86, 0x93, 0x83, 0x8a, 0x9b,
+ 0x82, 0x88, 0x98, 0x5e, 0x64, 0x74, 0x96, 0x98, 0xac, 0x52, 0x52, 0x68,
+ 0x4c, 0x44, 0x4e, 0x50, 0x46, 0x4d, 0x4f, 0x44, 0x4a, 0x43, 0x3a, 0x3e,
+ 0x62, 0x5f, 0x64, 0xa8, 0xaf, 0xb6, 0xa8, 0xb7, 0xc2, 0xa2, 0xb5, 0xc3,
+ 0x9f, 0xb0, 0xc0, 0x97, 0xa7, 0xb7, 0x8b, 0x98, 0xa8, 0x76, 0x82, 0x94,
+ 0x58, 0x63, 0x75, 0x3a, 0x45, 0x59, 0x30, 0x38, 0x4d, 0x2d, 0x36, 0x4a,
+ 0x25, 0x34, 0x42, 0x25, 0x36, 0x45, 0x2a, 0x37, 0x42, 0x2d, 0x38, 0x3c,
+ 0x47, 0x50, 0x4a, 0xa3, 0xab, 0x9f, 0xf4, 0xfa, 0xf1, 0xe2, 0xe4, 0xe1,
+ 0xb3, 0xb2, 0xb5, 0x9a, 0x9a, 0x99, 0x9d, 0x9e, 0x98, 0x9d, 0x9f, 0x97,
+ 0x96, 0x99, 0x91, 0x95, 0x97, 0x92, 0xa2, 0xa3, 0x9e, 0xad, 0xae, 0xa8,
+ 0x6b, 0x6d, 0x6c, 0x8d, 0x8f, 0x8e, 0x99, 0x9b, 0x99, 0x71, 0x73, 0x70,
+ 0x8d, 0x8f, 0x8a, 0x98, 0x9a, 0x95, 0x97, 0x99, 0x94, 0xaf, 0xb1, 0xac,
+ 0xa5, 0xab, 0xac, 0x77, 0x7c, 0x81, 0x6f, 0x73, 0x77, 0x88, 0x8c, 0x8d,
+ 0x97, 0x9c, 0x98, 0x9b, 0xa0, 0x99, 0x7f, 0x84, 0x7f, 0x6c, 0x70, 0x6f,
+ 0x8d, 0x90, 0x95, 0x66, 0x6a, 0x6d, 0x57, 0x5b, 0x5c, 0x68, 0x6d, 0x6c,
+ 0x80, 0x86, 0x82, 0x8e, 0x94, 0x91, 0x99, 0xa0, 0x9d, 0x8f, 0x95, 0x94,
+ 0x63, 0x64, 0x6c, 0x37, 0x39, 0x42, 0x2f, 0x32, 0x3b, 0x33, 0x36, 0x3f,
+ 0x2d, 0x30, 0x37, 0x28, 0x2b, 0x2f, 0x2d, 0x31, 0x32, 0x31, 0x36, 0x33,
+ 0x3a, 0x43, 0x45, 0x49, 0x57, 0x59, 0x25, 0x35, 0x45, 0x1f, 0x2e, 0x47,
+ 0x1f, 0x2c, 0x3a, 0x20, 0x2c, 0x38, 0x1e, 0x29, 0x39, 0x28, 0x37, 0x3e,
+ 0x59, 0x68, 0x6e, 0x73, 0x7f, 0x8f, 0x40, 0x4d, 0x58, 0x47, 0x53, 0x50,
+ 0x87, 0x94, 0x8e, 0x8b, 0x94, 0x9c, 0x88, 0x90, 0x98, 0x87, 0x90, 0x8e,
+ 0x89, 0x92, 0x96, 0x8d, 0x95, 0x9c, 0x83, 0x8c, 0x93, 0x6f, 0x78, 0x7f,
+ 0x63, 0x6a, 0x72, 0x62, 0x66, 0x6e, 0x6c, 0x6f, 0x76, 0x78, 0x78, 0x80,
+ 0x74, 0x77, 0x7e, 0x75, 0x78, 0x7d, 0x75, 0x78, 0x7c, 0x70, 0x73, 0x78,
+ 0x72, 0x75, 0x7c, 0x71, 0x76, 0x7c, 0x6f, 0x76, 0x79, 0x6c, 0x75, 0x74,
+ 0x76, 0x80, 0x7f, 0xa9, 0xb5, 0xb4, 0xbf, 0xcb, 0xcc, 0xb8, 0xc5, 0xcb,
+ 0xb4, 0xc2, 0xcb, 0xb1, 0xbf, 0xcc, 0xae, 0xbb, 0xcb, 0xad, 0xb9, 0xca,
+ 0xad, 0xbc, 0xcb, 0xaa, 0xba, 0xc6, 0xa9, 0xb7, 0xc1, 0xac, 0xbb, 0xc2,
+ 0xaf, 0xbe, 0xc5, 0xad, 0xbb, 0xc4, 0xb0, 0xbe, 0xc9, 0xb5, 0xc4, 0xd1,
+ 0xb8, 0xc6, 0xd2, 0xb8, 0xc6, 0xd1, 0xba, 0xc8, 0xd2, 0xba, 0xc9, 0xd3,
+ 0xba, 0xc8, 0xd3, 0xc2, 0xd0, 0xdb, 0xcd, 0xdb, 0xe8, 0xca, 0xd8, 0xe6,
+ 0x2c, 0x2d, 0x2f, 0x24, 0x25, 0x27, 0x17, 0x18, 0x1a, 0x0f, 0x13, 0x14,
+ 0x0f, 0x12, 0x13, 0x13, 0x14, 0x16, 0x15, 0x15, 0x18, 0x13, 0x14, 0x16,
+ 0x15, 0x17, 0x16, 0x16, 0x18, 0x17, 0x15, 0x17, 0x16, 0x16, 0x18, 0x17,
+ 0x18, 0x1a, 0x19, 0x15, 0x17, 0x16, 0x14, 0x16, 0x15, 0x15, 0x17, 0x16,
+ 0x11, 0x11, 0x11, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x10, 0x10, 0x10, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f,
+ 0x22, 0x24, 0x23, 0x22, 0x23, 0x25, 0x22, 0x23, 0x25, 0x20, 0x21, 0x25,
+ 0x21, 0x22, 0x26, 0x24, 0x25, 0x28, 0x25, 0x26, 0x28, 0x25, 0x26, 0x28,
+ 0x24, 0x25, 0x29, 0x22, 0x25, 0x28, 0x23, 0x26, 0x2b, 0x29, 0x2c, 0x33,
+ 0x33, 0x36, 0x3b, 0x29, 0x2a, 0x2e, 0x06, 0x06, 0x06, 0x05, 0x05, 0x03,
+ 0x09, 0x09, 0x07, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0b,
+ 0x0c, 0x0c, 0x0e, 0x19, 0x1b, 0x1b, 0x13, 0x15, 0x13, 0x11, 0x13, 0x10,
+ 0x18, 0x18, 0x18, 0x1d, 0x1d, 0x1d, 0x0a, 0x0c, 0x0b, 0x1f, 0x21, 0x20,
+ 0x32, 0x33, 0x33, 0x20, 0x21, 0x23, 0x1b, 0x1e, 0x1f, 0x1a, 0x1d, 0x1e,
+ 0x1b, 0x24, 0x23, 0x2d, 0x33, 0x31, 0x1a, 0x1e, 0x1d, 0x04, 0x06, 0x05,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x12, 0x12, 0x12, 0x17, 0x17, 0x18,
+ 0x0d, 0x0e, 0x10, 0x0b, 0x0b, 0x0d, 0x0b, 0x0b, 0x0b, 0x15, 0x15, 0x15,
+ 0x31, 0x31, 0x31, 0x2c, 0x2d, 0x2d, 0x23, 0x25, 0x24, 0x2d, 0x2f, 0x2e,
+ 0x27, 0x2a, 0x27, 0x25, 0x27, 0x23, 0x2b, 0x2d, 0x2a, 0x35, 0x37, 0x36,
+ 0x1f, 0x1f, 0x1f, 0x0c, 0x0c, 0x0d, 0x0c, 0x0c, 0x0e, 0x0d, 0x0d, 0x0f,
+ 0x0a, 0x0a, 0x08, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0d, 0x10, 0x10, 0x12, 0x0f, 0x0e, 0x13, 0x06, 0x06, 0x0a,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13,
+ 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x11, 0x11, 0x11, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0f, 0x28, 0x28, 0x2c, 0x33, 0x34, 0x38, 0x2c, 0x2d, 0x32,
+ 0x26, 0x27, 0x2c, 0x22, 0x23, 0x28, 0x1e, 0x1f, 0x23, 0x17, 0x17, 0x1b,
+ 0x15, 0x16, 0x18, 0x16, 0x18, 0x17, 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x09,
+ 0x0d, 0x0c, 0x0a, 0x12, 0x11, 0x0f, 0x10, 0x0e, 0x0f, 0x11, 0x0e, 0x0f,
+ 0x13, 0x11, 0x12, 0x1f, 0x1d, 0x1d, 0x24, 0x22, 0x23, 0x25, 0x23, 0x24,
+ 0x21, 0x1f, 0x20, 0x1d, 0x1b, 0x1c, 0x1a, 0x19, 0x17, 0x23, 0x22, 0x20,
+ 0x2b, 0x27, 0x28, 0x20, 0x1d, 0x1d, 0x12, 0x10, 0x0f, 0x1a, 0x19, 0x17,
+ 0x18, 0x17, 0x16, 0x1f, 0x1e, 0x1e, 0x25, 0x25, 0x25, 0x1c, 0x1c, 0x1c,
+ 0x11, 0x10, 0x0e, 0x64, 0x62, 0x6b, 0x8e, 0x92, 0xa0, 0x87, 0x90, 0x9d,
+ 0xa8, 0xaf, 0xbf, 0x83, 0x87, 0x98, 0x94, 0x93, 0x98, 0xcc, 0xc9, 0xb9,
+ 0xeb, 0xe6, 0xcf, 0xe8, 0xe5, 0xce, 0xe7, 0xe5, 0xd0, 0xe2, 0xe1, 0xcb,
+ 0xe3, 0xe3, 0xcb, 0xe1, 0xe1, 0xcd, 0xe0, 0xde, 0xcf, 0xde, 0xdc, 0xd0,
+ 0xdd, 0xdb, 0xce, 0xd8, 0xd7, 0xcc, 0xcb, 0xca, 0xc4, 0xe9, 0xe8, 0xe4,
+ 0xe1, 0xe0, 0xdc, 0xdc, 0xdc, 0xd4, 0xde, 0xde, 0xd2, 0xde, 0xde, 0xd1,
+ 0xdf, 0xdf, 0xd5, 0xde, 0xde, 0xd4, 0xdb, 0xdb, 0xcf, 0xdc, 0xda, 0xce,
+ 0xe1, 0xdf, 0xd3, 0xde, 0xdc, 0xd0, 0xdc, 0xda, 0xce, 0xdc, 0xda, 0xce,
+ 0xdc, 0xdc, 0xce, 0xc2, 0xc1, 0xc1, 0x7b, 0x76, 0x88, 0x75, 0x6b, 0x83,
+ 0x79, 0x6c, 0x80, 0x51, 0x47, 0x50, 0x39, 0x35, 0x38, 0x2b, 0x2b, 0x2b,
+ 0x18, 0x18, 0x19, 0x13, 0x13, 0x15, 0x14, 0x14, 0x14, 0x15, 0x14, 0x14,
+ 0x15, 0x15, 0x13, 0x16, 0x15, 0x13, 0x18, 0x16, 0x17, 0x23, 0x22, 0x23,
+ 0x24, 0x25, 0x2a, 0x1d, 0x1c, 0x21, 0x1e, 0x1c, 0x1f, 0x1d, 0x19, 0x1a,
+ 0x23, 0x21, 0x24, 0x4c, 0x4c, 0x53, 0x76, 0x78, 0x83, 0x7b, 0x80, 0x8d,
+ 0x77, 0x7b, 0x86, 0x96, 0x9c, 0xaa, 0x93, 0x9a, 0xac, 0x68, 0x70, 0x84,
+ 0x8c, 0x92, 0xa6, 0x64, 0x67, 0x7a, 0x6d, 0x69, 0x7d, 0x57, 0x52, 0x65,
+ 0x48, 0x45, 0x4d, 0x4a, 0x43, 0x4a, 0x4a, 0x40, 0x48, 0x4e, 0x44, 0x4c,
+ 0x6f, 0x6b, 0x73, 0x98, 0x9d, 0xa7, 0x9f, 0xab, 0xb9, 0xa1, 0xb2, 0xc2,
+ 0xa3, 0xb4, 0xc1, 0x9b, 0xaa, 0xb9, 0x97, 0xa4, 0xb4, 0x96, 0xa3, 0xb3,
+ 0x8a, 0x96, 0xa6, 0x6f, 0x7b, 0x8b, 0x55, 0x5d, 0x72, 0x41, 0x49, 0x60,
+ 0x2b, 0x3a, 0x4d, 0x26, 0x35, 0x48, 0x28, 0x34, 0x42, 0x32, 0x3d, 0x43,
+ 0x47, 0x50, 0x4b, 0x8b, 0x93, 0x88, 0xec, 0xf2, 0xe7, 0xe7, 0xea, 0xe3,
+ 0xbc, 0xbb, 0xbb, 0x9d, 0x9d, 0x9b, 0x9a, 0x9b, 0x95, 0x9c, 0x9f, 0x96,
+ 0x97, 0x9a, 0x91, 0x98, 0x9b, 0x94, 0x9b, 0x9c, 0x96, 0xb0, 0xb1, 0xaa,
+ 0x92, 0x93, 0x96, 0x66, 0x67, 0x69, 0x66, 0x68, 0x66, 0x86, 0x88, 0x83,
+ 0x9c, 0x9f, 0x98, 0x9c, 0x9f, 0x98, 0xa3, 0xa5, 0xa0, 0x9d, 0x9f, 0x9a,
+ 0xa9, 0xad, 0xac, 0xa4, 0xa7, 0xae, 0x55, 0x57, 0x63, 0x5d, 0x5e, 0x63,
+ 0x7b, 0x7e, 0x77, 0x90, 0x96, 0x8a, 0x90, 0x96, 0x8e, 0x95, 0x99, 0x99,
+ 0x7b, 0x7c, 0x81, 0x45, 0x47, 0x4c, 0x8a, 0x8e, 0x91, 0x8d, 0x91, 0x92,
+ 0x88, 0x8c, 0x8b, 0x8c, 0x92, 0x90, 0x7e, 0x84, 0x82, 0x8c, 0x92, 0x90,
+ 0x96, 0x9a, 0x9f, 0x76, 0x79, 0x80, 0x47, 0x4a, 0x55, 0x38, 0x3a, 0x46,
+ 0x2d, 0x2f, 0x3b, 0x2b, 0x2e, 0x35, 0x3c, 0x40, 0x43, 0x35, 0x3a, 0x3a,
+ 0x38, 0x41, 0x41, 0x5a, 0x66, 0x69, 0x34, 0x40, 0x52, 0x21, 0x2b, 0x45,
+ 0x23, 0x2d, 0x3a, 0x23, 0x2d, 0x36, 0x25, 0x2f, 0x39, 0x57, 0x64, 0x66,
+ 0x78, 0x85, 0x8f, 0x47, 0x52, 0x66, 0x22, 0x2e, 0x3c, 0x62, 0x6e, 0x69,
+ 0x87, 0x93, 0x8a, 0x84, 0x8d, 0x93, 0x84, 0x8b, 0x94, 0x87, 0x90, 0x8e,
+ 0x86, 0x90, 0x98, 0x78, 0x81, 0x89, 0x66, 0x6f, 0x76, 0x5f, 0x66, 0x6e,
+ 0x62, 0x67, 0x6f, 0x6b, 0x6c, 0x74, 0x74, 0x73, 0x7b, 0x71, 0x70, 0x76,
+ 0x77, 0x79, 0x7b, 0x76, 0x77, 0x7b, 0x72, 0x73, 0x77, 0x6f, 0x72, 0x77,
+ 0x6d, 0x70, 0x77, 0x6f, 0x74, 0x78, 0x68, 0x70, 0x72, 0x78, 0x81, 0x80,
+ 0xa5, 0xb2, 0xb2, 0xbf, 0xcd, 0xce, 0xbc, 0xca, 0xd0, 0xb8, 0xc4, 0xcf,
+ 0xb5, 0xc2, 0xd0, 0xb5, 0xc1, 0xcf, 0xb1, 0xbe, 0xcb, 0xaf, 0xbb, 0xc9,
+ 0xaf, 0xbe, 0xce, 0xac, 0xbc, 0xcb, 0xae, 0xbe, 0xcb, 0xb2, 0xc1, 0xcb,
+ 0xb1, 0xbf, 0xca, 0xaa, 0xb8, 0xc3, 0xab, 0xb9, 0xc6, 0xb1, 0xbf, 0xcc,
+ 0xb6, 0xc4, 0xd1, 0xb9, 0xc7, 0xd4, 0xb8, 0xc6, 0xd1, 0xb8, 0xc6, 0xd1,
+ 0xba, 0xc8, 0xd3, 0xc7, 0xd3, 0xdf, 0xcd, 0xd9, 0xe4, 0xc7, 0xd3, 0xdf,
+ 0x31, 0x31, 0x33, 0x27, 0x28, 0x2a, 0x16, 0x17, 0x19, 0x0f, 0x10, 0x12,
+ 0x0f, 0x10, 0x12, 0x14, 0x15, 0x17, 0x15, 0x16, 0x18, 0x14, 0x14, 0x16,
+ 0x14, 0x16, 0x16, 0x15, 0x17, 0x16, 0x14, 0x16, 0x15, 0x16, 0x18, 0x17,
+ 0x17, 0x19, 0x18, 0x17, 0x19, 0x18, 0x17, 0x19, 0x18, 0x18, 0x1a, 0x19,
+ 0x13, 0x13, 0x13, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0f, 0x0f, 0x0f, 0x1d, 0x1d, 0x1d, 0x21, 0x21, 0x21,
+ 0x20, 0x21, 0x1f, 0x1f, 0x21, 0x20, 0x22, 0x24, 0x24, 0x21, 0x22, 0x24,
+ 0x23, 0x24, 0x26, 0x24, 0x25, 0x27, 0x24, 0x26, 0x25, 0x28, 0x29, 0x29,
+ 0x25, 0x27, 0x29, 0x20, 0x24, 0x27, 0x21, 0x24, 0x29, 0x27, 0x2a, 0x31,
+ 0x2f, 0x32, 0x37, 0x2a, 0x2b, 0x2f, 0x09, 0x09, 0x0b, 0x06, 0x06, 0x06,
+ 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x0f, 0x0f, 0x10, 0x21, 0x22, 0x24,
+ 0x1a, 0x1b, 0x1d, 0x22, 0x23, 0x25, 0x1b, 0x1d, 0x1b, 0x17, 0x19, 0x16,
+ 0x15, 0x15, 0x15, 0x12, 0x12, 0x12, 0x0b, 0x0c, 0x0b, 0x14, 0x16, 0x15,
+ 0x28, 0x2a, 0x29, 0x1e, 0x21, 0x20, 0x1a, 0x1e, 0x1d, 0x1e, 0x22, 0x21,
+ 0x23, 0x2c, 0x29, 0x36, 0x3c, 0x3a, 0x21, 0x25, 0x23, 0x06, 0x08, 0x05,
+ 0x09, 0x09, 0x07, 0x08, 0x08, 0x07, 0x0b, 0x0b, 0x0b, 0x10, 0x10, 0x12,
+ 0x0c, 0x0d, 0x0f, 0x09, 0x09, 0x0b, 0x0e, 0x0e, 0x0e, 0x1b, 0x1b, 0x1b,
+ 0x2a, 0x2a, 0x29, 0x28, 0x28, 0x27, 0x2c, 0x2d, 0x2c, 0x2f, 0x31, 0x30,
+ 0x2e, 0x30, 0x2d, 0x2c, 0x2e, 0x2a, 0x2d, 0x2f, 0x2c, 0x1f, 0x21, 0x20,
+ 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e, 0x0f,
+ 0x0c, 0x0c, 0x0a, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0e, 0x0d, 0x0d, 0x0f, 0x0a, 0x09, 0x0e, 0x07, 0x06, 0x0b,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0d,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12,
+ 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0d, 0x22, 0x22, 0x25, 0x33, 0x34, 0x39, 0x2d, 0x2e, 0x33,
+ 0x27, 0x28, 0x2d, 0x22, 0x23, 0x28, 0x1e, 0x1f, 0x23, 0x16, 0x16, 0x19,
+ 0x14, 0x15, 0x16, 0x12, 0x15, 0x14, 0x0b, 0x0d, 0x0c, 0x0e, 0x0e, 0x0c,
+ 0x0f, 0x0f, 0x0d, 0x0f, 0x0e, 0x0d, 0x11, 0x0e, 0x0f, 0x11, 0x0e, 0x0f,
+ 0x11, 0x0f, 0x10, 0x20, 0x1e, 0x1f, 0x27, 0x25, 0x26, 0x1f, 0x1d, 0x1e,
+ 0x1e, 0x1c, 0x1d, 0x1d, 0x1c, 0x1c, 0x1b, 0x1a, 0x18, 0x23, 0x22, 0x20,
+ 0x2c, 0x29, 0x29, 0x1e, 0x1a, 0x1b, 0x17, 0x16, 0x14, 0x1a, 0x19, 0x17,
+ 0x1c, 0x1b, 0x19, 0x25, 0x23, 0x24, 0x24, 0x24, 0x26, 0x1a, 0x1a, 0x1c,
+ 0x12, 0x11, 0x10, 0x65, 0x66, 0x6e, 0xa4, 0xaa, 0xb8, 0xaa, 0xb3, 0xc3,
+ 0xa6, 0xac, 0xbf, 0xa0, 0xa1, 0xb3, 0xa1, 0x9f, 0x9f, 0xd9, 0xd6, 0xc1,
+ 0xeb, 0xe9, 0xd2, 0xe5, 0xe3, 0xce, 0xe6, 0xe4, 0xcf, 0xe2, 0xe0, 0xcb,
+ 0xe2, 0xe0, 0xcb, 0xe3, 0xe0, 0xcd, 0xe0, 0xdd, 0xcf, 0xde, 0xda, 0xd0,
+ 0xd8, 0xd5, 0xc6, 0xd8, 0xd5, 0xca, 0xd5, 0xd2, 0xc9, 0xd9, 0xd9, 0xd1,
+ 0xdd, 0xdd, 0xd5, 0xdf, 0xdf, 0xd3, 0xdd, 0xde, 0xcf, 0xe0, 0xe1, 0xcf,
+ 0xdd, 0xdc, 0xd2, 0xd5, 0xd5, 0xcc, 0xd9, 0xd9, 0xcf, 0xd9, 0xd9, 0xcf,
+ 0xdc, 0xdc, 0xd2, 0xde, 0xdc, 0xd2, 0xe0, 0xde, 0xd2, 0xde, 0xdc, 0xcf,
+ 0xdf, 0xde, 0xcc, 0xc8, 0xc4, 0xc3, 0x5d, 0x52, 0x64, 0x44, 0x34, 0x4c,
+ 0x47, 0x36, 0x46, 0x47, 0x3a, 0x40, 0x3b, 0x35, 0x34, 0x2a, 0x2a, 0x28,
+ 0x1a, 0x18, 0x1a, 0x16, 0x14, 0x17, 0x14, 0x12, 0x13, 0x18, 0x16, 0x17,
+ 0x13, 0x13, 0x11, 0x14, 0x14, 0x12, 0x19, 0x18, 0x19, 0x23, 0x23, 0x23,
+ 0x23, 0x23, 0x28, 0x1f, 0x1e, 0x23, 0x21, 0x1f, 0x23, 0x27, 0x25, 0x27,
+ 0x4e, 0x4d, 0x51, 0x9e, 0x9f, 0xa8, 0x96, 0x99, 0xa6, 0x80, 0x85, 0x96,
+ 0x90, 0x95, 0xaa, 0x86, 0x8b, 0x9f, 0x8c, 0x93, 0xa5, 0x69, 0x6e, 0x80,
+ 0x52, 0x53, 0x64, 0x53, 0x4f, 0x5d, 0x49, 0x3e, 0x4c, 0x4c, 0x40, 0x4b,
+ 0x48, 0x48, 0x4d, 0x49, 0x48, 0x4d, 0x4f, 0x49, 0x4f, 0x53, 0x4c, 0x52,
+ 0x59, 0x54, 0x5d, 0x61, 0x61, 0x6d, 0x72, 0x78, 0x88, 0x87, 0x90, 0xa0,
+ 0x8b, 0x93, 0x9f, 0x82, 0x8b, 0x9a, 0x88, 0x91, 0xa2, 0x8d, 0x99, 0xa7,
+ 0x94, 0xa1, 0xac, 0x93, 0xa0, 0xae, 0x84, 0x91, 0xa3, 0x61, 0x70, 0x86,
+ 0x3d, 0x4b, 0x67, 0x2f, 0x3a, 0x55, 0x30, 0x3b, 0x4f, 0x3b, 0x46, 0x50,
+ 0x41, 0x49, 0x49, 0x73, 0x78, 0x6f, 0xce, 0xd3, 0xc3, 0xea, 0xed, 0xdd,
+ 0xc9, 0xc8, 0xc3, 0x9e, 0x9e, 0x9a, 0x9b, 0x9c, 0x97, 0x99, 0x9c, 0x95,
+ 0x9c, 0xa0, 0x97, 0x9b, 0x9e, 0x95, 0x9d, 0x9e, 0x96, 0xa1, 0xa2, 0x9b,
+ 0x99, 0x9a, 0x9e, 0x5a, 0x5b, 0x5c, 0x7a, 0x7c, 0x79, 0xa3, 0xa6, 0x9f,
+ 0xa0, 0xa3, 0x9c, 0x98, 0x9b, 0x95, 0xa4, 0xa6, 0xa2, 0x9a, 0x9c, 0x9b,
+ 0x99, 0x9c, 0xa2, 0x72, 0x76, 0x79, 0x6f, 0x71, 0x71, 0x8e, 0x8f, 0x8f,
+ 0x54, 0x55, 0x56, 0x73, 0x77, 0x77, 0x9c, 0xa1, 0x9b, 0x9f, 0xa5, 0x9c,
+ 0x89, 0x8a, 0x8d, 0x4f, 0x50, 0x52, 0x74, 0x78, 0x79, 0x60, 0x64, 0x65,
+ 0x7f, 0x83, 0x84, 0x8e, 0x93, 0x96, 0x4d, 0x52, 0x55, 0x79, 0x7e, 0x81,
+ 0x98, 0x9c, 0x9b, 0x99, 0x9c, 0x9f, 0x89, 0x8c, 0x93, 0x5f, 0x61, 0x6d,
+ 0x3a, 0x3c, 0x49, 0x2b, 0x2d, 0x39, 0x36, 0x39, 0x42, 0x39, 0x3d, 0x43,
+ 0x34, 0x3c, 0x3e, 0x58, 0x63, 0x66, 0x40, 0x4b, 0x5d, 0x25, 0x2f, 0x48,
+ 0x25, 0x2f, 0x3a, 0x27, 0x30, 0x39, 0x54, 0x5e, 0x67, 0x7a, 0x88, 0x8a,
+ 0x50, 0x5c, 0x6b, 0x26, 0x30, 0x41, 0x25, 0x2f, 0x3a, 0x60, 0x6b, 0x6b,
+ 0x7c, 0x87, 0x83, 0x7f, 0x89, 0x89, 0x80, 0x88, 0x8b, 0x84, 0x8c, 0x8e,
+ 0x75, 0x7e, 0x84, 0x63, 0x6c, 0x73, 0x65, 0x6b, 0x73, 0x66, 0x69, 0x70,
+ 0x6c, 0x6c, 0x72, 0x71, 0x70, 0x76, 0x73, 0x72, 0x78, 0x6f, 0x6d, 0x73,
+ 0x73, 0x74, 0x74, 0x71, 0x72, 0x73, 0x6c, 0x6d, 0x71, 0x6a, 0x6d, 0x72,
+ 0x6b, 0x6e, 0x73, 0x6a, 0x71, 0x74, 0x73, 0x7c, 0x7d, 0xa5, 0xaf, 0xb0,
+ 0xbd, 0xcb, 0xd4, 0xa9, 0xb7, 0xc3, 0x93, 0x9f, 0xad, 0xac, 0xb7, 0xc5,
+ 0xb5, 0xc1, 0xcf, 0xb4, 0xc0, 0xcc, 0xb2, 0xbe, 0xc8, 0xb1, 0xbe, 0xc7,
+ 0xb1, 0xbe, 0xcd, 0xb1, 0xbd, 0xce, 0xb4, 0xc2, 0xd1, 0xb5, 0xc2, 0xcf,
+ 0xb5, 0xc1, 0xcf, 0xb3, 0xc0, 0xce, 0xb4, 0xc0, 0xce, 0xb3, 0xbd, 0xcc,
+ 0xb2, 0xc0, 0xcd, 0xb6, 0xc4, 0xd1, 0xb9, 0xc7, 0xd4, 0xbb, 0xc7, 0xd5,
+ 0xbf, 0xcb, 0xd7, 0xc8, 0xd4, 0xe0, 0xc8, 0xd2, 0xdd, 0xc5, 0xcf, 0xd9,
+ 0x25, 0x25, 0x27, 0x1c, 0x1d, 0x1f, 0x10, 0x11, 0x13, 0x0b, 0x0c, 0x0e,
+ 0x0a, 0x0b, 0x0d, 0x11, 0x12, 0x14, 0x13, 0x14, 0x16, 0x16, 0x16, 0x18,
+ 0x17, 0x19, 0x18, 0x15, 0x17, 0x16, 0x16, 0x18, 0x17, 0x17, 0x19, 0x18,
+ 0x19, 0x1b, 0x1a, 0x20, 0x22, 0x21, 0x1c, 0x1e, 0x1d, 0x1b, 0x1d, 0x1c,
+ 0x17, 0x17, 0x17, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x19, 0x19, 0x19, 0x21, 0x21, 0x21,
+ 0x21, 0x22, 0x20, 0x1f, 0x21, 0x1f, 0x21, 0x23, 0x22, 0x23, 0x24, 0x26,
+ 0x21, 0x22, 0x24, 0x21, 0x22, 0x24, 0x22, 0x24, 0x23, 0x26, 0x28, 0x27,
+ 0x25, 0x26, 0x28, 0x21, 0x25, 0x28, 0x21, 0x25, 0x2a, 0x27, 0x2a, 0x31,
+ 0x2a, 0x2d, 0x32, 0x29, 0x2a, 0x2e, 0x0e, 0x0e, 0x10, 0x08, 0x08, 0x07,
+ 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0e, 0x30, 0x31, 0x35,
+ 0x2d, 0x2e, 0x32, 0x22, 0x23, 0x27, 0x21, 0x22, 0x23, 0x1c, 0x1e, 0x1b,
+ 0x17, 0x19, 0x18, 0x12, 0x14, 0x13, 0x14, 0x14, 0x14, 0x12, 0x12, 0x12,
+ 0x19, 0x1a, 0x1a, 0x1b, 0x1e, 0x1d, 0x1a, 0x1e, 0x1d, 0x25, 0x2a, 0x29,
+ 0x32, 0x38, 0x36, 0x3b, 0x40, 0x3e, 0x2d, 0x2f, 0x2c, 0x08, 0x08, 0x06,
+ 0x0c, 0x0b, 0x09, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0c, 0x0b, 0x0b, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x13, 0x13, 0x13, 0x18, 0x18, 0x18, 0x1b, 0x1b, 0x1b,
+ 0x2b, 0x2b, 0x29, 0x32, 0x32, 0x30, 0x30, 0x32, 0x2f, 0x2d, 0x2f, 0x2c,
+ 0x3a, 0x3c, 0x39, 0x28, 0x2a, 0x27, 0x18, 0x1a, 0x18, 0x0b, 0x0d, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0e, 0x0d, 0x0d, 0x0f,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0f, 0x0a, 0x0a, 0x0c, 0x07, 0x07, 0x09,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x05, 0x05, 0x05, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d,
+ 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0x12, 0x12, 0x12, 0x14, 0x14, 0x14, 0x11, 0x11, 0x11, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0a, 0x0b, 0x1d, 0x1d, 0x1f, 0x35, 0x36, 0x3a, 0x2e, 0x2e, 0x34,
+ 0x27, 0x27, 0x2f, 0x22, 0x23, 0x28, 0x1c, 0x1d, 0x20, 0x14, 0x14, 0x16,
+ 0x15, 0x16, 0x17, 0x0e, 0x10, 0x0f, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0c,
+ 0x10, 0x10, 0x0e, 0x0f, 0x0f, 0x0d, 0x0f, 0x0d, 0x0e, 0x0f, 0x0d, 0x0e,
+ 0x14, 0x13, 0x11, 0x1d, 0x1c, 0x1c, 0x23, 0x21, 0x22, 0x20, 0x1e, 0x1f,
+ 0x23, 0x21, 0x22, 0x1d, 0x1b, 0x1c, 0x1b, 0x1a, 0x18, 0x24, 0x23, 0x21,
+ 0x27, 0x25, 0x25, 0x15, 0x12, 0x13, 0x18, 0x17, 0x15, 0x19, 0x18, 0x16,
+ 0x1d, 0x1c, 0x1b, 0x22, 0x22, 0x22, 0x21, 0x21, 0x23, 0x19, 0x18, 0x1d,
+ 0x28, 0x25, 0x29, 0x5b, 0x5c, 0x65, 0x7c, 0x82, 0x8f, 0xb0, 0xb6, 0xc4,
+ 0x87, 0x86, 0x9b, 0x99, 0x92, 0xa5, 0x88, 0x80, 0x7c, 0xdf, 0xdb, 0xbe,
+ 0xee, 0xee, 0xd5, 0xe5, 0xe4, 0xd0, 0xe5, 0xe2, 0xcf, 0xe4, 0xe1, 0xce,
+ 0xe5, 0xe0, 0xcd, 0xe1, 0xdc, 0xc9, 0xe1, 0xde, 0xcf, 0xdd, 0xd9, 0xcd,
+ 0xdd, 0xda, 0xcb, 0xde, 0xdb, 0xcc, 0xdc, 0xda, 0xcd, 0xdd, 0xde, 0xd0,
+ 0xdd, 0xde, 0xd2, 0xe2, 0xe2, 0xd5, 0xdf, 0xe0, 0xd2, 0xdd, 0xde, 0xcf,
+ 0xde, 0xdd, 0xd8, 0xce, 0xce, 0xc8, 0xd0, 0xd1, 0xcc, 0xe6, 0xe7, 0xe2,
+ 0xde, 0xde, 0xd8, 0xd8, 0xd8, 0xd0, 0xdf, 0xdd, 0xd3, 0xdc, 0xda, 0xce,
+ 0xdf, 0xdc, 0xcd, 0xc3, 0xbb, 0xbd, 0x5a, 0x4d, 0x60, 0x44, 0x32, 0x48,
+ 0x45, 0x33, 0x3f, 0x43, 0x35, 0x38, 0x3c, 0x34, 0x32, 0x31, 0x2e, 0x2e,
+ 0x1e, 0x1c, 0x21, 0x17, 0x15, 0x1a, 0x13, 0x13, 0x15, 0x15, 0x16, 0x16,
+ 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x18, 0x18, 0x18, 0x22, 0x22, 0x22,
+ 0x22, 0x22, 0x26, 0x24, 0x23, 0x28, 0x3b, 0x3c, 0x40, 0x6a, 0x6b, 0x71,
+ 0x6d, 0x6f, 0x78, 0x91, 0x93, 0xa0, 0x9c, 0x9f, 0xb0, 0x8d, 0x8f, 0xa3,
+ 0x7a, 0x7c, 0x94, 0x70, 0x73, 0x85, 0x4e, 0x50, 0x5b, 0x45, 0x43, 0x4b,
+ 0x4c, 0x47, 0x4d, 0x66, 0x5d, 0x62, 0x7d, 0x6f, 0x72, 0x81, 0x73, 0x72,
+ 0x84, 0x84, 0x82, 0x87, 0x87, 0x85, 0x87, 0x85, 0x86, 0x84, 0x80, 0x81,
+ 0x7b, 0x77, 0x7c, 0x6a, 0x67, 0x70, 0x5e, 0x5c, 0x67, 0x5e, 0x5c, 0x68,
+ 0x65, 0x68, 0x6f, 0x82, 0x84, 0x92, 0x96, 0x99, 0xaa, 0x84, 0x8c, 0x99,
+ 0x7e, 0x8b, 0x94, 0x9e, 0xac, 0xb5, 0x96, 0xa7, 0xb5, 0x83, 0x94, 0xa9,
+ 0x65, 0x70, 0x8e, 0x3d, 0x48, 0x65, 0x36, 0x40, 0x56, 0x3e, 0x45, 0x55,
+ 0x3f, 0x44, 0x4b, 0x59, 0x5e, 0x56, 0xa6, 0xab, 0x98, 0xe8, 0xec, 0xd3,
+ 0xd4, 0xd5, 0xca, 0xa7, 0xa7, 0xa1, 0x9c, 0x9d, 0x98, 0x99, 0x9a, 0x95,
+ 0x95, 0x98, 0x8f, 0x9c, 0x9e, 0x93, 0x9d, 0x9e, 0x94, 0x9c, 0x9d, 0x96,
+ 0x9f, 0xa1, 0xa1, 0x8a, 0x8c, 0x8a, 0x98, 0x9b, 0x97, 0xa3, 0xa5, 0xa0,
+ 0x9c, 0xa0, 0x9b, 0x7b, 0x80, 0x7c, 0x85, 0x89, 0x88, 0x9a, 0x9d, 0x9e,
+ 0x89, 0x8d, 0x8d, 0x6b, 0x6e, 0x6f, 0x91, 0x92, 0x95, 0x77, 0x78, 0x7a,
+ 0x68, 0x6a, 0x69, 0x8a, 0x8e, 0x8b, 0x93, 0x98, 0x93, 0x88, 0x8f, 0x89,
+ 0x9a, 0x9f, 0x9b, 0x80, 0x84, 0x83, 0x64, 0x68, 0x67, 0x47, 0x4c, 0x4c,
+ 0x74, 0x78, 0x7a, 0x86, 0x89, 0x8e, 0x4d, 0x50, 0x55, 0x7c, 0x7f, 0x84,
+ 0x96, 0x9b, 0x96, 0x95, 0x9a, 0x96, 0x9d, 0xa0, 0xa3, 0x9a, 0x9d, 0xa4,
+ 0x77, 0x7a, 0x83, 0x42, 0x44, 0x50, 0x31, 0x33, 0x40, 0x38, 0x3b, 0x46,
+ 0x35, 0x3a, 0x3e, 0x60, 0x6a, 0x6c, 0x49, 0x55, 0x65, 0x24, 0x31, 0x47,
+ 0x24, 0x31, 0x3a, 0x4d, 0x5a, 0x63, 0x7d, 0x89, 0x97, 0x59, 0x65, 0x6f,
+ 0x2a, 0x32, 0x46, 0x23, 0x2c, 0x38, 0x21, 0x2b, 0x32, 0x33, 0x3c, 0x43,
+ 0x57, 0x60, 0x65, 0x74, 0x7f, 0x7b, 0x7c, 0x84, 0x84, 0x77, 0x7e, 0x84,
+ 0x6d, 0x74, 0x7a, 0x64, 0x69, 0x6f, 0x65, 0x68, 0x6d, 0x66, 0x67, 0x6c,
+ 0x6c, 0x6b, 0x6f, 0x6d, 0x6c, 0x71, 0x72, 0x70, 0x76, 0x70, 0x6f, 0x74,
+ 0x6f, 0x71, 0x70, 0x72, 0x74, 0x75, 0x6e, 0x6f, 0x74, 0x6d, 0x70, 0x75,
+ 0x6b, 0x70, 0x73, 0x6f, 0x77, 0x79, 0xa5, 0xaf, 0xb0, 0xc0, 0xcb, 0xd0,
+ 0xb6, 0xc1, 0xd3, 0x86, 0x91, 0xa4, 0x73, 0x7e, 0x8e, 0x7c, 0x85, 0x94,
+ 0x94, 0x9d, 0xaa, 0xb0, 0xba, 0xc4, 0xb7, 0xc1, 0xca, 0xb6, 0xc1, 0xc8,
+ 0xb6, 0xbf, 0xcd, 0xb5, 0xbf, 0xce, 0xb7, 0xc2, 0xd1, 0xb5, 0xc1, 0xd1,
+ 0xb6, 0xc2, 0xd2, 0xba, 0xc6, 0xd6, 0xbb, 0xc5, 0xd6, 0xba, 0xc3, 0xd2,
+ 0xb6, 0xc4, 0xd1, 0xb6, 0xc4, 0xd1, 0xb6, 0xc4, 0xd2, 0xb9, 0xc5, 0xd3,
+ 0xc0, 0xcc, 0xd8, 0xc3, 0xcd, 0xd9, 0xc0, 0xca, 0xd4, 0xc0, 0xc9, 0xd2,
+ 0x14, 0x14, 0x16, 0x0f, 0x10, 0x12, 0x0a, 0x0b, 0x0d, 0x08, 0x09, 0x0b,
+ 0x08, 0x09, 0x0b, 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x17, 0x17, 0x19,
+ 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x16, 0x18, 0x17, 0x17, 0x19, 0x18,
+ 0x19, 0x1b, 0x1a, 0x1c, 0x1e, 0x1d, 0x1b, 0x1d, 0x1c, 0x1b, 0x1d, 0x1c,
+ 0x1b, 0x1c, 0x1c, 0x0c, 0x0c, 0x0c, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x16, 0x16, 0x16, 0x1e, 0x1e, 0x1e,
+ 0x1e, 0x1e, 0x20, 0x21, 0x21, 0x23, 0x1e, 0x1f, 0x23, 0x26, 0x27, 0x2b,
+ 0x23, 0x24, 0x29, 0x21, 0x22, 0x26, 0x22, 0x23, 0x26, 0x22, 0x23, 0x25,
+ 0x24, 0x24, 0x27, 0x25, 0x29, 0x2c, 0x24, 0x27, 0x2c, 0x23, 0x26, 0x2d,
+ 0x2a, 0x2d, 0x32, 0x2c, 0x2d, 0x31, 0x0d, 0x0d, 0x0f, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x09, 0x0a, 0x06, 0x07, 0x0b, 0x26, 0x27, 0x2d,
+ 0x3a, 0x3b, 0x40, 0x2e, 0x30, 0x34, 0x26, 0x27, 0x29, 0x20, 0x22, 0x21,
+ 0x1c, 0x1e, 0x1d, 0x18, 0x1a, 0x19, 0x15, 0x15, 0x15, 0x12, 0x12, 0x12,
+ 0x15, 0x15, 0x15, 0x19, 0x1c, 0x1a, 0x21, 0x25, 0x24, 0x35, 0x3a, 0x39,
+ 0x41, 0x45, 0x43, 0x46, 0x48, 0x45, 0x35, 0x35, 0x33, 0x09, 0x08, 0x06,
+ 0x0c, 0x0b, 0x09, 0x0a, 0x09, 0x09, 0x0b, 0x0a, 0x0a, 0x0b, 0x0c, 0x0e,
+ 0x1b, 0x1b, 0x1b, 0x28, 0x28, 0x28, 0x22, 0x22, 0x22, 0x29, 0x29, 0x27,
+ 0x37, 0x37, 0x35, 0x36, 0x37, 0x32, 0x33, 0x35, 0x30, 0x2d, 0x2f, 0x29,
+ 0x1f, 0x21, 0x20, 0x11, 0x13, 0x12, 0x0d, 0x0f, 0x0e, 0x0c, 0x0f, 0x0e,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0d, 0x0c, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0e, 0x0e, 0x0e,
+ 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13,
+ 0x12, 0x12, 0x12, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x0e, 0x0e, 0x0e,
+ 0x09, 0x09, 0x07, 0x19, 0x19, 0x1a, 0x33, 0x33, 0x38, 0x2d, 0x2e, 0x33,
+ 0x28, 0x29, 0x2e, 0x24, 0x25, 0x29, 0x18, 0x19, 0x1c, 0x13, 0x13, 0x14,
+ 0x19, 0x19, 0x1b, 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0a,
+ 0x0d, 0x0d, 0x0b, 0x0e, 0x0e, 0x0c, 0x0f, 0x0f, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x13, 0x12, 0x10, 0x1e, 0x1c, 0x1c, 0x23, 0x20, 0x22, 0x25, 0x23, 0x24,
+ 0x2d, 0x2b, 0x2c, 0x1f, 0x1e, 0x1c, 0x1d, 0x1c, 0x1a, 0x26, 0x25, 0x23,
+ 0x24, 0x22, 0x23, 0x10, 0x0e, 0x0f, 0x12, 0x11, 0x10, 0x19, 0x18, 0x16,
+ 0x23, 0x23, 0x21, 0x24, 0x24, 0x24, 0x1f, 0x20, 0x22, 0x12, 0x11, 0x16,
+ 0x3f, 0x3e, 0x43, 0x71, 0x71, 0x7b, 0x8b, 0x8d, 0x99, 0x8f, 0x90, 0x9c,
+ 0x57, 0x4e, 0x62, 0x54, 0x44, 0x56, 0x64, 0x57, 0x50, 0xd6, 0xd1, 0xac,
+ 0xef, 0xef, 0xd2, 0xe8, 0xe8, 0xd1, 0xe6, 0xe3, 0xd2, 0xe4, 0xde, 0xd1,
+ 0xe0, 0xda, 0xca, 0xdd, 0xd7, 0xc7, 0xee, 0xe8, 0xd8, 0xe3, 0xdd, 0xcf,
+ 0xe6, 0xe0, 0xd2, 0xe1, 0xde, 0xcf, 0xe1, 0xdf, 0xd0, 0xe2, 0xe0, 0xd1,
+ 0xe0, 0xe1, 0xd1, 0xe0, 0xe1, 0xd3, 0xdf, 0xde, 0xd5, 0xc7, 0xc6, 0xbd,
+ 0xe2, 0xe1, 0xde, 0xe5, 0xe5, 0xe3, 0xce, 0xcf, 0xcf, 0xeb, 0xeb, 0xeb,
+ 0xeb, 0xeb, 0xe9, 0xd9, 0xd8, 0xd3, 0xdc, 0xdc, 0xd2, 0xdb, 0xd9, 0xcd,
+ 0xdf, 0xd8, 0xd0, 0xac, 0xa3, 0xab, 0x52, 0x44, 0x5c, 0x44, 0x34, 0x4b,
+ 0x42, 0x32, 0x3e, 0x3f, 0x33, 0x32, 0x3a, 0x34, 0x33, 0x35, 0x33, 0x38,
+ 0x1e, 0x1d, 0x23, 0x13, 0x12, 0x17, 0x13, 0x12, 0x16, 0x15, 0x14, 0x17,
+ 0x15, 0x15, 0x15, 0x16, 0x18, 0x17, 0x18, 0x1a, 0x19, 0x1e, 0x20, 0x1f,
+ 0x23, 0x23, 0x23, 0x2a, 0x2b, 0x2e, 0x5e, 0x61, 0x68, 0xab, 0xaf, 0xb9,
+ 0x8d, 0x93, 0xa1, 0x7c, 0x80, 0x91, 0x74, 0x75, 0x88, 0x81, 0x7f, 0x94,
+ 0x66, 0x65, 0x78, 0x44, 0x42, 0x4b, 0x53, 0x50, 0x4d, 0x74, 0x6d, 0x65,
+ 0x94, 0x8b, 0x82, 0xa9, 0xa0, 0x97, 0xb7, 0xaf, 0xa4, 0xb8, 0xb1, 0xa3,
+ 0xc1, 0xbe, 0xb4, 0xbd, 0xba, 0xb3, 0xb3, 0xb3, 0xab, 0xb3, 0xb2, 0xad,
+ 0xb5, 0xb4, 0xb0, 0xad, 0xac, 0xaa, 0x9e, 0x9a, 0x9b, 0x84, 0x80, 0x83,
+ 0x71, 0x71, 0x75, 0x70, 0x70, 0x7c, 0x81, 0x83, 0x92, 0x73, 0x79, 0x86,
+ 0x83, 0x8e, 0x94, 0xa2, 0xaf, 0xb4, 0x9a, 0xa8, 0xb5, 0x93, 0xa2, 0xb5,
+ 0x87, 0x93, 0xa9, 0x68, 0x74, 0x88, 0x49, 0x52, 0x67, 0x3e, 0x44, 0x56,
+ 0x3c, 0x40, 0x4b, 0x49, 0x4c, 0x49, 0x85, 0x88, 0x75, 0xdd, 0xe1, 0xc4,
+ 0xe6, 0xe6, 0xd7, 0xbc, 0xbb, 0xb2, 0x98, 0x99, 0x94, 0x99, 0x9a, 0x95,
+ 0x93, 0x96, 0x8d, 0x98, 0x9a, 0x8f, 0x9e, 0x9f, 0x97, 0xa2, 0xa4, 0x9e,
+ 0xa1, 0xa5, 0x9e, 0x95, 0x9a, 0x94, 0x94, 0x99, 0x94, 0x96, 0x9a, 0x96,
+ 0x97, 0x9b, 0x9a, 0x99, 0x9e, 0x9f, 0x6b, 0x6f, 0x72, 0x6a, 0x6e, 0x70,
+ 0x90, 0x95, 0x8b, 0x9a, 0x9f, 0x9c, 0x74, 0x77, 0x7e, 0x60, 0x63, 0x68,
+ 0x8d, 0x92, 0x8e, 0x73, 0x79, 0x6f, 0x5c, 0x62, 0x5e, 0x62, 0x67, 0x6a,
+ 0x8d, 0x93, 0x8c, 0x9c, 0xa1, 0x9b, 0xa5, 0xaa, 0xa6, 0x7f, 0x83, 0x82,
+ 0x53, 0x57, 0x56, 0x56, 0x5a, 0x5b, 0x6b, 0x6e, 0x6f, 0x8f, 0x93, 0x94,
+ 0x95, 0x9a, 0x96, 0x99, 0x9d, 0x9b, 0x99, 0x9c, 0x9b, 0x9c, 0x9f, 0xa2,
+ 0x9d, 0xa0, 0xa6, 0x84, 0x87, 0x90, 0x53, 0x57, 0x62, 0x39, 0x3d, 0x48,
+ 0x37, 0x37, 0x3f, 0x65, 0x6c, 0x70, 0x4b, 0x5a, 0x68, 0x21, 0x32, 0x44,
+ 0x48, 0x59, 0x61, 0x7c, 0x8a, 0x95, 0x64, 0x6f, 0x83, 0x2f, 0x3a, 0x4c,
+ 0x23, 0x2c, 0x3e, 0x25, 0x2e, 0x38, 0x21, 0x2a, 0x31, 0x20, 0x28, 0x32,
+ 0x29, 0x32, 0x39, 0x44, 0x4d, 0x4c, 0x65, 0x6e, 0x6c, 0x6d, 0x75, 0x78,
+ 0x70, 0x73, 0x77, 0x69, 0x6a, 0x6e, 0x66, 0x67, 0x69, 0x68, 0x67, 0x69,
+ 0x6c, 0x6b, 0x6c, 0x70, 0x70, 0x72, 0x6f, 0x70, 0x72, 0x6d, 0x6f, 0x72,
+ 0x6e, 0x6f, 0x72, 0x6f, 0x70, 0x74, 0x6f, 0x72, 0x77, 0x69, 0x6e, 0x71,
+ 0x70, 0x78, 0x77, 0xa3, 0xad, 0xab, 0xc1, 0xcd, 0xd0, 0xc0, 0xcc, 0xd6,
+ 0x9b, 0xa4, 0xb8, 0x80, 0x88, 0x9b, 0xa6, 0xad, 0xbd, 0x95, 0x9d, 0xa9,
+ 0x7a, 0x83, 0x8c, 0x8a, 0x93, 0x9b, 0xa9, 0xb3, 0xbc, 0xb4, 0xbe, 0xc7,
+ 0xb7, 0xc1, 0xcb, 0xb6, 0xc0, 0xca, 0xb2, 0xbf, 0xcc, 0xb4, 0xc1, 0xd1,
+ 0xb3, 0xc1, 0xd1, 0xb8, 0xc5, 0xd5, 0xb9, 0xc5, 0xd5, 0xb9, 0xc6, 0xd4,
+ 0xb9, 0xc8, 0xd6, 0xb9, 0xc7, 0xd6, 0xb6, 0xc3, 0xd3, 0xba, 0xc6, 0xd4,
+ 0xbc, 0xc6, 0xd4, 0xb8, 0xc2, 0xcc, 0xb5, 0xbe, 0xc8, 0xb7, 0xbf, 0xc8,
+ 0x10, 0x10, 0x12, 0x09, 0x0a, 0x0c, 0x07, 0x08, 0x0a, 0x0b, 0x0c, 0x0e,
+ 0x17, 0x18, 0x1a, 0x1c, 0x1d, 0x1e, 0x13, 0x13, 0x15, 0x14, 0x14, 0x16,
+ 0x16, 0x18, 0x16, 0x18, 0x1a, 0x19, 0x16, 0x18, 0x17, 0x17, 0x19, 0x18,
+ 0x19, 0x1b, 0x1a, 0x1b, 0x1d, 0x1c, 0x1a, 0x1c, 0x1b, 0x19, 0x1b, 0x1a,
+ 0x1a, 0x1a, 0x1b, 0x0f, 0x0f, 0x0f, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x17, 0x17, 0x16, 0x1c, 0x1c, 0x1d,
+ 0x1f, 0x1e, 0x23, 0x21, 0x20, 0x25, 0x20, 0x20, 0x25, 0x22, 0x23, 0x28,
+ 0x23, 0x23, 0x2a, 0x24, 0x25, 0x29, 0x22, 0x23, 0x28, 0x24, 0x25, 0x29,
+ 0x24, 0x25, 0x27, 0x24, 0x28, 0x2b, 0x24, 0x27, 0x2c, 0x22, 0x25, 0x2c,
+ 0x2b, 0x2e, 0x34, 0x2b, 0x2c, 0x30, 0x10, 0x10, 0x12, 0x07, 0x07, 0x07,
+ 0x07, 0x08, 0x07, 0x07, 0x09, 0x0a, 0x08, 0x08, 0x0e, 0x1d, 0x1e, 0x25,
+ 0x34, 0x35, 0x3c, 0x3c, 0x3d, 0x42, 0x31, 0x32, 0x36, 0x23, 0x24, 0x26,
+ 0x20, 0x22, 0x21, 0x1c, 0x1e, 0x1d, 0x19, 0x1a, 0x19, 0x16, 0x16, 0x16,
+ 0x13, 0x13, 0x13, 0x18, 0x1a, 0x19, 0x1b, 0x1f, 0x1f, 0x2b, 0x31, 0x2f,
+ 0x43, 0x46, 0x43, 0x4c, 0x4c, 0x4a, 0x3b, 0x3c, 0x39, 0x08, 0x07, 0x04,
+ 0x3b, 0x3a, 0x37, 0x4d, 0x4c, 0x4c, 0x13, 0x13, 0x14, 0x0f, 0x10, 0x12,
+ 0x21, 0x21, 0x21, 0x28, 0x27, 0x26, 0x2a, 0x2a, 0x28, 0x37, 0x37, 0x34,
+ 0x3e, 0x3f, 0x3a, 0x3a, 0x3b, 0x36, 0x33, 0x35, 0x30, 0x20, 0x22, 0x1d,
+ 0x0c, 0x0d, 0x0e, 0x0c, 0x0e, 0x0d, 0x0b, 0x0d, 0x0c, 0x0c, 0x0e, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0d,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0d, 0x06, 0x06, 0x04,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0e, 0x0e, 0x0e, 0x13, 0x13, 0x13, 0x11, 0x10, 0x11, 0x12, 0x12, 0x12,
+ 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x16, 0x16, 0x16, 0x10, 0x0f, 0x0f,
+ 0x0b, 0x0b, 0x09, 0x13, 0x13, 0x13, 0x2f, 0x30, 0x34, 0x2b, 0x2c, 0x31,
+ 0x28, 0x29, 0x2e, 0x21, 0x22, 0x26, 0x10, 0x11, 0x13, 0x17, 0x18, 0x18,
+ 0x1b, 0x1b, 0x1d, 0x10, 0x10, 0x10, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09,
+ 0x0e, 0x0e, 0x0c, 0x0d, 0x0e, 0x0c, 0x0e, 0x0f, 0x0e, 0x0f, 0x10, 0x0f,
+ 0x16, 0x15, 0x13, 0x25, 0x23, 0x22, 0x23, 0x21, 0x22, 0x25, 0x23, 0x24,
+ 0x2d, 0x2b, 0x2b, 0x1b, 0x1a, 0x19, 0x1b, 0x1a, 0x18, 0x25, 0x24, 0x22,
+ 0x20, 0x1e, 0x1f, 0x12, 0x10, 0x11, 0x14, 0x13, 0x11, 0x19, 0x18, 0x15,
+ 0x23, 0x22, 0x20, 0x21, 0x21, 0x21, 0x20, 0x1f, 0x24, 0x14, 0x13, 0x19,
+ 0x3a, 0x38, 0x3f, 0x68, 0x67, 0x71, 0x57, 0x56, 0x60, 0x4e, 0x49, 0x55,
+ 0x59, 0x4a, 0x5c, 0x55, 0x40, 0x51, 0x5b, 0x4d, 0x44, 0xb4, 0xab, 0x87,
+ 0xf0, 0xf0, 0xd1, 0xe9, 0xe8, 0xd0, 0xe8, 0xe5, 0xd4, 0xe7, 0xe1, 0xd3,
+ 0xe7, 0xdf, 0xd2, 0xe8, 0xe2, 0xd2, 0xe8, 0xe3, 0xd0, 0xe4, 0xde, 0xcc,
+ 0xe4, 0xde, 0xd1, 0xe0, 0xde, 0xce, 0xe2, 0xe0, 0xce, 0xe1, 0xe0, 0xcd,
+ 0xdd, 0xde, 0xcd, 0xdb, 0xdc, 0xd0, 0xc8, 0xc8, 0xc1, 0xc6, 0xc5, 0xc2,
+ 0xe2, 0xe2, 0xe2, 0xff, 0xff, 0xff, 0xdb, 0xdc, 0xde, 0xd4, 0xd5, 0xd6,
+ 0xe3, 0xe5, 0xe4, 0xd9, 0xda, 0xd5, 0xdc, 0xdd, 0xd2, 0xd9, 0xd6, 0xca,
+ 0xd8, 0xd0, 0xce, 0x9d, 0x93, 0xa1, 0x59, 0x4d, 0x66, 0x45, 0x38, 0x4f,
+ 0x41, 0x35, 0x40, 0x43, 0x39, 0x39, 0x3a, 0x35, 0x37, 0x34, 0x32, 0x3a,
+ 0x25, 0x24, 0x2a, 0x1b, 0x1a, 0x20, 0x13, 0x11, 0x16, 0x14, 0x14, 0x16,
+ 0x14, 0x15, 0x17, 0x14, 0x16, 0x15, 0x1a, 0x1c, 0x1b, 0x23, 0x24, 0x24,
+ 0x28, 0x27, 0x28, 0x37, 0x39, 0x3b, 0x86, 0x8b, 0x93, 0x9f, 0xa6, 0xb4,
+ 0x99, 0xa1, 0xb2, 0xa5, 0xaa, 0xbd, 0x73, 0x72, 0x87, 0x4b, 0x48, 0x5c,
+ 0x47, 0x43, 0x4c, 0x67, 0x61, 0x60, 0x9d, 0x95, 0x88, 0xb5, 0xad, 0x9a,
+ 0xbe, 0xb5, 0xa4, 0xc2, 0xbd, 0xab, 0xc0, 0xbe, 0xab, 0xc4, 0xc5, 0xb1,
+ 0xd9, 0xd3, 0xc5, 0xd0, 0xca, 0xbf, 0xbf, 0xbd, 0xb1, 0xba, 0xbc, 0xb0,
+ 0xc3, 0xc4, 0xba, 0xc1, 0xc1, 0xb9, 0xc4, 0xc2, 0xbb, 0xc5, 0xc2, 0xbd,
+ 0xb7, 0xb7, 0xba, 0x9c, 0x9c, 0xa7, 0x7c, 0x7d, 0x8c, 0x6f, 0x72, 0x7f,
+ 0x90, 0x99, 0x9f, 0x9f, 0xaa, 0xaf, 0x9b, 0xa8, 0xb3, 0x99, 0xa4, 0xb8,
+ 0x92, 0x9e, 0xac, 0x85, 0x91, 0x9e, 0x69, 0x73, 0x82, 0x4b, 0x50, 0x61,
+ 0x40, 0x42, 0x50, 0x41, 0x43, 0x43, 0x6b, 0x6d, 0x5c, 0xc3, 0xc6, 0xa9,
+ 0xf0, 0xf2, 0xde, 0xd0, 0xd1, 0xc5, 0xa5, 0xa6, 0xa1, 0x9c, 0x9d, 0x98,
+ 0x9c, 0x9d, 0x95, 0x9a, 0x9c, 0x92, 0xa2, 0xa3, 0x9b, 0xa0, 0xa1, 0x9a,
+ 0x9a, 0x9f, 0x97, 0x9e, 0xa3, 0x9c, 0x90, 0x95, 0x90, 0x68, 0x6c, 0x6a,
+ 0x69, 0x6d, 0x6f, 0x7d, 0x82, 0x84, 0x5e, 0x63, 0x66, 0x43, 0x48, 0x4c,
+ 0x76, 0x7b, 0x74, 0x96, 0x9a, 0x94, 0x83, 0x87, 0x84, 0x91, 0x95, 0x94,
+ 0x79, 0x7d, 0x80, 0x59, 0x5e, 0x60, 0x86, 0x8d, 0x8c, 0x94, 0x9c, 0x9a,
+ 0x93, 0x9a, 0x94, 0x8f, 0x96, 0x8f, 0x96, 0x9a, 0x95, 0x9a, 0x9f, 0x9b,
+ 0x81, 0x85, 0x82, 0x83, 0x85, 0x83, 0x92, 0x94, 0x8f, 0x92, 0x94, 0x90,
+ 0x97, 0x9b, 0x9c, 0x9b, 0xa0, 0xa0, 0x99, 0x9d, 0x9c, 0x99, 0x9d, 0x9c,
+ 0x97, 0x9b, 0x9d, 0x9a, 0x9f, 0xa3, 0x8d, 0x92, 0x99, 0x63, 0x66, 0x71,
+ 0x42, 0x41, 0x4b, 0x69, 0x6e, 0x75, 0x4a, 0x59, 0x65, 0x43, 0x56, 0x64,
+ 0x7a, 0x8e, 0x95, 0x64, 0x74, 0x82, 0x36, 0x42, 0x5a, 0x26, 0x30, 0x46,
+ 0x25, 0x2d, 0x3b, 0x25, 0x2d, 0x38, 0x23, 0x2b, 0x36, 0x21, 0x2a, 0x34,
+ 0x20, 0x29, 0x30, 0x2d, 0x35, 0x38, 0x57, 0x5f, 0x60, 0x6d, 0x76, 0x74,
+ 0x70, 0x72, 0x76, 0x67, 0x66, 0x68, 0x67, 0x68, 0x67, 0x6c, 0x6b, 0x6b,
+ 0x6b, 0x6b, 0x6b, 0x76, 0x76, 0x76, 0x7c, 0x7d, 0x7f, 0x6d, 0x71, 0x72,
+ 0x71, 0x72, 0x76, 0x73, 0x73, 0x78, 0x72, 0x76, 0x7a, 0x75, 0x7a, 0x7c,
+ 0xa0, 0xa9, 0xa6, 0xc2, 0xcc, 0xcb, 0xbf, 0xcc, 0xd2, 0xbc, 0xca, 0xd9,
+ 0xac, 0xb5, 0xc8, 0x89, 0x90, 0xa0, 0x8b, 0x91, 0x9d, 0xac, 0xb3, 0xbc,
+ 0xa4, 0xab, 0xb1, 0x6c, 0x75, 0x7c, 0x80, 0x89, 0x91, 0xaa, 0xb4, 0xbd,
+ 0xb1, 0xbc, 0xc2, 0xb4, 0xc1, 0xc8, 0xb3, 0xc1, 0xcc, 0xb3, 0xc2, 0xd1,
+ 0xb5, 0xc4, 0xd3, 0xb5, 0xc5, 0xd4, 0xb6, 0xc6, 0xd5, 0xba, 0xc9, 0xd6,
+ 0xbc, 0xcc, 0xd9, 0xbd, 0xca, 0xda, 0xbb, 0xc9, 0xd8, 0xba, 0xc7, 0xd7,
+ 0xb6, 0xbf, 0xce, 0xb0, 0xb8, 0xc3, 0xad, 0xb6, 0xbf, 0xad, 0xb4, 0xbb,
+ 0x0a, 0x0a, 0x0c, 0x08, 0x08, 0x0a, 0x0e, 0x0f, 0x11, 0x16, 0x1a, 0x1d,
+ 0x1a, 0x1e, 0x1f, 0x13, 0x15, 0x14, 0x13, 0x13, 0x11, 0x15, 0x15, 0x13,
+ 0x15, 0x17, 0x16, 0x18, 0x1a, 0x19, 0x18, 0x1a, 0x19, 0x1a, 0x1a, 0x1a,
+ 0x1a, 0x1a, 0x1a, 0x1c, 0x1d, 0x1d, 0x1a, 0x1b, 0x1d, 0x19, 0x1a, 0x1c,
+ 0x19, 0x19, 0x1b, 0x11, 0x12, 0x13, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x11, 0x11, 0x13, 0x1d, 0x1d, 0x1f,
+ 0x1b, 0x1c, 0x20, 0x1c, 0x1d, 0x20, 0x20, 0x21, 0x23, 0x22, 0x23, 0x25,
+ 0x1f, 0x20, 0x22, 0x22, 0x23, 0x25, 0x21, 0x22, 0x24, 0x21, 0x22, 0x24,
+ 0x24, 0x24, 0x24, 0x23, 0x25, 0x24, 0x23, 0x26, 0x28, 0x24, 0x29, 0x2d,
+ 0x26, 0x2b, 0x31, 0x29, 0x2c, 0x33, 0x17, 0x18, 0x1c, 0x08, 0x08, 0x08,
+ 0x07, 0x08, 0x0a, 0x07, 0x08, 0x08, 0x06, 0x06, 0x07, 0x16, 0x16, 0x18,
+ 0x34, 0x33, 0x39, 0x36, 0x36, 0x3e, 0x38, 0x38, 0x3f, 0x35, 0x37, 0x3e,
+ 0x27, 0x29, 0x27, 0x27, 0x28, 0x25, 0x22, 0x23, 0x1f, 0x19, 0x19, 0x17,
+ 0x14, 0x14, 0x12, 0x13, 0x13, 0x13, 0x14, 0x15, 0x18, 0x18, 0x19, 0x1d,
+ 0x2e, 0x2e, 0x2c, 0x43, 0x43, 0x41, 0x3f, 0x40, 0x3c, 0x21, 0x22, 0x1e,
+ 0x94, 0x95, 0x90, 0xa4, 0xa6, 0xa1, 0x33, 0x35, 0x31, 0x12, 0x14, 0x11,
+ 0x24, 0x23, 0x21, 0x34, 0x33, 0x2f, 0x3d, 0x3d, 0x36, 0x3c, 0x3d, 0x36,
+ 0x3d, 0x3e, 0x36, 0x35, 0x37, 0x33, 0x24, 0x25, 0x27, 0x13, 0x14, 0x18,
+ 0x0f, 0x0f, 0x10, 0x10, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x14, 0x14, 0x13, 0x10, 0x10, 0x10,
+ 0x08, 0x08, 0x08, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x0b, 0x0b, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x0e, 0x0c, 0x0d, 0x16, 0x14, 0x15, 0x13, 0x11, 0x12, 0x13, 0x11, 0x12,
+ 0x14, 0x12, 0x13, 0x12, 0x10, 0x11, 0x14, 0x12, 0x13, 0x11, 0x10, 0x11,
+ 0x0c, 0x0c, 0x0b, 0x11, 0x12, 0x11, 0x2c, 0x2d, 0x2f, 0x2b, 0x2c, 0x32,
+ 0x27, 0x28, 0x2d, 0x1e, 0x1f, 0x23, 0x10, 0x11, 0x13, 0x19, 0x19, 0x19,
+ 0x1a, 0x1b, 0x1a, 0x0e, 0x10, 0x0f, 0x0a, 0x0b, 0x0a, 0x0c, 0x0c, 0x0b,
+ 0x0d, 0x0c, 0x0c, 0x0f, 0x0d, 0x0e, 0x10, 0x0e, 0x0d, 0x11, 0x0e, 0x0d,
+ 0x16, 0x15, 0x13, 0x24, 0x23, 0x23, 0x24, 0x22, 0x28, 0x1f, 0x1d, 0x22,
+ 0x1c, 0x1a, 0x1b, 0x19, 0x18, 0x16, 0x19, 0x18, 0x16, 0x23, 0x21, 0x21,
+ 0x1e, 0x1c, 0x1d, 0x13, 0x11, 0x12, 0x16, 0x14, 0x13, 0x1e, 0x1d, 0x1b,
+ 0x26, 0x25, 0x23, 0x1f, 0x1e, 0x1e, 0x20, 0x1e, 0x21, 0x15, 0x13, 0x18,
+ 0x2e, 0x28, 0x2c, 0x4a, 0x3c, 0x43, 0x47, 0x31, 0x3c, 0x53, 0x3c, 0x4c,
+ 0x60, 0x4f, 0x5f, 0x54, 0x48, 0x55, 0x54, 0x47, 0x4d, 0x7d, 0x6e, 0x6c,
+ 0xdf, 0xda, 0xbe, 0xf2, 0xef, 0xd4, 0xe9, 0xe9, 0xd1, 0xe7, 0xe5, 0xd4,
+ 0xe7, 0xe4, 0xd7, 0xe6, 0xe2, 0xd5, 0xe3, 0xdd, 0xcd, 0xe4, 0xdd, 0xca,
+ 0xe0, 0xde, 0xcc, 0xde, 0xdd, 0xc9, 0xdd, 0xdc, 0xc7, 0xdb, 0xda, 0xc6,
+ 0xdb, 0xdd, 0xca, 0xd8, 0xda, 0xcc, 0xc7, 0xc9, 0xbe, 0xe3, 0xe5, 0xdf,
+ 0xd4, 0xd2, 0xd6, 0xe2, 0xe3, 0xe4, 0xd9, 0xda, 0xd7, 0xd8, 0xd9, 0xcf,
+ 0xd9, 0xda, 0xcc, 0xdc, 0xdb, 0xcd, 0xe2, 0xdc, 0xd0, 0xdf, 0xd7, 0xcd,
+ 0xca, 0xc3, 0xcc, 0xab, 0xa7, 0xb4, 0x8c, 0x8a, 0x9b, 0x63, 0x65, 0x77,
+ 0x46, 0x49, 0x57, 0x3e, 0x3e, 0x4a, 0x3b, 0x37, 0x40, 0x31, 0x2b, 0x32,
+ 0x26, 0x27, 0x2c, 0x23, 0x22, 0x27, 0x15, 0x15, 0x17, 0x13, 0x13, 0x14,
+ 0x12, 0x15, 0x14, 0x11, 0x15, 0x14, 0x1e, 0x1e, 0x20, 0x2e, 0x2c, 0x2f,
+ 0x2d, 0x2b, 0x30, 0x4d, 0x4e, 0x4a, 0x96, 0x98, 0xa1, 0x97, 0x9f, 0xb1,
+ 0x9d, 0xa9, 0xb4, 0x93, 0x9a, 0xae, 0x6a, 0x61, 0x84, 0x4e, 0x3f, 0x57,
+ 0x71, 0x6a, 0x56, 0xa4, 0x9f, 0x89, 0xbe, 0xb8, 0xa5, 0xbf, 0xbc, 0xa9,
+ 0xc5, 0xc3, 0xb0, 0xc7, 0xc7, 0xb6, 0xc0, 0xc0, 0xb6, 0xce, 0xcf, 0xc7,
+ 0xdf, 0xe1, 0xdb, 0xdb, 0xdb, 0xd8, 0xbf, 0xbd, 0xbc, 0xb7, 0xb3, 0xb2,
+ 0xb9, 0xb6, 0xb2, 0xba, 0xba, 0xb2, 0xca, 0xcd, 0xc3, 0xd9, 0xdf, 0xd7,
+ 0xe3, 0xe8, 0xea, 0xd8, 0xda, 0xde, 0xb6, 0xb3, 0xbb, 0x90, 0x8d, 0x99,
+ 0x88, 0x87, 0x99, 0x9d, 0xa2, 0xb5, 0x9f, 0xa6, 0xb6, 0x9a, 0xa4, 0xb2,
+ 0x97, 0xa0, 0xac, 0x8f, 0x95, 0xa1, 0x82, 0x86, 0x92, 0x5e, 0x60, 0x6d,
+ 0x40, 0x42, 0x50, 0x38, 0x3b, 0x40, 0x55, 0x58, 0x4e, 0x9d, 0xa1, 0x8d,
+ 0xeb, 0xef, 0xd8, 0xe5, 0xe7, 0xd8, 0xc1, 0xc1, 0xbd, 0xa1, 0xa0, 0x9e,
+ 0x9d, 0x9c, 0x96, 0x9f, 0xa0, 0x96, 0xa1, 0xa5, 0x97, 0x9a, 0x9f, 0x95,
+ 0xa6, 0xa8, 0xa9, 0x95, 0x99, 0x98, 0x8f, 0x94, 0x90, 0x87, 0x8c, 0x86,
+ 0x92, 0x95, 0x8e, 0x94, 0x96, 0x91, 0x8d, 0x8d, 0x8c, 0x63, 0x64, 0x63,
+ 0x91, 0x94, 0x8c, 0x83, 0x85, 0x7e, 0x96, 0x99, 0x95, 0xa9, 0xab, 0xaa,
+ 0x7a, 0x7e, 0x7f, 0x60, 0x64, 0x65, 0x8e, 0x92, 0x93, 0x7f, 0x84, 0x85,
+ 0x8b, 0x90, 0x92, 0x8b, 0x8f, 0x90, 0x66, 0x67, 0x69, 0x92, 0x95, 0x93,
+ 0x9c, 0x9e, 0x9d, 0x9c, 0x9e, 0x9d, 0x96, 0x99, 0x98, 0x99, 0x9e, 0x9c,
+ 0x99, 0xa1, 0xa1, 0x95, 0x9e, 0x9d, 0x94, 0x9c, 0x99, 0x96, 0x9e, 0x9c,
+ 0x9e, 0xa4, 0xa4, 0x9d, 0xa3, 0xa4, 0x9e, 0xa3, 0xa6, 0x9b, 0xa0, 0xa3,
+ 0x6d, 0x74, 0x7b, 0x73, 0x7c, 0x86, 0x5c, 0x67, 0x70, 0x7d, 0x8a, 0x91,
+ 0x76, 0x83, 0x92, 0x36, 0x42, 0x5c, 0x27, 0x33, 0x4c, 0x24, 0x31, 0x3e,
+ 0x21, 0x2e, 0x34, 0x23, 0x2d, 0x37, 0x24, 0x2b, 0x3a, 0x26, 0x2d, 0x3c,
+ 0x22, 0x2b, 0x34, 0x47, 0x51, 0x51, 0x6e, 0x77, 0x72, 0x78, 0x7f, 0x7a,
+ 0x75, 0x73, 0x78, 0x67, 0x67, 0x65, 0x6a, 0x6c, 0x65, 0x6c, 0x71, 0x6b,
+ 0x6a, 0x6f, 0x70, 0x78, 0x7c, 0x7f, 0x78, 0x7b, 0x7d, 0x6b, 0x70, 0x6d,
+ 0x71, 0x70, 0x74, 0x72, 0x72, 0x74, 0x75, 0x79, 0x79, 0x9f, 0xa5, 0xa4,
+ 0xc2, 0xcc, 0xcc, 0xc4, 0xcf, 0xd5, 0xbe, 0xca, 0xd8, 0xbf, 0xca, 0xdc,
+ 0xbf, 0xca, 0xda, 0xb2, 0xbb, 0xcb, 0x95, 0x9c, 0xab, 0x86, 0x8c, 0x9a,
+ 0x83, 0x87, 0x93, 0x7f, 0x86, 0x8e, 0xa1, 0xaa, 0xaf, 0xab, 0xb5, 0xb9,
+ 0x8d, 0x94, 0xa2, 0x9a, 0xa3, 0xae, 0xb4, 0xbd, 0xc6, 0xb7, 0xc2, 0xcb,
+ 0xbc, 0xc6, 0xd1, 0xb8, 0xc6, 0xd3, 0xb8, 0xc9, 0xd5, 0xb9, 0xc9, 0xd4,
+ 0xbc, 0xc9, 0xd6, 0xbd, 0xcb, 0xd8, 0xbc, 0xcc, 0xdb, 0xba, 0xca, 0xd9,
+ 0xb5, 0xc3, 0xd2, 0xad, 0xb7, 0xc3, 0xa9, 0xaf, 0xb9, 0xa8, 0xab, 0xb3,
+ 0x0a, 0x0a, 0x0b, 0x14, 0x14, 0x16, 0x1b, 0x1c, 0x1e, 0x18, 0x1c, 0x1f,
+ 0x12, 0x16, 0x19, 0x08, 0x0c, 0x0c, 0x12, 0x14, 0x13, 0x15, 0x17, 0x16,
+ 0x15, 0x16, 0x17, 0x19, 0x1a, 0x1a, 0x1a, 0x1c, 0x1b, 0x19, 0x1a, 0x19,
+ 0x15, 0x15, 0x15, 0x18, 0x1a, 0x19, 0x1b, 0x1c, 0x1e, 0x1b, 0x1c, 0x1e,
+ 0x1a, 0x1b, 0x1d, 0x11, 0x12, 0x14, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0f, 0x0f, 0x12, 0x1d, 0x1d, 0x1f,
+ 0x1b, 0x1b, 0x1e, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x22, 0x23, 0x24, 0x26,
+ 0x20, 0x21, 0x23, 0x20, 0x21, 0x23, 0x21, 0x22, 0x26, 0x23, 0x24, 0x28,
+ 0x22, 0x23, 0x25, 0x25, 0x26, 0x28, 0x25, 0x29, 0x2c, 0x24, 0x29, 0x2d,
+ 0x25, 0x29, 0x30, 0x2b, 0x2e, 0x35, 0x19, 0x1a, 0x1d, 0x06, 0x06, 0x04,
+ 0x08, 0x09, 0x0b, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x11, 0x11, 0x13,
+ 0x30, 0x30, 0x37, 0x36, 0x36, 0x3e, 0x38, 0x3a, 0x42, 0x41, 0x46, 0x4c,
+ 0x37, 0x39, 0x38, 0x3e, 0x40, 0x3e, 0x2b, 0x2e, 0x2a, 0x1e, 0x1f, 0x1b,
+ 0x1c, 0x1c, 0x1a, 0x16, 0x15, 0x14, 0x13, 0x13, 0x14, 0x11, 0x12, 0x14,
+ 0x16, 0x16, 0x18, 0x29, 0x29, 0x2b, 0x30, 0x31, 0x32, 0x66, 0x68, 0x67,
+ 0xae, 0xb0, 0xaf, 0x6c, 0x6e, 0x6b, 0x24, 0x26, 0x23, 0x26, 0x28, 0x23,
+ 0x33, 0x32, 0x2e, 0x43, 0x42, 0x3e, 0x49, 0x48, 0x43, 0x40, 0x41, 0x3b,
+ 0x32, 0x33, 0x2d, 0x21, 0x22, 0x1f, 0x12, 0x14, 0x16, 0x0f, 0x10, 0x14,
+ 0x12, 0x13, 0x13, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10,
+ 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10,
+ 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0c, 0x0d, 0x10, 0x0e, 0x0f, 0x11, 0x10, 0x11, 0x10, 0x0e, 0x0f,
+ 0x11, 0x0f, 0x10, 0x15, 0x13, 0x14, 0x13, 0x12, 0x12, 0x11, 0x10, 0x10,
+ 0x0c, 0x0c, 0x0b, 0x10, 0x10, 0x0f, 0x2a, 0x2c, 0x2d, 0x2a, 0x2b, 0x31,
+ 0x23, 0x24, 0x29, 0x1b, 0x1c, 0x20, 0x14, 0x15, 0x17, 0x17, 0x17, 0x18,
+ 0x1a, 0x1d, 0x1b, 0x0d, 0x0f, 0x0e, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0d, 0x0e, 0x10, 0x0d, 0x0f, 0x0f, 0x0d, 0x0c, 0x14, 0x10, 0x0f,
+ 0x18, 0x17, 0x15, 0x22, 0x21, 0x21, 0x26, 0x24, 0x29, 0x1d, 0x1b, 0x1f,
+ 0x16, 0x14, 0x15, 0x18, 0x17, 0x15, 0x1d, 0x1b, 0x1a, 0x24, 0x22, 0x23,
+ 0x1c, 0x1a, 0x1b, 0x16, 0x14, 0x15, 0x17, 0x16, 0x14, 0x24, 0x23, 0x21,
+ 0x24, 0x23, 0x21, 0x20, 0x1e, 0x1f, 0x21, 0x1f, 0x22, 0x16, 0x15, 0x17,
+ 0x18, 0x14, 0x14, 0x32, 0x25, 0x27, 0x46, 0x33, 0x39, 0x53, 0x3f, 0x4a,
+ 0x62, 0x55, 0x63, 0x63, 0x5c, 0x6a, 0x56, 0x4d, 0x5b, 0x63, 0x58, 0x64,
+ 0xb8, 0xb3, 0xab, 0xef, 0xed, 0xdd, 0xec, 0xeb, 0xd5, 0xe8, 0xe9, 0xd0,
+ 0xe6, 0xe6, 0xd0, 0xe3, 0xe1, 0xd0, 0xe6, 0xe2, 0xd1, 0xe8, 0xe3, 0xd3,
+ 0xdf, 0xdc, 0xd1, 0xdc, 0xda, 0xce, 0xdd, 0xdb, 0xcf, 0xdb, 0xd9, 0xcd,
+ 0xdd, 0xdb, 0xcf, 0xdd, 0xdd, 0xd3, 0xd7, 0xd7, 0xcc, 0xd8, 0xda, 0xd1,
+ 0xd7, 0xd7, 0xd5, 0xd4, 0xd5, 0xd0, 0xd5, 0xd6, 0xcc, 0xdd, 0xde, 0xcf,
+ 0xd9, 0xda, 0xc9, 0xdc, 0xda, 0xcc, 0xe0, 0xdb, 0xd2, 0xde, 0xda, 0xd5,
+ 0xbb, 0xbb, 0xc4, 0xaa, 0xac, 0xb8, 0xa4, 0xaa, 0xb8, 0x95, 0x9d, 0xae,
+ 0x75, 0x7d, 0x8c, 0x4a, 0x4f, 0x5b, 0x39, 0x39, 0x43, 0x30, 0x2d, 0x34,
+ 0x27, 0x28, 0x2c, 0x1a, 0x1a, 0x1c, 0x14, 0x14, 0x15, 0x14, 0x15, 0x15,
+ 0x11, 0x15, 0x14, 0x14, 0x18, 0x18, 0x23, 0x23, 0x25, 0x31, 0x2d, 0x33,
+ 0x40, 0x36, 0x41, 0x70, 0x6a, 0x6e, 0x8d, 0x89, 0x98, 0x90, 0x91, 0xa8,
+ 0x9c, 0xa2, 0xb3, 0x90, 0x92, 0xa4, 0x60, 0x55, 0x68, 0x6c, 0x5c, 0x5d,
+ 0xa2, 0x9c, 0x84, 0xb9, 0xb4, 0x9f, 0xbe, 0xb9, 0xa5, 0xbd, 0xba, 0xa8,
+ 0xcd, 0xcd, 0xbb, 0xd7, 0xd8, 0xc9, 0xc9, 0xca, 0xc2, 0xd1, 0xd1, 0xce,
+ 0xed, 0xef, 0xed, 0xf1, 0xf1, 0xf2, 0xc8, 0xc6, 0xc7, 0xb0, 0xac, 0xab,
+ 0xb6, 0xb3, 0xae, 0xc0, 0xc0, 0xb8, 0xd4, 0xd7, 0xd0, 0xd2, 0xd7, 0xd1,
+ 0xe8, 0xee, 0xeb, 0xef, 0xf1, 0xee, 0xd3, 0xd1, 0xd2, 0xbb, 0xb8, 0xbf,
+ 0x92, 0x91, 0x9e, 0x89, 0x8c, 0x9d, 0x88, 0x8d, 0xa1, 0x75, 0x7c, 0x8d,
+ 0x69, 0x6f, 0x7d, 0x60, 0x64, 0x6f, 0x59, 0x59, 0x63, 0x50, 0x51, 0x5b,
+ 0x3f, 0x42, 0x4b, 0x34, 0x37, 0x3a, 0x43, 0x46, 0x3f, 0x7e, 0x81, 0x71,
+ 0xd5, 0xda, 0xc5, 0xf4, 0xf7, 0xe8, 0xd8, 0xd9, 0xd3, 0xaf, 0xae, 0xab,
+ 0x9d, 0x9c, 0x97, 0xa3, 0xa5, 0x9b, 0x9f, 0xa2, 0x98, 0xa2, 0xa5, 0x9e,
+ 0xa6, 0xa8, 0xa7, 0x6e, 0x70, 0x6d, 0x74, 0x76, 0x71, 0x9c, 0x9f, 0x98,
+ 0xa0, 0xa3, 0x9c, 0xa2, 0xa4, 0x9e, 0xab, 0xab, 0xa9, 0x65, 0x65, 0x64,
+ 0x95, 0x97, 0x92, 0x9f, 0xa1, 0x9c, 0x98, 0x9a, 0x96, 0xab, 0xac, 0xaa,
+ 0xa4, 0xa8, 0xa7, 0x6d, 0x71, 0x72, 0x60, 0x64, 0x65, 0x52, 0x56, 0x57,
+ 0x8f, 0x93, 0x95, 0x8f, 0x93, 0x94, 0x55, 0x58, 0x59, 0x89, 0x8b, 0x8b,
+ 0x99, 0x9b, 0x9a, 0x99, 0x9d, 0x9c, 0x9b, 0x9f, 0x9d, 0xa1, 0xa6, 0xa5,
+ 0x97, 0x9f, 0xa0, 0x99, 0xa2, 0xa1, 0x92, 0x9b, 0x9a, 0x92, 0x9b, 0x9a,
+ 0x9c, 0xa2, 0xa2, 0x98, 0x9e, 0x9e, 0x99, 0x9e, 0xa1, 0xa6, 0xac, 0xae,
+ 0x9d, 0xa5, 0xa9, 0x80, 0x88, 0x96, 0x58, 0x61, 0x72, 0x7c, 0x88, 0x92,
+ 0x7d, 0x8a, 0x95, 0x49, 0x56, 0x69, 0x2e, 0x3a, 0x51, 0x24, 0x32, 0x40,
+ 0x26, 0x30, 0x3c, 0x28, 0x30, 0x3d, 0x27, 0x2d, 0x3b, 0x27, 0x2d, 0x38,
+ 0x30, 0x37, 0x3b, 0x69, 0x72, 0x71, 0x82, 0x89, 0x86, 0x89, 0x8b, 0x8d,
+ 0x7a, 0x78, 0x7f, 0x65, 0x65, 0x67, 0x66, 0x68, 0x65, 0x69, 0x6e, 0x6a,
+ 0x69, 0x6d, 0x70, 0x73, 0x76, 0x7b, 0x6f, 0x73, 0x75, 0x6d, 0x6f, 0x6e,
+ 0x6f, 0x70, 0x71, 0x70, 0x71, 0x73, 0x9b, 0xa1, 0xa1, 0xbf, 0xc8, 0xc8,
+ 0xc1, 0xca, 0xcf, 0xb2, 0xbd, 0xc5, 0xa4, 0xb0, 0xbe, 0xad, 0xb9, 0xc9,
+ 0xbb, 0xc7, 0xd1, 0xc3, 0xcd, 0xd8, 0xa7, 0xaf, 0xbc, 0x8f, 0x95, 0xa3,
+ 0x8e, 0x94, 0xa0, 0xac, 0xb4, 0xbf, 0xc0, 0xca, 0xd2, 0xbc, 0xc5, 0xcf,
+ 0x9c, 0xa3, 0xb4, 0x76, 0x7e, 0x8b, 0x87, 0x90, 0x9a, 0xad, 0xb6, 0xbf,
+ 0xba, 0xc4, 0xce, 0xbb, 0xc7, 0xd2, 0xba, 0xc8, 0xd3, 0xba, 0xc9, 0xd2,
+ 0xbc, 0xc9, 0xd6, 0xbd, 0xcb, 0xd8, 0xbb, 0xcb, 0xdb, 0xbb, 0xcb, 0xdb,
+ 0xb9, 0xc7, 0xd8, 0xb3, 0xbe, 0xcc, 0xa8, 0xaf, 0xbc, 0xa0, 0xa5, 0xb1,
+ 0x18, 0x1a, 0x19, 0x22, 0x24, 0x25, 0x19, 0x1d, 0x1e, 0x0f, 0x13, 0x16,
+ 0x0f, 0x13, 0x16, 0x0d, 0x11, 0x14, 0x10, 0x14, 0x17, 0x15, 0x19, 0x1c,
+ 0x1a, 0x1b, 0x1d, 0x19, 0x1a, 0x1c, 0x1a, 0x1b, 0x1b, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x19, 0x1a, 0x1a, 0x1b, 0x1d, 0x1c, 0x19, 0x1b, 0x1a,
+ 0x1a, 0x1b, 0x1d, 0x14, 0x14, 0x16, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0e, 0x0e, 0x10, 0x1b, 0x1b, 0x1d,
+ 0x1e, 0x20, 0x1f, 0x1d, 0x1f, 0x1e, 0x1c, 0x1d, 0x1f, 0x24, 0x25, 0x28,
+ 0x25, 0x26, 0x2a, 0x24, 0x25, 0x29, 0x20, 0x21, 0x25, 0x24, 0x25, 0x29,
+ 0x26, 0x27, 0x2c, 0x25, 0x26, 0x2a, 0x21, 0x25, 0x28, 0x21, 0x26, 0x2c,
+ 0x25, 0x28, 0x2f, 0x2a, 0x2d, 0x34, 0x1a, 0x1c, 0x1d, 0x08, 0x08, 0x06,
+ 0x09, 0x09, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x0c, 0x0d, 0x0d,
+ 0x2b, 0x2d, 0x30, 0x37, 0x3a, 0x41, 0x3c, 0x41, 0x47, 0x3d, 0x43, 0x49,
+ 0x3d, 0x42, 0x44, 0x3d, 0x41, 0x42, 0x2f, 0x33, 0x32, 0x22, 0x24, 0x21,
+ 0x1f, 0x21, 0x1e, 0x22, 0x22, 0x20, 0x18, 0x18, 0x16, 0x12, 0x12, 0x10,
+ 0x12, 0x13, 0x16, 0x15, 0x16, 0x1b, 0x35, 0x36, 0x3b, 0x7a, 0x7b, 0x81,
+ 0x4f, 0x50, 0x55, 0x1f, 0x20, 0x21, 0x29, 0x2b, 0x28, 0x3c, 0x3e, 0x38,
+ 0x41, 0x41, 0x3c, 0x47, 0x46, 0x41, 0x45, 0x45, 0x41, 0x33, 0x33, 0x31,
+ 0x18, 0x18, 0x17, 0x12, 0x12, 0x12, 0x10, 0x12, 0x11, 0x0d, 0x0f, 0x0e,
+ 0x10, 0x11, 0x10, 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12,
+ 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d,
+ 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x08, 0x0d, 0x0d, 0x0d,
+ 0x12, 0x12, 0x12, 0x13, 0x12, 0x13, 0x10, 0x10, 0x11, 0x0f, 0x0f, 0x0f,
+ 0x0c, 0x0c, 0x0a, 0x0f, 0x10, 0x0f, 0x27, 0x29, 0x2a, 0x27, 0x28, 0x2d,
+ 0x23, 0x24, 0x29, 0x1b, 0x1c, 0x20, 0x12, 0x13, 0x15, 0x1a, 0x1a, 0x1b,
+ 0x1b, 0x1c, 0x1b, 0x0a, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x0e, 0x0f, 0x0e, 0x0d, 0x0b, 0x11, 0x10, 0x0e,
+ 0x19, 0x18, 0x16, 0x22, 0x20, 0x21, 0x22, 0x20, 0x23, 0x1b, 0x19, 0x1b,
+ 0x15, 0x13, 0x14, 0x16, 0x15, 0x13, 0x1b, 0x1a, 0x18, 0x1c, 0x1a, 0x1b,
+ 0x1d, 0x1b, 0x1c, 0x18, 0x16, 0x17, 0x1c, 0x1a, 0x1b, 0x21, 0x20, 0x1e,
+ 0x1f, 0x1e, 0x1e, 0x24, 0x22, 0x23, 0x20, 0x1e, 0x21, 0x16, 0x14, 0x17,
+ 0x16, 0x15, 0x12, 0x2f, 0x26, 0x23, 0x40, 0x30, 0x32, 0x4f, 0x40, 0x45,
+ 0x67, 0x5d, 0x68, 0x8f, 0x8d, 0x9e, 0x85, 0x84, 0x97, 0x89, 0x86, 0x9b,
+ 0xb7, 0xb6, 0xc1, 0xd6, 0xd6, 0xd6, 0xea, 0xeb, 0xdc, 0xeb, 0xeb, 0xd3,
+ 0xe9, 0xe9, 0xcf, 0xe5, 0xe5, 0xcd, 0xe5, 0xe4, 0xd1, 0xe1, 0xdf, 0xce,
+ 0xda, 0xd7, 0xce, 0xdc, 0xd9, 0xd1, 0xd9, 0xd6, 0xcd, 0xdb, 0xd9, 0xcd,
+ 0xdd, 0xdb, 0xce, 0xdf, 0xde, 0xcf, 0xdb, 0xdc, 0xcb, 0xdd, 0xde, 0xcb,
+ 0xe1, 0xe3, 0xd7, 0xdd, 0xde, 0xd0, 0xdb, 0xdb, 0xcb, 0xdd, 0xdc, 0xca,
+ 0xdf, 0xdd, 0xcd, 0xde, 0xdb, 0xd4, 0xd4, 0xd2, 0xd1, 0xbb, 0xb9, 0xbe,
+ 0xa4, 0xac, 0xb5, 0xa0, 0xab, 0xb5, 0x9d, 0xa9, 0xb7, 0x9b, 0xa7, 0xb7,
+ 0x8f, 0x9a, 0xaa, 0x6a, 0x72, 0x81, 0x40, 0x42, 0x4e, 0x25, 0x25, 0x2e,
+ 0x1a, 0x1b, 0x1d, 0x14, 0x14, 0x15, 0x14, 0x14, 0x14, 0x14, 0x16, 0x15,
+ 0x11, 0x15, 0x15, 0x16, 0x18, 0x1a, 0x26, 0x24, 0x29, 0x2c, 0x26, 0x2d,
+ 0x55, 0x4e, 0x55, 0xa5, 0xa0, 0x9f, 0xa8, 0xa9, 0xb0, 0xb1, 0xb6, 0xca,
+ 0xaa, 0xb0, 0xc6, 0x97, 0x9c, 0xae, 0x65, 0x65, 0x67, 0x8f, 0x8b, 0x75,
+ 0xb5, 0xaf, 0x99, 0xbc, 0xb7, 0xa3, 0xbc, 0xb8, 0xa6, 0xbf, 0xbd, 0xac,
+ 0xc9, 0xca, 0xba, 0xd3, 0xd5, 0xc9, 0xd6, 0xd8, 0xd1, 0xde, 0xe0, 0xdf,
+ 0xe2, 0xe6, 0xe7, 0xdb, 0xdd, 0xdf, 0xc9, 0xc8, 0xc8, 0xbd, 0xbc, 0xb8,
+ 0xcc, 0xcc, 0xc4, 0xce, 0xcf, 0xc7, 0xd8, 0xdb, 0xd6, 0xdc, 0xe0, 0xde,
+ 0xe3, 0xea, 0xe3, 0xee, 0xf1, 0xec, 0xd7, 0xd5, 0xd1, 0xd1, 0xcf, 0xce,
+ 0xbe, 0xbf, 0xc3, 0x8f, 0x91, 0x9c, 0x73, 0x76, 0x89, 0x52, 0x54, 0x6b,
+ 0x42, 0x44, 0x55, 0x3f, 0x3f, 0x4a, 0x3c, 0x39, 0x40, 0x40, 0x3f, 0x44,
+ 0x44, 0x45, 0x49, 0x39, 0x3b, 0x3e, 0x3c, 0x3e, 0x3b, 0x60, 0x62, 0x59,
+ 0xad, 0xb3, 0xa2, 0xed, 0xf1, 0xe4, 0xea, 0xed, 0xe4, 0xc8, 0xc9, 0xc2,
+ 0xaf, 0xaf, 0xa7, 0xa4, 0xa5, 0x9c, 0xa2, 0xa3, 0x9f, 0x9f, 0x9e, 0x9f,
+ 0x9e, 0x9d, 0x99, 0x8b, 0x8b, 0x86, 0x89, 0x8a, 0x84, 0xa1, 0xa3, 0x9c,
+ 0xa4, 0xa6, 0x9f, 0xa0, 0xa2, 0x9d, 0x9b, 0x9d, 0x9a, 0x7e, 0x7e, 0x7e,
+ 0x92, 0x93, 0x95, 0x88, 0x8a, 0x89, 0x70, 0x72, 0x6f, 0x82, 0x84, 0x81,
+ 0x99, 0x9e, 0x9a, 0xa3, 0xa7, 0xa6, 0xa9, 0xad, 0xae, 0x6e, 0x72, 0x75,
+ 0x67, 0x6d, 0x6e, 0x65, 0x6a, 0x6b, 0x6f, 0x73, 0x74, 0x90, 0x94, 0x94,
+ 0x9c, 0xa0, 0x9f, 0xa2, 0xa6, 0xa5, 0xa0, 0xa5, 0xa3, 0x9c, 0xa2, 0xa2,
+ 0x93, 0x9b, 0x9e, 0x98, 0x9f, 0xa1, 0x94, 0x9c, 0x9e, 0x94, 0x9d, 0x9c,
+ 0x9a, 0xa1, 0xa1, 0x97, 0x9d, 0x9d, 0x9b, 0xa0, 0xa3, 0xa5, 0xaa, 0xad,
+ 0xa3, 0xaa, 0xaf, 0x7b, 0x81, 0x93, 0x3b, 0x43, 0x5b, 0x44, 0x50, 0x5e,
+ 0x70, 0x7d, 0x85, 0x7b, 0x89, 0x95, 0x60, 0x6d, 0x7e, 0x38, 0x45, 0x55,
+ 0x2f, 0x37, 0x48, 0x2b, 0x31, 0x41, 0x2a, 0x2d, 0x3a, 0x25, 0x2b, 0x2f,
+ 0x42, 0x4b, 0x48, 0x7a, 0x81, 0x7d, 0x94, 0x95, 0x97, 0x8d, 0x8c, 0x92,
+ 0x78, 0x77, 0x7d, 0x65, 0x64, 0x69, 0x67, 0x69, 0x69, 0x6e, 0x6f, 0x71,
+ 0x6e, 0x6f, 0x73, 0x70, 0x71, 0x76, 0x72, 0x73, 0x77, 0x71, 0x72, 0x74,
+ 0x6c, 0x72, 0x70, 0x9b, 0xa2, 0xa1, 0xbf, 0xc7, 0xc8, 0xbe, 0xc8, 0xcc,
+ 0xb7, 0xc1, 0xca, 0x8d, 0x97, 0xa1, 0x86, 0x92, 0x9e, 0x8e, 0x9a, 0xa7,
+ 0x9c, 0xa7, 0xac, 0xb6, 0xc1, 0xc7, 0xa5, 0xae, 0xb7, 0x97, 0x9f, 0xaa,
+ 0xb7, 0xc0, 0xcc, 0xba, 0xc4, 0xd0, 0xad, 0xb7, 0xc5, 0xa0, 0xac, 0xba,
+ 0x95, 0x9f, 0xaf, 0x84, 0x8d, 0x9c, 0x8b, 0x93, 0xa0, 0x9e, 0xa6, 0xb1,
+ 0x95, 0x9e, 0xa8, 0xad, 0xb7, 0xc0, 0xbd, 0xc7, 0xd0, 0xbd, 0xc9, 0xd1,
+ 0xbb, 0xc9, 0xd4, 0xbd, 0xcc, 0xd8, 0xbb, 0xcb, 0xd9, 0xb9, 0xca, 0xda,
+ 0xb9, 0xc9, 0xd9, 0xb6, 0xc4, 0xd4, 0xaf, 0xb8, 0xc8, 0x9f, 0xa6, 0xb8,
+ 0x32, 0x36, 0x37, 0x2b, 0x2e, 0x30, 0x15, 0x19, 0x1c, 0x0b, 0x10, 0x13,
+ 0x0e, 0x13, 0x17, 0x0f, 0x14, 0x18, 0x10, 0x15, 0x19, 0x14, 0x19, 0x1e,
+ 0x18, 0x19, 0x1b, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1c, 0x19, 0x19, 0x19,
+ 0x1a, 0x1a, 0x1a, 0x1a, 0x1c, 0x1b, 0x1b, 0x1d, 0x1b, 0x19, 0x1b, 0x1a,
+ 0x1b, 0x1c, 0x1e, 0x18, 0x19, 0x1b, 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x09, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0c, 0x17, 0x18, 0x1a,
+ 0x1d, 0x1f, 0x1e, 0x1c, 0x1e, 0x1d, 0x1b, 0x1c, 0x1e, 0x1e, 0x1f, 0x23,
+ 0x22, 0x23, 0x27, 0x23, 0x24, 0x29, 0x22, 0x23, 0x28, 0x24, 0x25, 0x2a,
+ 0x28, 0x28, 0x30, 0x25, 0x28, 0x2d, 0x22, 0x25, 0x2a, 0x24, 0x27, 0x2e,
+ 0x29, 0x2c, 0x33, 0x2b, 0x2d, 0x34, 0x21, 0x23, 0x24, 0x0a, 0x0a, 0x08,
+ 0x09, 0x09, 0x0b, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x06, 0x09, 0x0a, 0x09,
+ 0x26, 0x29, 0x2d, 0x37, 0x3c, 0x42, 0x3a, 0x41, 0x47, 0x34, 0x3d, 0x42,
+ 0x33, 0x38, 0x3f, 0x36, 0x3a, 0x40, 0x37, 0x3a, 0x3f, 0x2d, 0x31, 0x32,
+ 0x23, 0x26, 0x25, 0x27, 0x29, 0x26, 0x22, 0x22, 0x20, 0x19, 0x18, 0x14,
+ 0x12, 0x13, 0x14, 0x11, 0x12, 0x16, 0x2d, 0x2e, 0x35, 0x36, 0x36, 0x3e,
+ 0x18, 0x19, 0x1e, 0x26, 0x27, 0x29, 0x3e, 0x40, 0x3a, 0x46, 0x49, 0x40,
+ 0x46, 0x47, 0x41, 0x3f, 0x3f, 0x3b, 0x29, 0x29, 0x27, 0x16, 0x15, 0x16,
+ 0x0f, 0x0f, 0x11, 0x10, 0x10, 0x10, 0x10, 0x12, 0x0f, 0x0f, 0x11, 0x0f,
+ 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x12, 0x12, 0x12, 0x11, 0x11, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0e, 0x0e, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x0c, 0x0c, 0x0c,
+ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x0f,
+ 0x0b, 0x0b, 0x09, 0x0e, 0x0e, 0x0d, 0x23, 0x25, 0x26, 0x26, 0x27, 0x2b,
+ 0x22, 0x23, 0x28, 0x1a, 0x1b, 0x1f, 0x13, 0x13, 0x15, 0x1e, 0x1e, 0x1e,
+ 0x19, 0x1a, 0x19, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x11, 0x11, 0x11, 0x10, 0x0e, 0x0e, 0x0e, 0x0d, 0x0b, 0x10, 0x0f, 0x0d,
+ 0x19, 0x17, 0x16, 0x21, 0x1f, 0x20, 0x1f, 0x1d, 0x20, 0x1a, 0x18, 0x1b,
+ 0x17, 0x16, 0x14, 0x15, 0x14, 0x12, 0x14, 0x14, 0x12, 0x18, 0x16, 0x17,
+ 0x1d, 0x1b, 0x1c, 0x16, 0x14, 0x15, 0x24, 0x22, 0x23, 0x26, 0x24, 0x25,
+ 0x20, 0x1e, 0x1f, 0x1f, 0x1d, 0x1e, 0x1e, 0x1c, 0x1d, 0x17, 0x15, 0x17,
+ 0x17, 0x14, 0x13, 0x2d, 0x23, 0x22, 0x3c, 0x2e, 0x2d, 0x4c, 0x3d, 0x3f,
+ 0x5c, 0x52, 0x5c, 0xa1, 0x9e, 0xaf, 0xbd, 0xc0, 0xd5, 0xb5, 0xb8, 0xd1,
+ 0xbe, 0xc1, 0xd6, 0xb4, 0xb5, 0xc1, 0xc8, 0xc9, 0xc4, 0xe6, 0xe5, 0xd5,
+ 0xef, 0xed, 0xd8, 0xea, 0xe9, 0xd2, 0xe7, 0xe7, 0xcf, 0xdf, 0xe0, 0xc9,
+ 0xdf, 0xe0, 0xd3, 0xee, 0xee, 0xe2, 0xd8, 0xd8, 0xce, 0xe0, 0xe0, 0xd6,
+ 0xe0, 0xe0, 0xd6, 0xe3, 0xe3, 0xd6, 0xe0, 0xe1, 0xcf, 0xdd, 0xdc, 0xc9,
+ 0xdc, 0xde, 0xcc, 0xda, 0xdc, 0xc7, 0xdb, 0xda, 0xc6, 0xdd, 0xdc, 0xcb,
+ 0xe3, 0xe1, 0xd6, 0xdb, 0xdb, 0xd8, 0xa4, 0xa4, 0xac, 0x83, 0x86, 0x93,
+ 0x9d, 0xaa, 0xb3, 0x99, 0xa7, 0xb2, 0x98, 0xa6, 0xb5, 0x93, 0xa1, 0xb1,
+ 0x89, 0x93, 0xa4, 0x72, 0x7a, 0x89, 0x4d, 0x51, 0x5e, 0x20, 0x22, 0x2d,
+ 0x14, 0x16, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x13, 0x15, 0x14,
+ 0x11, 0x15, 0x16, 0x17, 0x19, 0x1b, 0x22, 0x1f, 0x23, 0x31, 0x29, 0x30,
+ 0x51, 0x45, 0x46, 0x7e, 0x78, 0x70, 0x8b, 0x8b, 0x85, 0xa2, 0xa4, 0xae,
+ 0x85, 0x86, 0x9b, 0x6d, 0x6d, 0x81, 0x74, 0x74, 0x72, 0xa4, 0xa2, 0x88,
+ 0xb8, 0xb3, 0x9c, 0xbd, 0xb8, 0xa6, 0xc0, 0xbd, 0xac, 0xc2, 0xc0, 0xb1,
+ 0xc3, 0xc3, 0xb5, 0xcd, 0xce, 0xc4, 0xd7, 0xd9, 0xd4, 0xe2, 0xe6, 0xe5,
+ 0xdb, 0xdc, 0xe0, 0xbd, 0xbe, 0xc0, 0xc6, 0xc6, 0xc6, 0xca, 0xca, 0xc4,
+ 0xcb, 0xcb, 0xc0, 0xc6, 0xc8, 0xbf, 0xdd, 0xdf, 0xdc, 0xd9, 0xdb, 0xdd,
+ 0xdd, 0xe3, 0xe1, 0xe9, 0xeb, 0xe8, 0xcd, 0xcc, 0xc8, 0xc5, 0xc4, 0xbf,
+ 0xd4, 0xd5, 0xd2, 0xb9, 0xb9, 0xbf, 0x95, 0x94, 0xa4, 0x66, 0x64, 0x7c,
+ 0x4f, 0x4b, 0x5f, 0x42, 0x3f, 0x4a, 0x3e, 0x39, 0x3c, 0x3f, 0x3c, 0x3b,
+ 0x48, 0x48, 0x48, 0x41, 0x41, 0x44, 0x35, 0x36, 0x36, 0x42, 0x42, 0x40,
+ 0x7c, 0x82, 0x78, 0xd3, 0xd9, 0xcd, 0xf3, 0xf6, 0xeb, 0xe2, 0xe5, 0xda,
+ 0xc7, 0xc9, 0xbe, 0xae, 0xaf, 0xa8, 0xa5, 0xa4, 0xa5, 0x9b, 0x99, 0x9d,
+ 0xa2, 0x9f, 0x99, 0xa1, 0xa0, 0x99, 0xa0, 0xa0, 0x98, 0xa3, 0xa4, 0x9c,
+ 0xa6, 0xa9, 0xa2, 0x9f, 0xa1, 0x9c, 0x9e, 0xa0, 0x9d, 0xa8, 0xaa, 0xaa,
+ 0x7e, 0x7e, 0x84, 0x60, 0x61, 0x64, 0x85, 0x87, 0x86, 0x76, 0x78, 0x75,
+ 0x6a, 0x6f, 0x69, 0x8b, 0x8f, 0x8c, 0xa5, 0xa9, 0xaa, 0x97, 0x9c, 0x9f,
+ 0x77, 0x7d, 0x7d, 0x78, 0x7d, 0x7e, 0x8d, 0x91, 0x90, 0x95, 0x99, 0x98,
+ 0x9d, 0xa1, 0xa0, 0x9d, 0xa1, 0xa0, 0xa1, 0xa7, 0xa7, 0x97, 0x9d, 0x9e,
+ 0x93, 0x98, 0x9c, 0x93, 0x98, 0x9c, 0x94, 0x99, 0x9c, 0x99, 0x9f, 0xa1,
+ 0x97, 0x9e, 0x9f, 0x94, 0x9b, 0x9d, 0x99, 0xa1, 0xa3, 0x9e, 0xa6, 0xa8,
+ 0x98, 0x9f, 0xa8, 0x61, 0x68, 0x7c, 0x41, 0x49, 0x60, 0x48, 0x55, 0x62,
+ 0x3d, 0x4b, 0x54, 0x58, 0x65, 0x73, 0x77, 0x87, 0x96, 0x6b, 0x7c, 0x87,
+ 0x50, 0x5a, 0x68, 0x35, 0x3c, 0x4c, 0x2a, 0x2f, 0x3d, 0x28, 0x30, 0x35,
+ 0x5b, 0x64, 0x63, 0x87, 0x8e, 0x8b, 0x9d, 0x9f, 0xa1, 0x8e, 0x8c, 0x91,
+ 0x79, 0x79, 0x7d, 0x6a, 0x6b, 0x6f, 0x6a, 0x6b, 0x6d, 0x6e, 0x6f, 0x70,
+ 0x73, 0x74, 0x76, 0x79, 0x7a, 0x7e, 0x70, 0x71, 0x75, 0x6c, 0x6d, 0x70,
+ 0x8f, 0x99, 0x96, 0xc5, 0xcf, 0xce, 0xbf, 0xca, 0xce, 0xbb, 0xc6, 0xce,
+ 0xbd, 0xc8, 0xd4, 0xb6, 0xc1, 0xcd, 0xbc, 0xc6, 0xd2, 0xb8, 0xc2, 0xce,
+ 0x95, 0x9f, 0xa6, 0x8e, 0x98, 0x9e, 0xb7, 0xc0, 0xc9, 0xba, 0xc3, 0xce,
+ 0xba, 0xc4, 0xcf, 0x9e, 0xa8, 0xb4, 0x8c, 0x98, 0xa4, 0x94, 0xa2, 0xae,
+ 0xa5, 0xb1, 0xc0, 0xb6, 0xbf, 0xd0, 0xb5, 0xbd, 0xcc, 0x8b, 0x93, 0xa0,
+ 0x7e, 0x87, 0x90, 0x86, 0x8f, 0x96, 0xa4, 0xad, 0xb4, 0xbb, 0xc4, 0xcb,
+ 0xbc, 0xcb, 0xd2, 0xbd, 0xcb, 0xd4, 0xba, 0xcb, 0xd5, 0xba, 0xcc, 0xd8,
+ 0xb9, 0xca, 0xd8, 0xb7, 0xc7, 0xd7, 0xb3, 0xc0, 0xd1, 0xa5, 0xb0, 0xc4,
+ 0x25, 0x2b, 0x2d, 0x30, 0x35, 0x38, 0x30, 0x35, 0x38, 0x19, 0x1e, 0x21,
+ 0x0c, 0x11, 0x15, 0x0c, 0x11, 0x15, 0x12, 0x17, 0x1c, 0x15, 0x1a, 0x1f,
+ 0x16, 0x17, 0x19, 0x17, 0x18, 0x1a, 0x1a, 0x1b, 0x1b, 0x1d, 0x1d, 0x1d,
+ 0x1d, 0x1d, 0x1d, 0x1c, 0x1e, 0x1d, 0x1b, 0x1d, 0x1c, 0x1e, 0x20, 0x1f,
+ 0x21, 0x22, 0x23, 0x1b, 0x1d, 0x1c, 0x0f, 0x11, 0x10, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x16, 0x17, 0x19,
+ 0x1a, 0x1c, 0x1b, 0x1d, 0x1f, 0x1e, 0x1e, 0x1f, 0x22, 0x1e, 0x1f, 0x23,
+ 0x20, 0x21, 0x25, 0x21, 0x22, 0x28, 0x23, 0x24, 0x29, 0x25, 0x26, 0x2b,
+ 0x20, 0x23, 0x2a, 0x22, 0x25, 0x2a, 0x22, 0x25, 0x2a, 0x25, 0x28, 0x2d,
+ 0x27, 0x29, 0x30, 0x2f, 0x30, 0x35, 0x26, 0x27, 0x2b, 0x0b, 0x0d, 0x0c,
+ 0x0a, 0x0a, 0x0c, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x08, 0x0a, 0x0c, 0x0b,
+ 0x1b, 0x1f, 0x22, 0x3a, 0x3f, 0x45, 0x37, 0x3e, 0x43, 0x2e, 0x37, 0x3a,
+ 0x2f, 0x33, 0x3d, 0x2d, 0x31, 0x3c, 0x2e, 0x32, 0x3b, 0x32, 0x36, 0x3c,
+ 0x2d, 0x30, 0x34, 0x27, 0x28, 0x2a, 0x2c, 0x2c, 0x2c, 0x26, 0x25, 0x23,
+ 0x1a, 0x1c, 0x19, 0x15, 0x16, 0x16, 0x15, 0x16, 0x19, 0x1a, 0x1b, 0x20,
+ 0x29, 0x2b, 0x2e, 0x32, 0x34, 0x32, 0x3a, 0x3c, 0x34, 0x40, 0x43, 0x38,
+ 0x3c, 0x3d, 0x37, 0x27, 0x28, 0x24, 0x17, 0x17, 0x17, 0x11, 0x11, 0x13,
+ 0x12, 0x12, 0x14, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x0e, 0x11, 0x13, 0x0f,
+ 0x12, 0x12, 0x12, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x15, 0x15, 0x15, 0x14, 0x14, 0x14,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e,
+ 0x0b, 0x0b, 0x09, 0x0e, 0x0f, 0x0e, 0x20, 0x22, 0x23, 0x27, 0x28, 0x2d,
+ 0x23, 0x24, 0x29, 0x1f, 0x20, 0x24, 0x16, 0x17, 0x19, 0x20, 0x20, 0x20,
+ 0x16, 0x16, 0x16, 0x0a, 0x0a, 0x0a, 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11,
+ 0x12, 0x12, 0x12, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0b, 0x10, 0x0f, 0x0d,
+ 0x19, 0x18, 0x16, 0x21, 0x20, 0x21, 0x21, 0x1f, 0x22, 0x18, 0x16, 0x17,
+ 0x17, 0x16, 0x14, 0x16, 0x15, 0x11, 0x17, 0x16, 0x14, 0x1b, 0x19, 0x1a,
+ 0x1c, 0x1a, 0x1b, 0x19, 0x17, 0x18, 0x28, 0x26, 0x27, 0x26, 0x24, 0x27,
+ 0x23, 0x21, 0x23, 0x1d, 0x1b, 0x1c, 0x1c, 0x1b, 0x1b, 0x16, 0x14, 0x15,
+ 0x18, 0x11, 0x17, 0x28, 0x1c, 0x20, 0x34, 0x26, 0x26, 0x42, 0x33, 0x36,
+ 0x4d, 0x41, 0x4b, 0x8f, 0x8a, 0x9a, 0xc4, 0xc7, 0xda, 0xb9, 0xbf, 0xd5,
+ 0xb8, 0xbb, 0xd1, 0x99, 0x9a, 0xac, 0x9a, 0x99, 0xa1, 0xc4, 0xc1, 0xc0,
+ 0xdd, 0xd8, 0xd2, 0xe9, 0xe6, 0xd7, 0xec, 0xeb, 0xd3, 0xe8, 0xe8, 0xcd,
+ 0xe6, 0xe7, 0xd5, 0xf3, 0xf3, 0xe5, 0xe0, 0xe1, 0xd6, 0xdf, 0xe0, 0xd7,
+ 0xe2, 0xe3, 0xda, 0xe2, 0xe4, 0xd8, 0xe2, 0xe3, 0xd5, 0xde, 0xdf, 0xd0,
+ 0xde, 0xdf, 0xcd, 0xdb, 0xdc, 0xc9, 0xdb, 0xdc, 0xcc, 0xdb, 0xdc, 0xd0,
+ 0xca, 0xca, 0xc6, 0xa2, 0xa4, 0xa7, 0x75, 0x78, 0x86, 0x81, 0x87, 0x99,
+ 0x9d, 0xab, 0xb6, 0x96, 0xa4, 0xb1, 0x93, 0x9f, 0xaf, 0x8c, 0x95, 0xa7,
+ 0x7b, 0x81, 0x94, 0x64, 0x67, 0x78, 0x4a, 0x4c, 0x59, 0x22, 0x22, 0x2d,
+ 0x15, 0x17, 0x17, 0x15, 0x15, 0x15, 0x13, 0x13, 0x15, 0x12, 0x14, 0x15,
+ 0x12, 0x16, 0x17, 0x18, 0x19, 0x1b, 0x23, 0x20, 0x23, 0x36, 0x2b, 0x31,
+ 0x59, 0x40, 0x49, 0x70, 0x5f, 0x5f, 0x79, 0x6d, 0x67, 0x77, 0x6d, 0x70,
+ 0x67, 0x5b, 0x6c, 0x64, 0x57, 0x67, 0x8c, 0x7f, 0x7a, 0xaf, 0xa4, 0x8d,
+ 0xba, 0xb6, 0xa0, 0xbc, 0xb9, 0xa6, 0xb7, 0xb4, 0xa3, 0xc0, 0xbe, 0xaf,
+ 0xc5, 0xc5, 0xb7, 0xca, 0xcc, 0xbf, 0xd0, 0xd3, 0xcc, 0xe1, 0xe2, 0xe2,
+ 0xdd, 0xde, 0xe2, 0xcd, 0xce, 0xd0, 0xd5, 0xd5, 0xd3, 0xc9, 0xc9, 0xc3,
+ 0xc8, 0xc8, 0xbd, 0xcf, 0xcf, 0xc7, 0xdd, 0xde, 0xda, 0xda, 0xda, 0xdd,
+ 0xdc, 0xe0, 0xe5, 0xd7, 0xd8, 0xdd, 0xbf, 0xbd, 0xbc, 0xb4, 0xb3, 0xab,
+ 0xc7, 0xc8, 0xbf, 0xc1, 0xc2, 0xbf, 0xb0, 0xaf, 0xba, 0x82, 0x7f, 0x94,
+ 0x4f, 0x4a, 0x60, 0x42, 0x3a, 0x47, 0x3e, 0x38, 0x38, 0x3c, 0x37, 0x32,
+ 0x45, 0x44, 0x41, 0x45, 0x45, 0x47, 0x37, 0x36, 0x3a, 0x35, 0x36, 0x37,
+ 0x4e, 0x53, 0x4f, 0x9e, 0xa3, 0x9c, 0xe2, 0xe8, 0xdc, 0xf0, 0xf4, 0xe6,
+ 0xde, 0xe2, 0xd6, 0xc8, 0xc9, 0xc2, 0xac, 0xaa, 0xab, 0xa0, 0x9e, 0xa1,
+ 0xa1, 0x9e, 0x96, 0xa8, 0xa5, 0x9c, 0xa8, 0xa8, 0xa0, 0xa7, 0xa8, 0xa0,
+ 0xa3, 0xa6, 0x9f, 0xa0, 0xa2, 0x9d, 0x9f, 0xa1, 0x9d, 0xae, 0xb0, 0xb0,
+ 0x7c, 0x7c, 0x82, 0x6f, 0x70, 0x74, 0x9e, 0x9f, 0xa1, 0xa7, 0xa9, 0xa7,
+ 0x8c, 0x91, 0x8d, 0x6a, 0x6f, 0x6c, 0x88, 0x8c, 0x8b, 0xa9, 0xae, 0xae,
+ 0xa4, 0xaa, 0xaa, 0x99, 0x9f, 0x9f, 0x97, 0x9b, 0x9a, 0x98, 0x9c, 0x9b,
+ 0x9b, 0x9f, 0x9e, 0x9d, 0xa1, 0xa0, 0xa0, 0xa5, 0xa5, 0x96, 0x9c, 0x9d,
+ 0x93, 0x98, 0x9c, 0x97, 0x9c, 0xa0, 0x9c, 0xa1, 0xa4, 0x92, 0x98, 0x9b,
+ 0x8f, 0x97, 0x99, 0x96, 0x9e, 0xa0, 0x9a, 0xa3, 0xa4, 0x9e, 0xa6, 0xa8,
+ 0x87, 0x8f, 0x9f, 0x56, 0x5f, 0x73, 0x6b, 0x76, 0x86, 0x7e, 0x8c, 0x95,
+ 0x4a, 0x58, 0x65, 0x2a, 0x38, 0x4e, 0x3b, 0x4b, 0x5b, 0x60, 0x72, 0x77,
+ 0x7f, 0x8e, 0x95, 0x69, 0x75, 0x7f, 0x40, 0x49, 0x58, 0x34, 0x3e, 0x4b,
+ 0x75, 0x7f, 0x86, 0x93, 0x9d, 0x9d, 0xa3, 0xa7, 0xa4, 0x8c, 0x8d, 0x89,
+ 0x72, 0x73, 0x74, 0x69, 0x6a, 0x6c, 0x6b, 0x6c, 0x6e, 0x72, 0x74, 0x73,
+ 0x74, 0x76, 0x75, 0x75, 0x77, 0x76, 0x6e, 0x70, 0x6f, 0x8b, 0x8d, 0x8f,
+ 0xb2, 0xbe, 0xbc, 0xbd, 0xc8, 0xc9, 0xbb, 0xc6, 0xcc, 0xbe, 0xca, 0xd4,
+ 0xc2, 0xcc, 0xd8, 0xc2, 0xcc, 0xd7, 0xbe, 0xc8, 0xd2, 0xbe, 0xc6, 0xd1,
+ 0x97, 0xa1, 0xab, 0x76, 0x80, 0x8a, 0xb2, 0xbc, 0xc7, 0xbf, 0xc9, 0xd5,
+ 0xbb, 0xc6, 0xd0, 0xb1, 0xbd, 0xc7, 0xb4, 0xc1, 0xca, 0xba, 0xc9, 0xcf,
+ 0xbc, 0xc9, 0xd4, 0xb7, 0xc2, 0xd1, 0x92, 0x9b, 0xac, 0x7f, 0x87, 0x96,
+ 0xa4, 0xac, 0xb6, 0x89, 0x92, 0x96, 0x83, 0x8c, 0x93, 0xae, 0xb7, 0xc0,
+ 0xb0, 0xbd, 0xc3, 0xb8, 0xc7, 0xce, 0xbb, 0xcb, 0xd2, 0xbb, 0xcc, 0xd3,
+ 0xb8, 0xc9, 0xd3, 0xb9, 0xc9, 0xd7, 0xb5, 0xc5, 0xd6, 0xae, 0xbb, 0xce,
+ 0x0f, 0x18, 0x1d, 0x19, 0x20, 0x26, 0x34, 0x39, 0x3d, 0x3c, 0x41, 0x44,
+ 0x1f, 0x23, 0x26, 0x0f, 0x13, 0x16, 0x10, 0x14, 0x18, 0x16, 0x19, 0x1e,
+ 0x18, 0x1a, 0x19, 0x1a, 0x1c, 0x1b, 0x19, 0x1b, 0x1a, 0x1b, 0x1b, 0x1b,
+ 0x1f, 0x1f, 0x1f, 0x1d, 0x1f, 0x1e, 0x1d, 0x1e, 0x20, 0x1d, 0x1e, 0x20,
+ 0x1c, 0x20, 0x20, 0x1b, 0x1d, 0x1c, 0x10, 0x13, 0x11, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0c, 0x0b, 0x14, 0x15, 0x16,
+ 0x1a, 0x1b, 0x1b, 0x1b, 0x1c, 0x1e, 0x21, 0x22, 0x26, 0x22, 0x23, 0x28,
+ 0x1e, 0x1f, 0x24, 0x27, 0x28, 0x2d, 0x25, 0x26, 0x2b, 0x23, 0x24, 0x28,
+ 0x23, 0x26, 0x2c, 0x23, 0x26, 0x2b, 0x24, 0x28, 0x2b, 0x26, 0x29, 0x2c,
+ 0x29, 0x2a, 0x2f, 0x2e, 0x2f, 0x34, 0x29, 0x2a, 0x2e, 0x12, 0x14, 0x13,
+ 0x07, 0x07, 0x09, 0x07, 0x07, 0x07, 0x09, 0x09, 0x07, 0x09, 0x0a, 0x09,
+ 0x1b, 0x1c, 0x20, 0x38, 0x3b, 0x42, 0x31, 0x36, 0x3b, 0x2b, 0x32, 0x35,
+ 0x2e, 0x30, 0x3c, 0x2a, 0x2d, 0x39, 0x28, 0x2c, 0x37, 0x2c, 0x30, 0x39,
+ 0x32, 0x37, 0x3d, 0x2c, 0x30, 0x33, 0x32, 0x34, 0x35, 0x35, 0x35, 0x35,
+ 0x2b, 0x2c, 0x26, 0x1e, 0x1f, 0x1a, 0x22, 0x22, 0x20, 0x2d, 0x2d, 0x2d,
+ 0x37, 0x39, 0x38, 0x36, 0x39, 0x34, 0x3c, 0x3f, 0x37, 0x39, 0x3c, 0x34,
+ 0x22, 0x24, 0x20, 0x14, 0x14, 0x12, 0x14, 0x14, 0x14, 0x13, 0x13, 0x15,
+ 0x12, 0x12, 0x14, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x0e, 0x0f, 0x10, 0x0b,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x10, 0x10, 0x10, 0x0b, 0x0b, 0x0b, 0x06, 0x06, 0x06,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x09, 0x0b, 0x0c, 0x0b, 0x1b, 0x1c, 0x1e, 0x2a, 0x2b, 0x30,
+ 0x28, 0x29, 0x2e, 0x24, 0x25, 0x29, 0x1a, 0x1b, 0x1d, 0x1e, 0x1e, 0x1e,
+ 0x17, 0x17, 0x17, 0x0b, 0x0b, 0x0b, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12,
+ 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0c, 0x12, 0x11, 0x0f,
+ 0x18, 0x18, 0x18, 0x24, 0x24, 0x24, 0x21, 0x1f, 0x22, 0x19, 0x18, 0x18,
+ 0x16, 0x15, 0x11, 0x1a, 0x19, 0x14, 0x1c, 0x18, 0x18, 0x1d, 0x18, 0x1c,
+ 0x1a, 0x18, 0x1a, 0x19, 0x17, 0x1a, 0x26, 0x24, 0x27, 0x24, 0x22, 0x25,
+ 0x27, 0x25, 0x28, 0x21, 0x1f, 0x20, 0x1b, 0x19, 0x1a, 0x16, 0x14, 0x15,
+ 0x14, 0x0f, 0x16, 0x24, 0x1b, 0x20, 0x34, 0x28, 0x29, 0x3b, 0x2a, 0x2f,
+ 0x49, 0x39, 0x44, 0x80, 0x77, 0x86, 0xb2, 0xb3, 0xc4, 0xaf, 0xb6, 0xc8,
+ 0xac, 0xae, 0xc1, 0x85, 0x84, 0x94, 0x98, 0x94, 0xa2, 0xc3, 0xbd, 0xc7,
+ 0xbe, 0xb5, 0xba, 0xc2, 0xb8, 0xb5, 0xd9, 0xd2, 0xc4, 0xe7, 0xe1, 0xcb,
+ 0xec, 0xea, 0xd2, 0xea, 0xea, 0xd2, 0xe8, 0xe9, 0xd4, 0xe4, 0xe6, 0xd1,
+ 0xe5, 0xe7, 0xd3, 0xe5, 0xe7, 0xd3, 0xe6, 0xe5, 0xd2, 0xe8, 0xe7, 0xd4,
+ 0xe3, 0xe1, 0xd2, 0xdc, 0xd9, 0xcf, 0xd0, 0xd0, 0xca, 0xbf, 0xc1, 0xc0,
+ 0xa6, 0xab, 0xaf, 0x91, 0x96, 0xa1, 0x8e, 0x95, 0xa5, 0x99, 0xa0, 0xb2,
+ 0x98, 0xa4, 0xb2, 0x94, 0xa0, 0xae, 0x8d, 0x97, 0xa7, 0x80, 0x84, 0x97,
+ 0x6b, 0x6e, 0x7f, 0x55, 0x57, 0x64, 0x3a, 0x3a, 0x44, 0x1f, 0x1e, 0x26,
+ 0x16, 0x16, 0x17, 0x15, 0x15, 0x17, 0x14, 0x14, 0x16, 0x12, 0x13, 0x15,
+ 0x13, 0x15, 0x17, 0x19, 0x19, 0x1b, 0x2b, 0x25, 0x27, 0x3c, 0x2f, 0x34,
+ 0x6c, 0x57, 0x69, 0x7c, 0x6d, 0x7e, 0x6c, 0x62, 0x6a, 0x7f, 0x78, 0x80,
+ 0x79, 0x6e, 0x80, 0x6a, 0x5d, 0x66, 0x92, 0x86, 0x77, 0xb3, 0xaa, 0x8f,
+ 0xbb, 0xb8, 0xa3, 0xba, 0xb9, 0xa6, 0xbc, 0xba, 0xa9, 0xc7, 0xc6, 0xb6,
+ 0xc7, 0xc7, 0xb7, 0xd3, 0xd4, 0xc5, 0xdd, 0xde, 0xd5, 0xd9, 0xda, 0xd6,
+ 0xdc, 0xde, 0xdd, 0xdd, 0xdd, 0xdd, 0xd4, 0xd5, 0xd2, 0xc2, 0xc2, 0xbc,
+ 0xc9, 0xc9, 0xbf, 0xdb, 0xdb, 0xd1, 0xd5, 0xd4, 0xcd, 0xd3, 0xd2, 0xd1,
+ 0xd3, 0xd4, 0xd7, 0xbc, 0xbb, 0xc0, 0xb5, 0xb1, 0xb1, 0xb3, 0xb1, 0xa9,
+ 0xb5, 0xb6, 0xa8, 0xc0, 0xc1, 0xb6, 0xc9, 0xc9, 0xcd, 0x98, 0x94, 0xa4,
+ 0x51, 0x49, 0x60, 0x3d, 0x35, 0x42, 0x40, 0x37, 0x38, 0x3c, 0x37, 0x32,
+ 0x3e, 0x3c, 0x38, 0x47, 0x47, 0x49, 0x3a, 0x39, 0x3f, 0x34, 0x33, 0x38,
+ 0x37, 0x3a, 0x3b, 0x5b, 0x60, 0x5a, 0xa4, 0xaa, 0x9e, 0xdb, 0xe1, 0xd4,
+ 0xee, 0xf1, 0xe8, 0xe1, 0xe3, 0xdd, 0xca, 0xcb, 0xc6, 0xb2, 0xb1, 0xad,
+ 0xa3, 0xa0, 0x97, 0xa4, 0xa4, 0x9c, 0xab, 0xac, 0xa5, 0xa0, 0xa1, 0x9b,
+ 0xa1, 0xa3, 0x9e, 0xa1, 0xa3, 0x9e, 0xa3, 0xa5, 0xa1, 0xab, 0xad, 0xaa,
+ 0xa5, 0xa6, 0xa9, 0x64, 0x65, 0x67, 0x70, 0x71, 0x73, 0x9d, 0x9f, 0x9f,
+ 0xb4, 0xb8, 0xb7, 0x7f, 0x84, 0x81, 0x75, 0x7a, 0x76, 0xa3, 0xa8, 0xa4,
+ 0x99, 0x9f, 0x9f, 0x9c, 0xa0, 0x9f, 0x9a, 0x9e, 0x9d, 0x96, 0x9a, 0x99,
+ 0x98, 0x9c, 0x9b, 0x9f, 0xa3, 0xa3, 0x9a, 0x9e, 0x9e, 0x94, 0x9a, 0x9a,
+ 0x97, 0x9d, 0x9f, 0x9b, 0xa0, 0xa2, 0x98, 0x9d, 0xa0, 0x91, 0x96, 0x99,
+ 0x96, 0x9e, 0xa0, 0x9b, 0xa3, 0xa5, 0x99, 0xa1, 0xa4, 0x97, 0x9f, 0xa3,
+ 0x6a, 0x75, 0x87, 0x6b, 0x78, 0x8b, 0x69, 0x77, 0x84, 0x62, 0x73, 0x7b,
+ 0x6d, 0x7c, 0x8d, 0x32, 0x40, 0x5b, 0x27, 0x37, 0x49, 0x30, 0x42, 0x46,
+ 0x51, 0x63, 0x67, 0x73, 0x82, 0x8b, 0x6f, 0x7b, 0x8b, 0x54, 0x61, 0x71,
+ 0x79, 0x87, 0x91, 0xa1, 0xae, 0xaf, 0xaa, 0xb0, 0xac, 0x98, 0x99, 0x94,
+ 0x7a, 0x7c, 0x7b, 0x6b, 0x6b, 0x6e, 0x6b, 0x6a, 0x6f, 0x6c, 0x6d, 0x6f,
+ 0x6b, 0x6d, 0x6a, 0x69, 0x6e, 0x67, 0x85, 0x8a, 0x86, 0xb1, 0xb6, 0xb7,
+ 0xb9, 0xc4, 0xc7, 0xb7, 0xc2, 0xc6, 0xa4, 0xaf, 0xb6, 0x9a, 0xa4, 0xae,
+ 0x96, 0xa0, 0xaa, 0x97, 0xa0, 0xaa, 0x92, 0x9b, 0xa4, 0x88, 0x90, 0x9a,
+ 0x82, 0x8c, 0x98, 0x9b, 0xa5, 0xb1, 0xb6, 0xc0, 0xcc, 0xba, 0xc4, 0xd0,
+ 0xb1, 0xbb, 0xc5, 0xb0, 0xbb, 0xc4, 0xb9, 0xc4, 0xcc, 0xbc, 0xc9, 0xcf,
+ 0xbb, 0xc8, 0xcf, 0x99, 0xa5, 0xb1, 0x97, 0xa0, 0xb1, 0xa2, 0xab, 0xba,
+ 0x85, 0x8e, 0x97, 0x83, 0x8c, 0x91, 0xa3, 0xac, 0xb5, 0x9c, 0xa4, 0xaf,
+ 0x8a, 0x94, 0x9d, 0xb5, 0xc1, 0xc9, 0xbd, 0xca, 0xd2, 0xba, 0xc9, 0xd0,
+ 0xb9, 0xca, 0xd2, 0xbc, 0xcc, 0xd9, 0xb9, 0xc9, 0xd8, 0xb2, 0xc2, 0xd2,
+ 0x12, 0x1c, 0x25, 0x1d, 0x26, 0x2d, 0x39, 0x3f, 0x45, 0x54, 0x59, 0x5c,
+ 0x4d, 0x51, 0x52, 0x2a, 0x2b, 0x2d, 0x12, 0x13, 0x15, 0x18, 0x19, 0x1a,
+ 0x19, 0x1b, 0x18, 0x19, 0x1c, 0x18, 0x1b, 0x1d, 0x1a, 0x1a, 0x1b, 0x19,
+ 0x1c, 0x1c, 0x1c, 0x1e, 0x1f, 0x21, 0x1e, 0x1f, 0x23, 0x1b, 0x1c, 0x20,
+ 0x18, 0x1c, 0x1b, 0x1c, 0x1e, 0x1d, 0x14, 0x16, 0x15, 0x09, 0x09, 0x07,
+ 0x0a, 0x0a, 0x08, 0x0a, 0x0a, 0x0a, 0x0f, 0x11, 0x10, 0x16, 0x19, 0x18,
+ 0x19, 0x1a, 0x1c, 0x1a, 0x1b, 0x1f, 0x1e, 0x1e, 0x24, 0x1e, 0x1f, 0x26,
+ 0x1d, 0x1e, 0x25, 0x30, 0x31, 0x37, 0x2c, 0x2d, 0x31, 0x21, 0x22, 0x25,
+ 0x23, 0x26, 0x2b, 0x24, 0x28, 0x2b, 0x25, 0x29, 0x2a, 0x27, 0x29, 0x2c,
+ 0x29, 0x2a, 0x2f, 0x2a, 0x2a, 0x2f, 0x2c, 0x2d, 0x31, 0x15, 0x16, 0x18,
+ 0x06, 0x07, 0x09, 0x07, 0x07, 0x07, 0x08, 0x08, 0x05, 0x08, 0x09, 0x09,
+ 0x19, 0x19, 0x1e, 0x3a, 0x3c, 0x41, 0x2d, 0x30, 0x36, 0x2a, 0x2e, 0x33,
+ 0x2b, 0x2c, 0x34, 0x2b, 0x2d, 0x36, 0x27, 0x2c, 0x34, 0x25, 0x2b, 0x31,
+ 0x2a, 0x31, 0x36, 0x2f, 0x34, 0x38, 0x33, 0x36, 0x37, 0x37, 0x38, 0x38,
+ 0x38, 0x39, 0x31, 0x31, 0x32, 0x2b, 0x35, 0x36, 0x30, 0x3b, 0x3c, 0x37,
+ 0x3f, 0x40, 0x3c, 0x3d, 0x3e, 0x3b, 0x31, 0x31, 0x2f, 0x1f, 0x20, 0x1e,
+ 0x14, 0x16, 0x15, 0x14, 0x16, 0x15, 0x12, 0x14, 0x13, 0x12, 0x14, 0x13,
+ 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0d,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x0b, 0x0b, 0x0b, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c,
+ 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x08, 0x17, 0x19, 0x1a, 0x2c, 0x2d, 0x32,
+ 0x2b, 0x2c, 0x31, 0x2a, 0x2b, 0x2f, 0x1d, 0x1e, 0x20, 0x18, 0x18, 0x18,
+ 0x15, 0x15, 0x15, 0x0c, 0x0c, 0x0c, 0x11, 0x11, 0x11, 0x0d, 0x0d, 0x0d,
+ 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0b, 0x12, 0x12, 0x10,
+ 0x1a, 0x1a, 0x1a, 0x24, 0x24, 0x24, 0x1f, 0x1f, 0x1f, 0x1a, 0x19, 0x17,
+ 0x17, 0x16, 0x12, 0x1a, 0x17, 0x13, 0x1c, 0x18, 0x18, 0x1e, 0x19, 0x1d,
+ 0x1a, 0x18, 0x1a, 0x16, 0x14, 0x17, 0x21, 0x1f, 0x22, 0x21, 0x1f, 0x22,
+ 0x23, 0x21, 0x24, 0x1e, 0x1c, 0x1f, 0x1a, 0x18, 0x19, 0x13, 0x12, 0x11,
+ 0x10, 0x10, 0x12, 0x20, 0x1d, 0x1e, 0x32, 0x27, 0x29, 0x37, 0x27, 0x2d,
+ 0x48, 0x37, 0x43, 0x70, 0x65, 0x77, 0xa6, 0xa8, 0xb9, 0xa0, 0xa9, 0xb8,
+ 0x94, 0x92, 0xa5, 0x7d, 0x7a, 0x8b, 0x8f, 0x8b, 0x99, 0xaf, 0xaa, 0xb5,
+ 0xa4, 0x9b, 0xa4, 0x83, 0x76, 0x7d, 0x84, 0x73, 0x73, 0x9f, 0x8e, 0x88,
+ 0xb5, 0xac, 0x9e, 0xc9, 0xc0, 0xb1, 0xd1, 0xcc, 0xba, 0xd6, 0xd4, 0xc0,
+ 0xde, 0xdb, 0xc9, 0xde, 0xdb, 0xc9, 0xdb, 0xd5, 0xc5, 0xcf, 0xc9, 0xba,
+ 0xb5, 0xae, 0xa9, 0xb5, 0xb0, 0xb0, 0xad, 0xae, 0xb4, 0xa5, 0xab, 0xb4,
+ 0xa1, 0xab, 0xb8, 0xa2, 0xac, 0xbc, 0xa1, 0xaa, 0xb9, 0x9c, 0xa5, 0xb4,
+ 0x95, 0xa1, 0xaf, 0x8d, 0x96, 0xa5, 0x80, 0x88, 0x97, 0x70, 0x73, 0x83,
+ 0x5d, 0x5e, 0x6b, 0x47, 0x47, 0x51, 0x2d, 0x2e, 0x33, 0x1a, 0x19, 0x1e,
+ 0x13, 0x13, 0x15, 0x12, 0x12, 0x15, 0x12, 0x13, 0x16, 0x11, 0x12, 0x15,
+ 0x14, 0x15, 0x17, 0x1b, 0x1b, 0x1b, 0x30, 0x28, 0x28, 0x3c, 0x2e, 0x2f,
+ 0x7d, 0x79, 0x83, 0xa8, 0xa8, 0xbc, 0x7c, 0x80, 0x93, 0x9f, 0xa1, 0xb6,
+ 0x6f, 0x6b, 0x89, 0x5d, 0x56, 0x63, 0x89, 0x87, 0x77, 0xae, 0xb0, 0x95,
+ 0xb8, 0xb7, 0xa3, 0xba, 0xb9, 0xa7, 0xc8, 0xc7, 0xb5, 0xc4, 0xc3, 0xb1,
+ 0xc9, 0xc8, 0xb6, 0xd0, 0xcf, 0xbf, 0xda, 0xd7, 0xcd, 0xcf, 0xcc, 0xc6,
+ 0xcc, 0xcc, 0xc7, 0xd0, 0xd0, 0xcb, 0xc6, 0xc6, 0xc2, 0xbb, 0xba, 0xb4,
+ 0xc7, 0xc5, 0xbc, 0xce, 0xcb, 0xc2, 0xce, 0xcb, 0xc2, 0xbe, 0xbb, 0xb4,
+ 0xba, 0xbb, 0xb5, 0xb8, 0xb6, 0xb3, 0xb6, 0xb3, 0xae, 0xb4, 0xb2, 0xa6,
+ 0xb2, 0xb3, 0xa0, 0xbf, 0xc2, 0xb2, 0xca, 0xca, 0xc9, 0x9e, 0x9a, 0xa7,
+ 0x54, 0x4f, 0x65, 0x3e, 0x38, 0x45, 0x3a, 0x34, 0x36, 0x37, 0x33, 0x2f,
+ 0x38, 0x36, 0x35, 0x44, 0x44, 0x47, 0x40, 0x3f, 0x44, 0x33, 0x32, 0x37,
+ 0x33, 0x34, 0x39, 0x3a, 0x3e, 0x3d, 0x5c, 0x62, 0x58, 0x9c, 0xa2, 0x97,
+ 0xdb, 0xe1, 0xd7, 0xec, 0xef, 0xe8, 0xe5, 0xe6, 0xde, 0xd0, 0xd2, 0xc5,
+ 0xb9, 0xb9, 0xb0, 0xaa, 0xab, 0xa4, 0xa7, 0xa8, 0xa2, 0x9d, 0x9f, 0x99,
+ 0xa0, 0xa2, 0x9d, 0x9f, 0xa1, 0x9c, 0x9b, 0x9e, 0x99, 0x9e, 0xa0, 0x9b,
+ 0xb2, 0xb4, 0xb1, 0x9e, 0xa0, 0x9f, 0x67, 0x68, 0x6a, 0x6e, 0x6f, 0x71,
+ 0x7c, 0x80, 0x81, 0x6c, 0x70, 0x6f, 0x7f, 0x84, 0x7e, 0x9d, 0xa2, 0x9b,
+ 0x9f, 0xa3, 0xa2, 0x9c, 0xa0, 0x9f, 0x9d, 0xa0, 0x9f, 0x99, 0x9b, 0x9a,
+ 0x9b, 0x9d, 0x9c, 0x9f, 0xa3, 0xa4, 0x97, 0x9b, 0x9c, 0x98, 0x9c, 0x9f,
+ 0x97, 0x9d, 0x9d, 0x98, 0x9e, 0x9d, 0x95, 0x9b, 0x9b, 0x95, 0x9b, 0x9b,
+ 0x99, 0xa1, 0xa3, 0x95, 0x9d, 0x9f, 0x94, 0x9c, 0x9f, 0x81, 0x89, 0x8e,
+ 0x63, 0x73, 0x7f, 0x59, 0x6a, 0x7d, 0x3b, 0x4c, 0x5e, 0x31, 0x43, 0x4f,
+ 0x6e, 0x7e, 0x8d, 0x58, 0x67, 0x7e, 0x36, 0x44, 0x59, 0x2f, 0x3d, 0x4a,
+ 0x26, 0x37, 0x41, 0x3a, 0x48, 0x55, 0x62, 0x6f, 0x7f, 0x67, 0x75, 0x80,
+ 0x7f, 0x8e, 0x93, 0xad, 0xba, 0xba, 0xb1, 0xb5, 0xb6, 0xa9, 0xa7, 0xa9,
+ 0x8c, 0x8c, 0x8e, 0x74, 0x73, 0x78, 0x73, 0x72, 0x79, 0x64, 0x65, 0x69,
+ 0x63, 0x66, 0x63, 0x7b, 0x80, 0x7c, 0xaa, 0xb3, 0xb0, 0xb6, 0xc0, 0xc1,
+ 0xbb, 0xc3, 0xcc, 0xbb, 0xc4, 0xcd, 0xb3, 0xbc, 0xc5, 0x94, 0x9d, 0xa6,
+ 0x7f, 0x88, 0x8f, 0x96, 0x9f, 0xa6, 0xa9, 0xb1, 0xb9, 0xab, 0xb3, 0xbb,
+ 0xb4, 0xbe, 0xc8, 0xbe, 0xc8, 0xd2, 0xbc, 0xc5, 0xd0, 0xa5, 0xaf, 0xbb,
+ 0x85, 0x8f, 0x9a, 0x8c, 0x96, 0xa0, 0x96, 0x9e, 0xa9, 0xac, 0xb5, 0xbe,
+ 0xb6, 0xc5, 0xc6, 0xaa, 0xb7, 0xc0, 0xb9, 0xc2, 0xd3, 0xb5, 0xbe, 0xcd,
+ 0x83, 0x8d, 0x96, 0xa0, 0xab, 0xb1, 0xc0, 0xca, 0xd4, 0x96, 0x9f, 0xae,
+ 0x85, 0x8d, 0x9a, 0xaf, 0xb7, 0xc4, 0xa4, 0xae, 0xb9, 0xa4, 0xb1, 0xb9,
+ 0xb5, 0xc3, 0xcc, 0xbe, 0xcc, 0xd7, 0xba, 0xc9, 0xd8, 0xb2, 0xc2, 0xd2,
+ 0x16, 0x23, 0x2c, 0x36, 0x40, 0x49, 0x4f, 0x56, 0x5b, 0x4c, 0x4f, 0x53,
+ 0x5f, 0x60, 0x62, 0x55, 0x57, 0x56, 0x2f, 0x31, 0x30, 0x1b, 0x1d, 0x1b,
+ 0x17, 0x19, 0x17, 0x1a, 0x1c, 0x19, 0x1c, 0x1e, 0x1b, 0x1d, 0x1d, 0x1b,
+ 0x1c, 0x1c, 0x1c, 0x1c, 0x1d, 0x1f, 0x1c, 0x1d, 0x21, 0x1c, 0x1d, 0x22,
+ 0x1b, 0x1e, 0x1e, 0x1b, 0x1e, 0x1d, 0x15, 0x17, 0x16, 0x0c, 0x0c, 0x0a,
+ 0x0d, 0x0d, 0x0b, 0x0e, 0x0e, 0x0e, 0x0e, 0x10, 0x0f, 0x16, 0x18, 0x17,
+ 0x1b, 0x1c, 0x1e, 0x19, 0x1a, 0x1e, 0x1b, 0x1c, 0x20, 0x1e, 0x1f, 0x26,
+ 0x21, 0x22, 0x29, 0x25, 0x26, 0x2c, 0x26, 0x26, 0x2a, 0x22, 0x23, 0x26,
+ 0x22, 0x25, 0x29, 0x23, 0x27, 0x29, 0x23, 0x27, 0x26, 0x27, 0x29, 0x2a,
+ 0x28, 0x29, 0x2f, 0x2c, 0x2c, 0x31, 0x2f, 0x30, 0x34, 0x12, 0x16, 0x17,
+ 0x04, 0x06, 0x07, 0x08, 0x09, 0x08, 0x09, 0x09, 0x07, 0x09, 0x09, 0x09,
+ 0x14, 0x14, 0x18, 0x33, 0x33, 0x38, 0x2a, 0x2b, 0x32, 0x28, 0x2c, 0x31,
+ 0x2b, 0x2c, 0x31, 0x28, 0x2b, 0x30, 0x26, 0x2b, 0x2f, 0x23, 0x2b, 0x2e,
+ 0x22, 0x2a, 0x2d, 0x27, 0x2c, 0x30, 0x30, 0x36, 0x37, 0x37, 0x39, 0x39,
+ 0x3c, 0x3c, 0x35, 0x3f, 0x3f, 0x37, 0x3b, 0x3b, 0x33, 0x3a, 0x3b, 0x35,
+ 0x40, 0x41, 0x3c, 0x31, 0x31, 0x2f, 0x1a, 0x1a, 0x1c, 0x16, 0x16, 0x17,
+ 0x14, 0x15, 0x17, 0x13, 0x14, 0x16, 0x14, 0x16, 0x15, 0x12, 0x14, 0x12,
+ 0x12, 0x14, 0x11, 0x12, 0x13, 0x12, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11,
+ 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x0c, 0x0c, 0x0c, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0d,
+ 0x0b, 0x0b, 0x09, 0x0a, 0x0a, 0x09, 0x16, 0x17, 0x19, 0x2e, 0x2f, 0x34,
+ 0x2d, 0x2e, 0x33, 0x2c, 0x2d, 0x31, 0x21, 0x22, 0x25, 0x13, 0x13, 0x14,
+ 0x12, 0x12, 0x12, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0c, 0x13, 0x13, 0x11,
+ 0x19, 0x1a, 0x1a, 0x1d, 0x1d, 0x1d, 0x24, 0x24, 0x24, 0x23, 0x22, 0x20,
+ 0x19, 0x18, 0x14, 0x1a, 0x15, 0x13, 0x1d, 0x19, 0x18, 0x1f, 0x1b, 0x1f,
+ 0x1e, 0x1c, 0x1d, 0x18, 0x16, 0x19, 0x1d, 0x1b, 0x1e, 0x23, 0x21, 0x26,
+ 0x21, 0x1f, 0x21, 0x1c, 0x19, 0x1c, 0x16, 0x14, 0x15, 0x10, 0x0f, 0x0d,
+ 0x0e, 0x12, 0x0f, 0x1c, 0x1d, 0x19, 0x26, 0x20, 0x1e, 0x2d, 0x20, 0x26,
+ 0x4d, 0x3d, 0x4b, 0x52, 0x47, 0x5a, 0x86, 0x86, 0x98, 0xa9, 0xaf, 0xc1,
+ 0x97, 0x90, 0xa6, 0x89, 0x84, 0x95, 0x75, 0x72, 0x7d, 0x78, 0x73, 0x7a,
+ 0x70, 0x68, 0x70, 0x6b, 0x5c, 0x65, 0x69, 0x56, 0x5e, 0x67, 0x50, 0x58,
+ 0x62, 0x4d, 0x5b, 0x63, 0x51, 0x5e, 0x6d, 0x5d, 0x66, 0x73, 0x67, 0x6b,
+ 0x76, 0x6c, 0x6f, 0x79, 0x6e, 0x71, 0x73, 0x66, 0x6c, 0x68, 0x5b, 0x61,
+ 0x53, 0x48, 0x4c, 0x89, 0x83, 0x8b, 0xa8, 0xaa, 0xb7, 0xa2, 0xaa, 0xbb,
+ 0x9e, 0xab, 0xbe, 0x9c, 0xa9, 0xbb, 0x99, 0xa5, 0xb4, 0x98, 0xa2, 0xaf,
+ 0x8e, 0x9a, 0xa8, 0x7f, 0x88, 0x97, 0x70, 0x75, 0x86, 0x5d, 0x5f, 0x6f,
+ 0x4b, 0x4c, 0x58, 0x38, 0x38, 0x40, 0x28, 0x29, 0x2d, 0x17, 0x18, 0x1b,
+ 0x12, 0x12, 0x15, 0x11, 0x11, 0x15, 0x11, 0x12, 0x16, 0x13, 0x14, 0x17,
+ 0x14, 0x16, 0x18, 0x1c, 0x1a, 0x1a, 0x2c, 0x25, 0x23, 0x3c, 0x2e, 0x2d,
+ 0x64, 0x63, 0x5f, 0xa7, 0xab, 0xba, 0x92, 0x99, 0xb1, 0x86, 0x87, 0xa8,
+ 0x57, 0x50, 0x7c, 0x5b, 0x52, 0x6a, 0x87, 0x82, 0x7d, 0xb3, 0xb1, 0xa2,
+ 0xb8, 0xb9, 0xa5, 0xb9, 0xba, 0xa7, 0xc0, 0xbf, 0xae, 0xc3, 0xc2, 0xb0,
+ 0xc6, 0xc5, 0xb1, 0xd0, 0xce, 0xbd, 0xcf, 0xcd, 0xc0, 0xca, 0xc7, 0xbe,
+ 0xc4, 0xc3, 0xbc, 0xc2, 0xc1, 0xbc, 0xc4, 0xc3, 0xbe, 0xb7, 0xb5, 0xaf,
+ 0xbb, 0xb8, 0xb0, 0xc2, 0xc0, 0xb4, 0xc6, 0xc2, 0xb7, 0xbb, 0xb7, 0xad,
+ 0xc9, 0xca, 0xbc, 0xba, 0xb8, 0xac, 0xb4, 0xb0, 0xa4, 0xb4, 0xb3, 0xa4,
+ 0xb3, 0xb5, 0xa0, 0xb8, 0xba, 0xa9, 0xbc, 0xbd, 0xb9, 0x94, 0x91, 0x9d,
+ 0x52, 0x4e, 0x64, 0x40, 0x3b, 0x48, 0x3a, 0x35, 0x37, 0x37, 0x33, 0x2f,
+ 0x35, 0x34, 0x34, 0x42, 0x43, 0x47, 0x41, 0x40, 0x44, 0x31, 0x31, 0x35,
+ 0x30, 0x30, 0x36, 0x2d, 0x2f, 0x30, 0x38, 0x3d, 0x35, 0x57, 0x5d, 0x54,
+ 0x93, 0x98, 0x91, 0xcc, 0xd1, 0xca, 0xe8, 0xeb, 0xde, 0xe6, 0xe9, 0xd7,
+ 0xd9, 0xdb, 0xd2, 0xc5, 0xc6, 0xc0, 0xb1, 0xb4, 0xad, 0xa4, 0xa7, 0xa1,
+ 0xa3, 0xa7, 0xa0, 0x9e, 0xa0, 0x9b, 0x9e, 0xa0, 0x9b, 0x97, 0x99, 0x95,
+ 0x9b, 0x9d, 0x97, 0xad, 0xaf, 0xac, 0xa7, 0xa8, 0xaa, 0x7c, 0x7d, 0x80,
+ 0x6a, 0x6e, 0x6f, 0x7f, 0x83, 0x82, 0x8e, 0x93, 0x8d, 0x9c, 0xa2, 0x99,
+ 0xa0, 0xa4, 0xa3, 0x9d, 0xa1, 0xa0, 0x99, 0x9c, 0x9b, 0x9c, 0x9e, 0x9e,
+ 0x9f, 0xa1, 0xa0, 0x9a, 0x9c, 0x9d, 0x98, 0x9c, 0x9d, 0x9a, 0x9e, 0xa1,
+ 0x99, 0x9d, 0x9c, 0x98, 0x9e, 0x9c, 0x99, 0x9f, 0x9d, 0x96, 0x9c, 0x9c,
+ 0x94, 0x9b, 0x9d, 0x90, 0x98, 0x9a, 0x82, 0x8a, 0x8c, 0x68, 0x73, 0x77,
+ 0x69, 0x7d, 0x83, 0x53, 0x65, 0x78, 0x4e, 0x5f, 0x79, 0x3b, 0x4d, 0x5f,
+ 0x4a, 0x5c, 0x68, 0x7f, 0x8e, 0xa2, 0x48, 0x56, 0x6e, 0x2b, 0x38, 0x4e,
+ 0x28, 0x37, 0x4b, 0x27, 0x35, 0x46, 0x36, 0x44, 0x51, 0x5c, 0x6b, 0x70,
+ 0x82, 0x91, 0x90, 0xb2, 0xbd, 0xbc, 0xbe, 0xc0, 0xc5, 0xb9, 0xb4, 0xc0,
+ 0x97, 0x96, 0x9b, 0x79, 0x77, 0x80, 0x6c, 0x6a, 0x74, 0x61, 0x62, 0x66,
+ 0x76, 0x7a, 0x79, 0xa5, 0xab, 0xa7, 0xb6, 0xc2, 0xc0, 0xb6, 0xc1, 0xc4,
+ 0xaa, 0xb0, 0xbc, 0xad, 0xb3, 0xbf, 0xbc, 0xc5, 0xce, 0xaf, 0xb8, 0xbf,
+ 0xa0, 0xa9, 0xae, 0x96, 0x9d, 0xa3, 0xaa, 0xb1, 0xb8, 0xc0, 0xc7, 0xcf,
+ 0xc2, 0xcd, 0xd3, 0xc1, 0xcc, 0xd2, 0xbc, 0xc7, 0xcf, 0xae, 0xb8, 0xc3,
+ 0xa8, 0xb2, 0xbe, 0xb2, 0xba, 0xc7, 0xa2, 0xa9, 0xb7, 0x8c, 0x93, 0xa0,
+ 0xa7, 0xb7, 0xb5, 0xbe, 0xcb, 0xd2, 0xbc, 0xc8, 0xd5, 0xa3, 0xac, 0xba,
+ 0x97, 0xa2, 0xaa, 0xb9, 0xc4, 0xca, 0xc1, 0xcb, 0xd6, 0x97, 0x9f, 0xb3,
+ 0x7b, 0x81, 0x93, 0x81, 0x88, 0x98, 0x78, 0x80, 0x8d, 0x86, 0x90, 0x9a,
+ 0xb0, 0xbc, 0xc8, 0xbb, 0xc8, 0xd6, 0xb9, 0xc6, 0xd8, 0xb3, 0xc2, 0xd5,
+ 0x2a, 0x33, 0x39, 0x2e, 0x36, 0x3c, 0x49, 0x4e, 0x54, 0x48, 0x4d, 0x53,
+ 0x41, 0x44, 0x49, 0x50, 0x52, 0x55, 0x54, 0x55, 0x57, 0x40, 0x42, 0x41,
+ 0x27, 0x2c, 0x2d, 0x21, 0x24, 0x24, 0x1d, 0x1d, 0x1e, 0x1e, 0x1e, 0x1d,
+ 0x1a, 0x1a, 0x1a, 0x1a, 0x1c, 0x1b, 0x1d, 0x1d, 0x1e, 0x1d, 0x1b, 0x1f,
+ 0x18, 0x1c, 0x1d, 0x19, 0x1c, 0x1b, 0x19, 0x1b, 0x1a, 0x12, 0x12, 0x10,
+ 0x0f, 0x0f, 0x0d, 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x12, 0x13, 0x12,
+ 0x1a, 0x1c, 0x19, 0x1a, 0x1c, 0x1b, 0x1b, 0x1d, 0x1c, 0x22, 0x22, 0x24,
+ 0x24, 0x25, 0x27, 0x22, 0x24, 0x26, 0x26, 0x27, 0x29, 0x24, 0x26, 0x28,
+ 0x24, 0x25, 0x2a, 0x27, 0x28, 0x2b, 0x27, 0x28, 0x2a, 0x23, 0x24, 0x28,
+ 0x29, 0x2a, 0x2f, 0x2b, 0x2b, 0x33, 0x2f, 0x2f, 0x37, 0x19, 0x1a, 0x1f,
+ 0x08, 0x07, 0x0a, 0x0c, 0x0b, 0x0d, 0x0c, 0x0b, 0x0b, 0x08, 0x08, 0x06,
+ 0x18, 0x18, 0x17, 0x2f, 0x30, 0x34, 0x26, 0x29, 0x2e, 0x26, 0x2b, 0x31,
+ 0x27, 0x2c, 0x32, 0x27, 0x2c, 0x32, 0x23, 0x2a, 0x30, 0x23, 0x2b, 0x32,
+ 0x22, 0x2b, 0x32, 0x23, 0x2c, 0x34, 0x28, 0x2f, 0x39, 0x2e, 0x34, 0x3d,
+ 0x35, 0x36, 0x38, 0x42, 0x43, 0x44, 0x3c, 0x3e, 0x3c, 0x36, 0x38, 0x34,
+ 0x29, 0x2b, 0x28, 0x1c, 0x1e, 0x1c, 0x14, 0x16, 0x15, 0x16, 0x17, 0x19,
+ 0x15, 0x15, 0x18, 0x14, 0x14, 0x16, 0x14, 0x14, 0x16, 0x11, 0x11, 0x13,
+ 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f,
+ 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x12, 0x0e, 0x0e, 0x0f, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x07, 0x07, 0x07,
+ 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0c, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0e, 0x0e, 0x0e,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x16, 0x16, 0x18, 0x2f, 0x2e, 0x33,
+ 0x2f, 0x30, 0x34, 0x2a, 0x2b, 0x30, 0x25, 0x26, 0x2c, 0x1c, 0x1d, 0x21,
+ 0x13, 0x13, 0x13, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0f, 0x0f, 0x0e,
+ 0x0e, 0x0e, 0x0d, 0x0b, 0x0b, 0x09, 0x0e, 0x0e, 0x0c, 0x14, 0x14, 0x12,
+ 0x19, 0x19, 0x19, 0x19, 0x17, 0x18, 0x32, 0x31, 0x2f, 0x30, 0x2c, 0x2b,
+ 0x1c, 0x18, 0x17, 0x1b, 0x17, 0x18, 0x19, 0x16, 0x18, 0x1e, 0x1c, 0x1f,
+ 0x1f, 0x1d, 0x1e, 0x19, 0x17, 0x18, 0x1e, 0x1c, 0x1d, 0x23, 0x21, 0x22,
+ 0x24, 0x22, 0x23, 0x1d, 0x1a, 0x1c, 0x14, 0x12, 0x13, 0x10, 0x0e, 0x0e,
+ 0x10, 0x0f, 0x0f, 0x1c, 0x1a, 0x1a, 0x23, 0x20, 0x20, 0x24, 0x1f, 0x23,
+ 0x36, 0x2d, 0x36, 0x51, 0x47, 0x54, 0x4f, 0x42, 0x57, 0x5f, 0x52, 0x68,
+ 0x7c, 0x6b, 0x7c, 0x97, 0x8c, 0x98, 0x7f, 0x78, 0x80, 0x63, 0x60, 0x61,
+ 0x62, 0x5b, 0x5c, 0x66, 0x5b, 0x5d, 0x66, 0x5a, 0x5c, 0x64, 0x54, 0x58,
+ 0x5c, 0x46, 0x4f, 0x4f, 0x3a, 0x42, 0x4b, 0x37, 0x41, 0x46, 0x35, 0x3f,
+ 0x3f, 0x30, 0x3a, 0x41, 0x31, 0x3b, 0x44, 0x34, 0x3e, 0x45, 0x36, 0x40,
+ 0x44, 0x33, 0x3d, 0x75, 0x6b, 0x74, 0xa4, 0xa8, 0xb3, 0x9f, 0xab, 0xba,
+ 0x9a, 0xa8, 0xb9, 0x97, 0xa4, 0xb5, 0x94, 0xa1, 0xac, 0x8d, 0x98, 0xa1,
+ 0x83, 0x87, 0x99, 0x71, 0x73, 0x85, 0x5d, 0x5f, 0x6e, 0x49, 0x48, 0x56,
+ 0x39, 0x3a, 0x45, 0x2b, 0x2c, 0x35, 0x23, 0x25, 0x2d, 0x15, 0x19, 0x1e,
+ 0x11, 0x11, 0x14, 0x11, 0x11, 0x13, 0x11, 0x12, 0x14, 0x13, 0x13, 0x15,
+ 0x14, 0x16, 0x17, 0x1e, 0x1c, 0x1c, 0x2c, 0x24, 0x24, 0x44, 0x36, 0x38,
+ 0x52, 0x3c, 0x44, 0x6d, 0x6e, 0x75, 0xb6, 0xc8, 0xd3, 0xa6, 0xad, 0xc9,
+ 0x79, 0x74, 0x9d, 0x66, 0x63, 0x84, 0x86, 0x82, 0x90, 0xb0, 0xa9, 0xa6,
+ 0xbe, 0xbc, 0xab, 0xbe, 0xbc, 0xa9, 0xba, 0xb8, 0xa3, 0xbe, 0xbc, 0xa9,
+ 0xc5, 0xc2, 0xb2, 0xcd, 0xcb, 0xbe, 0xc3, 0xc5, 0xb6, 0xd7, 0xda, 0xc9,
+ 0xd6, 0xd6, 0xcc, 0xc1, 0xc0, 0xb7, 0xc3, 0xc1, 0xb8, 0xbc, 0xba, 0xaf,
+ 0xbc, 0xba, 0xac, 0xc2, 0xc0, 0xb1, 0xc2, 0xbe, 0xb3, 0xba, 0xb7, 0xad,
+ 0xca, 0xcd, 0xbc, 0xb3, 0xb3, 0xa9, 0xb1, 0xb0, 0xa8, 0xb7, 0xb4, 0xaa,
+ 0xb6, 0xb4, 0xa5, 0xb7, 0xb6, 0xa9, 0xb8, 0xb7, 0xb3, 0x88, 0x86, 0x8d,
+ 0x4e, 0x48, 0x56, 0x42, 0x3d, 0x45, 0x3b, 0x37, 0x38, 0x37, 0x33, 0x32,
+ 0x37, 0x34, 0x35, 0x42, 0x40, 0x43, 0x3f, 0x3e, 0x43, 0x2e, 0x2e, 0x32,
+ 0x2a, 0x2d, 0x2d, 0x2d, 0x31, 0x30, 0x2f, 0x34, 0x30, 0x36, 0x3b, 0x37,
+ 0x52, 0x57, 0x51, 0x82, 0x87, 0x80, 0xb7, 0xbc, 0xb4, 0xdd, 0xe3, 0xd9,
+ 0xe9, 0xeb, 0xe1, 0xe1, 0xe3, 0xd8, 0xd0, 0xd3, 0xc8, 0xc0, 0xc2, 0xb7,
+ 0xb5, 0xb6, 0xae, 0xa8, 0xa9, 0xa5, 0xa3, 0xa3, 0xa3, 0x9b, 0x9a, 0x9e,
+ 0x99, 0x9a, 0x9b, 0xa0, 0xa2, 0x9f, 0xa4, 0xa7, 0xa1, 0xa5, 0xa8, 0xa0,
+ 0x9a, 0x9d, 0x96, 0x99, 0x9d, 0x98, 0x99, 0x9d, 0x9c, 0x9d, 0xa1, 0xa1,
+ 0x9c, 0x9e, 0x9e, 0x98, 0x9c, 0x9b, 0x9b, 0xa0, 0x9e, 0x9b, 0xa1, 0x9f,
+ 0x9b, 0x9f, 0x9e, 0x9c, 0xa0, 0x9d, 0x9a, 0xa0, 0x9c, 0x96, 0xa0, 0x99,
+ 0x9b, 0xa1, 0x98, 0x9f, 0xa2, 0x9c, 0xa0, 0xa2, 0x9d, 0x99, 0x9a, 0x97,
+ 0x91, 0x93, 0x95, 0x83, 0x89, 0x8e, 0x5f, 0x6b, 0x6e, 0x60, 0x6e, 0x73,
+ 0x70, 0x82, 0x8b, 0x7c, 0x8d, 0x98, 0x74, 0x85, 0x93, 0x72, 0x83, 0x91,
+ 0x51, 0x62, 0x74, 0x5f, 0x73, 0x88, 0x42, 0x57, 0x70, 0x26, 0x3d, 0x58,
+ 0x2a, 0x40, 0x57, 0x2c, 0x3d, 0x4f, 0x3b, 0x4d, 0x56, 0x58, 0x6a, 0x6a,
+ 0x83, 0x94, 0x90, 0xbd, 0xcb, 0xcb, 0xc9, 0xd1, 0xdb, 0xbb, 0xbe, 0xcd,
+ 0xa0, 0x9a, 0xa5, 0x7a, 0x78, 0x7f, 0x63, 0x63, 0x64, 0x71, 0x73, 0x6f,
+ 0xa2, 0xa9, 0xa1, 0xb5, 0xbf, 0xbc, 0xb4, 0xc2, 0xc3, 0xb4, 0xc2, 0xc8,
+ 0xa8, 0xb0, 0xc1, 0x8c, 0x94, 0xa1, 0x7f, 0x88, 0x91, 0x89, 0x92, 0x9a,
+ 0xb3, 0xba, 0xc4, 0xac, 0xb3, 0xbd, 0xa3, 0xaa, 0xb2, 0xbc, 0xc2, 0xc8,
+ 0xbd, 0xc9, 0xcf, 0xbc, 0xc8, 0xd0, 0xbc, 0xc6, 0xd0, 0xbf, 0xc9, 0xd2,
+ 0xc1, 0xcb, 0xd4, 0xc4, 0xce, 0xd7, 0xbd, 0xc4, 0xd2, 0x85, 0x8d, 0x9c,
+ 0x8a, 0x94, 0x97, 0xbb, 0xc4, 0xc9, 0xbc, 0xc7, 0xce, 0xb6, 0xc1, 0xc8,
+ 0xb7, 0xc2, 0xc8, 0xbe, 0xca, 0xd3, 0xad, 0xb8, 0xca, 0x81, 0x8b, 0xa3,
+ 0x88, 0x92, 0x9c, 0x97, 0xa4, 0xac, 0xa4, 0xb1, 0xb9, 0xae, 0xbc, 0xc3,
+ 0xb7, 0xc6, 0xcf, 0xbc, 0xc9, 0xd5, 0xbc, 0xc8, 0xd6, 0xb8, 0xc4, 0xd2,
+ 0x4a, 0x51, 0x56, 0x2f, 0x36, 0x3c, 0x39, 0x3e, 0x44, 0x52, 0x56, 0x5b,
+ 0x40, 0x44, 0x48, 0x4a, 0x4d, 0x50, 0x5b, 0x5c, 0x5e, 0x63, 0x65, 0x64,
+ 0x54, 0x59, 0x55, 0x43, 0x45, 0x42, 0x21, 0x21, 0x1f, 0x1a, 0x1a, 0x18,
+ 0x17, 0x19, 0x17, 0x15, 0x19, 0x18, 0x18, 0x1b, 0x1b, 0x1b, 0x1d, 0x1f,
+ 0x1a, 0x1e, 0x1f, 0x1e, 0x21, 0x20, 0x1e, 0x1f, 0x1f, 0x19, 0x19, 0x18,
+ 0x13, 0x13, 0x11, 0x10, 0x11, 0x10, 0x12, 0x14, 0x13, 0x10, 0x12, 0x11,
+ 0x15, 0x17, 0x16, 0x19, 0x1a, 0x1b, 0x1b, 0x1c, 0x1e, 0x20, 0x21, 0x25,
+ 0x22, 0x24, 0x28, 0x22, 0x26, 0x29, 0x26, 0x29, 0x2c, 0x23, 0x27, 0x2a,
+ 0x25, 0x26, 0x2a, 0x2a, 0x2b, 0x2f, 0x25, 0x26, 0x2a, 0x22, 0x23, 0x28,
+ 0x27, 0x27, 0x30, 0x2b, 0x2b, 0x35, 0x2d, 0x2e, 0x36, 0x1e, 0x21, 0x26,
+ 0x0c, 0x0c, 0x0e, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x06,
+ 0x0f, 0x10, 0x10, 0x27, 0x2b, 0x2e, 0x2c, 0x2f, 0x36, 0x26, 0x2a, 0x33,
+ 0x2b, 0x2e, 0x35, 0x28, 0x2d, 0x33, 0x26, 0x2a, 0x33, 0x23, 0x2a, 0x32,
+ 0x27, 0x2e, 0x36, 0x28, 0x2f, 0x38, 0x24, 0x2b, 0x36, 0x24, 0x2b, 0x35,
+ 0x2a, 0x2e, 0x33, 0x3c, 0x3f, 0x43, 0x34, 0x38, 0x39, 0x23, 0x26, 0x25,
+ 0x15, 0x17, 0x15, 0x14, 0x16, 0x15, 0x15, 0x16, 0x18, 0x15, 0x16, 0x18,
+ 0x18, 0x18, 0x1a, 0x19, 0x19, 0x1b, 0x17, 0x17, 0x19, 0x13, 0x13, 0x15,
+ 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x14, 0x14, 0x14, 0x12, 0x12, 0x12,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x11, 0x0e, 0x0e, 0x10, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11, 0x0d, 0x0d, 0x0d, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d,
+ 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11,
+ 0x10, 0x10, 0x0e, 0x0d, 0x0d, 0x0d, 0x15, 0x14, 0x16, 0x2c, 0x2b, 0x30,
+ 0x30, 0x31, 0x35, 0x27, 0x28, 0x2c, 0x1f, 0x20, 0x23, 0x1a, 0x1b, 0x1f,
+ 0x12, 0x12, 0x12, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0d, 0x0c, 0x0c, 0x0a, 0x0f, 0x0f, 0x0d, 0x13, 0x13, 0x11,
+ 0x1c, 0x1b, 0x1b, 0x1c, 0x1a, 0x1b, 0x2f, 0x2e, 0x2c, 0x2a, 0x29, 0x27,
+ 0x1c, 0x18, 0x17, 0x18, 0x15, 0x16, 0x17, 0x16, 0x17, 0x1a, 0x18, 0x1b,
+ 0x1c, 0x1a, 0x1b, 0x1c, 0x1a, 0x1b, 0x1f, 0x1d, 0x1e, 0x21, 0x1f, 0x20,
+ 0x20, 0x1e, 0x1e, 0x17, 0x15, 0x16, 0x11, 0x0f, 0x10, 0x0e, 0x0c, 0x0e,
+ 0x0f, 0x0e, 0x0c, 0x1a, 0x19, 0x17, 0x21, 0x1e, 0x1d, 0x27, 0x23, 0x24,
+ 0x2a, 0x24, 0x28, 0x40, 0x37, 0x40, 0x4d, 0x40, 0x4e, 0x41, 0x33, 0x44,
+ 0x47, 0x37, 0x44, 0x62, 0x55, 0x5f, 0x83, 0x79, 0x80, 0x72, 0x6a, 0x6d,
+ 0x67, 0x5a, 0x5c, 0x69, 0x59, 0x5d, 0x67, 0x57, 0x5a, 0x5e, 0x4f, 0x51,
+ 0x52, 0x3f, 0x43, 0x4f, 0x3c, 0x42, 0x4d, 0x3c, 0x42, 0x4b, 0x3a, 0x42,
+ 0x46, 0x37, 0x3e, 0x46, 0x37, 0x3e, 0x47, 0x38, 0x3f, 0x45, 0x37, 0x3e,
+ 0x45, 0x35, 0x39, 0x5b, 0x54, 0x56, 0x9c, 0xa1, 0xa6, 0x9b, 0xa8, 0xb2,
+ 0x93, 0xa0, 0xaf, 0x8d, 0x98, 0xab, 0x89, 0x92, 0xa3, 0x7d, 0x87, 0x93,
+ 0x72, 0x74, 0x83, 0x5e, 0x60, 0x6d, 0x4b, 0x4c, 0x57, 0x39, 0x39, 0x43,
+ 0x31, 0x31, 0x39, 0x2a, 0x2b, 0x30, 0x21, 0x22, 0x27, 0x13, 0x17, 0x1a,
+ 0x11, 0x11, 0x13, 0x11, 0x11, 0x13, 0x12, 0x12, 0x14, 0x13, 0x13, 0x15,
+ 0x13, 0x14, 0x16, 0x1d, 0x1b, 0x1b, 0x2b, 0x24, 0x24, 0x44, 0x36, 0x39,
+ 0x50, 0x37, 0x3d, 0x84, 0x83, 0x89, 0xd4, 0xe5, 0xf1, 0xc9, 0xd5, 0xf1,
+ 0xba, 0xbe, 0xe4, 0xaa, 0xb0, 0xce, 0xa3, 0xa8, 0xbb, 0xa5, 0xa5, 0xae,
+ 0xb8, 0xb6, 0xa9, 0xbe, 0xbb, 0xaa, 0xbd, 0xbb, 0xa6, 0xc2, 0xbd, 0xa9,
+ 0xc6, 0xc1, 0xb0, 0xcb, 0xc8, 0xb9, 0xc6, 0xc4, 0xb5, 0xd1, 0xd2, 0xc2,
+ 0xe0, 0xe1, 0xda, 0xcd, 0xce, 0xc9, 0xb4, 0xb3, 0xad, 0xb6, 0xb6, 0xac,
+ 0xbd, 0xbe, 0xb0, 0xc3, 0xc4, 0xb4, 0xbe, 0xbf, 0xb1, 0xbe, 0xbc, 0xb0,
+ 0xca, 0xca, 0xbe, 0xb0, 0xaf, 0xa8, 0xaf, 0xad, 0xa9, 0xb0, 0xb0, 0xa6,
+ 0xb5, 0xb6, 0xa7, 0xba, 0xba, 0xaf, 0xb1, 0xad, 0xae, 0x72, 0x6c, 0x78,
+ 0x4b, 0x43, 0x50, 0x49, 0x42, 0x48, 0x3e, 0x38, 0x38, 0x39, 0x34, 0x31,
+ 0x39, 0x35, 0x34, 0x41, 0x3f, 0x43, 0x41, 0x40, 0x45, 0x2c, 0x2c, 0x30,
+ 0x24, 0x28, 0x2b, 0x29, 0x2d, 0x2e, 0x2b, 0x2f, 0x2f, 0x2c, 0x30, 0x2f,
+ 0x36, 0x3a, 0x39, 0x48, 0x4d, 0x49, 0x6e, 0x73, 0x6f, 0x9e, 0xa3, 0x9e,
+ 0xc9, 0xcb, 0xc6, 0xda, 0xdd, 0xd6, 0xde, 0xe1, 0xd8, 0xd7, 0xda, 0xcf,
+ 0xcc, 0xcf, 0xc6, 0xc2, 0xc4, 0xbc, 0xb3, 0xb4, 0xaf, 0xa7, 0xa8, 0xa4,
+ 0xa4, 0xa7, 0x9e, 0xa3, 0xa5, 0xa0, 0xa4, 0xa5, 0xa4, 0xa4, 0xa5, 0xa7,
+ 0x9f, 0xa1, 0xa4, 0x9b, 0x9c, 0x9d, 0x9e, 0xa0, 0x9d, 0x9d, 0x9f, 0x9b,
+ 0x9a, 0x9a, 0x98, 0x99, 0x9b, 0x99, 0x9e, 0xa3, 0x9f, 0x9e, 0xa3, 0x9f,
+ 0x9e, 0xa2, 0x9e, 0xa7, 0xa9, 0xa6, 0xa0, 0xa5, 0x9f, 0x9d, 0xa4, 0x9d,
+ 0xa5, 0xaa, 0xa4, 0xa0, 0xa5, 0xa1, 0x97, 0x99, 0x96, 0x8e, 0x90, 0x8f,
+ 0x7c, 0x7f, 0x82, 0x5f, 0x66, 0x6a, 0x43, 0x4e, 0x55, 0x61, 0x6f, 0x77,
+ 0x7f, 0x96, 0xa0, 0x64, 0x7a, 0x86, 0x43, 0x58, 0x65, 0x6a, 0x80, 0x8e,
+ 0x69, 0x82, 0x91, 0x33, 0x4d, 0x61, 0x2f, 0x4b, 0x62, 0x2b, 0x48, 0x61,
+ 0x30, 0x45, 0x5c, 0x35, 0x47, 0x59, 0x4b, 0x5d, 0x67, 0x5b, 0x6d, 0x71,
+ 0x7b, 0x8d, 0x8f, 0xb4, 0xc4, 0xc9, 0xe1, 0xe9, 0xf5, 0xca, 0xcf, 0xde,
+ 0xa2, 0xa1, 0xaf, 0x7e, 0x7e, 0x88, 0x76, 0x77, 0x7c, 0x9e, 0xa2, 0xa4,
+ 0xb2, 0xb8, 0xb8, 0xb3, 0xbb, 0xbd, 0xb1, 0xbb, 0xbc, 0xb8, 0xc2, 0xc7,
+ 0xba, 0xc1, 0xd1, 0x88, 0x90, 0x9b, 0x67, 0x70, 0x77, 0x9a, 0xa3, 0xa8,
+ 0xb7, 0xc0, 0xc7, 0xba, 0xc3, 0xcc, 0xb8, 0xc0, 0xc9, 0xbd, 0xc4, 0xcc,
+ 0xb4, 0xbd, 0xc6, 0xa3, 0xab, 0xb6, 0x9d, 0xa5, 0xb2, 0xa0, 0xa8, 0xb3,
+ 0x9f, 0xa8, 0xb1, 0x9a, 0xa2, 0xab, 0x8d, 0x93, 0x9f, 0x7e, 0x84, 0x93,
+ 0x97, 0xa1, 0xa3, 0xbe, 0xc9, 0xcc, 0xc2, 0xcc, 0xd7, 0xc3, 0xcc, 0xda,
+ 0xc0, 0xc8, 0xd8, 0xbb, 0xc5, 0xd3, 0x9b, 0xa7, 0xb5, 0x95, 0xa1, 0xaf,
+ 0xb4, 0xc1, 0xc9, 0xbb, 0xc8, 0xd0, 0xbe, 0xcb, 0xd3, 0xbc, 0xca, 0xd3,
+ 0xb8, 0xc7, 0xd1, 0xbb, 0xc9, 0xd4, 0xbd, 0xc9, 0xd7, 0xb7, 0xc3, 0xd2,
+ 0x43, 0x4b, 0x4e, 0x52, 0x5a, 0x5d, 0x4f, 0x55, 0x59, 0x47, 0x4c, 0x50,
+ 0x51, 0x55, 0x58, 0x4f, 0x53, 0x55, 0x41, 0x45, 0x46, 0x5e, 0x61, 0x5f,
+ 0x68, 0x6b, 0x65, 0x5f, 0x60, 0x5c, 0x3c, 0x3d, 0x38, 0x20, 0x22, 0x1e,
+ 0x15, 0x19, 0x16, 0x14, 0x1a, 0x18, 0x16, 0x1c, 0x1a, 0x19, 0x1d, 0x1c,
+ 0x1c, 0x1d, 0x1f, 0x1f, 0x20, 0x22, 0x20, 0x20, 0x20, 0x1e, 0x1e, 0x1e,
+ 0x17, 0x18, 0x16, 0x14, 0x16, 0x14, 0x10, 0x12, 0x11, 0x0e, 0x12, 0x11,
+ 0x12, 0x14, 0x15, 0x17, 0x18, 0x1a, 0x1a, 0x1c, 0x1f, 0x1c, 0x1f, 0x24,
+ 0x23, 0x26, 0x2b, 0x22, 0x25, 0x2a, 0x21, 0x25, 0x2a, 0x21, 0x24, 0x28,
+ 0x23, 0x24, 0x27, 0x24, 0x25, 0x29, 0x22, 0x24, 0x28, 0x23, 0x23, 0x2b,
+ 0x26, 0x25, 0x32, 0x28, 0x29, 0x34, 0x2c, 0x2f, 0x36, 0x22, 0x26, 0x29,
+ 0x0d, 0x0e, 0x0e, 0x09, 0x09, 0x09, 0x08, 0x08, 0x06, 0x09, 0x09, 0x06,
+ 0x06, 0x07, 0x06, 0x27, 0x2a, 0x2d, 0x32, 0x36, 0x3d, 0x2a, 0x2e, 0x38,
+ 0x29, 0x2c, 0x33, 0x26, 0x2a, 0x30, 0x26, 0x2a, 0x33, 0x29, 0x2e, 0x37,
+ 0x28, 0x2e, 0x37, 0x2a, 0x2e, 0x37, 0x28, 0x2d, 0x37, 0x24, 0x28, 0x33,
+ 0x27, 0x2c, 0x35, 0x2c, 0x31, 0x37, 0x22, 0x26, 0x29, 0x12, 0x16, 0x17,
+ 0x12, 0x13, 0x13, 0x13, 0x15, 0x14, 0x15, 0x15, 0x17, 0x16, 0x16, 0x18,
+ 0x18, 0x19, 0x1b, 0x19, 0x1a, 0x1c, 0x15, 0x16, 0x18, 0x13, 0x14, 0x16,
+ 0x11, 0x13, 0x13, 0x11, 0x13, 0x12, 0x12, 0x14, 0x13, 0x12, 0x14, 0x13,
+ 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x12, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0f, 0x0b, 0x0b, 0x0b, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e,
+ 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0d, 0x0c, 0x0c, 0x0b, 0x0d, 0x0d, 0x0e, 0x28, 0x28, 0x2a,
+ 0x2d, 0x2d, 0x30, 0x24, 0x25, 0x28, 0x19, 0x1a, 0x1d, 0x11, 0x12, 0x14,
+ 0x0f, 0x10, 0x10, 0x0c, 0x0c, 0x0c, 0x12, 0x12, 0x12, 0x0f, 0x0f, 0x0e,
+ 0x0c, 0x0c, 0x0a, 0x0d, 0x0d, 0x0b, 0x0e, 0x0d, 0x0b, 0x14, 0x13, 0x11,
+ 0x1c, 0x1c, 0x1c, 0x1d, 0x1b, 0x1c, 0x27, 0x26, 0x24, 0x28, 0x27, 0x25,
+ 0x1e, 0x1d, 0x1b, 0x1e, 0x1c, 0x1d, 0x17, 0x15, 0x16, 0x16, 0x14, 0x17,
+ 0x1c, 0x1a, 0x1b, 0x1c, 0x1a, 0x1b, 0x1f, 0x1d, 0x1e, 0x1d, 0x1b, 0x1c,
+ 0x1a, 0x18, 0x19, 0x14, 0x12, 0x13, 0x13, 0x11, 0x12, 0x0f, 0x0d, 0x0e,
+ 0x0f, 0x0e, 0x0a, 0x1a, 0x19, 0x15, 0x25, 0x21, 0x1e, 0x2c, 0x27, 0x24,
+ 0x2f, 0x29, 0x28, 0x33, 0x2a, 0x30, 0x3c, 0x32, 0x3a, 0x40, 0x34, 0x3e,
+ 0x3f, 0x2f, 0x3b, 0x40, 0x33, 0x3d, 0x57, 0x4a, 0x51, 0x75, 0x67, 0x6c,
+ 0x6a, 0x57, 0x5b, 0x62, 0x4d, 0x52, 0x60, 0x4d, 0x51, 0x55, 0x45, 0x48,
+ 0x4d, 0x3d, 0x40, 0x4d, 0x3e, 0x41, 0x4c, 0x3d, 0x42, 0x48, 0x39, 0x3e,
+ 0x47, 0x38, 0x3d, 0x46, 0x37, 0x3c, 0x44, 0x34, 0x3a, 0x45, 0x36, 0x3a,
+ 0x41, 0x33, 0x30, 0x44, 0x3e, 0x3b, 0x89, 0x8d, 0x8e, 0x93, 0x9c, 0xa3,
+ 0x89, 0x92, 0xa1, 0x80, 0x88, 0x9b, 0x78, 0x7f, 0x91, 0x68, 0x6f, 0x7f,
+ 0x5c, 0x5e, 0x68, 0x4a, 0x49, 0x53, 0x3a, 0x3b, 0x42, 0x30, 0x31, 0x36,
+ 0x2e, 0x2d, 0x33, 0x2c, 0x2c, 0x30, 0x21, 0x22, 0x24, 0x13, 0x14, 0x16,
+ 0x0f, 0x0f, 0x11, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x13, 0x12, 0x13, 0x15,
+ 0x14, 0x15, 0x17, 0x1d, 0x1b, 0x1c, 0x27, 0x20, 0x21, 0x3e, 0x31, 0x33,
+ 0x4e, 0x38, 0x3a, 0x93, 0x90, 0x96, 0xcf, 0xdd, 0xee, 0xc5, 0xd4, 0xef,
+ 0xce, 0xd8, 0xf6, 0xd1, 0xdd, 0xf7, 0xc6, 0xd1, 0xe8, 0x9f, 0xa5, 0xb9,
+ 0xa9, 0xa8, 0xa3, 0xb9, 0xb6, 0xaa, 0xbb, 0xb9, 0xa6, 0xc2, 0xbe, 0xa7,
+ 0xc6, 0xc1, 0xad, 0xce, 0xc9, 0xb9, 0xcb, 0xc7, 0xb9, 0xca, 0xc7, 0xb9,
+ 0xdf, 0xdf, 0xdc, 0xc7, 0xc7, 0xc5, 0xbb, 0xbc, 0xb6, 0xbb, 0xbd, 0xb2,
+ 0xbc, 0xbe, 0xaf, 0xcb, 0xcc, 0xbb, 0xc0, 0xc2, 0xb1, 0xca, 0xcb, 0xbc,
+ 0xde, 0xdb, 0xd2, 0xbe, 0xbd, 0xb8, 0xb2, 0xb1, 0xac, 0xb4, 0xb5, 0xab,
+ 0xb7, 0xb9, 0xac, 0xbb, 0xbb, 0xb5, 0x97, 0x92, 0x98, 0x57, 0x4e, 0x5f,
+ 0x46, 0x3e, 0x47, 0x41, 0x3b, 0x3f, 0x3d, 0x37, 0x37, 0x3a, 0x35, 0x32,
+ 0x3a, 0x36, 0x35, 0x44, 0x41, 0x44, 0x3b, 0x39, 0x3c, 0x29, 0x29, 0x2c,
+ 0x25, 0x27, 0x2c, 0x25, 0x27, 0x2c, 0x28, 0x2c, 0x2f, 0x2a, 0x2e, 0x31,
+ 0x2f, 0x33, 0x36, 0x32, 0x36, 0x38, 0x41, 0x45, 0x46, 0x5c, 0x60, 0x61,
+ 0x83, 0x85, 0x84, 0xa0, 0xa2, 0x9f, 0xba, 0xbc, 0xb7, 0xd2, 0xd5, 0xce,
+ 0xda, 0xdd, 0xd4, 0xd9, 0xdc, 0xd2, 0xd0, 0xd3, 0xcb, 0xbe, 0xc1, 0xb8,
+ 0xba, 0xbd, 0xaf, 0xb6, 0xb7, 0xac, 0xb0, 0xb1, 0xab, 0xb0, 0xb0, 0xae,
+ 0xa8, 0xaa, 0xa8, 0xa6, 0xa7, 0xa4, 0xa6, 0xa8, 0xa1, 0xa5, 0xa8, 0xa0,
+ 0xa4, 0xa5, 0xa1, 0xa2, 0xa4, 0x9f, 0xa8, 0xad, 0xa9, 0xa9, 0xad, 0xaa,
+ 0xa4, 0xa6, 0xa3, 0xa1, 0xa1, 0x9f, 0x9a, 0x9c, 0x97, 0x90, 0x95, 0x90,
+ 0x8e, 0x93, 0x95, 0x84, 0x88, 0x8b, 0x73, 0x77, 0x7a, 0x69, 0x6d, 0x70,
+ 0x58, 0x5c, 0x61, 0x46, 0x4d, 0x53, 0x45, 0x4f, 0x58, 0x62, 0x6f, 0x77,
+ 0x63, 0x75, 0x81, 0x45, 0x58, 0x66, 0x54, 0x67, 0x75, 0x75, 0x8a, 0x96,
+ 0x53, 0x69, 0x78, 0x2b, 0x42, 0x54, 0x2a, 0x43, 0x57, 0x2b, 0x45, 0x5a,
+ 0x2d, 0x42, 0x54, 0x38, 0x49, 0x59, 0x50, 0x60, 0x6f, 0x58, 0x69, 0x73,
+ 0x6b, 0x7c, 0x84, 0xab, 0xba, 0xc3, 0xe5, 0xf0, 0xfa, 0xd1, 0xd7, 0xe3,
+ 0xa7, 0xaa, 0xb6, 0x8f, 0x93, 0x9f, 0xab, 0xae, 0xb9, 0xb2, 0xb5, 0xbe,
+ 0xa9, 0xac, 0xb3, 0xab, 0xb0, 0xb6, 0xb3, 0xb8, 0xbe, 0xba, 0xbf, 0xc4,
+ 0x97, 0x9e, 0xad, 0x6f, 0x77, 0x81, 0x91, 0x9a, 0x9f, 0xb6, 0xbf, 0xc2,
+ 0xb8, 0xc2, 0xc6, 0xb7, 0xc1, 0xc9, 0xb6, 0xc0, 0xcb, 0xb6, 0xc0, 0xca,
+ 0xb4, 0xba, 0xc8, 0xa0, 0xa7, 0xb4, 0x80, 0x86, 0x94, 0x7e, 0x85, 0x90,
+ 0x91, 0x98, 0xa1, 0x97, 0x9e, 0xa6, 0x9d, 0xa4, 0xae, 0xaa, 0xb1, 0xbe,
+ 0xb5, 0xc1, 0xc2, 0xc0, 0xca, 0xd1, 0xbd, 0xc7, 0xd5, 0xa7, 0xaf, 0xc3,
+ 0x9b, 0xa4, 0xb9, 0xa4, 0xad, 0xbc, 0xb2, 0xbd, 0xc5, 0xba, 0xc5, 0xc9,
+ 0xbd, 0xca, 0xd2, 0xbd, 0xca, 0xd3, 0xbc, 0xca, 0xd3, 0xb9, 0xc7, 0xd1,
+ 0xb8, 0xc6, 0xd1, 0xba, 0xc8, 0xd5, 0xb7, 0xc5, 0xd2, 0xb3, 0xc0, 0xd0,
+ 0x1e, 0x24, 0x27, 0x2c, 0x31, 0x35, 0x3e, 0x43, 0x47, 0x4f, 0x54, 0x58,
+ 0x4c, 0x52, 0x56, 0x4f, 0x54, 0x57, 0x4f, 0x53, 0x54, 0x5c, 0x60, 0x61,
+ 0x59, 0x61, 0x5f, 0x52, 0x58, 0x56, 0x54, 0x58, 0x57, 0x3f, 0x43, 0x42,
+ 0x1c, 0x22, 0x20, 0x11, 0x17, 0x15, 0x13, 0x18, 0x14, 0x17, 0x19, 0x16,
+ 0x1a, 0x1b, 0x1d, 0x1d, 0x1d, 0x1f, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c,
+ 0x19, 0x1b, 0x1a, 0x1c, 0x1e, 0x1d, 0x10, 0x14, 0x13, 0x0f, 0x13, 0x12,
+ 0x14, 0x15, 0x16, 0x17, 0x1a, 0x1c, 0x1c, 0x20, 0x23, 0x1c, 0x20, 0x23,
+ 0x1e, 0x21, 0x26, 0x21, 0x25, 0x2a, 0x1d, 0x21, 0x26, 0x21, 0x24, 0x28,
+ 0x21, 0x22, 0x26, 0x21, 0x22, 0x26, 0x23, 0x24, 0x29, 0x25, 0x25, 0x2f,
+ 0x25, 0x25, 0x33, 0x24, 0x25, 0x31, 0x26, 0x29, 0x31, 0x22, 0x26, 0x29,
+ 0x0d, 0x0f, 0x0e, 0x07, 0x09, 0x06, 0x07, 0x08, 0x06, 0x07, 0x09, 0x06,
+ 0x05, 0x07, 0x06, 0x1e, 0x21, 0x24, 0x30, 0x35, 0x3c, 0x2c, 0x30, 0x3b,
+ 0x25, 0x28, 0x30, 0x29, 0x2c, 0x33, 0x2b, 0x2f, 0x37, 0x41, 0x45, 0x4e,
+ 0x29, 0x2d, 0x36, 0x28, 0x2c, 0x35, 0x2a, 0x2d, 0x36, 0x27, 0x2a, 0x33,
+ 0x28, 0x2d, 0x38, 0x29, 0x2e, 0x37, 0x20, 0x25, 0x2b, 0x11, 0x14, 0x19,
+ 0x12, 0x13, 0x17, 0x14, 0x14, 0x16, 0x14, 0x14, 0x16, 0x17, 0x15, 0x18,
+ 0x14, 0x15, 0x17, 0x13, 0x14, 0x16, 0x10, 0x11, 0x13, 0x11, 0x12, 0x14,
+ 0x0f, 0x11, 0x11, 0x10, 0x12, 0x11, 0x10, 0x12, 0x11, 0x0f, 0x11, 0x10,
+ 0x11, 0x13, 0x12, 0x10, 0x11, 0x10, 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0c, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x07, 0x07, 0x07,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0a, 0x0b, 0x0b, 0x0a, 0x1e, 0x1e, 0x1e,
+ 0x27, 0x28, 0x2a, 0x1f, 0x20, 0x22, 0x18, 0x19, 0x1b, 0x12, 0x14, 0x13,
+ 0x10, 0x11, 0x11, 0x0b, 0x0a, 0x0b, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0d,
+ 0x0d, 0x0d, 0x0b, 0x10, 0x0f, 0x0d, 0x12, 0x11, 0x10, 0x15, 0x14, 0x12,
+ 0x1b, 0x19, 0x1a, 0x1b, 0x19, 0x1a, 0x1c, 0x1b, 0x19, 0x1e, 0x1d, 0x1b,
+ 0x1e, 0x1d, 0x1b, 0x21, 0x1f, 0x20, 0x19, 0x19, 0x19, 0x15, 0x15, 0x16,
+ 0x18, 0x16, 0x17, 0x1c, 0x1a, 0x1b, 0x22, 0x20, 0x21, 0x1b, 0x19, 0x1a,
+ 0x19, 0x17, 0x18, 0x15, 0x13, 0x14, 0x11, 0x0f, 0x10, 0x0f, 0x0d, 0x0d,
+ 0x11, 0x10, 0x0e, 0x23, 0x1f, 0x1e, 0x30, 0x2c, 0x2b, 0x2f, 0x2a, 0x27,
+ 0x2f, 0x26, 0x27, 0x33, 0x2a, 0x2d, 0x32, 0x29, 0x2c, 0x34, 0x2a, 0x30,
+ 0x37, 0x2b, 0x36, 0x3a, 0x30, 0x38, 0x41, 0x34, 0x3b, 0x57, 0x46, 0x4c,
+ 0x63, 0x4e, 0x53, 0x58, 0x43, 0x48, 0x4e, 0x3b, 0x3f, 0x4b, 0x3b, 0x3e,
+ 0x47, 0x39, 0x39, 0x46, 0x38, 0x3a, 0x45, 0x36, 0x3a, 0x43, 0x32, 0x38,
+ 0x42, 0x31, 0x37, 0x40, 0x2f, 0x35, 0x42, 0x31, 0x37, 0x40, 0x30, 0x33,
+ 0x3d, 0x2e, 0x2c, 0x39, 0x32, 0x2f, 0x72, 0x73, 0x73, 0x86, 0x8b, 0x91,
+ 0x7b, 0x7e, 0x8d, 0x71, 0x74, 0x85, 0x66, 0x68, 0x77, 0x55, 0x57, 0x64,
+ 0x46, 0x46, 0x4e, 0x36, 0x37, 0x3d, 0x30, 0x31, 0x36, 0x30, 0x2f, 0x34,
+ 0x2b, 0x2a, 0x2e, 0x29, 0x29, 0x2b, 0x22, 0x22, 0x24, 0x12, 0x14, 0x13,
+ 0x0f, 0x11, 0x10, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x12, 0x11, 0x11, 0x13,
+ 0x16, 0x16, 0x18, 0x1d, 0x1d, 0x1d, 0x25, 0x1f, 0x21, 0x3b, 0x30, 0x31,
+ 0x4b, 0x39, 0x39, 0x80, 0x7c, 0x85, 0xcd, 0xd8, 0xeb, 0xc2, 0xd3, 0xea,
+ 0xc0, 0xcf, 0xe4, 0xc8, 0xd5, 0xe8, 0xc1, 0xca, 0xe1, 0x92, 0x97, 0xb1,
+ 0x90, 0x90, 0x92, 0xad, 0xac, 0xa4, 0xb4, 0xb3, 0xa1, 0xb8, 0xb6, 0x9f,
+ 0xc1, 0xbc, 0xa6, 0xc6, 0xc1, 0xae, 0xc5, 0xc2, 0xb1, 0xd2, 0xcf, 0xc1,
+ 0xdd, 0xdc, 0xd4, 0xc1, 0xc0, 0xb8, 0xc8, 0xc8, 0xc0, 0xc3, 0xc3, 0xb7,
+ 0xb8, 0xb9, 0xa9, 0xc9, 0xca, 0xb7, 0xc2, 0xc3, 0xb3, 0xc7, 0xc7, 0xbb,
+ 0xd5, 0xd1, 0xca, 0xc2, 0xbf, 0xb8, 0xbb, 0xbb, 0xb3, 0xb9, 0xbb, 0xb0,
+ 0xb8, 0xbb, 0xaf, 0xad, 0xaa, 0xa6, 0x6f, 0x67, 0x70, 0x46, 0x39, 0x4b,
+ 0x40, 0x36, 0x3d, 0x3d, 0x34, 0x36, 0x3b, 0x34, 0x32, 0x37, 0x32, 0x2e,
+ 0x3a, 0x35, 0x34, 0x43, 0x3f, 0x41, 0x35, 0x33, 0x36, 0x26, 0x26, 0x28,
+ 0x27, 0x28, 0x2d, 0x24, 0x25, 0x2a, 0x26, 0x28, 0x2c, 0x2a, 0x2b, 0x2f,
+ 0x2e, 0x2f, 0x33, 0x2e, 0x30, 0x33, 0x31, 0x32, 0x36, 0x3b, 0x3d, 0x40,
+ 0x4f, 0x53, 0x54, 0x6a, 0x6e, 0x6f, 0x81, 0x85, 0x83, 0x9d, 0xa2, 0x9e,
+ 0xb2, 0xb8, 0xb2, 0xc1, 0xc6, 0xc0, 0xc6, 0xcb, 0xc5, 0xc3, 0xc7, 0xc1,
+ 0xce, 0xd1, 0xc6, 0xce, 0xcf, 0xc2, 0xce, 0xd1, 0xc1, 0xca, 0xcc, 0xbb,
+ 0xc5, 0xc9, 0xba, 0xbe, 0xc1, 0xb6, 0xba, 0xbc, 0xb5, 0xb4, 0xb6, 0xb3,
+ 0xa8, 0xaa, 0xa9, 0x97, 0x9b, 0x9b, 0x85, 0x8b, 0x8b, 0x79, 0x7f, 0x80,
+ 0x70, 0x71, 0x75, 0x63, 0x64, 0x66, 0x5a, 0x5e, 0x5f, 0x55, 0x5b, 0x5b,
+ 0x4c, 0x52, 0x58, 0x4a, 0x4f, 0x55, 0x45, 0x49, 0x50, 0x40, 0x44, 0x4b,
+ 0x40, 0x44, 0x4d, 0x3c, 0x43, 0x4c, 0x3a, 0x43, 0x4c, 0x44, 0x4d, 0x57,
+ 0x41, 0x4a, 0x56, 0x3e, 0x46, 0x53, 0x49, 0x51, 0x5e, 0x4a, 0x53, 0x61,
+ 0x37, 0x40, 0x4f, 0x31, 0x3d, 0x4d, 0x32, 0x3f, 0x4f, 0x31, 0x3f, 0x50,
+ 0x34, 0x46, 0x52, 0x40, 0x50, 0x5d, 0x51, 0x5f, 0x6c, 0x54, 0x62, 0x6f,
+ 0x5c, 0x6d, 0x77, 0x90, 0xa1, 0xa9, 0xce, 0xdb, 0xe2, 0xdb, 0xe3, 0xea,
+ 0xbf, 0xc4, 0xc9, 0xcf, 0xd3, 0xdb, 0xd1, 0xd5, 0xdf, 0xb5, 0xb8, 0xc3,
+ 0xa9, 0xad, 0xb8, 0xad, 0xb2, 0xbc, 0xb0, 0xb7, 0xbf, 0x94, 0x9b, 0xa2,
+ 0x70, 0x76, 0x84, 0x89, 0x90, 0x98, 0xb3, 0xbd, 0xbf, 0xb9, 0xc3, 0xc4,
+ 0xb8, 0xc3, 0xc5, 0xb5, 0xbf, 0xc8, 0xb1, 0xbe, 0xc7, 0xb1, 0xbc, 0xc8,
+ 0xb8, 0xc1, 0xcc, 0xbe, 0xc6, 0xd3, 0xac, 0xb4, 0xc1, 0x95, 0x9c, 0xa5,
+ 0x9a, 0xa1, 0xa7, 0xb6, 0xbd, 0xc3, 0xc0, 0xc7, 0xcf, 0xbf, 0xc7, 0xd0,
+ 0xbf, 0xc9, 0xd2, 0xb4, 0xbe, 0xc8, 0x8d, 0x96, 0xa5, 0x7e, 0x87, 0x99,
+ 0x8b, 0x94, 0xa5, 0x85, 0x8e, 0x9e, 0x98, 0xa3, 0xaa, 0xb6, 0xc1, 0xc4,
+ 0xbc, 0xc9, 0xd0, 0xbc, 0xc9, 0xd2, 0xbb, 0xc9, 0xd3, 0xb9, 0xc7, 0xd2,
+ 0xba, 0xc7, 0xd5, 0xb9, 0xc6, 0xd5, 0xb8, 0xc4, 0xd5, 0xb5, 0xc2, 0xd2,
+ 0x22, 0x27, 0x2a, 0x15, 0x1a, 0x1e, 0x25, 0x2c, 0x2f, 0x4b, 0x53, 0x56,
+ 0x49, 0x51, 0x54, 0x52, 0x5a, 0x5d, 0x62, 0x67, 0x6a, 0x51, 0x56, 0x59,
+ 0x2c, 0x39, 0x3e, 0x1d, 0x28, 0x2e, 0x32, 0x3b, 0x42, 0x4b, 0x53, 0x59,
+ 0x40, 0x48, 0x4b, 0x1d, 0x24, 0x24, 0x15, 0x17, 0x14, 0x18, 0x17, 0x14,
+ 0x1a, 0x1b, 0x1d, 0x1d, 0x1e, 0x20, 0x1f, 0x20, 0x1f, 0x1e, 0x1e, 0x1e,
+ 0x1c, 0x1e, 0x1d, 0x18, 0x1a, 0x19, 0x15, 0x19, 0x18, 0x14, 0x19, 0x18,
+ 0x14, 0x16, 0x13, 0x18, 0x1a, 0x19, 0x1a, 0x1d, 0x1e, 0x1d, 0x21, 0x22,
+ 0x20, 0x24, 0x27, 0x23, 0x26, 0x29, 0x1e, 0x22, 0x25, 0x1f, 0x23, 0x25,
+ 0x22, 0x23, 0x27, 0x21, 0x22, 0x26, 0x23, 0x24, 0x29, 0x2a, 0x2a, 0x34,
+ 0x26, 0x28, 0x35, 0x24, 0x27, 0x32, 0x25, 0x28, 0x2f, 0x22, 0x26, 0x28,
+ 0x10, 0x12, 0x11, 0x06, 0x08, 0x07, 0x05, 0x07, 0x05, 0x07, 0x09, 0x06,
+ 0x06, 0x08, 0x07, 0x10, 0x13, 0x16, 0x2b, 0x2e, 0x36, 0x2b, 0x2f, 0x38,
+ 0x29, 0x2c, 0x33, 0x2e, 0x31, 0x3a, 0x2c, 0x2f, 0x38, 0x33, 0x37, 0x40,
+ 0x29, 0x2d, 0x36, 0x26, 0x2a, 0x33, 0x2b, 0x2e, 0x37, 0x2b, 0x2b, 0x35,
+ 0x2a, 0x30, 0x3a, 0x2c, 0x30, 0x3b, 0x24, 0x28, 0x30, 0x10, 0x14, 0x19,
+ 0x12, 0x13, 0x18, 0x14, 0x14, 0x16, 0x15, 0x15, 0x17, 0x16, 0x16, 0x18,
+ 0x15, 0x16, 0x16, 0x14, 0x16, 0x15, 0x0f, 0x11, 0x0f, 0x11, 0x13, 0x12,
+ 0x12, 0x13, 0x14, 0x10, 0x11, 0x13, 0x10, 0x11, 0x13, 0x10, 0x11, 0x13,
+ 0x11, 0x13, 0x12, 0x10, 0x12, 0x11, 0x10, 0x12, 0x11, 0x12, 0x12, 0x12,
+ 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x0a, 0x0a, 0x0a,
+ 0x04, 0x04, 0x05, 0x07, 0x07, 0x07, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x06, 0x06, 0x06,
+ 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0a, 0x0a, 0x08, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x09, 0x18, 0x18, 0x18,
+ 0x23, 0x24, 0x23, 0x1a, 0x1c, 0x1b, 0x13, 0x15, 0x14, 0x16, 0x18, 0x17,
+ 0x1d, 0x1f, 0x1e, 0x11, 0x10, 0x11, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c,
+ 0x10, 0x10, 0x0e, 0x16, 0x15, 0x13, 0x14, 0x13, 0x11, 0x16, 0x15, 0x14,
+ 0x1b, 0x19, 0x1a, 0x1b, 0x19, 0x1a, 0x1b, 0x1a, 0x18, 0x1a, 0x19, 0x17,
+ 0x19, 0x18, 0x16, 0x20, 0x1e, 0x1f, 0x1d, 0x1d, 0x1d, 0x12, 0x12, 0x14,
+ 0x16, 0x15, 0x16, 0x1a, 0x18, 0x19, 0x1e, 0x1c, 0x1d, 0x1c, 0x1a, 0x1b,
+ 0x18, 0x16, 0x17, 0x16, 0x14, 0x15, 0x11, 0x0f, 0x10, 0x0e, 0x0c, 0x0d,
+ 0x0f, 0x0d, 0x0e, 0x23, 0x1f, 0x20, 0x27, 0x21, 0x23, 0x2a, 0x24, 0x26,
+ 0x2f, 0x26, 0x29, 0x30, 0x27, 0x2a, 0x37, 0x2e, 0x31, 0x39, 0x30, 0x35,
+ 0x2f, 0x28, 0x2f, 0x36, 0x2f, 0x36, 0x39, 0x31, 0x36, 0x3f, 0x32, 0x38,
+ 0x4c, 0x3b, 0x41, 0x51, 0x40, 0x46, 0x4b, 0x3c, 0x41, 0x41, 0x35, 0x39,
+ 0x3f, 0x33, 0x35, 0x44, 0x36, 0x39, 0x45, 0x35, 0x3a, 0x44, 0x33, 0x39,
+ 0x41, 0x30, 0x36, 0x3e, 0x2d, 0x33, 0x3d, 0x2c, 0x32, 0x3c, 0x2c, 0x2f,
+ 0x35, 0x25, 0x28, 0x33, 0x29, 0x2a, 0x5d, 0x5b, 0x5d, 0x74, 0x73, 0x7a,
+ 0x69, 0x67, 0x74, 0x5d, 0x5b, 0x69, 0x51, 0x4f, 0x5a, 0x43, 0x42, 0x49,
+ 0x37, 0x37, 0x3f, 0x33, 0x34, 0x39, 0x32, 0x31, 0x37, 0x2e, 0x2d, 0x33,
+ 0x2a, 0x29, 0x2e, 0x28, 0x27, 0x2c, 0x1f, 0x1e, 0x23, 0x11, 0x12, 0x13,
+ 0x0f, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x14, 0x14, 0x16,
+ 0x17, 0x17, 0x19, 0x1b, 0x1b, 0x1b, 0x20, 0x1c, 0x1d, 0x35, 0x2c, 0x2f,
+ 0x43, 0x36, 0x36, 0x6c, 0x68, 0x71, 0xcc, 0xd3, 0xe5, 0xc4, 0xd5, 0xe8,
+ 0xbd, 0xcc, 0xdb, 0xc3, 0xc9, 0xd7, 0xbc, 0xbb, 0xce, 0x92, 0x8e, 0xa5,
+ 0x9c, 0x9c, 0xa1, 0xa5, 0xa6, 0xa1, 0xac, 0xac, 0x9e, 0xb6, 0xb5, 0xa1,
+ 0xbc, 0xba, 0xa5, 0xbe, 0xbb, 0xa8, 0xc2, 0xc1, 0xaf, 0xc9, 0xc8, 0xb6,
+ 0xcb, 0xc8, 0xb7, 0xc4, 0xc1, 0xb0, 0xcf, 0xcc, 0xbc, 0xc7, 0xc4, 0xb4,
+ 0xbc, 0xbb, 0xa7, 0xb9, 0xb8, 0xa6, 0xb9, 0xb8, 0xaa, 0xba, 0xb7, 0xae,
+ 0xba, 0xb6, 0xad, 0xb5, 0xb2, 0xa9, 0xb0, 0xb0, 0xa6, 0xb2, 0xb2, 0xa8,
+ 0xb3, 0xb3, 0xab, 0x81, 0x7b, 0x79, 0x4b, 0x41, 0x49, 0x3d, 0x31, 0x3d,
+ 0x38, 0x2f, 0x33, 0x37, 0x2f, 0x2f, 0x38, 0x30, 0x2d, 0x35, 0x30, 0x2c,
+ 0x35, 0x30, 0x2f, 0x38, 0x36, 0x37, 0x2b, 0x2a, 0x2c, 0x21, 0x21, 0x23,
+ 0x21, 0x22, 0x23, 0x24, 0x25, 0x27, 0x26, 0x27, 0x29, 0x27, 0x28, 0x2a,
+ 0x29, 0x2a, 0x2c, 0x2d, 0x2e, 0x30, 0x2e, 0x2f, 0x31, 0x30, 0x31, 0x33,
+ 0x34, 0x37, 0x38, 0x45, 0x49, 0x4a, 0x5a, 0x5e, 0x5f, 0x6c, 0x70, 0x71,
+ 0x7a, 0x7e, 0x7f, 0x87, 0x8b, 0x8c, 0x98, 0x9c, 0x9f, 0xa5, 0xa9, 0xab,
+ 0xb4, 0xb7, 0xb2, 0xbd, 0xc0, 0xba, 0xc2, 0xc5, 0xbc, 0xc1, 0xc4, 0xba,
+ 0xbc, 0xbf, 0xb7, 0xa9, 0xab, 0xa7, 0x93, 0x94, 0x96, 0x7b, 0x7c, 0x80,
+ 0x66, 0x6b, 0x71, 0x52, 0x59, 0x5f, 0x47, 0x50, 0x56, 0x42, 0x49, 0x51,
+ 0x41, 0x45, 0x4e, 0x3f, 0x42, 0x4b, 0x3e, 0x42, 0x49, 0x3f, 0x46, 0x4c,
+ 0x3b, 0x42, 0x4c, 0x39, 0x40, 0x48, 0x3c, 0x41, 0x4a, 0x3e, 0x42, 0x4b,
+ 0x3c, 0x40, 0x49, 0x36, 0x3c, 0x45, 0x35, 0x3c, 0x44, 0x33, 0x3b, 0x44,
+ 0x37, 0x3b, 0x44, 0x39, 0x3c, 0x45, 0x37, 0x3b, 0x44, 0x34, 0x39, 0x44,
+ 0x35, 0x3a, 0x45, 0x39, 0x3d, 0x48, 0x3a, 0x3d, 0x4a, 0x39, 0x3f, 0x4a,
+ 0x3b, 0x49, 0x4f, 0x45, 0x52, 0x5a, 0x4b, 0x57, 0x60, 0x50, 0x5c, 0x68,
+ 0x52, 0x60, 0x6b, 0x83, 0x92, 0x99, 0xbe, 0xcb, 0xd0, 0xdc, 0xe4, 0xe8,
+ 0xed, 0xef, 0xee, 0xfa, 0xfc, 0xfd, 0xe6, 0xe6, 0xec, 0xc5, 0xc7, 0xd0,
+ 0xb4, 0xb8, 0xc4, 0xb0, 0xb6, 0xc2, 0xa6, 0xaf, 0xb8, 0x81, 0x8a, 0x93,
+ 0x81, 0x88, 0x92, 0xa9, 0xb0, 0xb6, 0xb4, 0xbe, 0xbf, 0xb6, 0xc0, 0xc1,
+ 0xb6, 0xc1, 0xc5, 0xb3, 0xbf, 0xc7, 0xa9, 0xb6, 0xc0, 0xa4, 0xb2, 0xba,
+ 0xaa, 0xb5, 0xbb, 0xa8, 0xb2, 0xba, 0xa0, 0xab, 0xb3, 0xa0, 0xab, 0xb1,
+ 0x97, 0xa2, 0xa4, 0xa6, 0xb2, 0xb3, 0xbe, 0xc9, 0xca, 0xc0, 0xcb, 0xd1,
+ 0xb9, 0xc2, 0xd4, 0x89, 0x92, 0xa1, 0x80, 0x8a, 0x94, 0xa4, 0xae, 0xb7,
+ 0xbd, 0xc7, 0xd2, 0xab, 0xb4, 0xbf, 0x7a, 0x84, 0x8c, 0xa0, 0xab, 0xb2,
+ 0xbb, 0xc7, 0xcf, 0xbb, 0xc8, 0xd1, 0xba, 0xc8, 0xd3, 0xba, 0xc8, 0xd5,
+ 0xb8, 0xc5, 0xd5, 0xb7, 0xc4, 0xd4, 0xb4, 0xc1, 0xd1, 0xb1, 0xbe, 0xce,
+ 0x33, 0x38, 0x3c, 0x3e, 0x43, 0x47, 0x27, 0x2f, 0x34, 0x27, 0x30, 0x35,
+ 0x41, 0x4a, 0x51, 0x51, 0x5a, 0x61, 0x53, 0x5a, 0x60, 0x32, 0x3a, 0x40,
+ 0x11, 0x1e, 0x28, 0x0f, 0x1b, 0x27, 0x12, 0x1d, 0x28, 0x28, 0x32, 0x3c,
+ 0x45, 0x4f, 0x56, 0x46, 0x4e, 0x51, 0x2b, 0x2c, 0x2e, 0x1a, 0x19, 0x18,
+ 0x16, 0x16, 0x18, 0x1a, 0x1b, 0x1d, 0x1b, 0x1c, 0x1c, 0x1b, 0x1d, 0x1c,
+ 0x1d, 0x1f, 0x1e, 0x18, 0x1a, 0x19, 0x13, 0x17, 0x17, 0x17, 0x1b, 0x1c,
+ 0x14, 0x16, 0x13, 0x17, 0x18, 0x16, 0x1b, 0x1c, 0x1c, 0x21, 0x22, 0x24,
+ 0x23, 0x25, 0x27, 0x23, 0x24, 0x27, 0x1f, 0x22, 0x23, 0x20, 0x24, 0x25,
+ 0x21, 0x23, 0x27, 0x1e, 0x1f, 0x23, 0x22, 0x23, 0x27, 0x27, 0x2a, 0x2f,
+ 0x24, 0x27, 0x30, 0x25, 0x28, 0x31, 0x29, 0x2c, 0x33, 0x28, 0x2a, 0x2f,
+ 0x14, 0x16, 0x18, 0x06, 0x08, 0x08, 0x05, 0x07, 0x05, 0x07, 0x08, 0x06,
+ 0x08, 0x09, 0x09, 0x0d, 0x0e, 0x12, 0x26, 0x29, 0x2e, 0x2b, 0x2e, 0x35,
+ 0x2c, 0x2f, 0x38, 0x2a, 0x2d, 0x36, 0x28, 0x2c, 0x35, 0x27, 0x2b, 0x34,
+ 0x27, 0x2b, 0x34, 0x2b, 0x2d, 0x36, 0x29, 0x2c, 0x35, 0x2d, 0x2d, 0x35,
+ 0x2a, 0x2e, 0x37, 0x2a, 0x2e, 0x37, 0x26, 0x2a, 0x31, 0x15, 0x17, 0x1e,
+ 0x12, 0x13, 0x18, 0x13, 0x13, 0x17, 0x15, 0x15, 0x17, 0x14, 0x14, 0x14,
+ 0x14, 0x16, 0x15, 0x13, 0x15, 0x14, 0x13, 0x15, 0x14, 0x13, 0x15, 0x15,
+ 0x12, 0x13, 0x14, 0x13, 0x14, 0x16, 0x12, 0x13, 0x15, 0x13, 0x14, 0x16,
+ 0x11, 0x13, 0x12, 0x11, 0x13, 0x12, 0x11, 0x13, 0x12, 0x13, 0x15, 0x14,
+ 0x14, 0x15, 0x14, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x1b, 0x1b, 0x1a, 0x26, 0x26, 0x24,
+ 0x0f, 0x0f, 0x0f, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x08, 0x08, 0x08,
+ 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x07, 0x0b, 0x0b, 0x0a, 0x09, 0x09, 0x09, 0x12, 0x12, 0x12,
+ 0x1a, 0x1c, 0x1b, 0x14, 0x16, 0x15, 0x11, 0x13, 0x12, 0x1a, 0x1d, 0x1b,
+ 0x24, 0x26, 0x25, 0x16, 0x17, 0x17, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0d, 0x14, 0x13, 0x11, 0x11, 0x10, 0x0e, 0x17, 0x16, 0x14,
+ 0x1a, 0x18, 0x19, 0x1a, 0x18, 0x19, 0x1d, 0x1b, 0x1a, 0x19, 0x18, 0x16,
+ 0x1c, 0x1b, 0x19, 0x1d, 0x1d, 0x1d, 0x16, 0x16, 0x16, 0x0e, 0x0f, 0x11,
+ 0x17, 0x15, 0x16, 0x1e, 0x1c, 0x1d, 0x22, 0x20, 0x21, 0x1b, 0x19, 0x1a,
+ 0x16, 0x14, 0x15, 0x17, 0x15, 0x16, 0x0f, 0x0d, 0x0e, 0x0c, 0x0a, 0x0c,
+ 0x0e, 0x0c, 0x0e, 0x23, 0x1e, 0x22, 0x25, 0x1f, 0x22, 0x2b, 0x22, 0x27,
+ 0x2f, 0x26, 0x2b, 0x2f, 0x26, 0x2b, 0x38, 0x31, 0x35, 0x40, 0x3a, 0x3e,
+ 0x2f, 0x29, 0x2f, 0x34, 0x2f, 0x35, 0x37, 0x35, 0x3a, 0x31, 0x2b, 0x2f,
+ 0x35, 0x2a, 0x30, 0x39, 0x2c, 0x33, 0x3b, 0x30, 0x36, 0x3b, 0x32, 0x37,
+ 0x3d, 0x32, 0x38, 0x42, 0x37, 0x3d, 0x46, 0x3a, 0x40, 0x45, 0x36, 0x3d,
+ 0x3d, 0x2e, 0x35, 0x3c, 0x2d, 0x34, 0x36, 0x29, 0x30, 0x31, 0x25, 0x29,
+ 0x2d, 0x21, 0x27, 0x27, 0x1f, 0x24, 0x45, 0x43, 0x47, 0x59, 0x58, 0x5e,
+ 0x52, 0x4f, 0x5b, 0x4b, 0x48, 0x54, 0x41, 0x3e, 0x46, 0x39, 0x37, 0x3d,
+ 0x34, 0x35, 0x3b, 0x32, 0x33, 0x38, 0x30, 0x31, 0x36, 0x2a, 0x2a, 0x2f,
+ 0x29, 0x28, 0x2e, 0x25, 0x25, 0x2a, 0x1b, 0x1c, 0x20, 0x10, 0x11, 0x14,
+ 0x0f, 0x11, 0x10, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x12,
+ 0x14, 0x14, 0x16, 0x18, 0x18, 0x18, 0x1c, 0x1b, 0x1b, 0x2d, 0x26, 0x28,
+ 0x40, 0x36, 0x37, 0x52, 0x4d, 0x54, 0xb2, 0xb7, 0xc4, 0xcb, 0xd9, 0xe8,
+ 0xc0, 0xcc, 0xd9, 0xb5, 0xb2, 0xc1, 0x98, 0x8b, 0x9c, 0x80, 0x74, 0x83,
+ 0x9d, 0x9a, 0xa1, 0x99, 0x95, 0x96, 0x93, 0x8f, 0x86, 0xae, 0xab, 0x9c,
+ 0xbd, 0xba, 0xa9, 0xbb, 0xb8, 0xa7, 0xbc, 0xbb, 0xa9, 0xc3, 0xc4, 0xaf,
+ 0xc8, 0xc4, 0xae, 0xc8, 0xc3, 0xaf, 0xc5, 0xc2, 0xae, 0xc0, 0xbd, 0xaa,
+ 0xba, 0xb8, 0xa4, 0xb3, 0xb1, 0x9f, 0xb7, 0xb3, 0xa7, 0xb7, 0xb3, 0xaa,
+ 0xb2, 0xb0, 0xa4, 0xb3, 0xaf, 0xa4, 0xb0, 0xad, 0xa4, 0xac, 0xa7, 0xa0,
+ 0x89, 0x81, 0x80, 0x52, 0x49, 0x4c, 0x3f, 0x34, 0x3b, 0x3a, 0x2f, 0x35,
+ 0x33, 0x2a, 0x2d, 0x34, 0x2b, 0x2a, 0x38, 0x30, 0x2d, 0x34, 0x2f, 0x2b,
+ 0x2c, 0x28, 0x27, 0x25, 0x23, 0x26, 0x21, 0x22, 0x24, 0x1e, 0x1f, 0x21,
+ 0x1f, 0x21, 0x20, 0x22, 0x24, 0x23, 0x23, 0x24, 0x24, 0x25, 0x27, 0x26,
+ 0x28, 0x29, 0x2a, 0x28, 0x29, 0x2b, 0x2b, 0x2b, 0x2e, 0x2e, 0x2f, 0x31,
+ 0x2b, 0x31, 0x2f, 0x2d, 0x33, 0x31, 0x35, 0x3b, 0x3b, 0x41, 0x46, 0x49,
+ 0x4b, 0x50, 0x54, 0x51, 0x55, 0x5b, 0x58, 0x5d, 0x63, 0x69, 0x6e, 0x74,
+ 0x76, 0x7a, 0x7b, 0x81, 0x85, 0x89, 0x80, 0x83, 0x8b, 0x75, 0x77, 0x84,
+ 0x67, 0x69, 0x77, 0x57, 0x59, 0x65, 0x4c, 0x4f, 0x58, 0x44, 0x48, 0x4f,
+ 0x40, 0x48, 0x51, 0x3c, 0x45, 0x4e, 0x40, 0x4a, 0x53, 0x3e, 0x47, 0x50,
+ 0x3b, 0x42, 0x4c, 0x3e, 0x43, 0x4c, 0x3e, 0x43, 0x4b, 0x3d, 0x44, 0x4c,
+ 0x3c, 0x43, 0x4b, 0x3a, 0x42, 0x49, 0x3b, 0x41, 0x48, 0x3c, 0x41, 0x47,
+ 0x38, 0x3d, 0x43, 0x36, 0x3b, 0x41, 0x37, 0x3c, 0x42, 0x34, 0x39, 0x3f,
+ 0x33, 0x3b, 0x3d, 0x36, 0x3e, 0x41, 0x35, 0x3f, 0x41, 0x34, 0x3d, 0x42,
+ 0x33, 0x3c, 0x42, 0x34, 0x3d, 0x43, 0x33, 0x3b, 0x41, 0x36, 0x3d, 0x42,
+ 0x39, 0x43, 0x46, 0x3d, 0x46, 0x4b, 0x3d, 0x46, 0x4d, 0x46, 0x50, 0x59,
+ 0x47, 0x54, 0x5c, 0x6a, 0x78, 0x7e, 0x96, 0xa2, 0xa6, 0xdd, 0xe6, 0xe8,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf4, 0xf5, 0xf6, 0xdd, 0xde, 0xe4,
+ 0xc3, 0xc7, 0xd0, 0xb2, 0xb8, 0xc2, 0xa7, 0xb0, 0xb9, 0xa3, 0xac, 0xb6,
+ 0xa6, 0xae, 0xb4, 0xad, 0xb5, 0xb9, 0xad, 0xb7, 0xb8, 0xb2, 0xbc, 0xbe,
+ 0xac, 0xb6, 0xbd, 0x8d, 0x98, 0xa1, 0x7a, 0x87, 0x8f, 0x71, 0x7e, 0x84,
+ 0x7f, 0x8d, 0x8e, 0x92, 0xa0, 0xa2, 0x84, 0x92, 0x95, 0x97, 0xa5, 0xa8,
+ 0xb0, 0xbe, 0xbe, 0xb5, 0xc4, 0xc3, 0xbb, 0xca, 0xcb, 0xbd, 0xcb, 0xd1,
+ 0xa9, 0xb1, 0xc7, 0x89, 0x93, 0xa1, 0xa8, 0xb3, 0xb9, 0xbd, 0xc8, 0xcc,
+ 0xc3, 0xcc, 0xd5, 0xaf, 0xb7, 0xc2, 0x77, 0x7f, 0x89, 0x99, 0xa2, 0xab,
+ 0xbc, 0xc6, 0xcf, 0xbc, 0xc9, 0xd2, 0xbc, 0xc8, 0xd4, 0xba, 0xc8, 0xd5,
+ 0xb7, 0xc4, 0xd4, 0xb5, 0xc2, 0xd2, 0xb5, 0xc1, 0xcf, 0xaf, 0xbb, 0xca,
+ 0x26, 0x2b, 0x31, 0x45, 0x4c, 0x52, 0x46, 0x4f, 0x56, 0x25, 0x30, 0x38,
+ 0x34, 0x3e, 0x47, 0x3d, 0x48, 0x51, 0x42, 0x4b, 0x53, 0x4a, 0x51, 0x5b,
+ 0x26, 0x30, 0x39, 0x12, 0x1c, 0x26, 0x11, 0x1b, 0x27, 0x13, 0x1e, 0x29,
+ 0x1d, 0x2a, 0x33, 0x3e, 0x49, 0x4f, 0x4f, 0x55, 0x59, 0x36, 0x37, 0x3b,
+ 0x19, 0x1d, 0x1e, 0x15, 0x19, 0x1a, 0x1a, 0x1b, 0x1d, 0x1a, 0x1c, 0x1b,
+ 0x1b, 0x1d, 0x1c, 0x1a, 0x1c, 0x1a, 0x19, 0x1b, 0x1b, 0x1b, 0x1c, 0x1d,
+ 0x1d, 0x1e, 0x1e, 0x1c, 0x1d, 0x1d, 0x1c, 0x1c, 0x1f, 0x20, 0x21, 0x25,
+ 0x23, 0x24, 0x28, 0x25, 0x26, 0x2a, 0x21, 0x22, 0x26, 0x22, 0x23, 0x27,
+ 0x22, 0x22, 0x29, 0x20, 0x21, 0x25, 0x1f, 0x23, 0x24, 0x23, 0x27, 0x28,
+ 0x23, 0x27, 0x2c, 0x23, 0x26, 0x2e, 0x29, 0x2c, 0x35, 0x29, 0x2c, 0x33,
+ 0x16, 0x18, 0x1c, 0x08, 0x09, 0x0b, 0x09, 0x09, 0x0a, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x25, 0x26, 0x2a, 0x2a, 0x2d, 0x33,
+ 0x2c, 0x2f, 0x38, 0x29, 0x2c, 0x36, 0x28, 0x2c, 0x35, 0x28, 0x2c, 0x35,
+ 0x25, 0x2a, 0x30, 0x2a, 0x2d, 0x34, 0x29, 0x2c, 0x33, 0x2e, 0x2f, 0x37,
+ 0x2a, 0x2d, 0x34, 0x2c, 0x2f, 0x36, 0x2b, 0x2e, 0x34, 0x17, 0x19, 0x1f,
+ 0x10, 0x14, 0x17, 0x13, 0x14, 0x16, 0x15, 0x16, 0x18, 0x12, 0x14, 0x14,
+ 0x11, 0x13, 0x12, 0x13, 0x15, 0x14, 0x1e, 0x20, 0x1f, 0x15, 0x17, 0x16,
+ 0x11, 0x12, 0x14, 0x11, 0x12, 0x14, 0x12, 0x13, 0x15, 0x10, 0x11, 0x13,
+ 0x0f, 0x11, 0x10, 0x10, 0x12, 0x11, 0x0f, 0x11, 0x10, 0x11, 0x12, 0x11,
+ 0x14, 0x14, 0x14, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0c, 0x16, 0x16, 0x14, 0x3a, 0x3a, 0x38,
+ 0x2f, 0x2f, 0x2e, 0x0f, 0x0f, 0x0f, 0x04, 0x04, 0x04, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x0a, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x11,
+ 0x0e, 0x0f, 0x11, 0x0d, 0x0f, 0x0e, 0x0c, 0x0d, 0x0d, 0x15, 0x17, 0x16,
+ 0x24, 0x26, 0x25, 0x15, 0x17, 0x16, 0x0b, 0x0c, 0x0c, 0x14, 0x14, 0x14,
+ 0x0f, 0x0e, 0x0c, 0x10, 0x0f, 0x0d, 0x12, 0x11, 0x0f, 0x19, 0x16, 0x15,
+ 0x18, 0x15, 0x16, 0x1a, 0x18, 0x19, 0x1b, 0x19, 0x18, 0x15, 0x14, 0x12,
+ 0x20, 0x1f, 0x1d, 0x1e, 0x1e, 0x1e, 0x10, 0x12, 0x12, 0x10, 0x11, 0x13,
+ 0x15, 0x13, 0x14, 0x1f, 0x1d, 0x1e, 0x21, 0x1f, 0x20, 0x17, 0x15, 0x16,
+ 0x15, 0x13, 0x14, 0x17, 0x15, 0x16, 0x0d, 0x0b, 0x0c, 0x0e, 0x0c, 0x0d,
+ 0x11, 0x0f, 0x12, 0x22, 0x1e, 0x22, 0x27, 0x21, 0x24, 0x2e, 0x25, 0x2a,
+ 0x33, 0x2a, 0x2f, 0x31, 0x28, 0x2d, 0x37, 0x31, 0x35, 0x3e, 0x38, 0x3a,
+ 0x30, 0x29, 0x30, 0x2f, 0x2a, 0x30, 0x30, 0x2f, 0x34, 0x29, 0x29, 0x2e,
+ 0x32, 0x2c, 0x32, 0x33, 0x28, 0x30, 0x30, 0x26, 0x2e, 0x2f, 0x26, 0x2c,
+ 0x2f, 0x2a, 0x30, 0x2f, 0x29, 0x31, 0x35, 0x2b, 0x35, 0x36, 0x2a, 0x34,
+ 0x32, 0x28, 0x31, 0x32, 0x29, 0x32, 0x2d, 0x26, 0x2d, 0x28, 0x23, 0x28,
+ 0x29, 0x23, 0x27, 0x26, 0x22, 0x25, 0x3b, 0x3a, 0x3e, 0x4b, 0x4b, 0x51,
+ 0x47, 0x45, 0x51, 0x44, 0x40, 0x4e, 0x3b, 0x3a, 0x42, 0x37, 0x37, 0x3d,
+ 0x31, 0x35, 0x39, 0x32, 0x34, 0x39, 0x2e, 0x2f, 0x33, 0x2a, 0x29, 0x2e,
+ 0x29, 0x29, 0x2e, 0x25, 0x26, 0x2a, 0x1b, 0x1c, 0x20, 0x0e, 0x0f, 0x13,
+ 0x0b, 0x0f, 0x0c, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0f, 0x0f, 0x10,
+ 0x15, 0x15, 0x17, 0x1d, 0x1d, 0x1f, 0x1c, 0x1b, 0x1c, 0x26, 0x22, 0x23,
+ 0x34, 0x2e, 0x2d, 0x3f, 0x36, 0x39, 0x85, 0x86, 0x8d, 0xb9, 0xc6, 0xd2,
+ 0xbc, 0xc5, 0xd7, 0x8f, 0x87, 0x9e, 0x68, 0x57, 0x69, 0x68, 0x5b, 0x65,
+ 0x72, 0x66, 0x70, 0x73, 0x68, 0x6c, 0x6e, 0x64, 0x61, 0x84, 0x7b, 0x73,
+ 0xa9, 0xa1, 0x96, 0xb6, 0xb1, 0xa3, 0xb7, 0xb6, 0xa4, 0xb9, 0xbb, 0xa5,
+ 0xc3, 0xc1, 0xac, 0xc7, 0xc4, 0xb1, 0xc2, 0xbf, 0xac, 0xbf, 0xbc, 0xa9,
+ 0xbd, 0xbc, 0xa8, 0xb8, 0xb7, 0xa3, 0xb9, 0xb8, 0xaa, 0xb7, 0xb4, 0xab,
+ 0xb8, 0xb6, 0xa9, 0xba, 0xb6, 0xac, 0xa1, 0x9a, 0x96, 0x7b, 0x6e, 0x72,
+ 0x54, 0x44, 0x4e, 0x41, 0x34, 0x3d, 0x3b, 0x2e, 0x35, 0x39, 0x2f, 0x31,
+ 0x34, 0x2b, 0x2b, 0x34, 0x2c, 0x2a, 0x35, 0x2d, 0x2a, 0x30, 0x2b, 0x29,
+ 0x27, 0x23, 0x24, 0x1e, 0x1e, 0x20, 0x1d, 0x1d, 0x20, 0x1c, 0x1d, 0x1f,
+ 0x1e, 0x21, 0x20, 0x20, 0x22, 0x20, 0x23, 0x25, 0x25, 0x23, 0x25, 0x26,
+ 0x24, 0x25, 0x27, 0x27, 0x28, 0x2a, 0x27, 0x28, 0x2a, 0x29, 0x2a, 0x2d,
+ 0x28, 0x2c, 0x2c, 0x2b, 0x30, 0x30, 0x2e, 0x32, 0x33, 0x2e, 0x32, 0x35,
+ 0x2e, 0x32, 0x35, 0x31, 0x35, 0x39, 0x35, 0x39, 0x3d, 0x3f, 0x42, 0x47,
+ 0x46, 0x4b, 0x4e, 0x49, 0x4e, 0x54, 0x48, 0x4c, 0x56, 0x40, 0x43, 0x52,
+ 0x3e, 0x41, 0x4f, 0x3e, 0x44, 0x50, 0x3d, 0x44, 0x4e, 0x3c, 0x42, 0x49,
+ 0x39, 0x41, 0x49, 0x39, 0x42, 0x49, 0x3c, 0x47, 0x4d, 0x3b, 0x45, 0x4b,
+ 0x39, 0x3e, 0x44, 0x3c, 0x3f, 0x44, 0x41, 0x45, 0x48, 0x3c, 0x42, 0x44,
+ 0x39, 0x41, 0x44, 0x38, 0x40, 0x43, 0x39, 0x40, 0x43, 0x38, 0x3d, 0x40,
+ 0x38, 0x3d, 0x40, 0x36, 0x3a, 0x3e, 0x38, 0x3b, 0x40, 0x33, 0x37, 0x3b,
+ 0x30, 0x39, 0x38, 0x32, 0x3c, 0x3d, 0x32, 0x3d, 0x3e, 0x32, 0x3d, 0x40,
+ 0x32, 0x3d, 0x41, 0x34, 0x3c, 0x42, 0x35, 0x3c, 0x42, 0x37, 0x3e, 0x42,
+ 0x3b, 0x40, 0x44, 0x3c, 0x41, 0x47, 0x3e, 0x42, 0x4b, 0x40, 0x47, 0x51,
+ 0x42, 0x4c, 0x55, 0x4e, 0x59, 0x5f, 0x62, 0x6b, 0x72, 0xbb, 0xc2, 0xc7,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xfd, 0xff, 0xee, 0xef, 0xf4,
+ 0xd4, 0xd7, 0xdc, 0xbb, 0xbe, 0xc5, 0xae, 0xb2, 0xbb, 0xaf, 0xb3, 0xbe,
+ 0xaa, 0xb2, 0xb5, 0xa2, 0xac, 0xad, 0xaa, 0xb4, 0xb7, 0xaf, 0xb8, 0xc0,
+ 0x8d, 0x97, 0xa2, 0x68, 0x72, 0x7c, 0x83, 0x8e, 0x94, 0x86, 0x91, 0x93,
+ 0x7c, 0x89, 0x89, 0x9c, 0xa9, 0xaa, 0xa9, 0xb7, 0xba, 0xae, 0xbc, 0xbf,
+ 0xb6, 0xc4, 0xc7, 0xbb, 0xc9, 0xcc, 0xb6, 0xc5, 0xcb, 0xb5, 0xc4, 0xce,
+ 0xab, 0xb4, 0xc4, 0xa5, 0xaf, 0xb8, 0xb3, 0xbf, 0xc2, 0xbc, 0xc6, 0xcd,
+ 0xb4, 0xbb, 0xc9, 0x8c, 0x93, 0xa3, 0x7a, 0x82, 0x8b, 0xab, 0xb5, 0xb7,
+ 0xbc, 0xc7, 0xcd, 0xbe, 0xc9, 0xd1, 0xbc, 0xc8, 0xd3, 0xb9, 0xc6, 0xd4,
+ 0xb6, 0xc2, 0xd2, 0xb3, 0xbf, 0xcf, 0xb2, 0xbe, 0xcc, 0xaa, 0xb6, 0xc4,
+ 0x39, 0x3e, 0x46, 0x43, 0x49, 0x51, 0x5b, 0x64, 0x6d, 0x49, 0x56, 0x5e,
+ 0x40, 0x4c, 0x55, 0x23, 0x2f, 0x39, 0x2c, 0x36, 0x40, 0x54, 0x5c, 0x66,
+ 0x4f, 0x56, 0x5d, 0x36, 0x3d, 0x45, 0x28, 0x2f, 0x39, 0x27, 0x31, 0x3b,
+ 0x27, 0x34, 0x3e, 0x23, 0x32, 0x3a, 0x34, 0x3f, 0x45, 0x50, 0x56, 0x5d,
+ 0x40, 0x46, 0x47, 0x1f, 0x24, 0x25, 0x13, 0x17, 0x18, 0x17, 0x19, 0x18,
+ 0x19, 0x1b, 0x1a, 0x1b, 0x1c, 0x1c, 0x1b, 0x1c, 0x1d, 0x1e, 0x1e, 0x20,
+ 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x21, 0x21, 0x25, 0x21, 0x20, 0x26,
+ 0x22, 0x21, 0x26, 0x21, 0x22, 0x26, 0x21, 0x22, 0x26, 0x21, 0x23, 0x27,
+ 0x22, 0x23, 0x2c, 0x1e, 0x21, 0x26, 0x20, 0x24, 0x23, 0x21, 0x25, 0x25,
+ 0x21, 0x25, 0x26, 0x23, 0x26, 0x2d, 0x25, 0x28, 0x31, 0x2b, 0x2e, 0x37,
+ 0x1d, 0x1e, 0x23, 0x09, 0x09, 0x0d, 0x09, 0x09, 0x0b, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x08, 0x09, 0x0a, 0x0c, 0x1f, 0x20, 0x24, 0x2b, 0x2c, 0x32,
+ 0x2b, 0x2f, 0x37, 0x2c, 0x30, 0x39, 0x23, 0x27, 0x30, 0x26, 0x2b, 0x31,
+ 0x27, 0x2c, 0x32, 0x29, 0x2d, 0x33, 0x30, 0x33, 0x3a, 0x33, 0x33, 0x3b,
+ 0x2e, 0x31, 0x37, 0x2c, 0x2f, 0x34, 0x2c, 0x2e, 0x34, 0x1b, 0x1e, 0x23,
+ 0x12, 0x16, 0x19, 0x12, 0x15, 0x17, 0x13, 0x16, 0x17, 0x11, 0x14, 0x14,
+ 0x13, 0x16, 0x15, 0x13, 0x15, 0x14, 0x17, 0x19, 0x18, 0x12, 0x14, 0x14,
+ 0x13, 0x14, 0x16, 0x12, 0x13, 0x15, 0x10, 0x11, 0x13, 0x0f, 0x10, 0x12,
+ 0x12, 0x14, 0x13, 0x12, 0x13, 0x13, 0x10, 0x12, 0x11, 0x0d, 0x0f, 0x0e,
+ 0x0d, 0x0f, 0x0e, 0x0e, 0x0f, 0x0e, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x0e, 0x11, 0x11, 0x0f, 0x3a, 0x3a, 0x38,
+ 0x37, 0x37, 0x37, 0x14, 0x14, 0x14, 0x0a, 0x0a, 0x0a, 0x06, 0x06, 0x06,
+ 0x05, 0x04, 0x05, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x07, 0x08, 0x07,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0f, 0x08, 0x09, 0x0a,
+ 0x07, 0x08, 0x0a, 0x09, 0x0b, 0x0a, 0x08, 0x0b, 0x09, 0x12, 0x14, 0x13,
+ 0x20, 0x22, 0x21, 0x11, 0x13, 0x12, 0x0b, 0x0d, 0x0d, 0x12, 0x12, 0x12,
+ 0x0f, 0x0e, 0x0c, 0x12, 0x11, 0x10, 0x16, 0x15, 0x13, 0x1d, 0x18, 0x18,
+ 0x17, 0x15, 0x15, 0x19, 0x17, 0x18, 0x22, 0x21, 0x1f, 0x20, 0x1f, 0x1d,
+ 0x1d, 0x1d, 0x1a, 0x1c, 0x1c, 0x1c, 0x14, 0x15, 0x15, 0x0f, 0x10, 0x12,
+ 0x15, 0x13, 0x14, 0x1d, 0x1b, 0x1c, 0x18, 0x16, 0x17, 0x11, 0x0f, 0x10,
+ 0x15, 0x13, 0x14, 0x13, 0x11, 0x12, 0x0d, 0x0c, 0x0c, 0x0c, 0x0a, 0x0b,
+ 0x17, 0x14, 0x15, 0x2c, 0x29, 0x2a, 0x33, 0x2d, 0x2f, 0x30, 0x28, 0x2d,
+ 0x32, 0x27, 0x2d, 0x2f, 0x26, 0x29, 0x36, 0x30, 0x32, 0x3b, 0x36, 0x38,
+ 0x34, 0x2a, 0x31, 0x31, 0x2a, 0x31, 0x2c, 0x2b, 0x30, 0x2c, 0x2d, 0x32,
+ 0x30, 0x2d, 0x33, 0x32, 0x2a, 0x31, 0x37, 0x2e, 0x35, 0x33, 0x29, 0x30,
+ 0x30, 0x2e, 0x34, 0x2e, 0x2b, 0x33, 0x30, 0x2b, 0x34, 0x30, 0x2a, 0x34,
+ 0x2b, 0x25, 0x2f, 0x2c, 0x29, 0x32, 0x32, 0x31, 0x37, 0x2a, 0x2a, 0x2e,
+ 0x29, 0x27, 0x28, 0x28, 0x28, 0x28, 0x3f, 0x42, 0x43, 0x49, 0x4b, 0x50,
+ 0x45, 0x45, 0x51, 0x40, 0x3f, 0x4d, 0x3a, 0x3a, 0x46, 0x37, 0x39, 0x42,
+ 0x31, 0x35, 0x39, 0x2f, 0x32, 0x35, 0x2c, 0x2d, 0x31, 0x29, 0x2a, 0x2e,
+ 0x26, 0x27, 0x2b, 0x22, 0x23, 0x27, 0x18, 0x19, 0x1d, 0x0d, 0x0f, 0x12,
+ 0x0a, 0x0f, 0x0b, 0x0c, 0x0e, 0x0d, 0x11, 0x11, 0x11, 0x10, 0x10, 0x12,
+ 0x15, 0x15, 0x17, 0x1b, 0x1b, 0x1c, 0x1b, 0x19, 0x1a, 0x22, 0x1e, 0x1f,
+ 0x30, 0x28, 0x26, 0x40, 0x33, 0x33, 0x65, 0x63, 0x67, 0xad, 0xba, 0xc6,
+ 0xa8, 0xb3, 0xc9, 0x7b, 0x73, 0x8f, 0x67, 0x56, 0x6a, 0x66, 0x57, 0x61,
+ 0x66, 0x55, 0x60, 0x67, 0x57, 0x5f, 0x69, 0x59, 0x5a, 0x67, 0x59, 0x56,
+ 0x76, 0x6b, 0x65, 0x89, 0x80, 0x78, 0x97, 0x93, 0x84, 0xa1, 0x9f, 0x8b,
+ 0xac, 0xaa, 0x9b, 0xbb, 0xb9, 0xaa, 0xc4, 0xc1, 0xb2, 0xc2, 0xc1, 0xaf,
+ 0xc1, 0xc2, 0xae, 0xbc, 0xbd, 0xa9, 0xbd, 0xbe, 0xad, 0xb2, 0xb2, 0xa5,
+ 0xa3, 0xa2, 0x99, 0x8c, 0x87, 0x81, 0x67, 0x5c, 0x5e, 0x4f, 0x3e, 0x48,
+ 0x46, 0x34, 0x43, 0x3f, 0x2f, 0x3c, 0x38, 0x2d, 0x32, 0x35, 0x2c, 0x2a,
+ 0x33, 0x2a, 0x2a, 0x33, 0x2c, 0x2a, 0x2f, 0x2a, 0x26, 0x2c, 0x27, 0x25,
+ 0x23, 0x21, 0x22, 0x1e, 0x1e, 0x21, 0x1d, 0x1f, 0x22, 0x1a, 0x1d, 0x1f,
+ 0x1d, 0x1e, 0x1e, 0x1f, 0x21, 0x20, 0x21, 0x22, 0x24, 0x21, 0x22, 0x24,
+ 0x22, 0x23, 0x26, 0x23, 0x24, 0x28, 0x25, 0x26, 0x2a, 0x27, 0x29, 0x2c,
+ 0x25, 0x28, 0x2a, 0x26, 0x2a, 0x2b, 0x2a, 0x2e, 0x2f, 0x2c, 0x30, 0x31,
+ 0x2d, 0x31, 0x32, 0x33, 0x38, 0x38, 0x37, 0x3b, 0x3a, 0x3d, 0x41, 0x41,
+ 0x3d, 0x43, 0x48, 0x3a, 0x41, 0x44, 0x3d, 0x46, 0x46, 0x3b, 0x44, 0x42,
+ 0x37, 0x40, 0x3e, 0x39, 0x42, 0x42, 0x3b, 0x42, 0x46, 0x37, 0x3e, 0x44,
+ 0x38, 0x3f, 0x45, 0x3c, 0x44, 0x49, 0x39, 0x43, 0x45, 0x38, 0x40, 0x43,
+ 0x3c, 0x3f, 0x42, 0x3b, 0x3d, 0x3f, 0x3f, 0x41, 0x40, 0x3b, 0x40, 0x3d,
+ 0x38, 0x40, 0x42, 0x3a, 0x42, 0x44, 0x37, 0x40, 0x3f, 0x37, 0x3d, 0x3d,
+ 0x3a, 0x3e, 0x3f, 0x36, 0x3a, 0x3d, 0x38, 0x3c, 0x3f, 0x37, 0x39, 0x3c,
+ 0x31, 0x36, 0x37, 0x36, 0x3b, 0x3b, 0x36, 0x3b, 0x3f, 0x33, 0x39, 0x3e,
+ 0x35, 0x3a, 0x40, 0x3b, 0x3e, 0x45, 0x3a, 0x3b, 0x43, 0x3b, 0x3d, 0x44,
+ 0x3b, 0x3e, 0x45, 0x3f, 0x40, 0x48, 0x43, 0x44, 0x4d, 0x41, 0x45, 0x4f,
+ 0x40, 0x49, 0x52, 0x42, 0x4c, 0x55, 0x43, 0x4c, 0x55, 0x5a, 0x61, 0x69,
+ 0x9f, 0xa6, 0xaf, 0xd9, 0xdd, 0xe2, 0xf6, 0xfa, 0xff, 0xf4, 0xf7, 0xfd,
+ 0xe6, 0xe7, 0xed, 0xd1, 0xd0, 0xd6, 0xbf, 0xbf, 0xc6, 0xb0, 0xb0, 0xb9,
+ 0x9e, 0xa7, 0xa8, 0xa0, 0xaa, 0xaa, 0xa8, 0xb2, 0xb6, 0xab, 0xb4, 0xbd,
+ 0x91, 0x99, 0xa5, 0x69, 0x71, 0x7c, 0x8b, 0x96, 0x9a, 0xad, 0xb8, 0xb7,
+ 0x8b, 0x96, 0x97, 0x71, 0x7d, 0x7f, 0xa0, 0xab, 0xb1, 0xb3, 0xbf, 0xc4,
+ 0xb7, 0xc4, 0xc9, 0xb8, 0xc5, 0xcc, 0x9d, 0xa9, 0xb4, 0xa7, 0xb3, 0xc1,
+ 0xb6, 0xc1, 0xc8, 0x9d, 0xa8, 0xac, 0x92, 0x9d, 0xa1, 0x98, 0xa1, 0xad,
+ 0x86, 0x8c, 0xa1, 0x7f, 0x86, 0x98, 0x9e, 0xa7, 0xae, 0xbb, 0xc6, 0xc3,
+ 0xbc, 0xc7, 0xcd, 0xbc, 0xc7, 0xcf, 0xbb, 0xc5, 0xcf, 0xb7, 0xc3, 0xd1,
+ 0xb4, 0xc0, 0xd1, 0xb2, 0xbe, 0xcc, 0xac, 0xb8, 0xc6, 0xa2, 0xac, 0xb8,
+ 0x5b, 0x5c, 0x66, 0x67, 0x6a, 0x73, 0x63, 0x68, 0x6e, 0x46, 0x4d, 0x53,
+ 0x4a, 0x51, 0x58, 0x44, 0x4b, 0x51, 0x28, 0x2f, 0x37, 0x23, 0x2a, 0x32,
+ 0x38, 0x42, 0x4d, 0x57, 0x5d, 0x69, 0x5a, 0x5e, 0x67, 0x49, 0x50, 0x59,
+ 0x3f, 0x48, 0x51, 0x37, 0x44, 0x4c, 0x22, 0x2f, 0x36, 0x2f, 0x3d, 0x40,
+ 0x4d, 0x56, 0x59, 0x44, 0x4b, 0x4e, 0x25, 0x2b, 0x29, 0x14, 0x19, 0x16,
+ 0x14, 0x1b, 0x16, 0x19, 0x1c, 0x19, 0x1f, 0x1d, 0x1e, 0x26, 0x21, 0x24,
+ 0x24, 0x22, 0x21, 0x26, 0x25, 0x23, 0x28, 0x28, 0x27, 0x24, 0x26, 0x24,
+ 0x1e, 0x22, 0x21, 0x1c, 0x20, 0x1f, 0x1f, 0x23, 0x22, 0x21, 0x25, 0x24,
+ 0x22, 0x26, 0x27, 0x22, 0x26, 0x27, 0x23, 0x27, 0x29, 0x22, 0x25, 0x2a,
+ 0x23, 0x26, 0x2d, 0x24, 0x27, 0x2e, 0x25, 0x28, 0x2f, 0x28, 0x2a, 0x31,
+ 0x25, 0x25, 0x2a, 0x0c, 0x0b, 0x0d, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05,
+ 0x08, 0x0a, 0x07, 0x05, 0x09, 0x08, 0x14, 0x19, 0x1c, 0x29, 0x2e, 0x32,
+ 0x27, 0x2c, 0x32, 0x29, 0x2e, 0x35, 0x27, 0x2c, 0x32, 0x26, 0x29, 0x30,
+ 0x2a, 0x2d, 0x34, 0x2a, 0x2d, 0x34, 0x2c, 0x2f, 0x36, 0x31, 0x34, 0x3b,
+ 0x32, 0x34, 0x3f, 0x30, 0x33, 0x3c, 0x30, 0x34, 0x39, 0x25, 0x29, 0x2c,
+ 0x13, 0x15, 0x17, 0x13, 0x14, 0x16, 0x14, 0x15, 0x17, 0x16, 0x16, 0x18,
+ 0x15, 0x16, 0x18, 0x11, 0x12, 0x14, 0x12, 0x13, 0x15, 0x12, 0x13, 0x15,
+ 0x12, 0x13, 0x15, 0x11, 0x12, 0x14, 0x12, 0x12, 0x14, 0x10, 0x10, 0x12,
+ 0x12, 0x13, 0x15, 0x12, 0x13, 0x15, 0x0d, 0x0f, 0x0f, 0x0d, 0x0f, 0x0e,
+ 0x0e, 0x10, 0x0f, 0x0d, 0x0f, 0x0e, 0x0e, 0x10, 0x0f, 0x11, 0x13, 0x12,
+ 0x0f, 0x0f, 0x0e, 0x0f, 0x0f, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x0f, 0x0f,
+ 0x10, 0x12, 0x11, 0x0f, 0x11, 0x10, 0x13, 0x15, 0x13, 0x2f, 0x31, 0x30,
+ 0x1c, 0x1d, 0x1d, 0x13, 0x14, 0x15, 0x12, 0x11, 0x14, 0x10, 0x0f, 0x14,
+ 0x09, 0x08, 0x0d, 0x06, 0x06, 0x08, 0x07, 0x06, 0x05, 0x05, 0x05, 0x03,
+ 0x09, 0x09, 0x07, 0x09, 0x08, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, 0x05,
+ 0x06, 0x08, 0x07, 0x07, 0x09, 0x08, 0x05, 0x05, 0x04, 0x07, 0x07, 0x05,
+ 0x09, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0c, 0x07, 0x08, 0x0a,
+ 0x08, 0x09, 0x0b, 0x09, 0x0b, 0x0a, 0x09, 0x09, 0x09, 0x1d, 0x1d, 0x1c,
+ 0x24, 0x24, 0x27, 0x0f, 0x0f, 0x11, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c,
+ 0x0f, 0x0f, 0x0f, 0x13, 0x13, 0x13, 0x14, 0x12, 0x14, 0x1a, 0x17, 0x1a,
+ 0x1c, 0x19, 0x18, 0x1e, 0x1c, 0x1b, 0x2e, 0x2e, 0x2c, 0x28, 0x2a, 0x27,
+ 0x1a, 0x1c, 0x19, 0x1d, 0x1d, 0x1d, 0x18, 0x15, 0x19, 0x15, 0x11, 0x14,
+ 0x1b, 0x19, 0x18, 0x1f, 0x1e, 0x1c, 0x17, 0x15, 0x14, 0x15, 0x13, 0x14,
+ 0x12, 0x10, 0x11, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b,
+ 0x1f, 0x1f, 0x1f, 0x2e, 0x2c, 0x2d, 0x25, 0x20, 0x22, 0x2c, 0x27, 0x2b,
+ 0x30, 0x2a, 0x2e, 0x2f, 0x26, 0x2b, 0x36, 0x2e, 0x32, 0x3b, 0x33, 0x37,
+ 0x34, 0x29, 0x2f, 0x33, 0x29, 0x31, 0x32, 0x2c, 0x32, 0x30, 0x2c, 0x32,
+ 0x28, 0x25, 0x2b, 0x25, 0x20, 0x26, 0x2a, 0x23, 0x28, 0x2d, 0x25, 0x2a,
+ 0x2c, 0x27, 0x2b, 0x2b, 0x26, 0x2b, 0x2f, 0x2b, 0x2f, 0x30, 0x2e, 0x33,
+ 0x29, 0x27, 0x2c, 0x24, 0x23, 0x28, 0x2f, 0x2e, 0x34, 0x2c, 0x2b, 0x31,
+ 0x27, 0x26, 0x2a, 0x2c, 0x2c, 0x31, 0x47, 0x48, 0x4d, 0x4a, 0x4b, 0x51,
+ 0x48, 0x48, 0x50, 0x42, 0x40, 0x4c, 0x3a, 0x38, 0x44, 0x37, 0x35, 0x3f,
+ 0x32, 0x31, 0x36, 0x2f, 0x2e, 0x33, 0x2c, 0x2b, 0x30, 0x2a, 0x29, 0x2e,
+ 0x25, 0x24, 0x29, 0x21, 0x20, 0x25, 0x16, 0x17, 0x1b, 0x0d, 0x0e, 0x12,
+ 0x0d, 0x0d, 0x0d, 0x0e, 0x0f, 0x0e, 0x0f, 0x11, 0x10, 0x10, 0x11, 0x11,
+ 0x12, 0x12, 0x12, 0x15, 0x15, 0x15, 0x1a, 0x18, 0x19, 0x20, 0x1d, 0x1e,
+ 0x2f, 0x24, 0x25, 0x43, 0x3c, 0x3f, 0x49, 0x4b, 0x54, 0x9f, 0xa9, 0xb7,
+ 0xab, 0xb1, 0xc5, 0x90, 0x8e, 0xa1, 0x6e, 0x64, 0x71, 0x69, 0x58, 0x60,
+ 0x68, 0x5b, 0x5b, 0x67, 0x5b, 0x5a, 0x66, 0x58, 0x58, 0x67, 0x57, 0x57,
+ 0x67, 0x55, 0x58, 0x64, 0x52, 0x55, 0x62, 0x50, 0x53, 0x6a, 0x58, 0x5c,
+ 0x73, 0x68, 0x63, 0x81, 0x77, 0x71, 0x8d, 0x84, 0x7d, 0x93, 0x8b, 0x84,
+ 0x96, 0x8f, 0x87, 0x93, 0x8c, 0x86, 0x8a, 0x81, 0x7c, 0x75, 0x6b, 0x67,
+ 0x63, 0x53, 0x59, 0x50, 0x40, 0x46, 0x4a, 0x3b, 0x40, 0x46, 0x37, 0x3b,
+ 0x42, 0x33, 0x37, 0x3b, 0x2f, 0x32, 0x34, 0x28, 0x29, 0x36, 0x2a, 0x2a,
+ 0x33, 0x2a, 0x29, 0x2e, 0x29, 0x26, 0x2b, 0x2a, 0x28, 0x25, 0x25, 0x24,
+ 0x1d, 0x1e, 0x1f, 0x1c, 0x1d, 0x20, 0x1b, 0x1c, 0x1f, 0x1b, 0x1b, 0x1f,
+ 0x1d, 0x1e, 0x20, 0x1e, 0x1f, 0x21, 0x1c, 0x1d, 0x1f, 0x20, 0x21, 0x23,
+ 0x21, 0x22, 0x24, 0x21, 0x22, 0x24, 0x23, 0x24, 0x28, 0x25, 0x25, 0x29,
+ 0x26, 0x28, 0x28, 0x28, 0x29, 0x2b, 0x29, 0x2a, 0x2c, 0x2d, 0x2f, 0x30,
+ 0x34, 0x38, 0x39, 0x3d, 0x41, 0x40, 0x42, 0x46, 0x45, 0x41, 0x44, 0x44,
+ 0x42, 0x42, 0x46, 0x41, 0x42, 0x46, 0x3e, 0x43, 0x45, 0x3b, 0x41, 0x43,
+ 0x39, 0x3e, 0x40, 0x39, 0x41, 0x42, 0x3a, 0x42, 0x44, 0x39, 0x41, 0x44,
+ 0x39, 0x42, 0x4a, 0x3c, 0x44, 0x4b, 0x3b, 0x43, 0x46, 0x3a, 0x3f, 0x42,
+ 0x3b, 0x3f, 0x41, 0x3a, 0x3e, 0x40, 0x38, 0x3b, 0x40, 0x3a, 0x3d, 0x43,
+ 0x38, 0x3c, 0x3d, 0x3a, 0x3e, 0x3f, 0x3a, 0x3e, 0x41, 0x38, 0x3b, 0x40,
+ 0x37, 0x3a, 0x3f, 0x39, 0x3d, 0x41, 0x37, 0x3a, 0x3f, 0x37, 0x3a, 0x3f,
+ 0x33, 0x3c, 0x3b, 0x35, 0x3d, 0x3d, 0x36, 0x3b, 0x3e, 0x34, 0x37, 0x3c,
+ 0x33, 0x36, 0x3b, 0x37, 0x3a, 0x3f, 0x37, 0x3a, 0x3f, 0x36, 0x3b, 0x3f,
+ 0x38, 0x3e, 0x47, 0x38, 0x3f, 0x47, 0x3b, 0x43, 0x48, 0x3d, 0x46, 0x4b,
+ 0x3d, 0x46, 0x4c, 0x41, 0x49, 0x52, 0x40, 0x48, 0x55, 0x40, 0x47, 0x56,
+ 0x44, 0x4b, 0x5c, 0x59, 0x60, 0x73, 0x84, 0x8c, 0xa1, 0xb6, 0xbe, 0xcf,
+ 0xd7, 0xe0, 0xe9, 0xdb, 0xe2, 0xe4, 0xca, 0xce, 0xcd, 0xb4, 0xb9, 0xb6,
+ 0xa7, 0xad, 0xb2, 0xa6, 0xae, 0xb1, 0xa5, 0xaf, 0xb1, 0xa5, 0xaf, 0xb2,
+ 0xa5, 0xaf, 0xb1, 0x88, 0x90, 0x95, 0x71, 0x78, 0x82, 0x81, 0x86, 0x8f,
+ 0x77, 0x7d, 0x8a, 0x65, 0x6e, 0x72, 0x9b, 0xa7, 0xa6, 0xb8, 0xc6, 0xc8,
+ 0xb7, 0xc5, 0xcd, 0xb1, 0xbe, 0xc9, 0x86, 0x90, 0x97, 0xa2, 0xae, 0xae,
+ 0xbc, 0xc6, 0xce, 0xaa, 0xb3, 0xbc, 0x91, 0x9a, 0xa3, 0x8d, 0x97, 0xa0,
+ 0x95, 0x9e, 0xa8, 0xad, 0xb6, 0xc0, 0xb9, 0xc3, 0xcc, 0xbb, 0xc6, 0xce,
+ 0xbd, 0xc6, 0xd0, 0xbc, 0xc6, 0xcf, 0xb8, 0xc5, 0xce, 0xb5, 0xc2, 0xce,
+ 0xb2, 0xc0, 0xce, 0xae, 0xba, 0xc7, 0xa6, 0xad, 0xbc, 0x97, 0x9d, 0xad,
+ 0x65, 0x68, 0x6f, 0x5e, 0x63, 0x69, 0x3a, 0x41, 0x47, 0x26, 0x2e, 0x35,
+ 0x4b, 0x53, 0x5a, 0x5f, 0x68, 0x6e, 0x50, 0x59, 0x5e, 0x2b, 0x34, 0x39,
+ 0x25, 0x2d, 0x38, 0x59, 0x60, 0x6a, 0x5c, 0x61, 0x6a, 0x35, 0x3c, 0x44,
+ 0x1d, 0x26, 0x2f, 0x2c, 0x39, 0x41, 0x3c, 0x49, 0x4f, 0x2d, 0x39, 0x3d,
+ 0x2c, 0x35, 0x3b, 0x4d, 0x53, 0x59, 0x54, 0x59, 0x5d, 0x2f, 0x35, 0x37,
+ 0x17, 0x1e, 0x1c, 0x19, 0x1d, 0x1b, 0x21, 0x20, 0x21, 0x25, 0x22, 0x22,
+ 0x25, 0x23, 0x22, 0x2a, 0x29, 0x29, 0x29, 0x29, 0x29, 0x27, 0x28, 0x27,
+ 0x22, 0x25, 0x24, 0x1f, 0x22, 0x23, 0x21, 0x25, 0x26, 0x21, 0x25, 0x26,
+ 0x1e, 0x22, 0x23, 0x21, 0x24, 0x25, 0x24, 0x27, 0x2a, 0x23, 0x26, 0x2b,
+ 0x23, 0x26, 0x2d, 0x24, 0x27, 0x2e, 0x24, 0x27, 0x2e, 0x2a, 0x2d, 0x34,
+ 0x2a, 0x2b, 0x2f, 0x13, 0x13, 0x15, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x08,
+ 0x07, 0x09, 0x06, 0x05, 0x07, 0x07, 0x13, 0x17, 0x19, 0x2b, 0x30, 0x33,
+ 0x27, 0x2c, 0x32, 0x27, 0x2c, 0x32, 0x26, 0x2b, 0x31, 0x28, 0x2b, 0x32,
+ 0x2c, 0x2f, 0x36, 0x29, 0x2c, 0x33, 0x29, 0x2c, 0x33, 0x2d, 0x30, 0x37,
+ 0x30, 0x32, 0x3e, 0x30, 0x33, 0x3c, 0x2f, 0x32, 0x39, 0x25, 0x29, 0x2c,
+ 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x15, 0x16, 0x18, 0x13, 0x13, 0x16,
+ 0x12, 0x13, 0x15, 0x10, 0x11, 0x13, 0x13, 0x14, 0x16, 0x13, 0x14, 0x16,
+ 0x12, 0x13, 0x15, 0x11, 0x12, 0x14, 0x13, 0x13, 0x15, 0x11, 0x11, 0x13,
+ 0x10, 0x10, 0x13, 0x10, 0x11, 0x13, 0x0f, 0x11, 0x10, 0x11, 0x13, 0x12,
+ 0x0e, 0x10, 0x0f, 0x0c, 0x0e, 0x0d, 0x0c, 0x0e, 0x0d, 0x0d, 0x0f, 0x0e,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x11, 0x13, 0x12,
+ 0x0f, 0x11, 0x10, 0x0f, 0x11, 0x10, 0x10, 0x12, 0x11, 0x16, 0x17, 0x17,
+ 0x0e, 0x10, 0x12, 0x14, 0x15, 0x17, 0x11, 0x12, 0x14, 0x0f, 0x0f, 0x11,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0c, 0x0a, 0x0b, 0x15, 0x14, 0x12,
+ 0x22, 0x21, 0x1f, 0x1a, 0x19, 0x17, 0x08, 0x08, 0x07, 0x05, 0x07, 0x06,
+ 0x06, 0x08, 0x07, 0x06, 0x07, 0x06, 0x06, 0x06, 0x05, 0x07, 0x07, 0x07,
+ 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0e,
+ 0x0d, 0x0e, 0x10, 0x0a, 0x0b, 0x0c, 0x0a, 0x0a, 0x0a, 0x14, 0x14, 0x14,
+ 0x16, 0x16, 0x18, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x10, 0x10, 0x10, 0x13, 0x13, 0x13, 0x15, 0x13, 0x15, 0x16, 0x14, 0x17,
+ 0x1b, 0x17, 0x16, 0x16, 0x15, 0x13, 0x1f, 0x1f, 0x1d, 0x1a, 0x1a, 0x18,
+ 0x17, 0x18, 0x15, 0x1a, 0x1a, 0x1a, 0x1a, 0x18, 0x1b, 0x1a, 0x15, 0x19,
+ 0x1c, 0x1b, 0x19, 0x18, 0x17, 0x15, 0x17, 0x16, 0x14, 0x17, 0x15, 0x16,
+ 0x12, 0x12, 0x12, 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x27, 0x27, 0x27, 0x2b, 0x29, 0x2c, 0x1f, 0x1b, 0x1e, 0x2b, 0x26, 0x2a,
+ 0x2f, 0x2a, 0x2e, 0x2e, 0x28, 0x2c, 0x32, 0x29, 0x2e, 0x37, 0x2e, 0x32,
+ 0x34, 0x2b, 0x30, 0x31, 0x2a, 0x31, 0x31, 0x2c, 0x32, 0x2e, 0x2b, 0x31,
+ 0x27, 0x25, 0x2a, 0x22, 0x20, 0x25, 0x21, 0x1c, 0x20, 0x23, 0x1e, 0x21,
+ 0x24, 0x20, 0x22, 0x25, 0x20, 0x24, 0x24, 0x20, 0x24, 0x29, 0x26, 0x2a,
+ 0x28, 0x26, 0x2b, 0x20, 0x1f, 0x24, 0x20, 0x1f, 0x24, 0x23, 0x22, 0x28,
+ 0x23, 0x22, 0x27, 0x33, 0x33, 0x38, 0x48, 0x49, 0x4f, 0x48, 0x48, 0x4f,
+ 0x44, 0x44, 0x4c, 0x41, 0x3f, 0x4a, 0x3a, 0x37, 0x43, 0x36, 0x33, 0x3e,
+ 0x30, 0x2f, 0x35, 0x2c, 0x2b, 0x30, 0x24, 0x23, 0x28, 0x26, 0x25, 0x2a,
+ 0x25, 0x24, 0x29, 0x20, 0x1f, 0x24, 0x14, 0x15, 0x19, 0x0c, 0x0d, 0x11,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0e, 0x0e, 0x0f, 0x0e,
+ 0x10, 0x11, 0x10, 0x12, 0x12, 0x12, 0x18, 0x17, 0x17, 0x20, 0x1e, 0x1e,
+ 0x25, 0x20, 0x1f, 0x3e, 0x3a, 0x3c, 0x46, 0x43, 0x4c, 0x4a, 0x47, 0x56,
+ 0x61, 0x5c, 0x70, 0x80, 0x7a, 0x8b, 0x80, 0x76, 0x81, 0x63, 0x58, 0x5c,
+ 0x63, 0x58, 0x57, 0x64, 0x59, 0x58, 0x66, 0x58, 0x58, 0x66, 0x56, 0x57,
+ 0x65, 0x55, 0x56, 0x63, 0x53, 0x56, 0x5a, 0x49, 0x4d, 0x57, 0x46, 0x4a,
+ 0x54, 0x40, 0x46, 0x52, 0x3f, 0x45, 0x52, 0x40, 0x46, 0x53, 0x42, 0x47,
+ 0x52, 0x41, 0x47, 0x4e, 0x3c, 0x42, 0x4b, 0x37, 0x3d, 0x46, 0x32, 0x38,
+ 0x47, 0x34, 0x38, 0x4b, 0x3a, 0x3d, 0x4d, 0x3d, 0x40, 0x4a, 0x3b, 0x3e,
+ 0x41, 0x32, 0x34, 0x39, 0x2c, 0x2c, 0x33, 0x27, 0x27, 0x36, 0x2c, 0x2b,
+ 0x32, 0x2a, 0x28, 0x2c, 0x28, 0x25, 0x26, 0x24, 0x23, 0x1e, 0x1f, 0x1f,
+ 0x17, 0x19, 0x19, 0x19, 0x1a, 0x1c, 0x1a, 0x1b, 0x1f, 0x1b, 0x1b, 0x1f,
+ 0x1c, 0x1d, 0x1f, 0x1b, 0x1c, 0x1e, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x22,
+ 0x20, 0x21, 0x23, 0x21, 0x22, 0x24, 0x21, 0x22, 0x24, 0x22, 0x23, 0x24,
+ 0x23, 0x25, 0x24, 0x26, 0x28, 0x27, 0x2c, 0x2e, 0x2f, 0x33, 0x37, 0x38,
+ 0x3b, 0x3f, 0x40, 0x3c, 0x40, 0x41, 0x3d, 0x41, 0x40, 0x3e, 0x42, 0x41,
+ 0x41, 0x41, 0x45, 0x3c, 0x3d, 0x41, 0x3c, 0x40, 0x43, 0x3a, 0x3f, 0x42,
+ 0x38, 0x3d, 0x40, 0x38, 0x3f, 0x41, 0x38, 0x41, 0x42, 0x39, 0x41, 0x44,
+ 0x3a, 0x41, 0x49, 0x3b, 0x42, 0x48, 0x3c, 0x41, 0x45, 0x3d, 0x42, 0x45,
+ 0x3a, 0x3e, 0x41, 0x39, 0x3d, 0x40, 0x36, 0x39, 0x3f, 0x39, 0x3d, 0x43,
+ 0x37, 0x3b, 0x3c, 0x37, 0x3b, 0x3c, 0x38, 0x3c, 0x3f, 0x37, 0x3a, 0x3f,
+ 0x37, 0x3a, 0x3f, 0x38, 0x3b, 0x40, 0x36, 0x39, 0x3e, 0x38, 0x3b, 0x40,
+ 0x33, 0x3c, 0x3b, 0x33, 0x39, 0x39, 0x35, 0x3a, 0x3d, 0x38, 0x3b, 0x40,
+ 0x37, 0x3a, 0x3f, 0x34, 0x37, 0x3c, 0x35, 0x38, 0x3d, 0x38, 0x3d, 0x41,
+ 0x37, 0x3c, 0x44, 0x35, 0x3c, 0x44, 0x35, 0x3d, 0x43, 0x36, 0x3f, 0x44,
+ 0x3a, 0x43, 0x49, 0x3b, 0x44, 0x4b, 0x3c, 0x43, 0x4d, 0x39, 0x3f, 0x4b,
+ 0x35, 0x3d, 0x48, 0x3e, 0x46, 0x55, 0x46, 0x4f, 0x61, 0x54, 0x5c, 0x6c,
+ 0x7a, 0x83, 0x8c, 0xa9, 0xb1, 0xb4, 0xc8, 0xce, 0xce, 0xc4, 0xc8, 0xc9,
+ 0xb5, 0xbb, 0xb9, 0xa9, 0xaf, 0xaf, 0xa4, 0xac, 0xb0, 0xa1, 0xa9, 0xaf,
+ 0xa3, 0xac, 0xb2, 0xa5, 0xac, 0xb2, 0x96, 0x9d, 0xa3, 0x84, 0x8a, 0x8e,
+ 0x7d, 0x84, 0x8e, 0x8d, 0x96, 0x99, 0xac, 0xb8, 0xb6, 0xb3, 0xc1, 0xc3,
+ 0xb6, 0xc4, 0xcd, 0xa5, 0xb1, 0xbf, 0x80, 0x8d, 0x96, 0x97, 0xa3, 0xa8,
+ 0x94, 0x9f, 0xa4, 0x8b, 0x96, 0x9c, 0xa5, 0xb0, 0xb6, 0xb5, 0xc0, 0xc6,
+ 0xba, 0xc5, 0xcb, 0xbd, 0xc8, 0xce, 0xba, 0xc5, 0xce, 0xb8, 0xc4, 0xcd,
+ 0xbb, 0xc6, 0xcf, 0xbc, 0xc6, 0xd0, 0xb5, 0xc2, 0xcd, 0xb3, 0xbf, 0xcb,
+ 0xae, 0xba, 0xc6, 0xa4, 0xae, 0xbd, 0x9a, 0x9f, 0xad, 0x8c, 0x90, 0x9f,
+ 0x5e, 0x66, 0x69, 0x45, 0x4d, 0x52, 0x19, 0x22, 0x29, 0x1f, 0x29, 0x32,
+ 0x4f, 0x5a, 0x62, 0x5c, 0x67, 0x6d, 0x5a, 0x65, 0x69, 0x4e, 0x58, 0x5b,
+ 0x3c, 0x45, 0x4c, 0x49, 0x50, 0x58, 0x33, 0x3a, 0x40, 0x1e, 0x26, 0x2d,
+ 0x21, 0x2c, 0x35, 0x1b, 0x28, 0x30, 0x25, 0x30, 0x36, 0x3e, 0x47, 0x4d,
+ 0x26, 0x2f, 0x36, 0x1f, 0x26, 0x2e, 0x3f, 0x46, 0x4c, 0x44, 0x49, 0x4d,
+ 0x28, 0x2c, 0x2f, 0x17, 0x1b, 0x1b, 0x1c, 0x1e, 0x1d, 0x1f, 0x21, 0x1e,
+ 0x28, 0x26, 0x27, 0x2b, 0x2b, 0x2b, 0x26, 0x26, 0x26, 0x22, 0x22, 0x23,
+ 0x22, 0x23, 0x25, 0x25, 0x26, 0x29, 0x23, 0x24, 0x28, 0x22, 0x24, 0x28,
+ 0x25, 0x26, 0x28, 0x24, 0x25, 0x27, 0x24, 0x25, 0x29, 0x22, 0x25, 0x2a,
+ 0x25, 0x29, 0x2f, 0x26, 0x2b, 0x31, 0x25, 0x2a, 0x31, 0x2b, 0x30, 0x36,
+ 0x2f, 0x30, 0x35, 0x16, 0x17, 0x19, 0x0a, 0x0b, 0x0a, 0x09, 0x09, 0x07,
+ 0x08, 0x08, 0x06, 0x06, 0x07, 0x06, 0x10, 0x11, 0x13, 0x2d, 0x2e, 0x32,
+ 0x27, 0x2c, 0x32, 0x26, 0x2b, 0x31, 0x24, 0x28, 0x2e, 0x27, 0x2a, 0x31,
+ 0x28, 0x2b, 0x32, 0x29, 0x2c, 0x33, 0x29, 0x2c, 0x33, 0x28, 0x2b, 0x32,
+ 0x2a, 0x2e, 0x37, 0x30, 0x33, 0x3c, 0x2e, 0x31, 0x38, 0x28, 0x2c, 0x2f,
+ 0x16, 0x17, 0x1b, 0x15, 0x16, 0x18, 0x14, 0x15, 0x17, 0x14, 0x15, 0x16,
+ 0x14, 0x15, 0x17, 0x13, 0x14, 0x16, 0x11, 0x12, 0x14, 0x13, 0x14, 0x16,
+ 0x12, 0x13, 0x15, 0x11, 0x12, 0x14, 0x12, 0x13, 0x15, 0x13, 0x13, 0x15,
+ 0x0f, 0x10, 0x12, 0x0e, 0x0f, 0x11, 0x11, 0x13, 0x12, 0x10, 0x12, 0x11,
+ 0x0e, 0x10, 0x0f, 0x0f, 0x11, 0x10, 0x0e, 0x10, 0x0f, 0x0f, 0x11, 0x10,
+ 0x0e, 0x10, 0x0f, 0x0f, 0x11, 0x10, 0x0e, 0x10, 0x0f, 0x11, 0x13, 0x12,
+ 0x0d, 0x0f, 0x11, 0x0f, 0x10, 0x12, 0x0f, 0x13, 0x14, 0x0c, 0x10, 0x12,
+ 0x0a, 0x0e, 0x11, 0x0c, 0x0f, 0x10, 0x0e, 0x10, 0x0f, 0x0c, 0x0e, 0x0b,
+ 0x13, 0x13, 0x0f, 0x16, 0x15, 0x13, 0x1f, 0x1d, 0x1e, 0x31, 0x2f, 0x30,
+ 0x2f, 0x2d, 0x2e, 0x21, 0x20, 0x20, 0x12, 0x12, 0x12, 0x0a, 0x0c, 0x0b,
+ 0x06, 0x08, 0x07, 0x06, 0x08, 0x07, 0x08, 0x08, 0x08, 0x07, 0x07, 0x07,
+ 0x0a, 0x0a, 0x08, 0x08, 0x09, 0x08, 0x08, 0x0a, 0x09, 0x0b, 0x0c, 0x0e,
+ 0x0e, 0x0f, 0x11, 0x0a, 0x0b, 0x0d, 0x0d, 0x0d, 0x0f, 0x08, 0x08, 0x0a,
+ 0x09, 0x09, 0x0b, 0x0e, 0x0e, 0x0e, 0x14, 0x14, 0x14, 0x0f, 0x0f, 0x0f,
+ 0x11, 0x11, 0x10, 0x15, 0x14, 0x14, 0x18, 0x16, 0x17, 0x19, 0x17, 0x18,
+ 0x1b, 0x17, 0x16, 0x13, 0x12, 0x10, 0x10, 0x10, 0x0e, 0x10, 0x10, 0x0e,
+ 0x10, 0x10, 0x0e, 0x16, 0x16, 0x17, 0x23, 0x21, 0x22, 0x1a, 0x15, 0x19,
+ 0x11, 0x10, 0x0e, 0x13, 0x12, 0x10, 0x1a, 0x18, 0x17, 0x1a, 0x18, 0x19,
+ 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
+ 0x29, 0x28, 0x2d, 0x27, 0x25, 0x2a, 0x1f, 0x1d, 0x20, 0x2a, 0x25, 0x29,
+ 0x30, 0x2a, 0x2d, 0x31, 0x2b, 0x2d, 0x31, 0x2b, 0x2d, 0x32, 0x2c, 0x2e,
+ 0x33, 0x2e, 0x32, 0x31, 0x2f, 0x34, 0x31, 0x2f, 0x34, 0x2f, 0x2e, 0x33,
+ 0x28, 0x27, 0x2c, 0x21, 0x1f, 0x24, 0x1f, 0x1a, 0x1e, 0x20, 0x1a, 0x1e,
+ 0x23, 0x1f, 0x20, 0x23, 0x1f, 0x20, 0x1f, 0x1c, 0x1d, 0x23, 0x20, 0x23,
+ 0x26, 0x24, 0x27, 0x25, 0x24, 0x28, 0x1d, 0x1c, 0x21, 0x21, 0x20, 0x25,
+ 0x23, 0x22, 0x27, 0x37, 0x36, 0x3b, 0x48, 0x49, 0x4e, 0x46, 0x46, 0x4e,
+ 0x40, 0x40, 0x4a, 0x3d, 0x3c, 0x46, 0x39, 0x37, 0x42, 0x36, 0x33, 0x3e,
+ 0x30, 0x2f, 0x35, 0x27, 0x26, 0x2c, 0x1b, 0x1a, 0x1f, 0x1e, 0x1d, 0x22,
+ 0x25, 0x24, 0x29, 0x20, 0x1f, 0x24, 0x14, 0x15, 0x17, 0x0c, 0x0d, 0x0f,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0d, 0x0e, 0x0d, 0x0c, 0x0e, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x18, 0x16, 0x18, 0x1f, 0x1d, 0x1e,
+ 0x20, 0x20, 0x1e, 0x2d, 0x2a, 0x2a, 0x43, 0x3a, 0x41, 0x47, 0x38, 0x47,
+ 0x3e, 0x2e, 0x40, 0x4a, 0x3d, 0x4b, 0x6a, 0x5f, 0x66, 0x69, 0x64, 0x61,
+ 0x66, 0x5a, 0x5a, 0x63, 0x56, 0x57, 0x62, 0x54, 0x54, 0x64, 0x55, 0x56,
+ 0x65, 0x55, 0x56, 0x64, 0x56, 0x56, 0x67, 0x59, 0x58, 0x63, 0x55, 0x56,
+ 0x61, 0x4d, 0x55, 0x5d, 0x49, 0x51, 0x59, 0x45, 0x4d, 0x56, 0x42, 0x49,
+ 0x52, 0x3e, 0x44, 0x4b, 0x36, 0x3d, 0x4c, 0x35, 0x3d, 0x51, 0x3a, 0x40,
+ 0x53, 0x40, 0x42, 0x51, 0x3f, 0x40, 0x50, 0x40, 0x41, 0x4e, 0x40, 0x40,
+ 0x46, 0x39, 0x39, 0x3b, 0x2f, 0x2f, 0x36, 0x2c, 0x2b, 0x36, 0x2c, 0x2b,
+ 0x2e, 0x29, 0x26, 0x2a, 0x26, 0x23, 0x20, 0x1e, 0x1c, 0x18, 0x18, 0x16,
+ 0x16, 0x18, 0x17, 0x17, 0x18, 0x1a, 0x1a, 0x1a, 0x1d, 0x1b, 0x1b, 0x1d,
+ 0x1c, 0x1d, 0x1f, 0x19, 0x1a, 0x1c, 0x1b, 0x1c, 0x1e, 0x1f, 0x20, 0x22,
+ 0x20, 0x20, 0x23, 0x1d, 0x1e, 0x20, 0x20, 0x21, 0x23, 0x21, 0x22, 0x24,
+ 0x24, 0x25, 0x25, 0x2a, 0x2c, 0x2b, 0x31, 0x35, 0x35, 0x39, 0x3d, 0x3e,
+ 0x37, 0x3b, 0x3c, 0x36, 0x3c, 0x3c, 0x3a, 0x40, 0x3e, 0x3d, 0x43, 0x41,
+ 0x40, 0x42, 0x45, 0x3c, 0x3e, 0x42, 0x3a, 0x3e, 0x41, 0x39, 0x3d, 0x41,
+ 0x38, 0x3d, 0x40, 0x35, 0x3c, 0x3f, 0x36, 0x3d, 0x40, 0x34, 0x3c, 0x3e,
+ 0x38, 0x40, 0x43, 0x3d, 0x42, 0x46, 0x3d, 0x42, 0x45, 0x3b, 0x40, 0x43,
+ 0x38, 0x3d, 0x40, 0x37, 0x3c, 0x40, 0x37, 0x3c, 0x42, 0x37, 0x3c, 0x42,
+ 0x37, 0x3d, 0x3d, 0x39, 0x3e, 0x41, 0x36, 0x3b, 0x3e, 0x39, 0x3d, 0x41,
+ 0x39, 0x3c, 0x41, 0x36, 0x39, 0x3e, 0x37, 0x3a, 0x3f, 0x36, 0x39, 0x3e,
+ 0x34, 0x3c, 0x3c, 0x33, 0x39, 0x39, 0x34, 0x39, 0x3c, 0x38, 0x3b, 0x40,
+ 0x36, 0x39, 0x3e, 0x33, 0x37, 0x3c, 0x36, 0x3b, 0x3f, 0x38, 0x3d, 0x41,
+ 0x37, 0x3c, 0x42, 0x38, 0x3d, 0x43, 0x35, 0x3c, 0x44, 0x39, 0x40, 0x48,
+ 0x39, 0x40, 0x47, 0x36, 0x3d, 0x43, 0x31, 0x38, 0x3e, 0x2e, 0x33, 0x38,
+ 0x2e, 0x36, 0x3b, 0x37, 0x40, 0x47, 0x45, 0x4e, 0x59, 0x49, 0x51, 0x5c,
+ 0x47, 0x50, 0x57, 0x51, 0x59, 0x5f, 0x77, 0x7e, 0x82, 0xac, 0xb1, 0xb4,
+ 0xc2, 0xc7, 0xc1, 0xb6, 0xbc, 0xb7, 0xab, 0xb1, 0xb3, 0xa7, 0xad, 0xb3,
+ 0xa4, 0xab, 0xb1, 0xa4, 0xac, 0xaf, 0xaa, 0xb3, 0xb4, 0xaa, 0xb2, 0xb0,
+ 0xaa, 0xb1, 0xb7, 0xac, 0xb6, 0xb7, 0xae, 0xba, 0xba, 0xb0, 0xbd, 0xc0,
+ 0xb4, 0xc0, 0xcc, 0x99, 0xa5, 0xb5, 0x6d, 0x79, 0x87, 0x73, 0x7d, 0x88,
+ 0x7e, 0x8c, 0x8f, 0x94, 0xa2, 0xa5, 0xab, 0xb9, 0xbc, 0xb6, 0xc4, 0xc7,
+ 0xba, 0xc7, 0xcc, 0xb9, 0xc6, 0xcc, 0xbb, 0xc8, 0xcf, 0xba, 0xc7, 0xcf,
+ 0xba, 0xc4, 0xce, 0xb9, 0xc3, 0xcd, 0xb5, 0xbf, 0xca, 0xae, 0xb8, 0xc4,
+ 0xa6, 0xae, 0xb9, 0x9c, 0xa2, 0xae, 0x8d, 0x91, 0x9d, 0x84, 0x86, 0x92,
+ 0x5b, 0x66, 0x68, 0x4f, 0x5a, 0x5e, 0x1c, 0x29, 0x30, 0x1a, 0x27, 0x2f,
+ 0x4d, 0x5a, 0x62, 0x4d, 0x5a, 0x60, 0x46, 0x54, 0x57, 0x58, 0x66, 0x67,
+ 0x53, 0x5d, 0x61, 0x36, 0x3f, 0x44, 0x28, 0x2f, 0x34, 0x39, 0x42, 0x49,
+ 0x4b, 0x58, 0x60, 0x27, 0x34, 0x3d, 0x14, 0x1d, 0x24, 0x22, 0x28, 0x2c,
+ 0x26, 0x2c, 0x2e, 0x1e, 0x23, 0x26, 0x24, 0x27, 0x2a, 0x2b, 0x2c, 0x31,
+ 0x23, 0x22, 0x27, 0x17, 0x17, 0x19, 0x1e, 0x1f, 0x21, 0x1f, 0x23, 0x22,
+ 0x23, 0x23, 0x21, 0x23, 0x23, 0x21, 0x1e, 0x1e, 0x1d, 0x1f, 0x1f, 0x1f,
+ 0x23, 0x23, 0x25, 0x26, 0x26, 0x28, 0x26, 0x26, 0x28, 0x27, 0x28, 0x2b,
+ 0x29, 0x29, 0x2c, 0x28, 0x28, 0x2a, 0x27, 0x28, 0x2c, 0x25, 0x28, 0x2d,
+ 0x26, 0x29, 0x30, 0x26, 0x2b, 0x31, 0x26, 0x2b, 0x31, 0x2b, 0x30, 0x36,
+ 0x31, 0x34, 0x39, 0x16, 0x19, 0x1c, 0x09, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x08, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0e, 0x25, 0x26, 0x2a,
+ 0x28, 0x2d, 0x33, 0x27, 0x2c, 0x32, 0x28, 0x2d, 0x33, 0x26, 0x29, 0x30,
+ 0x26, 0x29, 0x30, 0x25, 0x28, 0x2f, 0x27, 0x2a, 0x30, 0x29, 0x2c, 0x33,
+ 0x2a, 0x2e, 0x37, 0x31, 0x35, 0x3e, 0x31, 0x34, 0x3b, 0x31, 0x34, 0x38,
+ 0x1e, 0x1f, 0x23, 0x14, 0x16, 0x17, 0x13, 0x14, 0x16, 0x14, 0x16, 0x15,
+ 0x14, 0x15, 0x17, 0x15, 0x16, 0x18, 0x14, 0x15, 0x17, 0x13, 0x14, 0x16,
+ 0x11, 0x12, 0x14, 0x0f, 0x10, 0x12, 0x12, 0x13, 0x15, 0x12, 0x12, 0x14,
+ 0x11, 0x12, 0x14, 0x0d, 0x0e, 0x10, 0x0f, 0x11, 0x10, 0x0e, 0x10, 0x0f,
+ 0x0f, 0x11, 0x10, 0x0f, 0x11, 0x10, 0x0f, 0x11, 0x10, 0x10, 0x12, 0x11,
+ 0x0f, 0x11, 0x10, 0x0e, 0x10, 0x0f, 0x0d, 0x0f, 0x10, 0x0f, 0x10, 0x12,
+ 0x0e, 0x11, 0x12, 0x0e, 0x12, 0x13, 0x0e, 0x12, 0x13, 0x0f, 0x13, 0x14,
+ 0x0d, 0x11, 0x14, 0x09, 0x0d, 0x0e, 0x14, 0x16, 0x13, 0x28, 0x2a, 0x24,
+ 0x21, 0x22, 0x1b, 0x1f, 0x1e, 0x1a, 0x37, 0x36, 0x36, 0x35, 0x33, 0x36,
+ 0x1d, 0x1d, 0x1d, 0x18, 0x18, 0x18, 0x1a, 0x1a, 0x1a, 0x14, 0x14, 0x14,
+ 0x0e, 0x0e, 0x0e, 0x0a, 0x0a, 0x0a, 0x07, 0x06, 0x07, 0x07, 0x07, 0x09,
+ 0x0a, 0x0b, 0x09, 0x0a, 0x0b, 0x0a, 0x09, 0x0b, 0x0c, 0x0b, 0x0c, 0x0e,
+ 0x0e, 0x0f, 0x13, 0x0d, 0x0e, 0x11, 0x0d, 0x0e, 0x12, 0x0a, 0x09, 0x0d,
+ 0x0d, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x10, 0x10, 0x0f, 0x0e, 0x0e, 0x0c,
+ 0x13, 0x13, 0x11, 0x14, 0x14, 0x12, 0x17, 0x16, 0x14, 0x1a, 0x18, 0x19,
+ 0x1c, 0x1a, 0x19, 0x16, 0x16, 0x14, 0x16, 0x15, 0x13, 0x13, 0x13, 0x11,
+ 0x10, 0x10, 0x0f, 0x12, 0x12, 0x12, 0x1a, 0x18, 0x19, 0x16, 0x14, 0x15,
+ 0x14, 0x13, 0x11, 0x14, 0x12, 0x11, 0x16, 0x14, 0x15, 0x12, 0x12, 0x12,
+ 0x0d, 0x0d, 0x0d, 0x12, 0x12, 0x12, 0x13, 0x13, 0x15, 0x13, 0x12, 0x15,
+ 0x29, 0x28, 0x2e, 0x29, 0x28, 0x2e, 0x21, 0x1f, 0x24, 0x2b, 0x26, 0x2a,
+ 0x30, 0x2a, 0x2c, 0x33, 0x2d, 0x2f, 0x34, 0x2e, 0x2f, 0x2f, 0x29, 0x29,
+ 0x35, 0x30, 0x33, 0x34, 0x32, 0x37, 0x39, 0x36, 0x3b, 0x31, 0x2f, 0x34,
+ 0x29, 0x26, 0x2c, 0x21, 0x1c, 0x22, 0x22, 0x1c, 0x20, 0x22, 0x1c, 0x1f,
+ 0x24, 0x20, 0x21, 0x23, 0x1f, 0x20, 0x21, 0x1d, 0x1e, 0x22, 0x1f, 0x21,
+ 0x23, 0x21, 0x24, 0x22, 0x22, 0x25, 0x1e, 0x1e, 0x21, 0x21, 0x20, 0x25,
+ 0x24, 0x24, 0x26, 0x3b, 0x3b, 0x3f, 0x4b, 0x4c, 0x51, 0x44, 0x44, 0x4c,
+ 0x41, 0x41, 0x4b, 0x3d, 0x3b, 0x46, 0x38, 0x36, 0x41, 0x2e, 0x2c, 0x36,
+ 0x29, 0x28, 0x2e, 0x2c, 0x2b, 0x31, 0x1e, 0x1d, 0x23, 0x1c, 0x1b, 0x20,
+ 0x23, 0x22, 0x27, 0x1e, 0x1e, 0x20, 0x12, 0x13, 0x15, 0x0a, 0x0b, 0x0d,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0b, 0x0e, 0x0e, 0x0e, 0x0d, 0x0e, 0x0d,
+ 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x16, 0x17, 0x1f, 0x1d, 0x1e,
+ 0x25, 0x24, 0x22, 0x2f, 0x2c, 0x2a, 0x52, 0x4a, 0x4d, 0x5a, 0x4d, 0x56,
+ 0x3d, 0x2d, 0x3a, 0x36, 0x2a, 0x34, 0x46, 0x3d, 0x40, 0x67, 0x62, 0x5e,
+ 0x6a, 0x5c, 0x5e, 0x61, 0x51, 0x53, 0x61, 0x51, 0x52, 0x60, 0x4f, 0x50,
+ 0x5e, 0x4e, 0x4e, 0x60, 0x51, 0x50, 0x62, 0x53, 0x53, 0x63, 0x55, 0x54,
+ 0x5f, 0x54, 0x52, 0x60, 0x54, 0x53, 0x5d, 0x52, 0x51, 0x5d, 0x4f, 0x4c,
+ 0x5a, 0x4c, 0x49, 0x55, 0x47, 0x42, 0x55, 0x46, 0x41, 0x54, 0x45, 0x40,
+ 0x57, 0x43, 0x42, 0x52, 0x40, 0x3e, 0x4f, 0x3f, 0x3e, 0x48, 0x3b, 0x3a,
+ 0x40, 0x34, 0x33, 0x38, 0x2e, 0x2d, 0x32, 0x2a, 0x28, 0x32, 0x2a, 0x28,
+ 0x2a, 0x26, 0x23, 0x25, 0x21, 0x1e, 0x1a, 0x18, 0x16, 0x18, 0x18, 0x15,
+ 0x16, 0x17, 0x17, 0x17, 0x18, 0x18, 0x19, 0x1a, 0x1c, 0x19, 0x1a, 0x1c,
+ 0x18, 0x19, 0x1b, 0x19, 0x1a, 0x1c, 0x1c, 0x1d, 0x1f, 0x1c, 0x1d, 0x1f,
+ 0x1d, 0x1e, 0x20, 0x1d, 0x1e, 0x20, 0x20, 0x22, 0x21, 0x23, 0x25, 0x24,
+ 0x2b, 0x2d, 0x2c, 0x32, 0x35, 0x34, 0x33, 0x37, 0x38, 0x36, 0x3a, 0x3b,
+ 0x39, 0x3f, 0x3f, 0x36, 0x3c, 0x3c, 0x38, 0x40, 0x3f, 0x39, 0x41, 0x3f,
+ 0x41, 0x42, 0x46, 0x3e, 0x3f, 0x44, 0x38, 0x3b, 0x40, 0x39, 0x3e, 0x42,
+ 0x36, 0x3b, 0x3f, 0x32, 0x3a, 0x3d, 0x34, 0x3a, 0x3d, 0x38, 0x3d, 0x41,
+ 0x3a, 0x3f, 0x42, 0x38, 0x3d, 0x40, 0x3a, 0x3e, 0x41, 0x3a, 0x3e, 0x41,
+ 0x36, 0x3b, 0x3e, 0x36, 0x3b, 0x3f, 0x36, 0x3c, 0x42, 0x31, 0x38, 0x3e,
+ 0x34, 0x39, 0x3d, 0x38, 0x3d, 0x40, 0x35, 0x3a, 0x3e, 0x36, 0x3b, 0x3f,
+ 0x38, 0x3b, 0x40, 0x37, 0x3a, 0x3f, 0x36, 0x38, 0x3d, 0x34, 0x36, 0x3b,
+ 0x32, 0x38, 0x38, 0x33, 0x39, 0x39, 0x31, 0x36, 0x39, 0x33, 0x36, 0x3b,
+ 0x33, 0x35, 0x3b, 0x33, 0x37, 0x3c, 0x35, 0x3a, 0x3e, 0x36, 0x3b, 0x3f,
+ 0x37, 0x3b, 0x40, 0x37, 0x3a, 0x41, 0x38, 0x3c, 0x45, 0x39, 0x3d, 0x46,
+ 0x34, 0x3b, 0x43, 0x30, 0x35, 0x3a, 0x29, 0x2f, 0x2f, 0x25, 0x2c, 0x2a,
+ 0x29, 0x32, 0x2f, 0x2e, 0x37, 0x38, 0x36, 0x3e, 0x44, 0x3f, 0x48, 0x4f,
+ 0x44, 0x4d, 0x54, 0x47, 0x4f, 0x55, 0x46, 0x4d, 0x54, 0x57, 0x5e, 0x65,
+ 0x87, 0x8c, 0x89, 0xb0, 0xb5, 0xb3, 0xb8, 0xbe, 0xbc, 0xb1, 0xb7, 0xb5,
+ 0xa8, 0xb0, 0xae, 0xa0, 0xa9, 0xa8, 0xa7, 0xb0, 0xaf, 0xab, 0xb4, 0xb3,
+ 0xac, 0xb4, 0xbb, 0xae, 0xb8, 0xba, 0xae, 0xb9, 0xbb, 0xad, 0xb8, 0xbe,
+ 0xb0, 0xbc, 0xc6, 0xa4, 0xb0, 0xbe, 0x8f, 0x9a, 0xa6, 0x9b, 0xa6, 0xaf,
+ 0xaa, 0xb8, 0xbc, 0xb3, 0xc1, 0xc4, 0xb4, 0xc2, 0xc6, 0xb6, 0xc5, 0xca,
+ 0xb7, 0xc6, 0xcb, 0xb7, 0xc4, 0xcb, 0xba, 0xc6, 0xce, 0xb6, 0xc3, 0xcc,
+ 0xb7, 0xc1, 0xcb, 0xb4, 0xbe, 0xc9, 0xae, 0xb6, 0xc1, 0xa8, 0xb0, 0xbb,
+ 0x9d, 0xa4, 0xae, 0x92, 0x94, 0x9d, 0x88, 0x87, 0x91, 0x7d, 0x7c, 0x84,
+ 0x47, 0x56, 0x59, 0x50, 0x5f, 0x63, 0x3e, 0x4d, 0x52, 0x20, 0x2f, 0x36,
+ 0x26, 0x33, 0x3b, 0x2b, 0x38, 0x3e, 0x43, 0x51, 0x56, 0x53, 0x62, 0x65,
+ 0x59, 0x65, 0x69, 0x52, 0x5d, 0x61, 0x4c, 0x55, 0x5c, 0x50, 0x5a, 0x63,
+ 0x3d, 0x4a, 0x53, 0x1b, 0x26, 0x2f, 0x14, 0x1b, 0x21, 0x1e, 0x20, 0x23,
+ 0x39, 0x39, 0x31, 0x44, 0x45, 0x3d, 0x3c, 0x3d, 0x36, 0x39, 0x37, 0x34,
+ 0x30, 0x2b, 0x2d, 0x23, 0x1e, 0x22, 0x31, 0x30, 0x35, 0x31, 0x34, 0x39,
+ 0x1d, 0x21, 0x1e, 0x19, 0x1b, 0x18, 0x1a, 0x1a, 0x18, 0x20, 0x20, 0x1e,
+ 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x29, 0x29, 0x29,
+ 0x2b, 0x2b, 0x2d, 0x2a, 0x2a, 0x2c, 0x28, 0x29, 0x2d, 0x2b, 0x2c, 0x31,
+ 0x28, 0x2b, 0x32, 0x27, 0x2c, 0x32, 0x27, 0x2b, 0x31, 0x2d, 0x32, 0x38,
+ 0x30, 0x33, 0x38, 0x17, 0x1a, 0x1d, 0x08, 0x09, 0x0b, 0x08, 0x08, 0x09,
+ 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09, 0x0d, 0x0d, 0x0e, 0x23, 0x23, 0x27,
+ 0x29, 0x2d, 0x33, 0x27, 0x2c, 0x32, 0x28, 0x2d, 0x33, 0x26, 0x29, 0x30,
+ 0x27, 0x2a, 0x31, 0x26, 0x29, 0x30, 0x25, 0x28, 0x2f, 0x2a, 0x2d, 0x34,
+ 0x2b, 0x2f, 0x37, 0x2c, 0x31, 0x37, 0x30, 0x33, 0x3a, 0x34, 0x37, 0x3c,
+ 0x1a, 0x1e, 0x21, 0x13, 0x14, 0x16, 0x13, 0x15, 0x14, 0x14, 0x16, 0x15,
+ 0x13, 0x14, 0x16, 0x14, 0x15, 0x17, 0x13, 0x14, 0x16, 0x13, 0x14, 0x16,
+ 0x11, 0x12, 0x14, 0x0e, 0x0f, 0x11, 0x11, 0x11, 0x13, 0x13, 0x13, 0x15,
+ 0x12, 0x13, 0x15, 0x0e, 0x10, 0x11, 0x0d, 0x0f, 0x0e, 0x10, 0x12, 0x11,
+ 0x0f, 0x11, 0x10, 0x0f, 0x11, 0x10, 0x0f, 0x11, 0x10, 0x0f, 0x12, 0x11,
+ 0x0d, 0x10, 0x0f, 0x0d, 0x11, 0x10, 0x0c, 0x10, 0x11, 0x0e, 0x11, 0x12,
+ 0x10, 0x12, 0x13, 0x0e, 0x0f, 0x11, 0x11, 0x12, 0x14, 0x13, 0x15, 0x16,
+ 0x10, 0x13, 0x16, 0x0d, 0x11, 0x12, 0x2b, 0x2d, 0x2a, 0x4b, 0x4d, 0x47,
+ 0x28, 0x29, 0x22, 0x18, 0x19, 0x14, 0x27, 0x26, 0x27, 0x22, 0x21, 0x24,
+ 0x18, 0x1a, 0x19, 0x16, 0x16, 0x16, 0x18, 0x18, 0x16, 0x17, 0x17, 0x15,
+ 0x17, 0x17, 0x16, 0x14, 0x14, 0x13, 0x0f, 0x0f, 0x0f, 0x0a, 0x0a, 0x0c,
+ 0x0a, 0x0c, 0x0b, 0x09, 0x0b, 0x0a, 0x08, 0x0b, 0x0c, 0x0d, 0x10, 0x13,
+ 0x10, 0x14, 0x17, 0x0b, 0x0d, 0x11, 0x0c, 0x0d, 0x12, 0x0d, 0x0e, 0x12,
+ 0x0e, 0x0e, 0x0f, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0b, 0x0c, 0x0c, 0x0a,
+ 0x0f, 0x0f, 0x0d, 0x12, 0x12, 0x10, 0x18, 0x17, 0x15, 0x17, 0x15, 0x16,
+ 0x1b, 0x19, 0x1a, 0x19, 0x18, 0x18, 0x1a, 0x1a, 0x18, 0x18, 0x18, 0x16,
+ 0x16, 0x16, 0x14, 0x10, 0x10, 0x0e, 0x10, 0x0e, 0x0f, 0x18, 0x16, 0x17,
+ 0x18, 0x17, 0x16, 0x12, 0x11, 0x10, 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x11, 0x0e, 0x0e, 0x10, 0x17, 0x17, 0x19,
+ 0x2a, 0x29, 0x31, 0x28, 0x27, 0x2d, 0x1d, 0x1b, 0x20, 0x2d, 0x28, 0x2c,
+ 0x2e, 0x28, 0x2a, 0x31, 0x2b, 0x2d, 0x31, 0x2b, 0x2d, 0x2b, 0x25, 0x27,
+ 0x36, 0x30, 0x34, 0x37, 0x30, 0x37, 0x39, 0x32, 0x39, 0x32, 0x2b, 0x32,
+ 0x2c, 0x25, 0x2c, 0x28, 0x1e, 0x26, 0x27, 0x1e, 0x23, 0x27, 0x1f, 0x23,
+ 0x26, 0x21, 0x21, 0x22, 0x1e, 0x1f, 0x1f, 0x1b, 0x1c, 0x22, 0x20, 0x21,
+ 0x25, 0x23, 0x26, 0x21, 0x21, 0x23, 0x1d, 0x1d, 0x1f, 0x22, 0x22, 0x24,
+ 0x23, 0x24, 0x26, 0x3e, 0x40, 0x43, 0x49, 0x49, 0x4f, 0x44, 0x44, 0x4f,
+ 0x40, 0x40, 0x4a, 0x3d, 0x3d, 0x47, 0x31, 0x2f, 0x3a, 0x27, 0x26, 0x2e,
+ 0x32, 0x31, 0x37, 0x32, 0x31, 0x37, 0x1f, 0x1e, 0x24, 0x1d, 0x1c, 0x21,
+ 0x22, 0x21, 0x26, 0x1d, 0x1d, 0x1f, 0x11, 0x12, 0x14, 0x09, 0x09, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0f, 0x0e, 0x0f, 0x11, 0x0f, 0x10, 0x19, 0x17, 0x18, 0x1f, 0x1b, 0x1c,
+ 0x24, 0x20, 0x20, 0x3b, 0x37, 0x36, 0x51, 0x4d, 0x4c, 0x3c, 0x39, 0x3b,
+ 0x43, 0x3e, 0x44, 0x3a, 0x34, 0x38, 0x3f, 0x37, 0x38, 0x47, 0x3e, 0x3c,
+ 0x5b, 0x4b, 0x4e, 0x59, 0x48, 0x4b, 0x5a, 0x48, 0x4b, 0x55, 0x42, 0x45,
+ 0x4d, 0x3b, 0x3d, 0x4e, 0x3e, 0x3e, 0x56, 0x46, 0x46, 0x59, 0x4a, 0x48,
+ 0x5a, 0x4f, 0x4b, 0x59, 0x4e, 0x4a, 0x59, 0x4e, 0x4a, 0x59, 0x4c, 0x47,
+ 0x57, 0x49, 0x44, 0x53, 0x46, 0x3e, 0x4e, 0x41, 0x3a, 0x4b, 0x3e, 0x37,
+ 0x49, 0x3a, 0x37, 0x47, 0x38, 0x35, 0x41, 0x33, 0x30, 0x37, 0x2c, 0x2a,
+ 0x35, 0x2b, 0x2a, 0x33, 0x2b, 0x29, 0x2e, 0x29, 0x26, 0x29, 0x25, 0x23,
+ 0x21, 0x1f, 0x1c, 0x19, 0x18, 0x16, 0x14, 0x14, 0x12, 0x17, 0x18, 0x16,
+ 0x15, 0x17, 0x15, 0x18, 0x1a, 0x19, 0x1a, 0x1b, 0x1d, 0x17, 0x18, 0x1a,
+ 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1a, 0x1b, 0x1d, 0x1a, 0x1c, 0x1b,
+ 0x1d, 0x1f, 0x1e, 0x1d, 0x1f, 0x1e, 0x1c, 0x1e, 0x1d, 0x29, 0x2b, 0x29,
+ 0x33, 0x35, 0x34, 0x35, 0x38, 0x38, 0x34, 0x38, 0x39, 0x3b, 0x3f, 0x40,
+ 0x38, 0x3e, 0x3e, 0x39, 0x3f, 0x40, 0x3a, 0x40, 0x40, 0x36, 0x3e, 0x3d,
+ 0x3b, 0x3d, 0x41, 0x3b, 0x3e, 0x41, 0x3b, 0x40, 0x43, 0x39, 0x3e, 0x41,
+ 0x35, 0x3a, 0x3d, 0x34, 0x3b, 0x3e, 0x34, 0x3a, 0x3d, 0x38, 0x3d, 0x40,
+ 0x3b, 0x3f, 0x40, 0x39, 0x3e, 0x3f, 0x38, 0x3c, 0x3d, 0x35, 0x39, 0x3c,
+ 0x33, 0x38, 0x3b, 0x34, 0x3a, 0x3c, 0x35, 0x3d, 0x40, 0x31, 0x3b, 0x3d,
+ 0x34, 0x39, 0x3d, 0x37, 0x3c, 0x3f, 0x35, 0x3a, 0x3e, 0x34, 0x39, 0x3d,
+ 0x36, 0x39, 0x3e, 0x35, 0x38, 0x3d, 0x35, 0x38, 0x3d, 0x34, 0x37, 0x3c,
+ 0x32, 0x38, 0x38, 0x30, 0x36, 0x36, 0x30, 0x34, 0x37, 0x31, 0x34, 0x39,
+ 0x35, 0x38, 0x3d, 0x33, 0x37, 0x3c, 0x32, 0x37, 0x3b, 0x34, 0x39, 0x3d,
+ 0x34, 0x37, 0x3c, 0x36, 0x39, 0x3e, 0x38, 0x3d, 0x43, 0x35, 0x3a, 0x40,
+ 0x2e, 0x33, 0x39, 0x28, 0x2d, 0x30, 0x28, 0x2d, 0x2b, 0x28, 0x2d, 0x29,
+ 0x28, 0x2e, 0x2a, 0x2c, 0x32, 0x32, 0x2b, 0x32, 0x36, 0x31, 0x38, 0x3e,
+ 0x39, 0x40, 0x46, 0x41, 0x48, 0x4e, 0x48, 0x51, 0x58, 0x44, 0x4d, 0x56,
+ 0x48, 0x4d, 0x53, 0x65, 0x6b, 0x6d, 0x9a, 0xa1, 0x9c, 0xb8, 0xc0, 0xb5,
+ 0xb1, 0xbb, 0xb0, 0xab, 0xb5, 0xad, 0xaa, 0xb3, 0xb2, 0xae, 0xb7, 0xbb,
+ 0xad, 0xb4, 0xbd, 0xae, 0xb5, 0xbd, 0xae, 0xb7, 0xbc, 0xab, 0xb6, 0xbb,
+ 0xab, 0xb7, 0xbd, 0xad, 0xb7, 0xc0, 0xb0, 0xba, 0xc1, 0xaf, 0xba, 0xc0,
+ 0xac, 0xb9, 0xbf, 0xaf, 0xbc, 0xc2, 0xb2, 0xbf, 0xc5, 0xb3, 0xc0, 0xc7,
+ 0xb3, 0xc0, 0xc8, 0xb3, 0xbf, 0xc7, 0xb3, 0xbd, 0xc7, 0xb1, 0xbb, 0xc5,
+ 0xad, 0xb6, 0xbf, 0xa7, 0xb0, 0xb8, 0xa4, 0xaa, 0xb3, 0x9d, 0xa1, 0xaa,
+ 0x93, 0x95, 0x9c, 0x8a, 0x89, 0x8f, 0x82, 0x80, 0x85, 0x73, 0x71, 0x76,
+ 0x1b, 0x2c, 0x34, 0x27, 0x38, 0x3f, 0x47, 0x56, 0x5b, 0x43, 0x51, 0x56,
+ 0x28, 0x35, 0x3b, 0x39, 0x46, 0x4b, 0x3e, 0x4b, 0x53, 0x29, 0x37, 0x40,
+ 0x30, 0x3d, 0x45, 0x3e, 0x4c, 0x53, 0x3c, 0x49, 0x52, 0x2e, 0x3b, 0x46,
+ 0x1a, 0x26, 0x32, 0x14, 0x1d, 0x26, 0x1a, 0x1d, 0x23, 0x34, 0x31, 0x31,
+ 0x56, 0x52, 0x46, 0x62, 0x60, 0x53, 0x54, 0x55, 0x47, 0x49, 0x45, 0x3b,
+ 0x3f, 0x35, 0x32, 0x2e, 0x25, 0x28, 0x31, 0x30, 0x37, 0x52, 0x56, 0x5f,
+ 0x31, 0x37, 0x36, 0x1a, 0x1e, 0x1d, 0x1c, 0x1e, 0x1d, 0x22, 0x22, 0x22,
+ 0x25, 0x23, 0x24, 0x27, 0x26, 0x24, 0x25, 0x25, 0x23, 0x2c, 0x2c, 0x2a,
+ 0x2e, 0x2e, 0x30, 0x2c, 0x2d, 0x2f, 0x29, 0x2a, 0x2e, 0x29, 0x2a, 0x2f,
+ 0x28, 0x2b, 0x32, 0x2a, 0x2d, 0x34, 0x2b, 0x2e, 0x35, 0x34, 0x39, 0x3f,
+ 0x36, 0x39, 0x3e, 0x1e, 0x1f, 0x23, 0x09, 0x0a, 0x0c, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x07, 0x07, 0x07, 0x0c, 0x0c, 0x0d, 0x23, 0x23, 0x27,
+ 0x29, 0x2e, 0x34, 0x2a, 0x2f, 0x35, 0x26, 0x2b, 0x31, 0x27, 0x2a, 0x31,
+ 0x28, 0x2b, 0x32, 0x29, 0x2c, 0x33, 0x2a, 0x2d, 0x34, 0x29, 0x2c, 0x33,
+ 0x29, 0x2e, 0x35, 0x29, 0x2e, 0x34, 0x2b, 0x30, 0x36, 0x2b, 0x2e, 0x34,
+ 0x19, 0x1c, 0x21, 0x15, 0x16, 0x18, 0x15, 0x17, 0x16, 0x14, 0x16, 0x15,
+ 0x11, 0x13, 0x14, 0x11, 0x12, 0x14, 0x13, 0x14, 0x16, 0x13, 0x14, 0x16,
+ 0x13, 0x14, 0x16, 0x10, 0x11, 0x13, 0x10, 0x10, 0x12, 0x11, 0x11, 0x13,
+ 0x0f, 0x10, 0x12, 0x10, 0x11, 0x13, 0x0e, 0x10, 0x0f, 0x10, 0x12, 0x11,
+ 0x0e, 0x10, 0x0f, 0x0f, 0x11, 0x10, 0x0f, 0x11, 0x10, 0x0f, 0x11, 0x10,
+ 0x0e, 0x12, 0x11, 0x0e, 0x12, 0x11, 0x0e, 0x11, 0x10, 0x0e, 0x11, 0x10,
+ 0x0f, 0x10, 0x11, 0x10, 0x11, 0x13, 0x14, 0x15, 0x17, 0x0f, 0x10, 0x12,
+ 0x0d, 0x0e, 0x11, 0x0c, 0x0e, 0x0f, 0x1c, 0x1e, 0x1d, 0x24, 0x26, 0x23,
+ 0x16, 0x18, 0x14, 0x0e, 0x0f, 0x0c, 0x0c, 0x0b, 0x0b, 0x0e, 0x0f, 0x0f,
+ 0x18, 0x1a, 0x19, 0x19, 0x1b, 0x1a, 0x18, 0x19, 0x16, 0x18, 0x19, 0x14,
+ 0x1c, 0x1c, 0x1a, 0x28, 0x28, 0x26, 0x27, 0x27, 0x27, 0x11, 0x11, 0x13,
+ 0x0a, 0x0b, 0x0d, 0x09, 0x0b, 0x0d, 0x0a, 0x0d, 0x10, 0x0d, 0x11, 0x14,
+ 0x0c, 0x10, 0x13, 0x09, 0x0c, 0x0f, 0x0c, 0x0e, 0x12, 0x17, 0x18, 0x1c,
+ 0x12, 0x12, 0x12, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0e,
+ 0x12, 0x12, 0x10, 0x13, 0x13, 0x11, 0x16, 0x14, 0x15, 0x19, 0x17, 0x18,
+ 0x1b, 0x1a, 0x1b, 0x18, 0x18, 0x18, 0x14, 0x14, 0x12, 0x13, 0x13, 0x11,
+ 0x14, 0x14, 0x12, 0x13, 0x13, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
+ 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0f, 0x0b, 0x0b, 0x0d, 0x21, 0x21, 0x23,
+ 0x29, 0x28, 0x30, 0x24, 0x23, 0x29, 0x1c, 0x1a, 0x1f, 0x2b, 0x26, 0x2a,
+ 0x2d, 0x27, 0x29, 0x2c, 0x26, 0x28, 0x2b, 0x25, 0x27, 0x28, 0x22, 0x24,
+ 0x39, 0x33, 0x37, 0x38, 0x31, 0x38, 0x36, 0x2d, 0x35, 0x31, 0x27, 0x2f,
+ 0x30, 0x27, 0x2f, 0x28, 0x1e, 0x26, 0x29, 0x20, 0x25, 0x29, 0x20, 0x25,
+ 0x23, 0x1f, 0x1f, 0x20, 0x1c, 0x1d, 0x21, 0x1d, 0x1e, 0x27, 0x25, 0x26,
+ 0x26, 0x24, 0x26, 0x1c, 0x1c, 0x1e, 0x1f, 0x1f, 0x21, 0x23, 0x23, 0x27,
+ 0x25, 0x26, 0x28, 0x40, 0x41, 0x44, 0x47, 0x47, 0x4d, 0x43, 0x43, 0x4d,
+ 0x41, 0x41, 0x4d, 0x3d, 0x3d, 0x47, 0x28, 0x26, 0x31, 0x2c, 0x2b, 0x33,
+ 0x35, 0x34, 0x3a, 0x2f, 0x2e, 0x34, 0x1e, 0x1d, 0x23, 0x1c, 0x1b, 0x20,
+ 0x1f, 0x1e, 0x23, 0x1b, 0x1b, 0x1d, 0x10, 0x11, 0x13, 0x07, 0x08, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x11, 0x11, 0x0f, 0x10, 0x19, 0x17, 0x18, 0x1c, 0x17, 0x19,
+ 0x20, 0x17, 0x1a, 0x32, 0x2d, 0x2d, 0x34, 0x34, 0x30, 0x2a, 0x2d, 0x2a,
+ 0x60, 0x63, 0x65, 0x3e, 0x3e, 0x41, 0x34, 0x2d, 0x2f, 0x37, 0x2f, 0x30,
+ 0x46, 0x37, 0x39, 0x4f, 0x40, 0x43, 0x51, 0x40, 0x44, 0x49, 0x39, 0x3a,
+ 0x43, 0x33, 0x34, 0x40, 0x30, 0x31, 0x44, 0x34, 0x34, 0x43, 0x33, 0x33,
+ 0x49, 0x37, 0x3a, 0x4a, 0x37, 0x3b, 0x48, 0x36, 0x3a, 0x49, 0x36, 0x3a,
+ 0x48, 0x35, 0x37, 0x45, 0x33, 0x34, 0x3c, 0x2c, 0x2d, 0x37, 0x28, 0x29,
+ 0x33, 0x28, 0x26, 0x32, 0x28, 0x25, 0x2d, 0x24, 0x21, 0x29, 0x20, 0x1f,
+ 0x29, 0x24, 0x21, 0x2c, 0x28, 0x25, 0x27, 0x23, 0x21, 0x1a, 0x19, 0x17,
+ 0x16, 0x16, 0x14, 0x12, 0x12, 0x10, 0x11, 0x11, 0x0f, 0x15, 0x15, 0x15,
+ 0x18, 0x1a, 0x19, 0x17, 0x18, 0x19, 0x17, 0x18, 0x1a, 0x17, 0x18, 0x1a,
+ 0x17, 0x18, 0x1a, 0x19, 0x1a, 0x1c, 0x1b, 0x1c, 0x1d, 0x19, 0x1b, 0x1a,
+ 0x1a, 0x1c, 0x1b, 0x1d, 0x1f, 0x1d, 0x22, 0x24, 0x21, 0x30, 0x32, 0x2f,
+ 0x36, 0x3a, 0x38, 0x36, 0x3a, 0x39, 0x33, 0x37, 0x38, 0x39, 0x3d, 0x3e,
+ 0x3b, 0x3f, 0x42, 0x3d, 0x41, 0x43, 0x38, 0x3c, 0x3d, 0x37, 0x3c, 0x3d,
+ 0x3a, 0x3e, 0x41, 0x39, 0x3d, 0x40, 0x3a, 0x3f, 0x42, 0x36, 0x3c, 0x3f,
+ 0x34, 0x3c, 0x3e, 0x35, 0x3d, 0x3f, 0x38, 0x3d, 0x40, 0x39, 0x3e, 0x41,
+ 0x3a, 0x40, 0x40, 0x39, 0x3f, 0x3f, 0x38, 0x3c, 0x3d, 0x36, 0x3a, 0x3d,
+ 0x37, 0x3c, 0x3f, 0x34, 0x3a, 0x3c, 0x35, 0x3c, 0x3e, 0x32, 0x3a, 0x3c,
+ 0x36, 0x3b, 0x3f, 0x37, 0x3c, 0x40, 0x35, 0x3a, 0x3e, 0x34, 0x38, 0x3c,
+ 0x35, 0x3a, 0x3e, 0x34, 0x39, 0x3d, 0x34, 0x39, 0x3d, 0x33, 0x39, 0x3c,
+ 0x31, 0x37, 0x37, 0x30, 0x36, 0x36, 0x34, 0x38, 0x3b, 0x33, 0x36, 0x3b,
+ 0x34, 0x38, 0x3d, 0x34, 0x39, 0x3d, 0x32, 0x38, 0x3c, 0x32, 0x39, 0x3d,
+ 0x35, 0x38, 0x3d, 0x37, 0x39, 0x3e, 0x33, 0x36, 0x3b, 0x2e, 0x34, 0x37,
+ 0x22, 0x27, 0x2a, 0x27, 0x2d, 0x2d, 0x28, 0x2e, 0x2c, 0x2a, 0x2f, 0x2b,
+ 0x2a, 0x2e, 0x2b, 0x2a, 0x2e, 0x2f, 0x2a, 0x2e, 0x32, 0x29, 0x2e, 0x32,
+ 0x2d, 0x32, 0x36, 0x38, 0x40, 0x43, 0x3d, 0x46, 0x4b, 0x43, 0x4c, 0x53,
+ 0x44, 0x4d, 0x56, 0x42, 0x4a, 0x4f, 0x52, 0x5b, 0x58, 0x84, 0x8b, 0x83,
+ 0xb4, 0xbd, 0xb2, 0xbc, 0xc6, 0xbe, 0xb6, 0xbf, 0xbc, 0xb4, 0xbd, 0xbe,
+ 0xb0, 0xb7, 0xbd, 0xa9, 0xb0, 0xb6, 0xa6, 0xad, 0xb3, 0xaa, 0xb1, 0xb7,
+ 0xaa, 0xb4, 0xb6, 0xa9, 0xb3, 0xb5, 0xa9, 0xb3, 0xb5, 0xa6, 0xb1, 0xb3,
+ 0xa7, 0xb0, 0xb7, 0xaa, 0xb4, 0xbb, 0xaa, 0xb5, 0xbb, 0xab, 0xb6, 0xbc,
+ 0xaa, 0xb5, 0xbb, 0xa9, 0xb2, 0xb9, 0xa5, 0xac, 0xb4, 0xa3, 0xa9, 0xb1,
+ 0x9e, 0xa5, 0xab, 0x9d, 0xa2, 0xa8, 0x98, 0x9b, 0xa2, 0x92, 0x93, 0x99,
+ 0x8c, 0x8b, 0x90, 0x87, 0x85, 0x88, 0x7a, 0x75, 0x79, 0x64, 0x60, 0x61,
+ 0x12, 0x24, 0x30, 0x20, 0x30, 0x3a, 0x46, 0x55, 0x5a, 0x61, 0x6f, 0x72,
+ 0x50, 0x5e, 0x60, 0x38, 0x46, 0x4b, 0x1e, 0x2a, 0x35, 0x15, 0x21, 0x2f,
+ 0x14, 0x22, 0x2d, 0x13, 0x22, 0x2d, 0x17, 0x25, 0x32, 0x14, 0x22, 0x30,
+ 0x13, 0x1f, 0x2d, 0x13, 0x1b, 0x24, 0x22, 0x21, 0x24, 0x50, 0x4a, 0x47,
+ 0x6f, 0x6b, 0x62, 0x70, 0x6e, 0x61, 0x6d, 0x6f, 0x5e, 0x63, 0x5f, 0x51,
+ 0x44, 0x3b, 0x32, 0x32, 0x29, 0x29, 0x22, 0x23, 0x29, 0x43, 0x4d, 0x56,
+ 0x52, 0x5c, 0x5f, 0x39, 0x41, 0x43, 0x23, 0x26, 0x29, 0x23, 0x23, 0x25,
+ 0x26, 0x25, 0x27, 0x28, 0x26, 0x27, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2b,
+ 0x2c, 0x2d, 0x2f, 0x2b, 0x2c, 0x2f, 0x2c, 0x2d, 0x31, 0x2b, 0x2c, 0x31,
+ 0x2b, 0x2e, 0x35, 0x2f, 0x32, 0x39, 0x32, 0x35, 0x3c, 0x34, 0x36, 0x3d,
+ 0x3c, 0x3d, 0x44, 0x28, 0x28, 0x2d, 0x0c, 0x0c, 0x0e, 0x0a, 0x0a, 0x0a,
+ 0x07, 0x07, 0x07, 0x09, 0x09, 0x0a, 0x09, 0x09, 0x0b, 0x1d, 0x1e, 0x22,
+ 0x28, 0x2d, 0x33, 0x28, 0x2d, 0x33, 0x26, 0x2b, 0x31, 0x2a, 0x2d, 0x34,
+ 0x2b, 0x2e, 0x35, 0x28, 0x2b, 0x32, 0x2a, 0x2e, 0x34, 0x28, 0x2b, 0x32,
+ 0x2b, 0x30, 0x36, 0x2d, 0x32, 0x37, 0x29, 0x2e, 0x34, 0x2c, 0x30, 0x36,
+ 0x1a, 0x1d, 0x22, 0x15, 0x16, 0x18, 0x13, 0x15, 0x14, 0x11, 0x13, 0x11,
+ 0x11, 0x12, 0x14, 0x11, 0x12, 0x14, 0x14, 0x15, 0x17, 0x13, 0x14, 0x16,
+ 0x11, 0x12, 0x14, 0x12, 0x13, 0x15, 0x11, 0x11, 0x13, 0x11, 0x11, 0x13,
+ 0x12, 0x12, 0x15, 0x11, 0x12, 0x14, 0x11, 0x13, 0x12, 0x0f, 0x11, 0x10,
+ 0x0f, 0x11, 0x10, 0x0f, 0x11, 0x10, 0x0e, 0x10, 0x0f, 0x0e, 0x10, 0x0f,
+ 0x10, 0x12, 0x11, 0x10, 0x12, 0x11, 0x0f, 0x11, 0x0f, 0x10, 0x12, 0x11,
+ 0x10, 0x12, 0x11, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x0e, 0x0e, 0x0f,
+ 0x0c, 0x0d, 0x0f, 0x0c, 0x0d, 0x10, 0x11, 0x12, 0x14, 0x0a, 0x0b, 0x0d,
+ 0x0a, 0x0c, 0x0b, 0x09, 0x0b, 0x0a, 0x06, 0x08, 0x07, 0x07, 0x09, 0x07,
+ 0x0c, 0x10, 0x0f, 0x16, 0x18, 0x15, 0x1e, 0x1e, 0x1a, 0x1d, 0x1e, 0x19,
+ 0x2b, 0x2a, 0x26, 0x3f, 0x3f, 0x3c, 0x33, 0x33, 0x33, 0x12, 0x13, 0x15,
+ 0x0c, 0x0c, 0x10, 0x0e, 0x0f, 0x13, 0x0c, 0x10, 0x13, 0x0a, 0x0d, 0x12,
+ 0x09, 0x0c, 0x11, 0x0b, 0x0e, 0x12, 0x0b, 0x0c, 0x10, 0x27, 0x28, 0x2b,
+ 0x1e, 0x1e, 0x20, 0x0e, 0x0e, 0x0f, 0x0c, 0x0c, 0x0c, 0x0f, 0x10, 0x0e,
+ 0x11, 0x11, 0x0f, 0x11, 0x11, 0x11, 0x15, 0x13, 0x14, 0x17, 0x15, 0x16,
+ 0x18, 0x18, 0x18, 0x17, 0x17, 0x17, 0x18, 0x18, 0x16, 0x17, 0x17, 0x14,
+ 0x15, 0x15, 0x13, 0x13, 0x13, 0x11, 0x13, 0x13, 0x12, 0x14, 0x14, 0x14,
+ 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12,
+ 0x0f, 0x0f, 0x0f, 0x0a, 0x0a, 0x0c, 0x12, 0x12, 0x14, 0x2c, 0x2c, 0x2e,
+ 0x2c, 0x2c, 0x34, 0x2b, 0x2a, 0x30, 0x21, 0x1f, 0x22, 0x2d, 0x29, 0x2a,
+ 0x2b, 0x25, 0x27, 0x29, 0x23, 0x25, 0x27, 0x21, 0x25, 0x2b, 0x25, 0x29,
+ 0x39, 0x33, 0x37, 0x37, 0x2f, 0x36, 0x34, 0x2d, 0x34, 0x2e, 0x26, 0x2d,
+ 0x2d, 0x26, 0x2d, 0x24, 0x1d, 0x24, 0x23, 0x1e, 0x22, 0x24, 0x1f, 0x22,
+ 0x20, 0x1c, 0x1d, 0x21, 0x1d, 0x1e, 0x24, 0x21, 0x22, 0x29, 0x27, 0x29,
+ 0x29, 0x27, 0x2a, 0x1b, 0x1a, 0x1d, 0x23, 0x22, 0x26, 0x24, 0x23, 0x28,
+ 0x26, 0x28, 0x27, 0x41, 0x43, 0x45, 0x48, 0x48, 0x4e, 0x42, 0x42, 0x4d,
+ 0x3f, 0x3f, 0x4b, 0x3a, 0x39, 0x44, 0x2b, 0x2a, 0x32, 0x30, 0x2f, 0x37,
+ 0x30, 0x2f, 0x37, 0x2e, 0x2d, 0x33, 0x1e, 0x1d, 0x23, 0x1b, 0x1a, 0x1f,
+ 0x1e, 0x1d, 0x22, 0x1a, 0x19, 0x1c, 0x0f, 0x10, 0x12, 0x09, 0x0b, 0x0a,
+ 0x0b, 0x0c, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0d, 0x0d, 0x11, 0x0f, 0x10, 0x18, 0x17, 0x17, 0x1b, 0x17, 0x18,
+ 0x21, 0x18, 0x1b, 0x2d, 0x27, 0x27, 0x29, 0x28, 0x23, 0x3f, 0x3f, 0x3d,
+ 0x66, 0x66, 0x69, 0x36, 0x35, 0x3a, 0x35, 0x33, 0x38, 0x31, 0x2e, 0x31,
+ 0x37, 0x2f, 0x30, 0x38, 0x2e, 0x2f, 0x3d, 0x32, 0x33, 0x43, 0x36, 0x38,
+ 0x42, 0x34, 0x36, 0x3d, 0x2f, 0x2f, 0x39, 0x2b, 0x2b, 0x3b, 0x2e, 0x2f,
+ 0x3a, 0x2a, 0x2f, 0x3a, 0x29, 0x2f, 0x39, 0x28, 0x2e, 0x36, 0x25, 0x2a,
+ 0x35, 0x24, 0x2a, 0x32, 0x23, 0x28, 0x2b, 0x20, 0x23, 0x29, 0x1f, 0x22,
+ 0x28, 0x21, 0x1e, 0x26, 0x1f, 0x1d, 0x21, 0x1c, 0x19, 0x20, 0x1a, 0x19,
+ 0x21, 0x1d, 0x1c, 0x1d, 0x1c, 0x19, 0x17, 0x16, 0x14, 0x14, 0x13, 0x11,
+ 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x16, 0x16, 0x16,
+ 0x18, 0x18, 0x1a, 0x14, 0x15, 0x18, 0x17, 0x18, 0x1a, 0x14, 0x17, 0x18,
+ 0x16, 0x17, 0x19, 0x19, 0x1a, 0x1c, 0x18, 0x1a, 0x19, 0x19, 0x1b, 0x1a,
+ 0x1c, 0x1e, 0x1d, 0x22, 0x24, 0x21, 0x2d, 0x2e, 0x2b, 0x36, 0x38, 0x35,
+ 0x35, 0x39, 0x38, 0x34, 0x38, 0x37, 0x37, 0x3b, 0x3c, 0x37, 0x3b, 0x3c,
+ 0x3b, 0x3f, 0x41, 0x3b, 0x3c, 0x40, 0x3a, 0x3b, 0x3f, 0x3a, 0x3b, 0x3f,
+ 0x38, 0x3c, 0x3e, 0x36, 0x3a, 0x3d, 0x37, 0x3c, 0x3f, 0x36, 0x3b, 0x3e,
+ 0x36, 0x3e, 0x40, 0x34, 0x3a, 0x3c, 0x36, 0x3a, 0x3e, 0x35, 0x3a, 0x3d,
+ 0x38, 0x3e, 0x3e, 0x38, 0x3d, 0x3f, 0x35, 0x39, 0x3d, 0x35, 0x39, 0x3c,
+ 0x38, 0x3d, 0x3f, 0x36, 0x3c, 0x3c, 0x35, 0x3c, 0x3b, 0x32, 0x3a, 0x39,
+ 0x33, 0x36, 0x3b, 0x38, 0x3b, 0x40, 0x37, 0x3a, 0x3f, 0x34, 0x39, 0x3f,
+ 0x36, 0x3b, 0x3f, 0x37, 0x3d, 0x41, 0x35, 0x3c, 0x40, 0x30, 0x38, 0x3a,
+ 0x30, 0x36, 0x36, 0x2f, 0x33, 0x34, 0x35, 0x39, 0x3c, 0x34, 0x37, 0x3c,
+ 0x34, 0x37, 0x3c, 0x33, 0x38, 0x3c, 0x36, 0x3b, 0x3f, 0x34, 0x3b, 0x3e,
+ 0x33, 0x36, 0x3d, 0x31, 0x34, 0x39, 0x2a, 0x2f, 0x32, 0x23, 0x29, 0x29,
+ 0x21, 0x28, 0x27, 0x26, 0x2c, 0x2b, 0x29, 0x2f, 0x2e, 0x2d, 0x32, 0x31,
+ 0x2a, 0x2c, 0x2b, 0x2a, 0x2b, 0x2e, 0x2b, 0x2b, 0x31, 0x2a, 0x2b, 0x30,
+ 0x27, 0x2b, 0x2e, 0x2a, 0x32, 0x34, 0x32, 0x3c, 0x3d, 0x3a, 0x46, 0x48,
+ 0x41, 0x4c, 0x52, 0x43, 0x4f, 0x53, 0x41, 0x4b, 0x4d, 0x44, 0x4c, 0x4e,
+ 0x6e, 0x76, 0x75, 0xae, 0xb7, 0xb2, 0xc9, 0xd3, 0xcb, 0xc6, 0xd0, 0xc7,
+ 0xbf, 0xc5, 0xc2, 0xb6, 0xbc, 0xbd, 0xb0, 0xb5, 0xb8, 0xb0, 0xb5, 0xb8,
+ 0xaf, 0xb7, 0xb7, 0xaa, 0xb3, 0xb2, 0xa0, 0xaa, 0xab, 0xa1, 0xaa, 0xad,
+ 0xa6, 0xac, 0xb2, 0xa6, 0xad, 0xb3, 0xa2, 0xac, 0xae, 0xa0, 0xaa, 0xad,
+ 0x9f, 0xaa, 0xab, 0x9b, 0xa3, 0xa6, 0x9d, 0xa0, 0xa4, 0x9d, 0x9e, 0xa2,
+ 0x99, 0x9d, 0xa0, 0x96, 0x9a, 0x9d, 0x91, 0x92, 0x97, 0x8a, 0x89, 0x8e,
+ 0x86, 0x84, 0x87, 0x80, 0x7c, 0x7d, 0x66, 0x62, 0x61, 0x5b, 0x57, 0x56,
+ 0x10, 0x21, 0x31, 0x28, 0x38, 0x44, 0x56, 0x65, 0x6a, 0x5f, 0x6d, 0x6e,
+ 0x3a, 0x46, 0x48, 0x1a, 0x25, 0x2b, 0x14, 0x20, 0x2e, 0x15, 0x21, 0x33,
+ 0x13, 0x22, 0x31, 0x11, 0x21, 0x2f, 0x12, 0x21, 0x30, 0x13, 0x24, 0x33,
+ 0x15, 0x21, 0x2f, 0x16, 0x1c, 0x26, 0x23, 0x21, 0x21, 0x5a, 0x53, 0x4e,
+ 0x84, 0x7f, 0x7b, 0x99, 0x98, 0x8e, 0xa2, 0xa3, 0x92, 0x7b, 0x79, 0x67,
+ 0x48, 0x40, 0x33, 0x2f, 0x27, 0x23, 0x1b, 0x1d, 0x20, 0x24, 0x2f, 0x34,
+ 0x40, 0x48, 0x4e, 0x42, 0x48, 0x4f, 0x2d, 0x2e, 0x35, 0x24, 0x24, 0x28,
+ 0x26, 0x25, 0x2a, 0x2b, 0x2b, 0x2d, 0x32, 0x32, 0x33, 0x30, 0x30, 0x30,
+ 0x28, 0x2c, 0x2d, 0x25, 0x28, 0x2a, 0x28, 0x2c, 0x2f, 0x2a, 0x2b, 0x30,
+ 0x2c, 0x2c, 0x34, 0x34, 0x34, 0x3c, 0x34, 0x34, 0x3c, 0x3a, 0x3a, 0x42,
+ 0x37, 0x37, 0x3f, 0x2c, 0x2b, 0x31, 0x0e, 0x0e, 0x10, 0x0a, 0x0a, 0x0a,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x18, 0x19, 0x1d,
+ 0x26, 0x2a, 0x31, 0x23, 0x28, 0x2e, 0x26, 0x2b, 0x31, 0x27, 0x2a, 0x31,
+ 0x2a, 0x2e, 0x34, 0x28, 0x2b, 0x32, 0x28, 0x2a, 0x32, 0x2a, 0x2d, 0x34,
+ 0x2b, 0x30, 0x36, 0x2b, 0x30, 0x36, 0x2a, 0x2e, 0x35, 0x2d, 0x31, 0x37,
+ 0x22, 0x26, 0x2a, 0x13, 0x16, 0x19, 0x14, 0x16, 0x15, 0x14, 0x16, 0x14,
+ 0x13, 0x15, 0x16, 0x14, 0x15, 0x16, 0x13, 0x14, 0x16, 0x12, 0x14, 0x15,
+ 0x12, 0x13, 0x15, 0x12, 0x13, 0x15, 0x13, 0x13, 0x15, 0x13, 0x13, 0x15,
+ 0x11, 0x12, 0x14, 0x10, 0x11, 0x13, 0x10, 0x11, 0x12, 0x10, 0x12, 0x11,
+ 0x10, 0x12, 0x11, 0x0f, 0x11, 0x10, 0x10, 0x12, 0x11, 0x0f, 0x11, 0x10,
+ 0x0d, 0x0f, 0x0c, 0x0f, 0x11, 0x0f, 0x0f, 0x11, 0x10, 0x0e, 0x10, 0x0f,
+ 0x15, 0x15, 0x15, 0x19, 0x19, 0x19, 0x14, 0x14, 0x14, 0x12, 0x12, 0x12,
+ 0x1b, 0x1a, 0x1a, 0x24, 0x24, 0x25, 0x19, 0x19, 0x1b, 0x0b, 0x0c, 0x10,
+ 0x0a, 0x0b, 0x0e, 0x0b, 0x0c, 0x0d, 0x07, 0x0b, 0x08, 0x05, 0x0a, 0x06,
+ 0x05, 0x09, 0x08, 0x0b, 0x0d, 0x0a, 0x17, 0x17, 0x13, 0x2b, 0x2a, 0x25,
+ 0x48, 0x47, 0x42, 0x43, 0x43, 0x3f, 0x1e, 0x1e, 0x1e, 0x0f, 0x0f, 0x10,
+ 0x12, 0x12, 0x16, 0x14, 0x15, 0x1a, 0x0f, 0x12, 0x17, 0x0b, 0x0e, 0x13,
+ 0x08, 0x0b, 0x10, 0x0b, 0x0e, 0x13, 0x0a, 0x0c, 0x10, 0x29, 0x2b, 0x2d,
+ 0x28, 0x28, 0x2a, 0x13, 0x14, 0x15, 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11,
+ 0x0f, 0x0e, 0x0e, 0x10, 0x10, 0x10, 0x16, 0x14, 0x15, 0x19, 0x17, 0x18,
+ 0x1d, 0x1d, 0x1d, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x1a, 0x19, 0x16,
+ 0x16, 0x15, 0x13, 0x0f, 0x0f, 0x0d, 0x0e, 0x0e, 0x0c, 0x11, 0x11, 0x11,
+ 0x12, 0x12, 0x12, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x12, 0x12, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x0a, 0x0a, 0x0b, 0x1a, 0x1a, 0x1c, 0x30, 0x30, 0x33,
+ 0x28, 0x28, 0x30, 0x40, 0x3f, 0x45, 0x21, 0x1f, 0x22, 0x28, 0x25, 0x26,
+ 0x27, 0x22, 0x24, 0x28, 0x22, 0x24, 0x23, 0x1d, 0x21, 0x2e, 0x27, 0x2e,
+ 0x36, 0x30, 0x35, 0x35, 0x2e, 0x35, 0x30, 0x29, 0x30, 0x2f, 0x28, 0x2f,
+ 0x2b, 0x26, 0x2d, 0x21, 0x1c, 0x22, 0x20, 0x1e, 0x21, 0x1f, 0x1d, 0x1f,
+ 0x21, 0x1d, 0x1e, 0x24, 0x20, 0x21, 0x29, 0x25, 0x28, 0x2b, 0x29, 0x2c,
+ 0x25, 0x24, 0x27, 0x1b, 0x1a, 0x1f, 0x21, 0x20, 0x26, 0x24, 0x23, 0x28,
+ 0x2b, 0x2d, 0x2c, 0x45, 0x47, 0x49, 0x45, 0x46, 0x4e, 0x43, 0x43, 0x4d,
+ 0x3b, 0x3b, 0x47, 0x38, 0x38, 0x43, 0x2b, 0x2a, 0x32, 0x2e, 0x2d, 0x35,
+ 0x2e, 0x2d, 0x35, 0x2e, 0x2d, 0x33, 0x1e, 0x1d, 0x23, 0x1a, 0x19, 0x1e,
+ 0x1f, 0x1e, 0x23, 0x19, 0x19, 0x1b, 0x0e, 0x0f, 0x11, 0x0a, 0x0c, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x12, 0x10, 0x11, 0x19, 0x17, 0x18, 0x1c, 0x18, 0x19,
+ 0x21, 0x1b, 0x1f, 0x33, 0x2d, 0x2d, 0x2d, 0x29, 0x26, 0x47, 0x41, 0x40,
+ 0x6a, 0x66, 0x69, 0x33, 0x30, 0x37, 0x33, 0x33, 0x39, 0x31, 0x32, 0x37,
+ 0x39, 0x36, 0x36, 0x37, 0x31, 0x31, 0x2f, 0x29, 0x2a, 0x31, 0x28, 0x2a,
+ 0x35, 0x2b, 0x2c, 0x38, 0x2e, 0x30, 0x39, 0x2f, 0x30, 0x3c, 0x33, 0x33,
+ 0x37, 0x2f, 0x2d, 0x30, 0x28, 0x25, 0x2d, 0x25, 0x22, 0x29, 0x21, 0x1f,
+ 0x25, 0x20, 0x1e, 0x23, 0x1f, 0x1c, 0x20, 0x1e, 0x1b, 0x1e, 0x1d, 0x1a,
+ 0x1f, 0x1b, 0x1a, 0x1c, 0x18, 0x17, 0x19, 0x16, 0x15, 0x17, 0x16, 0x14,
+ 0x16, 0x15, 0x13, 0x14, 0x13, 0x11, 0x12, 0x12, 0x10, 0x10, 0x10, 0x0e,
+ 0x10, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x12, 0x13, 0x13, 0x16, 0x16, 0x18,
+ 0x14, 0x14, 0x16, 0x13, 0x14, 0x16, 0x15, 0x17, 0x19, 0x16, 0x1a, 0x1d,
+ 0x19, 0x1a, 0x1c, 0x19, 0x1a, 0x1c, 0x16, 0x18, 0x18, 0x19, 0x1b, 0x1a,
+ 0x1f, 0x21, 0x20, 0x29, 0x2b, 0x28, 0x32, 0x34, 0x31, 0x36, 0x38, 0x35,
+ 0x33, 0x39, 0x36, 0x34, 0x3a, 0x38, 0x39, 0x3d, 0x3e, 0x3a, 0x3e, 0x3f,
+ 0x39, 0x3a, 0x3e, 0x36, 0x37, 0x3b, 0x39, 0x38, 0x3d, 0x38, 0x38, 0x3c,
+ 0x37, 0x3b, 0x3d, 0x36, 0x3c, 0x3c, 0x37, 0x3d, 0x3d, 0x33, 0x3c, 0x3c,
+ 0x32, 0x3b, 0x3a, 0x33, 0x39, 0x39, 0x33, 0x39, 0x39, 0x35, 0x3b, 0x3b,
+ 0x37, 0x3e, 0x3f, 0x39, 0x3e, 0x42, 0x35, 0x3a, 0x3d, 0x33, 0x38, 0x3b,
+ 0x35, 0x39, 0x3a, 0x35, 0x3b, 0x3b, 0x34, 0x3b, 0x39, 0x34, 0x3a, 0x38,
+ 0x35, 0x37, 0x3b, 0x3a, 0x3b, 0x41, 0x35, 0x38, 0x3f, 0x33, 0x38, 0x3e,
+ 0x37, 0x3c, 0x42, 0x35, 0x3c, 0x40, 0x33, 0x3c, 0x3e, 0x34, 0x3c, 0x3e,
+ 0x32, 0x38, 0x38, 0x32, 0x36, 0x37, 0x34, 0x38, 0x3b, 0x36, 0x39, 0x3e,
+ 0x34, 0x37, 0x3c, 0x30, 0x36, 0x3a, 0x30, 0x38, 0x3b, 0x30, 0x37, 0x3b,
+ 0x30, 0x34, 0x3b, 0x28, 0x2b, 0x31, 0x23, 0x28, 0x2b, 0x27, 0x2d, 0x2c,
+ 0x2c, 0x32, 0x30, 0x2d, 0x32, 0x31, 0x29, 0x2f, 0x30, 0x29, 0x2e, 0x31,
+ 0x2a, 0x2c, 0x30, 0x2d, 0x2c, 0x32, 0x2b, 0x2a, 0x31, 0x2c, 0x2d, 0x32,
+ 0x29, 0x2d, 0x2f, 0x2c, 0x32, 0x32, 0x2e, 0x38, 0x37, 0x2f, 0x3b, 0x3b,
+ 0x31, 0x3e, 0x3d, 0x3a, 0x47, 0x4a, 0x44, 0x4c, 0x55, 0x43, 0x48, 0x54,
+ 0x3e, 0x45, 0x4d, 0x60, 0x69, 0x68, 0xa4, 0xaf, 0xa5, 0xcc, 0xd7, 0xc7,
+ 0xd0, 0xd8, 0xce, 0xcc, 0xd3, 0xce, 0xc7, 0xce, 0xcb, 0xc3, 0xc9, 0xc7,
+ 0xbf, 0xc5, 0xc3, 0xb7, 0xbf, 0xbe, 0xaf, 0xb7, 0xbb, 0xae, 0xb6, 0xbc,
+ 0xaf, 0xb3, 0xb7, 0xad, 0xb2, 0xb5, 0xa9, 0xb0, 0xb2, 0xa5, 0xad, 0xaf,
+ 0xa2, 0xac, 0xab, 0xa0, 0xa6, 0xa6, 0xa2, 0xa3, 0xa3, 0xa0, 0xa0, 0xa0,
+ 0x97, 0x9b, 0x9c, 0x92, 0x93, 0x95, 0x8f, 0x8f, 0x91, 0x87, 0x85, 0x88,
+ 0x7e, 0x79, 0x7a, 0x66, 0x62, 0x61, 0x53, 0x4f, 0x4d, 0x59, 0x54, 0x52,
+ 0x19, 0x29, 0x38, 0x34, 0x44, 0x51, 0x48, 0x58, 0x60, 0x31, 0x41, 0x47,
+ 0x17, 0x25, 0x2c, 0x12, 0x20, 0x2a, 0x15, 0x21, 0x33, 0x13, 0x1f, 0x32,
+ 0x0f, 0x20, 0x28, 0x12, 0x21, 0x2a, 0x17, 0x24, 0x30, 0x16, 0x22, 0x32,
+ 0x16, 0x20, 0x31, 0x18, 0x1e, 0x2b, 0x1b, 0x1a, 0x20, 0x3e, 0x38, 0x37,
+ 0x77, 0x6c, 0x6b, 0xbe, 0xb2, 0xab, 0xc0, 0xb5, 0xa5, 0x76, 0x69, 0x59,
+ 0x3c, 0x33, 0x27, 0x2a, 0x22, 0x1b, 0x36, 0x2c, 0x28, 0x42, 0x37, 0x32,
+ 0x4f, 0x44, 0x3d, 0x4b, 0x41, 0x3f, 0x32, 0x2a, 0x2d, 0x23, 0x1f, 0x21,
+ 0x27, 0x28, 0x26, 0x2a, 0x2c, 0x2a, 0x29, 0x2d, 0x2c, 0x2c, 0x2e, 0x32,
+ 0x2a, 0x2e, 0x30, 0x27, 0x2b, 0x2d, 0x2a, 0x2b, 0x30, 0x2d, 0x2c, 0x34,
+ 0x31, 0x2f, 0x38, 0x33, 0x32, 0x3d, 0x32, 0x31, 0x3c, 0x39, 0x39, 0x43,
+ 0x31, 0x31, 0x39, 0x28, 0x29, 0x2e, 0x10, 0x10, 0x12, 0x09, 0x09, 0x09,
+ 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x0b, 0x09, 0x0a, 0x0c, 0x16, 0x17, 0x1a,
+ 0x29, 0x2d, 0x33, 0x25, 0x2b, 0x31, 0x27, 0x2c, 0x32, 0x26, 0x2b, 0x31,
+ 0x29, 0x2e, 0x34, 0x26, 0x2b, 0x31, 0x28, 0x2c, 0x33, 0x29, 0x2d, 0x34,
+ 0x2c, 0x31, 0x37, 0x2c, 0x30, 0x39, 0x28, 0x2c, 0x35, 0x2e, 0x33, 0x39,
+ 0x2b, 0x30, 0x33, 0x14, 0x17, 0x19, 0x14, 0x15, 0x17, 0x17, 0x18, 0x1b,
+ 0x14, 0x16, 0x15, 0x14, 0x16, 0x15, 0x13, 0x14, 0x14, 0x14, 0x16, 0x15,
+ 0x15, 0x17, 0x16, 0x13, 0x15, 0x14, 0x11, 0x14, 0x13, 0x11, 0x13, 0x12,
+ 0x11, 0x11, 0x13, 0x15, 0x15, 0x17, 0x13, 0x13, 0x15, 0x10, 0x11, 0x13,
+ 0x10, 0x11, 0x13, 0x10, 0x11, 0x13, 0x11, 0x12, 0x14, 0x0f, 0x10, 0x12,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x13, 0x12, 0x10, 0x12, 0x11,
+ 0x17, 0x18, 0x18, 0x17, 0x19, 0x18, 0x0f, 0x10, 0x0e, 0x1f, 0x1d, 0x1b,
+ 0x48, 0x43, 0x36, 0x4b, 0x48, 0x40, 0x29, 0x29, 0x29, 0x12, 0x13, 0x15,
+ 0x0c, 0x0d, 0x0b, 0x0b, 0x0d, 0x08, 0x0c, 0x11, 0x0d, 0x14, 0x1a, 0x1a,
+ 0x12, 0x13, 0x14, 0x0c, 0x0c, 0x0c, 0x0d, 0x0e, 0x0b, 0x24, 0x26, 0x23,
+ 0x4e, 0x50, 0x4e, 0x30, 0x32, 0x31, 0x1b, 0x1c, 0x1d, 0x10, 0x11, 0x13,
+ 0x10, 0x11, 0x15, 0x0f, 0x11, 0x16, 0x0d, 0x10, 0x15, 0x0b, 0x0e, 0x13,
+ 0x0b, 0x0e, 0x13, 0x0b, 0x0e, 0x13, 0x08, 0x0a, 0x0f, 0x21, 0x22, 0x27,
+ 0x2a, 0x2d, 0x30, 0x10, 0x12, 0x14, 0x11, 0x0f, 0x11, 0x17, 0x12, 0x14,
+ 0x14, 0x11, 0x10, 0x15, 0x11, 0x10, 0x1b, 0x1a, 0x18, 0x1d, 0x1d, 0x1b,
+ 0x1f, 0x1e, 0x1d, 0x13, 0x12, 0x10, 0x0d, 0x0c, 0x0a, 0x11, 0x10, 0x0e,
+ 0x12, 0x11, 0x0f, 0x0f, 0x0d, 0x0c, 0x10, 0x0e, 0x0f, 0x11, 0x0f, 0x10,
+ 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x11, 0x0d, 0x0d, 0x0f, 0x0e, 0x0e, 0x0c,
+ 0x0d, 0x0e, 0x09, 0x0d, 0x0d, 0x0b, 0x25, 0x25, 0x29, 0x31, 0x31, 0x39,
+ 0x28, 0x2d, 0x33, 0x3c, 0x3e, 0x45, 0x1f, 0x1e, 0x24, 0x26, 0x21, 0x27,
+ 0x27, 0x21, 0x25, 0x26, 0x20, 0x24, 0x22, 0x1c, 0x20, 0x2e, 0x28, 0x2d,
+ 0x34, 0x2e, 0x37, 0x2e, 0x2a, 0x33, 0x29, 0x25, 0x2e, 0x2e, 0x2b, 0x32,
+ 0x2c, 0x2a, 0x30, 0x22, 0x20, 0x25, 0x21, 0x1e, 0x21, 0x22, 0x1e, 0x1f,
+ 0x25, 0x21, 0x21, 0x28, 0x24, 0x25, 0x2b, 0x28, 0x2a, 0x2c, 0x2a, 0x2d,
+ 0x21, 0x20, 0x24, 0x18, 0x17, 0x1d, 0x24, 0x23, 0x2b, 0x2a, 0x28, 0x32,
+ 0x33, 0x33, 0x38, 0x45, 0x45, 0x4b, 0x43, 0x43, 0x4b, 0x41, 0x41, 0x4a,
+ 0x3e, 0x3e, 0x46, 0x39, 0x39, 0x41, 0x29, 0x28, 0x30, 0x2f, 0x2e, 0x34,
+ 0x31, 0x30, 0x37, 0x2f, 0x2e, 0x33, 0x1d, 0x1d, 0x20, 0x1b, 0x1b, 0x1d,
+ 0x1f, 0x1e, 0x23, 0x17, 0x16, 0x1b, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x08,
+ 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0e, 0x0f, 0x0e,
+ 0x0f, 0x0f, 0x0f, 0x14, 0x13, 0x13, 0x18, 0x17, 0x17, 0x18, 0x16, 0x17,
+ 0x1c, 0x18, 0x19, 0x30, 0x2c, 0x2b, 0x2c, 0x27, 0x26, 0x46, 0x45, 0x41,
+ 0x65, 0x64, 0x63, 0x32, 0x32, 0x35, 0x31, 0x31, 0x37, 0x34, 0x33, 0x3d,
+ 0x33, 0x32, 0x37, 0x33, 0x32, 0x36, 0x2c, 0x2b, 0x30, 0x26, 0x25, 0x2a,
+ 0x22, 0x20, 0x24, 0x28, 0x26, 0x29, 0x2e, 0x2b, 0x2c, 0x2e, 0x2c, 0x2b,
+ 0x2e, 0x2a, 0x2d, 0x28, 0x24, 0x25, 0x22, 0x21, 0x1f, 0x1f, 0x1d, 0x1b,
+ 0x1e, 0x1d, 0x1a, 0x1b, 0x1a, 0x18, 0x1d, 0x19, 0x1a, 0x1c, 0x18, 0x1b,
+ 0x17, 0x15, 0x16, 0x16, 0x14, 0x15, 0x16, 0x14, 0x15, 0x13, 0x11, 0x12,
+ 0x11, 0x0f, 0x10, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x0d, 0x0f, 0x0f, 0x0e, 0x10, 0x12, 0x11, 0x12, 0x14, 0x13,
+ 0x13, 0x15, 0x14, 0x15, 0x17, 0x16, 0x16, 0x18, 0x18, 0x17, 0x18, 0x1a,
+ 0x17, 0x18, 0x18, 0x17, 0x19, 0x17, 0x17, 0x19, 0x17, 0x1a, 0x1c, 0x19,
+ 0x26, 0x28, 0x26, 0x2f, 0x30, 0x2e, 0x32, 0x32, 0x30, 0x34, 0x34, 0x34,
+ 0x37, 0x3c, 0x3b, 0x3f, 0x44, 0x44, 0x36, 0x3c, 0x3c, 0x35, 0x3b, 0x3b,
+ 0x32, 0x38, 0x38, 0x33, 0x39, 0x39, 0x34, 0x39, 0x3a, 0x35, 0x3b, 0x3a,
+ 0x34, 0x3b, 0x3f, 0x36, 0x3d, 0x42, 0x38, 0x3d, 0x41, 0x35, 0x3a, 0x3e,
+ 0x34, 0x38, 0x3c, 0x35, 0x38, 0x3d, 0x36, 0x39, 0x3e, 0x37, 0x3b, 0x3f,
+ 0x3a, 0x40, 0x43, 0x3b, 0x40, 0x44, 0x35, 0x3a, 0x40, 0x32, 0x37, 0x3d,
+ 0x32, 0x37, 0x3b, 0x33, 0x39, 0x39, 0x34, 0x3a, 0x38, 0x32, 0x39, 0x32,
+ 0x32, 0x38, 0x37, 0x35, 0x3b, 0x3c, 0x35, 0x3a, 0x3e, 0x34, 0x39, 0x3d,
+ 0x36, 0x3b, 0x40, 0x36, 0x3c, 0x40, 0x33, 0x3b, 0x3e, 0x34, 0x3c, 0x3f,
+ 0x30, 0x38, 0x3b, 0x2e, 0x34, 0x36, 0x33, 0x37, 0x38, 0x36, 0x3a, 0x3b,
+ 0x35, 0x39, 0x3d, 0x32, 0x3a, 0x3d, 0x2f, 0x3a, 0x3a, 0x2a, 0x35, 0x34,
+ 0x2a, 0x30, 0x31, 0x21, 0x26, 0x27, 0x21, 0x27, 0x27, 0x2e, 0x34, 0x35,
+ 0x3c, 0x41, 0x43, 0x3a, 0x3f, 0x43, 0x32, 0x37, 0x3d, 0x2d, 0x31, 0x39,
+ 0x2a, 0x31, 0x35, 0x2b, 0x30, 0x33, 0x2c, 0x30, 0x33, 0x2b, 0x30, 0x33,
+ 0x2e, 0x35, 0x38, 0x32, 0x3a, 0x3d, 0x31, 0x34, 0x39, 0x2b, 0x2c, 0x33,
+ 0x2c, 0x2c, 0x32, 0x34, 0x36, 0x3b, 0x3d, 0x3e, 0x46, 0x43, 0x46, 0x4e,
+ 0x44, 0x49, 0x51, 0x40, 0x47, 0x4e, 0x56, 0x5f, 0x65, 0x93, 0x9d, 0xa1,
+ 0xbf, 0xcb, 0xc7, 0xca, 0xd4, 0xcf, 0xca, 0xd5, 0xcd, 0xc9, 0xd2, 0xcb,
+ 0xc9, 0xcf, 0xcd, 0xc6, 0xcb, 0xcc, 0xc3, 0xc7, 0xc7, 0xc0, 0xc4, 0xc4,
+ 0xbf, 0xc0, 0xbe, 0xba, 0xbc, 0xb9, 0xb9, 0xbc, 0xb9, 0xb4, 0xba, 0xb6,
+ 0xaf, 0xb4, 0xb1, 0xab, 0xad, 0xaa, 0xa5, 0xa5, 0xa3, 0x9d, 0x9e, 0x99,
+ 0x92, 0x97, 0x91, 0x8e, 0x8e, 0x8a, 0x88, 0x85, 0x82, 0x7b, 0x74, 0x72,
+ 0x64, 0x5a, 0x59, 0x4c, 0x44, 0x42, 0x4b, 0x45, 0x45, 0x57, 0x53, 0x52,
+ 0x35, 0x43, 0x50, 0x47, 0x55, 0x62, 0x2f, 0x3d, 0x48, 0x17, 0x25, 0x2e,
+ 0x17, 0x25, 0x2e, 0x18, 0x27, 0x32, 0x13, 0x20, 0x30, 0x14, 0x1f, 0x31,
+ 0x14, 0x20, 0x2c, 0x14, 0x20, 0x2c, 0x15, 0x21, 0x2f, 0x13, 0x20, 0x31,
+ 0x14, 0x22, 0x31, 0x17, 0x23, 0x31, 0x16, 0x1d, 0x26, 0x1e, 0x21, 0x23,
+ 0x3b, 0x39, 0x32, 0x57, 0x54, 0x4e, 0x4f, 0x4c, 0x47, 0x37, 0x2f, 0x2d,
+ 0x30, 0x26, 0x24, 0x3b, 0x31, 0x2e, 0x40, 0x36, 0x2f, 0x42, 0x3a, 0x30,
+ 0x40, 0x3b, 0x36, 0x40, 0x37, 0x36, 0x41, 0x38, 0x3a, 0x2e, 0x29, 0x2d,
+ 0x38, 0x3a, 0x3e, 0x3b, 0x40, 0x43, 0x24, 0x27, 0x2a, 0x23, 0x25, 0x29,
+ 0x28, 0x2c, 0x2d, 0x26, 0x2a, 0x2d, 0x28, 0x2c, 0x2f, 0x2d, 0x2e, 0x33,
+ 0x30, 0x30, 0x38, 0x31, 0x33, 0x3c, 0x30, 0x33, 0x3c, 0x2f, 0x32, 0x3b,
+ 0x2d, 0x30, 0x37, 0x2a, 0x2d, 0x32, 0x19, 0x1a, 0x1e, 0x0a, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x13, 0x15, 0x17,
+ 0x27, 0x2c, 0x31, 0x29, 0x2e, 0x34, 0x27, 0x2c, 0x32, 0x28, 0x2d, 0x33,
+ 0x26, 0x2b, 0x31, 0x26, 0x2b, 0x31, 0x29, 0x2f, 0x34, 0x29, 0x2d, 0x33,
+ 0x2b, 0x2e, 0x35, 0x2f, 0x33, 0x3c, 0x2a, 0x2e, 0x37, 0x30, 0x35, 0x3b,
+ 0x2d, 0x31, 0x34, 0x15, 0x19, 0x1a, 0x14, 0x15, 0x17, 0x15, 0x15, 0x17,
+ 0x14, 0x15, 0x16, 0x13, 0x14, 0x16, 0x11, 0x12, 0x13, 0x12, 0x13, 0x15,
+ 0x16, 0x17, 0x18, 0x11, 0x12, 0x14, 0x0e, 0x0f, 0x11, 0x0f, 0x10, 0x12,
+ 0x11, 0x11, 0x13, 0x13, 0x13, 0x15, 0x13, 0x13, 0x15, 0x11, 0x11, 0x14,
+ 0x11, 0x12, 0x14, 0x12, 0x13, 0x15, 0x11, 0x12, 0x14, 0x10, 0x11, 0x13,
+ 0x10, 0x11, 0x11, 0x0e, 0x0e, 0x0e, 0x11, 0x12, 0x11, 0x11, 0x12, 0x14,
+ 0x14, 0x16, 0x15, 0x11, 0x13, 0x12, 0x0d, 0x0d, 0x0b, 0x32, 0x30, 0x2e,
+ 0x66, 0x63, 0x54, 0x4b, 0x48, 0x40, 0x28, 0x29, 0x28, 0x1d, 0x1e, 0x20,
+ 0x19, 0x19, 0x19, 0x12, 0x12, 0x10, 0x0c, 0x0e, 0x0f, 0x16, 0x19, 0x1d,
+ 0x22, 0x22, 0x22, 0x11, 0x11, 0x11, 0x07, 0x08, 0x08, 0x0f, 0x11, 0x10,
+ 0x22, 0x24, 0x23, 0x1f, 0x20, 0x20, 0x28, 0x29, 0x28, 0x1e, 0x1f, 0x1f,
+ 0x1c, 0x1d, 0x21, 0x19, 0x1b, 0x1f, 0x0d, 0x11, 0x14, 0x0a, 0x0e, 0x12,
+ 0x0c, 0x0f, 0x14, 0x0e, 0x11, 0x16, 0x0d, 0x10, 0x15, 0x1b, 0x1e, 0x23,
+ 0x36, 0x3a, 0x3e, 0x13, 0x15, 0x18, 0x11, 0x10, 0x12, 0x1a, 0x16, 0x18,
+ 0x18, 0x14, 0x14, 0x16, 0x12, 0x11, 0x1e, 0x1d, 0x1b, 0x1e, 0x1e, 0x1e,
+ 0x20, 0x1f, 0x1d, 0x1b, 0x1a, 0x18, 0x13, 0x12, 0x10, 0x12, 0x11, 0x0f,
+ 0x15, 0x14, 0x12, 0x12, 0x11, 0x0f, 0x15, 0x13, 0x14, 0x17, 0x15, 0x16,
+ 0x0f, 0x0f, 0x11, 0x10, 0x10, 0x12, 0x11, 0x0f, 0x12, 0x10, 0x0f, 0x0e,
+ 0x10, 0x10, 0x0d, 0x11, 0x12, 0x11, 0x2e, 0x2f, 0x33, 0x35, 0x35, 0x3d,
+ 0x2d, 0x32, 0x38, 0x36, 0x38, 0x3d, 0x23, 0x20, 0x26, 0x26, 0x20, 0x27,
+ 0x28, 0x20, 0x25, 0x27, 0x1e, 0x23, 0x23, 0x1d, 0x21, 0x34, 0x2e, 0x32,
+ 0x36, 0x31, 0x37, 0x28, 0x24, 0x2a, 0x24, 0x22, 0x28, 0x2a, 0x29, 0x2e,
+ 0x2b, 0x29, 0x2e, 0x25, 0x23, 0x26, 0x25, 0x21, 0x22, 0x27, 0x23, 0x24,
+ 0x2b, 0x27, 0x28, 0x2f, 0x2b, 0x2e, 0x2e, 0x2c, 0x2f, 0x2c, 0x2b, 0x2e,
+ 0x20, 0x1e, 0x23, 0x1c, 0x1b, 0x21, 0x25, 0x24, 0x2c, 0x27, 0x26, 0x2e,
+ 0x2e, 0x2d, 0x33, 0x45, 0x46, 0x4b, 0x46, 0x46, 0x4e, 0x43, 0x43, 0x4b,
+ 0x40, 0x40, 0x48, 0x3a, 0x3a, 0x42, 0x28, 0x28, 0x30, 0x2d, 0x2c, 0x34,
+ 0x30, 0x2f, 0x37, 0x2c, 0x2b, 0x31, 0x1b, 0x1b, 0x1f, 0x19, 0x18, 0x1d,
+ 0x1e, 0x1d, 0x22, 0x16, 0x15, 0x19, 0x0c, 0x0c, 0x0e, 0x09, 0x09, 0x07,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0c, 0x0d, 0x0c,
+ 0x17, 0x17, 0x17, 0x1f, 0x1d, 0x1e, 0x19, 0x16, 0x17, 0x1c, 0x18, 0x19,
+ 0x1e, 0x1b, 0x19, 0x2a, 0x26, 0x25, 0x23, 0x1f, 0x1e, 0x41, 0x3e, 0x3f,
+ 0x51, 0x4f, 0x52, 0x32, 0x31, 0x35, 0x31, 0x32, 0x37, 0x2f, 0x2f, 0x37,
+ 0x2d, 0x2c, 0x31, 0x27, 0x26, 0x2b, 0x25, 0x24, 0x29, 0x21, 0x20, 0x25,
+ 0x1c, 0x1a, 0x1f, 0x20, 0x1e, 0x21, 0x23, 0x22, 0x23, 0x24, 0x22, 0x23,
+ 0x23, 0x1e, 0x22, 0x1d, 0x1b, 0x1e, 0x1e, 0x1c, 0x1d, 0x1c, 0x1a, 0x1a,
+ 0x1c, 0x1b, 0x19, 0x19, 0x17, 0x17, 0x16, 0x14, 0x15, 0x16, 0x11, 0x16,
+ 0x17, 0x15, 0x16, 0x13, 0x11, 0x12, 0x13, 0x11, 0x12, 0x10, 0x0e, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0d, 0x0b, 0x0e, 0x0e, 0x0b, 0x11, 0x13, 0x12, 0x12, 0x14, 0x13,
+ 0x13, 0x15, 0x14, 0x14, 0x16, 0x15, 0x14, 0x15, 0x17, 0x18, 0x19, 0x1a,
+ 0x17, 0x18, 0x1a, 0x15, 0x17, 0x16, 0x19, 0x1b, 0x1a, 0x22, 0x25, 0x24,
+ 0x2d, 0x2f, 0x2e, 0x30, 0x32, 0x31, 0x33, 0x35, 0x34, 0x34, 0x34, 0x36,
+ 0x34, 0x36, 0x35, 0x38, 0x3a, 0x3b, 0x36, 0x3a, 0x3b, 0x32, 0x36, 0x37,
+ 0x2f, 0x33, 0x34, 0x32, 0x36, 0x37, 0x35, 0x39, 0x3a, 0x38, 0x3c, 0x3b,
+ 0x37, 0x3b, 0x3e, 0x39, 0x3e, 0x41, 0x38, 0x3c, 0x40, 0x36, 0x3a, 0x3d,
+ 0x38, 0x3b, 0x3e, 0x38, 0x3c, 0x3f, 0x35, 0x3a, 0x3d, 0x36, 0x3b, 0x3e,
+ 0x38, 0x3d, 0x41, 0x37, 0x3c, 0x40, 0x35, 0x3a, 0x3e, 0x33, 0x38, 0x3c,
+ 0x34, 0x39, 0x3c, 0x31, 0x37, 0x37, 0x32, 0x38, 0x37, 0x35, 0x3b, 0x39,
+ 0x34, 0x3a, 0x38, 0x34, 0x3a, 0x3a, 0x37, 0x3c, 0x3f, 0x33, 0x37, 0x3b,
+ 0x35, 0x39, 0x3d, 0x38, 0x3d, 0x41, 0x36, 0x3b, 0x3f, 0x31, 0x39, 0x3b,
+ 0x2f, 0x37, 0x3a, 0x30, 0x36, 0x36, 0x32, 0x37, 0x36, 0x35, 0x39, 0x38,
+ 0x33, 0x37, 0x3a, 0x32, 0x37, 0x3a, 0x2d, 0x36, 0x35, 0x26, 0x30, 0x2d,
+ 0x20, 0x26, 0x25, 0x1f, 0x25, 0x24, 0x22, 0x28, 0x28, 0x2a, 0x30, 0x30,
+ 0x3d, 0x42, 0x46, 0x3d, 0x42, 0x46, 0x37, 0x3c, 0x42, 0x34, 0x3a, 0x3f,
+ 0x2e, 0x35, 0x39, 0x28, 0x2d, 0x31, 0x2a, 0x2e, 0x32, 0x2d, 0x32, 0x36,
+ 0x32, 0x37, 0x3b, 0x31, 0x39, 0x3c, 0x28, 0x2b, 0x30, 0x29, 0x29, 0x2e,
+ 0x2b, 0x2e, 0x31, 0x2d, 0x30, 0x34, 0x2e, 0x33, 0x38, 0x34, 0x3b, 0x41,
+ 0x3c, 0x44, 0x4a, 0x40, 0x49, 0x50, 0x3e, 0x49, 0x4f, 0x4a, 0x55, 0x5b,
+ 0x7c, 0x83, 0x87, 0xa3, 0xab, 0xac, 0xb1, 0xb8, 0xb6, 0xb6, 0xbd, 0xbc,
+ 0xb8, 0xbd, 0xbf, 0xb6, 0xbb, 0xbe, 0xb6, 0xbb, 0xbd, 0xb6, 0xbc, 0xbc,
+ 0xb7, 0xb9, 0xb8, 0xb4, 0xb6, 0xb5, 0xaf, 0xb3, 0xb2, 0xa9, 0xad, 0xac,
+ 0xa6, 0xa8, 0xa7, 0x9e, 0x9e, 0x9e, 0x96, 0x95, 0x93, 0x8e, 0x8d, 0x8a,
+ 0x89, 0x86, 0x83, 0x80, 0x7a, 0x78, 0x6e, 0x64, 0x63, 0x58, 0x4e, 0x4e,
+ 0x44, 0x3b, 0x3c, 0x3b, 0x35, 0x37, 0x35, 0x33, 0x34, 0x3b, 0x3d, 0x3d,
+ 0x46, 0x52, 0x5e, 0x26, 0x32, 0x3e, 0x15, 0x21, 0x2f, 0x14, 0x22, 0x2f,
+ 0x16, 0x24, 0x31, 0x19, 0x27, 0x34, 0x16, 0x24, 0x2f, 0x14, 0x22, 0x2d,
+ 0x17, 0x23, 0x32, 0x15, 0x21, 0x2f, 0x17, 0x23, 0x31, 0x13, 0x22, 0x31,
+ 0x11, 0x24, 0x32, 0x11, 0x24, 0x33, 0x12, 0x22, 0x2f, 0x15, 0x21, 0x2a,
+ 0x1b, 0x24, 0x23, 0x14, 0x1f, 0x23, 0x13, 0x1c, 0x22, 0x1c, 0x1e, 0x22,
+ 0x3b, 0x30, 0x2f, 0x4c, 0x3c, 0x36, 0x4e, 0x44, 0x3d, 0x5b, 0x59, 0x52,
+ 0x53, 0x55, 0x52, 0x38, 0x34, 0x31, 0x41, 0x36, 0x35, 0x3f, 0x38, 0x3c,
+ 0x3b, 0x3e, 0x47, 0x5a, 0x63, 0x6e, 0x41, 0x48, 0x50, 0x27, 0x29, 0x2d,
+ 0x22, 0x25, 0x28, 0x26, 0x2a, 0x2d, 0x27, 0x2b, 0x2e, 0x2d, 0x30, 0x35,
+ 0x31, 0x34, 0x3b, 0x2b, 0x30, 0x36, 0x2d, 0x32, 0x39, 0x2b, 0x32, 0x3a,
+ 0x2c, 0x31, 0x3a, 0x2d, 0x32, 0x38, 0x1a, 0x1d, 0x22, 0x09, 0x0a, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x0f, 0x0f, 0x0f, 0x0f, 0x14, 0x14, 0x14,
+ 0x26, 0x2b, 0x30, 0x2a, 0x2f, 0x35, 0x27, 0x2c, 0x32, 0x28, 0x2d, 0x33,
+ 0x2b, 0x30, 0x36, 0x2c, 0x30, 0x37, 0x29, 0x2e, 0x34, 0x28, 0x2e, 0x34,
+ 0x28, 0x2b, 0x30, 0x2e, 0x31, 0x38, 0x2f, 0x32, 0x3b, 0x30, 0x33, 0x3a,
+ 0x2c, 0x30, 0x33, 0x1a, 0x1b, 0x1d, 0x16, 0x17, 0x17, 0x15, 0x16, 0x17,
+ 0x14, 0x15, 0x17, 0x13, 0x14, 0x16, 0x12, 0x13, 0x15, 0x13, 0x14, 0x16,
+ 0x16, 0x17, 0x19, 0x12, 0x13, 0x15, 0x0f, 0x10, 0x12, 0x0f, 0x10, 0x12,
+ 0x11, 0x11, 0x13, 0x11, 0x12, 0x14, 0x13, 0x14, 0x16, 0x12, 0x13, 0x15,
+ 0x11, 0x12, 0x14, 0x12, 0x13, 0x15, 0x11, 0x12, 0x14, 0x11, 0x12, 0x14,
+ 0x0f, 0x10, 0x10, 0x0f, 0x11, 0x11, 0x12, 0x14, 0x13, 0x11, 0x12, 0x14,
+ 0x12, 0x14, 0x13, 0x0e, 0x10, 0x0f, 0x0d, 0x0d, 0x0d, 0x2e, 0x2d, 0x2b,
+ 0x4f, 0x4d, 0x41, 0x31, 0x30, 0x2a, 0x22, 0x22, 0x23, 0x20, 0x21, 0x23,
+ 0x25, 0x25, 0x24, 0x20, 0x1f, 0x1d, 0x14, 0x13, 0x16, 0x0e, 0x0e, 0x13,
+ 0x14, 0x16, 0x15, 0x10, 0x13, 0x11, 0x08, 0x0a, 0x09, 0x0a, 0x0c, 0x0b,
+ 0x12, 0x12, 0x12, 0x2c, 0x2c, 0x2a, 0x3f, 0x3f, 0x3d, 0x39, 0x39, 0x38,
+ 0x35, 0x36, 0x3a, 0x2d, 0x2e, 0x32, 0x15, 0x19, 0x1c, 0x0a, 0x0e, 0x11,
+ 0x0d, 0x12, 0x15, 0x11, 0x16, 0x19, 0x0e, 0x13, 0x16, 0x0e, 0x13, 0x16,
+ 0x36, 0x39, 0x3d, 0x22, 0x23, 0x27, 0x0d, 0x0c, 0x11, 0x16, 0x14, 0x17,
+ 0x18, 0x16, 0x17, 0x16, 0x14, 0x14, 0x1a, 0x1a, 0x1a, 0x1d, 0x1d, 0x1e,
+ 0x1f, 0x1e, 0x1d, 0x23, 0x22, 0x20, 0x23, 0x22, 0x20, 0x1c, 0x1b, 0x19,
+ 0x19, 0x18, 0x16, 0x16, 0x14, 0x13, 0x16, 0x14, 0x15, 0x17, 0x15, 0x16,
+ 0x13, 0x11, 0x12, 0x13, 0x11, 0x12, 0x12, 0x10, 0x11, 0x11, 0x10, 0x0e,
+ 0x12, 0x11, 0x0f, 0x11, 0x11, 0x11, 0x36, 0x35, 0x3c, 0x39, 0x39, 0x43,
+ 0x32, 0x36, 0x3b, 0x3d, 0x3e, 0x43, 0x24, 0x21, 0x27, 0x30, 0x29, 0x2f,
+ 0x2e, 0x25, 0x2a, 0x2b, 0x22, 0x27, 0x28, 0x20, 0x25, 0x37, 0x31, 0x35,
+ 0x34, 0x2f, 0x33, 0x28, 0x23, 0x27, 0x27, 0x22, 0x26, 0x2b, 0x26, 0x2a,
+ 0x2c, 0x27, 0x2b, 0x29, 0x24, 0x28, 0x29, 0x25, 0x26, 0x2a, 0x27, 0x28,
+ 0x2c, 0x2a, 0x2f, 0x31, 0x2f, 0x34, 0x32, 0x30, 0x35, 0x27, 0x25, 0x2a,
+ 0x1d, 0x1a, 0x21, 0x21, 0x20, 0x26, 0x24, 0x23, 0x29, 0x23, 0x22, 0x28,
+ 0x2e, 0x2d, 0x33, 0x46, 0x46, 0x4c, 0x45, 0x45, 0x4d, 0x43, 0x43, 0x4d,
+ 0x3e, 0x3e, 0x48, 0x37, 0x37, 0x41, 0x27, 0x27, 0x31, 0x2c, 0x2b, 0x34,
+ 0x2e, 0x2c, 0x36, 0x2b, 0x2a, 0x30, 0x18, 0x17, 0x1c, 0x19, 0x18, 0x1d,
+ 0x1d, 0x1c, 0x21, 0x15, 0x14, 0x18, 0x0c, 0x0c, 0x0e, 0x08, 0x08, 0x08,
+ 0x0a, 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x12, 0x11, 0x12, 0x19, 0x18, 0x19, 0x19, 0x17, 0x18, 0x1e, 0x1a, 0x1b,
+ 0x21, 0x1f, 0x1c, 0x21, 0x1e, 0x1d, 0x2d, 0x29, 0x2a, 0x38, 0x33, 0x37,
+ 0x2d, 0x2b, 0x30, 0x2e, 0x2d, 0x32, 0x35, 0x34, 0x3a, 0x30, 0x30, 0x35,
+ 0x2b, 0x2a, 0x2f, 0x23, 0x21, 0x26, 0x22, 0x20, 0x25, 0x1f, 0x1d, 0x22,
+ 0x1e, 0x1d, 0x21, 0x22, 0x21, 0x23, 0x1f, 0x1e, 0x1f, 0x21, 0x21, 0x21,
+ 0x22, 0x20, 0x25, 0x1f, 0x1e, 0x23, 0x20, 0x20, 0x22, 0x20, 0x20, 0x22,
+ 0x21, 0x21, 0x23, 0x1b, 0x1a, 0x1d, 0x15, 0x13, 0x15, 0x14, 0x12, 0x15,
+ 0x18, 0x16, 0x17, 0x11, 0x0f, 0x10, 0x12, 0x0f, 0x11, 0x11, 0x0f, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x0e, 0x0e, 0x0c, 0x0e, 0x0e, 0x0c, 0x10, 0x12, 0x11, 0x12, 0x14, 0x13,
+ 0x12, 0x14, 0x13, 0x14, 0x16, 0x15, 0x14, 0x15, 0x17, 0x19, 0x1a, 0x1c,
+ 0x1b, 0x1c, 0x20, 0x17, 0x18, 0x1a, 0x1d, 0x1e, 0x20, 0x2a, 0x2e, 0x2f,
+ 0x30, 0x33, 0x34, 0x32, 0x34, 0x35, 0x36, 0x37, 0x39, 0x34, 0x35, 0x39,
+ 0x33, 0x33, 0x35, 0x34, 0x35, 0x37, 0x35, 0x36, 0x38, 0x36, 0x37, 0x3b,
+ 0x33, 0x34, 0x38, 0x37, 0x38, 0x3a, 0x3e, 0x3f, 0x41, 0x3c, 0x3d, 0x3f,
+ 0x38, 0x3c, 0x3f, 0x38, 0x3c, 0x3d, 0x38, 0x3c, 0x3d, 0x3c, 0x40, 0x41,
+ 0x39, 0x3e, 0x3f, 0x38, 0x3e, 0x3e, 0x34, 0x3a, 0x3a, 0x35, 0x3b, 0x3b,
+ 0x39, 0x3c, 0x42, 0x36, 0x3a, 0x3f, 0x35, 0x39, 0x3c, 0x34, 0x39, 0x3c,
+ 0x34, 0x3a, 0x3a, 0x34, 0x3a, 0x39, 0x34, 0x3a, 0x3b, 0x35, 0x3a, 0x3c,
+ 0x34, 0x3a, 0x3a, 0x34, 0x39, 0x39, 0x36, 0x3a, 0x3c, 0x33, 0x37, 0x3a,
+ 0x33, 0x38, 0x3b, 0x35, 0x3a, 0x3d, 0x33, 0x38, 0x3b, 0x31, 0x36, 0x39,
+ 0x2f, 0x37, 0x38, 0x2e, 0x34, 0x34, 0x33, 0x39, 0x37, 0x31, 0x35, 0x34,
+ 0x31, 0x35, 0x36, 0x31, 0x35, 0x38, 0x28, 0x2e, 0x2f, 0x1e, 0x25, 0x23,
+ 0x1d, 0x23, 0x21, 0x1f, 0x25, 0x23, 0x21, 0x27, 0x26, 0x22, 0x28, 0x28,
+ 0x2d, 0x33, 0x33, 0x30, 0x35, 0x38, 0x37, 0x3c, 0x40, 0x3c, 0x41, 0x45,
+ 0x3a, 0x41, 0x44, 0x32, 0x37, 0x3c, 0x2f, 0x32, 0x39, 0x32, 0x35, 0x3d,
+ 0x32, 0x37, 0x3e, 0x26, 0x2f, 0x32, 0x24, 0x2a, 0x2c, 0x28, 0x29, 0x2b,
+ 0x29, 0x2d, 0x2e, 0x2a, 0x30, 0x30, 0x28, 0x30, 0x32, 0x2d, 0x37, 0x39,
+ 0x31, 0x3c, 0x40, 0x39, 0x44, 0x48, 0x42, 0x4f, 0x55, 0x40, 0x4d, 0x53,
+ 0x49, 0x4c, 0x57, 0x62, 0x65, 0x6e, 0x79, 0x7c, 0x82, 0x87, 0x8a, 0x8f,
+ 0x8d, 0x8f, 0x96, 0x91, 0x94, 0x9b, 0x95, 0x98, 0x9d, 0x95, 0x98, 0x9b,
+ 0x95, 0x96, 0x98, 0x93, 0x94, 0x96, 0x8d, 0x8e, 0x90, 0x8b, 0x8b, 0x8d,
+ 0x89, 0x86, 0x89, 0x82, 0x7e, 0x7f, 0x7c, 0x77, 0x76, 0x73, 0x6b, 0x6a,
+ 0x6b, 0x5d, 0x5c, 0x5e, 0x50, 0x50, 0x4f, 0x41, 0x42, 0x44, 0x38, 0x3a,
+ 0x3c, 0x33, 0x36, 0x2e, 0x2c, 0x2f, 0x1d, 0x20, 0x23, 0x19, 0x21, 0x23,
+ 0x28, 0x34, 0x40, 0x16, 0x22, 0x2f, 0x17, 0x23, 0x33, 0x16, 0x22, 0x32,
+ 0x15, 0x22, 0x32, 0x15, 0x22, 0x30, 0x15, 0x24, 0x2f, 0x15, 0x25, 0x2e,
+ 0x17, 0x23, 0x33, 0x15, 0x21, 0x2f, 0x17, 0x25, 0x30, 0x15, 0x25, 0x30,
+ 0x12, 0x26, 0x33, 0x12, 0x26, 0x35, 0x13, 0x24, 0x34, 0x15, 0x22, 0x32,
+ 0x15, 0x20, 0x31, 0x11, 0x22, 0x34, 0x13, 0x25, 0x32, 0x23, 0x29, 0x29,
+ 0x46, 0x3c, 0x2f, 0x55, 0x42, 0x33, 0x64, 0x57, 0x4d, 0x68, 0x65, 0x61,
+ 0x6b, 0x6e, 0x65, 0x51, 0x4b, 0x41, 0x4a, 0x3d, 0x35, 0x47, 0x3e, 0x40,
+ 0x2a, 0x30, 0x3f, 0x3b, 0x49, 0x5a, 0x5e, 0x6a, 0x75, 0x4e, 0x53, 0x59,
+ 0x2e, 0x30, 0x35, 0x23, 0x26, 0x2b, 0x27, 0x2a, 0x2f, 0x2c, 0x2f, 0x35,
+ 0x2d, 0x31, 0x36, 0x28, 0x2d, 0x33, 0x29, 0x2e, 0x34, 0x2c, 0x32, 0x39,
+ 0x2d, 0x34, 0x3d, 0x2f, 0x36, 0x3e, 0x20, 0x25, 0x2b, 0x0c, 0x10, 0x13,
+ 0x13, 0x14, 0x16, 0x1e, 0x1e, 0x1e, 0x14, 0x13, 0x13, 0x19, 0x1a, 0x1a,
+ 0x2b, 0x2e, 0x35, 0x2e, 0x32, 0x39, 0x30, 0x34, 0x3a, 0x32, 0x35, 0x3c,
+ 0x2d, 0x31, 0x37, 0x2a, 0x2e, 0x34, 0x29, 0x2e, 0x34, 0x2a, 0x2f, 0x35,
+ 0x2c, 0x2f, 0x34, 0x31, 0x34, 0x3b, 0x2b, 0x2e, 0x37, 0x2e, 0x31, 0x38,
+ 0x2c, 0x2f, 0x33, 0x1d, 0x1e, 0x20, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16,
+ 0x15, 0x16, 0x18, 0x13, 0x14, 0x16, 0x13, 0x14, 0x16, 0x14, 0x15, 0x17,
+ 0x13, 0x14, 0x16, 0x13, 0x14, 0x16, 0x13, 0x14, 0x16, 0x12, 0x13, 0x15,
+ 0x12, 0x13, 0x15, 0x12, 0x13, 0x15, 0x13, 0x14, 0x16, 0x12, 0x13, 0x15,
+ 0x11, 0x12, 0x14, 0x11, 0x12, 0x14, 0x12, 0x13, 0x15, 0x0f, 0x11, 0x12,
+ 0x0f, 0x11, 0x10, 0x11, 0x12, 0x12, 0x12, 0x13, 0x14, 0x10, 0x11, 0x13,
+ 0x0f, 0x10, 0x12, 0x0f, 0x0f, 0x10, 0x10, 0x10, 0x0f, 0x16, 0x16, 0x14,
+ 0x1e, 0x1d, 0x18, 0x21, 0x22, 0x1f, 0x26, 0x27, 0x29, 0x25, 0x25, 0x25,
+ 0x24, 0x23, 0x1f, 0x2b, 0x28, 0x21, 0x30, 0x2d, 0x29, 0x27, 0x25, 0x24,
+ 0x15, 0x16, 0x18, 0x0c, 0x0d, 0x0f, 0x0e, 0x0f, 0x11, 0x0c, 0x0d, 0x0d,
+ 0x12, 0x12, 0x12, 0x40, 0x41, 0x3f, 0x60, 0x60, 0x5e, 0x53, 0x54, 0x50,
+ 0x39, 0x39, 0x3b, 0x1f, 0x20, 0x22, 0x1c, 0x20, 0x22, 0x35, 0x3a, 0x3b,
+ 0x1e, 0x24, 0x27, 0x10, 0x17, 0x1a, 0x0b, 0x13, 0x15, 0x09, 0x0e, 0x11,
+ 0x21, 0x25, 0x29, 0x39, 0x3b, 0x40, 0x13, 0x14, 0x19, 0x0d, 0x0d, 0x10,
+ 0x14, 0x13, 0x15, 0x15, 0x15, 0x17, 0x1a, 0x1a, 0x1c, 0x1b, 0x1b, 0x1d,
+ 0x18, 0x16, 0x17, 0x1e, 0x1d, 0x1b, 0x25, 0x24, 0x22, 0x23, 0x22, 0x20,
+ 0x21, 0x20, 0x1e, 0x1a, 0x19, 0x17, 0x15, 0x13, 0x14, 0x18, 0x16, 0x17,
+ 0x18, 0x16, 0x15, 0x18, 0x16, 0x15, 0x13, 0x11, 0x12, 0x13, 0x11, 0x12,
+ 0x12, 0x11, 0x0f, 0x16, 0x16, 0x16, 0x3d, 0x3c, 0x43, 0x3d, 0x3d, 0x46,
+ 0x37, 0x38, 0x3d, 0x2b, 0x2a, 0x30, 0x1d, 0x19, 0x1e, 0x30, 0x29, 0x2e,
+ 0x31, 0x28, 0x2d, 0x2a, 0x21, 0x26, 0x2c, 0x23, 0x28, 0x35, 0x2f, 0x33,
+ 0x31, 0x2c, 0x30, 0x2a, 0x24, 0x28, 0x29, 0x23, 0x27, 0x30, 0x29, 0x2f,
+ 0x2e, 0x28, 0x2f, 0x2e, 0x29, 0x2f, 0x2a, 0x25, 0x2b, 0x28, 0x25, 0x29,
+ 0x2b, 0x28, 0x2f, 0x35, 0x32, 0x39, 0x31, 0x2e, 0x35, 0x23, 0x20, 0x27,
+ 0x1d, 0x1c, 0x22, 0x20, 0x1f, 0x25, 0x20, 0x1f, 0x24, 0x24, 0x23, 0x28,
+ 0x2d, 0x2c, 0x32, 0x47, 0x46, 0x4e, 0x44, 0x44, 0x4c, 0x41, 0x41, 0x4b,
+ 0x3b, 0x3c, 0x45, 0x37, 0x37, 0x41, 0x25, 0x25, 0x2f, 0x2d, 0x2b, 0x35,
+ 0x2e, 0x2c, 0x37, 0x27, 0x26, 0x2e, 0x19, 0x18, 0x1d, 0x1a, 0x19, 0x1e,
+ 0x1a, 0x19, 0x1e, 0x14, 0x14, 0x19, 0x0c, 0x0c, 0x0e, 0x0a, 0x0a, 0x0a,
+ 0x0d, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f,
+ 0x10, 0x0f, 0x10, 0x15, 0x13, 0x14, 0x18, 0x15, 0x16, 0x1c, 0x19, 0x19,
+ 0x20, 0x1f, 0x1b, 0x1f, 0x1d, 0x1b, 0x59, 0x54, 0x58, 0x37, 0x32, 0x39,
+ 0x22, 0x1e, 0x25, 0x2c, 0x29, 0x30, 0x33, 0x32, 0x37, 0x30, 0x30, 0x32,
+ 0x2e, 0x29, 0x30, 0x24, 0x1f, 0x25, 0x1f, 0x1d, 0x22, 0x20, 0x1e, 0x23,
+ 0x1e, 0x1d, 0x21, 0x23, 0x23, 0x25, 0x1f, 0x20, 0x21, 0x25, 0x27, 0x27,
+ 0x32, 0x33, 0x3a, 0x2f, 0x30, 0x35, 0x30, 0x31, 0x35, 0x2d, 0x2e, 0x32,
+ 0x2c, 0x2c, 0x30, 0x28, 0x27, 0x2c, 0x1c, 0x1c, 0x1f, 0x14, 0x12, 0x15,
+ 0x13, 0x11, 0x12, 0x10, 0x0e, 0x0f, 0x13, 0x11, 0x12, 0x10, 0x10, 0x10,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0d, 0x0d, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x11, 0x13, 0x12, 0x14, 0x16, 0x15,
+ 0x12, 0x14, 0x13, 0x14, 0x15, 0x16, 0x15, 0x16, 0x19, 0x15, 0x15, 0x17,
+ 0x1a, 0x1a, 0x1c, 0x1d, 0x1e, 0x1f, 0x25, 0x27, 0x27, 0x2f, 0x33, 0x32,
+ 0x2f, 0x33, 0x32, 0x30, 0x32, 0x32, 0x33, 0x34, 0x36, 0x33, 0x34, 0x36,
+ 0x36, 0x37, 0x39, 0x36, 0x37, 0x39, 0x37, 0x39, 0x3b, 0x38, 0x3a, 0x3e,
+ 0x35, 0x36, 0x3a, 0x34, 0x38, 0x39, 0x38, 0x3c, 0x3d, 0x38, 0x3c, 0x3d,
+ 0x39, 0x3b, 0x3e, 0x39, 0x3a, 0x3e, 0x38, 0x3b, 0x3f, 0x39, 0x3d, 0x40,
+ 0x38, 0x3e, 0x3e, 0x36, 0x3c, 0x3c, 0x35, 0x3b, 0x3b, 0x35, 0x3b, 0x3b,
+ 0x35, 0x38, 0x41, 0x35, 0x38, 0x3f, 0x35, 0x39, 0x3c, 0x34, 0x39, 0x3a,
+ 0x35, 0x3b, 0x3b, 0x32, 0x38, 0x39, 0x33, 0x38, 0x3c, 0x32, 0x37, 0x3b,
+ 0x33, 0x39, 0x3a, 0x38, 0x3c, 0x3c, 0x36, 0x3a, 0x3b, 0x31, 0x35, 0x38,
+ 0x31, 0x35, 0x38, 0x33, 0x37, 0x3a, 0x31, 0x36, 0x39, 0x2f, 0x34, 0x37,
+ 0x2f, 0x36, 0x39, 0x32, 0x38, 0x38, 0x30, 0x36, 0x36, 0x32, 0x36, 0x37,
+ 0x32, 0x34, 0x38, 0x30, 0x33, 0x38, 0x27, 0x2b, 0x2e, 0x1e, 0x22, 0x23,
+ 0x20, 0x26, 0x26, 0x21, 0x27, 0x25, 0x23, 0x29, 0x27, 0x22, 0x28, 0x26,
+ 0x23, 0x29, 0x29, 0x26, 0x2b, 0x2c, 0x2b, 0x30, 0x33, 0x37, 0x3c, 0x40,
+ 0x41, 0x49, 0x4c, 0x3f, 0x44, 0x4a, 0x35, 0x38, 0x41, 0x34, 0x37, 0x41,
+ 0x2b, 0x2f, 0x38, 0x22, 0x2a, 0x2d, 0x27, 0x2d, 0x2d, 0x25, 0x2a, 0x29,
+ 0x26, 0x2c, 0x2a, 0x28, 0x2f, 0x2e, 0x2a, 0x33, 0x32, 0x2b, 0x33, 0x34,
+ 0x2b, 0x36, 0x38, 0x30, 0x3b, 0x3f, 0x3d, 0x48, 0x4f, 0x47, 0x54, 0x5b,
+ 0x42, 0x48, 0x53, 0x41, 0x45, 0x50, 0x4c, 0x50, 0x59, 0x55, 0x58, 0x60,
+ 0x5e, 0x5f, 0x67, 0x62, 0x62, 0x69, 0x6b, 0x69, 0x6e, 0x6a, 0x68, 0x6b,
+ 0x6a, 0x68, 0x6b, 0x6b, 0x69, 0x6c, 0x68, 0x65, 0x66, 0x68, 0x61, 0x63,
+ 0x66, 0x5b, 0x5d, 0x62, 0x56, 0x56, 0x5d, 0x4f, 0x4e, 0x53, 0x44, 0x43,
+ 0x4d, 0x3b, 0x39, 0x46, 0x37, 0x33, 0x43, 0x35, 0x35, 0x3d, 0x32, 0x34,
+ 0x34, 0x2d, 0x2f, 0x22, 0x22, 0x24, 0x15, 0x1a, 0x1d, 0x0f, 0x17, 0x19,
+ 0x1c, 0x28, 0x34, 0x1b, 0x27, 0x35, 0x13, 0x1f, 0x30, 0x15, 0x22, 0x33,
+ 0x18, 0x26, 0x36, 0x16, 0x23, 0x33, 0x11, 0x21, 0x2c, 0x13, 0x24, 0x2d,
+ 0x13, 0x23, 0x31, 0x11, 0x22, 0x2c, 0x15, 0x24, 0x2c, 0x13, 0x23, 0x2d,
+ 0x12, 0x24, 0x32, 0x13, 0x24, 0x35, 0x15, 0x23, 0x35, 0x18, 0x20, 0x33,
+ 0x14, 0x1e, 0x37, 0x12, 0x22, 0x3b, 0x11, 0x24, 0x37, 0x22, 0x2a, 0x2f,
+ 0x48, 0x3d, 0x32, 0x5f, 0x4c, 0x3b, 0x75, 0x66, 0x57, 0x74, 0x6d, 0x62,
+ 0x83, 0x80, 0x6f, 0x6d, 0x64, 0x53, 0x57, 0x4a, 0x3e, 0x3e, 0x39, 0x3b,
+ 0x40, 0x48, 0x58, 0x2f, 0x40, 0x57, 0x30, 0x42, 0x52, 0x5e, 0x6a, 0x74,
+ 0x5c, 0x60, 0x6c, 0x35, 0x39, 0x44, 0x25, 0x29, 0x32, 0x26, 0x29, 0x30,
+ 0x25, 0x28, 0x2f, 0x28, 0x2c, 0x31, 0x2c, 0x2f, 0x36, 0x2e, 0x32, 0x39,
+ 0x31, 0x37, 0x41, 0x36, 0x3d, 0x45, 0x34, 0x39, 0x3f, 0x25, 0x28, 0x2d,
+ 0x1e, 0x20, 0x24, 0x19, 0x19, 0x1b, 0x16, 0x16, 0x16, 0x23, 0x23, 0x24,
+ 0x39, 0x3b, 0x42, 0x34, 0x37, 0x3e, 0x38, 0x3b, 0x42, 0x3a, 0x3d, 0x44,
+ 0x2e, 0x31, 0x38, 0x2c, 0x2f, 0x36, 0x2c, 0x31, 0x37, 0x2b, 0x30, 0x36,
+ 0x2e, 0x31, 0x36, 0x2d, 0x30, 0x37, 0x2e, 0x31, 0x3a, 0x31, 0x34, 0x3c,
+ 0x32, 0x35, 0x3a, 0x1d, 0x1e, 0x20, 0x12, 0x13, 0x12, 0x16, 0x16, 0x16,
+ 0x13, 0x14, 0x16, 0x14, 0x15, 0x17, 0x15, 0x16, 0x18, 0x13, 0x14, 0x16,
+ 0x12, 0x13, 0x15, 0x14, 0x15, 0x17, 0x16, 0x17, 0x19, 0x12, 0x13, 0x15,
+ 0x13, 0x14, 0x16, 0x11, 0x12, 0x14, 0x11, 0x12, 0x14, 0x11, 0x12, 0x14,
+ 0x11, 0x12, 0x14, 0x12, 0x13, 0x15, 0x14, 0x15, 0x17, 0x12, 0x13, 0x15,
+ 0x11, 0x13, 0x12, 0x11, 0x13, 0x13, 0x0f, 0x10, 0x11, 0x10, 0x10, 0x12,
+ 0x10, 0x10, 0x12, 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0b,
+ 0x0d, 0x0d, 0x0d, 0x19, 0x1a, 0x1c, 0x24, 0x25, 0x27, 0x26, 0x27, 0x25,
+ 0x2e, 0x2c, 0x22, 0x48, 0x44, 0x38, 0x4b, 0x49, 0x3c, 0x48, 0x48, 0x3e,
+ 0x25, 0x26, 0x28, 0x0f, 0x10, 0x12, 0x10, 0x11, 0x13, 0x0f, 0x10, 0x12,
+ 0x0e, 0x0f, 0x11, 0x33, 0x35, 0x34, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x60,
+ 0x23, 0x24, 0x25, 0x0d, 0x11, 0x12, 0x2a, 0x2f, 0x30, 0x5b, 0x62, 0x62,
+ 0x45, 0x4d, 0x4f, 0x27, 0x2f, 0x31, 0x0e, 0x16, 0x18, 0x0c, 0x14, 0x16,
+ 0x0f, 0x14, 0x1a, 0x3f, 0x42, 0x47, 0x2e, 0x31, 0x34, 0x0d, 0x0e, 0x12,
+ 0x0b, 0x0c, 0x0e, 0x11, 0x12, 0x14, 0x17, 0x18, 0x1a, 0x17, 0x17, 0x19,
+ 0x15, 0x13, 0x14, 0x15, 0x14, 0x12, 0x17, 0x16, 0x15, 0x20, 0x1f, 0x1d,
+ 0x1f, 0x1e, 0x1c, 0x1b, 0x19, 0x1a, 0x18, 0x16, 0x18, 0x18, 0x16, 0x17,
+ 0x16, 0x15, 0x12, 0x19, 0x18, 0x16, 0x19, 0x17, 0x18, 0x16, 0x14, 0x15,
+ 0x15, 0x15, 0x13, 0x16, 0x16, 0x16, 0x3b, 0x3b, 0x40, 0x3c, 0x3c, 0x44,
+ 0x32, 0x33, 0x37, 0x22, 0x22, 0x26, 0x1c, 0x17, 0x1b, 0x29, 0x21, 0x26,
+ 0x31, 0x27, 0x2c, 0x27, 0x1e, 0x23, 0x37, 0x2e, 0x33, 0x3b, 0x35, 0x39,
+ 0x2e, 0x29, 0x2e, 0x2b, 0x25, 0x2c, 0x2c, 0x25, 0x2d, 0x34, 0x2d, 0x35,
+ 0x34, 0x2c, 0x37, 0x35, 0x2f, 0x39, 0x2f, 0x2b, 0x33, 0x32, 0x2f, 0x36,
+ 0x34, 0x31, 0x38, 0x35, 0x32, 0x39, 0x32, 0x2f, 0x36, 0x21, 0x1f, 0x27,
+ 0x1c, 0x1b, 0x21, 0x1f, 0x1e, 0x24, 0x22, 0x21, 0x26, 0x25, 0x25, 0x27,
+ 0x2d, 0x2d, 0x32, 0x42, 0x42, 0x48, 0x43, 0x43, 0x4b, 0x3e, 0x41, 0x4a,
+ 0x3a, 0x3d, 0x46, 0x36, 0x36, 0x40, 0x25, 0x25, 0x2f, 0x2a, 0x2a, 0x34,
+ 0x2f, 0x2f, 0x39, 0x24, 0x24, 0x2c, 0x18, 0x19, 0x1d, 0x1d, 0x1d, 0x22,
+ 0x1b, 0x1a, 0x20, 0x15, 0x14, 0x1a, 0x0b, 0x0b, 0x0d, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11,
+ 0x10, 0x10, 0x10, 0x18, 0x17, 0x17, 0x1a, 0x18, 0x19, 0x1d, 0x1a, 0x1a,
+ 0x1a, 0x19, 0x15, 0x28, 0x26, 0x24, 0x7a, 0x75, 0x79, 0x33, 0x2e, 0x35,
+ 0x22, 0x1f, 0x26, 0x29, 0x27, 0x2d, 0x34, 0x33, 0x38, 0x34, 0x34, 0x36,
+ 0x29, 0x24, 0x2b, 0x22, 0x1d, 0x24, 0x20, 0x1e, 0x23, 0x1e, 0x1c, 0x21,
+ 0x1c, 0x1c, 0x1e, 0x23, 0x23, 0x25, 0x1b, 0x1c, 0x1e, 0x2f, 0x30, 0x32,
+ 0x3c, 0x3d, 0x46, 0x36, 0x39, 0x40, 0x35, 0x39, 0x3f, 0x31, 0x34, 0x3b,
+ 0x32, 0x33, 0x38, 0x2f, 0x30, 0x35, 0x1e, 0x1d, 0x22, 0x13, 0x12, 0x14,
+ 0x11, 0x0f, 0x10, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x10,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0c, 0x0d, 0x0d, 0x0d,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x11, 0x12, 0x11, 0x11, 0x14, 0x12,
+ 0x13, 0x15, 0x15, 0x13, 0x14, 0x16, 0x12, 0x13, 0x16, 0x16, 0x17, 0x19,
+ 0x1c, 0x1c, 0x1b, 0x24, 0x26, 0x24, 0x31, 0x33, 0x30, 0x2e, 0x33, 0x2f,
+ 0x2d, 0x32, 0x2e, 0x2c, 0x31, 0x2d, 0x33, 0x37, 0x35, 0x35, 0x37, 0x36,
+ 0x36, 0x3a, 0x3b, 0x34, 0x38, 0x39, 0x32, 0x36, 0x39, 0x33, 0x38, 0x3b,
+ 0x35, 0x3a, 0x3d, 0x34, 0x39, 0x3c, 0x33, 0x39, 0x39, 0x36, 0x3c, 0x3c,
+ 0x38, 0x39, 0x3e, 0x37, 0x38, 0x3d, 0x38, 0x3b, 0x40, 0x38, 0x3d, 0x41,
+ 0x3a, 0x3f, 0x42, 0x35, 0x3a, 0x3d, 0x35, 0x3a, 0x3c, 0x34, 0x38, 0x3b,
+ 0x36, 0x39, 0x40, 0x35, 0x38, 0x3e, 0x35, 0x39, 0x3c, 0x35, 0x3b, 0x3b,
+ 0x34, 0x3a, 0x3a, 0x30, 0x35, 0x38, 0x31, 0x36, 0x3a, 0x33, 0x39, 0x3e,
+ 0x31, 0x37, 0x37, 0x36, 0x3a, 0x3b, 0x36, 0x3a, 0x3b, 0x33, 0x37, 0x37,
+ 0x33, 0x37, 0x39, 0x30, 0x35, 0x38, 0x31, 0x36, 0x39, 0x32, 0x37, 0x3a,
+ 0x32, 0x37, 0x3c, 0x31, 0x36, 0x3a, 0x31, 0x36, 0x39, 0x33, 0x37, 0x3b,
+ 0x31, 0x34, 0x39, 0x2d, 0x30, 0x37, 0x24, 0x27, 0x2c, 0x26, 0x29, 0x2c,
+ 0x24, 0x29, 0x2a, 0x22, 0x27, 0x27, 0x24, 0x28, 0x28, 0x23, 0x27, 0x26,
+ 0x25, 0x29, 0x29, 0x24, 0x28, 0x29, 0x23, 0x27, 0x28, 0x2a, 0x2e, 0x31,
+ 0x3b, 0x43, 0x46, 0x41, 0x46, 0x4c, 0x38, 0x38, 0x42, 0x35, 0x35, 0x3f,
+ 0x2d, 0x32, 0x38, 0x27, 0x2f, 0x32, 0x27, 0x2d, 0x2d, 0x27, 0x2d, 0x2b,
+ 0x27, 0x2b, 0x2a, 0x28, 0x2c, 0x2c, 0x29, 0x2e, 0x2f, 0x2a, 0x30, 0x30,
+ 0x2a, 0x33, 0x33, 0x2d, 0x34, 0x3a, 0x32, 0x3b, 0x43, 0x3d, 0x46, 0x4f,
+ 0x3d, 0x47, 0x50, 0x37, 0x42, 0x48, 0x3b, 0x42, 0x48, 0x3c, 0x41, 0x47,
+ 0x3d, 0x3e, 0x45, 0x43, 0x3f, 0x46, 0x4a, 0x41, 0x46, 0x4c, 0x42, 0x43,
+ 0x49, 0x41, 0x3f, 0x4b, 0x41, 0x41, 0x4c, 0x40, 0x40, 0x4a, 0x3c, 0x3c,
+ 0x4a, 0x3a, 0x3a, 0x4b, 0x39, 0x37, 0x4b, 0x37, 0x34, 0x49, 0x36, 0x30,
+ 0x43, 0x35, 0x2d, 0x3f, 0x32, 0x2c, 0x3e, 0x34, 0x31, 0x3a, 0x32, 0x32,
+ 0x2d, 0x28, 0x2a, 0x1d, 0x1d, 0x1f, 0x14, 0x16, 0x19, 0x10, 0x14, 0x17,
+ 0x1a, 0x28, 0x35, 0x1b, 0x28, 0x37, 0x13, 0x20, 0x31, 0x15, 0x23, 0x34,
+ 0x16, 0x25, 0x35, 0x17, 0x27, 0x37, 0x11, 0x21, 0x30, 0x15, 0x26, 0x33,
+ 0x13, 0x26, 0x31, 0x12, 0x24, 0x30, 0x13, 0x24, 0x2e, 0x15, 0x25, 0x31,
+ 0x15, 0x25, 0x36, 0x13, 0x23, 0x36, 0x1b, 0x25, 0x39, 0x1a, 0x22, 0x37,
+ 0x16, 0x21, 0x34, 0x18, 0x26, 0x3e, 0x15, 0x25, 0x3e, 0x1c, 0x23, 0x37,
+ 0x35, 0x2f, 0x39, 0x52, 0x44, 0x40, 0x6a, 0x5e, 0x50, 0x7c, 0x74, 0x62,
+ 0x7e, 0x74, 0x65, 0x61, 0x57, 0x4b, 0x48, 0x43, 0x3f, 0x33, 0x35, 0x3d,
+ 0x38, 0x43, 0x57, 0x52, 0x62, 0x7c, 0x37, 0x49, 0x5f, 0x2d, 0x3f, 0x4f,
+ 0x5a, 0x66, 0x76, 0x69, 0x72, 0x81, 0x41, 0x49, 0x56, 0x24, 0x2b, 0x35,
+ 0x20, 0x25, 0x2b, 0x28, 0x2b, 0x32, 0x2f, 0x32, 0x37, 0x36, 0x38, 0x3f,
+ 0x38, 0x3e, 0x48, 0x3b, 0x3f, 0x48, 0x3f, 0x43, 0x4b, 0x40, 0x40, 0x48,
+ 0x30, 0x31, 0x36, 0x1d, 0x1e, 0x22, 0x19, 0x1a, 0x1c, 0x1e, 0x1f, 0x21,
+ 0x30, 0x31, 0x38, 0x39, 0x39, 0x42, 0x38, 0x38, 0x40, 0x35, 0x38, 0x3f,
+ 0x31, 0x34, 0x3a, 0x2f, 0x32, 0x38, 0x2e, 0x31, 0x38, 0x2d, 0x32, 0x38,
+ 0x29, 0x2f, 0x32, 0x29, 0x2e, 0x34, 0x2d, 0x31, 0x3d, 0x2e, 0x32, 0x3b,
+ 0x2d, 0x30, 0x35, 0x1e, 0x22, 0x23, 0x13, 0x15, 0x14, 0x13, 0x13, 0x13,
+ 0x13, 0x14, 0x16, 0x15, 0x16, 0x18, 0x14, 0x15, 0x17, 0x15, 0x16, 0x18,
+ 0x12, 0x13, 0x15, 0x13, 0x14, 0x16, 0x16, 0x17, 0x19, 0x11, 0x12, 0x14,
+ 0x10, 0x11, 0x13, 0x14, 0x15, 0x17, 0x12, 0x13, 0x15, 0x13, 0x14, 0x16,
+ 0x12, 0x13, 0x15, 0x12, 0x13, 0x15, 0x12, 0x12, 0x14, 0x12, 0x13, 0x15,
+ 0x11, 0x13, 0x12, 0x10, 0x11, 0x12, 0x12, 0x12, 0x14, 0x11, 0x11, 0x13,
+ 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x0e, 0x0d, 0x0f, 0x0e,
+ 0x0a, 0x0a, 0x0c, 0x0b, 0x0b, 0x0f, 0x17, 0x18, 0x1a, 0x1a, 0x1a, 0x17,
+ 0x5b, 0x58, 0x4d, 0x7a, 0x78, 0x69, 0x5d, 0x5e, 0x4f, 0x4c, 0x4d, 0x44,
+ 0x24, 0x25, 0x27, 0x10, 0x11, 0x13, 0x0f, 0x11, 0x14, 0x0f, 0x12, 0x16,
+ 0x0f, 0x13, 0x16, 0x17, 0x1b, 0x1c, 0x47, 0x4b, 0x4a, 0x42, 0x47, 0x43,
+ 0x14, 0x1a, 0x18, 0x0f, 0x15, 0x15, 0x15, 0x1b, 0x1b, 0x3e, 0x47, 0x46,
+ 0x54, 0x5c, 0x5e, 0x55, 0x5d, 0x5f, 0x33, 0x38, 0x3c, 0x11, 0x16, 0x1a,
+ 0x08, 0x0d, 0x13, 0x23, 0x28, 0x2c, 0x40, 0x45, 0x48, 0x1e, 0x22, 0x25,
+ 0x08, 0x0c, 0x0d, 0x0a, 0x0c, 0x0e, 0x1c, 0x1d, 0x1f, 0x28, 0x29, 0x2b,
+ 0x20, 0x20, 0x20, 0x18, 0x18, 0x18, 0x14, 0x14, 0x12, 0x14, 0x14, 0x12,
+ 0x15, 0x15, 0x13, 0x12, 0x12, 0x12, 0x16, 0x15, 0x15, 0x16, 0x16, 0x17,
+ 0x13, 0x14, 0x0f, 0x16, 0x16, 0x13, 0x16, 0x15, 0x15, 0x16, 0x14, 0x15,
+ 0x11, 0x11, 0x11, 0x10, 0x10, 0x10, 0x31, 0x32, 0x36, 0x34, 0x35, 0x3a,
+ 0x29, 0x2a, 0x2e, 0x23, 0x23, 0x27, 0x20, 0x1c, 0x20, 0x28, 0x1f, 0x24,
+ 0x2d, 0x24, 0x29, 0x31, 0x28, 0x2d, 0x42, 0x3b, 0x40, 0x45, 0x40, 0x44,
+ 0x2e, 0x29, 0x2f, 0x2b, 0x26, 0x2d, 0x2e, 0x26, 0x31, 0x35, 0x2d, 0x38,
+ 0x32, 0x2a, 0x35, 0x3e, 0x38, 0x42, 0x39, 0x36, 0x3f, 0x35, 0x33, 0x3b,
+ 0x37, 0x36, 0x3b, 0x36, 0x35, 0x3b, 0x2a, 0x29, 0x30, 0x20, 0x1f, 0x26,
+ 0x1d, 0x1c, 0x22, 0x1d, 0x1c, 0x21, 0x1f, 0x1f, 0x21, 0x24, 0x24, 0x25,
+ 0x2c, 0x2d, 0x31, 0x43, 0x44, 0x49, 0x43, 0x43, 0x4a, 0x3c, 0x3f, 0x46,
+ 0x3a, 0x3d, 0x46, 0x37, 0x36, 0x40, 0x25, 0x25, 0x2f, 0x2a, 0x2a, 0x34,
+ 0x29, 0x2a, 0x33, 0x1d, 0x1e, 0x23, 0x1c, 0x1d, 0x21, 0x1d, 0x1e, 0x22,
+ 0x1c, 0x1b, 0x20, 0x15, 0x14, 0x18, 0x0a, 0x0a, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x0f, 0x0f, 0x0f,
+ 0x10, 0x11, 0x11, 0x18, 0x18, 0x18, 0x1b, 0x19, 0x1a, 0x1c, 0x1a, 0x1b,
+ 0x1a, 0x19, 0x17, 0x31, 0x30, 0x2e, 0x75, 0x71, 0x72, 0x2a, 0x25, 0x29,
+ 0x28, 0x23, 0x29, 0x29, 0x28, 0x2c, 0x2f, 0x2d, 0x32, 0x2e, 0x2e, 0x30,
+ 0x24, 0x22, 0x28, 0x20, 0x1d, 0x24, 0x1e, 0x1c, 0x21, 0x1c, 0x1a, 0x1e,
+ 0x1c, 0x1c, 0x1e, 0x1d, 0x1e, 0x1f, 0x1b, 0x1b, 0x1d, 0x31, 0x30, 0x34,
+ 0x3d, 0x40, 0x49, 0x41, 0x44, 0x4d, 0x43, 0x46, 0x4f, 0x39, 0x3c, 0x45,
+ 0x36, 0x38, 0x3f, 0x2a, 0x2b, 0x30, 0x18, 0x17, 0x1c, 0x11, 0x11, 0x13,
+ 0x0f, 0x0f, 0x0f, 0x10, 0x10, 0x0f, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x14, 0x16, 0x15, 0x13, 0x15, 0x14,
+ 0x11, 0x13, 0x14, 0x14, 0x15, 0x17, 0x15, 0x16, 0x18, 0x19, 0x1a, 0x1c,
+ 0x22, 0x22, 0x20, 0x2e, 0x30, 0x2d, 0x36, 0x38, 0x35, 0x30, 0x34, 0x2f,
+ 0x30, 0x35, 0x2f, 0x2f, 0x34, 0x30, 0x2f, 0x34, 0x30, 0x30, 0x34, 0x31,
+ 0x30, 0x36, 0x36, 0x31, 0x37, 0x37, 0x30, 0x35, 0x38, 0x34, 0x39, 0x3c,
+ 0x37, 0x3c, 0x3f, 0x35, 0x3a, 0x3d, 0x34, 0x3a, 0x3a, 0x37, 0x3c, 0x3d,
+ 0x38, 0x39, 0x3e, 0x36, 0x39, 0x3e, 0x39, 0x3e, 0x42, 0x39, 0x41, 0x44,
+ 0x33, 0x3b, 0x3e, 0x33, 0x38, 0x3c, 0x34, 0x39, 0x3d, 0x37, 0x3b, 0x3e,
+ 0x39, 0x3e, 0x42, 0x37, 0x3c, 0x40, 0x34, 0x39, 0x3c, 0x32, 0x37, 0x3a,
+ 0x32, 0x38, 0x3b, 0x33, 0x38, 0x3c, 0x32, 0x37, 0x3d, 0x33, 0x38, 0x3e,
+ 0x31, 0x36, 0x39, 0x35, 0x39, 0x3c, 0x33, 0x37, 0x3a, 0x32, 0x36, 0x37,
+ 0x31, 0x37, 0x37, 0x30, 0x35, 0x38, 0x30, 0x35, 0x38, 0x30, 0x38, 0x3a,
+ 0x30, 0x36, 0x3b, 0x30, 0x35, 0x3a, 0x33, 0x38, 0x3b, 0x34, 0x37, 0x3c,
+ 0x32, 0x35, 0x3c, 0x2e, 0x31, 0x38, 0x28, 0x2b, 0x30, 0x27, 0x2b, 0x2e,
+ 0x28, 0x2c, 0x2f, 0x23, 0x27, 0x28, 0x20, 0x24, 0x25, 0x21, 0x25, 0x26,
+ 0x24, 0x28, 0x29, 0x24, 0x28, 0x29, 0x23, 0x27, 0x28, 0x2a, 0x2e, 0x30,
+ 0x34, 0x3c, 0x3f, 0x37, 0x3c, 0x40, 0x30, 0x31, 0x37, 0x33, 0x34, 0x39,
+ 0x39, 0x3c, 0x41, 0x30, 0x38, 0x3a, 0x29, 0x31, 0x33, 0x26, 0x2c, 0x2f,
+ 0x2b, 0x2c, 0x2e, 0x2a, 0x2b, 0x2d, 0x28, 0x2c, 0x2d, 0x2c, 0x30, 0x31,
+ 0x2b, 0x30, 0x33, 0x2f, 0x34, 0x38, 0x33, 0x38, 0x41, 0x38, 0x3f, 0x49,
+ 0x36, 0x42, 0x48, 0x32, 0x3e, 0x42, 0x33, 0x3d, 0x40, 0x38, 0x3e, 0x42,
+ 0x3b, 0x3a, 0x40, 0x39, 0x32, 0x39, 0x3c, 0x31, 0x33, 0x3d, 0x2f, 0x2e,
+ 0x3f, 0x31, 0x2e, 0x41, 0x31, 0x2f, 0x44, 0x32, 0x30, 0x45, 0x32, 0x30,
+ 0x46, 0x33, 0x2f, 0x46, 0x31, 0x2d, 0x48, 0x32, 0x2d, 0x48, 0x35, 0x2e,
+ 0x3e, 0x33, 0x2a, 0x3b, 0x33, 0x2b, 0x39, 0x34, 0x2f, 0x36, 0x32, 0x31,
+ 0x23, 0x23, 0x25, 0x16, 0x17, 0x1b, 0x15, 0x16, 0x1a, 0x12, 0x13, 0x17,
+ 0x14, 0x24, 0x33, 0x16, 0x26, 0x35, 0x15, 0x25, 0x34, 0x15, 0x25, 0x35,
+ 0x15, 0x25, 0x35, 0x19, 0x29, 0x3a, 0x16, 0x26, 0x37, 0x18, 0x27, 0x39,
+ 0x17, 0x2a, 0x38, 0x16, 0x27, 0x35, 0x17, 0x27, 0x36, 0x15, 0x25, 0x37,
+ 0x16, 0x26, 0x3c, 0x14, 0x26, 0x3c, 0x1e, 0x2c, 0x41, 0x1b, 0x28, 0x3b,
+ 0x16, 0x23, 0x35, 0x18, 0x27, 0x3c, 0x15, 0x26, 0x3e, 0x17, 0x23, 0x3f,
+ 0x21, 0x27, 0x3f, 0x32, 0x32, 0x41, 0x41, 0x3b, 0x3c, 0x4a, 0x43, 0x3b,
+ 0x4b, 0x3d, 0x39, 0x3a, 0x35, 0x37, 0x24, 0x2e, 0x39, 0x22, 0x32, 0x46,
+ 0x1e, 0x2e, 0x48, 0x2d, 0x3d, 0x57, 0x50, 0x61, 0x7a, 0x3e, 0x51, 0x69,
+ 0x2a, 0x3c, 0x52, 0x52, 0x64, 0x78, 0x6a, 0x7a, 0x89, 0x4c, 0x58, 0x62,
+ 0x2c, 0x35, 0x3c, 0x28, 0x2d, 0x33, 0x30, 0x32, 0x37, 0x35, 0x38, 0x3d,
+ 0x3d, 0x40, 0x49, 0x3d, 0x3f, 0x48, 0x40, 0x42, 0x4b, 0x41, 0x41, 0x49,
+ 0x36, 0x36, 0x3e, 0x32, 0x33, 0x38, 0x26, 0x27, 0x2b, 0x18, 0x19, 0x1d,
+ 0x2e, 0x2f, 0x34, 0x48, 0x49, 0x4e, 0x3e, 0x3f, 0x44, 0x32, 0x33, 0x39,
+ 0x2c, 0x2f, 0x34, 0x28, 0x2b, 0x30, 0x2b, 0x2e, 0x34, 0x2b, 0x30, 0x34,
+ 0x26, 0x2b, 0x2f, 0x2a, 0x2e, 0x37, 0x2c, 0x30, 0x3b, 0x2c, 0x30, 0x3b,
+ 0x2b, 0x30, 0x35, 0x1e, 0x22, 0x25, 0x13, 0x14, 0x16, 0x11, 0x12, 0x14,
+ 0x13, 0x14, 0x16, 0x13, 0x14, 0x16, 0x11, 0x12, 0x14, 0x15, 0x16, 0x18,
+ 0x13, 0x14, 0x15, 0x13, 0x14, 0x16, 0x12, 0x14, 0x15, 0x13, 0x14, 0x16,
+ 0x11, 0x12, 0x14, 0x12, 0x12, 0x14, 0x13, 0x14, 0x16, 0x13, 0x14, 0x16,
+ 0x13, 0x14, 0x16, 0x11, 0x11, 0x13, 0x12, 0x12, 0x14, 0x11, 0x12, 0x14,
+ 0x0f, 0x12, 0x12, 0x11, 0x12, 0x14, 0x12, 0x12, 0x14, 0x0f, 0x0f, 0x11,
+ 0x0f, 0x0f, 0x11, 0x0e, 0x0e, 0x10, 0x0c, 0x0e, 0x0c, 0x0c, 0x0e, 0x0d,
+ 0x0f, 0x11, 0x10, 0x12, 0x13, 0x15, 0x0e, 0x10, 0x11, 0x12, 0x12, 0x0e,
+ 0x5c, 0x59, 0x50, 0x7e, 0x7c, 0x70, 0x57, 0x57, 0x4f, 0x38, 0x3a, 0x37,
+ 0x27, 0x29, 0x28, 0x12, 0x13, 0x15, 0x0c, 0x0f, 0x12, 0x10, 0x13, 0x18,
+ 0x13, 0x17, 0x1b, 0x0f, 0x14, 0x17, 0x1f, 0x25, 0x25, 0x40, 0x48, 0x46,
+ 0x3f, 0x48, 0x47, 0x1e, 0x27, 0x26, 0x15, 0x1e, 0x1d, 0x50, 0x59, 0x59,
+ 0x4c, 0x54, 0x55, 0x33, 0x38, 0x3c, 0x34, 0x39, 0x3d, 0x23, 0x28, 0x2d,
+ 0x22, 0x27, 0x2d, 0x0d, 0x12, 0x16, 0x2c, 0x31, 0x34, 0x46, 0x4c, 0x4d,
+ 0x20, 0x25, 0x25, 0x1d, 0x20, 0x21, 0x34, 0x35, 0x37, 0x3e, 0x3f, 0x41,
+ 0x37, 0x37, 0x37, 0x2d, 0x2d, 0x2d, 0x23, 0x23, 0x21, 0x19, 0x19, 0x17,
+ 0x16, 0x16, 0x14, 0x14, 0x14, 0x14, 0x10, 0x10, 0x10, 0x12, 0x12, 0x14,
+ 0x0f, 0x10, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x0e, 0x10, 0x0f, 0x0f, 0x10,
+ 0x0f, 0x0f, 0x0f, 0x14, 0x16, 0x15, 0x2a, 0x2c, 0x2d, 0x27, 0x2b, 0x2e,
+ 0x28, 0x2a, 0x2c, 0x27, 0x27, 0x29, 0x29, 0x25, 0x29, 0x28, 0x21, 0x24,
+ 0x2f, 0x26, 0x29, 0x3a, 0x31, 0x36, 0x3d, 0x38, 0x3b, 0x45, 0x40, 0x44,
+ 0x36, 0x32, 0x38, 0x2f, 0x2a, 0x31, 0x30, 0x29, 0x31, 0x36, 0x2e, 0x38,
+ 0x32, 0x2a, 0x35, 0x3c, 0x38, 0x3f, 0x38, 0x37, 0x3d, 0x30, 0x31, 0x35,
+ 0x30, 0x30, 0x33, 0x2c, 0x2b, 0x2f, 0x25, 0x24, 0x2a, 0x22, 0x21, 0x27,
+ 0x1e, 0x1d, 0x23, 0x1a, 0x19, 0x1e, 0x21, 0x21, 0x23, 0x1f, 0x1f, 0x1f,
+ 0x2a, 0x2b, 0x2e, 0x44, 0x45, 0x4a, 0x40, 0x41, 0x47, 0x3c, 0x3f, 0x46,
+ 0x38, 0x3b, 0x44, 0x37, 0x37, 0x41, 0x23, 0x23, 0x2d, 0x20, 0x20, 0x2a,
+ 0x1f, 0x22, 0x29, 0x1e, 0x20, 0x25, 0x21, 0x23, 0x26, 0x1f, 0x20, 0x24,
+ 0x1a, 0x19, 0x1e, 0x12, 0x11, 0x16, 0x0b, 0x0b, 0x0d, 0x09, 0x09, 0x07,
+ 0x0a, 0x0b, 0x0a, 0x0c, 0x0d, 0x0d, 0x0c, 0x0e, 0x0d, 0x0b, 0x0d, 0x0c,
+ 0x10, 0x12, 0x11, 0x16, 0x17, 0x17, 0x19, 0x18, 0x18, 0x1a, 0x19, 0x1a,
+ 0x1c, 0x1a, 0x1b, 0x28, 0x26, 0x27, 0x49, 0x45, 0x44, 0x25, 0x21, 0x20,
+ 0x3e, 0x3a, 0x3b, 0x2a, 0x28, 0x2b, 0x2e, 0x2c, 0x2f, 0x2c, 0x29, 0x2f,
+ 0x27, 0x26, 0x2e, 0x20, 0x1f, 0x25, 0x1d, 0x1d, 0x21, 0x1c, 0x1c, 0x1d,
+ 0x1f, 0x1d, 0x20, 0x1a, 0x18, 0x1b, 0x1e, 0x1c, 0x1e, 0x39, 0x37, 0x3c,
+ 0x40, 0x43, 0x4e, 0x44, 0x46, 0x52, 0x42, 0x44, 0x50, 0x37, 0x3a, 0x43,
+ 0x38, 0x38, 0x40, 0x2a, 0x2a, 0x2f, 0x16, 0x16, 0x18, 0x11, 0x10, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0e, 0x0e, 0x0f, 0x0e, 0x0f, 0x14, 0x16, 0x15, 0x19, 0x1b, 0x1a,
+ 0x15, 0x16, 0x18, 0x13, 0x14, 0x16, 0x19, 0x1a, 0x1c, 0x1e, 0x1e, 0x21,
+ 0x27, 0x28, 0x28, 0x33, 0x35, 0x34, 0x34, 0x36, 0x35, 0x31, 0x36, 0x32,
+ 0x33, 0x38, 0x35, 0x32, 0x36, 0x35, 0x30, 0x34, 0x33, 0x30, 0x34, 0x33,
+ 0x31, 0x34, 0x35, 0x32, 0x36, 0x37, 0x36, 0x3a, 0x3c, 0x36, 0x3a, 0x3d,
+ 0x35, 0x39, 0x3c, 0x37, 0x3b, 0x3e, 0x36, 0x3c, 0x3c, 0x33, 0x39, 0x39,
+ 0x37, 0x3a, 0x3d, 0x36, 0x3b, 0x3e, 0x35, 0x3d, 0x3f, 0x2f, 0x39, 0x3a,
+ 0x31, 0x3a, 0x3b, 0x31, 0x38, 0x3a, 0x34, 0x38, 0x3a, 0x35, 0x39, 0x3c,
+ 0x37, 0x3c, 0x3e, 0x34, 0x39, 0x3c, 0x34, 0x3a, 0x3e, 0x34, 0x39, 0x3f,
+ 0x31, 0x37, 0x3d, 0x34, 0x3b, 0x41, 0x30, 0x37, 0x3d, 0x2f, 0x37, 0x3a,
+ 0x30, 0x38, 0x3b, 0x33, 0x39, 0x3d, 0x35, 0x3a, 0x3d, 0x33, 0x38, 0x39,
+ 0x31, 0x37, 0x37, 0x33, 0x38, 0x3b, 0x2f, 0x37, 0x39, 0x2f, 0x37, 0x3a,
+ 0x35, 0x39, 0x3e, 0x35, 0x38, 0x3b, 0x31, 0x37, 0x37, 0x31, 0x36, 0x37,
+ 0x2f, 0x34, 0x38, 0x2d, 0x32, 0x36, 0x2c, 0x32, 0x34, 0x2b, 0x31, 0x31,
+ 0x28, 0x2c, 0x2f, 0x26, 0x2a, 0x2d, 0x25, 0x29, 0x2c, 0x25, 0x29, 0x2a,
+ 0x25, 0x29, 0x2a, 0x26, 0x2a, 0x2b, 0x2a, 0x2e, 0x2f, 0x35, 0x39, 0x3a,
+ 0x33, 0x3a, 0x3f, 0x2a, 0x2f, 0x33, 0x27, 0x27, 0x2b, 0x2a, 0x2a, 0x2c,
+ 0x38, 0x3c, 0x3d, 0x3b, 0x43, 0x45, 0x33, 0x3b, 0x3e, 0x2c, 0x33, 0x39,
+ 0x33, 0x34, 0x39, 0x2b, 0x2f, 0x32, 0x2c, 0x30, 0x31, 0x30, 0x34, 0x35,
+ 0x2b, 0x30, 0x33, 0x31, 0x37, 0x3b, 0x39, 0x3e, 0x44, 0x35, 0x3c, 0x45,
+ 0x34, 0x3d, 0x42, 0x33, 0x3d, 0x3f, 0x35, 0x3d, 0x40, 0x34, 0x3a, 0x3e,
+ 0x39, 0x39, 0x3f, 0x39, 0x35, 0x3b, 0x36, 0x2e, 0x2f, 0x37, 0x2d, 0x2a,
+ 0x3f, 0x30, 0x2b, 0x41, 0x2f, 0x2b, 0x43, 0x2f, 0x2c, 0x43, 0x30, 0x2d,
+ 0x42, 0x2f, 0x2b, 0x43, 0x30, 0x2b, 0x43, 0x31, 0x2b, 0x41, 0x31, 0x29,
+ 0x3b, 0x30, 0x2a, 0x3a, 0x31, 0x2e, 0x3e, 0x38, 0x37, 0x32, 0x31, 0x33,
+ 0x1b, 0x1f, 0x23, 0x11, 0x16, 0x1a, 0x12, 0x17, 0x1a, 0x1e, 0x23, 0x27,
+ 0x12, 0x23, 0x33, 0x15, 0x26, 0x36, 0x15, 0x27, 0x36, 0x15, 0x27, 0x35,
+ 0x17, 0x27, 0x37, 0x1a, 0x29, 0x3b, 0x15, 0x25, 0x39, 0x15, 0x26, 0x3a,
+ 0x19, 0x2a, 0x3a, 0x1a, 0x2b, 0x3b, 0x17, 0x27, 0x39, 0x19, 0x29, 0x40,
+ 0x17, 0x2b, 0x45, 0x12, 0x27, 0x40, 0x16, 0x2b, 0x40, 0x18, 0x2b, 0x3d,
+ 0x18, 0x28, 0x3e, 0x1f, 0x30, 0x44, 0x20, 0x33, 0x46, 0x15, 0x27, 0x3d,
+ 0x1d, 0x2b, 0x46, 0x24, 0x2d, 0x43, 0x38, 0x37, 0x46, 0x46, 0x3e, 0x48,
+ 0x4b, 0x3f, 0x45, 0x36, 0x37, 0x43, 0x19, 0x2a, 0x40, 0x14, 0x29, 0x47,
+ 0x1e, 0x2f, 0x4f, 0x14, 0x23, 0x40, 0x25, 0x34, 0x51, 0x4e, 0x63, 0x80,
+ 0x3c, 0x57, 0x6e, 0x1c, 0x34, 0x4a, 0x45, 0x58, 0x69, 0x5f, 0x6d, 0x77,
+ 0x4b, 0x55, 0x5d, 0x28, 0x2f, 0x36, 0x2a, 0x30, 0x34, 0x32, 0x35, 0x39,
+ 0x39, 0x3c, 0x44, 0x3d, 0x3e, 0x47, 0x40, 0x40, 0x49, 0x3c, 0x3c, 0x46,
+ 0x39, 0x39, 0x40, 0x3a, 0x3b, 0x40, 0x36, 0x37, 0x3c, 0x25, 0x25, 0x2a,
+ 0x2a, 0x2a, 0x30, 0x49, 0x4b, 0x4f, 0x3e, 0x3f, 0x44, 0x31, 0x32, 0x37,
+ 0x2b, 0x2e, 0x33, 0x2b, 0x2e, 0x33, 0x2b, 0x2e, 0x33, 0x28, 0x2d, 0x31,
+ 0x25, 0x2a, 0x2e, 0x25, 0x2c, 0x34, 0x28, 0x2e, 0x39, 0x2d, 0x33, 0x3f,
+ 0x2e, 0x33, 0x3b, 0x20, 0x24, 0x27, 0x14, 0x17, 0x19, 0x13, 0x15, 0x16,
+ 0x14, 0x16, 0x15, 0x13, 0x15, 0x15, 0x10, 0x12, 0x11, 0x12, 0x14, 0x13,
+ 0x10, 0x12, 0x11, 0x11, 0x13, 0x12, 0x12, 0x14, 0x13, 0x11, 0x13, 0x13,
+ 0x10, 0x11, 0x13, 0x0f, 0x11, 0x12, 0x12, 0x13, 0x15, 0x13, 0x14, 0x16,
+ 0x11, 0x12, 0x14, 0x11, 0x11, 0x13, 0x11, 0x10, 0x13, 0x10, 0x10, 0x12,
+ 0x0e, 0x11, 0x11, 0x0d, 0x0f, 0x10, 0x0f, 0x10, 0x12, 0x11, 0x11, 0x12,
+ 0x11, 0x11, 0x13, 0x11, 0x11, 0x13, 0x0a, 0x0c, 0x0c, 0x0d, 0x0f, 0x0e,
+ 0x13, 0x15, 0x12, 0x1b, 0x1d, 0x1c, 0x11, 0x13, 0x12, 0x0f, 0x0f, 0x0d,
+ 0x2c, 0x2c, 0x24, 0x4a, 0x4a, 0x44, 0x36, 0x36, 0x36, 0x32, 0x33, 0x36,
+ 0x2f, 0x31, 0x2f, 0x1f, 0x21, 0x22, 0x14, 0x17, 0x1a, 0x0e, 0x12, 0x17,
+ 0x0d, 0x11, 0x17, 0x10, 0x18, 0x1b, 0x3b, 0x43, 0x45, 0x5b, 0x65, 0x65,
+ 0x5b, 0x65, 0x64, 0x4e, 0x58, 0x58, 0x3a, 0x44, 0x43, 0x41, 0x4b, 0x4c,
+ 0x26, 0x2e, 0x30, 0x0c, 0x11, 0x15, 0x21, 0x26, 0x2a, 0x4d, 0x51, 0x57,
+ 0x3c, 0x41, 0x45, 0x1d, 0x22, 0x26, 0x1a, 0x1f, 0x22, 0x35, 0x3b, 0x3c,
+ 0x45, 0x4b, 0x4b, 0x45, 0x4a, 0x49, 0x40, 0x44, 0x44, 0x42, 0x43, 0x45,
+ 0x3e, 0x40, 0x3f, 0x3c, 0x3e, 0x3c, 0x37, 0x39, 0x36, 0x32, 0x34, 0x31,
+ 0x2b, 0x2d, 0x2a, 0x29, 0x2b, 0x2a, 0x21, 0x23, 0x23, 0x21, 0x22, 0x23,
+ 0x1c, 0x1d, 0x1b, 0x1e, 0x1e, 0x1e, 0x1d, 0x1d, 0x1f, 0x1b, 0x1b, 0x1c,
+ 0x21, 0x21, 0x21, 0x22, 0x24, 0x22, 0x28, 0x2d, 0x2c, 0x2a, 0x2e, 0x31,
+ 0x2c, 0x2e, 0x30, 0x2d, 0x2d, 0x2f, 0x32, 0x2e, 0x31, 0x28, 0x22, 0x24,
+ 0x2d, 0x25, 0x28, 0x35, 0x2e, 0x33, 0x2f, 0x29, 0x2e, 0x37, 0x32, 0x37,
+ 0x35, 0x33, 0x38, 0x30, 0x2b, 0x31, 0x31, 0x2a, 0x32, 0x35, 0x2e, 0x37,
+ 0x31, 0x2c, 0x33, 0x34, 0x32, 0x37, 0x35, 0x36, 0x39, 0x32, 0x35, 0x36,
+ 0x28, 0x28, 0x2a, 0x29, 0x28, 0x2b, 0x28, 0x27, 0x2c, 0x26, 0x26, 0x2c,
+ 0x1f, 0x1e, 0x24, 0x19, 0x18, 0x1d, 0x23, 0x23, 0x25, 0x1f, 0x1d, 0x1e,
+ 0x27, 0x28, 0x2a, 0x42, 0x43, 0x47, 0x3e, 0x41, 0x46, 0x3c, 0x3f, 0x46,
+ 0x39, 0x3c, 0x44, 0x34, 0x37, 0x40, 0x29, 0x2a, 0x34, 0x23, 0x23, 0x2d,
+ 0x21, 0x23, 0x2a, 0x22, 0x24, 0x29, 0x1f, 0x20, 0x22, 0x1d, 0x1e, 0x20,
+ 0x19, 0x18, 0x1d, 0x12, 0x11, 0x15, 0x0a, 0x0a, 0x0a, 0x08, 0x08, 0x07,
+ 0x0a, 0x0c, 0x0b, 0x0c, 0x0e, 0x0d, 0x0a, 0x0c, 0x0b, 0x08, 0x0a, 0x09,
+ 0x0f, 0x11, 0x10, 0x17, 0x17, 0x17, 0x1a, 0x1a, 0x1a, 0x19, 0x17, 0x18,
+ 0x1c, 0x1a, 0x1c, 0x23, 0x21, 0x22, 0x25, 0x21, 0x20, 0x29, 0x26, 0x23,
+ 0x50, 0x4d, 0x4a, 0x2a, 0x26, 0x27, 0x25, 0x23, 0x26, 0x30, 0x2e, 0x35,
+ 0x32, 0x31, 0x39, 0x25, 0x24, 0x2a, 0x25, 0x24, 0x29, 0x25, 0x24, 0x27,
+ 0x1e, 0x1c, 0x1f, 0x18, 0x16, 0x19, 0x25, 0x23, 0x27, 0x3c, 0x3b, 0x40,
+ 0x3c, 0x3e, 0x49, 0x36, 0x38, 0x44, 0x31, 0x33, 0x3f, 0x2d, 0x30, 0x39,
+ 0x31, 0x31, 0x39, 0x25, 0x26, 0x2b, 0x16, 0x16, 0x18, 0x12, 0x10, 0x11,
+ 0x0f, 0x0f, 0x0f, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0e, 0x0e, 0x0e, 0x10, 0x11, 0x10, 0x0e, 0x0f, 0x0e, 0x14, 0x16, 0x15,
+ 0x18, 0x1a, 0x1b, 0x15, 0x16, 0x18, 0x1d, 0x1f, 0x20, 0x21, 0x22, 0x24,
+ 0x2b, 0x2b, 0x2d, 0x32, 0x32, 0x34, 0x34, 0x36, 0x37, 0x30, 0x34, 0x33,
+ 0x31, 0x35, 0x34, 0x33, 0x38, 0x38, 0x32, 0x36, 0x37, 0x32, 0x36, 0x37,
+ 0x34, 0x35, 0x37, 0x37, 0x38, 0x3a, 0x39, 0x3b, 0x3e, 0x35, 0x36, 0x3a,
+ 0x36, 0x37, 0x3b, 0x38, 0x3a, 0x3d, 0x3b, 0x3c, 0x3e, 0x37, 0x39, 0x3a,
+ 0x34, 0x3a, 0x3a, 0x35, 0x3e, 0x3d, 0x32, 0x3c, 0x3b, 0x31, 0x3a, 0x3a,
+ 0x34, 0x3d, 0x3c, 0x34, 0x3c, 0x3c, 0x36, 0x3a, 0x39, 0x35, 0x37, 0x36,
+ 0x35, 0x3b, 0x3a, 0x34, 0x3c, 0x3d, 0x33, 0x39, 0x3e, 0x33, 0x3a, 0x41,
+ 0x32, 0x39, 0x41, 0x33, 0x3a, 0x41, 0x31, 0x38, 0x3c, 0x2f, 0x38, 0x3a,
+ 0x2e, 0x36, 0x3a, 0x32, 0x3a, 0x3c, 0x37, 0x3d, 0x40, 0x34, 0x3a, 0x3c,
+ 0x32, 0x38, 0x3a, 0x30, 0x38, 0x3a, 0x2e, 0x36, 0x39, 0x2e, 0x38, 0x3a,
+ 0x35, 0x39, 0x3c, 0x32, 0x36, 0x37, 0x31, 0x36, 0x35, 0x31, 0x37, 0x35,
+ 0x2f, 0x34, 0x35, 0x2c, 0x33, 0x35, 0x2e, 0x33, 0x34, 0x30, 0x35, 0x34,
+ 0x2f, 0x32, 0x37, 0x2b, 0x2f, 0x32, 0x2a, 0x2e, 0x31, 0x27, 0x2b, 0x2c,
+ 0x22, 0x26, 0x27, 0x29, 0x2d, 0x2e, 0x36, 0x3b, 0x3c, 0x37, 0x3c, 0x3d,
+ 0x2b, 0x32, 0x38, 0x1f, 0x24, 0x28, 0x26, 0x28, 0x29, 0x29, 0x2b, 0x28,
+ 0x2f, 0x35, 0x31, 0x38, 0x41, 0x40, 0x3a, 0x42, 0x46, 0x37, 0x3e, 0x45,
+ 0x30, 0x34, 0x39, 0x29, 0x2c, 0x31, 0x2c, 0x31, 0x33, 0x30, 0x36, 0x36,
+ 0x31, 0x36, 0x39, 0x35, 0x3b, 0x3f, 0x35, 0x3c, 0x42, 0x32, 0x39, 0x41,
+ 0x33, 0x37, 0x3d, 0x34, 0x38, 0x3c, 0x33, 0x38, 0x3c, 0x35, 0x3a, 0x3f,
+ 0x37, 0x39, 0x3f, 0x38, 0x38, 0x3d, 0x34, 0x31, 0x32, 0x37, 0x31, 0x2d,
+ 0x3c, 0x2b, 0x27, 0x3d, 0x2b, 0x27, 0x3f, 0x2d, 0x2a, 0x41, 0x2d, 0x2b,
+ 0x3f, 0x2d, 0x2b, 0x41, 0x31, 0x2c, 0x40, 0x33, 0x2d, 0x3a, 0x2f, 0x27,
+ 0x3a, 0x2c, 0x2a, 0x3e, 0x34, 0x35, 0x4a, 0x46, 0x4a, 0x49, 0x49, 0x4f,
+ 0x26, 0x2c, 0x32, 0x14, 0x1c, 0x22, 0x13, 0x1c, 0x22, 0x21, 0x2a, 0x30,
+ 0x16, 0x28, 0x31, 0x16, 0x28, 0x38, 0x14, 0x25, 0x3a, 0x18, 0x29, 0x3d,
+ 0x18, 0x29, 0x39, 0x17, 0x29, 0x38, 0x14, 0x28, 0x3c, 0x11, 0x28, 0x3f,
+ 0x18, 0x2c, 0x40, 0x1d, 0x32, 0x42, 0x17, 0x2c, 0x3f, 0x18, 0x2c, 0x46,
+ 0x19, 0x2a, 0x4b, 0x17, 0x27, 0x48, 0x14, 0x26, 0x41, 0x1c, 0x2e, 0x43,
+ 0x1d, 0x2d, 0x44, 0x20, 0x34, 0x4d, 0x1e, 0x36, 0x4e, 0x1c, 0x2e, 0x42,
+ 0x2e, 0x35, 0x3f, 0x47, 0x40, 0x42, 0x5d, 0x4d, 0x4d, 0x66, 0x50, 0x50,
+ 0x62, 0x4f, 0x4a, 0x62, 0x51, 0x4e, 0x52, 0x47, 0x4c, 0x2e, 0x30, 0x41,
+ 0x21, 0x32, 0x4f, 0x0e, 0x28, 0x48, 0x0f, 0x25, 0x44, 0x23, 0x35, 0x4d,
+ 0x2c, 0x44, 0x53, 0x28, 0x30, 0x44, 0x35, 0x33, 0x41, 0x42, 0x3b, 0x3f,
+ 0x38, 0x32, 0x3a, 0x19, 0x28, 0x33, 0x1a, 0x2e, 0x34, 0x33, 0x34, 0x36,
+ 0x36, 0x3a, 0x41, 0x36, 0x3a, 0x3f, 0x38, 0x3d, 0x3e, 0x35, 0x3b, 0x3c,
+ 0x38, 0x3b, 0x41, 0x38, 0x38, 0x41, 0x3d, 0x3c, 0x44, 0x3e, 0x3e, 0x46,
+ 0x2d, 0x2f, 0x34, 0x38, 0x3b, 0x3f, 0x36, 0x39, 0x3d, 0x2d, 0x31, 0x34,
+ 0x2d, 0x30, 0x35, 0x2d, 0x30, 0x37, 0x2c, 0x2f, 0x38, 0x29, 0x2c, 0x37,
+ 0x25, 0x2d, 0x35, 0x24, 0x2b, 0x31, 0x26, 0x2b, 0x32, 0x2b, 0x2f, 0x38,
+ 0x2b, 0x2f, 0x3a, 0x20, 0x24, 0x2d, 0x12, 0x16, 0x1a, 0x10, 0x12, 0x14,
+ 0x14, 0x15, 0x16, 0x13, 0x15, 0x16, 0x10, 0x12, 0x13, 0x11, 0x12, 0x14,
+ 0x12, 0x14, 0x13, 0x12, 0x14, 0x13, 0x13, 0x15, 0x12, 0x10, 0x12, 0x0f,
+ 0x0d, 0x11, 0x12, 0x0f, 0x13, 0x14, 0x10, 0x13, 0x14, 0x0f, 0x10, 0x12,
+ 0x0d, 0x0e, 0x10, 0x0f, 0x10, 0x12, 0x0f, 0x10, 0x13, 0x0f, 0x10, 0x12,
+ 0x0e, 0x10, 0x10, 0x0d, 0x0f, 0x0e, 0x10, 0x12, 0x12, 0x15, 0x15, 0x16,
+ 0x17, 0x19, 0x18, 0x12, 0x14, 0x13, 0x0c, 0x0e, 0x0f, 0x14, 0x17, 0x18,
+ 0x1f, 0x21, 0x20, 0x13, 0x15, 0x14, 0x0d, 0x11, 0x12, 0x08, 0x0c, 0x0e,
+ 0x10, 0x14, 0x14, 0x24, 0x28, 0x28, 0x2c, 0x30, 0x2f, 0x35, 0x38, 0x35,
+ 0x3c, 0x3b, 0x39, 0x35, 0x35, 0x35, 0x2f, 0x30, 0x32, 0x18, 0x1c, 0x1f,
+ 0x15, 0x1a, 0x1d, 0x1e, 0x26, 0x29, 0x45, 0x4d, 0x50, 0x49, 0x53, 0x55,
+ 0x49, 0x52, 0x50, 0x46, 0x4e, 0x51, 0x54, 0x5b, 0x66, 0x37, 0x3d, 0x4b,
+ 0x09, 0x11, 0x1c, 0x20, 0x29, 0x2e, 0x50, 0x59, 0x5a, 0x42, 0x4c, 0x4b,
+ 0x3f, 0x47, 0x49, 0x50, 0x58, 0x5b, 0x48, 0x4f, 0x55, 0x20, 0x27, 0x2d,
+ 0x27, 0x2e, 0x33, 0x49, 0x4e, 0x52, 0x52, 0x57, 0x58, 0x45, 0x4b, 0x4b,
+ 0x3e, 0x44, 0x44, 0x42, 0x46, 0x47, 0x3d, 0x41, 0x42, 0x3b, 0x3f, 0x42,
+ 0x36, 0x3a, 0x3d, 0x34, 0x38, 0x3b, 0x31, 0x36, 0x37, 0x32, 0x35, 0x36,
+ 0x36, 0x37, 0x38, 0x32, 0x33, 0x34, 0x2e, 0x2f, 0x2f, 0x2a, 0x2c, 0x2a,
+ 0x2c, 0x30, 0x2f, 0x2d, 0x30, 0x31, 0x31, 0x34, 0x38, 0x31, 0x34, 0x39,
+ 0x34, 0x38, 0x3a, 0x3a, 0x3e, 0x3e, 0x36, 0x38, 0x37, 0x25, 0x25, 0x27,
+ 0x34, 0x32, 0x35, 0x36, 0x30, 0x37, 0x2b, 0x23, 0x30, 0x32, 0x2a, 0x38,
+ 0x2e, 0x2a, 0x30, 0x30, 0x2b, 0x32, 0x32, 0x2c, 0x36, 0x30, 0x2a, 0x36,
+ 0x2c, 0x29, 0x33, 0x2f, 0x2c, 0x37, 0x32, 0x2f, 0x37, 0x2f, 0x2c, 0x34,
+ 0x27, 0x24, 0x2a, 0x26, 0x24, 0x2a, 0x2b, 0x2a, 0x32, 0x23, 0x23, 0x2a,
+ 0x1a, 0x1a, 0x20, 0x1d, 0x1c, 0x21, 0x25, 0x23, 0x26, 0x1e, 0x1c, 0x1d,
+ 0x29, 0x29, 0x29, 0x42, 0x43, 0x47, 0x3f, 0x3f, 0x48, 0x3c, 0x3f, 0x48,
+ 0x3a, 0x3d, 0x46, 0x34, 0x37, 0x3f, 0x31, 0x31, 0x39, 0x2d, 0x2d, 0x35,
+ 0x29, 0x28, 0x30, 0x26, 0x25, 0x2d, 0x21, 0x20, 0x26, 0x1e, 0x1d, 0x22,
+ 0x1a, 0x19, 0x1d, 0x13, 0x13, 0x15, 0x0c, 0x0c, 0x0e, 0x0c, 0x0b, 0x0d,
+ 0x0c, 0x0c, 0x0d, 0x0c, 0x0d, 0x0d, 0x0a, 0x0c, 0x0b, 0x0a, 0x0c, 0x0b,
+ 0x12, 0x12, 0x12, 0x19, 0x17, 0x17, 0x1f, 0x1c, 0x1d, 0x1c, 0x18, 0x19,
+ 0x21, 0x1d, 0x1d, 0x20, 0x1c, 0x1b, 0x1a, 0x16, 0x13, 0x29, 0x28, 0x24,
+ 0x47, 0x46, 0x42, 0x26, 0x24, 0x24, 0x21, 0x21, 0x25, 0x25, 0x24, 0x2a,
+ 0x2c, 0x2b, 0x30, 0x2d, 0x2c, 0x32, 0x2a, 0x27, 0x30, 0x28, 0x25, 0x2d,
+ 0x20, 0x1f, 0x25, 0x1c, 0x1b, 0x20, 0x24, 0x24, 0x29, 0x35, 0x35, 0x3c,
+ 0x34, 0x37, 0x43, 0x31, 0x33, 0x3f, 0x2d, 0x2d, 0x39, 0x2b, 0x2b, 0x35,
+ 0x2e, 0x2d, 0x33, 0x1f, 0x1e, 0x23, 0x12, 0x12, 0x12, 0x10, 0x10, 0x0f,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09,
+ 0x0b, 0x0b, 0x09, 0x0c, 0x0c, 0x0a, 0x0c, 0x0c, 0x0a, 0x0d, 0x0d, 0x0d,
+ 0x0e, 0x0f, 0x0b, 0x11, 0x12, 0x0f, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0d,
+ 0x13, 0x14, 0x16, 0x1b, 0x1c, 0x1e, 0x1d, 0x1f, 0x1e, 0x24, 0x27, 0x26,
+ 0x2f, 0x31, 0x2d, 0x30, 0x32, 0x2f, 0x31, 0x33, 0x32, 0x30, 0x34, 0x31,
+ 0x30, 0x35, 0x32, 0x2f, 0x37, 0x33, 0x31, 0x3a, 0x37, 0x34, 0x3c, 0x3d,
+ 0x34, 0x36, 0x3d, 0x35, 0x37, 0x3c, 0x32, 0x36, 0x39, 0x32, 0x36, 0x37,
+ 0x34, 0x38, 0x39, 0x34, 0x38, 0x37, 0x35, 0x39, 0x38, 0x37, 0x3a, 0x3a,
+ 0x34, 0x38, 0x3b, 0x37, 0x3c, 0x3e, 0x35, 0x39, 0x3c, 0x33, 0x37, 0x3a,
+ 0x36, 0x3a, 0x3c, 0x36, 0x3b, 0x3c, 0x35, 0x39, 0x3a, 0x35, 0x38, 0x3a,
+ 0x39, 0x3b, 0x43, 0x3a, 0x3b, 0x40, 0x39, 0x3b, 0x3d, 0x34, 0x38, 0x3b,
+ 0x32, 0x38, 0x3c, 0x2f, 0x37, 0x3a, 0x2f, 0x39, 0x36, 0x2f, 0x3a, 0x33,
+ 0x2f, 0x3a, 0x34, 0x2e, 0x38, 0x35, 0x31, 0x3a, 0x3b, 0x31, 0x3a, 0x3d,
+ 0x33, 0x3a, 0x3d, 0x33, 0x3a, 0x3d, 0x33, 0x3b, 0x3d, 0x31, 0x39, 0x39,
+ 0x2e, 0x34, 0x33, 0x2f, 0x35, 0x35, 0x31, 0x36, 0x37, 0x32, 0x36, 0x39,
+ 0x31, 0x35, 0x37, 0x2f, 0x32, 0x37, 0x31, 0x32, 0x38, 0x34, 0x34, 0x3b,
+ 0x30, 0x33, 0x3a, 0x2f, 0x32, 0x37, 0x31, 0x35, 0x38, 0x29, 0x2f, 0x2f,
+ 0x21, 0x27, 0x27, 0x33, 0x38, 0x3b, 0x41, 0x48, 0x4b, 0x2e, 0x35, 0x3b,
+ 0x21, 0x27, 0x2b, 0x1f, 0x27, 0x28, 0x24, 0x2c, 0x2b, 0x25, 0x2f, 0x2b,
+ 0x26, 0x31, 0x2d, 0x2d, 0x36, 0x36, 0x36, 0x3b, 0x3e, 0x37, 0x3c, 0x40,
+ 0x28, 0x2c, 0x2f, 0x22, 0x26, 0x29, 0x29, 0x2d, 0x30, 0x31, 0x36, 0x39,
+ 0x35, 0x3a, 0x3d, 0x36, 0x3b, 0x3f, 0x34, 0x39, 0x3e, 0x33, 0x37, 0x3b,
+ 0x33, 0x37, 0x38, 0x2f, 0x34, 0x36, 0x31, 0x36, 0x3c, 0x31, 0x35, 0x3e,
+ 0x33, 0x36, 0x3d, 0x36, 0x37, 0x3c, 0x35, 0x35, 0x37, 0x30, 0x2e, 0x2e,
+ 0x33, 0x2b, 0x26, 0x36, 0x2c, 0x27, 0x3a, 0x2c, 0x27, 0x40, 0x2f, 0x29,
+ 0x42, 0x2f, 0x2b, 0x40, 0x2d, 0x29, 0x40, 0x2e, 0x2c, 0x3e, 0x2c, 0x2b,
+ 0x3b, 0x2e, 0x29, 0x3f, 0x38, 0x36, 0x4a, 0x4d, 0x50, 0x61, 0x6b, 0x70,
+ 0x5a, 0x66, 0x6c, 0x39, 0x43, 0x4d, 0x1c, 0x24, 0x36, 0x19, 0x21, 0x39,
+ 0x16, 0x28, 0x3e, 0x17, 0x2c, 0x41, 0x11, 0x26, 0x3c, 0x14, 0x28, 0x40,
+ 0x17, 0x28, 0x41, 0x17, 0x27, 0x40, 0x1a, 0x2d, 0x43, 0x18, 0x2e, 0x41,
+ 0x1b, 0x2e, 0x43, 0x20, 0x32, 0x45, 0x1b, 0x2f, 0x44, 0x19, 0x2d, 0x47,
+ 0x1b, 0x2e, 0x4e, 0x1a, 0x2d, 0x4e, 0x1a, 0x2e, 0x49, 0x18, 0x2b, 0x43,
+ 0x15, 0x26, 0x42, 0x17, 0x2c, 0x4b, 0x18, 0x2e, 0x49, 0x21, 0x2d, 0x3d,
+ 0x45, 0x43, 0x46, 0x59, 0x4e, 0x4b, 0x51, 0x49, 0x45, 0x55, 0x50, 0x51,
+ 0x4d, 0x4b, 0x4a, 0x53, 0x4b, 0x48, 0x66, 0x59, 0x5a, 0x4d, 0x4a, 0x56,
+ 0x23, 0x2f, 0x47, 0x15, 0x2b, 0x4a, 0x15, 0x28, 0x42, 0x1b, 0x25, 0x36,
+ 0x38, 0x2e, 0x35, 0x4c, 0x45, 0x4b, 0x53, 0x54, 0x53, 0x56, 0x55, 0x4b,
+ 0x54, 0x4b, 0x47, 0x34, 0x33, 0x38, 0x20, 0x2b, 0x34, 0x46, 0x52, 0x5e,
+ 0x34, 0x3c, 0x40, 0x2a, 0x31, 0x36, 0x2e, 0x35, 0x3c, 0x31, 0x38, 0x44,
+ 0x33, 0x38, 0x48, 0x37, 0x3b, 0x4c, 0x3b, 0x3f, 0x4b, 0x3f, 0x44, 0x4a,
+ 0x38, 0x3b, 0x40, 0x32, 0x35, 0x3a, 0x33, 0x36, 0x3b, 0x2c, 0x2f, 0x34,
+ 0x2a, 0x2d, 0x33, 0x29, 0x2c, 0x34, 0x27, 0x29, 0x33, 0x28, 0x2b, 0x36,
+ 0x24, 0x2d, 0x34, 0x23, 0x2a, 0x30, 0x27, 0x2a, 0x31, 0x2b, 0x2e, 0x37,
+ 0x2c, 0x30, 0x3a, 0x25, 0x2a, 0x32, 0x13, 0x16, 0x1a, 0x12, 0x12, 0x14,
+ 0x14, 0x15, 0x17, 0x13, 0x13, 0x16, 0x11, 0x12, 0x14, 0x14, 0x15, 0x17,
+ 0x11, 0x13, 0x12, 0x0f, 0x11, 0x10, 0x13, 0x15, 0x14, 0x12, 0x14, 0x11,
+ 0x10, 0x13, 0x14, 0x11, 0x15, 0x16, 0x11, 0x13, 0x14, 0x11, 0x12, 0x14,
+ 0x0f, 0x10, 0x12, 0x0e, 0x0f, 0x11, 0x10, 0x11, 0x13, 0x0f, 0x10, 0x12,
+ 0x0e, 0x10, 0x0f, 0x0e, 0x10, 0x10, 0x12, 0x14, 0x13, 0x14, 0x15, 0x15,
+ 0x11, 0x13, 0x12, 0x10, 0x12, 0x11, 0x0d, 0x0f, 0x0e, 0x22, 0x26, 0x25,
+ 0x52, 0x54, 0x51, 0x38, 0x39, 0x38, 0x13, 0x15, 0x16, 0x0a, 0x0b, 0x0d,
+ 0x0a, 0x0c, 0x0d, 0x1a, 0x1c, 0x1b, 0x3c, 0x3c, 0x3a, 0x4e, 0x4e, 0x4b,
+ 0x55, 0x52, 0x50, 0x4f, 0x4e, 0x4c, 0x34, 0x34, 0x34, 0x30, 0x31, 0x33,
+ 0x4b, 0x50, 0x53, 0x30, 0x36, 0x38, 0x2a, 0x31, 0x33, 0x52, 0x5a, 0x5b,
+ 0x65, 0x6b, 0x69, 0x32, 0x37, 0x39, 0x4e, 0x52, 0x5b, 0x46, 0x4a, 0x54,
+ 0x19, 0x20, 0x26, 0x34, 0x3c, 0x3e, 0x58, 0x61, 0x60, 0x52, 0x5b, 0x58,
+ 0x55, 0x5e, 0x5f, 0x35, 0x3d, 0x40, 0x45, 0x4c, 0x52, 0x48, 0x4f, 0x55,
+ 0x10, 0x15, 0x1c, 0x19, 0x1e, 0x22, 0x38, 0x3d, 0x40, 0x4d, 0x52, 0x53,
+ 0x4e, 0x54, 0x54, 0x49, 0x4f, 0x4f, 0x44, 0x4a, 0x4a, 0x42, 0x46, 0x49,
+ 0x40, 0x44, 0x48, 0x3b, 0x3f, 0x42, 0x36, 0x3a, 0x3d, 0x38, 0x3b, 0x3d,
+ 0x3b, 0x3c, 0x3e, 0x42, 0x44, 0x46, 0x3b, 0x3f, 0x40, 0x34, 0x38, 0x39,
+ 0x35, 0x39, 0x3a, 0x36, 0x3a, 0x3d, 0x3d, 0x42, 0x45, 0x40, 0x46, 0x48,
+ 0x45, 0x4a, 0x4a, 0x41, 0x45, 0x45, 0x34, 0x35, 0x37, 0x27, 0x26, 0x2b,
+ 0x3a, 0x38, 0x3d, 0x37, 0x32, 0x39, 0x2c, 0x25, 0x30, 0x31, 0x29, 0x34,
+ 0x35, 0x2f, 0x36, 0x3e, 0x39, 0x40, 0x34, 0x2f, 0x39, 0x30, 0x2d, 0x38,
+ 0x30, 0x2d, 0x38, 0x32, 0x2f, 0x38, 0x2d, 0x2a, 0x33, 0x2b, 0x28, 0x2f,
+ 0x25, 0x22, 0x28, 0x29, 0x26, 0x2d, 0x2c, 0x2b, 0x33, 0x22, 0x22, 0x2a,
+ 0x18, 0x19, 0x1e, 0x1e, 0x1d, 0x22, 0x23, 0x21, 0x24, 0x1c, 0x1b, 0x1c,
+ 0x28, 0x28, 0x28, 0x3e, 0x3f, 0x42, 0x3d, 0x3d, 0x45, 0x3b, 0x3d, 0x47,
+ 0x37, 0x3b, 0x43, 0x34, 0x37, 0x3d, 0x2d, 0x2e, 0x35, 0x2c, 0x2c, 0x34,
+ 0x29, 0x28, 0x30, 0x23, 0x22, 0x29, 0x22, 0x21, 0x27, 0x1e, 0x1d, 0x22,
+ 0x19, 0x19, 0x1c, 0x0f, 0x10, 0x12, 0x0e, 0x0e, 0x10, 0x0d, 0x0d, 0x0f,
+ 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c, 0x0d, 0x0c, 0x0d, 0x0e, 0x0d,
+ 0x13, 0x13, 0x13, 0x17, 0x16, 0x17, 0x19, 0x17, 0x18, 0x1a, 0x16, 0x17,
+ 0x24, 0x22, 0x22, 0x1d, 0x1c, 0x1a, 0x18, 0x17, 0x15, 0x28, 0x27, 0x24,
+ 0x2e, 0x2d, 0x2b, 0x24, 0x22, 0x25, 0x24, 0x22, 0x28, 0x22, 0x1f, 0x26,
+ 0x21, 0x21, 0x23, 0x20, 0x1f, 0x23, 0x20, 0x1f, 0x25, 0x23, 0x22, 0x28,
+ 0x2d, 0x2c, 0x31, 0x20, 0x20, 0x25, 0x25, 0x26, 0x2b, 0x33, 0x33, 0x3b,
+ 0x30, 0x32, 0x3f, 0x32, 0x34, 0x41, 0x31, 0x31, 0x3d, 0x2c, 0x2c, 0x36,
+ 0x31, 0x30, 0x38, 0x1d, 0x1b, 0x21, 0x0f, 0x0f, 0x11, 0x10, 0x10, 0x0f,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0c, 0x0a, 0x0a, 0x0a,
+ 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b,
+ 0x0e, 0x0e, 0x0c, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0f, 0x1c, 0x1d, 0x1f, 0x23, 0x26, 0x27, 0x2f, 0x33, 0x34,
+ 0x36, 0x38, 0x37, 0x31, 0x32, 0x34, 0x31, 0x33, 0x36, 0x32, 0x36, 0x37,
+ 0x34, 0x39, 0x38, 0x34, 0x3a, 0x38, 0x31, 0x36, 0x38, 0x36, 0x3d, 0x41,
+ 0x36, 0x39, 0x3e, 0x33, 0x36, 0x3a, 0x31, 0x35, 0x38, 0x32, 0x36, 0x39,
+ 0x31, 0x35, 0x36, 0x33, 0x37, 0x38, 0x38, 0x3c, 0x3d, 0x35, 0x39, 0x3a,
+ 0x34, 0x37, 0x3c, 0x37, 0x3a, 0x3f, 0x35, 0x38, 0x3d, 0x33, 0x36, 0x3a,
+ 0x34, 0x37, 0x3a, 0x36, 0x3a, 0x3d, 0x36, 0x3a, 0x3d, 0x33, 0x37, 0x3b,
+ 0x36, 0x39, 0x3f, 0x37, 0x3b, 0x3e, 0x37, 0x3a, 0x3b, 0x34, 0x38, 0x39,
+ 0x32, 0x37, 0x3b, 0x31, 0x36, 0x3a, 0x2d, 0x36, 0x35, 0x2e, 0x36, 0x31,
+ 0x32, 0x38, 0x36, 0x32, 0x38, 0x36, 0x31, 0x37, 0x39, 0x35, 0x3a, 0x3e,
+ 0x37, 0x3c, 0x40, 0x33, 0x38, 0x3c, 0x31, 0x37, 0x39, 0x31, 0x36, 0x36,
+ 0x2f, 0x35, 0x35, 0x2f, 0x35, 0x35, 0x30, 0x36, 0x36, 0x31, 0x35, 0x37,
+ 0x32, 0x36, 0x39, 0x2e, 0x32, 0x35, 0x30, 0x33, 0x38, 0x2f, 0x32, 0x37,
+ 0x31, 0x36, 0x3a, 0x31, 0x36, 0x39, 0x2e, 0x34, 0x34, 0x2b, 0x31, 0x31,
+ 0x26, 0x2c, 0x2c, 0x2f, 0x35, 0x35, 0x33, 0x38, 0x3c, 0x25, 0x2a, 0x2f,
+ 0x20, 0x25, 0x29, 0x27, 0x2d, 0x2f, 0x25, 0x2e, 0x2d, 0x27, 0x30, 0x2d,
+ 0x27, 0x30, 0x2d, 0x27, 0x30, 0x2f, 0x29, 0x2e, 0x31, 0x2d, 0x30, 0x35,
+ 0x24, 0x28, 0x2c, 0x28, 0x2d, 0x30, 0x2f, 0x34, 0x37, 0x31, 0x36, 0x39,
+ 0x33, 0x38, 0x3c, 0x34, 0x39, 0x3d, 0x33, 0x36, 0x3b, 0x31, 0x34, 0x39,
+ 0x31, 0x36, 0x38, 0x30, 0x33, 0x38, 0x30, 0x35, 0x3c, 0x30, 0x34, 0x3d,
+ 0x31, 0x35, 0x3b, 0x32, 0x35, 0x3a, 0x33, 0x35, 0x37, 0x31, 0x30, 0x31,
+ 0x36, 0x2d, 0x2b, 0x36, 0x2b, 0x27, 0x37, 0x2a, 0x24, 0x3b, 0x2c, 0x27,
+ 0x3b, 0x2c, 0x27, 0x3a, 0x2c, 0x29, 0x35, 0x2a, 0x27, 0x36, 0x2c, 0x29,
+ 0x38, 0x2f, 0x2a, 0x3b, 0x36, 0x37, 0x2c, 0x2f, 0x35, 0x33, 0x3c, 0x42,
+ 0x5d, 0x68, 0x6e, 0x70, 0x7a, 0x83, 0x58, 0x62, 0x73, 0x34, 0x40, 0x56,
+ 0x1a, 0x2a, 0x44, 0x19, 0x2d, 0x45, 0x17, 0x2d, 0x44, 0x13, 0x29, 0x43,
+ 0x13, 0x25, 0x47, 0x1a, 0x2a, 0x4b, 0x1c, 0x2e, 0x47, 0x1d, 0x31, 0x43,
+ 0x26, 0x39, 0x50, 0x1f, 0x31, 0x47, 0x1b, 0x30, 0x47, 0x19, 0x2e, 0x4a,
+ 0x1c, 0x30, 0x50, 0x1d, 0x31, 0x53, 0x1f, 0x34, 0x50, 0x17, 0x2c, 0x45,
+ 0x13, 0x27, 0x49, 0x12, 0x2a, 0x4e, 0x17, 0x2b, 0x4a, 0x2f, 0x32, 0x41,
+ 0x5f, 0x52, 0x4e, 0x63, 0x51, 0x47, 0x54, 0x4f, 0x4a, 0x4e, 0x59, 0x5b,
+ 0x47, 0x52, 0x55, 0x56, 0x54, 0x52, 0x65, 0x57, 0x55, 0x55, 0x4c, 0x55,
+ 0x22, 0x28, 0x41, 0x17, 0x26, 0x43, 0x19, 0x23, 0x37, 0x30, 0x2d, 0x35,
+ 0x6a, 0x53, 0x4e, 0x6e, 0x67, 0x62, 0x69, 0x6f, 0x69, 0x6f, 0x75, 0x6f,
+ 0x70, 0x6e, 0x65, 0x5a, 0x4f, 0x49, 0x30, 0x2e, 0x35, 0x58, 0x69, 0x7d,
+ 0x5d, 0x64, 0x70, 0x34, 0x3b, 0x46, 0x2a, 0x31, 0x3b, 0x30, 0x36, 0x41,
+ 0x34, 0x38, 0x46, 0x3a, 0x3d, 0x4b, 0x3b, 0x3f, 0x4a, 0x39, 0x3d, 0x45,
+ 0x3a, 0x3d, 0x45, 0x35, 0x38, 0x3f, 0x38, 0x3b, 0x42, 0x34, 0x37, 0x3e,
+ 0x2a, 0x2d, 0x33, 0x2b, 0x2e, 0x36, 0x27, 0x2a, 0x33, 0x29, 0x2c, 0x35,
+ 0x26, 0x2c, 0x34, 0x27, 0x2b, 0x34, 0x26, 0x29, 0x31, 0x2b, 0x2e, 0x35,
+ 0x2c, 0x30, 0x39, 0x27, 0x2d, 0x33, 0x15, 0x18, 0x1b, 0x13, 0x13, 0x12,
+ 0x13, 0x14, 0x16, 0x13, 0x14, 0x16, 0x11, 0x12, 0x14, 0x13, 0x14, 0x16,
+ 0x0f, 0x11, 0x11, 0x12, 0x14, 0x13, 0x11, 0x13, 0x12, 0x11, 0x13, 0x12,
+ 0x11, 0x15, 0x16, 0x13, 0x14, 0x16, 0x13, 0x14, 0x16, 0x11, 0x12, 0x14,
+ 0x10, 0x11, 0x13, 0x10, 0x11, 0x13, 0x0f, 0x10, 0x12, 0x0f, 0x10, 0x12,
+ 0x0e, 0x0f, 0x11, 0x0f, 0x10, 0x11, 0x10, 0x12, 0x13, 0x12, 0x12, 0x12,
+ 0x0f, 0x10, 0x0f, 0x0f, 0x11, 0x10, 0x0d, 0x0f, 0x0e, 0x1e, 0x22, 0x21,
+ 0x64, 0x67, 0x64, 0x6c, 0x6e, 0x6d, 0x2c, 0x2e, 0x2d, 0x10, 0x11, 0x13,
+ 0x13, 0x14, 0x16, 0x1c, 0x1c, 0x1c, 0x41, 0x40, 0x3e, 0x6d, 0x6c, 0x6a,
+ 0x72, 0x71, 0x6f, 0x53, 0x53, 0x51, 0x36, 0x36, 0x36, 0x51, 0x52, 0x54,
+ 0x57, 0x5b, 0x5c, 0x4c, 0x52, 0x52, 0x57, 0x5d, 0x5d, 0x4d, 0x53, 0x53,
+ 0x57, 0x5b, 0x5c, 0x53, 0x57, 0x5a, 0x4b, 0x50, 0x54, 0x3e, 0x43, 0x46,
+ 0x4e, 0x54, 0x54, 0x50, 0x56, 0x54, 0x50, 0x56, 0x53, 0x63, 0x69, 0x68,
+ 0x3c, 0x46, 0x49, 0x1c, 0x25, 0x2b, 0x41, 0x48, 0x4e, 0x48, 0x4e, 0x56,
+ 0x0f, 0x14, 0x1a, 0x0a, 0x0d, 0x14, 0x0e, 0x11, 0x16, 0x23, 0x26, 0x29,
+ 0x3c, 0x42, 0x42, 0x4c, 0x52, 0x53, 0x50, 0x56, 0x56, 0x4b, 0x50, 0x53,
+ 0x4b, 0x50, 0x53, 0x4b, 0x4f, 0x52, 0x47, 0x4b, 0x4e, 0x42, 0x46, 0x49,
+ 0x40, 0x44, 0x48, 0x46, 0x49, 0x4d, 0x43, 0x46, 0x4b, 0x44, 0x47, 0x4e,
+ 0x46, 0x4b, 0x51, 0x45, 0x4a, 0x4e, 0x44, 0x49, 0x4c, 0x44, 0x49, 0x4c,
+ 0x30, 0x36, 0x34, 0x24, 0x2a, 0x2a, 0x37, 0x3a, 0x3e, 0x29, 0x28, 0x2e,
+ 0x36, 0x32, 0x3b, 0x2f, 0x2a, 0x31, 0x2d, 0x28, 0x2f, 0x31, 0x2c, 0x31,
+ 0x42, 0x3f, 0x44, 0x4b, 0x48, 0x4f, 0x35, 0x32, 0x3b, 0x35, 0x32, 0x3b,
+ 0x35, 0x32, 0x3b, 0x34, 0x33, 0x3b, 0x34, 0x33, 0x39, 0x2b, 0x2a, 0x2f,
+ 0x26, 0x23, 0x2a, 0x2b, 0x28, 0x2f, 0x2a, 0x29, 0x2f, 0x1f, 0x1e, 0x24,
+ 0x19, 0x18, 0x1e, 0x1b, 0x1a, 0x1f, 0x1d, 0x1b, 0x1e, 0x1f, 0x1d, 0x1e,
+ 0x2a, 0x2a, 0x29, 0x40, 0x40, 0x43, 0x3c, 0x3d, 0x45, 0x39, 0x3b, 0x45,
+ 0x36, 0x39, 0x40, 0x35, 0x38, 0x3d, 0x2e, 0x2f, 0x34, 0x2a, 0x2a, 0x31,
+ 0x25, 0x26, 0x2b, 0x22, 0x23, 0x28, 0x1f, 0x20, 0x24, 0x1b, 0x1c, 0x1f,
+ 0x19, 0x1a, 0x1c, 0x0f, 0x10, 0x12, 0x0c, 0x0d, 0x0f, 0x0e, 0x0f, 0x10,
+ 0x0f, 0x0f, 0x0f, 0x11, 0x11, 0x11, 0x0c, 0x0e, 0x0d, 0x0a, 0x0c, 0x0b,
+ 0x14, 0x14, 0x14, 0x17, 0x15, 0x17, 0x19, 0x17, 0x18, 0x1c, 0x18, 0x19,
+ 0x22, 0x22, 0x22, 0x1d, 0x1c, 0x1c, 0x22, 0x22, 0x22, 0x29, 0x27, 0x28,
+ 0x22, 0x20, 0x21, 0x25, 0x23, 0x26, 0x23, 0x20, 0x27, 0x21, 0x1e, 0x24,
+ 0x1d, 0x1e, 0x1b, 0x21, 0x22, 0x21, 0x2b, 0x2a, 0x2f, 0x28, 0x27, 0x2c,
+ 0x23, 0x23, 0x25, 0x1c, 0x1d, 0x1f, 0x27, 0x2a, 0x2d, 0x3b, 0x3e, 0x46,
+ 0x3a, 0x3c, 0x4b, 0x37, 0x39, 0x46, 0x35, 0x34, 0x42, 0x32, 0x32, 0x3e,
+ 0x31, 0x30, 0x3a, 0x1b, 0x1a, 0x21, 0x0e, 0x0e, 0x12, 0x0e, 0x0d, 0x10,
+ 0x0f, 0x0f, 0x11, 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d,
+ 0x0d, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x13, 0x15, 0x14, 0x10, 0x12, 0x11,
+ 0x0d, 0x0f, 0x0e, 0x1a, 0x1e, 0x1f, 0x2d, 0x31, 0x34, 0x38, 0x3c, 0x3f,
+ 0x37, 0x38, 0x3c, 0x34, 0x36, 0x3b, 0x35, 0x38, 0x3f, 0x35, 0x38, 0x3d,
+ 0x36, 0x39, 0x3d, 0x35, 0x39, 0x3b, 0x36, 0x39, 0x3f, 0x37, 0x3a, 0x43,
+ 0x36, 0x3a, 0x3d, 0x33, 0x37, 0x3b, 0x34, 0x38, 0x3b, 0x34, 0x38, 0x3b,
+ 0x34, 0x38, 0x3b, 0x35, 0x39, 0x3c, 0x34, 0x38, 0x3b, 0x31, 0x35, 0x38,
+ 0x33, 0x36, 0x3b, 0x34, 0x37, 0x3c, 0x35, 0x38, 0x3d, 0x32, 0x35, 0x3a,
+ 0x31, 0x34, 0x39, 0x37, 0x3a, 0x3f, 0x36, 0x39, 0x3e, 0x33, 0x37, 0x3a,
+ 0x33, 0x37, 0x38, 0x36, 0x3a, 0x3b, 0x32, 0x38, 0x36, 0x32, 0x37, 0x38,
+ 0x34, 0x39, 0x3d, 0x33, 0x37, 0x3c, 0x2f, 0x35, 0x37, 0x31, 0x37, 0x35,
+ 0x31, 0x36, 0x35, 0x34, 0x38, 0x39, 0x33, 0x37, 0x3a, 0x34, 0x37, 0x3c,
+ 0x33, 0x36, 0x3b, 0x33, 0x37, 0x3a, 0x31, 0x32, 0x36, 0x2f, 0x31, 0x33,
+ 0x30, 0x35, 0x35, 0x30, 0x36, 0x36, 0x2f, 0x35, 0x35, 0x2e, 0x33, 0x34,
+ 0x30, 0x36, 0x36, 0x30, 0x34, 0x36, 0x30, 0x35, 0x37, 0x2f, 0x33, 0x36,
+ 0x2c, 0x34, 0x35, 0x2c, 0x34, 0x35, 0x29, 0x32, 0x31, 0x2b, 0x31, 0x2f,
+ 0x29, 0x2f, 0x2f, 0x29, 0x2f, 0x2f, 0x29, 0x2e, 0x31, 0x25, 0x2a, 0x2e,
+ 0x22, 0x26, 0x2a, 0x23, 0x28, 0x2b, 0x25, 0x2c, 0x2c, 0x2c, 0x34, 0x31,
+ 0x2a, 0x30, 0x2e, 0x27, 0x2d, 0x2d, 0x29, 0x2d, 0x30, 0x28, 0x2b, 0x30,
+ 0x26, 0x2c, 0x2f, 0x2d, 0x32, 0x36, 0x31, 0x39, 0x3c, 0x32, 0x38, 0x3c,
+ 0x32, 0x37, 0x3b, 0x32, 0x36, 0x3a, 0x33, 0x36, 0x3b, 0x37, 0x38, 0x3d,
+ 0x31, 0x35, 0x38, 0x31, 0x34, 0x39, 0x30, 0x35, 0x3b, 0x30, 0x35, 0x3b,
+ 0x30, 0x35, 0x3b, 0x2e, 0x33, 0x37, 0x30, 0x35, 0x37, 0x32, 0x33, 0x34,
+ 0x36, 0x2d, 0x2c, 0x35, 0x2b, 0x29, 0x37, 0x2c, 0x28, 0x3a, 0x2e, 0x2a,
+ 0x37, 0x2c, 0x28, 0x35, 0x2d, 0x28, 0x30, 0x2b, 0x27, 0x34, 0x31, 0x2c,
+ 0x36, 0x33, 0x30, 0x2e, 0x2d, 0x30, 0x1e, 0x21, 0x29, 0x16, 0x1d, 0x25,
+ 0x21, 0x28, 0x2e, 0x47, 0x50, 0x57, 0x6b, 0x77, 0x83, 0x67, 0x77, 0x87,
+ 0x35, 0x3b, 0x48, 0x26, 0x31, 0x43, 0x1b, 0x2e, 0x46, 0x17, 0x2b, 0x4b,
+ 0x16, 0x2a, 0x4d, 0x22, 0x36, 0x55, 0x20, 0x34, 0x4d, 0x1d, 0x32, 0x47,
+ 0x2b, 0x3d, 0x56, 0x22, 0x36, 0x4e, 0x1e, 0x33, 0x4d, 0x1c, 0x33, 0x52,
+ 0x1d, 0x34, 0x54, 0x1b, 0x33, 0x52, 0x1a, 0x30, 0x4f, 0x17, 0x2c, 0x49,
+ 0x17, 0x2d, 0x50, 0x14, 0x2f, 0x54, 0x16, 0x2c, 0x50, 0x33, 0x36, 0x48,
+ 0x66, 0x55, 0x50, 0x7b, 0x63, 0x52, 0x79, 0x6f, 0x62, 0x66, 0x6a, 0x66,
+ 0x70, 0x77, 0x6f, 0x6d, 0x65, 0x5c, 0x6c, 0x5a, 0x53, 0x56, 0x4d, 0x56,
+ 0x24, 0x2c, 0x47, 0x18, 0x27, 0x44, 0x1e, 0x22, 0x33, 0x4b, 0x3e, 0x41,
+ 0x75, 0x6e, 0x64, 0x78, 0x7d, 0x76, 0x75, 0x79, 0x80, 0x72, 0x76, 0x81,
+ 0x71, 0x76, 0x70, 0x66, 0x5d, 0x4f, 0x3a, 0x33, 0x35, 0x32, 0x45, 0x5b,
+ 0x72, 0x7f, 0x9d, 0x64, 0x6f, 0x84, 0x3a, 0x46, 0x4c, 0x2c, 0x34, 0x34,
+ 0x37, 0x3b, 0x3a, 0x3f, 0x3f, 0x42, 0x40, 0x3d, 0x45, 0x41, 0x3c, 0x46,
+ 0x3a, 0x3c, 0x45, 0x38, 0x3b, 0x44, 0x37, 0x3a, 0x43, 0x43, 0x46, 0x4f,
+ 0x32, 0x35, 0x3e, 0x2a, 0x2d, 0x35, 0x2a, 0x2d, 0x36, 0x2a, 0x2f, 0x37,
+ 0x26, 0x2d, 0x35, 0x27, 0x2a, 0x33, 0x28, 0x2b, 0x33, 0x2d, 0x30, 0x37,
+ 0x2b, 0x2f, 0x38, 0x27, 0x2c, 0x32, 0x18, 0x1b, 0x1d, 0x12, 0x12, 0x10,
+ 0x15, 0x16, 0x18, 0x17, 0x18, 0x1a, 0x11, 0x12, 0x14, 0x10, 0x11, 0x13,
+ 0x11, 0x12, 0x13, 0x10, 0x12, 0x11, 0x11, 0x12, 0x12, 0x0f, 0x11, 0x10,
+ 0x0e, 0x0f, 0x11, 0x12, 0x13, 0x15, 0x13, 0x14, 0x16, 0x14, 0x15, 0x17,
+ 0x13, 0x14, 0x16, 0x11, 0x12, 0x14, 0x0e, 0x0f, 0x11, 0x0f, 0x10, 0x12,
+ 0x0f, 0x10, 0x12, 0x0e, 0x0f, 0x11, 0x0f, 0x10, 0x12, 0x0f, 0x10, 0x11,
+ 0x0d, 0x0f, 0x0e, 0x0b, 0x0d, 0x0c, 0x10, 0x12, 0x11, 0x3d, 0x41, 0x40,
+ 0x65, 0x69, 0x68, 0x48, 0x4d, 0x4e, 0x25, 0x29, 0x2c, 0x20, 0x24, 0x27,
+ 0x1d, 0x21, 0x23, 0x1c, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x4a, 0x49, 0x4a,
+ 0x68, 0x68, 0x68, 0x2e, 0x30, 0x30, 0x45, 0x48, 0x4a, 0x5e, 0x63, 0x65,
+ 0x52, 0x57, 0x5a, 0x59, 0x5e, 0x61, 0x4d, 0x53, 0x55, 0x53, 0x58, 0x5b,
+ 0x41, 0x46, 0x4a, 0x27, 0x2c, 0x30, 0x28, 0x2d, 0x31, 0x58, 0x5e, 0x5e,
+ 0x4b, 0x52, 0x4e, 0x52, 0x58, 0x54, 0x6c, 0x72, 0x72, 0x4d, 0x52, 0x55,
+ 0x2d, 0x37, 0x3c, 0x47, 0x51, 0x56, 0x40, 0x48, 0x4f, 0x1a, 0x22, 0x29,
+ 0x0c, 0x11, 0x18, 0x0e, 0x11, 0x18, 0x10, 0x11, 0x16, 0x0d, 0x0f, 0x13,
+ 0x0e, 0x13, 0x16, 0x20, 0x25, 0x28, 0x30, 0x35, 0x38, 0x3e, 0x44, 0x44,
+ 0x4e, 0x53, 0x56, 0x4e, 0x52, 0x55, 0x4f, 0x53, 0x56, 0x4f, 0x53, 0x57,
+ 0x52, 0x57, 0x59, 0x4d, 0x51, 0x57, 0x48, 0x4c, 0x55, 0x44, 0x49, 0x53,
+ 0x38, 0x3c, 0x47, 0x37, 0x3e, 0x46, 0x25, 0x2d, 0x31, 0x19, 0x21, 0x22,
+ 0x09, 0x12, 0x0f, 0x1c, 0x23, 0x24, 0x4a, 0x4c, 0x52, 0x3b, 0x39, 0x44,
+ 0x23, 0x1f, 0x2a, 0x28, 0x24, 0x2c, 0x39, 0x35, 0x39, 0x30, 0x2e, 0x2f,
+ 0x3a, 0x39, 0x3d, 0x44, 0x41, 0x49, 0x3e, 0x3b, 0x44, 0x37, 0x34, 0x3d,
+ 0x33, 0x32, 0x3a, 0x35, 0x34, 0x3a, 0x35, 0x34, 0x39, 0x2e, 0x2d, 0x32,
+ 0x2b, 0x28, 0x2f, 0x2b, 0x28, 0x2f, 0x25, 0x23, 0x2a, 0x1a, 0x19, 0x1e,
+ 0x1b, 0x19, 0x1e, 0x1e, 0x1d, 0x22, 0x1b, 0x19, 0x1c, 0x1d, 0x1b, 0x1c,
+ 0x29, 0x29, 0x27, 0x3f, 0x41, 0x42, 0x3b, 0x3b, 0x43, 0x38, 0x3b, 0x44,
+ 0x35, 0x38, 0x3f, 0x32, 0x35, 0x3a, 0x2f, 0x30, 0x35, 0x28, 0x28, 0x2f,
+ 0x25, 0x26, 0x2b, 0x23, 0x24, 0x28, 0x21, 0x22, 0x25, 0x1a, 0x1b, 0x1d,
+ 0x0f, 0x11, 0x10, 0x0e, 0x10, 0x10, 0x13, 0x15, 0x14, 0x12, 0x14, 0x13,
+ 0x12, 0x14, 0x13, 0x12, 0x14, 0x13, 0x0c, 0x0e, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x12, 0x12, 0x12, 0x17, 0x15, 0x16, 0x18, 0x16, 0x17, 0x26, 0x23, 0x24,
+ 0x35, 0x35, 0x37, 0x25, 0x25, 0x27, 0x55, 0x55, 0x57, 0x29, 0x29, 0x2b,
+ 0x2b, 0x29, 0x2c, 0x47, 0x45, 0x4a, 0x21, 0x1e, 0x25, 0x1f, 0x1c, 0x22,
+ 0x1b, 0x1c, 0x1a, 0x26, 0x27, 0x27, 0x2d, 0x2e, 0x32, 0x25, 0x25, 0x29,
+ 0x1e, 0x1f, 0x22, 0x1b, 0x1c, 0x20, 0x2f, 0x32, 0x37, 0x3f, 0x41, 0x4b,
+ 0x34, 0x34, 0x43, 0x33, 0x32, 0x42, 0x33, 0x31, 0x40, 0x33, 0x33, 0x3f,
+ 0x32, 0x32, 0x3c, 0x1a, 0x1a, 0x22, 0x10, 0x0f, 0x15, 0x0d, 0x0c, 0x11,
+ 0x0e, 0x0e, 0x0f, 0x0d, 0x0d, 0x0e, 0x09, 0x09, 0x0b, 0x09, 0x09, 0x0b,
+ 0x0a, 0x0a, 0x0c, 0x09, 0x09, 0x09, 0x0c, 0x0c, 0x0c, 0x0e, 0x0e, 0x0e,
+ 0x0e, 0x0e, 0x10, 0x0d, 0x0d, 0x0d, 0x0c, 0x0e, 0x0d, 0x0c, 0x11, 0x0d,
+ 0x11, 0x16, 0x14, 0x22, 0x26, 0x27, 0x32, 0x36, 0x3a, 0x39, 0x3c, 0x41,
+ 0x34, 0x37, 0x3c, 0x31, 0x34, 0x3a, 0x32, 0x35, 0x3c, 0x32, 0x35, 0x3a,
+ 0x36, 0x37, 0x3b, 0x37, 0x38, 0x3b, 0x36, 0x37, 0x3d, 0x38, 0x38, 0x42,
+ 0x36, 0x3a, 0x3d, 0x33, 0x37, 0x3a, 0x33, 0x37, 0x3a, 0x35, 0x39, 0x3d,
+ 0x33, 0x37, 0x3a, 0x34, 0x38, 0x3b, 0x35, 0x39, 0x3c, 0x35, 0x39, 0x3c,
+ 0x33, 0x37, 0x3a, 0x30, 0x34, 0x37, 0x32, 0x36, 0x39, 0x31, 0x35, 0x38,
+ 0x34, 0x38, 0x3b, 0x35, 0x39, 0x3c, 0x31, 0x35, 0x39, 0x31, 0x35, 0x37,
+ 0x31, 0x37, 0x34, 0x32, 0x38, 0x34, 0x34, 0x3a, 0x38, 0x31, 0x37, 0x37,
+ 0x32, 0x37, 0x3a, 0x32, 0x37, 0x3b, 0x31, 0x35, 0x38, 0x32, 0x36, 0x39,
+ 0x33, 0x37, 0x38, 0x34, 0x38, 0x3b, 0x33, 0x37, 0x3a, 0x31, 0x35, 0x38,
+ 0x32, 0x36, 0x39, 0x31, 0x35, 0x37, 0x32, 0x33, 0x36, 0x31, 0x32, 0x34,
+ 0x2f, 0x34, 0x34, 0x2e, 0x34, 0x34, 0x2f, 0x35, 0x35, 0x31, 0x37, 0x37,
+ 0x31, 0x37, 0x37, 0x30, 0x36, 0x36, 0x30, 0x35, 0x36, 0x2e, 0x34, 0x34,
+ 0x29, 0x33, 0x32, 0x27, 0x30, 0x2f, 0x28, 0x31, 0x30, 0x2a, 0x32, 0x30,
+ 0x2e, 0x35, 0x34, 0x2a, 0x2f, 0x30, 0x28, 0x2d, 0x30, 0x2b, 0x30, 0x33,
+ 0x29, 0x2e, 0x2f, 0x24, 0x2a, 0x2a, 0x24, 0x2a, 0x2a, 0x27, 0x2d, 0x2d,
+ 0x29, 0x2e, 0x2e, 0x2a, 0x2e, 0x2f, 0x2a, 0x2e, 0x31, 0x27, 0x2a, 0x2f,
+ 0x2d, 0x34, 0x38, 0x32, 0x3a, 0x3d, 0x30, 0x38, 0x3b, 0x30, 0x38, 0x3b,
+ 0x2f, 0x34, 0x38, 0x30, 0x33, 0x38, 0x32, 0x34, 0x39, 0x33, 0x34, 0x39,
+ 0x31, 0x32, 0x36, 0x31, 0x34, 0x39, 0x30, 0x34, 0x39, 0x2e, 0x35, 0x3b,
+ 0x2f, 0x36, 0x3c, 0x2b, 0x33, 0x36, 0x2d, 0x32, 0x36, 0x2f, 0x34, 0x36,
+ 0x32, 0x2f, 0x2e, 0x30, 0x2c, 0x2b, 0x33, 0x2e, 0x2b, 0x35, 0x2d, 0x2a,
+ 0x33, 0x2b, 0x28, 0x2e, 0x29, 0x25, 0x2c, 0x2a, 0x25, 0x31, 0x30, 0x2d,
+ 0x36, 0x36, 0x36, 0x27, 0x28, 0x2e, 0x18, 0x1b, 0x24, 0x15, 0x19, 0x22,
+ 0x13, 0x18, 0x1e, 0x13, 0x1c, 0x21, 0x3c, 0x4c, 0x53, 0x6d, 0x7f, 0x8b,
+ 0x62, 0x58, 0x4e, 0x45, 0x42, 0x46, 0x27, 0x2f, 0x49, 0x20, 0x31, 0x53,
+ 0x18, 0x30, 0x4d, 0x1d, 0x35, 0x4d, 0x1b, 0x34, 0x4d, 0x1c, 0x33, 0x52,
+ 0x27, 0x3b, 0x57, 0x21, 0x36, 0x53, 0x1b, 0x32, 0x51, 0x19, 0x32, 0x51,
+ 0x1d, 0x36, 0x56, 0x1c, 0x35, 0x54, 0x1c, 0x33, 0x53, 0x1c, 0x33, 0x53,
+ 0x1a, 0x32, 0x51, 0x14, 0x30, 0x55, 0x15, 0x31, 0x57, 0x2b, 0x36, 0x4f,
+ 0x5c, 0x50, 0x54, 0x80, 0x68, 0x5e, 0x9c, 0x87, 0x7b, 0x9d, 0x90, 0x86,
+ 0xa3, 0x97, 0x88, 0x84, 0x73, 0x65, 0x6d, 0x5c, 0x58, 0x41, 0x3f, 0x50,
+ 0x1b, 0x2a, 0x4c, 0x19, 0x2c, 0x4e, 0x21, 0x25, 0x36, 0x57, 0x4b, 0x4b,
+ 0x7e, 0x7b, 0x76, 0x7f, 0x84, 0x7d, 0x82, 0x80, 0x83, 0x7a, 0x78, 0x7d,
+ 0x72, 0x72, 0x6a, 0x62, 0x59, 0x4d, 0x3c, 0x3a, 0x42, 0x26, 0x3f, 0x5d,
+ 0x34, 0x4e, 0x76, 0x67, 0x7e, 0x9d, 0x67, 0x7a, 0x88, 0x45, 0x53, 0x56,
+ 0x3a, 0x42, 0x41, 0x3e, 0x40, 0x42, 0x40, 0x3d, 0x42, 0x42, 0x3d, 0x44,
+ 0x3e, 0x3d, 0x48, 0x3a, 0x3c, 0x48, 0x38, 0x3a, 0x45, 0x39, 0x3b, 0x47,
+ 0x33, 0x35, 0x41, 0x29, 0x2c, 0x36, 0x29, 0x2d, 0x36, 0x2a, 0x2e, 0x37,
+ 0x2a, 0x31, 0x39, 0x2b, 0x30, 0x37, 0x28, 0x2b, 0x32, 0x30, 0x33, 0x3a,
+ 0x31, 0x35, 0x3e, 0x2a, 0x2f, 0x35, 0x1b, 0x1f, 0x21, 0x12, 0x14, 0x14,
+ 0x17, 0x18, 0x19, 0x14, 0x15, 0x17, 0x13, 0x14, 0x16, 0x0f, 0x10, 0x12,
+ 0x12, 0x13, 0x15, 0x11, 0x12, 0x14, 0x10, 0x11, 0x13, 0x10, 0x11, 0x12,
+ 0x0f, 0x10, 0x12, 0x11, 0x12, 0x14, 0x11, 0x12, 0x14, 0x11, 0x12, 0x14,
+ 0x13, 0x14, 0x16, 0x11, 0x12, 0x14, 0x0f, 0x10, 0x12, 0x10, 0x11, 0x13,
+ 0x0f, 0x11, 0x12, 0x0d, 0x0f, 0x10, 0x0d, 0x0e, 0x10, 0x0f, 0x0f, 0x11,
+ 0x0b, 0x0d, 0x0c, 0x0e, 0x10, 0x0f, 0x33, 0x35, 0x35, 0x5b, 0x5f, 0x5e,
+ 0x3a, 0x43, 0x44, 0x1a, 0x22, 0x25, 0x39, 0x41, 0x45, 0x28, 0x2f, 0x34,
+ 0x11, 0x16, 0x1c, 0x14, 0x18, 0x1c, 0x14, 0x18, 0x1b, 0x18, 0x1a, 0x1d,
+ 0x33, 0x37, 0x39, 0x50, 0x54, 0x57, 0x44, 0x4a, 0x4d, 0x46, 0x4f, 0x51,
+ 0x5e, 0x66, 0x69, 0x2f, 0x39, 0x3b, 0x24, 0x2c, 0x2f, 0x53, 0x5b, 0x5e,
+ 0x43, 0x4c, 0x51, 0x2c, 0x35, 0x3a, 0x26, 0x30, 0x32, 0x4b, 0x55, 0x54,
+ 0x5c, 0x67, 0x63, 0x62, 0x6c, 0x69, 0x52, 0x5b, 0x5e, 0x53, 0x5c, 0x62,
+ 0x48, 0x51, 0x57, 0x23, 0x2d, 0x33, 0x16, 0x1d, 0x25, 0x0b, 0x12, 0x1a,
+ 0x0e, 0x13, 0x18, 0x0d, 0x10, 0x17, 0x0f, 0x10, 0x16, 0x0f, 0x10, 0x15,
+ 0x09, 0x0e, 0x12, 0x0b, 0x10, 0x13, 0x0e, 0x13, 0x16, 0x14, 0x18, 0x19,
+ 0x1f, 0x23, 0x26, 0x22, 0x26, 0x29, 0x27, 0x2a, 0x2f, 0x29, 0x2b, 0x31,
+ 0x2e, 0x33, 0x37, 0x28, 0x2d, 0x33, 0x25, 0x29, 0x34, 0x1d, 0x23, 0x2f,
+ 0x10, 0x16, 0x22, 0x12, 0x19, 0x23, 0x0e, 0x15, 0x1b, 0x09, 0x11, 0x14,
+ 0x08, 0x10, 0x12, 0x25, 0x2b, 0x2f, 0x51, 0x53, 0x5b, 0x3d, 0x3b, 0x46,
+ 0x1f, 0x1b, 0x26, 0x27, 0x22, 0x2a, 0x47, 0x44, 0x47, 0x3e, 0x3d, 0x3c,
+ 0x3c, 0x3b, 0x3f, 0x3d, 0x3b, 0x41, 0x3d, 0x3a, 0x41, 0x33, 0x30, 0x39,
+ 0x32, 0x31, 0x39, 0x2f, 0x2e, 0x34, 0x30, 0x2f, 0x33, 0x2a, 0x2a, 0x2c,
+ 0x28, 0x27, 0x2d, 0x20, 0x1f, 0x25, 0x1d, 0x1b, 0x21, 0x1e, 0x1b, 0x22,
+ 0x25, 0x23, 0x28, 0x26, 0x25, 0x28, 0x1d, 0x1d, 0x1f, 0x18, 0x18, 0x17,
+ 0x20, 0x20, 0x1e, 0x3d, 0x3e, 0x41, 0x3e, 0x3f, 0x46, 0x3a, 0x3d, 0x46,
+ 0x35, 0x38, 0x40, 0x32, 0x35, 0x3a, 0x2f, 0x30, 0x36, 0x2a, 0x2a, 0x31,
+ 0x24, 0x25, 0x2b, 0x24, 0x25, 0x29, 0x1d, 0x1e, 0x22, 0x15, 0x16, 0x18,
+ 0x0a, 0x0c, 0x0b, 0x10, 0x12, 0x11, 0x16, 0x18, 0x17, 0x17, 0x19, 0x18,
+ 0x1a, 0x1d, 0x1c, 0x19, 0x1b, 0x1a, 0x0f, 0x12, 0x10, 0x0e, 0x0e, 0x0e,
+ 0x15, 0x15, 0x15, 0x18, 0x16, 0x17, 0x18, 0x15, 0x16, 0x28, 0x26, 0x27,
+ 0x38, 0x38, 0x3a, 0x39, 0x39, 0x3b, 0x66, 0x66, 0x68, 0x23, 0x23, 0x25,
+ 0x40, 0x3e, 0x41, 0x5c, 0x5a, 0x5e, 0x23, 0x21, 0x27, 0x21, 0x1f, 0x25,
+ 0x21, 0x22, 0x22, 0x23, 0x25, 0x28, 0x2b, 0x2c, 0x31, 0x26, 0x27, 0x2c,
+ 0x1d, 0x1e, 0x23, 0x19, 0x1a, 0x1f, 0x2b, 0x2e, 0x37, 0x3c, 0x3d, 0x4a,
+ 0x30, 0x30, 0x3e, 0x34, 0x32, 0x41, 0x33, 0x32, 0x40, 0x30, 0x31, 0x3d,
+ 0x2d, 0x2d, 0x37, 0x14, 0x14, 0x1b, 0x10, 0x0f, 0x15, 0x0e, 0x0d, 0x12,
+ 0x0c, 0x0c, 0x0d, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0e, 0x0c, 0x0c, 0x0e,
+ 0x0a, 0x0a, 0x0c, 0x0a, 0x0a, 0x0a, 0x0e, 0x0e, 0x0e, 0x10, 0x0f, 0x0e,
+ 0x10, 0x0f, 0x0d, 0x0d, 0x0d, 0x0a, 0x0b, 0x0d, 0x0b, 0x0a, 0x0e, 0x0d,
+ 0x1a, 0x1e, 0x1f, 0x2c, 0x31, 0x34, 0x35, 0x3a, 0x3e, 0x35, 0x38, 0x3d,
+ 0x34, 0x38, 0x3b, 0x34, 0x37, 0x3b, 0x34, 0x37, 0x3c, 0x33, 0x36, 0x39,
+ 0x34, 0x36, 0x37, 0x35, 0x36, 0x39, 0x34, 0x35, 0x39, 0x35, 0x37, 0x3b,
+ 0x32, 0x35, 0x39, 0x32, 0x36, 0x39, 0x33, 0x36, 0x3b, 0x34, 0x37, 0x3c,
+ 0x33, 0x36, 0x3b, 0x35, 0x38, 0x3c, 0x39, 0x3d, 0x40, 0x38, 0x3c, 0x3f,
+ 0x33, 0x37, 0x38, 0x33, 0x37, 0x38, 0x33, 0x37, 0x38, 0x33, 0x37, 0x38,
+ 0x31, 0x35, 0x36, 0x31, 0x35, 0x36, 0x31, 0x35, 0x36, 0x31, 0x35, 0x35,
+ 0x2f, 0x35, 0x31, 0x31, 0x37, 0x35, 0x33, 0x39, 0x39, 0x2e, 0x36, 0x36,
+ 0x2f, 0x34, 0x37, 0x31, 0x36, 0x39, 0x32, 0x35, 0x38, 0x34, 0x36, 0x3a,
+ 0x31, 0x35, 0x39, 0x31, 0x37, 0x3a, 0x30, 0x35, 0x38, 0x2f, 0x34, 0x37,
+ 0x31, 0x36, 0x39, 0x2f, 0x34, 0x37, 0x30, 0x34, 0x35, 0x31, 0x35, 0x36,
+ 0x2e, 0x33, 0x33, 0x2d, 0x33, 0x34, 0x30, 0x36, 0x36, 0x30, 0x36, 0x36,
+ 0x2e, 0x34, 0x34, 0x2d, 0x33, 0x33, 0x2d, 0x33, 0x33, 0x2d, 0x33, 0x31,
+ 0x29, 0x32, 0x31, 0x28, 0x30, 0x30, 0x29, 0x32, 0x31, 0x2a, 0x33, 0x32,
+ 0x2c, 0x32, 0x32, 0x2c, 0x31, 0x33, 0x2a, 0x2f, 0x32, 0x2a, 0x2f, 0x32,
+ 0x29, 0x2f, 0x2f, 0x27, 0x2d, 0x2d, 0x26, 0x2c, 0x2c, 0x25, 0x29, 0x2a,
+ 0x24, 0x28, 0x2b, 0x24, 0x28, 0x2b, 0x25, 0x29, 0x2c, 0x28, 0x2c, 0x30,
+ 0x32, 0x3a, 0x3d, 0x33, 0x3b, 0x3e, 0x2d, 0x35, 0x38, 0x2e, 0x36, 0x39,
+ 0x30, 0x35, 0x39, 0x2f, 0x32, 0x37, 0x33, 0x34, 0x39, 0x32, 0x33, 0x37,
+ 0x31, 0x32, 0x36, 0x31, 0x32, 0x37, 0x30, 0x34, 0x39, 0x2e, 0x35, 0x3b,
+ 0x2d, 0x34, 0x3b, 0x2c, 0x34, 0x37, 0x2c, 0x32, 0x36, 0x2f, 0x34, 0x37,
+ 0x2c, 0x31, 0x32, 0x29, 0x2c, 0x2b, 0x2f, 0x2c, 0x2b, 0x2f, 0x2a, 0x27,
+ 0x2f, 0x2a, 0x27, 0x2e, 0x29, 0x26, 0x2e, 0x2a, 0x27, 0x2e, 0x2d, 0x29,
+ 0x2c, 0x2e, 0x2f, 0x1b, 0x1e, 0x24, 0x13, 0x17, 0x20, 0x14, 0x18, 0x21,
+ 0x14, 0x19, 0x1d, 0x29, 0x31, 0x33, 0x5c, 0x69, 0x6f, 0x61, 0x73, 0x7d,
+ 0x78, 0x61, 0x43, 0x67, 0x57, 0x51, 0x3a, 0x3b, 0x53, 0x22, 0x31, 0x54,
+ 0x1a, 0x34, 0x4f, 0x17, 0x33, 0x49, 0x1a, 0x35, 0x52, 0x1f, 0x37, 0x5d,
+ 0x22, 0x37, 0x55, 0x1f, 0x36, 0x56, 0x1a, 0x33, 0x57, 0x19, 0x34, 0x56,
+ 0x1a, 0x35, 0x55, 0x1b, 0x35, 0x53, 0x1f, 0x36, 0x58, 0x1f, 0x33, 0x58,
+ 0x18, 0x2f, 0x4f, 0x13, 0x30, 0x52, 0x18, 0x37, 0x5b, 0x21, 0x36, 0x55,
+ 0x3e, 0x41, 0x52, 0x60, 0x55, 0x5a, 0x7f, 0x6d, 0x6b, 0x93, 0x81, 0x7d,
+ 0x8f, 0x81, 0x76, 0x72, 0x65, 0x61, 0x51, 0x4b, 0x55, 0x23, 0x2e, 0x4b,
+ 0x14, 0x2b, 0x54, 0x19, 0x30, 0x57, 0x19, 0x25, 0x3a, 0x42, 0x3e, 0x45,
+ 0x89, 0x78, 0x7a, 0xa7, 0x9c, 0x94, 0xa8, 0x9f, 0x91, 0x99, 0x8d, 0x7e,
+ 0x7c, 0x70, 0x64, 0x4d, 0x43, 0x43, 0x32, 0x38, 0x4d, 0x50, 0x6d, 0x90,
+ 0x27, 0x44, 0x63, 0x24, 0x40, 0x5a, 0x52, 0x68, 0x7b, 0x5a, 0x6b, 0x7c,
+ 0x48, 0x52, 0x62, 0x43, 0x4b, 0x55, 0x42, 0x49, 0x50, 0x3b, 0x43, 0x46,
+ 0x3c, 0x3c, 0x46, 0x39, 0x3a, 0x44, 0x36, 0x39, 0x44, 0x31, 0x33, 0x3f,
+ 0x30, 0x33, 0x3f, 0x2b, 0x2f, 0x3a, 0x2a, 0x2e, 0x39, 0x26, 0x2c, 0x35,
+ 0x27, 0x2e, 0x35, 0x2c, 0x31, 0x37, 0x2c, 0x2f, 0x36, 0x2e, 0x31, 0x3a,
+ 0x34, 0x38, 0x41, 0x2a, 0x31, 0x38, 0x1c, 0x21, 0x25, 0x14, 0x18, 0x19,
+ 0x14, 0x15, 0x17, 0x14, 0x15, 0x17, 0x12, 0x13, 0x15, 0x10, 0x11, 0x13,
+ 0x13, 0x14, 0x16, 0x0f, 0x10, 0x12, 0x0d, 0x0e, 0x10, 0x0f, 0x10, 0x12,
+ 0x13, 0x14, 0x16, 0x10, 0x11, 0x13, 0x13, 0x14, 0x16, 0x11, 0x12, 0x14,
+ 0x0f, 0x10, 0x12, 0x10, 0x11, 0x13, 0x0d, 0x0e, 0x10, 0x13, 0x13, 0x15,
+ 0x10, 0x11, 0x10, 0x0c, 0x0f, 0x0d, 0x0d, 0x0f, 0x0e, 0x0d, 0x0d, 0x0f,
+ 0x11, 0x11, 0x13, 0x37, 0x38, 0x3a, 0x57, 0x58, 0x5a, 0x3a, 0x3e, 0x3f,
+ 0x11, 0x1b, 0x1d, 0x3c, 0x46, 0x48, 0x59, 0x62, 0x66, 0x1f, 0x28, 0x2f,
+ 0x0c, 0x13, 0x19, 0x0f, 0x16, 0x1c, 0x0f, 0x15, 0x18, 0x22, 0x27, 0x2a,
+ 0x52, 0x57, 0x5a, 0x4a, 0x4f, 0x52, 0x24, 0x2c, 0x2f, 0x15, 0x1f, 0x21,
+ 0x28, 0x32, 0x36, 0x38, 0x41, 0x46, 0x5a, 0x62, 0x65, 0x5a, 0x62, 0x65,
+ 0x4a, 0x55, 0x59, 0x58, 0x62, 0x66, 0x33, 0x3d, 0x3f, 0x2c, 0x36, 0x37,
+ 0x56, 0x60, 0x5f, 0x63, 0x6d, 0x6d, 0x47, 0x51, 0x56, 0x54, 0x5d, 0x67,
+ 0x46, 0x4f, 0x56, 0x14, 0x1d, 0x22, 0x0a, 0x11, 0x18, 0x0f, 0x14, 0x1a,
+ 0x0f, 0x14, 0x19, 0x10, 0x13, 0x18, 0x0f, 0x12, 0x17, 0x11, 0x13, 0x18,
+ 0x0e, 0x11, 0x16, 0x0d, 0x10, 0x15, 0x0d, 0x11, 0x14, 0x0b, 0x0e, 0x10,
+ 0x0d, 0x11, 0x12, 0x0e, 0x12, 0x15, 0x0f, 0x11, 0x16, 0x0f, 0x10, 0x17,
+ 0x0e, 0x13, 0x17, 0x0c, 0x11, 0x17, 0x0c, 0x11, 0x19, 0x0d, 0x14, 0x1e,
+ 0x0f, 0x16, 0x20, 0x0c, 0x13, 0x1d, 0x0c, 0x13, 0x1b, 0x10, 0x17, 0x1d,
+ 0x0f, 0x17, 0x1c, 0x2c, 0x31, 0x38, 0x45, 0x45, 0x4f, 0x29, 0x25, 0x2e,
+ 0x20, 0x1b, 0x23, 0x26, 0x21, 0x27, 0x46, 0x43, 0x44, 0x48, 0x47, 0x45,
+ 0x48, 0x46, 0x47, 0x42, 0x40, 0x43, 0x3a, 0x38, 0x3d, 0x33, 0x30, 0x38,
+ 0x33, 0x30, 0x37, 0x2c, 0x2b, 0x31, 0x2b, 0x29, 0x2f, 0x29, 0x28, 0x2d,
+ 0x21, 0x20, 0x26, 0x1d, 0x1c, 0x22, 0x1e, 0x1c, 0x22, 0x1e, 0x1c, 0x21,
+ 0x31, 0x2f, 0x34, 0x2a, 0x27, 0x2a, 0x1b, 0x1b, 0x1d, 0x18, 0x18, 0x18,
+ 0x1b, 0x1c, 0x1b, 0x3d, 0x3e, 0x40, 0x3e, 0x3e, 0x46, 0x38, 0x3b, 0x45,
+ 0x36, 0x39, 0x41, 0x32, 0x34, 0x3c, 0x30, 0x30, 0x37, 0x29, 0x29, 0x31,
+ 0x25, 0x26, 0x2b, 0x20, 0x21, 0x26, 0x1a, 0x1b, 0x1f, 0x0f, 0x11, 0x12,
+ 0x09, 0x0b, 0x0a, 0x0b, 0x0d, 0x0c, 0x0d, 0x0e, 0x0d, 0x12, 0x15, 0x14,
+ 0x13, 0x17, 0x16, 0x16, 0x19, 0x18, 0x10, 0x12, 0x11, 0x10, 0x10, 0x10,
+ 0x15, 0x14, 0x14, 0x17, 0x15, 0x16, 0x1a, 0x1a, 0x1a, 0x22, 0x22, 0x22,
+ 0x22, 0x20, 0x21, 0x36, 0x34, 0x35, 0x58, 0x56, 0x58, 0x23, 0x21, 0x24,
+ 0x3d, 0x3b, 0x3e, 0x41, 0x3f, 0x41, 0x22, 0x20, 0x24, 0x30, 0x2f, 0x33,
+ 0x26, 0x26, 0x28, 0x26, 0x26, 0x2c, 0x27, 0x27, 0x2f, 0x29, 0x29, 0x31,
+ 0x24, 0x24, 0x2a, 0x23, 0x24, 0x29, 0x3d, 0x40, 0x49, 0x39, 0x3b, 0x47,
+ 0x25, 0x23, 0x30, 0x37, 0x36, 0x42, 0x32, 0x33, 0x3d, 0x28, 0x2a, 0x33,
+ 0x2a, 0x2d, 0x33, 0x11, 0x12, 0x17, 0x0f, 0x0e, 0x13, 0x0f, 0x0d, 0x10,
+ 0x0c, 0x0c, 0x0a, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0d,
+ 0x09, 0x09, 0x0b, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0c, 0x10, 0x11, 0x0c,
+ 0x1c, 0x1a, 0x11, 0x20, 0x20, 0x18, 0x1b, 0x1d, 0x1a, 0x18, 0x1c, 0x1d,
+ 0x22, 0x26, 0x2a, 0x34, 0x39, 0x3d, 0x3d, 0x40, 0x45, 0x38, 0x3b, 0x3f,
+ 0x36, 0x3a, 0x3b, 0x32, 0x36, 0x39, 0x35, 0x39, 0x3c, 0x35, 0x39, 0x3a,
+ 0x32, 0x36, 0x35, 0x34, 0x38, 0x37, 0x39, 0x3a, 0x3c, 0x37, 0x39, 0x3c,
+ 0x33, 0x37, 0x3a, 0x32, 0x36, 0x39, 0x39, 0x3c, 0x41, 0x3a, 0x3d, 0x44,
+ 0x37, 0x3a, 0x41, 0x35, 0x38, 0x3d, 0x34, 0x38, 0x3b, 0x33, 0x37, 0x38,
+ 0x32, 0x36, 0x37, 0x34, 0x38, 0x39, 0x32, 0x36, 0x37, 0x35, 0x39, 0x3a,
+ 0x30, 0x34, 0x35, 0x31, 0x35, 0x36, 0x31, 0x35, 0x34, 0x31, 0x35, 0x34,
+ 0x2e, 0x33, 0x2f, 0x2e, 0x34, 0x35, 0x31, 0x36, 0x39, 0x2e, 0x36, 0x38,
+ 0x2d, 0x36, 0x35, 0x30, 0x36, 0x36, 0x37, 0x3a, 0x3b, 0x35, 0x37, 0x3a,
+ 0x2f, 0x36, 0x39, 0x30, 0x38, 0x3b, 0x2e, 0x35, 0x38, 0x2c, 0x31, 0x34,
+ 0x2e, 0x34, 0x34, 0x2e, 0x34, 0x35, 0x2e, 0x34, 0x34, 0x2e, 0x34, 0x34,
+ 0x31, 0x36, 0x36, 0x30, 0x34, 0x35, 0x32, 0x36, 0x37, 0x30, 0x34, 0x35,
+ 0x2d, 0x31, 0x32, 0x2f, 0x33, 0x34, 0x2d, 0x33, 0x33, 0x2c, 0x32, 0x32,
+ 0x2e, 0x35, 0x33, 0x2b, 0x31, 0x31, 0x2a, 0x30, 0x30, 0x29, 0x2f, 0x2f,
+ 0x2c, 0x31, 0x34, 0x2a, 0x2f, 0x32, 0x2b, 0x30, 0x33, 0x2b, 0x30, 0x33,
+ 0x2b, 0x31, 0x31, 0x2c, 0x32, 0x32, 0x27, 0x2c, 0x2e, 0x24, 0x28, 0x2b,
+ 0x25, 0x28, 0x2c, 0x25, 0x28, 0x2d, 0x28, 0x2d, 0x31, 0x30, 0x35, 0x39,
+ 0x35, 0x3a, 0x3e, 0x31, 0x37, 0x3b, 0x2c, 0x34, 0x37, 0x2d, 0x33, 0x36,
+ 0x30, 0x35, 0x38, 0x31, 0x35, 0x38, 0x31, 0x34, 0x38, 0x30, 0x32, 0x35,
+ 0x32, 0x33, 0x37, 0x34, 0x35, 0x3a, 0x33, 0x36, 0x3b, 0x31, 0x37, 0x3d,
+ 0x2f, 0x35, 0x3b, 0x2f, 0x35, 0x3a, 0x2d, 0x32, 0x37, 0x2e, 0x31, 0x36,
+ 0x2a, 0x32, 0x35, 0x28, 0x2f, 0x31, 0x2d, 0x2f, 0x2f, 0x2e, 0x2b, 0x2a,
+ 0x2f, 0x2b, 0x28, 0x2f, 0x2b, 0x29, 0x2b, 0x27, 0x26, 0x28, 0x25, 0x23,
+ 0x1c, 0x1e, 0x1d, 0x18, 0x1b, 0x21, 0x18, 0x1c, 0x25, 0x12, 0x16, 0x1f,
+ 0x1d, 0x22, 0x26, 0x54, 0x5c, 0x5e, 0x49, 0x54, 0x5a, 0x2c, 0x39, 0x45,
+ 0x78, 0x5a, 0x3a, 0x75, 0x62, 0x57, 0x43, 0x44, 0x57, 0x1e, 0x2f, 0x52,
+ 0x1b, 0x36, 0x59, 0x1a, 0x37, 0x57, 0x1d, 0x37, 0x58, 0x1e, 0x36, 0x5b,
+ 0x1e, 0x37, 0x55, 0x1d, 0x36, 0x57, 0x1a, 0x36, 0x5c, 0x1b, 0x37, 0x5c,
+ 0x19, 0x36, 0x56, 0x1d, 0x37, 0x55, 0x20, 0x36, 0x5b, 0x21, 0x34, 0x5e,
+ 0x1b, 0x33, 0x57, 0x18, 0x32, 0x58, 0x19, 0x35, 0x5a, 0x1a, 0x35, 0x58,
+ 0x1a, 0x2f, 0x4e, 0x28, 0x34, 0x4e, 0x42, 0x45, 0x57, 0x4e, 0x4c, 0x59,
+ 0x46, 0x47, 0x56, 0x33, 0x3b, 0x50, 0x21, 0x30, 0x4f, 0x14, 0x2d, 0x57,
+ 0x11, 0x2e, 0x5b, 0x16, 0x30, 0x55, 0x1f, 0x32, 0x4c, 0x22, 0x2d, 0x3f,
+ 0x4f, 0x43, 0x48, 0x7e, 0x6c, 0x6a, 0x85, 0x77, 0x6d, 0x71, 0x65, 0x5a,
+ 0x4b, 0x43, 0x46, 0x27, 0x2d, 0x40, 0x1e, 0x2f, 0x48, 0x3b, 0x48, 0x5f,
+ 0x48, 0x4d, 0x5a, 0x42, 0x45, 0x50, 0x4c, 0x50, 0x5a, 0x4f, 0x51, 0x5e,
+ 0x3e, 0x41, 0x52, 0x40, 0x46, 0x56, 0x47, 0x51, 0x5d, 0x3c, 0x48, 0x51,
+ 0x3c, 0x3d, 0x44, 0x35, 0x35, 0x3d, 0x34, 0x37, 0x41, 0x32, 0x34, 0x40,
+ 0x30, 0x34, 0x3f, 0x32, 0x37, 0x41, 0x31, 0x38, 0x42, 0x29, 0x31, 0x3a,
+ 0x28, 0x2f, 0x35, 0x2e, 0x32, 0x38, 0x2f, 0x33, 0x39, 0x27, 0x2b, 0x34,
+ 0x2a, 0x31, 0x3b, 0x2a, 0x31, 0x3b, 0x21, 0x26, 0x2c, 0x15, 0x18, 0x1d,
+ 0x15, 0x16, 0x18, 0x14, 0x15, 0x17, 0x14, 0x15, 0x17, 0x12, 0x13, 0x15,
+ 0x13, 0x14, 0x16, 0x10, 0x11, 0x13, 0x11, 0x12, 0x14, 0x0f, 0x10, 0x12,
+ 0x0f, 0x10, 0x12, 0x0e, 0x0f, 0x11, 0x10, 0x12, 0x14, 0x0e, 0x0f, 0x11,
+ 0x0e, 0x0f, 0x11, 0x10, 0x11, 0x13, 0x10, 0x10, 0x13, 0x13, 0x13, 0x15,
+ 0x10, 0x12, 0x0f, 0x0e, 0x10, 0x0f, 0x0a, 0x0b, 0x0a, 0x12, 0x12, 0x14,
+ 0x3a, 0x3b, 0x3d, 0x53, 0x54, 0x58, 0x36, 0x38, 0x3c, 0x18, 0x1c, 0x1f,
+ 0x39, 0x3e, 0x41, 0x49, 0x51, 0x53, 0x22, 0x2a, 0x2e, 0x0e, 0x15, 0x1b,
+ 0x0f, 0x16, 0x1c, 0x11, 0x18, 0x1c, 0x11, 0x17, 0x19, 0x3b, 0x41, 0x41,
+ 0x63, 0x67, 0x67, 0x1c, 0x22, 0x22, 0x11, 0x16, 0x19, 0x13, 0x1b, 0x1d,
+ 0x33, 0x3b, 0x3d, 0x49, 0x4e, 0x51, 0x3e, 0x43, 0x46, 0x4c, 0x51, 0x53,
+ 0x5d, 0x66, 0x65, 0x42, 0x4c, 0x4d, 0x51, 0x5b, 0x5d, 0x5b, 0x64, 0x66,
+ 0x51, 0x59, 0x5b, 0x4b, 0x53, 0x55, 0x56, 0x5d, 0x63, 0x3a, 0x41, 0x4b,
+ 0x24, 0x2b, 0x32, 0x34, 0x3b, 0x41, 0x26, 0x2d, 0x33, 0x1b, 0x21, 0x25,
+ 0x14, 0x19, 0x1e, 0x14, 0x17, 0x1c, 0x12, 0x14, 0x19, 0x12, 0x15, 0x1a,
+ 0x0f, 0x13, 0x18, 0x11, 0x14, 0x18, 0x11, 0x12, 0x16, 0x11, 0x12, 0x14,
+ 0x0f, 0x10, 0x12, 0x12, 0x13, 0x17, 0x17, 0x18, 0x1d, 0x13, 0x13, 0x1b,
+ 0x13, 0x17, 0x1c, 0x0f, 0x14, 0x18, 0x0d, 0x12, 0x18, 0x0b, 0x12, 0x18,
+ 0x0b, 0x12, 0x1a, 0x0c, 0x13, 0x1b, 0x10, 0x17, 0x20, 0x0f, 0x16, 0x20,
+ 0x11, 0x18, 0x22, 0x30, 0x35, 0x3f, 0x36, 0x36, 0x3f, 0x1b, 0x17, 0x1e,
+ 0x23, 0x1c, 0x23, 0x2c, 0x27, 0x2b, 0x4f, 0x4b, 0x4c, 0x48, 0x46, 0x47,
+ 0x3f, 0x3b, 0x3a, 0x34, 0x30, 0x30, 0x31, 0x2d, 0x31, 0x2e, 0x2b, 0x32,
+ 0x34, 0x31, 0x38, 0x30, 0x2d, 0x34, 0x2c, 0x29, 0x30, 0x2c, 0x29, 0x30,
+ 0x21, 0x20, 0x26, 0x1e, 0x1d, 0x23, 0x1f, 0x1d, 0x22, 0x1d, 0x19, 0x1e,
+ 0x31, 0x2c, 0x30, 0x2c, 0x2a, 0x2d, 0x1b, 0x1b, 0x1d, 0x16, 0x16, 0x18,
+ 0x1b, 0x1b, 0x1b, 0x3d, 0x3e, 0x42, 0x3c, 0x3c, 0x46, 0x35, 0x37, 0x43,
+ 0x34, 0x37, 0x40, 0x32, 0x35, 0x3c, 0x2e, 0x2e, 0x36, 0x2c, 0x2c, 0x35,
+ 0x25, 0x26, 0x2c, 0x1d, 0x1e, 0x23, 0x19, 0x1a, 0x1e, 0x10, 0x11, 0x13,
+ 0x0a, 0x0b, 0x0d, 0x0a, 0x0c, 0x0b, 0x0a, 0x0c, 0x0c, 0x0a, 0x0b, 0x0d,
+ 0x08, 0x0b, 0x0a, 0x0c, 0x0e, 0x0d, 0x0e, 0x10, 0x0f, 0x0f, 0x0f, 0x0f,
+ 0x16, 0x14, 0x15, 0x18, 0x16, 0x17, 0x1a, 0x1a, 0x1a, 0x1f, 0x1f, 0x1f,
+ 0x1b, 0x17, 0x16, 0x2a, 0x26, 0x27, 0x3f, 0x3b, 0x3c, 0x1f, 0x1b, 0x1c,
+ 0x2c, 0x2a, 0x2b, 0x27, 0x25, 0x26, 0x27, 0x25, 0x26, 0x3b, 0x39, 0x3a,
+ 0x2d, 0x2e, 0x30, 0x2b, 0x2a, 0x2f, 0x2c, 0x2b, 0x31, 0x31, 0x30, 0x36,
+ 0x2a, 0x29, 0x2d, 0x23, 0x24, 0x28, 0x2b, 0x2e, 0x33, 0x31, 0x34, 0x3b,
+ 0x2d, 0x2d, 0x35, 0x34, 0x33, 0x3b, 0x2a, 0x2a, 0x32, 0x21, 0x24, 0x29,
+ 0x1c, 0x1f, 0x22, 0x0d, 0x0f, 0x11, 0x10, 0x10, 0x11, 0x0c, 0x0a, 0x0b,
+ 0x0c, 0x0d, 0x08, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x10, 0x11, 0x0d, 0x17, 0x18, 0x12,
+ 0x67, 0x66, 0x55, 0x60, 0x60, 0x54, 0x32, 0x33, 0x30, 0x32, 0x35, 0x39,
+ 0x36, 0x39, 0x40, 0x3c, 0x3f, 0x46, 0x3f, 0x42, 0x47, 0x36, 0x39, 0x3c,
+ 0x36, 0x3a, 0x3c, 0x36, 0x3a, 0x3d, 0x32, 0x36, 0x3a, 0x35, 0x39, 0x3b,
+ 0x34, 0x38, 0x37, 0x34, 0x38, 0x37, 0x38, 0x3c, 0x3d, 0x37, 0x3b, 0x3e,
+ 0x32, 0x33, 0x38, 0x35, 0x36, 0x3b, 0x3a, 0x3a, 0x42, 0x3a, 0x3b, 0x43,
+ 0x37, 0x37, 0x3f, 0x34, 0x35, 0x3a, 0x2c, 0x2d, 0x2f, 0x2b, 0x2c, 0x2e,
+ 0x2c, 0x2f, 0x33, 0x2e, 0x32, 0x35, 0x2f, 0x33, 0x36, 0x31, 0x35, 0x38,
+ 0x30, 0x34, 0x37, 0x30, 0x34, 0x37, 0x34, 0x38, 0x3a, 0x33, 0x37, 0x3a,
+ 0x33, 0x35, 0x36, 0x35, 0x39, 0x3e, 0x31, 0x36, 0x3d, 0x31, 0x39, 0x3c,
+ 0x2e, 0x37, 0x35, 0x31, 0x37, 0x33, 0x33, 0x37, 0x36, 0x32, 0x36, 0x39,
+ 0x31, 0x36, 0x3c, 0x34, 0x39, 0x3d, 0x2e, 0x33, 0x37, 0x28, 0x2d, 0x30,
+ 0x25, 0x2b, 0x2b, 0x20, 0x26, 0x26, 0x21, 0x27, 0x27, 0x20, 0x26, 0x24,
+ 0x26, 0x28, 0x27, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2f, 0x2e, 0x32, 0x33,
+ 0x2d, 0x31, 0x32, 0x2d, 0x31, 0x34, 0x2d, 0x31, 0x34, 0x2e, 0x32, 0x34,
+ 0x2f, 0x33, 0x32, 0x30, 0x34, 0x34, 0x2d, 0x31, 0x32, 0x2b, 0x2f, 0x32,
+ 0x2e, 0x32, 0x36, 0x2a, 0x2f, 0x33, 0x2b, 0x30, 0x34, 0x2c, 0x32, 0x35,
+ 0x2b, 0x34, 0x33, 0x2a, 0x32, 0x33, 0x29, 0x2e, 0x31, 0x2b, 0x2e, 0x33,
+ 0x2d, 0x30, 0x35, 0x2e, 0x31, 0x38, 0x30, 0x35, 0x3b, 0x32, 0x37, 0x3d,
+ 0x34, 0x39, 0x3d, 0x31, 0x36, 0x3a, 0x2c, 0x31, 0x35, 0x2c, 0x31, 0x34,
+ 0x2f, 0x34, 0x37, 0x2f, 0x34, 0x35, 0x30, 0x34, 0x35, 0x2e, 0x31, 0x32,
+ 0x34, 0x35, 0x39, 0x35, 0x37, 0x3c, 0x33, 0x36, 0x3b, 0x31, 0x35, 0x3a,
+ 0x2f, 0x34, 0x3a, 0x2e, 0x33, 0x39, 0x30, 0x32, 0x39, 0x30, 0x30, 0x38,
+ 0x2c, 0x31, 0x37, 0x2d, 0x30, 0x34, 0x2b, 0x2a, 0x2d, 0x2b, 0x29, 0x2a,
+ 0x30, 0x2c, 0x2b, 0x2d, 0x2c, 0x2a, 0x27, 0x27, 0x25, 0x22, 0x22, 0x20,
+ 0x1a, 0x1a, 0x18, 0x18, 0x1c, 0x1e, 0x17, 0x1e, 0x24, 0x0f, 0x16, 0x1e,
+ 0x33, 0x38, 0x3c, 0x56, 0x5c, 0x5f, 0x22, 0x29, 0x32, 0x12, 0x1b, 0x28,
+ 0x79, 0x5b, 0x40, 0x75, 0x64, 0x5b, 0x45, 0x47, 0x57, 0x1f, 0x32, 0x55,
+ 0x18, 0x33, 0x5e, 0x19, 0x34, 0x5f, 0x1e, 0x38, 0x5d, 0x1d, 0x36, 0x57,
+ 0x1d, 0x36, 0x55, 0x1d, 0x37, 0x5a, 0x1e, 0x3a, 0x60, 0x1b, 0x39, 0x5d,
+ 0x1b, 0x38, 0x58, 0x1e, 0x37, 0x56, 0x22, 0x36, 0x5b, 0x2a, 0x3c, 0x67,
+ 0x23, 0x3a, 0x66, 0x18, 0x2f, 0x58, 0x14, 0x2d, 0x53, 0x14, 0x30, 0x55,
+ 0x0f, 0x2e, 0x55, 0x0f, 0x2e, 0x55, 0x1c, 0x33, 0x56, 0x21, 0x31, 0x52,
+ 0x1d, 0x30, 0x56, 0x13, 0x2d, 0x57, 0x0d, 0x2c, 0x5c, 0x10, 0x31, 0x60,
+ 0x0e, 0x2d, 0x59, 0x14, 0x2e, 0x54, 0x1d, 0x34, 0x52, 0x1e, 0x32, 0x49,
+ 0x30, 0x36, 0x39, 0x4a, 0x3c, 0x43, 0x4d, 0x3c, 0x42, 0x43, 0x39, 0x3f,
+ 0x28, 0x2b, 0x44, 0x12, 0x2e, 0x50, 0x1c, 0x33, 0x47, 0x4b, 0x41, 0x46,
+ 0x74, 0x5b, 0x5a, 0x81, 0x6c, 0x67, 0x86, 0x75, 0x6f, 0x80, 0x71, 0x6d,
+ 0x62, 0x5a, 0x5d, 0x3a, 0x3a, 0x44, 0x45, 0x4e, 0x5f, 0x4c, 0x57, 0x69,
+ 0x38, 0x3b, 0x41, 0x33, 0x33, 0x3a, 0x34, 0x36, 0x3f, 0x31, 0x33, 0x3e,
+ 0x31, 0x34, 0x41, 0x38, 0x3c, 0x48, 0x38, 0x3f, 0x48, 0x36, 0x3d, 0x47,
+ 0x2d, 0x34, 0x3a, 0x30, 0x34, 0x3b, 0x2d, 0x32, 0x38, 0x27, 0x2c, 0x34,
+ 0x27, 0x2e, 0x39, 0x2a, 0x32, 0x3d, 0x22, 0x29, 0x31, 0x14, 0x19, 0x1f,
+ 0x15, 0x16, 0x18, 0x13, 0x14, 0x16, 0x12, 0x13, 0x15, 0x14, 0x15, 0x17,
+ 0x11, 0x12, 0x14, 0x11, 0x12, 0x14, 0x11, 0x12, 0x14, 0x0e, 0x0f, 0x11,
+ 0x0d, 0x0e, 0x10, 0x0d, 0x0e, 0x10, 0x0e, 0x0f, 0x11, 0x0e, 0x0f, 0x11,
+ 0x10, 0x11, 0x13, 0x10, 0x10, 0x12, 0x12, 0x12, 0x13, 0x11, 0x11, 0x13,
+ 0x0e, 0x10, 0x0d, 0x0a, 0x0b, 0x09, 0x13, 0x15, 0x14, 0x3f, 0x3f, 0x3f,
+ 0x58, 0x58, 0x5a, 0x33, 0x34, 0x38, 0x11, 0x12, 0x17, 0x30, 0x33, 0x37,
+ 0x56, 0x5a, 0x5b, 0x24, 0x28, 0x2a, 0x0c, 0x12, 0x14, 0x0f, 0x14, 0x17,
+ 0x17, 0x1c, 0x1e, 0x3b, 0x41, 0x43, 0x4d, 0x53, 0x53, 0x55, 0x5a, 0x59,
+ 0x65, 0x69, 0x67, 0x4f, 0x54, 0x53, 0x27, 0x2c, 0x2b, 0x35, 0x39, 0x3b,
+ 0x6c, 0x71, 0x72, 0x45, 0x4a, 0x4b, 0x27, 0x2b, 0x2c, 0x52, 0x55, 0x55,
+ 0x5f, 0x68, 0x64, 0x5f, 0x68, 0x66, 0x56, 0x5e, 0x60, 0x36, 0x3d, 0x3f,
+ 0x54, 0x58, 0x5b, 0x43, 0x48, 0x4a, 0x22, 0x26, 0x2d, 0x15, 0x19, 0x22,
+ 0x16, 0x1c, 0x22, 0x46, 0x4c, 0x51, 0x5f, 0x64, 0x6a, 0x4d, 0x52, 0x57,
+ 0x37, 0x3c, 0x40, 0x34, 0x38, 0x3c, 0x28, 0x2a, 0x30, 0x17, 0x1a, 0x1f,
+ 0x14, 0x15, 0x1c, 0x17, 0x18, 0x1d, 0x11, 0x12, 0x16, 0x1c, 0x1d, 0x20,
+ 0x1d, 0x1e, 0x20, 0x11, 0x12, 0x16, 0x17, 0x17, 0x1f, 0x18, 0x18, 0x20,
+ 0x11, 0x15, 0x19, 0x0f, 0x15, 0x18, 0x0d, 0x12, 0x15, 0x0d, 0x13, 0x17,
+ 0x0c, 0x14, 0x18, 0x0d, 0x15, 0x1c, 0x14, 0x1b, 0x27, 0x13, 0x19, 0x28,
+ 0x13, 0x1a, 0x27, 0x2b, 0x30, 0x3a, 0x22, 0x22, 0x29, 0x1d, 0x18, 0x1f,
+ 0x28, 0x23, 0x27, 0x30, 0x2a, 0x2d, 0x37, 0x33, 0x34, 0x3d, 0x3a, 0x3c,
+ 0x27, 0x24, 0x21, 0x1f, 0x1b, 0x1a, 0x27, 0x22, 0x25, 0x44, 0x3f, 0x45,
+ 0x35, 0x31, 0x39, 0x2f, 0x2c, 0x33, 0x3e, 0x3c, 0x43, 0x27, 0x24, 0x2b,
+ 0x22, 0x21, 0x27, 0x1e, 0x1d, 0x23, 0x1e, 0x1b, 0x20, 0x1e, 0x19, 0x1f,
+ 0x2f, 0x2a, 0x2e, 0x28, 0x26, 0x29, 0x1b, 0x1a, 0x1c, 0x18, 0x18, 0x1a,
+ 0x1c, 0x1c, 0x1e, 0x3d, 0x3d, 0x43, 0x3b, 0x3b, 0x45, 0x38, 0x3a, 0x46,
+ 0x33, 0x36, 0x3f, 0x2f, 0x32, 0x3b, 0x2e, 0x2e, 0x37, 0x2b, 0x2b, 0x34,
+ 0x24, 0x24, 0x2c, 0x1e, 0x1f, 0x24, 0x1c, 0x1d, 0x21, 0x14, 0x15, 0x17,
+ 0x0c, 0x0d, 0x0f, 0x08, 0x09, 0x0b, 0x09, 0x0a, 0x0c, 0x09, 0x0a, 0x0c,
+ 0x07, 0x0b, 0x0a, 0x0b, 0x0f, 0x0d, 0x0e, 0x10, 0x10, 0x11, 0x11, 0x11,
+ 0x17, 0x15, 0x16, 0x19, 0x17, 0x18, 0x1c, 0x1c, 0x1c, 0x1f, 0x1e, 0x1e,
+ 0x20, 0x1a, 0x1a, 0x24, 0x1e, 0x1e, 0x26, 0x22, 0x23, 0x1f, 0x1b, 0x1c,
+ 0x28, 0x24, 0x26, 0x1c, 0x1a, 0x1b, 0x2c, 0x29, 0x2a, 0x3b, 0x39, 0x38,
+ 0x2b, 0x2c, 0x2e, 0x2b, 0x2b, 0x30, 0x2f, 0x2e, 0x33, 0x32, 0x31, 0x36,
+ 0x27, 0x27, 0x29, 0x21, 0x22, 0x24, 0x14, 0x15, 0x19, 0x18, 0x1a, 0x1f,
+ 0x1a, 0x18, 0x1e, 0x27, 0x26, 0x2c, 0x31, 0x32, 0x37, 0x2d, 0x31, 0x34,
+ 0x1b, 0x1e, 0x20, 0x0f, 0x11, 0x10, 0x10, 0x10, 0x0e, 0x0e, 0x0e, 0x0b,
+ 0x0f, 0x10, 0x0b, 0x0b, 0x0b, 0x08, 0x0c, 0x0d, 0x0c, 0x0b, 0x0b, 0x0c,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0d, 0x0b, 0x0d, 0x0e, 0x0a, 0x2b, 0x2c, 0x24,
+ 0xbf, 0xbd, 0xa7, 0x89, 0x87, 0x77, 0x48, 0x48, 0x44, 0x36, 0x37, 0x3c,
+ 0x37, 0x3a, 0x43, 0x3d, 0x41, 0x49, 0x3b, 0x3e, 0x43, 0x37, 0x39, 0x3b,
+ 0x34, 0x37, 0x3b, 0x35, 0x39, 0x3d, 0x34, 0x37, 0x3c, 0x32, 0x36, 0x39,
+ 0x33, 0x39, 0x39, 0x34, 0x39, 0x37, 0x34, 0x3a, 0x3b, 0x34, 0x38, 0x3d,
+ 0x33, 0x34, 0x39, 0x34, 0x34, 0x3c, 0x37, 0x37, 0x3f, 0x38, 0x38, 0x40,
+ 0x35, 0x35, 0x3d, 0x2f, 0x30, 0x35, 0x26, 0x27, 0x29, 0x24, 0x26, 0x27,
+ 0x26, 0x29, 0x2f, 0x28, 0x2b, 0x32, 0x26, 0x29, 0x30, 0x26, 0x29, 0x2f,
+ 0x2b, 0x2e, 0x33, 0x28, 0x2c, 0x30, 0x2b, 0x2f, 0x33, 0x34, 0x37, 0x3c,
+ 0x3e, 0x40, 0x43, 0x40, 0x43, 0x4a, 0x3a, 0x3e, 0x4a, 0x32, 0x39, 0x3f,
+ 0x30, 0x38, 0x38, 0x30, 0x39, 0x35, 0x2d, 0x33, 0x31, 0x32, 0x36, 0x37,
+ 0x32, 0x35, 0x3d, 0x2d, 0x30, 0x35, 0x22, 0x25, 0x2a, 0x1a, 0x1e, 0x21,
+ 0x14, 0x18, 0x19, 0x10, 0x14, 0x15, 0x13, 0x17, 0x16, 0x13, 0x17, 0x17,
+ 0x15, 0x17, 0x17, 0x1a, 0x1b, 0x1b, 0x1a, 0x1b, 0x1b, 0x1f, 0x21, 0x22,
+ 0x23, 0x27, 0x29, 0x2c, 0x30, 0x33, 0x30, 0x33, 0x37, 0x2e, 0x32, 0x36,
+ 0x2d, 0x2f, 0x2f, 0x2d, 0x2f, 0x30, 0x2b, 0x2f, 0x32, 0x2d, 0x31, 0x34,
+ 0x2f, 0x33, 0x37, 0x2e, 0x33, 0x37, 0x2c, 0x31, 0x35, 0x2d, 0x32, 0x36,
+ 0x29, 0x32, 0x31, 0x28, 0x30, 0x32, 0x2f, 0x34, 0x37, 0x31, 0x34, 0x39,
+ 0x2f, 0x32, 0x39, 0x32, 0x37, 0x3d, 0x36, 0x3b, 0x40, 0x2f, 0x35, 0x3b,
+ 0x30, 0x34, 0x39, 0x31, 0x34, 0x38, 0x2d, 0x32, 0x35, 0x2d, 0x32, 0x35,
+ 0x31, 0x37, 0x38, 0x30, 0x36, 0x36, 0x2e, 0x34, 0x35, 0x30, 0x34, 0x35,
+ 0x32, 0x33, 0x38, 0x33, 0x35, 0x3b, 0x30, 0x33, 0x38, 0x2f, 0x34, 0x38,
+ 0x2e, 0x33, 0x39, 0x30, 0x33, 0x39, 0x32, 0x32, 0x3a, 0x30, 0x30, 0x38,
+ 0x30, 0x30, 0x37, 0x2f, 0x2e, 0x36, 0x2a, 0x28, 0x2e, 0x2b, 0x27, 0x2b,
+ 0x2c, 0x2a, 0x2b, 0x2b, 0x2b, 0x29, 0x20, 0x25, 0x21, 0x1a, 0x20, 0x1d,
+ 0x1a, 0x1b, 0x19, 0x16, 0x19, 0x1b, 0x15, 0x1c, 0x21, 0x11, 0x1a, 0x1f,
+ 0x26, 0x2e, 0x30, 0x4f, 0x54, 0x5a, 0x3b, 0x40, 0x4a, 0x2b, 0x31, 0x41,
+ 0x7e, 0x64, 0x49, 0x6a, 0x60, 0x58, 0x32, 0x3d, 0x51, 0x1f, 0x38, 0x5c,
+ 0x1b, 0x36, 0x5f, 0x1b, 0x32, 0x5b, 0x20, 0x37, 0x61, 0x1c, 0x35, 0x5f,
+ 0x27, 0x40, 0x62, 0x24, 0x3e, 0x5e, 0x1c, 0x39, 0x58, 0x1b, 0x39, 0x59,
+ 0x1d, 0x3a, 0x5c, 0x1e, 0x38, 0x5d, 0x1d, 0x35, 0x59, 0x22, 0x3a, 0x5b,
+ 0x23, 0x3a, 0x5b, 0x18, 0x30, 0x52, 0x14, 0x2e, 0x53, 0x17, 0x31, 0x56,
+ 0x18, 0x32, 0x58, 0x16, 0x31, 0x56, 0x17, 0x30, 0x58, 0x13, 0x2c, 0x55,
+ 0x19, 0x30, 0x5b, 0x1a, 0x2c, 0x5b, 0x16, 0x30, 0x57, 0x12, 0x2f, 0x4f,
+ 0x15, 0x2c, 0x53, 0x15, 0x31, 0x59, 0x24, 0x38, 0x4d, 0x52, 0x49, 0x4c,
+ 0x68, 0x54, 0x53, 0x6e, 0x54, 0x51, 0x6e, 0x51, 0x4f, 0x74, 0x58, 0x54,
+ 0x5a, 0x4f, 0x55, 0x29, 0x36, 0x51, 0x38, 0x3a, 0x4d, 0x77, 0x57, 0x4e,
+ 0x85, 0x74, 0x6b, 0x83, 0x88, 0x84, 0x8e, 0x8f, 0x91, 0x90, 0x8c, 0x88,
+ 0x85, 0x7a, 0x78, 0x5e, 0x57, 0x5f, 0x40, 0x54, 0x61, 0x63, 0x7c, 0x8f,
+ 0x44, 0x51, 0x60, 0x32, 0x35, 0x3a, 0x34, 0x35, 0x38, 0x33, 0x37, 0x44,
+ 0x38, 0x3b, 0x4d, 0x3d, 0x3a, 0x47, 0x3f, 0x3f, 0x45, 0x37, 0x41, 0x46,
+ 0x32, 0x37, 0x40, 0x32, 0x35, 0x3e, 0x2e, 0x31, 0x3a, 0x28, 0x2d, 0x37,
+ 0x26, 0x2c, 0x38, 0x26, 0x2e, 0x39, 0x23, 0x28, 0x31, 0x16, 0x19, 0x1e,
+ 0x12, 0x15, 0x17, 0x11, 0x15, 0x16, 0x10, 0x14, 0x15, 0x0f, 0x13, 0x14,
+ 0x0f, 0x12, 0x13, 0x10, 0x12, 0x13, 0x10, 0x12, 0x11, 0x0e, 0x10, 0x0f,
+ 0x0e, 0x10, 0x0f, 0x0e, 0x0f, 0x11, 0x0d, 0x0d, 0x0f, 0x10, 0x10, 0x13,
+ 0x0f, 0x0f, 0x11, 0x0e, 0x0e, 0x0e, 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x0e,
+ 0x0a, 0x0b, 0x0d, 0x19, 0x1b, 0x1b, 0x42, 0x44, 0x43, 0x53, 0x55, 0x55,
+ 0x2e, 0x32, 0x33, 0x25, 0x29, 0x2c, 0x21, 0x23, 0x29, 0x23, 0x26, 0x2d,
+ 0x4a, 0x52, 0x52, 0x3a, 0x40, 0x40, 0x18, 0x1e, 0x1d, 0x1d, 0x22, 0x1f,
+ 0x48, 0x4e, 0x4b, 0x6b, 0x74, 0x72, 0x57, 0x60, 0x5f, 0x53, 0x5e, 0x5c,
+ 0x5d, 0x6f, 0x68, 0x56, 0x63, 0x65, 0x55, 0x5d, 0x67, 0x58, 0x5e, 0x68,
+ 0x53, 0x58, 0x5c, 0x45, 0x4e, 0x4d, 0x55, 0x60, 0x62, 0x43, 0x50, 0x56,
+ 0x42, 0x4d, 0x58, 0x67, 0x70, 0x75, 0x3e, 0x41, 0x3c, 0x3b, 0x3b, 0x2f,
+ 0x53, 0x51, 0x45, 0x43, 0x44, 0x3e, 0x23, 0x27, 0x2a, 0x12, 0x18, 0x22,
+ 0x12, 0x19, 0x1b, 0x14, 0x1c, 0x21, 0x37, 0x3e, 0x48, 0x51, 0x57, 0x5f,
+ 0x42, 0x47, 0x4b, 0x43, 0x48, 0x49, 0x46, 0x49, 0x4e, 0x22, 0x26, 0x2d,
+ 0x11, 0x18, 0x20, 0x17, 0x1b, 0x24, 0x15, 0x18, 0x1f, 0x1f, 0x20, 0x25,
+ 0x1b, 0x1c, 0x1e, 0x11, 0x14, 0x17, 0x11, 0x15, 0x1c, 0x11, 0x17, 0x21,
+ 0x12, 0x14, 0x19, 0x0d, 0x13, 0x17, 0x0a, 0x13, 0x1b, 0x0d, 0x19, 0x22,
+ 0x0c, 0x19, 0x21, 0x10, 0x1d, 0x24, 0x13, 0x1f, 0x29, 0x0e, 0x1c, 0x29,
+ 0x13, 0x1a, 0x23, 0x29, 0x2d, 0x34, 0x1d, 0x1d, 0x21, 0x21, 0x1d, 0x20,
+ 0x24, 0x1d, 0x21, 0x27, 0x21, 0x25, 0x24, 0x1f, 0x25, 0x28, 0x23, 0x2a,
+ 0x24, 0x1f, 0x24, 0x1f, 0x1a, 0x1d, 0x25, 0x21, 0x22, 0x4b, 0x46, 0x4a,
+ 0x38, 0x33, 0x3a, 0x27, 0x23, 0x2c, 0x4a, 0x48, 0x4f, 0x2a, 0x29, 0x2f,
+ 0x1e, 0x1c, 0x23, 0x22, 0x1f, 0x26, 0x26, 0x23, 0x27, 0x22, 0x20, 0x22,
+ 0x31, 0x2f, 0x30, 0x23, 0x23, 0x23, 0x19, 0x19, 0x19, 0x19, 0x18, 0x1a,
+ 0x1c, 0x1a, 0x1e, 0x3a, 0x39, 0x3e, 0x3b, 0x3a, 0x41, 0x3a, 0x3a, 0x45,
+ 0x33, 0x36, 0x3f, 0x32, 0x35, 0x3d, 0x2c, 0x2f, 0x36, 0x25, 0x28, 0x2e,
+ 0x1c, 0x1f, 0x24, 0x18, 0x1b, 0x20, 0x1a, 0x1d, 0x20, 0x1a, 0x1b, 0x1f,
+ 0x14, 0x15, 0x17, 0x0c, 0x0e, 0x0d, 0x0b, 0x0b, 0x0b, 0x08, 0x09, 0x07,
+ 0x09, 0x0b, 0x0a, 0x0c, 0x0e, 0x0d, 0x11, 0x11, 0x11, 0x15, 0x14, 0x13,
+ 0x17, 0x15, 0x14, 0x19, 0x17, 0x18, 0x1d, 0x1b, 0x1c, 0x21, 0x1e, 0x1f,
+ 0x22, 0x1c, 0x1e, 0x1e, 0x1a, 0x1b, 0x1a, 0x17, 0x1a, 0x24, 0x22, 0x24,
+ 0x26, 0x24, 0x26, 0x1b, 0x19, 0x1c, 0x2b, 0x28, 0x29, 0x33, 0x30, 0x31,
+ 0x27, 0x28, 0x2b, 0x2a, 0x2b, 0x2f, 0x2d, 0x2e, 0x32, 0x29, 0x28, 0x2d,
+ 0x29, 0x28, 0x2e, 0x26, 0x26, 0x2d, 0x23, 0x23, 0x2b, 0x26, 0x26, 0x2e,
+ 0x20, 0x21, 0x26, 0x2a, 0x2b, 0x30, 0x30, 0x31, 0x36, 0x2b, 0x2b, 0x30,
+ 0x18, 0x17, 0x1c, 0x11, 0x10, 0x12, 0x0f, 0x0d, 0x0d, 0x0f, 0x0e, 0x0c,
+ 0x0d, 0x0f, 0x0c, 0x0a, 0x0c, 0x08, 0x09, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0b, 0x0e, 0x0f, 0x0c, 0x3c, 0x3d, 0x37,
+ 0x91, 0x92, 0x82, 0x84, 0x85, 0x78, 0x62, 0x61, 0x5b, 0x43, 0x45, 0x45,
+ 0x32, 0x39, 0x3f, 0x3a, 0x43, 0x4b, 0x38, 0x3f, 0x45, 0x30, 0x34, 0x39,
+ 0x31, 0x34, 0x39, 0x35, 0x38, 0x3d, 0x35, 0x38, 0x3c, 0x32, 0x36, 0x3a,
+ 0x33, 0x36, 0x3b, 0x33, 0x37, 0x3d, 0x34, 0x35, 0x3c, 0x33, 0x34, 0x3d,
+ 0x35, 0x37, 0x3f, 0x33, 0x35, 0x3a, 0x35, 0x36, 0x3a, 0x38, 0x39, 0x3b,
+ 0x36, 0x37, 0x39, 0x30, 0x31, 0x35, 0x29, 0x2a, 0x2f, 0x25, 0x28, 0x2d,
+ 0x28, 0x2c, 0x2f, 0x27, 0x2b, 0x2e, 0x24, 0x27, 0x2a, 0x28, 0x29, 0x2e,
+ 0x2a, 0x2e, 0x31, 0x2a, 0x2e, 0x31, 0x24, 0x29, 0x2a, 0x43, 0x49, 0x49,
+ 0x50, 0x57, 0x5b, 0x4c, 0x53, 0x5a, 0x47, 0x4e, 0x56, 0x38, 0x3d, 0x46,
+ 0x33, 0x38, 0x3e, 0x31, 0x36, 0x39, 0x32, 0x36, 0x38, 0x34, 0x37, 0x3c,
+ 0x2c, 0x2c, 0x36, 0x1e, 0x1e, 0x26, 0x11, 0x12, 0x16, 0x0f, 0x11, 0x12,
+ 0x0e, 0x10, 0x0f, 0x11, 0x13, 0x12, 0x14, 0x15, 0x17, 0x13, 0x15, 0x18,
+ 0x13, 0x14, 0x18, 0x12, 0x13, 0x17, 0x10, 0x11, 0x13, 0x13, 0x14, 0x16,
+ 0x19, 0x1a, 0x1c, 0x23, 0x24, 0x26, 0x28, 0x2c, 0x2d, 0x2c, 0x30, 0x32,
+ 0x2e, 0x2f, 0x31, 0x2d, 0x30, 0x33, 0x2c, 0x30, 0x34, 0x2c, 0x31, 0x35,
+ 0x2f, 0x34, 0x39, 0x2e, 0x33, 0x37, 0x2a, 0x2f, 0x33, 0x2b, 0x30, 0x33,
+ 0x2a, 0x2f, 0x31, 0x2e, 0x32, 0x35, 0x30, 0x34, 0x38, 0x32, 0x35, 0x3a,
+ 0x31, 0x34, 0x39, 0x35, 0x39, 0x3e, 0x34, 0x38, 0x3b, 0x2f, 0x33, 0x36,
+ 0x31, 0x33, 0x37, 0x30, 0x32, 0x37, 0x30, 0x33, 0x38, 0x32, 0x35, 0x3a,
+ 0x34, 0x37, 0x3e, 0x32, 0x36, 0x3d, 0x31, 0x34, 0x3b, 0x32, 0x33, 0x3a,
+ 0x2e, 0x33, 0x39, 0x2e, 0x33, 0x39, 0x2c, 0x31, 0x37, 0x2d, 0x33, 0x38,
+ 0x2f, 0x34, 0x38, 0x30, 0x35, 0x39, 0x2f, 0x34, 0x38, 0x30, 0x33, 0x38,
+ 0x2f, 0x33, 0x37, 0x2e, 0x33, 0x37, 0x26, 0x29, 0x30, 0x28, 0x29, 0x2e,
+ 0x29, 0x2a, 0x2c, 0x26, 0x28, 0x27, 0x1c, 0x1e, 0x1d, 0x15, 0x19, 0x1a,
+ 0x19, 0x19, 0x1b, 0x17, 0x1a, 0x1d, 0x15, 0x1f, 0x21, 0x14, 0x1f, 0x21,
+ 0x11, 0x1b, 0x1c, 0x24, 0x2c, 0x2e, 0x44, 0x4b, 0x51, 0x4c, 0x55, 0x5c,
+ 0x73, 0x66, 0x5d, 0x4b, 0x49, 0x50, 0x24, 0x36, 0x52, 0x1d, 0x3a, 0x61,
+ 0x1b, 0x38, 0x60, 0x1f, 0x39, 0x5f, 0x20, 0x3a, 0x5f, 0x1c, 0x38, 0x60,
+ 0x35, 0x4f, 0x73, 0x2a, 0x44, 0x65, 0x1c, 0x39, 0x59, 0x1b, 0x38, 0x58,
+ 0x1f, 0x3b, 0x5f, 0x22, 0x3c, 0x61, 0x1f, 0x37, 0x5b, 0x1c, 0x34, 0x56,
+ 0x1c, 0x35, 0x54, 0x17, 0x2f, 0x53, 0x17, 0x31, 0x56, 0x1a, 0x34, 0x5a,
+ 0x1a, 0x34, 0x59, 0x13, 0x2d, 0x50, 0x17, 0x30, 0x56, 0x18, 0x32, 0x59,
+ 0x1a, 0x36, 0x59, 0x1c, 0x2c, 0x5a, 0x1b, 0x30, 0x5c, 0x14, 0x32, 0x56,
+ 0x13, 0x30, 0x51, 0x1c, 0x31, 0x4f, 0x45, 0x47, 0x56, 0x65, 0x58, 0x54,
+ 0x53, 0x4f, 0x43, 0x60, 0x5d, 0x54, 0x5f, 0x5f, 0x59, 0x64, 0x5e, 0x53,
+ 0x72, 0x5f, 0x59, 0x55, 0x42, 0x50, 0x54, 0x47, 0x52, 0x79, 0x67, 0x5a,
+ 0x7b, 0x7b, 0x72, 0x81, 0x8d, 0x83, 0x8f, 0x96, 0x91, 0x8c, 0x96, 0x92,
+ 0x89, 0x84, 0x80, 0x76, 0x63, 0x65, 0x39, 0x3e, 0x50, 0x57, 0x6d, 0x92,
+ 0x78, 0x89, 0x9f, 0x56, 0x5e, 0x6a, 0x3d, 0x40, 0x4d, 0x3a, 0x43, 0x52,
+ 0x39, 0x41, 0x4c, 0x3f, 0x3e, 0x43, 0x3f, 0x3f, 0x46, 0x3a, 0x3f, 0x4c,
+ 0x35, 0x39, 0x43, 0x31, 0x34, 0x3d, 0x2a, 0x2d, 0x36, 0x28, 0x2c, 0x37,
+ 0x26, 0x2c, 0x38, 0x26, 0x2e, 0x39, 0x22, 0x28, 0x30, 0x17, 0x1a, 0x1f,
+ 0x14, 0x18, 0x19, 0x13, 0x17, 0x18, 0x11, 0x15, 0x16, 0x10, 0x12, 0x14,
+ 0x11, 0x13, 0x15, 0x0f, 0x10, 0x12, 0x0f, 0x12, 0x11, 0x0d, 0x10, 0x0e,
+ 0x0c, 0x0e, 0x0d, 0x0e, 0x0f, 0x10, 0x0e, 0x0e, 0x10, 0x0f, 0x0f, 0x11,
+ 0x0d, 0x0d, 0x0f, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, 0x07, 0x09, 0x08,
+ 0x15, 0x19, 0x19, 0x45, 0x49, 0x4a, 0x55, 0x59, 0x58, 0x2d, 0x32, 0x32,
+ 0x29, 0x2f, 0x2f, 0x4d, 0x52, 0x55, 0x2f, 0x34, 0x38, 0x0e, 0x13, 0x1a,
+ 0x1f, 0x23, 0x2f, 0x43, 0x47, 0x51, 0x3d, 0x41, 0x49, 0x47, 0x4c, 0x51,
+ 0x5b, 0x60, 0x64, 0x53, 0x5c, 0x5e, 0x57, 0x61, 0x63, 0x3c, 0x47, 0x49,
+ 0x55, 0x62, 0x6b, 0x2c, 0x35, 0x44, 0x34, 0x3b, 0x4b, 0x32, 0x3a, 0x43,
+ 0x38, 0x41, 0x43, 0x5f, 0x69, 0x69, 0x40, 0x49, 0x50, 0x25, 0x2f, 0x3d,
+ 0x18, 0x1f, 0x27, 0x2c, 0x30, 0x31, 0x47, 0x48, 0x3f, 0x77, 0x76, 0x66,
+ 0x7a, 0x76, 0x65, 0x6a, 0x68, 0x5c, 0x49, 0x49, 0x45, 0x26, 0x27, 0x29,
+ 0x15, 0x1a, 0x1a, 0x0f, 0x14, 0x18, 0x11, 0x15, 0x1e, 0x2e, 0x32, 0x3b,
+ 0x44, 0x49, 0x4d, 0x33, 0x38, 0x3b, 0x22, 0x26, 0x2b, 0x1c, 0x1f, 0x28,
+ 0x19, 0x21, 0x29, 0x1b, 0x20, 0x28, 0x1a, 0x1b, 0x21, 0x1d, 0x1c, 0x1e,
+ 0x21, 0x21, 0x1f, 0x17, 0x19, 0x18, 0x15, 0x19, 0x1e, 0x10, 0x15, 0x1d,
+ 0x14, 0x18, 0x24, 0x11, 0x18, 0x26, 0x12, 0x1e, 0x2e, 0x16, 0x22, 0x32,
+ 0x15, 0x1e, 0x2d, 0x17, 0x1f, 0x2d, 0x11, 0x1a, 0x29, 0x0d, 0x18, 0x29,
+ 0x11, 0x1b, 0x2a, 0x1f, 0x25, 0x31, 0x1c, 0x1d, 0x24, 0x23, 0x1e, 0x22,
+ 0x26, 0x1e, 0x20, 0x23, 0x1d, 0x1f, 0x24, 0x20, 0x24, 0x25, 0x23, 0x28,
+ 0x23, 0x1f, 0x23, 0x1f, 0x1b, 0x1c, 0x2c, 0x28, 0x29, 0x40, 0x3c, 0x3d,
+ 0x2e, 0x29, 0x2f, 0x1f, 0x1a, 0x20, 0x30, 0x2e, 0x32, 0x29, 0x27, 0x2a,
+ 0x1e, 0x1c, 0x21, 0x20, 0x1e, 0x23, 0x28, 0x26, 0x29, 0x25, 0x23, 0x24,
+ 0x1d, 0x1c, 0x1c, 0x19, 0x19, 0x19, 0x1c, 0x1c, 0x1e, 0x1d, 0x1d, 0x1f,
+ 0x1a, 0x19, 0x1d, 0x36, 0x36, 0x3b, 0x3a, 0x3a, 0x42, 0x36, 0x36, 0x43,
+ 0x32, 0x34, 0x40, 0x2d, 0x30, 0x39, 0x26, 0x29, 0x32, 0x24, 0x24, 0x2c,
+ 0x18, 0x19, 0x1e, 0x1a, 0x1b, 0x1f, 0x1e, 0x1f, 0x23, 0x1c, 0x1d, 0x1f,
+ 0x16, 0x17, 0x19, 0x12, 0x14, 0x13, 0x0c, 0x0e, 0x0d, 0x0a, 0x0c, 0x0b,
+ 0x0a, 0x0b, 0x0d, 0x09, 0x0b, 0x0a, 0x11, 0x11, 0x11, 0x14, 0x14, 0x14,
+ 0x15, 0x14, 0x14, 0x19, 0x17, 0x18, 0x1c, 0x1a, 0x1b, 0x22, 0x1f, 0x22,
+ 0x23, 0x1f, 0x20, 0x19, 0x15, 0x17, 0x22, 0x20, 0x22, 0x42, 0x40, 0x43,
+ 0x1f, 0x1e, 0x20, 0x19, 0x17, 0x1a, 0x24, 0x21, 0x23, 0x23, 0x20, 0x21,
+ 0x25, 0x26, 0x2a, 0x2b, 0x2c, 0x30, 0x25, 0x26, 0x29, 0x26, 0x26, 0x2b,
+ 0x21, 0x22, 0x27, 0x31, 0x32, 0x37, 0x43, 0x42, 0x4b, 0x2d, 0x2d, 0x35,
+ 0x27, 0x28, 0x2d, 0x29, 0x2a, 0x2f, 0x2a, 0x2b, 0x30, 0x31, 0x30, 0x36,
+ 0x18, 0x17, 0x1c, 0x0c, 0x0b, 0x0e, 0x0e, 0x0d, 0x0c, 0x0e, 0x0d, 0x0b,
+ 0x0b, 0x0d, 0x0a, 0x09, 0x0b, 0x08, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x14, 0x16, 0x13, 0x24, 0x26, 0x21,
+ 0x2f, 0x31, 0x26, 0x63, 0x64, 0x5b, 0x75, 0x75, 0x71, 0x3f, 0x43, 0x43,
+ 0x33, 0x3a, 0x40, 0x3e, 0x47, 0x4f, 0x33, 0x3a, 0x3f, 0x31, 0x35, 0x38,
+ 0x32, 0x35, 0x38, 0x35, 0x39, 0x3c, 0x34, 0x38, 0x3b, 0x33, 0x37, 0x3a,
+ 0x33, 0x36, 0x3b, 0x31, 0x34, 0x3a, 0x33, 0x33, 0x3b, 0x32, 0x33, 0x3b,
+ 0x34, 0x37, 0x3c, 0x35, 0x38, 0x3d, 0x36, 0x37, 0x3b, 0x3b, 0x3c, 0x3f,
+ 0x35, 0x36, 0x38, 0x34, 0x35, 0x39, 0x30, 0x32, 0x36, 0x2b, 0x2e, 0x33,
+ 0x2a, 0x2e, 0x31, 0x25, 0x29, 0x2c, 0x27, 0x28, 0x2c, 0x2c, 0x2d, 0x31,
+ 0x30, 0x34, 0x37, 0x36, 0x3a, 0x3c, 0x32, 0x38, 0x38, 0x3d, 0x44, 0x43,
+ 0x44, 0x4d, 0x50, 0x46, 0x4d, 0x53, 0x40, 0x47, 0x4f, 0x35, 0x3c, 0x44,
+ 0x30, 0x35, 0x3b, 0x32, 0x37, 0x3b, 0x34, 0x37, 0x3c, 0x2e, 0x31, 0x36,
+ 0x21, 0x21, 0x29, 0x12, 0x13, 0x18, 0x0c, 0x0c, 0x10, 0x0e, 0x10, 0x0f,
+ 0x10, 0x12, 0x11, 0x11, 0x13, 0x12, 0x13, 0x14, 0x16, 0x14, 0x15, 0x18,
+ 0x13, 0x14, 0x16, 0x10, 0x10, 0x13, 0x10, 0x11, 0x13, 0x16, 0x17, 0x19,
+ 0x18, 0x19, 0x1b, 0x14, 0x15, 0x17, 0x17, 0x18, 0x1a, 0x26, 0x27, 0x29,
+ 0x2b, 0x2c, 0x2e, 0x29, 0x2d, 0x2e, 0x2b, 0x30, 0x33, 0x2c, 0x31, 0x35,
+ 0x2e, 0x33, 0x37, 0x2d, 0x32, 0x36, 0x2d, 0x32, 0x36, 0x2a, 0x2f, 0x32,
+ 0x2b, 0x2f, 0x32, 0x30, 0x33, 0x37, 0x30, 0x33, 0x38, 0x30, 0x33, 0x38,
+ 0x2f, 0x32, 0x37, 0x30, 0x33, 0x38, 0x30, 0x34, 0x37, 0x33, 0x37, 0x3a,
+ 0x32, 0x33, 0x38, 0x2c, 0x2f, 0x34, 0x2f, 0x32, 0x37, 0x2f, 0x32, 0x37,
+ 0x2e, 0x31, 0x37, 0x30, 0x33, 0x3a, 0x32, 0x34, 0x3b, 0x31, 0x31, 0x39,
+ 0x30, 0x34, 0x3a, 0x31, 0x36, 0x3c, 0x2e, 0x33, 0x3a, 0x2e, 0x33, 0x39,
+ 0x2d, 0x32, 0x36, 0x2e, 0x33, 0x37, 0x2d, 0x32, 0x36, 0x30, 0x33, 0x38,
+ 0x2e, 0x33, 0x36, 0x2e, 0x32, 0x36, 0x2a, 0x2d, 0x34, 0x2a, 0x2c, 0x31,
+ 0x2a, 0x2a, 0x2c, 0x1f, 0x21, 0x20, 0x17, 0x19, 0x18, 0x15, 0x16, 0x18,
+ 0x18, 0x18, 0x18, 0x16, 0x19, 0x1c, 0x19, 0x20, 0x26, 0x18, 0x1f, 0x25,
+ 0x13, 0x1b, 0x1e, 0x13, 0x19, 0x1c, 0x1b, 0x20, 0x26, 0x22, 0x26, 0x2f,
+ 0x48, 0x49, 0x58, 0x2a, 0x35, 0x4f, 0x1e, 0x37, 0x5d, 0x1a, 0x37, 0x61,
+ 0x1c, 0x3a, 0x60, 0x1e, 0x3c, 0x5e, 0x1f, 0x3e, 0x60, 0x1e, 0x3f, 0x62,
+ 0x26, 0x40, 0x65, 0x24, 0x3f, 0x61, 0x1d, 0x3a, 0x5a, 0x1b, 0x38, 0x5a,
+ 0x1b, 0x37, 0x5c, 0x1d, 0x36, 0x5d, 0x20, 0x3a, 0x5f, 0x1f, 0x37, 0x5b,
+ 0x1b, 0x33, 0x55, 0x17, 0x30, 0x54, 0x19, 0x32, 0x5a, 0x17, 0x33, 0x5a,
+ 0x17, 0x34, 0x57, 0x16, 0x33, 0x55, 0x17, 0x31, 0x54, 0x1d, 0x38, 0x5c,
+ 0x16, 0x34, 0x56, 0x16, 0x2d, 0x51, 0x19, 0x2c, 0x58, 0x12, 0x2d, 0x5d,
+ 0x0e, 0x2f, 0x51, 0x2d, 0x39, 0x47, 0x65, 0x57, 0x57, 0x65, 0x55, 0x4e,
+ 0x4b, 0x4c, 0x45, 0x70, 0x71, 0x74, 0x6a, 0x75, 0x79, 0x51, 0x5f, 0x54,
+ 0x62, 0x5e, 0x48, 0x67, 0x53, 0x4e, 0x60, 0x4b, 0x4d, 0x78, 0x60, 0x59,
+ 0x79, 0x72, 0x79, 0x72, 0x77, 0x79, 0x7e, 0x7f, 0x82, 0x87, 0x8d, 0x8c,
+ 0x84, 0x7c, 0x79, 0x78, 0x64, 0x65, 0x38, 0x3a, 0x4c, 0x28, 0x38, 0x60,
+ 0x55, 0x67, 0x7f, 0x65, 0x70, 0x82, 0x4f, 0x55, 0x68, 0x3a, 0x44, 0x52,
+ 0x39, 0x44, 0x48, 0x40, 0x44, 0x44, 0x40, 0x40, 0x48, 0x40, 0x41, 0x54,
+ 0x33, 0x37, 0x41, 0x2e, 0x32, 0x3b, 0x2b, 0x2e, 0x37, 0x28, 0x2c, 0x37,
+ 0x27, 0x2e, 0x39, 0x29, 0x31, 0x3b, 0x28, 0x2f, 0x37, 0x16, 0x1c, 0x20,
+ 0x14, 0x15, 0x17, 0x16, 0x17, 0x19, 0x12, 0x13, 0x15, 0x12, 0x13, 0x15,
+ 0x14, 0x15, 0x17, 0x10, 0x11, 0x13, 0x0e, 0x10, 0x0f, 0x0d, 0x0f, 0x0e,
+ 0x0d, 0x0e, 0x10, 0x0e, 0x0e, 0x10, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x11,
+ 0x10, 0x10, 0x12, 0x0e, 0x0e, 0x0e, 0x07, 0x09, 0x08, 0x1a, 0x1d, 0x1c,
+ 0x48, 0x4e, 0x4e, 0x52, 0x58, 0x58, 0x27, 0x2d, 0x2d, 0x2c, 0x32, 0x32,
+ 0x4f, 0x57, 0x58, 0x38, 0x40, 0x43, 0x1c, 0x24, 0x26, 0x0d, 0x16, 0x1c,
+ 0x0c, 0x0f, 0x1d, 0x1b, 0x1f, 0x2c, 0x25, 0x2a, 0x34, 0x51, 0x55, 0x5e,
+ 0x4e, 0x55, 0x5b, 0x27, 0x31, 0x33, 0x6a, 0x75, 0x77, 0x53, 0x5f, 0x61,
+ 0x24, 0x2b, 0x3c, 0x1d, 0x24, 0x34, 0x19, 0x23, 0x2e, 0x13, 0x1f, 0x21,
+ 0x3e, 0x4a, 0x45, 0x6c, 0x77, 0x73, 0x2b, 0x32, 0x38, 0x18, 0x1d, 0x2b,
+ 0x20, 0x20, 0x23, 0x29, 0x28, 0x25, 0x3c, 0x3a, 0x2e, 0x6c, 0x6a, 0x58,
+ 0x92, 0x8f, 0x7c, 0x91, 0x8e, 0x7b, 0x75, 0x72, 0x63, 0x58, 0x55, 0x49,
+ 0x2c, 0x2c, 0x29, 0x16, 0x17, 0x19, 0x10, 0x11, 0x17, 0x0e, 0x12, 0x18,
+ 0x22, 0x28, 0x2b, 0x45, 0x4b, 0x4f, 0x40, 0x45, 0x4b, 0x1f, 0x24, 0x2d,
+ 0x17, 0x1e, 0x28, 0x19, 0x1d, 0x24, 0x1f, 0x20, 0x21, 0x3e, 0x3e, 0x3a,
+ 0x51, 0x51, 0x48, 0x34, 0x35, 0x2f, 0x27, 0x28, 0x29, 0x20, 0x21, 0x28,
+ 0x19, 0x20, 0x2c, 0x1b, 0x24, 0x33, 0x17, 0x23, 0x31, 0x15, 0x21, 0x2f,
+ 0x15, 0x1f, 0x2b, 0x13, 0x1b, 0x28, 0x0e, 0x16, 0x25, 0x0d, 0x17, 0x27,
+ 0x10, 0x1f, 0x32, 0x15, 0x1f, 0x2e, 0x1b, 0x1c, 0x25, 0x22, 0x1e, 0x21,
+ 0x24, 0x1b, 0x1c, 0x23, 0x1b, 0x1c, 0x25, 0x20, 0x22, 0x24, 0x23, 0x28,
+ 0x24, 0x20, 0x24, 0x22, 0x1d, 0x1e, 0x2b, 0x27, 0x26, 0x3e, 0x3a, 0x3b,
+ 0x33, 0x2e, 0x32, 0x20, 0x1b, 0x1f, 0x2c, 0x2a, 0x2b, 0x35, 0x34, 0x33,
+ 0x2e, 0x2c, 0x2f, 0x1e, 0x1c, 0x1f, 0x19, 0x18, 0x19, 0x21, 0x1f, 0x20,
+ 0x1f, 0x1d, 0x1e, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1c, 0x1b, 0x1b, 0x1d,
+ 0x1b, 0x1c, 0x20, 0x38, 0x39, 0x3f, 0x36, 0x38, 0x41, 0x32, 0x34, 0x40,
+ 0x32, 0x34, 0x41, 0x29, 0x2b, 0x36, 0x26, 0x26, 0x30, 0x26, 0x25, 0x2f,
+ 0x19, 0x18, 0x1d, 0x1c, 0x1b, 0x20, 0x21, 0x20, 0x25, 0x1a, 0x1b, 0x1d,
+ 0x1a, 0x1b, 0x1d, 0x1a, 0x1c, 0x1d, 0x0e, 0x10, 0x11, 0x0c, 0x0d, 0x0f,
+ 0x0e, 0x0f, 0x11, 0x0f, 0x10, 0x12, 0x14, 0x14, 0x15, 0x11, 0x11, 0x11,
+ 0x14, 0x13, 0x13, 0x18, 0x17, 0x18, 0x1e, 0x1c, 0x1f, 0x25, 0x22, 0x25,
+ 0x25, 0x21, 0x22, 0x13, 0x10, 0x12, 0x3f, 0x3d, 0x40, 0x6d, 0x6d, 0x6f,
+ 0x1e, 0x1e, 0x20, 0x1a, 0x1a, 0x1c, 0x26, 0x25, 0x26, 0x1e, 0x1c, 0x1d,
+ 0x20, 0x21, 0x25, 0x26, 0x27, 0x2b, 0x23, 0x24, 0x28, 0x29, 0x2a, 0x2e,
+ 0x22, 0x23, 0x28, 0x2d, 0x2e, 0x33, 0x34, 0x34, 0x3c, 0x21, 0x21, 0x28,
+ 0x19, 0x19, 0x1e, 0x1e, 0x1f, 0x23, 0x22, 0x21, 0x26, 0x1c, 0x1b, 0x20,
+ 0x0d, 0x0d, 0x0f, 0x0b, 0x0b, 0x0b, 0x0e, 0x0d, 0x0c, 0x0d, 0x0c, 0x0a,
+ 0x0b, 0x0b, 0x09, 0x0b, 0x0b, 0x09, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0e, 0x0c, 0x11, 0x15, 0x12, 0x13, 0x18, 0x14,
+ 0x14, 0x18, 0x14, 0x23, 0x25, 0x22, 0x46, 0x48, 0x47, 0x30, 0x33, 0x36,
+ 0x31, 0x38, 0x3e, 0x3e, 0x45, 0x4e, 0x34, 0x39, 0x3f, 0x33, 0x37, 0x3a,
+ 0x32, 0x36, 0x39, 0x34, 0x38, 0x3b, 0x33, 0x37, 0x3a, 0x32, 0x36, 0x39,
+ 0x33, 0x37, 0x3a, 0x32, 0x35, 0x39, 0x34, 0x34, 0x3a, 0x35, 0x36, 0x3d,
+ 0x33, 0x36, 0x3b, 0x36, 0x39, 0x3e, 0x35, 0x38, 0x3b, 0x38, 0x39, 0x3d,
+ 0x33, 0x34, 0x38, 0x31, 0x32, 0x36, 0x2e, 0x30, 0x33, 0x2a, 0x2d, 0x31,
+ 0x2a, 0x2e, 0x31, 0x25, 0x29, 0x2c, 0x26, 0x27, 0x2b, 0x27, 0x28, 0x2c,
+ 0x2d, 0x30, 0x33, 0x32, 0x36, 0x39, 0x38, 0x3d, 0x40, 0x38, 0x3e, 0x41,
+ 0x3d, 0x47, 0x49, 0x44, 0x4d, 0x52, 0x3b, 0x42, 0x4a, 0x31, 0x38, 0x40,
+ 0x30, 0x35, 0x3b, 0x30, 0x35, 0x3a, 0x33, 0x38, 0x3e, 0x24, 0x26, 0x2f,
+ 0x14, 0x15, 0x1a, 0x0d, 0x0e, 0x12, 0x0d, 0x0e, 0x10, 0x0e, 0x10, 0x10,
+ 0x10, 0x12, 0x11, 0x14, 0x15, 0x15, 0x15, 0x16, 0x18, 0x14, 0x15, 0x19,
+ 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x13, 0x13, 0x15, 0x13, 0x13, 0x15,
+ 0x12, 0x12, 0x14, 0x10, 0x11, 0x13, 0x11, 0x12, 0x16, 0x1a, 0x1b, 0x1d,
+ 0x25, 0x27, 0x26, 0x27, 0x2b, 0x2c, 0x26, 0x2a, 0x2d, 0x28, 0x2d, 0x30,
+ 0x2b, 0x30, 0x33, 0x2a, 0x2f, 0x32, 0x2a, 0x2f, 0x32, 0x2b, 0x30, 0x33,
+ 0x2c, 0x30, 0x33, 0x2d, 0x31, 0x34, 0x2c, 0x2f, 0x34, 0x2d, 0x30, 0x35,
+ 0x2e, 0x31, 0x36, 0x31, 0x34, 0x39, 0x2f, 0x33, 0x36, 0x2f, 0x33, 0x36,
+ 0x30, 0x33, 0x38, 0x2e, 0x31, 0x36, 0x31, 0x34, 0x39, 0x2f, 0x34, 0x38,
+ 0x2e, 0x33, 0x37, 0x30, 0x33, 0x39, 0x2e, 0x31, 0x36, 0x30, 0x33, 0x38,
+ 0x30, 0x34, 0x3a, 0x2f, 0x34, 0x3a, 0x30, 0x35, 0x3b, 0x2e, 0x33, 0x39,
+ 0x2f, 0x34, 0x38, 0x2f, 0x34, 0x38, 0x2e, 0x33, 0x37, 0x2f, 0x34, 0x38,
+ 0x2f, 0x34, 0x37, 0x2d, 0x30, 0x35, 0x31, 0x32, 0x37, 0x2f, 0x30, 0x34,
+ 0x2c, 0x2c, 0x2c, 0x1a, 0x1a, 0x18, 0x16, 0x17, 0x17, 0x16, 0x17, 0x19,
+ 0x16, 0x16, 0x16, 0x12, 0x13, 0x16, 0x18, 0x1b, 0x24, 0x1a, 0x1f, 0x28,
+ 0x17, 0x1b, 0x23, 0x15, 0x18, 0x1f, 0x16, 0x19, 0x1e, 0x16, 0x19, 0x20,
+ 0x26, 0x36, 0x56, 0x21, 0x37, 0x5e, 0x1c, 0x37, 0x62, 0x1a, 0x37, 0x61,
+ 0x1d, 0x3b, 0x5f, 0x1e, 0x3c, 0x5b, 0x21, 0x40, 0x62, 0x1f, 0x3f, 0x63,
+ 0x28, 0x42, 0x6a, 0x23, 0x3d, 0x62, 0x22, 0x3f, 0x61, 0x1e, 0x3b, 0x5d,
+ 0x1c, 0x38, 0x5d, 0x1b, 0x35, 0x5c, 0x21, 0x3a, 0x62, 0x1f, 0x39, 0x5e,
+ 0x19, 0x33, 0x56, 0x19, 0x34, 0x59, 0x14, 0x30, 0x57, 0x18, 0x34, 0x5b,
+ 0x16, 0x33, 0x56, 0x1e, 0x3b, 0x5b, 0x2f, 0x49, 0x6a, 0x1c, 0x37, 0x5a,
+ 0x15, 0x31, 0x5a, 0x16, 0x37, 0x50, 0x1a, 0x33, 0x56, 0x15, 0x2c, 0x64,
+ 0x10, 0x30, 0x5b, 0x35, 0x3f, 0x47, 0x71, 0x5c, 0x50, 0x7b, 0x65, 0x5c,
+ 0x69, 0x68, 0x67, 0x72, 0x6f, 0x74, 0x65, 0x69, 0x71, 0x62, 0x66, 0x60,
+ 0x6c, 0x62, 0x50, 0x64, 0x54, 0x4f, 0x55, 0x44, 0x4b, 0x76, 0x5b, 0x5d,
+ 0x7f, 0x69, 0x68, 0x73, 0x6d, 0x6d, 0x79, 0x6f, 0x6f, 0x80, 0x77, 0x6e,
+ 0x72, 0x6b, 0x61, 0x55, 0x53, 0x57, 0x26, 0x34, 0x42, 0x26, 0x31, 0x44,
+ 0x2e, 0x37, 0x48, 0x39, 0x3d, 0x4c, 0x37, 0x39, 0x46, 0x30, 0x34, 0x40,
+ 0x38, 0x3e, 0x48, 0x3d, 0x44, 0x4c, 0x41, 0x43, 0x4d, 0x40, 0x3f, 0x4c,
+ 0x2d, 0x33, 0x3e, 0x2c, 0x30, 0x39, 0x2b, 0x30, 0x38, 0x26, 0x2d, 0x35,
+ 0x26, 0x2f, 0x38, 0x2a, 0x33, 0x3c, 0x31, 0x39, 0x41, 0x1c, 0x22, 0x26,
+ 0x12, 0x13, 0x15, 0x16, 0x17, 0x19, 0x14, 0x14, 0x17, 0x12, 0x13, 0x15,
+ 0x12, 0x13, 0x15, 0x10, 0x11, 0x13, 0x0e, 0x10, 0x0f, 0x0c, 0x0e, 0x0d,
+ 0x0d, 0x0e, 0x10, 0x0e, 0x0f, 0x0f, 0x0b, 0x0c, 0x0c, 0x0d, 0x0d, 0x0e,
+ 0x0f, 0x0f, 0x0f, 0x0b, 0x0c, 0x0c, 0x1b, 0x1d, 0x1e, 0x4a, 0x4e, 0x4f,
+ 0x51, 0x55, 0x56, 0x2c, 0x30, 0x32, 0x20, 0x25, 0x28, 0x53, 0x58, 0x5b,
+ 0x2f, 0x37, 0x39, 0x11, 0x19, 0x1c, 0x1a, 0x22, 0x25, 0x13, 0x1c, 0x21,
+ 0x27, 0x2b, 0x2f, 0x3a, 0x3f, 0x42, 0x30, 0x35, 0x38, 0x37, 0x3f, 0x41,
+ 0x59, 0x63, 0x65, 0x5f, 0x6a, 0x6a, 0x62, 0x6e, 0x6e, 0x4e, 0x5b, 0x5c,
+ 0x47, 0x4f, 0x52, 0x44, 0x4e, 0x50, 0x4a, 0x56, 0x56, 0x50, 0x5e, 0x5a,
+ 0x39, 0x46, 0x3d, 0x50, 0x5c, 0x52, 0x61, 0x67, 0x65, 0x2e, 0x2f, 0x33,
+ 0x33, 0x30, 0x2d, 0x3d, 0x3a, 0x34, 0x3b, 0x38, 0x2d, 0x3b, 0x3a, 0x28,
+ 0x66, 0x65, 0x51, 0x9b, 0x99, 0x84, 0x9e, 0x9a, 0x84, 0x8c, 0x87, 0x72,
+ 0x54, 0x50, 0x4d, 0x23, 0x21, 0x22, 0x17, 0x17, 0x19, 0x12, 0x16, 0x19,
+ 0x0d, 0x12, 0x16, 0x18, 0x1f, 0x23, 0x3b, 0x42, 0x47, 0x4a, 0x51, 0x59,
+ 0x2e, 0x33, 0x3c, 0x1c, 0x20, 0x25, 0x2f, 0x31, 0x2e, 0x76, 0x75, 0x6b,
+ 0x90, 0x8e, 0x80, 0x6a, 0x6b, 0x5f, 0x48, 0x48, 0x46, 0x32, 0x32, 0x37,
+ 0x1f, 0x27, 0x29, 0x1b, 0x25, 0x27, 0x0e, 0x19, 0x1c, 0x0e, 0x19, 0x1d,
+ 0x10, 0x19, 0x1f, 0x10, 0x19, 0x1e, 0x0f, 0x19, 0x21, 0x12, 0x1f, 0x2b,
+ 0x12, 0x23, 0x36, 0x12, 0x1e, 0x2e, 0x1b, 0x1d, 0x26, 0x21, 0x1e, 0x1f,
+ 0x21, 0x19, 0x19, 0x24, 0x1b, 0x1e, 0x37, 0x32, 0x38, 0x3c, 0x3b, 0x43,
+ 0x26, 0x21, 0x27, 0x1f, 0x1a, 0x1e, 0x23, 0x1d, 0x1f, 0x2a, 0x24, 0x27,
+ 0x25, 0x1f, 0x24, 0x20, 0x1c, 0x1f, 0x25, 0x23, 0x24, 0x2c, 0x2b, 0x2a,
+ 0x2d, 0x2b, 0x2c, 0x2d, 0x2b, 0x2c, 0x2d, 0x2b, 0x2c, 0x22, 0x20, 0x22,
+ 0x25, 0x23, 0x25, 0x1b, 0x1b, 0x1d, 0x17, 0x17, 0x19, 0x15, 0x15, 0x17,
+ 0x1c, 0x1f, 0x22, 0x34, 0x38, 0x3c, 0x33, 0x36, 0x3d, 0x31, 0x34, 0x3d,
+ 0x2d, 0x2f, 0x3b, 0x25, 0x25, 0x2f, 0x25, 0x25, 0x2f, 0x27, 0x27, 0x2f,
+ 0x1f, 0x1d, 0x22, 0x19, 0x17, 0x1c, 0x23, 0x22, 0x26, 0x1b, 0x1b, 0x1d,
+ 0x1b, 0x1b, 0x1d, 0x1d, 0x1e, 0x20, 0x0f, 0x10, 0x12, 0x10, 0x11, 0x13,
+ 0x10, 0x11, 0x13, 0x11, 0x12, 0x14, 0x12, 0x13, 0x14, 0x12, 0x12, 0x12,
+ 0x14, 0x14, 0x14, 0x19, 0x17, 0x1a, 0x20, 0x1e, 0x21, 0x1f, 0x1d, 0x20,
+ 0x21, 0x1f, 0x20, 0x15, 0x13, 0x14, 0x41, 0x41, 0x42, 0x4f, 0x4f, 0x51,
+ 0x1a, 0x1a, 0x1c, 0x21, 0x21, 0x23, 0x24, 0x24, 0x24, 0x1b, 0x1b, 0x1b,
+ 0x24, 0x23, 0x26, 0x28, 0x28, 0x2c, 0x28, 0x29, 0x2d, 0x29, 0x2a, 0x2f,
+ 0x25, 0x26, 0x2b, 0x1e, 0x1f, 0x24, 0x16, 0x15, 0x1b, 0x14, 0x13, 0x19,
+ 0x18, 0x17, 0x1c, 0x15, 0x14, 0x19, 0x10, 0x0f, 0x14, 0x0d, 0x0d, 0x0f,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0f, 0x0f, 0x0d, 0x0d, 0x0d, 0x0b,
+ 0x0c, 0x0b, 0x0a, 0x0b, 0x09, 0x0a, 0x0b, 0x0a, 0x0b, 0x0c, 0x0c, 0x0c,
+ 0x0a, 0x0b, 0x0a, 0x08, 0x0b, 0x09, 0x10, 0x14, 0x13, 0x15, 0x1b, 0x19,
+ 0x15, 0x1a, 0x1d, 0x17, 0x1b, 0x1d, 0x16, 0x1a, 0x1d, 0x19, 0x1d, 0x22,
+ 0x31, 0x38, 0x40, 0x3b, 0x42, 0x4a, 0x38, 0x3d, 0x41, 0x35, 0x39, 0x3c,
+ 0x31, 0x35, 0x38, 0x30, 0x34, 0x37, 0x31, 0x35, 0x38, 0x31, 0x35, 0x38,
+ 0x32, 0x36, 0x39, 0x35, 0x39, 0x3c, 0x35, 0x36, 0x3b, 0x35, 0x37, 0x3c,
+ 0x37, 0x3b, 0x3f, 0x35, 0x39, 0x3d, 0x34, 0x38, 0x3b, 0x35, 0x36, 0x3a,
+ 0x35, 0x35, 0x39, 0x2d, 0x2d, 0x32, 0x21, 0x25, 0x28, 0x21, 0x25, 0x28,
+ 0x21, 0x24, 0x27, 0x21, 0x23, 0x27, 0x24, 0x25, 0x29, 0x25, 0x26, 0x28,
+ 0x2e, 0x2f, 0x32, 0x2b, 0x2f, 0x32, 0x2e, 0x33, 0x36, 0x34, 0x3a, 0x3c,
+ 0x39, 0x43, 0x45, 0x45, 0x4e, 0x54, 0x3a, 0x43, 0x4a, 0x31, 0x38, 0x40,
+ 0x33, 0x38, 0x3e, 0x32, 0x37, 0x3d, 0x2e, 0x32, 0x3a, 0x1a, 0x1c, 0x28,
+ 0x0e, 0x0f, 0x11, 0x0d, 0x0f, 0x0f, 0x0c, 0x0e, 0x0d, 0x0f, 0x11, 0x10,
+ 0x10, 0x12, 0x11, 0x15, 0x17, 0x16, 0x15, 0x16, 0x17, 0x13, 0x14, 0x16,
+ 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x10, 0x10, 0x12,
+ 0x13, 0x12, 0x14, 0x11, 0x10, 0x15, 0x10, 0x11, 0x15, 0x11, 0x12, 0x16,
+ 0x18, 0x1a, 0x1a, 0x28, 0x2b, 0x2b, 0x26, 0x2a, 0x2b, 0x27, 0x2d, 0x2d,
+ 0x2b, 0x31, 0x31, 0x2a, 0x2f, 0x32, 0x28, 0x2d, 0x30, 0x27, 0x2c, 0x2f,
+ 0x2b, 0x2f, 0x32, 0x2c, 0x30, 0x33, 0x2b, 0x2e, 0x33, 0x2c, 0x2f, 0x34,
+ 0x2f, 0x32, 0x37, 0x33, 0x36, 0x3a, 0x2e, 0x32, 0x35, 0x2f, 0x33, 0x36,
+ 0x2d, 0x30, 0x35, 0x33, 0x36, 0x3b, 0x33, 0x36, 0x3b, 0x31, 0x36, 0x3a,
+ 0x2d, 0x32, 0x36, 0x2c, 0x30, 0x35, 0x2e, 0x30, 0x35, 0x30, 0x33, 0x38,
+ 0x2d, 0x32, 0x38, 0x2d, 0x32, 0x38, 0x2c, 0x31, 0x37, 0x2c, 0x31, 0x37,
+ 0x2d, 0x30, 0x36, 0x2e, 0x31, 0x36, 0x30, 0x35, 0x39, 0x2e, 0x33, 0x37,
+ 0x2e, 0x32, 0x35, 0x2e, 0x31, 0x36, 0x2d, 0x2f, 0x34, 0x2b, 0x2d, 0x30,
+ 0x22, 0x24, 0x23, 0x18, 0x18, 0x16, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19,
+ 0x14, 0x16, 0x14, 0x13, 0x18, 0x1a, 0x16, 0x1c, 0x25, 0x18, 0x1f, 0x29,
+ 0x16, 0x19, 0x24, 0x13, 0x16, 0x1d, 0x15, 0x18, 0x1d, 0x14, 0x17, 0x1c,
+ 0x1e, 0x38, 0x5d, 0x1d, 0x39, 0x61, 0x1b, 0x37, 0x5f, 0x1d, 0x38, 0x5f,
+ 0x1d, 0x3a, 0x5c, 0x1e, 0x39, 0x59, 0x1f, 0x3c, 0x61, 0x1e, 0x3b, 0x64,
+ 0x21, 0x3d, 0x65, 0x21, 0x3c, 0x61, 0x25, 0x3f, 0x62, 0x20, 0x3b, 0x5d,
+ 0x25, 0x3f, 0x64, 0x1e, 0x3a, 0x60, 0x1b, 0x37, 0x5e, 0x1a, 0x36, 0x5d,
+ 0x18, 0x34, 0x59, 0x16, 0x32, 0x58, 0x15, 0x31, 0x59, 0x16, 0x32, 0x59,
+ 0x17, 0x33, 0x58, 0x1e, 0x3b, 0x5d, 0x30, 0x4d, 0x6f, 0x17, 0x31, 0x55,
+ 0x17, 0x2e, 0x5a, 0x0e, 0x35, 0x50, 0x13, 0x34, 0x50, 0x17, 0x2c, 0x5b,
+ 0x18, 0x31, 0x5f, 0x2b, 0x39, 0x50, 0x62, 0x57, 0x54, 0x83, 0x70, 0x61,
+ 0x91, 0x8b, 0x7f, 0x9c, 0x9c, 0x8b, 0x8f, 0x8d, 0x82, 0x84, 0x6d, 0x6b,
+ 0x81, 0x5b, 0x5d, 0x56, 0x44, 0x54, 0x36, 0x39, 0x4f, 0x53, 0x4e, 0x5c,
+ 0x77, 0x59, 0x51, 0x78, 0x60, 0x57, 0x83, 0x61, 0x5f, 0x7c, 0x5f, 0x5a,
+ 0x64, 0x51, 0x52, 0x41, 0x36, 0x41, 0x45, 0x45, 0x4c, 0x67, 0x5b, 0x60,
+ 0x63, 0x60, 0x63, 0x62, 0x5e, 0x60, 0x61, 0x59, 0x59, 0x35, 0x2e, 0x36,
+ 0x39, 0x39, 0x4b, 0x4f, 0x56, 0x6c, 0x3a, 0x41, 0x4e, 0x35, 0x3a, 0x3b,
+ 0x29, 0x31, 0x3b, 0x2a, 0x31, 0x3b, 0x2b, 0x32, 0x3a, 0x27, 0x2f, 0x38,
+ 0x28, 0x32, 0x3c, 0x2a, 0x34, 0x3e, 0x29, 0x30, 0x3a, 0x1f, 0x24, 0x2a,
+ 0x12, 0x13, 0x15, 0x13, 0x15, 0x17, 0x14, 0x15, 0x17, 0x12, 0x13, 0x15,
+ 0x14, 0x15, 0x17, 0x10, 0x11, 0x13, 0x0e, 0x10, 0x0e, 0x0e, 0x10, 0x0f,
+ 0x0f, 0x10, 0x11, 0x0e, 0x10, 0x0f, 0x0e, 0x10, 0x0f, 0x0c, 0x0d, 0x0c,
+ 0x08, 0x0a, 0x09, 0x21, 0x23, 0x24, 0x4f, 0x52, 0x54, 0x4f, 0x53, 0x56,
+ 0x24, 0x26, 0x29, 0x13, 0x14, 0x17, 0x27, 0x28, 0x2c, 0x54, 0x57, 0x5b,
+ 0x3d, 0x42, 0x46, 0x1c, 0x21, 0x25, 0x19, 0x21, 0x24, 0x30, 0x38, 0x3b,
+ 0x5e, 0x64, 0x61, 0x56, 0x5c, 0x5a, 0x4e, 0x57, 0x56, 0x56, 0x60, 0x61,
+ 0x32, 0x3c, 0x3f, 0x3a, 0x45, 0x49, 0x2a, 0x35, 0x3a, 0x3a, 0x45, 0x4b,
+ 0x79, 0x83, 0x7c, 0x73, 0x7d, 0x79, 0x70, 0x7c, 0x7d, 0x79, 0x87, 0x88,
+ 0x39, 0x45, 0x45, 0x1a, 0x22, 0x20, 0x44, 0x47, 0x41, 0x3c, 0x3a, 0x35,
+ 0x41, 0x3c, 0x36, 0x41, 0x3e, 0x37, 0x40, 0x3e, 0x32, 0x3a, 0x3a, 0x2b,
+ 0x38, 0x38, 0x27, 0x53, 0x52, 0x3e, 0xa6, 0xa4, 0x8f, 0xb8, 0xb3, 0xa0,
+ 0x51, 0x4d, 0x4b, 0x28, 0x24, 0x24, 0x23, 0x23, 0x22, 0x2b, 0x2e, 0x2f,
+ 0x16, 0x1b, 0x1f, 0x10, 0x15, 0x19, 0x13, 0x1b, 0x1e, 0x35, 0x3d, 0x41,
+ 0x47, 0x4d, 0x51, 0x34, 0x37, 0x38, 0x37, 0x38, 0x31, 0x67, 0x67, 0x59,
+ 0xb4, 0xb4, 0xa1, 0xaa, 0xa8, 0x9b, 0x82, 0x81, 0x7d, 0x4b, 0x4b, 0x4d,
+ 0x29, 0x29, 0x27, 0x23, 0x28, 0x26, 0x13, 0x1b, 0x1d, 0x0d, 0x16, 0x19,
+ 0x0d, 0x16, 0x1a, 0x10, 0x1a, 0x21, 0x12, 0x20, 0x2b, 0x13, 0x25, 0x33,
+ 0x10, 0x22, 0x32, 0x0d, 0x1b, 0x27, 0x1b, 0x21, 0x27, 0x25, 0x22, 0x25,
+ 0x24, 0x1e, 0x20, 0x22, 0x1b, 0x20, 0x5f, 0x59, 0x63, 0x67, 0x63, 0x71,
+ 0x24, 0x1f, 0x29, 0x1f, 0x19, 0x20, 0x2a, 0x23, 0x2a, 0x23, 0x1c, 0x23,
+ 0x1d, 0x17, 0x1e, 0x2a, 0x24, 0x2a, 0x23, 0x21, 0x24, 0x21, 0x1f, 0x20,
+ 0x26, 0x24, 0x25, 0x24, 0x22, 0x23, 0x2a, 0x28, 0x2a, 0x24, 0x22, 0x25,
+ 0x1f, 0x1d, 0x20, 0x1b, 0x1b, 0x1d, 0x17, 0x17, 0x19, 0x16, 0x16, 0x18,
+ 0x1d, 0x1f, 0x1f, 0x34, 0x38, 0x3a, 0x35, 0x38, 0x3e, 0x31, 0x34, 0x3b,
+ 0x2e, 0x31, 0x38, 0x24, 0x24, 0x2c, 0x28, 0x28, 0x2e, 0x2b, 0x2b, 0x30,
+ 0x2a, 0x28, 0x2d, 0x19, 0x17, 0x1c, 0x1f, 0x1e, 0x22, 0x1b, 0x1a, 0x1f,
+ 0x20, 0x1f, 0x24, 0x1c, 0x1e, 0x20, 0x0d, 0x0e, 0x10, 0x0f, 0x10, 0x12,
+ 0x0f, 0x10, 0x12, 0x0e, 0x0f, 0x11, 0x0f, 0x10, 0x12, 0x13, 0x13, 0x13,
+ 0x15, 0x15, 0x15, 0x1a, 0x18, 0x1b, 0x22, 0x20, 0x23, 0x21, 0x1f, 0x22,
+ 0x27, 0x27, 0x29, 0x1b, 0x1b, 0x1d, 0x25, 0x25, 0x25, 0x2a, 0x2a, 0x2a,
+ 0x1a, 0x19, 0x1a, 0x3f, 0x3f, 0x3f, 0x31, 0x31, 0x33, 0x1c, 0x1c, 0x1e,
+ 0x24, 0x24, 0x26, 0x2c, 0x2c, 0x2e, 0x2a, 0x2b, 0x2f, 0x21, 0x22, 0x27,
+ 0x27, 0x28, 0x2d, 0x20, 0x21, 0x26, 0x11, 0x10, 0x15, 0x10, 0x0e, 0x13,
+ 0x18, 0x17, 0x1b, 0x13, 0x12, 0x17, 0x0e, 0x0e, 0x10, 0x0e, 0x0e, 0x10,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0e, 0x0e, 0x0c, 0x0c, 0x0c, 0x0b,
+ 0x0e, 0x0c, 0x0c, 0x0c, 0x09, 0x0b, 0x0b, 0x09, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0c, 0x0e, 0x0d, 0x0b, 0x0f, 0x0e, 0x10, 0x16, 0x16, 0x18, 0x1e, 0x1e,
+ 0x18, 0x1e, 0x24, 0x15, 0x1a, 0x1e, 0x12, 0x15, 0x1a, 0x18, 0x1b, 0x20,
+ 0x31, 0x37, 0x3d, 0x3f, 0x46, 0x4e, 0x3b, 0x40, 0x46, 0x35, 0x39, 0x3c,
+ 0x33, 0x36, 0x3a, 0x2f, 0x33, 0x37, 0x32, 0x36, 0x39, 0x35, 0x39, 0x3c,
+ 0x34, 0x38, 0x3b, 0x36, 0x3a, 0x3d, 0x39, 0x3a, 0x3f, 0x3a, 0x3b, 0x40,
+ 0x3a, 0x3f, 0x42, 0x34, 0x38, 0x3b, 0x33, 0x36, 0x3b, 0x33, 0x34, 0x38,
+ 0x32, 0x33, 0x37, 0x2a, 0x2c, 0x2f, 0x21, 0x25, 0x28, 0x23, 0x27, 0x2a,
+ 0x22, 0x24, 0x27, 0x24, 0x24, 0x29, 0x28, 0x29, 0x2c, 0x28, 0x29, 0x2b,
+ 0x30, 0x31, 0x33, 0x32, 0x36, 0x39, 0x31, 0x35, 0x38, 0x31, 0x37, 0x3b,
+ 0x33, 0x3d, 0x41, 0x3d, 0x46, 0x4d, 0x3c, 0x45, 0x4c, 0x39, 0x40, 0x48,
+ 0x38, 0x3d, 0x42, 0x36, 0x3b, 0x40, 0x2a, 0x2d, 0x34, 0x16, 0x18, 0x23,
+ 0x0d, 0x0f, 0x0f, 0x0e, 0x10, 0x0f, 0x0e, 0x10, 0x0f, 0x10, 0x12, 0x11,
+ 0x13, 0x15, 0x14, 0x14, 0x16, 0x15, 0x14, 0x16, 0x15, 0x12, 0x13, 0x15,
+ 0x12, 0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0x12, 0x12, 0x12,
+ 0x10, 0x10, 0x12, 0x15, 0x15, 0x18, 0x13, 0x14, 0x18, 0x10, 0x11, 0x15,
+ 0x10, 0x12, 0x11, 0x21, 0x23, 0x22, 0x2c, 0x30, 0x2f, 0x2a, 0x30, 0x30,
+ 0x2c, 0x32, 0x32, 0x2b, 0x31, 0x31, 0x2b, 0x30, 0x33, 0x29, 0x2e, 0x31,
+ 0x2c, 0x30, 0x33, 0x2b, 0x2f, 0x32, 0x2f, 0x32, 0x37, 0x2e, 0x31, 0x36,
+ 0x2f, 0x32, 0x37, 0x31, 0x34, 0x39, 0x31, 0x35, 0x38, 0x30, 0x34, 0x37,
+ 0x2d, 0x30, 0x35, 0x31, 0x34, 0x39, 0x31, 0x36, 0x3a, 0x30, 0x35, 0x39,
+ 0x2e, 0x33, 0x37, 0x2e, 0x33, 0x37, 0x2f, 0x32, 0x37, 0x30, 0x33, 0x38,
+ 0x29, 0x30, 0x36, 0x2c, 0x32, 0x38, 0x2f, 0x33, 0x3a, 0x2e, 0x31, 0x38,
+ 0x2d, 0x30, 0x35, 0x2f, 0x32, 0x37, 0x2f, 0x34, 0x38, 0x2d, 0x32, 0x36,
+ 0x30, 0x34, 0x37, 0x2f, 0x33, 0x38, 0x2d, 0x30, 0x37, 0x28, 0x2b, 0x30,
+ 0x1d, 0x1f, 0x20, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x13, 0x11, 0x14,
+ 0x12, 0x18, 0x16, 0x14, 0x1c, 0x1d, 0x15, 0x1e, 0x25, 0x15, 0x1d, 0x27,
+ 0x15, 0x19, 0x22, 0x11, 0x16, 0x1c, 0x15, 0x1a, 0x1e, 0x1b, 0x23, 0x26,
+ 0x1e, 0x3a, 0x61, 0x1e, 0x3a, 0x61, 0x1c, 0x37, 0x5f, 0x23, 0x3d, 0x62,
+ 0x23, 0x3e, 0x60, 0x1c, 0x39, 0x5b, 0x1f, 0x3b, 0x62, 0x1c, 0x37, 0x62,
+ 0x1c, 0x38, 0x60, 0x22, 0x3e, 0x63, 0x25, 0x3f, 0x62, 0x24, 0x3e, 0x61,
+ 0x20, 0x3a, 0x5f, 0x1f, 0x3b, 0x62, 0x1b, 0x38, 0x5f, 0x18, 0x36, 0x5c,
+ 0x1a, 0x36, 0x5c, 0x1b, 0x37, 0x5e, 0x18, 0x35, 0x5d, 0x14, 0x31, 0x59,
+ 0x12, 0x30, 0x54, 0x14, 0x31, 0x53, 0x17, 0x34, 0x58, 0x1b, 0x35, 0x5a,
+ 0x19, 0x2f, 0x58, 0x0f, 0x34, 0x5b, 0x10, 0x34, 0x57, 0x18, 0x31, 0x51,
+ 0x19, 0x31, 0x58, 0x1b, 0x2e, 0x5a, 0x3e, 0x43, 0x57, 0x66, 0x60, 0x53,
+ 0x8a, 0x77, 0x68, 0xa0, 0x90, 0x77, 0x92, 0x82, 0x6e, 0x7b, 0x5f, 0x60,
+ 0x64, 0x4e, 0x5d, 0x2c, 0x3c, 0x57, 0x12, 0x34, 0x57, 0x25, 0x37, 0x55,
+ 0x3a, 0x42, 0x56, 0x48, 0x48, 0x56, 0x52, 0x44, 0x56, 0x40, 0x3f, 0x51,
+ 0x2b, 0x31, 0x3e, 0x4a, 0x48, 0x4c, 0x6e, 0x70, 0x68, 0x81, 0x7e, 0x78,
+ 0x79, 0x72, 0x6e, 0x77, 0x6e, 0x67, 0x81, 0x74, 0x6c, 0x61, 0x52, 0x55,
+ 0x32, 0x2f, 0x44, 0x68, 0x73, 0x92, 0x47, 0x56, 0x68, 0x2b, 0x35, 0x37,
+ 0x26, 0x2f, 0x3b, 0x2a, 0x33, 0x3c, 0x28, 0x30, 0x39, 0x26, 0x2f, 0x38,
+ 0x27, 0x31, 0x3b, 0x29, 0x33, 0x3e, 0x29, 0x32, 0x3c, 0x21, 0x26, 0x2e,
+ 0x14, 0x17, 0x19, 0x13, 0x17, 0x18, 0x13, 0x17, 0x18, 0x12, 0x16, 0x17,
+ 0x13, 0x14, 0x16, 0x11, 0x13, 0x15, 0x10, 0x12, 0x11, 0x0e, 0x10, 0x0f,
+ 0x0f, 0x10, 0x12, 0x0f, 0x11, 0x10, 0x0c, 0x0e, 0x0d, 0x07, 0x09, 0x06,
+ 0x23, 0x25, 0x24, 0x56, 0x59, 0x5b, 0x51, 0x55, 0x58, 0x1e, 0x23, 0x26,
+ 0x11, 0x11, 0x15, 0x10, 0x10, 0x15, 0x13, 0x14, 0x19, 0x25, 0x28, 0x2d,
+ 0x55, 0x58, 0x5f, 0x43, 0x48, 0x4e, 0x2b, 0x31, 0x35, 0x55, 0x5c, 0x5f,
+ 0x5f, 0x68, 0x67, 0x59, 0x61, 0x62, 0x39, 0x42, 0x47, 0x67, 0x70, 0x77,
+ 0x35, 0x3e, 0x49, 0x20, 0x2a, 0x36, 0x1a, 0x23, 0x31, 0x1b, 0x24, 0x32,
+ 0x3b, 0x47, 0x46, 0x6d, 0x79, 0x7a, 0x6d, 0x78, 0x80, 0x41, 0x4b, 0x57,
+ 0x2b, 0x31, 0x3c, 0x39, 0x3c, 0x42, 0x39, 0x37, 0x35, 0x3a, 0x37, 0x30,
+ 0x44, 0x41, 0x3a, 0x41, 0x3e, 0x35, 0x44, 0x41, 0x37, 0x40, 0x3e, 0x32,
+ 0x3f, 0x3d, 0x31, 0x37, 0x35, 0x28, 0x50, 0x4e, 0x41, 0x64, 0x62, 0x56,
+ 0x37, 0x34, 0x33, 0x25, 0x24, 0x23, 0x3d, 0x3d, 0x3a, 0x59, 0x5b, 0x5a,
+ 0x21, 0x25, 0x28, 0x13, 0x17, 0x1b, 0x1c, 0x21, 0x23, 0x27, 0x2c, 0x2b,
+ 0x39, 0x3d, 0x3c, 0x42, 0x45, 0x42, 0x44, 0x45, 0x3d, 0x44, 0x42, 0x35,
+ 0x67, 0x65, 0x56, 0x9d, 0x9b, 0x90, 0x9a, 0x99, 0x96, 0x3d, 0x3c, 0x3f,
+ 0x2c, 0x28, 0x2d, 0x38, 0x37, 0x3d, 0x1b, 0x1e, 0x26, 0x10, 0x15, 0x1d,
+ 0x10, 0x16, 0x20, 0x13, 0x1c, 0x2b, 0x15, 0x24, 0x36, 0x10, 0x23, 0x38,
+ 0x0c, 0x1b, 0x2a, 0x0d, 0x19, 0x24, 0x17, 0x1e, 0x26, 0x26, 0x27, 0x2c,
+ 0x26, 0x23, 0x28, 0x27, 0x22, 0x29, 0x66, 0x60, 0x6c, 0x52, 0x4c, 0x59,
+ 0x21, 0x1b, 0x25, 0x2d, 0x26, 0x2e, 0x4d, 0x47, 0x4e, 0x3a, 0x33, 0x3a,
+ 0x23, 0x1c, 0x24, 0x22, 0x1d, 0x24, 0x22, 0x20, 0x25, 0x23, 0x21, 0x22,
+ 0x26, 0x25, 0x25, 0x22, 0x20, 0x23, 0x1e, 0x1c, 0x1f, 0x1d, 0x1b, 0x20,
+ 0x1d, 0x1c, 0x20, 0x23, 0x23, 0x25, 0x18, 0x18, 0x1a, 0x15, 0x15, 0x17,
+ 0x19, 0x1b, 0x1a, 0x35, 0x36, 0x38, 0x3c, 0x3d, 0x41, 0x35, 0x38, 0x3d,
+ 0x35, 0x35, 0x3c, 0x24, 0x25, 0x2a, 0x2c, 0x2d, 0x31, 0x2d, 0x2c, 0x31,
+ 0x2d, 0x2c, 0x31, 0x1c, 0x1b, 0x20, 0x14, 0x14, 0x19, 0x19, 0x19, 0x1e,
+ 0x25, 0x26, 0x2a, 0x1d, 0x1f, 0x21, 0x0c, 0x0d, 0x0f, 0x0d, 0x0e, 0x10,
+ 0x12, 0x13, 0x15, 0x11, 0x12, 0x14, 0x0f, 0x10, 0x10, 0x16, 0x16, 0x16,
+ 0x17, 0x17, 0x17, 0x18, 0x17, 0x18, 0x1c, 0x1a, 0x1d, 0x21, 0x1f, 0x22,
+ 0x22, 0x23, 0x25, 0x1c, 0x1c, 0x1e, 0x1e, 0x1c, 0x1d, 0x18, 0x16, 0x17,
+ 0x20, 0x1e, 0x1f, 0x55, 0x55, 0x55, 0x35, 0x35, 0x37, 0x1b, 0x1c, 0x1e,
+ 0x27, 0x26, 0x28, 0x26, 0x26, 0x28, 0x22, 0x23, 0x27, 0x23, 0x24, 0x29,
+ 0x1e, 0x1f, 0x24, 0x1d, 0x1d, 0x22, 0x11, 0x10, 0x15, 0x12, 0x10, 0x13,
+ 0x17, 0x16, 0x1b, 0x11, 0x10, 0x15, 0x0d, 0x0d, 0x0f, 0x0d, 0x0d, 0x0d,
+ 0x0c, 0x0c, 0x0c, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0c, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08,
+ 0x0a, 0x0c, 0x0b, 0x0f, 0x14, 0x14, 0x17, 0x1d, 0x1e, 0x16, 0x1b, 0x1e,
+ 0x15, 0x1b, 0x23, 0x18, 0x1d, 0x21, 0x12, 0x16, 0x19, 0x1b, 0x1e, 0x21,
+ 0x31, 0x36, 0x3c, 0x41, 0x48, 0x4e, 0x37, 0x3e, 0x44, 0x32, 0x37, 0x3b,
+ 0x35, 0x38, 0x3d, 0x32, 0x35, 0x3a, 0x36, 0x3a, 0x3d, 0x33, 0x37, 0x3a,
+ 0x33, 0x37, 0x3a, 0x38, 0x3b, 0x3f, 0x3e, 0x3f, 0x44, 0x37, 0x39, 0x3e,
+ 0x34, 0x38, 0x3b, 0x30, 0x34, 0x37, 0x30, 0x34, 0x38, 0x33, 0x35, 0x3a,
+ 0x33, 0x35, 0x39, 0x2a, 0x2d, 0x30, 0x26, 0x2a, 0x2d, 0x27, 0x2a, 0x2c,
+ 0x27, 0x28, 0x2c, 0x27, 0x28, 0x2c, 0x25, 0x26, 0x28, 0x2a, 0x2c, 0x2d,
+ 0x34, 0x35, 0x37, 0x38, 0x3c, 0x3f, 0x36, 0x39, 0x3e, 0x34, 0x3a, 0x3f,
+ 0x3b, 0x44, 0x4b, 0x3c, 0x45, 0x4d, 0x3a, 0x41, 0x49, 0x3c, 0x42, 0x49,
+ 0x36, 0x3b, 0x3f, 0x34, 0x36, 0x3b, 0x29, 0x29, 0x31, 0x15, 0x15, 0x1e,
+ 0x0e, 0x10, 0x10, 0x0f, 0x10, 0x0f, 0x11, 0x13, 0x12, 0x13, 0x15, 0x14,
+ 0x14, 0x16, 0x15, 0x12, 0x14, 0x13, 0x12, 0x14, 0x13, 0x12, 0x13, 0x12,
+ 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x13, 0x12, 0x12, 0x13, 0x13, 0x14,
+ 0x10, 0x11, 0x13, 0x15, 0x16, 0x18, 0x14, 0x15, 0x17, 0x10, 0x11, 0x13,
+ 0x0e, 0x0f, 0x11, 0x19, 0x1a, 0x1b, 0x2a, 0x2d, 0x2c, 0x2c, 0x30, 0x2f,
+ 0x2e, 0x33, 0x33, 0x2b, 0x31, 0x31, 0x2e, 0x32, 0x35, 0x2c, 0x30, 0x33,
+ 0x2a, 0x2e, 0x31, 0x2b, 0x2f, 0x32, 0x31, 0x35, 0x39, 0x2f, 0x32, 0x37,
+ 0x30, 0x33, 0x38, 0x2d, 0x30, 0x35, 0x2f, 0x33, 0x36, 0x32, 0x36, 0x39,
+ 0x31, 0x35, 0x38, 0x31, 0x35, 0x38, 0x31, 0x36, 0x39, 0x32, 0x37, 0x3b,
+ 0x2f, 0x34, 0x38, 0x30, 0x34, 0x39, 0x2e, 0x32, 0x37, 0x2e, 0x31, 0x38,
+ 0x2b, 0x32, 0x38, 0x2f, 0x34, 0x3b, 0x2f, 0x33, 0x3a, 0x2c, 0x2f, 0x35,
+ 0x2f, 0x31, 0x36, 0x2f, 0x32, 0x37, 0x2e, 0x33, 0x37, 0x30, 0x35, 0x39,
+ 0x2f, 0x34, 0x38, 0x30, 0x35, 0x3b, 0x2e, 0x33, 0x39, 0x28, 0x2c, 0x31,
+ 0x1e, 0x21, 0x23, 0x16, 0x18, 0x18, 0x15, 0x15, 0x17, 0x17, 0x15, 0x18,
+ 0x17, 0x1d, 0x1d, 0x1a, 0x22, 0x25, 0x18, 0x21, 0x26, 0x11, 0x1a, 0x1f,
+ 0x14, 0x19, 0x1d, 0x13, 0x18, 0x1b, 0x17, 0x1e, 0x21, 0x25, 0x2f, 0x31,
+ 0x20, 0x3b, 0x66, 0x1f, 0x38, 0x61, 0x1e, 0x37, 0x5f, 0x23, 0x3f, 0x64,
+ 0x24, 0x42, 0x65, 0x1e, 0x3c, 0x60, 0x21, 0x3d, 0x64, 0x1e, 0x3a, 0x62,
+ 0x1c, 0x38, 0x60, 0x20, 0x3c, 0x61, 0x25, 0x3f, 0x62, 0x26, 0x40, 0x63,
+ 0x1d, 0x37, 0x5d, 0x1c, 0x38, 0x5f, 0x1f, 0x3c, 0x63, 0x1a, 0x38, 0x5e,
+ 0x1c, 0x3a, 0x5e, 0x1a, 0x38, 0x60, 0x17, 0x34, 0x5e, 0x15, 0x32, 0x5a,
+ 0x15, 0x33, 0x59, 0x15, 0x31, 0x56, 0x1b, 0x37, 0x5e, 0x27, 0x43, 0x6a,
+ 0x1b, 0x37, 0x5f, 0x19, 0x34, 0x60, 0x10, 0x31, 0x5a, 0x12, 0x35, 0x54,
+ 0x18, 0x32, 0x5a, 0x1a, 0x30, 0x61, 0x1f, 0x33, 0x56, 0x35, 0x41, 0x4d,
+ 0x54, 0x49, 0x56, 0x5b, 0x4c, 0x4e, 0x55, 0x4b, 0x51, 0x49, 0x47, 0x5b,
+ 0x2d, 0x3e, 0x59, 0x0f, 0x39, 0x5c, 0x0c, 0x36, 0x5f, 0x1b, 0x2f, 0x58,
+ 0x1c, 0x30, 0x61, 0x1a, 0x2f, 0x5f, 0x22, 0x2f, 0x60, 0x1b, 0x2e, 0x53,
+ 0x21, 0x2c, 0x3d, 0x67, 0x5f, 0x5f, 0x80, 0x80, 0x79, 0x88, 0x86, 0x89,
+ 0x7b, 0x7b, 0x7a, 0x7e, 0x7c, 0x7a, 0x84, 0x78, 0x74, 0x72, 0x62, 0x60,
+ 0x2d, 0x2b, 0x38, 0x4c, 0x5e, 0x79, 0x73, 0x89, 0xa4, 0x51, 0x5f, 0x71,
+ 0x2e, 0x37, 0x45, 0x28, 0x31, 0x3b, 0x28, 0x31, 0x3a, 0x28, 0x31, 0x3b,
+ 0x27, 0x31, 0x3b, 0x2b, 0x35, 0x40, 0x2c, 0x34, 0x3f, 0x23, 0x27, 0x32,
+ 0x16, 0x1a, 0x1c, 0x16, 0x1a, 0x1b, 0x13, 0x17, 0x18, 0x10, 0x14, 0x15,
+ 0x10, 0x14, 0x15, 0x10, 0x14, 0x15, 0x0d, 0x11, 0x10, 0x0d, 0x11, 0x10,
+ 0x0e, 0x10, 0x11, 0x0b, 0x0d, 0x0d, 0x09, 0x0b, 0x08, 0x29, 0x2b, 0x28,
+ 0x5b, 0x5e, 0x5a, 0x4f, 0x53, 0x54, 0x1e, 0x23, 0x26, 0x0b, 0x10, 0x14,
+ 0x12, 0x13, 0x17, 0x11, 0x12, 0x17, 0x0f, 0x12, 0x17, 0x10, 0x13, 0x19,
+ 0x23, 0x28, 0x2e, 0x2d, 0x34, 0x3a, 0x44, 0x4e, 0x50, 0x59, 0x63, 0x65,
+ 0x35, 0x3f, 0x41, 0x69, 0x72, 0x77, 0x51, 0x5c, 0x62, 0x30, 0x3a, 0x43,
+ 0x32, 0x3d, 0x46, 0x62, 0x6c, 0x75, 0x52, 0x5b, 0x64, 0x27, 0x31, 0x3a,
+ 0x30, 0x3d, 0x46, 0x6c, 0x7a, 0x83, 0x48, 0x53, 0x5d, 0x27, 0x2f, 0x38,
+ 0x4c, 0x50, 0x59, 0x79, 0x78, 0x7b, 0x76, 0x73, 0x6b, 0x61, 0x5d, 0x50,
+ 0x3c, 0x3c, 0x32, 0x45, 0x43, 0x38, 0x49, 0x45, 0x3a, 0x48, 0x43, 0x38,
+ 0x48, 0x43, 0x3a, 0x49, 0x44, 0x3d, 0x3c, 0x39, 0x33, 0x28, 0x25, 0x22,
+ 0x2a, 0x29, 0x2d, 0x22, 0x23, 0x23, 0x40, 0x42, 0x3e, 0x3e, 0x42, 0x41,
+ 0x18, 0x1c, 0x1f, 0x17, 0x1b, 0x1e, 0x20, 0x25, 0x24, 0x38, 0x3c, 0x36,
+ 0x40, 0x43, 0x3a, 0x43, 0x44, 0x3c, 0x4c, 0x4b, 0x42, 0x4b, 0x49, 0x3d,
+ 0x4a, 0x48, 0x3a, 0x4a, 0x49, 0x3f, 0x40, 0x40, 0x3c, 0x1d, 0x1e, 0x20,
+ 0x1d, 0x1a, 0x23, 0x1d, 0x1c, 0x27, 0x13, 0x15, 0x1f, 0x12, 0x15, 0x1e,
+ 0x15, 0x1a, 0x22, 0x1b, 0x21, 0x2d, 0x21, 0x2c, 0x3c, 0x11, 0x21, 0x33,
+ 0x11, 0x1b, 0x2d, 0x13, 0x19, 0x29, 0x10, 0x17, 0x23, 0x1b, 0x20, 0x28,
+ 0x25, 0x25, 0x2d, 0x22, 0x1f, 0x25, 0x43, 0x3b, 0x43, 0x35, 0x2b, 0x34,
+ 0x28, 0x23, 0x2a, 0x3b, 0x34, 0x3b, 0x41, 0x3b, 0x3e, 0x40, 0x3a, 0x3e,
+ 0x2a, 0x23, 0x2a, 0x1e, 0x19, 0x1f, 0x26, 0x22, 0x26, 0x20, 0x1e, 0x1f,
+ 0x1c, 0x1a, 0x1d, 0x1f, 0x1d, 0x22, 0x1a, 0x18, 0x1e, 0x1b, 0x19, 0x1e,
+ 0x21, 0x20, 0x24, 0x1f, 0x1f, 0x21, 0x14, 0x14, 0x16, 0x14, 0x14, 0x14,
+ 0x19, 0x17, 0x18, 0x34, 0x32, 0x35, 0x3f, 0x3e, 0x45, 0x3b, 0x3b, 0x43,
+ 0x3b, 0x3b, 0x43, 0x2b, 0x2b, 0x33, 0x2b, 0x2c, 0x31, 0x32, 0x33, 0x37,
+ 0x2e, 0x2f, 0x34, 0x1f, 0x20, 0x25, 0x13, 0x14, 0x19, 0x1b, 0x1c, 0x20,
+ 0x29, 0x2a, 0x2d, 0x1a, 0x1b, 0x1d, 0x08, 0x09, 0x0b, 0x0b, 0x0c, 0x0c,
+ 0x17, 0x18, 0x19, 0x13, 0x15, 0x15, 0x10, 0x12, 0x11, 0x16, 0x17, 0x16,
+ 0x16, 0x16, 0x16, 0x14, 0x14, 0x14, 0x1f, 0x1d, 0x1e, 0x27, 0x25, 0x28,
+ 0x20, 0x20, 0x22, 0x1e, 0x1c, 0x1f, 0x1e, 0x1c, 0x1d, 0x19, 0x17, 0x18,
+ 0x22, 0x20, 0x21, 0x3a, 0x38, 0x39, 0x29, 0x29, 0x2b, 0x1a, 0x1a, 0x1c,
+ 0x24, 0x22, 0x23, 0x21, 0x21, 0x23, 0x1e, 0x1f, 0x22, 0x24, 0x26, 0x2b,
+ 0x1e, 0x20, 0x24, 0x19, 0x1a, 0x1e, 0x11, 0x11, 0x14, 0x10, 0x0e, 0x0f,
+ 0x15, 0x14, 0x19, 0x12, 0x11, 0x16, 0x0e, 0x0e, 0x10, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0d, 0x0a, 0x0a, 0x0c, 0x0a, 0x0a, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x09, 0x0b, 0x0b, 0x0f, 0x13, 0x14, 0x1a, 0x1e, 0x21, 0x1c, 0x21, 0x24,
+ 0x17, 0x1c, 0x21, 0x16, 0x1a, 0x1d, 0x11, 0x12, 0x14, 0x1c, 0x1d, 0x1f,
+ 0x34, 0x39, 0x3d, 0x41, 0x48, 0x4e, 0x3b, 0x42, 0x4a, 0x32, 0x37, 0x3d,
+ 0x34, 0x37, 0x3e, 0x35, 0x38, 0x3d, 0x36, 0x39, 0x3e, 0x33, 0x36, 0x3b,
+ 0x33, 0x36, 0x3a, 0x32, 0x35, 0x3a, 0x3a, 0x3b, 0x40, 0x37, 0x38, 0x3d,
+ 0x33, 0x38, 0x3b, 0x30, 0x35, 0x38, 0x31, 0x35, 0x39, 0x34, 0x37, 0x3c,
+ 0x34, 0x36, 0x3b, 0x2f, 0x33, 0x36, 0x2b, 0x30, 0x32, 0x2c, 0x30, 0x31,
+ 0x2b, 0x2c, 0x2f, 0x29, 0x2a, 0x2d, 0x27, 0x28, 0x2a, 0x2a, 0x2c, 0x2b,
+ 0x2e, 0x2f, 0x31, 0x2f, 0x33, 0x36, 0x35, 0x38, 0x3d, 0x32, 0x37, 0x3d,
+ 0x41, 0x4a, 0x51, 0x45, 0x4e, 0x57, 0x36, 0x3d, 0x45, 0x34, 0x39, 0x3f,
+ 0x33, 0x37, 0x3a, 0x33, 0x34, 0x36, 0x28, 0x28, 0x2c, 0x13, 0x13, 0x1a,
+ 0x0f, 0x10, 0x12, 0x10, 0x12, 0x13, 0x11, 0x12, 0x14, 0x15, 0x16, 0x17,
+ 0x14, 0x16, 0x16, 0x12, 0x14, 0x12, 0x10, 0x12, 0x0f, 0x11, 0x12, 0x0f,
+ 0x0f, 0x11, 0x10, 0x11, 0x13, 0x12, 0x11, 0x13, 0x12, 0x12, 0x14, 0x13,
+ 0x11, 0x13, 0x12, 0x12, 0x14, 0x14, 0x13, 0x16, 0x14, 0x11, 0x13, 0x13,
+ 0x11, 0x12, 0x14, 0x15, 0x16, 0x18, 0x23, 0x27, 0x26, 0x28, 0x2c, 0x2b,
+ 0x2c, 0x32, 0x31, 0x2d, 0x33, 0x33, 0x2f, 0x33, 0x36, 0x2d, 0x30, 0x35,
+ 0x2a, 0x2e, 0x31, 0x2c, 0x30, 0x33, 0x30, 0x33, 0x38, 0x31, 0x34, 0x39,
+ 0x2e, 0x30, 0x36, 0x2f, 0x31, 0x36, 0x2e, 0x32, 0x35, 0x2f, 0x33, 0x36,
+ 0x30, 0x34, 0x35, 0x30, 0x34, 0x35, 0x2f, 0x34, 0x36, 0x30, 0x35, 0x38,
+ 0x30, 0x35, 0x39, 0x30, 0x35, 0x3a, 0x2f, 0x33, 0x3a, 0x30, 0x33, 0x3a,
+ 0x2c, 0x32, 0x38, 0x2f, 0x34, 0x3a, 0x2f, 0x32, 0x39, 0x2f, 0x2f, 0x37,
+ 0x2f, 0x30, 0x35, 0x2e, 0x31, 0x35, 0x2d, 0x32, 0x36, 0x2e, 0x33, 0x37,
+ 0x2d, 0x32, 0x38, 0x2c, 0x32, 0x38, 0x2d, 0x31, 0x39, 0x29, 0x2e, 0x34,
+ 0x21, 0x25, 0x28, 0x18, 0x19, 0x1b, 0x19, 0x19, 0x1b, 0x1d, 0x1c, 0x20,
+ 0x19, 0x1c, 0x20, 0x1c, 0x21, 0x25, 0x18, 0x20, 0x23, 0x15, 0x1b, 0x1e,
+ 0x19, 0x1e, 0x1f, 0x17, 0x1e, 0x1d, 0x1a, 0x22, 0x25, 0x19, 0x22, 0x28,
+ 0x20, 0x3a, 0x67, 0x22, 0x3a, 0x66, 0x23, 0x3c, 0x64, 0x21, 0x3d, 0x63,
+ 0x20, 0x40, 0x64, 0x21, 0x41, 0x67, 0x1f, 0x3d, 0x64, 0x1f, 0x3b, 0x63,
+ 0x22, 0x3e, 0x66, 0x21, 0x3d, 0x62, 0x20, 0x3a, 0x5c, 0x24, 0x3e, 0x5f,
+ 0x21, 0x3b, 0x60, 0x1c, 0x39, 0x5f, 0x1f, 0x3d, 0x63, 0x1f, 0x3d, 0x62,
+ 0x1a, 0x38, 0x5c, 0x19, 0x36, 0x5e, 0x18, 0x35, 0x5f, 0x14, 0x31, 0x5b,
+ 0x16, 0x34, 0x5b, 0x15, 0x32, 0x59, 0x1f, 0x3b, 0x62, 0x1d, 0x3a, 0x62,
+ 0x19, 0x39, 0x63, 0x24, 0x37, 0x61, 0x16, 0x33, 0x5a, 0x0d, 0x36, 0x5f,
+ 0x1b, 0x39, 0x66, 0x1e, 0x37, 0x60, 0x16, 0x33, 0x56, 0x19, 0x31, 0x59,
+ 0x1f, 0x37, 0x66, 0x1f, 0x31, 0x56, 0x1d, 0x35, 0x59, 0x1b, 0x36, 0x61,
+ 0x1b, 0x30, 0x5d, 0x1a, 0x2e, 0x5d, 0x17, 0x31, 0x60, 0x1b, 0x2d, 0x56,
+ 0x1f, 0x2a, 0x4d, 0x16, 0x35, 0x61, 0x16, 0x35, 0x65, 0x1a, 0x30, 0x4a,
+ 0x2d, 0x2e, 0x32, 0x6e, 0x63, 0x61, 0x82, 0x7e, 0x84, 0x8d, 0x86, 0x97,
+ 0x81, 0x89, 0x8b, 0x7c, 0x80, 0x85, 0x84, 0x7d, 0x7e, 0x6d, 0x5e, 0x5b,
+ 0x3e, 0x40, 0x43, 0x31, 0x47, 0x5d, 0x42, 0x5c, 0x7d, 0x74, 0x85, 0xa5,
+ 0x64, 0x6f, 0x80, 0x31, 0x3b, 0x47, 0x2b, 0x34, 0x3e, 0x25, 0x2f, 0x39,
+ 0x23, 0x2f, 0x3b, 0x29, 0x33, 0x40, 0x2a, 0x32, 0x3f, 0x23, 0x29, 0x34,
+ 0x18, 0x1d, 0x1f, 0x14, 0x1a, 0x1a, 0x12, 0x17, 0x18, 0x10, 0x13, 0x14,
+ 0x10, 0x13, 0x14, 0x0f, 0x13, 0x14, 0x0c, 0x10, 0x0f, 0x0e, 0x11, 0x11,
+ 0x0a, 0x0b, 0x0c, 0x08, 0x0a, 0x09, 0x2d, 0x2f, 0x2d, 0x5b, 0x5e, 0x5b,
+ 0x4d, 0x50, 0x4d, 0x1d, 0x20, 0x21, 0x0e, 0x13, 0x16, 0x10, 0x15, 0x19,
+ 0x12, 0x16, 0x1a, 0x11, 0x14, 0x19, 0x0d, 0x12, 0x18, 0x0f, 0x16, 0x1d,
+ 0x0e, 0x16, 0x1d, 0x0f, 0x18, 0x1e, 0x2d, 0x38, 0x3a, 0x5b, 0x66, 0x68,
+ 0x5b, 0x66, 0x67, 0x68, 0x74, 0x74, 0x4e, 0x5a, 0x5c, 0x1e, 0x2b, 0x2d,
+ 0x20, 0x2c, 0x2d, 0x43, 0x4e, 0x4e, 0x70, 0x7a, 0x79, 0x5c, 0x65, 0x65,
+ 0x29, 0x39, 0x48, 0x2c, 0x3d, 0x48, 0x16, 0x22, 0x27, 0x2c, 0x34, 0x33,
+ 0x83, 0x88, 0x82, 0xa2, 0xa3, 0x98, 0x94, 0x91, 0x80, 0x8c, 0x8a, 0x74,
+ 0x57, 0x58, 0x4a, 0x43, 0x41, 0x35, 0x49, 0x43, 0x38, 0x4e, 0x46, 0x3c,
+ 0x4f, 0x46, 0x3f, 0x45, 0x3d, 0x39, 0x2e, 0x2a, 0x28, 0x1e, 0x1c, 0x1f,
+ 0x22, 0x23, 0x28, 0x19, 0x1a, 0x1c, 0x1a, 0x1f, 0x1b, 0x1a, 0x1e, 0x1d,
+ 0x1c, 0x20, 0x21, 0x22, 0x26, 0x27, 0x57, 0x5b, 0x57, 0x72, 0x77, 0x6d,
+ 0x5c, 0x5f, 0x51, 0x44, 0x46, 0x3b, 0x4a, 0x49, 0x3f, 0x5a, 0x58, 0x4c,
+ 0x51, 0x4f, 0x43, 0x33, 0x33, 0x2c, 0x1b, 0x1c, 0x19, 0x19, 0x1a, 0x1d,
+ 0x12, 0x13, 0x19, 0x10, 0x12, 0x17, 0x12, 0x15, 0x1a, 0x21, 0x24, 0x27,
+ 0x29, 0x2d, 0x2e, 0x27, 0x2c, 0x2d, 0x37, 0x40, 0x45, 0x1f, 0x2b, 0x34,
+ 0x1a, 0x20, 0x34, 0x14, 0x19, 0x2d, 0x13, 0x19, 0x29, 0x17, 0x1d, 0x2a,
+ 0x24, 0x26, 0x30, 0x25, 0x22, 0x29, 0x23, 0x1c, 0x21, 0x29, 0x1e, 0x22,
+ 0x36, 0x30, 0x34, 0x39, 0x32, 0x35, 0x2f, 0x29, 0x2a, 0x2d, 0x27, 0x29,
+ 0x25, 0x1e, 0x23, 0x23, 0x1e, 0x22, 0x2f, 0x2b, 0x2c, 0x2b, 0x2a, 0x29,
+ 0x1e, 0x1c, 0x20, 0x1c, 0x19, 0x20, 0x19, 0x16, 0x1d, 0x1b, 0x18, 0x1e,
+ 0x1c, 0x1a, 0x1f, 0x17, 0x16, 0x1a, 0x16, 0x16, 0x16, 0x14, 0x14, 0x14,
+ 0x17, 0x13, 0x16, 0x37, 0x34, 0x39, 0x46, 0x44, 0x4d, 0x45, 0x43, 0x4e,
+ 0x41, 0x41, 0x4b, 0x31, 0x31, 0x3b, 0x28, 0x28, 0x30, 0x34, 0x35, 0x3a,
+ 0x2b, 0x2d, 0x34, 0x20, 0x22, 0x27, 0x12, 0x14, 0x19, 0x1d, 0x1e, 0x22,
+ 0x28, 0x28, 0x2b, 0x12, 0x13, 0x15, 0x0a, 0x0a, 0x0b, 0x0d, 0x0d, 0x0d,
+ 0x18, 0x1a, 0x19, 0x0f, 0x11, 0x10, 0x11, 0x12, 0x12, 0x15, 0x16, 0x14,
+ 0x13, 0x13, 0x11, 0x12, 0x12, 0x12, 0x2e, 0x2c, 0x2d, 0x42, 0x40, 0x41,
+ 0x20, 0x20, 0x22, 0x21, 0x20, 0x22, 0x1b, 0x19, 0x1a, 0x1d, 0x1a, 0x1a,
+ 0x1e, 0x1b, 0x1c, 0x22, 0x20, 0x21, 0x1a, 0x1a, 0x1c, 0x1c, 0x1c, 0x1e,
+ 0x26, 0x24, 0x25, 0x1d, 0x1d, 0x1f, 0x21, 0x22, 0x26, 0x23, 0x25, 0x2a,
+ 0x21, 0x24, 0x29, 0x17, 0x18, 0x1c, 0x11, 0x11, 0x13, 0x11, 0x0f, 0x10,
+ 0x19, 0x18, 0x1d, 0x11, 0x10, 0x14, 0x0d, 0x0d, 0x0f, 0x0e, 0x0e, 0x0e,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0c, 0x0b, 0x0b, 0x0d,
+ 0x08, 0x09, 0x0b, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x09, 0x09, 0x09,
+ 0x0b, 0x0c, 0x0c, 0x0e, 0x0f, 0x11, 0x10, 0x14, 0x16, 0x16, 0x19, 0x1d,
+ 0x1b, 0x20, 0x24, 0x17, 0x19, 0x1c, 0x11, 0x11, 0x11, 0x1e, 0x1f, 0x1f,
+ 0x37, 0x3c, 0x3e, 0x46, 0x4d, 0x53, 0x42, 0x49, 0x51, 0x32, 0x39, 0x41,
+ 0x31, 0x35, 0x3c, 0x34, 0x37, 0x3e, 0x35, 0x38, 0x3d, 0x33, 0x36, 0x3b,
+ 0x33, 0x36, 0x3b, 0x2e, 0x31, 0x36, 0x33, 0x34, 0x39, 0x37, 0x38, 0x3d,
+ 0x34, 0x39, 0x3c, 0x30, 0x35, 0x38, 0x33, 0x35, 0x3b, 0x35, 0x38, 0x3d,
+ 0x34, 0x37, 0x3c, 0x30, 0x34, 0x37, 0x31, 0x35, 0x38, 0x32, 0x36, 0x37,
+ 0x30, 0x32, 0x35, 0x2d, 0x2e, 0x30, 0x2f, 0x30, 0x32, 0x30, 0x33, 0x31,
+ 0x2d, 0x2e, 0x30, 0x2b, 0x2f, 0x32, 0x34, 0x37, 0x3c, 0x33, 0x38, 0x3d,
+ 0x39, 0x42, 0x4b, 0x3d, 0x44, 0x4e, 0x34, 0x3b, 0x43, 0x32, 0x37, 0x3d,
+ 0x34, 0x38, 0x3b, 0x35, 0x36, 0x38, 0x29, 0x28, 0x2d, 0x16, 0x15, 0x1b,
+ 0x10, 0x11, 0x15, 0x10, 0x11, 0x15, 0x12, 0x13, 0x16, 0x13, 0x14, 0x16,
+ 0x13, 0x14, 0x16, 0x12, 0x14, 0x13, 0x0f, 0x11, 0x0e, 0x10, 0x12, 0x10,
+ 0x10, 0x11, 0x12, 0x11, 0x12, 0x14, 0x11, 0x12, 0x14, 0x13, 0x14, 0x16,
+ 0x13, 0x15, 0x14, 0x10, 0x12, 0x11, 0x10, 0x14, 0x13, 0x0e, 0x11, 0x11,
+ 0x10, 0x11, 0x14, 0x12, 0x13, 0x15, 0x1c, 0x20, 0x21, 0x24, 0x28, 0x28,
+ 0x29, 0x2f, 0x2f, 0x2a, 0x2f, 0x30, 0x2e, 0x32, 0x35, 0x2e, 0x31, 0x36,
+ 0x2c, 0x31, 0x33, 0x2d, 0x31, 0x34, 0x2d, 0x30, 0x35, 0x31, 0x34, 0x39,
+ 0x30, 0x33, 0x38, 0x2e, 0x31, 0x36, 0x30, 0x34, 0x37, 0x32, 0x36, 0x3a,
+ 0x31, 0x35, 0x35, 0x30, 0x34, 0x35, 0x2e, 0x34, 0x34, 0x2f, 0x34, 0x37,
+ 0x32, 0x36, 0x3b, 0x30, 0x35, 0x3b, 0x30, 0x33, 0x3c, 0x2f, 0x33, 0x3b,
+ 0x2d, 0x33, 0x39, 0x2c, 0x32, 0x37, 0x2e, 0x31, 0x38, 0x32, 0x32, 0x39,
+ 0x31, 0x32, 0x37, 0x2f, 0x32, 0x37, 0x2e, 0x33, 0x37, 0x2d, 0x32, 0x36,
+ 0x2b, 0x31, 0x37, 0x29, 0x2f, 0x37, 0x2b, 0x31, 0x39, 0x28, 0x2f, 0x35,
+ 0x20, 0x26, 0x29, 0x18, 0x1c, 0x1d, 0x1b, 0x1a, 0x1e, 0x1a, 0x18, 0x1d,
+ 0x1a, 0x19, 0x1f, 0x19, 0x1b, 0x20, 0x15, 0x19, 0x1c, 0x1c, 0x20, 0x21,
+ 0x23, 0x26, 0x22, 0x21, 0x26, 0x23, 0x2c, 0x31, 0x35, 0x22, 0x29, 0x30,
+ 0x27, 0x3d, 0x68, 0x1d, 0x36, 0x58, 0x1f, 0x3a, 0x57, 0x29, 0x45, 0x66,
+ 0x1d, 0x39, 0x62, 0x1f, 0x3c, 0x68, 0x1f, 0x3d, 0x64, 0x1e, 0x3e, 0x60,
+ 0x24, 0x40, 0x66, 0x20, 0x3c, 0x62, 0x1f, 0x3a, 0x5f, 0x23, 0x3d, 0x62,
+ 0x20, 0x3b, 0x61, 0x1e, 0x3c, 0x60, 0x1d, 0x3d, 0x61, 0x1f, 0x41, 0x64,
+ 0x1d, 0x37, 0x5f, 0x1d, 0x38, 0x60, 0x19, 0x35, 0x5e, 0x18, 0x35, 0x5d,
+ 0x17, 0x37, 0x5e, 0x15, 0x33, 0x5a, 0x18, 0x35, 0x5d, 0x16, 0x31, 0x59,
+ 0x1b, 0x33, 0x5a, 0x25, 0x3b, 0x62, 0x21, 0x39, 0x60, 0x1b, 0x38, 0x5e,
+ 0x13, 0x34, 0x5a, 0x12, 0x33, 0x5a, 0x14, 0x34, 0x5d, 0x13, 0x30, 0x5c,
+ 0x13, 0x2f, 0x5d, 0x12, 0x2e, 0x5b, 0x14, 0x32, 0x5e, 0x16, 0x37, 0x60,
+ 0x15, 0x34, 0x5e, 0x16, 0x33, 0x5d, 0x15, 0x32, 0x5e, 0x19, 0x33, 0x60,
+ 0x1b, 0x31, 0x5e, 0x17, 0x34, 0x60, 0x16, 0x35, 0x5e, 0x18, 0x2f, 0x4b,
+ 0x24, 0x27, 0x36, 0x61, 0x55, 0x59, 0x86, 0x73, 0x71, 0x90, 0x7d, 0x78,
+ 0x89, 0x7d, 0x7c, 0x86, 0x79, 0x77, 0x7d, 0x6e, 0x6e, 0x49, 0x40, 0x47,
+ 0x3e, 0x44, 0x54, 0x64, 0x75, 0x8e, 0x30, 0x46, 0x62, 0x35, 0x4d, 0x68,
+ 0x6f, 0x84, 0xa4, 0x5c, 0x6f, 0x83, 0x2c, 0x3b, 0x40, 0x27, 0x30, 0x38,
+ 0x2a, 0x2f, 0x41, 0x2b, 0x2d, 0x44, 0x28, 0x2f, 0x3c, 0x27, 0x2f, 0x32,
+ 0x1c, 0x20, 0x23, 0x11, 0x15, 0x18, 0x13, 0x14, 0x16, 0x13, 0x13, 0x15,
+ 0x10, 0x11, 0x13, 0x11, 0x11, 0x13, 0x10, 0x10, 0x10, 0x09, 0x0a, 0x09,
+ 0x0b, 0x0d, 0x09, 0x31, 0x33, 0x30, 0x60, 0x62, 0x61, 0x4c, 0x4f, 0x50,
+ 0x17, 0x1b, 0x1e, 0x0e, 0x11, 0x15, 0x13, 0x14, 0x1a, 0x12, 0x13, 0x1b,
+ 0x11, 0x15, 0x1d, 0x10, 0x13, 0x1a, 0x0e, 0x15, 0x1c, 0x0e, 0x17, 0x1f,
+ 0x0e, 0x18, 0x22, 0x14, 0x20, 0x29, 0x1b, 0x29, 0x2e, 0x31, 0x41, 0x41,
+ 0x50, 0x60, 0x5f, 0x46, 0x51, 0x57, 0x3a, 0x3e, 0x4b, 0x3b, 0x40, 0x48,
+ 0x41, 0x4a, 0x49, 0x54, 0x5e, 0x5d, 0x65, 0x6f, 0x75, 0x66, 0x6e, 0x7e,
+ 0x27, 0x32, 0x4a, 0x15, 0x24, 0x39, 0x16, 0x28, 0x39, 0x34, 0x46, 0x51,
+ 0x9e, 0xaa, 0xac, 0xdb, 0xdf, 0xda, 0xae, 0xad, 0xa1, 0x9f, 0x9b, 0x8a,
+ 0x8c, 0x8c, 0x73, 0x69, 0x69, 0x53, 0x51, 0x4f, 0x40, 0x4a, 0x45, 0x3d,
+ 0x3d, 0x37, 0x33, 0x33, 0x2e, 0x2e, 0x23, 0x1d, 0x20, 0x1c, 0x19, 0x1a,
+ 0x1a, 0x1b, 0x20, 0x12, 0x13, 0x17, 0x15, 0x1a, 0x19, 0x19, 0x1f, 0x1e,
+ 0x1d, 0x21, 0x21, 0x27, 0x29, 0x27, 0x98, 0x9a, 0x94, 0xc7, 0xc6, 0xbc,
+ 0x9c, 0x96, 0x8a, 0x6e, 0x68, 0x5e, 0x55, 0x51, 0x48, 0x53, 0x50, 0x49,
+ 0x35, 0x34, 0x30, 0x19, 0x19, 0x19, 0x14, 0x15, 0x18, 0x15, 0x16, 0x1c,
+ 0x12, 0x17, 0x1a, 0x11, 0x16, 0x16, 0x26, 0x2a, 0x27, 0x64, 0x64, 0x60,
+ 0x5f, 0x60, 0x5b, 0x47, 0x47, 0x47, 0x48, 0x48, 0x4e, 0x32, 0x32, 0x3c,
+ 0x28, 0x2b, 0x38, 0x1d, 0x20, 0x31, 0x15, 0x1a, 0x30, 0x12, 0x18, 0x2c,
+ 0x1b, 0x1f, 0x29, 0x29, 0x29, 0x2d, 0x26, 0x22, 0x26, 0x26, 0x1e, 0x22,
+ 0x3d, 0x33, 0x37, 0x3a, 0x32, 0x36, 0x39, 0x30, 0x37, 0x2d, 0x26, 0x2d,
+ 0x23, 0x1c, 0x23, 0x29, 0x22, 0x29, 0x2d, 0x26, 0x2c, 0x2d, 0x27, 0x2b,
+ 0x2c, 0x27, 0x29, 0x27, 0x22, 0x24, 0x1d, 0x17, 0x1a, 0x1f, 0x1b, 0x1c,
+ 0x1c, 0x19, 0x1d, 0x19, 0x18, 0x1b, 0x1a, 0x1a, 0x1c, 0x17, 0x17, 0x19,
+ 0x1a, 0x16, 0x17, 0x39, 0x37, 0x3c, 0x4b, 0x49, 0x54, 0x49, 0x48, 0x57,
+ 0x43, 0x45, 0x54, 0x3a, 0x3a, 0x49, 0x26, 0x26, 0x32, 0x2f, 0x2f, 0x38,
+ 0x2b, 0x2a, 0x30, 0x1e, 0x1d, 0x23, 0x19, 0x19, 0x1e, 0x2c, 0x2b, 0x30,
+ 0x27, 0x27, 0x2b, 0x11, 0x10, 0x15, 0x0d, 0x0d, 0x0f, 0x14, 0x14, 0x16,
+ 0x24, 0x25, 0x27, 0x10, 0x12, 0x11, 0x13, 0x13, 0x13, 0x17, 0x16, 0x16,
+ 0x14, 0x12, 0x13, 0x18, 0x16, 0x19, 0x25, 0x23, 0x26, 0x31, 0x2f, 0x34,
+ 0x1e, 0x20, 0x20, 0x1e, 0x20, 0x1f, 0x1e, 0x1e, 0x1d, 0x1d, 0x1b, 0x1a,
+ 0x1a, 0x18, 0x19, 0x1c, 0x1a, 0x1b, 0x19, 0x17, 0x1a, 0x23, 0x22, 0x24,
+ 0x29, 0x26, 0x2c, 0x21, 0x20, 0x26, 0x27, 0x26, 0x2c, 0x21, 0x21, 0x27,
+ 0x22, 0x21, 0x27, 0x1a, 0x19, 0x1e, 0x10, 0x0f, 0x14, 0x15, 0x13, 0x15,
+ 0x19, 0x19, 0x1d, 0x0f, 0x0f, 0x11, 0x0e, 0x0e, 0x0e, 0x0f, 0x0e, 0x0d,
+ 0x0e, 0x0d, 0x0b, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b,
+ 0x09, 0x0a, 0x0c, 0x09, 0x0b, 0x0b, 0x0a, 0x0c, 0x0b, 0x0b, 0x0d, 0x0c,
+ 0x0b, 0x0d, 0x0c, 0x0f, 0x11, 0x10, 0x13, 0x15, 0x14, 0x12, 0x14, 0x15,
+ 0x10, 0x15, 0x18, 0x11, 0x15, 0x18, 0x10, 0x11, 0x13, 0x1a, 0x1b, 0x1d,
+ 0x33, 0x38, 0x3b, 0x44, 0x4c, 0x50, 0x41, 0x48, 0x50, 0x34, 0x39, 0x43,
+ 0x30, 0x34, 0x3d, 0x32, 0x37, 0x3d, 0x33, 0x37, 0x3b, 0x32, 0x36, 0x39,
+ 0x32, 0x33, 0x37, 0x32, 0x33, 0x36, 0x32, 0x33, 0x35, 0x35, 0x39, 0x3b,
+ 0x32, 0x37, 0x3a, 0x30, 0x35, 0x39, 0x35, 0x38, 0x3f, 0x38, 0x3b, 0x41,
+ 0x37, 0x3a, 0x41, 0x34, 0x37, 0x3c, 0x34, 0x38, 0x3b, 0x34, 0x38, 0x39,
+ 0x31, 0x37, 0x35, 0x31, 0x35, 0x32, 0x30, 0x34, 0x31, 0x30, 0x34, 0x31,
+ 0x30, 0x34, 0x35, 0x2f, 0x32, 0x37, 0x2f, 0x34, 0x38, 0x31, 0x36, 0x39,
+ 0x32, 0x35, 0x3a, 0x31, 0x36, 0x39, 0x31, 0x37, 0x38, 0x33, 0x39, 0x39,
+ 0x35, 0x3a, 0x3b, 0x36, 0x3a, 0x3c, 0x2e, 0x2f, 0x34, 0x1c, 0x1c, 0x23,
+ 0x11, 0x12, 0x16, 0x0e, 0x0f, 0x13, 0x0f, 0x10, 0x13, 0x11, 0x13, 0x12,
+ 0x10, 0x10, 0x10, 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x11, 0x0e, 0x0e, 0x10,
+ 0x10, 0x10, 0x10, 0x14, 0x14, 0x14, 0x14, 0x16, 0x15, 0x15, 0x17, 0x16,
+ 0x13, 0x15, 0x14, 0x11, 0x13, 0x12, 0x10, 0x12, 0x11, 0x11, 0x12, 0x12,
+ 0x13, 0x13, 0x13, 0x11, 0x13, 0x12, 0x1c, 0x20, 0x21, 0x26, 0x2a, 0x2d,
+ 0x27, 0x2c, 0x2f, 0x28, 0x2d, 0x30, 0x30, 0x35, 0x38, 0x2f, 0x34, 0x37,
+ 0x2a, 0x34, 0x31, 0x2a, 0x34, 0x33, 0x2b, 0x33, 0x35, 0x2c, 0x33, 0x37,
+ 0x2c, 0x33, 0x3b, 0x2d, 0x34, 0x3c, 0x30, 0x36, 0x40, 0x2f, 0x36, 0x3f,
+ 0x2e, 0x37, 0x37, 0x2c, 0x34, 0x36, 0x35, 0x3a, 0x3e, 0x35, 0x39, 0x42,
+ 0x33, 0x36, 0x3e, 0x31, 0x34, 0x3c, 0x2d, 0x30, 0x37, 0x2c, 0x31, 0x35,
+ 0x2f, 0x34, 0x38, 0x2d, 0x32, 0x36, 0x2e, 0x33, 0x37, 0x33, 0x37, 0x3b,
+ 0x2f, 0x34, 0x38, 0x30, 0x35, 0x39, 0x2f, 0x34, 0x38, 0x2d, 0x32, 0x36,
+ 0x2e, 0x30, 0x35, 0x2f, 0x32, 0x37, 0x2c, 0x32, 0x36, 0x29, 0x2d, 0x31,
+ 0x22, 0x25, 0x29, 0x1c, 0x1d, 0x22, 0x16, 0x19, 0x1e, 0x16, 0x1a, 0x1e,
+ 0x19, 0x1c, 0x22, 0x15, 0x16, 0x1b, 0x14, 0x15, 0x19, 0x17, 0x1b, 0x1a,
+ 0x1f, 0x23, 0x1d, 0x3f, 0x42, 0x3c, 0x4b, 0x49, 0x41, 0x3e, 0x38, 0x31,
+ 0x24, 0x3d, 0x66, 0x14, 0x2f, 0x51, 0x16, 0x33, 0x50, 0x29, 0x46, 0x68,
+ 0x1f, 0x3c, 0x66, 0x1d, 0x3b, 0x67, 0x1d, 0x3d, 0x64, 0x1c, 0x3d, 0x60,
+ 0x1d, 0x3b, 0x61, 0x20, 0x3e, 0x64, 0x23, 0x3f, 0x66, 0x21, 0x3d, 0x64,
+ 0x1f, 0x3b, 0x62, 0x1e, 0x3c, 0x62, 0x1d, 0x3d, 0x63, 0x1a, 0x3b, 0x60,
+ 0x21, 0x3d, 0x65, 0x1c, 0x38, 0x60, 0x19, 0x37, 0x5f, 0x1b, 0x3a, 0x61,
+ 0x1f, 0x3f, 0x66, 0x15, 0x32, 0x5a, 0x15, 0x32, 0x5a, 0x19, 0x35, 0x5d,
+ 0x18, 0x30, 0x59, 0x21, 0x38, 0x62, 0x1f, 0x38, 0x61, 0x1a, 0x36, 0x5e,
+ 0x15, 0x35, 0x5c, 0x18, 0x39, 0x62, 0x18, 0x37, 0x63, 0x15, 0x32, 0x5e,
+ 0x16, 0x33, 0x5f, 0x17, 0x35, 0x61, 0x14, 0x34, 0x5d, 0x16, 0x37, 0x5f,
+ 0x18, 0x38, 0x61, 0x15, 0x34, 0x60, 0x15, 0x32, 0x5e, 0x18, 0x35, 0x63,
+ 0x24, 0x45, 0x70, 0x1f, 0x3c, 0x68, 0x19, 0x30, 0x5c, 0x17, 0x2a, 0x4c,
+ 0x1d, 0x2a, 0x3e, 0x3b, 0x40, 0x48, 0x63, 0x59, 0x5e, 0x75, 0x63, 0x66,
+ 0x78, 0x65, 0x67, 0x6b, 0x5b, 0x60, 0x4a, 0x43, 0x51, 0x27, 0x2f, 0x46,
+ 0x1b, 0x31, 0x52, 0x3d, 0x5b, 0x7d, 0x62, 0x81, 0x9e, 0x3c, 0x57, 0x71,
+ 0x2d, 0x44, 0x60, 0x5c, 0x72, 0x8b, 0x44, 0x55, 0x69, 0x24, 0x32, 0x43,
+ 0x22, 0x2b, 0x3b, 0x28, 0x2d, 0x3c, 0x27, 0x2d, 0x38, 0x2b, 0x30, 0x38,
+ 0x1f, 0x24, 0x27, 0x10, 0x14, 0x17, 0x11, 0x14, 0x17, 0x11, 0x12, 0x14,
+ 0x10, 0x11, 0x13, 0x10, 0x11, 0x12, 0x09, 0x09, 0x0b, 0x0c, 0x0d, 0x0f,
+ 0x38, 0x3a, 0x38, 0x63, 0x67, 0x66, 0x44, 0x48, 0x49, 0x18, 0x1c, 0x1f,
+ 0x0e, 0x12, 0x17, 0x11, 0x14, 0x1b, 0x0f, 0x12, 0x19, 0x0d, 0x10, 0x17,
+ 0x10, 0x13, 0x1a, 0x10, 0x15, 0x1c, 0x0f, 0x17, 0x1e, 0x10, 0x1a, 0x23,
+ 0x17, 0x23, 0x2f, 0x1f, 0x2c, 0x38, 0x18, 0x27, 0x2f, 0x11, 0x20, 0x25,
+ 0x1c, 0x2b, 0x2e, 0x2e, 0x39, 0x3f, 0x59, 0x60, 0x68, 0x77, 0x7e, 0x86,
+ 0x61, 0x6c, 0x70, 0x4f, 0x5c, 0x63, 0x39, 0x46, 0x53, 0x2a, 0x36, 0x48,
+ 0x1b, 0x26, 0x3b, 0x19, 0x26, 0x3a, 0x19, 0x2b, 0x3c, 0x38, 0x48, 0x56,
+ 0x77, 0x82, 0x8b, 0xbc, 0xbe, 0xc4, 0xdf, 0xdb, 0xdb, 0xc8, 0xc1, 0xba,
+ 0xa8, 0xa5, 0x93, 0xa2, 0x9f, 0x8f, 0x80, 0x7c, 0x73, 0x41, 0x3c, 0x37,
+ 0x2d, 0x29, 0x28, 0x22, 0x20, 0x21, 0x16, 0x16, 0x18, 0x19, 0x19, 0x1b,
+ 0x1a, 0x1f, 0x22, 0x16, 0x1b, 0x1f, 0x1d, 0x22, 0x28, 0x1b, 0x1f, 0x28,
+ 0x20, 0x23, 0x2d, 0x21, 0x24, 0x2a, 0x5a, 0x5f, 0x5b, 0xab, 0xae, 0xa6,
+ 0xc3, 0xc1, 0xb5, 0xa9, 0xa7, 0x9d, 0x61, 0x61, 0x59, 0x2c, 0x2d, 0x27,
+ 0x1d, 0x1f, 0x1b, 0x19, 0x1b, 0x18, 0x17, 0x1b, 0x1a, 0x14, 0x18, 0x19,
+ 0x14, 0x18, 0x17, 0x22, 0x24, 0x1f, 0x4e, 0x50, 0x47, 0xa5, 0xa7, 0x9a,
+ 0x92, 0x93, 0x88, 0x6d, 0x6d, 0x69, 0x60, 0x5f, 0x63, 0x42, 0x41, 0x4b,
+ 0x2d, 0x2f, 0x35, 0x23, 0x28, 0x32, 0x16, 0x1b, 0x2c, 0x10, 0x16, 0x25,
+ 0x10, 0x15, 0x1f, 0x1e, 0x20, 0x25, 0x22, 0x21, 0x27, 0x20, 0x1a, 0x23,
+ 0x21, 0x20, 0x21, 0x2b, 0x29, 0x2a, 0x35, 0x31, 0x33, 0x2c, 0x26, 0x28,
+ 0x26, 0x1d, 0x20, 0x2c, 0x21, 0x27, 0x2d, 0x22, 0x28, 0x2d, 0x22, 0x2a,
+ 0x32, 0x2c, 0x2e, 0x29, 0x25, 0x26, 0x22, 0x1e, 0x22, 0x1f, 0x1d, 0x20,
+ 0x1d, 0x1b, 0x1e, 0x20, 0x1f, 0x24, 0x1f, 0x1e, 0x23, 0x1e, 0x1d, 0x21,
+ 0x1c, 0x1a, 0x1b, 0x3a, 0x3a, 0x3d, 0x4c, 0x4d, 0x56, 0x48, 0x4a, 0x58,
+ 0x3e, 0x40, 0x50, 0x36, 0x38, 0x45, 0x21, 0x23, 0x2d, 0x29, 0x29, 0x31,
+ 0x27, 0x27, 0x2d, 0x1e, 0x1f, 0x24, 0x27, 0x28, 0x2d, 0x2f, 0x30, 0x35,
+ 0x1b, 0x1c, 0x21, 0x0e, 0x0f, 0x14, 0x11, 0x12, 0x16, 0x17, 0x18, 0x1c,
+ 0x28, 0x2a, 0x29, 0x12, 0x14, 0x13, 0x12, 0x12, 0x12, 0x16, 0x14, 0x15,
+ 0x16, 0x14, 0x16, 0x16, 0x14, 0x17, 0x19, 0x17, 0x1a, 0x18, 0x16, 0x1b,
+ 0x1c, 0x1c, 0x1c, 0x26, 0x26, 0x26, 0x24, 0x22, 0x23, 0x1e, 0x1a, 0x1b,
+ 0x1e, 0x1a, 0x1b, 0x1e, 0x1b, 0x1c, 0x1c, 0x17, 0x1b, 0x23, 0x21, 0x24,
+ 0x27, 0x26, 0x2b, 0x24, 0x23, 0x28, 0x26, 0x27, 0x2c, 0x1b, 0x1d, 0x22,
+ 0x28, 0x28, 0x2d, 0x24, 0x25, 0x29, 0x20, 0x20, 0x24, 0x22, 0x22, 0x24,
+ 0x25, 0x26, 0x2a, 0x1e, 0x1e, 0x22, 0x17, 0x17, 0x19, 0x0c, 0x0c, 0x0c,
+ 0x0d, 0x0d, 0x0b, 0x0d, 0x0d, 0x0c, 0x0b, 0x0a, 0x0a, 0x08, 0x08, 0x09,
+ 0x09, 0x0a, 0x0c, 0x07, 0x09, 0x09, 0x0b, 0x0d, 0x0b, 0x0e, 0x10, 0x0f,
+ 0x0d, 0x0f, 0x0e, 0x0f, 0x11, 0x10, 0x12, 0x14, 0x14, 0x1e, 0x20, 0x22,
+ 0x17, 0x1b, 0x1e, 0x11, 0x12, 0x14, 0x16, 0x16, 0x18, 0x1f, 0x20, 0x24,
+ 0x31, 0x36, 0x3a, 0x43, 0x4c, 0x51, 0x40, 0x49, 0x51, 0x31, 0x38, 0x42,
+ 0x31, 0x36, 0x3c, 0x31, 0x35, 0x3a, 0x30, 0x34, 0x37, 0x30, 0x33, 0x36,
+ 0x30, 0x31, 0x34, 0x34, 0x35, 0x37, 0x33, 0x37, 0x38, 0x34, 0x38, 0x39,
+ 0x34, 0x39, 0x3c, 0x33, 0x37, 0x3a, 0x34, 0x37, 0x3c, 0x36, 0x39, 0x40,
+ 0x38, 0x3a, 0x41, 0x33, 0x36, 0x3b, 0x32, 0x36, 0x39, 0x35, 0x39, 0x3b,
+ 0x33, 0x34, 0x38, 0x33, 0x35, 0x36, 0x30, 0x32, 0x31, 0x2a, 0x2b, 0x2d,
+ 0x27, 0x28, 0x2c, 0x28, 0x2a, 0x30, 0x26, 0x29, 0x2e, 0x2b, 0x2f, 0x32,
+ 0x2e, 0x31, 0x36, 0x33, 0x38, 0x3c, 0x33, 0x39, 0x3c, 0x30, 0x38, 0x3b,
+ 0x31, 0x38, 0x3b, 0x34, 0x39, 0x3d, 0x31, 0x34, 0x39, 0x1e, 0x21, 0x28,
+ 0x11, 0x12, 0x18, 0x0c, 0x0d, 0x11, 0x0b, 0x0c, 0x0d, 0x0c, 0x0e, 0x0d,
+ 0x0a, 0x0c, 0x0b, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0a, 0x0a, 0x0c,
+ 0x0c, 0x0c, 0x0c, 0x10, 0x10, 0x10, 0x15, 0x17, 0x16, 0x19, 0x1b, 0x1a,
+ 0x15, 0x17, 0x16, 0x11, 0x13, 0x12, 0x11, 0x12, 0x11, 0x10, 0x12, 0x10,
+ 0x12, 0x14, 0x12, 0x17, 0x19, 0x18, 0x24, 0x28, 0x29, 0x2a, 0x2e, 0x31,
+ 0x2b, 0x30, 0x33, 0x2a, 0x2f, 0x32, 0x2e, 0x33, 0x36, 0x31, 0x36, 0x39,
+ 0x2c, 0x34, 0x35, 0x2c, 0x32, 0x34, 0x2a, 0x2f, 0x33, 0x2d, 0x31, 0x36,
+ 0x2f, 0x32, 0x39, 0x30, 0x35, 0x3b, 0x30, 0x35, 0x39, 0x2e, 0x33, 0x37,
+ 0x2b, 0x34, 0x33, 0x30, 0x38, 0x3a, 0x39, 0x3e, 0x42, 0x37, 0x3c, 0x42,
+ 0x30, 0x34, 0x3d, 0x30, 0x35, 0x3c, 0x2e, 0x33, 0x39, 0x2e, 0x33, 0x37,
+ 0x2e, 0x31, 0x36, 0x2c, 0x2f, 0x34, 0x2e, 0x31, 0x36, 0x31, 0x34, 0x39,
+ 0x2f, 0x32, 0x37, 0x2d, 0x30, 0x35, 0x2e, 0x31, 0x36, 0x2f, 0x33, 0x38,
+ 0x2f, 0x32, 0x39, 0x2f, 0x34, 0x3a, 0x2d, 0x33, 0x36, 0x2b, 0x2f, 0x33,
+ 0x24, 0x28, 0x2c, 0x20, 0x21, 0x26, 0x1d, 0x21, 0x24, 0x18, 0x1d, 0x20,
+ 0x17, 0x1a, 0x1f, 0x15, 0x18, 0x1d, 0x14, 0x15, 0x19, 0x14, 0x17, 0x16,
+ 0x19, 0x1f, 0x18, 0x48, 0x4b, 0x42, 0x47, 0x45, 0x3a, 0x45, 0x3e, 0x33,
+ 0x1d, 0x39, 0x63, 0x1b, 0x39, 0x5e, 0x1f, 0x3d, 0x5f, 0x23, 0x42, 0x65,
+ 0x1e, 0x3d, 0x67, 0x1d, 0x3c, 0x6a, 0x1d, 0x3e, 0x68, 0x1d, 0x3f, 0x64,
+ 0x1d, 0x3d, 0x64, 0x1f, 0x3f, 0x66, 0x1f, 0x3f, 0x66, 0x20, 0x3d, 0x65,
+ 0x21, 0x3e, 0x66, 0x1e, 0x3e, 0x65, 0x22, 0x42, 0x69, 0x20, 0x40, 0x67,
+ 0x22, 0x3e, 0x66, 0x1c, 0x39, 0x61, 0x1a, 0x37, 0x5f, 0x20, 0x40, 0x67,
+ 0x23, 0x43, 0x6a, 0x16, 0x35, 0x5e, 0x17, 0x34, 0x5e, 0x18, 0x35, 0x5f,
+ 0x17, 0x34, 0x60, 0x19, 0x34, 0x61, 0x17, 0x33, 0x5e, 0x1c, 0x39, 0x62,
+ 0x17, 0x37, 0x60, 0x16, 0x37, 0x62, 0x17, 0x35, 0x61, 0x18, 0x34, 0x62,
+ 0x19, 0x38, 0x62, 0x17, 0x37, 0x60, 0x11, 0x31, 0x5a, 0x12, 0x33, 0x5c,
+ 0x12, 0x33, 0x5c, 0x13, 0x32, 0x5e, 0x15, 0x34, 0x62, 0x16, 0x35, 0x63,
+ 0x1b, 0x3d, 0x68, 0x1d, 0x3c, 0x68, 0x18, 0x33, 0x5e, 0x16, 0x2c, 0x51,
+ 0x1d, 0x30, 0x49, 0x21, 0x2e, 0x40, 0x26, 0x29, 0x39, 0x35, 0x31, 0x42,
+ 0x38, 0x3a, 0x47, 0x2c, 0x33, 0x44, 0x21, 0x2e, 0x4a, 0x1b, 0x33, 0x57,
+ 0x16, 0x33, 0x5f, 0x13, 0x32, 0x60, 0x34, 0x4d, 0x77, 0x67, 0x7c, 0x9e,
+ 0x49, 0x63, 0x79, 0x25, 0x3d, 0x5b, 0x3d, 0x51, 0x77, 0x2f, 0x40, 0x5e,
+ 0x21, 0x30, 0x3e, 0x1f, 0x2b, 0x2f, 0x25, 0x2c, 0x34, 0x2b, 0x2e, 0x3c,
+ 0x1b, 0x20, 0x24, 0x0f, 0x13, 0x16, 0x10, 0x13, 0x16, 0x10, 0x12, 0x14,
+ 0x0f, 0x11, 0x10, 0x0b, 0x0d, 0x0b, 0x10, 0x12, 0x11, 0x3f, 0x42, 0x42,
+ 0x5e, 0x62, 0x64, 0x43, 0x46, 0x49, 0x14, 0x18, 0x1c, 0x0e, 0x13, 0x17,
+ 0x13, 0x17, 0x1b, 0x18, 0x1d, 0x23, 0x1c, 0x23, 0x29, 0x17, 0x1e, 0x24,
+ 0x10, 0x17, 0x1d, 0x0e, 0x15, 0x1c, 0x12, 0x1b, 0x24, 0x19, 0x23, 0x2f,
+ 0x23, 0x2f, 0x3d, 0x18, 0x25, 0x33, 0x11, 0x1f, 0x2b, 0x19, 0x27, 0x32,
+ 0x28, 0x35, 0x3d, 0x34, 0x3f, 0x43, 0x4a, 0x54, 0x55, 0x3f, 0x4a, 0x4e,
+ 0x2f, 0x3d, 0x49, 0x38, 0x49, 0x5b, 0x1c, 0x2d, 0x41, 0x23, 0x34, 0x48,
+ 0x1c, 0x2a, 0x47, 0x19, 0x29, 0x43, 0x1d, 0x2f, 0x45, 0x45, 0x56, 0x6a,
+ 0xb3, 0xc0, 0xd1, 0xbe, 0xc8, 0xd5, 0xa5, 0xaa, 0xb3, 0xc9, 0xca, 0xcf,
+ 0xc1, 0xbd, 0xb4, 0x9a, 0x96, 0x8f, 0x6b, 0x65, 0x63, 0x3b, 0x37, 0x39,
+ 0x28, 0x27, 0x2a, 0x1d, 0x1f, 0x22, 0x17, 0x1a, 0x1e, 0x1a, 0x1f, 0x22,
+ 0x1b, 0x23, 0x25, 0x15, 0x1c, 0x22, 0x1a, 0x1e, 0x29, 0x1e, 0x20, 0x2f,
+ 0x21, 0x23, 0x31, 0x1e, 0x20, 0x2a, 0x41, 0x47, 0x48, 0x6e, 0x76, 0x74,
+ 0x96, 0x97, 0x96, 0x9d, 0xa1, 0xa0, 0x42, 0x46, 0x47, 0x1a, 0x20, 0x21,
+ 0x21, 0x27, 0x28, 0x30, 0x36, 0x36, 0x1d, 0x21, 0x22, 0x14, 0x18, 0x19,
+ 0x28, 0x29, 0x23, 0x4b, 0x4b, 0x40, 0x55, 0x55, 0x45, 0x7c, 0x7c, 0x69,
+ 0xb0, 0xb1, 0xa1, 0xa3, 0xa3, 0x9c, 0x89, 0x88, 0x8b, 0x4e, 0x4e, 0x58,
+ 0x25, 0x26, 0x28, 0x27, 0x2a, 0x2f, 0x1e, 0x23, 0x2b, 0x11, 0x18, 0x22,
+ 0x0e, 0x15, 0x1e, 0x15, 0x19, 0x22, 0x2f, 0x32, 0x3b, 0x27, 0x29, 0x34,
+ 0x1d, 0x21, 0x23, 0x1f, 0x20, 0x20, 0x22, 0x1e, 0x1d, 0x24, 0x1c, 0x1a,
+ 0x26, 0x1c, 0x1b, 0x2b, 0x21, 0x22, 0x2b, 0x23, 0x25, 0x29, 0x20, 0x25,
+ 0x27, 0x23, 0x24, 0x23, 0x1f, 0x22, 0x22, 0x1e, 0x22, 0x20, 0x1e, 0x21,
+ 0x20, 0x1f, 0x23, 0x21, 0x20, 0x25, 0x22, 0x21, 0x27, 0x1e, 0x1d, 0x23,
+ 0x19, 0x19, 0x19, 0x35, 0x37, 0x38, 0x47, 0x4a, 0x51, 0x42, 0x46, 0x51,
+ 0x39, 0x3c, 0x49, 0x33, 0x36, 0x41, 0x1d, 0x20, 0x27, 0x1e, 0x21, 0x26,
+ 0x20, 0x23, 0x28, 0x1f, 0x22, 0x27, 0x2d, 0x30, 0x34, 0x20, 0x23, 0x28,
+ 0x10, 0x13, 0x18, 0x11, 0x14, 0x18, 0x0d, 0x10, 0x15, 0x11, 0x14, 0x19,
+ 0x2c, 0x2f, 0x2c, 0x19, 0x1a, 0x19, 0x14, 0x14, 0x14, 0x16, 0x15, 0x16,
+ 0x15, 0x13, 0x16, 0x17, 0x15, 0x19, 0x15, 0x13, 0x18, 0x17, 0x15, 0x1a,
+ 0x1e, 0x1c, 0x1d, 0x33, 0x30, 0x31, 0x27, 0x23, 0x24, 0x20, 0x1c, 0x1d,
+ 0x23, 0x1f, 0x20, 0x1f, 0x1b, 0x1c, 0x1e, 0x1c, 0x1f, 0x22, 0x21, 0x23,
+ 0x20, 0x21, 0x23, 0x24, 0x25, 0x27, 0x23, 0x27, 0x2a, 0x1a, 0x1e, 0x21,
+ 0x39, 0x3c, 0x40, 0x35, 0x38, 0x3d, 0x2c, 0x2f, 0x32, 0x2a, 0x2b, 0x2f,
+ 0x2d, 0x2f, 0x38, 0x2e, 0x2e, 0x36, 0x1e, 0x1f, 0x24, 0x0d, 0x0e, 0x10,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b, 0x09, 0x0b, 0x0a,
+ 0x09, 0x0a, 0x0b, 0x07, 0x09, 0x09, 0x0e, 0x10, 0x0f, 0x0f, 0x11, 0x10,
+ 0x0f, 0x12, 0x10, 0x0e, 0x10, 0x0f, 0x11, 0x12, 0x14, 0x1f, 0x20, 0x22,
+ 0x19, 0x1a, 0x1c, 0x11, 0x11, 0x13, 0x18, 0x18, 0x1a, 0x1e, 0x1f, 0x23,
+ 0x34, 0x39, 0x3d, 0x3d, 0x46, 0x4d, 0x41, 0x4b, 0x56, 0x34, 0x3c, 0x48,
+ 0x31, 0x34, 0x39, 0x32, 0x36, 0x39, 0x31, 0x35, 0x38, 0x34, 0x38, 0x3a,
+ 0x30, 0x34, 0x35, 0x31, 0x35, 0x36, 0x36, 0x3b, 0x3b, 0x32, 0x38, 0x38,
+ 0x33, 0x37, 0x3a, 0x32, 0x36, 0x39, 0x33, 0x37, 0x3c, 0x38, 0x3b, 0x42,
+ 0x37, 0x3a, 0x40, 0x32, 0x35, 0x3a, 0x33, 0x35, 0x39, 0x31, 0x32, 0x36,
+ 0x33, 0x32, 0x38, 0x30, 0x31, 0x34, 0x25, 0x26, 0x28, 0x22, 0x23, 0x27,
+ 0x22, 0x23, 0x28, 0x23, 0x24, 0x2b, 0x22, 0x23, 0x28, 0x26, 0x27, 0x2b,
+ 0x29, 0x2c, 0x31, 0x34, 0x38, 0x3f, 0x38, 0x3f, 0x47, 0x36, 0x3f, 0x48,
+ 0x30, 0x39, 0x41, 0x2f, 0x36, 0x3e, 0x34, 0x3b, 0x41, 0x29, 0x2e, 0x34,
+ 0x19, 0x1a, 0x1f, 0x0f, 0x10, 0x14, 0x0e, 0x0f, 0x11, 0x0d, 0x0f, 0x0e,
+ 0x0c, 0x0e, 0x0d, 0x0c, 0x0d, 0x0b, 0x0c, 0x0c, 0x0a, 0x0b, 0x0b, 0x09,
+ 0x08, 0x08, 0x08, 0x0b, 0x0c, 0x0c, 0x12, 0x13, 0x13, 0x15, 0x17, 0x16,
+ 0x15, 0x17, 0x16, 0x12, 0x14, 0x13, 0x10, 0x12, 0x11, 0x12, 0x14, 0x13,
+ 0x12, 0x14, 0x13, 0x15, 0x19, 0x18, 0x25, 0x2a, 0x2a, 0x28, 0x2d, 0x30,
+ 0x2c, 0x31, 0x35, 0x2c, 0x31, 0x34, 0x2b, 0x30, 0x33, 0x2d, 0x32, 0x35,
+ 0x2e, 0x31, 0x36, 0x2c, 0x30, 0x35, 0x2b, 0x2e, 0x33, 0x2f, 0x30, 0x35,
+ 0x30, 0x32, 0x37, 0x2f, 0x33, 0x36, 0x2d, 0x31, 0x32, 0x2c, 0x31, 0x31,
+ 0x2d, 0x33, 0x33, 0x31, 0x36, 0x39, 0x33, 0x38, 0x3d, 0x31, 0x36, 0x3c,
+ 0x30, 0x35, 0x3c, 0x2b, 0x31, 0x37, 0x29, 0x30, 0x36, 0x2e, 0x36, 0x39,
+ 0x31, 0x32, 0x36, 0x31, 0x31, 0x36, 0x30, 0x31, 0x35, 0x30, 0x31, 0x35,
+ 0x2e, 0x30, 0x34, 0x2f, 0x30, 0x34, 0x2d, 0x31, 0x34, 0x30, 0x34, 0x37,
+ 0x2e, 0x32, 0x38, 0x2c, 0x30, 0x36, 0x2a, 0x2f, 0x33, 0x28, 0x2d, 0x31,
+ 0x27, 0x28, 0x2c, 0x28, 0x27, 0x2c, 0x32, 0x33, 0x35, 0x2c, 0x30, 0x31,
+ 0x18, 0x1d, 0x21, 0x14, 0x18, 0x1c, 0x15, 0x17, 0x1a, 0x13, 0x18, 0x17,
+ 0x11, 0x16, 0x10, 0x1d, 0x21, 0x17, 0x32, 0x30, 0x24, 0x41, 0x3b, 0x2f,
+ 0x1f, 0x3f, 0x68, 0x1e, 0x3e, 0x65, 0x23, 0x43, 0x69, 0x24, 0x44, 0x6a,
+ 0x1c, 0x3d, 0x68, 0x1b, 0x3c, 0x6a, 0x1e, 0x3f, 0x6a, 0x20, 0x41, 0x6a,
+ 0x1d, 0x3e, 0x67, 0x20, 0x41, 0x6a, 0x1e, 0x3f, 0x68, 0x1d, 0x3e, 0x67,
+ 0x1f, 0x3e, 0x68, 0x21, 0x41, 0x6a, 0x22, 0x42, 0x6b, 0x29, 0x48, 0x71,
+ 0x26, 0x43, 0x6b, 0x1c, 0x39, 0x61, 0x1c, 0x3b, 0x64, 0x18, 0x39, 0x62,
+ 0x1c, 0x3c, 0x65, 0x18, 0x38, 0x61, 0x19, 0x39, 0x62, 0x1c, 0x3c, 0x66,
+ 0x18, 0x39, 0x66, 0x1d, 0x3c, 0x68, 0x21, 0x3f, 0x6a, 0x1c, 0x39, 0x63,
+ 0x17, 0x37, 0x60, 0x17, 0x38, 0x61, 0x17, 0x36, 0x60, 0x1e, 0x39, 0x66,
+ 0x14, 0x35, 0x5e, 0x17, 0x37, 0x60, 0x15, 0x35, 0x5e, 0x13, 0x34, 0x5d,
+ 0x12, 0x33, 0x5e, 0x15, 0x36, 0x61, 0x14, 0x36, 0x63, 0x17, 0x37, 0x66,
+ 0x1a, 0x36, 0x63, 0x19, 0x39, 0x62, 0x15, 0x39, 0x5d, 0x0f, 0x2d, 0x4f,
+ 0x1d, 0x2d, 0x4d, 0x24, 0x2d, 0x4c, 0x19, 0x24, 0x40, 0x15, 0x25, 0x3f,
+ 0x19, 0x32, 0x50, 0x1b, 0x35, 0x55, 0x1b, 0x34, 0x59, 0x19, 0x35, 0x5e,
+ 0x16, 0x32, 0x5d, 0x17, 0x33, 0x5f, 0x13, 0x2c, 0x58, 0x32, 0x4a, 0x71,
+ 0x7c, 0x99, 0xb0, 0x34, 0x50, 0x72, 0x15, 0x2d, 0x5a, 0x31, 0x49, 0x6f,
+ 0x4e, 0x64, 0x79, 0x47, 0x58, 0x60, 0x2d, 0x38, 0x41, 0x29, 0x2e, 0x3d,
+ 0x1e, 0x22, 0x29, 0x12, 0x15, 0x1a, 0x13, 0x16, 0x19, 0x10, 0x12, 0x13,
+ 0x09, 0x0b, 0x09, 0x15, 0x17, 0x16, 0x45, 0x47, 0x46, 0x62, 0x65, 0x65,
+ 0x3f, 0x42, 0x47, 0x13, 0x16, 0x1b, 0x0d, 0x10, 0x15, 0x15, 0x18, 0x1d,
+ 0x1f, 0x24, 0x28, 0x43, 0x4a, 0x50, 0x53, 0x5a, 0x60, 0x53, 0x5b, 0x62,
+ 0x31, 0x3a, 0x41, 0x12, 0x1c, 0x24, 0x16, 0x22, 0x2e, 0x1d, 0x2a, 0x39,
+ 0x18, 0x26, 0x35, 0x10, 0x1e, 0x2d, 0x1a, 0x27, 0x38, 0x23, 0x30, 0x43,
+ 0x21, 0x2c, 0x3a, 0x2d, 0x37, 0x3c, 0x34, 0x3f, 0x3d, 0x1e, 0x2b, 0x2f,
+ 0x1e, 0x2d, 0x40, 0x2c, 0x3f, 0x5d, 0x1f, 0x33, 0x4e, 0x28, 0x3d, 0x53,
+ 0x25, 0x35, 0x57, 0x29, 0x39, 0x57, 0x36, 0x49, 0x61, 0x47, 0x5b, 0x73,
+ 0xba, 0xcf, 0xe3, 0xbc, 0xd2, 0xe4, 0x7d, 0x91, 0xa1, 0x7b, 0x8c, 0x97,
+ 0x8d, 0x8d, 0x8b, 0x64, 0x61, 0x62, 0x4a, 0x4a, 0x4b, 0x37, 0x36, 0x3b,
+ 0x20, 0x22, 0x26, 0x1b, 0x1f, 0x22, 0x29, 0x2d, 0x30, 0x27, 0x2d, 0x2d,
+ 0x1b, 0x25, 0x29, 0x19, 0x20, 0x28, 0x1f, 0x21, 0x2b, 0x21, 0x21, 0x2b,
+ 0x2e, 0x2f, 0x36, 0x41, 0x44, 0x49, 0x60, 0x67, 0x6c, 0x70, 0x79, 0x7e,
+ 0x69, 0x6d, 0x77, 0x51, 0x55, 0x61, 0x1a, 0x20, 0x2c, 0x12, 0x18, 0x24,
+ 0x27, 0x2e, 0x38, 0x2d, 0x31, 0x39, 0x15, 0x18, 0x1d, 0x25, 0x26, 0x2b,
+ 0x4f, 0x4d, 0x44, 0x5b, 0x59, 0x4b, 0x5b, 0x58, 0x45, 0x54, 0x52, 0x3d,
+ 0x67, 0x66, 0x54, 0x8a, 0x8a, 0x82, 0x6e, 0x6d, 0x72, 0x2b, 0x2b, 0x35,
+ 0x23, 0x24, 0x26, 0x27, 0x28, 0x2c, 0x28, 0x2b, 0x31, 0x1b, 0x20, 0x27,
+ 0x10, 0x17, 0x1f, 0x0e, 0x15, 0x1f, 0x21, 0x29, 0x34, 0x41, 0x48, 0x54,
+ 0x36, 0x37, 0x44, 0x20, 0x1f, 0x28, 0x1e, 0x1a, 0x1d, 0x23, 0x1a, 0x1a,
+ 0x24, 0x1b, 0x1a, 0x24, 0x20, 0x1c, 0x22, 0x21, 0x20, 0x1f, 0x20, 0x21,
+ 0x21, 0x1e, 0x1f, 0x23, 0x1e, 0x20, 0x20, 0x1c, 0x1d, 0x23, 0x1e, 0x22,
+ 0x23, 0x1f, 0x23, 0x20, 0x1e, 0x23, 0x1d, 0x1b, 0x20, 0x1a, 0x18, 0x1d,
+ 0x14, 0x14, 0x14, 0x2b, 0x2c, 0x2d, 0x3e, 0x42, 0x47, 0x3d, 0x3f, 0x49,
+ 0x35, 0x38, 0x44, 0x32, 0x35, 0x3d, 0x1e, 0x1f, 0x24, 0x1d, 0x1e, 0x22,
+ 0x24, 0x25, 0x2a, 0x30, 0x31, 0x36, 0x29, 0x2a, 0x2e, 0x11, 0x12, 0x16,
+ 0x0e, 0x12, 0x15, 0x11, 0x14, 0x18, 0x0c, 0x10, 0x13, 0x11, 0x14, 0x17,
+ 0x30, 0x35, 0x32, 0x1f, 0x21, 0x20, 0x18, 0x19, 0x19, 0x1a, 0x1a, 0x1c,
+ 0x1c, 0x1a, 0x1f, 0x28, 0x26, 0x2b, 0x19, 0x17, 0x1c, 0x1d, 0x1b, 0x20,
+ 0x21, 0x1f, 0x22, 0x2b, 0x29, 0x2c, 0x25, 0x23, 0x24, 0x1e, 0x1c, 0x1d,
+ 0x22, 0x20, 0x21, 0x1c, 0x1c, 0x1c, 0x1f, 0x1f, 0x21, 0x27, 0x28, 0x2a,
+ 0x1f, 0x20, 0x22, 0x24, 0x28, 0x2b, 0x24, 0x27, 0x2c, 0x23, 0x27, 0x2d,
+ 0x39, 0x3e, 0x44, 0x3a, 0x3f, 0x45, 0x3a, 0x3f, 0x45, 0x38, 0x3b, 0x42,
+ 0x33, 0x37, 0x42, 0x25, 0x27, 0x33, 0x17, 0x18, 0x1f, 0x0d, 0x0e, 0x12,
+ 0x0b, 0x0c, 0x0e, 0x0d, 0x0e, 0x0e, 0x0b, 0x0d, 0x0c, 0x09, 0x0b, 0x0a,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0d, 0x0c, 0x0a, 0x0c, 0x0b, 0x09, 0x0b, 0x0a,
+ 0x0f, 0x11, 0x10, 0x12, 0x13, 0x15, 0x10, 0x11, 0x13, 0x11, 0x12, 0x14,
+ 0x12, 0x13, 0x15, 0x14, 0x14, 0x16, 0x17, 0x17, 0x19, 0x1b, 0x1d, 0x20,
+ 0x2e, 0x35, 0x39, 0x3e, 0x49, 0x4f, 0x47, 0x51, 0x5c, 0x34, 0x3d, 0x49,
+ 0x31, 0x36, 0x39, 0x32, 0x36, 0x39, 0x34, 0x38, 0x39, 0x37, 0x3b, 0x3c,
+ 0x32, 0x36, 0x37, 0x32, 0x36, 0x37, 0x35, 0x3b, 0x3b, 0x34, 0x3a, 0x3a,
+ 0x35, 0x36, 0x3a, 0x33, 0x34, 0x38, 0x35, 0x36, 0x3b, 0x37, 0x38, 0x3d,
+ 0x34, 0x35, 0x3b, 0x33, 0x34, 0x39, 0x34, 0x35, 0x39, 0x2f, 0x30, 0x34,
+ 0x2a, 0x2b, 0x30, 0x23, 0x25, 0x29, 0x20, 0x22, 0x25, 0x29, 0x2c, 0x2f,
+ 0x32, 0x35, 0x3a, 0x2c, 0x2f, 0x34, 0x2a, 0x2e, 0x31, 0x29, 0x2d, 0x2c,
+ 0x2f, 0x33, 0x37, 0x36, 0x3a, 0x41, 0x3f, 0x46, 0x50, 0x43, 0x4a, 0x56,
+ 0x35, 0x3e, 0x4a, 0x2e, 0x37, 0x40, 0x33, 0x3c, 0x43, 0x31, 0x3b, 0x3d,
+ 0x27, 0x2a, 0x2f, 0x1c, 0x1f, 0x24, 0x14, 0x18, 0x1a, 0x12, 0x14, 0x15,
+ 0x11, 0x13, 0x12, 0x11, 0x13, 0x10, 0x10, 0x10, 0x0e, 0x0f, 0x0f, 0x0d,
+ 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0d, 0x0c, 0x0f, 0x11, 0x10,
+ 0x13, 0x15, 0x14, 0x11, 0x13, 0x12, 0x10, 0x12, 0x11, 0x14, 0x16, 0x15,
+ 0x12, 0x16, 0x15, 0x17, 0x1b, 0x1a, 0x23, 0x28, 0x28, 0x2a, 0x2f, 0x32,
+ 0x2c, 0x31, 0x34, 0x2e, 0x33, 0x36, 0x2d, 0x32, 0x35, 0x2c, 0x30, 0x33,
+ 0x2a, 0x2e, 0x31, 0x2d, 0x31, 0x34, 0x2d, 0x30, 0x35, 0x2b, 0x2e, 0x32,
+ 0x2d, 0x31, 0x34, 0x30, 0x34, 0x37, 0x30, 0x34, 0x35, 0x2e, 0x34, 0x34,
+ 0x2d, 0x33, 0x33, 0x30, 0x34, 0x37, 0x31, 0x36, 0x3a, 0x30, 0x35, 0x3b,
+ 0x2f, 0x34, 0x3a, 0x2f, 0x35, 0x3b, 0x2e, 0x35, 0x3b, 0x2d, 0x36, 0x39,
+ 0x30, 0x32, 0x36, 0x32, 0x36, 0x39, 0x2e, 0x32, 0x35, 0x2d, 0x31, 0x34,
+ 0x2f, 0x33, 0x36, 0x2c, 0x30, 0x33, 0x2c, 0x30, 0x33, 0x2e, 0x32, 0x35,
+ 0x2e, 0x31, 0x38, 0x29, 0x2e, 0x34, 0x26, 0x2e, 0x31, 0x26, 0x2c, 0x30,
+ 0x25, 0x26, 0x2a, 0x2b, 0x2a, 0x2d, 0x3f, 0x3f, 0x40, 0x3a, 0x3d, 0x3d,
+ 0x1b, 0x22, 0x27, 0x14, 0x19, 0x1e, 0x12, 0x15, 0x1a, 0x11, 0x14, 0x17,
+ 0x0f, 0x13, 0x12, 0x12, 0x16, 0x10, 0x1e, 0x1c, 0x15, 0x2c, 0x28, 0x1f,
+ 0x21, 0x42, 0x6d, 0x1d, 0x3e, 0x67, 0x20, 0x41, 0x6b, 0x27, 0x48, 0x73,
+ 0x1f, 0x40, 0x6b, 0x1f, 0x40, 0x6d, 0x1d, 0x3e, 0x6b, 0x20, 0x41, 0x6c,
+ 0x20, 0x42, 0x6c, 0x1f, 0x42, 0x6c, 0x1d, 0x40, 0x6a, 0x1b, 0x3e, 0x68,
+ 0x1d, 0x3e, 0x68, 0x22, 0x43, 0x6e, 0x21, 0x43, 0x6e, 0x22, 0x43, 0x6e,
+ 0x20, 0x40, 0x69, 0x1c, 0x3c, 0x64, 0x1e, 0x3f, 0x68, 0x1d, 0x3d, 0x66,
+ 0x1d, 0x3d, 0x66, 0x1e, 0x3e, 0x68, 0x1b, 0x3c, 0x67, 0x1f, 0x41, 0x6b,
+ 0x1a, 0x3d, 0x67, 0x1b, 0x3c, 0x67, 0x22, 0x42, 0x6b, 0x23, 0x43, 0x6c,
+ 0x1c, 0x3e, 0x64, 0x17, 0x39, 0x5f, 0x24, 0x43, 0x6b, 0x31, 0x4e, 0x78,
+ 0x17, 0x37, 0x61, 0x17, 0x38, 0x61, 0x1c, 0x3d, 0x66, 0x17, 0x38, 0x61,
+ 0x1c, 0x3d, 0x67, 0x19, 0x3a, 0x66, 0x11, 0x32, 0x5f, 0x16, 0x36, 0x65,
+ 0x21, 0x3b, 0x69, 0x1b, 0x3a, 0x62, 0x14, 0x37, 0x57, 0x12, 0x30, 0x4d,
+ 0x1b, 0x2c, 0x4c, 0x26, 0x30, 0x54, 0x17, 0x26, 0x47, 0x14, 0x2a, 0x4a,
+ 0x20, 0x37, 0x64, 0x1c, 0x34, 0x62, 0x17, 0x33, 0x5f, 0x17, 0x35, 0x5f,
+ 0x17, 0x37, 0x5d, 0x15, 0x37, 0x59, 0x1a, 0x3c, 0x5c, 0x4b, 0x6e, 0x8d,
+ 0x5e, 0x7d, 0x9d, 0x22, 0x40, 0x65, 0x12, 0x32, 0x5a, 0x19, 0x37, 0x5e,
+ 0x37, 0x51, 0x71, 0x6e, 0x82, 0x99, 0x6a, 0x79, 0x8a, 0x37, 0x42, 0x50,
+ 0x1f, 0x26, 0x30, 0x13, 0x17, 0x20, 0x14, 0x17, 0x1c, 0x0a, 0x0e, 0x0f,
+ 0x1e, 0x20, 0x20, 0x4d, 0x4f, 0x4e, 0x69, 0x6a, 0x6c, 0x3d, 0x3e, 0x40,
+ 0x12, 0x15, 0x1c, 0x12, 0x15, 0x1c, 0x14, 0x17, 0x1c, 0x0f, 0x12, 0x17,
+ 0x40, 0x45, 0x4b, 0x5e, 0x65, 0x6c, 0x30, 0x3a, 0x41, 0x69, 0x74, 0x7d,
+ 0x6b, 0x78, 0x80, 0x45, 0x53, 0x5d, 0x22, 0x30, 0x40, 0x10, 0x20, 0x30,
+ 0x0f, 0x1f, 0x2e, 0x1d, 0x2d, 0x3b, 0x1f, 0x2e, 0x41, 0x1a, 0x28, 0x40,
+ 0x23, 0x2e, 0x41, 0x2d, 0x37, 0x3e, 0x23, 0x30, 0x2f, 0x2a, 0x39, 0x40,
+ 0x16, 0x29, 0x41, 0x20, 0x35, 0x58, 0x21, 0x39, 0x57, 0x28, 0x3e, 0x55,
+ 0x3c, 0x4b, 0x5d, 0x55, 0x62, 0x6e, 0x78, 0x84, 0x8d, 0x96, 0xa6, 0xb0,
+ 0x93, 0xa8, 0xba, 0x80, 0x99, 0xaf, 0x73, 0x8c, 0xa0, 0x6e, 0x85, 0x96,
+ 0x5f, 0x66, 0x69, 0x4c, 0x51, 0x53, 0x45, 0x4b, 0x4e, 0x2e, 0x32, 0x35,
+ 0x14, 0x18, 0x1b, 0x2d, 0x31, 0x34, 0x34, 0x38, 0x39, 0x2b, 0x2f, 0x30,
+ 0x52, 0x5b, 0x63, 0x43, 0x4a, 0x53, 0x1e, 0x21, 0x27, 0x2f, 0x2f, 0x2d,
+ 0x5e, 0x5f, 0x59, 0x90, 0x93, 0x90, 0xac, 0xb1, 0xb8, 0x8a, 0x90, 0x9e,
+ 0x58, 0x5d, 0x69, 0x30, 0x36, 0x43, 0x13, 0x19, 0x27, 0x11, 0x18, 0x25,
+ 0x17, 0x1e, 0x28, 0x1a, 0x1d, 0x22, 0x29, 0x2a, 0x2c, 0x49, 0x49, 0x47,
+ 0x55, 0x50, 0x48, 0x5a, 0x56, 0x49, 0x61, 0x5e, 0x4d, 0x5b, 0x58, 0x47,
+ 0x54, 0x52, 0x44, 0x41, 0x40, 0x3c, 0x23, 0x24, 0x2a, 0x14, 0x16, 0x22,
+ 0x18, 0x18, 0x20, 0x1b, 0x1b, 0x20, 0x29, 0x2a, 0x2e, 0x2b, 0x2f, 0x33,
+ 0x1a, 0x1e, 0x24, 0x16, 0x1c, 0x27, 0x0b, 0x14, 0x1e, 0x28, 0x33, 0x3d,
+ 0x4f, 0x58, 0x6c, 0x39, 0x3f, 0x51, 0x2a, 0x2c, 0x36, 0x1c, 0x19, 0x1e,
+ 0x20, 0x1b, 0x1c, 0x21, 0x1e, 0x1d, 0x1d, 0x1b, 0x1c, 0x1c, 0x1a, 0x1b,
+ 0x1c, 0x18, 0x1a, 0x20, 0x1d, 0x1e, 0x1e, 0x1a, 0x1b, 0x1e, 0x1a, 0x1b,
+ 0x1d, 0x18, 0x1c, 0x1a, 0x15, 0x19, 0x1c, 0x17, 0x1b, 0x17, 0x13, 0x16,
+ 0x14, 0x12, 0x13, 0x26, 0x26, 0x28, 0x3d, 0x3d, 0x44, 0x38, 0x38, 0x40,
+ 0x32, 0x35, 0x3e, 0x2c, 0x2d, 0x35, 0x21, 0x20, 0x26, 0x24, 0x23, 0x28,
+ 0x32, 0x31, 0x34, 0x2f, 0x2e, 0x33, 0x1a, 0x19, 0x1e, 0x0e, 0x0d, 0x11,
+ 0x0c, 0x0d, 0x11, 0x12, 0x13, 0x17, 0x0f, 0x10, 0x14, 0x10, 0x12, 0x15,
+ 0x28, 0x2d, 0x2e, 0x2a, 0x2e, 0x2f, 0x15, 0x17, 0x1a, 0x1e, 0x1d, 0x23,
+ 0x26, 0x25, 0x2b, 0x34, 0x32, 0x39, 0x1e, 0x1c, 0x22, 0x22, 0x20, 0x25,
+ 0x32, 0x31, 0x36, 0x2e, 0x2d, 0x30, 0x1c, 0x1b, 0x1e, 0x1d, 0x1d, 0x1d,
+ 0x27, 0x27, 0x27, 0x1e, 0x1f, 0x21, 0x1c, 0x20, 0x21, 0x2a, 0x2f, 0x30,
+ 0x24, 0x26, 0x2a, 0x26, 0x29, 0x2e, 0x26, 0x29, 0x30, 0x2d, 0x32, 0x3b,
+ 0x3c, 0x40, 0x4a, 0x3d, 0x41, 0x4c, 0x41, 0x45, 0x50, 0x36, 0x3a, 0x45,
+ 0x2e, 0x32, 0x3e, 0x24, 0x28, 0x33, 0x11, 0x14, 0x1b, 0x0c, 0x0d, 0x12,
+ 0x0b, 0x0c, 0x0e, 0x0e, 0x0e, 0x0e, 0x0d, 0x0e, 0x0d, 0x0b, 0x0c, 0x0c,
+ 0x0d, 0x0c, 0x0c, 0x09, 0x09, 0x09, 0x08, 0x08, 0x08, 0x09, 0x0b, 0x0a,
+ 0x11, 0x12, 0x11, 0x15, 0x16, 0x18, 0x12, 0x13, 0x15, 0x11, 0x12, 0x15,
+ 0x12, 0x13, 0x15, 0x14, 0x14, 0x16, 0x17, 0x17, 0x19, 0x1b, 0x1c, 0x20,
+ 0x27, 0x2d, 0x31, 0x3b, 0x45, 0x4c, 0x48, 0x54, 0x5f, 0x3c, 0x48, 0x53,
+ 0x35, 0x3b, 0x40, 0x35, 0x39, 0x3c, 0x33, 0x37, 0x3a, 0x31, 0x35, 0x36,
+ 0x33, 0x37, 0x37, 0x33, 0x37, 0x38, 0x36, 0x3c, 0x3c, 0x35, 0x3a, 0x3d,
+ 0x34, 0x36, 0x3a, 0x34, 0x35, 0x39, 0x34, 0x35, 0x39, 0x33, 0x34, 0x38,
+ 0x33, 0x34, 0x39, 0x32, 0x35, 0x3a, 0x31, 0x33, 0x38, 0x2c, 0x2f, 0x34,
+ 0x1f, 0x22, 0x26, 0x1e, 0x22, 0x25, 0x23, 0x29, 0x2a, 0x2d, 0x34, 0x36,
+ 0x34, 0x3c, 0x3e, 0x30, 0x35, 0x38, 0x2e, 0x34, 0x33, 0x2c, 0x32, 0x2e,
+ 0x2b, 0x2f, 0x33, 0x2a, 0x2e, 0x35, 0x3b, 0x42, 0x4c, 0x47, 0x4f, 0x5a,
+ 0x39, 0x43, 0x4d, 0x30, 0x3a, 0x43, 0x2f, 0x39, 0x3e, 0x30, 0x3a, 0x3c,
+ 0x32, 0x37, 0x3b, 0x28, 0x2c, 0x31, 0x1f, 0x23, 0x26, 0x17, 0x1a, 0x1d,
+ 0x19, 0x1a, 0x1c, 0x19, 0x1b, 0x1a, 0x1b, 0x1b, 0x19, 0x18, 0x19, 0x14,
+ 0x14, 0x14, 0x13, 0x0e, 0x0e, 0x0e, 0x0b, 0x0d, 0x0c, 0x0c, 0x0e, 0x0d,
+ 0x0d, 0x0f, 0x0e, 0x0e, 0x10, 0x0f, 0x11, 0x13, 0x12, 0x14, 0x16, 0x15,
+ 0x17, 0x1b, 0x1a, 0x20, 0x26, 0x24, 0x28, 0x2e, 0x2e, 0x2e, 0x33, 0x36,
+ 0x2e, 0x33, 0x36, 0x2e, 0x32, 0x35, 0x2e, 0x33, 0x36, 0x2f, 0x34, 0x36,
+ 0x2c, 0x32, 0x31, 0x2a, 0x30, 0x2f, 0x2c, 0x30, 0x31, 0x29, 0x2d, 0x30,
+ 0x29, 0x2d, 0x31, 0x2f, 0x34, 0x38, 0x2d, 0x35, 0x38, 0x2d, 0x35, 0x37,
+ 0x2c, 0x31, 0x34, 0x30, 0x34, 0x37, 0x30, 0x34, 0x37, 0x31, 0x34, 0x39,
+ 0x2f, 0x33, 0x38, 0x33, 0x39, 0x3e, 0x31, 0x38, 0x3e, 0x2e, 0x35, 0x3b,
+ 0x2f, 0x34, 0x37, 0x30, 0x35, 0x38, 0x2d, 0x33, 0x35, 0x2b, 0x31, 0x34,
+ 0x2d, 0x32, 0x35, 0x2b, 0x31, 0x34, 0x2b, 0x30, 0x33, 0x2a, 0x32, 0x34,
+ 0x2d, 0x32, 0x38, 0x2a, 0x2f, 0x35, 0x26, 0x2f, 0x32, 0x29, 0x2e, 0x32,
+ 0x29, 0x29, 0x2e, 0x2a, 0x2a, 0x2c, 0x35, 0x35, 0x37, 0x25, 0x28, 0x27,
+ 0x1d, 0x26, 0x2b, 0x1e, 0x24, 0x2c, 0x15, 0x18, 0x20, 0x12, 0x15, 0x1c,
+ 0x10, 0x13, 0x18, 0x1b, 0x1f, 0x20, 0x20, 0x20, 0x1e, 0x19, 0x18, 0x14,
+ 0x1d, 0x40, 0x6a, 0x1d, 0x40, 0x6b, 0x1c, 0x3e, 0x6b, 0x1f, 0x41, 0x6e,
+ 0x1f, 0x41, 0x6e, 0x25, 0x47, 0x74, 0x1e, 0x3f, 0x6c, 0x1d, 0x3e, 0x6b,
+ 0x1e, 0x3f, 0x6a, 0x1f, 0x40, 0x6b, 0x1e, 0x41, 0x6b, 0x1a, 0x3d, 0x67,
+ 0x1b, 0x3e, 0x68, 0x1e, 0x41, 0x6b, 0x1e, 0x3f, 0x6b, 0x1c, 0x3e, 0x69,
+ 0x1c, 0x3d, 0x66, 0x1c, 0x3d, 0x66, 0x24, 0x44, 0x6d, 0x1f, 0x3e, 0x6a,
+ 0x1b, 0x3a, 0x65, 0x1c, 0x3d, 0x68, 0x1b, 0x3d, 0x68, 0x19, 0x3c, 0x66,
+ 0x15, 0x3a, 0x64, 0x13, 0x36, 0x5e, 0x19, 0x39, 0x63, 0x25, 0x46, 0x6d,
+ 0x26, 0x48, 0x6e, 0x18, 0x3a, 0x61, 0x23, 0x44, 0x6d, 0x28, 0x48, 0x71,
+ 0x18, 0x3b, 0x63, 0x18, 0x3a, 0x62, 0x19, 0x3a, 0x63, 0x15, 0x36, 0x5f,
+ 0x16, 0x37, 0x60, 0x1a, 0x3b, 0x66, 0x15, 0x37, 0x64, 0x16, 0x38, 0x65,
+ 0x1c, 0x3d, 0x6a, 0x1f, 0x3d, 0x65, 0x1d, 0x36, 0x57, 0x17, 0x2c, 0x4b,
+ 0x14, 0x29, 0x48, 0x1d, 0x31, 0x52, 0x1a, 0x2c, 0x4d, 0x19, 0x2a, 0x4c,
+ 0x21, 0x36, 0x61, 0x17, 0x34, 0x62, 0x12, 0x34, 0x64, 0x13, 0x39, 0x66,
+ 0x13, 0x36, 0x5e, 0x21, 0x40, 0x60, 0x5d, 0x78, 0x93, 0x5b, 0x75, 0x8f,
+ 0x1d, 0x3c, 0x62, 0x18, 0x39, 0x5f, 0x16, 0x38, 0x5d, 0x14, 0x34, 0x5b,
+ 0x13, 0x32, 0x59, 0x34, 0x4d, 0x73, 0x80, 0x96, 0xb1, 0x78, 0x8d, 0x9e,
+ 0x47, 0x53, 0x63, 0x1d, 0x26, 0x33, 0x13, 0x1c, 0x26, 0x2d, 0x34, 0x3a,
+ 0x64, 0x6a, 0x6e, 0x69, 0x6e, 0x72, 0x38, 0x3d, 0x42, 0x14, 0x19, 0x20,
+ 0x13, 0x17, 0x21, 0x13, 0x17, 0x20, 0x1a, 0x1e, 0x27, 0x1a, 0x21, 0x29,
+ 0x49, 0x52, 0x59, 0x3e, 0x48, 0x52, 0x1b, 0x29, 0x35, 0x56, 0x66, 0x72,
+ 0x4a, 0x5b, 0x65, 0x7e, 0x8f, 0x9d, 0x31, 0x41, 0x55, 0x16, 0x27, 0x39,
+ 0x3c, 0x4e, 0x5c, 0x50, 0x61, 0x6f, 0x29, 0x39, 0x4b, 0x0f, 0x1e, 0x36,
+ 0x26, 0x35, 0x50, 0x28, 0x37, 0x48, 0x2f, 0x40, 0x48, 0x21, 0x34, 0x41,
+ 0x1a, 0x2f, 0x4b, 0x1d, 0x35, 0x5a, 0x27, 0x40, 0x63, 0x33, 0x4a, 0x65,
+ 0x71, 0x7d, 0x7e, 0x85, 0x8c, 0x86, 0x9f, 0xa3, 0x9a, 0xfb, 0xfe, 0xfc,
+ 0xd2, 0xdc, 0xe4, 0x8e, 0x9e, 0xb1, 0x73, 0x7f, 0x95, 0x70, 0x7b, 0x8e,
+ 0x65, 0x6f, 0x76, 0x56, 0x60, 0x64, 0x41, 0x4a, 0x4f, 0x21, 0x29, 0x2d,
+ 0x16, 0x1b, 0x1f, 0x21, 0x26, 0x28, 0x32, 0x38, 0x38, 0x5d, 0x63, 0x64,
+ 0x58, 0x62, 0x6b, 0x55, 0x5f, 0x68, 0x30, 0x37, 0x3c, 0x4e, 0x52, 0x4f,
+ 0xb0, 0xb3, 0xa9, 0xe9, 0xec, 0xe7, 0xd2, 0xd5, 0xdd, 0x97, 0x99, 0xaa,
+ 0x57, 0x5e, 0x67, 0x27, 0x2e, 0x38, 0x19, 0x22, 0x2b, 0x18, 0x21, 0x2a,
+ 0x14, 0x1c, 0x21, 0x2c, 0x32, 0x30, 0x8c, 0x90, 0x87, 0x7e, 0x7f, 0x73,
+ 0x5f, 0x5a, 0x53, 0x55, 0x51, 0x48, 0x5c, 0x58, 0x4d, 0x5d, 0x59, 0x4e,
+ 0x4a, 0x48, 0x40, 0x29, 0x29, 0x27, 0x17, 0x17, 0x1e, 0x13, 0x16, 0x1e,
+ 0x13, 0x14, 0x19, 0x1c, 0x1d, 0x1e, 0x31, 0x31, 0x31, 0x52, 0x53, 0x52,
+ 0x3b, 0x3e, 0x42, 0x25, 0x29, 0x34, 0x1c, 0x24, 0x2f, 0x17, 0x22, 0x2d,
+ 0x1e, 0x32, 0x46, 0x3e, 0x50, 0x62, 0x5b, 0x66, 0x74, 0x3b, 0x41, 0x4a,
+ 0x23, 0x25, 0x2c, 0x1e, 0x1b, 0x21, 0x2a, 0x22, 0x29, 0x2d, 0x23, 0x2c,
+ 0x1f, 0x1c, 0x21, 0x1d, 0x1c, 0x1f, 0x18, 0x16, 0x19, 0x1b, 0x19, 0x1c,
+ 0x1a, 0x18, 0x1c, 0x20, 0x1e, 0x21, 0x1f, 0x1a, 0x1e, 0x1a, 0x15, 0x19,
+ 0x13, 0x12, 0x14, 0x1e, 0x1e, 0x22, 0x35, 0x36, 0x3b, 0x31, 0x34, 0x3b,
+ 0x28, 0x2b, 0x32, 0x26, 0x27, 0x2c, 0x2b, 0x2a, 0x2f, 0x32, 0x32, 0x34,
+ 0x2c, 0x2b, 0x30, 0x18, 0x17, 0x1c, 0x11, 0x10, 0x15, 0x0e, 0x0e, 0x13,
+ 0x0e, 0x0f, 0x13, 0x12, 0x13, 0x17, 0x0f, 0x13, 0x16, 0x0d, 0x11, 0x15,
+ 0x18, 0x20, 0x23, 0x3e, 0x45, 0x4b, 0x19, 0x1e, 0x25, 0x29, 0x29, 0x33,
+ 0x3d, 0x3d, 0x47, 0x34, 0x33, 0x3b, 0x23, 0x22, 0x28, 0x24, 0x23, 0x28,
+ 0x29, 0x28, 0x2d, 0x24, 0x23, 0x27, 0x1d, 0x1d, 0x1f, 0x1e, 0x1e, 0x1f,
+ 0x21, 0x22, 0x24, 0x21, 0x23, 0x24, 0x1d, 0x21, 0x22, 0x27, 0x2c, 0x2d,
+ 0x2b, 0x2b, 0x32, 0x27, 0x27, 0x30, 0x23, 0x26, 0x2f, 0x2e, 0x32, 0x3d,
+ 0x33, 0x37, 0x43, 0x30, 0x34, 0x40, 0x30, 0x34, 0x40, 0x2b, 0x2f, 0x3b,
+ 0x2d, 0x32, 0x3d, 0x25, 0x29, 0x34, 0x12, 0x15, 0x1b, 0x10, 0x11, 0x15,
+ 0x10, 0x11, 0x12, 0x0e, 0x0e, 0x0e, 0x0c, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c,
+ 0x0b, 0x0b, 0x0b, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x0a, 0x0a,
+ 0x10, 0x12, 0x12, 0x14, 0x15, 0x17, 0x14, 0x15, 0x18, 0x11, 0x12, 0x16,
+ 0x14, 0x16, 0x18, 0x19, 0x19, 0x1b, 0x19, 0x19, 0x1b, 0x1b, 0x1c, 0x20,
+ 0x22, 0x29, 0x2d, 0x3a, 0x45, 0x4b, 0x49, 0x55, 0x5f, 0x48, 0x52, 0x5e,
+ 0x38, 0x3e, 0x47, 0x31, 0x37, 0x3d, 0x31, 0x36, 0x3a, 0x31, 0x35, 0x38,
+ 0x33, 0x37, 0x3a, 0x32, 0x36, 0x39, 0x31, 0x36, 0x38, 0x33, 0x36, 0x39,
+ 0x32, 0x34, 0x38, 0x32, 0x32, 0x37, 0x31, 0x32, 0x36, 0x31, 0x32, 0x36,
+ 0x30, 0x33, 0x37, 0x33, 0x36, 0x3b, 0x2f, 0x32, 0x37, 0x26, 0x29, 0x2e,
+ 0x1f, 0x23, 0x26, 0x26, 0x2b, 0x2e, 0x33, 0x3c, 0x3c, 0x37, 0x40, 0x41,
+ 0x31, 0x3b, 0x3d, 0x2e, 0x37, 0x39, 0x2d, 0x37, 0x36, 0x2e, 0x34, 0x30,
+ 0x26, 0x27, 0x2a, 0x22, 0x25, 0x2b, 0x35, 0x3a, 0x40, 0x49, 0x50, 0x57,
+ 0x3c, 0x45, 0x4c, 0x2f, 0x38, 0x3d, 0x2b, 0x35, 0x38, 0x2f, 0x37, 0x3a,
+ 0x32, 0x37, 0x3b, 0x2e, 0x33, 0x37, 0x29, 0x2c, 0x30, 0x22, 0x26, 0x29,
+ 0x22, 0x23, 0x27, 0x23, 0x24, 0x26, 0x23, 0x23, 0x23, 0x22, 0x22, 0x20,
+ 0x1f, 0x1f, 0x1f, 0x19, 0x19, 0x19, 0x11, 0x13, 0x12, 0x0c, 0x0e, 0x0d,
+ 0x0a, 0x0c, 0x0b, 0x0f, 0x11, 0x10, 0x16, 0x17, 0x16, 0x1a, 0x1c, 0x1b,
+ 0x1f, 0x25, 0x23, 0x26, 0x2c, 0x2a, 0x28, 0x2e, 0x2e, 0x2a, 0x32, 0x34,
+ 0x2a, 0x31, 0x33, 0x2c, 0x32, 0x35, 0x30, 0x34, 0x38, 0x2f, 0x34, 0x37,
+ 0x2d, 0x33, 0x30, 0x2b, 0x31, 0x2f, 0x2a, 0x30, 0x30, 0x2c, 0x31, 0x34,
+ 0x2e, 0x33, 0x37, 0x2f, 0x34, 0x38, 0x2d, 0x34, 0x38, 0x2c, 0x34, 0x37,
+ 0x2c, 0x31, 0x34, 0x2c, 0x30, 0x33, 0x2f, 0x33, 0x36, 0x2e, 0x31, 0x36,
+ 0x2e, 0x31, 0x36, 0x31, 0x36, 0x3a, 0x30, 0x35, 0x3b, 0x31, 0x36, 0x3c,
+ 0x2e, 0x34, 0x36, 0x2d, 0x32, 0x35, 0x2a, 0x31, 0x34, 0x2a, 0x32, 0x34,
+ 0x2c, 0x34, 0x36, 0x2b, 0x33, 0x35, 0x29, 0x31, 0x33, 0x2b, 0x33, 0x35,
+ 0x2c, 0x30, 0x36, 0x2a, 0x2f, 0x35, 0x28, 0x30, 0x33, 0x2a, 0x2f, 0x33,
+ 0x25, 0x26, 0x2a, 0x24, 0x25, 0x29, 0x26, 0x27, 0x29, 0x1f, 0x23, 0x24,
+ 0x19, 0x23, 0x27, 0x17, 0x1d, 0x26, 0x15, 0x18, 0x21, 0x16, 0x1a, 0x24,
+ 0x18, 0x1c, 0x25, 0x1b, 0x20, 0x26, 0x1c, 0x20, 0x23, 0x16, 0x17, 0x19,
+ 0x1a, 0x3e, 0x68, 0x1e, 0x43, 0x6e, 0x1d, 0x42, 0x6f, 0x20, 0x42, 0x6f,
+ 0x24, 0x47, 0x72, 0x25, 0x48, 0x72, 0x20, 0x41, 0x6e, 0x20, 0x40, 0x6f,
+ 0x21, 0x3f, 0x6e, 0x20, 0x40, 0x6d, 0x23, 0x44, 0x70, 0x1e, 0x40, 0x6c,
+ 0x1d, 0x3f, 0x6c, 0x1e, 0x40, 0x6d, 0x19, 0x3b, 0x68, 0x1d, 0x3f, 0x6b,
+ 0x20, 0x43, 0x6d, 0x1e, 0x3f, 0x6a, 0x20, 0x40, 0x6b, 0x21, 0x40, 0x6c,
+ 0x1c, 0x3c, 0x68, 0x19, 0x3a, 0x65, 0x1d, 0x40, 0x6a, 0x1c, 0x3f, 0x69,
+ 0x17, 0x3e, 0x67, 0x18, 0x3b, 0x66, 0x1a, 0x39, 0x65, 0x21, 0x40, 0x69,
+ 0x2d, 0x4e, 0x77, 0x19, 0x3c, 0x65, 0x17, 0x3a, 0x64, 0x19, 0x3b, 0x67,
+ 0x16, 0x3a, 0x63, 0x18, 0x3a, 0x64, 0x17, 0x38, 0x61, 0x1c, 0x3c, 0x65,
+ 0x19, 0x38, 0x61, 0x15, 0x36, 0x61, 0x19, 0x3a, 0x64, 0x16, 0x38, 0x65,
+ 0x16, 0x3b, 0x6c, 0x1c, 0x3d, 0x67, 0x1f, 0x38, 0x59, 0x15, 0x2a, 0x47,
+ 0x15, 0x29, 0x49, 0x26, 0x39, 0x5a, 0x1d, 0x30, 0x51, 0x1e, 0x30, 0x51,
+ 0x1c, 0x3a, 0x60, 0x16, 0x3b, 0x65, 0x11, 0x37, 0x65, 0x0d, 0x31, 0x5b,
+ 0x26, 0x44, 0x69, 0x69, 0x81, 0xa3, 0x59, 0x6e, 0x8e, 0x22, 0x3a, 0x5d,
+ 0x13, 0x33, 0x5c, 0x1a, 0x3c, 0x63, 0x1a, 0x3c, 0x62, 0x18, 0x39, 0x62,
+ 0x19, 0x38, 0x66, 0x14, 0x31, 0x5d, 0x37, 0x53, 0x78, 0x65, 0x82, 0x9d,
+ 0x7e, 0x91, 0xa9, 0x5e, 0x70, 0x86, 0x45, 0x57, 0x67, 0x72, 0x80, 0x8d,
+ 0x74, 0x7f, 0x8b, 0x34, 0x3e, 0x4a, 0x12, 0x1a, 0x27, 0x13, 0x1a, 0x29,
+ 0x14, 0x1d, 0x2c, 0x0e, 0x18, 0x24, 0x28, 0x31, 0x3e, 0x75, 0x7f, 0x8c,
+ 0x50, 0x5c, 0x6a, 0x24, 0x34, 0x43, 0x15, 0x28, 0x3a, 0x31, 0x46, 0x59,
+ 0x65, 0x77, 0x85, 0x85, 0x97, 0xaa, 0x30, 0x43, 0x5c, 0x56, 0x68, 0x7c,
+ 0x77, 0x8a, 0x97, 0x87, 0x99, 0xa5, 0x69, 0x78, 0x88, 0x20, 0x2f, 0x47,
+ 0x1b, 0x31, 0x53, 0x17, 0x2d, 0x4a, 0x20, 0x37, 0x4d, 0x17, 0x30, 0x48,
+ 0x1b, 0x36, 0x56, 0x1c, 0x39, 0x5e, 0x1e, 0x3a, 0x5f, 0x21, 0x3c, 0x5f,
+ 0x52, 0x64, 0x71, 0x8f, 0x98, 0x9b, 0xb0, 0xb2, 0xae, 0xfa, 0xfb, 0xf8,
+ 0xf4, 0xfa, 0xff, 0xbb, 0xc3, 0xd3, 0x91, 0x96, 0xa6, 0x80, 0x82, 0x90,
+ 0x5d, 0x66, 0x71, 0x45, 0x4f, 0x59, 0x35, 0x3e, 0x47, 0x1c, 0x26, 0x2c,
+ 0x16, 0x1f, 0x24, 0x30, 0x3a, 0x3c, 0x60, 0x6a, 0x6b, 0x7a, 0x84, 0x86,
+ 0x45, 0x52, 0x59, 0x28, 0x35, 0x3f, 0x4d, 0x57, 0x63, 0x4f, 0x59, 0x60,
+ 0x9e, 0xa6, 0xa5, 0xff, 0xff, 0xff, 0xd8, 0xdb, 0xe2, 0x91, 0x93, 0xa2,
+ 0x4e, 0x55, 0x63, 0x2c, 0x33, 0x44, 0x1e, 0x27, 0x38, 0x16, 0x22, 0x30,
+ 0x14, 0x1f, 0x27, 0x4f, 0x56, 0x58, 0xd0, 0xd5, 0xcf, 0xc4, 0xc6, 0xbc,
+ 0x98, 0x95, 0x8e, 0x75, 0x72, 0x6b, 0x5c, 0x59, 0x52, 0x4b, 0x49, 0x43,
+ 0x2d, 0x2b, 0x28, 0x1b, 0x1b, 0x1b, 0x15, 0x16, 0x1a, 0x10, 0x14, 0x17,
+ 0x1a, 0x1d, 0x1a, 0x42, 0x44, 0x3b, 0x89, 0x8b, 0x7e, 0x7b, 0x7a, 0x72,
+ 0x6a, 0x6b, 0x6b, 0x46, 0x49, 0x52, 0x26, 0x2a, 0x39, 0x28, 0x30, 0x3d,
+ 0x18, 0x27, 0x37, 0x0f, 0x1e, 0x2e, 0x37, 0x47, 0x56, 0x52, 0x60, 0x6e,
+ 0x53, 0x5d, 0x6a, 0x47, 0x4b, 0x57, 0x40, 0x41, 0x4d, 0x33, 0x32, 0x3e,
+ 0x21, 0x24, 0x2d, 0x19, 0x1c, 0x23, 0x15, 0x17, 0x1d, 0x15, 0x18, 0x1c,
+ 0x16, 0x17, 0x1b, 0x21, 0x22, 0x26, 0x1a, 0x1b, 0x1f, 0x16, 0x14, 0x19,
+ 0x16, 0x17, 0x1a, 0x1b, 0x1e, 0x21, 0x29, 0x2e, 0x32, 0x29, 0x2e, 0x34,
+ 0x29, 0x2e, 0x34, 0x31, 0x34, 0x39, 0x32, 0x33, 0x37, 0x24, 0x25, 0x27,
+ 0x13, 0x13, 0x19, 0x10, 0x10, 0x18, 0x11, 0x12, 0x19, 0x0d, 0x0f, 0x16,
+ 0x13, 0x16, 0x1d, 0x19, 0x1e, 0x24, 0x13, 0x17, 0x1f, 0x0c, 0x11, 0x1a,
+ 0x0a, 0x12, 0x1b, 0x4d, 0x56, 0x5f, 0x3b, 0x42, 0x4d, 0x2e, 0x30, 0x3d,
+ 0x49, 0x48, 0x54, 0x3c, 0x3b, 0x46, 0x29, 0x2a, 0x2f, 0x3f, 0x40, 0x44,
+ 0x30, 0x2f, 0x34, 0x19, 0x18, 0x1d, 0x1f, 0x1d, 0x21, 0x23, 0x21, 0x24,
+ 0x29, 0x28, 0x2b, 0x1e, 0x1e, 0x20, 0x1c, 0x1c, 0x1e, 0x21, 0x22, 0x24,
+ 0x2a, 0x29, 0x30, 0x2a, 0x29, 0x31, 0x25, 0x25, 0x2f, 0x2a, 0x2d, 0x36,
+ 0x2f, 0x32, 0x3d, 0x2e, 0x32, 0x3c, 0x27, 0x2b, 0x36, 0x28, 0x2c, 0x34,
+ 0x2a, 0x2d, 0x38, 0x1c, 0x1f, 0x28, 0x13, 0x16, 0x1c, 0x14, 0x15, 0x17,
+ 0x12, 0x12, 0x12, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x09, 0x09, 0x09,
+ 0x0a, 0x0a, 0x0a, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x0c, 0x0c, 0x0c,
+ 0x12, 0x13, 0x14, 0x13, 0x14, 0x16, 0x14, 0x15, 0x19, 0x10, 0x11, 0x16,
+ 0x12, 0x15, 0x18, 0x17, 0x18, 0x1a, 0x1b, 0x1b, 0x1d, 0x1d, 0x20, 0x23,
+ 0x1c, 0x24, 0x27, 0x34, 0x3f, 0x43, 0x4b, 0x56, 0x5d, 0x4f, 0x59, 0x62,
+ 0x3c, 0x44, 0x4f, 0x30, 0x37, 0x41, 0x32, 0x36, 0x3f, 0x35, 0x38, 0x3f,
+ 0x33, 0x35, 0x3b, 0x32, 0x33, 0x37, 0x33, 0x34, 0x38, 0x33, 0x34, 0x38,
+ 0x2f, 0x2f, 0x34, 0x2b, 0x2c, 0x30, 0x2c, 0x2e, 0x31, 0x2c, 0x30, 0x33,
+ 0x34, 0x38, 0x3b, 0x34, 0x38, 0x3c, 0x30, 0x35, 0x39, 0x28, 0x2c, 0x30,
+ 0x25, 0x26, 0x2b, 0x32, 0x35, 0x3a, 0x45, 0x4a, 0x4e, 0x3d, 0x44, 0x4a,
+ 0x31, 0x38, 0x40, 0x2c, 0x33, 0x3b, 0x2e, 0x33, 0x37, 0x27, 0x2b, 0x2c,
+ 0x21, 0x22, 0x26, 0x20, 0x23, 0x26, 0x33, 0x38, 0x3b, 0x46, 0x4d, 0x4f,
+ 0x3b, 0x43, 0x45, 0x32, 0x3a, 0x3b, 0x32, 0x38, 0x3a, 0x31, 0x36, 0x39,
+ 0x2e, 0x34, 0x37, 0x2f, 0x34, 0x38, 0x31, 0x35, 0x39, 0x2f, 0x32, 0x36,
+ 0x2a, 0x2d, 0x32, 0x27, 0x28, 0x2c, 0x28, 0x28, 0x2a, 0x2c, 0x2b, 0x2c,
+ 0x2e, 0x2e, 0x2e, 0x2c, 0x2c, 0x2c, 0x1d, 0x1e, 0x1d, 0x12, 0x14, 0x13,
+ 0x12, 0x14, 0x13, 0x18, 0x1a, 0x19, 0x20, 0x21, 0x20, 0x26, 0x28, 0x27,
+ 0x29, 0x2f, 0x2c, 0x2b, 0x32, 0x30, 0x2c, 0x34, 0x33, 0x29, 0x31, 0x33,
+ 0x29, 0x30, 0x33, 0x2c, 0x31, 0x34, 0x31, 0x36, 0x39, 0x31, 0x36, 0x38,
+ 0x2e, 0x32, 0x33, 0x2b, 0x2f, 0x32, 0x2f, 0x31, 0x35, 0x30, 0x31, 0x35,
+ 0x2d, 0x31, 0x34, 0x2e, 0x32, 0x35, 0x2f, 0x34, 0x36, 0x2d, 0x35, 0x36,
+ 0x2d, 0x32, 0x35, 0x2c, 0x30, 0x33, 0x2a, 0x2e, 0x31, 0x2e, 0x31, 0x35,
+ 0x33, 0x34, 0x39, 0x33, 0x36, 0x3a, 0x30, 0x33, 0x3a, 0x2e, 0x31, 0x38,
+ 0x2d, 0x33, 0x34, 0x2c, 0x32, 0x32, 0x2b, 0x31, 0x31, 0x2b, 0x31, 0x31,
+ 0x2b, 0x31, 0x31, 0x2d, 0x33, 0x33, 0x30, 0x36, 0x36, 0x2f, 0x34, 0x35,
+ 0x2a, 0x2d, 0x34, 0x2c, 0x31, 0x37, 0x2a, 0x31, 0x34, 0x2b, 0x31, 0x34,
+ 0x25, 0x28, 0x2c, 0x1c, 0x1f, 0x24, 0x1f, 0x23, 0x26, 0x25, 0x2a, 0x2d,
+ 0x2e, 0x38, 0x38, 0x2f, 0x36, 0x3a, 0x21, 0x25, 0x2e, 0x1a, 0x1e, 0x2a,
+ 0x16, 0x1d, 0x27, 0x17, 0x20, 0x27, 0x14, 0x1c, 0x1f, 0x16, 0x1e, 0x20,
+ 0x1c, 0x41, 0x6c, 0x1c, 0x41, 0x6d, 0x1f, 0x44, 0x71, 0x23, 0x45, 0x73,
+ 0x24, 0x47, 0x71, 0x25, 0x46, 0x70, 0x23, 0x43, 0x70, 0x23, 0x42, 0x70,
+ 0x25, 0x42, 0x70, 0x22, 0x41, 0x6f, 0x1f, 0x40, 0x6d, 0x20, 0x42, 0x6f,
+ 0x1f, 0x44, 0x70, 0x1e, 0x40, 0x6d, 0x1d, 0x3f, 0x6c, 0x1d, 0x3f, 0x6c,
+ 0x1f, 0x42, 0x6c, 0x1f, 0x40, 0x6b, 0x1f, 0x40, 0x6c, 0x1c, 0x3b, 0x68,
+ 0x1b, 0x3c, 0x67, 0x1d, 0x3e, 0x69, 0x26, 0x49, 0x73, 0x1f, 0x44, 0x6e,
+ 0x17, 0x3e, 0x69, 0x1b, 0x3e, 0x6b, 0x1a, 0x38, 0x67, 0x1e, 0x3e, 0x6c,
+ 0x23, 0x44, 0x72, 0x17, 0x39, 0x67, 0x17, 0x38, 0x66, 0x1a, 0x3b, 0x69,
+ 0x19, 0x3b, 0x66, 0x1a, 0x3a, 0x65, 0x18, 0x3a, 0x64, 0x1f, 0x3f, 0x69,
+ 0x1c, 0x3d, 0x66, 0x17, 0x38, 0x61, 0x1b, 0x3d, 0x67, 0x18, 0x3b, 0x66,
+ 0x15, 0x37, 0x6c, 0x15, 0x3a, 0x66, 0x18, 0x3c, 0x5c, 0x12, 0x2c, 0x4a,
+ 0x19, 0x28, 0x49, 0x2a, 0x35, 0x58, 0x1b, 0x2b, 0x4d, 0x1c, 0x36, 0x55,
+ 0x1a, 0x39, 0x66, 0x16, 0x36, 0x64, 0x13, 0x32, 0x5b, 0x30, 0x4b, 0x6e,
+ 0x6a, 0x81, 0xa0, 0x57, 0x70, 0x92, 0x1a, 0x3c, 0x65, 0x10, 0x37, 0x67,
+ 0x19, 0x3c, 0x63, 0x19, 0x3a, 0x63, 0x1a, 0x3b, 0x66, 0x1a, 0x3a, 0x67,
+ 0x1a, 0x39, 0x67, 0x16, 0x36, 0x61, 0x13, 0x34, 0x5d, 0x19, 0x3a, 0x5f,
+ 0x47, 0x62, 0x80, 0x81, 0x99, 0xb6, 0x8f, 0xa6, 0xbd, 0x76, 0x8a, 0x9d,
+ 0x33, 0x41, 0x52, 0x12, 0x1e, 0x30, 0x11, 0x1c, 0x30, 0x12, 0x1d, 0x31,
+ 0x13, 0x21, 0x32, 0x0d, 0x1c, 0x2c, 0x30, 0x3d, 0x4d, 0x94, 0xa4, 0xb3,
+ 0x81, 0x93, 0xa2, 0x65, 0x79, 0x8c, 0x30, 0x47, 0x5e, 0x61, 0x7b, 0x91,
+ 0x84, 0x99, 0xa9, 0x41, 0x56, 0x6b, 0x41, 0x55, 0x6d, 0x83, 0x94, 0xaa,
+ 0x2e, 0x42, 0x4e, 0x73, 0x86, 0x90, 0x93, 0xa4, 0xb3, 0x74, 0x84, 0x9c,
+ 0x33, 0x4d, 0x72, 0x18, 0x32, 0x54, 0x1b, 0x35, 0x54, 0x20, 0x3b, 0x5a,
+ 0x1e, 0x3d, 0x5e, 0x1b, 0x3b, 0x60, 0x1b, 0x3a, 0x61, 0x1d, 0x3b, 0x62,
+ 0x21, 0x3e, 0x64, 0x41, 0x55, 0x71, 0x9c, 0xa6, 0xb4, 0xe0, 0xe7, 0xf0,
+ 0xe2, 0xeb, 0xf4, 0xd9, 0xe2, 0xed, 0xb1, 0xb6, 0xbe, 0x99, 0x99, 0x9d,
+ 0x61, 0x68, 0x75, 0x2c, 0x35, 0x42, 0x2f, 0x38, 0x44, 0x25, 0x2e, 0x37,
+ 0x3d, 0x48, 0x4e, 0x78, 0x86, 0x8b, 0x61, 0x71, 0x75, 0x8b, 0x9a, 0x9d,
+ 0x85, 0x97, 0x99, 0x51, 0x61, 0x6b, 0x39, 0x47, 0x5a, 0x49, 0x56, 0x68,
+ 0x52, 0x5e, 0x68, 0x95, 0x9e, 0xa4, 0xda, 0xdf, 0xe7, 0x92, 0x93, 0xa0,
+ 0x38, 0x3c, 0x58, 0x31, 0x37, 0x53, 0x1d, 0x26, 0x43, 0x19, 0x24, 0x40,
+ 0x19, 0x24, 0x3a, 0x48, 0x53, 0x5e, 0x88, 0x90, 0x95, 0xbd, 0xc1, 0xc2,
+ 0xd2, 0xd2, 0xcb, 0xad, 0xad, 0xa6, 0x60, 0x5d, 0x58, 0x2f, 0x2b, 0x2a,
+ 0x21, 0x20, 0x21, 0x25, 0x25, 0x26, 0x19, 0x1d, 0x1c, 0x14, 0x18, 0x16,
+ 0x33, 0x36, 0x2b, 0x55, 0x59, 0x47, 0xa8, 0xaa, 0x95, 0xbf, 0xbf, 0xb1,
+ 0xa8, 0xa7, 0xa5, 0x81, 0x81, 0x89, 0x4c, 0x4e, 0x60, 0x1e, 0x22, 0x35,
+ 0x1f, 0x22, 0x2f, 0x19, 0x1c, 0x28, 0x0a, 0x14, 0x21, 0x18, 0x26, 0x33,
+ 0x35, 0x47, 0x54, 0x54, 0x65, 0x73, 0x5d, 0x6c, 0x7b, 0x53, 0x61, 0x6e,
+ 0x4e, 0x56, 0x61, 0x46, 0x4e, 0x59, 0x3d, 0x45, 0x50, 0x2d, 0x34, 0x3e,
+ 0x28, 0x2d, 0x37, 0x28, 0x2e, 0x35, 0x28, 0x2e, 0x33, 0x29, 0x2d, 0x33,
+ 0x30, 0x35, 0x39, 0x33, 0x39, 0x3e, 0x2f, 0x36, 0x3c, 0x35, 0x3e, 0x44,
+ 0x37, 0x3d, 0x44, 0x28, 0x2f, 0x33, 0x18, 0x1d, 0x20, 0x0f, 0x13, 0x15,
+ 0x0b, 0x0e, 0x17, 0x13, 0x16, 0x1f, 0x15, 0x19, 0x21, 0x12, 0x16, 0x21,
+ 0x15, 0x1b, 0x25, 0x1a, 0x21, 0x2c, 0x15, 0x1c, 0x28, 0x0f, 0x17, 0x22,
+ 0x09, 0x13, 0x1d, 0x30, 0x38, 0x44, 0x67, 0x6e, 0x7b, 0x28, 0x2c, 0x3b,
+ 0x1d, 0x1f, 0x2d, 0x25, 0x25, 0x30, 0x27, 0x28, 0x2f, 0x42, 0x42, 0x48,
+ 0x36, 0x33, 0x3a, 0x1c, 0x1a, 0x1f, 0x23, 0x1e, 0x24, 0x22, 0x1d, 0x21,
+ 0x1f, 0x1b, 0x1e, 0x1f, 0x1b, 0x1e, 0x24, 0x22, 0x25, 0x26, 0x25, 0x27,
+ 0x24, 0x21, 0x28, 0x24, 0x23, 0x29, 0x1f, 0x1f, 0x27, 0x2e, 0x2e, 0x36,
+ 0x32, 0x34, 0x3c, 0x2f, 0x32, 0x3a, 0x2a, 0x2e, 0x35, 0x2b, 0x2e, 0x35,
+ 0x27, 0x2b, 0x33, 0x1a, 0x1d, 0x24, 0x13, 0x15, 0x19, 0x11, 0x11, 0x13,
+ 0x11, 0x10, 0x10, 0x10, 0x0e, 0x0f, 0x0a, 0x09, 0x09, 0x08, 0x06, 0x07,
+ 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0e, 0x0e, 0x0e,
+ 0x13, 0x13, 0x15, 0x13, 0x13, 0x16, 0x16, 0x17, 0x1b, 0x13, 0x15, 0x19,
+ 0x11, 0x14, 0x17, 0x15, 0x16, 0x1a, 0x1c, 0x1d, 0x1f, 0x1b, 0x1f, 0x21,
+ 0x17, 0x1f, 0x22, 0x30, 0x3c, 0x3e, 0x48, 0x52, 0x59, 0x57, 0x62, 0x6b,
+ 0x4e, 0x56, 0x64, 0x39, 0x41, 0x4c, 0x31, 0x38, 0x41, 0x33, 0x37, 0x3f,
+ 0x32, 0x35, 0x3a, 0x33, 0x35, 0x3a, 0x31, 0x32, 0x36, 0x28, 0x29, 0x2d,
+ 0x25, 0x26, 0x29, 0x22, 0x23, 0x25, 0x22, 0x25, 0x27, 0x27, 0x2b, 0x2d,
+ 0x38, 0x3c, 0x3f, 0x41, 0x46, 0x4a, 0x3a, 0x3f, 0x43, 0x2d, 0x33, 0x39,
+ 0x2a, 0x29, 0x31, 0x2f, 0x2f, 0x37, 0x3e, 0x41, 0x48, 0x35, 0x3a, 0x42,
+ 0x2a, 0x2f, 0x3b, 0x25, 0x28, 0x33, 0x21, 0x24, 0x2b, 0x21, 0x22, 0x26,
+ 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x2f, 0x33, 0x32, 0x35, 0x3b, 0x37,
+ 0x34, 0x3a, 0x37, 0x34, 0x3a, 0x39, 0x34, 0x38, 0x39, 0x31, 0x35, 0x38,
+ 0x2d, 0x34, 0x36, 0x31, 0x36, 0x3a, 0x35, 0x3a, 0x3e, 0x36, 0x39, 0x3e,
+ 0x34, 0x38, 0x3c, 0x31, 0x32, 0x37, 0x2f, 0x2e, 0x32, 0x2f, 0x30, 0x31,
+ 0x35, 0x35, 0x35, 0x39, 0x3a, 0x3a, 0x30, 0x33, 0x32, 0x23, 0x26, 0x25,
+ 0x24, 0x27, 0x26, 0x28, 0x2b, 0x2a, 0x2a, 0x2d, 0x2c, 0x2e, 0x31, 0x30,
+ 0x2d, 0x33, 0x32, 0x2e, 0x36, 0x34, 0x2c, 0x34, 0x34, 0x2a, 0x32, 0x34,
+ 0x2c, 0x34, 0x35, 0x2e, 0x33, 0x36, 0x2e, 0x33, 0x36, 0x2d, 0x32, 0x36,
+ 0x30, 0x30, 0x37, 0x2f, 0x2f, 0x37, 0x31, 0x31, 0x39, 0x30, 0x2f, 0x35,
+ 0x2f, 0x30, 0x35, 0x30, 0x32, 0x34, 0x2f, 0x33, 0x32, 0x2d, 0x32, 0x30,
+ 0x2c, 0x31, 0x34, 0x2c, 0x31, 0x34, 0x2b, 0x2f, 0x32, 0x2f, 0x30, 0x34,
+ 0x31, 0x32, 0x36, 0x32, 0x32, 0x38, 0x31, 0x32, 0x3a, 0x2e, 0x2f, 0x37,
+ 0x2d, 0x31, 0x32, 0x2c, 0x31, 0x32, 0x2d, 0x31, 0x32, 0x2e, 0x32, 0x33,
+ 0x2b, 0x2f, 0x30, 0x2b, 0x2f, 0x30, 0x2d, 0x31, 0x32, 0x2f, 0x33, 0x34,
+ 0x2c, 0x2e, 0x33, 0x2c, 0x31, 0x35, 0x29, 0x31, 0x34, 0x2a, 0x32, 0x35,
+ 0x24, 0x29, 0x2d, 0x1a, 0x1d, 0x21, 0x18, 0x1d, 0x21, 0x3b, 0x42, 0x45,
+ 0x44, 0x4e, 0x4c, 0x47, 0x50, 0x50, 0x48, 0x4d, 0x52, 0x21, 0x26, 0x2f,
+ 0x0f, 0x18, 0x1f, 0x17, 0x21, 0x26, 0x12, 0x1c, 0x1f, 0x10, 0x1a, 0x1c,
+ 0x18, 0x43, 0x70, 0x1b, 0x41, 0x70, 0x23, 0x44, 0x73, 0x29, 0x4b, 0x78,
+ 0x28, 0x4b, 0x75, 0x27, 0x49, 0x72, 0x24, 0x42, 0x6c, 0x24, 0x40, 0x69,
+ 0x24, 0x44, 0x6a, 0x25, 0x44, 0x6e, 0x22, 0x41, 0x6e, 0x22, 0x42, 0x71,
+ 0x23, 0x44, 0x71, 0x1d, 0x40, 0x6a, 0x1d, 0x40, 0x6a, 0x1d, 0x40, 0x6b,
+ 0x23, 0x45, 0x6d, 0x20, 0x43, 0x6f, 0x20, 0x42, 0x72, 0x19, 0x3b, 0x69,
+ 0x1e, 0x3f, 0x6a, 0x1e, 0x40, 0x67, 0x20, 0x43, 0x6d, 0x1d, 0x44, 0x6f,
+ 0x1f, 0x43, 0x71, 0x1c, 0x41, 0x6e, 0x19, 0x3d, 0x6c, 0x18, 0x3d, 0x70,
+ 0x13, 0x3a, 0x6f, 0x1a, 0x3d, 0x71, 0x1b, 0x3a, 0x68, 0x20, 0x39, 0x66,
+ 0x20, 0x37, 0x6f, 0x1a, 0x3a, 0x64, 0x17, 0x3e, 0x62, 0x13, 0x3c, 0x67,
+ 0x13, 0x3b, 0x66, 0x16, 0x3d, 0x62, 0x19, 0x40, 0x65, 0x15, 0x3b, 0x68,
+ 0x16, 0x39, 0x68, 0x18, 0x39, 0x67, 0x1a, 0x38, 0x62, 0x17, 0x2e, 0x52,
+ 0x27, 0x37, 0x56, 0x2f, 0x3d, 0x5c, 0x1a, 0x2a, 0x4e, 0x1b, 0x2e, 0x5a,
+ 0x1c, 0x3a, 0x6b, 0x18, 0x39, 0x60, 0x2f, 0x52, 0x6d, 0x6c, 0x8d, 0xa7,
+ 0x53, 0x70, 0x90, 0x1b, 0x37, 0x63, 0x15, 0x34, 0x68, 0x19, 0x3b, 0x70,
+ 0x16, 0x3a, 0x67, 0x13, 0x35, 0x5f, 0x1b, 0x35, 0x62, 0x1b, 0x32, 0x60,
+ 0x20, 0x36, 0x65, 0x1c, 0x35, 0x61, 0x1c, 0x3b, 0x65, 0x18, 0x39, 0x63,
+ 0x11, 0x33, 0x58, 0x36, 0x5b, 0x80, 0x57, 0x7c, 0xa1, 0x2d, 0x4d, 0x6d,
+ 0x0e, 0x23, 0x3d, 0x15, 0x22, 0x37, 0x14, 0x1d, 0x33, 0x31, 0x39, 0x50,
+ 0x30, 0x3b, 0x4f, 0x0c, 0x1c, 0x31, 0x31, 0x47, 0x5b, 0x8b, 0xa2, 0xb4,
+ 0x7e, 0x93, 0xa6, 0x8d, 0xa0, 0xb3, 0x6c, 0x81, 0x98, 0x2c, 0x46, 0x60,
+ 0x28, 0x4b, 0x69, 0x31, 0x4d, 0x65, 0x5e, 0x71, 0x85, 0x5b, 0x6b, 0x80,
+ 0x0d, 0x25, 0x3d, 0x53, 0x6f, 0x8a, 0x46, 0x60, 0x7a, 0x7b, 0x90, 0xa9,
+ 0x69, 0x78, 0x94, 0x32, 0x3d, 0x53, 0x45, 0x4f, 0x5d, 0x4a, 0x53, 0x5f,
+ 0x3d, 0x49, 0x5a, 0x38, 0x4a, 0x62, 0x25, 0x41, 0x5d, 0x1e, 0x3f, 0x5f,
+ 0x21, 0x42, 0x67, 0x1f, 0x3e, 0x5e, 0x39, 0x54, 0x6d, 0x91, 0xa4, 0xb3,
+ 0xe2, 0xeb, 0xf3, 0xeb, 0xec, 0xee, 0xce, 0xc9, 0xc8, 0xaf, 0xa7, 0xa7,
+ 0x62, 0x66, 0x6f, 0x26, 0x39, 0x4c, 0x20, 0x2f, 0x49, 0x4e, 0x51, 0x63,
+ 0x8c, 0x91, 0x9b, 0x64, 0x7e, 0x86, 0x3f, 0x59, 0x66, 0x8d, 0x9a, 0xaa,
+ 0x8e, 0x9c, 0xa3, 0xa3, 0xb4, 0xbc, 0x6e, 0x7f, 0x8d, 0x2c, 0x3c, 0x4e,
+ 0x3d, 0x4d, 0x5d, 0x5d, 0x69, 0x79, 0x99, 0xa2, 0xb0, 0x70, 0x78, 0x85,
+ 0x2f, 0x32, 0x4b, 0x26, 0x2b, 0x4c, 0x21, 0x29, 0x4d, 0x1b, 0x28, 0x44,
+ 0x18, 0x29, 0x38, 0x43, 0x53, 0x5a, 0x77, 0x83, 0x8d, 0x7e, 0x86, 0x94,
+ 0xa6, 0xb0, 0xb3, 0x86, 0x8c, 0x93, 0x32, 0x37, 0x39, 0x20, 0x26, 0x22,
+ 0x2d, 0x35, 0x36, 0x3d, 0x43, 0x4e, 0x1c, 0x21, 0x25, 0x2d, 0x33, 0x28,
+ 0x5d, 0x5e, 0x4e, 0x5e, 0x5b, 0x4c, 0x65, 0x63, 0x53, 0xae, 0xac, 0xa0,
+ 0xc9, 0xc6, 0xc1, 0x98, 0x96, 0x9b, 0x5c, 0x5c, 0x6a, 0x21, 0x20, 0x33,
+ 0x21, 0x20, 0x2a, 0x25, 0x25, 0x2d, 0x15, 0x19, 0x20, 0x14, 0x1b, 0x21,
+ 0x16, 0x21, 0x29, 0x1c, 0x29, 0x35, 0x2e, 0x3c, 0x4c, 0x47, 0x56, 0x67,
+ 0x5f, 0x70, 0x80, 0x63, 0x74, 0x88, 0x5f, 0x6e, 0x8a, 0x56, 0x64, 0x82,
+ 0x54, 0x63, 0x7d, 0x54, 0x64, 0x77, 0x48, 0x59, 0x66, 0x4a, 0x58, 0x65,
+ 0x52, 0x5a, 0x6c, 0x45, 0x4f, 0x60, 0x31, 0x3b, 0x4d, 0x2d, 0x37, 0x45,
+ 0x1f, 0x26, 0x30, 0x12, 0x16, 0x1f, 0x0f, 0x15, 0x1c, 0x0c, 0x15, 0x1d,
+ 0x0e, 0x18, 0x21, 0x16, 0x1d, 0x25, 0x2f, 0x32, 0x36, 0x25, 0x25, 0x2c,
+ 0x16, 0x19, 0x25, 0x10, 0x16, 0x26, 0x13, 0x18, 0x2b, 0x11, 0x16, 0x29,
+ 0x0f, 0x15, 0x2a, 0x0e, 0x18, 0x24, 0x52, 0x5f, 0x6d, 0x4a, 0x56, 0x6b,
+ 0x12, 0x1c, 0x2f, 0x25, 0x2a, 0x32, 0x36, 0x33, 0x39, 0x2f, 0x28, 0x34,
+ 0x24, 0x1d, 0x27, 0x21, 0x1a, 0x21, 0x26, 0x21, 0x23, 0x24, 0x22, 0x20,
+ 0x19, 0x17, 0x16, 0x22, 0x22, 0x21, 0x21, 0x20, 0x23, 0x27, 0x27, 0x2a,
+ 0x25, 0x25, 0x29, 0x1f, 0x20, 0x22, 0x1e, 0x1f, 0x22, 0x38, 0x38, 0x40,
+ 0x3a, 0x3c, 0x49, 0x2c, 0x30, 0x40, 0x31, 0x36, 0x46, 0x2a, 0x30, 0x3e,
+ 0x2f, 0x32, 0x3a, 0x1e, 0x1e, 0x25, 0x12, 0x12, 0x16, 0x0d, 0x0d, 0x0f,
+ 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x0a, 0x0a, 0x08, 0x0a, 0x0a, 0x08, 0x0c, 0x0c, 0x0b, 0x10, 0x10, 0x10,
+ 0x13, 0x14, 0x15, 0x11, 0x12, 0x14, 0x15, 0x16, 0x1a, 0x13, 0x14, 0x18,
+ 0x13, 0x16, 0x1b, 0x19, 0x1c, 0x23, 0x1d, 0x1d, 0x26, 0x1e, 0x1f, 0x26,
+ 0x1b, 0x20, 0x26, 0x2b, 0x34, 0x39, 0x45, 0x53, 0x5a, 0x50, 0x60, 0x6b,
+ 0x51, 0x5e, 0x6e, 0x41, 0x47, 0x51, 0x34, 0x35, 0x3b, 0x32, 0x33, 0x37,
+ 0x2f, 0x33, 0x39, 0x2a, 0x31, 0x39, 0x23, 0x28, 0x2f, 0x20, 0x21, 0x24,
+ 0x27, 0x29, 0x27, 0x27, 0x28, 0x28, 0x27, 0x29, 0x2d, 0x29, 0x2c, 0x30,
+ 0x37, 0x3c, 0x3f, 0x4a, 0x51, 0x56, 0x47, 0x51, 0x5a, 0x34, 0x3e, 0x48,
+ 0x2a, 0x2d, 0x36, 0x26, 0x2a, 0x33, 0x2a, 0x2e, 0x37, 0x2c, 0x2e, 0x35,
+ 0x2a, 0x28, 0x2f, 0x26, 0x24, 0x2a, 0x24, 0x24, 0x29, 0x29, 0x2d, 0x2e,
+ 0x2b, 0x31, 0x34, 0x2e, 0x33, 0x35, 0x32, 0x37, 0x39, 0x31, 0x36, 0x38,
+ 0x2c, 0x30, 0x32, 0x28, 0x2d, 0x2f, 0x2a, 0x2f, 0x31, 0x2e, 0x33, 0x36,
+ 0x32, 0x34, 0x39, 0x33, 0x37, 0x3d, 0x32, 0x39, 0x3d, 0x31, 0x38, 0x3b,
+ 0x31, 0x37, 0x36, 0x34, 0x39, 0x36, 0x35, 0x38, 0x38, 0x30, 0x35, 0x38,
+ 0x2f, 0x38, 0x33, 0x33, 0x3b, 0x3b, 0x30, 0x39, 0x3a, 0x2b, 0x33, 0x35,
+ 0x2f, 0x34, 0x34, 0x30, 0x33, 0x35, 0x2a, 0x30, 0x32, 0x2a, 0x33, 0x34,
+ 0x2f, 0x32, 0x3b, 0x2f, 0x33, 0x3c, 0x2b, 0x31, 0x36, 0x2f, 0x33, 0x36,
+ 0x34, 0x36, 0x36, 0x34, 0x35, 0x37, 0x30, 0x33, 0x39, 0x2e, 0x32, 0x3c,
+ 0x2b, 0x30, 0x35, 0x2e, 0x32, 0x36, 0x2e, 0x33, 0x38, 0x2c, 0x2f, 0x36,
+ 0x2f, 0x32, 0x39, 0x2e, 0x32, 0x38, 0x2e, 0x33, 0x39, 0x2c, 0x31, 0x36,
+ 0x2a, 0x2f, 0x35, 0x2d, 0x31, 0x37, 0x2c, 0x30, 0x34, 0x2d, 0x2f, 0x34,
+ 0x2f, 0x31, 0x37, 0x2f, 0x32, 0x39, 0x30, 0x32, 0x3b, 0x2d, 0x31, 0x3b,
+ 0x2b, 0x33, 0x31, 0x29, 0x31, 0x30, 0x2e, 0x34, 0x34, 0x2f, 0x34, 0x37,
+ 0x2c, 0x31, 0x34, 0x29, 0x2f, 0x31, 0x2a, 0x33, 0x32, 0x2c, 0x34, 0x32,
+ 0x2d, 0x31, 0x37, 0x2c, 0x30, 0x36, 0x2c, 0x2f, 0x34, 0x2d, 0x31, 0x34,
+ 0x25, 0x29, 0x2c, 0x17, 0x1b, 0x1d, 0x1a, 0x20, 0x1e, 0x49, 0x4f, 0x4e,
+ 0x2c, 0x34, 0x3d, 0x18, 0x21, 0x2a, 0x3d, 0x46, 0x4f, 0x36, 0x3d, 0x47,
+ 0x2b, 0x32, 0x3b, 0x1f, 0x24, 0x2e, 0x18, 0x1b, 0x26, 0x15, 0x15, 0x22,
+ 0x1b, 0x46, 0x76, 0x1e, 0x46, 0x75, 0x21, 0x45, 0x74, 0x29, 0x4e, 0x7b,
+ 0x26, 0x4b, 0x78, 0x23, 0x48, 0x74, 0x23, 0x44, 0x71, 0x1f, 0x3e, 0x6a,
+ 0x1c, 0x3d, 0x66, 0x1d, 0x3e, 0x69, 0x1f, 0x40, 0x6d, 0x20, 0x42, 0x6f,
+ 0x2f, 0x52, 0x7a, 0x23, 0x49, 0x70, 0x1c, 0x41, 0x6b, 0x20, 0x44, 0x70,
+ 0x1f, 0x42, 0x67, 0x1c, 0x3f, 0x68, 0x1e, 0x40, 0x6e, 0x21, 0x43, 0x71,
+ 0x23, 0x45, 0x71, 0x21, 0x44, 0x6e, 0x1d, 0x42, 0x70, 0x1e, 0x44, 0x75,
+ 0x22, 0x44, 0x76, 0x1c, 0x3e, 0x6e, 0x1c, 0x3e, 0x6c, 0x21, 0x42, 0x6e,
+ 0x1e, 0x3f, 0x67, 0x1b, 0x3d, 0x64, 0x19, 0x42, 0x69, 0x17, 0x44, 0x6e,
+ 0x19, 0x3d, 0x6d, 0x1a, 0x3f, 0x69, 0x20, 0x44, 0x72, 0x19, 0x3c, 0x72,
+ 0x16, 0x3a, 0x6d, 0x1a, 0x3d, 0x67, 0x1c, 0x3d, 0x69, 0x19, 0x36, 0x6e,
+ 0x1a, 0x3b, 0x6c, 0x1c, 0x3e, 0x6a, 0x1e, 0x3c, 0x64, 0x16, 0x2e, 0x52,
+ 0x29, 0x3a, 0x5a, 0x35, 0x44, 0x65, 0x1a, 0x2a, 0x4e, 0x17, 0x29, 0x4f,
+ 0x1b, 0x35, 0x5b, 0x3f, 0x5e, 0x7f, 0x6a, 0x8b, 0xa9, 0x46, 0x66, 0x89,
+ 0x19, 0x36, 0x62, 0x19, 0x34, 0x67, 0x17, 0x37, 0x6b, 0x19, 0x3a, 0x6c,
+ 0x16, 0x37, 0x63, 0x16, 0x33, 0x60, 0x1a, 0x31, 0x5d, 0x24, 0x36, 0x5f,
+ 0x2b, 0x3e, 0x66, 0x1c, 0x33, 0x5d, 0x20, 0x3b, 0x66, 0x1c, 0x3b, 0x62,
+ 0x19, 0x36, 0x60, 0x13, 0x34, 0x61, 0x14, 0x37, 0x64, 0x13, 0x33, 0x58,
+ 0x0d, 0x24, 0x41, 0x15, 0x25, 0x3c, 0x3e, 0x4b, 0x5e, 0x86, 0x94, 0xa8,
+ 0x50, 0x5b, 0x6d, 0x10, 0x21, 0x33, 0x32, 0x48, 0x5d, 0x93, 0xab, 0xc3,
+ 0x64, 0x78, 0x91, 0x3b, 0x4e, 0x6a, 0x3c, 0x51, 0x6e, 0x2d, 0x45, 0x63,
+ 0x59, 0x75, 0x8c, 0x82, 0x99, 0xad, 0x90, 0x9f, 0xb8, 0x33, 0x45, 0x64,
+ 0x0e, 0x26, 0x4a, 0x2e, 0x4c, 0x6e, 0x53, 0x6f, 0x87, 0x84, 0x9b, 0xac,
+ 0x63, 0x74, 0x85, 0x63, 0x6e, 0x74, 0x79, 0x7c, 0x74, 0x7f, 0x7f, 0x6f,
+ 0x67, 0x68, 0x5d, 0x4f, 0x58, 0x5b, 0x35, 0x4a, 0x5d, 0x21, 0x3f, 0x5b,
+ 0x28, 0x45, 0x6c, 0x2c, 0x49, 0x70, 0x28, 0x44, 0x63, 0x3b, 0x52, 0x67,
+ 0x86, 0x96, 0xa0, 0xc6, 0xcf, 0xd1, 0xe5, 0xeb, 0xe9, 0xb5, 0xb9, 0xba,
+ 0x44, 0x4c, 0x61, 0x1b, 0x2d, 0x42, 0x3c, 0x4f, 0x5c, 0x86, 0x8f, 0x99,
+ 0x95, 0xa0, 0xa9, 0x47, 0x61, 0x6c, 0x37, 0x52, 0x65, 0x8d, 0x9c, 0xb4,
+ 0x91, 0x9f, 0xb9, 0x71, 0x80, 0x9a, 0x72, 0x80, 0x9b, 0x44, 0x52, 0x6c,
+ 0x21, 0x2e, 0x45, 0x3c, 0x49, 0x5b, 0x6c, 0x78, 0x86, 0x7b, 0x88, 0x92,
+ 0x41, 0x4e, 0x5f, 0x22, 0x2b, 0x45, 0x29, 0x2e, 0x4c, 0x2a, 0x2e, 0x45,
+ 0x33, 0x39, 0x44, 0x71, 0x79, 0x7f, 0x8c, 0x96, 0x9f, 0x79, 0x85, 0x93,
+ 0x73, 0x78, 0x89, 0x44, 0x47, 0x58, 0x17, 0x1c, 0x26, 0x15, 0x19, 0x1c,
+ 0x38, 0x3d, 0x40, 0x26, 0x2c, 0x31, 0x2a, 0x2b, 0x31, 0x51, 0x4f, 0x4f,
+ 0x62, 0x62, 0x5a, 0x62, 0x5f, 0x56, 0x5e, 0x5b, 0x4f, 0x64, 0x62, 0x59,
+ 0x7d, 0x7d, 0x77, 0x76, 0x75, 0x77, 0x3a, 0x3b, 0x43, 0x19, 0x1b, 0x27,
+ 0x1d, 0x1e, 0x26, 0x1e, 0x21, 0x28, 0x1a, 0x1d, 0x23, 0x1d, 0x21, 0x29,
+ 0x17, 0x1f, 0x2a, 0x10, 0x1b, 0x29, 0x0c, 0x19, 0x2b, 0x0e, 0x1d, 0x33,
+ 0x1a, 0x2e, 0x49, 0x28, 0x3d, 0x58, 0x2e, 0x42, 0x5d, 0x36, 0x48, 0x60,
+ 0x3b, 0x4c, 0x61, 0x3d, 0x4d, 0x5d, 0x43, 0x50, 0x61, 0x2e, 0x38, 0x4b,
+ 0x30, 0x38, 0x4b, 0x27, 0x31, 0x46, 0x1c, 0x28, 0x3f, 0x16, 0x23, 0x37,
+ 0x11, 0x1d, 0x2d, 0x0f, 0x19, 0x26, 0x0e, 0x18, 0x24, 0x27, 0x32, 0x3f,
+ 0x1e, 0x25, 0x38, 0x13, 0x16, 0x24, 0x34, 0x35, 0x38, 0x45, 0x47, 0x45,
+ 0x26, 0x2a, 0x2b, 0x12, 0x19, 0x21, 0x14, 0x19, 0x2b, 0x11, 0x16, 0x2c,
+ 0x11, 0x19, 0x2c, 0x13, 0x1e, 0x2e, 0x23, 0x30, 0x40, 0x5e, 0x6d, 0x80,
+ 0x3c, 0x4a, 0x5b, 0x1b, 0x23, 0x2f, 0x30, 0x31, 0x3b, 0x2b, 0x27, 0x32,
+ 0x20, 0x1e, 0x20, 0x22, 0x1e, 0x1f, 0x29, 0x24, 0x27, 0x23, 0x1f, 0x23,
+ 0x1f, 0x1c, 0x21, 0x26, 0x24, 0x28, 0x20, 0x1f, 0x24, 0x22, 0x22, 0x25,
+ 0x22, 0x21, 0x28, 0x21, 0x20, 0x25, 0x21, 0x20, 0x25, 0x39, 0x39, 0x41,
+ 0x3b, 0x3b, 0x46, 0x30, 0x31, 0x3e, 0x31, 0x35, 0x41, 0x29, 0x30, 0x38,
+ 0x2f, 0x31, 0x3b, 0x17, 0x17, 0x1f, 0x0b, 0x0c, 0x10, 0x0f, 0x0f, 0x11,
+ 0x0b, 0x0b, 0x0b, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0e, 0x0f, 0x0f, 0x10, 0x11, 0x13,
+ 0x0f, 0x10, 0x12, 0x12, 0x13, 0x15, 0x10, 0x11, 0x13, 0x12, 0x13, 0x15,
+ 0x15, 0x19, 0x1c, 0x18, 0x1b, 0x20, 0x1c, 0x1c, 0x25, 0x20, 0x21, 0x29,
+ 0x1d, 0x22, 0x28, 0x25, 0x2e, 0x33, 0x43, 0x50, 0x57, 0x4e, 0x5f, 0x6a,
+ 0x54, 0x62, 0x72, 0x49, 0x51, 0x5c, 0x34, 0x36, 0x3d, 0x32, 0x33, 0x38,
+ 0x34, 0x38, 0x3f, 0x28, 0x2f, 0x35, 0x1e, 0x24, 0x28, 0x29, 0x29, 0x2c,
+ 0x33, 0x37, 0x36, 0x31, 0x34, 0x36, 0x2c, 0x2f, 0x33, 0x28, 0x2b, 0x30,
+ 0x2b, 0x30, 0x33, 0x47, 0x4e, 0x53, 0x50, 0x58, 0x62, 0x3a, 0x43, 0x4f,
+ 0x2d, 0x33, 0x3a, 0x27, 0x2e, 0x34, 0x25, 0x2b, 0x31, 0x29, 0x2c, 0x33,
+ 0x2c, 0x2e, 0x33, 0x2c, 0x2c, 0x31, 0x2c, 0x30, 0x33, 0x38, 0x3e, 0x40,
+ 0x3d, 0x43, 0x46, 0x31, 0x37, 0x3a, 0x2b, 0x30, 0x33, 0x26, 0x2a, 0x2d,
+ 0x23, 0x27, 0x2a, 0x22, 0x26, 0x29, 0x22, 0x26, 0x29, 0x29, 0x2e, 0x31,
+ 0x35, 0x38, 0x3d, 0x42, 0x47, 0x4d, 0x3c, 0x43, 0x4b, 0x31, 0x38, 0x3e,
+ 0x31, 0x36, 0x38, 0x34, 0x39, 0x39, 0x35, 0x3a, 0x3a, 0x32, 0x37, 0x3a,
+ 0x30, 0x36, 0x34, 0x31, 0x37, 0x38, 0x2f, 0x37, 0x3a, 0x30, 0x35, 0x39,
+ 0x33, 0x34, 0x38, 0x2f, 0x30, 0x33, 0x2c, 0x30, 0x33, 0x2d, 0x34, 0x38,
+ 0x30, 0x33, 0x3a, 0x31, 0x35, 0x3b, 0x2d, 0x32, 0x37, 0x32, 0x37, 0x3a,
+ 0x35, 0x38, 0x3b, 0x33, 0x34, 0x38, 0x2d, 0x30, 0x37, 0x2c, 0x30, 0x39,
+ 0x2d, 0x32, 0x36, 0x31, 0x36, 0x39, 0x2e, 0x33, 0x37, 0x2e, 0x31, 0x36,
+ 0x2e, 0x31, 0x38, 0x2e, 0x33, 0x39, 0x2d, 0x32, 0x38, 0x2d, 0x32, 0x38,
+ 0x2c, 0x31, 0x37, 0x2d, 0x31, 0x37, 0x2d, 0x31, 0x36, 0x2d, 0x30, 0x36,
+ 0x2f, 0x32, 0x38, 0x2d, 0x30, 0x37, 0x2e, 0x31, 0x3a, 0x2b, 0x30, 0x39,
+ 0x2a, 0x33, 0x33, 0x2c, 0x34, 0x36, 0x2e, 0x33, 0x36, 0x2f, 0x32, 0x37,
+ 0x2e, 0x32, 0x37, 0x2e, 0x33, 0x37, 0x2e, 0x36, 0x39, 0x29, 0x31, 0x34,
+ 0x2d, 0x32, 0x38, 0x2d, 0x30, 0x37, 0x2d, 0x30, 0x35, 0x2b, 0x2e, 0x33,
+ 0x23, 0x27, 0x2a, 0x1b, 0x1f, 0x20, 0x24, 0x29, 0x29, 0x49, 0x4f, 0x4e,
+ 0x31, 0x38, 0x40, 0x1c, 0x23, 0x2a, 0x16, 0x1d, 0x23, 0x2a, 0x31, 0x37,
+ 0x46, 0x4d, 0x53, 0x43, 0x48, 0x4f, 0x22, 0x25, 0x2d, 0x16, 0x15, 0x20,
+ 0x19, 0x46, 0x75, 0x1f, 0x47, 0x78, 0x20, 0x46, 0x77, 0x1e, 0x44, 0x73,
+ 0x1d, 0x46, 0x74, 0x1d, 0x46, 0x74, 0x1e, 0x44, 0x73, 0x1d, 0x41, 0x70,
+ 0x1e, 0x40, 0x6b, 0x1f, 0x41, 0x6e, 0x20, 0x43, 0x6d, 0x1f, 0x44, 0x6b,
+ 0x2d, 0x53, 0x78, 0x25, 0x4b, 0x71, 0x1f, 0x44, 0x70, 0x24, 0x4a, 0x78,
+ 0x21, 0x45, 0x6a, 0x1c, 0x3f, 0x67, 0x1e, 0x40, 0x6e, 0x20, 0x42, 0x72,
+ 0x21, 0x43, 0x72, 0x20, 0x44, 0x73, 0x1c, 0x42, 0x74, 0x1c, 0x41, 0x76,
+ 0x1e, 0x42, 0x74, 0x1e, 0x40, 0x70, 0x20, 0x40, 0x6f, 0x22, 0x42, 0x6f,
+ 0x23, 0x41, 0x6f, 0x1d, 0x3d, 0x6d, 0x20, 0x41, 0x75, 0x21, 0x47, 0x7b,
+ 0x1a, 0x45, 0x6c, 0x20, 0x45, 0x6e, 0x21, 0x3c, 0x6f, 0x1f, 0x3c, 0x74,
+ 0x1e, 0x40, 0x74, 0x1b, 0x42, 0x6c, 0x18, 0x3b, 0x69, 0x1b, 0x39, 0x70,
+ 0x1b, 0x3f, 0x72, 0x1d, 0x41, 0x6c, 0x1c, 0x3c, 0x61, 0x1a, 0x32, 0x56,
+ 0x19, 0x2a, 0x50, 0x23, 0x31, 0x56, 0x18, 0x28, 0x4a, 0x1f, 0x34, 0x51,
+ 0x4a, 0x5f, 0x7d, 0x78, 0x92, 0xb1, 0x4b, 0x6a, 0x8e, 0x17, 0x38, 0x64,
+ 0x12, 0x32, 0x67, 0x16, 0x35, 0x6c, 0x17, 0x37, 0x6a, 0x19, 0x3b, 0x69,
+ 0x19, 0x38, 0x60, 0x15, 0x2d, 0x5d, 0x1c, 0x31, 0x5c, 0x22, 0x34, 0x52,
+ 0x3a, 0x4b, 0x68, 0x1b, 0x2e, 0x57, 0x1a, 0x31, 0x5d, 0x46, 0x62, 0x85,
+ 0x59, 0x71, 0x90, 0x24, 0x3f, 0x65, 0x13, 0x32, 0x5c, 0x14, 0x32, 0x5a,
+ 0x11, 0x27, 0x4a, 0x1c, 0x2d, 0x48, 0x77, 0x89, 0xa1, 0x85, 0x99, 0xb0,
+ 0x79, 0x88, 0x98, 0x3c, 0x4f, 0x62, 0x27, 0x3d, 0x56, 0x53, 0x6a, 0x88,
+ 0x25, 0x39, 0x5a, 0x10, 0x24, 0x47, 0x10, 0x24, 0x45, 0x64, 0x7b, 0x9a,
+ 0x7b, 0x8d, 0xa2, 0x3f, 0x50, 0x63, 0x9a, 0xaa, 0xc3, 0x3e, 0x55, 0x72,
+ 0x14, 0x31, 0x54, 0x4d, 0x6a, 0x8a, 0x7a, 0x93, 0xab, 0x5a, 0x6e, 0x7e,
+ 0x4a, 0x53, 0x59, 0x83, 0x87, 0x82, 0x9d, 0x9c, 0x89, 0x9e, 0x9a, 0x7d,
+ 0x94, 0x92, 0x79, 0x6f, 0x70, 0x65, 0x4d, 0x56, 0x5d, 0x43, 0x51, 0x65,
+ 0x2f, 0x44, 0x62, 0x35, 0x4c, 0x6a, 0x3e, 0x58, 0x75, 0x41, 0x59, 0x71,
+ 0x3e, 0x53, 0x63, 0x65, 0x76, 0x80, 0xa1, 0xb4, 0xba, 0x71, 0x82, 0x8b,
+ 0x2c, 0x3c, 0x56, 0x48, 0x59, 0x68, 0x8c, 0x9d, 0xa1, 0x96, 0xa7, 0xb0,
+ 0x8b, 0x9e, 0xad, 0x7c, 0x93, 0xa5, 0x3a, 0x50, 0x65, 0x79, 0x8d, 0xa4,
+ 0x6a, 0x79, 0x99, 0x2e, 0x3d, 0x5b, 0x30, 0x3e, 0x5b, 0x35, 0x42, 0x5b,
+ 0x27, 0x32, 0x48, 0x24, 0x31, 0x42, 0x42, 0x52, 0x60, 0x6c, 0x7d, 0x8a,
+ 0x72, 0x88, 0x9c, 0x42, 0x53, 0x68, 0x2a, 0x2f, 0x3f, 0x56, 0x53, 0x5c,
+ 0xa8, 0xa4, 0xa4, 0xe1, 0xe1, 0xe2, 0xbb, 0xc1, 0xcd, 0x80, 0x8a, 0x9f,
+ 0x5e, 0x63, 0x78, 0x2f, 0x32, 0x45, 0x13, 0x16, 0x26, 0x11, 0x15, 0x20,
+ 0x1c, 0x22, 0x24, 0x3e, 0x43, 0x3b, 0x5d, 0x5a, 0x55, 0x64, 0x5b, 0x5e,
+ 0x66, 0x64, 0x63, 0x66, 0x65, 0x61, 0x5e, 0x5c, 0x57, 0x5d, 0x5c, 0x57,
+ 0x4e, 0x4f, 0x49, 0x34, 0x34, 0x32, 0x1e, 0x20, 0x22, 0x1c, 0x1f, 0x24,
+ 0x1f, 0x24, 0x28, 0x2a, 0x2d, 0x32, 0x42, 0x42, 0x49, 0x2f, 0x30, 0x39,
+ 0x26, 0x2a, 0x37, 0x22, 0x28, 0x3a, 0x15, 0x21, 0x35, 0x12, 0x23, 0x39,
+ 0x0d, 0x25, 0x48, 0x13, 0x2a, 0x4b, 0x11, 0x27, 0x41, 0x11, 0x24, 0x37,
+ 0x15, 0x25, 0x34, 0x10, 0x1e, 0x2d, 0x2d, 0x36, 0x4b, 0x20, 0x26, 0x3f,
+ 0x18, 0x1f, 0x32, 0x1a, 0x24, 0x3c, 0x15, 0x25, 0x40, 0x17, 0x28, 0x44,
+ 0x13, 0x22, 0x3b, 0x10, 0x1d, 0x30, 0x15, 0x22, 0x31, 0x4a, 0x56, 0x64,
+ 0x26, 0x29, 0x3d, 0x0e, 0x10, 0x1e, 0x13, 0x14, 0x18, 0x39, 0x3b, 0x38,
+ 0x33, 0x38, 0x37, 0x11, 0x18, 0x1e, 0x14, 0x1a, 0x26, 0x12, 0x19, 0x26,
+ 0x10, 0x19, 0x27, 0x16, 0x21, 0x35, 0x0d, 0x1b, 0x30, 0x2b, 0x3c, 0x4c,
+ 0x6e, 0x7f, 0x8e, 0x47, 0x52, 0x64, 0x14, 0x1c, 0x2c, 0x19, 0x1d, 0x27,
+ 0x1c, 0x1f, 0x1a, 0x21, 0x20, 0x1e, 0x2c, 0x28, 0x2c, 0x24, 0x1f, 0x26,
+ 0x21, 0x1b, 0x25, 0x24, 0x20, 0x28, 0x21, 0x20, 0x25, 0x21, 0x22, 0x25,
+ 0x23, 0x22, 0x2a, 0x1e, 0x1d, 0x23, 0x1d, 0x1c, 0x21, 0x21, 0x20, 0x26,
+ 0x25, 0x24, 0x2c, 0x1c, 0x1d, 0x24, 0x26, 0x28, 0x2e, 0x35, 0x3a, 0x3d,
+ 0x35, 0x37, 0x40, 0x17, 0x17, 0x1f, 0x0e, 0x0f, 0x13, 0x0f, 0x0f, 0x11,
+ 0x0e, 0x0e, 0x0e, 0x0d, 0x0d, 0x0d, 0x0c, 0x0c, 0x0c, 0x0b, 0x0b, 0x0b,
+ 0x0a, 0x0b, 0x0d, 0x0c, 0x0d, 0x0f, 0x0e, 0x0f, 0x11, 0x0f, 0x10, 0x12,
+ 0x12, 0x13, 0x15, 0x15, 0x16, 0x18, 0x11, 0x12, 0x14, 0x11, 0x12, 0x14,
+ 0x17, 0x1b, 0x1b, 0x1a, 0x1d, 0x20, 0x1c, 0x1c, 0x24, 0x1f, 0x21, 0x28,
+ 0x22, 0x27, 0x2d, 0x22, 0x2b, 0x30, 0x34, 0x41, 0x48, 0x4c, 0x5b, 0x66,
+ 0x58, 0x68, 0x78, 0x49, 0x55, 0x63, 0x29, 0x2f, 0x38, 0x2f, 0x33, 0x39,
+ 0x40, 0x45, 0x4b, 0x33, 0x38, 0x3c, 0x25, 0x29, 0x2c, 0x3a, 0x3b, 0x3d,
+ 0x43, 0x49, 0x4a, 0x3a, 0x3f, 0x42, 0x30, 0x35, 0x39, 0x21, 0x26, 0x2a,
+ 0x27, 0x2c, 0x30, 0x47, 0x4f, 0x52, 0x47, 0x4e, 0x56, 0x39, 0x41, 0x4b,
+ 0x31, 0x36, 0x3a, 0x2b, 0x32, 0x36, 0x29, 0x31, 0x34, 0x2c, 0x31, 0x35,
+ 0x2e, 0x31, 0x36, 0x2d, 0x30, 0x35, 0x2f, 0x35, 0x38, 0x36, 0x3f, 0x40,
+ 0x3d, 0x43, 0x44, 0x31, 0x36, 0x39, 0x25, 0x2a, 0x2d, 0x1f, 0x23, 0x27,
+ 0x22, 0x25, 0x2a, 0x27, 0x2b, 0x2f, 0x25, 0x29, 0x2d, 0x27, 0x2b, 0x2e,
+ 0x35, 0x3b, 0x3e, 0x4a, 0x54, 0x58, 0x50, 0x5a, 0x63, 0x3a, 0x43, 0x4c,
+ 0x31, 0x36, 0x3e, 0x34, 0x37, 0x3c, 0x36, 0x3a, 0x3d, 0x33, 0x38, 0x3b,
+ 0x32, 0x37, 0x37, 0x33, 0x36, 0x39, 0x33, 0x38, 0x3e, 0x31, 0x34, 0x3b,
+ 0x32, 0x33, 0x38, 0x33, 0x33, 0x37, 0x32, 0x33, 0x38, 0x2f, 0x33, 0x38,
+ 0x33, 0x34, 0x38, 0x2e, 0x30, 0x35, 0x28, 0x2d, 0x32, 0x30, 0x37, 0x3d,
+ 0x34, 0x3b, 0x41, 0x32, 0x37, 0x3d, 0x2f, 0x32, 0x39, 0x2f, 0x31, 0x38,
+ 0x30, 0x35, 0x38, 0x32, 0x37, 0x3a, 0x2f, 0x34, 0x37, 0x30, 0x34, 0x38,
+ 0x2f, 0x32, 0x37, 0x2f, 0x34, 0x3a, 0x30, 0x35, 0x3b, 0x2c, 0x31, 0x37,
+ 0x2d, 0x32, 0x38, 0x2d, 0x32, 0x36, 0x2b, 0x2f, 0x34, 0x2d, 0x30, 0x35,
+ 0x2d, 0x30, 0x35, 0x2d, 0x30, 0x37, 0x2f, 0x32, 0x39, 0x2d, 0x32, 0x3a,
+ 0x2f, 0x34, 0x37, 0x2d, 0x32, 0x36, 0x2c, 0x30, 0x35, 0x2e, 0x31, 0x38,
+ 0x2c, 0x2f, 0x36, 0x2e, 0x32, 0x3a, 0x2c, 0x31, 0x38, 0x2a, 0x2f, 0x35,
+ 0x2d, 0x32, 0x38, 0x2e, 0x31, 0x38, 0x2e, 0x31, 0x38, 0x2c, 0x2f, 0x34,
+ 0x21, 0x25, 0x28, 0x1c, 0x20, 0x23, 0x1c, 0x21, 0x22, 0x2d, 0x33, 0x33,
+ 0x40, 0x48, 0x4b, 0x30, 0x38, 0x3a, 0x2a, 0x32, 0x34, 0x2a, 0x32, 0x34,
+ 0x39, 0x3e, 0x41, 0x57, 0x5c, 0x5f, 0x3e, 0x42, 0x45, 0x28, 0x29, 0x2e,
+ 0x18, 0x43, 0x70, 0x1a, 0x42, 0x70, 0x1d, 0x43, 0x72, 0x1f, 0x45, 0x74,
+ 0x21, 0x49, 0x7a, 0x1d, 0x47, 0x77, 0x1c, 0x45, 0x75, 0x1e, 0x44, 0x75,
+ 0x23, 0x45, 0x73, 0x24, 0x46, 0x74, 0x20, 0x43, 0x6d, 0x21, 0x45, 0x6b,
+ 0x22, 0x48, 0x6b, 0x20, 0x46, 0x6b, 0x21, 0x45, 0x74, 0x26, 0x4a, 0x7d,
+ 0x21, 0x48, 0x72, 0x1d, 0x42, 0x6e, 0x1e, 0x40, 0x6f, 0x1f, 0x41, 0x71,
+ 0x20, 0x44, 0x76, 0x1e, 0x44, 0x75, 0x1e, 0x44, 0x76, 0x1c, 0x41, 0x75,
+ 0x1e, 0x43, 0x77, 0x20, 0x45, 0x76, 0x1f, 0x43, 0x74, 0x1d, 0x46, 0x75,
+ 0x1e, 0x47, 0x77, 0x1a, 0x45, 0x72, 0x23, 0x47, 0x70, 0x25, 0x45, 0x69,
+ 0x22, 0x49, 0x72, 0x28, 0x48, 0x6f, 0x24, 0x3b, 0x65, 0x20, 0x3a, 0x65,
+ 0x18, 0x3d, 0x69, 0x10, 0x3e, 0x65, 0x10, 0x3b, 0x63, 0x16, 0x3d, 0x68,
+ 0x17, 0x3b, 0x6d, 0x1b, 0x3f, 0x6b, 0x1d, 0x3d, 0x62, 0x17, 0x30, 0x55,
+ 0x1f, 0x30, 0x59, 0x22, 0x31, 0x58, 0x1a, 0x2d, 0x4c, 0x59, 0x6f, 0x86,
+ 0x7f, 0x95, 0xb4, 0x41, 0x5d, 0x7f, 0x15, 0x37, 0x5e, 0x14, 0x39, 0x67,
+ 0x17, 0x39, 0x6e, 0x16, 0x37, 0x6c, 0x17, 0x37, 0x68, 0x1a, 0x3b, 0x68,
+ 0x1d, 0x3c, 0x63, 0x11, 0x29, 0x5d, 0x1d, 0x31, 0x5e, 0x19, 0x2d, 0x43,
+ 0x28, 0x3a, 0x50, 0x1d, 0x30, 0x59, 0x14, 0x2b, 0x5b, 0x68, 0x84, 0xa4,
+ 0x9e, 0xb3, 0xbe, 0x6a, 0x82, 0x95, 0x35, 0x50, 0x70, 0x1a, 0x34, 0x59,
+ 0x12, 0x26, 0x4b, 0x18, 0x28, 0x4a, 0x33, 0x46, 0x67, 0x27, 0x3b, 0x5a,
+ 0x66, 0x7a, 0x8c, 0x88, 0x9d, 0xb1, 0x47, 0x5f, 0x79, 0x19, 0x30, 0x50,
+ 0x0f, 0x25, 0x4a, 0x1f, 0x36, 0x58, 0x2b, 0x43, 0x5f, 0x5d, 0x74, 0x8c,
+ 0x4d, 0x59, 0x76, 0x25, 0x32, 0x4c, 0x90, 0xa3, 0xb9, 0x3a, 0x55, 0x68,
+ 0x49, 0x68, 0x7c, 0x59, 0x74, 0x86, 0x31, 0x43, 0x55, 0x3c, 0x44, 0x53,
+ 0x46, 0x42, 0x3f, 0x4f, 0x4c, 0x47, 0x8a, 0x8a, 0x80, 0xa5, 0xa5, 0x97,
+ 0xa2, 0xa3, 0x94, 0x97, 0x95, 0x8a, 0x7c, 0x77, 0x75, 0x61, 0x5c, 0x61,
+ 0x57, 0x63, 0x6b, 0x3b, 0x4c, 0x57, 0x3f, 0x52, 0x62, 0x44, 0x59, 0x6c,
+ 0x40, 0x55, 0x68, 0x3f, 0x54, 0x66, 0x45, 0x5c, 0x6e, 0x3b, 0x54, 0x67,
+ 0x4f, 0x66, 0x73, 0x9b, 0xa8, 0xad, 0xaf, 0xba, 0xc0, 0x66, 0x79, 0x8c,
+ 0x54, 0x6c, 0x85, 0x89, 0x9c, 0xaf, 0x3e, 0x52, 0x5f, 0x45, 0x5c, 0x6a,
+ 0x3e, 0x51, 0x63, 0x34, 0x46, 0x56, 0x36, 0x43, 0x55, 0x2f, 0x39, 0x4c,
+ 0x2a, 0x35, 0x48, 0x2d, 0x3a, 0x4b, 0x41, 0x52, 0x61, 0x45, 0x58, 0x6a,
+ 0x44, 0x5e, 0x7e, 0x57, 0x6c, 0x85, 0x33, 0x3e, 0x47, 0x89, 0x8b, 0x85,
+ 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xd6, 0xd8, 0xe7, 0x7e, 0x85, 0x9e,
+ 0x54, 0x5c, 0x6e, 0x1e, 0x26, 0x34, 0x14, 0x1b, 0x2b, 0x18, 0x1f, 0x2f,
+ 0x2d, 0x37, 0x38, 0xac, 0xb3, 0xa1, 0xba, 0xb8, 0xa7, 0x84, 0x7d, 0x78,
+ 0x77, 0x75, 0x77, 0x7d, 0x7b, 0x7c, 0x65, 0x64, 0x62, 0x55, 0x56, 0x51,
+ 0x35, 0x36, 0x33, 0x18, 0x1a, 0x19, 0x1c, 0x1e, 0x1f, 0x29, 0x2d, 0x2f,
+ 0x2b, 0x34, 0x31, 0x67, 0x6c, 0x6a, 0x8c, 0x8b, 0x8d, 0x63, 0x62, 0x69,
+ 0x46, 0x45, 0x51, 0x3b, 0x40, 0x4e, 0x32, 0x3d, 0x4d, 0x23, 0x35, 0x47,
+ 0x19, 0x2f, 0x4d, 0x18, 0x2e, 0x4b, 0x17, 0x2a, 0x44, 0x19, 0x2a, 0x3e,
+ 0x18, 0x25, 0x36, 0x16, 0x21, 0x33, 0x1c, 0x24, 0x3c, 0x26, 0x2d, 0x49,
+ 0x1a, 0x23, 0x39, 0x18, 0x26, 0x3f, 0x12, 0x26, 0x45, 0x1c, 0x30, 0x50,
+ 0x19, 0x2b, 0x47, 0x12, 0x1f, 0x34, 0x36, 0x40, 0x4f, 0x40, 0x48, 0x54,
+ 0x1d, 0x21, 0x29, 0x14, 0x15, 0x1b, 0x1c, 0x1b, 0x21, 0x1c, 0x1c, 0x23,
+ 0x1c, 0x20, 0x2a, 0x12, 0x19, 0x23, 0x16, 0x1e, 0x26, 0x13, 0x1b, 0x1f,
+ 0x15, 0x1e, 0x28, 0x1a, 0x24, 0x3b, 0x14, 0x21, 0x38, 0x08, 0x1a, 0x28,
+ 0x34, 0x46, 0x54, 0x70, 0x7e, 0x95, 0x34, 0x3f, 0x55, 0x14, 0x1e, 0x2a,
+ 0x1a, 0x1e, 0x21, 0x25, 0x25, 0x29, 0x2b, 0x28, 0x2c, 0x23, 0x1d, 0x21,
+ 0x23, 0x1d, 0x21, 0x29, 0x24, 0x27, 0x25, 0x23, 0x26, 0x29, 0x2a, 0x2c,
+ 0x24, 0x23, 0x28, 0x1e, 0x1c, 0x21, 0x1c, 0x1a, 0x1f, 0x1e, 0x1c, 0x22,
+ 0x1b, 0x1a, 0x22, 0x13, 0x13, 0x1b, 0x29, 0x2a, 0x2f, 0x39, 0x3d, 0x40,
+ 0x29, 0x2c, 0x35, 0x12, 0x12, 0x1a, 0x0d, 0x0e, 0x12, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x10, 0x10, 0x0d, 0x0d, 0x0c, 0x0b, 0x0b, 0x0b, 0x0c, 0x0c, 0x0d,
+ 0x0c, 0x0d, 0x11, 0x0f, 0x10, 0x14, 0x11, 0x12, 0x14, 0x10, 0x11, 0x13,
+ 0x20, 0x21, 0x23, 0x1f, 0x21, 0x23, 0x0f, 0x0f, 0x12, 0x13, 0x14, 0x16,
+ 0x17, 0x1b, 0x1c, 0x1f, 0x23, 0x26, 0x1d, 0x20, 0x25, 0x1f, 0x22, 0x28,
+ 0x24, 0x29, 0x2c, 0x27, 0x2f, 0x34, 0x2c, 0x36, 0x3e, 0x44, 0x51, 0x5d,
+ 0x4f, 0x5e, 0x71, 0x47, 0x56, 0x65, 0x2d, 0x36, 0x43, 0x35, 0x3e, 0x47,
+ 0x47, 0x4e, 0x54, 0x38, 0x3d, 0x41, 0x28, 0x2d, 0x30, 0x35, 0x39, 0x3a,
+ 0x3d, 0x45, 0x47, 0x3c, 0x44, 0x47, 0x36, 0x3b, 0x41, 0x24, 0x29, 0x2d,
+ 0x27, 0x2c, 0x30, 0x39, 0x3e, 0x41, 0x3a, 0x3f, 0x47, 0x38, 0x3b, 0x46,
+ 0x34, 0x38, 0x39, 0x2f, 0x34, 0x36, 0x2e, 0x35, 0x38, 0x31, 0x36, 0x3a,
+ 0x31, 0x36, 0x3a, 0x31, 0x34, 0x39, 0x2e, 0x36, 0x39, 0x2d, 0x37, 0x38,
+ 0x35, 0x39, 0x3a, 0x30, 0x34, 0x37, 0x25, 0x2a, 0x2e, 0x25, 0x2a, 0x2e,
+ 0x29, 0x2c, 0x31, 0x2d, 0x30, 0x35, 0x2b, 0x2f, 0x32, 0x27, 0x2b, 0x2e,
+ 0x2b, 0x34, 0x35, 0x3f, 0x49, 0x4f, 0x52, 0x5d, 0x67, 0x41, 0x4a, 0x57,
+ 0x37, 0x3a, 0x47, 0x33, 0x36, 0x3e, 0x33, 0x36, 0x3b, 0x31, 0x35, 0x38,
+ 0x32, 0x36, 0x38, 0x34, 0x38, 0x3d, 0x32, 0x37, 0x3f, 0x2f, 0x33, 0x3c,
+ 0x32, 0x33, 0x39, 0x31, 0x32, 0x37, 0x31, 0x34, 0x39, 0x30, 0x35, 0x3a,
+ 0x31, 0x35, 0x38, 0x28, 0x2c, 0x2f, 0x21, 0x26, 0x2b, 0x3b, 0x43, 0x4b,
+ 0x44, 0x4e, 0x57, 0x39, 0x41, 0x4b, 0x33, 0x37, 0x40, 0x34, 0x34, 0x3c,
+ 0x31, 0x36, 0x3a, 0x2d, 0x32, 0x35, 0x2f, 0x34, 0x37, 0x30, 0x33, 0x38,
+ 0x2f, 0x32, 0x37, 0x31, 0x36, 0x3a, 0x33, 0x38, 0x3e, 0x30, 0x35, 0x3b,
+ 0x2d, 0x35, 0x38, 0x2d, 0x32, 0x36, 0x2c, 0x31, 0x35, 0x2e, 0x31, 0x36,
+ 0x2d, 0x30, 0x35, 0x2f, 0x32, 0x38, 0x2e, 0x33, 0x37, 0x2e, 0x33, 0x39,
+ 0x2f, 0x33, 0x37, 0x2d, 0x31, 0x34, 0x2d, 0x30, 0x35, 0x29, 0x2c, 0x31,
+ 0x2a, 0x2e, 0x34, 0x2e, 0x31, 0x38, 0x2c, 0x2f, 0x38, 0x2b, 0x2f, 0x38,
+ 0x2f, 0x34, 0x3a, 0x30, 0x34, 0x3a, 0x2e, 0x31, 0x38, 0x2b, 0x2e, 0x33,
+ 0x22, 0x25, 0x29, 0x1b, 0x1f, 0x22, 0x16, 0x1a, 0x1d, 0x15, 0x19, 0x1c,
+ 0x16, 0x1b, 0x1d, 0x29, 0x2f, 0x2f, 0x54, 0x5b, 0x5b, 0x4a, 0x52, 0x51,
+ 0x3f, 0x45, 0x45, 0x44, 0x49, 0x4a, 0x52, 0x55, 0x57, 0x54, 0x58, 0x5a,
+ 0x1f, 0x45, 0x72, 0x19, 0x3e, 0x6b, 0x1c, 0x41, 0x6e, 0x21, 0x45, 0x75,
+ 0x1d, 0x45, 0x73, 0x1c, 0x44, 0x75, 0x1b, 0x43, 0x74, 0x1f, 0x45, 0x76,
+ 0x28, 0x4a, 0x7a, 0x23, 0x45, 0x73, 0x22, 0x44, 0x71, 0x26, 0x49, 0x6f,
+ 0x24, 0x48, 0x6c, 0x22, 0x45, 0x6d, 0x21, 0x42, 0x73, 0x21, 0x42, 0x79,
+ 0x1e, 0x46, 0x76, 0x21, 0x45, 0x77, 0x22, 0x42, 0x75, 0x1f, 0x40, 0x73,
+ 0x1f, 0x45, 0x76, 0x1e, 0x46, 0x77, 0x1e, 0x46, 0x74, 0x1c, 0x42, 0x6f,
+ 0x1a, 0x44, 0x74, 0x1a, 0x46, 0x75, 0x18, 0x44, 0x72, 0x1c, 0x46, 0x71,
+ 0x26, 0x4b, 0x74, 0x26, 0x47, 0x6e, 0x24, 0x46, 0x6f, 0x1c, 0x3f, 0x6b,
+ 0x21, 0x43, 0x74, 0x5e, 0x7b, 0xa5, 0x42, 0x5e, 0x81, 0x19, 0x39, 0x5b,
+ 0x16, 0x3e, 0x67, 0x0e, 0x3b, 0x6a, 0x17, 0x3f, 0x6d, 0x1a, 0x3f, 0x68,
+ 0x1d, 0x43, 0x74, 0x23, 0x47, 0x73, 0x21, 0x42, 0x69, 0x14, 0x2f, 0x54,
+ 0x25, 0x39, 0x5f, 0x28, 0x38, 0x5c, 0x5f, 0x73, 0x90, 0x87, 0x9e, 0xb5,
+ 0x47, 0x62, 0x88, 0x1b, 0x3d, 0x64, 0x16, 0x3c, 0x66, 0x1f, 0x46, 0x71,
+ 0x1b, 0x40, 0x6c, 0x1a, 0x3c, 0x69, 0x1c, 0x3d, 0x6a, 0x1b, 0x3a, 0x67,
+ 0x22, 0x43, 0x6c, 0x17, 0x33, 0x67, 0x1c, 0x32, 0x5f, 0x1f, 0x35, 0x4c,
+ 0x28, 0x3e, 0x53, 0x1b, 0x31, 0x59, 0x17, 0x31, 0x61, 0x65, 0x83, 0xa4,
+ 0x9a, 0xac, 0xb4, 0x9a, 0xb1, 0xbe, 0x84, 0x9e, 0xb8, 0x37, 0x50, 0x70,
+ 0x11, 0x24, 0x45, 0x17, 0x27, 0x48, 0x17, 0x29, 0x47, 0x1c, 0x30, 0x4e,
+ 0x2e, 0x44, 0x5c, 0x79, 0x8f, 0xa7, 0x7d, 0x92, 0xaf, 0x1b, 0x32, 0x53,
+ 0x0b, 0x23, 0x46, 0x35, 0x4e, 0x6b, 0x84, 0x9e, 0xb3, 0x52, 0x6a, 0x78,
+ 0x1b, 0x29, 0x44, 0x27, 0x38, 0x53, 0x91, 0xa7, 0xba, 0x6d, 0x86, 0x94,
+ 0x7d, 0x96, 0xa0, 0x51, 0x62, 0x68, 0x36, 0x3e, 0x43, 0x5d, 0x5d, 0x5f,
+ 0x54, 0x50, 0x48, 0x43, 0x3f, 0x3c, 0x4b, 0x49, 0x4b, 0x81, 0x81, 0x80,
+ 0xa9, 0xa9, 0xa2, 0xb2, 0xb1, 0xa6, 0x99, 0x92, 0x88, 0x54, 0x4a, 0x42,
+ 0x77, 0x79, 0x75, 0x81, 0x88, 0x89, 0x4b, 0x57, 0x5e, 0x3e, 0x4c, 0x5a,
+ 0x3f, 0x4f, 0x5e, 0x44, 0x55, 0x65, 0x44, 0x59, 0x6a, 0x54, 0x6e, 0x7e,
+ 0x8e, 0xa8, 0xa8, 0x8e, 0x98, 0x99, 0x80, 0x84, 0x8f, 0x50, 0x60, 0x74,
+ 0x53, 0x6d, 0x80, 0x7e, 0x90, 0x9d, 0x44, 0x53, 0x5e, 0x65, 0x78, 0x89,
+ 0x4b, 0x5d, 0x6d, 0x32, 0x40, 0x4f, 0x4c, 0x56, 0x68, 0x35, 0x3e, 0x51,
+ 0x28, 0x33, 0x46, 0x2b, 0x37, 0x4a, 0x41, 0x52, 0x64, 0x4a, 0x5f, 0x71,
+ 0x25, 0x3f, 0x63, 0x24, 0x3b, 0x57, 0x50, 0x61, 0x6f, 0x73, 0x81, 0x80,
+ 0xd1, 0xd9, 0xd5, 0xff, 0xff, 0xff, 0xd9, 0xdc, 0xe5, 0x81, 0x83, 0x94,
+ 0x3c, 0x4a, 0x5a, 0x17, 0x24, 0x34, 0x20, 0x2b, 0x42, 0x1d, 0x27, 0x43,
+ 0x41, 0x4b, 0x58, 0xb3, 0xbc, 0xb1, 0xe4, 0xe9, 0xd8, 0xd2, 0xd2, 0xcb,
+ 0x95, 0x94, 0x97, 0x7a, 0x7b, 0x7d, 0x56, 0x58, 0x57, 0x34, 0x37, 0x35,
+ 0x21, 0x23, 0x22, 0x19, 0x1a, 0x1c, 0x24, 0x25, 0x26, 0x2f, 0x30, 0x32,
+ 0x32, 0x3a, 0x30, 0xb2, 0xb8, 0xaf, 0xbc, 0xbb, 0xb8, 0x93, 0x92, 0x92,
+ 0x57, 0x56, 0x5d, 0x3b, 0x40, 0x48, 0x3d, 0x48, 0x52, 0x2d, 0x3b, 0x47,
+ 0x1b, 0x2c, 0x3a, 0x19, 0x28, 0x3b, 0x1b, 0x27, 0x3d, 0x1d, 0x29, 0x3e,
+ 0x1a, 0x25, 0x39, 0x16, 0x21, 0x33, 0x1a, 0x26, 0x3a, 0x1b, 0x27, 0x3d,
+ 0x17, 0x22, 0x38, 0x19, 0x29, 0x43, 0x12, 0x25, 0x45, 0x1a, 0x2d, 0x4d,
+ 0x1b, 0x2b, 0x46, 0x17, 0x20, 0x34, 0x5e, 0x62, 0x6f, 0x6f, 0x72, 0x7b,
+ 0x57, 0x5d, 0x5e, 0x31, 0x34, 0x37, 0x2a, 0x2a, 0x30, 0x38, 0x3b, 0x46,
+ 0x26, 0x2c, 0x3a, 0x1e, 0x26, 0x33, 0x19, 0x22, 0x2b, 0x2c, 0x33, 0x3b,
+ 0x38, 0x41, 0x49, 0x2f, 0x37, 0x4a, 0x19, 0x24, 0x38, 0x14, 0x22, 0x2f,
+ 0x0f, 0x1f, 0x2e, 0x2c, 0x3a, 0x53, 0x52, 0x60, 0x7a, 0x43, 0x52, 0x62,
+ 0x26, 0x2b, 0x3c, 0x1d, 0x1f, 0x2c, 0x26, 0x25, 0x2b, 0x26, 0x21, 0x23,
+ 0x21, 0x1d, 0x1a, 0x29, 0x25, 0x23, 0x27, 0x26, 0x26, 0x29, 0x28, 0x2d,
+ 0x22, 0x22, 0x23, 0x1f, 0x20, 0x1f, 0x1e, 0x1d, 0x1f, 0x2e, 0x2c, 0x33,
+ 0x3b, 0x3a, 0x45, 0x38, 0x37, 0x44, 0x38, 0x39, 0x42, 0x38, 0x3b, 0x42,
+ 0x30, 0x33, 0x3c, 0x11, 0x13, 0x1b, 0x0c, 0x0d, 0x12, 0x0e, 0x0e, 0x10,
+ 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0c, 0x0d, 0x0f,
+ 0x0c, 0x0d, 0x11, 0x0d, 0x0e, 0x12, 0x12, 0x13, 0x16, 0x1b, 0x1c, 0x1e,
+ 0x34, 0x36, 0x38, 0x1a, 0x1e, 0x1f, 0x0e, 0x11, 0x13, 0x16, 0x1a, 0x1b,
+ 0x19, 0x1e, 0x1e, 0x1f, 0x22, 0x26, 0x1d, 0x20, 0x27, 0x20, 0x23, 0x2a,
+ 0x25, 0x2a, 0x2f, 0x2d, 0x34, 0x39, 0x2c, 0x34, 0x3d, 0x3c, 0x46, 0x53,
+ 0x49, 0x58, 0x69, 0x4c, 0x5c, 0x6c, 0x3c, 0x4a, 0x57, 0x32, 0x3d, 0x48,
+ 0x41, 0x48, 0x50, 0x37, 0x3b, 0x40, 0x2a, 0x2f, 0x32, 0x2f, 0x34, 0x37,
+ 0x30, 0x37, 0x3b, 0x3e, 0x45, 0x4b, 0x3e, 0x43, 0x49, 0x2d, 0x30, 0x35,
+ 0x29, 0x2d, 0x30, 0x2d, 0x31, 0x34, 0x2d, 0x30, 0x37, 0x2c, 0x2f, 0x38,
+ 0x33, 0x34, 0x37, 0x35, 0x39, 0x3a, 0x33, 0x38, 0x3c, 0x32, 0x37, 0x3d,
+ 0x34, 0x38, 0x3e, 0x33, 0x35, 0x3b, 0x30, 0x34, 0x38, 0x2b, 0x32, 0x34,
+ 0x30, 0x34, 0x36, 0x2e, 0x32, 0x35, 0x2f, 0x34, 0x38, 0x2f, 0x35, 0x3a,
+ 0x2e, 0x33, 0x39, 0x32, 0x36, 0x3b, 0x31, 0x35, 0x38, 0x2a, 0x2c, 0x30,
+ 0x23, 0x2c, 0x2d, 0x2f, 0x3b, 0x3e, 0x44, 0x50, 0x5a, 0x42, 0x4b, 0x58,
+ 0x38, 0x3c, 0x48, 0x33, 0x35, 0x3f, 0x2d, 0x30, 0x37, 0x26, 0x29, 0x2e,
+ 0x2e, 0x35, 0x38, 0x3d, 0x46, 0x4b, 0x37, 0x3f, 0x47, 0x30, 0x37, 0x3e,
+ 0x2a, 0x2f, 0x35, 0x28, 0x2d, 0x31, 0x37, 0x3f, 0x42, 0x3a, 0x42, 0x47,
+ 0x33, 0x38, 0x3c, 0x28, 0x2e, 0x30, 0x26, 0x2b, 0x2f, 0x3f, 0x48, 0x4f,
+ 0x50, 0x5d, 0x67, 0x44, 0x4e, 0x5b, 0x35, 0x3b, 0x47, 0x32, 0x34, 0x3d,
+ 0x2e, 0x33, 0x36, 0x2d, 0x33, 0x35, 0x2f, 0x33, 0x37, 0x30, 0x33, 0x38,
+ 0x32, 0x35, 0x3a, 0x2f, 0x34, 0x38, 0x31, 0x36, 0x3a, 0x31, 0x37, 0x3b,
+ 0x2f, 0x37, 0x3a, 0x2f, 0x35, 0x38, 0x2f, 0x34, 0x38, 0x30, 0x33, 0x38,
+ 0x2e, 0x31, 0x36, 0x30, 0x33, 0x38, 0x30, 0x35, 0x39, 0x30, 0x35, 0x38,
+ 0x2e, 0x32, 0x33, 0x2d, 0x31, 0x34, 0x2c, 0x30, 0x33, 0x2c, 0x30, 0x33,
+ 0x2c, 0x2f, 0x33, 0x2e, 0x32, 0x37, 0x2e, 0x31, 0x36, 0x2b, 0x2e, 0x35,
+ 0x2e, 0x33, 0x38, 0x30, 0x35, 0x39, 0x2f, 0x32, 0x37, 0x29, 0x2b, 0x31,
+ 0x23, 0x24, 0x29, 0x19, 0x1a, 0x1f, 0x11, 0x14, 0x19, 0x10, 0x13, 0x18,
+ 0x0f, 0x13, 0x16, 0x16, 0x1a, 0x1d, 0x30, 0x35, 0x37, 0x4d, 0x53, 0x54,
+ 0x31, 0x37, 0x37, 0x25, 0x2a, 0x2d, 0x4e, 0x52, 0x55, 0x58, 0x5c, 0x5f,
+ 0x2c, 0x52, 0x7f, 0x24, 0x49, 0x76, 0x27, 0x49, 0x79, 0x28, 0x4d, 0x7d,
+ 0x1c, 0x42, 0x72, 0x18, 0x40, 0x71, 0x1e, 0x45, 0x76, 0x21, 0x45, 0x77,
+ 0x2b, 0x4d, 0x7d, 0x32, 0x54, 0x84, 0x27, 0x4a, 0x77, 0x1f, 0x42, 0x6c,
+ 0x23, 0x46, 0x6e, 0x22, 0x44, 0x6f, 0x21, 0x42, 0x73, 0x20, 0x41, 0x77,
+ 0x1a, 0x43, 0x76, 0x20, 0x43, 0x77, 0x25, 0x45, 0x78, 0x21, 0x42, 0x75,
+ 0x1e, 0x45, 0x78, 0x1a, 0x45, 0x75, 0x1f, 0x47, 0x73, 0x20, 0x45, 0x71,
+ 0x1e, 0x49, 0x74, 0x1d, 0x46, 0x71, 0x2e, 0x4e, 0x70, 0x50, 0x5a, 0x6f,
+ 0x6a, 0x62, 0x6c, 0x71, 0x64, 0x6f, 0x63, 0x5f, 0x76, 0x4d, 0x56, 0x79,
+ 0x2e, 0x44, 0x6e, 0x4b, 0x65, 0x92, 0x36, 0x58, 0x7f, 0x1e, 0x45, 0x6c,
+ 0x21, 0x48, 0x77, 0x13, 0x35, 0x6f, 0x1e, 0x3c, 0x75, 0x2d, 0x4a, 0x7a,
+ 0x25, 0x4a, 0x77, 0x26, 0x4c, 0x79, 0x21, 0x43, 0x6e, 0x10, 0x2c, 0x50,
+ 0x23, 0x38, 0x58, 0x5a, 0x6d, 0x8b, 0x86, 0x9b, 0xb7, 0x45, 0x5c, 0x7b,
+ 0x13, 0x30, 0x59, 0x1b, 0x3d, 0x66, 0x25, 0x4a, 0x74, 0x27, 0x4d, 0x74,
+ 0x30, 0x53, 0x79, 0x3f, 0x61, 0x87, 0x1f, 0x41, 0x6b, 0x19, 0x39, 0x68,
+ 0x19, 0x3c, 0x66, 0x18, 0x39, 0x6a, 0x15, 0x2f, 0x5a, 0x3d, 0x57, 0x70,
+ 0x80, 0x9a, 0xb1, 0x36, 0x50, 0x74, 0x15, 0x32, 0x5d, 0x65, 0x87, 0xa9,
+ 0xa4, 0xb9, 0xd0, 0x6d, 0x86, 0xa2, 0x66, 0x84, 0xa4, 0x50, 0x6b, 0x8c,
+ 0x12, 0x27, 0x44, 0x20, 0x30, 0x49, 0x1e, 0x2e, 0x45, 0x1e, 0x30, 0x47,
+ 0x50, 0x68, 0x83, 0x94, 0xa9, 0xc4, 0x69, 0x7e, 0x99, 0x19, 0x31, 0x4f,
+ 0x14, 0x2d, 0x4d, 0x35, 0x4f, 0x6b, 0x8f, 0xa8, 0xb9, 0x8d, 0xa3, 0xac,
+ 0x67, 0x79, 0x8e, 0x39, 0x4e, 0x63, 0x95, 0xaa, 0xc0, 0x9c, 0xaf, 0xc1,
+ 0x52, 0x60, 0x6a, 0x33, 0x3b, 0x3c, 0x48, 0x4a, 0x41, 0x54, 0x53, 0x44,
+ 0x55, 0x5a, 0x52, 0x46, 0x47, 0x43, 0x4d, 0x49, 0x48, 0x55, 0x4c, 0x48,
+ 0x7c, 0x74, 0x69, 0xba, 0xb7, 0xa6, 0x84, 0x84, 0x76, 0x3e, 0x3f, 0x36,
+ 0x66, 0x64, 0x66, 0xa3, 0xa4, 0xaa, 0x79, 0x81, 0x88, 0x4a, 0x55, 0x5e,
+ 0x3d, 0x4a, 0x50, 0x43, 0x52, 0x58, 0x5e, 0x71, 0x78, 0x71, 0x88, 0x8e,
+ 0x81, 0x96, 0x99, 0xa6, 0xad, 0xb2, 0x79, 0x7c, 0x85, 0x52, 0x62, 0x6b,
+ 0x5a, 0x74, 0x79, 0x8a, 0x9d, 0xa3, 0x7c, 0x89, 0x96, 0x72, 0x7e, 0x93,
+ 0x38, 0x42, 0x5a, 0x37, 0x3e, 0x57, 0x3f, 0x46, 0x61, 0x30, 0x37, 0x54,
+ 0x2a, 0x34, 0x4f, 0x29, 0x35, 0x4b, 0x37, 0x47, 0x59, 0x51, 0x65, 0x75,
+ 0x35, 0x4e, 0x6c, 0x18, 0x30, 0x4d, 0x2f, 0x46, 0x5c, 0x4d, 0x60, 0x71,
+ 0x64, 0x74, 0x7f, 0xba, 0xc4, 0xcb, 0xe8, 0xee, 0xf2, 0x70, 0x76, 0x7c,
+ 0x25, 0x39, 0x50, 0x23, 0x34, 0x4f, 0x21, 0x2c, 0x49, 0x1b, 0x24, 0x43,
+ 0x4d, 0x57, 0x6d, 0x7f, 0x8c, 0x93, 0xa2, 0xac, 0xac, 0xdc, 0xe3, 0xe5,
+ 0xb4, 0xb7, 0xbc, 0x65, 0x69, 0x6c, 0x36, 0x39, 0x3d, 0x20, 0x24, 0x27,
+ 0x2d, 0x31, 0x32, 0x2d, 0x2e, 0x2f, 0x26, 0x26, 0x27, 0x44, 0x45, 0x44,
+ 0x54, 0x58, 0x4a, 0x77, 0x7a, 0x6d, 0xc2, 0xc2, 0xbb, 0xb9, 0xb7, 0xb5,
+ 0x84, 0x81, 0x84, 0x57, 0x58, 0x5e, 0x31, 0x38, 0x3f, 0x2d, 0x36, 0x3e,
+ 0x2c, 0x36, 0x3a, 0x21, 0x29, 0x32, 0x1b, 0x21, 0x31, 0x1e, 0x24, 0x34,
+ 0x31, 0x38, 0x48, 0x20, 0x29, 0x37, 0x1d, 0x29, 0x37, 0x1d, 0x2a, 0x39,
+ 0x1b, 0x27, 0x3b, 0x19, 0x28, 0x41, 0x1e, 0x2f, 0x4b, 0x22, 0x33, 0x4f,
+ 0x27, 0x34, 0x4c, 0x2a, 0x33, 0x44, 0x91, 0x97, 0xa3, 0x9c, 0xa0, 0xa9,
+ 0x85, 0x8a, 0x96, 0x4b, 0x4f, 0x58, 0x1e, 0x23, 0x2a, 0x3b, 0x42, 0x49,
+ 0x25, 0x2e, 0x37, 0x30, 0x3a, 0x47, 0x1d, 0x27, 0x38, 0x28, 0x2f, 0x40,
+ 0x4b, 0x50, 0x57, 0x5a, 0x60, 0x6a, 0x30, 0x38, 0x45, 0x16, 0x20, 0x2c,
+ 0x10, 0x1c, 0x2b, 0x0b, 0x17, 0x2d, 0x18, 0x27, 0x3e, 0x50, 0x5f, 0x73,
+ 0x6a, 0x71, 0x8b, 0x41, 0x49, 0x5e, 0x26, 0x2c, 0x38, 0x1b, 0x20, 0x25,
+ 0x18, 0x19, 0x1b, 0x23, 0x25, 0x24, 0x26, 0x25, 0x29, 0x22, 0x22, 0x28,
+ 0x24, 0x26, 0x26, 0x1f, 0x21, 0x20, 0x2d, 0x2c, 0x30, 0x55, 0x54, 0x5c,
+ 0x46, 0x45, 0x53, 0x38, 0x37, 0x47, 0x35, 0x37, 0x44, 0x37, 0x3a, 0x43,
+ 0x39, 0x3c, 0x45, 0x15, 0x18, 0x1f, 0x10, 0x11, 0x16, 0x0e, 0x0f, 0x11,
+ 0x0e, 0x0e, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0a, 0x0b, 0x0d,
+ 0x0c, 0x0d, 0x11, 0x10, 0x11, 0x15, 0x17, 0x19, 0x1c, 0x2f, 0x33, 0x36,
+ 0x29, 0x2d, 0x30, 0x12, 0x16, 0x19, 0x13, 0x17, 0x19, 0x17, 0x1a, 0x1d,
+ 0x17, 0x1c, 0x1f, 0x1b, 0x1e, 0x23, 0x1f, 0x23, 0x29, 0x22, 0x26, 0x2c,
+ 0x26, 0x2b, 0x31, 0x2d, 0x34, 0x3a, 0x2e, 0x36, 0x3f, 0x35, 0x3c, 0x4a,
+ 0x47, 0x53, 0x61, 0x50, 0x5e, 0x6d, 0x4a, 0x59, 0x69, 0x35, 0x41, 0x4d,
+ 0x36, 0x3e, 0x45, 0x35, 0x3a, 0x3e, 0x2e, 0x33, 0x38, 0x2d, 0x34, 0x3a,
+ 0x2e, 0x33, 0x39, 0x32, 0x36, 0x3d, 0x34, 0x37, 0x3e, 0x29, 0x2b, 0x31,
+ 0x23, 0x24, 0x28, 0x23, 0x25, 0x27, 0x21, 0x25, 0x28, 0x24, 0x27, 0x2c,
+ 0x31, 0x32, 0x35, 0x40, 0x44, 0x47, 0x3e, 0x43, 0x48, 0x35, 0x3a, 0x40,
+ 0x33, 0x36, 0x3d, 0x34, 0x35, 0x3c, 0x31, 0x34, 0x39, 0x2c, 0x31, 0x33,
+ 0x27, 0x2b, 0x2d, 0x24, 0x29, 0x2c, 0x35, 0x3a, 0x3e, 0x3f, 0x45, 0x4b,
+ 0x37, 0x3e, 0x44, 0x31, 0x36, 0x3c, 0x2c, 0x30, 0x33, 0x26, 0x27, 0x2b,
+ 0x24, 0x2e, 0x2d, 0x31, 0x3c, 0x3f, 0x40, 0x4a, 0x53, 0x3c, 0x45, 0x4f,
+ 0x32, 0x37, 0x40, 0x30, 0x33, 0x3a, 0x2b, 0x2e, 0x35, 0x21, 0x24, 0x2b,
+ 0x34, 0x3d, 0x3f, 0x4c, 0x57, 0x5d, 0x41, 0x4b, 0x54, 0x31, 0x3c, 0x42,
+ 0x27, 0x2e, 0x33, 0x22, 0x2a, 0x2d, 0x3c, 0x46, 0x47, 0x4c, 0x57, 0x5b,
+ 0x3e, 0x48, 0x51, 0x30, 0x36, 0x3c, 0x29, 0x2c, 0x31, 0x35, 0x3b, 0x43,
+ 0x4e, 0x58, 0x65, 0x4d, 0x5b, 0x6b, 0x3e, 0x48, 0x55, 0x37, 0x3b, 0x45,
+ 0x30, 0x35, 0x39, 0x2e, 0x33, 0x37, 0x2f, 0x34, 0x38, 0x30, 0x33, 0x38,
+ 0x30, 0x33, 0x38, 0x2f, 0x34, 0x38, 0x2e, 0x33, 0x37, 0x2f, 0x35, 0x38,
+ 0x30, 0x38, 0x3a, 0x2d, 0x33, 0x37, 0x2f, 0x34, 0x38, 0x2f, 0x34, 0x38,
+ 0x2d, 0x31, 0x35, 0x2f, 0x33, 0x37, 0x31, 0x36, 0x38, 0x2f, 0x34, 0x35,
+ 0x2f, 0x33, 0x36, 0x2c, 0x30, 0x33, 0x2c, 0x31, 0x32, 0x2c, 0x32, 0x32,
+ 0x2b, 0x31, 0x32, 0x2b, 0x30, 0x33, 0x2b, 0x2f, 0x32, 0x2c, 0x30, 0x33,
+ 0x2d, 0x32, 0x36, 0x2f, 0x34, 0x38, 0x32, 0x35, 0x3a, 0x2a, 0x2b, 0x30,
+ 0x1f, 0x20, 0x25, 0x15, 0x16, 0x1b, 0x11, 0x12, 0x17, 0x11, 0x13, 0x18,
+ 0x13, 0x14, 0x19, 0x10, 0x13, 0x16, 0x14, 0x19, 0x1c, 0x2b, 0x30, 0x33,
+ 0x2c, 0x31, 0x34, 0x3f, 0x44, 0x47, 0x37, 0x3b, 0x3f, 0x34, 0x37, 0x3c,
+ 0x2b, 0x53, 0x84, 0x2f, 0x55, 0x86, 0x33, 0x57, 0x89, 0x30, 0x56, 0x87,
+ 0x1e, 0x45, 0x78, 0x18, 0x42, 0x74, 0x1d, 0x45, 0x78, 0x22, 0x47, 0x7b,
+ 0x2c, 0x51, 0x81, 0x31, 0x57, 0x86, 0x22, 0x48, 0x77, 0x1e, 0x44, 0x71,
+ 0x1f, 0x46, 0x71, 0x24, 0x4a, 0x75, 0x1c, 0x41, 0x72, 0x1c, 0x41, 0x77,
+ 0x1a, 0x44, 0x76, 0x22, 0x44, 0x76, 0x28, 0x46, 0x78, 0x2c, 0x4c, 0x7f,
+ 0x1f, 0x47, 0x7b, 0x18, 0x42, 0x75, 0x21, 0x49, 0x79, 0x25, 0x48, 0x78,
+ 0x29, 0x4a, 0x76, 0x47, 0x57, 0x72, 0x77, 0x70, 0x75, 0x96, 0x7d, 0x6e,
+ 0x99, 0x7a, 0x61, 0x98, 0x7b, 0x63, 0x9b, 0x82, 0x6e, 0x95, 0x7f, 0x6f,
+ 0x6d, 0x69, 0x72, 0x3d, 0x49, 0x6b, 0x22, 0x41, 0x70, 0x1c, 0x44, 0x75,
+ 0x1d, 0x45, 0x76, 0x1b, 0x3d, 0x72, 0x25, 0x44, 0x7b, 0x3e, 0x5f, 0x8f,
+ 0x1f, 0x49, 0x71, 0x1e, 0x46, 0x72, 0x19, 0x3c, 0x6a, 0x1d, 0x39, 0x5e,
+ 0x71, 0x89, 0xa1, 0x8a, 0x9e, 0xb3, 0x40, 0x55, 0x72, 0x1b, 0x31, 0x58,
+ 0x14, 0x2c, 0x4f, 0x1d, 0x37, 0x5d, 0x20, 0x3c, 0x67, 0x24, 0x41, 0x6d,
+ 0x40, 0x5d, 0x85, 0x4f, 0x6f, 0x96, 0x21, 0x44, 0x6c, 0x17, 0x3e, 0x69,
+ 0x18, 0x3d, 0x69, 0x19, 0x3a, 0x65, 0x46, 0x64, 0x8a, 0x7d, 0x97, 0xb5,
+ 0x97, 0xaf, 0xcd, 0x5e, 0x7b, 0x9b, 0x11, 0x32, 0x55, 0x52, 0x75, 0x98,
+ 0x6f, 0x8c, 0xb1, 0x26, 0x46, 0x6e, 0x1d, 0x3e, 0x68, 0x26, 0x46, 0x6b,
+ 0x1c, 0x32, 0x52, 0x1e, 0x30, 0x4a, 0x16, 0x26, 0x40, 0x13, 0x23, 0x40,
+ 0x37, 0x4f, 0x6d, 0x48, 0x5d, 0x78, 0x38, 0x4d, 0x64, 0x30, 0x47, 0x62,
+ 0x18, 0x33, 0x50, 0x37, 0x52, 0x6f, 0x8b, 0xa3, 0xb7, 0x90, 0xa3, 0xb1,
+ 0x98, 0xad, 0xc0, 0x6e, 0x83, 0x99, 0x51, 0x63, 0x77, 0x6c, 0x77, 0x85,
+ 0x5c, 0x61, 0x67, 0x44, 0x44, 0x42, 0x3f, 0x3e, 0x34, 0x56, 0x57, 0x4a,
+ 0x5e, 0x64, 0x5d, 0x45, 0x48, 0x45, 0x52, 0x4c, 0x4b, 0x5b, 0x52, 0x4a,
+ 0x59, 0x52, 0x42, 0x5d, 0x59, 0x4a, 0x49, 0x4c, 0x46, 0x3c, 0x40, 0x43,
+ 0x4c, 0x4d, 0x52, 0x6e, 0x73, 0x78, 0x7d, 0x86, 0x8c, 0x58, 0x64, 0x68,
+ 0x46, 0x54, 0x55, 0x59, 0x68, 0x6b, 0x77, 0x88, 0x8e, 0x4f, 0x62, 0x6a,
+ 0x58, 0x6b, 0x70, 0xab, 0xb4, 0xbb, 0xab, 0xae, 0xb5, 0x82, 0x8f, 0x91,
+ 0x58, 0x70, 0x76, 0x88, 0x9c, 0xab, 0x7f, 0x8d, 0x9e, 0x55, 0x5d, 0x6a,
+ 0x49, 0x4e, 0x5e, 0x3c, 0x42, 0x54, 0x32, 0x38, 0x50, 0x2b, 0x32, 0x4e,
+ 0x2c, 0x36, 0x51, 0x29, 0x35, 0x4d, 0x35, 0x44, 0x57, 0x54, 0x63, 0x74,
+ 0x35, 0x4e, 0x6b, 0x19, 0x32, 0x4d, 0x20, 0x37, 0x4b, 0x3a, 0x4d, 0x5d,
+ 0x6b, 0x7a, 0x8a, 0x86, 0x93, 0xa1, 0xa7, 0xb4, 0xbd, 0x50, 0x5d, 0x67,
+ 0x1b, 0x2f, 0x4f, 0x26, 0x37, 0x58, 0x25, 0x31, 0x48, 0x34, 0x3d, 0x4b,
+ 0x79, 0x85, 0x91, 0x93, 0xa1, 0xb1, 0x73, 0x81, 0x91, 0x87, 0x95, 0xa0,
+ 0x92, 0x97, 0xa1, 0x41, 0x45, 0x50, 0x21, 0x25, 0x2e, 0x2d, 0x32, 0x38,
+ 0x27, 0x2b, 0x2e, 0x20, 0x21, 0x21, 0x44, 0x43, 0x3f, 0x5f, 0x5e, 0x59,
+ 0x5f, 0x60, 0x52, 0x51, 0x52, 0x45, 0x63, 0x63, 0x5c, 0x96, 0x95, 0x91,
+ 0xab, 0xaa, 0xaa, 0x60, 0x61, 0x65, 0x24, 0x27, 0x2c, 0x30, 0x34, 0x3b,
+ 0x22, 0x29, 0x2f, 0x20, 0x25, 0x2c, 0x23, 0x26, 0x2d, 0x51, 0x54, 0x59,
+ 0x66, 0x6a, 0x6c, 0x47, 0x4c, 0x51, 0x33, 0x3a, 0x42, 0x27, 0x2f, 0x3c,
+ 0x22, 0x2c, 0x3a, 0x17, 0x23, 0x37, 0x18, 0x26, 0x3e, 0x1c, 0x2c, 0x45,
+ 0x30, 0x3c, 0x52, 0x2d, 0x39, 0x4b, 0x98, 0xa6, 0xb5, 0x8c, 0x9b, 0xa9,
+ 0x48, 0x51, 0x63, 0x19, 0x1f, 0x2f, 0x14, 0x1c, 0x29, 0x27, 0x31, 0x3b,
+ 0x1f, 0x2b, 0x37, 0x52, 0x5e, 0x6d, 0x2d, 0x38, 0x46, 0x16, 0x1f, 0x2a,
+ 0x25, 0x29, 0x2c, 0x4d, 0x51, 0x52, 0x48, 0x4d, 0x52, 0x15, 0x1b, 0x27,
+ 0x12, 0x19, 0x2b, 0x15, 0x1e, 0x2f, 0x0f, 0x1b, 0x2d, 0x16, 0x23, 0x3a,
+ 0x33, 0x43, 0x59, 0x5f, 0x70, 0x84, 0x5a, 0x6b, 0x7f, 0x47, 0x56, 0x67,
+ 0x2b, 0x36, 0x44, 0x20, 0x28, 0x32, 0x1d, 0x21, 0x29, 0x21, 0x24, 0x2a,
+ 0x21, 0x24, 0x29, 0x1e, 0x21, 0x25, 0x2e, 0x31, 0x38, 0x47, 0x47, 0x53,
+ 0x2c, 0x2d, 0x3d, 0x17, 0x19, 0x28, 0x1f, 0x23, 0x2d, 0x2d, 0x32, 0x39,
+ 0x23, 0x27, 0x2f, 0x16, 0x18, 0x1f, 0x16, 0x18, 0x1c, 0x0f, 0x10, 0x12,
+ 0x10, 0x0f, 0x11, 0x0e, 0x0e, 0x0e, 0x0c, 0x0e, 0x0f, 0x0c, 0x0d, 0x0f,
+ 0x10, 0x11, 0x14, 0x0f, 0x13, 0x14, 0x24, 0x28, 0x2a, 0x31, 0x35, 0x38,
+ 0x18, 0x1c, 0x1f, 0x12, 0x16, 0x1a, 0x16, 0x1a, 0x1e, 0x15, 0x19, 0x1d,
+ 0x18, 0x1d, 0x23, 0x1d, 0x21, 0x2a, 0x22, 0x26, 0x2f, 0x23, 0x27, 0x30,
+ 0x25, 0x2a, 0x31, 0x32, 0x39, 0x3f, 0x36, 0x3d, 0x46, 0x2f, 0x36, 0x42,
+ 0x3e, 0x48, 0x52, 0x4f, 0x5d, 0x6a, 0x50, 0x60, 0x70, 0x45, 0x51, 0x5f,
+ 0x38, 0x40, 0x49, 0x34, 0x39, 0x3f, 0x2e, 0x35, 0x3c, 0x2a, 0x33, 0x3c,
+ 0x2f, 0x33, 0x3a, 0x2c, 0x2e, 0x36, 0x24, 0x24, 0x2c, 0x21, 0x22, 0x27,
+ 0x25, 0x25, 0x28, 0x2b, 0x2d, 0x2c, 0x2b, 0x2c, 0x2e, 0x28, 0x29, 0x2d,
+ 0x2c, 0x30, 0x33, 0x3c, 0x44, 0x47, 0x48, 0x51, 0x56, 0x3a, 0x43, 0x4a,
+ 0x30, 0x35, 0x3e, 0x2f, 0x31, 0x38, 0x2e, 0x33, 0x36, 0x2a, 0x30, 0x30,
+ 0x23, 0x27, 0x28, 0x20, 0x25, 0x28, 0x3c, 0x44, 0x47, 0x4a, 0x53, 0x58,
+ 0x39, 0x40, 0x48, 0x2d, 0x33, 0x39, 0x2b, 0x2f, 0x32, 0x27, 0x2b, 0x2c,
+ 0x2a, 0x33, 0x31, 0x34, 0x3d, 0x40, 0x3c, 0x47, 0x4b, 0x37, 0x41, 0x45,
+ 0x33, 0x38, 0x3c, 0x2f, 0x32, 0x37, 0x28, 0x2b, 0x32, 0x20, 0x24, 0x2c,
+ 0x32, 0x3c, 0x3e, 0x4a, 0x55, 0x5b, 0x43, 0x4d, 0x56, 0x34, 0x3f, 0x45,
+ 0x2d, 0x35, 0x3a, 0x25, 0x2d, 0x30, 0x37, 0x41, 0x42, 0x51, 0x5c, 0x61,
+ 0x47, 0x54, 0x63, 0x36, 0x3d, 0x47, 0x2f, 0x2f, 0x34, 0x29, 0x2c, 0x33,
+ 0x3e, 0x47, 0x54, 0x4c, 0x5a, 0x6a, 0x43, 0x4f, 0x5d, 0x35, 0x3d, 0x47,
+ 0x32, 0x35, 0x3f, 0x33, 0x38, 0x40, 0x33, 0x37, 0x3e, 0x30, 0x33, 0x3a,
+ 0x30, 0x33, 0x38, 0x30, 0x35, 0x39, 0x2d, 0x32, 0x35, 0x2d, 0x33, 0x35,
+ 0x2b, 0x32, 0x34, 0x2c, 0x34, 0x36, 0x2f, 0x34, 0x38, 0x30, 0x35, 0x39,
+ 0x31, 0x34, 0x39, 0x2d, 0x32, 0x35, 0x2e, 0x34, 0x34, 0x2f, 0x35, 0x35,
+ 0x30, 0x34, 0x38, 0x2c, 0x2f, 0x35, 0x2d, 0x33, 0x35, 0x2c, 0x33, 0x33,
+ 0x2d, 0x33, 0x33, 0x2a, 0x30, 0x30, 0x28, 0x2c, 0x2f, 0x2b, 0x2f, 0x33,
+ 0x2c, 0x31, 0x33, 0x2c, 0x31, 0x34, 0x2e, 0x32, 0x35, 0x28, 0x29, 0x2d,
+ 0x1c, 0x1e, 0x22, 0x14, 0x15, 0x1a, 0x11, 0x12, 0x17, 0x11, 0x12, 0x17,
+ 0x13, 0x14, 0x18, 0x11, 0x12, 0x16, 0x11, 0x15, 0x16, 0x11, 0x15, 0x16,
+ 0x10, 0x16, 0x16, 0x28, 0x2e, 0x2e, 0x46, 0x4b, 0x4e, 0x47, 0x4c, 0x4f,
+ 0x1b, 0x46, 0x77, 0x28, 0x50, 0x83, 0x29, 0x4f, 0x85, 0x22, 0x49, 0x7e,
+ 0x18, 0x41, 0x76, 0x18, 0x41, 0x76, 0x1c, 0x44, 0x78, 0x25, 0x4a, 0x7e,
+ 0x21, 0x4c, 0x79, 0x24, 0x4e, 0x7e, 0x1c, 0x45, 0x75, 0x1c, 0x46, 0x74,
+ 0x23, 0x4c, 0x78, 0x21, 0x4a, 0x76, 0x1a, 0x43, 0x73, 0x19, 0x41, 0x75,
+ 0x1c, 0x46, 0x77, 0x20, 0x43, 0x71, 0x11, 0x2d, 0x5c, 0x23, 0x41, 0x72,
+ 0x20, 0x46, 0x7b, 0x18, 0x44, 0x78, 0x20, 0x49, 0x7c, 0x26, 0x48, 0x78,
+ 0x48, 0x56, 0x75, 0x87, 0x76, 0x7b, 0xa8, 0x81, 0x6e, 0x96, 0x72, 0x5b,
+ 0x68, 0x58, 0x50, 0x60, 0x5e, 0x60, 0x76, 0x6f, 0x6b, 0x98, 0x82, 0x73,
+ 0xa0, 0x83, 0x6d, 0x73, 0x68, 0x78, 0x2e, 0x43, 0x78, 0x19, 0x41, 0x79,
+ 0x1b, 0x45, 0x72, 0x1c, 0x44, 0x6e, 0x22, 0x4b, 0x76, 0x1f, 0x4d, 0x74,
+ 0x18, 0x42, 0x6a, 0x14, 0x3a, 0x69, 0x24, 0x45, 0x75, 0x5d, 0x79, 0x9f,
+ 0x7d, 0x97, 0xab, 0x5e, 0x73, 0x85, 0x2a, 0x3e, 0x5e, 0x25, 0x3a, 0x66,
+ 0x22, 0x35, 0x51, 0x1e, 0x31, 0x53, 0x18, 0x2d, 0x5a, 0x20, 0x36, 0x66,
+ 0x2a, 0x42, 0x6f, 0x2b, 0x49, 0x73, 0x19, 0x3f, 0x66, 0x1d, 0x48, 0x6f,
+ 0x2b, 0x4f, 0x7a, 0x2f, 0x51, 0x78, 0x83, 0xa2, 0xc4, 0x58, 0x73, 0x93,
+ 0x50, 0x6a, 0x89, 0x85, 0xa3, 0xc0, 0x25, 0x46, 0x64, 0x26, 0x49, 0x6a,
+ 0x31, 0x53, 0x78, 0x22, 0x48, 0x70, 0x1a, 0x43, 0x6d, 0x1b, 0x3f, 0x67,
+ 0x1a, 0x35, 0x58, 0x13, 0x24, 0x45, 0x18, 0x26, 0x4a, 0x18, 0x26, 0x4e,
+ 0x12, 0x2a, 0x47, 0x40, 0x57, 0x6f, 0x83, 0x99, 0xad, 0x6e, 0x84, 0x9d,
+ 0x12, 0x2e, 0x4c, 0x29, 0x45, 0x64, 0x9e, 0xb4, 0xcf, 0x78, 0x89, 0x9f,
+ 0x40, 0x54, 0x6e, 0x52, 0x64, 0x7d, 0x5c, 0x69, 0x79, 0x70, 0x76, 0x7a,
+ 0x84, 0x84, 0x7f, 0x74, 0x71, 0x6c, 0x51, 0x50, 0x4d, 0x56, 0x57, 0x55,
+ 0x4e, 0x4e, 0x49, 0x4e, 0x4d, 0x4d, 0x4b, 0x49, 0x4b, 0x59, 0x57, 0x54,
+ 0x45, 0x44, 0x3b, 0x23, 0x24, 0x1d, 0x33, 0x33, 0x39, 0x3a, 0x38, 0x49,
+ 0x36, 0x3c, 0x40, 0x49, 0x53, 0x56, 0x51, 0x5e, 0x60, 0x47, 0x56, 0x56,
+ 0x59, 0x68, 0x6a, 0x7c, 0x8a, 0x91, 0x5e, 0x6e, 0x7c, 0x3e, 0x4f, 0x62,
+ 0x52, 0x66, 0x66, 0xa9, 0xb6, 0xb9, 0xac, 0xb0, 0xb6, 0x8d, 0x99, 0x9f,
+ 0x6f, 0x82, 0x96, 0x4d, 0x61, 0x80, 0x3f, 0x4c, 0x5c, 0x64, 0x6a, 0x64,
+ 0x96, 0x9a, 0x92, 0x70, 0x76, 0x72, 0x31, 0x3a, 0x43, 0x27, 0x30, 0x43,
+ 0x26, 0x32, 0x48, 0x26, 0x32, 0x4a, 0x36, 0x43, 0x55, 0x55, 0x61, 0x74,
+ 0x31, 0x4c, 0x6f, 0x18, 0x32, 0x4d, 0x52, 0x66, 0x75, 0x89, 0x99, 0xa1,
+ 0x94, 0xa1, 0xab, 0xa6, 0xb5, 0xc2, 0x87, 0x98, 0xac, 0x7c, 0x8e, 0xa6,
+ 0x33, 0x49, 0x6a, 0x17, 0x26, 0x43, 0x3e, 0x49, 0x51, 0x89, 0x94, 0x8a,
+ 0xc3, 0xcf, 0xcb, 0xa6, 0xb2, 0xc0, 0x70, 0x81, 0x95, 0x5d, 0x70, 0x7e,
+ 0x4f, 0x55, 0x65, 0x23, 0x28, 0x38, 0x15, 0x1b, 0x28, 0x25, 0x2a, 0x31,
+ 0x22, 0x27, 0x28, 0x3e, 0x42, 0x3b, 0x63, 0x62, 0x58, 0x60, 0x5e, 0x54,
+ 0x5d, 0x5b, 0x4f, 0x5e, 0x5c, 0x51, 0x56, 0x54, 0x4d, 0x52, 0x51, 0x4d,
+ 0x52, 0x52, 0x52, 0x36, 0x36, 0x3a, 0x1c, 0x1b, 0x21, 0x1e, 0x1d, 0x24,
+ 0x1a, 0x1e, 0x2a, 0x21, 0x25, 0x2e, 0x3c, 0x40, 0x40, 0x90, 0x91, 0x8a,
+ 0x9d, 0x9f, 0x94, 0x71, 0x73, 0x6e, 0x5b, 0x5c, 0x62, 0x3d, 0x3f, 0x4c,
+ 0x28, 0x31, 0x3b, 0x1c, 0x26, 0x34, 0x16, 0x23, 0x36, 0x13, 0x22, 0x38,
+ 0x17, 0x26, 0x3c, 0x20, 0x31, 0x46, 0x42, 0x56, 0x6a, 0x46, 0x5c, 0x70,
+ 0x2a, 0x36, 0x48, 0x13, 0x1e, 0x30, 0x1f, 0x27, 0x3e, 0x30, 0x3a, 0x52,
+ 0x2f, 0x3b, 0x51, 0x49, 0x55, 0x66, 0x1c, 0x28, 0x2f, 0x1d, 0x26, 0x28,
+ 0x1f, 0x20, 0x23, 0x2b, 0x2d, 0x28, 0x2b, 0x30, 0x2e, 0x18, 0x1b, 0x28,
+ 0x13, 0x18, 0x2b, 0x15, 0x1d, 0x28, 0x15, 0x1e, 0x2e, 0x17, 0x22, 0x3d,
+ 0x11, 0x25, 0x36, 0x1b, 0x31, 0x43, 0x35, 0x4a, 0x64, 0x52, 0x66, 0x85,
+ 0x5c, 0x6d, 0x89, 0x47, 0x55, 0x6a, 0x41, 0x4b, 0x58, 0x3f, 0x46, 0x4d,
+ 0x38, 0x3c, 0x48, 0x28, 0x2c, 0x38, 0x26, 0x29, 0x37, 0x29, 0x2a, 0x3a,
+ 0x28, 0x29, 0x3b, 0x1d, 0x20, 0x2f, 0x1d, 0x22, 0x2b, 0x1b, 0x20, 0x24,
+ 0x1a, 0x1d, 0x25, 0x13, 0x16, 0x1d, 0x11, 0x13, 0x18, 0x0d, 0x0e, 0x12,
+ 0x0d, 0x0d, 0x0f, 0x0e, 0x0f, 0x11, 0x0d, 0x0d, 0x10, 0x0e, 0x0f, 0x11,
+ 0x0e, 0x12, 0x13, 0x19, 0x1d, 0x1e, 0x39, 0x3d, 0x3f, 0x1d, 0x22, 0x25,
+ 0x14, 0x19, 0x1c, 0x12, 0x15, 0x1a, 0x17, 0x1b, 0x1f, 0x1b, 0x1f, 0x23,
+ 0x20, 0x25, 0x2d, 0x25, 0x2a, 0x35, 0x27, 0x2b, 0x36, 0x29, 0x2d, 0x36,
+ 0x29, 0x2e, 0x34, 0x3b, 0x40, 0x46, 0x3a, 0x41, 0x49, 0x2c, 0x33, 0x3e,
+ 0x35, 0x3e, 0x45, 0x4c, 0x58, 0x64, 0x52, 0x62, 0x71, 0x4e, 0x5c, 0x69,
+ 0x45, 0x4e, 0x58, 0x3a, 0x3e, 0x47, 0x32, 0x38, 0x42, 0x2a, 0x33, 0x3f,
+ 0x27, 0x2a, 0x31, 0x22, 0x22, 0x29, 0x20, 0x20, 0x28, 0x29, 0x2a, 0x2f,
+ 0x32, 0x33, 0x35, 0x32, 0x35, 0x33, 0x2d, 0x2f, 0x2e, 0x28, 0x29, 0x2b,
+ 0x24, 0x2c, 0x2d, 0x33, 0x3c, 0x3f, 0x44, 0x4e, 0x54, 0x3a, 0x45, 0x4b,
+ 0x2f, 0x34, 0x3c, 0x2f, 0x34, 0x3a, 0x2f, 0x34, 0x37, 0x2d, 0x33, 0x33,
+ 0x25, 0x2b, 0x2b, 0x24, 0x29, 0x2b, 0x40, 0x48, 0x4c, 0x4a, 0x53, 0x5a,
+ 0x37, 0x3f, 0x47, 0x28, 0x2e, 0x34, 0x25, 0x2a, 0x2d, 0x37, 0x3b, 0x3c,
+ 0x3b, 0x41, 0x41, 0x36, 0x3e, 0x3f, 0x35, 0x3f, 0x40, 0x2f, 0x3a, 0x3a,
+ 0x2f, 0x36, 0x36, 0x2e, 0x31, 0x35, 0x26, 0x2a, 0x2f, 0x23, 0x27, 0x30,
+ 0x31, 0x3b, 0x3d, 0x44, 0x4d, 0x54, 0x40, 0x4a, 0x54, 0x35, 0x3e, 0x45,
+ 0x2f, 0x35, 0x3b, 0x27, 0x2d, 0x30, 0x29, 0x30, 0x33, 0x46, 0x51, 0x56,
+ 0x49, 0x5a, 0x6b, 0x3a, 0x42, 0x4e, 0x2c, 0x2d, 0x32, 0x23, 0x22, 0x2a,
+ 0x2f, 0x36, 0x44, 0x44, 0x51, 0x62, 0x49, 0x57, 0x66, 0x3a, 0x45, 0x51,
+ 0x33, 0x37, 0x43, 0x31, 0x35, 0x40, 0x30, 0x33, 0x3c, 0x2f, 0x32, 0x39,
+ 0x30, 0x33, 0x38, 0x2f, 0x34, 0x37, 0x2d, 0x32, 0x35, 0x30, 0x36, 0x37,
+ 0x2a, 0x32, 0x34, 0x2b, 0x33, 0x35, 0x2f, 0x34, 0x39, 0x2d, 0x32, 0x36,
+ 0x32, 0x36, 0x3b, 0x2e, 0x33, 0x36, 0x2c, 0x32, 0x32, 0x2d, 0x33, 0x32,
+ 0x2e, 0x32, 0x3a, 0x2f, 0x33, 0x3a, 0x2e, 0x33, 0x37, 0x2b, 0x33, 0x35,
+ 0x2a, 0x32, 0x34, 0x2b, 0x31, 0x33, 0x2a, 0x2f, 0x32, 0x2b, 0x2f, 0x33,
+ 0x2b, 0x31, 0x31, 0x2b, 0x30, 0x31, 0x28, 0x2b, 0x2e, 0x20, 0x21, 0x25,
+ 0x1a, 0x1b, 0x1e, 0x14, 0x15, 0x19, 0x12, 0x13, 0x18, 0x14, 0x15, 0x19,
+ 0x15, 0x15, 0x17, 0x13, 0x14, 0x16, 0x11, 0x14, 0x15, 0x10, 0x14, 0x14,
+ 0x10, 0x16, 0x14, 0x0d, 0x13, 0x13, 0x23, 0x28, 0x28, 0x37, 0x3d, 0x3d,
+ 0x17, 0x46, 0x77, 0x20, 0x4b, 0x7e, 0x1e, 0x46, 0x7f, 0x1a, 0x42, 0x7f,
+ 0x17, 0x42, 0x7f, 0x1e, 0x4b, 0x83, 0x27, 0x4e, 0x80, 0x2e, 0x51, 0x7e,
+ 0x1e, 0x48, 0x78, 0x1a, 0x44, 0x76, 0x1b, 0x45, 0x78, 0x1c, 0x44, 0x77,
+ 0x20, 0x49, 0x75, 0x1f, 0x48, 0x74, 0x1d, 0x43, 0x78, 0x21, 0x45, 0x81,
+ 0x22, 0x46, 0x7d, 0x21, 0x44, 0x76, 0x0f, 0x33, 0x60, 0x34, 0x53, 0x81,
+ 0x2f, 0x4d, 0x7b, 0x19, 0x44, 0x76, 0x20, 0x4a, 0x77, 0x4e, 0x59, 0x74,
+ 0x93, 0x76, 0x6d, 0xa4, 0x82, 0x70, 0x88, 0x71, 0x5d, 0x74, 0x70, 0x67,
+ 0x85, 0x8f, 0x90, 0x8f, 0x95, 0x97, 0x67, 0x68, 0x64, 0x71, 0x71, 0x69,
+ 0xa1, 0x87, 0x78, 0x9f, 0x7b, 0x73, 0x3f, 0x51, 0x72, 0x1c, 0x45, 0x82,
+ 0x25, 0x4d, 0x84, 0x1a, 0x47, 0x78, 0x28, 0x46, 0x73, 0x1b, 0x43, 0x70,
+ 0x1a, 0x3d, 0x79, 0x2a, 0x48, 0x76, 0x6c, 0x8a, 0xa7, 0x6d, 0x8d, 0xa7,
+ 0x28, 0x4c, 0x6d, 0x22, 0x43, 0x6c, 0x21, 0x38, 0x5e, 0x23, 0x33, 0x54,
+ 0x25, 0x40, 0x67, 0x1f, 0x36, 0x5c, 0x1d, 0x31, 0x56, 0x1d, 0x30, 0x58,
+ 0x29, 0x3f, 0x68, 0x2c, 0x4a, 0x74, 0x23, 0x46, 0x70, 0x21, 0x47, 0x6d,
+ 0x5c, 0x7a, 0x9a, 0x78, 0x90, 0xb1, 0x46, 0x61, 0x82, 0x24, 0x48, 0x69,
+ 0x24, 0x49, 0x6b, 0x88, 0xa7, 0xc7, 0x47, 0x63, 0x7c, 0x2a, 0x48, 0x59,
+ 0x42, 0x4d, 0x5e, 0x4b, 0x60, 0x79, 0x1f, 0x40, 0x63, 0x14, 0x36, 0x5d,
+ 0x14, 0x2e, 0x54, 0x13, 0x25, 0x44, 0x19, 0x29, 0x42, 0x18, 0x27, 0x3f,
+ 0x36, 0x40, 0x53, 0x9d, 0xb0, 0xc2, 0x6b, 0x86, 0x9a, 0x3a, 0x55, 0x6e,
+ 0x0d, 0x2b, 0x49, 0x1f, 0x40, 0x5f, 0x57, 0x6f, 0x92, 0x3d, 0x4b, 0x71,
+ 0x38, 0x4a, 0x60, 0x1f, 0x2e, 0x45, 0xa2, 0xac, 0xb9, 0xbc, 0xc1, 0xba,
+ 0x92, 0x94, 0x86, 0x8c, 0x8c, 0x85, 0x89, 0x88, 0x85, 0x6f, 0x6f, 0x66,
+ 0x42, 0x41, 0x3c, 0x52, 0x52, 0x48, 0x53, 0x54, 0x45, 0x3e, 0x3f, 0x34,
+ 0x28, 0x27, 0x24, 0x21, 0x23, 0x26, 0x2a, 0x34, 0x35, 0x24, 0x32, 0x32,
+ 0x1c, 0x29, 0x31, 0x2f, 0x3b, 0x44, 0x44, 0x50, 0x55, 0x58, 0x63, 0x64,
+ 0x84, 0x8e, 0x8f, 0x83, 0x90, 0x94, 0x62, 0x74, 0x83, 0x3d, 0x52, 0x68,
+ 0x4f, 0x60, 0x64, 0x9b, 0xa8, 0xaf, 0x74, 0x81, 0x8f, 0x5c, 0x6c, 0x7f,
+ 0x5b, 0x6d, 0x81, 0x4f, 0x5a, 0x67, 0x79, 0x74, 0x70, 0x98, 0x87, 0x76,
+ 0xa8, 0x9d, 0x7f, 0xa8, 0xa8, 0x94, 0x3f, 0x4b, 0x48, 0x26, 0x34, 0x3c,
+ 0x1f, 0x2c, 0x36, 0x20, 0x2a, 0x37, 0x2a, 0x36, 0x48, 0x4d, 0x5d, 0x76,
+ 0x2f, 0x4b, 0x68, 0x55, 0x6c, 0x7f, 0x9c, 0xaf, 0xbe, 0x55, 0x66, 0x7f,
+ 0x37, 0x4b, 0x68, 0x8e, 0xa7, 0xba, 0x90, 0xa7, 0xb7, 0x75, 0x85, 0x9d,
+ 0x7d, 0x8e, 0xa3, 0x28, 0x37, 0x3e, 0x68, 0x73, 0x6b, 0xea, 0xee, 0xe2,
+ 0xff, 0xff, 0xfe, 0xd2, 0xd3, 0xdf, 0x82, 0x8a, 0x9d, 0x56, 0x64, 0x77,
+ 0x33, 0x39, 0x45, 0x16, 0x1d, 0x2f, 0x12, 0x1b, 0x2c, 0x1a, 0x26, 0x26,
+ 0x6b, 0x74, 0x61, 0xab, 0xaf, 0x97, 0x92, 0x90, 0x85, 0x69, 0x62, 0x68,
+ 0x61, 0x5e, 0x61, 0x5d, 0x59, 0x53, 0x5b, 0x57, 0x4b, 0x4c, 0x4a, 0x40,
+ 0x28, 0x2b, 0x28, 0x1a, 0x1f, 0x23, 0x17, 0x19, 0x20, 0x1a, 0x17, 0x1d,
+ 0x27, 0x23, 0x29, 0x43, 0x42, 0x44, 0x5c, 0x5d, 0x55, 0x6d, 0x6f, 0x62,
+ 0xa8, 0xac, 0x9d, 0xa2, 0xa3, 0x9a, 0x7f, 0x7f, 0x7e, 0x63, 0x62, 0x68,
+ 0x3d, 0x43, 0x44, 0x3c, 0x46, 0x4a, 0x2a, 0x39, 0x44, 0x1a, 0x2a, 0x3e,
+ 0x1e, 0x2e, 0x46, 0x22, 0x32, 0x4b, 0x19, 0x25, 0x40, 0x20, 0x2b, 0x45,
+ 0x27, 0x33, 0x44, 0x1e, 0x2a, 0x42, 0x22, 0x2d, 0x4d, 0x1c, 0x25, 0x3e,
+ 0x3e, 0x43, 0x4d, 0x79, 0x7c, 0x7c, 0x59, 0x5a, 0x58, 0x30, 0x30, 0x33,
+ 0x26, 0x20, 0x2b, 0x2e, 0x30, 0x34, 0x1d, 0x25, 0x2a, 0x1e, 0x26, 0x31,
+ 0x1d, 0x25, 0x31, 0x31, 0x3a, 0x40, 0x42, 0x4b, 0x5b, 0x22, 0x2b, 0x4a,
+ 0x25, 0x33, 0x4f, 0x18, 0x26, 0x3a, 0x0c, 0x1b, 0x35, 0x0f, 0x21, 0x3a,
+ 0x1e, 0x33, 0x50, 0x32, 0x46, 0x6a, 0x53, 0x66, 0x7e, 0x4d, 0x5e, 0x75,
+ 0x4a, 0x5b, 0x73, 0x40, 0x4e, 0x6f, 0x36, 0x40, 0x62, 0x30, 0x38, 0x4c,
+ 0x2e, 0x37, 0x40, 0x2d, 0x33, 0x41, 0x1f, 0x25, 0x35, 0x14, 0x1a, 0x24,
+ 0x0f, 0x15, 0x14, 0x0d, 0x11, 0x1b, 0x0d, 0x11, 0x1c, 0x0b, 0x10, 0x14,
+ 0x0c, 0x10, 0x14, 0x0d, 0x0f, 0x1b, 0x0d, 0x10, 0x1b, 0x0f, 0x13, 0x14,
+ 0x13, 0x18, 0x13, 0x44, 0x4a, 0x4c, 0x38, 0x3e, 0x48, 0x15, 0x1c, 0x26,
+ 0x10, 0x18, 0x1c, 0x10, 0x19, 0x18, 0x14, 0x1a, 0x1c, 0x1c, 0x1e, 0x28,
+ 0x26, 0x2b, 0x38, 0x28, 0x30, 0x3b, 0x28, 0x32, 0x3b, 0x28, 0x32, 0x3b,
+ 0x2a, 0x34, 0x3d, 0x2f, 0x38, 0x41, 0x2f, 0x36, 0x3e, 0x2e, 0x35, 0x3d,
+ 0x2e, 0x37, 0x3f, 0x3c, 0x46, 0x52, 0x51, 0x5f, 0x6e, 0x4e, 0x5e, 0x6e,
+ 0x4f, 0x5c, 0x6d, 0x44, 0x4d, 0x5a, 0x35, 0x3b, 0x45, 0x2b, 0x2e, 0x35,
+ 0x22, 0x23, 0x25, 0x25, 0x26, 0x2a, 0x2a, 0x2f, 0x35, 0x2e, 0x34, 0x3a,
+ 0x2d, 0x34, 0x36, 0x2a, 0x30, 0x30, 0x24, 0x28, 0x29, 0x24, 0x24, 0x28,
+ 0x29, 0x29, 0x2e, 0x31, 0x35, 0x38, 0x3c, 0x41, 0x45, 0x39, 0x3e, 0x43,
+ 0x34, 0x37, 0x3c, 0x32, 0x34, 0x39, 0x2f, 0x33, 0x36, 0x2d, 0x32, 0x35,
+ 0x2a, 0x2b, 0x31, 0x25, 0x28, 0x2d, 0x37, 0x3c, 0x40, 0x3d, 0x43, 0x49,
+ 0x2f, 0x32, 0x3b, 0x28, 0x29, 0x30, 0x26, 0x2a, 0x2d, 0x30, 0x35, 0x34,
+ 0x36, 0x41, 0x41, 0x31, 0x3d, 0x3d, 0x2d, 0x37, 0x39, 0x2f, 0x38, 0x3d,
+ 0x2f, 0x36, 0x3b, 0x2c, 0x31, 0x37, 0x22, 0x25, 0x2a, 0x22, 0x26, 0x29,
+ 0x37, 0x3f, 0x44, 0x49, 0x52, 0x5d, 0x43, 0x4c, 0x5b, 0x36, 0x3f, 0x4a,
+ 0x30, 0x38, 0x39, 0x2c, 0x30, 0x2d, 0x28, 0x2c, 0x2d, 0x3a, 0x41, 0x46,
+ 0x3e, 0x4e, 0x59, 0x30, 0x39, 0x44, 0x27, 0x27, 0x33, 0x28, 0x26, 0x2f,
+ 0x29, 0x2f, 0x33, 0x3c, 0x4a, 0x4d, 0x4d, 0x5d, 0x68, 0x45, 0x54, 0x64,
+ 0x37, 0x3e, 0x4a, 0x31, 0x35, 0x40, 0x31, 0x32, 0x3b, 0x30, 0x31, 0x36,
+ 0x2e, 0x32, 0x35, 0x2d, 0x32, 0x35, 0x2f, 0x34, 0x37, 0x31, 0x36, 0x39,
+ 0x32, 0x34, 0x39, 0x32, 0x35, 0x3a, 0x32, 0x35, 0x3a, 0x31, 0x34, 0x39,
+ 0x33, 0x36, 0x3b, 0x2d, 0x32, 0x36, 0x2d, 0x32, 0x36, 0x30, 0x35, 0x3a,
+ 0x2f, 0x32, 0x38, 0x2f, 0x30, 0x36, 0x2f, 0x30, 0x34, 0x2b, 0x2e, 0x32,
+ 0x2b, 0x2f, 0x31, 0x2b, 0x30, 0x30, 0x2c, 0x32, 0x30, 0x2b, 0x33, 0x31,
+ 0x2e, 0x30, 0x34, 0x2b, 0x2c, 0x31, 0x24, 0x25, 0x29, 0x1e, 0x1f, 0x21,
+ 0x21, 0x22, 0x24, 0x24, 0x23, 0x27, 0x1e, 0x1d, 0x23, 0x16, 0x16, 0x1b,
+ 0x11, 0x15, 0x16, 0x11, 0x15, 0x16, 0x10, 0x14, 0x15, 0x11, 0x15, 0x16,
+ 0x0f, 0x13, 0x14, 0x0e, 0x12, 0x13, 0x10, 0x12, 0x14, 0x0f, 0x10, 0x12,
+ 0x21, 0x49, 0x7b, 0x21, 0x4a, 0x7f, 0x1c, 0x47, 0x7e, 0x19, 0x46, 0x7c,
+ 0x17, 0x45, 0x77, 0x1f, 0x4c, 0x7b, 0x2f, 0x57, 0x85, 0x28, 0x4e, 0x7b,
+ 0x1b, 0x46, 0x76, 0x1c, 0x45, 0x79, 0x1c, 0x45, 0x79, 0x18, 0x41, 0x73,
+ 0x20, 0x49, 0x77, 0x21, 0x4a, 0x77, 0x1d, 0x44, 0x7a, 0x20, 0x48, 0x82,
+ 0x21, 0x49, 0x79, 0x2a, 0x46, 0x7e, 0x23, 0x46, 0x7b, 0x26, 0x56, 0x85,
+ 0x21, 0x4d, 0x81, 0x26, 0x47, 0x75, 0x56, 0x60, 0x71, 0x93, 0x7a, 0x73,
+ 0xac, 0x85, 0x71, 0x86, 0x72, 0x65, 0x73, 0x75, 0x71, 0xaa, 0xb3, 0xb3,
+ 0xcc, 0xcf, 0xd3, 0xc1, 0xbf, 0xc2, 0x82, 0x82, 0x7c, 0x6f, 0x72, 0x60,
+ 0x9d, 0x85, 0x72, 0xa6, 0x7f, 0x72, 0x4e, 0x57, 0x6c, 0x25, 0x44, 0x76,
+ 0x26, 0x49, 0x7b, 0x1d, 0x4c, 0x7c, 0x2d, 0x50, 0x7e, 0x19, 0x46, 0x73,
+ 0x31, 0x54, 0x7b, 0x74, 0x92, 0xb2, 0x75, 0x92, 0xad, 0x2d, 0x4e, 0x71,
+ 0x1f, 0x43, 0x72, 0x1b, 0x3f, 0x71, 0x19, 0x36, 0x64, 0x17, 0x2d, 0x56,
+ 0x1e, 0x34, 0x5b, 0x23, 0x37, 0x5e, 0x25, 0x38, 0x60, 0x1d, 0x33, 0x5a,
+ 0x19, 0x31, 0x59, 0x1f, 0x3b, 0x60, 0x2d, 0x4a, 0x6b, 0x5d, 0x7a, 0x96,
+ 0x8b, 0xa6, 0xb8, 0x97, 0xb0, 0xcb, 0x32, 0x50, 0x77, 0x19, 0x3f, 0x6c,
+ 0x1d, 0x43, 0x70, 0x71, 0x8f, 0xb8, 0x68, 0x86, 0xa5, 0x1e, 0x42, 0x53,
+ 0x1e, 0x32, 0x39, 0x3f, 0x56, 0x67, 0x1f, 0x39, 0x5a, 0x18, 0x2e, 0x55,
+ 0x1c, 0x28, 0x50, 0x20, 0x27, 0x49, 0x1c, 0x27, 0x42, 0x17, 0x26, 0x3e,
+ 0x47, 0x5a, 0x72, 0xae, 0xbd, 0xd7, 0x3a, 0x4a, 0x67, 0x1b, 0x33, 0x4e,
+ 0x0b, 0x24, 0x3f, 0x4b, 0x5f, 0x7b, 0x58, 0x6d, 0x87, 0x13, 0x2e, 0x44,
+ 0x1e, 0x2e, 0x47, 0x27, 0x32, 0x4c, 0x82, 0x8b, 0x9c, 0xcf, 0xd6, 0xd3,
+ 0xc9, 0xcc, 0xc3, 0x94, 0x93, 0x8e, 0x8e, 0x8b, 0x85, 0x8f, 0x8d, 0x80,
+ 0x72, 0x70, 0x64, 0x4f, 0x4f, 0x45, 0x3a, 0x3a, 0x32, 0x29, 0x29, 0x23,
+ 0x24, 0x24, 0x20, 0x1c, 0x1d, 0x1d, 0x23, 0x2a, 0x2e, 0x1c, 0x29, 0x2f,
+ 0x1f, 0x29, 0x33, 0x3a, 0x46, 0x4a, 0x53, 0x62, 0x5f, 0x81, 0x8d, 0x8b,
+ 0x80, 0x8b, 0x8f, 0x57, 0x63, 0x6d, 0x4c, 0x5c, 0x6a, 0x3f, 0x52, 0x60,
+ 0x49, 0x59, 0x65, 0x5b, 0x63, 0x77, 0x4d, 0x54, 0x6d, 0x5a, 0x63, 0x77,
+ 0x60, 0x6f, 0x6f, 0x6f, 0x7a, 0x65, 0x92, 0x8f, 0x6f, 0xa0, 0x91, 0x6f,
+ 0x8e, 0x84, 0x6f, 0x66, 0x66, 0x5d, 0x3b, 0x45, 0x47, 0x2f, 0x3d, 0x47,
+ 0x25, 0x31, 0x3d, 0x27, 0x31, 0x3c, 0x2e, 0x3b, 0x4a, 0x45, 0x57, 0x69,
+ 0x39, 0x59, 0x68, 0x95, 0xaf, 0xba, 0x5f, 0x71, 0x83, 0x23, 0x34, 0x54,
+ 0x1e, 0x30, 0x54, 0x45, 0x5b, 0x72, 0x96, 0xa9, 0xb5, 0x89, 0x99, 0xa7,
+ 0x85, 0x9a, 0xb3, 0x61, 0x75, 0x85, 0x5a, 0x69, 0x6f, 0xe4, 0xec, 0xec,
+ 0xff, 0xff, 0xff, 0xe1, 0xe0, 0xea, 0x7a, 0x7e, 0x94, 0x49, 0x53, 0x6b,
+ 0x23, 0x2a, 0x3e, 0x1d, 0x25, 0x3d, 0x1f, 0x2a, 0x40, 0x25, 0x32, 0x3c,
+ 0xb7, 0xc1, 0xbb, 0xf5, 0xfa, 0xec, 0xce, 0xcf, 0xc6, 0x8c, 0x8a, 0x8a,
+ 0x5f, 0x60, 0x65, 0x54, 0x53, 0x51, 0x50, 0x4d, 0x45, 0x2e, 0x2f, 0x28,
+ 0x19, 0x1e, 0x1c, 0x15, 0x1c, 0x20, 0x15, 0x19, 0x1e, 0x1a, 0x19, 0x1a,
+ 0x44, 0x44, 0x36, 0x64, 0x65, 0x53, 0x66, 0x68, 0x52, 0x5b, 0x5c, 0x46,
+ 0x6c, 0x6d, 0x5b, 0x92, 0x93, 0x89, 0x9c, 0x9c, 0x9c, 0x56, 0x56, 0x5c,
+ 0x36, 0x38, 0x3f, 0x4b, 0x50, 0x58, 0x37, 0x3f, 0x4a, 0x2e, 0x3a, 0x4a,
+ 0x2f, 0x3c, 0x4d, 0x26, 0x31, 0x43, 0x24, 0x2c, 0x3f, 0x29, 0x2f, 0x41,
+ 0x25, 0x2e, 0x40, 0x25, 0x30, 0x48, 0x25, 0x31, 0x4c, 0x17, 0x23, 0x33,
+ 0x50, 0x5a, 0x5c, 0xa3, 0xa9, 0xa7, 0xa2, 0xa5, 0xa8, 0x4d, 0x4d, 0x59,
+ 0x26, 0x28, 0x3b, 0x36, 0x3e, 0x4b, 0x1f, 0x28, 0x39, 0x25, 0x2d, 0x42,
+ 0x26, 0x2d, 0x3b, 0x46, 0x4e, 0x51, 0x74, 0x7c, 0x7e, 0x49, 0x50, 0x5b,
+ 0x25, 0x2f, 0x47, 0x14, 0x20, 0x32, 0x10, 0x1c, 0x35, 0x0e, 0x1f, 0x34,
+ 0x09, 0x20, 0x39, 0x1b, 0x32, 0x51, 0x6d, 0x84, 0x94, 0x56, 0x6c, 0x7e,
+ 0x26, 0x3b, 0x58, 0x17, 0x2a, 0x4e, 0x1a, 0x28, 0x4a, 0x14, 0x22, 0x34,
+ 0x15, 0x23, 0x2c, 0x17, 0x23, 0x31, 0x12, 0x1d, 0x2f, 0x0c, 0x18, 0x27,
+ 0x09, 0x14, 0x19, 0x0c, 0x15, 0x21, 0x12, 0x19, 0x28, 0x10, 0x17, 0x1e,
+ 0x0f, 0x16, 0x1c, 0x11, 0x17, 0x22, 0x12, 0x16, 0x22, 0x0f, 0x15, 0x17,
+ 0x2e, 0x36, 0x36, 0x5e, 0x65, 0x6d, 0x24, 0x2a, 0x39, 0x1c, 0x22, 0x2e,
+ 0x10, 0x17, 0x1c, 0x11, 0x18, 0x18, 0x17, 0x1c, 0x20, 0x1d, 0x22, 0x2a,
+ 0x24, 0x2b, 0x37, 0x27, 0x2f, 0x3a, 0x26, 0x2f, 0x3a, 0x2a, 0x34, 0x3e,
+ 0x2e, 0x38, 0x41, 0x2e, 0x37, 0x40, 0x2a, 0x33, 0x3b, 0x30, 0x38, 0x40,
+ 0x30, 0x39, 0x43, 0x31, 0x3b, 0x47, 0x44, 0x52, 0x61, 0x51, 0x5f, 0x70,
+ 0x54, 0x61, 0x72, 0x4e, 0x58, 0x67, 0x38, 0x3e, 0x4a, 0x27, 0x2b, 0x34,
+ 0x2c, 0x2d, 0x2f, 0x33, 0x36, 0x3b, 0x37, 0x3c, 0x42, 0x33, 0x38, 0x3e,
+ 0x2d, 0x32, 0x36, 0x27, 0x2b, 0x2e, 0x1e, 0x20, 0x24, 0x21, 0x21, 0x26,
+ 0x2a, 0x2b, 0x2f, 0x33, 0x37, 0x3a, 0x34, 0x39, 0x3d, 0x35, 0x3a, 0x3e,
+ 0x31, 0x34, 0x39, 0x2f, 0x32, 0x37, 0x2d, 0x31, 0x35, 0x2f, 0x33, 0x37,
+ 0x30, 0x31, 0x36, 0x26, 0x2a, 0x2d, 0x27, 0x2c, 0x2f, 0x2c, 0x31, 0x35,
+ 0x2b, 0x2e, 0x35, 0x2a, 0x2a, 0x32, 0x2c, 0x30, 0x33, 0x2d, 0x33, 0x31,
+ 0x30, 0x38, 0x39, 0x2f, 0x37, 0x39, 0x2d, 0x34, 0x38, 0x30, 0x35, 0x3a,
+ 0x2e, 0x33, 0x39, 0x28, 0x2b, 0x30, 0x1f, 0x22, 0x27, 0x26, 0x28, 0x2b,
+ 0x38, 0x40, 0x45, 0x54, 0x5e, 0x69, 0x49, 0x56, 0x66, 0x39, 0x44, 0x51,
+ 0x30, 0x37, 0x3c, 0x2c, 0x32, 0x32, 0x29, 0x2f, 0x2f, 0x2b, 0x30, 0x35,
+ 0x2d, 0x36, 0x3f, 0x28, 0x2f, 0x39, 0x2c, 0x2f, 0x38, 0x2d, 0x30, 0x37,
+ 0x2b, 0x30, 0x34, 0x36, 0x3f, 0x44, 0x46, 0x53, 0x5d, 0x4c, 0x5a, 0x67,
+ 0x3d, 0x46, 0x53, 0x35, 0x3a, 0x46, 0x30, 0x33, 0x3c, 0x32, 0x33, 0x3a,
+ 0x30, 0x33, 0x38, 0x2d, 0x32, 0x35, 0x2d, 0x32, 0x35, 0x2f, 0x34, 0x37,
+ 0x32, 0x35, 0x3a, 0x35, 0x38, 0x3d, 0x32, 0x35, 0x3a, 0x30, 0x33, 0x38,
+ 0x30, 0x33, 0x38, 0x2e, 0x33, 0x37, 0x2e, 0x33, 0x37, 0x2e, 0x33, 0x38,
+ 0x32, 0x35, 0x3b, 0x2c, 0x2e, 0x35, 0x27, 0x2a, 0x31, 0x29, 0x2c, 0x31,
+ 0x2a, 0x2d, 0x31, 0x2a, 0x2f, 0x32, 0x2a, 0x2f, 0x32, 0x2c, 0x31, 0x34,
+ 0x2d, 0x31, 0x34, 0x29, 0x2c, 0x2f, 0x1e, 0x22, 0x23, 0x1f, 0x23, 0x24,
+ 0x33, 0x37, 0x38, 0x42, 0x46, 0x47, 0x33, 0x34, 0x38, 0x1c, 0x1d, 0x21,
+ 0x15, 0x19, 0x1a, 0x10, 0x14, 0x16, 0x12, 0x16, 0x17, 0x11, 0x15, 0x17,
+ 0x11, 0x15, 0x16, 0x0f, 0x13, 0x14, 0x12, 0x14, 0x16, 0x12, 0x12, 0x15,
+ 0x22, 0x43, 0x79, 0x1f, 0x47, 0x7d, 0x1b, 0x48, 0x7d, 0x27, 0x55, 0x83,
+ 0x3d, 0x67, 0x8a, 0x2f, 0x54, 0x78, 0x2c, 0x53, 0x7c, 0x23, 0x4d, 0x7c,
+ 0x1e, 0x48, 0x7a, 0x1f, 0x48, 0x7c, 0x1f, 0x48, 0x7c, 0x1d, 0x47, 0x79,
+ 0x22, 0x4c, 0x7c, 0x1f, 0x49, 0x79, 0x1e, 0x47, 0x7c, 0x1d, 0x46, 0x7f,
+ 0x1e, 0x49, 0x7a, 0x29, 0x47, 0x82, 0x24, 0x4d, 0x83, 0x1c, 0x54, 0x83,
+ 0x2f, 0x51, 0x81, 0x64, 0x65, 0x78, 0x99, 0x81, 0x6f, 0xa9, 0x7f, 0x68,
+ 0x89, 0x6d, 0x5c, 0x76, 0x72, 0x71, 0xa2, 0xad, 0xb9, 0xc0, 0xc4, 0xce,
+ 0xcb, 0xc6, 0xc1, 0xcc, 0xca, 0xb6, 0xb2, 0xb1, 0x9f, 0x94, 0x8d, 0x80,
+ 0xa3, 0x86, 0x6e, 0x9f, 0x7d, 0x70, 0x46, 0x4f, 0x64, 0x27, 0x48, 0x76,
+ 0x21, 0x46, 0x78, 0x19, 0x47, 0x78, 0x28, 0x4c, 0x76, 0x38, 0x62, 0x8a,
+ 0x78, 0x9a, 0xb2, 0x6b, 0x8a, 0xa8, 0x33, 0x50, 0x78, 0x1d, 0x3f, 0x70,
+ 0x1c, 0x44, 0x79, 0x1f, 0x48, 0x7b, 0x21, 0x45, 0x73, 0x24, 0x44, 0x6c,
+ 0x1e, 0x31, 0x57, 0x1b, 0x2e, 0x56, 0x1c, 0x2f, 0x57, 0x21, 0x37, 0x5e,
+ 0x1c, 0x33, 0x58, 0x08, 0x21, 0x3f, 0x53, 0x69, 0x82, 0xa6, 0xbd, 0xd1,
+ 0x4b, 0x65, 0x79, 0x76, 0x8f, 0xac, 0x5d, 0x7c, 0xa5, 0x14, 0x3e, 0x6e,
+ 0x1d, 0x44, 0x78, 0x48, 0x67, 0x98, 0x56, 0x76, 0x9d, 0x29, 0x4f, 0x6d,
+ 0x43, 0x65, 0x83, 0x22, 0x45, 0x64, 0x19, 0x37, 0x59, 0x16, 0x2b, 0x4b,
+ 0x1c, 0x29, 0x46, 0x20, 0x29, 0x49, 0x1e, 0x2e, 0x52, 0x17, 0x2f, 0x56,
+ 0x26, 0x42, 0x61, 0x7c, 0x8f, 0xae, 0x7d, 0x8d, 0xaa, 0x4a, 0x5b, 0x74,
+ 0x3c, 0x50, 0x68, 0x8d, 0x9d, 0xb6, 0x62, 0x77, 0x8f, 0x0c, 0x2a, 0x3f,
+ 0x1f, 0x2c, 0x46, 0x28, 0x30, 0x4e, 0x5e, 0x67, 0x7d, 0x8f, 0x99, 0x9e,
+ 0xc1, 0xc7, 0xc5, 0xc6, 0xc7, 0xc5, 0xa6, 0xa2, 0x9d, 0xa1, 0x9d, 0x91,
+ 0x91, 0x8f, 0x80, 0x4c, 0x4c, 0x44, 0x1f, 0x1f, 0x1f, 0x23, 0x25, 0x24,
+ 0x1b, 0x1d, 0x19, 0x15, 0x19, 0x16, 0x1d, 0x22, 0x27, 0x1f, 0x28, 0x34,
+ 0x2b, 0x31, 0x3c, 0x58, 0x64, 0x63, 0x63, 0x73, 0x6b, 0x6c, 0x7a, 0x77,
+ 0x81, 0x8b, 0x94, 0x4b, 0x54, 0x63, 0x3e, 0x4a, 0x55, 0x40, 0x4f, 0x54,
+ 0x6d, 0x7b, 0x84, 0x68, 0x70, 0x80, 0x4e, 0x50, 0x64, 0x59, 0x5b, 0x67,
+ 0x9a, 0xa1, 0x9e, 0xa9, 0xae, 0x9d, 0x88, 0x86, 0x6f, 0x8e, 0x83, 0x6e,
+ 0x63, 0x5b, 0x52, 0x31, 0x31, 0x32, 0x2b, 0x35, 0x3f, 0x32, 0x40, 0x4e,
+ 0x4d, 0x5b, 0x68, 0x7e, 0x8b, 0x95, 0x86, 0x93, 0x9e, 0x6b, 0x7d, 0x89,
+ 0x3d, 0x5b, 0x66, 0x94, 0xae, 0xb8, 0x67, 0x7a, 0x8b, 0x36, 0x47, 0x64,
+ 0x28, 0x39, 0x59, 0x2c, 0x3e, 0x54, 0x93, 0xa4, 0xb0, 0xb4, 0xc2, 0xce,
+ 0x92, 0xab, 0xbb, 0x96, 0xae, 0xbf, 0x61, 0x75, 0x83, 0x83, 0x91, 0x97,
+ 0xd7, 0xdb, 0xdc, 0xe4, 0xe9, 0xec, 0x81, 0x86, 0x91, 0x3e, 0x44, 0x5a,
+ 0x27, 0x31, 0x50, 0x29, 0x34, 0x52, 0x2d, 0x38, 0x52, 0x38, 0x45, 0x58,
+ 0x80, 0x8b, 0x96, 0xbe, 0xc5, 0xca, 0xeb, 0xf1, 0xef, 0xc1, 0xc6, 0xc1,
+ 0x7b, 0x7f, 0x87, 0x49, 0x4c, 0x4f, 0x32, 0x34, 0x33, 0x28, 0x2a, 0x29,
+ 0x22, 0x27, 0x29, 0x18, 0x1d, 0x21, 0x19, 0x1d, 0x1e, 0x3d, 0x3f, 0x3b,
+ 0x5b, 0x5e, 0x4a, 0x60, 0x64, 0x4e, 0x66, 0x66, 0x4f, 0x66, 0x64, 0x4f,
+ 0x61, 0x5f, 0x4f, 0x5c, 0x5b, 0x54, 0x53, 0x53, 0x53, 0x2a, 0x2b, 0x31,
+ 0x22, 0x21, 0x2d, 0x26, 0x26, 0x30, 0x1e, 0x22, 0x2b, 0x45, 0x4c, 0x52,
+ 0x53, 0x5a, 0x60, 0x35, 0x3b, 0x41, 0x38, 0x3a, 0x43, 0x43, 0x44, 0x4e,
+ 0x29, 0x2d, 0x41, 0x21, 0x2a, 0x3f, 0x17, 0x26, 0x39, 0x1c, 0x2e, 0x36,
+ 0x7a, 0x8a, 0x8b, 0x95, 0x9f, 0xa0, 0x77, 0x7d, 0x88, 0x2d, 0x30, 0x46,
+ 0x1c, 0x29, 0x33, 0x25, 0x33, 0x3a, 0x2b, 0x39, 0x47, 0x4f, 0x59, 0x70,
+ 0x24, 0x28, 0x3d, 0x25, 0x28, 0x2f, 0x49, 0x4c, 0x4d, 0x6e, 0x72, 0x77,
+ 0x2e, 0x37, 0x47, 0x11, 0x1b, 0x27, 0x10, 0x1b, 0x30, 0x11, 0x22, 0x34,
+ 0x11, 0x28, 0x3d, 0x21, 0x39, 0x53, 0x7e, 0x98, 0xa4, 0x76, 0x8f, 0x9b,
+ 0x63, 0x7c, 0x96, 0x34, 0x4b, 0x6e, 0x0e, 0x22, 0x45, 0x0b, 0x1d, 0x37,
+ 0x11, 0x21, 0x35, 0x14, 0x25, 0x39, 0x11, 0x22, 0x35, 0x0f, 0x1f, 0x2f,
+ 0x10, 0x20, 0x2d, 0x16, 0x23, 0x35, 0x15, 0x20, 0x32, 0x11, 0x1b, 0x27,
+ 0x12, 0x1c, 0x26, 0x13, 0x1b, 0x28, 0x14, 0x1c, 0x27, 0x12, 0x1c, 0x1f,
+ 0x61, 0x70, 0x78, 0x47, 0x53, 0x62, 0x15, 0x1c, 0x2f, 0x1f, 0x22, 0x31,
+ 0x16, 0x1b, 0x23, 0x15, 0x1b, 0x1d, 0x18, 0x1f, 0x24, 0x1e, 0x26, 0x30,
+ 0x24, 0x2c, 0x37, 0x29, 0x31, 0x3c, 0x29, 0x33, 0x3d, 0x2e, 0x38, 0x42,
+ 0x2d, 0x37, 0x41, 0x2e, 0x37, 0x40, 0x2d, 0x36, 0x3f, 0x2f, 0x38, 0x41,
+ 0x2f, 0x39, 0x42, 0x2f, 0x3b, 0x46, 0x30, 0x3e, 0x4d, 0x45, 0x52, 0x64,
+ 0x50, 0x5e, 0x6f, 0x50, 0x5a, 0x6a, 0x42, 0x49, 0x57, 0x2c, 0x32, 0x3d,
+ 0x30, 0x32, 0x38, 0x40, 0x43, 0x4a, 0x3e, 0x42, 0x4b, 0x2b, 0x2f, 0x38,
+ 0x22, 0x27, 0x2c, 0x21, 0x25, 0x28, 0x24, 0x25, 0x2a, 0x29, 0x29, 0x2e,
+ 0x31, 0x32, 0x35, 0x33, 0x38, 0x3b, 0x2f, 0x37, 0x39, 0x2d, 0x35, 0x38,
+ 0x2c, 0x31, 0x35, 0x2f, 0x33, 0x37, 0x2f, 0x33, 0x36, 0x31, 0x36, 0x37,
+ 0x30, 0x32, 0x33, 0x2b, 0x31, 0x31, 0x27, 0x30, 0x2f, 0x26, 0x2e, 0x30,
+ 0x2e, 0x33, 0x37, 0x2e, 0x31, 0x37, 0x2f, 0x33, 0x36, 0x2f, 0x35, 0x33,
+ 0x2e, 0x33, 0x34, 0x32, 0x36, 0x39, 0x2f, 0x33, 0x37, 0x2e, 0x31, 0x36,
+ 0x2b, 0x2c, 0x31, 0x23, 0x24, 0x29, 0x22, 0x23, 0x27, 0x2b, 0x2c, 0x30,
+ 0x34, 0x3d, 0x42, 0x50, 0x5a, 0x65, 0x51, 0x5d, 0x6e, 0x3f, 0x4b, 0x5b,
+ 0x32, 0x3b, 0x46, 0x2e, 0x35, 0x3a, 0x2a, 0x2f, 0x33, 0x23, 0x2a, 0x2e,
+ 0x26, 0x27, 0x2c, 0x33, 0x39, 0x42, 0x3b, 0x46, 0x4f, 0x34, 0x3c, 0x46,
+ 0x2c, 0x30, 0x39, 0x2c, 0x2e, 0x37, 0x3b, 0x44, 0x4b, 0x4d, 0x5c, 0x64,
+ 0x46, 0x51, 0x5f, 0x39, 0x3e, 0x4c, 0x30, 0x33, 0x3e, 0x30, 0x33, 0x3b,
+ 0x30, 0x34, 0x38, 0x2e, 0x34, 0x37, 0x2f, 0x34, 0x37, 0x2e, 0x32, 0x36,
+ 0x2d, 0x30, 0x35, 0x30, 0x33, 0x38, 0x2f, 0x32, 0x37, 0x2e, 0x31, 0x36,
+ 0x2d, 0x31, 0x36, 0x2d, 0x32, 0x36, 0x2c, 0x31, 0x35, 0x2c, 0x31, 0x35,
+ 0x2e, 0x31, 0x38, 0x2a, 0x2d, 0x35, 0x2b, 0x2e, 0x35, 0x2a, 0x2d, 0x34,
+ 0x2a, 0x2d, 0x33, 0x2b, 0x30, 0x36, 0x2b, 0x2f, 0x36, 0x2c, 0x31, 0x37,
+ 0x2c, 0x31, 0x34, 0x23, 0x29, 0x29, 0x18, 0x1e, 0x1e, 0x17, 0x1d, 0x1d,
+ 0x28, 0x2e, 0x2f, 0x41, 0x46, 0x47, 0x31, 0x37, 0x38, 0x18, 0x1d, 0x20,
+ 0x13, 0x17, 0x1a, 0x12, 0x16, 0x19, 0x12, 0x16, 0x19, 0x10, 0x14, 0x17,
+ 0x11, 0x15, 0x17, 0x0f, 0x13, 0x16, 0x11, 0x13, 0x17, 0x10, 0x10, 0x14,
+ 0x22, 0x4a, 0x7e, 0x1d, 0x48, 0x7e, 0x1a, 0x47, 0x7c, 0x45, 0x6c, 0x95,
+ 0x9a, 0xb6, 0xd4, 0x88, 0xa3, 0xbe, 0x2f, 0x52, 0x78, 0x1c, 0x48, 0x79,
+ 0x1f, 0x4a, 0x80, 0x1f, 0x4a, 0x7f, 0x1e, 0x49, 0x7c, 0x20, 0x4b, 0x7e,
+ 0x22, 0x4e, 0x7f, 0x1e, 0x49, 0x7c, 0x23, 0x4c, 0x81, 0x20, 0x49, 0x82,
+ 0x1e, 0x4b, 0x86, 0x22, 0x4b, 0x82, 0x1f, 0x50, 0x81, 0x33, 0x5a, 0x85,
+ 0x6f, 0x6d, 0x7e, 0xa6, 0x88, 0x75, 0xaa, 0x8e, 0x71, 0x90, 0x79, 0x6f,
+ 0x75, 0x77, 0x77, 0xa8, 0xac, 0xb3, 0xba, 0xb8, 0xbe, 0xd6, 0xcd, 0xc6,
+ 0xe2, 0xdd, 0xc3, 0xde, 0xdd, 0xbe, 0xc5, 0xbb, 0xa3, 0xa8, 0x91, 0x7d,
+ 0xae, 0x8f, 0x78, 0x83, 0x73, 0x74, 0x2d, 0x48, 0x6e, 0x1c, 0x47, 0x82,
+ 0x1f, 0x4a, 0x81, 0x1c, 0x46, 0x6f, 0x3f, 0x5d, 0x7e, 0x7e, 0xa1, 0xbf,
+ 0x62, 0x86, 0xa8, 0x25, 0x47, 0x72, 0x22, 0x43, 0x78, 0x21, 0x46, 0x7d,
+ 0x22, 0x4c, 0x7d, 0x1c, 0x49, 0x72, 0x21, 0x4b, 0x71, 0x30, 0x55, 0x7a,
+ 0x23, 0x3c, 0x65, 0x1b, 0x34, 0x5c, 0x19, 0x32, 0x57, 0x1a, 0x2e, 0x50,
+ 0x2f, 0x41, 0x60, 0x44, 0x58, 0x73, 0x62, 0x77, 0x92, 0x4d, 0x65, 0x80,
+ 0x17, 0x34, 0x58, 0x55, 0x6b, 0x90, 0x88, 0xa2, 0xc5, 0x1d, 0x45, 0x6c,
+ 0x17, 0x44, 0x74, 0x26, 0x4c, 0x80, 0x2a, 0x48, 0x75, 0x39, 0x57, 0x7b,
+ 0x4c, 0x6c, 0x92, 0x21, 0x40, 0x66, 0x15, 0x2f, 0x52, 0x15, 0x2a, 0x44,
+ 0x1c, 0x2d, 0x41, 0x16, 0x26, 0x3c, 0x17, 0x2c, 0x49, 0x10, 0x29, 0x4b,
+ 0x0d, 0x27, 0x4a, 0x26, 0x45, 0x63, 0x6c, 0x88, 0xa1, 0x9c, 0xae, 0xc6,
+ 0xa6, 0xb9, 0xd1, 0x7d, 0x96, 0xaf, 0x2a, 0x45, 0x65, 0x15, 0x29, 0x4e,
+ 0x1d, 0x27, 0x3f, 0x1f, 0x29, 0x41, 0x6a, 0x76, 0x8c, 0xa7, 0xb3, 0xc1,
+ 0x91, 0x9c, 0xa4, 0xa6, 0xab, 0xb1, 0xbd, 0xbc, 0xbf, 0x8f, 0x8b, 0x88,
+ 0x60, 0x5d, 0x56, 0x3a, 0x3a, 0x37, 0x22, 0x23, 0x26, 0x1b, 0x1f, 0x20,
+ 0x17, 0x1b, 0x1a, 0x28, 0x2d, 0x2b, 0x2b, 0x30, 0x32, 0x21, 0x28, 0x30,
+ 0x4c, 0x54, 0x57, 0x6e, 0x7a, 0x7a, 0x55, 0x65, 0x64, 0x51, 0x61, 0x62,
+ 0x72, 0x7e, 0x86, 0x7f, 0x89, 0x93, 0x5c, 0x65, 0x6e, 0x54, 0x5f, 0x65,
+ 0x91, 0x9e, 0xaa, 0x6c, 0x75, 0x7d, 0x4c, 0x4f, 0x55, 0x63, 0x64, 0x6a,
+ 0x9a, 0x9a, 0xa5, 0xc9, 0xc9, 0xd4, 0x87, 0x84, 0x8c, 0x51, 0x4a, 0x4f,
+ 0x3b, 0x37, 0x36, 0x37, 0x39, 0x3e, 0x2e, 0x38, 0x45, 0x34, 0x44, 0x53,
+ 0x48, 0x58, 0x65, 0x73, 0x81, 0x8c, 0x77, 0x85, 0x8e, 0xa5, 0xb5, 0xc0,
+ 0x69, 0x7d, 0x94, 0x59, 0x6e, 0x81, 0x9b, 0xae, 0xbf, 0x8c, 0x9d, 0xb0,
+ 0x45, 0x55, 0x6a, 0x3d, 0x4e, 0x61, 0x8f, 0xa0, 0xb4, 0xa1, 0xb2, 0xc6,
+ 0x87, 0x9d, 0xaf, 0x93, 0xa9, 0xc1, 0x7d, 0x92, 0xaf, 0x5e, 0x71, 0x87,
+ 0x66, 0x74, 0x7f, 0xc3, 0xcd, 0xd5, 0x7e, 0x87, 0x99, 0x39, 0x40, 0x60,
+ 0x33, 0x40, 0x67, 0x2a, 0x38, 0x56, 0x29, 0x36, 0x49, 0x4e, 0x5b, 0x6b,
+ 0x8e, 0x9b, 0xac, 0x8b, 0x96, 0xa8, 0xa0, 0xaa, 0xb5, 0xc4, 0xce, 0xd1,
+ 0x8b, 0x91, 0x9c, 0x33, 0x37, 0x40, 0x27, 0x2a, 0x2f, 0x39, 0x3c, 0x41,
+ 0x34, 0x37, 0x3c, 0x20, 0x24, 0x27, 0x56, 0x5a, 0x57, 0x7c, 0x7f, 0x78,
+ 0x64, 0x68, 0x62, 0x56, 0x58, 0x52, 0x61, 0x5f, 0x58, 0x66, 0x61, 0x5a,
+ 0x63, 0x5e, 0x59, 0x51, 0x4e, 0x4d, 0x27, 0x29, 0x2a, 0x17, 0x1b, 0x1e,
+ 0x19, 0x18, 0x20, 0x1a, 0x1b, 0x20, 0x2c, 0x2e, 0x2d, 0x65, 0x6a, 0x64,
+ 0x7f, 0x84, 0x7e, 0x5c, 0x5e, 0x5b, 0x4b, 0x4a, 0x4c, 0x47, 0x46, 0x4b,
+ 0x32, 0x33, 0x42, 0x23, 0x2a, 0x3c, 0x18, 0x27, 0x38, 0x15, 0x29, 0x34,
+ 0x64, 0x77, 0x7e, 0x69, 0x78, 0x80, 0x40, 0x49, 0x5a, 0x17, 0x1d, 0x37,
+ 0x1c, 0x2a, 0x32, 0x27, 0x36, 0x39, 0x35, 0x43, 0x4b, 0x43, 0x4d, 0x5e,
+ 0x22, 0x25, 0x36, 0x23, 0x23, 0x2b, 0x22, 0x23, 0x26, 0x3a, 0x3d, 0x43,
+ 0x20, 0x29, 0x30, 0x12, 0x1a, 0x20, 0x1f, 0x29, 0x3c, 0x30, 0x40, 0x55,
+ 0x25, 0x3b, 0x52, 0x29, 0x41, 0x5c, 0x80, 0x99, 0xa8, 0x76, 0x8e, 0xa0,
+ 0x69, 0x83, 0x9e, 0x70, 0x88, 0xa9, 0x2a, 0x40, 0x65, 0x0d, 0x21, 0x43,
+ 0x16, 0x29, 0x48, 0x17, 0x2a, 0x46, 0x18, 0x2a, 0x40, 0x16, 0x28, 0x39,
+ 0x19, 0x29, 0x41, 0x15, 0x25, 0x3e, 0x12, 0x1f, 0x36, 0x12, 0x1d, 0x2f,
+ 0x14, 0x1d, 0x2e, 0x16, 0x1f, 0x2e, 0x13, 0x1d, 0x26, 0x26, 0x32, 0x39,
+ 0x65, 0x78, 0x88, 0x1c, 0x2b, 0x3e, 0x16, 0x1e, 0x34, 0x1d, 0x20, 0x31,
+ 0x1b, 0x1d, 0x28, 0x19, 0x1e, 0x24, 0x1c, 0x25, 0x2c, 0x27, 0x32, 0x3d,
+ 0x2a, 0x35, 0x40, 0x2e, 0x38, 0x44, 0x30, 0x3a, 0x46, 0x2e, 0x38, 0x42,
+ 0x2c, 0x36, 0x40, 0x2e, 0x37, 0x41, 0x30, 0x38, 0x43, 0x32, 0x3a, 0x45,
+ 0x30, 0x3a, 0x45, 0x30, 0x3d, 0x48, 0x2c, 0x38, 0x48, 0x33, 0x3e, 0x50,
+ 0x46, 0x51, 0x63, 0x4b, 0x54, 0x65, 0x4b, 0x52, 0x62, 0x3a, 0x41, 0x50,
+ 0x32, 0x36, 0x3f, 0x3d, 0x41, 0x4c, 0x3c, 0x40, 0x4b, 0x2d, 0x31, 0x3a,
+ 0x28, 0x2c, 0x33, 0x28, 0x2b, 0x30, 0x2e, 0x2f, 0x34, 0x32, 0x32, 0x39,
+ 0x31, 0x34, 0x36, 0x35, 0x3b, 0x3b, 0x32, 0x3b, 0x3c, 0x2e, 0x36, 0x39,
+ 0x2f, 0x34, 0x38, 0x31, 0x35, 0x38, 0x30, 0x35, 0x36, 0x2f, 0x35, 0x35,
+ 0x2e, 0x32, 0x31, 0x2b, 0x31, 0x2f, 0x2f, 0x38, 0x34, 0x2c, 0x34, 0x34,
+ 0x30, 0x35, 0x39, 0x31, 0x34, 0x39, 0x30, 0x35, 0x38, 0x30, 0x39, 0x36,
+ 0x33, 0x37, 0x37, 0x33, 0x33, 0x37, 0x34, 0x35, 0x39, 0x2d, 0x2e, 0x32,
+ 0x24, 0x25, 0x29, 0x1f, 0x23, 0x26, 0x28, 0x2c, 0x2f, 0x2d, 0x31, 0x34,
+ 0x2c, 0x33, 0x37, 0x3c, 0x46, 0x51, 0x52, 0x60, 0x6f, 0x4a, 0x55, 0x68,
+ 0x3a, 0x44, 0x52, 0x33, 0x38, 0x42, 0x2c, 0x33, 0x38, 0x25, 0x2c, 0x2f,
+ 0x28, 0x27, 0x2c, 0x42, 0x4a, 0x51, 0x4d, 0x5e, 0x67, 0x3f, 0x4e, 0x59,
+ 0x34, 0x3a, 0x46, 0x2b, 0x2d, 0x39, 0x2f, 0x36, 0x3e, 0x49, 0x58, 0x5d,
+ 0x4d, 0x59, 0x67, 0x3c, 0x44, 0x51, 0x31, 0x35, 0x40, 0x31, 0x34, 0x3b,
+ 0x30, 0x35, 0x39, 0x30, 0x35, 0x38, 0x30, 0x35, 0x38, 0x31, 0x35, 0x38,
+ 0x2f, 0x32, 0x37, 0x2f, 0x32, 0x37, 0x30, 0x33, 0x37, 0x2e, 0x32, 0x35,
+ 0x2e, 0x32, 0x35, 0x2e, 0x33, 0x36, 0x2c, 0x31, 0x34, 0x2b, 0x30, 0x33,
+ 0x2c, 0x2f, 0x34, 0x2a, 0x2d, 0x34, 0x2a, 0x2d, 0x34, 0x28, 0x2d, 0x33,
+ 0x2a, 0x2f, 0x35, 0x2a, 0x2e, 0x36, 0x2a, 0x2e, 0x37, 0x2a, 0x2e, 0x37,
+ 0x27, 0x2b, 0x2e, 0x1e, 0x22, 0x24, 0x17, 0x1b, 0x1d, 0x17, 0x1b, 0x1e,
+ 0x17, 0x1b, 0x1e, 0x1a, 0x1e, 0x21, 0x18, 0x1c, 0x1f, 0x14, 0x18, 0x1b,
+ 0x11, 0x15, 0x18, 0x0f, 0x13, 0x16, 0x14, 0x18, 0x1b, 0x11, 0x15, 0x18,
+ 0x10, 0x14, 0x17, 0x0e, 0x12, 0x15, 0x11, 0x12, 0x16, 0x11, 0x12, 0x16,
+ 0x20, 0x52, 0x83, 0x20, 0x52, 0x86, 0x27, 0x52, 0x88, 0x76, 0x95, 0xc0,
+ 0xb6, 0xca, 0xe9, 0x88, 0x9b, 0xb9, 0x2d, 0x4d, 0x74, 0x14, 0x42, 0x75,
+ 0x21, 0x4c, 0x82, 0x23, 0x4e, 0x83, 0x27, 0x52, 0x85, 0x24, 0x4f, 0x82,
+ 0x29, 0x54, 0x88, 0x21, 0x4d, 0x81, 0x24, 0x4e, 0x83, 0x22, 0x4d, 0x82,
+ 0x1f, 0x4c, 0x8a, 0x1e, 0x51, 0x81, 0x21, 0x4e, 0x7d, 0x50, 0x5a, 0x76,
+ 0xa4, 0x85, 0x74, 0xaf, 0x8c, 0x71, 0x8d, 0x7e, 0x75, 0x6f, 0x6e, 0x6e,
+ 0xa2, 0xaf, 0xb8, 0xd0, 0xce, 0xd3, 0xd1, 0xc6, 0xb8, 0xe7, 0xe3, 0xc0,
+ 0xec, 0xec, 0xc8, 0xd6, 0xca, 0xb4, 0xb7, 0x9c, 0x87, 0xad, 0x8b, 0x6b,
+ 0x8f, 0x82, 0x7d, 0x4b, 0x5b, 0x78, 0x18, 0x46, 0x7b, 0x19, 0x49, 0x88,
+ 0x22, 0x48, 0x79, 0x49, 0x67, 0x87, 0x8c, 0xa1, 0xc1, 0x5c, 0x7d, 0x9e,
+ 0x1e, 0x49, 0x76, 0x1c, 0x44, 0x79, 0x1d, 0x44, 0x7d, 0x23, 0x4d, 0x81,
+ 0x25, 0x51, 0x7c, 0x21, 0x4e, 0x73, 0x24, 0x4c, 0x75, 0x26, 0x4b, 0x77,
+ 0x1f, 0x46, 0x72, 0x1e, 0x42, 0x6c, 0x17, 0x36, 0x5b, 0x27, 0x3c, 0x59,
+ 0x80, 0x90, 0xa8, 0xa6, 0xb6, 0xd1, 0x61, 0x77, 0x98, 0x10, 0x2f, 0x55,
+ 0x0f, 0x30, 0x5d, 0x38, 0x4c, 0x74, 0xa8, 0xb8, 0xd8, 0x3e, 0x5e, 0x81,
+ 0x10, 0x3d, 0x6a, 0x1f, 0x45, 0x76, 0x30, 0x48, 0x6d, 0x6f, 0x80, 0x93,
+ 0x85, 0x91, 0x97, 0x43, 0x50, 0x5e, 0x27, 0x33, 0x4b, 0x22, 0x2f, 0x49,
+ 0x1d, 0x2a, 0x3f, 0x33, 0x41, 0x50, 0x76, 0x87, 0x92, 0x57, 0x6a, 0x77,
+ 0x21, 0x3b, 0x59, 0x22, 0x44, 0x63, 0x26, 0x4a, 0x6a, 0x4a, 0x69, 0x8b,
+ 0x57, 0x74, 0x96, 0x32, 0x4f, 0x71, 0x24, 0x3c, 0x5d, 0x1f, 0x2d, 0x4e,
+ 0x23, 0x2c, 0x3e, 0x53, 0x5f, 0x6f, 0x93, 0xa0, 0xb1, 0x98, 0xa7, 0xba,
+ 0x7f, 0x8d, 0x9e, 0x73, 0x7c, 0x89, 0x7c, 0x81, 0x8c, 0x5d, 0x5e, 0x68,
+ 0x40, 0x3d, 0x49, 0x31, 0x31, 0x37, 0x18, 0x1c, 0x1b, 0x15, 0x1b, 0x19,
+ 0x2e, 0x32, 0x35, 0x48, 0x4b, 0x51, 0x25, 0x2d, 0x2e, 0x4a, 0x55, 0x52,
+ 0x6a, 0x76, 0x73, 0x53, 0x60, 0x66, 0x4e, 0x5d, 0x6a, 0x4b, 0x5a, 0x65,
+ 0x47, 0x54, 0x59, 0x74, 0x7e, 0x80, 0x8c, 0x95, 0x9c, 0x82, 0x8a, 0x98,
+ 0x6d, 0x79, 0x8d, 0x50, 0x5b, 0x69, 0x45, 0x4d, 0x56, 0x53, 0x57, 0x62,
+ 0x89, 0x8d, 0x9b, 0x79, 0x7c, 0x8d, 0x49, 0x4a, 0x58, 0x1f, 0x21, 0x2a,
+ 0x36, 0x39, 0x3a, 0x59, 0x60, 0x64, 0x4d, 0x5b, 0x65, 0x40, 0x52, 0x60,
+ 0x41, 0x52, 0x62, 0x40, 0x52, 0x60, 0x74, 0x84, 0x91, 0xa2, 0xb2, 0xc0,
+ 0x99, 0xa7, 0xc1, 0x65, 0x75, 0x90, 0x34, 0x44, 0x5e, 0x46, 0x56, 0x6d,
+ 0x65, 0x76, 0x8a, 0x79, 0x89, 0xa0, 0x26, 0x3a, 0x52, 0x4f, 0x64, 0x7a,
+ 0xae, 0xc0, 0xcc, 0x78, 0x89, 0xa0, 0x67, 0x7a, 0x9a, 0x70, 0x83, 0x9e,
+ 0x8f, 0xa2, 0xb0, 0x99, 0xab, 0xb6, 0x6e, 0x7e, 0x94, 0x31, 0x41, 0x65,
+ 0x34, 0x46, 0x6d, 0x33, 0x42, 0x58, 0x37, 0x44, 0x49, 0x6b, 0x79, 0x7c,
+ 0xa8, 0xb5, 0xc3, 0x86, 0x92, 0xa9, 0x68, 0x74, 0x8b, 0x63, 0x6e, 0x80,
+ 0x4b, 0x51, 0x5f, 0x25, 0x2b, 0x37, 0x27, 0x2b, 0x36, 0x31, 0x34, 0x3d,
+ 0x2a, 0x2a, 0x32, 0x2d, 0x2d, 0x31, 0xa9, 0xaa, 0xa7, 0xb4, 0xb7, 0xb2,
+ 0x82, 0x88, 0x87, 0x68, 0x6b, 0x6b, 0x5c, 0x5a, 0x5a, 0x5f, 0x5a, 0x5c,
+ 0x56, 0x51, 0x54, 0x30, 0x2e, 0x33, 0x19, 0x1a, 0x1f, 0x13, 0x18, 0x1c,
+ 0x18, 0x1a, 0x1c, 0x2e, 0x2f, 0x2d, 0x50, 0x53, 0x49, 0x66, 0x6a, 0x5c,
+ 0x9d, 0xa1, 0x93, 0x92, 0x93, 0x8c, 0x76, 0x76, 0x76, 0x55, 0x54, 0x59,
+ 0x46, 0x44, 0x4d, 0x48, 0x4e, 0x5a, 0x2d, 0x3a, 0x4d, 0x23, 0x36, 0x4b,
+ 0x27, 0x39, 0x4d, 0x2a, 0x39, 0x4c, 0x28, 0x32, 0x46, 0x1e, 0x25, 0x3c,
+ 0x22, 0x2b, 0x41, 0x28, 0x32, 0x3f, 0x65, 0x70, 0x76, 0x79, 0x7f, 0x89,
+ 0x49, 0x4c, 0x55, 0x2d, 0x30, 0x32, 0x21, 0x27, 0x26, 0x22, 0x2a, 0x2e,
+ 0x19, 0x24, 0x28, 0x26, 0x31, 0x35, 0x6b, 0x77, 0x8b, 0x7f, 0x8f, 0xa6,
+ 0x6c, 0x82, 0x9c, 0x22, 0x3c, 0x5a, 0x69, 0x84, 0x99, 0x74, 0x8b, 0xa8,
+ 0x26, 0x3c, 0x62, 0x2c, 0x43, 0x66, 0x2b, 0x42, 0x61, 0x31, 0x48, 0x64,
+ 0x3a, 0x50, 0x6c, 0x22, 0x36, 0x50, 0x1d, 0x31, 0x4c, 0x1e, 0x2f, 0x4c,
+ 0x1b, 0x2a, 0x4a, 0x11, 0x20, 0x3d, 0x14, 0x20, 0x3a, 0x14, 0x1e, 0x37,
+ 0x17, 0x1f, 0x35, 0x1a, 0x23, 0x32, 0x10, 0x1a, 0x25, 0x4b, 0x58, 0x64,
+ 0x4b, 0x5f, 0x77, 0x0c, 0x1b, 0x32, 0x1f, 0x27, 0x3c, 0x1d, 0x20, 0x31,
+ 0x19, 0x1e, 0x28, 0x1a, 0x21, 0x2b, 0x28, 0x32, 0x3b, 0x2d, 0x3a, 0x45,
+ 0x2d, 0x39, 0x45, 0x31, 0x3d, 0x49, 0x30, 0x3a, 0x46, 0x2c, 0x36, 0x42,
+ 0x2e, 0x38, 0x43, 0x2e, 0x38, 0x44, 0x31, 0x3b, 0x47, 0x33, 0x3d, 0x49,
+ 0x32, 0x3e, 0x49, 0x31, 0x3c, 0x49, 0x2d, 0x37, 0x45, 0x2c, 0x35, 0x46,
+ 0x37, 0x40, 0x51, 0x47, 0x50, 0x61, 0x4a, 0x53, 0x62, 0x45, 0x4c, 0x5c,
+ 0x3a, 0x41, 0x4c, 0x39, 0x3f, 0x4b, 0x3a, 0x40, 0x4c, 0x39, 0x3d, 0x48,
+ 0x31, 0x36, 0x3c, 0x30, 0x33, 0x38, 0x31, 0x32, 0x37, 0x2a, 0x2b, 0x32,
+ 0x27, 0x2c, 0x2b, 0x36, 0x3f, 0x3e, 0x3a, 0x44, 0x47, 0x36, 0x3d, 0x43,
+ 0x31, 0x36, 0x3c, 0x31, 0x34, 0x39, 0x30, 0x34, 0x35, 0x2e, 0x34, 0x32,
+ 0x26, 0x2a, 0x29, 0x25, 0x2b, 0x29, 0x36, 0x40, 0x3d, 0x37, 0x40, 0x40,
+ 0x35, 0x3a, 0x3e, 0x35, 0x38, 0x3d, 0x32, 0x37, 0x3a, 0x30, 0x38, 0x36,
+ 0x33, 0x39, 0x3b, 0x35, 0x3a, 0x3d, 0x35, 0x39, 0x3c, 0x2b, 0x2f, 0x32,
+ 0x20, 0x24, 0x27, 0x24, 0x29, 0x2c, 0x2e, 0x36, 0x38, 0x2f, 0x37, 0x39,
+ 0x2c, 0x31, 0x35, 0x2f, 0x37, 0x3e, 0x48, 0x54, 0x62, 0x50, 0x5d, 0x6d,
+ 0x40, 0x4a, 0x5a, 0x34, 0x3a, 0x46, 0x32, 0x37, 0x3c, 0x2b, 0x30, 0x34,
+ 0x29, 0x29, 0x2e, 0x36, 0x41, 0x46, 0x4b, 0x5f, 0x68, 0x48, 0x5a, 0x66,
+ 0x3b, 0x43, 0x50, 0x30, 0x31, 0x3f, 0x2a, 0x30, 0x3a, 0x37, 0x44, 0x4a,
+ 0x3e, 0x4a, 0x55, 0x36, 0x3e, 0x49, 0x30, 0x35, 0x3f, 0x31, 0x34, 0x3b,
+ 0x32, 0x37, 0x3b, 0x31, 0x37, 0x39, 0x2f, 0x34, 0x38, 0x2f, 0x32, 0x37,
+ 0x2e, 0x33, 0x37, 0x2d, 0x32, 0x36, 0x2d, 0x32, 0x36, 0x2c, 0x31, 0x35,
+ 0x2e, 0x33, 0x36, 0x2f, 0x33, 0x36, 0x2a, 0x2f, 0x31, 0x2c, 0x30, 0x33,
+ 0x2b, 0x2f, 0x32, 0x2c, 0x30, 0x33, 0x27, 0x2c, 0x30, 0x28, 0x2e, 0x32,
+ 0x2a, 0x30, 0x34, 0x2d, 0x31, 0x37, 0x2c, 0x2f, 0x36, 0x28, 0x2b, 0x32,
+ 0x23, 0x24, 0x29, 0x1a, 0x1b, 0x20, 0x18, 0x19, 0x1e, 0x1a, 0x1b, 0x20,
+ 0x17, 0x18, 0x1d, 0x11, 0x14, 0x19, 0x13, 0x16, 0x1b, 0x15, 0x18, 0x1d,
+ 0x11, 0x15, 0x18, 0x0e, 0x12, 0x15, 0x10, 0x14, 0x17, 0x14, 0x18, 0x1b,
+ 0x11, 0x15, 0x18, 0x0b, 0x0f, 0x12, 0x0e, 0x0f, 0x13, 0x13, 0x14, 0x18,
+ 0x1c, 0x54, 0x86, 0x1b, 0x4e, 0x83, 0x3a, 0x64, 0x99, 0x8c, 0xab, 0xd9,
+ 0x94, 0xac, 0xd2, 0x36, 0x4f, 0x75, 0x25, 0x48, 0x74, 0x1a, 0x46, 0x79,
+ 0x1e, 0x47, 0x7f, 0x25, 0x4e, 0x83, 0x30, 0x5b, 0x8e, 0x2e, 0x5a, 0x8d,
+ 0x29, 0x54, 0x89, 0x23, 0x4e, 0x84, 0x23, 0x4e, 0x82, 0x28, 0x53, 0x85,
+ 0x2a, 0x54, 0x87, 0x1f, 0x4f, 0x7c, 0x28, 0x4b, 0x79, 0x70, 0x6a, 0x76,
+ 0xb5, 0x92, 0x70, 0xa3, 0x90, 0x86, 0x85, 0x85, 0x94, 0x86, 0x88, 0x7e,
+ 0xb3, 0xb1, 0xb2, 0xde, 0xd8, 0xcb, 0xe9, 0xe5, 0xcd, 0xe9, 0xeb, 0xd3,
+ 0xcd, 0xc8, 0xab, 0xae, 0x98, 0x75, 0xa8, 0x8c, 0x74, 0x97, 0x80, 0x7e,
+ 0x49, 0x58, 0x73, 0x21, 0x4a, 0x80, 0x19, 0x4c, 0x83, 0x20, 0x46, 0x78,
+ 0x4f, 0x6b, 0x90, 0x85, 0x9f, 0xb9, 0x63, 0x7d, 0xa3, 0x1f, 0x46, 0x75,
+ 0x1c, 0x4b, 0x7a, 0x1f, 0x4c, 0x7e, 0x1c, 0x49, 0x7b, 0x21, 0x4d, 0x7c,
+ 0x1d, 0x48, 0x73, 0x21, 0x4a, 0x75, 0x20, 0x45, 0x78, 0x22, 0x47, 0x7d,
+ 0x1f, 0x4d, 0x7c, 0x1d, 0x4a, 0x75, 0x16, 0x3b, 0x62, 0x58, 0x75, 0x93,
+ 0xa3, 0xb7, 0xd0, 0x4b, 0x5b, 0x77, 0x2b, 0x44, 0x67, 0x23, 0x42, 0x6d,
+ 0x22, 0x42, 0x67, 0x2b, 0x3d, 0x5f, 0x79, 0x85, 0xa8, 0x4d, 0x67, 0x8c,
+ 0x25, 0x48, 0x75, 0x31, 0x4e, 0x74, 0x54, 0x61, 0x73, 0x7b, 0x81, 0x7d,
+ 0xb6, 0xb6, 0xab, 0x90, 0x93, 0x92, 0x41, 0x48, 0x53, 0x1c, 0x28, 0x39,
+ 0x2a, 0x3b, 0x4b, 0x82, 0x94, 0xa3, 0x99, 0xa9, 0xbb, 0x93, 0xa5, 0xb9,
+ 0x62, 0x7d, 0x95, 0x30, 0x49, 0x6b, 0x19, 0x37, 0x64, 0x0b, 0x32, 0x63,
+ 0x1a, 0x41, 0x6d, 0x35, 0x4d, 0x72, 0x32, 0x42, 0x56, 0x36, 0x48, 0x50,
+ 0x80, 0x8a, 0x92, 0xc6, 0xd0, 0xd6, 0xbb, 0xc8, 0xd2, 0xa5, 0xb1, 0xc5,
+ 0x75, 0x81, 0x97, 0x6c, 0x77, 0x87, 0x69, 0x71, 0x7d, 0x4b, 0x50, 0x62,
+ 0x43, 0x45, 0x59, 0x2c, 0x30, 0x3a, 0x11, 0x17, 0x15, 0x1d, 0x22, 0x20,
+ 0x48, 0x4b, 0x4e, 0x32, 0x37, 0x3e, 0x4b, 0x55, 0x57, 0x68, 0x77, 0x73,
+ 0x4f, 0x60, 0x60, 0x4c, 0x5c, 0x69, 0x48, 0x58, 0x6f, 0x3f, 0x4d, 0x60,
+ 0x46, 0x52, 0x58, 0x4b, 0x54, 0x55, 0x65, 0x6d, 0x76, 0x63, 0x6b, 0x7e,
+ 0x48, 0x55, 0x5f, 0x4b, 0x58, 0x66, 0x3c, 0x49, 0x5a, 0x4c, 0x59, 0x69,
+ 0x9d, 0xab, 0xb3, 0x65, 0x71, 0x75, 0x26, 0x2e, 0x36, 0x16, 0x1d, 0x29,
+ 0x2f, 0x3a, 0x3c, 0x6b, 0x79, 0x7e, 0x9b, 0xab, 0xb6, 0x62, 0x76, 0x86,
+ 0x7a, 0x8f, 0xa2, 0x8c, 0xa1, 0xb4, 0x92, 0xa4, 0xb5, 0x74, 0x83, 0x94,
+ 0x89, 0x99, 0xae, 0x7c, 0x8d, 0xac, 0x25, 0x35, 0x59, 0x1c, 0x2c, 0x4c,
+ 0x49, 0x58, 0x74, 0xa4, 0xb3, 0xd0, 0x53, 0x67, 0x7f, 0x50, 0x67, 0x75,
+ 0xab, 0xbb, 0xc1, 0x93, 0xa4, 0xb3, 0x91, 0xa5, 0xbc, 0x84, 0x99, 0xab,
+ 0xa5, 0xbc, 0xc5, 0x9d, 0xb4, 0xbd, 0x86, 0x9d, 0xb0, 0x71, 0x89, 0xa6,
+ 0x32, 0x46, 0x63, 0x46, 0x54, 0x61, 0x8f, 0x97, 0x95, 0xc4, 0xcc, 0xc8,
+ 0xcf, 0xd9, 0xe1, 0x74, 0x80, 0x96, 0x5f, 0x6a, 0x86, 0x44, 0x4e, 0x68,
+ 0x31, 0x36, 0x47, 0x1b, 0x22, 0x31, 0x16, 0x1d, 0x2b, 0x19, 0x1e, 0x29,
+ 0x2e, 0x2f, 0x37, 0x3f, 0x3d, 0x44, 0x83, 0x85, 0x89, 0xb4, 0xb9, 0xbc,
+ 0xbe, 0xc8, 0xc1, 0x8f, 0x97, 0x90, 0x72, 0x74, 0x71, 0x4b, 0x4a, 0x4e,
+ 0x3a, 0x39, 0x3e, 0x2b, 0x2b, 0x31, 0x1d, 0x20, 0x27, 0x15, 0x1a, 0x20,
+ 0x2b, 0x2f, 0x2b, 0x52, 0x57, 0x4e, 0x63, 0x67, 0x59, 0x56, 0x58, 0x49,
+ 0x6a, 0x6c, 0x5f, 0x9b, 0x9c, 0x95, 0xb8, 0xb9, 0xb9, 0x77, 0x77, 0x7c,
+ 0x3d, 0x3d, 0x3f, 0x5a, 0x5f, 0x67, 0x43, 0x4e, 0x5e, 0x27, 0x35, 0x4c,
+ 0x17, 0x24, 0x3e, 0x1a, 0x25, 0x3d, 0x21, 0x2c, 0x42, 0x22, 0x2c, 0x41,
+ 0x27, 0x2e, 0x45, 0x3d, 0x46, 0x51, 0x99, 0xa4, 0xa6, 0xae, 0xb4, 0xbc,
+ 0x77, 0x79, 0x85, 0x3b, 0x3f, 0x48, 0x31, 0x39, 0x43, 0x30, 0x3c, 0x4c,
+ 0x19, 0x29, 0x34, 0x61, 0x72, 0x7d, 0x6b, 0x79, 0x93, 0x52, 0x66, 0x7f,
+ 0x8f, 0xa7, 0xc2, 0x2a, 0x42, 0x64, 0x35, 0x4f, 0x6a, 0x2c, 0x43, 0x69,
+ 0x14, 0x28, 0x5c, 0x15, 0x2c, 0x4f, 0x48, 0x61, 0x75, 0x78, 0x93, 0xa2,
+ 0x80, 0x9a, 0xab, 0x54, 0x6b, 0x7f, 0x21, 0x34, 0x54, 0x1d, 0x2e, 0x59,
+ 0x1c, 0x2b, 0x4e, 0x16, 0x24, 0x3f, 0x15, 0x21, 0x3b, 0x16, 0x20, 0x3b,
+ 0x18, 0x20, 0x38, 0x13, 0x1f, 0x2d, 0x13, 0x21, 0x2b, 0x68, 0x76, 0x87,
+ 0x28, 0x38, 0x55, 0x11, 0x20, 0x38, 0x22, 0x2b, 0x3e, 0x1f, 0x24, 0x32,
+ 0x18, 0x1f, 0x29, 0x20, 0x28, 0x33, 0x2f, 0x3b, 0x47, 0x29, 0x37, 0x44,
+ 0x2b, 0x38, 0x44, 0x2d, 0x39, 0x45, 0x2a, 0x36, 0x42, 0x2e, 0x38, 0x44,
+ 0x31, 0x3b, 0x47, 0x31, 0x3b, 0x47, 0x31, 0x3d, 0x49, 0x31, 0x3d, 0x49,
+ 0x34, 0x3e, 0x4b, 0x31, 0x3b, 0x47, 0x2d, 0x35, 0x42, 0x2d, 0x34, 0x42,
+ 0x2d, 0x35, 0x42, 0x39, 0x41, 0x4e, 0x45, 0x4e, 0x5b, 0x48, 0x51, 0x5d,
+ 0x43, 0x4d, 0x59, 0x3d, 0x45, 0x52, 0x34, 0x3c, 0x48, 0x31, 0x38, 0x42,
+ 0x30, 0x36, 0x3b, 0x33, 0x36, 0x3b, 0x30, 0x32, 0x38, 0x27, 0x28, 0x2f,
+ 0x2a, 0x30, 0x30, 0x39, 0x41, 0x42, 0x44, 0x4d, 0x50, 0x44, 0x4a, 0x51,
+ 0x37, 0x3c, 0x42, 0x31, 0x34, 0x39, 0x2d, 0x31, 0x34, 0x28, 0x2d, 0x2e,
+ 0x1d, 0x21, 0x22, 0x22, 0x28, 0x28, 0x3b, 0x45, 0x44, 0x3e, 0x46, 0x48,
+ 0x35, 0x3a, 0x3e, 0x32, 0x35, 0x3c, 0x30, 0x35, 0x38, 0x2e, 0x36, 0x34,
+ 0x30, 0x37, 0x39, 0x32, 0x3a, 0x3c, 0x35, 0x3a, 0x3d, 0x2b, 0x2f, 0x32,
+ 0x22, 0x27, 0x29, 0x29, 0x2f, 0x32, 0x30, 0x38, 0x3b, 0x2c, 0x35, 0x38,
+ 0x2c, 0x30, 0x34, 0x2b, 0x32, 0x37, 0x3d, 0x47, 0x50, 0x53, 0x5f, 0x6a,
+ 0x46, 0x50, 0x5d, 0x36, 0x3c, 0x47, 0x2f, 0x34, 0x3a, 0x2e, 0x33, 0x37,
+ 0x2a, 0x2d, 0x30, 0x25, 0x2f, 0x33, 0x3d, 0x4c, 0x55, 0x49, 0x57, 0x62,
+ 0x3e, 0x46, 0x51, 0x32, 0x36, 0x41, 0x2d, 0x33, 0x3b, 0x2c, 0x35, 0x3c,
+ 0x2e, 0x39, 0x42, 0x2f, 0x35, 0x40, 0x33, 0x36, 0x3f, 0x37, 0x3a, 0x3f,
+ 0x34, 0x38, 0x3c, 0x2f, 0x35, 0x38, 0x2e, 0x33, 0x37, 0x2e, 0x32, 0x37,
+ 0x2e, 0x33, 0x39, 0x2e, 0x33, 0x39, 0x2a, 0x2f, 0x34, 0x2b, 0x30, 0x34,
+ 0x2b, 0x30, 0x34, 0x2c, 0x2f, 0x34, 0x2c, 0x30, 0x33, 0x2c, 0x30, 0x33,
+ 0x2b, 0x2f, 0x32, 0x2a, 0x2e, 0x31, 0x29, 0x2f, 0x31, 0x2a, 0x32, 0x34,
+ 0x2b, 0x32, 0x35, 0x2f, 0x34, 0x38, 0x30, 0x33, 0x38, 0x28, 0x2b, 0x30,
+ 0x20, 0x20, 0x25, 0x19, 0x18, 0x1e, 0x1b, 0x1a, 0x20, 0x18, 0x18, 0x1f,
+ 0x15, 0x15, 0x1d, 0x14, 0x15, 0x1b, 0x16, 0x19, 0x1e, 0x17, 0x1a, 0x1f,
+ 0x11, 0x15, 0x19, 0x10, 0x13, 0x17, 0x0f, 0x13, 0x16, 0x0f, 0x13, 0x16,
+ 0x10, 0x13, 0x17, 0x0b, 0x0f, 0x12, 0x10, 0x11, 0x15, 0x15, 0x16, 0x1a,
+ 0x1e, 0x51, 0x86, 0x24, 0x52, 0x88, 0x2a, 0x55, 0x88, 0x43, 0x6d, 0x9d,
+ 0x37, 0x62, 0x8f, 0x21, 0x4c, 0x79, 0x2a, 0x54, 0x83, 0x25, 0x4e, 0x80,
+ 0x21, 0x4a, 0x82, 0x27, 0x50, 0x84, 0x2a, 0x54, 0x86, 0x26, 0x51, 0x84,
+ 0x26, 0x51, 0x88, 0x27, 0x52, 0x89, 0x25, 0x50, 0x83, 0x30, 0x5b, 0x8a,
+ 0x45, 0x69, 0x93, 0x22, 0x4d, 0x78, 0x27, 0x49, 0x75, 0x77, 0x73, 0x7b,
+ 0xae, 0x8f, 0x72, 0xc1, 0xb3, 0xad, 0xb6, 0xba, 0xc7, 0xbb, 0xb9, 0xad,
+ 0xce, 0xc5, 0xba, 0xea, 0xe8, 0xd3, 0xee, 0xed, 0xda, 0xd2, 0xc6, 0xb8,
+ 0xaf, 0x96, 0x7d, 0xa6, 0x8c, 0x6d, 0x85, 0x7c, 0x7a, 0x4d, 0x57, 0x7e,
+ 0x28, 0x4a, 0x78, 0x1a, 0x4a, 0x8a, 0x22, 0x4a, 0x77, 0x4f, 0x68, 0x89,
+ 0x8b, 0xa7, 0xc8, 0x56, 0x79, 0x97, 0x24, 0x49, 0x76, 0x1c, 0x48, 0x7a,
+ 0x23, 0x4f, 0x80, 0x21, 0x4d, 0x7d, 0x1e, 0x4c, 0x7a, 0x1f, 0x4b, 0x7b,
+ 0x1d, 0x47, 0x79, 0x1c, 0x44, 0x78, 0x20, 0x49, 0x7d, 0x1c, 0x45, 0x78,
+ 0x2b, 0x57, 0x84, 0x1c, 0x4b, 0x79, 0x10, 0x3f, 0x6a, 0x5c, 0x84, 0xab,
+ 0x90, 0xac, 0xcb, 0x2a, 0x3e, 0x59, 0x1a, 0x2e, 0x4d, 0x21, 0x39, 0x5c,
+ 0x7d, 0x93, 0xae, 0x51, 0x61, 0x7f, 0x1e, 0x30, 0x52, 0x2b, 0x45, 0x67,
+ 0x45, 0x5b, 0x79, 0x64, 0x6a, 0x7e, 0x73, 0x70, 0x73, 0x72, 0x72, 0x67,
+ 0x74, 0x75, 0x72, 0x60, 0x62, 0x65, 0x30, 0x35, 0x3d, 0x1c, 0x27, 0x2f,
+ 0x67, 0x79, 0x80, 0x9c, 0xb3, 0xbe, 0x5f, 0x74, 0x8a, 0x5b, 0x70, 0x8d,
+ 0xa6, 0xbc, 0xcf, 0x36, 0x4a, 0x65, 0x16, 0x2e, 0x56, 0x1f, 0x40, 0x6d,
+ 0x2a, 0x49, 0x73, 0x35, 0x48, 0x67, 0x2d, 0x39, 0x4b, 0x50, 0x5c, 0x63,
+ 0xdd, 0xe2, 0xe6, 0xff, 0xff, 0xff, 0xe5, 0xeb, 0xef, 0xb8, 0xbf, 0xd0,
+ 0x97, 0xa0, 0xb3, 0x73, 0x7d, 0x87, 0x6c, 0x76, 0x81, 0x4e, 0x57, 0x69,
+ 0x34, 0x3d, 0x4e, 0x1f, 0x28, 0x32, 0x13, 0x1a, 0x1c, 0x1d, 0x21, 0x1f,
+ 0x29, 0x2b, 0x29, 0x5a, 0x5f, 0x63, 0x6e, 0x79, 0x80, 0x3f, 0x50, 0x59,
+ 0x42, 0x58, 0x64, 0x43, 0x58, 0x6b, 0x38, 0x49, 0x63, 0x2a, 0x38, 0x4d,
+ 0x47, 0x51, 0x5d, 0x56, 0x5f, 0x68, 0x4f, 0x59, 0x65, 0x4b, 0x55, 0x68,
+ 0x52, 0x5a, 0x61, 0x54, 0x61, 0x6d, 0x49, 0x5c, 0x6e, 0x57, 0x6e, 0x80,
+ 0x72, 0x87, 0x96, 0x58, 0x68, 0x75, 0x39, 0x43, 0x51, 0x3a, 0x42, 0x53,
+ 0x66, 0x78, 0x83, 0x98, 0xaa, 0xb7, 0x93, 0xa6, 0xb5, 0x8a, 0xa1, 0xb6,
+ 0x4f, 0x67, 0x7f, 0x5b, 0x73, 0x8b, 0x6b, 0x7f, 0x95, 0x99, 0xaa, 0xbd,
+ 0x8e, 0xa5, 0xb8, 0x48, 0x5f, 0x81, 0x2f, 0x46, 0x6f, 0x29, 0x3e, 0x5c,
+ 0x2a, 0x39, 0x53, 0x5b, 0x66, 0x84, 0x6a, 0x79, 0x92, 0x80, 0x93, 0xa2,
+ 0x87, 0x98, 0xa9, 0x79, 0x8b, 0xa1, 0xa4, 0xb8, 0xd0, 0x56, 0x69, 0x80,
+ 0x8a, 0x9d, 0xad, 0xb1, 0xc6, 0xd8, 0x5e, 0x74, 0x8c, 0x63, 0x7c, 0x9a,
+ 0x42, 0x54, 0x67, 0x5b, 0x65, 0x6d, 0xf2, 0xf3, 0xf2, 0xff, 0xff, 0xff,
+ 0xe8, 0xef, 0xf6, 0x93, 0x9f, 0xb1, 0x60, 0x6a, 0x83, 0x2d, 0x34, 0x4d,
+ 0x29, 0x2f, 0x45, 0x21, 0x29, 0x3c, 0x1a, 0x26, 0x36, 0x19, 0x22, 0x2f,
+ 0x2a, 0x2d, 0x39, 0x4e, 0x50, 0x5c, 0x7f, 0x86, 0x92, 0x74, 0x7e, 0x8b,
+ 0xa7, 0xaf, 0xb2, 0xb8, 0xbf, 0xc1, 0x7d, 0x82, 0x86, 0x30, 0x35, 0x3b,
+ 0x2e, 0x32, 0x39, 0x43, 0x46, 0x4b, 0x24, 0x29, 0x2d, 0x27, 0x2c, 0x2f,
+ 0x4e, 0x50, 0x4b, 0x59, 0x5d, 0x55, 0x5f, 0x61, 0x56, 0x5d, 0x5e, 0x50,
+ 0x56, 0x56, 0x4a, 0x5b, 0x5c, 0x56, 0x75, 0x77, 0x76, 0x4d, 0x50, 0x53,
+ 0x35, 0x35, 0x37, 0x2e, 0x30, 0x37, 0x2f, 0x38, 0x43, 0x1f, 0x28, 0x39,
+ 0x1c, 0x24, 0x38, 0x20, 0x28, 0x3e, 0x1e, 0x29, 0x3d, 0x1e, 0x2b, 0x3e,
+ 0x1b, 0x28, 0x3a, 0x5b, 0x6a, 0x72, 0xa7, 0xb4, 0xba, 0x8c, 0x93, 0xa5,
+ 0x5e, 0x62, 0x7c, 0x21, 0x26, 0x3b, 0x24, 0x2e, 0x40, 0x26, 0x35, 0x4a,
+ 0x28, 0x3c, 0x51, 0x78, 0x8a, 0x9f, 0x47, 0x5a, 0x7a, 0x2b, 0x40, 0x5c,
+ 0x82, 0x9c, 0xb4, 0x2b, 0x47, 0x63, 0x41, 0x5b, 0x74, 0x4a, 0x5e, 0x85,
+ 0x18, 0x2d, 0x5c, 0x35, 0x4d, 0x69, 0x7f, 0x9b, 0xa9, 0x3a, 0x56, 0x67,
+ 0x4c, 0x67, 0x7d, 0x81, 0x9a, 0xb0, 0x62, 0x7a, 0x95, 0x30, 0x44, 0x69,
+ 0x16, 0x26, 0x49, 0x16, 0x27, 0x3f, 0x1e, 0x2c, 0x41, 0x27, 0x30, 0x4d,
+ 0x1e, 0x29, 0x41, 0x12, 0x20, 0x2d, 0x2d, 0x3f, 0x4b, 0x68, 0x7a, 0x8e,
+ 0x16, 0x23, 0x41, 0x18, 0x25, 0x3b, 0x23, 0x2f, 0x3c, 0x20, 0x29, 0x31,
+ 0x1e, 0x27, 0x2f, 0x2a, 0x34, 0x3e, 0x2a, 0x36, 0x45, 0x25, 0x32, 0x42,
+ 0x2b, 0x38, 0x44, 0x2b, 0x38, 0x44, 0x2f, 0x3a, 0x48, 0x33, 0x3c, 0x4b,
+ 0x34, 0x3d, 0x4c, 0x33, 0x3c, 0x4b, 0x31, 0x3d, 0x4b, 0x33, 0x3f, 0x4c,
+ 0x33, 0x3c, 0x4b, 0x30, 0x38, 0x45, 0x2f, 0x36, 0x42, 0x2e, 0x34, 0x3f,
+ 0x2b, 0x31, 0x3c, 0x29, 0x2f, 0x3b, 0x3c, 0x44, 0x4f, 0x49, 0x54, 0x5d,
+ 0x45, 0x51, 0x5d, 0x42, 0x4d, 0x5b, 0x39, 0x43, 0x4f, 0x30, 0x39, 0x42,
+ 0x30, 0x37, 0x3c, 0x36, 0x3b, 0x3e, 0x36, 0x39, 0x3e, 0x30, 0x33, 0x39,
+ 0x2c, 0x31, 0x31, 0x30, 0x39, 0x39, 0x3e, 0x47, 0x4c, 0x46, 0x4d, 0x55,
+ 0x39, 0x3d, 0x46, 0x33, 0x33, 0x3b, 0x25, 0x29, 0x2c, 0x20, 0x24, 0x25,
+ 0x23, 0x24, 0x29, 0x2c, 0x31, 0x34, 0x3a, 0x42, 0x44, 0x3c, 0x44, 0x47,
+ 0x36, 0x3b, 0x41, 0x2c, 0x2f, 0x36, 0x2c, 0x31, 0x34, 0x35, 0x3b, 0x3a,
+ 0x31, 0x3a, 0x3c, 0x2e, 0x37, 0x39, 0x30, 0x35, 0x38, 0x2c, 0x30, 0x33,
+ 0x29, 0x2d, 0x30, 0x2d, 0x32, 0x36, 0x31, 0x39, 0x3c, 0x30, 0x36, 0x3c,
+ 0x32, 0x34, 0x38, 0x2b, 0x30, 0x33, 0x2f, 0x39, 0x3a, 0x44, 0x4f, 0x53,
+ 0x42, 0x4b, 0x55, 0x36, 0x3a, 0x45, 0x32, 0x34, 0x3c, 0x31, 0x33, 0x37,
+ 0x2c, 0x32, 0x32, 0x29, 0x31, 0x34, 0x34, 0x3b, 0x43, 0x3f, 0x45, 0x4d,
+ 0x3a, 0x41, 0x47, 0x31, 0x36, 0x3c, 0x31, 0x33, 0x39, 0x30, 0x31, 0x38,
+ 0x2f, 0x37, 0x3e, 0x2f, 0x35, 0x3c, 0x33, 0x36, 0x3b, 0x39, 0x3a, 0x3f,
+ 0x36, 0x3a, 0x3d, 0x2f, 0x34, 0x38, 0x2e, 0x33, 0x39, 0x2e, 0x32, 0x38,
+ 0x2d, 0x32, 0x38, 0x2d, 0x32, 0x38, 0x2a, 0x2f, 0x35, 0x2d, 0x32, 0x38,
+ 0x2a, 0x2f, 0x33, 0x2a, 0x2c, 0x31, 0x2c, 0x2f, 0x34, 0x2f, 0x32, 0x37,
+ 0x2d, 0x30, 0x35, 0x2e, 0x31, 0x36, 0x2c, 0x31, 0x36, 0x29, 0x31, 0x35,
+ 0x2d, 0x34, 0x38, 0x2f, 0x34, 0x38, 0x2c, 0x2f, 0x34, 0x21, 0x22, 0x27,
+ 0x1a, 0x1c, 0x1e, 0x1a, 0x1b, 0x1e, 0x17, 0x18, 0x1b, 0x13, 0x16, 0x1b,
+ 0x14, 0x17, 0x1c, 0x15, 0x19, 0x1c, 0x14, 0x19, 0x1c, 0x10, 0x16, 0x16,
+ 0x10, 0x13, 0x18, 0x10, 0x13, 0x18, 0x0f, 0x12, 0x17, 0x0f, 0x12, 0x17,
+ 0x0e, 0x11, 0x16, 0x0d, 0x10, 0x15, 0x14, 0x15, 0x19, 0x14, 0x15, 0x19,
+ 0x1b, 0x41, 0x7b, 0x23, 0x4c, 0x82, 0x28, 0x55, 0x87, 0x1c, 0x52, 0x83,
+ 0x18, 0x55, 0x85, 0x1e, 0x58, 0x8a, 0x2b, 0x5c, 0x8d, 0x2f, 0x58, 0x8c,
+ 0x24, 0x4d, 0x85, 0x29, 0x52, 0x86, 0x29, 0x53, 0x85, 0x24, 0x4e, 0x82,
+ 0x28, 0x53, 0x8b, 0x2d, 0x58, 0x8f, 0x26, 0x51, 0x85, 0x37, 0x62, 0x8f,
+ 0x55, 0x74, 0x9f, 0x2a, 0x55, 0x80, 0x24, 0x4e, 0x75, 0x6c, 0x6e, 0x7d,
+ 0xb2, 0x90, 0x7c, 0xc8, 0xb1, 0x9e, 0xd5, 0xd3, 0xd1, 0xdd, 0xdb, 0xdb,
+ 0xea, 0xe9, 0xda, 0xea, 0xec, 0xe4, 0xce, 0xc7, 0xb3, 0xb6, 0x97, 0x70,
+ 0xb4, 0x88, 0x6a, 0x8b, 0x74, 0x81, 0x43, 0x53, 0x7d, 0x20, 0x4b, 0x77,
+ 0x2b, 0x4f, 0x7d, 0x1e, 0x4a, 0x84, 0x5d, 0x7a, 0x9c, 0x82, 0x96, 0xb2,
+ 0x4e, 0x74, 0x98, 0x2f, 0x60, 0x86, 0x2c, 0x56, 0x87, 0x27, 0x4e, 0x7e,
+ 0x24, 0x4b, 0x80, 0x1f, 0x48, 0x7b, 0x27, 0x53, 0x83, 0x27, 0x52, 0x86,
+ 0x1d, 0x46, 0x7d, 0x1e, 0x47, 0x7d, 0x25, 0x51, 0x7f, 0x1f, 0x4e, 0x76,
+ 0x30, 0x56, 0x83, 0x1c, 0x49, 0x7a, 0x13, 0x48, 0x7a, 0x2a, 0x5b, 0x89,
+ 0x74, 0x99, 0xbc, 0x81, 0x99, 0xb3, 0x46, 0x57, 0x70, 0x63, 0x72, 0x8c,
+ 0xb6, 0xc4, 0xda, 0x5a, 0x6c, 0x89, 0x1f, 0x39, 0x59, 0x25, 0x42, 0x59,
+ 0x7d, 0x8b, 0x94, 0x78, 0x70, 0x71, 0x78, 0x6b, 0x6a, 0x71, 0x6d, 0x6b,
+ 0x3f, 0x3f, 0x3e, 0x1d, 0x1b, 0x20, 0x23, 0x1e, 0x2a, 0x5d, 0x5c, 0x67,
+ 0x6c, 0x74, 0x7b, 0x63, 0x71, 0x76, 0x8e, 0xa1, 0xa9, 0x92, 0xa6, 0xb2,
+ 0xa2, 0xb1, 0xc1, 0x67, 0x7e, 0x8e, 0x68, 0x80, 0x96, 0x51, 0x64, 0x81,
+ 0x23, 0x32, 0x51, 0x1e, 0x2f, 0x4a, 0x20, 0x2c, 0x47, 0x30, 0x31, 0x4b,
+ 0x9b, 0x9c, 0xa4, 0xff, 0xff, 0xff, 0xf8, 0xfc, 0xfd, 0xca, 0xce, 0xdc,
+ 0xc1, 0xc7, 0xd6, 0x9f, 0xa8, 0xad, 0x6e, 0x79, 0x7d, 0x44, 0x50, 0x5d,
+ 0x25, 0x35, 0x3d, 0x12, 0x1e, 0x27, 0x17, 0x1e, 0x24, 0x26, 0x28, 0x29,
+ 0x62, 0x64, 0x5f, 0x7a, 0x80, 0x7f, 0x45, 0x51, 0x5d, 0x22, 0x35, 0x4a,
+ 0x3c, 0x55, 0x6d, 0x41, 0x58, 0x71, 0x2f, 0x40, 0x59, 0x25, 0x31, 0x47,
+ 0x49, 0x50, 0x63, 0x55, 0x5c, 0x6f, 0x4e, 0x59, 0x6b, 0x4f, 0x5b, 0x6e,
+ 0x54, 0x55, 0x6c, 0x56, 0x60, 0x74, 0x52, 0x69, 0x7d, 0x4f, 0x6b, 0x83,
+ 0x2f, 0x45, 0x63, 0x35, 0x47, 0x62, 0x4d, 0x57, 0x68, 0x5a, 0x61, 0x6c,
+ 0x95, 0xa9, 0xbc, 0x7a, 0x91, 0xa6, 0x56, 0x6b, 0x82, 0x9c, 0xb4, 0xcd,
+ 0x5e, 0x77, 0x91, 0x3e, 0x58, 0x73, 0x5a, 0x70, 0x89, 0x87, 0x99, 0xad,
+ 0x59, 0x76, 0x90, 0x22, 0x41, 0x64, 0x26, 0x43, 0x67, 0x31, 0x49, 0x60,
+ 0x30, 0x3f, 0x50, 0x26, 0x2d, 0x45, 0x3d, 0x46, 0x61, 0x3a, 0x46, 0x5d,
+ 0x77, 0x8a, 0x9c, 0x83, 0x99, 0xaa, 0x7d, 0x93, 0xa3, 0x98, 0xab, 0xb9,
+ 0xa7, 0xb8, 0xc2, 0xa5, 0xb7, 0xc4, 0x73, 0x8b, 0x9c, 0x76, 0x91, 0xa3,
+ 0x89, 0x9b, 0xa6, 0x88, 0x8f, 0x96, 0xba, 0xb8, 0xbe, 0xf7, 0xf6, 0xfb,
+ 0xd9, 0xdd, 0xe9, 0x95, 0x9d, 0xad, 0x52, 0x5a, 0x6d, 0x26, 0x2e, 0x42,
+ 0x23, 0x2e, 0x47, 0x21, 0x2d, 0x43, 0x2a, 0x37, 0x49, 0x2a, 0x33, 0x41,
+ 0x2f, 0x33, 0x40, 0x77, 0x79, 0x86, 0x94, 0x9c, 0xaf, 0x6d, 0x7b, 0x93,
+ 0x64, 0x6a, 0x80, 0x6d, 0x71, 0x86, 0x41, 0x47, 0x59, 0x1b, 0x21, 0x33,
+ 0x32, 0x39, 0x45, 0x38, 0x3f, 0x44, 0x38, 0x3e, 0x3d, 0x62, 0x67, 0x63,
+ 0x58, 0x5a, 0x57, 0x52, 0x53, 0x4f, 0x57, 0x57, 0x50, 0x5c, 0x5a, 0x51,
+ 0x60, 0x60, 0x57, 0x59, 0x59, 0x52, 0x36, 0x38, 0x35, 0x26, 0x2a, 0x2a,
+ 0x35, 0x35, 0x3b, 0x1c, 0x1f, 0x24, 0x26, 0x2b, 0x2e, 0x2a, 0x32, 0x37,
+ 0x34, 0x3a, 0x45, 0x2c, 0x33, 0x43, 0x28, 0x30, 0x44, 0x25, 0x32, 0x48,
+ 0x1e, 0x32, 0x4c, 0x50, 0x63, 0x78, 0x91, 0xa3, 0xb7, 0x69, 0x71, 0x91,
+ 0x2f, 0x33, 0x57, 0x1c, 0x22, 0x3b, 0x26, 0x35, 0x3f, 0x67, 0x7b, 0x84,
+ 0x72, 0x89, 0xa6, 0x50, 0x64, 0x82, 0x2e, 0x42, 0x66, 0x29, 0x41, 0x5c,
+ 0x78, 0x93, 0xa8, 0x59, 0x74, 0x8a, 0x8f, 0xa8, 0xbe, 0x5b, 0x70, 0x93,
+ 0x29, 0x41, 0x5e, 0x53, 0x6e, 0x7f, 0x74, 0x90, 0xa1, 0x17, 0x31, 0x51,
+ 0x45, 0x60, 0x84, 0x50, 0x6c, 0x85, 0x63, 0x7f, 0x90, 0x5f, 0x78, 0x8e,
+ 0x14, 0x26, 0x48, 0x24, 0x36, 0x4c, 0x63, 0x73, 0x86, 0x71, 0x7f, 0x9b,
+ 0x3d, 0x4b, 0x65, 0x0d, 0x1f, 0x2c, 0x52, 0x68, 0x73, 0x5c, 0x72, 0x86,
+ 0x12, 0x1e, 0x3a, 0x1f, 0x2a, 0x3e, 0x29, 0x35, 0x3f, 0x26, 0x31, 0x38,
+ 0x2b, 0x36, 0x3d, 0x2e, 0x39, 0x43, 0x2a, 0x35, 0x44, 0x28, 0x34, 0x44,
+ 0x2c, 0x3a, 0x47, 0x2f, 0x3d, 0x49, 0x32, 0x3e, 0x4c, 0x35, 0x3f, 0x4e,
+ 0x34, 0x3e, 0x4d, 0x32, 0x3b, 0x4a, 0x2e, 0x3a, 0x48, 0x2e, 0x3b, 0x49,
+ 0x2f, 0x39, 0x48, 0x2e, 0x36, 0x43, 0x2c, 0x33, 0x3f, 0x2e, 0x32, 0x3e,
+ 0x29, 0x2e, 0x37, 0x24, 0x2b, 0x35, 0x28, 0x31, 0x3a, 0x3b, 0x45, 0x4e,
+ 0x41, 0x4f, 0x5c, 0x3f, 0x4c, 0x59, 0x3f, 0x4a, 0x55, 0x35, 0x3e, 0x47,
+ 0x32, 0x3b, 0x3e, 0x39, 0x3e, 0x42, 0x38, 0x3d, 0x41, 0x37, 0x3a, 0x40,
+ 0x31, 0x35, 0x37, 0x2f, 0x38, 0x38, 0x34, 0x3c, 0x41, 0x34, 0x3b, 0x45,
+ 0x30, 0x33, 0x3e, 0x29, 0x29, 0x30, 0x21, 0x22, 0x25, 0x20, 0x24, 0x25,
+ 0x2b, 0x2c, 0x32, 0x33, 0x39, 0x3c, 0x36, 0x3e, 0x41, 0x33, 0x3a, 0x40,
+ 0x2e, 0x32, 0x3a, 0x24, 0x27, 0x2e, 0x25, 0x29, 0x2c, 0x3d, 0x43, 0x42,
+ 0x3e, 0x45, 0x4b, 0x33, 0x38, 0x3d, 0x30, 0x34, 0x37, 0x2f, 0x30, 0x34,
+ 0x2f, 0x30, 0x34, 0x32, 0x33, 0x39, 0x32, 0x35, 0x3c, 0x33, 0x37, 0x3d,
+ 0x35, 0x35, 0x3a, 0x30, 0x33, 0x36, 0x2a, 0x34, 0x33, 0x2e, 0x39, 0x39,
+ 0x33, 0x3b, 0x40, 0x34, 0x35, 0x3f, 0x33, 0x33, 0x3b, 0x31, 0x32, 0x37,
+ 0x30, 0x38, 0x37, 0x4b, 0x4f, 0x50, 0x41, 0x40, 0x47, 0x38, 0x39, 0x3e,
+ 0x34, 0x38, 0x3b, 0x30, 0x36, 0x36, 0x2f, 0x31, 0x35, 0x33, 0x2e, 0x36,
+ 0x2f, 0x36, 0x3b, 0x2f, 0x34, 0x39, 0x34, 0x35, 0x3b, 0x37, 0x39, 0x3d,
+ 0x35, 0x38, 0x3c, 0x31, 0x36, 0x3a, 0x2e, 0x33, 0x39, 0x2f, 0x35, 0x3b,
+ 0x2d, 0x33, 0x3b, 0x2d, 0x31, 0x3a, 0x2b, 0x30, 0x36, 0x2f, 0x34, 0x3a,
+ 0x2a, 0x2f, 0x35, 0x29, 0x2c, 0x32, 0x2b, 0x2f, 0x34, 0x2f, 0x33, 0x38,
+ 0x2a, 0x2d, 0x34, 0x2a, 0x2f, 0x35, 0x29, 0x2f, 0x35, 0x2b, 0x32, 0x38,
+ 0x2e, 0x35, 0x3a, 0x2d, 0x32, 0x37, 0x24, 0x27, 0x2e, 0x1d, 0x1d, 0x24,
+ 0x15, 0x19, 0x18, 0x17, 0x1b, 0x1a, 0x14, 0x18, 0x19, 0x13, 0x18, 0x1b,
+ 0x10, 0x15, 0x18, 0x10, 0x18, 0x18, 0x10, 0x19, 0x16, 0x0f, 0x17, 0x15,
+ 0x10, 0x14, 0x18, 0x0f, 0x13, 0x18, 0x0e, 0x11, 0x16, 0x0f, 0x12, 0x17,
+ 0x0f, 0x12, 0x17, 0x16, 0x18, 0x1d, 0x16, 0x17, 0x1c, 0x14, 0x15, 0x1a,
+ 0x25, 0x42, 0x72, 0x1d, 0x40, 0x72, 0x25, 0x52, 0x85, 0x1f, 0x56, 0x88,
+ 0x1d, 0x57, 0x87, 0x1c, 0x54, 0x87, 0x23, 0x54, 0x8b, 0x29, 0x52, 0x8e,
+ 0x25, 0x4e, 0x8c, 0x2a, 0x56, 0x8d, 0x21, 0x51, 0x82, 0x24, 0x55, 0x86,
+ 0x22, 0x54, 0x89, 0x26, 0x57, 0x8f, 0x26, 0x55, 0x89, 0x2f, 0x5c, 0x8d,
+ 0x34, 0x59, 0x91, 0x1e, 0x4b, 0x87, 0x20, 0x4d, 0x7f, 0x4f, 0x60, 0x77,
+ 0xa4, 0x8f, 0x84, 0xbe, 0x99, 0x7e, 0xca, 0xad, 0x9d, 0xd3, 0xc6, 0xc3,
+ 0xd2, 0xcc, 0xc0, 0xca, 0xb5, 0xa9, 0xb9, 0x96, 0x81, 0xaf, 0x8d, 0x71,
+ 0x84, 0x79, 0x79, 0x3e, 0x55, 0x81, 0x22, 0x4d, 0x8c, 0x1c, 0x4b, 0x85,
+ 0x22, 0x4e, 0x7c, 0x63, 0x82, 0xa5, 0x8c, 0xa4, 0xc0, 0x56, 0x75, 0x9a,
+ 0x28, 0x4f, 0x7d, 0x2b, 0x53, 0x82, 0x2b, 0x55, 0x81, 0x2f, 0x5e, 0x8c,
+ 0x27, 0x50, 0x83, 0x20, 0x49, 0x79, 0x30, 0x57, 0x85, 0x2d, 0x54, 0x81,
+ 0x1f, 0x47, 0x78, 0x22, 0x4a, 0x7f, 0x27, 0x52, 0x87, 0x20, 0x4e, 0x80,
+ 0x33, 0x58, 0x88, 0x22, 0x49, 0x84, 0x17, 0x45, 0x82, 0x17, 0x48, 0x75,
+ 0x27, 0x53, 0x78, 0x67, 0x89, 0xaf, 0x93, 0xab, 0xcd, 0x9c, 0xb1, 0xc9,
+ 0x6c, 0x84, 0x9e, 0x3c, 0x4f, 0x76, 0x2f, 0x43, 0x6d, 0x4b, 0x64, 0x7d,
+ 0xb9, 0xcc, 0xca, 0xc1, 0xc5, 0xb8, 0x77, 0x70, 0x69, 0x40, 0x3e, 0x41,
+ 0x2e, 0x30, 0x38, 0x2e, 0x2c, 0x31, 0x24, 0x22, 0x2e, 0x44, 0x4c, 0x67,
+ 0x24, 0x3b, 0x58, 0x3d, 0x58, 0x6d, 0xa0, 0xb5, 0xcb, 0x74, 0x84, 0xa0,
+ 0x87, 0x9e, 0xb6, 0x99, 0xb2, 0xbe, 0x8b, 0x9f, 0xaf, 0xa5, 0xb5, 0xc9,
+ 0x4c, 0x5c, 0x70, 0x26, 0x35, 0x51, 0x28, 0x38, 0x59, 0x2f, 0x3e, 0x5a,
+ 0x28, 0x36, 0x59, 0x85, 0x95, 0xa8, 0xdb, 0xea, 0xf3, 0xdb, 0xe1, 0xf3,
+ 0xda, 0xda, 0xe7, 0xba, 0xbb, 0xbe, 0x75, 0x7f, 0x83, 0x3d, 0x51, 0x5e,
+ 0x2a, 0x46, 0x52, 0x0e, 0x26, 0x32, 0x20, 0x30, 0x3b, 0x6f, 0x79, 0x83,
+ 0x7e, 0x86, 0x90, 0x56, 0x5f, 0x6d, 0x34, 0x41, 0x53, 0x28, 0x3a, 0x4e,
+ 0x33, 0x4f, 0x70, 0x3a, 0x52, 0x74, 0x3c, 0x4f, 0x6f, 0x25, 0x2f, 0x4e,
+ 0x3a, 0x3f, 0x5a, 0x51, 0x56, 0x6e, 0x45, 0x4c, 0x65, 0x43, 0x4e, 0x6b,
+ 0x53, 0x59, 0x78, 0x4b, 0x58, 0x6a, 0x5b, 0x70, 0x7f, 0x5a, 0x72, 0x8b,
+ 0x31, 0x45, 0x64, 0x38, 0x49, 0x5c, 0x68, 0x74, 0x7e, 0x8e, 0x96, 0xa2,
+ 0x73, 0x87, 0x9e, 0x45, 0x6b, 0x89, 0x3f, 0x65, 0x82, 0x86, 0x9b, 0xb1,
+ 0x8f, 0x9f, 0xb0, 0x3e, 0x5a, 0x6f, 0x27, 0x44, 0x5d, 0x40, 0x53, 0x6c,
+ 0x55, 0x6e, 0x8c, 0x31, 0x4e, 0x67, 0x22, 0x3a, 0x5b, 0x30, 0x3c, 0x68,
+ 0x2e, 0x2e, 0x4a, 0x4a, 0x48, 0x47, 0x85, 0x88, 0x84, 0x4a, 0x50, 0x5b,
+ 0x4b, 0x57, 0x62, 0x67, 0x7f, 0x95, 0x54, 0x70, 0x87, 0x96, 0xa8, 0xb3,
+ 0xb9, 0xc6, 0xce, 0xa2, 0xb4, 0xc9, 0x8a, 0xa4, 0xb9, 0x8f, 0xa7, 0xb1,
+ 0xb8, 0xc9, 0xd1, 0xa6, 0xb8, 0xc6, 0x67, 0x79, 0x90, 0x90, 0x9a, 0xb6,
+ 0xad, 0xae, 0xc0, 0xa7, 0xa8, 0xae, 0x3a, 0x46, 0x55, 0x22, 0x3c, 0x5b,
+ 0x1f, 0x3d, 0x5f, 0x21, 0x35, 0x51, 0x3e, 0x41, 0x54, 0x69, 0x62, 0x65,
+ 0x9a, 0x91, 0x88, 0xe1, 0xde, 0xdc, 0xb9, 0xbe, 0xd0, 0x77, 0x83, 0xa5,
+ 0x5e, 0x5e, 0x7e, 0x4f, 0x4e, 0x65, 0x31, 0x31, 0x43, 0x1b, 0x1d, 0x30,
+ 0x1e, 0x25, 0x30, 0x1a, 0x23, 0x21, 0x90, 0x97, 0x91, 0xcd, 0xd1, 0xce,
+ 0x79, 0x7d, 0x7f, 0x57, 0x5a, 0x5c, 0x51, 0x51, 0x53, 0x5a, 0x5b, 0x5c,
+ 0x59, 0x5a, 0x59, 0x41, 0x41, 0x40, 0x23, 0x23, 0x24, 0x2f, 0x2f, 0x32,
+ 0x29, 0x27, 0x33, 0x24, 0x25, 0x2c, 0x29, 0x2d, 0x2a, 0x5b, 0x5f, 0x58,
+ 0x70, 0x72, 0x6f, 0x5c, 0x5d, 0x63, 0x4d, 0x50, 0x5d, 0x37, 0x40, 0x4f,
+ 0x28, 0x43, 0x59, 0x21, 0x40, 0x5f, 0x2f, 0x45, 0x66, 0x47, 0x4e, 0x6c,
+ 0x2b, 0x30, 0x4d, 0x23, 0x33, 0x51, 0x59, 0x72, 0x88, 0x7c, 0x90, 0x9e,
+ 0x7d, 0x8c, 0xaa, 0x7e, 0x8e, 0xa2, 0x6d, 0x83, 0x91, 0x4b, 0x65, 0x77,
+ 0x84, 0x99, 0xaf, 0x9f, 0xb0, 0xc0, 0x6a, 0x81, 0x92, 0x4c, 0x6c, 0x85,
+ 0x7a, 0x94, 0x9c, 0x90, 0xac, 0xb6, 0x53, 0x6f, 0x8b, 0x1c, 0x38, 0x66,
+ 0x25, 0x43, 0x6b, 0x29, 0x47, 0x62, 0x55, 0x70, 0x88, 0x59, 0x71, 0x89,
+ 0x19, 0x2b, 0x4b, 0x6e, 0x83, 0x92, 0x57, 0x6c, 0x89, 0x5f, 0x73, 0x95,
+ 0x68, 0x7e, 0x97, 0x0a, 0x1f, 0x36, 0x6a, 0x81, 0x90, 0x44, 0x5a, 0x71,
+ 0x19, 0x24, 0x39, 0x26, 0x2e, 0x41, 0x31, 0x3b, 0x49, 0x2f, 0x3b, 0x49,
+ 0x2d, 0x3b, 0x48, 0x26, 0x36, 0x42, 0x2a, 0x36, 0x41, 0x2f, 0x39, 0x43,
+ 0x31, 0x3f, 0x47, 0x32, 0x40, 0x48, 0x31, 0x3f, 0x4b, 0x33, 0x3f, 0x4f,
+ 0x34, 0x40, 0x50, 0x30, 0x3c, 0x4a, 0x2f, 0x3b, 0x47, 0x2d, 0x39, 0x46,
+ 0x2c, 0x3a, 0x47, 0x29, 0x35, 0x44, 0x29, 0x32, 0x42, 0x2a, 0x31, 0x3f,
+ 0x25, 0x2d, 0x36, 0x24, 0x2b, 0x33, 0x24, 0x2b, 0x35, 0x29, 0x30, 0x3b,
+ 0x36, 0x40, 0x4a, 0x3e, 0x4b, 0x54, 0x40, 0x4c, 0x55, 0x3d, 0x48, 0x51,
+ 0x38, 0x42, 0x4b, 0x37, 0x3e, 0x47, 0x32, 0x36, 0x3f, 0x34, 0x37, 0x40,
+ 0x31, 0x39, 0x3c, 0x31, 0x39, 0x3b, 0x2e, 0x34, 0x37, 0x2a, 0x2f, 0x33,
+ 0x25, 0x29, 0x2b, 0x21, 0x23, 0x23, 0x21, 0x23, 0x22, 0x25, 0x26, 0x26,
+ 0x29, 0x33, 0x2e, 0x33, 0x3d, 0x3c, 0x31, 0x3a, 0x3e, 0x2f, 0x34, 0x3b,
+ 0x28, 0x2b, 0x30, 0x1e, 0x22, 0x24, 0x23, 0x29, 0x27, 0x3b, 0x45, 0x42,
+ 0x3e, 0x48, 0x50, 0x33, 0x39, 0x41, 0x2d, 0x30, 0x35, 0x27, 0x2a, 0x2f,
+ 0x32, 0x35, 0x3c, 0x39, 0x3d, 0x43, 0x32, 0x35, 0x3a, 0x30, 0x34, 0x37,
+ 0x32, 0x33, 0x37, 0x31, 0x35, 0x38, 0x2d, 0x34, 0x33, 0x2c, 0x35, 0x34,
+ 0x2f, 0x37, 0x39, 0x2f, 0x34, 0x38, 0x30, 0x35, 0x39, 0x30, 0x33, 0x38,
+ 0x35, 0x39, 0x3d, 0x4f, 0x54, 0x57, 0x42, 0x48, 0x4e, 0x33, 0x3c, 0x42,
+ 0x2c, 0x34, 0x3b, 0x2d, 0x34, 0x39, 0x2f, 0x34, 0x38, 0x2f, 0x31, 0x37,
+ 0x31, 0x35, 0x3a, 0x2f, 0x32, 0x38, 0x32, 0x35, 0x3c, 0x33, 0x37, 0x3d,
+ 0x32, 0x37, 0x3c, 0x31, 0x36, 0x3a, 0x2f, 0x34, 0x37, 0x2e, 0x34, 0x34,
+ 0x2f, 0x34, 0x38, 0x2c, 0x31, 0x35, 0x2b, 0x2e, 0x35, 0x2f, 0x2f, 0x39,
+ 0x2d, 0x30, 0x39, 0x2b, 0x2f, 0x3a, 0x28, 0x2e, 0x38, 0x2b, 0x33, 0x3c,
+ 0x2d, 0x31, 0x38, 0x2b, 0x30, 0x36, 0x2c, 0x31, 0x35, 0x2c, 0x33, 0x35,
+ 0x2a, 0x30, 0x31, 0x26, 0x2a, 0x2d, 0x22, 0x21, 0x26, 0x1e, 0x1c, 0x22,
+ 0x18, 0x1a, 0x19, 0x17, 0x19, 0x1a, 0x15, 0x19, 0x1d, 0x18, 0x1b, 0x22,
+ 0x12, 0x17, 0x1d, 0x12, 0x17, 0x1b, 0x0f, 0x15, 0x17, 0x10, 0x16, 0x17,
+ 0x10, 0x14, 0x18, 0x0f, 0x12, 0x17, 0x0e, 0x10, 0x14, 0x0f, 0x11, 0x15,
+ 0x11, 0x13, 0x17, 0x17, 0x1a, 0x1f, 0x14, 0x19, 0x1d, 0x0f, 0x14, 0x18,
+ 0x2f, 0x50, 0x7c, 0x22, 0x44, 0x72, 0x21, 0x46, 0x78, 0x24, 0x4f, 0x80,
+ 0x2a, 0x58, 0x89, 0x26, 0x58, 0x8b, 0x1c, 0x51, 0x88, 0x19, 0x4d, 0x88,
+ 0x1f, 0x4d, 0x89, 0x25, 0x54, 0x8c, 0x20, 0x52, 0x85, 0x23, 0x55, 0x88,
+ 0x1f, 0x51, 0x88, 0x21, 0x52, 0x8a, 0x2a, 0x5a, 0x8f, 0x27, 0x57, 0x88,
+ 0x21, 0x4d, 0x83, 0x1b, 0x4c, 0x88, 0x1d, 0x4f, 0x8a, 0x2f, 0x4e, 0x7c,
+ 0x68, 0x6c, 0x7f, 0xa3, 0x8c, 0x87, 0xb7, 0x93, 0x7d, 0xbb, 0x96, 0x7a,
+ 0xb5, 0x93, 0x77, 0xb3, 0x8a, 0x78, 0xab, 0x8f, 0x87, 0x6f, 0x75, 0x81,
+ 0x34, 0x55, 0x7a, 0x26, 0x4d, 0x7f, 0x24, 0x49, 0x7c, 0x2b, 0x51, 0x7c,
+ 0x6c, 0x84, 0xa9, 0x89, 0xa8, 0xcd, 0x3f, 0x67, 0x8d, 0x26, 0x53, 0x7d,
+ 0x22, 0x51, 0x7f, 0x20, 0x4e, 0x84, 0x1d, 0x4c, 0x83, 0x26, 0x54, 0x8b,
+ 0x1e, 0x4d, 0x84, 0x21, 0x50, 0x84, 0x20, 0x4d, 0x7f, 0x23, 0x4d, 0x80,
+ 0x23, 0x4c, 0x80, 0x23, 0x4c, 0x80, 0x27, 0x51, 0x84, 0x22, 0x4d, 0x7d,
+ 0x23, 0x53, 0x7d, 0x28, 0x52, 0x84, 0x36, 0x5e, 0x8c, 0x22, 0x4f, 0x73,
+ 0x1e, 0x4d, 0x75, 0x20, 0x4e, 0x80, 0x39, 0x60, 0x94, 0x42, 0x63, 0x90,
+ 0x26, 0x43, 0x6a, 0x1f, 0x35, 0x5a, 0x21, 0x34, 0x52, 0x7e, 0x90, 0xa9,
+ 0x9c, 0xa6, 0xbc, 0xa1, 0xa1, 0xb4, 0x50, 0x4e, 0x59, 0x15, 0x1a, 0x20,
+ 0x42, 0x45, 0x49, 0x42, 0x41, 0x47, 0x1d, 0x27, 0x34, 0x16, 0x34, 0x49,
+ 0x15, 0x38, 0x54, 0x76, 0x8f, 0xaa, 0x94, 0xa7, 0xbd, 0x6a, 0x81, 0x93,
+ 0x93, 0xaa, 0xbe, 0xa6, 0xbc, 0xd3, 0x64, 0x77, 0x87, 0x77, 0x87, 0x98,
+ 0x87, 0x96, 0xb5, 0x2b, 0x38, 0x5c, 0x27, 0x37, 0x57, 0x24, 0x34, 0x5a,
+ 0x1f, 0x31, 0x57, 0x19, 0x2c, 0x4e, 0x50, 0x61, 0x7d, 0xcd, 0xd6, 0xe5,
+ 0xed, 0xef, 0xef, 0xb5, 0xb5, 0xb0, 0x65, 0x69, 0x75, 0x35, 0x3f, 0x5d,
+ 0x2b, 0x3f, 0x58, 0x35, 0x4a, 0x61, 0x6e, 0x83, 0x98, 0x7b, 0x8e, 0xa2,
+ 0x42, 0x54, 0x6a, 0x33, 0x44, 0x5c, 0x37, 0x48, 0x67, 0x31, 0x41, 0x61,
+ 0x2f, 0x3c, 0x57, 0x25, 0x3a, 0x58, 0x3e, 0x5a, 0x7d, 0x28, 0x3f, 0x5c,
+ 0x2f, 0x39, 0x43, 0x9c, 0x9f, 0x98, 0x85, 0x8c, 0x87, 0x3b, 0x47, 0x4f,
+ 0x4b, 0x57, 0x6c, 0x45, 0x56, 0x63, 0x4e, 0x68, 0x75, 0x54, 0x70, 0x87,
+ 0x2f, 0x4b, 0x62, 0x52, 0x6b, 0x79, 0xa4, 0xb7, 0xc2, 0xa5, 0xb1, 0xc3,
+ 0x63, 0x7a, 0x93, 0x46, 0x6b, 0x86, 0x43, 0x67, 0x82, 0x63, 0x77, 0x8f,
+ 0x9f, 0xb1, 0xc9, 0x40, 0x61, 0x7d, 0x35, 0x55, 0x77, 0x62, 0x76, 0x95,
+ 0x5a, 0x76, 0x87, 0x35, 0x53, 0x6e, 0x1f, 0x38, 0x5c, 0x28, 0x39, 0x4d,
+ 0x49, 0x4f, 0x44, 0xaa, 0xab, 0x93, 0x8a, 0x8c, 0x88, 0x36, 0x38, 0x4d,
+ 0x38, 0x42, 0x4d, 0x69, 0x7c, 0x8b, 0x60, 0x73, 0x85, 0x84, 0x8e, 0x9f,
+ 0xb8, 0xc0, 0xcb, 0xb1, 0xc5, 0xcf, 0x82, 0x9c, 0xac, 0x8e, 0xa3, 0xb9,
+ 0xbe, 0xcf, 0xda, 0xa8, 0xbe, 0xd9, 0x37, 0x55, 0x7b, 0x5d, 0x7c, 0x99,
+ 0x65, 0x77, 0x86, 0x61, 0x68, 0x76, 0x2d, 0x3b, 0x53, 0x30, 0x4c, 0x6f,
+ 0x28, 0x4c, 0x75, 0x26, 0x41, 0x63, 0x43, 0x52, 0x65, 0xa9, 0xab, 0xad,
+ 0xff, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xe1, 0xe8, 0xf3, 0x93, 0x9c, 0xb9,
+ 0x62, 0x6c, 0x83, 0x34, 0x3a, 0x52, 0x22, 0x24, 0x36, 0x2b, 0x30, 0x37,
+ 0x1d, 0x24, 0x2b, 0x1e, 0x24, 0x30, 0x81, 0x89, 0x92, 0xe0, 0xe7, 0xe6,
+ 0xda, 0xdb, 0xdd, 0xa0, 0xa1, 0xa1, 0x7f, 0x7e, 0x7d, 0x5e, 0x5d, 0x5c,
+ 0x42, 0x41, 0x3f, 0x2a, 0x29, 0x2a, 0x20, 0x20, 0x22, 0x34, 0x34, 0x37,
+ 0x26, 0x24, 0x31, 0x29, 0x29, 0x31, 0x44, 0x46, 0x43, 0x99, 0x9a, 0x92,
+ 0x9f, 0xa0, 0x98, 0x83, 0x83, 0x7f, 0x6a, 0x6e, 0x6d, 0x4d, 0x55, 0x57,
+ 0x4c, 0x5a, 0x6b, 0x26, 0x38, 0x52, 0x1a, 0x2b, 0x45, 0x29, 0x34, 0x48,
+ 0x2d, 0x39, 0x4b, 0x25, 0x3a, 0x4f, 0x73, 0x8c, 0x9e, 0x82, 0x95, 0x9f,
+ 0x88, 0x9f, 0xad, 0x75, 0x90, 0xaa, 0x6b, 0x85, 0xa1, 0x8f, 0xa6, 0xbc,
+ 0x73, 0x8c, 0xaa, 0x58, 0x76, 0xa0, 0x31, 0x53, 0x74, 0x89, 0xa7, 0xb7,
+ 0x55, 0x6d, 0x8e, 0x7a, 0x96, 0xa4, 0x61, 0x7b, 0x9e, 0x18, 0x30, 0x6c,
+ 0x2e, 0x4a, 0x6f, 0x70, 0x8d, 0xa0, 0x5d, 0x76, 0x97, 0x25, 0x3b, 0x5f,
+ 0x21, 0x33, 0x44, 0x80, 0x95, 0xa8, 0x21, 0x34, 0x54, 0x30, 0x46, 0x5e,
+ 0x74, 0x8b, 0xa2, 0x18, 0x2c, 0x44, 0x77, 0x8c, 0xa0, 0x30, 0x42, 0x6c,
+ 0x18, 0x25, 0x3c, 0x28, 0x33, 0x46, 0x32, 0x3c, 0x4c, 0x2c, 0x38, 0x46,
+ 0x28, 0x36, 0x45, 0x28, 0x38, 0x47, 0x2c, 0x3a, 0x47, 0x30, 0x3b, 0x46,
+ 0x30, 0x3e, 0x45, 0x2f, 0x3d, 0x46, 0x31, 0x3d, 0x49, 0x30, 0x3c, 0x4a,
+ 0x31, 0x3d, 0x4d, 0x31, 0x3d, 0x4b, 0x2f, 0x39, 0x45, 0x2f, 0x3a, 0x45,
+ 0x2c, 0x37, 0x42, 0x29, 0x33, 0x40, 0x29, 0x31, 0x3e, 0x27, 0x2e, 0x38,
+ 0x26, 0x2b, 0x33, 0x27, 0x2a, 0x31, 0x27, 0x2a, 0x31, 0x27, 0x2a, 0x33,
+ 0x26, 0x2f, 0x38, 0x36, 0x3f, 0x48, 0x3f, 0x49, 0x52, 0x40, 0x4a, 0x54,
+ 0x3e, 0x46, 0x51, 0x39, 0x40, 0x4a, 0x33, 0x39, 0x43, 0x34, 0x38, 0x43,
+ 0x2d, 0x34, 0x38, 0x28, 0x30, 0x33, 0x24, 0x29, 0x2d, 0x22, 0x27, 0x2a,
+ 0x21, 0x25, 0x26, 0x25, 0x26, 0x28, 0x28, 0x2a, 0x29, 0x2c, 0x2e, 0x2d,
+ 0x32, 0x3b, 0x3c, 0x35, 0x3f, 0x42, 0x2e, 0x37, 0x3d, 0x2b, 0x30, 0x37,
+ 0x26, 0x29, 0x2e, 0x23, 0x27, 0x2a, 0x2b, 0x31, 0x33, 0x37, 0x41, 0x44,
+ 0x39, 0x43, 0x4b, 0x30, 0x37, 0x3e, 0x27, 0x28, 0x2e, 0x22, 0x25, 0x2a,
+ 0x38, 0x3d, 0x43, 0x48, 0x4d, 0x53, 0x3a, 0x3f, 0x43, 0x32, 0x35, 0x3a,
+ 0x2f, 0x33, 0x36, 0x31, 0x36, 0x38, 0x2f, 0x35, 0x35, 0x2d, 0x36, 0x35,
+ 0x2e, 0x36, 0x37, 0x2f, 0x35, 0x38, 0x34, 0x39, 0x3d, 0x32, 0x35, 0x3a,
+ 0x30, 0x33, 0x37, 0x36, 0x3b, 0x3e, 0x33, 0x3b, 0x3e, 0x2f, 0x38, 0x3d,
+ 0x2d, 0x36, 0x3b, 0x2f, 0x37, 0x3b, 0x2f, 0x34, 0x37, 0x2f, 0x33, 0x36,
+ 0x2f, 0x34, 0x38, 0x30, 0x34, 0x38, 0x31, 0x35, 0x3a, 0x32, 0x35, 0x3b,
+ 0x32, 0x36, 0x3b, 0x2e, 0x31, 0x35, 0x2c, 0x30, 0x33, 0x2d, 0x31, 0x32,
+ 0x2d, 0x31, 0x34, 0x2b, 0x30, 0x33, 0x2b, 0x2e, 0x33, 0x2e, 0x30, 0x36,
+ 0x2e, 0x31, 0x39, 0x2c, 0x31, 0x37, 0x2a, 0x31, 0x37, 0x28, 0x30, 0x36,
+ 0x2c, 0x2f, 0x36, 0x2c, 0x31, 0x37, 0x31, 0x36, 0x3a, 0x2e, 0x34, 0x34,
+ 0x26, 0x2c, 0x2b, 0x1f, 0x23, 0x23, 0x1e, 0x1d, 0x20, 0x1c, 0x1b, 0x20,
+ 0x17, 0x18, 0x1a, 0x15, 0x16, 0x1a, 0x15, 0x18, 0x1d, 0x12, 0x15, 0x1c,
+ 0x10, 0x13, 0x1a, 0x10, 0x14, 0x19, 0x0d, 0x12, 0x15, 0x0f, 0x14, 0x16,
+ 0x12, 0x14, 0x19, 0x0f, 0x12, 0x16, 0x0e, 0x11, 0x14, 0x0f, 0x13, 0x16,
+ 0x0f, 0x13, 0x16, 0x11, 0x16, 0x1a, 0x11, 0x17, 0x1b, 0x0d, 0x14, 0x18,
+ 0x2b, 0x52, 0x7a, 0x2a, 0x4d, 0x79, 0x28, 0x46, 0x78, 0x28, 0x45, 0x77,
+ 0x2a, 0x4c, 0x7f, 0x2b, 0x57, 0x8a, 0x1e, 0x54, 0x88, 0x15, 0x51, 0x88,
+ 0x1c, 0x50, 0x8a, 0x1f, 0x54, 0x8a, 0x21, 0x55, 0x89, 0x25, 0x57, 0x8c,
+ 0x24, 0x55, 0x8d, 0x20, 0x51, 0x89, 0x3e, 0x6d, 0xa3, 0x2a, 0x5a, 0x8c,
+ 0x1d, 0x4b, 0x86, 0x20, 0x4e, 0x8a, 0x22, 0x53, 0x8d, 0x22, 0x51, 0x87,
+ 0x2b, 0x51, 0x7d, 0x4a, 0x60, 0x7e, 0x72, 0x73, 0x82, 0x8a, 0x7c, 0x80,
+ 0x89, 0x7b, 0x7b, 0x72, 0x71, 0x82, 0x4e, 0x60, 0x83, 0x34, 0x57, 0x84,
+ 0x23, 0x53, 0x86, 0x1e, 0x4d, 0x85, 0x2d, 0x56, 0x82, 0x7c, 0x9b, 0xb7,
+ 0x91, 0xa5, 0xc3, 0x3c, 0x63, 0x8d, 0x17, 0x4d, 0x81, 0x1e, 0x50, 0x83,
+ 0x21, 0x4e, 0x81, 0x23, 0x53, 0x8d, 0x1d, 0x4d, 0x88, 0x22, 0x4e, 0x83,
+ 0x20, 0x51, 0x85, 0x1f, 0x50, 0x85, 0x20, 0x4f, 0x85, 0x24, 0x51, 0x8a,
+ 0x21, 0x4e, 0x87, 0x21, 0x4c, 0x83, 0x20, 0x4c, 0x7f, 0x24, 0x51, 0x7d,
+ 0x1b, 0x4f, 0x75, 0x35, 0x5c, 0x81, 0x9f, 0xbc, 0xda, 0x6c, 0x8c, 0xa4,
+ 0x25, 0x4f, 0x72, 0x1a, 0x4a, 0x7b, 0x1d, 0x4b, 0x83, 0x21, 0x4a, 0x7e,
+ 0x23, 0x43, 0x72, 0x1b, 0x32, 0x58, 0x24, 0x37, 0x53, 0x6e, 0x7e, 0x99,
+ 0x9a, 0xa1, 0xc2, 0x68, 0x67, 0x88, 0x24, 0x29, 0x3c, 0x0f, 0x20, 0x24,
+ 0x25, 0x2e, 0x35, 0x20, 0x2f, 0x3d, 0x1c, 0x39, 0x50, 0x1f, 0x44, 0x60,
+ 0x19, 0x3a, 0x5e, 0x50, 0x69, 0x91, 0x56, 0x72, 0x8e, 0x9a, 0xba, 0xca,
+ 0x50, 0x65, 0x85, 0x65, 0x77, 0x99, 0x9f, 0xb2, 0xcb, 0x45, 0x57, 0x6c,
+ 0x6a, 0x7b, 0x96, 0x7b, 0x8c, 0xa6, 0x6b, 0x7e, 0x90, 0x37, 0x49, 0x60,
+ 0x2c, 0x3d, 0x5d, 0x26, 0x37, 0x5f, 0x1f, 0x31, 0x54, 0x52, 0x61, 0x73,
+ 0xad, 0xb6, 0xb9, 0xb7, 0xbb, 0xc2, 0x4d, 0x54, 0x6a, 0x1e, 0x29, 0x48,
+ 0x38, 0x46, 0x65, 0x9a, 0xab, 0xc7, 0x85, 0x9b, 0xb2, 0x4b, 0x65, 0x7c,
+ 0x48, 0x64, 0x7a, 0x35, 0x4f, 0x6a, 0x2e, 0x45, 0x68, 0x3f, 0x53, 0x78,
+ 0x44, 0x53, 0x72, 0x4d, 0x5c, 0x7c, 0x55, 0x65, 0x84, 0x42, 0x51, 0x67,
+ 0x26, 0x31, 0x41, 0x98, 0x9e, 0xa7, 0xfb, 0xff, 0xfb, 0xaa, 0xb0, 0xa3,
+ 0x5b, 0x65, 0x67, 0x38, 0x48, 0x53, 0x38, 0x4e, 0x6b, 0x4f, 0x68, 0x91,
+ 0x29, 0x44, 0x69, 0x91, 0xaa, 0xbf, 0x8e, 0xa1, 0xae, 0x56, 0x63, 0x75,
+ 0x58, 0x6f, 0x88, 0x49, 0x68, 0x7f, 0x47, 0x61, 0x77, 0x4b, 0x5c, 0x72,
+ 0x6c, 0x82, 0x9e, 0x41, 0x65, 0x89, 0x41, 0x60, 0x86, 0x56, 0x67, 0x89,
+ 0x54, 0x6e, 0x84, 0x3f, 0x59, 0x79, 0x25, 0x3d, 0x57, 0x3b, 0x4e, 0x4c,
+ 0x90, 0x98, 0x89, 0x8a, 0x89, 0x8a, 0x3f, 0x3f, 0x4c, 0x2e, 0x31, 0x3b,
+ 0x8e, 0x8e, 0x8b, 0xab, 0xb2, 0xb7, 0x54, 0x5f, 0x72, 0x4b, 0x59, 0x72,
+ 0x89, 0x9d, 0xb1, 0x8f, 0xaa, 0xb7, 0x75, 0x8b, 0x9a, 0x98, 0xa0, 0xb7,
+ 0xbe, 0xcd, 0xe0, 0x84, 0xa1, 0xc2, 0x26, 0x4c, 0x71, 0x35, 0x57, 0x6c,
+ 0x70, 0x85, 0x8d, 0x93, 0xa1, 0xb2, 0x6c, 0x7e, 0x9c, 0x34, 0x4b, 0x71,
+ 0x2b, 0x47, 0x76, 0x2a, 0x43, 0x6b, 0x2d, 0x40, 0x5b, 0x5f, 0x6a, 0x76,
+ 0xc4, 0xcb, 0xcb, 0xff, 0xff, 0xff, 0xe3, 0xe7, 0xf2, 0x9d, 0x9f, 0xb6,
+ 0x5c, 0x60, 0x77, 0x26, 0x2c, 0x46, 0x28, 0x30, 0x47, 0x35, 0x41, 0x51,
+ 0x1f, 0x2d, 0x3d, 0x24, 0x30, 0x45, 0x67, 0x74, 0x86, 0x84, 0x91, 0x99,
+ 0xb8, 0xbf, 0xc7, 0xda, 0xdf, 0xe5, 0xb8, 0xb9, 0xbd, 0x4f, 0x4e, 0x51,
+ 0x28, 0x29, 0x2b, 0x2e, 0x2f, 0x33, 0x2e, 0x32, 0x39, 0x39, 0x3f, 0x48,
+ 0x2e, 0x2e, 0x32, 0x47, 0x48, 0x45, 0x5a, 0x5d, 0x52, 0x79, 0x7c, 0x6d,
+ 0xc1, 0xc2, 0xb4, 0xb8, 0xb8, 0xad, 0x8e, 0x8f, 0x8b, 0x6d, 0x71, 0x71,
+ 0x56, 0x55, 0x64, 0x3b, 0x40, 0x54, 0x2b, 0x37, 0x46, 0x26, 0x33, 0x3c,
+ 0x55, 0x64, 0x6f, 0x61, 0x79, 0x85, 0x82, 0x99, 0xa7, 0x9d, 0xb1, 0xbb,
+ 0x8f, 0xac, 0xc1, 0x40, 0x5d, 0x75, 0x54, 0x6b, 0x85, 0xa1, 0xb5, 0xd1,
+ 0x42, 0x5f, 0x7f, 0x19, 0x3e, 0x62, 0x42, 0x65, 0x89, 0x84, 0x9b, 0xbc,
+ 0x1a, 0x33, 0x62, 0x54, 0x72, 0x8f, 0x65, 0x7f, 0xa1, 0x15, 0x2e, 0x56,
+ 0x59, 0x73, 0x8d, 0x3e, 0x57, 0x73, 0x24, 0x3c, 0x64, 0x48, 0x61, 0x7e,
+ 0x68, 0x7c, 0x89, 0x4f, 0x60, 0x7c, 0x17, 0x29, 0x4e, 0x34, 0x48, 0x5b,
+ 0x7d, 0x93, 0xa0, 0x3a, 0x4e, 0x62, 0x89, 0x9a, 0xb7, 0x33, 0x41, 0x73,
+ 0x16, 0x23, 0x3c, 0x36, 0x41, 0x54, 0x37, 0x42, 0x53, 0x2d, 0x39, 0x48,
+ 0x2b, 0x38, 0x48, 0x2c, 0x3b, 0x4b, 0x2e, 0x3b, 0x4a, 0x2e, 0x3a, 0x47,
+ 0x31, 0x3e, 0x47, 0x30, 0x3d, 0x46, 0x31, 0x3d, 0x49, 0x31, 0x3d, 0x4b,
+ 0x34, 0x3e, 0x4d, 0x31, 0x3b, 0x4a, 0x30, 0x3a, 0x46, 0x2d, 0x36, 0x42,
+ 0x2b, 0x33, 0x3d, 0x2a, 0x31, 0x3b, 0x28, 0x2c, 0x37, 0x24, 0x27, 0x30,
+ 0x25, 0x28, 0x2d, 0x2a, 0x2b, 0x2f, 0x2d, 0x2d, 0x32, 0x29, 0x2a, 0x31,
+ 0x25, 0x29, 0x34, 0x26, 0x2d, 0x37, 0x31, 0x38, 0x42, 0x3a, 0x41, 0x4c,
+ 0x3c, 0x44, 0x4f, 0x3a, 0x41, 0x4d, 0x3b, 0x42, 0x4e, 0x36, 0x3b, 0x47,
+ 0x2b, 0x30, 0x35, 0x21, 0x26, 0x2a, 0x21, 0x26, 0x2a, 0x26, 0x2b, 0x2e,
+ 0x2b, 0x2f, 0x31, 0x27, 0x2b, 0x2c, 0x2b, 0x2d, 0x2e, 0x36, 0x38, 0x37,
+ 0x3f, 0x47, 0x4e, 0x3b, 0x44, 0x4d, 0x2f, 0x39, 0x40, 0x2b, 0x30, 0x36,
+ 0x27, 0x2b, 0x2e, 0x27, 0x2b, 0x2e, 0x31, 0x36, 0x3c, 0x3b, 0x43, 0x4c,
+ 0x37, 0x41, 0x4a, 0x31, 0x37, 0x3f, 0x25, 0x27, 0x2c, 0x22, 0x25, 0x2a,
+ 0x38, 0x3f, 0x45, 0x49, 0x50, 0x58, 0x3c, 0x43, 0x49, 0x33, 0x39, 0x3d,
+ 0x2f, 0x37, 0x39, 0x2d, 0x35, 0x37, 0x2c, 0x34, 0x36, 0x2d, 0x36, 0x36,
+ 0x2c, 0x34, 0x36, 0x31, 0x36, 0x39, 0x31, 0x36, 0x3a, 0x31, 0x34, 0x39,
+ 0x2f, 0x33, 0x34, 0x2f, 0x35, 0x35, 0x2d, 0x35, 0x37, 0x2b, 0x33, 0x36,
+ 0x2e, 0x36, 0x39, 0x33, 0x38, 0x3b, 0x30, 0x34, 0x35, 0x31, 0x35, 0x36,
+ 0x30, 0x35, 0x39, 0x30, 0x35, 0x39, 0x2e, 0x33, 0x37, 0x2e, 0x31, 0x36,
+ 0x2f, 0x32, 0x37, 0x2d, 0x30, 0x36, 0x30, 0x32, 0x35, 0x31, 0x32, 0x36,
+ 0x2b, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x2c, 0x30, 0x33, 0x2c, 0x30, 0x33,
+ 0x2e, 0x31, 0x36, 0x2d, 0x32, 0x36, 0x2a, 0x32, 0x34, 0x29, 0x31, 0x33,
+ 0x2d, 0x31, 0x37, 0x2c, 0x2f, 0x34, 0x2f, 0x33, 0x36, 0x29, 0x2d, 0x2e,
+ 0x20, 0x24, 0x23, 0x1e, 0x21, 0x1f, 0x1a, 0x1a, 0x1a, 0x18, 0x18, 0x18,
+ 0x15, 0x16, 0x18, 0x13, 0x16, 0x19, 0x11, 0x14, 0x19, 0x0e, 0x11, 0x18,
+ 0x11, 0x14, 0x1a, 0x10, 0x15, 0x19, 0x10, 0x14, 0x18, 0x0e, 0x13, 0x16,
+ 0x10, 0x14, 0x17, 0x0e, 0x11, 0x14, 0x0c, 0x10, 0x13, 0x0c, 0x12, 0x15,
+ 0x11, 0x16, 0x1a, 0x10, 0x16, 0x1a, 0x0f, 0x16, 0x1a, 0x13, 0x1b, 0x1e,
+ 0x2b, 0x52, 0x7b, 0x2c, 0x4f, 0x7c, 0x2a, 0x48, 0x77, 0x2b, 0x47, 0x79,
+ 0x24, 0x44, 0x75, 0x21, 0x49, 0x79, 0x23, 0x55, 0x86, 0x20, 0x59, 0x8c,
+ 0x1d, 0x54, 0x8c, 0x1b, 0x51, 0x89, 0x1c, 0x51, 0x88, 0x1e, 0x51, 0x88,
+ 0x24, 0x55, 0x8d, 0x24, 0x55, 0x8d, 0x2a, 0x5c, 0x91, 0x1f, 0x50, 0x85,
+ 0x1e, 0x4d, 0x8c, 0x24, 0x4e, 0x8b, 0x22, 0x4d, 0x82, 0x2e, 0x5c, 0x91,
+ 0x25, 0x57, 0x8e, 0x1b, 0x4d, 0x85, 0x26, 0x4f, 0x85, 0x33, 0x54, 0x85,
+ 0x3a, 0x5a, 0x84, 0x27, 0x51, 0x87, 0x1d, 0x4c, 0x8b, 0x35, 0x5f, 0x95,
+ 0x34, 0x59, 0x89, 0x33, 0x58, 0x88, 0x71, 0x98, 0xbf, 0x83, 0xa5, 0xc1,
+ 0x3d, 0x63, 0x80, 0x23, 0x51, 0x7b, 0x22, 0x53, 0x89, 0x22, 0x4d, 0x87,
+ 0x26, 0x4d, 0x88, 0x24, 0x4f, 0x89, 0x23, 0x51, 0x83, 0x24, 0x51, 0x7c,
+ 0x28, 0x53, 0x80, 0x24, 0x50, 0x7e, 0x26, 0x54, 0x86, 0x24, 0x52, 0x89,
+ 0x20, 0x4e, 0x89, 0x23, 0x51, 0x89, 0x1e, 0x4e, 0x7e, 0x2d, 0x5d, 0x88,
+ 0x3b, 0x61, 0x86, 0x36, 0x53, 0x77, 0x9e, 0xb6, 0xd3, 0xa4, 0xbf, 0xd8,
+ 0x6e, 0x8f, 0xaa, 0x3a, 0x5e, 0x80, 0x37, 0x5b, 0x81, 0x2d, 0x4f, 0x75,
+ 0x23, 0x40, 0x69, 0x21, 0x36, 0x61, 0x20, 0x33, 0x5a, 0x38, 0x4c, 0x6b,
+ 0x6b, 0x7d, 0x94, 0x5c, 0x65, 0x76, 0x25, 0x33, 0x3e, 0x16, 0x2e, 0x36,
+ 0x1a, 0x31, 0x4c, 0x1d, 0x43, 0x66, 0x27, 0x4d, 0x76, 0x27, 0x3e, 0x69,
+ 0x1b, 0x30, 0x61, 0x1e, 0x41, 0x73, 0x2b, 0x56, 0x7c, 0x97, 0xb6, 0xd2,
+ 0x7c, 0x91, 0xaa, 0x5d, 0x73, 0x83, 0xa5, 0xbb, 0xd0, 0x52, 0x68, 0x7f,
+ 0x8e, 0xa5, 0xb6, 0x92, 0xa6, 0xbc, 0x99, 0xad, 0xc7, 0x9a, 0xaf, 0xc2,
+ 0x41, 0x51, 0x6e, 0x22, 0x34, 0x5b, 0x23, 0x37, 0x5c, 0x26, 0x3d, 0x55,
+ 0x35, 0x47, 0x5f, 0x49, 0x58, 0x76, 0x2d, 0x40, 0x5b, 0x38, 0x4e, 0x61,
+ 0x8b, 0x98, 0xb0, 0x8d, 0x9b, 0xb1, 0x50, 0x63, 0x74, 0x46, 0x5d, 0x6d,
+ 0x4b, 0x64, 0x76, 0x50, 0x68, 0x7e, 0x41, 0x5a, 0x74, 0x40, 0x5a, 0x75,
+ 0x46, 0x5c, 0x7a, 0x49, 0x57, 0x6f, 0xa5, 0xae, 0xb3, 0xb5, 0xba, 0xb1,
+ 0x4c, 0x52, 0x54, 0x34, 0x39, 0x4f, 0x94, 0x99, 0xa9, 0xfd, 0xff, 0xff,
+ 0xd5, 0xd7, 0xd1, 0x65, 0x6c, 0x77, 0x3b, 0x46, 0x66, 0x48, 0x5a, 0x82,
+ 0x31, 0x45, 0x64, 0x85, 0x96, 0xa7, 0xa6, 0xb2, 0xbc, 0x6e, 0x74, 0x85,
+ 0x51, 0x61, 0x7b, 0x35, 0x49, 0x59, 0x33, 0x41, 0x4e, 0x36, 0x3d, 0x4e,
+ 0x2c, 0x3e, 0x57, 0x37, 0x57, 0x74, 0x34, 0x4f, 0x69, 0x3c, 0x48, 0x60,
+ 0x4f, 0x5f, 0x75, 0x52, 0x62, 0x78, 0x57, 0x68, 0x71, 0x74, 0x81, 0x7e,
+ 0x6b, 0x6f, 0x78, 0x40, 0x3d, 0x59, 0x32, 0x34, 0x41, 0x79, 0x82, 0x72,
+ 0xbd, 0xbe, 0xb6, 0x73, 0x72, 0x7b, 0x3f, 0x42, 0x53, 0x4a, 0x57, 0x66,
+ 0x53, 0x6b, 0x7e, 0x3b, 0x57, 0x71, 0x5b, 0x6e, 0x87, 0xac, 0xb6, 0xc9,
+ 0x8c, 0xa1, 0xbd, 0x3e, 0x60, 0x7b, 0x5b, 0x7a, 0x8f, 0xa0, 0xb1, 0xbe,
+ 0xa8, 0xb3, 0xbd, 0x9b, 0xb0, 0xc0, 0x93, 0xab, 0xc5, 0x76, 0x86, 0xa7,
+ 0x34, 0x45, 0x6f, 0x2c, 0x3b, 0x66, 0x24, 0x33, 0x5a, 0x23, 0x30, 0x50,
+ 0x40, 0x4a, 0x61, 0x9c, 0xa4, 0xb3, 0xda, 0xde, 0xee, 0x9e, 0x9e, 0xb2,
+ 0x44, 0x3e, 0x5c, 0x40, 0x3f, 0x5c, 0x35, 0x3d, 0x5f, 0x27, 0x36, 0x5a,
+ 0x1f, 0x33, 0x4d, 0x31, 0x44, 0x51, 0x81, 0x92, 0xa0, 0x7f, 0x8f, 0xa5,
+ 0x67, 0x79, 0x8d, 0x7f, 0x8f, 0x9f, 0x6e, 0x79, 0x87, 0x2f, 0x36, 0x42,
+ 0x23, 0x2a, 0x34, 0x43, 0x4a, 0x53, 0x32, 0x3b, 0x44, 0x40, 0x49, 0x51,
+ 0x50, 0x52, 0x46, 0x65, 0x68, 0x57, 0x61, 0x64, 0x51, 0x5e, 0x5f, 0x4c,
+ 0x80, 0x7e, 0x70, 0xb7, 0xb5, 0xae, 0xb7, 0xb6, 0xb8, 0x79, 0x7a, 0x82,
+ 0x40, 0x41, 0x4b, 0x38, 0x3c, 0x47, 0x2d, 0x35, 0x3e, 0x51, 0x5b, 0x63,
+ 0x72, 0x83, 0x8b, 0x80, 0x96, 0xa1, 0x96, 0xad, 0xbb, 0x6a, 0x82, 0x91,
+ 0x75, 0x93, 0xac, 0x87, 0x9b, 0xad, 0x97, 0xa6, 0xbd, 0x6f, 0x85, 0xa7,
+ 0x40, 0x5b, 0x79, 0x73, 0x8d, 0x9f, 0x69, 0x7f, 0x99, 0x39, 0x51, 0x79,
+ 0x21, 0x3f, 0x62, 0x56, 0x72, 0x96, 0x64, 0x7f, 0x97, 0x47, 0x63, 0x73,
+ 0x7a, 0x91, 0xae, 0x23, 0x3a, 0x5d, 0x5f, 0x79, 0x94, 0x6a, 0x85, 0x99,
+ 0x80, 0x92, 0xad, 0x60, 0x70, 0x91, 0x10, 0x20, 0x4a, 0x2e, 0x41, 0x56,
+ 0x8d, 0xa3, 0xa4, 0x88, 0x9b, 0xaa, 0x69, 0x79, 0x9b, 0x25, 0x34, 0x59,
+ 0x1e, 0x2d, 0x42, 0x34, 0x41, 0x51, 0x3f, 0x4b, 0x5b, 0x33, 0x3f, 0x4d,
+ 0x2c, 0x39, 0x49, 0x27, 0x37, 0x46, 0x2a, 0x38, 0x45, 0x30, 0x3d, 0x48,
+ 0x32, 0x3f, 0x48, 0x35, 0x40, 0x4b, 0x35, 0x3f, 0x4b, 0x33, 0x3c, 0x4b,
+ 0x31, 0x3a, 0x49, 0x31, 0x39, 0x48, 0x33, 0x3b, 0x48, 0x2e, 0x36, 0x43,
+ 0x2b, 0x33, 0x3b, 0x27, 0x2e, 0x38, 0x25, 0x29, 0x34, 0x24, 0x27, 0x2e,
+ 0x27, 0x29, 0x2e, 0x2d, 0x2e, 0x32, 0x2d, 0x2e, 0x33, 0x29, 0x2a, 0x32,
+ 0x27, 0x29, 0x35, 0x25, 0x27, 0x33, 0x26, 0x29, 0x34, 0x30, 0x34, 0x3f,
+ 0x3a, 0x40, 0x4b, 0x3b, 0x41, 0x4e, 0x3d, 0x45, 0x52, 0x39, 0x40, 0x4d,
+ 0x30, 0x35, 0x3a, 0x27, 0x2c, 0x2f, 0x27, 0x2c, 0x30, 0x2d, 0x32, 0x35,
+ 0x31, 0x35, 0x39, 0x26, 0x2b, 0x2d, 0x26, 0x2a, 0x2b, 0x36, 0x3a, 0x3b,
+ 0x48, 0x4f, 0x5a, 0x40, 0x49, 0x53, 0x30, 0x39, 0x40, 0x26, 0x2b, 0x2f,
+ 0x24, 0x28, 0x29, 0x29, 0x2d, 0x2f, 0x3b, 0x40, 0x47, 0x3e, 0x45, 0x50,
+ 0x36, 0x3d, 0x47, 0x2c, 0x30, 0x39, 0x20, 0x23, 0x28, 0x26, 0x2b, 0x2f,
+ 0x38, 0x3f, 0x45, 0x3f, 0x48, 0x50, 0x37, 0x40, 0x45, 0x32, 0x3b, 0x3e,
+ 0x32, 0x3b, 0x3d, 0x2d, 0x37, 0x38, 0x2a, 0x34, 0x35, 0x2a, 0x33, 0x34,
+ 0x2c, 0x34, 0x35, 0x32, 0x36, 0x3a, 0x31, 0x36, 0x39, 0x33, 0x37, 0x3b,
+ 0x32, 0x37, 0x38, 0x2e, 0x33, 0x36, 0x2f, 0x35, 0x38, 0x2d, 0x34, 0x37,
+ 0x2f, 0x35, 0x39, 0x30, 0x35, 0x38, 0x2f, 0x33, 0x36, 0x2c, 0x30, 0x31,
+ 0x2f, 0x34, 0x38, 0x2e, 0x33, 0x37, 0x2d, 0x32, 0x36, 0x2e, 0x31, 0x36,
+ 0x2d, 0x30, 0x34, 0x30, 0x33, 0x37, 0x31, 0x32, 0x36, 0x2f, 0x30, 0x34,
+ 0x2d, 0x33, 0x33, 0x2e, 0x32, 0x35, 0x2e, 0x31, 0x35, 0x2d, 0x30, 0x35,
+ 0x2c, 0x2f, 0x34, 0x2c, 0x31, 0x35, 0x2b, 0x30, 0x33, 0x2b, 0x32, 0x34,
+ 0x2e, 0x31, 0x37, 0x2b, 0x2e, 0x32, 0x28, 0x2a, 0x2c, 0x1e, 0x20, 0x1f,
+ 0x1e, 0x1f, 0x1d, 0x1f, 0x20, 0x1e, 0x1a, 0x1a, 0x18, 0x18, 0x18, 0x16,
+ 0x12, 0x16, 0x18, 0x12, 0x16, 0x19, 0x11, 0x14, 0x19, 0x13, 0x16, 0x1b,
+ 0x12, 0x15, 0x1a, 0x0f, 0x12, 0x17, 0x11, 0x14, 0x19, 0x0d, 0x12, 0x15,
+ 0x0e, 0x13, 0x15, 0x0c, 0x10, 0x14, 0x0c, 0x11, 0x15, 0x0c, 0x14, 0x17,
+ 0x0d, 0x15, 0x18, 0x0e, 0x16, 0x19, 0x16, 0x1b, 0x1f, 0x1f, 0x24, 0x28,
+ 0x35, 0x55, 0x7d, 0x2f, 0x4e, 0x7b, 0x2f, 0x4f, 0x80, 0x2b, 0x4d, 0x7d,
+ 0x27, 0x4b, 0x79, 0x1d, 0x43, 0x72, 0x22, 0x4a, 0x7a, 0x2d, 0x57, 0x88,
+ 0x23, 0x57, 0x8c, 0x20, 0x55, 0x8c, 0x1e, 0x52, 0x8b, 0x1b, 0x4e, 0x87,
+ 0x1d, 0x50, 0x87, 0x1e, 0x4f, 0x87, 0x1a, 0x4b, 0x83, 0x26, 0x57, 0x8f,
+ 0x22, 0x53, 0x8b, 0x1e, 0x4d, 0x86, 0x20, 0x4b, 0x87, 0x36, 0x5c, 0x98,
+ 0x30, 0x55, 0x8f, 0x23, 0x4b, 0x82, 0x27, 0x53, 0x88, 0x2c, 0x5b, 0x8f,
+ 0x2c, 0x57, 0x89, 0x28, 0x50, 0x80, 0x27, 0x4f, 0x83, 0x27, 0x51, 0x89,
+ 0x3a, 0x5e, 0x8e, 0x84, 0x9f, 0xc2, 0x82, 0xa1, 0xc4, 0x38, 0x61, 0x8b,
+ 0x4d, 0x7b, 0x9b, 0x4f, 0x74, 0x91, 0x34, 0x56, 0x7a, 0x29, 0x51, 0x84,
+ 0x25, 0x53, 0x8d, 0x23, 0x4e, 0x86, 0x22, 0x4f, 0x7d, 0x24, 0x53, 0x7d,
+ 0x21, 0x50, 0x7d, 0x23, 0x52, 0x80, 0x24, 0x54, 0x84, 0x21, 0x51, 0x85,
+ 0x21, 0x4f, 0x83, 0x28, 0x52, 0x82, 0x35, 0x5d, 0x84, 0x7c, 0xa1, 0xc2,
+ 0x89, 0xa3, 0xc2, 0x31, 0x4f, 0x73, 0x43, 0x65, 0x8b, 0x50, 0x72, 0x96,
+ 0x91, 0xad, 0xc8, 0x9c, 0xb2, 0xc8, 0x6f, 0x85, 0x9c, 0x36, 0x4d, 0x6a,
+ 0x2e, 0x42, 0x64, 0x31, 0x42, 0x6c, 0x25, 0x3a, 0x65, 0x29, 0x47, 0x69,
+ 0x2a, 0x48, 0x5d, 0x47, 0x5c, 0x6d, 0x40, 0x52, 0x66, 0x24, 0x3c, 0x57,
+ 0x24, 0x47, 0x72, 0x22, 0x4e, 0x7f, 0x24, 0x47, 0x78, 0x20, 0x36, 0x63,
+ 0x1f, 0x3b, 0x65, 0x21, 0x4d, 0x79, 0x21, 0x47, 0x70, 0x54, 0x67, 0x89,
+ 0x97, 0xa8, 0xc0, 0x99, 0xae, 0xc0, 0x8b, 0xa0, 0xba, 0x56, 0x6e, 0x8a,
+ 0xaf, 0xc9, 0xdd, 0x57, 0x71, 0x87, 0x3e, 0x55, 0x72, 0xb2, 0xca, 0xe1,
+ 0x55, 0x71, 0x93, 0x16, 0x31, 0x5f, 0x1c, 0x39, 0x63, 0x33, 0x51, 0x6f,
+ 0x43, 0x5d, 0x75, 0x2d, 0x45, 0x60, 0x40, 0x58, 0x71, 0x97, 0xb0, 0xc0,
+ 0x84, 0x96, 0xab, 0x4c, 0x5a, 0x70, 0x4e, 0x58, 0x6d, 0x52, 0x5a, 0x6e,
+ 0x53, 0x5e, 0x71, 0x52, 0x63, 0x76, 0x54, 0x6c, 0x7e, 0x4a, 0x64, 0x77,
+ 0x38, 0x45, 0x61, 0x35, 0x41, 0x57, 0x8f, 0x9b, 0xa3, 0xec, 0xf2, 0xf0,
+ 0xd2, 0xd3, 0xcd, 0x67, 0x67, 0x6e, 0x31, 0x34, 0x4e, 0x71, 0x79, 0x9a,
+ 0xe3, 0xe3, 0xe9, 0xcc, 0xcf, 0xdf, 0x7d, 0x88, 0x9b, 0x46, 0x57, 0x61,
+ 0x5f, 0x73, 0x72, 0x8f, 0xa0, 0xa0, 0xaf, 0xb8, 0xc1, 0x8b, 0x8f, 0xa2,
+ 0x38, 0x40, 0x55, 0x37, 0x3d, 0x48, 0x42, 0x43, 0x47, 0x45, 0x44, 0x4d,
+ 0x29, 0x33, 0x42, 0x27, 0x3d, 0x4b, 0x4b, 0x5b, 0x66, 0x7b, 0x80, 0x88,
+ 0x59, 0x5e, 0x5e, 0x54, 0x5b, 0x5b, 0x62, 0x68, 0x6a, 0x49, 0x4d, 0x52,
+ 0x2c, 0x2f, 0x39, 0x36, 0x38, 0x42, 0x5d, 0x64, 0x60, 0xa1, 0xad, 0x9b,
+ 0x58, 0x68, 0x72, 0x3e, 0x43, 0x4b, 0x58, 0x54, 0x56, 0x87, 0x86, 0x87,
+ 0x63, 0x6b, 0x77, 0x2f, 0x40, 0x5c, 0x65, 0x7b, 0x9a, 0x82, 0x9e, 0xb7,
+ 0x45, 0x66, 0x85, 0x5d, 0x78, 0x8b, 0xb1, 0xc5, 0xd2, 0x8b, 0x9d, 0xb4,
+ 0x55, 0x6d, 0x89, 0x89, 0xa5, 0xbe, 0x92, 0xa8, 0xbd, 0x92, 0xa1, 0xb6,
+ 0x8f, 0x9d, 0xb9, 0x46, 0x55, 0x78, 0x1d, 0x2e, 0x59, 0x1e, 0x30, 0x5e,
+ 0x2b, 0x3e, 0x68, 0x1f, 0x30, 0x52, 0x5e, 0x6e, 0x86, 0x5f, 0x6d, 0x80,
+ 0x45, 0x4f, 0x6b, 0x4c, 0x56, 0x78, 0x34, 0x40, 0x66, 0x2d, 0x37, 0x57,
+ 0x3a, 0x44, 0x4e, 0x87, 0x93, 0x8c, 0xbe, 0xcb, 0xd2, 0x86, 0x96, 0xb2,
+ 0x59, 0x6e, 0x88, 0x4d, 0x60, 0x78, 0x32, 0x40, 0x55, 0x1e, 0x28, 0x38,
+ 0x22, 0x28, 0x33, 0x34, 0x38, 0x3e, 0x2d, 0x32, 0x36, 0x4b, 0x4f, 0x51,
+ 0x5d, 0x5f, 0x4e, 0x60, 0x63, 0x52, 0x5f, 0x61, 0x53, 0x61, 0x62, 0x54,
+ 0x5c, 0x5a, 0x4f, 0x61, 0x5e, 0x59, 0x70, 0x6f, 0x73, 0x58, 0x5a, 0x65,
+ 0x27, 0x34, 0x3c, 0x1b, 0x24, 0x2b, 0x3b, 0x42, 0x4a, 0x83, 0x8c, 0x95,
+ 0x67, 0x72, 0x7f, 0x75, 0x84, 0x95, 0x8f, 0xa6, 0xbb, 0x6f, 0x8d, 0xa4,
+ 0x6e, 0x8a, 0x97, 0x77, 0x8d, 0xa9, 0x5c, 0x72, 0x9c, 0x41, 0x5a, 0x82,
+ 0x7e, 0x95, 0xb1, 0x6c, 0x7c, 0x93, 0x66, 0x7b, 0x90, 0x57, 0x76, 0x8d,
+ 0x4d, 0x6e, 0x81, 0x5e, 0x7c, 0x96, 0x96, 0xaf, 0xc9, 0x68, 0x7f, 0x9e,
+ 0x36, 0x49, 0x72, 0x21, 0x38, 0x54, 0x8f, 0xa9, 0xbc, 0x25, 0x3d, 0x5b,
+ 0x3f, 0x4f, 0x70, 0x78, 0x88, 0xab, 0x11, 0x24, 0x44, 0x25, 0x3a, 0x4c,
+ 0x72, 0x86, 0x8d, 0x8f, 0xa1, 0xb7, 0x4c, 0x59, 0x82, 0x23, 0x32, 0x50,
+ 0x1c, 0x2d, 0x3f, 0x32, 0x40, 0x4f, 0x3d, 0x49, 0x57, 0x30, 0x3c, 0x48,
+ 0x2c, 0x39, 0x46, 0x2c, 0x39, 0x47, 0x31, 0x3f, 0x4a, 0x34, 0x41, 0x4a,
+ 0x37, 0x41, 0x4d, 0x38, 0x42, 0x4e, 0x35, 0x3f, 0x4b, 0x30, 0x39, 0x48,
+ 0x30, 0x37, 0x47, 0x35, 0x3d, 0x4b, 0x32, 0x3a, 0x47, 0x2d, 0x35, 0x42,
+ 0x29, 0x31, 0x3b, 0x26, 0x2d, 0x38, 0x24, 0x2a, 0x36, 0x25, 0x29, 0x32,
+ 0x29, 0x2c, 0x33, 0x29, 0x2c, 0x31, 0x28, 0x2c, 0x33, 0x26, 0x28, 0x31,
+ 0x26, 0x27, 0x31, 0x24, 0x24, 0x2e, 0x23, 0x26, 0x2f, 0x25, 0x29, 0x31,
+ 0x2d, 0x31, 0x3a, 0x39, 0x3d, 0x48, 0x3a, 0x40, 0x4d, 0x38, 0x3e, 0x4b,
+ 0x38, 0x3d, 0x43, 0x32, 0x37, 0x3b, 0x30, 0x35, 0x39, 0x31, 0x36, 0x3a,
+ 0x30, 0x35, 0x38, 0x23, 0x28, 0x2b, 0x24, 0x29, 0x2c, 0x39, 0x3e, 0x42,
+ 0x48, 0x50, 0x59, 0x40, 0x48, 0x52, 0x31, 0x3b, 0x40, 0x25, 0x2b, 0x2b,
+ 0x21, 0x24, 0x23, 0x28, 0x2c, 0x2b, 0x39, 0x3e, 0x43, 0x36, 0x3f, 0x48,
+ 0x2d, 0x32, 0x3b, 0x26, 0x29, 0x30, 0x1f, 0x22, 0x27, 0x2a, 0x2f, 0x33,
+ 0x3b, 0x44, 0x49, 0x38, 0x43, 0x49, 0x33, 0x3c, 0x41, 0x32, 0x3a, 0x3d,
+ 0x2e, 0x39, 0x3b, 0x2d, 0x37, 0x38, 0x2e, 0x36, 0x38, 0x2d, 0x35, 0x37,
+ 0x30, 0x36, 0x36, 0x32, 0x37, 0x3a, 0x34, 0x39, 0x3c, 0x33, 0x38, 0x3b,
+ 0x30, 0x35, 0x38, 0x31, 0x36, 0x3a, 0x30, 0x35, 0x39, 0x2f, 0x34, 0x3a,
+ 0x2d, 0x32, 0x38, 0x2e, 0x33, 0x37, 0x2e, 0x31, 0x36, 0x2e, 0x32, 0x35,
+ 0x2b, 0x30, 0x33, 0x2b, 0x30, 0x33, 0x2b, 0x30, 0x33, 0x2d, 0x32, 0x35,
+ 0x2f, 0x33, 0x36, 0x2c, 0x2f, 0x33, 0x2c, 0x2f, 0x34, 0x2a, 0x2d, 0x32,
+ 0x2b, 0x30, 0x34, 0x2a, 0x2e, 0x33, 0x2d, 0x30, 0x36, 0x2e, 0x31, 0x38,
+ 0x2d, 0x30, 0x37, 0x2e, 0x31, 0x36, 0x2c, 0x31, 0x35, 0x2e, 0x33, 0x37,
+ 0x2c, 0x2f, 0x34, 0x26, 0x28, 0x2b, 0x21, 0x21, 0x23, 0x1c, 0x1b, 0x1a,
+ 0x1c, 0x1c, 0x1a, 0x1a, 0x1a, 0x18, 0x17, 0x17, 0x15, 0x16, 0x17, 0x15,
+ 0x12, 0x16, 0x19, 0x10, 0x14, 0x17, 0x15, 0x18, 0x1c, 0x15, 0x18, 0x1d,
+ 0x11, 0x14, 0x19, 0x11, 0x14, 0x19, 0x12, 0x15, 0x1a, 0x0f, 0x13, 0x16,
+ 0x0f, 0x13, 0x16, 0x0e, 0x12, 0x15, 0x11, 0x16, 0x1a, 0x10, 0x18, 0x1b,
+ 0x0e, 0x16, 0x19, 0x14, 0x1a, 0x1d, 0x20, 0x24, 0x26, 0x25, 0x26, 0x28,
+ 0x49, 0x5b, 0x7c, 0x3f, 0x54, 0x7b, 0x34, 0x51, 0x7e, 0x29, 0x4d, 0x7b,
+ 0x24, 0x4a, 0x77, 0x25, 0x4a, 0x77, 0x26, 0x46, 0x75, 0x2e, 0x4b, 0x7b,
+ 0x29, 0x56, 0x88, 0x25, 0x55, 0x8a, 0x20, 0x54, 0x8c, 0x1e, 0x52, 0x8a,
+ 0x1d, 0x52, 0x88, 0x1d, 0x50, 0x87, 0x1e, 0x4f, 0x87, 0x2a, 0x59, 0x93,
+ 0x23, 0x52, 0x8a, 0x1b, 0x4e, 0x8a, 0x1b, 0x50, 0x91, 0x22, 0x52, 0x92,
+ 0x28, 0x50, 0x88, 0x28, 0x4d, 0x82, 0x2b, 0x55, 0x8c, 0x2f, 0x5e, 0x99,
+ 0x22, 0x4f, 0x86, 0x26, 0x51, 0x82, 0x26, 0x4d, 0x7c, 0x39, 0x5b, 0x8c,
+ 0x83, 0xa2, 0xcd, 0x78, 0x96, 0xba, 0x35, 0x5b, 0x83, 0x24, 0x50, 0x80,
+ 0x8b, 0xaf, 0xd4, 0xb5, 0xce, 0xe6, 0x6f, 0x85, 0x9d, 0x2d, 0x54, 0x78,
+ 0x1f, 0x51, 0x83, 0x28, 0x57, 0x8a, 0x22, 0x51, 0x83, 0x21, 0x52, 0x87,
+ 0x1e, 0x53, 0x89, 0x20, 0x55, 0x89, 0x1d, 0x53, 0x86, 0x1f, 0x51, 0x84,
+ 0x23, 0x4f, 0x80, 0x3e, 0x62, 0x8c, 0x8f, 0xad, 0xcb, 0x92, 0xab, 0xc3,
+ 0x9e, 0xb7, 0xd0, 0x42, 0x68, 0x88, 0x24, 0x53, 0x7d, 0x41, 0x6c, 0x97,
+ 0x60, 0x7d, 0x9e, 0xac, 0xbc, 0xce, 0x6c, 0x79, 0x8c, 0x34, 0x41, 0x5e,
+ 0x35, 0x41, 0x5c, 0x50, 0x5b, 0x77, 0x29, 0x3c, 0x57, 0x25, 0x44, 0x61,
+ 0x1c, 0x3a, 0x5b, 0x25, 0x3b, 0x63, 0x2c, 0x3e, 0x6b, 0x31, 0x4b, 0x76,
+ 0x29, 0x51, 0x7f, 0x1f, 0x40, 0x71, 0x1e, 0x3d, 0x69, 0x20, 0x49, 0x6b,
+ 0x23, 0x53, 0x6d, 0x21, 0x48, 0x63, 0x21, 0x33, 0x4d, 0x44, 0x49, 0x5d,
+ 0x45, 0x50, 0x6b, 0x31, 0x40, 0x64, 0x7c, 0x8f, 0xaf, 0x74, 0x8b, 0xa7,
+ 0x6a, 0x83, 0xa2, 0x8d, 0xa8, 0xc1, 0x85, 0x9f, 0xb3, 0x8e, 0xa7, 0xc3,
+ 0x33, 0x5b, 0x85, 0x1d, 0x41, 0x75, 0x2d, 0x4c, 0x7c, 0x21, 0x41, 0x5c,
+ 0x24, 0x41, 0x49, 0x55, 0x6e, 0x77, 0x8b, 0x9d, 0xb1, 0x85, 0x94, 0xb3,
+ 0x3a, 0x4f, 0x6e, 0x34, 0x46, 0x64, 0x44, 0x4d, 0x6b, 0x53, 0x57, 0x74,
+ 0x5b, 0x5f, 0x78, 0x56, 0x5f, 0x75, 0x52, 0x62, 0x74, 0x57, 0x6b, 0x7c,
+ 0x9e, 0xa6, 0xa5, 0x6d, 0x74, 0x6d, 0x5b, 0x62, 0x67, 0x78, 0x7f, 0x92,
+ 0xdc, 0xe5, 0xea, 0xe5, 0xf0, 0xe3, 0x7e, 0x88, 0x7d, 0x3d, 0x40, 0x4f,
+ 0x57, 0x61, 0x76, 0x70, 0x7a, 0x94, 0x91, 0xa0, 0xb5, 0x70, 0x81, 0x8a,
+ 0x72, 0x83, 0x86, 0xe4, 0xf2, 0xf6, 0xa3, 0xaf, 0xbf, 0x3e, 0x46, 0x5b,
+ 0x38, 0x39, 0x49, 0x3e, 0x3e, 0x42, 0x44, 0x40, 0x40, 0x40, 0x3e, 0x42,
+ 0x38, 0x3b, 0x41, 0x2e, 0x38, 0x37, 0x41, 0x48, 0x46, 0x72, 0x73, 0x73,
+ 0x40, 0x3f, 0x41, 0x35, 0x34, 0x33, 0x4c, 0x4a, 0x4b, 0x38, 0x37, 0x3e,
+ 0x35, 0x37, 0x3c, 0x4e, 0x52, 0x52, 0x76, 0x7c, 0x79, 0x52, 0x5a, 0x5e,
+ 0x23, 0x32, 0x43, 0x37, 0x3d, 0x3d, 0x99, 0x98, 0x8f, 0x97, 0x98, 0x9e,
+ 0x40, 0x45, 0x55, 0x2c, 0x38, 0x46, 0x49, 0x5c, 0x6e, 0x43, 0x5f, 0x7a,
+ 0x36, 0x5a, 0x72, 0xa6, 0xba, 0xce, 0x84, 0x99, 0xb0, 0x33, 0x5b, 0x80,
+ 0x16, 0x45, 0x75, 0x42, 0x5e, 0x87, 0x9f, 0xaf, 0xc4, 0x85, 0x99, 0xa4,
+ 0x9e, 0xb3, 0xc4, 0x8d, 0xa2, 0xbb, 0x56, 0x6f, 0x90, 0x22, 0x3f, 0x69,
+ 0x23, 0x41, 0x6f, 0x19, 0x38, 0x61, 0x18, 0x38, 0x57, 0x23, 0x45, 0x5d,
+ 0x3e, 0x67, 0x7e, 0x32, 0x54, 0x76, 0x38, 0x4c, 0x6c, 0x5e, 0x65, 0x6b,
+ 0xb8, 0xb6, 0xa6, 0xf9, 0xf8, 0xed, 0xf5, 0xfa, 0xfe, 0xb1, 0xc0, 0xd5,
+ 0x76, 0x82, 0x9a, 0x58, 0x64, 0x7a, 0x2e, 0x37, 0x4d, 0x18, 0x1d, 0x2f,
+ 0x1f, 0x21, 0x2b, 0x2a, 0x2a, 0x2c, 0x63, 0x62, 0x5e, 0x80, 0x7d, 0x75,
+ 0x74, 0x73, 0x6c, 0x63, 0x62, 0x5d, 0x5d, 0x5e, 0x59, 0x60, 0x5f, 0x59,
+ 0x64, 0x61, 0x58, 0x5d, 0x5c, 0x54, 0x3e, 0x40, 0x40, 0x32, 0x38, 0x3d,
+ 0x13, 0x29, 0x31, 0x21, 0x2e, 0x34, 0x3b, 0x42, 0x48, 0x6e, 0x77, 0x81,
+ 0x96, 0x9f, 0xb0, 0x8c, 0x99, 0xab, 0x54, 0x69, 0x81, 0x49, 0x68, 0x86,
+ 0x78, 0x92, 0xa9, 0x43, 0x65, 0x8a, 0x10, 0x35, 0x62, 0x4c, 0x69, 0x8b,
+ 0x9b, 0xb0, 0xc7, 0x52, 0x6b, 0x84, 0x7b, 0x9a, 0xb6, 0x66, 0x85, 0xa0,
+ 0x8d, 0xaa, 0xb2, 0x65, 0x7e, 0x99, 0x63, 0x78, 0xa9, 0x39, 0x4f, 0x7c,
+ 0x39, 0x50, 0x6e, 0x4e, 0x63, 0x7e, 0x51, 0x66, 0x87, 0x15, 0x29, 0x4f,
+ 0x38, 0x4c, 0x60, 0x78, 0x8b, 0xa9, 0x24, 0x39, 0x4c, 0x6e, 0x82, 0x94,
+ 0x3f, 0x52, 0x6e, 0x59, 0x6c, 0x89, 0x49, 0x58, 0x7f, 0x13, 0x22, 0x48,
+ 0x16, 0x27, 0x3a, 0x2d, 0x3b, 0x4a, 0x33, 0x3d, 0x4b, 0x32, 0x3c, 0x48,
+ 0x33, 0x3f, 0x4d, 0x35, 0x41, 0x4f, 0x35, 0x41, 0x4d, 0x37, 0x44, 0x4d,
+ 0x39, 0x42, 0x51, 0x37, 0x40, 0x4e, 0x31, 0x3b, 0x47, 0x2f, 0x39, 0x45,
+ 0x31, 0x3b, 0x47, 0x34, 0x3b, 0x48, 0x2e, 0x36, 0x43, 0x2d, 0x35, 0x42,
+ 0x28, 0x31, 0x3b, 0x25, 0x2c, 0x37, 0x2d, 0x33, 0x3f, 0x2d, 0x31, 0x3c,
+ 0x2a, 0x2e, 0x36, 0x2a, 0x2f, 0x35, 0x27, 0x2c, 0x34, 0x22, 0x26, 0x30,
+ 0x23, 0x26, 0x2f, 0x22, 0x25, 0x2c, 0x25, 0x25, 0x2d, 0x28, 0x28, 0x30,
+ 0x28, 0x28, 0x30, 0x2b, 0x2d, 0x37, 0x33, 0x35, 0x41, 0x3a, 0x3e, 0x49,
+ 0x3c, 0x3f, 0x47, 0x39, 0x3d, 0x43, 0x38, 0x3b, 0x41, 0x39, 0x3e, 0x42,
+ 0x33, 0x38, 0x3c, 0x21, 0x26, 0x2a, 0x32, 0x37, 0x3b, 0x50, 0x55, 0x59,
+ 0x49, 0x52, 0x59, 0x3b, 0x45, 0x4c, 0x2e, 0x38, 0x3c, 0x21, 0x28, 0x28,
+ 0x21, 0x25, 0x24, 0x28, 0x2c, 0x2b, 0x2e, 0x34, 0x36, 0x2d, 0x37, 0x3c,
+ 0x29, 0x2e, 0x37, 0x25, 0x28, 0x2d, 0x25, 0x29, 0x2c, 0x2e, 0x33, 0x36,
+ 0x38, 0x42, 0x44, 0x35, 0x3e, 0x43, 0x32, 0x38, 0x3e, 0x31, 0x37, 0x3b,
+ 0x2d, 0x37, 0x39, 0x2b, 0x33, 0x36, 0x2d, 0x35, 0x37, 0x2e, 0x34, 0x37,
+ 0x2d, 0x33, 0x33, 0x2d, 0x32, 0x34, 0x33, 0x38, 0x3b, 0x31, 0x36, 0x39,
+ 0x2e, 0x33, 0x36, 0x2f, 0x34, 0x38, 0x2d, 0x32, 0x38, 0x30, 0x33, 0x39,
+ 0x2e, 0x31, 0x38, 0x30, 0x34, 0x3a, 0x2e, 0x31, 0x36, 0x2c, 0x30, 0x33,
+ 0x2b, 0x30, 0x33, 0x2b, 0x30, 0x33, 0x2d, 0x32, 0x34, 0x2b, 0x30, 0x33,
+ 0x2c, 0x31, 0x34, 0x2b, 0x30, 0x33, 0x2b, 0x30, 0x34, 0x29, 0x2e, 0x32,
+ 0x2b, 0x2e, 0x35, 0x2c, 0x2f, 0x38, 0x2c, 0x2e, 0x37, 0x2e, 0x31, 0x3a,
+ 0x2e, 0x31, 0x38, 0x2d, 0x30, 0x37, 0x2c, 0x30, 0x35, 0x2c, 0x30, 0x34,
+ 0x25, 0x29, 0x2c, 0x1e, 0x20, 0x21, 0x1c, 0x1a, 0x1b, 0x1b, 0x19, 0x18,
+ 0x1f, 0x1b, 0x1a, 0x17, 0x16, 0x14, 0x17, 0x17, 0x15, 0x16, 0x19, 0x18,
+ 0x11, 0x15, 0x16, 0x0e, 0x12, 0x15, 0x0f, 0x13, 0x16, 0x11, 0x15, 0x18,
+ 0x11, 0x15, 0x18, 0x0e, 0x12, 0x15, 0x10, 0x14, 0x17, 0x12, 0x15, 0x19,
+ 0x14, 0x15, 0x1a, 0x11, 0x14, 0x19, 0x0d, 0x15, 0x18, 0x0d, 0x15, 0x18,
+ 0x11, 0x18, 0x1b, 0x1f, 0x22, 0x24, 0x25, 0x24, 0x25, 0x2b, 0x27, 0x26,
+ 0x59, 0x5c, 0x6d, 0x56, 0x5f, 0x77, 0x45, 0x59, 0x7d, 0x32, 0x50, 0x7c,
+ 0x2b, 0x4c, 0x7b, 0x26, 0x49, 0x76, 0x2a, 0x49, 0x77, 0x2e, 0x49, 0x78,
+ 0x25, 0x4b, 0x7a, 0x26, 0x50, 0x84, 0x23, 0x54, 0x8b, 0x1e, 0x56, 0x8e,
+ 0x1e, 0x57, 0x8d, 0x1e, 0x54, 0x8a, 0x28, 0x58, 0x92, 0x29, 0x55, 0x92,
+ 0x22, 0x4e, 0x8c, 0x20, 0x51, 0x90, 0x1e, 0x52, 0x90, 0x21, 0x55, 0x8e,
+ 0x24, 0x52, 0x87, 0x20, 0x4e, 0x85, 0x20, 0x50, 0x8f, 0x20, 0x54, 0x98,
+ 0x1c, 0x50, 0x94, 0x1c, 0x53, 0x8b, 0x3d, 0x69, 0x97, 0x87, 0xa2, 0xcc,
+ 0x73, 0x8e, 0xb1, 0x4d, 0x72, 0x94, 0x5e, 0x87, 0xab, 0x2e, 0x50, 0x7b,
+ 0x64, 0x8a, 0xb7, 0x8c, 0xaf, 0xd3, 0xa0, 0xbf, 0xdb, 0x70, 0x8e, 0xac,
+ 0x4d, 0x71, 0x95, 0x3a, 0x62, 0x8e, 0x21, 0x4f, 0x82, 0x1f, 0x51, 0x8a,
+ 0x23, 0x54, 0x8e, 0x25, 0x57, 0x8e, 0x20, 0x53, 0x88, 0x20, 0x51, 0x86,
+ 0x1d, 0x4a, 0x7d, 0x61, 0x88, 0xb5, 0x8c, 0xac, 0xd2, 0x40, 0x5e, 0x7c,
+ 0x7e, 0x9d, 0xbb, 0x6e, 0x93, 0xb1, 0x30, 0x59, 0x7b, 0x4c, 0x6f, 0x95,
+ 0x5c, 0x74, 0x90, 0x8c, 0x99, 0xa1, 0x7a, 0x80, 0x86, 0x40, 0x43, 0x53,
+ 0x4d, 0x54, 0x63, 0x70, 0x75, 0x81, 0x53, 0x5f, 0x68, 0x39, 0x50, 0x62,
+ 0x22, 0x38, 0x5c, 0x18, 0x28, 0x58, 0x22, 0x36, 0x66, 0x34, 0x56, 0x7e,
+ 0x20, 0x45, 0x6f, 0x1c, 0x3a, 0x62, 0x27, 0x49, 0x70, 0x23, 0x52, 0x77,
+ 0x25, 0x51, 0x6f, 0x31, 0x47, 0x59, 0x62, 0x64, 0x6b, 0x93, 0x93, 0x92,
+ 0x50, 0x57, 0x5b, 0x1a, 0x23, 0x34, 0x51, 0x60, 0x73, 0x8e, 0xa3, 0xb7,
+ 0x65, 0x7d, 0x98, 0x8e, 0xa6, 0xc0, 0x9d, 0xb6, 0xcf, 0x5c, 0x73, 0x97,
+ 0x43, 0x65, 0x84, 0x55, 0x74, 0x95, 0x60, 0x78, 0x9a, 0x5f, 0x75, 0x8e,
+ 0x4e, 0x64, 0x6d, 0x89, 0xa1, 0xa5, 0x7b, 0x8d, 0xa4, 0x2f, 0x3d, 0x6a,
+ 0x27, 0x3e, 0x67, 0x28, 0x3e, 0x64, 0x21, 0x32, 0x54, 0x3b, 0x48, 0x66,
+ 0x58, 0x62, 0x7a, 0x5b, 0x63, 0x78, 0x4f, 0x58, 0x6a, 0x50, 0x5c, 0x6a,
+ 0xd1, 0xdb, 0xdb, 0xee, 0xf0, 0xec, 0xa1, 0x9c, 0xa5, 0x66, 0x66, 0x80,
+ 0x4a, 0x57, 0x72, 0xb9, 0xca, 0xd4, 0xe9, 0xf5, 0xf4, 0x9e, 0xa2, 0xa2,
+ 0x53, 0x62, 0x70, 0x3d, 0x4c, 0x63, 0x69, 0x73, 0x8a, 0x80, 0x8a, 0x99,
+ 0x4c, 0x53, 0x64, 0x55, 0x5b, 0x73, 0x55, 0x5b, 0x71, 0x31, 0x39, 0x45,
+ 0x3d, 0x3e, 0x48, 0x40, 0x40, 0x42, 0x3e, 0x3e, 0x3e, 0x3f, 0x3e, 0x44,
+ 0x41, 0x40, 0x45, 0x3f, 0x40, 0x3b, 0x39, 0x3a, 0x37, 0x31, 0x31, 0x38,
+ 0x22, 0x20, 0x29, 0x46, 0x45, 0x45, 0x6a, 0x69, 0x65, 0x4e, 0x4c, 0x50,
+ 0x51, 0x50, 0x5a, 0x4e, 0x51, 0x59, 0x34, 0x37, 0x3f, 0x2d, 0x2f, 0x3c,
+ 0x2b, 0x2f, 0x33, 0x6b, 0x6c, 0x67, 0x85, 0x8b, 0x8b, 0x4d, 0x5a, 0x69,
+ 0x3c, 0x47, 0x55, 0x5b, 0x60, 0x60, 0x8c, 0x92, 0x95, 0x53, 0x61, 0x72,
+ 0x38, 0x4e, 0x5e, 0x76, 0x8d, 0xa1, 0x46, 0x65, 0x83, 0x28, 0x53, 0x78,
+ 0x19, 0x40, 0x69, 0x2b, 0x43, 0x67, 0x86, 0x97, 0xaf, 0x9a, 0xb0, 0xbe,
+ 0x88, 0xa1, 0xb2, 0x8d, 0xa6, 0xba, 0x93, 0xad, 0xc4, 0x6f, 0x89, 0xa6,
+ 0x33, 0x51, 0x75, 0x28, 0x49, 0x71, 0x33, 0x56, 0x7e, 0x2c, 0x52, 0x77,
+ 0x2e, 0x58, 0x7c, 0x2f, 0x55, 0x7a, 0x34, 0x51, 0x6e, 0x56, 0x64, 0x6b,
+ 0xbf, 0xc0, 0xbc, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xbc, 0xc6, 0xd3,
+ 0x7f, 0x84, 0x9b, 0x5a, 0x60, 0x76, 0x27, 0x2f, 0x47, 0x22, 0x2b, 0x41,
+ 0x21, 0x2a, 0x39, 0x45, 0x4c, 0x52, 0xc0, 0xc3, 0xc0, 0xb9, 0xb8, 0xb0,
+ 0xa5, 0xa1, 0x9b, 0x8f, 0x8e, 0x8c, 0x6f, 0x6f, 0x71, 0x5d, 0x5d, 0x5b,
+ 0x5e, 0x5d, 0x58, 0x44, 0x45, 0x3f, 0x28, 0x2c, 0x2d, 0x1c, 0x24, 0x2c,
+ 0x14, 0x24, 0x2e, 0x45, 0x4d, 0x50, 0x6a, 0x6f, 0x72, 0x59, 0x68, 0x6e,
+ 0x6e, 0x80, 0x8c, 0x8c, 0x9a, 0xa9, 0x5d, 0x70, 0x87, 0x1d, 0x39, 0x5c,
+ 0x20, 0x3d, 0x63, 0x32, 0x56, 0x72, 0x55, 0x78, 0x8d, 0x81, 0x9e, 0xb1,
+ 0x92, 0xaa, 0xc0, 0x92, 0xb0, 0xc6, 0x66, 0x85, 0xa1, 0x2a, 0x43, 0x62,
+ 0x8b, 0xa2, 0xab, 0x71, 0x84, 0xa9, 0x1a, 0x2f, 0x5f, 0x59, 0x72, 0x90,
+ 0x7a, 0x95, 0xab, 0x60, 0x76, 0x97, 0x2e, 0x41, 0x66, 0x26, 0x3a, 0x55,
+ 0x34, 0x4d, 0x56, 0x8d, 0xa3, 0xbb, 0x75, 0x8c, 0x9f, 0x74, 0x88, 0xa8,
+ 0x1a, 0x2e, 0x53, 0x59, 0x6e, 0x84, 0x45, 0x58, 0x78, 0x13, 0x23, 0x4b,
+ 0x17, 0x27, 0x3d, 0x2b, 0x38, 0x4a, 0x30, 0x38, 0x4a, 0x2f, 0x35, 0x47,
+ 0x35, 0x3e, 0x4f, 0x31, 0x3c, 0x4c, 0x34, 0x3f, 0x4e, 0x3b, 0x45, 0x51,
+ 0x36, 0x42, 0x4f, 0x31, 0x3b, 0x4a, 0x2d, 0x37, 0x43, 0x30, 0x3a, 0x46,
+ 0x2d, 0x38, 0x43, 0x2b, 0x34, 0x41, 0x27, 0x2f, 0x3c, 0x27, 0x2f, 0x3c,
+ 0x26, 0x2d, 0x37, 0x28, 0x2e, 0x39, 0x2f, 0x33, 0x3f, 0x29, 0x2d, 0x38,
+ 0x27, 0x2b, 0x33, 0x29, 0x2d, 0x34, 0x24, 0x28, 0x31, 0x22, 0x26, 0x32,
+ 0x23, 0x27, 0x30, 0x23, 0x26, 0x2d, 0x26, 0x29, 0x2e, 0x28, 0x29, 0x2d,
+ 0x29, 0x29, 0x2d, 0x27, 0x26, 0x2d, 0x29, 0x29, 0x31, 0x32, 0x32, 0x3c,
+ 0x39, 0x3c, 0x43, 0x3a, 0x3d, 0x44, 0x35, 0x38, 0x3f, 0x37, 0x3c, 0x40,
+ 0x33, 0x38, 0x3c, 0x29, 0x2e, 0x32, 0x3b, 0x42, 0x46, 0x51, 0x5a, 0x5d,
+ 0x44, 0x4d, 0x54, 0x36, 0x3f, 0x46, 0x29, 0x32, 0x39, 0x1f, 0x24, 0x28,
+ 0x26, 0x29, 0x2b, 0x2f, 0x33, 0x34, 0x35, 0x3a, 0x3d, 0x2d, 0x37, 0x3a,
+ 0x29, 0x2f, 0x35, 0x28, 0x2c, 0x2f, 0x30, 0x34, 0x35, 0x3a, 0x40, 0x42,
+ 0x39, 0x42, 0x44, 0x33, 0x3c, 0x41, 0x30, 0x36, 0x3a, 0x30, 0x33, 0x38,
+ 0x2c, 0x33, 0x36, 0x2e, 0x33, 0x37, 0x2d, 0x32, 0x35, 0x2e, 0x32, 0x35,
+ 0x2f, 0x33, 0x34, 0x2c, 0x32, 0x32, 0x2d, 0x32, 0x35, 0x2d, 0x34, 0x36,
+ 0x2d, 0x34, 0x34, 0x2d, 0x32, 0x35, 0x2e, 0x31, 0x36, 0x2d, 0x30, 0x35,
+ 0x2d, 0x30, 0x36, 0x2f, 0x32, 0x37, 0x2e, 0x32, 0x35, 0x2e, 0x32, 0x33,
+ 0x2a, 0x2e, 0x31, 0x2b, 0x30, 0x33, 0x2f, 0x34, 0x36, 0x2c, 0x33, 0x33,
+ 0x29, 0x31, 0x33, 0x29, 0x31, 0x33, 0x28, 0x30, 0x33, 0x28, 0x30, 0x35,
+ 0x2d, 0x31, 0x37, 0x2b, 0x2e, 0x36, 0x2d, 0x30, 0x39, 0x2e, 0x33, 0x39,
+ 0x30, 0x33, 0x3a, 0x2c, 0x2f, 0x34, 0x25, 0x29, 0x2c, 0x20, 0x24, 0x27,
+ 0x1d, 0x21, 0x22, 0x19, 0x19, 0x19, 0x17, 0x15, 0x14, 0x1b, 0x17, 0x16,
+ 0x1e, 0x1a, 0x19, 0x1b, 0x19, 0x18, 0x17, 0x17, 0x17, 0x11, 0x15, 0x15,
+ 0x10, 0x15, 0x16, 0x10, 0x14, 0x15, 0x0c, 0x10, 0x11, 0x10, 0x14, 0x15,
+ 0x10, 0x13, 0x14, 0x0e, 0x11, 0x13, 0x11, 0x12, 0x16, 0x13, 0x15, 0x19,
+ 0x13, 0x14, 0x19, 0x10, 0x13, 0x18, 0x0e, 0x13, 0x18, 0x0f, 0x17, 0x1a,
+ 0x18, 0x1e, 0x21, 0x23, 0x23, 0x23, 0x2e, 0x28, 0x26, 0x38, 0x2f, 0x2a,
+ 0x5d, 0x59, 0x5c, 0x5c, 0x5c, 0x6a, 0x56, 0x5f, 0x7e, 0x43, 0x57, 0x81,
+ 0x30, 0x4b, 0x7a, 0x25, 0x45, 0x74, 0x2c, 0x4b, 0x79, 0x29, 0x48, 0x76,
+ 0x28, 0x47, 0x77, 0x25, 0x4b, 0x7e, 0x21, 0x50, 0x88, 0x21, 0x58, 0x90,
+ 0x1d, 0x59, 0x8d, 0x1d, 0x54, 0x89, 0x24, 0x54, 0x8e, 0x28, 0x54, 0x92,
+ 0x23, 0x54, 0x8a, 0x2b, 0x58, 0x8f, 0x30, 0x59, 0x91, 0x30, 0x55, 0x8d,
+ 0x3f, 0x63, 0x9a, 0x46, 0x6b, 0xa1, 0x30, 0x5a, 0x8e, 0x20, 0x4f, 0x83,
+ 0x26, 0x51, 0x90, 0x41, 0x64, 0x90, 0x91, 0xb0, 0xd2, 0x70, 0x90, 0xb9,
+ 0x48, 0x6a, 0x8f, 0x9c, 0xbb, 0xd4, 0xb5, 0xce, 0xe4, 0x4c, 0x65, 0x88,
+ 0x1b, 0x4f, 0x87, 0x19, 0x52, 0x88, 0x59, 0x83, 0xb0, 0xbc, 0xcf, 0xee,
+ 0xaa, 0xb6, 0xd0, 0x48, 0x60, 0x85, 0x25, 0x50, 0x80, 0x21, 0x52, 0x86,
+ 0x2b, 0x52, 0x87, 0x2a, 0x53, 0x87, 0x25, 0x53, 0x85, 0x22, 0x54, 0x89,
+ 0x1d, 0x4f, 0x86, 0x39, 0x68, 0x9e, 0x38, 0x63, 0x95, 0x27, 0x50, 0x7d,
+ 0x59, 0x77, 0xa0, 0x92, 0xaf, 0xcc, 0x4d, 0x65, 0x80, 0x4b, 0x5e, 0x7c,
+ 0x5c, 0x6b, 0x7c, 0xb1, 0xba, 0xb5, 0xbe, 0xc0, 0xb2, 0x90, 0x8b, 0x84,
+ 0x66, 0x6d, 0x70, 0x72, 0x74, 0x78, 0x80, 0x85, 0x88, 0x57, 0x64, 0x6d,
+ 0x2a, 0x39, 0x51, 0x21, 0x2d, 0x50, 0x24, 0x3c, 0x5d, 0x39, 0x60, 0x7b,
+ 0x1b, 0x3f, 0x65, 0x13, 0x38, 0x5d, 0x24, 0x4c, 0x74, 0x1b, 0x3e, 0x72,
+ 0x21, 0x39, 0x67, 0x77, 0x81, 0x93, 0xc8, 0xca, 0xc5, 0x8d, 0x8f, 0x81,
+ 0x2f, 0x30, 0x2e, 0x24, 0x2a, 0x29, 0x30, 0x3b, 0x47, 0x57, 0x69, 0x79,
+ 0x84, 0x9c, 0xa2, 0x84, 0x9c, 0xa5, 0x5f, 0x76, 0x88, 0x9c, 0xb2, 0xc3,
+ 0xa6, 0xbb, 0xc7, 0xab, 0xbc, 0xc2, 0xbd, 0xca, 0xd5, 0xbd, 0xc8, 0xdf,
+ 0x9f, 0xae, 0xc8, 0x6e, 0x85, 0x9a, 0x3d, 0x57, 0x75, 0x25, 0x3d, 0x6b,
+ 0x23, 0x3b, 0x65, 0x38, 0x51, 0x77, 0x27, 0x41, 0x61, 0x2a, 0x41, 0x59,
+ 0x4e, 0x60, 0x74, 0x4c, 0x59, 0x67, 0x52, 0x59, 0x64, 0x62, 0x66, 0x71,
+ 0x78, 0x80, 0x8c, 0xc0, 0xc4, 0xd0, 0xfb, 0xfb, 0xfc, 0xa6, 0xa7, 0x9d,
+ 0x52, 0x55, 0x5c, 0x51, 0x56, 0x7a, 0x71, 0x7d, 0x9f, 0xb0, 0xc3, 0xd1,
+ 0x8b, 0x9b, 0xa1, 0x66, 0x71, 0x7a, 0xa1, 0xa7, 0xaa, 0xe6, 0xe7, 0xe4,
+ 0x80, 0x7f, 0x81, 0x30, 0x2c, 0x3d, 0x3b, 0x38, 0x49, 0x41, 0x40, 0x46,
+ 0x3f, 0x3f, 0x46, 0x3e, 0x42, 0x43, 0x3d, 0x42, 0x45, 0x40, 0x44, 0x4d,
+ 0x3e, 0x3d, 0x42, 0x41, 0x3d, 0x39, 0x41, 0x41, 0x43, 0x39, 0x3d, 0x4c,
+ 0x2b, 0x30, 0x2a, 0x5c, 0x5f, 0x56, 0x6c, 0x6d, 0x66, 0x2f, 0x2f, 0x2d,
+ 0x3e, 0x42, 0x44, 0x41, 0x45, 0x48, 0x32, 0x33, 0x38, 0x3c, 0x3b, 0x41,
+ 0x58, 0x5d, 0x54, 0x5f, 0x5f, 0x62, 0x3d, 0x42, 0x50, 0x35, 0x40, 0x49,
+ 0x66, 0x6d, 0x69, 0xaa, 0xa6, 0x9d, 0x84, 0x85, 0x87, 0x4e, 0x5c, 0x69,
+ 0x5a, 0x5f, 0x6c, 0x56, 0x73, 0x89, 0x30, 0x5a, 0x76, 0x78, 0x8f, 0xa8,
+ 0x51, 0x5a, 0x70, 0x47, 0x58, 0x6f, 0x9b, 0xb2, 0xca, 0x99, 0xac, 0xc3,
+ 0x73, 0x86, 0xa0, 0x9d, 0xb2, 0xc7, 0xa3, 0xb7, 0xc6, 0x9a, 0xad, 0xbf,
+ 0x90, 0xa6, 0xc1, 0x46, 0x5f, 0x85, 0x25, 0x40, 0x6e, 0x20, 0x3d, 0x6f,
+ 0x26, 0x38, 0x6f, 0x2b, 0x45, 0x6c, 0x25, 0x48, 0x63, 0x1b, 0x36, 0x53,
+ 0x37, 0x46, 0x63, 0xad, 0xb3, 0xc5, 0xe8, 0xee, 0xf7, 0xb7, 0xbe, 0xca,
+ 0x75, 0x77, 0x90, 0x43, 0x4a, 0x66, 0x22, 0x30, 0x4d, 0x25, 0x36, 0x54,
+ 0x1f, 0x33, 0x4c, 0x45, 0x57, 0x66, 0x8d, 0x9c, 0xa1, 0xbb, 0xc5, 0xc2,
+ 0xca, 0xc9, 0xba, 0xb1, 0xb0, 0xaa, 0x8a, 0x89, 0x88, 0x5d, 0x5d, 0x5b,
+ 0x4a, 0x4b, 0x46, 0x33, 0x35, 0x34, 0x20, 0x24, 0x2d, 0x1e, 0x25, 0x36,
+ 0x1f, 0x26, 0x31, 0x54, 0x54, 0x56, 0x8d, 0x93, 0x92, 0x82, 0x98, 0x9a,
+ 0x5f, 0x78, 0x7f, 0x64, 0x76, 0x7f, 0x9b, 0xac, 0xc1, 0x48, 0x60, 0x84,
+ 0x2b, 0x4f, 0x6a, 0x78, 0x8f, 0xa0, 0x94, 0xa8, 0xaf, 0xa0, 0xb8, 0xc4,
+ 0x75, 0x8f, 0xa9, 0x6f, 0x85, 0xa5, 0x8d, 0x9f, 0xb9, 0x86, 0x99, 0xa9,
+ 0x99, 0xa9, 0xbf, 0x59, 0x6b, 0x8f, 0x34, 0x4e, 0x5d, 0x97, 0xb4, 0xb9,
+ 0x3d, 0x57, 0x76, 0x4f, 0x66, 0x88, 0x84, 0x98, 0xa9, 0x7d, 0x90, 0xa3,
+ 0x4c, 0x66, 0x74, 0x88, 0xa0, 0xb7, 0x7a, 0x91, 0xb2, 0x24, 0x38, 0x6c,
+ 0x08, 0x1f, 0x3e, 0x66, 0x7e, 0x85, 0x41, 0x55, 0x71, 0x0f, 0x22, 0x41,
+ 0x15, 0x25, 0x3e, 0x2c, 0x38, 0x4d, 0x32, 0x39, 0x4c, 0x27, 0x2e, 0x41,
+ 0x2b, 0x32, 0x45, 0x2e, 0x36, 0x4b, 0x32, 0x3a, 0x4d, 0x31, 0x3a, 0x4b,
+ 0x2e, 0x3a, 0x48, 0x2e, 0x39, 0x47, 0x2e, 0x38, 0x44, 0x2d, 0x37, 0x43,
+ 0x28, 0x32, 0x3e, 0x2a, 0x34, 0x40, 0x25, 0x2d, 0x3a, 0x24, 0x2c, 0x39,
+ 0x24, 0x29, 0x33, 0x2c, 0x30, 0x3c, 0x2b, 0x2d, 0x39, 0x26, 0x29, 0x32,
+ 0x27, 0x2a, 0x31, 0x22, 0x25, 0x2c, 0x22, 0x25, 0x2e, 0x24, 0x26, 0x31,
+ 0x23, 0x29, 0x30, 0x22, 0x27, 0x2d, 0x26, 0x29, 0x2d, 0x2b, 0x2b, 0x2d,
+ 0x2b, 0x2a, 0x2d, 0x27, 0x26, 0x2a, 0x2a, 0x27, 0x2e, 0x27, 0x26, 0x2d,
+ 0x27, 0x2a, 0x31, 0x2f, 0x32, 0x39, 0x33, 0x36, 0x3d, 0x33, 0x38, 0x3e,
+ 0x31, 0x36, 0x3a, 0x2f, 0x34, 0x38, 0x31, 0x38, 0x3b, 0x38, 0x40, 0x43,
+ 0x36, 0x3f, 0x46, 0x2e, 0x37, 0x41, 0x26, 0x2f, 0x38, 0x24, 0x29, 0x31,
+ 0x2d, 0x2f, 0x34, 0x3d, 0x41, 0x44, 0x3b, 0x40, 0x43, 0x2d, 0x37, 0x39,
+ 0x22, 0x28, 0x2c, 0x25, 0x29, 0x2c, 0x34, 0x38, 0x39, 0x40, 0x46, 0x47,
+ 0x39, 0x41, 0x43, 0x31, 0x3a, 0x3d, 0x2e, 0x33, 0x37, 0x32, 0x33, 0x38,
+ 0x32, 0x36, 0x3a, 0x30, 0x35, 0x39, 0x2e, 0x32, 0x35, 0x2c, 0x30, 0x32,
+ 0x2c, 0x30, 0x31, 0x2c, 0x32, 0x32, 0x28, 0x30, 0x32, 0x2e, 0x35, 0x37,
+ 0x2c, 0x32, 0x31, 0x2c, 0x32, 0x32, 0x2e, 0x32, 0x35, 0x2d, 0x30, 0x34,
+ 0x2c, 0x30, 0x33, 0x2c, 0x30, 0x33, 0x2e, 0x32, 0x33, 0x2f, 0x33, 0x33,
+ 0x2b, 0x2f, 0x32, 0x29, 0x2e, 0x30, 0x2a, 0x30, 0x30, 0x28, 0x31, 0x30,
+ 0x28, 0x31, 0x31, 0x29, 0x32, 0x33, 0x2d, 0x37, 0x39, 0x29, 0x33, 0x37,
+ 0x2e, 0x32, 0x38, 0x2c, 0x2f, 0x36, 0x2e, 0x32, 0x39, 0x2a, 0x2f, 0x35,
+ 0x29, 0x2d, 0x32, 0x27, 0x2a, 0x2e, 0x1f, 0x23, 0x24, 0x1a, 0x1c, 0x1e,
+ 0x16, 0x1a, 0x19, 0x17, 0x17, 0x17, 0x19, 0x15, 0x14, 0x1c, 0x16, 0x16,
+ 0x1c, 0x16, 0x17, 0x19, 0x15, 0x16, 0x13, 0x13, 0x15, 0x0e, 0x12, 0x13,
+ 0x11, 0x15, 0x16, 0x10, 0x14, 0x15, 0x0e, 0x12, 0x12, 0x0f, 0x13, 0x12,
+ 0x0f, 0x12, 0x12, 0x0f, 0x10, 0x12, 0x0f, 0x10, 0x12, 0x11, 0x12, 0x16,
+ 0x11, 0x12, 0x17, 0x10, 0x12, 0x17, 0x10, 0x15, 0x19, 0x16, 0x1e, 0x21,
+ 0x1f, 0x23, 0x25, 0x26, 0x24, 0x22, 0x33, 0x2b, 0x26, 0x3e, 0x31, 0x2b
+};
+unsigned int serialice_banner_len = 230400;
diff --git a/qemu-0.15.x/softmmu_template.h b/qemu-0.15.x/softmmu_template.h
index c2df9ec..ae42044 100644
--- a/qemu-0.15.x/softmmu_template.h
+++ b/qemu-0.15.x/softmmu_template.h
@@ -16,7 +16,9 @@
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
+
#include "qemu-timer.h"
+#include "serialice.h"
#define DATA_SIZE (1 << SHIFT)
@@ -91,6 +93,16 @@ DATA_TYPE REGPARM glue(glue(__ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
unsigned long addend;
void *retaddr;
+#ifdef CONFIG_SERIALICE
+ uint32_t result;
+ int caught = 0;
+ if (serialice_active && serialice_handle_load((uint32_t)addr, &result, (unsigned int) DATA_SIZE)) {
+ res = (DATA_TYPE)result;
+ caught=1;
+ goto leave_ld;
+ }
+#endif
+
/* test if there is match for unaligned or IO access */
/* XXX: could done more in memory macro in a non portable way */
index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
@@ -134,6 +146,12 @@ DATA_TYPE REGPARM glue(glue(__ld, SUFFIX), MMUSUFFIX)(target_ulong addr,
tlb_fill(addr, READ_ACCESS_TYPE, mmu_idx, retaddr);
goto redo;
}
+
+#ifdef CONFIG_SERIALICE
+leave_ld:
+ if (serialice_active)
+ serialice_log_load(caught, addr, (uint32_t)res, (unsigned int)DATA_SIZE);
+#endif
return res;
}
@@ -232,6 +250,20 @@ void REGPARM glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr,
void *retaddr;
int index;
+#ifdef CONFIG_SERIALICE
+ if (serialice_active && serialice_handle_store((uint32_t)addr,
+ (uint32_t)val, (unsigned int) DATA_SIZE)) {
+ /* The memory catch mechanism does not work particularly well
+ * because of the softmmu is optimizing all accesses to Qemu
+ * "memory". Because of this we need to leave RAM "unassigned"
+ * until RAM init is done, and can't freely switch around.
+ *
+ * It's the right thing, however, to return here.
+ */
+ return;
+ }
+#endif
+
index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
redo:
tlb_addr = env->tlb_table[mmu_idx][index].addr_write;
diff --git a/qemu-0.15.x/target-i386/op_helper.c b/qemu-0.15.x/target-i386/op_helper.c
index 315e18b..81c8075 100644
--- a/qemu-0.15.x/target-i386/op_helper.c
+++ b/qemu-0.15.x/target-i386/op_helper.c
@@ -24,6 +24,7 @@
//#define DEBUG_PCALL
+#include "serialice.h"
#ifdef DEBUG_PCALL
# define LOG_PCALL(...) qemu_log_mask(CPU_LOG_PCALL, ## __VA_ARGS__)
@@ -556,31 +557,64 @@ void helper_check_iol(uint32_t t0)
void helper_outb(uint32_t port, uint32_t data)
{
+#ifdef CONFIG_SERIALICE
+ if (serialice_active) {
+ serialice_outb(data & 0xff, port);
+ return;
+ }
+#endif
cpu_outb(port, data & 0xff);
}
target_ulong helper_inb(uint32_t port)
{
+#ifdef CONFIG_SERIALICE
+ if (serialice_active) {
+ return (target_ulong) serialice_inb(port);
+ }
+#endif
return cpu_inb(port);
}
void helper_outw(uint32_t port, uint32_t data)
{
+#ifdef CONFIG_SERIALICE
+ if (serialice_active) {
+ serialice_outw(data & 0xffff, port);
+ return;
+ }
+#endif
cpu_outw(port, data & 0xffff);
}
target_ulong helper_inw(uint32_t port)
{
+#ifdef CONFIG_SERIALICE
+ if (serialice_active) {
+ return (target_ulong) serialice_inw(port);
+ }
+#endif
return cpu_inw(port);
}
void helper_outl(uint32_t port, uint32_t data)
{
+#ifdef CONFIG_SERIALICE
+ if (serialice_active) {
+ serialice_outl(data & 0xffffffff, port);
+ return;
+ }
+#endif
cpu_outl(port, data);
}
target_ulong helper_inl(uint32_t port)
{
+#ifdef CONFIG_SERIALICE
+ if (serialice_active) {
+ return (target_ulong) serialice_inl(port);
+ }
+#endif
return cpu_inl(port);
}
@@ -1982,6 +2016,18 @@ void helper_cpuid(void)
helper_svm_check_intercept_param(SVM_EXIT_CPUID, 0);
+#ifdef CONFIG_SERIALICE
+ if (serialice_active) {
+ cpuid_regs_t ret;
+ ret = serialice_cpuid((uint32_t) EAX, (uint32_t) ECX);
+ EAX = ret.eax;
+ EBX = ret.ebx;
+ ECX = ret.ecx;
+ EDX = ret.edx;
+ return;
+ }
+#endif
+
cpu_x86_cpuid(env, (uint32_t)EAX, (uint32_t)ECX, &eax, &ebx, &ecx, &edx);
EAX = eax;
EBX = ebx;
@@ -3053,6 +3099,13 @@ void helper_wrmsr(void)
val = ((uint32_t)EAX) | ((uint64_t)((uint32_t)EDX) << 32);
+#ifdef CONFIG_SERIALICE
+ if (serialice_active) {
+ serialice_wrmsr(val, (uint32_t) ECX, (uint32_t) EDI);
+ return;
+ }
+#endif
+
switch((uint32_t)ECX) {
case MSR_IA32_SYSENTER_CS:
env->sysenter_cs = val & 0xffff;
@@ -3186,6 +3239,15 @@ void helper_rdmsr(void)
helper_svm_check_intercept_param(SVM_EXIT_MSR, 0);
+#ifdef CONFIG_SERIALICE
+ if (serialice_active) {
+ val = serialice_rdmsr((uint32_t) ECX, (uint32_t) EDI);
+ EAX = (uint32_t) (val);
+ EDX = (uint32_t) (val >> 32);
+ return;
+ }
+#endif
+
switch((uint32_t)ECX) {
case MSR_IA32_SYSENTER_CS:
val = env->sysenter_cs;
diff --git a/qemu-0.15.x/vl.c b/qemu-0.15.x/vl.c
index 63260e4..c75385c 100644
--- a/qemu-0.15.x/vl.c
+++ b/qemu-0.15.x/vl.c
@@ -200,6 +200,9 @@ CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
int win2k_install_hack = 0;
int rtc_td_hack = 0;
+#ifdef CONFIG_SERIALICE
+const char *serialice_device = NULL;
+#endif
int usb_enabled = 0;
int singlestep = 0;
int smp_cpus = 1;
@@ -2307,6 +2310,11 @@ int main(int argc, char **argv, char **envp)
exit(1);
#endif
break;
+#ifdef CONFIG_SERIALICE
+ case QEMU_OPTION_serialice:
+ serialice_device = optarg;
+ break;
+#endif
case QEMU_OPTION_portrait:
graphic_rotate = 90;
break;
1
0
April 22, 2012
Kyösti Mälkki (kyosti.malkki(a)gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/915
-gerrit
commit ba9ddeb0975204057dc02ee70c777cb886b6ec59
Author: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
Date: Sat Apr 21 16:45:23 2012 +0300
Import QEMU 0.15.1
Download from QEMU main site:
http://wiki.qemu.org/download/qemu-0.15.1.tar.gz
md5sum: 34f17737baaf1b3495c89cd6d4a607ed
Renamed directory qemu-0.15.1 to qemu-0.15.x
Change-Id: Iaaa13f3c5cdbd5ddf4d235731be91e25607ea7d2
Signed-off-by: Kyösti Mälkki <kyosti.malkki(a)gmail.com>
---
qemu-0.15.x/.gitignore | 72 +
qemu-0.15.x/.gitmodules | 12 +
qemu-0.15.x/CODING_STYLE | 81 +
qemu-0.15.x/COPYING | 339 +
qemu-0.15.x/COPYING.LIB | 504 +
qemu-0.15.x/Changelog | 580 +
qemu-0.15.x/HACKING | 122 +
qemu-0.15.x/LICENSE | 18 +
qemu-0.15.x/MAINTAINERS | 506 +
qemu-0.15.x/Makefile | 403 +
qemu-0.15.x/Makefile.dis | 23 +
qemu-0.15.x/Makefile.hw | 24 +
qemu-0.15.x/Makefile.objs | 387 +
qemu-0.15.x/Makefile.target | 431 +
qemu-0.15.x/Makefile.user | 23 +
qemu-0.15.x/QMP/README | 88 +
qemu-0.15.x/QMP/qmp-events.txt | 266 +
qemu-0.15.x/QMP/qmp-shell | 259 +
qemu-0.15.x/QMP/qmp-spec.txt | 272 +
qemu-0.15.x/QMP/qmp.py | 157 +
qemu-0.15.x/README | 3 +
qemu-0.15.x/TODO | 37 +
qemu-0.15.x/VERSION | 1 +
qemu-0.15.x/a.out.h | 430 +
qemu-0.15.x/acl.c | 184 +
qemu-0.15.x/acl.h | 74 +
qemu-0.15.x/aes.c | 1314 ++
qemu-0.15.x/aes.h | 26 +
qemu-0.15.x/aio.c | 230 +
qemu-0.15.x/alpha-dis.c | 1916 +++
qemu-0.15.x/alpha.ld | 127 +
qemu-0.15.x/arch_init.c | 733 ++
qemu-0.15.x/arch_init.h | 34 +
qemu-0.15.x/arm-dis.c | 4136 +++++++
qemu-0.15.x/arm-semi.c | 509 +
qemu-0.15.x/arm.ld | 153 +
qemu-0.15.x/async.c | 217 +
qemu-0.15.x/audio/alsaaudio.c | 1260 ++
qemu-0.15.x/audio/audio.c | 2066 ++++
qemu-0.15.x/audio/audio.h | 166 +
qemu-0.15.x/audio/audio_int.h | 282 +
qemu-0.15.x/audio/audio_pt_int.c | 173 +
qemu-0.15.x/audio/audio_pt_int.h | 22 +
qemu-0.15.x/audio/audio_template.h | 560 +
qemu-0.15.x/audio/audio_win_int.c | 108 +
qemu-0.15.x/audio/audio_win_int.h | 10 +
qemu-0.15.x/audio/coreaudio.c | 549 +
qemu-0.15.x/audio/dsound_template.h | 293 +
qemu-0.15.x/audio/dsoundaudio.c | 1030 ++
qemu-0.15.x/audio/esdaudio.c | 557 +
qemu-0.15.x/audio/fmodaudio.c | 687 ++
qemu-0.15.x/audio/mixeng.c | 360 +
qemu-0.15.x/audio/mixeng.h | 51 +
qemu-0.15.x/audio/mixeng_template.h | 152 +
qemu-0.15.x/audio/noaudio.c | 173 +
qemu-0.15.x/audio/ossaudio.c | 944 ++
qemu-0.15.x/audio/paaudio.c | 525 +
qemu-0.15.x/audio/rate_template.h | 111 +
qemu-0.15.x/audio/sdlaudio.c | 458 +
qemu-0.15.x/audio/spiceaudio.c | 345 +
qemu-0.15.x/audio/wavaudio.c | 262 +
qemu-0.15.x/audio/wavcapture.c | 161 +
qemu-0.15.x/audio/winwaveaudio.c | 723 ++
qemu-0.15.x/balloon.c | 164 +
qemu-0.15.x/balloon.h | 31 +
qemu-0.15.x/bitmap.c | 256 +
qemu-0.15.x/bitmap.h | 222 +
qemu-0.15.x/bitops.c | 142 +
qemu-0.15.x/bitops.h | 272 +
qemu-0.15.x/block-migration.c | 731 ++
qemu-0.15.x/block-migration.h | 23 +
qemu-0.15.x/block.c | 3039 +++++
qemu-0.15.x/block.h | 305 +
qemu-0.15.x/block/blkdebug.c | 471 +
qemu-0.15.x/block/blkverify.c | 383 +
qemu-0.15.x/block/bochs.c | 230 +
qemu-0.15.x/block/cloop.c | 171 +
qemu-0.15.x/block/cow.c | 324 +
qemu-0.15.x/block/curl.c | 564 +
qemu-0.15.x/block/dmg.c | 312 +
qemu-0.15.x/block/nbd.c | 272 +
qemu-0.15.x/block/parallels.c | 157 +
qemu-0.15.x/block/qcow.c | 1037 ++
qemu-0.15.x/block/qcow2-cache.c | 326 +
qemu-0.15.x/block/qcow2-cluster.c | 979 ++
qemu-0.15.x/block/qcow2-refcount.c | 1185 ++
qemu-0.15.x/block/qcow2-snapshot.c | 457 +
qemu-0.15.x/block/qcow2.c | 1419 +++
qemu-0.15.x/block/qcow2.h | 246 +
qemu-0.15.x/block/qed-check.c | 211 +
qemu-0.15.x/block/qed-cluster.c | 165 +
qemu-0.15.x/block/qed-gencb.c | 32 +
qemu-0.15.x/block/qed-l2-cache.c | 173 +
qemu-0.15.x/block/qed-table.c | 319 +
qemu-0.15.x/block/qed.c | 1504 +++
qemu-0.15.x/block/qed.h | 334 +
qemu-0.15.x/block/raw-posix-aio.h | 43 +
qemu-0.15.x/block/raw-posix.c | 1552 +++
qemu-0.15.x/block/raw-win32.c | 459 +
qemu-0.15.x/block/raw.c | 156 +
qemu-0.15.x/block/rbd.c | 811 ++
qemu-0.15.x/block/sheepdog.c | 2083 ++++
qemu-0.15.x/block/vdi.c | 999 ++
qemu-0.15.x/block/vmdk.c | 1363 +++
qemu-0.15.x/block/vpc.c | 650 +
qemu-0.15.x/block/vvfat.c | 2888 +++++
qemu-0.15.x/block_int.h | 266 +
qemu-0.15.x/blockdev.c | 795 ++
qemu-0.15.x/blockdev.h | 69 +
qemu-0.15.x/bsd-user/bsd-mman.h | 121 +
qemu-0.15.x/bsd-user/bsdload.c | 202 +
qemu-0.15.x/bsd-user/elfload.c | 1577 +++
qemu-0.15.x/bsd-user/errno_defs.h | 149 +
qemu-0.15.x/bsd-user/freebsd/strace.list | 171 +
qemu-0.15.x/bsd-user/freebsd/syscall_nr.h | 373 +
qemu-0.15.x/bsd-user/i386/syscall.h | 161 +
qemu-0.15.x/bsd-user/i386/target_signal.h | 20 +
qemu-0.15.x/bsd-user/main.c | 1143 ++
qemu-0.15.x/bsd-user/mmap.c | 559 +
qemu-0.15.x/bsd-user/netbsd/strace.list | 145 +
qemu-0.15.x/bsd-user/netbsd/syscall_nr.h | 373 +
qemu-0.15.x/bsd-user/openbsd/strace.list | 187 +
qemu-0.15.x/bsd-user/openbsd/syscall_nr.h | 225 +
qemu-0.15.x/bsd-user/qemu-types.h | 24 +
qemu-0.15.x/bsd-user/qemu.h | 394 +
qemu-0.15.x/bsd-user/signal.c | 38 +
qemu-0.15.x/bsd-user/sparc/syscall.h | 9 +
qemu-0.15.x/bsd-user/sparc/target_signal.h | 27 +
qemu-0.15.x/bsd-user/sparc64/syscall.h | 10 +
qemu-0.15.x/bsd-user/sparc64/target_signal.h | 27 +
qemu-0.15.x/bsd-user/strace.c | 191 +
qemu-0.15.x/bsd-user/syscall.c | 559 +
qemu-0.15.x/bsd-user/syscall_defs.h | 114 +
qemu-0.15.x/bsd-user/uaccess.c | 65 +
qemu-0.15.x/bsd-user/x86_64/syscall.h | 116 +
qemu-0.15.x/bsd-user/x86_64/target_signal.h | 19 +
qemu-0.15.x/bswap.h | 240 +
qemu-0.15.x/bt-host.c | 198 +
qemu-0.15.x/bt-host.h | 9 +
qemu-0.15.x/bt-vhci.c | 167 +
qemu-0.15.x/buffered_file.c | 281 +
qemu-0.15.x/buffered_file.h | 30 +
qemu-0.15.x/cache-utils.c | 97 +
qemu-0.15.x/cache-utils.h | 41 +
qemu-0.15.x/check-qdict.c | 402 +
qemu-0.15.x/check-qfloat.c | 76 +
qemu-0.15.x/check-qint.c | 113 +
qemu-0.15.x/check-qjson.c | 795 ++
qemu-0.15.x/check-qlist.c | 153 +
qemu-0.15.x/check-qstring.c | 134 +
qemu-0.15.x/cmd.c | 610 +
qemu-0.15.x/cmd.h | 79 +
qemu-0.15.x/compatfd.c | 128 +
qemu-0.15.x/compatfd.h | 44 +
qemu-0.15.x/compiler.h | 34 +
qemu-0.15.x/config.h | 2 +
qemu-0.15.x/configure | 3637 ++++++
qemu-0.15.x/console.c | 1718 +++
qemu-0.15.x/console.h | 406 +
qemu-0.15.x/cpu-all.h | 1030 ++
qemu-0.15.x/cpu-common.h | 178 +
qemu-0.15.x/cpu-defs.h | 223 +
qemu-0.15.x/cpu-exec.c | 627 +
qemu-0.15.x/cpus.c | 1178 ++
qemu-0.15.x/cpus.h | 25 +
qemu-0.15.x/cris-dis.c | 2893 +++++
qemu-0.15.x/cursor.c | 210 +
qemu-0.15.x/cursor_hidden.xpm | 37 +
qemu-0.15.x/cursor_left_ptr.xpm | 39 +
qemu-0.15.x/cutils.c | 411 +
qemu-0.15.x/darwin-user/commpage.c | 357 +
qemu-0.15.x/darwin-user/ioctls.h | 4 +
qemu-0.15.x/darwin-user/ioctls_types.h | 1 +
qemu-0.15.x/darwin-user/machload.c | 902 ++
qemu-0.15.x/darwin-user/main.c | 1026 ++
qemu-0.15.x/darwin-user/mmap.c | 409 +
qemu-0.15.x/darwin-user/qemu.h | 178 +
qemu-0.15.x/darwin-user/signal.c | 454 +
qemu-0.15.x/darwin-user/syscall.c | 1566 +++
qemu-0.15.x/darwin-user/syscalls.h | 384 +
qemu-0.15.x/def-helper.h | 240 +
qemu-0.15.x/default-configs/alpha-linux-user.mak | 1 +
qemu-0.15.x/default-configs/alpha-softmmu.mak | 9 +
qemu-0.15.x/default-configs/arm-linux-user.mak | 3 +
qemu-0.15.x/default-configs/arm-softmmu.mak | 28 +
qemu-0.15.x/default-configs/armeb-linux-user.mak | 3 +
qemu-0.15.x/default-configs/cris-linux-user.mak | 1 +
qemu-0.15.x/default-configs/cris-softmmu.mak | 5 +
qemu-0.15.x/default-configs/i386-bsd-user.mak | 1 +
qemu-0.15.x/default-configs/i386-darwin-user.mak | 1 +
qemu-0.15.x/default-configs/i386-linux-user.mak | 1 +
qemu-0.15.x/default-configs/i386-softmmu.mak | 23 +
qemu-0.15.x/default-configs/lm32-softmmu.mak | 6 +
qemu-0.15.x/default-configs/m68k-linux-user.mak | 3 +
qemu-0.15.x/default-configs/m68k-softmmu.mak | 5 +
.../default-configs/microblaze-linux-user.mak | 1 +
qemu-0.15.x/default-configs/microblaze-softmmu.mak | 5 +
.../default-configs/microblazeel-linux-user.mak | 1 +
.../default-configs/microblazeel-softmmu.mak | 5 +
qemu-0.15.x/default-configs/mips-linux-user.mak | 1 +
qemu-0.15.x/default-configs/mips-softmmu.mak | 28 +
qemu-0.15.x/default-configs/mips64-softmmu.mak | 28 +
qemu-0.15.x/default-configs/mips64el-softmmu.mak | 30 +
qemu-0.15.x/default-configs/mipsel-linux-user.mak | 1 +
qemu-0.15.x/default-configs/mipsel-softmmu.mak | 28 +
qemu-0.15.x/default-configs/pci.mak | 17 +
qemu-0.15.x/default-configs/ppc-darwin-user.mak | 3 +
qemu-0.15.x/default-configs/ppc-linux-user.mak | 3 +
qemu-0.15.x/default-configs/ppc-softmmu.mak | 33 +
qemu-0.15.x/default-configs/ppc64-linux-user.mak | 3 +
qemu-0.15.x/default-configs/ppc64-softmmu.mak | 33 +
.../default-configs/ppc64abi32-linux-user.mak | 3 +
qemu-0.15.x/default-configs/ppcemb-softmmu.mak | 33 +
qemu-0.15.x/default-configs/s390x-linux-user.mak | 1 +
qemu-0.15.x/default-configs/s390x-softmmu.mak | 1 +
qemu-0.15.x/default-configs/sh4-linux-user.mak | 1 +
qemu-0.15.x/default-configs/sh4-softmmu.mak | 7 +
qemu-0.15.x/default-configs/sh4eb-linux-user.mak | 1 +
qemu-0.15.x/default-configs/sh4eb-softmmu.mak | 7 +
qemu-0.15.x/default-configs/sparc-bsd-user.mak | 1 +
qemu-0.15.x/default-configs/sparc-linux-user.mak | 1 +
qemu-0.15.x/default-configs/sparc-softmmu.mak | 10 +
.../default-configs/sparc32plus-linux-user.mak | 1 +
qemu-0.15.x/default-configs/sparc64-bsd-user.mak | 1 +
qemu-0.15.x/default-configs/sparc64-linux-user.mak | 1 +
qemu-0.15.x/default-configs/sparc64-softmmu.mak | 13 +
.../default-configs/unicore32-linux-user.mak | 1 +
qemu-0.15.x/default-configs/x86_64-bsd-user.mak | 1 +
qemu-0.15.x/default-configs/x86_64-linux-user.mak | 1 +
qemu-0.15.x/default-configs/x86_64-softmmu.mak | 23 +
qemu-0.15.x/device_tree.c | 109 +
qemu-0.15.x/device_tree.h | 26 +
qemu-0.15.x/dis-asm.h | 479 +
qemu-0.15.x/disas.c | 437 +
qemu-0.15.x/disas.h | 42 +
qemu-0.15.x/dma-helpers.c | 181 +
qemu-0.15.x/dma.h | 49 +
qemu-0.15.x/docs/blkverify.txt | 69 +
qemu-0.15.x/docs/bootindex.txt | 43 +
qemu-0.15.x/docs/ccid.txt | 135 +
qemu-0.15.x/docs/ich9-ehci-uhci.cfg | 37 +
qemu-0.15.x/docs/libcacard.txt | 483 +
qemu-0.15.x/docs/migration.txt | 303 +
qemu-0.15.x/docs/qapi-code-gen.txt | 316 +
qemu-0.15.x/docs/qdev-device-use.txt | 416 +
qemu-0.15.x/docs/specs/acpi_pci_hotplug.txt | 37 +
qemu-0.15.x/docs/specs/ivshmem_device_spec.txt | 96 +
qemu-0.15.x/docs/specs/qcow2.txt | 260 +
qemu-0.15.x/docs/specs/qed_spec.txt | 138 +
qemu-0.15.x/docs/tracing.txt | 211 +
qemu-0.15.x/docs/usb2.txt | 146 +
qemu-0.15.x/dyngen-exec.h | 84 +
qemu-0.15.x/elf.h | 1262 ++
qemu-0.15.x/envlist.c | 246 +
qemu-0.15.x/envlist.h | 22 +
qemu-0.15.x/error.c | 141 +
qemu-0.15.x/error.h | 70 +
qemu-0.15.x/error_int.h | 29 +
qemu-0.15.x/exec-all.h | 347 +
qemu-0.15.x/exec.c | 4748 ++++++++
qemu-0.15.x/fpu/softfloat-macros.h | 749 ++
qemu-0.15.x/fpu/softfloat-specialize.h | 816 ++
qemu-0.15.x/fpu/softfloat.c | 6430 ++++++++++
qemu-0.15.x/fpu/softfloat.h | 662 +
qemu-0.15.x/fsdev/file-op-9p.h | 100 +
qemu-0.15.x/fsdev/qemu-fsdev-dummy.c | 28 +
qemu-0.15.x/fsdev/qemu-fsdev.c | 100 +
qemu-0.15.x/fsdev/qemu-fsdev.h | 55 +
qemu-0.15.x/gdb-xml/arm-core.xml | 31 +
qemu-0.15.x/gdb-xml/arm-neon.xml | 88 +
qemu-0.15.x/gdb-xml/arm-vfp.xml | 29 +
qemu-0.15.x/gdb-xml/arm-vfp3.xml | 45 +
qemu-0.15.x/gdb-xml/cf-core.xml | 29 +
qemu-0.15.x/gdb-xml/cf-fp.xml | 22 +
qemu-0.15.x/gdb-xml/power-altivec.xml | 57 +
qemu-0.15.x/gdb-xml/power-core.xml | 49 +
qemu-0.15.x/gdb-xml/power-fpu.xml | 44 +
qemu-0.15.x/gdb-xml/power-spe.xml | 45 +
qemu-0.15.x/gdb-xml/power64-core.xml | 49 +
qemu-0.15.x/gdbstub.c | 2800 +++++
qemu-0.15.x/gdbstub.h | 44 +
qemu-0.15.x/gen-icount.h | 48 +
qemu-0.15.x/hmp-commands.hx | 1370 +++
qemu-0.15.x/host-utils.c | 105 +
qemu-0.15.x/host-utils.h | 236 +
qemu-0.15.x/hpet.h | 22 +
qemu-0.15.x/hppa-dis.c | 2831 +++++
qemu-0.15.x/hppa.ld | 211 +
qemu-0.15.x/hw/9p.h | 24 +
qemu-0.15.x/hw/9pfs/virtio-9p-debug.c | 646 +
qemu-0.15.x/hw/9pfs/virtio-9p-debug.h | 6 +
qemu-0.15.x/hw/9pfs/virtio-9p-device.c | 173 +
qemu-0.15.x/hw/9pfs/virtio-9p-local.c | 557 +
qemu-0.15.x/hw/9pfs/virtio-9p-posix-acl.c | 159 +
qemu-0.15.x/hw/9pfs/virtio-9p-xattr-user.c | 112 +
qemu-0.15.x/hw/9pfs/virtio-9p-xattr.c | 160 +
qemu-0.15.x/hw/9pfs/virtio-9p-xattr.h | 105 +
qemu-0.15.x/hw/9pfs/virtio-9p.c | 3652 ++++++
qemu-0.15.x/hw/9pfs/virtio-9p.h | 514 +
qemu-0.15.x/hw/a9mpcore.c | 29 +
qemu-0.15.x/hw/ac97.c | 1346 +++
qemu-0.15.x/hw/acpi.c | 396 +
qemu-0.15.x/hw/acpi.h | 146 +
qemu-0.15.x/hw/acpi_piix4.c | 573 +
qemu-0.15.x/hw/adb.c | 455 +
qemu-0.15.x/hw/adlib.c | 338 +
qemu-0.15.x/hw/ads7846.c | 165 +
qemu-0.15.x/hw/an5206.c | 100 +
qemu-0.15.x/hw/apb_pci.c | 481 +
qemu-0.15.x/hw/apb_pci.h | 9 +
qemu-0.15.x/hw/apic.c | 1033 ++
qemu-0.15.x/hw/apic.h | 27 +
qemu-0.15.x/hw/apm.c | 86 +
qemu-0.15.x/hw/apm.h | 22 +
qemu-0.15.x/hw/applesmc.c | 241 +
qemu-0.15.x/hw/arm-misc.h | 46 +
qemu-0.15.x/hw/arm11mpcore.c | 112 +
qemu-0.15.x/hw/arm_boot.c | 290 +
qemu-0.15.x/hw/arm_gic.c | 749 ++
qemu-0.15.x/hw/arm_pic.c | 49 +
qemu-0.15.x/hw/arm_sysctl.c | 371 +
qemu-0.15.x/hw/arm_timer.c | 341 +
qemu-0.15.x/hw/armv7m.c | 262 +
qemu-0.15.x/hw/armv7m_nvic.c | 398 +
qemu-0.15.x/hw/audiodev.h | 20 +
qemu-0.15.x/hw/axis_dev88.c | 356 +
qemu-0.15.x/hw/baum.c | 643 +
qemu-0.15.x/hw/baum.h | 26 +
qemu-0.15.x/hw/bitbang_i2c.c | 231 +
qemu-0.15.x/hw/bitbang_i2c.h | 14 +
qemu-0.15.x/hw/blizzard.c | 997 ++
qemu-0.15.x/hw/blizzard_template.h | 136 +
qemu-0.15.x/hw/boards.h | 39 +
qemu-0.15.x/hw/bonito.c | 814 ++
qemu-0.15.x/hw/bt-hci-csr.c | 453 +
qemu-0.15.x/hw/bt-hci.c | 2221 ++++
qemu-0.15.x/hw/bt-hid.c | 571 +
qemu-0.15.x/hw/bt-l2cap.c | 1362 +++
qemu-0.15.x/hw/bt-sdp.c | 967 ++
qemu-0.15.x/hw/bt.c | 121 +
qemu-0.15.x/hw/bt.h | 2183 ++++
qemu-0.15.x/hw/cbus.c | 618 +
qemu-0.15.x/hw/ccid-card-emulated.c | 595 +
qemu-0.15.x/hw/ccid-card-passthru.c | 339 +
qemu-0.15.x/hw/ccid.h | 58 +
qemu-0.15.x/hw/cdrom.c | 155 +
qemu-0.15.x/hw/cirrus_vga.c | 3151 +++++
qemu-0.15.x/hw/cirrus_vga_rop.h | 208 +
qemu-0.15.x/hw/cirrus_vga_rop2.h | 281 +
qemu-0.15.x/hw/collie.c | 69 +
qemu-0.15.x/hw/cris-boot.c | 96 +
qemu-0.15.x/hw/cris-boot.h | 11 +
qemu-0.15.x/hw/cris_pic_cpu.c | 50 +
qemu-0.15.x/hw/cs4231.c | 175 +
qemu-0.15.x/hw/cs4231a.c | 686 ++
qemu-0.15.x/hw/cuda.c | 745 ++
qemu-0.15.x/hw/debugcon.c | 107 +
qemu-0.15.x/hw/dec_pci.c | 121 +
qemu-0.15.x/hw/dec_pci.h | 8 +
qemu-0.15.x/hw/device-hotplug.c | 46 +
qemu-0.15.x/hw/devices.h | 70 +
qemu-0.15.x/hw/dma.c | 555 +
qemu-0.15.x/hw/dp8393x.c | 914 ++
qemu-0.15.x/hw/ds1225y.c | 184 +
qemu-0.15.x/hw/ds1338.c | 132 +
qemu-0.15.x/hw/dummy_m68k.c | 79 +
qemu-0.15.x/hw/e1000.c | 1235 ++
qemu-0.15.x/hw/e1000_hw.h | 864 ++
qemu-0.15.x/hw/ecc.c | 88 +
qemu-0.15.x/hw/eccmemctl.c | 332 +
qemu-0.15.x/hw/eepro100.c | 2178 ++++
qemu-0.15.x/hw/eeprom93xx.c | 337 +
qemu-0.15.x/hw/eeprom93xx.h | 40 +
qemu-0.15.x/hw/elf_ops.h | 297 +
qemu-0.15.x/hw/empty_slot.c | 96 +
qemu-0.15.x/hw/empty_slot.h | 2 +
qemu-0.15.x/hw/es1370.c | 1051 ++
qemu-0.15.x/hw/escc.c | 961 ++
qemu-0.15.x/hw/escc.h | 8 +
qemu-0.15.x/hw/esp.c | 772 ++
qemu-0.15.x/hw/esp.h | 13 +
qemu-0.15.x/hw/etraxfs.c | 159 +
qemu-0.15.x/hw/etraxfs.h | 28 +
qemu-0.15.x/hw/etraxfs_dma.c | 756 ++
qemu-0.15.x/hw/etraxfs_dma.h | 22 +
qemu-0.15.x/hw/etraxfs_eth.c | 613 +
qemu-0.15.x/hw/etraxfs_pic.c | 169 +
qemu-0.15.x/hw/etraxfs_ser.c | 234 +
qemu-0.15.x/hw/etraxfs_timer.c | 336 +
qemu-0.15.x/hw/event_notifier.c | 62 +
qemu-0.15.x/hw/event_notifier.h | 16 +
qemu-0.15.x/hw/fdc.c | 1983 +++
qemu-0.15.x/hw/fdc.h | 31 +
qemu-0.15.x/hw/firmware_abi.h | 73 +
qemu-0.15.x/hw/flash.h | 54 +
qemu-0.15.x/hw/fmopl.c | 1395 +++
qemu-0.15.x/hw/fmopl.h | 174 +
qemu-0.15.x/hw/framebuffer.c | 119 +
qemu-0.15.x/hw/framebuffer.h | 22 +
qemu-0.15.x/hw/fw_cfg.c | 407 +
qemu-0.15.x/hw/fw_cfg.h | 70 +
qemu-0.15.x/hw/g364fb.c | 615 +
qemu-0.15.x/hw/grackle_pci.c | 128 +
qemu-0.15.x/hw/grlib.h | 126 +
qemu-0.15.x/hw/grlib_apbuart.c | 187 +
qemu-0.15.x/hw/grlib_gptimer.c | 394 +
qemu-0.15.x/hw/grlib_irqmp.c | 376 +
qemu-0.15.x/hw/gt64xxx.c | 1153 ++
qemu-0.15.x/hw/gumstix.c | 140 +
qemu-0.15.x/hw/gus.c | 322 +
qemu-0.15.x/hw/gusemu.h | 105 +
qemu-0.15.x/hw/gusemu_hal.c | 554 +
qemu-0.15.x/hw/gusemu_mixer.c | 240 +
qemu-0.15.x/hw/gustate.h | 132 +
qemu-0.15.x/hw/hda-audio.c | 926 ++
qemu-0.15.x/hw/heathrow_pic.c | 218 +
qemu-0.15.x/hw/hpet.c | 745 ++
qemu-0.15.x/hw/hpet_emul.h | 71 +
qemu-0.15.x/hw/hw.h | 925 ++
qemu-0.15.x/hw/i2c.c | 196 +
qemu-0.15.x/hw/i2c.h | 77 +
qemu-0.15.x/hw/i8254.c | 546 +
qemu-0.15.x/hw/i8259.c | 539 +
qemu-0.15.x/hw/ide.h | 34 +
qemu-0.15.x/hw/ide/ahci.c | 1168 ++
qemu-0.15.x/hw/ide/ahci.h | 330 +
qemu-0.15.x/hw/ide/atapi.c | 1138 ++
qemu-0.15.x/hw/ide/cmd646.c | 296 +
qemu-0.15.x/hw/ide/core.c | 2104 ++++
qemu-0.15.x/hw/ide/ich.c | 142 +
qemu-0.15.x/hw/ide/internal.h | 615 +
qemu-0.15.x/hw/ide/isa.c | 119 +
qemu-0.15.x/hw/ide/macio.c | 337 +
qemu-0.15.x/hw/ide/microdrive.c | 550 +
qemu-0.15.x/hw/ide/mmio.c | 140 +
qemu-0.15.x/hw/ide/pci.c | 530 +
qemu-0.15.x/hw/ide/pci.h | 52 +
qemu-0.15.x/hw/ide/piix.c | 202 +
qemu-0.15.x/hw/ide/qdev.c | 227 +
qemu-0.15.x/hw/ide/via.c | 200 +
qemu-0.15.x/hw/integratorcp.c | 544 +
qemu-0.15.x/hw/intel-hda-defs.h | 717 ++
qemu-0.15.x/hw/intel-hda.c | 1284 ++
qemu-0.15.x/hw/intel-hda.h | 62 +
qemu-0.15.x/hw/ioapic.c | 359 +
qemu-0.15.x/hw/ioapic.h | 20 +
qemu-0.15.x/hw/ioh3420.c | 245 +
qemu-0.15.x/hw/ioh3420.h | 10 +
qemu-0.15.x/hw/irq.c | 92 +
qemu-0.15.x/hw/irq.h | 36 +
qemu-0.15.x/hw/isa-bus.c | 205 +
qemu-0.15.x/hw/isa.h | 53 +
qemu-0.15.x/hw/isa_mmio.c | 82 +
qemu-0.15.x/hw/ivshmem.c | 827 ++
qemu-0.15.x/hw/jazz_led.c | 328 +
qemu-0.15.x/hw/kvmclock.c | 120 +
qemu-0.15.x/hw/kvmclock.h | 24 +
qemu-0.15.x/hw/lan9118.c | 1196 ++
qemu-0.15.x/hw/lance.c | 160 +
qemu-0.15.x/hw/leon3.c | 217 +
qemu-0.15.x/hw/lm32.h | 25 +
qemu-0.15.x/hw/lm32_boards.c | 304 +
qemu-0.15.x/hw/lm32_hwsetup.h | 178 +
qemu-0.15.x/hw/lm32_juart.c | 150 +
qemu-0.15.x/hw/lm32_juart.h | 11 +
qemu-0.15.x/hw/lm32_pic.c | 190 +
qemu-0.15.x/hw/lm32_pic.h | 11 +
qemu-0.15.x/hw/lm32_sys.c | 161 +
qemu-0.15.x/hw/lm32_timer.c | 222 +
qemu-0.15.x/hw/lm32_uart.c | 288 +
qemu-0.15.x/hw/lm832x.c | 512 +
qemu-0.15.x/hw/loader.c | 795 ++
qemu-0.15.x/hw/loader.h | 48 +
qemu-0.15.x/hw/lsi53c895a.c | 2299 ++++
qemu-0.15.x/hw/m48t59.c | 752 ++
qemu-0.15.x/hw/mac_dbdma.c | 859 ++
qemu-0.15.x/hw/mac_dbdma.h | 43 +
qemu-0.15.x/hw/mac_nvram.c | 187 +
qemu-0.15.x/hw/macio.c | 118 +
qemu-0.15.x/hw/mainstone.c | 188 +
qemu-0.15.x/hw/marvell_88w8618_audio.c | 299 +
qemu-0.15.x/hw/max111x.c | 173 +
qemu-0.15.x/hw/max7310.c | 204 +
qemu-0.15.x/hw/mc146818rtc.c | 677 ++
qemu-0.15.x/hw/mc146818rtc.h | 12 +
qemu-0.15.x/hw/mcf.h | 21 +
qemu-0.15.x/hw/mcf5206.c | 541 +
qemu-0.15.x/hw/mcf5208.c | 306 +
qemu-0.15.x/hw/mcf_fec.c | 481 +
qemu-0.15.x/hw/mcf_intc.c | 157 +
qemu-0.15.x/hw/mcf_uart.c | 310 +
qemu-0.15.x/hw/microblaze_pic_cpu.c | 50 +
qemu-0.15.x/hw/milkymist-ac97.c | 335 +
qemu-0.15.x/hw/milkymist-hpdmc.c | 161 +
qemu-0.15.x/hw/milkymist-hw.h | 224 +
qemu-0.15.x/hw/milkymist-memcard.c | 294 +
qemu-0.15.x/hw/milkymist-minimac2.c | 539 +
qemu-0.15.x/hw/milkymist-pfpu.c | 536 +
qemu-0.15.x/hw/milkymist-softusb.c | 372 +
qemu-0.15.x/hw/milkymist-sysctl.c | 318 +
qemu-0.15.x/hw/milkymist-tmu2.c | 481 +
qemu-0.15.x/hw/milkymist-uart.c | 180 +
qemu-0.15.x/hw/milkymist-vgafb.c | 321 +
qemu-0.15.x/hw/milkymist-vgafb_template.h | 74 +
qemu-0.15.x/hw/milkymist.c | 216 +
qemu-0.15.x/hw/mips-bios.h | 8 +
qemu-0.15.x/hw/mips.h | 36 +
qemu-0.15.x/hw/mips_addr.c | 34 +
qemu-0.15.x/hw/mips_cpudevs.h | 15 +
qemu-0.15.x/hw/mips_fulong2e.c | 394 +
qemu-0.15.x/hw/mips_int.c | 65 +
qemu-0.15.x/hw/mips_jazz.c | 320 +
qemu-0.15.x/hw/mips_malta.c | 966 ++
qemu-0.15.x/hw/mips_mipssim.c | 212 +
qemu-0.15.x/hw/mips_r4k.c | 310 +
qemu-0.15.x/hw/mips_timer.c | 147 +
qemu-0.15.x/hw/mipsnet.c | 273 +
qemu-0.15.x/hw/mpc8544_guts.c | 135 +
qemu-0.15.x/hw/mpcore.c | 286 +
qemu-0.15.x/hw/msi.c | 352 +
qemu-0.15.x/hw/msi.h | 41 +
qemu-0.15.x/hw/msix.c | 410 +
qemu-0.15.x/hw/msix.h | 36 +
qemu-0.15.x/hw/msmouse.c | 79 +
qemu-0.15.x/hw/msmouse.h | 2 +
qemu-0.15.x/hw/mst_fpga.c | 255 +
qemu-0.15.x/hw/multiboot.c | 339 +
qemu-0.15.x/hw/multiboot.h | 12 +
qemu-0.15.x/hw/musicpal.c | 1665 +++
qemu-0.15.x/hw/nand.c | 666 +
qemu-0.15.x/hw/ne2000-isa.c | 112 +
qemu-0.15.x/hw/ne2000.c | 781 ++
qemu-0.15.x/hw/ne2000.h | 39 +
qemu-0.15.x/hw/nseries.c | 1417 +++
qemu-0.15.x/hw/nvram.h | 42 +
qemu-0.15.x/hw/omap.h | 1141 ++
qemu-0.15.x/hw/omap1.c | 3894 ++++++
qemu-0.15.x/hw/omap2.c | 2616 ++++
qemu-0.15.x/hw/omap_clk.c | 1260 ++
qemu-0.15.x/hw/omap_dma.c | 2082 ++++
qemu-0.15.x/hw/omap_dss.c | 1068 ++
qemu-0.15.x/hw/omap_gpio.c | 725 ++
qemu-0.15.x/hw/omap_gpmc.c | 419 +
qemu-0.15.x/hw/omap_gptimer.c | 484 +
qemu-0.15.x/hw/omap_i2c.c | 470 +
qemu-0.15.x/hw/omap_intc.c | 598 +
qemu-0.15.x/hw/omap_l4.c | 272 +
qemu-0.15.x/hw/omap_lcd_template.h | 175 +
qemu-0.15.x/hw/omap_lcdc.c | 461 +
qemu-0.15.x/hw/omap_mmc.c | 641 +
qemu-0.15.x/hw/omap_sdrc.c | 165 +
qemu-0.15.x/hw/omap_spi.c | 346 +
qemu-0.15.x/hw/omap_sx1.c | 253 +
qemu-0.15.x/hw/omap_synctimer.c | 96 +
qemu-0.15.x/hw/omap_tap.c | 112 +
qemu-0.15.x/hw/omap_uart.c | 196 +
qemu-0.15.x/hw/onenand.c | 661 +
qemu-0.15.x/hw/openpic.c | 1686 +++
qemu-0.15.x/hw/openpic.h | 18 +
qemu-0.15.x/hw/palm.c | 289 +
qemu-0.15.x/hw/parallel.c | 598 +
qemu-0.15.x/hw/pc.c | 1171 ++
qemu-0.15.x/hw/pc.h | 241 +
qemu-0.15.x/hw/pc_piix.c | 495 +
qemu-0.15.x/hw/pci-hotplug.c | 292 +
qemu-0.15.x/hw/pci-stub.c | 50 +
qemu-0.15.x/hw/pci.c | 2185 ++++
qemu-0.15.x/hw/pci.h | 485 +
qemu-0.15.x/hw/pci_bridge.c | 275 +
qemu-0.15.x/hw/pci_bridge.h | 66 +
qemu-0.15.x/hw/pci_host.c | 159 +
qemu-0.15.x/hw/pci_host.h | 53 +
qemu-0.15.x/hw/pci_ids.h | 122 +
qemu-0.15.x/hw/pci_internals.h | 47 +
qemu-0.15.x/hw/pci_regs.h | 715 ++
qemu-0.15.x/hw/pcie.c | 543 +
qemu-0.15.x/hw/pcie.h | 132 +
qemu-0.15.x/hw/pcie_aer.c | 1026 ++
qemu-0.15.x/hw/pcie_aer.h | 106 +
qemu-0.15.x/hw/pcie_host.c | 176 +
qemu-0.15.x/hw/pcie_host.h | 49 +
qemu-0.15.x/hw/pcie_port.c | 124 +
qemu-0.15.x/hw/pcie_port.h | 51 +
qemu-0.15.x/hw/pcie_regs.h | 156 +
qemu-0.15.x/hw/pckbd.c | 499 +
qemu-0.15.x/hw/pcmcia.h | 51 +
qemu-0.15.x/hw/pcnet-pci.c | 332 +
qemu-0.15.x/hw/pcnet.c | 1765 +++
qemu-0.15.x/hw/pcnet.h | 42 +
qemu-0.15.x/hw/pcspk.c | 147 +
qemu-0.15.x/hw/petalogix_ml605_mmu.c | 266 +
qemu-0.15.x/hw/petalogix_s3adsp1800_mmu.c | 230 +
qemu-0.15.x/hw/pflash_cfi01.c | 726 ++
qemu-0.15.x/hw/pflash_cfi02.c | 745 ++
qemu-0.15.x/hw/piix4.c | 125 +
qemu-0.15.x/hw/piix_pci.c | 502 +
qemu-0.15.x/hw/pixel_ops.h | 53 +
qemu-0.15.x/hw/pl011.c | 306 +
qemu-0.15.x/hw/pl022.c | 300 +
qemu-0.15.x/hw/pl031.c | 237 +
qemu-0.15.x/hw/pl050.c | 187 +
qemu-0.15.x/hw/pl061.c | 332 +
qemu-0.15.x/hw/pl080.c | 407 +
qemu-0.15.x/hw/pl110.c | 422 +
qemu-0.15.x/hw/pl110_template.h | 307 +
qemu-0.15.x/hw/pl181.c | 479 +
qemu-0.15.x/hw/pl190.c | 278 +
qemu-0.15.x/hw/pm_smbus.c | 176 +
qemu-0.15.x/hw/pm_smbus.h | 21 +
qemu-0.15.x/hw/ppc-viosrp.h | 216 +
qemu-0.15.x/hw/ppc.c | 1335 ++
qemu-0.15.x/hw/ppc.h | 57 +
qemu-0.15.x/hw/ppc405.h | 76 +
qemu-0.15.x/hw/ppc405_boards.c | 654 +
qemu-0.15.x/hw/ppc405_uc.c | 2547 ++++
qemu-0.15.x/hw/ppc440.c | 101 +
qemu-0.15.x/hw/ppc440.h | 21 +
qemu-0.15.x/hw/ppc440_bamboo.c | 200 +
qemu-0.15.x/hw/ppc4xx.h | 60 +
qemu-0.15.x/hw/ppc4xx_devs.c | 690 ++
qemu-0.15.x/hw/ppc4xx_pci.c | 391 +
qemu-0.15.x/hw/ppc_mac.h | 112 +
qemu-0.15.x/hw/ppc_newworld.c | 429 +
qemu-0.15.x/hw/ppc_oldworld.c | 334 +
qemu-0.15.x/hw/ppc_prep.c | 763 ++
qemu-0.15.x/hw/ppce500_mpc8544ds.c | 374 +
qemu-0.15.x/hw/ppce500_pci.c | 328 +
qemu-0.15.x/hw/prep_pci.c | 144 +
qemu-0.15.x/hw/prep_pci.h | 8 +
qemu-0.15.x/hw/primecell.h | 18 +
qemu-0.15.x/hw/ps2.c | 628 +
qemu-0.15.x/hw/ps2.h | 9 +
qemu-0.15.x/hw/ptimer.c | 217 +
qemu-0.15.x/hw/pxa.h | 179 +
qemu-0.15.x/hw/pxa2xx.c | 2344 ++++
qemu-0.15.x/hw/pxa2xx_dma.c | 568 +
qemu-0.15.x/hw/pxa2xx_gpio.c | 343 +
qemu-0.15.x/hw/pxa2xx_keypad.c | 337 +
qemu-0.15.x/hw/pxa2xx_lcd.c | 1045 ++
qemu-0.15.x/hw/pxa2xx_mmci.c | 549 +
qemu-0.15.x/hw/pxa2xx_pcmcia.c | 215 +
qemu-0.15.x/hw/pxa2xx_pic.c | 316 +
qemu-0.15.x/hw/pxa2xx_template.h | 435 +
qemu-0.15.x/hw/pxa2xx_timer.c | 518 +
qemu-0.15.x/hw/qdev-addr.c | 32 +
qemu-0.15.x/hw/qdev-addr.h | 5 +
qemu-0.15.x/hw/qdev-properties.c | 782 ++
qemu-0.15.x/hw/qdev.c | 940 ++
qemu-0.15.x/hw/qdev.h | 329 +
qemu-0.15.x/hw/qxl-logger.c | 250 +
qemu-0.15.x/hw/qxl-render.c | 225 +
qemu-0.15.x/hw/qxl.c | 1551 +++
qemu-0.15.x/hw/qxl.h | 108 +
qemu-0.15.x/hw/r2d.c | 341 +
qemu-0.15.x/hw/rc4030.c | 830 ++
qemu-0.15.x/hw/realview.c | 467 +
qemu-0.15.x/hw/realview_gic.c | 79 +
qemu-0.15.x/hw/rtl8139.c | 3528 ++++++
qemu-0.15.x/hw/s390-virtio-bus.c | 423 +
qemu-0.15.x/hw/s390-virtio-bus.h | 70 +
qemu-0.15.x/hw/s390-virtio.c | 297 +
qemu-0.15.x/hw/sb16.c | 1420 +++
qemu-0.15.x/hw/sbi.c | 148 +
qemu-0.15.x/hw/scsi-bus.c | 734 ++
qemu-0.15.x/hw/scsi-defs.h | 166 +
qemu-0.15.x/hw/scsi-disk.c | 1346 +++
qemu-0.15.x/hw/scsi-generic.c | 568 +
qemu-0.15.x/hw/scsi.h | 163 +
qemu-0.15.x/hw/sd.c | 1671 +++
qemu-0.15.x/hw/sd.h | 79 +
qemu-0.15.x/hw/serial.c | 979 ++
qemu-0.15.x/hw/sga.c | 56 +
qemu-0.15.x/hw/sh.h | 54 +
qemu-0.15.x/hw/sh7750.c | 817 ++
qemu-0.15.x/hw/sh7750_regnames.c | 97 +
qemu-0.15.x/hw/sh7750_regnames.h | 6 +
qemu-0.15.x/hw/sh7750_regs.h | 1277 ++
qemu-0.15.x/hw/sh_intc.c | 481 +
qemu-0.15.x/hw/sh_intc.h | 80 +
qemu-0.15.x/hw/sh_pci.c | 161 +
qemu-0.15.x/hw/sh_serial.c | 401 +
qemu-0.15.x/hw/sh_timer.c | 327 +
qemu-0.15.x/hw/sharpsl.h | 17 +
qemu-0.15.x/hw/shix.c | 104 +
qemu-0.15.x/hw/slavio_intctl.c | 463 +
qemu-0.15.x/hw/slavio_misc.c | 499 +
qemu-0.15.x/hw/slavio_timer.c | 424 +
qemu-0.15.x/hw/sm501.c | 1457 +++
qemu-0.15.x/hw/sm501_template.h | 145 +
qemu-0.15.x/hw/smbios.c | 239 +
qemu-0.15.x/hw/smbios.h | 162 +
qemu-0.15.x/hw/smbus.c | 318 +
qemu-0.15.x/hw/smbus.h | 71 +
qemu-0.15.x/hw/smbus_eeprom.c | 145 +
qemu-0.15.x/hw/smc91c111.c | 797 ++
qemu-0.15.x/hw/soc_dma.c | 366 +
qemu-0.15.x/hw/soc_dma.h | 113 +
qemu-0.15.x/hw/spapr.c | 476 +
qemu-0.15.x/hw/spapr.h | 301 +
qemu-0.15.x/hw/spapr_hcall.c | 519 +
qemu-0.15.x/hw/spapr_llan.c | 515 +
qemu-0.15.x/hw/spapr_rtas.c | 279 +
qemu-0.15.x/hw/spapr_vio.c | 731 ++
qemu-0.15.x/hw/spapr_vio.h | 114 +
qemu-0.15.x/hw/spapr_vscsi.c | 999 ++
qemu-0.15.x/hw/spapr_vty.c | 159 +
qemu-0.15.x/hw/sparc32_dma.c | 305 +
qemu-0.15.x/hw/sparc32_dma.h | 12 +
qemu-0.15.x/hw/spitz.c | 1117 ++
qemu-0.15.x/hw/srp.h | 240 +
qemu-0.15.x/hw/ssd0303.c | 312 +
qemu-0.15.x/hw/ssd0323.c | 355 +
qemu-0.15.x/hw/ssi-sd.c | 256 +
qemu-0.15.x/hw/ssi.c | 70 +
qemu-0.15.x/hw/ssi.h | 45 +
qemu-0.15.x/hw/stellaris.c | 1370 +++
qemu-0.15.x/hw/stellaris_enet.c | 443 +
qemu-0.15.x/hw/stellaris_input.c | 89 +
qemu-0.15.x/hw/strongarm.c | 1598 +++
qemu-0.15.x/hw/strongarm.h | 64 +
qemu-0.15.x/hw/sun4c_intctl.c | 224 +
qemu-0.15.x/hw/sun4m.c | 1827 +++
qemu-0.15.x/hw/sun4m.h | 36 +
qemu-0.15.x/hw/sun4m_iommu.c | 378 +
qemu-0.15.x/hw/sun4u.c | 935 ++
qemu-0.15.x/hw/syborg.c | 111 +
qemu-0.15.x/hw/syborg.h | 18 +
qemu-0.15.x/hw/syborg_fb.c | 551 +
qemu-0.15.x/hw/syborg_interrupt.c | 238 +
qemu-0.15.x/hw/syborg_keyboard.c | 221 +
qemu-0.15.x/hw/syborg_pointer.c | 226 +
qemu-0.15.x/hw/syborg_rtc.c | 140 +
qemu-0.15.x/hw/syborg_serial.c | 335 +
qemu-0.15.x/hw/syborg_timer.c | 231 +
qemu-0.15.x/hw/syborg_virtio.c | 315 +
qemu-0.15.x/hw/sysbus.c | 234 +
qemu-0.15.x/hw/sysbus.h | 76 +
qemu-0.15.x/hw/tc58128.c | 182 +
qemu-0.15.x/hw/tc6393xb.c | 607 +
qemu-0.15.x/hw/tc6393xb_template.h | 67 +
qemu-0.15.x/hw/tcx.c | 651 +
qemu-0.15.x/hw/tmp105.c | 244 +
qemu-0.15.x/hw/tosa.c | 280 +
qemu-0.15.x/hw/tsc2005.c | 593 +
qemu-0.15.x/hw/tsc210x.c | 1293 ++
qemu-0.15.x/hw/tusb6010.c | 766 ++
qemu-0.15.x/hw/twl92230.c | 875 ++
qemu-0.15.x/hw/unin_pci.c | 369 +
qemu-0.15.x/hw/usb-bt.c | 568 +
qemu-0.15.x/hw/usb-bus.c | 445 +
qemu-0.15.x/hw/usb-ccid.c | 1397 +++
qemu-0.15.x/hw/usb-desc.c | 466 +
qemu-0.15.x/hw/usb-desc.h | 112 +
qemu-0.15.x/hw/usb-ehci.c | 2359 ++++
qemu-0.15.x/hw/usb-hid.c | 1007 ++
qemu-0.15.x/hw/usb-hub.c | 549 +
qemu-0.15.x/hw/usb-msd.c | 646 +
qemu-0.15.x/hw/usb-musb.c | 1529 +++
qemu-0.15.x/hw/usb-net.c | 1441 +++
qemu-0.15.x/hw/usb-ohci.c | 1863 +++
qemu-0.15.x/hw/usb-ohci.h | 9 +
qemu-0.15.x/hw/usb-serial.c | 612 +
qemu-0.15.x/hw/usb-uhci.c | 1276 ++
qemu-0.15.x/hw/usb-uhci.h | 10 +
qemu-0.15.x/hw/usb-wacom.c | 371 +
qemu-0.15.x/hw/usb.c | 349 +
qemu-0.15.x/hw/usb.h | 382 +
qemu-0.15.x/hw/versatile_pci.c | 160 +
qemu-0.15.x/hw/versatilepb.c | 362 +
qemu-0.15.x/hw/vexpress.c | 224 +
qemu-0.15.x/hw/vga-isa-mm.c | 128 +
qemu-0.15.x/hw/vga-isa.c | 87 +
qemu-0.15.x/hw/vga-pci.c | 122 +
qemu-0.15.x/hw/vga.c | 2412 ++++
qemu-0.15.x/hw/vga_int.h | 233 +
qemu-0.15.x/hw/vga_template.h | 525 +
qemu-0.15.x/hw/vhost.c | 789 ++
qemu-0.15.x/hw/vhost.h | 50 +
qemu-0.15.x/hw/vhost_net.c | 237 +
qemu-0.15.x/hw/vhost_net.h | 20 +
qemu-0.15.x/hw/virtex_ml507.c | 276 +
qemu-0.15.x/hw/virtio-balloon.c | 308 +
qemu-0.15.x/hw/virtio-balloon.h | 55 +
qemu-0.15.x/hw/virtio-blk.c | 597 +
qemu-0.15.x/hw/virtio-blk.h | 108 +
qemu-0.15.x/hw/virtio-console.c | 168 +
qemu-0.15.x/hw/virtio-net.c | 1078 ++
qemu-0.15.x/hw/virtio-net.h | 189 +
qemu-0.15.x/hw/virtio-pci.c | 901 ++
qemu-0.15.x/hw/virtio-pci.h | 46 +
qemu-0.15.x/hw/virtio-serial-bus.c | 927 ++
qemu-0.15.x/hw/virtio-serial.h | 207 +
qemu-0.15.x/hw/virtio.c | 962 ++
qemu-0.15.x/hw/virtio.h | 239 +
qemu-0.15.x/hw/vmmouse.c | 289 +
qemu-0.15.x/hw/vmport.c | 148 +
qemu-0.15.x/hw/vmware_vga.c | 1324 ++
qemu-0.15.x/hw/vmware_vga.h | 19 +
qemu-0.15.x/hw/vt82c686.c | 537 +
qemu-0.15.x/hw/vt82c686.h | 11 +
qemu-0.15.x/hw/watchdog.c | 147 +
qemu-0.15.x/hw/watchdog.h | 43 +
qemu-0.15.x/hw/wdt_i6300esb.c | 433 +
qemu-0.15.x/hw/wdt_ib700.c | 137 +
qemu-0.15.x/hw/wm8750.c | 707 ++
qemu-0.15.x/hw/xen.h | 54 +
qemu-0.15.x/hw/xen_backend.c | 757 ++
qemu-0.15.x/hw/xen_backend.h | 106 +
qemu-0.15.x/hw/xen_blkif.h | 103 +
qemu-0.15.x/hw/xen_common.h | 138 +
qemu-0.15.x/hw/xen_console.c | 279 +
qemu-0.15.x/hw/xen_devconfig.c | 173 +
qemu-0.15.x/hw/xen_disk.c | 853 ++
qemu-0.15.x/hw/xen_domainbuild.c | 300 +
qemu-0.15.x/hw/xen_domainbuild.h | 13 +
qemu-0.15.x/hw/xen_machine_pv.c | 124 +
qemu-0.15.x/hw/xen_nic.c | 440 +
qemu-0.15.x/hw/xen_platform.c | 339 +
qemu-0.15.x/hw/xenfb.c | 1017 ++
qemu-0.15.x/hw/xics.c | 496 +
qemu-0.15.x/hw/xics.h | 38 +
qemu-0.15.x/hw/xilinx.h | 89 +
qemu-0.15.x/hw/xilinx_axidma.c | 509 +
qemu-0.15.x/hw/xilinx_axidma.h | 39 +
qemu-0.15.x/hw/xilinx_axienet.c | 898 ++
qemu-0.15.x/hw/xilinx_ethlite.c | 241 +
qemu-0.15.x/hw/xilinx_intc.c | 176 +
qemu-0.15.x/hw/xilinx_timer.c | 234 +
qemu-0.15.x/hw/xilinx_uartlite.c | 220 +
qemu-0.15.x/hw/xio3130_downstream.c | 211 +
qemu-0.15.x/hw/xio3130_downstream.h | 11 +
qemu-0.15.x/hw/xio3130_upstream.c | 186 +
qemu-0.15.x/hw/xio3130_upstream.h | 10 +
qemu-0.15.x/hw/zaurus.c | 284 +
qemu-0.15.x/i386-dis.c | 6562 ++++++++++
qemu-0.15.x/i386.ld | 153 +
qemu-0.15.x/ia64-dis.c |10599 ++++++++++++++++
qemu-0.15.x/ia64.ld | 209 +
qemu-0.15.x/input.c | 304 +
qemu-0.15.x/iohandler.c | 193 +
qemu-0.15.x/ioport-user.c | 60 +
qemu-0.15.x/ioport.c | 315 +
qemu-0.15.x/ioport.h | 55 +
qemu-0.15.x/iorange.h | 30 +
qemu-0.15.x/iov.c | 75 +
qemu-0.15.x/iov.h | 19 +
qemu-0.15.x/json-lexer.c | 372 +
qemu-0.15.x/json-lexer.h | 51 +
qemu-0.15.x/json-parser.c | 650 +
qemu-0.15.x/json-parser.h | 24 +
qemu-0.15.x/json-streamer.c | 122 +
qemu-0.15.x/json-streamer.h | 40 +
qemu-0.15.x/kvm-all.c | 1396 +++
qemu-0.15.x/kvm-stub.c | 131 +
qemu-0.15.x/kvm.h | 199 +
qemu-0.15.x/libcacard/Makefile | 42 +
qemu-0.15.x/libcacard/cac.c | 403 +
qemu-0.15.x/libcacard/cac.h | 23 +
qemu-0.15.x/libcacard/card_7816.c | 763 ++
qemu-0.15.x/libcacard/card_7816.h | 62 +
qemu-0.15.x/libcacard/card_7816t.h | 165 +
qemu-0.15.x/libcacard/event.c | 106 +
qemu-0.15.x/libcacard/eventt.h | 29 +
qemu-0.15.x/libcacard/link_test.c | 22 +
qemu-0.15.x/libcacard/vcard.c | 339 +
qemu-0.15.x/libcacard/vcard.h | 86 +
qemu-0.15.x/libcacard/vcard_emul.h | 65 +
qemu-0.15.x/libcacard/vcard_emul_nss.c | 1157 ++
qemu-0.15.x/libcacard/vcard_emul_type.c | 57 +
qemu-0.15.x/libcacard/vcard_emul_type.h | 32 +
qemu-0.15.x/libcacard/vcardt.h | 64 +
qemu-0.15.x/libcacard/vevent.h | 27 +
qemu-0.15.x/libcacard/vreader.c | 513 +
qemu-0.15.x/libcacard/vreader.h | 55 +
qemu-0.15.x/libcacard/vreadert.h | 24 +
qemu-0.15.x/libcacard/vscard_common.h | 178 +
qemu-0.15.x/libcacard/vscclient.c | 652 +
qemu-0.15.x/libfdt_env.h | 36 +
qemu-0.15.x/linux-aio.c | 261 +
qemu-0.15.x/linux-headers/COPYING | 356 +
qemu-0.15.x/linux-headers/README | 2 +
qemu-0.15.x/linux-headers/asm-powerpc/kvm.h | 275 +
qemu-0.15.x/linux-headers/asm-powerpc/kvm_para.h | 53 +
qemu-0.15.x/linux-headers/asm-s390/kvm.h | 44 +
qemu-0.15.x/linux-headers/asm-s390/kvm_para.h | 17 +
qemu-0.15.x/linux-headers/asm-x86/hyperv.h | 193 +
qemu-0.15.x/linux-headers/asm-x86/kvm.h | 324 +
qemu-0.15.x/linux-headers/asm-x86/kvm_para.h | 79 +
qemu-0.15.x/linux-headers/linux/kvm.h | 804 ++
qemu-0.15.x/linux-headers/linux/kvm_para.h | 28 +
qemu-0.15.x/linux-headers/linux/vhost.h | 130 +
qemu-0.15.x/linux-headers/linux/virtio_config.h | 54 +
qemu-0.15.x/linux-headers/linux/virtio_ring.h | 163 +
qemu-0.15.x/linux-user/alpha/syscall.h | 253 +
qemu-0.15.x/linux-user/alpha/syscall_nr.h | 435 +
qemu-0.15.x/linux-user/alpha/target_signal.h | 56 +
qemu-0.15.x/linux-user/alpha/termbits.h | 264 +
qemu-0.15.x/linux-user/arm/nwfpe/double_cpdo.c | 295 +
qemu-0.15.x/linux-user/arm/nwfpe/extended_cpdo.c | 272 +
qemu-0.15.x/linux-user/arm/nwfpe/fpa11.c | 237 +
qemu-0.15.x/linux-user/arm/nwfpe/fpa11.h | 130 +
qemu-0.15.x/linux-user/arm/nwfpe/fpa11.inl | 50 +
qemu-0.15.x/linux-user/arm/nwfpe/fpa11_cpdo.c | 112 +
qemu-0.15.x/linux-user/arm/nwfpe/fpa11_cpdt.c | 381 +
qemu-0.15.x/linux-user/arm/nwfpe/fpa11_cprt.c | 283 +
qemu-0.15.x/linux-user/arm/nwfpe/fpopcode.c | 112 +
qemu-0.15.x/linux-user/arm/nwfpe/fpopcode.h | 390 +
qemu-0.15.x/linux-user/arm/nwfpe/fpsr.h | 107 +
qemu-0.15.x/linux-user/arm/nwfpe/single_cpdo.c | 252 +
qemu-0.15.x/linux-user/arm/syscall.h | 42 +
qemu-0.15.x/linux-user/arm/syscall_nr.h | 380 +
qemu-0.15.x/linux-user/arm/target_signal.h | 29 +
qemu-0.15.x/linux-user/arm/termbits.h | 216 +
qemu-0.15.x/linux-user/cpu-uname.c | 72 +
qemu-0.15.x/linux-user/cpu-uname.h | 1 +
qemu-0.15.x/linux-user/cris/syscall.h | 36 +
qemu-0.15.x/linux-user/cris/syscall_nr.h | 337 +
qemu-0.15.x/linux-user/cris/target_signal.h | 29 +
qemu-0.15.x/linux-user/cris/termbits.h | 213 +
qemu-0.15.x/linux-user/elfload.c | 2703 +++++
qemu-0.15.x/linux-user/errno_defs.h | 141 +
qemu-0.15.x/linux-user/flat.h | 67 +
qemu-0.15.x/linux-user/flatload.c | 813 ++
qemu-0.15.x/linux-user/i386/syscall.h | 146 +
qemu-0.15.x/linux-user/i386/syscall_nr.h | 349 +
qemu-0.15.x/linux-user/i386/target_signal.h | 29 +
qemu-0.15.x/linux-user/i386/termbits.h | 226 +
qemu-0.15.x/linux-user/ioctls.h | 347 +
qemu-0.15.x/linux-user/linux_loop.h | 95 +
qemu-0.15.x/linux-user/linuxload.c | 184 +
qemu-0.15.x/linux-user/m68k-sim.c | 170 +
qemu-0.15.x/linux-user/m68k/syscall.h | 21 +
qemu-0.15.x/linux-user/m68k/syscall_nr.h | 346 +
qemu-0.15.x/linux-user/m68k/target_signal.h | 29 +
qemu-0.15.x/linux-user/m68k/termbits.h | 227 +
qemu-0.15.x/linux-user/main.c | 3569 ++++++
qemu-0.15.x/linux-user/microblaze/syscall.h | 45 +
qemu-0.15.x/linux-user/microblaze/syscall_nr.h | 379 +
qemu-0.15.x/linux-user/microblaze/target_signal.h | 29 +
qemu-0.15.x/linux-user/microblaze/termbits.h | 213 +
qemu-0.15.x/linux-user/mips/syscall.h | 227 +
qemu-0.15.x/linux-user/mips/syscall_nr.h | 347 +
qemu-0.15.x/linux-user/mips/target_signal.h | 29 +
qemu-0.15.x/linux-user/mips/termbits.h | 245 +
qemu-0.15.x/linux-user/mips64/syscall.h | 221 +
qemu-0.15.x/linux-user/mips64/syscall_nr.h | 306 +
qemu-0.15.x/linux-user/mips64/target_signal.h | 29 +
qemu-0.15.x/linux-user/mips64/termbits.h | 245 +
qemu-0.15.x/linux-user/mipsn32/syscall.h | 221 +
qemu-0.15.x/linux-user/mipsn32/syscall_nr.h | 311 +
qemu-0.15.x/linux-user/mipsn32/target_signal.h | 29 +
qemu-0.15.x/linux-user/mipsn32/termbits.h | 245 +
qemu-0.15.x/linux-user/mmap.c | 763 ++
qemu-0.15.x/linux-user/ppc/syscall.h | 64 +
qemu-0.15.x/linux-user/ppc/syscall_nr.h | 364 +
qemu-0.15.x/linux-user/ppc/target_signal.h | 29 +
qemu-0.15.x/linux-user/ppc/termbits.h | 236 +
qemu-0.15.x/linux-user/qemu-types.h | 24 +
qemu-0.15.x/linux-user/qemu.h | 451 +
qemu-0.15.x/linux-user/s390x/syscall.h | 23 +
qemu-0.15.x/linux-user/s390x/syscall_nr.h | 358 +
qemu-0.15.x/linux-user/s390x/target_signal.h | 26 +
qemu-0.15.x/linux-user/s390x/termbits.h | 283 +
qemu-0.15.x/linux-user/sh4/syscall.h | 12 +
qemu-0.15.x/linux-user/sh4/syscall_nr.h | 368 +
qemu-0.15.x/linux-user/sh4/target_signal.h | 29 +
qemu-0.15.x/linux-user/sh4/termbits.h | 274 +
qemu-0.15.x/linux-user/signal.c | 5316 ++++++++
qemu-0.15.x/linux-user/socket.h | 147 +
qemu-0.15.x/linux-user/sparc/syscall.h | 9 +
qemu-0.15.x/linux-user/sparc/syscall_nr.h | 299 +
qemu-0.15.x/linux-user/sparc/target_signal.h | 36 +
qemu-0.15.x/linux-user/sparc/termbits.h | 279 +
qemu-0.15.x/linux-user/sparc64/syscall.h | 10 +
qemu-0.15.x/linux-user/sparc64/syscall_nr.h | 336 +
qemu-0.15.x/linux-user/sparc64/target_signal.h | 36 +
qemu-0.15.x/linux-user/sparc64/termbits.h | 279 +
qemu-0.15.x/linux-user/strace.c | 1532 +++
qemu-0.15.x/linux-user/strace.list | 1529 +++
qemu-0.15.x/linux-user/syscall.c | 8109 +++++++++++++
qemu-0.15.x/linux-user/syscall_defs.h | 2333 ++++
qemu-0.15.x/linux-user/syscall_types.h | 203 +
qemu-0.15.x/linux-user/target_flat.h | 10 +
qemu-0.15.x/linux-user/uaccess.c | 65 +
qemu-0.15.x/linux-user/unicore32/syscall.h | 55 +
qemu-0.15.x/linux-user/unicore32/syscall_nr.h | 371 +
qemu-0.15.x/linux-user/unicore32/target_signal.h | 26 +
qemu-0.15.x/linux-user/unicore32/termbits.h | 2 +
qemu-0.15.x/linux-user/vm86.c | 481 +
qemu-0.15.x/linux-user/x86_64/syscall.h | 98 +
qemu-0.15.x/linux-user/x86_64/syscall_nr.h | 307 +
qemu-0.15.x/linux-user/x86_64/target_signal.h | 29 +
qemu-0.15.x/linux-user/x86_64/termbits.h | 247 +
qemu-0.15.x/m68k-dis.c | 5051 ++++++++
qemu-0.15.x/m68k-semi.c | 408 +
qemu-0.15.x/m68k.ld | 175 +
qemu-0.15.x/microblaze-dis.c | 1100 ++
qemu-0.15.x/migration-exec.c | 144 +
qemu-0.15.x/migration-fd.c | 129 +
qemu-0.15.x/migration-tcp.c | 203 +
qemu-0.15.x/migration-unix.c | 214 +
qemu-0.15.x/migration.c | 482 +
qemu-0.15.x/migration.h | 151 +
qemu-0.15.x/mips-dis.c | 4873 ++++++++
qemu-0.15.x/mips.ld | 222 +
qemu-0.15.x/module.c | 80 +
qemu-0.15.x/module.h | 40 +
qemu-0.15.x/monitor.c | 5333 ++++++++
qemu-0.15.x/monitor.h | 65 +
qemu-0.15.x/nbd.c | 666 +
qemu-0.15.x/nbd.h | 69 +
qemu-0.15.x/net.c | 1433 +++
qemu-0.15.x/net.h | 182 +
qemu-0.15.x/net/checksum.c | 85 +
qemu-0.15.x/net/checksum.h | 29 +
qemu-0.15.x/net/dump.c | 159 +
qemu-0.15.x/net/dump.h | 33 +
qemu-0.15.x/net/queue.c | 260 +
qemu-0.15.x/net/queue.h | 71 +
qemu-0.15.x/net/slirp.c | 779 ++
qemu-0.15.x/net/slirp.h | 51 +
qemu-0.15.x/net/socket.c | 606 +
qemu-0.15.x/net/socket.h | 33 +
qemu-0.15.x/net/tap-aix.c | 61 +
qemu-0.15.x/net/tap-bsd.c | 131 +
qemu-0.15.x/net/tap-haiku.c | 61 +
qemu-0.15.x/net/tap-linux.c | 195 +
qemu-0.15.x/net/tap-linux.h | 63 +
qemu-0.15.x/net/tap-solaris.c | 227 +
qemu-0.15.x/net/tap-win32.c | 751 ++
qemu-0.15.x/net/tap.c | 524 +
qemu-0.15.x/net/tap.h | 60 +
qemu-0.15.x/net/util.c | 60 +
qemu-0.15.x/net/util.h | 32 +
qemu-0.15.x/net/vde.c | 130 +
qemu-0.15.x/net/vde.h | 36 +
qemu-0.15.x/notify.c | 39 +
qemu-0.15.x/notify.h | 43 +
qemu-0.15.x/os-posix.c | 392 +
qemu-0.15.x/os-win32.c | 273 +
qemu-0.15.x/osdep.c | 168 +
qemu-0.15.x/osdep.h | 157 +
qemu-0.15.x/oslib-posix.c | 173 +
qemu-0.15.x/oslib-win32.c | 114 +
qemu-0.15.x/path.c | 181 +
qemu-0.15.x/pc-bios/Makefile | 19 +
qemu-0.15.x/pc-bios/README | 34 +
qemu-0.15.x/pc-bios/bamboo.dtb | Bin 0 -> 3179 bytes
qemu-0.15.x/pc-bios/bamboo.dts | 234 +
qemu-0.15.x/pc-bios/bios.bin | Bin 0 -> 131072 bytes
qemu-0.15.x/pc-bios/keymaps/ar | 98 +
qemu-0.15.x/pc-bios/keymaps/bepo | 333 +
qemu-0.15.x/pc-bios/keymaps/common | 157 +
qemu-0.15.x/pc-bios/keymaps/da | 120 +
qemu-0.15.x/pc-bios/keymaps/de | 114 +
qemu-0.15.x/pc-bios/keymaps/de-ch | 169 +
qemu-0.15.x/pc-bios/keymaps/en-gb | 119 +
qemu-0.15.x/pc-bios/keymaps/en-us | 35 +
qemu-0.15.x/pc-bios/keymaps/es | 105 +
qemu-0.15.x/pc-bios/keymaps/et | 85 +
qemu-0.15.x/pc-bios/keymaps/fi | 124 +
qemu-0.15.x/pc-bios/keymaps/fo | 76 +
qemu-0.15.x/pc-bios/keymaps/fr | 181 +
qemu-0.15.x/pc-bios/keymaps/fr-be | 134 +
qemu-0.15.x/pc-bios/keymaps/fr-ca | 50 +
qemu-0.15.x/pc-bios/keymaps/fr-ch | 114 +
qemu-0.15.x/pc-bios/keymaps/hr | 125 +
qemu-0.15.x/pc-bios/keymaps/hu | 115 +
qemu-0.15.x/pc-bios/keymaps/is | 139 +
qemu-0.15.x/pc-bios/keymaps/it | 115 +
qemu-0.15.x/pc-bios/keymaps/ja | 109 +
qemu-0.15.x/pc-bios/keymaps/lt | 57 +
qemu-0.15.x/pc-bios/keymaps/lv | 128 +
qemu-0.15.x/pc-bios/keymaps/mk | 101 +
qemu-0.15.x/pc-bios/keymaps/modifiers | 18 +
qemu-0.15.x/pc-bios/keymaps/nl | 59 +
qemu-0.15.x/pc-bios/keymaps/nl-be | 3 +
qemu-0.15.x/pc-bios/keymaps/no | 119 +
qemu-0.15.x/pc-bios/keymaps/pl | 122 +
qemu-0.15.x/pc-bios/keymaps/pt | 113 +
qemu-0.15.x/pc-bios/keymaps/pt-br | 69 +
qemu-0.15.x/pc-bios/keymaps/ru | 109 +
qemu-0.15.x/pc-bios/keymaps/sl | 110 +
qemu-0.15.x/pc-bios/keymaps/sv | 81 +
qemu-0.15.x/pc-bios/keymaps/th | 131 +
qemu-0.15.x/pc-bios/keymaps/tr | 123 +
qemu-0.15.x/pc-bios/linuxboot.bin | Bin 0 -> 1024 bytes
qemu-0.15.x/pc-bios/mpc8544ds.dtb | Bin 0 -> 2277 bytes
qemu-0.15.x/pc-bios/mpc8544ds.dts | 131 +
qemu-0.15.x/pc-bios/multiboot.bin | Bin 0 -> 1024 bytes
qemu-0.15.x/pc-bios/ohw.diff | 1843 +++
qemu-0.15.x/pc-bios/openbios-ppc | Bin 0 -> 750392 bytes
qemu-0.15.x/pc-bios/openbios-sparc32 | Bin 0 -> 381484 bytes
qemu-0.15.x/pc-bios/openbios-sparc64 | Bin 0 -> 1598328 bytes
qemu-0.15.x/pc-bios/optionrom/Makefile | 29 +
qemu-0.15.x/pc-bios/optionrom/linuxboot.S | 139 +
qemu-0.15.x/pc-bios/optionrom/multiboot.S | 186 +
qemu-0.15.x/pc-bios/optionrom/optionrom.h | 136 +
qemu-0.15.x/pc-bios/petalogix-ml605.dtb | Bin 0 -> 9982 bytes
qemu-0.15.x/pc-bios/petalogix-s3adsp1800.dtb | Bin 0 -> 8259 bytes
qemu-0.15.x/pc-bios/ppc_rom.bin | Bin 0 -> 524288 bytes
qemu-0.15.x/pc-bios/pxe-e1000.rom | Bin 0 -> 67072 bytes
qemu-0.15.x/pc-bios/pxe-eepro100.rom | Bin 0 -> 61440 bytes
qemu-0.15.x/pc-bios/pxe-ne2k_pci.rom | Bin 0 -> 61440 bytes
qemu-0.15.x/pc-bios/pxe-pcnet.rom | Bin 0 -> 61440 bytes
qemu-0.15.x/pc-bios/pxe-rtl8139.rom | Bin 0 -> 61440 bytes
qemu-0.15.x/pc-bios/pxe-virtio.rom | Bin 0 -> 60416 bytes
qemu-0.15.x/pc-bios/s390-zipl.rom | Bin 0 -> 3304 bytes
qemu-0.15.x/pc-bios/slof.bin | Bin 0 -> 579072 bytes
qemu-0.15.x/pc-bios/spapr-rtas.bin | Bin 0 -> 20 bytes
qemu-0.15.x/pc-bios/spapr-rtas/Makefile | 24 +
qemu-0.15.x/pc-bios/spapr-rtas/spapr-rtas.S | 37 +
qemu-0.15.x/pc-bios/vgabios-cirrus.bin | Bin 0 -> 35840 bytes
qemu-0.15.x/pc-bios/vgabios-qxl.bin | Bin 0 -> 40448 bytes
qemu-0.15.x/pc-bios/vgabios-stdvga.bin | Bin 0 -> 40448 bytes
qemu-0.15.x/pc-bios/vgabios-vmware.bin | Bin 0 -> 40448 bytes
qemu-0.15.x/pc-bios/vgabios.bin | Bin 0 -> 40448 bytes
qemu-0.15.x/pci-ids.txt | 31 +
qemu-0.15.x/pflib.c | 213 +
qemu-0.15.x/pflib.h | 20 +
qemu-0.15.x/poison.h | 63 +
qemu-0.15.x/posix-aio-compat.c | 663 +
qemu-0.15.x/ppc-dis.c | 5412 +++++++++
qemu-0.15.x/ppc.ld | 225 +
qemu-0.15.x/ppc64.ld | 218 +
qemu-0.15.x/qapi-schema-guest.json | 217 +
qemu-0.15.x/qapi-schema-test.json | 22 +
qemu-0.15.x/qapi/qapi-dealloc-visitor.c | 147 +
qemu-0.15.x/qapi/qapi-dealloc-visitor.h | 26 +
qemu-0.15.x/qapi/qapi-types-core.h | 20 +
qemu-0.15.x/qapi/qapi-visit-core.c | 118 +
qemu-0.15.x/qapi/qapi-visit-core.h | 76 +
qemu-0.15.x/qapi/qmp-core.h | 41 +
qemu-0.15.x/qapi/qmp-dispatch.c | 124 +
qemu-0.15.x/qapi/qmp-input-visitor.c | 301 +
qemu-0.15.x/qapi/qmp-input-visitor.h | 27 +
qemu-0.15.x/qapi/qmp-output-visitor.c | 239 +
qemu-0.15.x/qapi/qmp-output-visitor.h | 28 +
qemu-0.15.x/qapi/qmp-registry.c | 40 +
qemu-0.15.x/qbool.c | 68 +
qemu-0.15.x/qbool.h | 29 +
qemu-0.15.x/qdict-test-data.txt | 4999 ++++++++
qemu-0.15.x/qdict.c | 456 +
qemu-0.15.x/qdict.h | 67 +
qemu-0.15.x/qemu-aio.h | 59 +
qemu-0.15.x/qemu-barrier.h | 10 +
qemu-0.15.x/qemu-char.c | 2700 +++++
qemu-0.15.x/qemu-char.h | 130 +
qemu-0.15.x/qemu-common.h | 376 +
qemu-0.15.x/qemu-config.c | 703 ++
qemu-0.15.x/qemu-config.h | 19 +
qemu-0.15.x/qemu-doc.texi | 2717 +++++
qemu-0.15.x/qemu-error.c | 210 +
qemu-0.15.x/qemu-error.h | 40 +
qemu-0.15.x/qemu-ga.c | 637 +
qemu-0.15.x/qemu-img-cmds.hx | 59 +
qemu-0.15.x/qemu-img.c | 1623 +++
qemu-0.15.x/qemu-img.texi | 262 +
qemu-0.15.x/qemu-io.c | 1840 +++
qemu-0.15.x/qemu-lock.h | 49 +
qemu-0.15.x/qemu-log.h | 93 +
qemu-0.15.x/qemu-malloc.c | 98 +
qemu-0.15.x/qemu-nbd.c | 499 +
qemu-0.15.x/qemu-nbd.texi | 66 +
qemu-0.15.x/qemu-objects.h | 25 +
qemu-0.15.x/qemu-option.c | 977 ++
qemu-0.15.x/qemu-option.h | 135 +
qemu-0.15.x/qemu-options.h | 41 +
qemu-0.15.x/qemu-options.hx | 2433 ++++
qemu-0.15.x/qemu-os-posix.h | 54 +
qemu-0.15.x/qemu-os-win32.h | 69 +
qemu-0.15.x/qemu-progress.c | 150 +
qemu-0.15.x/qemu-queue.h | 449 +
qemu-0.15.x/qemu-sockets.c | 679 ++
qemu-0.15.x/qemu-tech.texi | 697 ++
qemu-0.15.x/qemu-thread-posix.c | 149 +
qemu-0.15.x/qemu-thread-posix.h | 17 +
qemu-0.15.x/qemu-thread-win32.c | 281 +
qemu-0.15.x/qemu-thread-win32.h | 21 +
qemu-0.15.x/qemu-thread.h | 41 +
qemu-0.15.x/qemu-timer-common.c | 63 +
qemu-0.15.x/qemu-timer.c | 1218 ++
qemu-0.15.x/qemu-timer.h | 341 +
qemu-0.15.x/qemu-tool.c | 98 +
qemu-0.15.x/qemu-x509.h | 9 +
qemu-0.15.x/qemu.sasl | 34 +
qemu-0.15.x/qemu_socket.h | 59 +
qemu-0.15.x/qerror.c | 505 +
qemu-0.15.x/qerror.h | 196 +
qemu-0.15.x/qfloat.c | 68 +
qemu-0.15.x/qfloat.h | 29 +
qemu-0.15.x/qga/guest-agent-command-state.c | 73 +
qemu-0.15.x/qga/guest-agent-commands.c | 561 +
qemu-0.15.x/qga/guest-agent-core.h | 31 +
qemu-0.15.x/qint.c | 67 +
qemu-0.15.x/qint.h | 28 +
qemu-0.15.x/qjson.c | 294 +
qemu-0.15.x/qjson.h | 28 +
qemu-0.15.x/qlist.c | 157 +
qemu-0.15.x/qlist.h | 64 +
qemu-0.15.x/qmp-commands.hx | 1868 +++
qemu-0.15.x/qobject.h | 112 +
qemu-0.15.x/qstring.c | 141 +
qemu-0.15.x/qstring.h | 35 +
qemu-0.15.x/range.h | 29 +
qemu-0.15.x/readline.c | 476 +
qemu-0.15.x/readline.h | 55 +
qemu-0.15.x/roms/SLOF/.gitignore | 6 +
qemu-0.15.x/roms/SLOF/INSTALL | 93 +
qemu-0.15.x/roms/SLOF/LICENSE | 8 +
qemu-0.15.x/roms/SLOF/Makefile | 133 +
qemu-0.15.x/roms/SLOF/Makefile.gen | 213 +
qemu-0.15.x/roms/SLOF/README | 153 +
qemu-0.15.x/roms/SLOF/board-js2x/Makefile | 85 +
qemu-0.15.x/roms/SLOF/board-js2x/Makefile.dirs | 41 +
qemu-0.15.x/roms/SLOF/board-js2x/config | 7 +
qemu-0.15.x/roms/SLOF/board-js2x/include/bmc.h | 29 +
qemu-0.15.x/roms/SLOF/board-js2x/include/hw.h | 27 +
.../roms/SLOF/board-js2x/include/nvramlog.h | 65 +
qemu-0.15.x/roms/SLOF/board-js2x/include/product.h | 31 +
.../roms/SLOF/board-js2x/include/southbridge.h | 28 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/Cboot.S | 18 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/Makefile | 61 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/board_io.S | 62 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/hw.c | 124 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/stage2.c | 284 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/stage2.h | 23 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/stage2.lds | 56 +
.../roms/SLOF/board-js2x/llfw/stage2_head.S | 91 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/stage_s.S | 43 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/stage_s.lds | 22 +
qemu-0.15.x/roms/SLOF/board-js2x/llfw/startup.S | 708 ++
qemu-0.15.x/roms/SLOF/board-js2x/llfw/u4mem.c | 4062 +++++++
.../roms/SLOF/board-js2x/romfs/boot_rom.ffs | 23 +
qemu-0.15.x/roms/SLOF/board-js2x/rtas/Makefile | 89 +
qemu-0.15.x/roms/SLOF/board-js2x/rtas/rtas_board.c | 216 +
qemu-0.15.x/roms/SLOF/board-js2x/rtas/rtas_board.h | 45 +
qemu-0.15.x/roms/SLOF/board-js2x/rtas/rtas_flash.c | 614 +
qemu-0.15.x/roms/SLOF/board-js2x/rtas/rtas_flash.h | 18 +
.../roms/SLOF/board-js2x/rtas/rtas_i2c_bmc.h | 27 +
.../roms/SLOF/board-js2x/rtas/rtas_ipmi_bmc.h | 21 +
qemu-0.15.x/roms/SLOF/board-js2x/rtas/rtas_out.c | 114 +
qemu-0.15.x/roms/SLOF/board-js2x/rtas/rtas_pci.c | 111 +
qemu-0.15.x/roms/SLOF/board-js2x/rtas/rtas_table.c | 45 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/Makefile | 110 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/OF.fs | 546 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/attu.fs | 101 +
.../roms/SLOF/board-js2x/slof/citrine-disk.fs | 79 +
.../roms/SLOF/board-js2x/slof/citrine-flash.fs | 36 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/citrine.fs | 242 +
.../roms/SLOF/board-js2x/slof/copyright-oss.fs | 16 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/cpu.fs | 44 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/dart.fs | 31 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/flash.fs | 43 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/freq.fs | 39 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/header.fs | 21 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/helper.fs | 28 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/ht.fs | 189 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/i2c.fs | 77 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/io.fs | 26 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/ioapic.fs | 36 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/ipmi-kcs.fs | 57 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/ipmi-vpd.fs | 98 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/memory.fs | 52 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/mpic.fs | 31 +
.../roms/SLOF/board-js2x/slof/pci-aliases.fs | 85 +
.../SLOF/board-js2x/slof/pci-bridge_1022_7460.fs | 193 +
.../roms/SLOF/board-js2x/slof/pci-capabilities.fs | 23 +
.../roms/SLOF/board-js2x/slof/pci-class_03.fs | 55 +
.../SLOF/board-js2x/slof/pci-device_1002_515e.fs | 504 +
.../SLOF/board-js2x/slof/pci-device_1014_028c.fs | 25 +
.../SLOF/board-js2x/slof/pci-device_1014_02bd.fs | 23 +
.../SLOF/board-js2x/slof/pci-device_1022_7451.fs | 34 +
.../SLOF/board-js2x/slof/pci-device_1022_7468.fs | 50 +
.../SLOF/board-js2x/slof/pci-device_1022_7469.fs | 23 +
.../roms/SLOF/board-js2x/slof/pci-interrupts.fs | 235 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/rtas.fs | 242 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/rtc.fs | 59 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/serial.fs | 48 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/sio.fs | 85 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/tpm.fs | 63 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/tree.fs | 227 +
qemu-0.15.x/roms/SLOF/board-js2x/slof/u4-mem.fs | 313 +
.../roms/SLOF/board-js2x/slof/vga-display.fs | 215 +
qemu-0.15.x/roms/SLOF/board-qemu/Makefile | 76 +
qemu-0.15.x/roms/SLOF/board-qemu/Makefile.dirs | 41 +
qemu-0.15.x/roms/SLOF/board-qemu/config | 7 +
qemu-0.15.x/roms/SLOF/board-qemu/include/hw.h | 27 +
.../roms/SLOF/board-qemu/include/nvramlog.h | 65 +
qemu-0.15.x/roms/SLOF/board-qemu/include/product.h | 31 +
.../roms/SLOF/board-qemu/include/southbridge.h | 20 +
qemu-0.15.x/roms/SLOF/board-qemu/llfw/Cboot.S | 18 +
qemu-0.15.x/roms/SLOF/board-qemu/llfw/Makefile | 56 +
qemu-0.15.x/roms/SLOF/board-qemu/llfw/board_io.S | 46 +
qemu-0.15.x/roms/SLOF/board-qemu/llfw/stage2.c | 186 +
qemu-0.15.x/roms/SLOF/board-qemu/llfw/stage2.h | 23 +
qemu-0.15.x/roms/SLOF/board-qemu/llfw/stage2.lds | 55 +
.../roms/SLOF/board-qemu/llfw/stage2_head.S | 95 +
qemu-0.15.x/roms/SLOF/board-qemu/llfw/startup.S | 258 +
.../roms/SLOF/board-qemu/romfs/boot_rom.ffs | 21 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/Makefile | 96 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/OF.fs | 160 +
.../roms/SLOF/board-qemu/slof/copyright-oss.fs | 16 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/fdt.fs | 251 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/header.fs | 22 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/helper.fs | 35 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/hvterm.fs | 26 +
.../roms/SLOF/board-qemu/slof/qemu-bootlist.fs | 38 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/rtas.fs | 126 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/tree.fs | 150 +
.../roms/SLOF/board-qemu/slof/vio-hvterm.fs | 32 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/vio-veth.fs | 41 +
.../roms/SLOF/board-qemu/slof/vio-vscsi-device.fs | 72 +
qemu-0.15.x/roms/SLOF/board-qemu/slof/vio-vscsi.fs | 623 +
qemu-0.15.x/roms/SLOF/board-qemu/veth/Makefile | 50 +
.../roms/SLOF/board-qemu/veth/module_entry.c | 44 +
qemu-0.15.x/roms/SLOF/board-qemu/veth/veth.c | 280 +
qemu-0.15.x/roms/SLOF/board-qemu/veth/veth.lds | 39 +
qemu-0.15.x/roms/SLOF/clients/Makefile | 29 +
qemu-0.15.x/roms/SLOF/clients/clients.mk | 13 +
qemu-0.15.x/roms/SLOF/clients/net-snk/Makefile | 66 +
qemu-0.15.x/roms/SLOF/clients/net-snk/app/Makefile | 51 +
.../roms/SLOF/clients/net-snk/app/biosemu/Makefile | 38 +
.../SLOF/clients/net-snk/app/biosemu/biosemu.c | 345 +
.../SLOF/clients/net-snk/app/biosemu/biosemu.h | 40 +
.../roms/SLOF/clients/net-snk/app/biosemu/debug.c | 55 +
.../roms/SLOF/clients/net-snk/app/biosemu/debug.h | 74 +
.../roms/SLOF/clients/net-snk/app/biosemu/device.c | 327 +
.../roms/SLOF/clients/net-snk/app/biosemu/device.h | 155 +
.../SLOF/clients/net-snk/app/biosemu/interrupt.c | 607 +
.../SLOF/clients/net-snk/app/biosemu/interrupt.h | 21 +
.../roms/SLOF/clients/net-snk/app/biosemu/io.c | 431 +
.../roms/SLOF/clients/net-snk/app/biosemu/io.h | 30 +
.../roms/SLOF/clients/net-snk/app/biosemu/mem.c | 463 +
.../roms/SLOF/clients/net-snk/app/biosemu/mem.h | 36 +
.../roms/SLOF/clients/net-snk/app/biosemu/vbe.c | 775 ++
.../roms/SLOF/clients/net-snk/app/biosemu/vbe.h | 16 +
qemu-0.15.x/roms/SLOF/clients/net-snk/app/main.c | 78 +
.../roms/SLOF/clients/net-snk/app/netapps/Makefile | 29 +
.../roms/SLOF/clients/net-snk/app/netapps/args.c | 142 +
.../roms/SLOF/clients/net-snk/app/netapps/args.h | 22 +
.../SLOF/clients/net-snk/app/netapps/netapps.h | 19 +
.../SLOF/clients/net-snk/app/netapps/netboot.c | 662 +
.../SLOF/clients/net-snk/app/netapps/netflash.c | 187 +
.../roms/SLOF/clients/net-snk/app/netapps/ping.c | 193 +
.../roms/SLOF/clients/net-snk/app/netlib/Makefile | 42 +
.../roms/SLOF/clients/net-snk/app/netlib/bootp.c | 248 +
.../roms/SLOF/clients/net-snk/app/netlib/dhcp.c | 993 ++
.../roms/SLOF/clients/net-snk/app/netlib/dhcp.h | 53 +
.../roms/SLOF/clients/net-snk/app/netlib/dns.c | 485 +
.../roms/SLOF/clients/net-snk/app/netlib/dns.h | 28 +
.../SLOF/clients/net-snk/app/netlib/ethernet.c | 186 +
.../SLOF/clients/net-snk/app/netlib/ethernet.h | 47 +
.../roms/SLOF/clients/net-snk/app/netlib/ipv4.c | 871 ++
.../roms/SLOF/clients/net-snk/app/netlib/ipv4.h | 96 +
.../roms/SLOF/clients/net-snk/app/netlib/tcp.c | 50 +
.../roms/SLOF/clients/net-snk/app/netlib/tcp.h | 27 +
.../roms/SLOF/clients/net-snk/app/netlib/tftp.c | 597 +
.../roms/SLOF/clients/net-snk/app/netlib/tftp.h | 48 +
.../roms/SLOF/clients/net-snk/app/netlib/udp.c | 153 +
.../roms/SLOF/clients/net-snk/app/netlib/udp.h | 58 +
qemu-0.15.x/roms/SLOF/clients/net-snk/client.lds | 51 +
.../roms/SLOF/clients/net-snk/include/crt0.h | 20 +
.../roms/SLOF/clients/net-snk/include/endian.h | 46 +
.../roms/SLOF/clients/net-snk/include/fcntl.h | 25 +
.../roms/SLOF/clients/net-snk/include/fileio.h | 53 +
.../roms/SLOF/clients/net-snk/include/ioctl.h | 19 +
.../roms/SLOF/clients/net-snk/include/kernel.h | 32 +
.../roms/SLOF/clients/net-snk/include/macros.h | 72 +
.../SLOF/clients/net-snk/include/netdriver_int.h | 192 +
qemu-0.15.x/roms/SLOF/clients/net-snk/include/of.h | 56 +
.../roms/SLOF/clients/net-snk/include/pci.h | 26 +
.../roms/SLOF/clients/net-snk/include/rtas.h | 45 +
.../roms/SLOF/clients/net-snk/include/sys/socket.h | 55 +
.../roms/SLOF/clients/net-snk/include/systemcall.h | 148 +
.../roms/SLOF/clients/net-snk/include/time.h | 36 +
.../roms/SLOF/clients/net-snk/include/types.h | 26 +
.../roms/SLOF/clients/net-snk/kernel/Makefile | 31 +
.../roms/SLOF/clients/net-snk/kernel/crt0.c | 74 +
.../roms/SLOF/clients/net-snk/kernel/endian.c | 30 +
.../roms/SLOF/clients/net-snk/kernel/entry.S | 167 +
.../roms/SLOF/clients/net-snk/kernel/init.c | 143 +
.../roms/SLOF/clients/net-snk/kernel/lowmem.S | 186 +
.../roms/SLOF/clients/net-snk/kernel/modules.c | 208 +
.../roms/SLOF/clients/net-snk/kernel/systemcall.c | 285 +
.../roms/SLOF/clients/net-snk/kernel/timer.c | 67 +
.../roms/SLOF/clients/net-snk/libc/Makefile | 44 +
qemu-0.15.x/roms/SLOF/clients/net-snk/libc/io.c | 42 +
qemu-0.15.x/roms/SLOF/clients/net-snk/libc/ioctl.c | 20 +
qemu-0.15.x/roms/SLOF/clients/net-snk/libc/sbrk.c | 37 +
.../roms/SLOF/clients/net-snk/libc/socket/Makefile | 39 +
.../roms/SLOF/clients/net-snk/libc/socket/send.c | 36 +
.../roms/SLOF/clients/net-snk/libc/time/Makefile | 39 +
.../roms/SLOF/clients/net-snk/libc/time/ftime.c | 38 +
.../roms/SLOF/clients/net-snk/libc/time/timer.c | 39 +
qemu-0.15.x/roms/SLOF/clients/net-snk/make.rules | 26 +
.../roms/SLOF/clients/net-snk/oflib/Makefile | 41 +
.../roms/SLOF/clients/net-snk/oflib/entry.S | 37 +
qemu-0.15.x/roms/SLOF/clients/net-snk/oflib/of.c | 886 ++
qemu-0.15.x/roms/SLOF/clients/net-snk/oflib/pci.c | 86 +
qemu-0.15.x/roms/SLOF/clients/net-snk/oflib/rtas.c | 334 +
.../roms/SLOF/clients/net-snk/sec-client.lds | 50 +
qemu-0.15.x/roms/SLOF/clients/takeover/Makefile | 59 +
qemu-0.15.x/roms/SLOF/clients/takeover/client.lds | 60 +
qemu-0.15.x/roms/SLOF/clients/takeover/entry.S | 93 +
qemu-0.15.x/roms/SLOF/clients/takeover/main.c | 218 +
qemu-0.15.x/roms/SLOF/clients/takeover/ppc32wrap.S | 30 +
qemu-0.15.x/roms/SLOF/clients/takeover/takeover.h | 23 +
qemu-0.15.x/roms/SLOF/include/calculatecrc.h | 66 +
qemu-0.15.x/roms/SLOF/include/libelf.h | 18 +
qemu-0.15.x/roms/SLOF/include/macros.h | 58 +
qemu-0.15.x/roms/SLOF/include/memmap.h | 26 +
qemu-0.15.x/roms/SLOF/include/pcd.h | 58 +
qemu-0.15.x/roms/SLOF/include/ppc970/cache.h | 40 +
qemu-0.15.x/roms/SLOF/include/ppc970/cpu.h | 103 +
qemu-0.15.x/roms/SLOF/include/ppcp7/cache.h | 62 +
qemu-0.15.x/roms/SLOF/include/ppcp7/cpu.h | 50 +
qemu-0.15.x/roms/SLOF/include/romfs.h | 60 +
qemu-0.15.x/roms/SLOF/include/rtas.h | 42 +
qemu-0.15.x/roms/SLOF/include/rtas_table.h | 32 +
qemu-0.15.x/roms/SLOF/include/termctrl.h | 62 +
qemu-0.15.x/roms/SLOF/include/types.h | 28 +
qemu-0.15.x/roms/SLOF/include/xvect.h | 21 +
qemu-0.15.x/roms/SLOF/lib/Makefile | 35 +
qemu-0.15.x/roms/SLOF/lib/libbases/Makefile | 40 +
qemu-0.15.x/roms/SLOF/lib/libbases/libbases.code | 42 +
qemu-0.15.x/roms/SLOF/lib/libbases/libbases.in | 17 +
qemu-0.15.x/roms/SLOF/lib/libbootmsg/Makefile | 73 +
qemu-0.15.x/roms/SLOF/lib/libbootmsg/bootmsg.code | 61 +
qemu-0.15.x/roms/SLOF/lib/libbootmsg/bootmsg.in | 19 +
qemu-0.15.x/roms/SLOF/lib/libbootmsg/bootmsg_lvl.S | 203 +
qemu-0.15.x/roms/SLOF/lib/libbootmsg/libbootmsg.h | 21 +
qemu-0.15.x/roms/SLOF/lib/libc/Makefile | 61 +
qemu-0.15.x/roms/SLOF/lib/libc/README.txt | 49 +
qemu-0.15.x/roms/SLOF/lib/libc/ctype/Makefile.inc | 20 +
qemu-0.15.x/roms/SLOF/lib/libc/ctype/isdigit.c | 25 +
qemu-0.15.x/roms/SLOF/lib/libc/ctype/isprint.c | 18 +
qemu-0.15.x/roms/SLOF/lib/libc/ctype/isspace.c | 29 +
qemu-0.15.x/roms/SLOF/lib/libc/ctype/isxdigit.c | 21 +
qemu-0.15.x/roms/SLOF/lib/libc/ctype/tolower.c | 18 +
qemu-0.15.x/roms/SLOF/lib/libc/ctype/toupper.c | 21 +
qemu-0.15.x/roms/SLOF/lib/libc/getopt/Makefile.inc | 17 +
qemu-0.15.x/roms/SLOF/lib/libc/getopt/getopt.c | 470 +
qemu-0.15.x/roms/SLOF/lib/libc/include/ctype.h | 24 +
qemu-0.15.x/roms/SLOF/lib/libc/include/errno.h | 34 +
qemu-0.15.x/roms/SLOF/lib/libc/include/getopt.h | 37 +
qemu-0.15.x/roms/SLOF/lib/libc/include/limits.h | 32 +
qemu-0.15.x/roms/SLOF/lib/libc/include/stdarg.h | 22 +
qemu-0.15.x/roms/SLOF/lib/libc/include/stddef.h | 25 +
qemu-0.15.x/roms/SLOF/lib/libc/include/stdint.h | 28 +
qemu-0.15.x/roms/SLOF/lib/libc/include/stdio.h | 63 +
qemu-0.15.x/roms/SLOF/lib/libc/include/stdlib.h | 33 +
qemu-0.15.x/roms/SLOF/lib/libc/include/string.h | 36 +
qemu-0.15.x/roms/SLOF/lib/libc/include/unistd.h | 26 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/Makefile.inc | 23 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/fileno.c | 19 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/fprintf.c | 26 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/fscanf.c | 26 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/printf.c | 27 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/putc.c | 25 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/putchar.c | 21 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/puts.c | 28 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/scanf.c | 26 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/setvbuf.c | 28 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/sprintf.c | 30 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/stdchnls.c | 23 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/vfprintf.c | 27 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/vfscanf.c | 266 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/vsnprintf.c | 242 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/vsprintf.c | 19 +
qemu-0.15.x/roms/SLOF/lib/libc/stdio/vsscanf.c | 131 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/Makefile.inc | 22 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/atoi.c | 18 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/atol.c | 18 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/error.c | 15 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/free.c | 26 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/malloc.c | 157 +
.../roms/SLOF/lib/libc/stdlib/malloc_defs.h | 16 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/memalign.c | 26 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/rand.c | 24 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/realloc.c | 40 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/strtol.c | 113 +
qemu-0.15.x/roms/SLOF/lib/libc/stdlib/strtoul.c | 103 +
qemu-0.15.x/roms/SLOF/lib/libc/string/Makefile.inc | 22 +
qemu-0.15.x/roms/SLOF/lib/libc/string/memchr.c | 29 +
qemu-0.15.x/roms/SLOF/lib/libc/string/memcmp.c | 30 +
qemu-0.15.x/roms/SLOF/lib/libc/string/memcpy.c | 27 +
qemu-0.15.x/roms/SLOF/lib/libc/string/memmove.c | 42 +
qemu-0.15.x/roms/SLOF/lib/libc/string/memset.c | 25 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strcasecmp.c | 28 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strcat.c | 24 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strchr.c | 28 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strcmp.c | 28 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strcpy.c | 25 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strlen.c | 27 +
.../roms/SLOF/lib/libc/string/strncasecmp.c | 32 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strncmp.c | 31 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strncpy.c | 33 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strstr.c | 37 +
qemu-0.15.x/roms/SLOF/lib/libc/string/strtok.c | 45 +
qemu-0.15.x/roms/SLOF/lib/libelf/Makefile | 47 +
qemu-0.15.x/roms/SLOF/lib/libelf/elf.c | 234 +
qemu-0.15.x/roms/SLOF/lib/libelf/libelf.code | 21 +
qemu-0.15.x/roms/SLOF/lib/libelf/libelf.in | 12 +
qemu-0.15.x/roms/SLOF/lib/libhvcall/Makefile | 53 +
qemu-0.15.x/roms/SLOF/lib/libhvcall/hvcall.S | 86 +
qemu-0.15.x/roms/SLOF/lib/libhvcall/hvcall.code | 51 +
qemu-0.15.x/roms/SLOF/lib/libhvcall/hvcall.in | 18 +
qemu-0.15.x/roms/SLOF/lib/libhvcall/libhvcall.h | 65 +
qemu-0.15.x/roms/SLOF/lib/libipmi/Makefile | 28 +
qemu-0.15.x/roms/SLOF/lib/libipmi/libipmi.code | 120 +
qemu-0.15.x/roms/SLOF/lib/libipmi/libipmi.h | 33 +
qemu-0.15.x/roms/SLOF/lib/libipmi/libipmi.in | 24 +
qemu-0.15.x/roms/SLOF/lib/libnvram/Makefile | 50 +
qemu-0.15.x/roms/SLOF/lib/libnvram/envvar.c | 244 +
qemu-0.15.x/roms/SLOF/lib/libnvram/libnvram.code | 279 +
qemu-0.15.x/roms/SLOF/lib/libnvram/libnvram.in | 41 +
qemu-0.15.x/roms/SLOF/lib/libnvram/nvram.c | 527 +
qemu-0.15.x/roms/SLOF/lib/libnvram/nvram.h | 90 +
qemu-0.15.x/roms/SLOF/llfw/boot_abort.S | 95 +
qemu-0.15.x/roms/SLOF/llfw/boot_abort.h | 37 +
qemu-0.15.x/roms/SLOF/llfw/clib/Makefile.inc | 42 +
qemu-0.15.x/roms/SLOF/llfw/clib/iolib.c | 65 +
qemu-0.15.x/roms/SLOF/llfw/clib/iolib.h | 35 +
qemu-0.15.x/roms/SLOF/llfw/io_generic/Makefile.inc | 38 +
qemu-0.15.x/roms/SLOF/llfw/io_generic/io_generic.S | 129 +
qemu-0.15.x/roms/SLOF/llfw/nvramlog.S | 351 +
qemu-0.15.x/roms/SLOF/llfw/romfs.S | 362 +
qemu-0.15.x/roms/SLOF/llfw/romfs_wrap.c | 22 +
qemu-0.15.x/roms/SLOF/make.rules | 68 +
qemu-0.15.x/roms/SLOF/other-licence/Makefile | 31 +
qemu-0.15.x/roms/SLOF/other-licence/bcm/Makefile | 57 +
qemu-0.15.x/roms/SLOF/other-licence/bcm/bcm57xx.c | 3428 ++++++
qemu-0.15.x/roms/SLOF/other-licence/bcm/bcm57xx.h | 296 +
qemu-0.15.x/roms/SLOF/other-licence/bcm/types.h | 26 +
.../roms/SLOF/other-licence/common/Makefile | 44 +
.../roms/SLOF/other-licence/common/module.lds | 39 +
.../roms/SLOF/other-licence/common/module_entry.c | 64 +
.../roms/SLOF/other-licence/x86emu/Makefile | 46 +
.../SLOF/other-licence/x86emu/x86emu_changes.diff | 893 ++
.../SLOF/other-licence/x86emu/x86emu_download.sh | 60 +
qemu-0.15.x/roms/SLOF/romfs/header.img | 1 +
qemu-0.15.x/roms/SLOF/romfs/tools/Makefile | 55 +
qemu-0.15.x/roms/SLOF/romfs/tools/build_ffs.c | 476 +
qemu-0.15.x/roms/SLOF/romfs/tools/cfg_parse.c | 371 +
qemu-0.15.x/roms/SLOF/romfs/tools/cfgparse.h | 59 +
qemu-0.15.x/roms/SLOF/romfs/tools/create_crc.c | 467 +
qemu-0.15.x/roms/SLOF/romfs/tools/create_flash.c | 163 +
qemu-0.15.x/roms/SLOF/romfs/tools/createcrc.h | 19 +
qemu-0.15.x/roms/SLOF/rtas/Makefile.inc | 89 +
qemu-0.15.x/roms/SLOF/rtas/flash/block_lists.c | 274 +
qemu-0.15.x/roms/SLOF/rtas/flash/block_lists.h | 23 +
.../roms/SLOF/rtas/flash/tmpXXX.update-comments | 11 +
qemu-0.15.x/roms/SLOF/rtas/reloc.S | 183 +
qemu-0.15.x/roms/SLOF/rtas/rtas.lds | 49 +
qemu-0.15.x/roms/SLOF/rtas/rtas_call.c | 89 +
qemu-0.15.x/roms/SLOF/rtas/rtas_common.S | 87 +
qemu-0.15.x/roms/SLOF/rtas/rtas_entry.S | 72 +
qemu-0.15.x/roms/SLOF/slof/Makefile.inc | 165 +
qemu-0.15.x/roms/SLOF/slof/OF.lds | 65 +
qemu-0.15.x/roms/SLOF/slof/default-font.c | 1653 +++
qemu-0.15.x/roms/SLOF/slof/engine.in | 540 +
qemu-0.15.x/roms/SLOF/slof/entry.S | 187 +
qemu-0.15.x/roms/SLOF/slof/fs/accept.fs | 410 +
qemu-0.15.x/roms/SLOF/slof/fs/alloc-mem.fs | 75 +
qemu-0.15.x/roms/SLOF/slof/fs/available.fs | 72 +
qemu-0.15.x/roms/SLOF/slof/fs/banner.fs | 23 +
qemu-0.15.x/roms/SLOF/slof/fs/base.fs | 558 +
qemu-0.15.x/roms/SLOF/slof/fs/boot.fs | 243 +
qemu-0.15.x/roms/SLOF/slof/fs/bootmsg.fs | 74 +
qemu-0.15.x/roms/SLOF/slof/fs/claim.fs | 406 +
qemu-0.15.x/roms/SLOF/slof/fs/client.fs | 208 +
qemu-0.15.x/roms/SLOF/slof/fs/debug.fs | 437 +
.../roms/SLOF/slof/fs/devices/pci-class_02.fs | 35 +
.../roms/SLOF/slof/fs/devices/pci-class_0c.fs | 39 +
.../SLOF/slof/fs/devices/pci-device_10de_0141.fs | 49 +
qemu-0.15.x/roms/SLOF/slof/fs/dictionary.fs | 74 +
qemu-0.15.x/roms/SLOF/slof/fs/display.fs | 123 +
qemu-0.15.x/roms/SLOF/slof/fs/dump.fs | 42 +
qemu-0.15.x/roms/SLOF/slof/fs/elf.fs | 305 +
qemu-0.15.x/roms/SLOF/slof/fs/envvar.fs | 421 +
qemu-0.15.x/roms/SLOF/slof/fs/envvar_defaults.fs | 44 +
qemu-0.15.x/roms/SLOF/slof/fs/exception.fs | 154 +
qemu-0.15.x/roms/SLOF/slof/fs/fbuffer.fs | 178 +
qemu-0.15.x/roms/SLOF/slof/fs/fcode/1275.fs | 353 +
qemu-0.15.x/roms/SLOF/slof/fs/fcode/big.fs | 45 +
qemu-0.15.x/roms/SLOF/slof/fs/fcode/core.fs | 169 +
qemu-0.15.x/roms/SLOF/slof/fs/fcode/evaluator.fs | 99 +
qemu-0.15.x/roms/SLOF/slof/fs/fcode/tokens.fs | 411 +
qemu-0.15.x/roms/SLOF/slof/fs/find-hash.fs | 77 +
qemu-0.15.x/roms/SLOF/slof/fs/generic-disk.fs | 68 +
qemu-0.15.x/roms/SLOF/slof/fs/history.fs | 107 +
qemu-0.15.x/roms/SLOF/slof/fs/ide.fs | 612 +
qemu-0.15.x/roms/SLOF/slof/fs/instance.fs | 130 +
qemu-0.15.x/roms/SLOF/slof/fs/little-endian.fs | 72 +
qemu-0.15.x/roms/SLOF/slof/fs/loaders.fs | 87 +
qemu-0.15.x/roms/SLOF/slof/fs/logging.fs | 45 +
qemu-0.15.x/roms/SLOF/slof/fs/node.fs | 478 +
qemu-0.15.x/roms/SLOF/slof/fs/nvram.fs | 189 +
qemu-0.15.x/roms/SLOF/slof/fs/packages.fs | 62 +
qemu-0.15.x/roms/SLOF/slof/fs/packages/bulk.fs | 87 +
.../roms/SLOF/slof/fs/packages/deblocker.fs | 61 +
.../roms/SLOF/slof/fs/packages/disk-label.fs | 521 +
.../roms/SLOF/slof/fs/packages/ext2-files.fs | 140 +
.../roms/SLOF/slof/fs/packages/fat-files.fs | 187 +
qemu-0.15.x/roms/SLOF/slof/fs/packages/filler.fs | 21 +
qemu-0.15.x/roms/SLOF/slof/fs/packages/iso-9660.fs | 312 +
qemu-0.15.x/roms/SLOF/slof/fs/packages/obp-tftp.fs | 73 +
.../roms/SLOF/slof/fs/packages/rom-files.fs | 85 +
qemu-0.15.x/roms/SLOF/slof/fs/packages/sms.fs | 29 +
qemu-0.15.x/roms/SLOF/slof/fs/pci-bridge.fs | 62 +
.../roms/SLOF/slof/fs/pci-class-code-names.fs | 263 +
qemu-0.15.x/roms/SLOF/slof/fs/pci-config-bridge.fs | 85 +
qemu-0.15.x/roms/SLOF/slof/fs/pci-device.fs | 101 +
qemu-0.15.x/roms/SLOF/slof/fs/pci-properties.fs | 650 +
qemu-0.15.x/roms/SLOF/slof/fs/pci-scan.fs | 495 +
qemu-0.15.x/roms/SLOF/slof/fs/preprocessor.fs | 41 +
qemu-0.15.x/roms/SLOF/slof/fs/property.fs | 189 +
qemu-0.15.x/roms/SLOF/slof/fs/quiesce.fs | 54 +
qemu-0.15.x/roms/SLOF/slof/fs/rmove.fs | 53 +
qemu-0.15.x/roms/SLOF/slof/fs/romfs.fs | 123 +
qemu-0.15.x/roms/SLOF/slof/fs/root.fs | 57 +
qemu-0.15.x/roms/SLOF/slof/fs/rtas/rtas-cpu.fs | 23 +
qemu-0.15.x/roms/SLOF/slof/fs/rtas/rtas-flash.fs | 46 +
qemu-0.15.x/roms/SLOF/slof/fs/rtas/rtas-init.fs | 121 +
qemu-0.15.x/roms/SLOF/slof/fs/rtas/rtas-reboot.fs | 33 +
qemu-0.15.x/roms/SLOF/slof/fs/rtas/rtas-vpd.fs | 33 +
qemu-0.15.x/roms/SLOF/slof/fs/scsi-loader.fs | 77 +
qemu-0.15.x/roms/SLOF/slof/fs/scsi-support.fs | 809 ++
qemu-0.15.x/roms/SLOF/slof/fs/search.fs | 89 +
qemu-0.15.x/roms/SLOF/slof/fs/slof-logo.fs | 20 +
qemu-0.15.x/roms/SLOF/slof/fs/sms/sms-load.fs | 70 +
qemu-0.15.x/roms/SLOF/slof/fs/sms/sms-nvram.fs | 124 +
qemu-0.15.x/roms/SLOF/slof/fs/stack.fs | 57 +
qemu-0.15.x/roms/SLOF/slof/fs/start-up.fs | 92 +
qemu-0.15.x/roms/SLOF/slof/fs/term-io.fs | 95 +
qemu-0.15.x/roms/SLOF/slof/fs/terminal.fs | 196 +
qemu-0.15.x/roms/SLOF/slof/fs/timebase.fs | 24 +
qemu-0.15.x/roms/SLOF/slof/fs/translate.fs | 152 +
qemu-0.15.x/roms/SLOF/slof/fs/update_flash.fs | 110 +
qemu-0.15.x/roms/SLOF/slof/fs/usb/usb-enumerate.fs | 324 +
qemu-0.15.x/roms/SLOF/slof/fs/usb/usb-hub.fs | 459 +
.../SLOF/slof/fs/usb/usb-kbd-device-support.fs | 102 +
qemu-0.15.x/roms/SLOF/slof/fs/usb/usb-keyboard.fs | 371 +
qemu-0.15.x/roms/SLOF/slof/fs/usb/usb-mouse.fs | 28 +
qemu-0.15.x/roms/SLOF/slof/fs/usb/usb-ohci.fs | 1190 ++
qemu-0.15.x/roms/SLOF/slof/fs/usb/usb-static.fs | 297 +
.../roms/SLOF/slof/fs/usb/usb-storage-support.fs | 155 +
.../roms/SLOF/slof/fs/usb/usb-storage-wrapper.fs | 181 +
qemu-0.15.x/roms/SLOF/slof/fs/usb/usb-storage.fs | 639 +
qemu-0.15.x/roms/SLOF/slof/fs/usb/usb-support.fs | 651 +
qemu-0.15.x/roms/SLOF/slof/fs/vpd-bootlist.fs | 134 +
qemu-0.15.x/roms/SLOF/slof/fs/xmodem.fs | 120 +
qemu-0.15.x/roms/SLOF/slof/lowmem.S | 69 +
qemu-0.15.x/roms/SLOF/slof/ofw.S | 44 +
qemu-0.15.x/roms/SLOF/slof/paflof.c | 109 +
qemu-0.15.x/roms/SLOF/slof/paflof.h | 41 +
qemu-0.15.x/roms/SLOF/slof/ppc64.c | 110 +
qemu-0.15.x/roms/SLOF/slof/ppc64.code | 264 +
qemu-0.15.x/roms/SLOF/slof/ppc64.h | 41 +
qemu-0.15.x/roms/SLOF/slof/ppc64.in | 103 +
qemu-0.15.x/roms/SLOF/slof/prep.h | 46 +
qemu-0.15.x/roms/SLOF/slof/prim.code | 634 +
qemu-0.15.x/roms/SLOF/slof/prim.in | 110 +
qemu-0.15.x/roms/SLOF/slof/ref.pl | 148 +
qemu-0.15.x/roms/SLOF/slof/types.h | 49 +
qemu-0.15.x/roms/SLOF/tools/Makefile | 33 +
qemu-0.15.x/roms/SLOF/tools/create_reloc_table.sh | 60 +
qemu-0.15.x/roms/SLOF/tools/gen_reloc_table.c | 95 +
qemu-0.15.x/roms/ipxe/COPYING | 339 +
qemu-0.15.x/roms/ipxe/COPYRIGHTS | 12 +
qemu-0.15.x/roms/ipxe/README | 8 +
qemu-0.15.x/roms/ipxe/contrib/README | 9 +
qemu-0.15.x/roms/ipxe/contrib/errdb/.gitignore | 1 +
qemu-0.15.x/roms/ipxe/contrib/errdb/errdb.pl | 108 +
qemu-0.15.x/roms/ipxe/contrib/rom-o-matic/README | 62 +
.../roms/ipxe/contrib/rom-o-matic/bottom.php | 62 +
.../roms/ipxe/contrib/rom-o-matic/build.php | 306 +
.../ipxe/contrib/rom-o-matic/customize-flags.php | 69 +
.../roms/ipxe/contrib/rom-o-matic/directions.php | 63 +
.../ipxe/contrib/rom-o-matic/doc/AUTOBOOT_CMD.html | 1 +
.../contrib/rom-o-matic/doc/BANNER_TIMEOUT.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/COMCONSOLE.html | 3 +
.../roms/ipxe/contrib/rom-o-matic/doc/COMDATA.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/COMPARITY.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/COMPRESERVE.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/COMSPEED.html | 1 +
.../roms/ipxe/contrib/rom-o-matic/doc/COMSTOP.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/CONFIG_CMD.html | 1 +
.../contrib/rom-o-matic/doc/CONSOLE_PC_BIOS.html | 1 +
.../contrib/rom-o-matic/doc/CONSOLE_SERIAL.html | 1 +
.../contrib/rom-o-matic/doc/CRYPTO_80211_WEP.html | 1 +
.../contrib/rom-o-matic/doc/CRYPTO_80211_WPA.html | 1 +
.../contrib/rom-o-matic/doc/CRYPTO_80211_WPA2.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/DHCP_CMD.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/DNS_RESOLVER.html | 1 +
.../rom-o-matic/doc/DOWNLOAD_PROTO_FTP.html | 1 +
.../rom-o-matic/doc/DOWNLOAD_PROTO_HTTP.html | 1 +
.../rom-o-matic/doc/DOWNLOAD_PROTO_TFTP.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/IFMGMT_CMD.html | 1 +
.../contrib/rom-o-matic/doc/IMAGE_BZIMAGE.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/IMAGE_CMD.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/IMAGE_ELF.html | 1 +
.../contrib/rom-o-matic/doc/IMAGE_MULTIBOOT.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/IMAGE_NBI.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/IMAGE_PXE.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/IMAGE_SCRIPT.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/IWMGMT_CMD.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/NMB_RESOLVER.html | 1 +
.../roms/ipxe/contrib/rom-o-matic/doc/NVO_CMD.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/ROUTE_CMD.html | 1 +
.../ipxe/contrib/rom-o-matic/doc/SANBOOT_CMD.html | 1 +
.../roms/ipxe/contrib/rom-o-matic/flag-table.php | 499 +
.../roms/ipxe/contrib/rom-o-matic/globals.php | 51 +
.../roms/ipxe/contrib/rom-o-matic/index.php | 47 +
qemu-0.15.x/roms/ipxe/contrib/rom-o-matic/top.php | 41 +
.../roms/ipxe/contrib/rom-o-matic/utils.php | 683 ++
qemu-0.15.x/roms/ipxe/contrib/vm/.gitignore | 6 +
qemu-0.15.x/roms/ipxe/contrib/vm/Makefile | 7 +
.../roms/ipxe/contrib/vm/bochs-writable-ROM-patch | 15 +
qemu-0.15.x/roms/ipxe/contrib/vm/bochsrc.txt | 751 ++
qemu-0.15.x/roms/ipxe/contrib/vm/cow | 49 +
qemu-0.15.x/roms/ipxe/contrib/vm/serial-console | 278 +
qemu-0.15.x/roms/ipxe/contrib/vm/serial-console.1 | 190 +
qemu-0.15.x/roms/ipxe/src/.gitignore | 4 +
qemu-0.15.x/roms/ipxe/src/Makefile | 177 +
qemu-0.15.x/roms/ipxe/src/Makefile.housekeeping | 1145 ++
qemu-0.15.x/roms/ipxe/src/arch/i386/Makefile | 105 +
qemu-0.15.x/roms/ipxe/src/arch/i386/Makefile.efi | 10 +
qemu-0.15.x/roms/ipxe/src/arch/i386/Makefile.linux | 6 +
.../roms/ipxe/src/arch/i386/Makefile.pcbios | 86 +
qemu-0.15.x/roms/ipxe/src/arch/i386/README.i386 | 197 +
.../roms/ipxe/src/arch/i386/core/aout_loader.c | 144 +
.../roms/ipxe/src/arch/i386/core/basemem_packet.c | 32 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/cmdline.c | 113 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/cpu.c | 73 +
.../roms/ipxe/src/arch/i386/core/dumpregs.c | 23 +
.../roms/ipxe/src/arch/i386/core/freebsd_loader.c | 377 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/gdbidt.S | 215 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/gdbmach.c | 151 +
.../ipxe/src/arch/i386/core/linux/linux_syscall.S | 45 +
.../roms/ipxe/src/arch/i386/core/nulltrap.c | 51 +
.../roms/ipxe/src/arch/i386/core/patch_cf.S | 38 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/pic8259.c | 66 +
.../roms/ipxe/src/arch/i386/core/rdtsc_timer.c | 89 +
.../roms/ipxe/src/arch/i386/core/relocate.c | 129 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/setjmp.S | 42 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/stack.S | 15 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/stack16.S | 15 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/timer2.c | 87 +
.../roms/ipxe/src/arch/i386/core/video_subr.c | 104 +
.../roms/ipxe/src/arch/i386/core/virtaddr.S | 103 +
.../roms/ipxe/src/arch/i386/core/wince_loader.c | 273 +
qemu-0.15.x/roms/ipxe/src/arch/i386/core/x86_io.c | 96 +
.../roms/ipxe/src/arch/i386/drivers/net/undi.c | 148 +
.../roms/ipxe/src/arch/i386/drivers/net/undiisr.S | 87 +
.../roms/ipxe/src/arch/i386/drivers/net/undiload.c | 173 +
.../roms/ipxe/src/arch/i386/drivers/net/undinet.c | 652 +
.../roms/ipxe/src/arch/i386/drivers/net/undionly.c | 129 +
.../ipxe/src/arch/i386/drivers/net/undipreload.c | 37 +
.../roms/ipxe/src/arch/i386/drivers/net/undirom.c | 234 +
.../ipxe/src/arch/i386/firmware/pcbios/basemem.c | 46 +
.../src/arch/i386/firmware/pcbios/bios_console.c | 314 +
.../src/arch/i386/firmware/pcbios/e820mangler.S | 584 +
.../ipxe/src/arch/i386/firmware/pcbios/fakee820.c | 93 +
.../ipxe/src/arch/i386/firmware/pcbios/hidemem.c | 220 +
.../ipxe/src/arch/i386/firmware/pcbios/memmap.c | 322 +
.../ipxe/src/arch/i386/firmware/pcbios/pnpbios.c | 109 +
.../roms/ipxe/src/arch/i386/hci/commands/pxe_cmd.c | 103 +
.../ipxe/src/arch/i386/hci/commands/reboot_cmd.c | 66 +
.../roms/ipxe/src/arch/i386/image/bootsector.c | 114 +
.../roms/ipxe/src/arch/i386/image/bzimage.c | 551 +
qemu-0.15.x/roms/ipxe/src/arch/i386/image/com32.c | 331 +
.../roms/ipxe/src/arch/i386/image/comboot.c | 326 +
.../roms/ipxe/src/arch/i386/image/elfboot.c | 107 +
.../roms/ipxe/src/arch/i386/image/multiboot.c | 472 +
qemu-0.15.x/roms/ipxe/src/arch/i386/image/nbi.c | 424 +
.../roms/ipxe/src/arch/i386/image/pxe_image.c | 108 +
.../roms/ipxe/src/arch/i386/include/basemem.h | 35 +
.../ipxe/src/arch/i386/include/basemem_packet.h | 15 +
qemu-0.15.x/roms/ipxe/src/arch/i386/include/bios.h | 10 +
.../roms/ipxe/src/arch/i386/include/bios_disks.h | 69 +
.../roms/ipxe/src/arch/i386/include/biosint.h | 33 +
.../ipxe/src/arch/i386/include/bits/byteswap.h | 43 +
.../ipxe/src/arch/i386/include/bits/compiler.h | 27 +
.../roms/ipxe/src/arch/i386/include/bits/cpu.h | 86 +
.../roms/ipxe/src/arch/i386/include/bits/endian.h | 8 +
.../roms/ipxe/src/arch/i386/include/bits/errfile.h | 42 +
.../roms/ipxe/src/arch/i386/include/bits/io.h | 14 +
.../ipxe/src/arch/i386/include/bits/linux_api.h | 6 +
.../roms/ipxe/src/arch/i386/include/bits/nap.h | 15 +
.../roms/ipxe/src/arch/i386/include/bits/sanboot.h | 14 +
.../roms/ipxe/src/arch/i386/include/bits/smbios.h | 14 +
.../roms/ipxe/src/arch/i386/include/bits/stdint.h | 23 +
.../roms/ipxe/src/arch/i386/include/bits/timer.h | 15 +
.../roms/ipxe/src/arch/i386/include/bits/uaccess.h | 14 +
.../roms/ipxe/src/arch/i386/include/bits/umalloc.h | 14 +
.../roms/ipxe/src/arch/i386/include/bochs.h | 34 +
.../roms/ipxe/src/arch/i386/include/bootsector.h | 14 +
.../roms/ipxe/src/arch/i386/include/bzimage.h | 142 +
.../roms/ipxe/src/arch/i386/include/comboot.h | 177 +
.../src/arch/i386/include/efi/ipxe/dhcp_arch.h | 40 +
.../roms/ipxe/src/arch/i386/include/fakee820.h | 9 +
.../roms/ipxe/src/arch/i386/include/gdbmach.h | 64 +
.../roms/ipxe/src/arch/i386/include/int13.h | 267 +
.../ipxe/src/arch/i386/include/ipxe/bios_nap.h | 18 +
.../ipxe/src/arch/i386/include/ipxe/bios_sanboot.h | 18 +
.../ipxe/src/arch/i386/include/ipxe/bios_smbios.h | 18 +
.../ipxe/src/arch/i386/include/ipxe/bios_timer.h | 44 +
.../src/arch/i386/include/ipxe/memtop_umalloc.h | 18 +
.../ipxe/src/arch/i386/include/ipxe/rdtsc_timer.h | 39 +
.../roms/ipxe/src/arch/i386/include/ipxe/timer2.h | 14 +
.../roms/ipxe/src/arch/i386/include/ipxe/x86_io.h | 153 +
qemu-0.15.x/roms/ipxe/src/arch/i386/include/kir.h | 18 +
.../roms/ipxe/src/arch/i386/include/libkir.h | 233 +
.../roms/ipxe/src/arch/i386/include/librm.h | 201 +
.../roms/ipxe/src/arch/i386/include/limits.h | 61 +
.../roms/ipxe/src/arch/i386/include/memsizes.h | 19 +
.../roms/ipxe/src/arch/i386/include/multiboot.h | 149 +
.../src/arch/i386/include/pcbios/ipxe/dhcp_arch.h | 40 +
.../roms/ipxe/src/arch/i386/include/pic8259.h | 71 +
.../roms/ipxe/src/arch/i386/include/pnpbios.h | 17 +
qemu-0.15.x/roms/ipxe/src/arch/i386/include/pxe.h | 152 +
.../roms/ipxe/src/arch/i386/include/pxe_api.h | 1909 +++
.../roms/ipxe/src/arch/i386/include/pxe_call.h | 43 +
.../roms/ipxe/src/arch/i386/include/pxe_types.h | 127 +
.../roms/ipxe/src/arch/i386/include/pxeparent.h | 11 +
.../roms/ipxe/src/arch/i386/include/realmode.h | 127 +
.../roms/ipxe/src/arch/i386/include/registers.h | 198 +
.../roms/ipxe/src/arch/i386/include/setjmp.h | 40 +
qemu-0.15.x/roms/ipxe/src/arch/i386/include/undi.h | 106 +
.../roms/ipxe/src/arch/i386/include/undiload.h | 35 +
.../roms/ipxe/src/arch/i386/include/undinet.h | 17 +
.../roms/ipxe/src/arch/i386/include/undipreload.h | 18 +
.../roms/ipxe/src/arch/i386/include/undirom.h | 53 +
qemu-0.15.x/roms/ipxe/src/arch/i386/include/vga.h | 228 +
.../ipxe/src/arch/i386/interface/pcbios/bios_nap.c | 16 +
.../src/arch/i386/interface/pcbios/bios_smbios.c | 86 +
.../src/arch/i386/interface/pcbios/bios_timer.c | 65 +
.../ipxe/src/arch/i386/interface/pcbios/biosint.c | 92 +
.../ipxe/src/arch/i386/interface/pcbios/int13.c | 1434 +++
.../arch/i386/interface/pcbios/memtop_umalloc.c | 202 +
.../ipxe/src/arch/i386/interface/pcbios/pcibios.c | 114 +
.../ipxe/src/arch/i386/interface/pxe/pxe_call.c | 521 +
.../ipxe/src/arch/i386/interface/pxe/pxe_entry.S | 216 +
.../ipxe/src/arch/i386/interface/pxe/pxe_file.c | 306 +
.../ipxe/src/arch/i386/interface/pxe/pxe_loader.c | 50 +
.../ipxe/src/arch/i386/interface/pxe/pxe_preboot.c | 332 +
.../ipxe/src/arch/i386/interface/pxe/pxe_tftp.c | 564 +
.../ipxe/src/arch/i386/interface/pxe/pxe_udp.c | 407 +
.../ipxe/src/arch/i386/interface/pxe/pxe_undi.c | 822 ++
.../src/arch/i386/interface/pxeparent/pxeparent.c | 191 +
.../arch/i386/interface/pxeparent/pxeparent_dhcp.c | 69 +
.../src/arch/i386/interface/syslinux/com32_call.c | 207 +
.../arch/i386/interface/syslinux/com32_wrapper.S | 122 +
.../arch/i386/interface/syslinux/comboot_call.c | 700 ++
.../arch/i386/interface/syslinux/comboot_resolv.c | 61 +
qemu-0.15.x/roms/ipxe/src/arch/i386/kir-Makefile | 26 +
.../roms/ipxe/src/arch/i386/prefix/bootpart.S | 218 +
.../roms/ipxe/src/arch/i386/prefix/dskprefix.S | 383 +
.../roms/ipxe/src/arch/i386/prefix/exeprefix.S | 156 +
.../roms/ipxe/src/arch/i386/prefix/hdprefix.S | 111 +
.../roms/ipxe/src/arch/i386/prefix/kkpxeprefix.S | 14 +
.../roms/ipxe/src/arch/i386/prefix/kpxeprefix.S | 10 +
.../roms/ipxe/src/arch/i386/prefix/libprefix.S | 934 ++
.../roms/ipxe/src/arch/i386/prefix/linuxprefix.S | 28 +
.../roms/ipxe/src/arch/i386/prefix/lkrnprefix.S | 228 +
qemu-0.15.x/roms/ipxe/src/arch/i386/prefix/mbr.S | 13 +
.../roms/ipxe/src/arch/i386/prefix/mromprefix.S | 434 +
.../roms/ipxe/src/arch/i386/prefix/nbiprefix.S | 78 +
.../roms/ipxe/src/arch/i386/prefix/nullprefix.S | 13 +
.../roms/ipxe/src/arch/i386/prefix/pxeprefix.S | 763 ++
.../roms/ipxe/src/arch/i386/prefix/romprefix.S | 812 ++
.../roms/ipxe/src/arch/i386/prefix/undiloader.S | 52 +
.../roms/ipxe/src/arch/i386/prefix/unnrv2b.S | 184 +
.../roms/ipxe/src/arch/i386/prefix/unnrv2b16.S | 9 +
.../roms/ipxe/src/arch/i386/prefix/usbdisk.S | 23 +
.../roms/ipxe/src/arch/i386/scripts/i386-kir.lds | 200 +
.../roms/ipxe/src/arch/i386/scripts/i386.lds | 220 +
.../roms/ipxe/src/arch/i386/scripts/linux.lds | 102 +
.../roms/ipxe/src/arch/i386/transitions/liba20.S | 305 +
.../roms/ipxe/src/arch/i386/transitions/libkir.S | 256 +
.../roms/ipxe/src/arch/i386/transitions/librm.S | 571 +
.../ipxe/src/arch/i386/transitions/librm_mgmt.c | 58 +
qemu-0.15.x/roms/ipxe/src/arch/x86/Makefile | 15 +
qemu-0.15.x/roms/ipxe/src/arch/x86/Makefile.efi | 28 +
qemu-0.15.x/roms/ipxe/src/arch/x86/Makefile.linux | 13 +
.../roms/ipxe/src/arch/x86/core/linux/linux_api.c | 106 +
.../ipxe/src/arch/x86/core/linux/linux_strerror.c | 169 +
.../roms/ipxe/src/arch/x86/core/pcidirect.c | 47 +
.../roms/ipxe/src/arch/x86/core/x86_string.c | 63 +
.../src/arch/x86/include/bits/linux_api_platform.h | 6 +
.../roms/ipxe/src/arch/x86/include/bits/pci_io.h | 15 +
.../roms/ipxe/src/arch/x86/include/bits/string.h | 252 +
.../src/arch/x86/include/ipxe/efi/efix86_nap.h | 18 +
.../roms/ipxe/src/arch/x86/include/ipxe/pcibios.h | 135 +
.../ipxe/src/arch/x86/include/ipxe/pcidirect.h | 141 +
.../src/arch/x86/include/linux/ipxe/dhcp_arch.h | 36 +
.../ipxe/src/arch/x86/include/valgrind/memcheck.h | 309 +
.../ipxe/src/arch/x86/include/valgrind/valgrind.h | 4536 +++++++
.../ipxe/src/arch/x86/interface/efi/efix86_nap.c | 48 +
.../roms/ipxe/src/arch/x86/prefix/efidrvprefix.c | 47 +
.../roms/ipxe/src/arch/x86/prefix/efiprefix.c | 41 +
qemu-0.15.x/roms/ipxe/src/arch/x86/scripts/efi.lds | 108 +
qemu-0.15.x/roms/ipxe/src/arch/x86_64/Makefile | 41 +
qemu-0.15.x/roms/ipxe/src/arch/x86_64/Makefile.efi | 14 +
.../roms/ipxe/src/arch/x86_64/Makefile.linux | 6 +
.../src/arch/x86_64/core/linux/linux_syscall.S | 33 +
.../ipxe/src/arch/x86_64/include/bits/byteswap.h | 22 +
.../ipxe/src/arch/x86_64/include/bits/compiler.h | 14 +
.../ipxe/src/arch/x86_64/include/bits/endian.h | 6 +
.../ipxe/src/arch/x86_64/include/bits/errfile.h | 11 +
.../roms/ipxe/src/arch/x86_64/include/bits/io.h | 10 +
.../ipxe/src/arch/x86_64/include/bits/linux_api.h | 6 +
.../roms/ipxe/src/arch/x86_64/include/bits/nap.h | 12 +
.../ipxe/src/arch/x86_64/include/bits/sanboot.h | 12 +
.../ipxe/src/arch/x86_64/include/bits/smbios.h | 10 +
.../ipxe/src/arch/x86_64/include/bits/stdint.h | 21 +
.../roms/ipxe/src/arch/x86_64/include/bits/timer.h | 10 +
.../ipxe/src/arch/x86_64/include/bits/uaccess.h | 10 +
.../ipxe/src/arch/x86_64/include/bits/umalloc.h | 10 +
.../src/arch/x86_64/include/efi/ipxe/dhcp_arch.h | 40 +
.../roms/ipxe/src/arch/x86_64/include/gdbmach.h | 51 +
.../roms/ipxe/src/arch/x86_64/include/limits.h | 59 +
.../roms/ipxe/src/arch/x86_64/prefix/linuxprefix.S | 25 +
.../roms/ipxe/src/arch/x86_64/scripts/linux.lds | 102 +
qemu-0.15.x/roms/ipxe/src/config/.gitignore | 1 +
qemu-0.15.x/roms/ipxe/src/config/config.c | 290 +
qemu-0.15.x/roms/ipxe/src/config/config_ethernet.c | 26 +
qemu-0.15.x/roms/ipxe/src/config/config_fc.c | 31 +
.../roms/ipxe/src/config/config_infiniband.c | 23 +
qemu-0.15.x/roms/ipxe/src/config/config_net80211.c | 50 +
.../roms/ipxe/src/config/config_romprefix.c | 24 +
qemu-0.15.x/roms/ipxe/src/config/console.h | 28 +
qemu-0.15.x/roms/ipxe/src/config/defaults.h | 10 +
qemu-0.15.x/roms/ipxe/src/config/defaults/efi.h | 24 +
qemu-0.15.x/roms/ipxe/src/config/defaults/linux.h | 22 +
qemu-0.15.x/roms/ipxe/src/config/defaults/pcbios.h | 37 +
qemu-0.15.x/roms/ipxe/src/config/general.h | 157 +
qemu-0.15.x/roms/ipxe/src/config/ioapi.h | 19 +
qemu-0.15.x/roms/ipxe/src/config/isa.h | 17 +
qemu-0.15.x/roms/ipxe/src/config/nap.h | 19 +
qemu-0.15.x/roms/ipxe/src/config/sanboot.h | 16 +
qemu-0.15.x/roms/ipxe/src/config/serial.h | 37 +
qemu-0.15.x/roms/ipxe/src/config/sideband.h | 14 +
qemu-0.15.x/roms/ipxe/src/config/timer.h | 19 +
qemu-0.15.x/roms/ipxe/src/config/umalloc.h | 16 +
qemu-0.15.x/roms/ipxe/src/core/acpi.c | 85 +
qemu-0.15.x/roms/ipxe/src/core/ansiesc.c | 116 +
qemu-0.15.x/roms/ipxe/src/core/asprintf.c | 49 +
qemu-0.15.x/roms/ipxe/src/core/base16.c | 106 +
qemu-0.15.x/roms/ipxe/src/core/base64.c | 155 +
qemu-0.15.x/roms/ipxe/src/core/basename.c | 64 +
qemu-0.15.x/roms/ipxe/src/core/bitmap.c | 101 +
qemu-0.15.x/roms/ipxe/src/core/bitops.c | 13 +
qemu-0.15.x/roms/ipxe/src/core/blockdev.c | 138 +
qemu-0.15.x/roms/ipxe/src/core/btext.c | 5039 ++++++++
qemu-0.15.x/roms/ipxe/src/core/console.c | 130 +
qemu-0.15.x/roms/ipxe/src/core/cpio.c | 42 +
qemu-0.15.x/roms/ipxe/src/core/ctype.c | 48 +
qemu-0.15.x/roms/ipxe/src/core/cwuri.c | 48 +
qemu-0.15.x/roms/ipxe/src/core/debug.c | 171 +
qemu-0.15.x/roms/ipxe/src/core/debug_md5.c | 47 +
qemu-0.15.x/roms/ipxe/src/core/device.c | 135 +
qemu-0.15.x/roms/ipxe/src/core/downloader.c | 256 +
qemu-0.15.x/roms/ipxe/src/core/edd.c | 56 +
qemu-0.15.x/roms/ipxe/src/core/errno.c | 18 +
qemu-0.15.x/roms/ipxe/src/core/exec.c | 492 +
qemu-0.15.x/roms/ipxe/src/core/fnrec.c | 202 +
qemu-0.15.x/roms/ipxe/src/core/gdbserial.c | 48 +
qemu-0.15.x/roms/ipxe/src/core/gdbstub.c | 399 +
qemu-0.15.x/roms/ipxe/src/core/gdbudp.c | 259 +
qemu-0.15.x/roms/ipxe/src/core/getkey.c | 84 +
qemu-0.15.x/roms/ipxe/src/core/getopt.c | 273 +
qemu-0.15.x/roms/ipxe/src/core/hw.c | 66 +
qemu-0.15.x/roms/ipxe/src/core/i82365.c | 656 +
qemu-0.15.x/roms/ipxe/src/core/image.c | 353 +
qemu-0.15.x/roms/ipxe/src/core/init.c | 98 +
qemu-0.15.x/roms/ipxe/src/core/interface.c | 291 +
qemu-0.15.x/roms/ipxe/src/core/iobuf.c | 96 +
qemu-0.15.x/roms/ipxe/src/core/job.c | 54 +
qemu-0.15.x/roms/ipxe/src/core/linebuf.c | 111 +
qemu-0.15.x/roms/ipxe/src/core/main.c | 118 +
qemu-0.15.x/roms/ipxe/src/core/malloc.c | 476 +
qemu-0.15.x/roms/ipxe/src/core/misc.c | 60 +
qemu-0.15.x/roms/ipxe/src/core/monojob.c | 115 +
qemu-0.15.x/roms/ipxe/src/core/null_nap.c | 3 +
qemu-0.15.x/roms/ipxe/src/core/null_sanboot.c | 44 +
qemu-0.15.x/roms/ipxe/src/core/nvo.c | 320 +
qemu-0.15.x/roms/ipxe/src/core/open.c | 227 +
qemu-0.15.x/roms/ipxe/src/core/parseopt.c | 235 +
qemu-0.15.x/roms/ipxe/src/core/pc_kbd.c | 112 +
qemu-0.15.x/roms/ipxe/src/core/pcmcia.c | 270 +
qemu-0.15.x/roms/ipxe/src/core/posix_io.c | 338 +
qemu-0.15.x/roms/ipxe/src/core/process.c | 114 +
qemu-0.15.x/roms/ipxe/src/core/random.c | 41 +
qemu-0.15.x/roms/ipxe/src/core/refcnt.c | 98 +
qemu-0.15.x/roms/ipxe/src/core/resolv.c | 430 +
qemu-0.15.x/roms/ipxe/src/core/serial.c | 254 +
qemu-0.15.x/roms/ipxe/src/core/serial_console.c | 31 +
qemu-0.15.x/roms/ipxe/src/core/settings.c | 1744 +++
qemu-0.15.x/roms/ipxe/src/core/string.c | 355 +
qemu-0.15.x/roms/ipxe/src/core/stringextra.c | 275 +
qemu-0.15.x/roms/ipxe/src/core/strtoull.c | 48 +
qemu-0.15.x/roms/ipxe/src/core/timer.c | 42 +
qemu-0.15.x/roms/ipxe/src/core/uri.c | 500 +
qemu-0.15.x/roms/ipxe/src/core/uuid.c | 50 +
qemu-0.15.x/roms/ipxe/src/core/vsprintf.c | 423 +
qemu-0.15.x/roms/ipxe/src/core/xfer.c | 339 +
qemu-0.15.x/roms/ipxe/src/crypto/aes_wrap.c | 123 +
qemu-0.15.x/roms/ipxe/src/crypto/arc4.c | 131 +
qemu-0.15.x/roms/ipxe/src/crypto/asn1.c | 166 +
qemu-0.15.x/roms/ipxe/src/crypto/axtls/aes.c | 478 +
qemu-0.15.x/roms/ipxe/src/crypto/axtls/bigint.c | 1496 +++
qemu-0.15.x/roms/ipxe/src/crypto/axtls/bigint.h | 93 +
.../roms/ipxe/src/crypto/axtls/bigint_impl.h | 105 +
qemu-0.15.x/roms/ipxe/src/crypto/axtls/crypto.h | 302 +
qemu-0.15.x/roms/ipxe/src/crypto/axtls/os_port.h | 61 +
qemu-0.15.x/roms/ipxe/src/crypto/axtls/rsa.c | 332 +
qemu-0.15.x/roms/ipxe/src/crypto/axtls/sha1.c | 240 +
qemu-0.15.x/roms/ipxe/src/crypto/axtls_aes.c | 158 +
qemu-0.15.x/roms/ipxe/src/crypto/axtls_sha1.c | 25 +
qemu-0.15.x/roms/ipxe/src/crypto/cbc.c | 101 +
qemu-0.15.x/roms/ipxe/src/crypto/chap.c | 124 +
qemu-0.15.x/roms/ipxe/src/crypto/crandom.c | 55 +
qemu-0.15.x/roms/ipxe/src/crypto/crc32.c | 54 +
qemu-0.15.x/roms/ipxe/src/crypto/crypto_null.c | 87 +
qemu-0.15.x/roms/ipxe/src/crypto/hmac.c | 122 +
qemu-0.15.x/roms/ipxe/src/crypto/md5.c | 234 +
qemu-0.15.x/roms/ipxe/src/crypto/sha1extra.c | 165 +
qemu-0.15.x/roms/ipxe/src/crypto/x509.c | 183 +
qemu-0.15.x/roms/ipxe/src/doc/build_sys.dox | 419 +
qemu-0.15.x/roms/ipxe/src/doc/pxe_extensions | 312 +
qemu-0.15.x/roms/ipxe/src/doxygen.cfg | 1486 +++
.../roms/ipxe/src/drivers/bitbash/bitbash.c | 57 +
.../roms/ipxe/src/drivers/bitbash/i2c_bit.c | 393 +
.../roms/ipxe/src/drivers/bitbash/spi_bit.c | 228 +
qemu-0.15.x/roms/ipxe/src/drivers/block/ata.c | 678 ++
qemu-0.15.x/roms/ipxe/src/drivers/block/ibft.c | 480 +
qemu-0.15.x/roms/ipxe/src/drivers/block/scsi.c | 960 ++
qemu-0.15.x/roms/ipxe/src/drivers/block/srp.c | 828 ++
qemu-0.15.x/roms/ipxe/src/drivers/bus/eisa.c | 182 +
qemu-0.15.x/roms/ipxe/src/drivers/bus/isa.c | 173 +
qemu-0.15.x/roms/ipxe/src/drivers/bus/isa_ids.c | 26 +
qemu-0.15.x/roms/ipxe/src/drivers/bus/isapnp.c | 755 ++
qemu-0.15.x/roms/ipxe/src/drivers/bus/mca.c | 177 +
qemu-0.15.x/roms/ipxe/src/drivers/bus/pci.c | 368 +
qemu-0.15.x/roms/ipxe/src/drivers/bus/pcibackup.c | 90 +
qemu-0.15.x/roms/ipxe/src/drivers/bus/pciextra.c | 86 +
qemu-0.15.x/roms/ipxe/src/drivers/bus/pcivpd.c | 555 +
qemu-0.15.x/roms/ipxe/src/drivers/bus/virtio-pci.c | 64 +
.../roms/ipxe/src/drivers/bus/virtio-ring.c | 136 +
.../roms/ipxe/src/drivers/infiniband/MT25218_PRM.h | 3460 ++++++
.../roms/ipxe/src/drivers/infiniband/MT25408_PRM.h | 3404 ++++++
.../roms/ipxe/src/drivers/infiniband/arbel.c | 2839 +++++
.../roms/ipxe/src/drivers/infiniband/arbel.h | 623 +
.../roms/ipxe/src/drivers/infiniband/hermon.c | 3854 ++++++
.../roms/ipxe/src/drivers/infiniband/hermon.h | 932 ++
.../roms/ipxe/src/drivers/infiniband/linda.c | 2430 ++++
.../roms/ipxe/src/drivers/infiniband/linda.h | 276 +
.../roms/ipxe/src/drivers/infiniband/linda_fw.c | 1069 ++
.../roms/ipxe/src/drivers/infiniband/mlx_bitops.h | 245 +
.../roms/ipxe/src/drivers/infiniband/qib7322.c | 2428 ++++
.../roms/ipxe/src/drivers/infiniband/qib7322.h | 364 +
.../ipxe/src/drivers/infiniband/qib_7220_regs.h | 1762 +++
.../ipxe/src/drivers/infiniband/qib_7322_regs.h | 7261 +++++++++++
.../ipxe/src/drivers/infiniband/qib_genbits.pl | 116 +
qemu-0.15.x/roms/ipxe/src/drivers/linux/linux.c | 153 +
qemu-0.15.x/roms/ipxe/src/drivers/linux/tap.c | 249 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c503.c | 5 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c509-eisa.c | 49 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c509.c | 432 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c509.h | 394 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c515.c | 763 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/3c515.txt | 31 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c529.c | 62 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c595.c | 553 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c595.h | 437 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c5x9.c | 416 +
qemu-0.15.x/roms/ipxe/src/drivers/net/3c90x.c | 988 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/3c90x.h | 308 +
qemu-0.15.x/roms/ipxe/src/drivers/net/amd8111e.c | 693 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/amd8111e.h | 631 +
.../roms/ipxe/src/drivers/net/ath5k/ath5k.c | 1698 +++
.../roms/ipxe/src/drivers/net/ath5k/ath5k.h | 1279 ++
.../roms/ipxe/src/drivers/net/ath5k/ath5k_attach.c | 340 +
.../roms/ipxe/src/drivers/net/ath5k/ath5k_caps.c | 154 +
.../roms/ipxe/src/drivers/net/ath5k/ath5k_desc.c | 544 +
.../roms/ipxe/src/drivers/net/ath5k/ath5k_dma.c | 631 +
.../roms/ipxe/src/drivers/net/ath5k/ath5k_eeprom.c | 1760 +++
.../roms/ipxe/src/drivers/net/ath5k/ath5k_gpio.c | 122 +
.../ipxe/src/drivers/net/ath5k/ath5k_initvals.c | 1560 +++
.../roms/ipxe/src/drivers/net/ath5k/ath5k_pcu.c | 534 +
.../roms/ipxe/src/drivers/net/ath5k/ath5k_phy.c | 2581 ++++
.../roms/ipxe/src/drivers/net/ath5k/ath5k_qcu.c | 390 +
.../roms/ipxe/src/drivers/net/ath5k/ath5k_reset.c | 1174 ++
.../roms/ipxe/src/drivers/net/ath5k/ath5k_rfkill.c | 107 +
qemu-0.15.x/roms/ipxe/src/drivers/net/ath5k/base.h | 145 +
qemu-0.15.x/roms/ipxe/src/drivers/net/ath5k/desc.h | 332 +
.../roms/ipxe/src/drivers/net/ath5k/eeprom.h | 451 +
qemu-0.15.x/roms/ipxe/src/drivers/net/ath5k/reg.h | 2589 ++++
.../roms/ipxe/src/drivers/net/ath5k/rfbuffer.h | 1181 ++
.../roms/ipxe/src/drivers/net/ath5k/rfgain.h | 516 +
qemu-0.15.x/roms/ipxe/src/drivers/net/atl1e.c | 1749 +++
qemu-0.15.x/roms/ipxe/src/drivers/net/atl1e.h | 1033 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/b44.c | 953 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/b44.h | 469 +
qemu-0.15.x/roms/ipxe/src/drivers/net/bnx2.c | 2697 +++++
qemu-0.15.x/roms/ipxe/src/drivers/net/bnx2.h | 4598 +++++++
qemu-0.15.x/roms/ipxe/src/drivers/net/bnx2_fw.h | 3494 ++++++
qemu-0.15.x/roms/ipxe/src/drivers/net/cs89x0.c | 739 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/cs89x0.h | 481 +
qemu-0.15.x/roms/ipxe/src/drivers/net/cs89x0.txt | 45 +
qemu-0.15.x/roms/ipxe/src/drivers/net/davicom.c | 708 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/depca.c | 805 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/dmfe.c | 1227 ++
.../roms/ipxe/src/drivers/net/e1000/e1000.c | 35 +
.../roms/ipxe/src/drivers/net/e1000/e1000.h | 326 +
.../roms/ipxe/src/drivers/net/e1000/e1000_82540.c | 754 ++
.../roms/ipxe/src/drivers/net/e1000/e1000_82541.c | 1314 ++
.../roms/ipxe/src/drivers/net/e1000/e1000_82541.h | 86 +
.../roms/ipxe/src/drivers/net/e1000/e1000_82542.c | 571 +
.../roms/ipxe/src/drivers/net/e1000/e1000_82543.c | 1635 +++
.../roms/ipxe/src/drivers/net/e1000/e1000_82543.h | 45 +
.../roms/ipxe/src/drivers/net/e1000/e1000_api.c | 1108 ++
.../roms/ipxe/src/drivers/net/e1000/e1000_api.h | 127 +
.../ipxe/src/drivers/net/e1000/e1000_defines.h | 1416 +++
.../roms/ipxe/src/drivers/net/e1000/e1000_hw.h | 728 ++
.../roms/ipxe/src/drivers/net/e1000/e1000_mac.c | 2196 ++++
.../roms/ipxe/src/drivers/net/e1000/e1000_mac.h | 94 +
.../roms/ipxe/src/drivers/net/e1000/e1000_main.c | 909 ++
.../roms/ipxe/src/drivers/net/e1000/e1000_manage.c | 389 +
.../roms/ipxe/src/drivers/net/e1000/e1000_manage.h | 84 +
.../roms/ipxe/src/drivers/net/e1000/e1000_nvm.c | 923 ++
.../roms/ipxe/src/drivers/net/e1000/e1000_nvm.h | 63 +
.../roms/ipxe/src/drivers/net/e1000/e1000_osdep.h | 118 +
.../roms/ipxe/src/drivers/net/e1000/e1000_phy.c | 2308 ++++
.../roms/ipxe/src/drivers/net/e1000/e1000_phy.h | 171 +
.../roms/ipxe/src/drivers/net/e1000/e1000_regs.h | 329 +
.../roms/ipxe/src/drivers/net/e1000e/e1000e.c | 34 +
.../roms/ipxe/src/drivers/net/e1000e/e1000e.h | 532 +
.../src/drivers/net/e1000e/e1000e_80003es2lan.c | 1533 +++
.../src/drivers/net/e1000e/e1000e_80003es2lan.h | 100 +
.../ipxe/src/drivers/net/e1000e/e1000e_82571.c | 1818 +++
.../ipxe/src/drivers/net/e1000e/e1000e_82571.h | 55 +
.../ipxe/src/drivers/net/e1000e/e1000e_defines.h | 1469 +++
.../roms/ipxe/src/drivers/net/e1000e/e1000e_hw.h | 719 ++
.../ipxe/src/drivers/net/e1000e/e1000e_ich8lan.c | 3444 ++++++
.../ipxe/src/drivers/net/e1000e/e1000e_ich8lan.h | 196 +
.../roms/ipxe/src/drivers/net/e1000e/e1000e_mac.c | 1883 +++
.../roms/ipxe/src/drivers/net/e1000e/e1000e_mac.h | 79 +
.../roms/ipxe/src/drivers/net/e1000e/e1000e_main.c | 1265 ++
.../ipxe/src/drivers/net/e1000e/e1000e_manage.c | 372 +
.../ipxe/src/drivers/net/e1000e/e1000e_manage.h | 86 +
.../roms/ipxe/src/drivers/net/e1000e/e1000e_nvm.c | 596 +
.../roms/ipxe/src/drivers/net/e1000e/e1000e_nvm.h | 53 +
.../roms/ipxe/src/drivers/net/e1000e/e1000e_phy.c | 3323 +++++
.../roms/ipxe/src/drivers/net/e1000e/e1000e_phy.h | 261 +
.../roms/ipxe/src/drivers/net/e1000e/e1000e_regs.h | 340 +
qemu-0.15.x/roms/ipxe/src/drivers/net/eepro.c | 638 +
qemu-0.15.x/roms/ipxe/src/drivers/net/eepro100.c | 1163 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/eepro100.h | 204 +
qemu-0.15.x/roms/ipxe/src/drivers/net/efi/snp.h | 49 +
qemu-0.15.x/roms/ipxe/src/drivers/net/efi/snpnet.c | 362 +
qemu-0.15.x/roms/ipxe/src/drivers/net/efi/snpnet.h | 35 +
.../roms/ipxe/src/drivers/net/efi/snponly.c | 129 +
qemu-0.15.x/roms/ipxe/src/drivers/net/epic100.c | 537 +
qemu-0.15.x/roms/ipxe/src/drivers/net/epic100.h | 190 +
.../roms/ipxe/src/drivers/net/etherfabric.c | 4225 +++++++
.../roms/ipxe/src/drivers/net/etherfabric.h | 553 +
.../roms/ipxe/src/drivers/net/etherfabric_nic.h | 204 +
qemu-0.15.x/roms/ipxe/src/drivers/net/forcedeth.c | 1981 +++
qemu-0.15.x/roms/ipxe/src/drivers/net/forcedeth.h | 601 +
qemu-0.15.x/roms/ipxe/src/drivers/net/hfa384x.h | 3069 +++++
qemu-0.15.x/roms/ipxe/src/drivers/net/igb/igb.c | 32 +
qemu-0.15.x/roms/ipxe/src/drivers/net/igb/igb.h | 324 +
.../roms/ipxe/src/drivers/net/igb/igb_82575.c | 1617 +++
.../roms/ipxe/src/drivers/net/igb/igb_82575.h | 442 +
.../roms/ipxe/src/drivers/net/igb/igb_api.c | 1108 ++
.../roms/ipxe/src/drivers/net/igb/igb_api.h | 166 +
.../roms/ipxe/src/drivers/net/igb/igb_defines.h | 1515 +++
qemu-0.15.x/roms/ipxe/src/drivers/net/igb/igb_hw.h | 697 ++
.../roms/ipxe/src/drivers/net/igb/igb_mac.c | 1991 +++
.../roms/ipxe/src/drivers/net/igb/igb_mac.h | 82 +
.../roms/ipxe/src/drivers/net/igb/igb_main.c | 1010 ++
.../roms/ipxe/src/drivers/net/igb/igb_manage.c | 388 +
.../roms/ipxe/src/drivers/net/igb/igb_manage.h | 83 +
.../roms/ipxe/src/drivers/net/igb/igb_nvm.c | 627 +
.../roms/ipxe/src/drivers/net/igb/igb_nvm.h | 52 +
.../roms/ipxe/src/drivers/net/igb/igb_osdep.h | 129 +
.../roms/ipxe/src/drivers/net/igb/igb_phy.c | 2470 ++++
.../roms/ipxe/src/drivers/net/igb/igb_phy.h | 171 +
.../roms/ipxe/src/drivers/net/igb/igb_regs.h | 486 +
.../roms/ipxe/src/drivers/net/igbvf/igbvf.h | 377 +
.../ipxe/src/drivers/net/igbvf/igbvf_defines.h | 1395 +++
.../roms/ipxe/src/drivers/net/igbvf/igbvf_main.c | 954 ++
.../roms/ipxe/src/drivers/net/igbvf/igbvf_mbx.c | 404 +
.../roms/ipxe/src/drivers/net/igbvf/igbvf_mbx.h | 87 +
.../roms/ipxe/src/drivers/net/igbvf/igbvf_osdep.h | 121 +
.../roms/ipxe/src/drivers/net/igbvf/igbvf_regs.h | 338 +
.../roms/ipxe/src/drivers/net/igbvf/igbvf_vf.c | 455 +
.../roms/ipxe/src/drivers/net/igbvf/igbvf_vf.h | 345 +
qemu-0.15.x/roms/ipxe/src/drivers/net/ipoib.c | 787 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/jme.c | 1308 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/jme.h | 914 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/legacy.c | 157 +
qemu-0.15.x/roms/ipxe/src/drivers/net/mtd80x.c | 1022 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/myri10ge.c | 1335 ++
.../roms/ipxe/src/drivers/net/myri10ge_mcp.h | 514 +
qemu-0.15.x/roms/ipxe/src/drivers/net/natsemi.c | 604 +
qemu-0.15.x/roms/ipxe/src/drivers/net/natsemi.h | 232 +
qemu-0.15.x/roms/ipxe/src/drivers/net/ne.c | 6 +
qemu-0.15.x/roms/ipxe/src/drivers/net/ne2k_isa.c | 375 +
qemu-0.15.x/roms/ipxe/src/drivers/net/ns83820.c | 1007 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/ns8390.c | 1037 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/ns8390.h | 240 +
qemu-0.15.x/roms/ipxe/src/drivers/net/p80211hdr.h | 301 +
qemu-0.15.x/roms/ipxe/src/drivers/net/pcnet32.c | 1161 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/pcnet32.h | 181 +
.../roms/ipxe/src/drivers/net/phantom/nx_bitops.h | 194 +
.../src/drivers/net/phantom/nxhal_nic_interface.h | 501 +
.../roms/ipxe/src/drivers/net/phantom/phantom.c | 2178 ++++
.../roms/ipxe/src/drivers/net/phantom/phantom.h | 212 +
.../roms/ipxe/src/drivers/net/phantom/phantom_hw.h | 184 +
qemu-0.15.x/roms/ipxe/src/drivers/net/pnic.c | 280 +
qemu-0.15.x/roms/ipxe/src/drivers/net/pnic_api.h | 61 +
qemu-0.15.x/roms/ipxe/src/drivers/net/prism2.c | 857 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/prism2_pci.c | 58 +
qemu-0.15.x/roms/ipxe/src/drivers/net/prism2_plx.c | 122 +
qemu-0.15.x/roms/ipxe/src/drivers/net/r8169.c | 2232 ++++
qemu-0.15.x/roms/ipxe/src/drivers/net/r8169.h | 486 +
qemu-0.15.x/roms/ipxe/src/drivers/net/rtl8139.c | 596 +
.../roms/ipxe/src/drivers/net/rtl818x/rtl8180.c | 17 +
.../ipxe/src/drivers/net/rtl818x/rtl8180_grf5101.c | 186 +
.../ipxe/src/drivers/net/rtl818x/rtl8180_max2820.c | 158 +
.../ipxe/src/drivers/net/rtl818x/rtl8180_sa2400.c | 217 +
.../roms/ipxe/src/drivers/net/rtl818x/rtl8185.c | 14 +
.../ipxe/src/drivers/net/rtl818x/rtl8185_rtl8225.c | 804 ++
.../roms/ipxe/src/drivers/net/rtl818x/rtl818x.c | 854 ++
.../roms/ipxe/src/drivers/net/rtl818x/rtl818x.h | 359 +
qemu-0.15.x/roms/ipxe/src/drivers/net/sis190.c | 1174 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/sis190.h | 311 +
qemu-0.15.x/roms/ipxe/src/drivers/net/sis900.c | 1303 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/sis900.h | 375 +
qemu-0.15.x/roms/ipxe/src/drivers/net/skge.c | 2468 ++++
qemu-0.15.x/roms/ipxe/src/drivers/net/skge.h | 2623 ++++
qemu-0.15.x/roms/ipxe/src/drivers/net/sky2.c | 2393 ++++
qemu-0.15.x/roms/ipxe/src/drivers/net/sky2.h | 2176 ++++
qemu-0.15.x/roms/ipxe/src/drivers/net/smc9000.c | 952 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/smc9000.h | 428 +
qemu-0.15.x/roms/ipxe/src/drivers/net/sundance.c | 898 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/tg3.c | 3435 ++++++
qemu-0.15.x/roms/ipxe/src/drivers/net/tg3.h | 2121 ++++
qemu-0.15.x/roms/ipxe/src/drivers/net/tlan.c | 1723 +++
qemu-0.15.x/roms/ipxe/src/drivers/net/tlan.h | 491 +
qemu-0.15.x/roms/ipxe/src/drivers/net/tulip.c | 1969 +++
qemu-0.15.x/roms/ipxe/src/drivers/net/tulip.txt | 54 +
qemu-0.15.x/roms/ipxe/src/drivers/net/via-rhine.c | 1447 +++
.../roms/ipxe/src/drivers/net/via-velocity.c | 1926 +++
.../roms/ipxe/src/drivers/net/via-velocity.h | 1932 +++
qemu-0.15.x/roms/ipxe/src/drivers/net/virtio-net.c | 419 +
qemu-0.15.x/roms/ipxe/src/drivers/net/virtio-net.h | 44 +
qemu-0.15.x/roms/ipxe/src/drivers/net/vxge/vxge.c | 18 +
.../roms/ipxe/src/drivers/net/vxge/vxge_config.c | 1868 +++
.../roms/ipxe/src/drivers/net/vxge/vxge_config.h | 783 ++
.../roms/ipxe/src/drivers/net/vxge/vxge_main.c | 718 ++
.../roms/ipxe/src/drivers/net/vxge/vxge_main.h | 230 +
.../roms/ipxe/src/drivers/net/vxge/vxge_reg.h | 4700 ++++++++
.../roms/ipxe/src/drivers/net/vxge/vxge_traffic.c | 738 ++
.../roms/ipxe/src/drivers/net/vxge/vxge_traffic.h | 309 +
.../roms/ipxe/src/drivers/net/vxge/vxge_version.h | 40 +
qemu-0.15.x/roms/ipxe/src/drivers/net/w89c840.c | 964 ++
qemu-0.15.x/roms/ipxe/src/drivers/net/wd.c | 6 +
.../roms/ipxe/src/drivers/net/wlan_compat.h | 577 +
qemu-0.15.x/roms/ipxe/src/drivers/nvs/nvs.c | 165 +
qemu-0.15.x/roms/ipxe/src/drivers/nvs/nvsvpd.c | 233 +
qemu-0.15.x/roms/ipxe/src/drivers/nvs/spi.c | 140 +
qemu-0.15.x/roms/ipxe/src/drivers/nvs/threewire.c | 131 +
.../roms/ipxe/src/hci/commands/autoboot_cmd.c | 57 +
.../roms/ipxe/src/hci/commands/config_cmd.c | 102 +
qemu-0.15.x/roms/ipxe/src/hci/commands/dhcp_cmd.c | 137 +
.../roms/ipxe/src/hci/commands/digest_cmd.c | 121 +
.../roms/ipxe/src/hci/commands/fcmgmt_cmd.c | 216 +
.../roms/ipxe/src/hci/commands/gdbstub_cmd.c | 110 +
.../roms/ipxe/src/hci/commands/ifmgmt_cmd.c | 181 +
qemu-0.15.x/roms/ipxe/src/hci/commands/image_cmd.c | 423 +
.../roms/ipxe/src/hci/commands/iwmgmt_cmd.c | 106 +
qemu-0.15.x/roms/ipxe/src/hci/commands/login_cmd.c | 72 +
.../roms/ipxe/src/hci/commands/lotest_cmd.c | 97 +
qemu-0.15.x/roms/ipxe/src/hci/commands/nvo_cmd.c | 240 +
qemu-0.15.x/roms/ipxe/src/hci/commands/route_cmd.c | 69 +
.../roms/ipxe/src/hci/commands/sanboot_cmd.c | 90 +
qemu-0.15.x/roms/ipxe/src/hci/commands/time_cmd.c | 119 +
qemu-0.15.x/roms/ipxe/src/hci/commands/vlan_cmd.c | 139 +
qemu-0.15.x/roms/ipxe/src/hci/editstring.c | 203 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_al.c | 32 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_az.c | 24 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_bg.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_by.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_cf.c | 24 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_cz.c | 27 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_de.c | 46 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_dk.c | 31 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_es.c | 29 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_et.c | 30 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_fi.c | 38 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_fr.c | 68 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_gr.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_hu.c | 34 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_il.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_it.c | 32 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_lt.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_mk.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_mt.c | 20 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_nl.c | 34 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_no.c | 105 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_pl.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_pt.c | 29 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_ro.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_ru.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_sg.c | 41 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_sr.c | 35 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_th.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_ua.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_uk.c | 19 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_us.c | 15 +
qemu-0.15.x/roms/ipxe/src/hci/keymap/keymap_wo.c | 55 +
qemu-0.15.x/roms/ipxe/src/hci/linux_args.c | 190 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/alert.c | 18 +
.../roms/ipxe/src/hci/mucurses/ansi_screen.c | 74 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/clear.c | 90 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/colour.c | 66 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/cursor.h | 37 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/edging.c | 111 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/kb.c | 143 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/mucurses.c | 147 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/mucurses.h | 23 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/print.c | 86 +
.../roms/ipxe/src/hci/mucurses/print_nadv.c | 26 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/slk.c | 363 +
.../roms/ipxe/src/hci/mucurses/widgets/editbox.c | 102 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/winattrs.c | 133 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/windows.c | 158 +
qemu-0.15.x/roms/ipxe/src/hci/mucurses/wininit.c | 37 +
qemu-0.15.x/roms/ipxe/src/hci/readline.c | 324 +
qemu-0.15.x/roms/ipxe/src/hci/shell.c | 137 +
qemu-0.15.x/roms/ipxe/src/hci/strerror.c | 125 +
qemu-0.15.x/roms/ipxe/src/hci/tui/login_ui.c | 137 +
qemu-0.15.x/roms/ipxe/src/hci/tui/settings_ui.c | 573 +
qemu-0.15.x/roms/ipxe/src/hci/wireless_errors.c | 108 +
qemu-0.15.x/roms/ipxe/src/image/efi_image.c | 103 +
qemu-0.15.x/roms/ipxe/src/image/elf.c | 163 +
qemu-0.15.x/roms/ipxe/src/image/embedded.c | 91 +
qemu-0.15.x/roms/ipxe/src/image/script.c | 352 +
qemu-0.15.x/roms/ipxe/src/image/segment.c | 90 +
qemu-0.15.x/roms/ipxe/src/include/.gitignore | 1 +
qemu-0.15.x/roms/ipxe/src/include/alloca.h | 25 +
qemu-0.15.x/roms/ipxe/src/include/assert.h | 67 +
qemu-0.15.x/roms/ipxe/src/include/big_bswap.h | 33 +
qemu-0.15.x/roms/ipxe/src/include/bootp.h | 230 +
qemu-0.15.x/roms/ipxe/src/include/btext.h | 62 +
qemu-0.15.x/roms/ipxe/src/include/byteswap.h | 59 +
qemu-0.15.x/roms/ipxe/src/include/coff.h | 73 +
qemu-0.15.x/roms/ipxe/src/include/compiler.h | 759 ++
qemu-0.15.x/roms/ipxe/src/include/cpu.h | 6 +
qemu-0.15.x/roms/ipxe/src/include/ctype.h | 32 +
qemu-0.15.x/roms/ipxe/src/include/curses.h | 755 ++
qemu-0.15.x/roms/ipxe/src/include/elf.h | 234 +
qemu-0.15.x/roms/ipxe/src/include/endian.h | 21 +
qemu-0.15.x/roms/ipxe/src/include/errno.h | 761 ++
qemu-0.15.x/roms/ipxe/src/include/etherboot.h | 44 +
qemu-0.15.x/roms/ipxe/src/include/fs.h | 41 +
qemu-0.15.x/roms/ipxe/src/include/getopt.h | 94 +
qemu-0.15.x/roms/ipxe/src/include/hci/ifmgmt_cmd.h | 37 +
qemu-0.15.x/roms/ipxe/src/include/hci/linux_args.h | 31 +
qemu-0.15.x/roms/ipxe/src/include/i82365.h | 452 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/acpi.h | 63 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/aes.h | 30 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ansiesc.h | 120 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/aoe.h | 131 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/api.h | 84 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/arc4.h | 22 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/arp.h | 44 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/asn1.h | 34 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ata.h | 204 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/base16.h | 38 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/base64.h | 41 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/bitbash.h | 52 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/bitmap.h | 85 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/bitops.h | 230 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/blockdev.h | 55 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/bofm.h | 351 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/cbc.h | 100 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/chap.h | 53 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/command.h | 28 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/console.h | 108 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/cpio.h | 53 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/crc32.h | 10 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/crypto.h | 156 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/device.h | 139 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/dhcp.h | 652 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/dhcpopts.h | 43 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/dhcppkt.h | 71 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/dns.h | 92 +
.../roms/ipxe/src/include/ipxe/downloader.h | 18 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/eapol.h | 113 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/edd.h | 193 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/editbox.h | 61 +
.../roms/ipxe/src/include/ipxe/editstring.h | 48 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/efi/Base.h | 965 ++
.../include/ipxe/efi/Guid/HiiFormMapMethodGuid.h | 27 +
.../ipxe/efi/Guid/HiiPlatformSetupFormset.h | 37 +
.../ipxe/src/include/ipxe/efi/Guid/MdeModuleHii.h | 222 +
.../roms/ipxe/src/include/ipxe/efi/Guid/PcAnsi.h | 60 +
.../roms/ipxe/src/include/ipxe/efi/Guid/SmBios.h | 34 +
.../src/include/ipxe/efi/Guid/WinCertificate.h | 130 +
.../ipxe/src/include/ipxe/efi/Ia32/ProcessorBind.h | 280 +
.../src/include/ipxe/efi/IndustryStandard/Pci22.h | 817 ++
.../include/ipxe/efi/IndustryStandard/PeImage.h | 757 ++
qemu-0.15.x/roms/ipxe/src/include/ipxe/efi/LICENCE | 40 +
.../roms/ipxe/src/include/ipxe/efi/Pi/PiBootMode.h | 43 +
.../ipxe/src/include/ipxe/efi/Pi/PiDependency.h | 49 +
.../roms/ipxe/src/include/ipxe/efi/Pi/PiDxeCis.h | 715 ++
.../ipxe/src/include/ipxe/efi/Pi/PiFirmwareFile.h | 482 +
.../src/include/ipxe/efi/Pi/PiFirmwareVolume.h | 233 +
.../roms/ipxe/src/include/ipxe/efi/Pi/PiHob.h | 451 +
.../ipxe/src/include/ipxe/efi/Pi/PiMultiPhase.h | 138 +
.../ipxe/src/include/ipxe/efi/Pi/PiS3BootScript.h | 61 +
.../ipxe/src/include/ipxe/efi/Pi/PiStatusCode.h | 1130 ++
qemu-0.15.x/roms/ipxe/src/include/ipxe/efi/PiDxe.h | 27 +
.../roms/ipxe/src/include/ipxe/efi/ProcessorBind.h | 19 +
.../src/include/ipxe/efi/Protocol/ComponentName2.h | 175 +
.../roms/ipxe/src/include/ipxe/efi/Protocol/Cpu.h | 300 +
.../ipxe/src/include/ipxe/efi/Protocol/CpuIo.h | 48 +
.../ipxe/src/include/ipxe/efi/Protocol/CpuIo2.h | 144 +
.../src/include/ipxe/efi/Protocol/DebugSupport.h | 685 ++
.../src/include/ipxe/efi/Protocol/DevicePath.h | 1074 ++
.../src/include/ipxe/efi/Protocol/DriverBinding.h | 203 +
.../src/include/ipxe/efi/Protocol/FormBrowser2.h | 177 +
.../include/ipxe/efi/Protocol/HiiConfigAccess.h | 221 +
.../src/include/ipxe/efi/Protocol/HiiDatabase.h | 519 +
.../src/include/ipxe/efi/Protocol/LoadedImage.h | 90 +
.../ipxe/efi/Protocol/NetworkInterfaceIdentifier.h | 93 +
.../ipxe/src/include/ipxe/efi/Protocol/PciIo.h | 560 +
.../include/ipxe/efi/Protocol/PciRootBridgeIo.h | 438 +
.../src/include/ipxe/efi/Protocol/SimpleNetwork.h | 664 +
.../src/include/ipxe/efi/Protocol/SimpleTextIn.h | 138 +
.../src/include/ipxe/efi/Protocol/SimpleTextOut.h | 406 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/efi/Uefi.h | 29 +
.../ipxe/src/include/ipxe/efi/Uefi/UefiBaseType.h | 287 +
.../roms/ipxe/src/include/ipxe/efi/Uefi/UefiGpt.h | 142 +
.../ipxe/efi/Uefi/UefiInternalFormRepresentation.h | 2068 ++++
.../src/include/ipxe/efi/Uefi/UefiMultiPhase.h | 171 +
.../roms/ipxe/src/include/ipxe/efi/Uefi/UefiPxe.h | 1772 +++
.../roms/ipxe/src/include/ipxe/efi/Uefi/UefiSpec.h | 2099 ++++
.../ipxe/src/include/ipxe/efi/X64/ProcessorBind.h | 290 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/efi/efi.h | 146 +
.../roms/ipxe/src/include/ipxe/efi/efi_driver.h | 49 +
.../roms/ipxe/src/include/ipxe/efi/efi_hii.h | 140 +
.../roms/ipxe/src/include/ipxe/efi/efi_io.h | 180 +
.../roms/ipxe/src/include/ipxe/efi/efi_pci.h | 46 +
.../roms/ipxe/src/include/ipxe/efi/efi_pci_api.h | 148 +
.../roms/ipxe/src/include/ipxe/efi/efi_smbios.h | 18 +
.../roms/ipxe/src/include/ipxe/efi/efi_strings.h | 23 +
.../roms/ipxe/src/include/ipxe/efi/efi_timer.h | 18 +
.../roms/ipxe/src/include/ipxe/efi/efi_uaccess.h | 90 +
.../roms/ipxe/src/include/ipxe/efi/efi_umalloc.h | 18 +
.../roms/ipxe/src/include/ipxe/efi/import.pl | 135 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/eisa.h | 128 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/elf.h | 17 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/errfile.h | 245 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/errortab.h | 28 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/eth_slow.h | 255 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ethernet.h | 87 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/fakedhcp.h | 23 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/fc.h | 471 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/fcels.h | 445 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/fcns.h | 217 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/fcoe.h | 92 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/fcp.h | 166 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/features.h | 105 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/fip.h | 450 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ftp.h | 15 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/gdbserial.h | 21 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/gdbstub.h | 77 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/gdbudp.h | 24 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/hidemem.h | 17 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/hmac.h | 32 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/http.h | 23 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/i2c.h | 171 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ib_cm.h | 72 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ib_cmrc.h | 20 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ib_mad.h | 591 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ib_mcast.h | 48 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ib_mi.h | 135 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ib_packet.h | 160 +
.../roms/ipxe/src/include/ipxe/ib_pathrec.h | 76 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ib_sma.h | 20 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ib_smc.h | 20 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ib_srp.h | 58 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ibft.h | 271 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/icmp.h | 25 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/icmp6.h | 59 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ieee80211.h | 1161 ++
qemu-0.15.x/roms/ipxe/src/include/ipxe/if_arp.h | 102 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/if_ether.h | 39 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/image.h | 184 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/in.h | 104 +
.../roms/ipxe/src/include/ipxe/infiniband.h | 705 ++
qemu-0.15.x/roms/ipxe/src/include/ipxe/init.h | 88 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/interface.h | 234 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/io.h | 532 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/iobuf.h | 229 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ip.h | 96 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ip6.h | 80 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ipoib.h | 58 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/isa.h | 95 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/isa_ids.h | 51 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/isapnp.h | 276 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/iscsi.h | 702 ++
qemu-0.15.x/roms/ipxe/src/include/ipxe/job.h | 38 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/keymap.h | 30 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/keys.h | 88 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/linebuf.h | 30 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/linux.h | 144 +
.../roms/ipxe/src/include/ipxe/linux/linux_nap.h | 18 +
.../ipxe/src/include/ipxe/linux/linux_smbios.h | 18 +
.../roms/ipxe/src/include/ipxe/linux/linux_timer.h | 18 +
.../ipxe/src/include/ipxe/linux/linux_uaccess.h | 104 +
.../ipxe/src/include/ipxe/linux/linux_umalloc.h | 18 +
.../roms/ipxe/src/include/ipxe/linux_compat.h | 27 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/list.h | 215 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/login_ui.h | 14 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/malloc.h | 81 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/mca.h | 106 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/md5.h | 24 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/monojob.h | 18 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/nap.h | 57 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/ndp.h | 21 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/net80211.h | 1207 ++
.../roms/ipxe/src/include/ipxe/net80211_err.h | 633 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/netdevice.h | 669 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/null_nap.h | 23 +
.../roms/ipxe/src/include/ipxe/null_sanboot.h | 18 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/nvo.h | 52 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/nvs.h | 68 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/nvsvpd.h | 33 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/open.h | 106 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/parseopt.h | 126 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/pci.h | 436 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/pci_ids.h | 351 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/pci_io.h | 124 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/pcibackup.h | 33 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/pcivpd.h | 181 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/posix_io.h | 87 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/process.h | 91 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/profile.h | 80 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/rarp.h | 16 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/rc80211.h | 19 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/refcnt.h | 114 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/resolv.h | 51 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/retry.h | 111 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/rotate.h | 29 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/rsa.h | 12 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/sanboot.h | 93 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/script.h | 16 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/scsi.h | 310 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/sec80211.h | 52 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/segment.h | 17 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/serial.h | 16 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/settings.h | 393 +
.../roms/ipxe/src/include/ipxe/settings_ui.h | 16 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/sha1.h | 24 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/shell.h | 36 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/smbios.h | 162 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/socket.h | 102 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/spi.h | 258 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/spi_bit.h | 63 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/srp.h | 833 ++
qemu-0.15.x/roms/ipxe/src/include/ipxe/syslog.h | 36 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/tables.h | 518 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/tcp.h | 342 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/tcpip.h | 128 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/tftp.h | 85 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/threewire.h | 105 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/timer.h | 77 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/tls.h | 187 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/uaccess.h | 345 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/udp.h | 45 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/umalloc.h | 69 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/uri.h | 192 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/uuid.h | 33 +
.../roms/ipxe/src/include/ipxe/virtio-pci.h | 101 +
.../roms/ipxe/src/include/ipxe/virtio-ring.h | 142 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/vlan.h | 69 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/vsprintf.h | 74 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/wpa.h | 503 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/x509.h | 41 +
qemu-0.15.x/roms/ipxe/src/include/ipxe/xfer.h | 107 +
qemu-0.15.x/roms/ipxe/src/include/libgen.h | 9 +
qemu-0.15.x/roms/ipxe/src/include/linux_api.h | 73 +
qemu-0.15.x/roms/ipxe/src/include/little_bswap.h | 35 +
qemu-0.15.x/roms/ipxe/src/include/mii.h | 219 +
qemu-0.15.x/roms/ipxe/src/include/nic.h | 271 +
qemu-0.15.x/roms/ipxe/src/include/old_tcp.h | 37 +
qemu-0.15.x/roms/ipxe/src/include/pc_kbd.h | 7 +
qemu-0.15.x/roms/ipxe/src/include/pcmcia-opts.h | 23 +
qemu-0.15.x/roms/ipxe/src/include/pcmcia.h | 156 +
.../roms/ipxe/src/include/readline/readline.h | 57 +
qemu-0.15.x/roms/ipxe/src/include/stdarg.h | 12 +
qemu-0.15.x/roms/ipxe/src/include/stddef.h | 30 +
qemu-0.15.x/roms/ipxe/src/include/stdint.h | 36 +
qemu-0.15.x/roms/ipxe/src/include/stdio.h | 47 +
qemu-0.15.x/roms/ipxe/src/include/stdlib.h | 115 +
qemu-0.15.x/roms/ipxe/src/include/string.h | 51 +
qemu-0.15.x/roms/ipxe/src/include/strings.h | 65 +
qemu-0.15.x/roms/ipxe/src/include/sys/time.h | 20 +
qemu-0.15.x/roms/ipxe/src/include/sys_info.h | 33 +
qemu-0.15.x/roms/ipxe/src/include/time.h | 22 +
qemu-0.15.x/roms/ipxe/src/include/unistd.h | 43 +
qemu-0.15.x/roms/ipxe/src/include/usr/autoboot.h | 25 +
qemu-0.15.x/roms/ipxe/src/include/usr/dhcpmgmt.h | 17 +
qemu-0.15.x/roms/ipxe/src/include/usr/fcmgmt.h | 21 +
qemu-0.15.x/roms/ipxe/src/include/usr/ifmgmt.h | 19 +
qemu-0.15.x/roms/ipxe/src/include/usr/imgmgmt.h | 56 +
qemu-0.15.x/roms/ipxe/src/include/usr/iwmgmt.h | 17 +
qemu-0.15.x/roms/ipxe/src/include/usr/lotest.h | 15 +
qemu-0.15.x/roms/ipxe/src/include/usr/prompt.h | 14 +
qemu-0.15.x/roms/ipxe/src/include/usr/route.h | 14 +
qemu-0.15.x/roms/ipxe/src/interface/bofm/bofm.c | 335 +
qemu-0.15.x/roms/ipxe/src/interface/efi/efi_bofm.c | 367 +
.../roms/ipxe/src/interface/efi/efi_console.c | 276 +
.../roms/ipxe/src/interface/efi/efi_driver.c | 140 +
qemu-0.15.x/roms/ipxe/src/interface/efi/efi_init.c | 162 +
qemu-0.15.x/roms/ipxe/src/interface/efi/efi_io.c | 217 +
qemu-0.15.x/roms/ipxe/src/interface/efi/efi_pci.c | 529 +
.../roms/ipxe/src/interface/efi/efi_smbios.c | 64 +
qemu-0.15.x/roms/ipxe/src/interface/efi/efi_snp.c | 1324 ++
.../roms/ipxe/src/interface/efi/efi_strerror.c | 45 +
.../roms/ipxe/src/interface/efi/efi_strings.c | 147 +
.../roms/ipxe/src/interface/efi/efi_timer.c | 118 +
.../roms/ipxe/src/interface/efi/efi_uaccess.c | 39 +
.../roms/ipxe/src/interface/efi/efi_umalloc.c | 98 +
.../roms/ipxe/src/interface/linux/linux_console.c | 146 +
.../roms/ipxe/src/interface/linux/linux_nap.c | 40 +
.../roms/ipxe/src/interface/linux/linux_smbios.c | 37 +
.../roms/ipxe/src/interface/linux/linux_timer.c | 80 +
.../roms/ipxe/src/interface/linux/linux_uaccess.c | 38 +
.../roms/ipxe/src/interface/linux/linux_umalloc.c | 154 +
.../roms/ipxe/src/interface/smbios/smbios.c | 180 +
.../ipxe/src/interface/smbios/smbios_settings.c | 210 +
qemu-0.15.x/roms/ipxe/src/libgcc/__divdi3.c | 26 +
qemu-0.15.x/roms/ipxe/src/libgcc/__moddi3.c | 26 +
qemu-0.15.x/roms/ipxe/src/libgcc/__udivdi3.c | 10 +
qemu-0.15.x/roms/ipxe/src/libgcc/__udivmoddi4.c | 32 +
qemu-0.15.x/roms/ipxe/src/libgcc/__umoddi3.c | 13 +
qemu-0.15.x/roms/ipxe/src/libgcc/icc.c | 8 +
qemu-0.15.x/roms/ipxe/src/libgcc/libgcc.h | 14 +
qemu-0.15.x/roms/ipxe/src/libgcc/memcpy.c | 18 +
qemu-0.15.x/roms/ipxe/src/net/80211/net80211.c | 2820 +++++
qemu-0.15.x/roms/ipxe/src/net/80211/rc80211.c | 371 +
qemu-0.15.x/roms/ipxe/src/net/80211/sec80211.c | 517 +
qemu-0.15.x/roms/ipxe/src/net/80211/wep.c | 303 +
qemu-0.15.x/roms/ipxe/src/net/80211/wpa.c | 911 ++
qemu-0.15.x/roms/ipxe/src/net/80211/wpa_ccmp.c | 528 +
qemu-0.15.x/roms/ipxe/src/net/80211/wpa_psk.c | 125 +
qemu-0.15.x/roms/ipxe/src/net/80211/wpa_tkip.c | 586 +
qemu-0.15.x/roms/ipxe/src/net/aoe.c | 1055 ++
qemu-0.15.x/roms/ipxe/src/net/arp.c | 290 +
qemu-0.15.x/roms/ipxe/src/net/cachedhcp.c | 77 +
qemu-0.15.x/roms/ipxe/src/net/dhcpopts.c | 462 +
qemu-0.15.x/roms/ipxe/src/net/dhcppkt.c | 303 +
qemu-0.15.x/roms/ipxe/src/net/eapol.c | 85 +
qemu-0.15.x/roms/ipxe/src/net/eth_slow.c | 270 +
qemu-0.15.x/roms/ipxe/src/net/ethernet.c | 196 +
qemu-0.15.x/roms/ipxe/src/net/fakedhcp.c | 217 +
qemu-0.15.x/roms/ipxe/src/net/fc.c | 1900 +++
qemu-0.15.x/roms/ipxe/src/net/fcels.c | 1338 ++
qemu-0.15.x/roms/ipxe/src/net/fcns.c | 240 +
qemu-0.15.x/roms/ipxe/src/net/fcoe.c | 1224 ++
qemu-0.15.x/roms/ipxe/src/net/fcp.c | 1070 ++
qemu-0.15.x/roms/ipxe/src/net/icmp.c | 103 +
qemu-0.15.x/roms/ipxe/src/net/icmpv6.c | 126 +
qemu-0.15.x/roms/ipxe/src/net/infiniband.c | 995 ++
qemu-0.15.x/roms/ipxe/src/net/infiniband/ib_cm.c | 495 +
qemu-0.15.x/roms/ipxe/src/net/infiniband/ib_cmrc.c | 434 +
.../roms/ipxe/src/net/infiniband/ib_mcast.c | 212 +
qemu-0.15.x/roms/ipxe/src/net/infiniband/ib_mi.c | 406 +
.../roms/ipxe/src/net/infiniband/ib_packet.c | 241 +
.../roms/ipxe/src/net/infiniband/ib_pathrec.c | 288 +
qemu-0.15.x/roms/ipxe/src/net/infiniband/ib_sma.c | 370 +
qemu-0.15.x/roms/ipxe/src/net/infiniband/ib_smc.c | 255 +
qemu-0.15.x/roms/ipxe/src/net/infiniband/ib_srp.c | 581 +
qemu-0.15.x/roms/ipxe/src/net/iobpad.c | 68 +
qemu-0.15.x/roms/ipxe/src/net/ipv4.c | 636 +
qemu-0.15.x/roms/ipxe/src/net/ipv6.c | 382 +
qemu-0.15.x/roms/ipxe/src/net/mii.c | 147 +
qemu-0.15.x/roms/ipxe/src/net/ndp.c | 180 +
qemu-0.15.x/roms/ipxe/src/net/netdev_settings.c | 140 +
qemu-0.15.x/roms/ipxe/src/net/netdevice.c | 758 ++
qemu-0.15.x/roms/ipxe/src/net/nullnet.c | 60 +
qemu-0.15.x/roms/ipxe/src/net/rarp.c | 72 +
qemu-0.15.x/roms/ipxe/src/net/retry.c | 204 +
qemu-0.15.x/roms/ipxe/src/net/tcp.c | 1353 +++
qemu-0.15.x/roms/ipxe/src/net/tcp/ftp.c | 491 +
qemu-0.15.x/roms/ipxe/src/net/tcp/http.c | 562 +
qemu-0.15.x/roms/ipxe/src/net/tcp/https.c | 51 +
qemu-0.15.x/roms/ipxe/src/net/tcp/iscsi.c | 2101 ++++
qemu-0.15.x/roms/ipxe/src/net/tcpip.c | 135 +
qemu-0.15.x/roms/ipxe/src/net/tls.c | 1754 +++
qemu-0.15.x/roms/ipxe/src/net/udp.c | 448 +
qemu-0.15.x/roms/ipxe/src/net/udp/dhcp.c | 1478 +++
qemu-0.15.x/roms/ipxe/src/net/udp/dns.c | 640 +
qemu-0.15.x/roms/ipxe/src/net/udp/slam.c | 756 ++
qemu-0.15.x/roms/ipxe/src/net/udp/syslog.c | 206 +
qemu-0.15.x/roms/ipxe/src/net/udp/tftp.c | 1267 ++
qemu-0.15.x/roms/ipxe/src/net/vlan.c | 490 +
qemu-0.15.x/roms/ipxe/src/tests/bofm_test.c | 169 +
.../roms/ipxe/src/tests/comboot/shuffle-simple.asm | 40 +
.../roms/ipxe/src/tests/comboot/version.asm | 136 +
qemu-0.15.x/roms/ipxe/src/tests/gdbstub_test.S | 54 +
qemu-0.15.x/roms/ipxe/src/tests/gdbstub_test.gdb | 116 +
qemu-0.15.x/roms/ipxe/src/tests/linebuf_test.c | 35 +
qemu-0.15.x/roms/ipxe/src/tests/memcpy_test.c | 39 +
qemu-0.15.x/roms/ipxe/src/tests/umalloc_test.c | 26 +
qemu-0.15.x/roms/ipxe/src/tests/uri_test.c | 146 +
qemu-0.15.x/roms/ipxe/src/usr/autoboot.c | 407 +
qemu-0.15.x/roms/ipxe/src/usr/dhcpmgmt.c | 80 +
qemu-0.15.x/roms/ipxe/src/usr/fcmgmt.c | 116 +
qemu-0.15.x/roms/ipxe/src/usr/ifmgmt.c | 148 +
qemu-0.15.x/roms/ipxe/src/usr/imgmgmt.c | 243 +
qemu-0.15.x/roms/ipxe/src/usr/iwmgmt.c | 226 +
qemu-0.15.x/roms/ipxe/src/usr/lotest.c | 217 +
qemu-0.15.x/roms/ipxe/src/usr/prompt.c | 66 +
qemu-0.15.x/roms/ipxe/src/usr/pxemenu.c | 383 +
qemu-0.15.x/roms/ipxe/src/usr/route.c | 45 +
qemu-0.15.x/roms/ipxe/src/util/.gitignore | 9 +
qemu-0.15.x/roms/ipxe/src/util/Makefile | 22 +
qemu-0.15.x/roms/ipxe/src/util/Option/ROM.pm | 502 +
qemu-0.15.x/roms/ipxe/src/util/catrom.pl | 48 +
qemu-0.15.x/roms/ipxe/src/util/diffsize.pl | 101 +
qemu-0.15.x/roms/ipxe/src/util/disrom.pl | 81 +
qemu-0.15.x/roms/ipxe/src/util/efirom.c | 280 +
qemu-0.15.x/roms/ipxe/src/util/einfo.c | 167 +
qemu-0.15.x/roms/ipxe/src/util/elf2efi.c | 809 ++
qemu-0.15.x/roms/ipxe/src/util/fixrom.pl | 34 +
qemu-0.15.x/roms/ipxe/src/util/fnrec.pl | 145 +
qemu-0.15.x/roms/ipxe/src/util/geniso | 72 +
qemu-0.15.x/roms/ipxe/src/util/genkeymap.pl | 235 +
qemu-0.15.x/roms/ipxe/src/util/genliso | 74 +
qemu-0.15.x/roms/ipxe/src/util/gensdsk | 65 +
qemu-0.15.x/roms/ipxe/src/util/get-pci-ids | 135 +
qemu-0.15.x/roms/ipxe/src/util/hijack.c | 628 +
qemu-0.15.x/roms/ipxe/src/util/iccfix.c | 156 +
qemu-0.15.x/roms/ipxe/src/util/licence.pl | 149 +
qemu-0.15.x/roms/ipxe/src/util/mergerom.pl | 98 +
qemu-0.15.x/roms/ipxe/src/util/modrom.pl | 226 +
qemu-0.15.x/roms/ipxe/src/util/mucurses_test.c | 63 +
qemu-0.15.x/roms/ipxe/src/util/nrv2b.c | 1501 +++
qemu-0.15.x/roms/ipxe/src/util/padimg.pl | 44 +
qemu-0.15.x/roms/ipxe/src/util/parserom.pl | 66 +
qemu-0.15.x/roms/ipxe/src/util/sortobjdump.pl | 40 +
qemu-0.15.x/roms/ipxe/src/util/swapdevids.pl | 49 +
qemu-0.15.x/roms/ipxe/src/util/symcheck.pl | 191 +
qemu-0.15.x/roms/ipxe/src/util/zbin.c | 434 +
qemu-0.15.x/roms/seabios/.gitignore | 4 +
qemu-0.15.x/roms/seabios/COPYING | 674 ++
qemu-0.15.x/roms/seabios/COPYING.LESSER | 165 +
qemu-0.15.x/roms/seabios/Makefile | 230 +
qemu-0.15.x/roms/seabios/README | 190 +
qemu-0.15.x/roms/seabios/TODO | 29 +
qemu-0.15.x/roms/seabios/src/Kconfig | 370 +
qemu-0.15.x/roms/seabios/src/acpi-dsdt.dsl | 926 ++
qemu-0.15.x/roms/seabios/src/acpi-dsdt.hex | 1212 ++
qemu-0.15.x/roms/seabios/src/acpi.c | 694 ++
qemu-0.15.x/roms/seabios/src/acpi.h | 101 +
qemu-0.15.x/roms/seabios/src/ahci.c | 484 +
qemu-0.15.x/roms/seabios/src/ahci.h | 196 +
qemu-0.15.x/roms/seabios/src/apm.c | 238 +
qemu-0.15.x/roms/seabios/src/asm-offsets.c | 31 +
qemu-0.15.x/roms/seabios/src/ata.c | 1044 ++
qemu-0.15.x/roms/seabios/src/ata.h | 153 +
qemu-0.15.x/roms/seabios/src/biosvar.h | 332 +
qemu-0.15.x/roms/seabios/src/block.c | 324 +
qemu-0.15.x/roms/seabios/src/blockcmd.c | 81 +
qemu-0.15.x/roms/seabios/src/blockcmd.h | 77 +
qemu-0.15.x/roms/seabios/src/boot.c | 648 +
qemu-0.15.x/roms/seabios/src/boot.h | 22 +
qemu-0.15.x/roms/seabios/src/bootsplash.c | 255 +
qemu-0.15.x/roms/seabios/src/bregs.h | 96 +
qemu-0.15.x/roms/seabios/src/cdrom.c | 379 +
qemu-0.15.x/roms/seabios/src/clock.c | 650 +
qemu-0.15.x/roms/seabios/src/cmos.h | 74 +
qemu-0.15.x/roms/seabios/src/config.h | 123 +
qemu-0.15.x/roms/seabios/src/coreboot.c | 617 +
qemu-0.15.x/roms/seabios/src/dev-i440fx.c | 116 +
qemu-0.15.x/roms/seabios/src/dev-i440fx.h | 14 +
qemu-0.15.x/roms/seabios/src/disk.c | 896 ++
qemu-0.15.x/roms/seabios/src/disk.h | 259 +
qemu-0.15.x/roms/seabios/src/entryfuncs.S | 173 +
qemu-0.15.x/roms/seabios/src/farptr.h | 204 +
qemu-0.15.x/roms/seabios/src/floppy.c | 622 +
qemu-0.15.x/roms/seabios/src/font.c | 139 +
qemu-0.15.x/roms/seabios/src/gen-defs.h | 19 +
qemu-0.15.x/roms/seabios/src/ioport.h | 136 +
qemu-0.15.x/roms/seabios/src/jpeg.c | 1041 ++
qemu-0.15.x/roms/seabios/src/jpeg.h | 11 +
qemu-0.15.x/roms/seabios/src/kbd.c | 573 +
qemu-0.15.x/roms/seabios/src/lzmadecode.c | 398 +
qemu-0.15.x/roms/seabios/src/lzmadecode.h | 67 +
qemu-0.15.x/roms/seabios/src/memmap.c | 127 +
qemu-0.15.x/roms/seabios/src/memmap.h | 32 +
qemu-0.15.x/roms/seabios/src/misc.c | 190 +
qemu-0.15.x/roms/seabios/src/mouse.c | 344 +
qemu-0.15.x/roms/seabios/src/mptable.c | 206 +
qemu-0.15.x/roms/seabios/src/mptable.h | 80 +
qemu-0.15.x/roms/seabios/src/mtrr.c | 102 +
qemu-0.15.x/roms/seabios/src/optionroms.c | 495 +
qemu-0.15.x/roms/seabios/src/output.c | 582 +
qemu-0.15.x/roms/seabios/src/paravirt.c | 411 +
qemu-0.15.x/roms/seabios/src/paravirt.h | 108 +
qemu-0.15.x/roms/seabios/src/pci.c | 304 +
qemu-0.15.x/roms/seabios/src/pci.h | 148 +
qemu-0.15.x/roms/seabios/src/pci_ids.h | 2610 ++++
qemu-0.15.x/roms/seabios/src/pci_region.c | 77 +
qemu-0.15.x/roms/seabios/src/pci_regs.h | 556 +
qemu-0.15.x/roms/seabios/src/pcibios.c | 234 +
qemu-0.15.x/roms/seabios/src/pciinit.c | 418 +
qemu-0.15.x/roms/seabios/src/pic.c | 52 +
qemu-0.15.x/roms/seabios/src/pic.h | 97 +
qemu-0.15.x/roms/seabios/src/pirtable.c | 105 +
qemu-0.15.x/roms/seabios/src/pmm.c | 588 +
qemu-0.15.x/roms/seabios/src/pnpbios.c | 103 +
qemu-0.15.x/roms/seabios/src/post.c | 389 +
qemu-0.15.x/roms/seabios/src/ps2port.c | 472 +
qemu-0.15.x/roms/seabios/src/ps2port.h | 63 +
qemu-0.15.x/roms/seabios/src/ramdisk.c | 105 +
qemu-0.15.x/roms/seabios/src/resume.c | 125 +
qemu-0.15.x/roms/seabios/src/romlayout.S | 589 +
qemu-0.15.x/roms/seabios/src/serial.c | 315 +
qemu-0.15.x/roms/seabios/src/shadow.c | 151 +
qemu-0.15.x/roms/seabios/src/smbios.c | 514 +
qemu-0.15.x/roms/seabios/src/smbios.h | 166 +
qemu-0.15.x/roms/seabios/src/smm.c | 127 +
qemu-0.15.x/roms/seabios/src/smp.c | 129 +
qemu-0.15.x/roms/seabios/src/ssdt-proc.dsl | 50 +
qemu-0.15.x/roms/seabios/src/stacks.c | 395 +
qemu-0.15.x/roms/seabios/src/system.c | 365 +
qemu-0.15.x/roms/seabios/src/types.h | 142 +
qemu-0.15.x/roms/seabios/src/usb-ehci.c | 761 ++
qemu-0.15.x/roms/seabios/src/usb-ehci.h | 173 +
qemu-0.15.x/roms/seabios/src/usb-hid.c | 418 +
qemu-0.15.x/roms/seabios/src/usb-hid.h | 31 +
qemu-0.15.x/roms/seabios/src/usb-hub.c | 185 +
qemu-0.15.x/roms/seabios/src/usb-hub.h | 60 +
qemu-0.15.x/roms/seabios/src/usb-msc.c | 260 +
qemu-0.15.x/roms/seabios/src/usb-msc.h | 27 +
qemu-0.15.x/roms/seabios/src/usb-ohci.c | 532 +
qemu-0.15.x/roms/seabios/src/usb-ohci.h | 143 +
qemu-0.15.x/roms/seabios/src/usb-uhci.c | 604 +
qemu-0.15.x/roms/seabios/src/usb-uhci.h | 128 +
qemu-0.15.x/roms/seabios/src/usb.c | 473 +
qemu-0.15.x/roms/seabios/src/usb.h | 216 +
qemu-0.15.x/roms/seabios/src/util.c | 324 +
qemu-0.15.x/roms/seabios/src/util.h | 500 +
qemu-0.15.x/roms/seabios/src/vgahooks.c | 316 +
qemu-0.15.x/roms/seabios/src/virtio-blk.c | 184 +
qemu-0.15.x/roms/seabios/src/virtio-blk.h | 43 +
qemu-0.15.x/roms/seabios/src/virtio-pci.c | 69 +
qemu-0.15.x/roms/seabios/src/virtio-pci.h | 104 +
qemu-0.15.x/roms/seabios/src/virtio-ring.c | 151 +
qemu-0.15.x/roms/seabios/src/virtio-ring.h | 131 +
qemu-0.15.x/roms/seabios/tools/buildrom.py | 43 +
qemu-0.15.x/roms/seabios/tools/checkrom.py | 63 +
qemu-0.15.x/roms/seabios/tools/checkstack.py | 225 +
qemu-0.15.x/roms/seabios/tools/checksum.py | 16 +
qemu-0.15.x/roms/seabios/tools/gen-offsets.sh | 17 +
qemu-0.15.x/roms/seabios/tools/kconfig/.gitignore | 23 +
qemu-0.15.x/roms/seabios/tools/kconfig/Makefile | 361 +
qemu-0.15.x/roms/seabios/tools/kconfig/POTFILES.in | 12 +
qemu-0.15.x/roms/seabios/tools/kconfig/check.sh | 14 +
qemu-0.15.x/roms/seabios/tools/kconfig/conf.c | 654 +
qemu-0.15.x/roms/seabios/tools/kconfig/confdata.c | 1062 ++
qemu-0.15.x/roms/seabios/tools/kconfig/expr.c | 1173 ++
qemu-0.15.x/roms/seabios/tools/kconfig/expr.h | 231 +
qemu-0.15.x/roms/seabios/tools/kconfig/gconf.c | 1577 +++
qemu-0.15.x/roms/seabios/tools/kconfig/gconf.glade | 661 +
qemu-0.15.x/roms/seabios/tools/kconfig/images.c | 326 +
.../roms/seabios/tools/kconfig/kconfig_load.c | 35 +
qemu-0.15.x/roms/seabios/tools/kconfig/kxgettext.c | 236 +
.../roms/seabios/tools/kconfig/lex.zconf.c_shipped | 2430 ++++
qemu-0.15.x/roms/seabios/tools/kconfig/lkc.h | 196 +
qemu-0.15.x/roms/seabios/tools/kconfig/lkc_proto.h | 53 +
.../roms/seabios/tools/kconfig/lxdialog/.gitignore | 4 +
.../seabios/tools/kconfig/lxdialog/BIG.FAT.WARNING | 4 +
.../tools/kconfig/lxdialog/check-lxdialog.sh | 84 +
.../seabios/tools/kconfig/lxdialog/checklist.c | 332 +
.../roms/seabios/tools/kconfig/lxdialog/dialog.h | 230 +
.../roms/seabios/tools/kconfig/lxdialog/inputbox.c | 238 +
.../roms/seabios/tools/kconfig/lxdialog/menubox.c | 434 +
.../roms/seabios/tools/kconfig/lxdialog/textbox.c | 391 +
.../roms/seabios/tools/kconfig/lxdialog/util.c | 657 +
.../roms/seabios/tools/kconfig/lxdialog/yesno.c | 114 +
qemu-0.15.x/roms/seabios/tools/kconfig/mconf.c | 862 ++
qemu-0.15.x/roms/seabios/tools/kconfig/menu.c | 609 +
qemu-0.15.x/roms/seabios/tools/kconfig/nconf.c | 1561 +++
qemu-0.15.x/roms/seabios/tools/kconfig/nconf.gui.c | 617 +
qemu-0.15.x/roms/seabios/tools/kconfig/nconf.h | 96 +
qemu-0.15.x/roms/seabios/tools/kconfig/qconf.cc | 1787 +++
qemu-0.15.x/roms/seabios/tools/kconfig/qconf.h | 337 +
qemu-0.15.x/roms/seabios/tools/kconfig/symbol.c | 1260 ++
qemu-0.15.x/roms/seabios/tools/kconfig/util.c | 138 +
qemu-0.15.x/roms/seabios/tools/kconfig/zconf.gperf | 47 +
.../seabios/tools/kconfig/zconf.hash.c_shipped | 245 +
qemu-0.15.x/roms/seabios/tools/kconfig/zconf.l | 360 +
.../roms/seabios/tools/kconfig/zconf.tab.c_shipped | 2505 ++++
qemu-0.15.x/roms/seabios/tools/kconfig/zconf.y | 749 ++
qemu-0.15.x/roms/seabios/tools/layoutrom.py | 579 +
qemu-0.15.x/roms/seabios/tools/readserial.py | 137 +
qemu-0.15.x/roms/seabios/tools/test-gcc.sh | 88 +
qemu-0.15.x/roms/seabios/tools/transdump.py | 50 +
qemu-0.15.x/roms/seabios/vgasrc/clext.c | 390 +
qemu-0.15.x/roms/seabios/vgasrc/vga.c | 1387 +++
qemu-0.15.x/roms/seabios/vgasrc/vgaentry.S | 48 +
qemu-0.15.x/roms/seabios/vgasrc/vgafb.c | 512 +
qemu-0.15.x/roms/seabios/vgasrc/vgafonts.c | 785 ++
qemu-0.15.x/roms/seabios/vgasrc/vgaio.c | 555 +
qemu-0.15.x/roms/seabios/vgasrc/vgalayout.lds.S | 24 +
qemu-0.15.x/roms/seabios/vgasrc/vgatables.c | 438 +
qemu-0.15.x/roms/seabios/vgasrc/vgatables.h | 217 +
qemu-0.15.x/roms/vgabios/.cvsignore | 1 +
qemu-0.15.x/roms/vgabios/BUGS | 3 +
qemu-0.15.x/roms/vgabios/COPYING | 504 +
qemu-0.15.x/roms/vgabios/ChangeLog | 1311 ++
qemu-0.15.x/roms/vgabios/Makefile | 103 +
qemu-0.15.x/roms/vgabios/Notes | 11 +
qemu-0.15.x/roms/vgabios/README | 226 +
qemu-0.15.x/roms/vgabios/TODO | 26 +
qemu-0.15.x/roms/vgabios/biossums.c | 282 +
qemu-0.15.x/roms/vgabios/clext.c | 1641 +++
qemu-0.15.x/roms/vgabios/dataseghack | 23 +
qemu-0.15.x/roms/vgabios/tests/lfbprof/Makefile | 5 +
qemu-0.15.x/roms/vgabios/tests/lfbprof/lfbprof.c | 594 +
qemu-0.15.x/roms/vgabios/tests/lfbprof/lfbprof.h | 149 +
qemu-0.15.x/roms/vgabios/tests/testbios.c | 353 +
qemu-0.15.x/roms/vgabios/vbe.c | 1456 +++
qemu-0.15.x/roms/vgabios/vbe.h | 315 +
qemu-0.15.x/roms/vgabios/vbe_display_api.txt | 237 +
qemu-0.15.x/roms/vgabios/vbetables-gen.c | 261 +
qemu-0.15.x/roms/vgabios/vgabios.c | 3923 ++++++
qemu-0.15.x/roms/vgabios/vgabios.h | 47 +
qemu-0.15.x/roms/vgabios/vgafonts.h | 784 ++
qemu-0.15.x/roms/vgabios/vgatables.h | 622 +
qemu-0.15.x/rules.mak | 72 +
qemu-0.15.x/rwhandler.c | 87 +
qemu-0.15.x/rwhandler.h | 27 +
qemu-0.15.x/s390-dis.c | 1796 +++
qemu-0.15.x/s390.ld | 201 +
qemu-0.15.x/savevm.c | 2179 ++++
qemu-0.15.x/scripts/checkpatch.pl | 2913 +++++
qemu-0.15.x/scripts/create_config | 103 +
qemu-0.15.x/scripts/feature_to_c.sh | 78 +
qemu-0.15.x/scripts/get_maintainer.pl | 2149 ++++
qemu-0.15.x/scripts/hxtool | 102 +
qemu-0.15.x/scripts/make_device_config.sh | 28 +
qemu-0.15.x/scripts/ordereddict.py | 127 +
qemu-0.15.x/scripts/qapi-commands.py | 385 +
qemu-0.15.x/scripts/qapi-types.py | 270 +
qemu-0.15.x/scripts/qapi-visit.py | 246 +
qemu-0.15.x/scripts/qapi.py | 203 +
qemu-0.15.x/scripts/qemu-binfmt-conf.sh | 68 +
qemu-0.15.x/scripts/refresh-pxe-roms.sh | 99 +
qemu-0.15.x/scripts/signrom.sh | 45 +
qemu-0.15.x/scripts/simpletrace.py | 151 +
qemu-0.15.x/scripts/texi2pod.pl | 477 +
qemu-0.15.x/scripts/tracetool | 637 +
qemu-0.15.x/scripts/update-linux-headers.sh | 55 +
qemu-0.15.x/sh4-dis.c | 2077 ++++
qemu-0.15.x/simpletrace.c | 355 +
qemu-0.15.x/simpletrace.h | 48 +
qemu-0.15.x/slirp/COPYRIGHT | 61 +
qemu-0.15.x/slirp/bootp.c | 314 +
qemu-0.15.x/slirp/bootp.h | 122 +
qemu-0.15.x/slirp/cksum.c | 139 +
qemu-0.15.x/slirp/debug.h | 34 +
qemu-0.15.x/slirp/if.c | 209 +
qemu-0.15.x/slirp/if.h | 25 +
qemu-0.15.x/slirp/ip.h | 253 +
qemu-0.15.x/slirp/ip_icmp.c | 438 +
qemu-0.15.x/slirp/ip_icmp.h | 164 +
qemu-0.15.x/slirp/ip_input.c | 662 +
qemu-0.15.x/slirp/ip_output.c | 172 +
qemu-0.15.x/slirp/libslirp.h | 56 +
qemu-0.15.x/slirp/main.h | 46 +
qemu-0.15.x/slirp/mbuf.c | 218 +
qemu-0.15.x/slirp/mbuf.h | 124 +
qemu-0.15.x/slirp/misc.c | 423 +
qemu-0.15.x/slirp/misc.h | 72 +
qemu-0.15.x/slirp/sbuf.c | 181 +
qemu-0.15.x/slirp/sbuf.h | 30 +
qemu-0.15.x/slirp/slirp.c | 1150 ++
qemu-0.15.x/slirp/slirp.h | 325 +
qemu-0.15.x/slirp/slirp_config.h | 188 +
qemu-0.15.x/slirp/socket.c | 728 ++
qemu-0.15.x/slirp/socket.h | 95 +
qemu-0.15.x/slirp/tcp.h | 164 +
qemu-0.15.x/slirp/tcp_input.c | 1487 +++
qemu-0.15.x/slirp/tcp_output.c | 492 +
qemu-0.15.x/slirp/tcp_subr.c | 915 ++
qemu-0.15.x/slirp/tcp_timer.c | 292 +
qemu-0.15.x/slirp/tcp_timer.h | 127 +
qemu-0.15.x/slirp/tcp_var.h | 161 +
qemu-0.15.x/slirp/tcpip.h | 77 +
qemu-0.15.x/slirp/tftp.c | 422 +
qemu-0.15.x/slirp/tftp.h | 43 +
qemu-0.15.x/slirp/udp.c | 387 +
qemu-0.15.x/slirp/udp.h | 86 +
qemu-0.15.x/softmmu-semi.h | 70 +
qemu-0.15.x/softmmu_defs.h | 22 +
qemu-0.15.x/softmmu_exec.h | 153 +
qemu-0.15.x/softmmu_header.h | 198 +
qemu-0.15.x/softmmu_template.h | 332 +
qemu-0.15.x/sparc-dis.c | 3275 +++++
qemu-0.15.x/sparc.ld | 150 +
qemu-0.15.x/sparc64.ld | 138 +
qemu-0.15.x/spice-qemu-char.c | 204 +
qemu-0.15.x/sysconfigs/target/target-x86_64.conf | 86 +
qemu-0.15.x/sysemu.h | 178 +
qemu-0.15.x/target-alpha/STATUS | 28 +
qemu-0.15.x/target-alpha/cpu.h | 516 +
qemu-0.15.x/target-alpha/exec.h | 39 +
qemu-0.15.x/target-alpha/helper.c | 486 +
qemu-0.15.x/target-alpha/helper.h | 118 +
qemu-0.15.x/target-alpha/machine.c | 87 +
qemu-0.15.x/target-alpha/op_helper.c | 1350 +++
qemu-0.15.x/target-alpha/translate.c | 3488 ++++++
qemu-0.15.x/target-arm/cpu.h | 535 +
qemu-0.15.x/target-arm/exec.h | 30 +
qemu-0.15.x/target-arm/helper.c | 3068 +++++
qemu-0.15.x/target-arm/helper.h | 472 +
qemu-0.15.x/target-arm/iwmmxt_helper.c | 681 ++
qemu-0.15.x/target-arm/machine.c | 225 +
qemu-0.15.x/target-arm/neon_helper.c | 2017 ++++
qemu-0.15.x/target-arm/op_addsub.h | 103 +
qemu-0.15.x/target-arm/op_helper.c | 426 +
qemu-0.15.x/target-arm/translate.c |10073 ++++++++++++++++
qemu-0.15.x/target-cris/cpu.h | 282 +
qemu-0.15.x/target-cris/crisv10-decode.h | 107 +
qemu-0.15.x/target-cris/crisv32-decode.h | 128 +
qemu-0.15.x/target-cris/exec.h | 28 +
qemu-0.15.x/target-cris/helper.c | 270 +
qemu-0.15.x/target-cris/helper.h | 26 +
qemu-0.15.x/target-cris/machine.c | 90 +
qemu-0.15.x/target-cris/mmu.c | 367 +
qemu-0.15.x/target-cris/mmu.h | 17 +
qemu-0.15.x/target-cris/op_helper.c | 655 +
qemu-0.15.x/target-cris/opcode-cris.h | 365 +
qemu-0.15.x/target-cris/translate.c | 3609 ++++++
qemu-0.15.x/target-cris/translate_v10.c | 1242 ++
qemu-0.15.x/target-i386/TODO | 32 +
qemu-0.15.x/target-i386/cpu.h | 1060 ++
qemu-0.15.x/target-i386/cpuid.c | 1308 ++
qemu-0.15.x/target-i386/exec.h | 142 +
qemu-0.15.x/target-i386/helper.c | 1292 ++
qemu-0.15.x/target-i386/helper.h | 220 +
qemu-0.15.x/target-i386/helper_template.h | 334 +
qemu-0.15.x/target-i386/kvm.c | 1837 +++
qemu-0.15.x/target-i386/machine.c | 437 +
qemu-0.15.x/target-i386/op_helper.c | 5719 +++++++++
qemu-0.15.x/target-i386/ops_sse.h | 2087 ++++
qemu-0.15.x/target-i386/ops_sse_header.h | 349 +
qemu-0.15.x/target-i386/svm.h | 222 +
qemu-0.15.x/target-i386/translate.c | 7913 ++++++++++++
qemu-0.15.x/target-lm32/README | 46 +
qemu-0.15.x/target-lm32/TODO | 3 +
qemu-0.15.x/target-lm32/cpu.h | 257 +
qemu-0.15.x/target-lm32/exec.h | 38 +
qemu-0.15.x/target-lm32/helper.c | 254 +
qemu-0.15.x/target-lm32/helper.h | 14 +
qemu-0.15.x/target-lm32/machine.c | 33 +
qemu-0.15.x/target-lm32/op_helper.c | 106 +
qemu-0.15.x/target-lm32/translate.c | 1239 ++
qemu-0.15.x/target-m68k/cpu.h | 270 +
qemu-0.15.x/target-m68k/exec.h | 28 +
qemu-0.15.x/target-m68k/helper.c | 923 ++
qemu-0.15.x/target-m68k/helpers.h | 54 +
qemu-0.15.x/target-m68k/m68k-qreg.h | 11 +
qemu-0.15.x/target-m68k/op_helper.c | 248 +
qemu-0.15.x/target-m68k/qregs.def | 13 +
qemu-0.15.x/target-m68k/translate.c | 3115 +++++
qemu-0.15.x/target-microblaze/cpu.h | 366 +
qemu-0.15.x/target-microblaze/exec.h | 27 +
qemu-0.15.x/target-microblaze/helper.c | 281 +
qemu-0.15.x/target-microblaze/helper.h | 39 +
qemu-0.15.x/target-microblaze/machine.c | 11 +
qemu-0.15.x/target-microblaze/microblaze-decode.h | 55 +
qemu-0.15.x/target-microblaze/mmu.c | 302 +
qemu-0.15.x/target-microblaze/mmu.h | 91 +
qemu-0.15.x/target-microblaze/op_helper.c | 520 +
qemu-0.15.x/target-microblaze/translate.c | 1945 +++
qemu-0.15.x/target-mips/TODO | 52 +
qemu-0.15.x/target-mips/cpu.h | 683 ++
qemu-0.15.x/target-mips/exec.h | 60 +
qemu-0.15.x/target-mips/helper.c | 693 ++
qemu-0.15.x/target-mips/helper.h | 290 +
qemu-0.15.x/target-mips/machine.c | 308 +
qemu-0.15.x/target-mips/mips-defs.h | 72 +
qemu-0.15.x/target-mips/op_helper.c | 3048 +++++
qemu-0.15.x/target-mips/translate.c |12744 ++++++++++++++++++++
qemu-0.15.x/target-mips/translate_init.c | 594 +
qemu-0.15.x/target-ppc/STATUS | 559 +
qemu-0.15.x/target-ppc/cpu.h | 2031 ++++
qemu-0.15.x/target-ppc/exec.h | 34 +
qemu-0.15.x/target-ppc/helper.c | 3107 +++++
qemu-0.15.x/target-ppc/helper.h | 411 +
qemu-0.15.x/target-ppc/helper_regs.h | 111 +
qemu-0.15.x/target-ppc/kvm.c | 555 +
qemu-0.15.x/target-ppc/kvm_ppc.c | 105 +
qemu-0.15.x/target-ppc/kvm_ppc.h | 53 +
qemu-0.15.x/target-ppc/machine.c | 181 +
qemu-0.15.x/target-ppc/mfrom_table.c | 79 +
qemu-0.15.x/target-ppc/mfrom_table_gen.c | 33 +
qemu-0.15.x/target-ppc/op_helper.c | 4409 +++++++
qemu-0.15.x/target-ppc/translate.c | 9539 +++++++++++++++
qemu-0.15.x/target-ppc/translate_init.c |10067 ++++++++++++++++
qemu-0.15.x/target-s390x/cpu.h | 976 ++
qemu-0.15.x/target-s390x/exec.h | 37 +
qemu-0.15.x/target-s390x/helper.c | 627 +
qemu-0.15.x/target-s390x/helpers.h | 151 +
qemu-0.15.x/target-s390x/kvm.c | 490 +
qemu-0.15.x/target-s390x/machine.c | 30 +
qemu-0.15.x/target-s390x/op_helper.c | 2991 +++++
qemu-0.15.x/target-s390x/translate.c | 5245 ++++++++
qemu-0.15.x/target-sh4/README.sh4 | 150 +
qemu-0.15.x/target-sh4/cpu.h | 377 +
qemu-0.15.x/target-sh4/exec.h | 33 +
qemu-0.15.x/target-sh4/helper.c | 842 ++
qemu-0.15.x/target-sh4/helper.h | 54 +
qemu-0.15.x/target-sh4/op_helper.c | 752 ++
qemu-0.15.x/target-sh4/translate.c | 2075 ++++
qemu-0.15.x/target-sparc/TODO | 88 +
qemu-0.15.x/target-sparc/cpu.h | 731 ++
qemu-0.15.x/target-sparc/exec.h | 15 +
qemu-0.15.x/target-sparc/helper.c | 1857 +++
qemu-0.15.x/target-sparc/helper.h | 165 +
qemu-0.15.x/target-sparc/machine.c | 225 +
qemu-0.15.x/target-sparc/op_helper.c | 4371 +++++++
qemu-0.15.x/target-sparc/translate.c | 5140 ++++++++
qemu-0.15.x/target-unicore32/cpu.h | 188 +
qemu-0.15.x/target-unicore32/exec.h | 43 +
qemu-0.15.x/target-unicore32/helper.c | 486 +
qemu-0.15.x/target-unicore32/helper.h | 70 +
qemu-0.15.x/target-unicore32/op_helper.c | 248 +
qemu-0.15.x/target-unicore32/translate.c | 2103 ++++
qemu-0.15.x/targphys.h | 21 +
qemu-0.15.x/tcg-runtime.c | 85 +
qemu-0.15.x/tcg/LICENSE | 3 +
qemu-0.15.x/tcg/README | 519 +
qemu-0.15.x/tcg/TODO | 14 +
qemu-0.15.x/tcg/arm/tcg-target.c | 1865 +++
qemu-0.15.x/tcg/arm/tcg-target.h | 93 +
qemu-0.15.x/tcg/hppa/tcg-target.c | 1710 +++
qemu-0.15.x/tcg/hppa/tcg-target.h | 120 +
qemu-0.15.x/tcg/i386/tcg-target.c | 1988 +++
qemu-0.15.x/tcg/i386/tcg-target.h | 126 +
qemu-0.15.x/tcg/ia64/tcg-target.c | 2393 ++++
qemu-0.15.x/tcg/ia64/tcg-target.h | 156 +
qemu-0.15.x/tcg/mips/tcg-target.c | 1533 +++
qemu-0.15.x/tcg/mips/tcg-target.h | 114 +
qemu-0.15.x/tcg/ppc/tcg-target.c | 1922 +++
qemu-0.15.x/tcg/ppc/tcg-target.h | 98 +
qemu-0.15.x/tcg/ppc64/tcg-target.c | 1699 +++
qemu-0.15.x/tcg/ppc64/tcg-target.h | 109 +
qemu-0.15.x/tcg/s390/tcg-target.c | 2327 ++++
qemu-0.15.x/tcg/s390/tcg-target.h | 109 +
qemu-0.15.x/tcg/sparc/tcg-target.c | 1572 +++
qemu-0.15.x/tcg/sparc/tcg-target.h | 150 +
qemu-0.15.x/tcg/tcg-op.h | 2539 ++++
qemu-0.15.x/tcg/tcg-opc.h | 310 +
qemu-0.15.x/tcg/tcg-runtime.h | 18 +
qemu-0.15.x/tcg/tcg.c | 2224 ++++
qemu-0.15.x/tcg/tcg.h | 523 +
qemu-0.15.x/test-qmp-commands.c | 113 +
qemu-0.15.x/test-visitor.c | 306 +
qemu-0.15.x/tests/Makefile | 151 +
qemu-0.15.x/tests/alpha/Makefile | 35 +
qemu-0.15.x/tests/alpha/crt.s | 26 +
qemu-0.15.x/tests/alpha/hello-alpha.c | 5 +
qemu-0.15.x/tests/alpha/test-cond.c | 87 +
qemu-0.15.x/tests/alpha/test-ovf.c | 29 +
qemu-0.15.x/tests/cris/Makefile | 155 +
qemu-0.15.x/tests/cris/README | 1 +
qemu-0.15.x/tests/cris/check_abs.c | 40 +
qemu-0.15.x/tests/cris/check_addc.c | 58 +
qemu-0.15.x/tests/cris/check_addcm.c | 85 +
qemu-0.15.x/tests/cris/check_addi.s | 57 +
qemu-0.15.x/tests/cris/check_addiv32.s | 62 +
qemu-0.15.x/tests/cris/check_addm.s | 96 +
qemu-0.15.x/tests/cris/check_addo.c | 125 +
qemu-0.15.x/tests/cris/check_addoq.c | 44 +
qemu-0.15.x/tests/cris/check_addq.s | 47 +
qemu-0.15.x/tests/cris/check_addr.s | 96 +
qemu-0.15.x/tests/cris/check_addxc.s | 91 +
qemu-0.15.x/tests/cris/check_addxm.s | 106 +
qemu-0.15.x/tests/cris/check_addxr.s | 96 +
qemu-0.15.x/tests/cris/check_andc.s | 80 +
qemu-0.15.x/tests/cris/check_andm.s | 90 +
qemu-0.15.x/tests/cris/check_andq.s | 46 +
qemu-0.15.x/tests/cris/check_andr.s | 95 +
qemu-0.15.x/tests/cris/check_asr.s | 230 +
qemu-0.15.x/tests/cris/check_ba.s | 93 +
qemu-0.15.x/tests/cris/check_bas.s | 102 +
qemu-0.15.x/tests/cris/check_bcc.s | 197 +
qemu-0.15.x/tests/cris/check_bound.c | 142 +
qemu-0.15.x/tests/cris/check_boundc.s | 101 +
qemu-0.15.x/tests/cris/check_boundr.s | 125 +
qemu-0.15.x/tests/cris/check_btst.s | 96 +
qemu-0.15.x/tests/cris/check_clearfv32.s | 19 +
qemu-0.15.x/tests/cris/check_clrjmp1.s | 36 +
qemu-0.15.x/tests/cris/check_cmp-2.s | 15 +
qemu-0.15.x/tests/cris/check_cmpc.s | 86 +
qemu-0.15.x/tests/cris/check_cmpm.s | 96 +
qemu-0.15.x/tests/cris/check_cmpq.s | 75 +
qemu-0.15.x/tests/cris/check_cmpr.s | 102 +
qemu-0.15.x/tests/cris/check_cmpxc.s | 92 +
qemu-0.15.x/tests/cris/check_cmpxm.s | 106 +
qemu-0.15.x/tests/cris/check_dstep.s | 42 +
qemu-0.15.x/tests/cris/check_ftag.c | 37 +
.../tests/cris/check_gcctorture_pr28634-1.c | 15 +
qemu-0.15.x/tests/cris/check_gcctorture_pr28634.c | 15 +
qemu-0.15.x/tests/cris/check_glibc_kernelversion.c | 116 +
qemu-0.15.x/tests/cris/check_hello.c | 7 +
qemu-0.15.x/tests/cris/check_int64.c | 47 +
qemu-0.15.x/tests/cris/check_jsr.s | 85 +
qemu-0.15.x/tests/cris/check_lapc.s | 78 +
qemu-0.15.x/tests/cris/check_lsl.s | 217 +
qemu-0.15.x/tests/cris/check_lsr.s | 218 +
qemu-0.15.x/tests/cris/check_lz.c | 49 +
qemu-0.15.x/tests/cris/check_mapbrk.c | 39 +
qemu-0.15.x/tests/cris/check_mcp.s | 49 +
qemu-0.15.x/tests/cris/check_mmap1.c | 48 +
qemu-0.15.x/tests/cris/check_mmap2.c | 48 +
qemu-0.15.x/tests/cris/check_mmap3.c | 33 +
qemu-0.15.x/tests/cris/check_movdelsr1.s | 33 +
qemu-0.15.x/tests/cris/check_movecr.s | 37 +
qemu-0.15.x/tests/cris/check_movei.s | 50 +
qemu-0.15.x/tests/cris/check_movemr.s | 78 +
qemu-0.15.x/tests/cris/check_movemrv32.s | 96 +
qemu-0.15.x/tests/cris/check_moveq.c | 51 +
qemu-0.15.x/tests/cris/check_mover.s | 28 +
qemu-0.15.x/tests/cris/check_moverm.s | 45 +
qemu-0.15.x/tests/cris/check_movmp.s | 131 +
qemu-0.15.x/tests/cris/check_movpmv32.s | 35 +
qemu-0.15.x/tests/cris/check_movpr.s | 28 +
qemu-0.15.x/tests/cris/check_movprv32.s | 21 +
qemu-0.15.x/tests/cris/check_movscr.s | 29 +
qemu-0.15.x/tests/cris/check_movsm.s | 44 +
qemu-0.15.x/tests/cris/check_movsr.s | 46 +
qemu-0.15.x/tests/cris/check_movucr.s | 33 +
qemu-0.15.x/tests/cris/check_movum.s | 40 +
qemu-0.15.x/tests/cris/check_movur.s | 45 +
qemu-0.15.x/tests/cris/check_mulv32.s | 51 +
qemu-0.15.x/tests/cris/check_mulx.s | 246 +
qemu-0.15.x/tests/cris/check_neg.s | 104 +
qemu-0.15.x/tests/cris/check_not.s | 31 +
qemu-0.15.x/tests/cris/check_openpf1.c | 38 +
qemu-0.15.x/tests/cris/check_openpf2.c | 16 +
qemu-0.15.x/tests/cris/check_openpf3.c | 49 +
qemu-0.15.x/tests/cris/check_openpf4.c | 5 +
qemu-0.15.x/tests/cris/check_openpf5.c | 56 +
qemu-0.15.x/tests/cris/check_orc.s | 71 +
qemu-0.15.x/tests/cris/check_orm.s | 75 +
qemu-0.15.x/tests/cris/check_orq.s | 41 +
qemu-0.15.x/tests/cris/check_orr.s | 84 +
qemu-0.15.x/tests/cris/check_ret.s | 25 +
qemu-0.15.x/tests/cris/check_scc.s | 95 +
qemu-0.15.x/tests/cris/check_settls1.c | 45 +
qemu-0.15.x/tests/cris/check_sigalrm.c | 26 +
qemu-0.15.x/tests/cris/check_stat1.c | 16 +
qemu-0.15.x/tests/cris/check_stat2.c | 20 +
qemu-0.15.x/tests/cris/check_stat3.c | 25 +
qemu-0.15.x/tests/cris/check_stat4.c | 27 +
qemu-0.15.x/tests/cris/check_subc.s | 87 +
qemu-0.15.x/tests/cris/check_subm.s | 96 +
qemu-0.15.x/tests/cris/check_subq.s | 52 +
qemu-0.15.x/tests/cris/check_subr.s | 102 +
qemu-0.15.x/tests/cris/check_swap.c | 76 +
qemu-0.15.x/tests/cris/check_time1.c | 46 +
qemu-0.15.x/tests/cris/check_time2.c | 18 +
qemu-0.15.x/tests/cris/check_xarith.s | 72 +
qemu-0.15.x/tests/cris/crisutils.h | 71 +
qemu-0.15.x/tests/cris/crt.s | 13 +
qemu-0.15.x/tests/cris/sys.c | 51 +
qemu-0.15.x/tests/cris/sys.h | 16 +
qemu-0.15.x/tests/cris/testutils.inc | 117 +
qemu-0.15.x/tests/hello-arm.c | 113 +
qemu-0.15.x/tests/hello-i386.c | 26 +
qemu-0.15.x/tests/hello-mips.c | 64 +
qemu-0.15.x/tests/linux-test.c | 537 +
qemu-0.15.x/tests/lm32/Makefile | 102 +
qemu-0.15.x/tests/lm32/crt.S | 84 +
qemu-0.15.x/tests/lm32/linker.ld | 55 +
qemu-0.15.x/tests/lm32/macros.inc | 79 +
qemu-0.15.x/tests/lm32/test_add.S | 75 +
qemu-0.15.x/tests/lm32/test_addi.S | 56 +
qemu-0.15.x/tests/lm32/test_and.S | 45 +
qemu-0.15.x/tests/lm32/test_andhi.S | 35 +
qemu-0.15.x/tests/lm32/test_andi.S | 35 +
qemu-0.15.x/tests/lm32/test_b.S | 13 +
qemu-0.15.x/tests/lm32/test_be.S | 48 +
qemu-0.15.x/tests/lm32/test_bg.S | 78 +
qemu-0.15.x/tests/lm32/test_bge.S | 78 +
qemu-0.15.x/tests/lm32/test_bgeu.S | 78 +
qemu-0.15.x/tests/lm32/test_bgu.S | 78 +
qemu-0.15.x/tests/lm32/test_bi.S | 23 +
qemu-0.15.x/tests/lm32/test_bne.S | 48 +
qemu-0.15.x/tests/lm32/test_break.S | 20 +
qemu-0.15.x/tests/lm32/test_bret.S | 38 +
qemu-0.15.x/tests/lm32/test_call.S | 16 +
qemu-0.15.x/tests/lm32/test_calli.S | 15 +
qemu-0.15.x/tests/lm32/test_cmpe.S | 40 +
qemu-0.15.x/tests/lm32/test_cmpei.S | 35 +
qemu-0.15.x/tests/lm32/test_cmpg.S | 64 +
qemu-0.15.x/tests/lm32/test_cmpge.S | 64 +
qemu-0.15.x/tests/lm32/test_cmpgei.S | 55 +
qemu-0.15.x/tests/lm32/test_cmpgeu.S | 64 +
qemu-0.15.x/tests/lm32/test_cmpgeui.S | 55 +
qemu-0.15.x/tests/lm32/test_cmpgi.S | 55 +
qemu-0.15.x/tests/lm32/test_cmpgu.S | 64 +
qemu-0.15.x/tests/lm32/test_cmpgui.S | 55 +
qemu-0.15.x/tests/lm32/test_cmpne.S | 40 +
qemu-0.15.x/tests/lm32/test_cmpnei.S | 35 +
qemu-0.15.x/tests/lm32/test_divu.S | 29 +
qemu-0.15.x/tests/lm32/test_eret.S | 38 +
qemu-0.15.x/tests/lm32/test_lb.S | 45 +
qemu-0.15.x/tests/lm32/test_lbu.S | 45 +
qemu-0.15.x/tests/lm32/test_lh.S | 45 +
qemu-0.15.x/tests/lm32/test_lhu.S | 45 +
qemu-0.15.x/tests/lm32/test_lw.S | 30 +
qemu-0.15.x/tests/lm32/test_modu.S | 35 +
qemu-0.15.x/tests/lm32/test_mul.S | 70 +
qemu-0.15.x/tests/lm32/test_muli.S | 45 +
qemu-0.15.x/tests/lm32/test_nor.S | 51 +
qemu-0.15.x/tests/lm32/test_nori.S | 35 +
qemu-0.15.x/tests/lm32/test_or.S | 51 +
qemu-0.15.x/tests/lm32/test_orhi.S | 35 +
qemu-0.15.x/tests/lm32/test_ori.S | 35 +
qemu-0.15.x/tests/lm32/test_ret.S | 14 +
qemu-0.15.x/tests/lm32/test_sb.S | 30 +
qemu-0.15.x/tests/lm32/test_scall.S | 20 +
qemu-0.15.x/tests/lm32/test_sextb.S | 20 +
qemu-0.15.x/tests/lm32/test_sexth.S | 20 +
qemu-0.15.x/tests/lm32/test_sh.S | 30 +
qemu-0.15.x/tests/lm32/test_sl.S | 45 +
qemu-0.15.x/tests/lm32/test_sli.S | 30 +
qemu-0.15.x/tests/lm32/test_sr.S | 57 +
qemu-0.15.x/tests/lm32/test_sri.S | 40 +
qemu-0.15.x/tests/lm32/test_sru.S | 57 +
qemu-0.15.x/tests/lm32/test_srui.S | 40 +
qemu-0.15.x/tests/lm32/test_sub.S | 75 +
qemu-0.15.x/tests/lm32/test_sw.S | 35 +
qemu-0.15.x/tests/lm32/test_xnor.S | 51 +
qemu-0.15.x/tests/lm32/test_xnori.S | 35 +
qemu-0.15.x/tests/lm32/test_xor.S | 51 +
qemu-0.15.x/tests/lm32/test_xori.S | 35 +
qemu-0.15.x/tests/pi_10.com | Bin 0 -> 54 bytes
qemu-0.15.x/tests/qruncom.c | 284 +
qemu-0.15.x/tests/runcom.c | 192 +
qemu-0.15.x/tests/sha1.c | 240 +
qemu-0.15.x/tests/test-arm-iwmmxt.s | 49 +
qemu-0.15.x/tests/test-i386-code16.S | 79 +
qemu-0.15.x/tests/test-i386-muldiv.h | 76 +
qemu-0.15.x/tests/test-i386-shift.h | 185 +
qemu-0.15.x/tests/test-i386-ssse3.c | 57 +
qemu-0.15.x/tests/test-i386-vm86.S | 103 +
qemu-0.15.x/tests/test-i386.c | 2764 +++++
qemu-0.15.x/tests/test-i386.h | 152 +
qemu-0.15.x/tests/test-mmap.c | 476 +
qemu-0.15.x/tests/test_path.c | 160 +
qemu-0.15.x/tests/testthread.c | 51 +
qemu-0.15.x/thunk.c | 288 +
qemu-0.15.x/thunk.h | 161 +
qemu-0.15.x/trace-events | 427 +
qemu-0.15.x/translate-all.c | 163 +
qemu-0.15.x/uboot_image.h | 158 +
qemu-0.15.x/ui/cocoa.m | 1025 ++
qemu-0.15.x/ui/curses.c | 367 +
qemu-0.15.x/ui/curses_keys.h | 509 +
qemu-0.15.x/ui/d3des.c | 424 +
qemu-0.15.x/ui/d3des.h | 51 +
qemu-0.15.x/ui/keymaps.c | 210 +
qemu-0.15.x/ui/keymaps.h | 77 +
qemu-0.15.x/ui/qemu-spice.h | 65 +
qemu-0.15.x/ui/sdl.c | 904 ++
qemu-0.15.x/ui/sdl_keysym.h | 277 +
qemu-0.15.x/ui/sdl_zoom.c | 95 +
qemu-0.15.x/ui/sdl_zoom.h | 25 +
qemu-0.15.x/ui/sdl_zoom_template.h | 225 +
qemu-0.15.x/ui/spice-core.c | 694 ++
qemu-0.15.x/ui/spice-display.c | 434 +
qemu-0.15.x/ui/spice-display.h | 82 +
qemu-0.15.x/ui/spice-input.c | 217 +
qemu-0.15.x/ui/vnc-auth-sasl.c | 632 +
qemu-0.15.x/ui/vnc-auth-sasl.h | 74 +
qemu-0.15.x/ui/vnc-auth-vencrypt.c | 175 +
qemu-0.15.x/ui/vnc-auth-vencrypt.h | 33 +
qemu-0.15.x/ui/vnc-enc-hextile-template.h | 211 +
qemu-0.15.x/ui/vnc-enc-hextile.c | 116 +
qemu-0.15.x/ui/vnc-enc-tight.c | 1777 +++
qemu-0.15.x/ui/vnc-enc-tight.h | 183 +
qemu-0.15.x/ui/vnc-enc-zlib.c | 152 +
qemu-0.15.x/ui/vnc-enc-zrle-template.c | 263 +
qemu-0.15.x/ui/vnc-enc-zrle.c | 366 +
qemu-0.15.x/ui/vnc-enc-zrle.h | 40 +
qemu-0.15.x/ui/vnc-enc-zywrle-template.c | 170 +
qemu-0.15.x/ui/vnc-enc-zywrle.h | 659 +
qemu-0.15.x/ui/vnc-jobs-async.c | 341 +
qemu-0.15.x/ui/vnc-jobs-sync.c | 73 +
qemu-0.15.x/ui/vnc-jobs.h | 87 +
qemu-0.15.x/ui/vnc-palette.c | 158 +
qemu-0.15.x/ui/vnc-palette.h | 68 +
qemu-0.15.x/ui/vnc-tls.c | 445 +
qemu-0.15.x/ui/vnc-tls.h | 76 +
qemu-0.15.x/ui/vnc.c | 2933 +++++
qemu-0.15.x/ui/vnc.h | 556 +
qemu-0.15.x/ui/vnc_keysym.h | 342 +
qemu-0.15.x/ui/x_keymap.c | 168 +
qemu-0.15.x/ui/x_keymap.h | 32 +
qemu-0.15.x/usb-bsd.c | 645 +
qemu-0.15.x/usb-linux.c | 1961 +++
qemu-0.15.x/usb-redir.c | 1218 ++
qemu-0.15.x/usb-stub.c | 52 +
qemu-0.15.x/user-exec.c | 674 ++
qemu-0.15.x/version.rc | 28 +
qemu-0.15.x/vgafont.h | 4611 +++++++
qemu-0.15.x/vl.c | 3341 +++++
qemu-0.15.x/x86_64.ld | 180 +
qemu-0.15.x/xen-all.c | 955 ++
qemu-0.15.x/xen-mapcache.c | 369 +
qemu-0.15.x/xen-mapcache.h | 51 +
qemu-0.15.x/xen-stub.c | 45 +
3441 files changed, 1264154 insertions(+), 0 deletions(-)
diff --git a/qemu-0.15.x/.gitignore b/qemu-0.15.x/.gitignore
new file mode 100644
index 0000000..54835bc
--- /dev/null
+++ b/qemu-0.15.x/.gitignore
@@ -0,0 +1,72 @@
+config-devices.*
+config-all-devices.*
+config-host.*
+config-target.*
+trace.h
+trace.c
+trace-dtrace.h
+trace-dtrace.dtrace
+*-timestamp
+*-softmmu
+*-darwin-user
+*-linux-user
+*-bsd-user
+libdis*
+libhw32
+libhw64
+libuser
+qapi-generated
+qemu-doc.html
+qemu-tech.html
+qemu-doc.info
+qemu-tech.info
+qemu.1
+qemu.pod
+qemu-img.1
+qemu-img.pod
+qemu-img
+qemu-nbd
+qemu-nbd.8
+qemu-nbd.pod
+qemu-options.def
+qemu-options.texi
+qemu-img-cmds.texi
+qemu-img-cmds.h
+qemu-io
+qemu-ga
+qemu-monitor.texi
+QMP/qmp-commands.txt
+.gdbinit
+*.a
+*.aux
+*.cp
+*.dvi
+*.exe
+*.fn
+*.ky
+*.log
+*.pdf
+*.cps
+*.fns
+*.kys
+*.pg
+*.pyc
+*.toc
+*.tp
+*.vr
+*.d
+*.o
+*.swp
+*.orig
+.pc
+patches
+pc-bios/bios-pq/status
+pc-bios/vgabios-pq/status
+pc-bios/optionrom/linuxboot.bin
+pc-bios/optionrom/multiboot.bin
+pc-bios/optionrom/multiboot.raw
+.stgit-*
+cscope.*
+tags
+TAGS
+*~
diff --git a/qemu-0.15.x/.gitmodules b/qemu-0.15.x/.gitmodules
new file mode 100644
index 0000000..7884471
--- /dev/null
+++ b/qemu-0.15.x/.gitmodules
@@ -0,0 +1,12 @@
+[submodule "roms/vgabios"]
+ path = roms/vgabios
+ url = git://git.qemu.org/vgabios.git/
+[submodule "roms/seabios"]
+ path = roms/seabios
+ url = git://git.qemu.org/seabios.git/
+[submodule "roms/SLOF"]
+ path = roms/SLOF
+ url = git://git.qemu.org/SLOF.git
+[submodule "roms/ipxe"]
+ path = roms/ipxe
+ url = git://git.qemu.org/ipxe.git
diff --git a/qemu-0.15.x/CODING_STYLE b/qemu-0.15.x/CODING_STYLE
new file mode 100644
index 0000000..5ecfa22
--- /dev/null
+++ b/qemu-0.15.x/CODING_STYLE
@@ -0,0 +1,81 @@
+Qemu Coding Style
+=================
+
+Please use the script checkpatch.pl in the scripts directory to check
+patches before submitting.
+
+1. Whitespace
+
+Of course, the most important aspect in any coding style is whitespace.
+Crusty old coders who have trouble spotting the glasses on their noses
+can tell the difference between a tab and eight spaces from a distance
+of approximately fifteen parsecs. Many a flamewar have been fought and
+lost on this issue.
+
+QEMU indents are four spaces. Tabs are never used, except in Makefiles
+where they have been irreversibly coded into the syntax.
+Spaces of course are superior to tabs because:
+
+ - You have just one way to specify whitespace, not two. Ambiguity breeds
+ mistakes.
+ - The confusion surrounding 'use tabs to indent, spaces to justify' is gone.
+ - Tab indents push your code to the right, making your screen seriously
+ unbalanced.
+ - Tabs will be rendered incorrectly on editors who are misconfigured not
+ to use tab stops of eight positions.
+ - Tabs are rendered badly in patches, causing off-by-one errors in almost
+ every line.
+ - It is the QEMU coding style.
+
+Do not leave whitespace dangling off the ends of lines.
+
+2. Line width
+
+Lines are 80 characters; not longer.
+
+Rationale:
+ - Some people like to tile their 24" screens with a 6x4 matrix of 80x24
+ xterms and use vi in all of them. The best way to punish them is to
+ let them keep doing it.
+ - Code and especially patches is much more readable if limited to a sane
+ line length. Eighty is traditional.
+ - It is the QEMU coding style.
+
+3. Naming
+
+Variables are lower_case_with_underscores; easy to type and read. Structured
+type names are in CamelCase; harder to type but standing out. Scalar type
+names are lower_case_with_underscores_ending_with_a_t, like the POSIX
+uint64_t and family. Note that this last convention contradicts POSIX
+and is therefore likely to be changed.
+
+When wrapping standard library functions, use the prefix qemu_ to alert
+readers that they are seeing a wrapped version; otherwise avoid this prefix.
+
+4. Block structure
+
+Every indented statement is braced; even if the block contains just one
+statement. The opening brace is on the line that contains the control
+flow statement that introduces the new block; the closing brace is on the
+same line as the else keyword, or on a line by itself if there is no else
+keyword. Example:
+
+ if (a == 5) {
+ printf("a was 5.\n");
+ } else if (a == 6) {
+ printf("a was 6.\n");
+ } else {
+ printf("a was something else entirely.\n");
+ }
+
+An exception is the opening brace for a function; for reasons of tradition
+and clarity it comes on a line by itself:
+
+ void a_function(void)
+ {
+ do_something();
+ }
+
+Rationale: a consistent (except for functions...) bracing style reduces
+ambiguity and avoids needless churn when lines are added or removed.
+Furthermore, it is the QEMU coding style.
diff --git a/qemu-0.15.x/COPYING b/qemu-0.15.x/COPYING
new file mode 100644
index 0000000..00ccfbb
--- /dev/null
+++ b/qemu-0.15.x/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+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.
+
+ <signature of Ty Coon>, 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 Lesser General
+Public License instead of this License.
diff --git a/qemu-0.15.x/COPYING.LIB b/qemu-0.15.x/COPYING.LIB
new file mode 100644
index 0000000..48afc2e
--- /dev/null
+++ b/qemu-0.15.x/COPYING.LIB
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, 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 library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+ 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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+ If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be 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.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+ 9. 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 Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+ 11. 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 Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. 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.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/qemu-0.15.x/Changelog b/qemu-0.15.x/Changelog
new file mode 100644
index 0000000..28a69af
--- /dev/null
+++ b/qemu-0.15.x/Changelog
@@ -0,0 +1,580 @@
+This file documents changes for QEMU releases 0.12 and earlier.
+For changelog information for later releases, see
+http://wiki.qemu.org/ChangeLog or look at the git history for
+more detailed information.
+
+
+version 0.12.0:
+
+ - Update to SeaBIOS 0.5.0
+ - e1000: fix device link status in Linux (Anthony Liguori)
+ - monitor: fix QMP for balloon command (Luiz Capitulino)
+ - QMP: Return an empty dict by default (Luiz Capitulino)
+ - QMP: Only handle converted commands (Luiz Capitulino)
+ - pci: support PCI based option rom loading (Gerd Hoffman/Anthony Liguori)
+ - Fix backcompat for hotplug of SCSI controllers (Daniel P. Berrange)
+ - fdc: fix migration from 0.11 (Juan Quintela)
+ - vmware-vga: fix segv on cursor resize. (Dave Airlie)
+ - vmware-vga: various fixes (Dave Airlie/Anthony Liguori)
+ - qdev: improve property error reporting. (Gerd Hoffmann)
+ - fix vga names in default_list (Gerd Hoffmann)
+ - usb-host: check mon before using it. (Gerd Hoffmann)
+ - usb-net: use qdev for -usbdevice (Gerd Hoffmann)
+ - monitor: Catch printing to non-existent monitor (Luiz Capitulino)
+ - Avoid permanently disabled QEMU monitor when UNIX migration fails (Daniel P. Berrange)
+ - Fix loading of ELF multiboot kernels (Kevin Wolf)
+ - qemu-io: Fix memory leak (Kevin Wolf)
+ - Fix thinko in linuxboot.S (Paolo Bonzini)
+ - target-i386: Fix evaluation of DR7 register (Jan Kiszka)
+ - vnc: hextile: do not generate ForegroundSpecified and SubrectsColoured tiles (Anthony Liguori)
+ - S390: Bail out without KVM (Alexander Graf)
+ - S390: Don't tell guest we're updating config space (Alexander Graf)
+ - target-s390: Fail on unknown instructions (Alexander Graf)
+ - osdep: Fix runtime failure on older Linux kernels (Andre Przywara)
+ - Fix a make -j race (Juergen Lock)
+ - target-alpha: Fix generic ctz64. (Richard Henderson)
+ - s390: Fix buggy assignment (Stefan Weil)
+ - target-mips: fix user-mode emulation startup (Nathan Froyd)
+ - target-i386: Update CPUID feature set for TCG (Andre Przywara)
+ - s390: fix build on 32 bit host (Michael S. Tsirkin)
+
+version 0.12.0-rc2:
+
+ - v2: properly save kvm system time msr registers (Glauber Costa)
+ - convert more monitor commands to qmp (Luiz Capitulino)
+ - vnc: fix capslock tracking logic. (Gerd Hoffmann)
+ - QemuOpts: allow larger option values. (Gerd Hoffmann)
+ - scsi: fix drive hotplug. (Gerd Hoffmann)
+ - pci: don't hw_error() when no slot is available. (Gerd Hoffmann)
+ - pci: don't abort() when trying to hotplug with acpi off. (Gerd Hoffmann)
+ - allow default devices to be implemented in config file (Gerd Hoffman)
+ - vc: colorize chardev title line with blue background. (Gerd Hoffmann)
+ - chardev: make chardevs specified in config file work. (Gerd Hoffmann)
+ - qdev: also match bus name for global properties (Gerd Hoffmann)
+ - qdev: add command line option to set global defaults for properties. (Gerd Hoffmann)
+ - kvm: x86: Save/restore exception_index (Jan Kiszka)
+ - qdev: Replace device names containing whitespace (Markus Armbruster)
+ - fix rtc-td-hack on host without high-res timers (Gleb Natapov)
+ - virtio: verify features on load (Michael S. Tsirkin)
+ - vmware_vga: add rom file so that it boots. (Dave Airlie)
+ - Do not abort on qemu_malloc(0) in production builds (Anthony Liguori)
+ - Fix ARM userspace strex implementation. (Paul Brook)
+ - qemu: delete rule target on error (Michael S. Tsirkin)
+ - QMP: add human-readable description to error response (Markus Armbruster)
+ - convert more monitor commands to QError (Markus Armbruster)
+ - monitor: Fix double-prompt after "change vnc passwd BLA" (Markus Armbruster)
+ - monitor: do_cont(): Don't ask for passwords (Luiz Capitulino)
+ - monitor: Introduce 'block_passwd' command (Luiz Capitulino)
+ - pci: interrupt disable bit support (Michael S. Tsirkin)
+ - pci: interrupt status bit implementation (Michael S. Tsirkin)
+ - pci: prepare irq code for interrupt state (Michael S. Tsirkin)
+ - msix: function mask support (Michael S. Tsirkin)
+ - msix: macro rename for function mask support (Michael S. Tsirkin)
+ - cpuid: Fix multicore setup on Intel (Andre Przywara)
+ - kvm: x86: Fix initial kvm_has_msr_star (Jan Kiszka)
+ - Update OpenBIOS images to r640 (Aurelien Jarno)
+
+version 0.10.2:
+
+ - fix savevm/loadvm (Anthony Liguori)
+ - live migration: fix dirty tracking windows (Glauber Costa)
+ - live migration: improve error propogation (Glauber Costa)
+ - qcow2: fix image creation for > ~2TB images (Chris Wright)
+ - hotplug: fix error handling for if= parameter (Eduardo Habkost)
+ - qcow2: fix data corruption (Nolan Leake)
+ - virtio: fix guest oops with 2.6.25 kernels (Rusty Russell)
+ - SH4: add support for -kernel (Takashi Yoshii, Aurelien Jarno)
+ - hotplug: fix closing of char devices (Jan Kiszka)
+ - hotplug: remove incorrect check for device name (Eduardo Habkost)
+ - enable -k on win32 (Herve Poussineau)
+ - configure: use LANG=C for grep (Andreas Faerber)
+ - fix VGA regression (malc)
+
+version 0.10.1:
+
+ - virtio-net: check right return size on sg list (Alex Williamson)
+ - Make qemu_announce_self handle holes (live migration after hotplug)
+ (Marcelo Tosatti)
+ - Revert r6804-r6808 (qcow2 allocation info). This series of changes added
+ a high cost to startup for large qcow2 images (Anthony Liguori)
+ - qemu-img: fix help message (Aurelien Jarno)
+ - Fix build for non-default installs of SDL (Anthony Liguori)
+ - Fix race condition in env->interrupt_request. When using TCG and a dynticks
+ host timer, this condition could cause TCG to get stuck in an infinite
+ loop (Aurelien Jarno)
+ - Fix reading encrypted hard disk passwords during early startup (Jan Kiszka)
+ - Fix encrypted disk reporting in 'info block' (Jan Kiszka)
+ - Fix console size with tiny displays (MusicPal) (Jan Kiszka)
+ - Improve error handling in bdrv_open2 (Jan Kiszka)
+ - Avoid leaking data in mux'ed character devices (Jan Kiszka)
+ - Fix initial character device reset (no banner in monitor) (Jan Kiszka)
+ - Fix cpuid KVM crash on i386 host (Lubomir Rintel)
+ - Fix SLES10sp2 installation by adding ISTAT1 register to LSI SCSI emulation
+ (Ryan Harper)
+
+version 0.10.0:
+
+ - TCG support (No longer requires GCC 3.x)
+ - Kernel Virtual Machine acceleration support
+ - BSD userspace emulation
+ - Bluetooth emulation and host passthrough support
+ - GDB XML register description support
+ - Intel e1000 emulation
+ - HPET emulation
+ - VirtIO paravirtual device support
+ - Marvell 88w8618 / MusicPal emulation
+ - Nokia N-series tablet emulation / OMAP2 processor emulation
+ - PCI hotplug support
+ - Live migration and new save/restore formats
+ - Curses display support
+ - qemu-nbd utility to mount supported block formats
+ - Altivec support in PPC emulation and new firmware (OpenBIOS)
+ - Multiple VNC clients are now supported
+ - TLS encryption is now supported in VNC
+ - MIPS Magnum R4000 machine (Hervé Poussineau)
+ - Braille support (Samuel Thibault)
+ - Freecom MusicPal system emulation (Jan Kiszka)
+ - OMAP242x and Nokia N800, N810 machines (Andrzej Zaborowski)
+ - EsounD audio driver (Frederick Reeve)
+ - Gravis Ultrasound GF1 sound card (Tibor "TS" Schütz)
+ - Many, many, bug fixes and new features
+
+version 0.9.1:
+
+ - TFTP booting from host directory (Anthony Liguori, Erwan Velu)
+ - Tap device emulation for Solaris (Sittichai Palanisong)
+ - Monitor multiplexing to several I/O channels (Jason Wessel)
+ - ds1225y nvram support (Herve Poussineau)
+ - CPU model selection support (J. Mayer, Paul Brook, Herve Poussineau)
+ - Several Sparc fixes (Aurelien Jarno, Blue Swirl, Robert Reif)
+ - MIPS 64-bit FPU support (Thiemo Seufer)
+ - Xscale PDA emulation (Andrzej Zaborowski)
+ - ColdFire system emulation (Paul Brook)
+ - Improved SH4 support (Magnus Damm)
+ - MIPS64 support (Aurelien Jarno, Thiemo Seufer)
+ - Preliminary Alpha guest support (J. Mayer)
+ - Read-only support for Parallels disk images (Alex Beregszaszi)
+ - SVM (x86 virtualization) support (Alexander Graf)
+ - CRIS emulation (Edgar E. Iglesias)
+ - SPARC32PLUS execution support (Blue Swirl)
+ - MIPS mipssim pseudo machine (Thiemo Seufer)
+ - Strace for Linux userland emulation (Stuart Anderson, Thayne Harbaugh)
+ - OMAP310 MPU emulation plus Palm T|E machine (Andrzej Zaborowski)
+ - ARM v6, v7, NEON SIMD and SMP emulation (Paul Brook/CodeSourcery)
+ - Gumstix boards: connex and verdex emulation (Thorsten Zitterell)
+ - Intel mainstone II board emulation (Armin Kuster)
+ - VMware SVGA II graphics card support (Andrzej Zaborowski)
+
+version 0.9.0:
+
+ - Support for relative paths in backing files for disk images
+ - Async file I/O API
+ - New qcow2 disk image format
+ - Support of multiple VM snapshots
+ - Linux: specific host CDROM and floppy support
+ - SMM support
+ - Moved PCI init, MP table init and ACPI table init to Bochs BIOS
+ - Support for MIPS32 Release 2 instruction set (Thiemo Seufer)
+ - MIPS Malta system emulation (Aurelien Jarno, Stefan Weil)
+ - Darwin userspace emulation (Pierre d'Herbemont)
+ - m68k user support (Paul Brook)
+ - several x86 and x86_64 emulation fixes
+ - Mouse relative offset VNC extension (Anthony Liguori)
+ - PXE boot support (Anthony Liguori)
+ - '-daemonize' option (Anthony Liguori)
+
+version 0.8.2:
+
+ - ACPI support
+ - PC VGA BIOS fixes
+ - switch to OpenBios for SPARC targets (Blue Swirl)
+ - VNC server fixes
+ - MIPS FPU support (Marius Groeger)
+ - Solaris/SPARC host support (Juergen Keil)
+ - PPC breakpoints and single stepping (Jason Wessel)
+ - USB updates (Paul Brook)
+ - UDP/TCP/telnet character devices (Jason Wessel)
+ - Windows sparse file support (Frediano Ziglio)
+ - RTL8139 NIC TCP segmentation offloading (Igor Kovalenko)
+ - PCNET NIC support (Antony T Curtis)
+ - Support for variable frequency host CPUs
+ - Workaround for win32 SMP hosts
+ - Support for AMD Flash memories (Jocelyn Mayer)
+ - Audio capture to WAV files support (malc)
+
+version 0.8.1:
+
+ - USB tablet support (Brad Campbell, Anthony Liguori)
+ - win32 host serial support (Kazu)
+ - PC speaker support (Joachim Henke)
+ - IDE LBA48 support (Jens Axboe)
+ - SSE3 support
+ - Solaris port (Juergen Keil)
+ - Preliminary SH4 target (Samuel Tardieu)
+ - VNC server (Anthony Liguori)
+ - slirp fixes (Ed Swierk et al.)
+ - USB fixes
+ - ARM Versatile Platform Baseboard emulation (Paul Brook)
+
+version 0.8.0:
+
+ - ARM system emulation: Arm Integrator/CP board with an arm1026ej-s
+ cpu (Paul Brook)
+ - SMP support
+ - Mac OS X cocoa improvements (Mike Kronenberg)
+ - Mac OS X CoreAudio driver (Mike Kronenberg)
+ - DirectSound driver (malc)
+ - ALSA audio driver (malc)
+ - new audio options: '-soundhw' and '-audio-help' (malc)
+ - ES1370 PCI audio device (malc)
+ - Initial USB support
+ - Linux host serial port access
+ - Linux host low level parallel port access
+ - New network emulation code supporting VLANs.
+ - MIPS and MIPSel User Linux emulation
+ - MIPS fixes to boot Linux (Daniel Jacobowitz)
+ - NX bit support
+ - Initial SPARC SMP support (Blue Swirl)
+ - Major overhaul of the virtual FAT driver for read/write support
+ (Johannes Schindelin)
+
+version 0.7.2:
+
+ - x86_64 fixes (Win2000 and Linux 2.6 boot in 32 bit)
+ - merge self modifying code handling in dirty ram page mecanism.
+ - MIPS fixes (Ralf Baechle)
+ - better user net performances
+
+version 0.7.1:
+
+ - read-only Virtual FAT support (Johannes Schindelin)
+ - Windows 2000 install disk full hack (original idea from Vladimir
+ N. Oleynik)
+ - VMDK disk image creation (Filip Navara)
+ - SPARC64 progress (Blue Swirl)
+ - initial MIPS support (Jocelyn mayer)
+ - MIPS improvements (Ralf Baechle)
+ - 64 bit fixes in user networking (initial patch by Gwenole Beauchesne)
+ - IOAPIC support (Filip Navara)
+
+version 0.7.0:
+
+ - better BIOS translation and HDD geometry auto-detection
+ - user mode networking bug fix
+ - undocumented FPU ops support
+ - Cirrus VGA: support for 1280x1024x[8,15,16] modes
+ - 'pidfile' option
+ - .dmg disk image format support (Johannes Schindelin)
+ - keymaps support (initial patch by Johannes Schindelin)
+ - big endian ARM support (Lennert Buytenhek)
+ - added generic 64 bit target support
+ - x86_64 target support
+ - initial APIC support
+ - MMX/SSE/SSE2/PNI support
+ - PC parallel port support (Mark Jonckheere)
+ - initial SPARC64 support (Blue Swirl)
+ - SPARC target boots Linux (Blue Swirl)
+ - armv5te user mode support (Paul Brook)
+ - ARM VFP support (Paul Brook)
+ - ARM "Angel" semihosting syscalls (Paul Brook)
+ - user mode gdb stub support (Paul Brook)
+ - Samba 3 support
+ - initial Cocoa support (Pierre d'Herbemont)
+ - generic FPU emulation code
+ - Virtual PC read-only disk image support (Alex Beregszaszi)
+
+version 0.6.1:
+
+ - Mac OS X port (Pierre d'Herbemont)
+ - Virtual console support
+ - Better monitor line edition
+ - New block device layer
+ - New 'qcow' growable disk image support with AES encryption and
+ transparent decompression
+ - VMware 3 and 4 read-only disk image support (untested)
+ - Support for up to 4 serial ports
+ - TFTP server support (Magnus Damm)
+ - Port redirection support in user mode networking
+ - Support for not executable data sections
+ - Compressed loop disk image support (Johannes Schindelin)
+ - Level triggered IRQ fix (aka NE2000 PCI performance fix) (Steve
+ Wormley)
+ - Fixed Fedora Core 2 problems (now you can run qemu without any
+ LD_ASSUME_KERNEL tricks on FC2)
+ - DHCP fix for Windows (accept DHCPREQUEST alone)
+ - SPARC system emulation (Blue Swirl)
+ - Automatic Samba configuration for host file access from Windows.
+ - '-loadvm' and '-full-screen' options
+ - ne2000 savevm support (Johannes Schindelin)
+ - Ctrl-Alt is now the default grab key. Ctrl-Alt-[0-9] switches to
+ the virtual consoles.
+ - BIOS floppy fix for NT4 (Mike Nordell, Derek Fawcus, Volker Ruppert)
+ - Floppy fixes for NT4 and NT5 (Mike Nordell)
+ - NT4 IDE fixes (Ben Pfaf, Mike Nordell)
+ - SDL Audio support and SB16 fixes (malc)
+ - ENTER instruction bug fix (initial patch by Stefan Kisdaroczi)
+ - VGA font change fix
+ - VGA read-only CRTC register fix
+
+version 0.6.0:
+
+ - minimalist FPU exception support (NetBSD FPU probe fix)
+ - cr0.ET fix (Win95 boot)
+ - *BSD port (Markus Niemisto)
+ - I/O access fix (signaled by Mark Jonckheere)
+ - IDE drives serial number fix (Mike Nordell)
+ - int13 CDROM BIOS fix (aka Solaris x86 install CD fix)
+ - int15, ah=86 BIOS fix (aka Solaris x86 hardware probe hang up fix)
+ - BSR/BSF "undefined behaviour" fix
+ - vmdk2raw: convert VMware disk images to raw images
+ - PCI support
+ - NE2K PCI support
+ - dummy VGA PCI support
+ - VGA font selection fix (Daniel Serpell)
+ - PIC reset fix (Hidemi KAWAI)
+ - PIC spurious irq support (aka Solaris install bug)
+ - added '-localtime' option
+ - Cirrus CL-GD54xx VGA support (initial patch by Makoto Suzuki (suzu))
+ - APM and system shutdown support
+ - Fixed system reset
+ - Support for other PC BIOSes
+ - Initial PowerMac hardware emulation
+ - PowerMac/PREP OpenFirmware compatible BIOS (Jocelyn Mayer)
+ - initial IDE BMDMA support (needed for Darwin x86)
+ - Set the default memory size for PC emulation to 128 MB
+
+version 0.5.5:
+
+ - SDL full screen support (initial patch by malc)
+ - VGA support on PowerPC PREP
+ - VBE fixes (Matthew Mastracci)
+ - PIT fixes (aka Win98 hardware probe and "VGA slowness" bug)
+ - IDE master only fixes (aka Win98 CD-ROM probe bug)
+ - ARM load/store half word fix (Ulrich Hecht)
+ - FDC fixes for Win98
+
+version 0.5.4:
+
+ - qemu-fast fixes
+ - BIOS area protection fix (aka EMM386.EXE fix) (Mike Nordell)
+ - keyboard/mouse fix (Mike Nordell)
+ - IDE fixes (Linux did not recognized slave drivers)
+ - VM86 EIP masking fix (aka NT5 install fix) (Mike Nordell)
+ - QEMU can now boot a PowerPC Linux kernel (Jocelyn Mayer)
+ - User mode network stack
+ - imul imm8 fix + 0x82 opcode support (Hidemi KAWAI)
+ - precise self modifying code (aka BeOS install bug)
+
+version 0.5.3:
+
+ - added Bochs VESA VBE support
+ - VGA memory map mode 3 access fix (OS/2 install fix)
+ - IDE fixes (Jens Axboe)
+ - CPU interrupt fixes
+ - fixed various TLB invalidation cases (NT install)
+ - fixed cr0.WP semantics (XP install)
+ - direct chaining support for SPARC and PowerPC (faster)
+ - ARM NWFPE support (initial patch by Ulrich Hecht)
+ - added specific x86 to x86 translator (close to native performance
+ in qemu-i386 and qemu-fast)
+ - shm syscalls support (Paul McKerras)
+ - added accurate CR0.MP/ME/TS emulation
+ - fixed DMA memory write access (Win95 boot floppy fix)
+ - graphical x86 linux loader
+ - command line monitor
+ - generic removable device support
+ - support of CD-ROM change
+ - multiple network interface support
+ - initial x86-64 host support (Gwenole Beauchesne)
+ - lret to outer priviledge fix (OS/2 install fix)
+ - task switch fixes (SkyOS boot)
+ - VM save/restore commands
+ - new timer API
+ - more precise RTC emulation (periodic timers + time updates)
+ - Win32 port (initial patch by Kazu)
+
+version 0.5.2:
+
+ - improved soft MMU speed (assembly functions and specializing)
+ - improved multitasking speed by avoiding flushing TBs when
+ switching tasks
+ - improved qemu-fast speed
+ - improved self modifying code handling (big performance gain in
+ softmmu mode).
+ - fixed IO checking
+ - fixed CD-ROM detection (win98 install CD)
+ - fixed addseg real mode bug (GRUB boot fix)
+ - added ROM memory support (win98 boot)
+ - fixed 'call Ev' in case of paging exception
+ - updated the script 'qemu-binfmt-conf.sh' to use QEMU automagically
+ when launching executables for the supported target CPUs.
+ - PowerPC system emulation update (Jocelyn Mayer)
+ - PC floppy emulation and DMA fixes (Jocelyn Mayer)
+ - polled mode for PIC (Jocelyn Mayer)
+ - fixed PTE dirty bit handling
+ - fixed xadd same reg bug
+ - fixed cmpxchg exception safeness
+ - access to virtual memory in gdb stub
+ - task gate and NT flag fixes
+ - eflags optimisation fix for string operations
+
+version 0.5.1:
+
+ - float access fixes when using soft mmu
+ - PC emulation support on PowerPC
+ - A20 support
+ - IDE CD-ROM emulation
+ - ARM fixes (Ulrich Hecht)
+ - SB16 emulation (malc)
+ - IRET and INT fixes in VM86 mode with IOPL=3
+ - Port I/Os use TSS io map
+ - Full task switching/task gate support
+ - added verr, verw, arpl, fcmovxx
+ - PowerPC target support (Jocelyn Mayer)
+ - Major SPARC target fixes (dynamically linked programs begin to work)
+
+version 0.5.0:
+
+ - full hardware level VGA emulation
+ - graphical display with SDL
+ - added PS/2 mouse and keyboard emulation
+ - popw (%esp) fix
+ - mov to/from segment data width fix
+ - added real mode support
+ - added Bochs BIOS and LGPL'ed VGA BIOS loader in qemu
+ - m68k host port (Richard Zidlicky)
+ - partial soft MMU support for memory mapped I/Os
+ - multi-target build
+ - fixed: no error code in hardware interrupts
+ - fixed: pop ss, mov ss, x and sti disable hardware irqs for the next insn
+ - correct single stepping thru string operations
+ - preliminary SPARC target support (Thomas M. Ogrisegg)
+ - tun-fd option (Rusty Russell)
+ - automatic IDE geometry detection
+ - renamed 'vl' to qemu[-fast] and user qemu to qemu-{cpu}.
+ - added man page
+ - added full soft mmu mode to launch unpatched OSes.
+
+version 0.4.3:
+
+ - x86 exception fix in case of nop instruction.
+ - gcc 3.2.2 bug workaround (RedHat 9 fix)
+ - sparc and Alpha host fixes
+ - many ARM target fixes: 'ls' and 'bash' can be launched.
+
+version 0.4.2:
+
+ - many exception handling fixes (can compile a Linux kernel inside vl)
+ - IDE emulation support
+ - initial GDB stub support
+ - deferred update support for disk images (Rusty Russell)
+ - accept User Mode Linux Copy On Write disk images
+ - SMP kernels can at least be booted
+
+version 0.4.1:
+
+ - more accurate timer support in vl.
+ - more reliable NE2000 probe in vl.
+ - added 2.5.66 kernel in vl-test.
+ - added VLTMPDIR environment variable in vl.
+
+version 0.4:
+
+ - initial support for ring 0 x86 processor emulation
+ - fixed signal handling for correct dosemu DPMI emulation
+ - fast x86 MMU emulation with mmap()
+ - fixed popl (%esp) case
+ - Linux kernel can be executed by QEMU with the 'vl' command.
+
+version 0.3:
+
+ - initial support for ARM emulation
+ - added fnsave, frstor, fnstenv, fldenv FPU instructions
+ - added FPU register save in signal emulation
+ - initial ARM port
+ - Sparc and Alpha ports work on the regression test
+ - generic ioctl number conversion
+ - fixed ioctl type conversion
+
+version 0.2:
+
+ - PowerPC disassembly and ELF symbols output (Rusty Russell)
+ - flock support (Rusty Russell)
+ - ugetrlimit support (Rusty Russell)
+ - fstat64 fix (Rusty Russell)
+ - initial Alpha port (Falk Hueffner)
+ - initial IA64 port (Matt Wilson)
+ - initial Sparc and Sparc64 port (David S. Miller)
+ - added HLT instruction
+ - LRET instruction fix.
+ - added GPF generation for I/Os.
+ - added INT3 and TF flag support.
+ - SHL instruction C flag fix.
+ - mmap emulation for host page size > 4KB
+ - self-modifying code support
+ - better VM86 support (dosemu works on non trivial programs)
+ - precise exception support (EIP is computed correctly in most cases)
+ - more precise LDT/GDT/IDT emulation
+ - faster segment load in vm86 mode
+ - direct chaining of basic blocks (faster emulation)
+
+version 0.1.6:
+
+ - automatic library search system. QEMU can now work with unpatched
+ ELF dynamic loader and libc (Rusty Russell).
+ - ISO C warning fixes (Alistair Strachan)
+ - first self-virtualizable version (works only as long as the
+ translation cache is not flushed)
+ - RH9 fixes
+
+version 0.1.5:
+
+ - ppc64 support + personality() patch (Rusty Russell)
+ - first Alpha CPU patches (Falk Hueffner)
+ - removed bfd.h dependency
+ - fixed shrd, shld, idivl and divl on PowerPC.
+ - fixed buggy glibc PowerPC rint() function (test-i386 passes now on PowerPC).
+
+version 0.1.4:
+
+ - more accurate VM86 emulation (can launch small DOS 16 bit
+ executables in wine).
+ - fixed push/pop fs/gs
+ - added iret instruction.
+ - added times() syscall and SIOCATMARK ioctl.
+
+version 0.1.3:
+
+ - S390 support (Ulrich Weigand)
+ - glibc 2.3.x compile fix (Ulrich Weigand)
+ - socketcall endian fix (Ulrich Weigand)
+ - struct sockaddr endian fix (Ulrich Weigand)
+ - sendmsg/recvmsg endian fix (Ulrich Weigand)
+ - execve endian fix (Ulrich Weigand)
+ - fdset endian fix (Ulrich Weigand)
+ - partial setsockopt syscall support (Ulrich Weigand)
+ - more accurate pushf/popf emulation
+ - first partial vm86() syscall support (can be used with runcom example).
+ - added bound, cmpxchg8b, cpuid instructions
+ - added 16 bit addressing support/override for string operations
+ - poll() fix
+
+version 0.1.2:
+
+ - compile fixes
+ - xlat instruction
+ - xchg instruction memory lock
+ - added simple vm86 example (not working with QEMU yet). The 54 byte
+ DOS executable 'pi_10.com' program was released by Bertram
+ Felgenhauer (more information at http://www.boo.net/~jasonp/pipage.html)
+
+version 0.1.1:
+
+ - glibc 2.2 compilation fixes
+ - added -s and -L options
+ - binary distribution of x86 glibc and wine
+ - big endian fixes in ELF loader and getdents.
+
+version 0.1:
+
+ - initial public release.
diff --git a/qemu-0.15.x/HACKING b/qemu-0.15.x/HACKING
new file mode 100644
index 0000000..3af53fd
--- /dev/null
+++ b/qemu-0.15.x/HACKING
@@ -0,0 +1,122 @@
+1. Preprocessor
+
+For variadic macros, stick with this C99-like syntax:
+
+#define DPRINTF(fmt, ...) \
+ do { printf("IRQ: " fmt, ## __VA_ARGS__); } while (0)
+
+2. C types
+
+It should be common sense to use the right type, but we have collected
+a few useful guidelines here.
+
+2.1. Scalars
+
+If you're using "int" or "long", odds are good that there's a better type.
+If a variable is counting something, it should be declared with an
+unsigned type.
+
+If it's host memory-size related, size_t should be a good choice (use
+ssize_t only if required). Guest RAM memory offsets must use ram_addr_t,
+but only for RAM, it may not cover whole guest address space.
+
+If it's file-size related, use off_t.
+If it's file-offset related (i.e., signed), use off_t.
+If it's just counting small numbers use "unsigned int";
+(on all but oddball embedded systems, you can assume that that
+type is at least four bytes wide).
+
+In the event that you require a specific width, use a standard type
+like int32_t, uint32_t, uint64_t, etc. The specific types are
+mandatory for VMState fields.
+
+Don't use Linux kernel internal types like u32, __u32 or __le32.
+
+Use target_phys_addr_t for guest physical addresses except pcibus_t
+for PCI addresses. In addition, ram_addr_t is a QEMU internal address
+space that maps guest RAM physical addresses into an intermediate
+address space that can map to host virtual address spaces. Generally
+speaking, the size of guest memory can always fit into ram_addr_t but
+it would not be correct to store an actual guest physical address in a
+ram_addr_t.
+
+Use target_ulong (or abi_ulong) for CPU virtual addresses, however
+devices should not need to use target_ulong.
+
+Of course, take all of the above with a grain of salt. If you're about
+to use some system interface that requires a type like size_t, pid_t or
+off_t, use matching types for any corresponding variables.
+
+Also, if you try to use e.g., "unsigned int" as a type, and that
+conflicts with the signedness of a related variable, sometimes
+it's best just to use the *wrong* type, if "pulling the thread"
+and fixing all related variables would be too invasive.
+
+Finally, while using descriptive types is important, be careful not to
+go overboard. If whatever you're doing causes warnings, or requires
+casts, then reconsider or ask for help.
+
+2.2. Pointers
+
+Ensure that all of your pointers are "const-correct".
+Unless a pointer is used to modify the pointed-to storage,
+give it the "const" attribute. That way, the reader knows
+up-front that this is a read-only pointer. Perhaps more
+importantly, if we're diligent about this, when you see a non-const
+pointer, you're guaranteed that it is used to modify the storage
+it points to, or it is aliased to another pointer that is.
+
+2.3. Typedefs
+Typedefs are used to eliminate the redundant 'struct' keyword.
+
+2.4. Reserved namespaces in C and POSIX
+Underscore capital, double underscore, and underscore 't' suffixes should be
+avoided.
+
+3. Low level memory management
+
+Use of the malloc/free/realloc/calloc/valloc/memalign/posix_memalign
+APIs is not allowed in the QEMU codebase. Instead of these routines,
+use the replacement qemu_malloc/qemu_mallocz/qemu_realloc/qemu_free or
+qemu_vmalloc/qemu_memalign/qemu_vfree APIs.
+
+Please note that NULL check for the qemu_malloc result is redundant and
+that qemu_malloc() call with zero size is not allowed.
+
+Memory allocated by qemu_vmalloc or qemu_memalign must be freed with
+qemu_vfree, since breaking this will cause problems on Win32 and user
+emulators.
+
+4. String manipulation
+
+Do not use the strncpy function. According to the man page, it does
+*not* guarantee a NULL-terminated buffer, which makes it extremely dangerous
+to use. Instead, use functionally equivalent function:
+void pstrcpy(char *buf, int buf_size, const char *str)
+
+Don't use strcat because it can't check for buffer overflows, but:
+char *pstrcat(char *buf, int buf_size, const char *s)
+
+The same limitation exists with sprintf and vsprintf, so use snprintf and
+vsnprintf.
+
+QEMU provides other useful string functions:
+int strstart(const char *str, const char *val, const char **ptr)
+int stristart(const char *str, const char *val, const char **ptr)
+int qemu_strnlen(const char *s, int max_len)
+
+There are also replacement character processing macros for isxyz and toxyz,
+so instead of e.g. isalnum you should use qemu_isalnum.
+
+Because of the memory management rules, you must use qemu_strdup/qemu_strndup
+instead of plain strdup/strndup.
+
+5. Printf-style functions
+
+Whenever you add a new printf-style function, i.e., one with a format
+string argument and following "..." in its prototype, be sure to use
+gcc's printf attribute directive in the prototype.
+
+This makes it so gcc's -Wformat and -Wformat-security options can do
+their jobs and cross-check format strings with the number and types
+of arguments.
diff --git a/qemu-0.15.x/LICENSE b/qemu-0.15.x/LICENSE
new file mode 100644
index 0000000..cbd92c0
--- /dev/null
+++ b/qemu-0.15.x/LICENSE
@@ -0,0 +1,18 @@
+The following points clarify the QEMU license:
+
+1) QEMU as a whole is released under the GNU General Public License
+
+2) Parts of QEMU have specific licenses which are compatible with the
+GNU General Public License. Hence each source file contains its own
+licensing information.
+
+In particular, the QEMU virtual CPU core library (libqemu.a) is
+released under the GNU Lesser General Public License. Many hardware
+device emulation sources are released under the BSD license.
+
+3) The Tiny Code Generator (TCG) is released under the BSD license
+ (see license headers in files).
+
+4) QEMU is a trademark of Fabrice Bellard.
+
+Fabrice Bellard.
diff --git a/qemu-0.15.x/MAINTAINERS b/qemu-0.15.x/MAINTAINERS
new file mode 100644
index 0000000..6115e4e
--- /dev/null
+++ b/qemu-0.15.x/MAINTAINERS
@@ -0,0 +1,506 @@
+QEMU Maintainers
+================
+
+The intention of this file is not to establish who owns what portions of the
+code base, but to provide a set of names that developers can consult when they
+have a question about a particular subset and also to provide a set of names
+to be CC'd when submitting a patch to obtain appropriate review.
+
+In general, if you have a question about inclusion of a patch, you should
+consult qemu-devel and not any specific individual privately.
+
+Descriptions of section entries:
+
+ M: Mail patches to: FullName <address@domain>
+ L: Mailing list that is relevant to this area
+ W: Web-page with status/info
+ Q: Patchwork web based patch tracking system site
+ T: SCM tree type and location. Type is one of: git, hg, quilt, stgit.
+ S: Status, one of the following:
+ Supported: Someone is actually paid to look after this.
+ Maintained: Someone actually looks after it.
+ Odd Fixes: It has a maintainer but they don't have time to do
+ much other than throw the odd patch in. See below..
+ Orphan: No current maintainer [but maybe you could take the
+ role as you write your new code].
+ Obsolete: Old code. Something tagged obsolete generally means
+ it has been replaced by a better system and you
+ should be using that.
+ F: Files and directories with wildcard patterns.
+ A trailing slash includes all files and subdirectory files.
+ F: drivers/net/ all files in and below drivers/net
+ F: drivers/net/* all files in drivers/net, but not below
+ F: */net/* all files in "any top level directory"/net
+ One pattern per line. Multiple F: lines acceptable.
+ X: Files and directories that are NOT maintained, same rules as F:
+ Files exclusions are tested before file matches.
+ Can be useful for excluding a specific subdirectory, for instance:
+ F: net/
+ X: net/ipv6/
+ matches all files in and below net excluding net/ipv6/
+ K: Keyword perl extended regex pattern to match content in a
+ patch or file. For instance:
+ K: of_get_profile
+ matches patches or files that contain "of_get_profile"
+ K: \b(printk|pr_(info|err))\b
+ matches patches or files that contain one or more of the words
+ printk, pr_info or pr_err
+ One regex pattern per line. Multiple K: lines acceptable.
+
+
+General Project Administration
+------------------------------
+M: Anthony Liguori <aliguori(a)us.ibm.com>
+M: Paul Brook <paul(a)codesourcery.com>
+
+Guest CPU cores (TCG):
+----------------------
+Alpha
+M: Richard Henderson <rth(a)twiddle.net>
+S: Maintained
+F: target-alpha/
+
+ARM
+M: Paul Brook <paul(a)codesourcery.com>
+S: Maintained
+F: target-arm/
+
+CRIS
+M: Edgar E. Iglesias <edgar.iglesias(a)gmail.com>
+S: Maintained
+F: target-cris/
+
+LM32
+M: Michael Walle <michael(a)walle.cc>
+S: Maintained
+F: target-lm32/
+
+M68K
+M: Paul Brook <paul(a)codesourcery.com>
+S: Maintained
+F: target-m68k/
+
+MicroBlaze
+M: Edgar E. Iglesias <edgar.iglesias(a)gmail.com>
+S: Maintained
+F: target-microblaze/
+
+MIPS
+M: Aurelien Jarno <aurelien(a)aurel32.net>
+S: Maintained
+F: target-mips/
+
+PowerPC
+M: Alexander Graf <agraf(a)suse.de>
+S: Maintained
+F: target-ppc/
+
+S390
+M: Alexander Graf <agraf(a)suse.de>
+S: Maintained
+F: target-s390x/
+
+SH4
+M: Aurelien Jarno <aurelien(a)aurel32.net>
+S: Maintained
+F: target-sh4/
+
+SPARC
+M: Blue Swirl <blauwirbel(a)gmail.com>
+S: Maintained
+F: target-sparc/
+
+X86
+M: qemu-devel(a)nongnu.org
+S: Odd Fixes
+F: target-i386/
+
+Guest CPU Cores (KVM):
+----------------------
+
+Overall
+M: Avi Kivity <avi(a)redhat.com>
+M: Marcelo Tosatti <mtosatti(a)redhat.com>
+L: kvm(a)vger.kernel.org
+S: Supported
+F: kvm-*
+F: */kvm.*
+
+PPC
+M: Alexander Graf <agraf(a)suse.de>
+S: Maintained
+F: target-ppc/kvm.c
+
+S390
+M: Alexander Graf <agraf(a)suse.de>
+S: Maintained
+F: target-s390x/kvm.c
+
+X86
+M: Avi Kivity <avi(a)redhat.com>
+M: Marcelo Tosatti <mtosatti(a)redhat.com>
+L: kvm(a)vger.kernel.org
+S: Supported
+F: target-i386/kvm.c
+
+ARM Machines
+------------
+Gumstix
+M: qemu-devel(a)nongnu.org
+S: Orphan
+F: hw/gumstix.c
+
+Integrator CP
+M: Paul Brook <paul(a)codesourcery.com>
+S: Maintained
+F: hw/integratorcp.c
+
+Mainstone
+M: qemu-devel(a)nongnu.org
+S: Orphan
+F: hw/mainstone.c
+
+Musicpal
+M: Jan Kiszka <jan.kiszka(a)web.de>
+S: Maintained
+F: hw/musicpal.c
+
+nSeries
+M: Andrzej Zaborowski <balrogg(a)gmail.com>
+S: Maintained
+F: hw/nseries.c
+
+Palm
+M: Andrzej Zaborowski <balrogg(a)gmail.com>
+S: Maintained
+F: hw/palm.c
+
+Real View
+M: Paul Brook <paul(a)codesourcery.com>
+S: Maintained
+F: hw/realview*
+
+Spitz
+M: Andrzej Zaborowski <balrogg(a)gmail.com>
+S: Maintained
+F: hw/spitz.c
+
+Stellaris
+M: Paul Brook <paul(a)codesourcery.com>
+S: Maintained
+F: hw/stellaris.c
+
+Versatile PB
+M: Paul Brook <paul(a)codesourcery.com>
+S: Maintained
+F: hw/versatilepb.c
+
+CRIS Machines
+-------------
+Axis Dev88
+M: Edgar E. Iglesias <edgar.iglesias(a)gmail.com>
+S: Maintained
+F: hw/axis_dev88.c
+
+etraxfs
+M: Edgar E. Iglesias <edgar.iglesias(a)gmail.com>
+S: Maintained
+F: hw/etraxfs.c
+
+LM32 Machines
+-------------
+EVR32 and uclinux BSP
+M: Michael Walle <michael(a)walle.cc>
+S: Maintained
+F: hw/lm32_boards.c
+
+milkymist
+M: Michael Walle <michael(a)walle.cc>
+S: Maintained
+F: hw/milkymist.c
+
+M68K Machines
+-------------
+an5206
+M: Paul Brook <paul(a)codesourcery.com>
+S: Maintained
+F: hw/an5206.c
+
+dummy_m68k
+M: Paul Brook <paul(a)codesourcery.com>
+S: Maintained
+F: hw/dummy_m68k.c
+
+mcf5208
+M: Paul Brook <paul(a)codesourcery.com>
+S: Maintained
+F: hw/mcf5208.c
+
+MicroBlaze Machines
+-------------------
+petalogix_s3adsp1800
+M: Edgar E. Iglesias <edgar.iglesias(a)gmail.com>
+S: Maintained
+F: hw/petalogix_s3adsp1800.c
+
+MIPS Machines
+-------------
+Jazz
+M: Hervé Poussineau <hpoussin(a)reactos.org>
+S: Maintained
+F: hw/mips_jazz.c
+
+Malta
+M: Aurelien Jarno <aurelien(a)aurel32.net>
+S: Maintained
+F: hw/mips_malta.c
+
+Mipssim
+M: qemu-devel(a)nongnu.org
+S: Orphan
+F: hw/mips_mipssim.c
+
+R4000
+M: Aurelien Jarno <aurelien(a)aurel32.net>
+S: Maintained
+F: hw/mips_r4k.c
+
+PowerPC Machines
+----------------
+405
+M: Alexander Graf <agraf(a)suse.de>
+S: Maintained
+F: hw/ppc405_boards.c
+
+New World
+M: Alexander Graf <agraf(a)suse.de>
+S: Maintained
+F: hw/ppc_newworld.c
+
+Old World
+M: Alexander Graf <agraf(a)suse.de>
+S: Maintained
+F: hw/ppc_oldworld.c
+
+Prep
+M: qemu-devel(a)nongnu.org
+S: Orphan
+F: hw/ppc_prep.c
+
+SH4 Machines
+------------
+R2D
+M: Magnus Damm <magnus.damm(a)gmail.com>
+S: Maintained
+F: hw/r2d.c
+
+Shix
+M: Magnus Damm <magnus.damm(a)gmail.com>
+S: Orphan
+F: hw/shix.c
+
+SPARC Machines
+--------------
+Sun4m
+M: Blue Swirl <blauwirbel(a)gmail.com>
+S: Maintained
+F: hw/sun4m.c
+
+Sun4u
+M: Blue Swirl <blauwirbel(a)gmail.com>
+S: Maintained
+F: hw/sun4u.c
+
+S390 Machines
+-------------
+S390 Virtio
+M: Alexander Graf <agraf(a)suse.de>
+S: Maintained
+F: hw/s390-*.c
+
+X86 Machines
+------------
+PC
+M: Anthony Liguori <aliguori(a)us.ibm.com>
+S: Supported
+F: hw/pc.[ch] hw/pc_piix.c
+
+Devices
+-------
+IDE
+M: Kevin Wolf <kwolf(a)redhat.com>
+S: Odd Fixes
+F: hw/ide/
+
+PCI
+M: Michael S. Tsirkin <mst(a)redhat.com>
+S: Supported
+F: hw/pci*
+F: hw/piix*
+
+SCSI
+M: Paul Brook <paul(a)codesourcery.com>
+M: Kevin Wolf <kwolf(a)redhat.com>
+S: Odd Fixes
+F: hw/lsi53c895a.c
+F: hw/scsi*
+
+USB
+M: Gerd Hoffmann <kraxel(a)redhat.com>
+S: Maintained
+F: hw/usb*
+
+vhost
+M: Michael S. Tsirkin <mst(a)redhat.com>
+S: Supported
+F: hw/vhost*
+
+virtio
+M: Anthony Liguori <aliguori(a)us.ibm.com>
+S: Supported
+F: hw/virtio*
+
+virtio-9p
+M: Venkateswararao Jujjuri (JV) <jvrao(a)linux.vnet.ibm.com>
+S: Supported
+F: hw/virtio-9p*
+
+virtio-blk
+M: Kevin Wolf <kwolf(a)redhat.com>
+S: Supported
+F: hw/virtio-blk*
+
+virtio-serial
+M: Amit Shah <amit.shah(a)redhat.com>
+S: Supported
+F: hw/virtio-serial*
+F: hw/virtio-console*
+
+Subsystems
+----------
+Audio
+M: Vassili Karpov (malc) <av1474(a)comtv.ru>
+S: Maintained
+F: audio/
+
+Block
+M: Kevin Wolf <kwolf(a)redhat.com>
+S: Supported
+F: block*
+F: block/
+
+Character Devices
+M: Anthony Liguori <aliguori(a)us.ibm.com>
+S: Maintained
+F: qemu-char.c
+
+GDB stub
+M: qemu-devel(a)nongnu.org
+S: Odd Fixes
+F: gdbstub*
+F: gdb-xml/
+
+SPICE
+M: Gerd Hoffmann <kraxel(a)redhat.com>
+S: Supported
+F: ui/qemu-spice.h
+F: ui/spice-*.c
+F: audio/spiceaudio.c
+F: hw/qxl*
+
+Graphics
+M: Anthony Liguori <aliguori(a)us.ibm.com>
+S: Maintained
+F: ui/
+
+Main loop
+M: Anthony Liguori <aliguori(a)us.ibm.com>
+S: Supported
+F: vl.c
+
+Monitor (QMP/HMP)
+M: Luiz Capitulino <lcapitulino(a)redhat.com>
+M: Markus Armbruster <armbru(a)redhat.com>
+S: Supported
+F: monitor.c
+
+Network device layer
+M: Anthony Liguori <aliguori(a)us.ibm.com>
+M: Mark McLoughlin <markmc(a)redhat.com>
+S: Maintained
+F: net/
+
+SLIRP
+M: qemu-devel(a)nongnu.org
+S: Orphan
+F: slirp/
+
+Usermode Emulation
+------------------
+BSD user
+M: Blue Swirl <blauwirbel(a)gmail.com>
+S: Maintained
+F: bsd-user/
+
+Darwin user
+M: qemu-devel(a)nongnu.org
+S: Orphan
+F: darwin-user/
+
+Linux user
+M: Riku Voipio <riku.voipio(a)iki.fi>
+S: Maintained
+F: linux-user/
+
+Tiny Code Generator (TCG)
+-------------------------
+Common code
+M: qemu-devel(a)nongnu.org
+S: Maintained
+F: tcg/
+
+ARM target
+M: Andrzej Zaborowski <balrogg(a)gmail.com>
+S: Maintained
+F: tcg/arm/
+
+HPPA target
+M: Richard Henderson <rth(a)twiddle.net>
+S: Maintained
+F: tcg/hppa/
+
+i386 target
+M: qemu-devel(a)nongnu.org
+S: Maintained
+F: tcg/i386/
+
+IA64 target
+M: Aurelien Jarno <aurelien(a)aurel32.net>
+S: Maintained
+F: tcg/ia64/
+
+MIPS target
+M: Aurelien Jarno <aurelien(a)aurel32.net>
+S: Maintained
+F: tcg/mips/
+
+PPC
+M: Vassili Karpov (malc) <av1474(a)comtv.ru>
+S: Maintained
+F: tcg/ppc/
+
+PPC64 target
+M: Vassili Karpov (malc) <av1474(a)comtv.ru>
+S: Maintained
+F: tcg/ppc64/
+
+S390 target
+M: Alexander Graf <agraf(a)suse.de>
+M: Richard Henderson <rth(a)twiddle.net>
+S: Maintained
+F: tcg/s390/
+
+SPARC target
+M: Blue Swirl <blauwirbel(a)gmail.com>
+S: Maintained
+F: tcg/sparc/
diff --git a/qemu-0.15.x/Makefile b/qemu-0.15.x/Makefile
new file mode 100644
index 0000000..0a31633
--- /dev/null
+++ b/qemu-0.15.x/Makefile
@@ -0,0 +1,403 @@
+# Makefile for QEMU.
+
+GENERATED_HEADERS = config-host.h trace.h qemu-options.def
+ifeq ($(TRACE_BACKEND),dtrace)
+GENERATED_HEADERS += trace-dtrace.h
+endif
+
+ifneq ($(wildcard config-host.mak),)
+# Put the all: rule here so that config-host.mak can contain dependencies.
+all: build-all
+include config-host.mak
+include $(SRC_PATH)/rules.mak
+config-host.mak: $(SRC_PATH)/configure
+ @echo $@ is out-of-date, running configure
+ @sed -n "/.*Configured with/s/[^:]*: //p" $@ | sh
+else
+config-host.mak:
+ @echo "Please call configure before running make!"
+ @exit 1
+endif
+
+# Don't try to regenerate Makefile or configure
+# We don't generate any of them
+Makefile: ;
+configure: ;
+
+.PHONY: all clean cscope distclean dvi html info install install-doc \
+ pdf recurse-all speed tar tarbin test build-all
+
+$(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
+
+LIBS+=-lz $(LIBS_TOOLS)
+
+ifdef BUILD_DOCS
+DOCS=qemu-doc.html qemu-tech.html qemu.1 qemu-img.1 qemu-nbd.8 QMP/qmp-commands.txt
+else
+DOCS=
+endif
+
+SUBDIR_MAKEFLAGS=$(if $(V),,--no-print-directory)
+SUBDIR_DEVICES_MAK=$(patsubst %, %/config-devices.mak, $(TARGET_DIRS))
+SUBDIR_DEVICES_MAK_DEP=$(patsubst %, %/config-devices.mak.d, $(TARGET_DIRS))
+
+config-all-devices.mak: $(SUBDIR_DEVICES_MAK)
+ $(call quiet-command,cat $(SUBDIR_DEVICES_MAK) | grep =y | sort -u > $@," GEN $@")
+
+-include $(SUBDIR_DEVICES_MAK_DEP)
+
+%/config-devices.mak: default-configs/%.mak
+ $(call quiet-command,$(SHELL) $(SRC_PATH)/scripts/make_device_config.sh $@ $<, " GEN $@")
+ @if test -f $@; then \
+ if cmp -s $@.old $@; then \
+ mv $@.tmp $@; \
+ cp -p $@ $@.old; \
+ else \
+ if test -f $@.old; then \
+ echo "WARNING: $@ (user modified) out of date.";\
+ else \
+ echo "WARNING: $@ out of date.";\
+ fi; \
+ echo "Run \"make defconfig\" to regenerate."; \
+ rm $@.tmp; \
+ fi; \
+ else \
+ mv $@.tmp $@; \
+ cp -p $@ $@.old; \
+ fi
+
+defconfig:
+ rm -f config-all-devices.mak $(SUBDIR_DEVICES_MAK)
+
+-include config-all-devices.mak
+
+build-all: $(DOCS) $(TOOLS) recurse-all
+
+config-host.h: config-host.h-timestamp
+config-host.h-timestamp: config-host.mak
+qemu-options.def: $(SRC_PATH)/qemu-options.hx
+ $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $@")
+
+SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
+
+subdir-%: $(GENERATED_HEADERS)
+ $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)
+
+ifneq ($(wildcard config-host.mak),)
+include $(SRC_PATH)/Makefile.objs
+endif
+
+$(common-obj-y): $(GENERATED_HEADERS)
+subdir-libcacard: $(oslib-obj-y) $(trace-obj-y) qemu-malloc.o qemu-timer-common.o
+
+$(filter %-softmmu,$(SUBDIR_RULES)): $(trace-obj-y) $(common-obj-y) subdir-libdis
+
+$(filter %-user,$(SUBDIR_RULES)): $(GENERATED_HEADERS) $(trace-obj-y) subdir-libdis-user subdir-libuser
+
+ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))
+romsubdir-%:
+ $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C pc-bios/$* V="$(V)" TARGET_DIR="$*/",)
+
+ALL_SUBDIRS=$(TARGET_DIRS) $(patsubst %,pc-bios/%, $(ROMS))
+
+recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES)
+
+audio/audio.o audio/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS)
+
+QEMU_CFLAGS+=$(CURL_CFLAGS)
+
+QEMU_CFLAGS+=$(GLIB_CFLAGS)
+
+ui/cocoa.o: ui/cocoa.m
+
+ui/sdl.o audio/sdlaudio.o ui/sdl_zoom.o baum.o: QEMU_CFLAGS += $(SDL_CFLAGS)
+
+ui/vnc.o: QEMU_CFLAGS += $(VNC_TLS_CFLAGS)
+
+bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS)
+
+version.o: $(SRC_PATH)/version.rc config-host.mak
+ $(call quiet-command,$(WINDRES) -I. -o $@ $<," RC $(TARGET_DIR)$@")
+
+version-obj-$(CONFIG_WIN32) += version.o
+######################################################################
+# Support building shared library libcacard
+
+.PHONY: libcacard.la install-libcacard
+ifeq ($(LIBTOOL),)
+libcacard.la:
+ @echo "libtool is missing, please install and rerun configure"; exit 1
+
+install-libcacard:
+ @echo "libtool is missing, please install and rerun configure"; exit 1
+else
+libcacard.la: $(GENERATED_HEADERS) $(oslib-obj-y) qemu-malloc.o qemu-timer-common.o $(addsuffix .lo, $(basename $(trace-obj-y)))
+ $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libcacard V="$(V)" TARGET_DIR="$*/" libcacard.la,)
+
+install-libcacard: libcacard.la
+ $(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C libcacard V="$(V)" TARGET_DIR="$*/" install-libcacard,)
+endif
+######################################################################
+
+qemu-img.o: qemu-img-cmds.h
+qemu-img.o qemu-tool.o qemu-nbd.o qemu-io.o cmd.o qemu-ga.o: $(GENERATED_HEADERS)
+
+qemu-img$(EXESUF): qemu-img.o qemu-tool.o qemu-error.o $(oslib-obj-y) $(trace-obj-y) $(block-obj-y) $(qobject-obj-y) $(version-obj-y) qemu-timer-common.o
+
+qemu-nbd$(EXESUF): qemu-nbd.o qemu-tool.o qemu-error.o $(oslib-obj-y) $(trace-obj-y) $(block-obj-y) $(qobject-obj-y) $(version-obj-y) qemu-timer-common.o
+
+qemu-io$(EXESUF): qemu-io.o cmd.o qemu-tool.o qemu-error.o $(oslib-obj-y) $(trace-obj-y) $(block-obj-y) $(qobject-obj-y) $(version-obj-y) qemu-timer-common.o
+
+qemu-img-cmds.h: $(SRC_PATH)/qemu-img-cmds.hx
+ $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $@")
+
+check-qint.o check-qstring.o check-qdict.o check-qlist.o check-qfloat.o check-qjson.o: $(GENERATED_HEADERS)
+
+CHECK_PROG_DEPS = qemu-malloc.o $(oslib-obj-y) $(trace-obj-y) qemu-tool.o
+
+check-qint: check-qint.o qint.o $(CHECK_PROG_DEPS)
+check-qstring: check-qstring.o qstring.o $(CHECK_PROG_DEPS)
+check-qdict: check-qdict.o qdict.o qfloat.o qint.o qstring.o qbool.o qlist.o $(CHECK_PROG_DEPS)
+check-qlist: check-qlist.o qlist.o qint.o $(CHECK_PROG_DEPS)
+check-qfloat: check-qfloat.o qfloat.o $(CHECK_PROG_DEPS)
+check-qjson: check-qjson.o qfloat.o qint.o qdict.o qstring.o qlist.o qbool.o qjson.o json-streamer.o json-lexer.o json-parser.o error.o qerror.o qemu-error.o $(CHECK_PROG_DEPS)
+
+$(qapi-obj-y): $(GENERATED_HEADERS)
+qapi-dir := qapi-generated
+test-visitor.o test-qmp-commands.o qemu-ga$(EXESUF): QEMU_CFLAGS += -I $(qapi-dir)
+
+$(qapi-dir)/test-qapi-types.c: $(qapi-dir)/test-qapi-types.h
+$(qapi-dir)/test-qapi-types.h: $(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-types.py
+ $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py -o "$(qapi-dir)" -p "test-" < $<, " GEN $@")
+$(qapi-dir)/test-qapi-visit.c: $(qapi-dir)/test-qapi-visit.h
+$(qapi-dir)/test-qapi-visit.h: $(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-visit.py
+ $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py -o "$(qapi-dir)" -p "test-" < $<, " GEN $@")
+$(qapi-dir)/test-qmp-commands.h: $(qapi-dir)/test-qmp-marshal.c
+$(qapi-dir)/test-qmp-marshal.c: $(SRC_PATH)/qapi-schema-test.json $(SRC_PATH)/scripts/qapi-commands.py
+ $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py -o "$(qapi-dir)" -p "test-" < $<, " GEN $@")
+
+$(qapi-dir)/qga-qapi-types.c: $(qapi-dir)/qga-qapi-types.h
+$(qapi-dir)/qga-qapi-types.h: $(SRC_PATH)/qapi-schema-guest.json $(SRC_PATH)/scripts/qapi-types.py
+ $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-types.py -o "$(qapi-dir)" -p "qga-" < $<, " GEN $@")
+$(qapi-dir)/qga-qapi-visit.c: $(qapi-dir)/qga-qapi-visit.h
+$(qapi-dir)/qga-qapi-visit.h: $(SRC_PATH)/qapi-schema-guest.json $(SRC_PATH)/scripts/qapi-visit.py
+ $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-visit.py -o "$(qapi-dir)" -p "qga-" < $<, " GEN $@")
+$(qapi-dir)/qga-qmp-marshal.c: $(SRC_PATH)/qapi-schema-guest.json $(SRC_PATH)/scripts/qapi-commands.py
+ $(call quiet-command,$(PYTHON) $(SRC_PATH)/scripts/qapi-commands.py -o "$(qapi-dir)" -p "qga-" < $<, " GEN $@")
+
+test-visitor.o: $(addprefix $(qapi-dir)/, test-qapi-types.c test-qapi-types.h test-qapi-visit.c test-qapi-visit.h) $(qapi-obj-y)
+test-visitor: test-visitor.o qfloat.o qint.o qdict.o qstring.o qlist.o qbool.o $(qapi-obj-y) error.o osdep.o qemu-malloc.o $(oslib-obj-y) qjson.o json-streamer.o json-lexer.o json-parser.o qerror.o qemu-error.o qemu-tool.o $(qapi-dir)/test-qapi-visit.o $(qapi-dir)/test-qapi-types.o
+
+test-qmp-commands.o: $(addprefix $(qapi-dir)/, test-qapi-types.c test-qapi-types.h test-qapi-visit.c test-qapi-visit.h test-qmp-marshal.c test-qmp-commands.h) $(qapi-obj-y)
+test-qmp-commands: test-qmp-commands.o qfloat.o qint.o qdict.o qstring.o qlist.o qbool.o $(qapi-obj-y) error.o osdep.o qemu-malloc.o $(oslib-obj-y) qjson.o json-streamer.o json-lexer.o json-parser.o qerror.o qemu-error.o qemu-tool.o $(qapi-dir)/test-qapi-visit.o $(qapi-dir)/test-qapi-types.o $(qapi-dir)/test-qmp-marshal.o module.o
+
+QGALIB=qga/guest-agent-command-state.o qga/guest-agent-commands.o
+QGALIB_GEN=$(addprefix $(qapi-dir)/, qga-qapi-types.c qga-qapi-types.h qga-qapi-visit.c qga-qmp-marshal.c)
+
+$(QGALIB_GEN): $(GENERATED_HEADERS)
+$(QGALIB) qemu-ga.o: $(QGALIB_GEN) $(qapi-obj-y)
+qemu-ga$(EXESUF): qemu-ga.o $(QGALIB) qemu-tool.o qemu-error.o error.o $(oslib-obj-y) $(trace-obj-y) $(block-obj-y) $(qobject-obj-y) $(version-obj-y) $(qapi-obj-y) qemu-timer-common.o qemu-sockets.o module.o qapi/qmp-dispatch.o qapi/qmp-registry.o $(qapi-dir)/qga-qapi-visit.o $(qapi-dir)/qga-qapi-types.o $(qapi-dir)/qga-qmp-marshal.o
+
+QEMULIBS=libhw32 libhw64 libuser libdis libdis-user
+
+clean:
+# avoid old build problems by removing potentially incorrect old files
+ rm -f config.mak op-i386.h opc-i386.h gen-op-i386.h op-arm.h opc-arm.h gen-op-arm.h
+ rm -f qemu-options.def
+ rm -f *.o *.d *.a *.lo $(TOOLS) qemu-ga TAGS cscope.* *.pod *~ */*~
+ rm -Rf .libs
+ rm -f slirp/*.o slirp/*.d audio/*.o audio/*.d block/*.o block/*.d net/*.o net/*.d fsdev/*.o fsdev/*.d ui/*.o ui/*.d qapi/*.o qapi/*.d qga/*.o qga/*.d
+ rm -f qemu-img-cmds.h
+ rm -f trace.c trace.h trace.c-timestamp trace.h-timestamp
+ rm -f trace-dtrace.dtrace trace-dtrace.dtrace-timestamp
+ rm -f trace-dtrace.h trace-dtrace.h-timestamp
+ rm -rf $(qapi-dir)
+ $(MAKE) -C tests clean
+ for d in $(ALL_SUBDIRS) $(QEMULIBS) libcacard; do \
+ if test -d $$d; then $(MAKE) -C $$d $@ || exit 1; fi; \
+ rm -f $$d/qemu-options.def; \
+ done
+
+distclean: clean
+ rm -f config-host.mak config-host.h* config-host.ld $(DOCS) qemu-options.texi qemu-img-cmds.texi qemu-monitor.texi
+ rm -f config-all-devices.mak
+ rm -f roms/seabios/config.mak roms/vgabios/config.mak
+ rm -f qemu-doc.info qemu-doc.aux qemu-doc.cp qemu-doc.cps qemu-doc.dvi
+ rm -f qemu-doc.fn qemu-doc.fns qemu-doc.info qemu-doc.ky qemu-doc.kys
+ rm -f qemu-doc.log qemu-doc.pdf qemu-doc.pg qemu-doc.toc qemu-doc.tp
+ rm -f qemu-doc.vr
+ rm -f qemu-tech.info qemu-tech.aux qemu-tech.cp qemu-tech.dvi qemu-tech.fn qemu-tech.info qemu-tech.ky qemu-tech.log qemu-tech.pdf qemu-tech.pg qemu-tech.toc qemu-tech.tp qemu-tech.vr
+ for d in $(TARGET_DIRS) $(QEMULIBS); do \
+ rm -rf $$d || exit 1 ; \
+ done
+
+KEYMAPS=da en-gb et fr fr-ch is lt modifiers no pt-br sv \
+ar de en-us fi fr-be hr it lv nl pl ru th \
+common de-ch es fo fr-ca hu ja mk nl-be pt sl tr
+
+ifdef INSTALL_BLOBS
+BLOBS=bios.bin vgabios.bin vgabios-cirrus.bin \
+vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin \
+ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc \
+pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom \
+pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom \
+bamboo.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb \
+mpc8544ds.dtb \
+multiboot.bin linuxboot.bin \
+s390-zipl.rom \
+spapr-rtas.bin slof.bin
+else
+BLOBS=
+endif
+
+install-doc: $(DOCS)
+ $(INSTALL_DIR) "$(DESTDIR)$(docdir)"
+ $(INSTALL_DATA) qemu-doc.html qemu-tech.html "$(DESTDIR)$(docdir)"
+ifdef CONFIG_POSIX
+ $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man1"
+ $(INSTALL_DATA) qemu.1 qemu-img.1 "$(DESTDIR)$(mandir)/man1"
+ $(INSTALL_DIR) "$(DESTDIR)$(mandir)/man8"
+ $(INSTALL_DATA) qemu-nbd.8 "$(DESTDIR)$(mandir)/man8"
+endif
+
+install-sysconfig:
+ $(INSTALL_DIR) "$(DESTDIR)$(sysconfdir)/qemu"
+ $(INSTALL_DATA) $(SRC_PATH)/sysconfigs/target/target-x86_64.conf "$(DESTDIR)$(sysconfdir)/qemu"
+
+install: all $(if $(BUILD_DOCS),install-doc) install-sysconfig
+ $(INSTALL_DIR) "$(DESTDIR)$(bindir)"
+ifneq ($(TOOLS),)
+ $(INSTALL_PROG) $(STRIP_OPT) $(TOOLS) "$(DESTDIR)$(bindir)"
+endif
+ifneq ($(BLOBS),)
+ $(INSTALL_DIR) "$(DESTDIR)$(datadir)"
+ set -e; for x in $(BLOBS); do \
+ $(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(datadir)"; \
+ done
+endif
+ $(INSTALL_DIR) "$(DESTDIR)$(datadir)/keymaps"
+ set -e; for x in $(KEYMAPS); do \
+ $(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(datadir)/keymaps"; \
+ done
+ for d in $(TARGET_DIRS); do \
+ $(MAKE) -C $$d $@ || exit 1 ; \
+ done
+
+# various test targets
+test speed: all
+ $(MAKE) -C tests $@
+
+.PHONY: TAGS
+TAGS:
+ find "$(SRC_PATH)" -name '*.[hc]' -print0 | xargs -0 etags
+
+cscope:
+ rm -f ./cscope.*
+ find . -name "*.[ch]" -print | sed 's,^\./,,' > ./cscope.files
+ cscope -b
+
+# documentation
+MAKEINFO=makeinfo
+MAKEINFOFLAGS=--no-headers --no-split --number-sections
+TEXIFLAG=$(if $(V),,--quiet)
+%.dvi: %.texi
+ $(call quiet-command,texi2dvi $(TEXIFLAG) -I . $<," GEN $@")
+
+%.html: %.texi
+ $(call quiet-command,$(MAKEINFO) $(MAKEINFOFLAGS) --html $< -o $@, \
+ " GEN $@")
+
+%.info: %.texi
+ $(call quiet-command,$(MAKEINFO) $< -o $@," GEN $@")
+
+%.pdf: %.texi
+ $(call quiet-command,texi2pdf $(TEXIFLAG) -I . $<," GEN $@")
+
+qemu-options.texi: $(SRC_PATH)/qemu-options.hx
+ $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@," GEN $@")
+
+qemu-monitor.texi: $(SRC_PATH)/hmp-commands.hx
+ $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@," GEN $@")
+
+QMP/qmp-commands.txt: $(SRC_PATH)/qmp-commands.hx
+ $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -q < $< > $@," GEN $@")
+
+qemu-img-cmds.texi: $(SRC_PATH)/qemu-img-cmds.hx
+ $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -t < $< > $@," GEN $@")
+
+qemu.1: qemu-doc.texi qemu-options.texi qemu-monitor.texi
+ $(call quiet-command, \
+ perl -Ww -- $(SRC_PATH)/scripts/texi2pod.pl $< qemu.pod && \
+ pod2man --section=1 --center=" " --release=" " qemu.pod > $@, \
+ " GEN $@")
+
+qemu-img.1: qemu-img.texi qemu-img-cmds.texi
+ $(call quiet-command, \
+ perl -Ww -- $(SRC_PATH)/scripts/texi2pod.pl $< qemu-img.pod && \
+ pod2man --section=1 --center=" " --release=" " qemu-img.pod > $@, \
+ " GEN $@")
+
+qemu-nbd.8: qemu-nbd.texi
+ $(call quiet-command, \
+ perl -Ww -- $(SRC_PATH)/scripts/texi2pod.pl $< qemu-nbd.pod && \
+ pod2man --section=8 --center=" " --release=" " qemu-nbd.pod > $@, \
+ " GEN $@")
+
+dvi: qemu-doc.dvi qemu-tech.dvi
+html: qemu-doc.html qemu-tech.html
+info: qemu-doc.info qemu-tech.info
+pdf: qemu-doc.pdf qemu-tech.pdf
+
+qemu-doc.dvi qemu-doc.html qemu-doc.info qemu-doc.pdf: \
+ qemu-img.texi qemu-nbd.texi qemu-options.texi \
+ qemu-monitor.texi qemu-img-cmds.texi
+
+VERSION ?= $(shell cat VERSION)
+FILE = qemu-$(VERSION)
+
+# tar release (use 'make -k tar' on a checkouted tree)
+tar:
+ rm -rf /tmp/$(FILE)
+ cp -r . /tmp/$(FILE)
+ cd /tmp && tar zcvf ~/$(FILE).tar.gz $(FILE) --exclude CVS --exclude .git --exclude .svn
+ rm -rf /tmp/$(FILE)
+
+SYSTEM_TARGETS=$(filter %-softmmu,$(TARGET_DIRS))
+SYSTEM_PROGS=$(patsubst qemu-system-i386,qemu, \
+ $(patsubst %-softmmu,qemu-system-%, \
+ $(SYSTEM_TARGETS)))
+
+USER_TARGETS=$(filter %-user,$(TARGET_DIRS))
+USER_PROGS=$(patsubst %-bsd-user,qemu-%, \
+ $(patsubst %-darwin-user,qemu-%, \
+ $(patsubst %-linux-user,qemu-%, \
+ $(USER_TARGETS))))
+
+# generate a binary distribution
+tarbin:
+ cd / && tar zcvf ~/qemu-$(VERSION)-$(ARCH).tar.gz \
+ $(patsubst %,$(bindir)/%, $(SYSTEM_PROGS)) \
+ $(patsubst %,$(bindir)/%, $(USER_PROGS)) \
+ $(bindir)/qemu-img \
+ $(bindir)/qemu-nbd \
+ $(datadir)/bios.bin \
+ $(datadir)/vgabios.bin \
+ $(datadir)/vgabios-cirrus.bin \
+ $(datadir)/ppc_rom.bin \
+ $(datadir)/openbios-sparc32 \
+ $(datadir)/openbios-sparc64 \
+ $(datadir)/openbios-ppc \
+ $(datadir)/pxe-e1000.rom \
+ $(datadir)/pxe-eepro100.rom \
+ $(datadir)/pxe-ne2k_pci.rom \
+ $(datadir)/pxe-pcnet.rom \
+ $(datadir)/pxe-rtl8139.rom \
+ $(datadir)/pxe-virtio.rom \
+ $(docdir)/qemu-doc.html \
+ $(docdir)/qemu-tech.html \
+ $(mandir)/man1/qemu.1 \
+ $(mandir)/man1/qemu-img.1 \
+ $(mandir)/man8/qemu-nbd.8
+
+# Include automatically generated dependency files
+-include $(wildcard *.d audio/*.d slirp/*.d block/*.d net/*.d ui/*.d qapi/*.d qga/*.d)
diff --git a/qemu-0.15.x/Makefile.dis b/qemu-0.15.x/Makefile.dis
new file mode 100644
index 0000000..3e1fcaf
--- /dev/null
+++ b/qemu-0.15.x/Makefile.dis
@@ -0,0 +1,23 @@
+# Makefile for disassemblers.
+
+include ../config-host.mak
+include config.mak
+include $(SRC_PATH)/rules.mak
+
+.PHONY: all
+
+$(call set-vpath, $(SRC_PATH))
+
+QEMU_CFLAGS+=-I..
+
+include $(SRC_PATH)/Makefile.objs
+
+all: $(libdis-y)
+# Dummy command so that make thinks it has done something
+ @true
+
+clean:
+ rm -f *.o *.d *.a *~
+
+# Include automatically generated dependency files
+-include $(wildcard *.d */*.d)
diff --git a/qemu-0.15.x/Makefile.hw b/qemu-0.15.x/Makefile.hw
new file mode 100644
index 0000000..b9181ab
--- /dev/null
+++ b/qemu-0.15.x/Makefile.hw
@@ -0,0 +1,24 @@
+# Makefile for qemu target independent devices.
+
+include ../config-host.mak
+include ../config-all-devices.mak
+include config.mak
+include $(SRC_PATH)/rules.mak
+
+.PHONY: all
+
+$(call set-vpath, $(SRC_PATH):$(SRC_PATH)/hw)
+
+QEMU_CFLAGS+=-I.. -I$(SRC_PATH)/fpu
+
+include $(SRC_PATH)/Makefile.objs
+
+all: $(hw-obj-y)
+# Dummy command so that make thinks it has done something
+ @true
+
+clean:
+ rm -f *.o */*.o *.d */*.d *.a */*.a *~ */*~
+
+# Include automatically generated dependency files
+-include $(wildcard *.d */*.d)
diff --git a/qemu-0.15.x/Makefile.objs b/qemu-0.15.x/Makefile.objs
new file mode 100644
index 0000000..6991a9f
--- /dev/null
+++ b/qemu-0.15.x/Makefile.objs
@@ -0,0 +1,387 @@
+#######################################################################
+# QObject
+qobject-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
+qobject-obj-y += qjson.o json-lexer.o json-streamer.o json-parser.o
+qobject-obj-y += qerror.o error.o
+
+#######################################################################
+# oslib-obj-y is code depending on the OS (win32 vs posix)
+oslib-obj-y = osdep.o
+oslib-obj-$(CONFIG_WIN32) += oslib-win32.o qemu-thread-win32.o
+oslib-obj-$(CONFIG_POSIX) += oslib-posix.o qemu-thread-posix.o
+
+#######################################################################
+# block-obj-y is code used by both qemu system emulation and qemu-img
+
+block-obj-y = cutils.o cache-utils.o qemu-malloc.o qemu-option.o module.o async.o
+block-obj-y += nbd.o block.o aio.o aes.o qemu-config.o qemu-progress.o qemu-sockets.o
+block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
+block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
+
+block-nested-y += raw.o cow.o qcow.o vdi.o vmdk.o cloop.o dmg.o bochs.o vpc.o vvfat.o
+block-nested-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o qcow2-cache.o
+block-nested-y += qed.o qed-gencb.o qed-l2-cache.o qed-table.o qed-cluster.o
+block-nested-y += qed-check.o
+block-nested-y += parallels.o nbd.o blkdebug.o sheepdog.o blkverify.o
+block-nested-$(CONFIG_WIN32) += raw-win32.o
+block-nested-$(CONFIG_POSIX) += raw-posix.o
+block-nested-$(CONFIG_CURL) += curl.o
+block-nested-$(CONFIG_RBD) += rbd.o
+
+block-obj-y += $(addprefix block/, $(block-nested-y))
+
+net-obj-y = net.o
+net-nested-y = queue.o checksum.o util.o
+net-nested-y += socket.o
+net-nested-y += dump.o
+net-nested-$(CONFIG_POSIX) += tap.o
+net-nested-$(CONFIG_LINUX) += tap-linux.o
+net-nested-$(CONFIG_WIN32) += tap-win32.o
+net-nested-$(CONFIG_BSD) += tap-bsd.o
+net-nested-$(CONFIG_SOLARIS) += tap-solaris.o
+net-nested-$(CONFIG_AIX) += tap-aix.o
+net-nested-$(CONFIG_HAIKU) += tap-haiku.o
+net-nested-$(CONFIG_SLIRP) += slirp.o
+net-nested-$(CONFIG_VDE) += vde.o
+net-obj-y += $(addprefix net/, $(net-nested-y))
+
+ifeq ($(CONFIG_VIRTIO)$(CONFIG_VIRTFS)$(CONFIG_PCI),yyy)
+# Lots of the fsdev/9pcode is pulled in by vl.c via qemu_fsdev_add.
+# only pull in the actual virtio-9p device if we also enabled virtio.
+CONFIG_REALLY_VIRTFS=y
+fsdev-nested-y = qemu-fsdev.o
+else
+fsdev-nested-y = qemu-fsdev-dummy.o
+endif
+fsdev-obj-$(CONFIG_VIRTFS) += $(addprefix fsdev/, $(fsdev-nested-y))
+
+######################################################################
+# libqemu_common.a: Target independent part of system emulation. The
+# long term path is to suppress *all* target specific code in case of
+# system emulation, i.e. a single QEMU executable should support all
+# CPUs and machines.
+
+common-obj-y = $(block-obj-y) blockdev.o
+common-obj-y += $(net-obj-y)
+common-obj-y += $(qobject-obj-y)
+common-obj-$(CONFIG_LINUX) += $(fsdev-obj-$(CONFIG_LINUX))
+common-obj-y += readline.o console.o cursor.o qemu-error.o
+common-obj-y += $(oslib-obj-y)
+common-obj-$(CONFIG_WIN32) += os-win32.o
+common-obj-$(CONFIG_POSIX) += os-posix.o
+
+common-obj-y += tcg-runtime.o host-utils.o
+common-obj-y += irq.o ioport.o input.o
+common-obj-$(CONFIG_PTIMER) += ptimer.o
+common-obj-$(CONFIG_MAX7310) += max7310.o
+common-obj-$(CONFIG_WM8750) += wm8750.o
+common-obj-$(CONFIG_TWL92230) += twl92230.o
+common-obj-$(CONFIG_TSC2005) += tsc2005.o
+common-obj-$(CONFIG_LM832X) += lm832x.o
+common-obj-$(CONFIG_TMP105) += tmp105.o
+common-obj-$(CONFIG_STELLARIS_INPUT) += stellaris_input.o
+common-obj-$(CONFIG_SSD0303) += ssd0303.o
+common-obj-$(CONFIG_SSD0323) += ssd0323.o
+common-obj-$(CONFIG_ADS7846) += ads7846.o
+common-obj-$(CONFIG_MAX111X) += max111x.o
+common-obj-$(CONFIG_DS1338) += ds1338.o
+common-obj-y += i2c.o smbus.o smbus_eeprom.o
+common-obj-y += eeprom93xx.o
+common-obj-y += scsi-disk.o cdrom.o
+common-obj-y += scsi-generic.o scsi-bus.o
+common-obj-y += usb.o usb-hub.o usb-$(HOST_USB).o usb-hid.o usb-msd.o usb-wacom.o
+common-obj-y += usb-serial.o usb-net.o usb-bus.o usb-desc.o
+common-obj-$(CONFIG_SSI) += ssi.o
+common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
+common-obj-$(CONFIG_SD) += sd.o
+common-obj-y += bt.o bt-host.o bt-vhci.o bt-l2cap.o bt-sdp.o bt-hci.o bt-hid.o usb-bt.o
+common-obj-y += bt-hci-csr.o
+common-obj-y += buffered_file.o migration.o migration-tcp.o
+common-obj-y += qemu-char.o savevm.o #aio.o
+common-obj-y += msmouse.o ps2.o
+common-obj-y += qdev.o qdev-properties.o
+common-obj-y += block-migration.o iohandler.o
+common-obj-y += pflib.o
+common-obj-y += bitmap.o bitops.o
+
+common-obj-$(CONFIG_BRLAPI) += baum.o
+common-obj-$(CONFIG_POSIX) += migration-exec.o migration-unix.o migration-fd.o
+common-obj-$(CONFIG_WIN32) += version.o
+
+common-obj-$(CONFIG_SPICE) += ui/spice-core.o ui/spice-input.o ui/spice-display.o spice-qemu-char.o
+
+audio-obj-y = audio.o noaudio.o wavaudio.o mixeng.o
+audio-obj-$(CONFIG_SDL) += sdlaudio.o
+audio-obj-$(CONFIG_OSS) += ossaudio.o
+audio-obj-$(CONFIG_SPICE) += spiceaudio.o
+audio-obj-$(CONFIG_COREAUDIO) += coreaudio.o
+audio-obj-$(CONFIG_ALSA) += alsaaudio.o
+audio-obj-$(CONFIG_DSOUND) += dsoundaudio.o
+audio-obj-$(CONFIG_FMOD) += fmodaudio.o
+audio-obj-$(CONFIG_ESD) += esdaudio.o
+audio-obj-$(CONFIG_PA) += paaudio.o
+audio-obj-$(CONFIG_WINWAVE) += winwaveaudio.o
+audio-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o
+audio-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o
+audio-obj-y += wavcapture.o
+common-obj-y += $(addprefix audio/, $(audio-obj-y))
+
+ui-obj-y += keymaps.o
+ui-obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o
+ui-obj-$(CONFIG_COCOA) += cocoa.o
+ui-obj-$(CONFIG_CURSES) += curses.o
+vnc-obj-y += vnc.o d3des.o
+vnc-obj-y += vnc-enc-zlib.o vnc-enc-hextile.o
+vnc-obj-y += vnc-enc-tight.o vnc-palette.o
+vnc-obj-y += vnc-enc-zrle.o
+vnc-obj-$(CONFIG_VNC_TLS) += vnc-tls.o vnc-auth-vencrypt.o
+vnc-obj-$(CONFIG_VNC_SASL) += vnc-auth-sasl.o
+ifdef CONFIG_VNC_THREAD
+vnc-obj-y += vnc-jobs-async.o
+else
+vnc-obj-y += vnc-jobs-sync.o
+endif
+common-obj-y += $(addprefix ui/, $(ui-obj-y))
+common-obj-$(CONFIG_VNC) += $(addprefix ui/, $(vnc-obj-y))
+
+common-obj-y += iov.o acl.o
+common-obj-$(CONFIG_POSIX) += compatfd.o
+common-obj-y += notify.o event_notifier.o
+common-obj-y += qemu-timer.o qemu-timer-common.o
+
+slirp-obj-y = cksum.o if.o ip_icmp.o ip_input.o ip_output.o
+slirp-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
+slirp-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o
+common-obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y))
+
+# xen backend driver support
+common-obj-$(CONFIG_XEN_BACKEND) += xen_backend.o xen_devconfig.o
+common-obj-$(CONFIG_XEN_BACKEND) += xen_console.o xenfb.o xen_disk.o xen_nic.o
+
+######################################################################
+# libuser
+
+user-obj-y =
+user-obj-y += envlist.o path.o
+user-obj-y += tcg-runtime.o host-utils.o
+user-obj-y += cutils.o cache-utils.o
+
+######################################################################
+# libhw
+
+hw-obj-y =
+hw-obj-y += vl.o loader.o
+hw-obj-$(CONFIG_VIRTIO) += virtio-console.o
+hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
+hw-obj-y += fw_cfg.o
+hw-obj-$(CONFIG_PCI) += pci.o pci_bridge.o
+hw-obj-$(CONFIG_PCI) += msix.o msi.o
+hw-obj-$(CONFIG_PCI) += pci_host.o pcie_host.o
+hw-obj-$(CONFIG_PCI) += ioh3420.o xio3130_upstream.o xio3130_downstream.o
+hw-obj-y += watchdog.o
+hw-obj-$(CONFIG_ISA_MMIO) += isa_mmio.o
+hw-obj-$(CONFIG_ECC) += ecc.o
+hw-obj-$(CONFIG_NAND) += nand.o
+hw-obj-$(CONFIG_PFLASH_CFI01) += pflash_cfi01.o
+hw-obj-$(CONFIG_PFLASH_CFI02) += pflash_cfi02.o
+
+hw-obj-$(CONFIG_M48T59) += m48t59.o
+hw-obj-$(CONFIG_ESCC) += escc.o
+hw-obj-$(CONFIG_EMPTY_SLOT) += empty_slot.o
+
+hw-obj-$(CONFIG_SERIAL) += serial.o
+hw-obj-$(CONFIG_PARALLEL) += parallel.o
+hw-obj-$(CONFIG_I8254) += i8254.o
+hw-obj-$(CONFIG_PCSPK) += pcspk.o
+hw-obj-$(CONFIG_PCKBD) += pckbd.o
+hw-obj-$(CONFIG_USB_UHCI) += usb-uhci.o
+hw-obj-$(CONFIG_USB_OHCI) += usb-ohci.o
+hw-obj-$(CONFIG_USB_EHCI) += usb-ehci.o
+hw-obj-$(CONFIG_FDC) += fdc.o
+hw-obj-$(CONFIG_ACPI) += acpi.o acpi_piix4.o
+hw-obj-$(CONFIG_APM) += pm_smbus.o apm.o
+hw-obj-$(CONFIG_DMA) += dma.o
+hw-obj-$(CONFIG_HPET) += hpet.o
+hw-obj-$(CONFIG_APPLESMC) += applesmc.o
+hw-obj-$(CONFIG_SMARTCARD) += usb-ccid.o ccid-card-passthru.o
+hw-obj-$(CONFIG_SMARTCARD_NSS) += ccid-card-emulated.o
+hw-obj-$(CONFIG_USB_REDIR) += usb-redir.o
+
+# PPC devices
+hw-obj-$(CONFIG_OPENPIC) += openpic.o
+hw-obj-$(CONFIG_PREP_PCI) += prep_pci.o
+# Mac shared devices
+hw-obj-$(CONFIG_MACIO) += macio.o
+hw-obj-$(CONFIG_CUDA) += cuda.o
+hw-obj-$(CONFIG_ADB) += adb.o
+hw-obj-$(CONFIG_MAC_NVRAM) += mac_nvram.o
+hw-obj-$(CONFIG_MAC_DBDMA) += mac_dbdma.o
+# OldWorld PowerMac
+hw-obj-$(CONFIG_HEATHROW_PIC) += heathrow_pic.o
+hw-obj-$(CONFIG_GRACKLE_PCI) += grackle_pci.o
+# NewWorld PowerMac
+hw-obj-$(CONFIG_UNIN_PCI) += unin_pci.o
+hw-obj-$(CONFIG_DEC_PCI) += dec_pci.o
+# PowerPC E500 boards
+hw-obj-$(CONFIG_PPCE500_PCI) += ppce500_pci.o
+
+# MIPS devices
+hw-obj-$(CONFIG_PIIX4) += piix4.o
+
+# PCI watchdog devices
+hw-obj-$(CONFIG_PCI) += wdt_i6300esb.o
+
+hw-obj-$(CONFIG_PCI) += pcie.o pcie_aer.o pcie_port.o
+
+# PCI network cards
+hw-obj-$(CONFIG_NE2000_PCI) += ne2000.o
+hw-obj-$(CONFIG_EEPRO100_PCI) += eepro100.o
+hw-obj-$(CONFIG_PCNET_PCI) += pcnet-pci.o
+hw-obj-$(CONFIG_PCNET_COMMON) += pcnet.o
+hw-obj-$(CONFIG_E1000_PCI) += e1000.o
+hw-obj-$(CONFIG_RTL8139_PCI) += rtl8139.o
+
+hw-obj-$(CONFIG_SMC91C111) += smc91c111.o
+hw-obj-$(CONFIG_LAN9118) += lan9118.o
+hw-obj-$(CONFIG_NE2000_ISA) += ne2000-isa.o
+
+# IDE
+hw-obj-$(CONFIG_IDE_CORE) += ide/core.o ide/atapi.o
+hw-obj-$(CONFIG_IDE_QDEV) += ide/qdev.o
+hw-obj-$(CONFIG_IDE_PCI) += ide/pci.o
+hw-obj-$(CONFIG_IDE_ISA) += ide/isa.o
+hw-obj-$(CONFIG_IDE_PIIX) += ide/piix.o
+hw-obj-$(CONFIG_IDE_CMD646) += ide/cmd646.o
+hw-obj-$(CONFIG_IDE_MACIO) += ide/macio.o
+hw-obj-$(CONFIG_IDE_VIA) += ide/via.o
+hw-obj-$(CONFIG_AHCI) += ide/ahci.o
+hw-obj-$(CONFIG_AHCI) += ide/ich.o
+
+# SCSI layer
+hw-obj-$(CONFIG_LSI_SCSI_PCI) += lsi53c895a.o
+hw-obj-$(CONFIG_ESP) += esp.o
+
+hw-obj-y += dma-helpers.o sysbus.o isa-bus.o
+hw-obj-y += qdev-addr.o
+
+# VGA
+hw-obj-$(CONFIG_VGA_PCI) += vga-pci.o
+hw-obj-$(CONFIG_VGA_ISA) += vga-isa.o
+hw-obj-$(CONFIG_VGA_ISA_MM) += vga-isa-mm.o
+hw-obj-$(CONFIG_VMWARE_VGA) += vmware_vga.o
+hw-obj-$(CONFIG_VMMOUSE) += vmmouse.o
+
+hw-obj-$(CONFIG_RC4030) += rc4030.o
+hw-obj-$(CONFIG_DP8393X) += dp8393x.o
+hw-obj-$(CONFIG_DS1225Y) += ds1225y.o
+hw-obj-$(CONFIG_MIPSNET) += mipsnet.o
+
+# Sound
+sound-obj-y =
+sound-obj-$(CONFIG_SB16) += sb16.o
+sound-obj-$(CONFIG_ES1370) += es1370.o
+sound-obj-$(CONFIG_AC97) += ac97.o
+sound-obj-$(CONFIG_ADLIB) += fmopl.o adlib.o
+sound-obj-$(CONFIG_GUS) += gus.o gusemu_hal.o gusemu_mixer.o
+sound-obj-$(CONFIG_CS4231A) += cs4231a.o
+sound-obj-$(CONFIG_HDA) += intel-hda.o hda-audio.o
+
+adlib.o fmopl.o: QEMU_CFLAGS += -DBUILD_Y8950=0
+hw-obj-$(CONFIG_SOUND) += $(sound-obj-y)
+
+9pfs-nested-$(CONFIG_VIRTFS) = virtio-9p.o virtio-9p-debug.o
+9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-local.o virtio-9p-xattr.o
+9pfs-nested-$(CONFIG_VIRTFS) += virtio-9p-xattr-user.o virtio-9p-posix-acl.o
+
+hw-obj-$(CONFIG_REALLY_VIRTFS) += $(addprefix 9pfs/, $(9pfs-nested-y))
+
+
+######################################################################
+# libdis
+# NOTE: the disassembler code is only needed for debugging
+
+libdis-y =
+libdis-$(CONFIG_ALPHA_DIS) += alpha-dis.o
+libdis-$(CONFIG_ARM_DIS) += arm-dis.o
+libdis-$(CONFIG_CRIS_DIS) += cris-dis.o
+libdis-$(CONFIG_HPPA_DIS) += hppa-dis.o
+libdis-$(CONFIG_I386_DIS) += i386-dis.o
+libdis-$(CONFIG_IA64_DIS) += ia64-dis.o
+libdis-$(CONFIG_M68K_DIS) += m68k-dis.o
+libdis-$(CONFIG_MICROBLAZE_DIS) += microblaze-dis.o
+libdis-$(CONFIG_MIPS_DIS) += mips-dis.o
+libdis-$(CONFIG_PPC_DIS) += ppc-dis.o
+libdis-$(CONFIG_S390_DIS) += s390-dis.o
+libdis-$(CONFIG_SH4_DIS) += sh4-dis.o
+libdis-$(CONFIG_SPARC_DIS) += sparc-dis.o
+
+######################################################################
+# trace
+
+ifeq ($(TRACE_BACKEND),dtrace)
+trace.h: trace.h-timestamp trace-dtrace.h
+else
+trace.h: trace.h-timestamp
+endif
+trace.h-timestamp: $(SRC_PATH)/trace-events config-host.mak
+ $(call quiet-command,sh $(SRC_PATH)/scripts/tracetool --$(TRACE_BACKEND) -h < $< > $@," GEN trace.h")
+ @cmp -s $@ trace.h || cp $@ trace.h
+
+trace.c: trace.c-timestamp
+trace.c-timestamp: $(SRC_PATH)/trace-events config-host.mak
+ $(call quiet-command,sh $(SRC_PATH)/scripts/tracetool --$(TRACE_BACKEND) -c < $< > $@," GEN trace.c")
+ @cmp -s $@ trace.c || cp $@ trace.c
+
+trace.o: trace.c $(GENERATED_HEADERS)
+
+trace-dtrace.h: trace-dtrace.dtrace
+ $(call quiet-command,dtrace -o $@ -h -s $<, " GEN trace-dtrace.h")
+
+# Normal practice is to name DTrace probe file with a '.d' extension
+# but that gets picked up by QEMU's Makefile as an external dependency
+# rule file. So we use '.dtrace' instead
+trace-dtrace.dtrace: trace-dtrace.dtrace-timestamp
+trace-dtrace.dtrace-timestamp: $(SRC_PATH)/trace-events config-host.mak
+ $(call quiet-command,sh $(SRC_PATH)/scripts/tracetool --$(TRACE_BACKEND) -d < $< > $@," GEN trace-dtrace.dtrace")
+ @cmp -s $@ trace-dtrace.dtrace || cp $@ trace-dtrace.dtrace
+
+trace-dtrace.o: trace-dtrace.dtrace $(GENERATED_HEADERS)
+ $(call quiet-command,dtrace -o $@ -G -s $<, " GEN trace-dtrace.o")
+
+ifeq ($(LIBTOOL),)
+trace-dtrace.lo: trace-dtrace.dtrace
+ @echo "missing libtool. please install and rerun configure."; exit 1
+else
+trace-dtrace.lo: trace-dtrace.dtrace
+ $(call quiet-command,libtool --mode=compile --tag=CC dtrace -o $@ -G -s $<, " lt GEN trace-dtrace.o")
+endif
+
+simpletrace.o: simpletrace.c $(GENERATED_HEADERS)
+
+ifeq ($(TRACE_BACKEND),dtrace)
+trace-obj-y = trace-dtrace.o
+else
+trace-obj-y = trace.o
+ifeq ($(TRACE_BACKEND),simple)
+trace-obj-y += simpletrace.o
+user-obj-y += qemu-timer-common.o
+endif
+endif
+
+######################################################################
+# smartcard
+
+libcacard-y = cac.o event.o vcard.o vreader.o vcard_emul_nss.o vcard_emul_type.o card_7816.o
+
+######################################################################
+# qapi
+
+qapi-nested-y = qapi-visit-core.o qmp-input-visitor.o qmp-output-visitor.o qapi-dealloc-visitor.o
+qapi-nested-y += qmp-registry.o qmp-dispatch.o
+qapi-obj-y = $(addprefix qapi/, $(qapi-nested-y))
+
+vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
+
+vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
+
+vl.o: QEMU_CFLAGS+=$(GLIB_CFLAGS)
diff --git a/qemu-0.15.x/Makefile.target b/qemu-0.15.x/Makefile.target
new file mode 100644
index 0000000..cde509b
--- /dev/null
+++ b/qemu-0.15.x/Makefile.target
@@ -0,0 +1,431 @@
+# -*- Mode: makefile -*-
+
+GENERATED_HEADERS = config-target.h
+CONFIG_NO_PCI = $(if $(subst n,,$(CONFIG_PCI)),n,y)
+CONFIG_NO_KVM = $(if $(subst n,,$(CONFIG_KVM)),n,y)
+CONFIG_NO_XEN = $(if $(subst n,,$(CONFIG_XEN)),n,y)
+
+include ../config-host.mak
+include config-devices.mak
+include config-target.mak
+include $(SRC_PATH)/rules.mak
+ifneq ($(HWDIR),)
+include $(HWDIR)/config.mak
+endif
+
+TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
+$(call set-vpath, $(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw)
+ifdef CONFIG_LINUX
+QEMU_CFLAGS += -I../linux-headers
+endif
+QEMU_CFLAGS += -I.. -I$(TARGET_PATH) -DNEED_CPU_H
+
+include $(SRC_PATH)/Makefile.objs
+
+ifdef CONFIG_USER_ONLY
+# user emulator name
+QEMU_PROG=qemu-$(TARGET_ARCH2)
+else
+# system emulator name
+ifeq ($(TARGET_ARCH), i386)
+QEMU_PROG=qemu$(EXESUF)
+else
+QEMU_PROG=qemu-system-$(TARGET_ARCH2)$(EXESUF)
+endif
+endif
+
+PROGS=$(QEMU_PROG)
+STPFILES=
+
+ifndef CONFIG_HAIKU
+LIBS+=-lm
+endif
+
+config-target.h: config-target.h-timestamp
+config-target.h-timestamp: config-target.mak
+
+ifdef CONFIG_SYSTEMTAP_TRACE
+stap: $(QEMU_PROG).stp
+
+ifdef CONFIG_USER_ONLY
+TARGET_TYPE=user
+else
+TARGET_TYPE=system
+endif
+
+$(QEMU_PROG).stp:
+ $(call quiet-command,sh $(SRC_PATH)/scripts/tracetool \
+ --$(TRACE_BACKEND) \
+ --binary $(bindir)/$(QEMU_PROG) \
+ --target-arch $(TARGET_ARCH) \
+ --target-type $(TARGET_TYPE) \
+ --stap < $(SRC_PATH)/trace-events > $(QEMU_PROG).stp," GEN $(QEMU_PROG).stp")
+else
+stap:
+endif
+
+all: $(PROGS) stap
+
+# Dummy command so that make thinks it has done something
+ @true
+
+#########################################################
+# cpu emulator library
+libobj-y = exec.o translate-all.o cpu-exec.o translate.o
+libobj-y += tcg/tcg.o
+libobj-y += fpu/softfloat.o
+libobj-y += op_helper.o helper.o
+ifeq ($(TARGET_BASE_ARCH), i386)
+libobj-y += cpuid.o
+endif
+libobj-$(CONFIG_NEED_MMU) += mmu.o
+libobj-$(TARGET_ARM) += neon_helper.o iwmmxt_helper.o
+
+libobj-y += disas.o
+
+$(libobj-y): $(GENERATED_HEADERS)
+
+# libqemu
+
+translate.o: translate.c cpu.h
+
+translate-all.o: translate-all.c cpu.h
+
+tcg/tcg.o: cpu.h
+
+# HELPER_CFLAGS is used for all the code compiled with static register
+# variables
+op_helper.o user-exec.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
+
+# Note: this is a workaround. The real fix is to avoid compiling
+# cpu_signal_handler() in user-exec.c.
+signal.o: QEMU_CFLAGS += $(HELPER_CFLAGS)
+
+#########################################################
+# Linux user emulator target
+
+ifdef CONFIG_LINUX_USER
+
+$(call set-vpath, $(SRC_PATH)/linux-user:$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR))
+
+QEMU_CFLAGS+=-I$(SRC_PATH)/linux-user/$(TARGET_ABI_DIR) -I$(SRC_PATH)/linux-user
+obj-y = main.o syscall.o strace.o mmap.o signal.o thunk.o \
+ elfload.o linuxload.o uaccess.o gdbstub.o cpu-uname.o \
+ qemu-malloc.o user-exec.o $(oslib-obj-y)
+
+obj-$(TARGET_HAS_BFLT) += flatload.o
+
+obj-$(TARGET_I386) += vm86.o
+
+obj-i386-y += ioport-user.o
+
+nwfpe-obj-y = fpa11.o fpa11_cpdo.o fpa11_cpdt.o fpa11_cprt.o fpopcode.o
+nwfpe-obj-y += single_cpdo.o double_cpdo.o extended_cpdo.o
+obj-arm-y += $(addprefix nwfpe/, $(nwfpe-obj-y))
+obj-arm-y += arm-semi.o
+
+obj-m68k-y += m68k-sim.o m68k-semi.o
+
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../libuser/, $(user-obj-y))
+obj-y += $(addprefix ../libdis-user/, $(libdis-y))
+obj-y += $(libobj-y)
+
+endif #CONFIG_LINUX_USER
+
+#########################################################
+# Darwin user emulator target
+
+ifdef CONFIG_DARWIN_USER
+
+$(call set-vpath, $(SRC_PATH)/darwin-user)
+
+QEMU_CFLAGS+=-I$(SRC_PATH)/darwin-user -I$(SRC_PATH)/darwin-user/$(TARGET_ARCH)
+
+# Leave some space for the regular program loading zone
+LDFLAGS+=-Wl,-segaddr,__STD_PROG_ZONE,0x1000 -image_base 0x0e000000
+
+LIBS+=-lmx
+
+obj-y = main.o commpage.o machload.o mmap.o signal.o syscall.o thunk.o \
+ gdbstub.o user-exec.o
+
+obj-i386-y += ioport-user.o
+
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../libuser/, $(user-obj-y))
+obj-y += $(addprefix ../libdis-user/, $(libdis-y))
+obj-y += $(libobj-y)
+
+endif #CONFIG_DARWIN_USER
+
+#########################################################
+# BSD user emulator target
+
+ifdef CONFIG_BSD_USER
+
+$(call set-vpath, $(SRC_PATH)/bsd-user)
+
+QEMU_CFLAGS+=-I$(SRC_PATH)/bsd-user -I$(SRC_PATH)/bsd-user/$(TARGET_ARCH)
+
+obj-y = main.o bsdload.o elfload.o mmap.o signal.o strace.o syscall.o \
+ gdbstub.o uaccess.o user-exec.o
+
+obj-i386-y += ioport-user.o
+
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../libuser/, $(user-obj-y))
+obj-y += $(addprefix ../libdis-user/, $(libdis-y))
+obj-y += $(libobj-y)
+
+endif #CONFIG_BSD_USER
+
+#########################################################
+# System emulator target
+ifdef CONFIG_SOFTMMU
+
+obj-y = arch_init.o cpus.o monitor.o machine.o gdbstub.o balloon.o
+# virtio has to be here due to weird dependency between PCI and virtio-net.
+# need to fix this properly
+obj-$(CONFIG_NO_PCI) += pci-stub.o
+obj-$(CONFIG_VIRTIO) += virtio.o virtio-blk.o virtio-balloon.o virtio-net.o virtio-serial-bus.o
+obj-y += vhost_net.o
+obj-$(CONFIG_VHOST_NET) += vhost.o
+obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/virtio-9p-device.o
+obj-y += rwhandler.o
+obj-$(CONFIG_KVM) += kvm.o kvm-all.o
+obj-$(CONFIG_NO_KVM) += kvm-stub.o
+LIBS+=-lz
+
+QEMU_CFLAGS += $(VNC_TLS_CFLAGS)
+QEMU_CFLAGS += $(VNC_SASL_CFLAGS)
+QEMU_CFLAGS += $(VNC_JPEG_CFLAGS)
+QEMU_CFLAGS += $(VNC_PNG_CFLAGS)
+QEMU_CFLAGS += $(GLIB_CFLAGS)
+
+# xen support
+obj-$(CONFIG_XEN) += xen-all.o xen_machine_pv.o xen_domainbuild.o xen-mapcache.o
+obj-$(CONFIG_NO_XEN) += xen-stub.o
+
+obj-i386-$(CONFIG_XEN) += xen_platform.o
+
+# Inter-VM PCI shared memory
+CONFIG_IVSHMEM =
+ifeq ($(CONFIG_KVM), y)
+ ifeq ($(CONFIG_PCI), y)
+ CONFIG_IVSHMEM = y
+ endif
+endif
+obj-$(CONFIG_IVSHMEM) += ivshmem.o
+
+# Hardware support
+obj-i386-y += vga.o
+obj-i386-y += mc146818rtc.o i8259.o pc.o
+obj-i386-y += cirrus_vga.o sga.o apic.o ioapic.o piix_pci.o
+obj-i386-y += vmport.o
+obj-i386-y += device-hotplug.o pci-hotplug.o smbios.o wdt_ib700.o
+obj-i386-y += debugcon.o multiboot.o
+obj-i386-y += pc_piix.o
+obj-i386-$(CONFIG_KVM) += kvmclock.o
+obj-i386-$(CONFIG_SPICE) += qxl.o qxl-logger.o qxl-render.o
+
+# shared objects
+obj-ppc-y = ppc.o
+obj-ppc-y += vga.o
+# PREP target
+obj-ppc-y += i8259.o mc146818rtc.o
+obj-ppc-y += ppc_prep.o
+# OldWorld PowerMac
+obj-ppc-y += ppc_oldworld.o
+# NewWorld PowerMac
+obj-ppc-y += ppc_newworld.o
+# IBM pSeries (sPAPR)
+ifeq ($(CONFIG_FDT)$(TARGET_PPC64),yy)
+obj-ppc-y += spapr.o spapr_hcall.o spapr_rtas.o spapr_vio.o
+obj-ppc-y += xics.o spapr_vty.o spapr_llan.o spapr_vscsi.o
+endif
+# PowerPC 4xx boards
+obj-ppc-y += ppc4xx_devs.o ppc4xx_pci.o ppc405_uc.o ppc405_boards.o
+obj-ppc-y += ppc440.o ppc440_bamboo.o
+# PowerPC E500 boards
+obj-ppc-y += ppce500_mpc8544ds.o mpc8544_guts.o
+# PowerPC 440 Xilinx ML507 reference board.
+obj-ppc-y += virtex_ml507.o
+obj-ppc-$(CONFIG_KVM) += kvm_ppc.o
+obj-ppc-$(CONFIG_FDT) += device_tree.o
+
+# Xilinx PPC peripherals
+obj-ppc-y += xilinx_intc.o
+obj-ppc-y += xilinx_timer.o
+obj-ppc-y += xilinx_uartlite.o
+obj-ppc-y += xilinx_ethlite.o
+
+# LM32 boards
+obj-lm32-y += lm32_boards.o
+obj-lm32-y += milkymist.o
+
+# LM32 peripherals
+obj-lm32-y += lm32_pic.o
+obj-lm32-y += lm32_juart.o
+obj-lm32-y += lm32_timer.o
+obj-lm32-y += lm32_uart.o
+obj-lm32-y += lm32_sys.o
+obj-lm32-y += milkymist-ac97.o
+obj-lm32-y += milkymist-hpdmc.o
+obj-lm32-y += milkymist-memcard.o
+obj-lm32-y += milkymist-minimac2.o
+obj-lm32-y += milkymist-pfpu.o
+obj-lm32-y += milkymist-softusb.o
+obj-lm32-y += milkymist-sysctl.o
+obj-lm32-$(CONFIG_OPENGL) += milkymist-tmu2.o
+obj-lm32-y += milkymist-uart.o
+obj-lm32-y += milkymist-vgafb.o
+obj-lm32-y += framebuffer.o
+
+obj-mips-y = mips_r4k.o mips_jazz.o mips_malta.o mips_mipssim.o
+obj-mips-y += mips_addr.o mips_timer.o mips_int.o
+obj-mips-y += vga.o i8259.o
+obj-mips-y += g364fb.o jazz_led.o
+obj-mips-y += gt64xxx.o mc146818rtc.o
+obj-mips-y += cirrus_vga.o
+obj-mips-$(CONFIG_FULONG) += bonito.o vt82c686.o mips_fulong2e.o
+
+obj-microblaze-y = petalogix_s3adsp1800_mmu.o
+obj-microblaze-y += petalogix_ml605_mmu.o
+
+obj-microblaze-y += microblaze_pic_cpu.o
+obj-microblaze-y += xilinx_intc.o
+obj-microblaze-y += xilinx_timer.o
+obj-microblaze-y += xilinx_uartlite.o
+obj-microblaze-y += xilinx_ethlite.o
+obj-microblaze-y += xilinx_axidma.o
+obj-microblaze-y += xilinx_axienet.o
+
+obj-microblaze-$(CONFIG_FDT) += device_tree.o
+
+# Boards
+obj-cris-y = cris_pic_cpu.o
+obj-cris-y += cris-boot.o
+obj-cris-y += etraxfs.o axis_dev88.o
+obj-cris-y += axis_dev88.o
+
+# IO blocks
+obj-cris-y += etraxfs_dma.o
+obj-cris-y += etraxfs_pic.o
+obj-cris-y += etraxfs_eth.o
+obj-cris-y += etraxfs_timer.o
+obj-cris-y += etraxfs_ser.o
+
+ifeq ($(TARGET_ARCH), sparc64)
+obj-sparc-y = sun4u.o apb_pci.o
+obj-sparc-y += vga.o
+obj-sparc-y += mc146818rtc.o
+obj-sparc-y += cirrus_vga.o
+else
+obj-sparc-y = sun4m.o lance.o tcx.o sun4m_iommu.o slavio_intctl.o
+obj-sparc-y += slavio_timer.o slavio_misc.o sparc32_dma.o
+obj-sparc-y += cs4231.o eccmemctl.o sbi.o sun4c_intctl.o leon3.o
+
+# GRLIB
+obj-sparc-y += grlib_gptimer.o grlib_irqmp.o grlib_apbuart.o
+endif
+
+obj-arm-y = integratorcp.o versatilepb.o arm_pic.o arm_timer.o
+obj-arm-y += arm_boot.o pl011.o pl031.o pl050.o pl080.o pl110.o pl181.o pl190.o
+obj-arm-y += versatile_pci.o
+obj-arm-y += realview_gic.o realview.o arm_sysctl.o arm11mpcore.o a9mpcore.o
+obj-arm-y += armv7m.o armv7m_nvic.o stellaris.o pl022.o stellaris_enet.o
+obj-arm-y += pl061.o
+obj-arm-y += arm-semi.o
+obj-arm-y += pxa2xx.o pxa2xx_pic.o pxa2xx_gpio.o pxa2xx_timer.o pxa2xx_dma.o
+obj-arm-y += pxa2xx_lcd.o pxa2xx_mmci.o pxa2xx_pcmcia.o pxa2xx_keypad.o
+obj-arm-y += gumstix.o
+obj-arm-y += zaurus.o ide/microdrive.o spitz.o tosa.o tc6393xb.o
+obj-arm-y += omap1.o omap_lcdc.o omap_dma.o omap_clk.o omap_mmc.o omap_i2c.o \
+ omap_gpio.o omap_intc.o omap_uart.o
+obj-arm-y += omap2.o omap_dss.o soc_dma.o omap_gptimer.o omap_synctimer.o \
+ omap_gpmc.o omap_sdrc.o omap_spi.o omap_tap.o omap_l4.o
+obj-arm-y += omap_sx1.o palm.o tsc210x.o
+obj-arm-y += nseries.o blizzard.o onenand.o vga.o cbus.o tusb6010.o usb-musb.o
+obj-arm-y += mst_fpga.o mainstone.o
+obj-arm-y += musicpal.o bitbang_i2c.o marvell_88w8618_audio.o
+obj-arm-y += framebuffer.o
+obj-arm-y += syborg.o syborg_fb.o syborg_interrupt.o syborg_keyboard.o
+obj-arm-y += syborg_serial.o syborg_timer.o syborg_pointer.o syborg_rtc.o
+obj-arm-y += syborg_virtio.o
+obj-arm-y += vexpress.o
+obj-arm-y += strongarm.o
+obj-arm-y += collie.o
+
+obj-sh4-y = shix.o r2d.o sh7750.o sh7750_regnames.o tc58128.o
+obj-sh4-y += sh_timer.o sh_serial.o sh_intc.o sh_pci.o sm501.o
+obj-sh4-y += ide/mmio.o
+
+obj-m68k-y = an5206.o mcf5206.o mcf_uart.o mcf_intc.o mcf5208.o mcf_fec.o
+obj-m68k-y += m68k-semi.o dummy_m68k.o
+
+obj-s390x-y = s390-virtio-bus.o s390-virtio.o
+
+obj-alpha-y = i8259.o mc146818rtc.o
+obj-alpha-y += vga.o cirrus_vga.o
+
+main.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
+
+monitor.o: hmp-commands.h qmp-commands.h
+
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../, $(common-obj-y))
+obj-y += $(addprefix ../libdis/, $(libdis-y))
+obj-y += $(libobj-y)
+obj-y += $(addprefix $(HWDIR)/, $(hw-obj-y))
+
+endif # CONFIG_SOFTMMU
+
+ifndef CONFIG_LINUX_USER
+# libcacard needs qemu-thread support, and besides is only needed by devices
+# so not requires with linux-user targets
+obj-$(CONFIG_SMARTCARD_NSS) += $(addprefix ../libcacard/, $(libcacard-y))
+endif # CONFIG_LINUX_USER
+
+obj-y += $(addprefix ../, $(trace-obj-y))
+obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml.o
+
+$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y)
+ $(call LINK,$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y))
+
+
+gdbstub-xml.c: $(TARGET_XML_FILES) $(SRC_PATH)/scripts/feature_to_c.sh
+ $(call quiet-command,rm -f $@ && $(SHELL) $(SRC_PATH)/scripts/feature_to_c.sh $@ $(TARGET_XML_FILES)," GEN $(TARGET_DIR)$@")
+
+hmp-commands.h: $(SRC_PATH)/hmp-commands.hx
+ $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $(TARGET_DIR)$@")
+
+qmp-commands.h: $(SRC_PATH)/qmp-commands.hx
+ $(call quiet-command,sh $(SRC_PATH)/scripts/hxtool -h < $< > $@," GEN $(TARGET_DIR)$@")
+
+clean:
+ rm -f *.o *.a *~ $(PROGS) nwfpe/*.o fpu/*.o
+ rm -f *.d */*.d tcg/*.o ide/*.o 9pfs/*.o
+ rm -f hmp-commands.h qmp-commands.h gdbstub-xml.c
+ifdef CONFIG_SYSTEMTAP_TRACE
+ rm -f *.stp
+endif
+
+install: all
+ifneq ($(PROGS),)
+ $(INSTALL) -m 755 $(PROGS) "$(DESTDIR)$(bindir)"
+ifneq ($(STRIP),)
+ $(STRIP) $(patsubst %,"$(DESTDIR)$(bindir)/%",$(PROGS))
+endif
+endif
+ifdef CONFIG_SYSTEMTAP_TRACE
+ $(INSTALL_DIR) "$(DESTDIR)$(datadir)/../systemtap/tapset"
+ $(INSTALL_DATA) $(QEMU_PROG).stp "$(DESTDIR)$(datadir)/../systemtap/tapset"
+endif
+
+# Include automatically generated dependency files
+-include $(wildcard *.d */*.d)
diff --git a/qemu-0.15.x/Makefile.user b/qemu-0.15.x/Makefile.user
new file mode 100644
index 0000000..024b773
--- /dev/null
+++ b/qemu-0.15.x/Makefile.user
@@ -0,0 +1,23 @@
+# Makefile for qemu target independent user files.
+
+include ../config-host.mak
+include $(SRC_PATH)/rules.mak
+-include config.mak
+
+.PHONY: all
+
+$(call set-vpath, $(SRC_PATH))
+
+QEMU_CFLAGS+=-I..
+
+include $(SRC_PATH)/Makefile.objs
+
+all: $(user-obj-y)
+# Dummy command so that make thinks it has done something
+ @true
+
+clean:
+ rm -f *.o *.d *.a *~
+
+# Include automatically generated dependency files
+-include $(wildcard *.d */*.d)
diff --git a/qemu-0.15.x/QMP/README b/qemu-0.15.x/QMP/README
new file mode 100644
index 0000000..c95a08c
--- /dev/null
+++ b/qemu-0.15.x/QMP/README
@@ -0,0 +1,88 @@
+ QEMU Monitor Protocol
+ =====================
+
+Introduction
+-------------
+
+The QEMU Monitor Protocol (QMP) allows applications to communicate with
+QEMU's Monitor.
+
+QMP is JSON[1] based and currently has the following features:
+
+- Lightweight, text-based, easy to parse data format
+- Asynchronous messages support (ie. events)
+- Capabilities Negotiation
+
+For detailed information on QMP's usage, please, refer to the following files:
+
+o qmp-spec.txt QEMU Monitor Protocol current specification
+o qmp-commands.txt QMP supported commands (auto-generated at build-time)
+o qmp-events.txt List of available asynchronous events
+
+There is also a simple Python script called 'qmp-shell' available.
+
+IMPORTANT: It's strongly recommended to read the 'Stability Considerations'
+section in the qmp-commands.txt file before making any serious use of QMP.
+
+
+[1] http://www.json.org
+
+Usage
+-----
+
+To enable QMP, you need a QEMU monitor instance in "control mode". There are
+two ways of doing this.
+
+The simplest one is using the '-qmp' command-line option. The following
+example makes QMP available on localhost port 4444:
+
+ $ qemu [...] -qmp tcp:localhost:4444,server
+
+However, in order to have more complex combinations, like multiple monitors,
+the '-mon' command-line option should be used along with the '-chardev' one.
+For instance, the following example creates one user monitor on stdio and one
+QMP monitor on localhost port 4444.
+
+ $ qemu [...] -chardev stdio,id=mon0 -mon chardev=mon0,mode=readline \
+ -chardev socket,id=mon1,host=localhost,port=4444,server \
+ -mon chardev=mon1,mode=control
+
+Please, refer to QEMU's manpage for more information.
+
+Simple Testing
+--------------
+
+To manually test QMP one can connect with telnet and issue commands by hand:
+
+$ telnet localhost 4444
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is '^]'.
+{"QMP": {"version": {"qemu": {"micro": 50, "minor": 13, "major": 0}, "package": ""}, "capabilities": []}}
+{ "execute": "qmp_capabilities" }
+{"return": {}}
+{ "execute": "query-version" }
+{"return": {"qemu": {"micro": 50, "minor": 13, "major": 0}, "package": ""}}
+
+Development Process
+-------------------
+
+When changing QMP's interface (by adding new commands, events or modifying
+existing ones) it's mandatory to update the relevant documentation, which is
+one (or more) of the files listed in the 'Introduction' section*.
+
+Also, it's strongly recommended to send the documentation patch first, before
+doing any code change. This is so because:
+
+ 1. Avoids the code dictating the interface
+
+ 2. Review can improve your interface. Letting that happen before
+ you implement it can save you work.
+
+* The qmp-commands.txt file is generated from the qmp-commands.hx one, which
+ is the file that should be edited.
+
+Homepage
+--------
+
+http://wiki.qemu.org/QMP
diff --git a/qemu-0.15.x/QMP/qmp-events.txt b/qemu-0.15.x/QMP/qmp-events.txt
new file mode 100644
index 0000000..0ce5d4e
--- /dev/null
+++ b/qemu-0.15.x/QMP/qmp-events.txt
@@ -0,0 +1,266 @@
+ QEMU Monitor Protocol Events
+ ============================
+
+BLOCK_IO_ERROR
+--------------
+
+Emitted when a disk I/O error occurs.
+
+Data:
+
+- "device": device name (json-string)
+- "operation": I/O operation (json-string, "read" or "write")
+- "action": action that has been taken, it's one of the following (json-string):
+ "ignore": error has been ignored
+ "report": error has been reported to the device
+ "stop": error caused VM to be stopped
+
+Example:
+
+{ "event": "BLOCK_IO_ERROR",
+ "data": { "device": "ide0-hd1",
+ "operation": "write",
+ "action": "stop" },
+ "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
+
+Note: If action is "stop", a STOP event will eventually follow the
+BLOCK_IO_ERROR event.
+
+RESET
+-----
+
+Emitted when the Virtual Machine is reseted.
+
+Data: None.
+
+Example:
+
+{ "event": "RESET",
+ "timestamp": { "seconds": 1267041653, "microseconds": 9518 } }
+
+RESUME
+------
+
+Emitted when the Virtual Machine resumes execution.
+
+Data: None.
+
+Example:
+
+{ "event": "RESUME",
+ "timestamp": { "seconds": 1271770767, "microseconds": 582542 } }
+
+RTC_CHANGE
+----------
+
+Emitted when the guest changes the RTC time.
+
+Data:
+
+- "offset": delta against the host UTC in seconds (json-number)
+
+Example:
+
+{ "event": "RTC_CHANGE",
+ "data": { "offset": 78 },
+ "timestamp": { "seconds": 1267020223, "microseconds": 435656 } }
+
+SHUTDOWN
+--------
+
+Emitted when the Virtual Machine is powered down.
+
+Data: None.
+
+Example:
+
+{ "event": "SHUTDOWN",
+ "timestamp": { "seconds": 1267040730, "microseconds": 682951 } }
+
+Note: If the command-line option "-no-shutdown" has been specified, a STOP
+event will eventually follow the SHUTDOWN event.
+
+STOP
+----
+
+Emitted when the Virtual Machine is stopped.
+
+Data: None.
+
+Example:
+
+{ "event": "STOP",
+ "timestamp": { "seconds": 1267041730, "microseconds": 281295 } }
+
+VNC_CONNECTED
+-------------
+
+Emitted when a VNC client establishes a connection.
+
+Data:
+
+- "server": Server information (json-object)
+ - "host": IP address (json-string)
+ - "service": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+ - "auth": authentication method (json-string, optional)
+- "client": Client information (json-object)
+ - "host": IP address (json-string)
+ - "service": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+
+Example:
+
+{ "event": "VNC_CONNECTED",
+ "data": {
+ "server": { "auth": "sasl", "family": "ipv4",
+ "service": "5901", "host": "0.0.0.0" },
+ "client": { "family": "ipv4", "service": "58425",
+ "host": "127.0.0.1" } },
+ "timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
+
+
+Note: This event is emitted before any authentication takes place, thus
+the authentication ID is not provided.
+
+VNC_DISCONNECTED
+----------------
+
+Emitted when the conection is closed.
+
+Data:
+
+- "server": Server information (json-object)
+ - "host": IP address (json-string)
+ - "service": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+ - "auth": authentication method (json-string, optional)
+- "client": Client information (json-object)
+ - "host": IP address (json-string)
+ - "service": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+ - "x509_dname": TLS dname (json-string, optional)
+ - "sasl_username": SASL username (json-string, optional)
+
+Example:
+
+{ "event": "VNC_DISCONNECTED",
+ "data": {
+ "server": { "auth": "sasl", "family": "ipv4",
+ "service": "5901", "host": "0.0.0.0" },
+ "client": { "family": "ipv4", "service": "58425",
+ "host": "127.0.0.1", "sasl_username": "luiz" } },
+ "timestamp": { "seconds": 1262976601, "microseconds": 975795 } }
+
+VNC_INITIALIZED
+---------------
+
+Emitted after authentication takes place (if any) and the VNC session is
+made active.
+
+Data:
+
+- "server": Server information (json-object)
+ - "host": IP address (json-string)
+ - "service": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+ - "auth": authentication method (json-string, optional)
+- "client": Client information (json-object)
+ - "host": IP address (json-string)
+ - "service": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+ - "x509_dname": TLS dname (json-string, optional)
+ - "sasl_username": SASL username (json-string, optional)
+
+Example:
+
+{ "event": "VNC_INITIALIZED",
+ "data": {
+ "server": { "auth": "sasl", "family": "ipv4",
+ "service": "5901", "host": "0.0.0.0"},
+ "client": { "family": "ipv4", "service": "46089",
+ "host": "127.0.0.1", "sasl_username": "luiz" } },
+ "timestamp": { "seconds": 1263475302, "microseconds": 150772 } }
+
+SPICE_CONNECTED, SPICE_DISCONNECTED
+-----------------------------------
+
+Emitted when a SPICE client connects or disconnects.
+
+Data:
+
+- "server": Server information (json-object)
+ - "host": IP address (json-string)
+ - "port": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+- "client": Client information (json-object)
+ - "host": IP address (json-string)
+ - "port": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+
+Example:
+
+{ "timestamp": {"seconds": 1290688046, "microseconds": 388707},
+ "event": "SPICE_CONNECTED",
+ "data": {
+ "server": { "port": "5920", "family": "ipv4", "host": "127.0.0.1"},
+ "client": {"port": "52873", "family": "ipv4", "host": "127.0.0.1"}
+}}
+
+
+SPICE_INITIALIZED
+-----------------
+
+Emitted after initial handshake and authentication takes place (if any)
+and the SPICE channel is up'n'running
+
+Data:
+
+- "server": Server information (json-object)
+ - "host": IP address (json-string)
+ - "port": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+ - "auth": authentication method (json-string, optional)
+- "client": Client information (json-object)
+ - "host": IP address (json-string)
+ - "port": port number (json-string)
+ - "family": address family (json-string, "ipv4" or "ipv6")
+ - "connection-id": spice connection id. All channels with the same id
+ belong to the same spice session (json-int)
+ - "channel-type": channel type. "1" is the main control channel, filter for
+ this one if you want track spice sessions only (json-int)
+ - "channel-id": channel id. Usually "0", might be different needed when
+ multiple channels of the same type exist, such as multiple
+ display channels in a multihead setup (json-int)
+ - "tls": whevener the channel is encrypted (json-bool)
+
+Example:
+
+{ "timestamp": {"seconds": 1290688046, "microseconds": 417172},
+ "event": "SPICE_INITIALIZED",
+ "data": {"server": {"auth": "spice", "port": "5921",
+ "family": "ipv4", "host": "127.0.0.1"},
+ "client": {"port": "49004", "family": "ipv4", "channel-type": 3,
+ "connection-id": 1804289383, "host": "127.0.0.1",
+ "channel-id": 0, "tls": true}
+}}
+
+
+WATCHDOG
+--------
+
+Emitted when the watchdog device's timer is expired.
+
+Data:
+
+- "action": Action that has been taken, it's one of the following (json-string):
+ "reset", "shutdown", "poweroff", "pause", "debug", or "none"
+
+Example:
+
+{ "event": "WATCHDOG",
+ "data": { "action": "reset" },
+ "timestamp": { "seconds": 1267061043, "microseconds": 959568 } }
+
+Note: If action is "reset", "shutdown", or "pause" the WATCHDOG event is
+followed respectively by the RESET, SHUTDOWN, or STOP events.
diff --git a/qemu-0.15.x/QMP/qmp-shell b/qemu-0.15.x/QMP/qmp-shell
new file mode 100755
index 0000000..42dabc8
--- /dev/null
+++ b/qemu-0.15.x/QMP/qmp-shell
@@ -0,0 +1,259 @@
+#!/usr/bin/python
+#
+# Low-level QEMU shell on top of QMP.
+#
+# Copyright (C) 2009, 2010 Red Hat Inc.
+#
+# Authors:
+# Luiz Capitulino <lcapitulino(a)redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2. See
+# the COPYING file in the top-level directory.
+#
+# Usage:
+#
+# Start QEMU with:
+#
+# # qemu [...] -qmp unix:./qmp-sock,server
+#
+# Run the shell:
+#
+# $ qmp-shell ./qmp-sock
+#
+# Commands have the following format:
+#
+# < command-name > [ arg-name1=arg1 ] ... [ arg-nameN=argN ]
+#
+# For example:
+#
+# (QEMU) device_add driver=e1000 id=net1
+# {u'return': {}}
+# (QEMU)
+
+import qmp
+import readline
+import sys
+
+class QMPCompleter(list):
+ def complete(self, text, state):
+ for cmd in self:
+ if cmd.startswith(text):
+ if not state:
+ return cmd
+ else:
+ state -= 1
+
+class QMPShellError(Exception):
+ pass
+
+class QMPShellBadPort(QMPShellError):
+ pass
+
+# TODO: QMPShell's interface is a bit ugly (eg. _fill_completion() and
+# _execute_cmd()). Let's design a better one.
+class QMPShell(qmp.QEMUMonitorProtocol):
+ def __init__(self, address):
+ qmp.QEMUMonitorProtocol.__init__(self, self.__get_address(address))
+ self._greeting = None
+ self._completer = None
+
+ def __get_address(self, arg):
+ """
+ Figure out if the argument is in the port:host form, if it's not it's
+ probably a file path.
+ """
+ addr = arg.split(':')
+ if len(addr) == 2:
+ try:
+ port = int(addr[1])
+ except ValueError:
+ raise QMPShellBadPort
+ return ( addr[0], port )
+ # socket path
+ return arg
+
+ def _fill_completion(self):
+ for cmd in self.cmd('query-commands')['return']:
+ self._completer.append(cmd['name'])
+
+ def __completer_setup(self):
+ self._completer = QMPCompleter()
+ self._fill_completion()
+ readline.set_completer(self._completer.complete)
+ readline.parse_and_bind("tab: complete")
+ # XXX: default delimiters conflict with some command names (eg. query-),
+ # clearing everything as it doesn't seem to matter
+ readline.set_completer_delims('')
+
+ def __build_cmd(self, cmdline):
+ """
+ Build a QMP input object from a user provided command-line in the
+ following format:
+
+ < command-name > [ arg-name1=arg1 ] ... [ arg-nameN=argN ]
+ """
+ cmdargs = cmdline.split()
+ qmpcmd = { 'execute': cmdargs[0], 'arguments': {} }
+ for arg in cmdargs[1:]:
+ opt = arg.split('=')
+ try:
+ value = int(opt[1])
+ except ValueError:
+ value = opt[1]
+ qmpcmd['arguments'][opt[0]] = value
+ return qmpcmd
+
+ def _execute_cmd(self, cmdline):
+ try:
+ qmpcmd = self.__build_cmd(cmdline)
+ except:
+ print 'command format: <command-name> ',
+ print '[arg-name1=arg1] ... [arg-nameN=argN]'
+ return True
+ resp = self.cmd_obj(qmpcmd)
+ if resp is None:
+ print 'Disconnected'
+ return False
+ print resp
+ return True
+
+ def connect(self):
+ self._greeting = qmp.QEMUMonitorProtocol.connect(self)
+ self.__completer_setup()
+
+ def show_banner(self, msg='Welcome to the QMP low-level shell!'):
+ print msg
+ version = self._greeting['QMP']['version']['qemu']
+ print 'Connected to QEMU %d.%d.%d\n' % (version['major'],version['minor'],version['micro'])
+
+ def read_exec_command(self, prompt):
+ """
+ Read and execute a command.
+
+ @return True if execution was ok, return False if disconnected.
+ """
+ try:
+ cmdline = raw_input(prompt)
+ except EOFError:
+ print
+ return False
+ if cmdline == '':
+ for ev in self.get_events():
+ print ev
+ self.clear_events()
+ return True
+ else:
+ return self._execute_cmd(cmdline)
+
+class HMPShell(QMPShell):
+ def __init__(self, address):
+ QMPShell.__init__(self, address)
+ self.__cpu_index = 0
+
+ def __cmd_completion(self):
+ for cmd in self.__cmd_passthrough('help')['return'].split('\r\n'):
+ if cmd and cmd[0] != '[' and cmd[0] != '\t':
+ name = cmd.split()[0] # drop help text
+ if name == 'info':
+ continue
+ if name.find('|') != -1:
+ # Command in the form 'foobar|f' or 'f|foobar', take the
+ # full name
+ opt = name.split('|')
+ if len(opt[0]) == 1:
+ name = opt[1]
+ else:
+ name = opt[0]
+ self._completer.append(name)
+ self._completer.append('help ' + name) # help completion
+
+ def __info_completion(self):
+ for cmd in self.__cmd_passthrough('info')['return'].split('\r\n'):
+ if cmd:
+ self._completer.append('info ' + cmd.split()[1])
+
+ def __other_completion(self):
+ # special cases
+ self._completer.append('help info')
+
+ def _fill_completion(self):
+ self.__cmd_completion()
+ self.__info_completion()
+ self.__other_completion()
+
+ def __cmd_passthrough(self, cmdline, cpu_index = 0):
+ return self.cmd_obj({ 'execute': 'human-monitor-command', 'arguments':
+ { 'command-line': cmdline,
+ 'cpu-index': cpu_index } })
+
+ def _execute_cmd(self, cmdline):
+ if cmdline.split()[0] == "cpu":
+ # trap the cpu command, it requires special setting
+ try:
+ idx = int(cmdline.split()[1])
+ if not 'return' in self.__cmd_passthrough('info version', idx):
+ print 'bad CPU index'
+ return True
+ self.__cpu_index = idx
+ except ValueError:
+ print 'cpu command takes an integer argument'
+ return True
+ resp = self.__cmd_passthrough(cmdline, self.__cpu_index)
+ if resp is None:
+ print 'Disconnected'
+ return False
+ assert 'return' in resp or 'error' in resp
+ if 'return' in resp:
+ # Success
+ if len(resp['return']) > 0:
+ print resp['return'],
+ else:
+ # Error
+ print '%s: %s' % (resp['error']['class'], resp['error']['desc'])
+ return True
+
+ def show_banner(self):
+ QMPShell.show_banner(self, msg='Welcome to the HMP shell!')
+
+def die(msg):
+ sys.stderr.write('ERROR: %s\n' % msg)
+ sys.exit(1)
+
+def fail_cmdline(option=None):
+ if option:
+ sys.stderr.write('ERROR: bad command-line option \'%s\'\n' % option)
+ sys.stderr.write('qemu-shell [ -H ] < UNIX socket path> | < TCP address:port >\n')
+ sys.exit(1)
+
+def main():
+ addr = ''
+ try:
+ if len(sys.argv) == 2:
+ qemu = QMPShell(sys.argv[1])
+ addr = sys.argv[1]
+ elif len(sys.argv) == 3:
+ if sys.argv[1] != '-H':
+ fail_cmdline(sys.argv[1])
+ qemu = HMPShell(sys.argv[2])
+ addr = sys.argv[2]
+ else:
+ fail_cmdline()
+ except QMPShellBadPort:
+ die('bad port number in command-line')
+
+ try:
+ qemu.connect()
+ except qmp.QMPConnectError:
+ die('Didn\'t get QMP greeting message')
+ except qmp.QMPCapabilitiesError:
+ die('Could not negotiate capabilities')
+ except qemu.error:
+ die('Could not connect to %s' % addr)
+
+ qemu.show_banner()
+ while qemu.read_exec_command('(QEMU) '):
+ pass
+ qemu.close()
+
+if __name__ == '__main__':
+ main()
diff --git a/qemu-0.15.x/QMP/qmp-spec.txt b/qemu-0.15.x/QMP/qmp-spec.txt
new file mode 100644
index 0000000..9d30a8c
--- /dev/null
+++ b/qemu-0.15.x/QMP/qmp-spec.txt
@@ -0,0 +1,272 @@
+ QEMU Monitor Protocol Specification - Version 0.1
+
+1. Introduction
+===============
+
+This document specifies the QEMU Monitor Protocol (QMP), a JSON-based protocol
+which is available for applications to control QEMU at the machine-level.
+
+To enable QMP support, QEMU has to be run in "control mode". This is done by
+starting QEMU with the appropriate command-line options. Please, refer to the
+QEMU manual page for more information.
+
+2. Protocol Specification
+=========================
+
+This section details the protocol format. For the purpose of this document
+"Client" is any application which is communicating with QEMU in control mode,
+and "Server" is QEMU itself.
+
+JSON data structures, when mentioned in this document, are always in the
+following format:
+
+ json-DATA-STRUCTURE-NAME
+
+Where DATA-STRUCTURE-NAME is any valid JSON data structure, as defined by
+the JSON standard:
+
+http://www.ietf.org/rfc/rfc4627.txt
+
+For convenience, json-object members and json-array elements mentioned in
+this document will be in a certain order. However, in real protocol usage
+they can be in ANY order, thus no particular order should be assumed.
+
+2.1 General Definitions
+-----------------------
+
+2.1.1 All interactions transmitted by the Server are json-objects, always
+ terminating with CRLF
+
+2.1.2 All json-objects members are mandatory when not specified otherwise
+
+2.2 Server Greeting
+-------------------
+
+Right when connected the Server will issue a greeting message, which signals
+that the connection has been successfully established and that the Server is
+ready for capabilities negotiation (for more information refer to section
+'4. Capabilities Negotiation').
+
+The format is:
+
+{ "QMP": { "version": json-object, "capabilities": json-array } }
+
+ Where,
+
+- The "version" member contains the Server's version information (the format
+ is the same of the 'query-version' command)
+- The "capabilities" member specify the availability of features beyond the
+ baseline specification
+
+2.3 Issuing Commands
+--------------------
+
+The format for command execution is:
+
+{ "execute": json-string, "arguments": json-object, "id": json-value }
+
+ Where,
+
+- The "execute" member identifies the command to be executed by the Server
+- The "arguments" member is used to pass any arguments required for the
+ execution of the command, it is optional when no arguments are required
+- The "id" member is a transaction identification associated with the
+ command execution, it is optional and will be part of the response if
+ provided
+
+2.4 Commands Responses
+----------------------
+
+There are two possible responses which the Server will issue as the result
+of a command execution: success or error.
+
+2.4.1 success
+-------------
+
+The success response is issued when the command execution has finished
+without errors.
+
+The format is:
+
+{ "return": json-object, "id": json-value }
+
+ Where,
+
+- The "return" member contains the command returned data, which is defined
+ in a per-command basis or an empty json-object if the command does not
+ return data
+- The "id" member contains the transaction identification associated
+ with the command execution (if issued by the Client)
+
+2.4.2 error
+-----------
+
+The error response is issued when the command execution could not be
+completed because of an error condition.
+
+The format is:
+
+{ "error": { "class": json-string, "data": json-object, "desc": json-string },
+ "id": json-value }
+
+ Where,
+
+- The "class" member contains the error class name (eg. "ServiceUnavailable")
+- The "data" member contains specific error data and is defined in a
+ per-command basis, it will be an empty json-object if the error has no data
+- The "desc" member is a human-readable error message. Clients should
+ not attempt to parse this message.
+- The "id" member contains the transaction identification associated with
+ the command execution (if issued by the Client)
+
+NOTE: Some errors can occur before the Server is able to read the "id" member,
+in these cases the "id" member will not be part of the error response, even
+if provided by the client.
+
+2.5 Asynchronous events
+-----------------------
+
+As a result of state changes, the Server may send messages unilaterally
+to the Client at any time. They are called 'asynchronous events'.
+
+The format is:
+
+{ "event": json-string, "data": json-object,
+ "timestamp": { "seconds": json-number, "microseconds": json-number } }
+
+ Where,
+
+- The "event" member contains the event's name
+- The "data" member contains event specific data, which is defined in a
+ per-event basis, it is optional
+- The "timestamp" member contains the exact time of when the event occurred
+ in the Server. It is a fixed json-object with time in seconds and
+ microseconds
+
+For a listing of supported asynchronous events, please, refer to the
+qmp-events.txt file.
+
+3. QMP Examples
+===============
+
+This section provides some examples of real QMP usage, in all of them
+'C' stands for 'Client' and 'S' stands for 'Server'.
+
+3.1 Server greeting
+-------------------
+
+S: {"QMP": {"version": {"qemu": "0.12.50", "package": ""}, "capabilities": []}}
+
+3.2 Simple 'stop' execution
+---------------------------
+
+C: { "execute": "stop" }
+S: {"return": {}}
+
+3.3 KVM information
+-------------------
+
+C: { "execute": "query-kvm", "id": "example" }
+S: {"return": {"enabled": true, "present": true}, "id": "example"}
+
+3.4 Parsing error
+------------------
+
+C: { "execute": }
+S: {"error": {"class": "JSONParsing", "desc": "Invalid JSON syntax", "data":
+{}}}
+
+3.5 Powerdown event
+-------------------
+
+S: {"timestamp": {"seconds": 1258551470, "microseconds": 802384}, "event":
+"POWERDOWN"}
+
+4. Capabilities Negotiation
+----------------------------
+
+When a Client successfully establishes a connection, the Server is in
+Capabilities Negotiation mode.
+
+In this mode only the 'qmp_capabilities' command is allowed to run, all
+other commands will return the CommandNotFound error. Asynchronous messages
+are not delivered either.
+
+Clients should use the 'qmp_capabilities' command to enable capabilities
+advertised in the Server's greeting (section '2.2 Server Greeting') they
+support.
+
+When the 'qmp_capabilities' command is issued, and if it does not return an
+error, the Server enters in Command mode where capabilities changes take
+effect, all commands (except 'qmp_capabilities') are allowed and asynchronous
+messages are delivered.
+
+5 Compatibility Considerations
+------------------------------
+
+All protocol changes or new features which modify the protocol format in an
+incompatible way are disabled by default and will be advertised by the
+capabilities array (section '2.2 Server Greeting'). Thus, Clients can check
+that array and enable the capabilities they support.
+
+Additionally, Clients must not assume any particular:
+
+- Size of json-objects or length of json-arrays
+- Order of json-object members or json-array elements
+- Amount of errors generated by a command, that is, new errors can be added
+ to any existing command in newer versions of the Server
+
+6. Downstream extension of QMP
+------------------------------
+
+We recommend that downstream consumers of QEMU do *not* modify QMP.
+Management tools should be able to support both upstream and downstream
+versions of QMP without special logic, and downstream extensions are
+inherently at odds with that.
+
+However, we recognize that it is sometimes impossible for downstreams to
+avoid modifying QMP. Both upstream and downstream need to take care to
+preserve long-term compatibility and interoperability.
+
+To help with that, QMP reserves JSON object member names beginning with
+'__' (double underscore) for downstream use ("downstream names"). This
+means upstream will never use any downstream names for its commands,
+arguments, errors, asynchronous events, and so forth.
+
+Any new names downstream wishes to add must begin with '__'. To
+ensure compatibility with other downstreams, it is strongly
+recommended that you prefix your downstram names with '__RFQDN_' where
+RFQDN is a valid, reverse fully qualified domain name which you
+control. For example, a qemu-kvm specific monitor command would be:
+
+ (qemu) __org.linux-kvm_enable_irqchip
+
+Downstream must not change the server greeting (section 2.2) other than
+to offer additional capabilities. But see below for why even that is
+discouraged.
+
+Section '5 Compatibility Considerations' applies to downstream as well
+as to upstream, obviously. It follows that downstream must behave
+exactly like upstream for any input not containing members with
+downstream names ("downstream members"), except it may add members
+with downstream names to its output.
+
+Thus, a client should not be able to distinguish downstream from
+upstream as long as it doesn't send input with downstream members, and
+properly ignores any downstream members in the output it receives.
+
+Advice on downstream modifications:
+
+1. Introducing new commands is okay. If you want to extend an existing
+ command, consider introducing a new one with the new behaviour
+ instead.
+
+2. Introducing new asynchronous messages is okay. If you want to extend
+ an existing message, consider adding a new one instead.
+
+3. Introducing new errors for use in new commands is okay. Adding new
+ errors to existing commands counts as extension, so 1. applies.
+
+4. New capabilities are strongly discouraged. Capabilities are for
+ evolving the basic protocol, and multiple diverging basic protocol
+ dialects are most undesirable.
diff --git a/qemu-0.15.x/QMP/qmp.py b/qemu-0.15.x/QMP/qmp.py
new file mode 100644
index 0000000..c7dbea0
--- /dev/null
+++ b/qemu-0.15.x/QMP/qmp.py
@@ -0,0 +1,157 @@
+# QEMU Monitor Protocol Python class
+#
+# Copyright (C) 2009, 2010 Red Hat Inc.
+#
+# Authors:
+# Luiz Capitulino <lcapitulino(a)redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2. See
+# the COPYING file in the top-level directory.
+
+import json
+import errno
+import socket
+
+class QMPError(Exception):
+ pass
+
+class QMPConnectError(QMPError):
+ pass
+
+class QMPCapabilitiesError(QMPError):
+ pass
+
+class QEMUMonitorProtocol:
+ def __init__(self, address, server=False):
+ """
+ Create a QEMUMonitorProtocol class.
+
+ @param address: QEMU address, can be either a unix socket path (string)
+ or a tuple in the form ( address, port ) for a TCP
+ connection
+ @param server: server mode listens on the socket (bool)
+ @raise socket.error on socket connection errors
+ @note No connection is established, this is done by the connect() or
+ accept() methods
+ """
+ self.__events = []
+ self.__address = address
+ self.__sock = self.__get_sock()
+ if server:
+ self.__sock.bind(self.__address)
+ self.__sock.listen(1)
+
+ def __get_sock(self):
+ if isinstance(self.__address, tuple):
+ family = socket.AF_INET
+ else:
+ family = socket.AF_UNIX
+ return socket.socket(family, socket.SOCK_STREAM)
+
+ def __negotiate_capabilities(self):
+ self.__sockfile = self.__sock.makefile()
+ greeting = self.__json_read()
+ if greeting is None or not greeting.has_key('QMP'):
+ raise QMPConnectError
+ # Greeting seems ok, negotiate capabilities
+ resp = self.cmd('qmp_capabilities')
+ if "return" in resp:
+ return greeting
+ raise QMPCapabilitiesError
+
+ def __json_read(self, only_event=False):
+ while True:
+ data = self.__sockfile.readline()
+ if not data:
+ return
+ resp = json.loads(data)
+ if 'event' in resp:
+ self.__events.append(resp)
+ if not only_event:
+ continue
+ return resp
+
+ error = socket.error
+
+ def connect(self):
+ """
+ Connect to the QMP Monitor and perform capabilities negotiation.
+
+ @return QMP greeting dict
+ @raise socket.error on socket connection errors
+ @raise QMPConnectError if the greeting is not received
+ @raise QMPCapabilitiesError if fails to negotiate capabilities
+ """
+ self.__sock.connect(self.__address)
+ return self.__negotiate_capabilities()
+
+ def accept(self):
+ """
+ Await connection from QMP Monitor and perform capabilities negotiation.
+
+ @return QMP greeting dict
+ @raise socket.error on socket connection errors
+ @raise QMPConnectError if the greeting is not received
+ @raise QMPCapabilitiesError if fails to negotiate capabilities
+ """
+ self.__sock, _ = self.__sock.accept()
+ return self.__negotiate_capabilities()
+
+ def cmd_obj(self, qmp_cmd):
+ """
+ Send a QMP command to the QMP Monitor.
+
+ @param qmp_cmd: QMP command to be sent as a Python dict
+ @return QMP response as a Python dict or None if the connection has
+ been closed
+ """
+ try:
+ self.__sock.sendall(json.dumps(qmp_cmd))
+ except socket.error, err:
+ if err[0] == errno.EPIPE:
+ return
+ raise socket.error(err)
+ return self.__json_read()
+
+ def cmd(self, name, args=None, id=None):
+ """
+ Build a QMP command and send it to the QMP Monitor.
+
+ @param name: command name (string)
+ @param args: command arguments (dict)
+ @param id: command id (dict, list, string or int)
+ """
+ qmp_cmd = { 'execute': name }
+ if args:
+ qmp_cmd['arguments'] = args
+ if id:
+ qmp_cmd['id'] = id
+ return self.cmd_obj(qmp_cmd)
+
+ def get_events(self, wait=False):
+ """
+ Get a list of available QMP events.
+
+ @param wait: block until an event is available (bool)
+ """
+ self.__sock.setblocking(0)
+ try:
+ self.__json_read()
+ except socket.error, err:
+ if err[0] == errno.EAGAIN:
+ # No data available
+ pass
+ self.__sock.setblocking(1)
+ if not self.__events and wait:
+ self.__json_read(only_event=True)
+ return self.__events
+
+ def clear_events(self):
+ """
+ Clear current list of pending events.
+ """
+ self.__events = []
+
+ def close(self):
+ self.__sock.close()
+ self.__sockfile.close()
diff --git a/qemu-0.15.x/README b/qemu-0.15.x/README
new file mode 100644
index 0000000..dfd56f2
--- /dev/null
+++ b/qemu-0.15.x/README
@@ -0,0 +1,3 @@
+Read the documentation in qemu-doc.html.
+
+Fabrice Bellard.
diff --git a/qemu-0.15.x/TODO b/qemu-0.15.x/TODO
new file mode 100644
index 0000000..1d4c638
--- /dev/null
+++ b/qemu-0.15.x/TODO
@@ -0,0 +1,37 @@
+General:
+-------
+- cycle counter for all archs
+- cpu_interrupt() win32/SMP fix
+- merge PIC spurious interrupt patch
+- warning for OS/2: must not use 128 MB memory (merge bochs cmos patch ?)
+- config file (at least for windows/Mac OS X)
+- update doc: PCI infos.
+- basic VGA optimizations
+- better code fetch
+- do not resize vga if invalid size.
+- TLB code protection support for PPC
+- disable SMC handling for ARM/SPARC/PPC (not finished)
+- see undefined flags for BTx insn
+- keyboard output buffer filling timing emulation
+- tests for each target CPU
+- fix all remaining thread lock issues (must put TBs in a specific invalid
+ state, find a solution for tb_flush()).
+
+ppc specific:
+------------
+- TLB invalidate not needed if msr_pr changes
+- enable shift optimizations ?
+
+linux-user specific:
+-------------------
+- remove threading support as it cannot work at this point
+- improve IPC syscalls
+- more syscalls (in particular all 64 bit ones, IPCs, fix 64 bit
+ issues, fix 16 bit uid issues)
+- use kernel traps for unaligned accesses on ARM ?
+
+
+lower priority:
+--------------
+- int15 ah=86: use better timing
+- use -msoft-float on ARM
diff --git a/qemu-0.15.x/VERSION b/qemu-0.15.x/VERSION
new file mode 100644
index 0000000..e815b86
--- /dev/null
+++ b/qemu-0.15.x/VERSION
@@ -0,0 +1 @@
+0.15.1
diff --git a/qemu-0.15.x/a.out.h b/qemu-0.15.x/a.out.h
new file mode 100644
index 0000000..dfc104e
--- /dev/null
+++ b/qemu-0.15.x/a.out.h
@@ -0,0 +1,430 @@
+/* a.out.h
+
+ Copyright 1997, 1998, 1999, 2001 Red Hat, Inc.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license. Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef _A_OUT_H_
+#define _A_OUT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define COFF_IMAGE_WITH_PE
+#define COFF_LONG_SECTION_NAMES
+
+/*** coff information for Intel 386/486. */
+
+
+/********************** FILE HEADER **********************/
+
+struct external_filehdr {
+ short f_magic; /* magic number */
+ short f_nscns; /* number of sections */
+ host_ulong f_timdat; /* time & date stamp */
+ host_ulong f_symptr; /* file pointer to symtab */
+ host_ulong f_nsyms; /* number of symtab entries */
+ short f_opthdr; /* sizeof(optional hdr) */
+ short f_flags; /* flags */
+};
+
+/* Bits for f_flags:
+ * F_RELFLG relocation info stripped from file
+ * F_EXEC file is executable (no unresolved external references)
+ * F_LNNO line numbers stripped from file
+ * F_LSYMS local symbols stripped from file
+ * F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax)
+ */
+
+#define F_RELFLG (0x0001)
+#define F_EXEC (0x0002)
+#define F_LNNO (0x0004)
+#define F_LSYMS (0x0008)
+
+
+
+#define I386MAGIC 0x14c
+#define I386PTXMAGIC 0x154
+#define I386AIXMAGIC 0x175
+
+/* This is Lynx's all-platform magic number for executables. */
+
+#define LYNXCOFFMAGIC 0415
+
+#define I386BADMAG(x) (((x).f_magic != I386MAGIC) \
+ && (x).f_magic != I386AIXMAGIC \
+ && (x).f_magic != I386PTXMAGIC \
+ && (x).f_magic != LYNXCOFFMAGIC)
+
+#define FILHDR struct external_filehdr
+#define FILHSZ 20
+
+
+/********************** AOUT "OPTIONAL HEADER"=
+ **********************/
+
+
+typedef struct
+{
+ unsigned short magic; /* type of file */
+ unsigned short vstamp; /* version stamp */
+ host_ulong tsize; /* text size in bytes, padded to FW bdry*/
+ host_ulong dsize; /* initialized data " " */
+ host_ulong bsize; /* uninitialized data " " */
+ host_ulong entry; /* entry pt. */
+ host_ulong text_start; /* base of text used for this file */
+ host_ulong data_start; /* base of data used for this file=
+ */
+}
+AOUTHDR;
+
+#define AOUTSZ 28
+#define AOUTHDRSZ 28
+
+#define OMAGIC 0404 /* object files, eg as output */
+#define ZMAGIC 0413 /* demand load format, eg normal ld output */
+#define STMAGIC 0401 /* target shlib */
+#define SHMAGIC 0443 /* host shlib */
+
+
+/* define some NT default values */
+/* #define NT_IMAGE_BASE 0x400000 moved to internal.h */
+#define NT_SECTION_ALIGNMENT 0x1000
+#define NT_FILE_ALIGNMENT 0x200
+#define NT_DEF_RESERVE 0x100000
+#define NT_DEF_COMMIT 0x1000
+
+/********************** SECTION HEADER **********************/
+
+
+struct external_scnhdr {
+ char s_name[8]; /* section name */
+ host_ulong s_paddr; /* physical address, offset
+ of last addr in scn */
+ host_ulong s_vaddr; /* virtual address */
+ host_ulong s_size; /* section size */
+ host_ulong s_scnptr; /* file ptr to raw data for section */
+ host_ulong s_relptr; /* file ptr to relocation */
+ host_ulong s_lnnoptr; /* file ptr to line numbers */
+ unsigned short s_nreloc; /* number of relocation entries */
+ unsigned short s_nlnno; /* number of line number entries*/
+ host_ulong s_flags; /* flags */
+};
+
+#define SCNHDR struct external_scnhdr
+#define SCNHSZ 40
+
+/*
+ * names of "special" sections
+ */
+#define _TEXT ".text"
+#define _DATA ".data"
+#define _BSS ".bss"
+#define _COMMENT ".comment"
+#define _LIB ".lib"
+
+/********************** LINE NUMBERS **********************/
+
+/* 1 line number entry for every "breakpointable" source line in a section.
+ * Line numbers are grouped on a per function basis; first entry in a function
+ * grouping will have l_lnno = 0 and in place of physical address will be the
+ * symbol table index of the function name.
+ */
+struct external_lineno {
+ union {
+ host_ulong l_symndx; /* function name symbol index, iff l_lnno 0 */
+ host_ulong l_paddr; /* (physical) address of line number */
+ } l_addr;
+ unsigned short l_lnno; /* line number */
+};
+
+#define LINENO struct external_lineno
+#define LINESZ 6
+
+/********************** SYMBOLS **********************/
+
+#define E_SYMNMLEN 8 /* # characters in a symbol name */
+#define E_FILNMLEN 14 /* # characters in a file name */
+#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */
+
+struct __attribute__((packed)) external_syment
+{
+ union {
+ char e_name[E_SYMNMLEN];
+ struct {
+ host_ulong e_zeroes;
+ host_ulong e_offset;
+ } e;
+ } e;
+ host_ulong e_value;
+ unsigned short e_scnum;
+ unsigned short e_type;
+ char e_sclass[1];
+ char e_numaux[1];
+};
+
+#define N_BTMASK (0xf)
+#define N_TMASK (0x30)
+#define N_BTSHFT (4)
+#define N_TSHIFT (2)
+
+union external_auxent {
+ struct {
+ host_ulong x_tagndx; /* str, un, or enum tag indx */
+ union {
+ struct {
+ unsigned short x_lnno; /* declaration line number */
+ unsigned short x_size; /* str/union/array size */
+ } x_lnsz;
+ host_ulong x_fsize; /* size of function */
+ } x_misc;
+ union {
+ struct { /* if ISFCN, tag, or .bb */
+ host_ulong x_lnnoptr;/* ptr to fcn line # */
+ host_ulong x_endndx; /* entry ndx past block end */
+ } x_fcn;
+ struct { /* if ISARY, up to 4 dimen. */
+ char x_dimen[E_DIMNUM][2];
+ } x_ary;
+ } x_fcnary;
+ unsigned short x_tvndx; /* tv index */
+ } x_sym;
+
+ union {
+ char x_fname[E_FILNMLEN];
+ struct {
+ host_ulong x_zeroes;
+ host_ulong x_offset;
+ } x_n;
+ } x_file;
+
+ struct {
+ host_ulong x_scnlen; /* section length */
+ unsigned short x_nreloc; /* # relocation entries */
+ unsigned short x_nlinno; /* # line numbers */
+ host_ulong x_checksum; /* section COMDAT checksum */
+ unsigned short x_associated;/* COMDAT associated section index */
+ char x_comdat[1]; /* COMDAT selection number */
+ } x_scn;
+
+ struct {
+ host_ulong x_tvfill; /* tv fill value */
+ unsigned short x_tvlen; /* length of .tv */
+ char x_tvran[2][2]; /* tv range */
+ } x_tv; /* info about .tv section (in auxent of symbol .tv)) */
+
+};
+
+#define SYMENT struct external_syment
+#define SYMESZ 18
+#define AUXENT union external_auxent
+#define AUXESZ 18
+
+#define _ETEXT "etext"
+
+/********************** RELOCATION DIRECTIVES **********************/
+
+struct external_reloc {
+ char r_vaddr[4];
+ char r_symndx[4];
+ char r_type[2];
+};
+
+#define RELOC struct external_reloc
+#define RELSZ 10
+
+/* end of coff/i386.h */
+
+/* PE COFF header information */
+
+#ifndef _PE_H
+#define _PE_H
+
+/* NT specific file attributes */
+#define IMAGE_FILE_RELOCS_STRIPPED 0x0001
+#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
+#define IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004
+#define IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008
+#define IMAGE_FILE_BYTES_REVERSED_LO 0x0080
+#define IMAGE_FILE_32BIT_MACHINE 0x0100
+#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
+#define IMAGE_FILE_SYSTEM 0x1000
+#define IMAGE_FILE_DLL 0x2000
+#define IMAGE_FILE_BYTES_REVERSED_HI 0x8000
+
+/* additional flags to be set for section headers to allow the NT loader to
+ read and write to the section data (to replace the addresses of data in
+ dlls for one thing); also to execute the section in .text's case=
+ */
+#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
+#define IMAGE_SCN_MEM_EXECUTE 0x20000000
+#define IMAGE_SCN_MEM_READ 0x40000000
+#define IMAGE_SCN_MEM_WRITE 0x80000000
+
+/*
+ * Section characteristics added for ppc-nt
+ */
+
+#define IMAGE_SCN_TYPE_NO_PAD 0x00000008 /* Reserved. */
+
+#define IMAGE_SCN_CNT_CODE 0x00000020 /* Section contains code. */
+#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 /* Section contains initialized data. */
+#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 /* Section contains uninitialized data. */
+
+#define IMAGE_SCN_LNK_OTHER 0x00000100 /* Reserved. */
+#define IMAGE_SCN_LNK_INFO 0x00000200 /* Section contains comments or some other type of information. */
+#define IMAGE_SCN_LNK_REMOVE 0x00000800 /* Section contents will not become part of image. */
+#define IMAGE_SCN_LNK_COMDAT 0x00001000 /* Section contents comdat. */
+
+#define IMAGE_SCN_MEM_FARDATA 0x00008000
+
+#define IMAGE_SCN_MEM_PURGEABLE 0x00020000
+#define IMAGE_SCN_MEM_16BIT 0x00020000
+#define IMAGE_SCN_MEM_LOCKED 0x00040000
+#define IMAGE_SCN_MEM_PRELOAD 0x00080000
+
+#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
+#define IMAGE_SCN_ALIGN_2BYTES 0x00200000
+#define IMAGE_SCN_ALIGN_4BYTES 0x00300000
+#define IMAGE_SCN_ALIGN_8BYTES 0x00400000
+#define IMAGE_SCN_ALIGN_16BYTES 0x00500000 /* Default alignment if no others are specified. */
+#define IMAGE_SCN_ALIGN_32BYTES 0x00600000
+#define IMAGE_SCN_ALIGN_64BYTES 0x00700000
+
+
+#define IMAGE_SCN_LNK_NRELOC_OVFL 0x01000000 /* Section contains extended relocations. */
+#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 /* Section is not cachable. */
+#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 /* Section is not pageable. */
+#define IMAGE_SCN_MEM_SHARED 0x10000000 /* Section is shareable. */
+
+/* COMDAT selection codes. */
+
+#define IMAGE_COMDAT_SELECT_NODUPLICATES (1) /* Warn if duplicates. */
+#define IMAGE_COMDAT_SELECT_ANY (2) /* No warning. */
+#define IMAGE_COMDAT_SELECT_SAME_SIZE (3) /* Warn if different size. */
+#define IMAGE_COMDAT_SELECT_EXACT_MATCH (4) /* Warn if different. */
+#define IMAGE_COMDAT_SELECT_ASSOCIATIVE (5) /* Base on other section. */
+
+/* Magic values that are true for all dos/nt implementations */
+#define DOSMAGIC 0x5a4d
+#define NT_SIGNATURE 0x00004550
+
+/* NT allows long filenames, we want to accommodate this. This may break
+ some of the bfd functions */
+#undef FILNMLEN
+#define FILNMLEN 18 /* # characters in a file name */
+
+
+#ifdef COFF_IMAGE_WITH_PE
+/* The filehdr is only weired in images */
+
+#undef FILHDR
+struct external_PE_filehdr
+{
+ /* DOS header fields */
+ unsigned short e_magic; /* Magic number, 0x5a4d */
+ unsigned short e_cblp; /* Bytes on last page of file, 0x90 */
+ unsigned short e_cp; /* Pages in file, 0x3 */
+ unsigned short e_crlc; /* Relocations, 0x0 */
+ unsigned short e_cparhdr; /* Size of header in paragraphs, 0x4 */
+ unsigned short e_minalloc; /* Minimum extra paragraphs needed, 0x0 */
+ unsigned short e_maxalloc; /* Maximum extra paragraphs needed, 0xFFFF */
+ unsigned short e_ss; /* Initial (relative) SS value, 0x0 */
+ unsigned short e_sp; /* Initial SP value, 0xb8 */
+ unsigned short e_csum; /* Checksum, 0x0 */
+ unsigned short e_ip; /* Initial IP value, 0x0 */
+ unsigned short e_cs; /* Initial (relative) CS value, 0x0 */
+ unsigned short e_lfarlc; /* File address of relocation table, 0x40 */
+ unsigned short e_ovno; /* Overlay number, 0x0 */
+ char e_res[4][2]; /* Reserved words, all 0x0 */
+ unsigned short e_oemid; /* OEM identifier (for e_oeminfo), 0x0 */
+ unsigned short e_oeminfo; /* OEM information; e_oemid specific, 0x0 */
+ char e_res2[10][2]; /* Reserved words, all 0x0 */
+ host_ulong e_lfanew; /* File address of new exe header, 0x80 */
+ char dos_message[16][4]; /* other stuff, always follow DOS header */
+ unsigned int nt_signature; /* required NT signature, 0x4550 */
+
+ /* From standard header */
+
+ unsigned short f_magic; /* magic number */
+ unsigned short f_nscns; /* number of sections */
+ host_ulong f_timdat; /* time & date stamp */
+ host_ulong f_symptr; /* file pointer to symtab */
+ host_ulong f_nsyms; /* number of symtab entries */
+ unsigned short f_opthdr; /* sizeof(optional hdr) */
+ unsigned short f_flags; /* flags */
+};
+
+
+#define FILHDR struct external_PE_filehdr
+#undef FILHSZ
+#define FILHSZ 152
+
+#endif
+
+typedef struct
+{
+ unsigned short magic; /* type of file */
+ unsigned short vstamp; /* version stamp */
+ host_ulong tsize; /* text size in bytes, padded to FW bdry*/
+ host_ulong dsize; /* initialized data " " */
+ host_ulong bsize; /* uninitialized data " " */
+ host_ulong entry; /* entry pt. */
+ host_ulong text_start; /* base of text used for this file */
+ host_ulong data_start; /* base of all data used for this file */
+
+ /* NT extra fields; see internal.h for descriptions */
+ host_ulong ImageBase;
+ host_ulong SectionAlignment;
+ host_ulong FileAlignment;
+ unsigned short MajorOperatingSystemVersion;
+ unsigned short MinorOperatingSystemVersion;
+ unsigned short MajorImageVersion;
+ unsigned short MinorImageVersion;
+ unsigned short MajorSubsystemVersion;
+ unsigned short MinorSubsystemVersion;
+ char Reserved1[4];
+ host_ulong SizeOfImage;
+ host_ulong SizeOfHeaders;
+ host_ulong CheckSum;
+ unsigned short Subsystem;
+ unsigned short DllCharacteristics;
+ host_ulong SizeOfStackReserve;
+ host_ulong SizeOfStackCommit;
+ host_ulong SizeOfHeapReserve;
+ host_ulong SizeOfHeapCommit;
+ host_ulong LoaderFlags;
+ host_ulong NumberOfRvaAndSizes;
+ /* IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; */
+ char DataDirectory[16][2][4]; /* 16 entries, 2 elements/entry, 4 chars */
+
+} PEAOUTHDR;
+
+
+#undef AOUTSZ
+#define AOUTSZ (AOUTHDRSZ + 196)
+
+#undef E_FILNMLEN
+#define E_FILNMLEN 18 /* # characters in a file name */
+#endif
+
+/* end of coff/pe.h */
+
+#define DT_NON (0) /* no derived type */
+#define DT_PTR (1) /* pointer */
+#define DT_FCN (2) /* function */
+#define DT_ARY (3) /* array */
+
+#define ISPTR(x) (((x) & N_TMASK) == (DT_PTR << N_BTSHFT))
+#define ISFCN(x) (((x) & N_TMASK) == (DT_FCN << N_BTSHFT))
+#define ISARY(x) (((x) & N_TMASK) == (DT_ARY << N_BTSHFT))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _A_OUT_H_ */
diff --git a/qemu-0.15.x/acl.c b/qemu-0.15.x/acl.c
new file mode 100644
index 0000000..82c2704
--- /dev/null
+++ b/qemu-0.15.x/acl.c
@@ -0,0 +1,184 @@
+/*
+ * QEMU access control list management
+ *
+ * Copyright (C) 2009 Red Hat, Inc
+ *
+ * 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.
+ */
+
+
+#include "qemu-common.h"
+#include "acl.h"
+
+#ifdef CONFIG_FNMATCH
+#include <fnmatch.h>
+#endif
+
+
+static unsigned int nacls = 0;
+static qemu_acl **acls = NULL;
+
+
+
+qemu_acl *qemu_acl_find(const char *aclname)
+{
+ int i;
+ for (i = 0 ; i < nacls ; i++) {
+ if (strcmp(acls[i]->aclname, aclname) == 0)
+ return acls[i];
+ }
+
+ return NULL;
+}
+
+qemu_acl *qemu_acl_init(const char *aclname)
+{
+ qemu_acl *acl;
+
+ acl = qemu_acl_find(aclname);
+ if (acl)
+ return acl;
+
+ acl = qemu_malloc(sizeof(*acl));
+ acl->aclname = qemu_strdup(aclname);
+ /* Deny by default, so there is no window of "open
+ * access" between QEMU starting, and the user setting
+ * up ACLs in the monitor */
+ acl->defaultDeny = 1;
+
+ acl->nentries = 0;
+ QTAILQ_INIT(&acl->entries);
+
+ acls = qemu_realloc(acls, sizeof(*acls) * (nacls +1));
+ acls[nacls] = acl;
+ nacls++;
+
+ return acl;
+}
+
+int qemu_acl_party_is_allowed(qemu_acl *acl,
+ const char *party)
+{
+ qemu_acl_entry *entry;
+
+ QTAILQ_FOREACH(entry, &acl->entries, next) {
+#ifdef CONFIG_FNMATCH
+ if (fnmatch(entry->match, party, 0) == 0)
+ return entry->deny ? 0 : 1;
+#else
+ /* No fnmatch, so fallback to exact string matching
+ * instead of allowing wildcards */
+ if (strcmp(entry->match, party) == 0)
+ return entry->deny ? 0 : 1;
+#endif
+ }
+
+ return acl->defaultDeny ? 0 : 1;
+}
+
+
+void qemu_acl_reset(qemu_acl *acl)
+{
+ qemu_acl_entry *entry;
+
+ /* Put back to deny by default, so there is no window
+ * of "open access" while the user re-initializes the
+ * access control list */
+ acl->defaultDeny = 1;
+ QTAILQ_FOREACH(entry, &acl->entries, next) {
+ QTAILQ_REMOVE(&acl->entries, entry, next);
+ free(entry->match);
+ free(entry);
+ }
+ acl->nentries = 0;
+}
+
+
+int qemu_acl_append(qemu_acl *acl,
+ int deny,
+ const char *match)
+{
+ qemu_acl_entry *entry;
+
+ entry = qemu_malloc(sizeof(*entry));
+ entry->match = qemu_strdup(match);
+ entry->deny = deny;
+
+ QTAILQ_INSERT_TAIL(&acl->entries, entry, next);
+ acl->nentries++;
+
+ return acl->nentries;
+}
+
+
+int qemu_acl_insert(qemu_acl *acl,
+ int deny,
+ const char *match,
+ int index)
+{
+ qemu_acl_entry *entry;
+ qemu_acl_entry *tmp;
+ int i = 0;
+
+ if (index <= 0)
+ return -1;
+ if (index >= acl->nentries)
+ return qemu_acl_append(acl, deny, match);
+
+
+ entry = qemu_malloc(sizeof(*entry));
+ entry->match = qemu_strdup(match);
+ entry->deny = deny;
+
+ QTAILQ_FOREACH(tmp, &acl->entries, next) {
+ i++;
+ if (i == index) {
+ QTAILQ_INSERT_BEFORE(tmp, entry, next);
+ acl->nentries++;
+ break;
+ }
+ }
+
+ return i;
+}
+
+int qemu_acl_remove(qemu_acl *acl,
+ const char *match)
+{
+ qemu_acl_entry *entry;
+ int i = 0;
+
+ QTAILQ_FOREACH(entry, &acl->entries, next) {
+ i++;
+ if (strcmp(entry->match, match) == 0) {
+ QTAILQ_REMOVE(&acl->entries, entry, next);
+ return i;
+ }
+ }
+ return -1;
+}
+
+
+/*
+ * Local variables:
+ * c-indent-level: 4
+ * c-basic-offset: 4
+ * tab-width: 8
+ * End:
+ */
diff --git a/qemu-0.15.x/acl.h b/qemu-0.15.x/acl.h
new file mode 100644
index 0000000..0ef7804
--- /dev/null
+++ b/qemu-0.15.x/acl.h
@@ -0,0 +1,74 @@
+/*
+ * QEMU access control list management
+ *
+ * Copyright (C) 2009 Red Hat, Inc
+ *
+ * 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.
+ */
+
+#ifndef __QEMU_ACL_H__
+#define __QEMU_ACL_H__
+
+#include "qemu-queue.h"
+
+typedef struct qemu_acl_entry qemu_acl_entry;
+typedef struct qemu_acl qemu_acl;
+
+struct qemu_acl_entry {
+ char *match;
+ int deny;
+
+ QTAILQ_ENTRY(qemu_acl_entry) next;
+};
+
+struct qemu_acl {
+ char *aclname;
+ unsigned int nentries;
+ QTAILQ_HEAD(,qemu_acl_entry) entries;
+ int defaultDeny;
+};
+
+qemu_acl *qemu_acl_init(const char *aclname);
+
+qemu_acl *qemu_acl_find(const char *aclname);
+
+int qemu_acl_party_is_allowed(qemu_acl *acl,
+ const char *party);
+
+void qemu_acl_reset(qemu_acl *acl);
+
+int qemu_acl_append(qemu_acl *acl,
+ int deny,
+ const char *match);
+int qemu_acl_insert(qemu_acl *acl,
+ int deny,
+ const char *match,
+ int index);
+int qemu_acl_remove(qemu_acl *acl,
+ const char *match);
+
+#endif /* __QEMU_ACL_H__ */
+
+/*
+ * Local variables:
+ * c-indent-level: 4
+ * c-basic-offset: 4
+ * tab-width: 8
+ * End:
+ */
diff --git a/qemu-0.15.x/aes.c b/qemu-0.15.x/aes.c
new file mode 100644
index 0000000..eb37adb
--- /dev/null
+++ b/qemu-0.15.x/aes.c
@@ -0,0 +1,1314 @@
+/**
+ *
+ * aes.c - integrated in QEMU by Fabrice Bellard from the OpenSSL project.
+ */
+/*
+ * rijndael-alg-fst.c
+ *
+ * @version 3.0 (December 2000)
+ *
+ * Optimised ANSI C code for the Rijndael cipher (now AES)
+ *
+ * @author Vincent Rijmen <vincent.rijmen(a)esat.kuleuven.ac.be>
+ * @author Antoon Bosselaers <antoon.bosselaers(a)esat.kuleuven.ac.be>
+ * @author Paulo Barreto <paulo.barreto(a)terra.com.br>
+ *
+ * This code is hereby placed in the public domain.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "qemu-common.h"
+#include "aes.h"
+
+#ifndef NDEBUG
+#define NDEBUG
+#endif
+
+typedef uint32_t u32;
+typedef uint16_t u16;
+typedef uint8_t u8;
+
+/* This controls loop-unrolling in aes_core.c */
+#undef FULL_UNROLL
+# define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ ((u32)(pt)[2] << 8) ^ ((u32)(pt)[3]))
+# define PUTU32(ct, st) { (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); (ct)[2] = (u8)((st) >> 8); (ct)[3] = (u8)(st); }
+
+/*
+Te0[x] = S [x].[02, 01, 01, 03];
+Te1[x] = S [x].[03, 02, 01, 01];
+Te2[x] = S [x].[01, 03, 02, 01];
+Te3[x] = S [x].[01, 01, 03, 02];
+Te4[x] = S [x].[01, 01, 01, 01];
+
+Td0[x] = Si[x].[0e, 09, 0d, 0b];
+Td1[x] = Si[x].[0b, 0e, 09, 0d];
+Td2[x] = Si[x].[0d, 0b, 0e, 09];
+Td3[x] = Si[x].[09, 0d, 0b, 0e];
+Td4[x] = Si[x].[01, 01, 01, 01];
+*/
+
+static const u32 Te0[256] = {
+ 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
+ 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
+ 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
+ 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
+ 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
+ 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
+ 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
+ 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
+ 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
+ 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
+ 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
+ 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
+ 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
+ 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
+ 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
+ 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
+ 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
+ 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
+ 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
+ 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
+ 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
+ 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
+ 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
+ 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
+ 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
+ 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
+ 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
+ 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
+ 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
+ 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
+ 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
+ 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
+ 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
+ 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
+ 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
+ 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
+ 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
+ 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
+ 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
+ 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
+ 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
+ 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
+ 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
+ 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
+ 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
+ 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
+ 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
+ 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
+ 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
+ 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
+ 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
+ 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
+ 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
+ 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
+ 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
+ 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
+ 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
+ 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
+ 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
+ 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
+ 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
+ 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
+ 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
+ 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
+};
+static const u32 Te1[256] = {
+ 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
+ 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
+ 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
+ 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
+ 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
+ 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
+ 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
+ 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
+ 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
+ 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
+ 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
+ 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
+ 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
+ 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
+ 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
+ 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
+ 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
+ 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
+ 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
+ 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
+ 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
+ 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
+ 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
+ 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
+ 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
+ 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
+ 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
+ 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
+ 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
+ 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
+ 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
+ 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
+ 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
+ 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
+ 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
+ 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
+ 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
+ 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
+ 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
+ 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
+ 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
+ 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
+ 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
+ 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
+ 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
+ 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
+ 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
+ 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
+ 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
+ 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
+ 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
+ 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
+ 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
+ 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
+ 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
+ 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
+ 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
+ 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
+ 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
+ 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
+ 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
+ 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
+ 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
+ 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
+};
+static const u32 Te2[256] = {
+ 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
+ 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
+ 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
+ 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
+ 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
+ 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
+ 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
+ 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
+ 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
+ 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
+ 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
+ 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
+ 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
+ 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
+ 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
+ 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
+ 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
+ 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
+ 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
+ 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
+ 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
+ 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
+ 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
+ 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
+ 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
+ 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
+ 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
+ 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
+ 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
+ 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
+ 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
+ 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
+ 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
+ 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
+ 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
+ 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
+ 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
+ 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
+ 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
+ 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
+ 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
+ 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
+ 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
+ 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
+ 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
+ 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
+ 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
+ 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
+ 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
+ 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
+ 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
+ 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
+ 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
+ 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
+ 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
+ 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
+ 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
+ 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
+ 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
+ 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
+ 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
+ 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
+ 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
+ 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
+};
+static const u32 Te3[256] = {
+
+ 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
+ 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
+ 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
+ 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
+ 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
+ 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
+ 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
+ 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
+ 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
+ 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
+ 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
+ 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
+ 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
+ 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
+ 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
+ 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
+ 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
+ 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
+ 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
+ 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
+ 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
+ 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
+ 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
+ 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
+ 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
+ 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
+ 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
+ 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
+ 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
+ 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
+ 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
+ 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
+ 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
+ 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
+ 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
+ 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
+ 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
+ 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
+ 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
+ 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
+ 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
+ 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
+ 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
+ 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
+ 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
+ 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
+ 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
+ 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
+ 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
+ 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
+ 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
+ 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
+ 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
+ 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
+ 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
+ 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
+ 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
+ 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
+ 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
+ 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
+ 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
+ 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
+ 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
+ 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
+};
+static const u32 Te4[256] = {
+ 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
+ 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
+ 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
+ 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
+ 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
+ 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
+ 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
+ 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
+ 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
+ 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
+ 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
+ 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
+ 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
+ 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
+ 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
+ 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
+ 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
+ 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
+ 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
+ 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
+ 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
+ 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
+ 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
+ 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
+ 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
+ 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
+ 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
+ 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
+ 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
+ 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
+ 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
+ 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
+ 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
+ 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
+ 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
+ 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
+ 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
+ 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
+ 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
+ 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
+ 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
+ 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
+ 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
+ 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
+ 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
+ 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
+ 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
+ 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
+ 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
+ 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
+ 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
+ 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
+ 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
+ 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
+ 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
+ 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
+ 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
+ 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
+ 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
+ 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
+ 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
+ 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
+ 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
+ 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
+};
+static const u32 Td0[256] = {
+ 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
+ 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
+ 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
+ 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
+ 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
+ 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
+ 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
+ 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
+ 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
+ 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
+ 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
+ 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
+ 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
+ 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
+ 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
+ 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
+ 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
+ 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
+ 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
+ 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
+ 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
+ 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
+ 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
+ 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
+ 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
+ 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
+ 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
+ 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
+ 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
+ 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
+ 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
+ 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
+ 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
+ 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
+ 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
+ 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
+ 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
+ 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
+ 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
+ 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
+ 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
+ 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
+ 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
+ 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
+ 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
+ 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
+ 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
+ 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
+ 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
+ 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
+ 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
+ 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
+ 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
+ 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
+ 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
+ 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
+ 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
+ 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
+ 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
+ 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
+ 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
+ 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
+ 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
+ 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
+};
+static const u32 Td1[256] = {
+ 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
+ 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
+ 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
+ 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
+ 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
+ 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
+ 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
+ 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
+ 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
+ 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
+ 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
+ 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
+ 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
+ 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
+ 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
+ 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
+ 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
+ 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
+ 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
+ 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
+ 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
+ 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
+ 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
+ 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
+ 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
+ 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
+ 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
+ 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
+ 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
+ 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
+ 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
+ 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
+ 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
+ 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
+ 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
+ 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
+ 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
+ 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
+ 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
+ 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
+ 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
+ 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
+ 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
+ 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
+ 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
+ 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
+ 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
+ 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
+ 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
+ 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
+ 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
+ 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
+ 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
+ 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
+ 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
+ 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
+ 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
+ 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
+ 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
+ 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
+ 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
+ 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
+ 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
+ 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
+};
+static const u32 Td2[256] = {
+ 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
+ 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
+ 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
+ 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
+ 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
+ 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
+ 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
+ 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
+ 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
+ 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
+ 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
+ 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
+ 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
+ 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
+ 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
+ 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
+ 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
+ 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
+ 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
+ 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
+
+ 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
+ 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
+ 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
+ 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
+ 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
+ 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
+ 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
+ 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
+ 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
+ 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
+ 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
+ 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
+ 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
+ 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
+ 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
+ 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
+ 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
+ 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
+ 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
+ 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
+ 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
+ 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
+ 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
+ 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
+ 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
+ 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
+ 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
+ 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
+ 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
+ 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
+ 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
+ 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
+ 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
+ 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
+ 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
+ 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
+ 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
+ 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
+ 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
+ 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
+ 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
+ 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
+ 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
+ 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
+};
+static const u32 Td3[256] = {
+ 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
+ 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
+ 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
+ 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
+ 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
+ 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
+ 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
+ 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
+ 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
+ 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
+ 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
+ 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
+ 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
+ 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
+ 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
+ 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
+ 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
+ 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
+ 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
+ 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
+ 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
+ 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
+ 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
+ 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
+ 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
+ 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
+ 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
+ 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
+ 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
+ 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
+ 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
+ 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
+ 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
+ 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
+ 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
+ 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
+ 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
+ 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
+ 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
+ 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
+ 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
+ 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
+ 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
+ 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
+ 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
+ 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
+ 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
+ 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
+ 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
+ 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
+ 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
+ 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
+ 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
+ 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
+ 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
+ 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
+ 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
+ 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
+ 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
+ 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
+ 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
+ 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
+ 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
+ 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
+};
+static const u32 Td4[256] = {
+ 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
+ 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
+ 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
+ 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
+ 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
+ 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
+ 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
+ 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
+ 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
+ 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
+ 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
+ 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
+ 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
+ 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
+ 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
+ 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
+ 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
+ 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
+ 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
+ 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
+ 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
+ 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
+ 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
+ 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
+ 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
+ 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
+ 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
+ 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
+ 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
+ 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
+ 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
+ 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
+ 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
+ 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
+ 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
+ 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
+ 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
+ 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
+ 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
+ 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
+ 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
+ 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
+ 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
+ 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
+ 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
+ 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
+ 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
+ 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
+ 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
+ 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
+ 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
+ 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
+ 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
+ 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
+ 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
+ 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
+ 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
+ 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
+ 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
+ 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
+ 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
+ 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
+ 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
+ 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
+};
+static const u32 rcon[] = {
+ 0x01000000, 0x02000000, 0x04000000, 0x08000000,
+ 0x10000000, 0x20000000, 0x40000000, 0x80000000,
+ 0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
+};
+
+/**
+ * Expand the cipher key into the encryption key schedule.
+ */
+int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
+ AES_KEY *key) {
+
+ u32 *rk;
+ int i = 0;
+ u32 temp;
+
+ if (!userKey || !key)
+ return -1;
+ if (bits != 128 && bits != 192 && bits != 256)
+ return -2;
+
+ rk = key->rd_key;
+
+ if (bits==128)
+ key->rounds = 10;
+ else if (bits==192)
+ key->rounds = 12;
+ else
+ key->rounds = 14;
+
+ rk[0] = GETU32(userKey );
+ rk[1] = GETU32(userKey + 4);
+ rk[2] = GETU32(userKey + 8);
+ rk[3] = GETU32(userKey + 12);
+ if (bits == 128) {
+ while (1) {
+ temp = rk[3];
+ rk[4] = rk[0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp ) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24) ] & 0x000000ff) ^
+ rcon[i];
+ rk[5] = rk[1] ^ rk[4];
+ rk[6] = rk[2] ^ rk[5];
+ rk[7] = rk[3] ^ rk[6];
+ if (++i == 10) {
+ return 0;
+ }
+ rk += 4;
+ }
+ }
+ rk[4] = GETU32(userKey + 16);
+ rk[5] = GETU32(userKey + 20);
+ if (bits == 192) {
+ while (1) {
+ temp = rk[ 5];
+ rk[ 6] = rk[ 0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp ) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24) ] & 0x000000ff) ^
+ rcon[i];
+ rk[ 7] = rk[ 1] ^ rk[ 6];
+ rk[ 8] = rk[ 2] ^ rk[ 7];
+ rk[ 9] = rk[ 3] ^ rk[ 8];
+ if (++i == 8) {
+ return 0;
+ }
+ rk[10] = rk[ 4] ^ rk[ 9];
+ rk[11] = rk[ 5] ^ rk[10];
+ rk += 6;
+ }
+ }
+ rk[6] = GETU32(userKey + 24);
+ rk[7] = GETU32(userKey + 28);
+ if (bits == 256) {
+ while (1) {
+ temp = rk[ 7];
+ rk[ 8] = rk[ 0] ^
+ (Te4[(temp >> 16) & 0xff] & 0xff000000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp ) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp >> 24) ] & 0x000000ff) ^
+ rcon[i];
+ rk[ 9] = rk[ 1] ^ rk[ 8];
+ rk[10] = rk[ 2] ^ rk[ 9];
+ rk[11] = rk[ 3] ^ rk[10];
+ if (++i == 7) {
+ return 0;
+ }
+ temp = rk[11];
+ rk[12] = rk[ 4] ^
+ (Te4[(temp >> 24) ] & 0xff000000) ^
+ (Te4[(temp >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(temp >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(temp ) & 0xff] & 0x000000ff);
+ rk[13] = rk[ 5] ^ rk[12];
+ rk[14] = rk[ 6] ^ rk[13];
+ rk[15] = rk[ 7] ^ rk[14];
+
+ rk += 8;
+ }
+ }
+ return 0;
+}
+
+/**
+ * Expand the cipher key into the decryption key schedule.
+ */
+int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
+ AES_KEY *key) {
+
+ u32 *rk;
+ int i, j, status;
+ u32 temp;
+
+ /* first, start with an encryption schedule */
+ status = AES_set_encrypt_key(userKey, bits, key);
+ if (status < 0)
+ return status;
+
+ rk = key->rd_key;
+
+ /* invert the order of the round keys: */
+ for (i = 0, j = 4*(key->rounds); i < j; i += 4, j -= 4) {
+ temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp;
+ temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
+ temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
+ temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
+ }
+ /* apply the inverse MixColumn transform to all round keys but the first and the last: */
+ for (i = 1; i < (key->rounds); i++) {
+ rk += 4;
+ rk[0] =
+ Td0[Te4[(rk[0] >> 24) ] & 0xff] ^
+ Td1[Te4[(rk[0] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[0] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[0] ) & 0xff] & 0xff];
+ rk[1] =
+ Td0[Te4[(rk[1] >> 24) ] & 0xff] ^
+ Td1[Te4[(rk[1] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[1] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[1] ) & 0xff] & 0xff];
+ rk[2] =
+ Td0[Te4[(rk[2] >> 24) ] & 0xff] ^
+ Td1[Te4[(rk[2] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[2] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[2] ) & 0xff] & 0xff];
+ rk[3] =
+ Td0[Te4[(rk[3] >> 24) ] & 0xff] ^
+ Td1[Te4[(rk[3] >> 16) & 0xff] & 0xff] ^
+ Td2[Te4[(rk[3] >> 8) & 0xff] & 0xff] ^
+ Td3[Te4[(rk[3] ) & 0xff] & 0xff];
+ }
+ return 0;
+}
+
+#ifndef AES_ASM
+/*
+ * Encrypt a single block
+ * in and out can overlap
+ */
+void AES_encrypt(const unsigned char *in, unsigned char *out,
+ const AES_KEY *key) {
+
+ const u32 *rk;
+ u32 s0, s1, s2, s3, t0, t1, t2, t3;
+#ifndef FULL_UNROLL
+ int r;
+#endif /* ?FULL_UNROLL */
+
+ assert(in && out && key);
+ rk = key->rd_key;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = GETU32(in ) ^ rk[0];
+ s1 = GETU32(in + 4) ^ rk[1];
+ s2 = GETU32(in + 8) ^ rk[2];
+ s3 = GETU32(in + 12) ^ rk[3];
+#ifdef FULL_UNROLL
+ /* round 1: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
+ /* round 2: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
+ /* round 3: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
+ /* round 4: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
+ /* round 5: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
+ /* round 6: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
+ /* round 7: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
+ /* round 8: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
+ /* round 9: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
+ if (key->rounds > 10) {
+ /* round 10: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
+ /* round 11: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
+ if (key->rounds > 12) {
+ /* round 12: */
+ s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
+ s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
+ s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
+ s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
+ /* round 13: */
+ t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
+ t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
+ t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
+ t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
+ }
+ }
+ rk += key->rounds << 2;
+#else /* !FULL_UNROLL */
+ /*
+ * Nr - 1 full rounds:
+ */
+ r = key->rounds >> 1;
+ for (;;) {
+ t0 =
+ Te0[(s0 >> 24) ] ^
+ Te1[(s1 >> 16) & 0xff] ^
+ Te2[(s2 >> 8) & 0xff] ^
+ Te3[(s3 ) & 0xff] ^
+ rk[4];
+ t1 =
+ Te0[(s1 >> 24) ] ^
+ Te1[(s2 >> 16) & 0xff] ^
+ Te2[(s3 >> 8) & 0xff] ^
+ Te3[(s0 ) & 0xff] ^
+ rk[5];
+ t2 =
+ Te0[(s2 >> 24) ] ^
+ Te1[(s3 >> 16) & 0xff] ^
+ Te2[(s0 >> 8) & 0xff] ^
+ Te3[(s1 ) & 0xff] ^
+ rk[6];
+ t3 =
+ Te0[(s3 >> 24) ] ^
+ Te1[(s0 >> 16) & 0xff] ^
+ Te2[(s1 >> 8) & 0xff] ^
+ Te3[(s2 ) & 0xff] ^
+ rk[7];
+
+ rk += 8;
+ if (--r == 0) {
+ break;
+ }
+
+ s0 =
+ Te0[(t0 >> 24) ] ^
+ Te1[(t1 >> 16) & 0xff] ^
+ Te2[(t2 >> 8) & 0xff] ^
+ Te3[(t3 ) & 0xff] ^
+ rk[0];
+ s1 =
+ Te0[(t1 >> 24) ] ^
+ Te1[(t2 >> 16) & 0xff] ^
+ Te2[(t3 >> 8) & 0xff] ^
+ Te3[(t0 ) & 0xff] ^
+ rk[1];
+ s2 =
+ Te0[(t2 >> 24) ] ^
+ Te1[(t3 >> 16) & 0xff] ^
+ Te2[(t0 >> 8) & 0xff] ^
+ Te3[(t1 ) & 0xff] ^
+ rk[2];
+ s3 =
+ Te0[(t3 >> 24) ] ^
+ Te1[(t0 >> 16) & 0xff] ^
+ Te2[(t1 >> 8) & 0xff] ^
+ Te3[(t2 ) & 0xff] ^
+ rk[3];
+ }
+#endif /* ?FULL_UNROLL */
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Te4[(t0 >> 24) ] & 0xff000000) ^
+ (Te4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t3 ) & 0xff] & 0x000000ff) ^
+ rk[0];
+ PUTU32(out , s0);
+ s1 =
+ (Te4[(t1 >> 24) ] & 0xff000000) ^
+ (Te4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t0 ) & 0xff] & 0x000000ff) ^
+ rk[1];
+ PUTU32(out + 4, s1);
+ s2 =
+ (Te4[(t2 >> 24) ] & 0xff000000) ^
+ (Te4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t1 ) & 0xff] & 0x000000ff) ^
+ rk[2];
+ PUTU32(out + 8, s2);
+ s3 =
+ (Te4[(t3 >> 24) ] & 0xff000000) ^
+ (Te4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
+ (Te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
+ (Te4[(t2 ) & 0xff] & 0x000000ff) ^
+ rk[3];
+ PUTU32(out + 12, s3);
+}
+
+/*
+ * Decrypt a single block
+ * in and out can overlap
+ */
+void AES_decrypt(const unsigned char *in, unsigned char *out,
+ const AES_KEY *key) {
+
+ const u32 *rk;
+ u32 s0, s1, s2, s3, t0, t1, t2, t3;
+#ifndef FULL_UNROLL
+ int r;
+#endif /* ?FULL_UNROLL */
+
+ assert(in && out && key);
+ rk = key->rd_key;
+
+ /*
+ * map byte array block to cipher state
+ * and add initial round key:
+ */
+ s0 = GETU32(in ) ^ rk[0];
+ s1 = GETU32(in + 4) ^ rk[1];
+ s2 = GETU32(in + 8) ^ rk[2];
+ s3 = GETU32(in + 12) ^ rk[3];
+#ifdef FULL_UNROLL
+ /* round 1: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[ 4];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[ 5];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[ 6];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[ 7];
+ /* round 2: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[ 8];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[ 9];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[10];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[11];
+ /* round 3: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[12];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[13];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[14];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[15];
+ /* round 4: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[16];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[17];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[18];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[19];
+ /* round 5: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[20];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[21];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[22];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[23];
+ /* round 6: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[24];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[25];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[26];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[27];
+ /* round 7: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[28];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[29];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[30];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[31];
+ /* round 8: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[32];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[33];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[34];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[35];
+ /* round 9: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[36];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[37];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[38];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[39];
+ if (key->rounds > 10) {
+ /* round 10: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[40];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[41];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[42];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[43];
+ /* round 11: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[44];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[45];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[46];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[47];
+ if (key->rounds > 12) {
+ /* round 12: */
+ s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^ Td3[t1 & 0xff] ^ rk[48];
+ s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^ Td3[t2 & 0xff] ^ rk[49];
+ s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^ Td3[t3 & 0xff] ^ rk[50];
+ s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^ Td3[t0 & 0xff] ^ rk[51];
+ /* round 13: */
+ t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^ Td3[s1 & 0xff] ^ rk[52];
+ t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^ Td3[s2 & 0xff] ^ rk[53];
+ t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^ Td3[s3 & 0xff] ^ rk[54];
+ t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^ Td3[s0 & 0xff] ^ rk[55];
+ }
+ }
+ rk += key->rounds << 2;
+#else /* !FULL_UNROLL */
+ /*
+ * Nr - 1 full rounds:
+ */
+ r = key->rounds >> 1;
+ for (;;) {
+ t0 =
+ Td0[(s0 >> 24) ] ^
+ Td1[(s3 >> 16) & 0xff] ^
+ Td2[(s2 >> 8) & 0xff] ^
+ Td3[(s1 ) & 0xff] ^
+ rk[4];
+ t1 =
+ Td0[(s1 >> 24) ] ^
+ Td1[(s0 >> 16) & 0xff] ^
+ Td2[(s3 >> 8) & 0xff] ^
+ Td3[(s2 ) & 0xff] ^
+ rk[5];
+ t2 =
+ Td0[(s2 >> 24) ] ^
+ Td1[(s1 >> 16) & 0xff] ^
+ Td2[(s0 >> 8) & 0xff] ^
+ Td3[(s3 ) & 0xff] ^
+ rk[6];
+ t3 =
+ Td0[(s3 >> 24) ] ^
+ Td1[(s2 >> 16) & 0xff] ^
+ Td2[(s1 >> 8) & 0xff] ^
+ Td3[(s0 ) & 0xff] ^
+ rk[7];
+
+ rk += 8;
+ if (--r == 0) {
+ break;
+ }
+
+ s0 =
+ Td0[(t0 >> 24) ] ^
+ Td1[(t3 >> 16) & 0xff] ^
+ Td2[(t2 >> 8) & 0xff] ^
+ Td3[(t1 ) & 0xff] ^
+ rk[0];
+ s1 =
+ Td0[(t1 >> 24) ] ^
+ Td1[(t0 >> 16) & 0xff] ^
+ Td2[(t3 >> 8) & 0xff] ^
+ Td3[(t2 ) & 0xff] ^
+ rk[1];
+ s2 =
+ Td0[(t2 >> 24) ] ^
+ Td1[(t1 >> 16) & 0xff] ^
+ Td2[(t0 >> 8) & 0xff] ^
+ Td3[(t3 ) & 0xff] ^
+ rk[2];
+ s3 =
+ Td0[(t3 >> 24) ] ^
+ Td1[(t2 >> 16) & 0xff] ^
+ Td2[(t1 >> 8) & 0xff] ^
+ Td3[(t0 ) & 0xff] ^
+ rk[3];
+ }
+#endif /* ?FULL_UNROLL */
+ /*
+ * apply last round and
+ * map cipher state to byte array block:
+ */
+ s0 =
+ (Td4[(t0 >> 24) ] & 0xff000000) ^
+ (Td4[(t3 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t2 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t1 ) & 0xff] & 0x000000ff) ^
+ rk[0];
+ PUTU32(out , s0);
+ s1 =
+ (Td4[(t1 >> 24) ] & 0xff000000) ^
+ (Td4[(t0 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t3 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t2 ) & 0xff] & 0x000000ff) ^
+ rk[1];
+ PUTU32(out + 4, s1);
+ s2 =
+ (Td4[(t2 >> 24) ] & 0xff000000) ^
+ (Td4[(t1 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t0 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t3 ) & 0xff] & 0x000000ff) ^
+ rk[2];
+ PUTU32(out + 8, s2);
+ s3 =
+ (Td4[(t3 >> 24) ] & 0xff000000) ^
+ (Td4[(t2 >> 16) & 0xff] & 0x00ff0000) ^
+ (Td4[(t1 >> 8) & 0xff] & 0x0000ff00) ^
+ (Td4[(t0 ) & 0xff] & 0x000000ff) ^
+ rk[3];
+ PUTU32(out + 12, s3);
+}
+
+#endif /* AES_ASM */
+
+void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
+ const unsigned long length, const AES_KEY *key,
+ unsigned char *ivec, const int enc)
+{
+
+ unsigned long n;
+ unsigned long len = length;
+ unsigned char tmp[AES_BLOCK_SIZE];
+
+ assert(in && out && key && ivec);
+
+ if (enc) {
+ while (len >= AES_BLOCK_SIZE) {
+ for(n=0; n < AES_BLOCK_SIZE; ++n)
+ tmp[n] = in[n] ^ ivec[n];
+ AES_encrypt(tmp, out, key);
+ memcpy(ivec, out, AES_BLOCK_SIZE);
+ len -= AES_BLOCK_SIZE;
+ in += AES_BLOCK_SIZE;
+ out += AES_BLOCK_SIZE;
+ }
+ if (len) {
+ for(n=0; n < len; ++n)
+ tmp[n] = in[n] ^ ivec[n];
+ for(n=len; n < AES_BLOCK_SIZE; ++n)
+ tmp[n] = ivec[n];
+ AES_encrypt(tmp, tmp, key);
+ memcpy(out, tmp, AES_BLOCK_SIZE);
+ memcpy(ivec, tmp, AES_BLOCK_SIZE);
+ }
+ } else {
+ while (len >= AES_BLOCK_SIZE) {
+ memcpy(tmp, in, AES_BLOCK_SIZE);
+ AES_decrypt(in, out, key);
+ for(n=0; n < AES_BLOCK_SIZE; ++n)
+ out[n] ^= ivec[n];
+ memcpy(ivec, tmp, AES_BLOCK_SIZE);
+ len -= AES_BLOCK_SIZE;
+ in += AES_BLOCK_SIZE;
+ out += AES_BLOCK_SIZE;
+ }
+ if (len) {
+ memcpy(tmp, in, AES_BLOCK_SIZE);
+ AES_decrypt(tmp, tmp, key);
+ for(n=0; n < len; ++n)
+ out[n] = tmp[n] ^ ivec[n];
+ memcpy(ivec, tmp, AES_BLOCK_SIZE);
+ }
+ }
+}
diff --git a/qemu-0.15.x/aes.h b/qemu-0.15.x/aes.h
new file mode 100644
index 0000000..a0167eb
--- /dev/null
+++ b/qemu-0.15.x/aes.h
@@ -0,0 +1,26 @@
+#ifndef QEMU_AES_H
+#define QEMU_AES_H
+
+#define AES_MAXNR 14
+#define AES_BLOCK_SIZE 16
+
+struct aes_key_st {
+ uint32_t rd_key[4 *(AES_MAXNR + 1)];
+ int rounds;
+};
+typedef struct aes_key_st AES_KEY;
+
+int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
+ AES_KEY *key);
+int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
+ AES_KEY *key);
+
+void AES_encrypt(const unsigned char *in, unsigned char *out,
+ const AES_KEY *key);
+void AES_decrypt(const unsigned char *in, unsigned char *out,
+ const AES_KEY *key);
+void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
+ const unsigned long length, const AES_KEY *key,
+ unsigned char *ivec, const int enc);
+
+#endif
diff --git a/qemu-0.15.x/aio.c b/qemu-0.15.x/aio.c
new file mode 100644
index 0000000..2f08655
--- /dev/null
+++ b/qemu-0.15.x/aio.c
@@ -0,0 +1,230 @@
+/*
+ * QEMU aio implementation
+ *
+ * Copyright IBM, Corp. 2008
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-common.h"
+#include "block.h"
+#include "qemu-queue.h"
+#include "qemu_socket.h"
+
+typedef struct AioHandler AioHandler;
+
+/* The list of registered AIO handlers */
+static QLIST_HEAD(, AioHandler) aio_handlers;
+
+/* This is a simple lock used to protect the aio_handlers list. Specifically,
+ * it's used to ensure that no callbacks are removed while we're walking and
+ * dispatching callbacks.
+ */
+static int walking_handlers;
+
+struct AioHandler
+{
+ int fd;
+ IOHandler *io_read;
+ IOHandler *io_write;
+ AioFlushHandler *io_flush;
+ AioProcessQueue *io_process_queue;
+ int deleted;
+ void *opaque;
+ QLIST_ENTRY(AioHandler) node;
+};
+
+static AioHandler *find_aio_handler(int fd)
+{
+ AioHandler *node;
+
+ QLIST_FOREACH(node, &aio_handlers, node) {
+ if (node->fd == fd)
+ if (!node->deleted)
+ return node;
+ }
+
+ return NULL;
+}
+
+int qemu_aio_set_fd_handler(int fd,
+ IOHandler *io_read,
+ IOHandler *io_write,
+ AioFlushHandler *io_flush,
+ AioProcessQueue *io_process_queue,
+ void *opaque)
+{
+ AioHandler *node;
+
+ node = find_aio_handler(fd);
+
+ /* Are we deleting the fd handler? */
+ if (!io_read && !io_write) {
+ if (node) {
+ /* If the lock is held, just mark the node as deleted */
+ if (walking_handlers)
+ node->deleted = 1;
+ else {
+ /* Otherwise, delete it for real. We can't just mark it as
+ * deleted because deleted nodes are only cleaned up after
+ * releasing the walking_handlers lock.
+ */
+ QLIST_REMOVE(node, node);
+ qemu_free(node);
+ }
+ }
+ } else {
+ if (node == NULL) {
+ /* Alloc and insert if it's not already there */
+ node = qemu_mallocz(sizeof(AioHandler));
+ node->fd = fd;
+ QLIST_INSERT_HEAD(&aio_handlers, node, node);
+ }
+ /* Update handler with latest information */
+ node->io_read = io_read;
+ node->io_write = io_write;
+ node->io_flush = io_flush;
+ node->io_process_queue = io_process_queue;
+ node->opaque = opaque;
+ }
+
+ qemu_set_fd_handler2(fd, NULL, io_read, io_write, opaque);
+
+ return 0;
+}
+
+void qemu_aio_flush(void)
+{
+ AioHandler *node;
+ int ret;
+
+ do {
+ ret = 0;
+
+ /*
+ * If there are pending emulated aio start them now so flush
+ * will be able to return 1.
+ */
+ qemu_aio_wait();
+
+ QLIST_FOREACH(node, &aio_handlers, node) {
+ if (node->io_flush) {
+ ret |= node->io_flush(node->opaque);
+ }
+ }
+ } while (qemu_bh_poll() || ret > 0);
+}
+
+int qemu_aio_process_queue(void)
+{
+ AioHandler *node;
+ int ret = 0;
+
+ walking_handlers = 1;
+
+ QLIST_FOREACH(node, &aio_handlers, node) {
+ if (node->io_process_queue) {
+ if (node->io_process_queue(node->opaque)) {
+ ret = 1;
+ }
+ }
+ }
+
+ walking_handlers = 0;
+
+ return ret;
+}
+
+void qemu_aio_wait(void)
+{
+ int ret;
+
+ if (qemu_bh_poll())
+ return;
+
+ /*
+ * If there are callbacks left that have been queued, we need to call then.
+ * Return afterwards to avoid waiting needlessly in select().
+ */
+ if (qemu_aio_process_queue())
+ return;
+
+ do {
+ AioHandler *node;
+ fd_set rdfds, wrfds;
+ int max_fd = -1;
+
+ walking_handlers = 1;
+
+ FD_ZERO(&rdfds);
+ FD_ZERO(&wrfds);
+
+ /* fill fd sets */
+ QLIST_FOREACH(node, &aio_handlers, node) {
+ /* If there aren't pending AIO operations, don't invoke callbacks.
+ * Otherwise, if there are no AIO requests, qemu_aio_wait() would
+ * wait indefinitely.
+ */
+ if (node->io_flush && node->io_flush(node->opaque) == 0)
+ continue;
+
+ if (!node->deleted && node->io_read) {
+ FD_SET(node->fd, &rdfds);
+ max_fd = MAX(max_fd, node->fd + 1);
+ }
+ if (!node->deleted && node->io_write) {
+ FD_SET(node->fd, &wrfds);
+ max_fd = MAX(max_fd, node->fd + 1);
+ }
+ }
+
+ walking_handlers = 0;
+
+ /* No AIO operations? Get us out of here */
+ if (max_fd == -1)
+ break;
+
+ /* wait until next event */
+ ret = select(max_fd, &rdfds, &wrfds, NULL, NULL);
+ if (ret == -1 && errno == EINTR)
+ continue;
+
+ /* if we have any readable fds, dispatch event */
+ if (ret > 0) {
+ walking_handlers = 1;
+
+ /* we have to walk very carefully in case
+ * qemu_aio_set_fd_handler is called while we're walking */
+ node = QLIST_FIRST(&aio_handlers);
+ while (node) {
+ AioHandler *tmp;
+
+ if (!node->deleted &&
+ FD_ISSET(node->fd, &rdfds) &&
+ node->io_read) {
+ node->io_read(node->opaque);
+ }
+ if (!node->deleted &&
+ FD_ISSET(node->fd, &wrfds) &&
+ node->io_write) {
+ node->io_write(node->opaque);
+ }
+
+ tmp = node;
+ node = QLIST_NEXT(node, node);
+
+ if (tmp->deleted) {
+ QLIST_REMOVE(tmp, node);
+ qemu_free(tmp);
+ }
+ }
+
+ walking_handlers = 0;
+ }
+ } while (ret == 0);
+}
diff --git a/qemu-0.15.x/alpha-dis.c b/qemu-0.15.x/alpha-dis.c
new file mode 100644
index 0000000..ae331b3
--- /dev/null
+++ b/qemu-0.15.x/alpha-dis.c
@@ -0,0 +1,1916 @@
+/* alpha-dis.c -- Disassemble Alpha AXP instructions
+ Copyright 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Contributed by Richard Henderson <rth(a)tamu.edu>,
+ patterned after the PPC opcode handling written by Ian Lance Taylor.
+
+This file is part of GDB, GAS, and the GNU binutils.
+
+GDB, GAS, and the GNU binutils are free software; you can redistribute
+them and/or modify them under the terms of the GNU General Public
+License as published by the Free Software Foundation; either version
+2, or (at your option) any later version.
+
+GDB, GAS, and the GNU binutils are distributed in the hope that they
+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 file; see the file COPYING. If not, see
+<http://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include "dis-asm.h"
+
+/* MAX is redefined below, so remove any previous definition. */
+#undef MAX
+
+/* The opcode table is an array of struct alpha_opcode. */
+
+struct alpha_opcode
+{
+ /* The opcode name. */
+ const char *name;
+
+ /* The opcode itself. Those bits which will be filled in with
+ operands are zeroes. */
+ unsigned opcode;
+
+ /* The opcode mask. This is used by the disassembler. This is a
+ mask containing ones indicating those bits which must match the
+ opcode field, and zeroes indicating those bits which need not
+ match (and are presumably filled in by operands). */
+ unsigned mask;
+
+ /* One bit flags for the opcode. These are primarily used to
+ indicate specific processors and environments support the
+ instructions. The defined values are listed below. */
+ unsigned flags;
+
+ /* An array of operand codes. Each code is an index into the
+ operand table. They appear in the order which the operands must
+ appear in assembly code, and are terminated by a zero. */
+ unsigned char operands[4];
+};
+
+/* The table itself is sorted by major opcode number, and is otherwise
+ in the order in which the disassembler should consider
+ instructions. */
+extern const struct alpha_opcode alpha_opcodes[];
+extern const unsigned alpha_num_opcodes;
+
+/* Values defined for the flags field of a struct alpha_opcode. */
+
+/* CPU Availability */
+#define AXP_OPCODE_BASE 0x0001 /* Base architecture -- all cpus. */
+#define AXP_OPCODE_EV4 0x0002 /* EV4 specific PALcode insns. */
+#define AXP_OPCODE_EV5 0x0004 /* EV5 specific PALcode insns. */
+#define AXP_OPCODE_EV6 0x0008 /* EV6 specific PALcode insns. */
+#define AXP_OPCODE_BWX 0x0100 /* Byte/word extension (amask bit 0). */
+#define AXP_OPCODE_CIX 0x0200 /* "Count" extension (amask bit 1). */
+#define AXP_OPCODE_MAX 0x0400 /* Multimedia extension (amask bit 8). */
+
+#define AXP_OPCODE_NOPAL (~(AXP_OPCODE_EV4|AXP_OPCODE_EV5|AXP_OPCODE_EV6))
+
+/* A macro to extract the major opcode from an instruction. */
+#define AXP_OP(i) (((i) >> 26) & 0x3F)
+
+/* The total number of major opcodes. */
+#define AXP_NOPS 0x40
+
+
+/* The operands table is an array of struct alpha_operand. */
+
+struct alpha_operand
+{
+ /* The number of bits in the operand. */
+ unsigned int bits : 5;
+
+ /* How far the operand is left shifted in the instruction. */
+ unsigned int shift : 5;
+
+ /* The default relocation type for this operand. */
+ signed int default_reloc : 16;
+
+ /* One bit syntax flags. */
+ unsigned int flags : 16;
+
+ /* Insertion function. This is used by the assembler. To insert an
+ operand value into an instruction, check this field.
+
+ If it is NULL, execute
+ i |= (op & ((1 << o->bits) - 1)) << o->shift;
+ (i is the instruction which we are filling in, o is a pointer to
+ this structure, and op is the opcode value; this assumes twos
+ complement arithmetic).
+
+ If this field is not NULL, then simply call it with the
+ instruction and the operand value. It will return the new value
+ of the instruction. If the ERRMSG argument is not NULL, then if
+ the operand value is illegal, *ERRMSG will be set to a warning
+ string (the operand will be inserted in any case). If the
+ operand value is legal, *ERRMSG will be unchanged (most operands
+ can accept any value). */
+ unsigned (*insert) (unsigned instruction, int op,
+ const char **errmsg);
+
+ /* Extraction function. This is used by the disassembler. To
+ extract this operand type from an instruction, check this field.
+
+ If it is NULL, compute
+ op = ((i) >> o->shift) & ((1 << o->bits) - 1);
+ if ((o->flags & AXP_OPERAND_SIGNED) != 0
+ && (op & (1 << (o->bits - 1))) != 0)
+ op -= 1 << o->bits;
+ (i is the instruction, o is a pointer to this structure, and op
+ is the result; this assumes twos complement arithmetic).
+
+ If this field is not NULL, then simply call it with the
+ instruction value. It will return the value of the operand. If
+ the INVALID argument is not NULL, *INVALID will be set to
+ non-zero if this operand type can not actually be extracted from
+ this operand (i.e., the instruction does not match). If the
+ operand is valid, *INVALID will not be changed. */
+ int (*extract) (unsigned instruction, int *invalid);
+};
+
+/* Elements in the table are retrieved by indexing with values from
+ the operands field of the alpha_opcodes table. */
+
+extern const struct alpha_operand alpha_operands[];
+extern const unsigned alpha_num_operands;
+
+/* Values defined for the flags field of a struct alpha_operand. */
+
+/* Mask for selecting the type for typecheck purposes */
+#define AXP_OPERAND_TYPECHECK_MASK \
+ (AXP_OPERAND_PARENS | AXP_OPERAND_COMMA | AXP_OPERAND_IR | \
+ AXP_OPERAND_FPR | AXP_OPERAND_RELATIVE | AXP_OPERAND_SIGNED | \
+ AXP_OPERAND_UNSIGNED)
+
+/* This operand does not actually exist in the assembler input. This
+ is used to support extended mnemonics, for which two operands fields
+ are identical. The assembler should call the insert function with
+ any op value. The disassembler should call the extract function,
+ ignore the return value, and check the value placed in the invalid
+ argument. */
+#define AXP_OPERAND_FAKE 01
+
+/* The operand should be wrapped in parentheses rather than separated
+ from the previous by a comma. This is used for the load and store
+ instructions which want their operands to look like "Ra,disp(Rb)". */
+#define AXP_OPERAND_PARENS 02
+
+/* Used in combination with PARENS, this suppresses the suppression of
+ the comma. This is used for "jmp Ra,(Rb),hint". */
+#define AXP_OPERAND_COMMA 04
+
+/* This operand names an integer register. */
+#define AXP_OPERAND_IR 010
+
+/* This operand names a floating point register. */
+#define AXP_OPERAND_FPR 020
+
+/* This operand is a relative branch displacement. The disassembler
+ prints these symbolically if possible. */
+#define AXP_OPERAND_RELATIVE 040
+
+/* This operand takes signed values. */
+#define AXP_OPERAND_SIGNED 0100
+
+/* This operand takes unsigned values. This exists primarily so that
+ a flags value of 0 can be treated as end-of-arguments. */
+#define AXP_OPERAND_UNSIGNED 0200
+
+/* Suppress overflow detection on this field. This is used for hints. */
+#define AXP_OPERAND_NOOVERFLOW 0400
+
+/* Mask for optional argument default value. */
+#define AXP_OPERAND_OPTIONAL_MASK 07000
+
+/* This operand defaults to zero. This is used for jump hints. */
+#define AXP_OPERAND_DEFAULT_ZERO 01000
+
+/* This operand should default to the first (real) operand and is used
+ in conjunction with AXP_OPERAND_OPTIONAL. This allows
+ "and $0,3,$0" to be written as "and $0,3", etc. I don't like
+ it, but it's what DEC does. */
+#define AXP_OPERAND_DEFAULT_FIRST 02000
+
+/* Similarly, this operand should default to the second (real) operand.
+ This allows "negl $0" instead of "negl $0,$0". */
+#define AXP_OPERAND_DEFAULT_SECOND 04000
+
+
+/* Register common names */
+
+#define AXP_REG_V0 0
+#define AXP_REG_T0 1
+#define AXP_REG_T1 2
+#define AXP_REG_T2 3
+#define AXP_REG_T3 4
+#define AXP_REG_T4 5
+#define AXP_REG_T5 6
+#define AXP_REG_T6 7
+#define AXP_REG_T7 8
+#define AXP_REG_S0 9
+#define AXP_REG_S1 10
+#define AXP_REG_S2 11
+#define AXP_REG_S3 12
+#define AXP_REG_S4 13
+#define AXP_REG_S5 14
+#define AXP_REG_FP 15
+#define AXP_REG_A0 16
+#define AXP_REG_A1 17
+#define AXP_REG_A2 18
+#define AXP_REG_A3 19
+#define AXP_REG_A4 20
+#define AXP_REG_A5 21
+#define AXP_REG_T8 22
+#define AXP_REG_T9 23
+#define AXP_REG_T10 24
+#define AXP_REG_T11 25
+#define AXP_REG_RA 26
+#define AXP_REG_PV 27
+#define AXP_REG_T12 27
+#define AXP_REG_AT 28
+#define AXP_REG_GP 29
+#define AXP_REG_SP 30
+#define AXP_REG_ZERO 31
+
+enum bfd_reloc_code_real {
+ BFD_RELOC_23_PCREL_S2,
+ BFD_RELOC_ALPHA_HINT
+};
+
+/* This file holds the Alpha AXP opcode table. The opcode table includes
+ almost all of the extended instruction mnemonics. This permits the
+ disassembler to use them, and simplifies the assembler logic, at the
+ cost of increasing the table size. The table is strictly constant
+ data, so the compiler should be able to put it in the text segment.
+
+ This file also holds the operand table. All knowledge about inserting
+ and extracting operands from instructions is kept in this file.
+
+ The information for the base instruction set was compiled from the
+ _Alpha Architecture Handbook_, Digital Order Number EC-QD2KB-TE,
+ version 2.
+
+ The information for the post-ev5 architecture extensions BWX, CIX and
+ MAX came from version 3 of this same document, which is also available
+ on-line at http://ftp.digital.com/pub/Digital/info/semiconductor
+ /literature/alphahb2.pdf
+
+ The information for the EV4 PALcode instructions was compiled from
+ _DECchip 21064 and DECchip 21064A Alpha AXP Microprocessors Hardware
+ Reference Manual_, Digital Order Number EC-Q9ZUA-TE, preliminary
+ revision dated June 1994.
+
+ The information for the EV5 PALcode instructions was compiled from
+ _Alpha 21164 Microprocessor Hardware Reference Manual_, Digital
+ Order Number EC-QAEQB-TE, preliminary revision dated April 1995. */
+
+/* Local insertion and extraction functions */
+
+static unsigned insert_rba (unsigned, int, const char **);
+static unsigned insert_rca (unsigned, int, const char **);
+static unsigned insert_za (unsigned, int, const char **);
+static unsigned insert_zb (unsigned, int, const char **);
+static unsigned insert_zc (unsigned, int, const char **);
+static unsigned insert_bdisp (unsigned, int, const char **);
+static unsigned insert_jhint (unsigned, int, const char **);
+static unsigned insert_ev6hwjhint (unsigned, int, const char **);
+
+static int extract_rba (unsigned, int *);
+static int extract_rca (unsigned, int *);
+static int extract_za (unsigned, int *);
+static int extract_zb (unsigned, int *);
+static int extract_zc (unsigned, int *);
+static int extract_bdisp (unsigned, int *);
+static int extract_jhint (unsigned, int *);
+static int extract_ev6hwjhint (unsigned, int *);
+
+
+/* The operands table */
+
+const struct alpha_operand alpha_operands[] =
+{
+ /* The fields are bits, shift, insert, extract, flags */
+ /* The zero index is used to indicate end-of-list */
+#define UNUSED 0
+ { 0, 0, 0, 0, 0, 0 },
+
+ /* The plain integer register fields */
+#define RA (UNUSED + 1)
+ { 5, 21, 0, AXP_OPERAND_IR, 0, 0 },
+#define RB (RA + 1)
+ { 5, 16, 0, AXP_OPERAND_IR, 0, 0 },
+#define RC (RB + 1)
+ { 5, 0, 0, AXP_OPERAND_IR, 0, 0 },
+
+ /* The plain fp register fields */
+#define FA (RC + 1)
+ { 5, 21, 0, AXP_OPERAND_FPR, 0, 0 },
+#define FB (FA + 1)
+ { 5, 16, 0, AXP_OPERAND_FPR, 0, 0 },
+#define FC (FB + 1)
+ { 5, 0, 0, AXP_OPERAND_FPR, 0, 0 },
+
+ /* The integer registers when they are ZERO */
+#define ZA (FC + 1)
+ { 5, 21, 0, AXP_OPERAND_FAKE, insert_za, extract_za },
+#define ZB (ZA + 1)
+ { 5, 16, 0, AXP_OPERAND_FAKE, insert_zb, extract_zb },
+#define ZC (ZB + 1)
+ { 5, 0, 0, AXP_OPERAND_FAKE, insert_zc, extract_zc },
+
+ /* The RB field when it needs parentheses */
+#define PRB (ZC + 1)
+ { 5, 16, 0, AXP_OPERAND_IR|AXP_OPERAND_PARENS, 0, 0 },
+
+ /* The RB field when it needs parentheses _and_ a preceding comma */
+#define CPRB (PRB + 1)
+ { 5, 16, 0,
+ AXP_OPERAND_IR|AXP_OPERAND_PARENS|AXP_OPERAND_COMMA, 0, 0 },
+
+ /* The RB field when it must be the same as the RA field */
+#define RBA (CPRB + 1)
+ { 5, 16, 0, AXP_OPERAND_FAKE, insert_rba, extract_rba },
+
+ /* The RC field when it must be the same as the RB field */
+#define RCA (RBA + 1)
+ { 5, 0, 0, AXP_OPERAND_FAKE, insert_rca, extract_rca },
+
+ /* The RC field when it can *default* to RA */
+#define DRC1 (RCA + 1)
+ { 5, 0, 0,
+ AXP_OPERAND_IR|AXP_OPERAND_DEFAULT_FIRST, 0, 0 },
+
+ /* The RC field when it can *default* to RB */
+#define DRC2 (DRC1 + 1)
+ { 5, 0, 0,
+ AXP_OPERAND_IR|AXP_OPERAND_DEFAULT_SECOND, 0, 0 },
+
+ /* The FC field when it can *default* to RA */
+#define DFC1 (DRC2 + 1)
+ { 5, 0, 0,
+ AXP_OPERAND_FPR|AXP_OPERAND_DEFAULT_FIRST, 0, 0 },
+
+ /* The FC field when it can *default* to RB */
+#define DFC2 (DFC1 + 1)
+ { 5, 0, 0,
+ AXP_OPERAND_FPR|AXP_OPERAND_DEFAULT_SECOND, 0, 0 },
+
+ /* The unsigned 8-bit literal of Operate format insns */
+#define LIT (DFC2 + 1)
+ { 8, 13, -LIT, AXP_OPERAND_UNSIGNED, 0, 0 },
+
+ /* The signed 16-bit displacement of Memory format insns. From here
+ we can't tell what relocation should be used, so don't use a default. */
+#define MDISP (LIT + 1)
+ { 16, 0, -MDISP, AXP_OPERAND_SIGNED, 0, 0 },
+
+ /* The signed "23-bit" aligned displacement of Branch format insns */
+#define BDISP (MDISP + 1)
+ { 21, 0, BFD_RELOC_23_PCREL_S2,
+ AXP_OPERAND_RELATIVE, insert_bdisp, extract_bdisp },
+
+ /* The 26-bit PALcode function */
+#define PALFN (BDISP + 1)
+ { 26, 0, -PALFN, AXP_OPERAND_UNSIGNED, 0, 0 },
+
+ /* The optional signed "16-bit" aligned displacement of the JMP/JSR hint */
+#define JMPHINT (PALFN + 1)
+ { 14, 0, BFD_RELOC_ALPHA_HINT,
+ AXP_OPERAND_RELATIVE|AXP_OPERAND_DEFAULT_ZERO|AXP_OPERAND_NOOVERFLOW,
+ insert_jhint, extract_jhint },
+
+ /* The optional hint to RET/JSR_COROUTINE */
+#define RETHINT (JMPHINT + 1)
+ { 14, 0, -RETHINT,
+ AXP_OPERAND_UNSIGNED|AXP_OPERAND_DEFAULT_ZERO, 0, 0 },
+
+ /* The 12-bit displacement for the ev[46] hw_{ld,st} (pal1b/pal1f) insns */
+#define EV4HWDISP (RETHINT + 1)
+#define EV6HWDISP (EV4HWDISP)
+ { 12, 0, -EV4HWDISP, AXP_OPERAND_SIGNED, 0, 0 },
+
+ /* The 5-bit index for the ev4 hw_m[ft]pr (pal19/pal1d) insns */
+#define EV4HWINDEX (EV4HWDISP + 1)
+ { 5, 0, -EV4HWINDEX, AXP_OPERAND_UNSIGNED, 0, 0 },
+
+ /* The 8-bit index for the oddly unqualified hw_m[tf]pr insns
+ that occur in DEC PALcode. */
+#define EV4EXTHWINDEX (EV4HWINDEX + 1)
+ { 8, 0, -EV4EXTHWINDEX, AXP_OPERAND_UNSIGNED, 0, 0 },
+
+ /* The 10-bit displacement for the ev5 hw_{ld,st} (pal1b/pal1f) insns */
+#define EV5HWDISP (EV4EXTHWINDEX + 1)
+ { 10, 0, -EV5HWDISP, AXP_OPERAND_SIGNED, 0, 0 },
+
+ /* The 16-bit index for the ev5 hw_m[ft]pr (pal19/pal1d) insns */
+#define EV5HWINDEX (EV5HWDISP + 1)
+ { 16, 0, -EV5HWINDEX, AXP_OPERAND_UNSIGNED, 0, 0 },
+
+ /* The 16-bit combined index/scoreboard mask for the ev6
+ hw_m[ft]pr (pal19/pal1d) insns */
+#define EV6HWINDEX (EV5HWINDEX + 1)
+ { 16, 0, -EV6HWINDEX, AXP_OPERAND_UNSIGNED, 0, 0 },
+
+ /* The 13-bit branch hint for the ev6 hw_jmp/jsr (pal1e) insn */
+#define EV6HWJMPHINT (EV6HWINDEX+ 1)
+ { 8, 0, -EV6HWJMPHINT,
+ AXP_OPERAND_RELATIVE|AXP_OPERAND_DEFAULT_ZERO|AXP_OPERAND_NOOVERFLOW,
+ insert_ev6hwjhint, extract_ev6hwjhint }
+};
+
+const unsigned alpha_num_operands = sizeof(alpha_operands)/sizeof(*alpha_operands);
+
+/* The RB field when it is the same as the RA field in the same insn.
+ This operand is marked fake. The insertion function just copies
+ the RA field into the RB field, and the extraction function just
+ checks that the fields are the same. */
+
+/*ARGSUSED*/
+static unsigned
+insert_rba(unsigned insn, int value ATTRIBUTE_UNUSED, const char **errmsg ATTRIBUTE_UNUSED)
+{
+ return insn | (((insn >> 21) & 0x1f) << 16);
+}
+
+static int
+extract_rba(unsigned insn, int *invalid)
+{
+ if (invalid != (int *) NULL
+ && ((insn >> 21) & 0x1f) != ((insn >> 16) & 0x1f))
+ *invalid = 1;
+ return 0;
+}
+
+
+/* The same for the RC field */
+
+/*ARGSUSED*/
+static unsigned
+insert_rca(unsigned insn, int value ATTRIBUTE_UNUSED, const char **errmsg ATTRIBUTE_UNUSED)
+{
+ return insn | ((insn >> 21) & 0x1f);
+}
+
+static int
+extract_rca(unsigned insn, int *invalid)
+{
+ if (invalid != (int *) NULL
+ && ((insn >> 21) & 0x1f) != (insn & 0x1f))
+ *invalid = 1;
+ return 0;
+}
+
+
+/* Fake arguments in which the registers must be set to ZERO */
+
+/*ARGSUSED*/
+static unsigned
+insert_za(unsigned insn, int value ATTRIBUTE_UNUSED, const char **errmsg ATTRIBUTE_UNUSED)
+{
+ return insn | (31 << 21);
+}
+
+static int
+extract_za(unsigned insn, int *invalid)
+{
+ if (invalid != (int *) NULL && ((insn >> 21) & 0x1f) != 31)
+ *invalid = 1;
+ return 0;
+}
+
+/*ARGSUSED*/
+static unsigned
+insert_zb(unsigned insn, int value ATTRIBUTE_UNUSED, const char **errmsg ATTRIBUTE_UNUSED)
+{
+ return insn | (31 << 16);
+}
+
+static int
+extract_zb(unsigned insn, int *invalid)
+{
+ if (invalid != (int *) NULL && ((insn >> 16) & 0x1f) != 31)
+ *invalid = 1;
+ return 0;
+}
+
+/*ARGSUSED*/
+static unsigned
+insert_zc(unsigned insn, int value ATTRIBUTE_UNUSED, const char **errmsg ATTRIBUTE_UNUSED)
+{
+ return insn | 31;
+}
+
+static int
+extract_zc(unsigned insn, int *invalid)
+{
+ if (invalid != (int *) NULL && (insn & 0x1f) != 31)
+ *invalid = 1;
+ return 0;
+}
+
+
+/* The displacement field of a Branch format insn. */
+
+static unsigned
+insert_bdisp(unsigned insn, int value, const char **errmsg)
+{
+ if (errmsg != (const char **)NULL && (value & 3))
+ *errmsg = _("branch operand unaligned");
+ return insn | ((value / 4) & 0x1FFFFF);
+}
+
+/*ARGSUSED*/
+static int
+extract_bdisp(unsigned insn, int *invalid ATTRIBUTE_UNUSED)
+{
+ return 4 * (((insn & 0x1FFFFF) ^ 0x100000) - 0x100000);
+}
+
+
+/* The hint field of a JMP/JSR insn. */
+
+static unsigned
+insert_jhint(unsigned insn, int value, const char **errmsg)
+{
+ if (errmsg != (const char **)NULL && (value & 3))
+ *errmsg = _("jump hint unaligned");
+ return insn | ((value / 4) & 0x3FFF);
+}
+
+/*ARGSUSED*/
+static int
+extract_jhint(unsigned insn, int *invalid ATTRIBUTE_UNUSED)
+{
+ return 4 * (((insn & 0x3FFF) ^ 0x2000) - 0x2000);
+}
+
+/* The hint field of an EV6 HW_JMP/JSR insn. */
+
+static unsigned
+insert_ev6hwjhint(unsigned insn, int value, const char **errmsg)
+{
+ if (errmsg != (const char **)NULL && (value & 3))
+ *errmsg = _("jump hint unaligned");
+ return insn | ((value / 4) & 0x1FFF);
+}
+
+/*ARGSUSED*/
+static int
+extract_ev6hwjhint(unsigned insn, int *invalid ATTRIBUTE_UNUSED)
+{
+ return 4 * (((insn & 0x1FFF) ^ 0x1000) - 0x1000);
+}
+
+
+/* Macros used to form opcodes */
+
+/* The main opcode */
+#define OP(x) (((x) & 0x3F) << 26)
+#define OP_MASK 0xFC000000
+
+/* Branch format instructions */
+#define BRA_(oo) OP(oo)
+#define BRA_MASK OP_MASK
+#define BRA(oo) BRA_(oo), BRA_MASK
+
+/* Floating point format instructions */
+#define FP_(oo,fff) (OP(oo) | (((fff) & 0x7FF) << 5))
+#define FP_MASK (OP_MASK | 0xFFE0)
+#define FP(oo,fff) FP_(oo,fff), FP_MASK
+
+/* Memory format instructions */
+#define MEM_(oo) OP(oo)
+#define MEM_MASK OP_MASK
+#define MEM(oo) MEM_(oo), MEM_MASK
+
+/* Memory/Func Code format instructions */
+#define MFC_(oo,ffff) (OP(oo) | ((ffff) & 0xFFFF))
+#define MFC_MASK (OP_MASK | 0xFFFF)
+#define MFC(oo,ffff) MFC_(oo,ffff), MFC_MASK
+
+/* Memory/Branch format instructions */
+#define MBR_(oo,h) (OP(oo) | (((h) & 3) << 14))
+#define MBR_MASK (OP_MASK | 0xC000)
+#define MBR(oo,h) MBR_(oo,h), MBR_MASK
+
+/* Operate format instructions. The OPRL variant specifies a
+ literal second argument. */
+#define OPR_(oo,ff) (OP(oo) | (((ff) & 0x7F) << 5))
+#define OPRL_(oo,ff) (OPR_((oo),(ff)) | 0x1000)
+#define OPR_MASK (OP_MASK | 0x1FE0)
+#define OPR(oo,ff) OPR_(oo,ff), OPR_MASK
+#define OPRL(oo,ff) OPRL_(oo,ff), OPR_MASK
+
+/* Generic PALcode format instructions */
+#define PCD_(oo) OP(oo)
+#define PCD_MASK OP_MASK
+#define PCD(oo) PCD_(oo), PCD_MASK
+
+/* Specific PALcode instructions */
+#define SPCD_(oo,ffff) (OP(oo) | ((ffff) & 0x3FFFFFF))
+#define SPCD_MASK 0xFFFFFFFF
+#define SPCD(oo,ffff) SPCD_(oo,ffff), SPCD_MASK
+
+/* Hardware memory (hw_{ld,st}) instructions */
+#define EV4HWMEM_(oo,f) (OP(oo) | (((f) & 0xF) << 12))
+#define EV4HWMEM_MASK (OP_MASK | 0xF000)
+#define EV4HWMEM(oo,f) EV4HWMEM_(oo,f), EV4HWMEM_MASK
+
+#define EV5HWMEM_(oo,f) (OP(oo) | (((f) & 0x3F) << 10))
+#define EV5HWMEM_MASK (OP_MASK | 0xF800)
+#define EV5HWMEM(oo,f) EV5HWMEM_(oo,f), EV5HWMEM_MASK
+
+#define EV6HWMEM_(oo,f) (OP(oo) | (((f) & 0xF) << 12))
+#define EV6HWMEM_MASK (OP_MASK | 0xF000)
+#define EV6HWMEM(oo,f) EV6HWMEM_(oo,f), EV6HWMEM_MASK
+
+#define EV6HWMBR_(oo,h) (OP(oo) | (((h) & 7) << 13))
+#define EV6HWMBR_MASK (OP_MASK | 0xE000)
+#define EV6HWMBR(oo,h) EV6HWMBR_(oo,h), EV6HWMBR_MASK
+
+/* Abbreviations for instruction subsets. */
+#define BASE AXP_OPCODE_BASE
+#define EV4 AXP_OPCODE_EV4
+#define EV5 AXP_OPCODE_EV5
+#define EV6 AXP_OPCODE_EV6
+#define BWX AXP_OPCODE_BWX
+#define CIX AXP_OPCODE_CIX
+#define MAX AXP_OPCODE_MAX
+
+/* Common combinations of arguments */
+#define ARG_NONE { 0 }
+#define ARG_BRA { RA, BDISP }
+#define ARG_FBRA { FA, BDISP }
+#define ARG_FP { FA, FB, DFC1 }
+#define ARG_FPZ1 { ZA, FB, DFC1 }
+#define ARG_MEM { RA, MDISP, PRB }
+#define ARG_FMEM { FA, MDISP, PRB }
+#define ARG_OPR { RA, RB, DRC1 }
+#define ARG_OPRL { RA, LIT, DRC1 }
+#define ARG_OPRZ1 { ZA, RB, DRC1 }
+#define ARG_OPRLZ1 { ZA, LIT, RC }
+#define ARG_PCD { PALFN }
+#define ARG_EV4HWMEM { RA, EV4HWDISP, PRB }
+#define ARG_EV4HWMPR { RA, RBA, EV4HWINDEX }
+#define ARG_EV5HWMEM { RA, EV5HWDISP, PRB }
+#define ARG_EV6HWMEM { RA, EV6HWDISP, PRB }
+
+/* The opcode table.
+
+ The format of the opcode table is:
+
+ NAME OPCODE MASK { OPERANDS }
+
+ NAME is the name of the instruction.
+
+ OPCODE is the instruction opcode.
+
+ MASK is the opcode mask; this is used to tell the disassembler
+ which bits in the actual opcode must match OPCODE.
+
+ OPERANDS is the list of operands.
+
+ The preceding macros merge the text of the OPCODE and MASK fields.
+
+ The disassembler reads the table in order and prints the first
+ instruction which matches, so this table is sorted to put more
+ specific instructions before more general instructions.
+
+ Otherwise, it is sorted by major opcode and minor function code.
+
+ There are three classes of not-really-instructions in this table:
+
+ ALIAS is another name for another instruction. Some of
+ these come from the Architecture Handbook, some
+ come from the original gas opcode tables. In all
+ cases, the functionality of the opcode is unchanged.
+
+ PSEUDO a stylized code form endorsed by Chapter A.4 of the
+ Architecture Handbook.
+
+ EXTRA a stylized code form found in the original gas tables.
+
+ And two annotations:
+
+ EV56 BUT opcodes that are officially introduced as of the ev56,
+ but with defined results on previous implementations.
+
+ EV56 UNA opcodes that were introduced as of the ev56 with
+ presumably undefined results on previous implementations
+ that were not assigned to a particular extension.
+*/
+
+const struct alpha_opcode alpha_opcodes[] = {
+ { "halt", SPCD(0x00,0x0000), BASE, ARG_NONE },
+ { "draina", SPCD(0x00,0x0002), BASE, ARG_NONE },
+ { "bpt", SPCD(0x00,0x0080), BASE, ARG_NONE },
+ { "bugchk", SPCD(0x00,0x0081), BASE, ARG_NONE },
+ { "callsys", SPCD(0x00,0x0083), BASE, ARG_NONE },
+ { "chmk", SPCD(0x00,0x0083), BASE, ARG_NONE },
+ { "imb", SPCD(0x00,0x0086), BASE, ARG_NONE },
+ { "rduniq", SPCD(0x00,0x009e), BASE, ARG_NONE },
+ { "wruniq", SPCD(0x00,0x009f), BASE, ARG_NONE },
+ { "gentrap", SPCD(0x00,0x00aa), BASE, ARG_NONE },
+ { "call_pal", PCD(0x00), BASE, ARG_PCD },
+ { "pal", PCD(0x00), BASE, ARG_PCD }, /* alias */
+
+ { "lda", MEM(0x08), BASE, { RA, MDISP, ZB } }, /* pseudo */
+ { "lda", MEM(0x08), BASE, ARG_MEM },
+ { "ldah", MEM(0x09), BASE, { RA, MDISP, ZB } }, /* pseudo */
+ { "ldah", MEM(0x09), BASE, ARG_MEM },
+ { "ldbu", MEM(0x0A), BWX, ARG_MEM },
+ { "unop", MEM_(0x0B) | (30 << 16),
+ MEM_MASK, BASE, { ZA } }, /* pseudo */
+ { "ldq_u", MEM(0x0B), BASE, ARG_MEM },
+ { "ldwu", MEM(0x0C), BWX, ARG_MEM },
+ { "stw", MEM(0x0D), BWX, ARG_MEM },
+ { "stb", MEM(0x0E), BWX, ARG_MEM },
+ { "stq_u", MEM(0x0F), BASE, ARG_MEM },
+
+ { "sextl", OPR(0x10,0x00), BASE, ARG_OPRZ1 }, /* pseudo */
+ { "sextl", OPRL(0x10,0x00), BASE, ARG_OPRLZ1 }, /* pseudo */
+ { "addl", OPR(0x10,0x00), BASE, ARG_OPR },
+ { "addl", OPRL(0x10,0x00), BASE, ARG_OPRL },
+ { "s4addl", OPR(0x10,0x02), BASE, ARG_OPR },
+ { "s4addl", OPRL(0x10,0x02), BASE, ARG_OPRL },
+ { "negl", OPR(0x10,0x09), BASE, ARG_OPRZ1 }, /* pseudo */
+ { "negl", OPRL(0x10,0x09), BASE, ARG_OPRLZ1 }, /* pseudo */
+ { "subl", OPR(0x10,0x09), BASE, ARG_OPR },
+ { "subl", OPRL(0x10,0x09), BASE, ARG_OPRL },
+ { "s4subl", OPR(0x10,0x0B), BASE, ARG_OPR },
+ { "s4subl", OPRL(0x10,0x0B), BASE, ARG_OPRL },
+ { "cmpbge", OPR(0x10,0x0F), BASE, ARG_OPR },
+ { "cmpbge", OPRL(0x10,0x0F), BASE, ARG_OPRL },
+ { "s8addl", OPR(0x10,0x12), BASE, ARG_OPR },
+ { "s8addl", OPRL(0x10,0x12), BASE, ARG_OPRL },
+ { "s8subl", OPR(0x10,0x1B), BASE, ARG_OPR },
+ { "s8subl", OPRL(0x10,0x1B), BASE, ARG_OPRL },
+ { "cmpult", OPR(0x10,0x1D), BASE, ARG_OPR },
+ { "cmpult", OPRL(0x10,0x1D), BASE, ARG_OPRL },
+ { "addq", OPR(0x10,0x20), BASE, ARG_OPR },
+ { "addq", OPRL(0x10,0x20), BASE, ARG_OPRL },
+ { "s4addq", OPR(0x10,0x22), BASE, ARG_OPR },
+ { "s4addq", OPRL(0x10,0x22), BASE, ARG_OPRL },
+ { "negq", OPR(0x10,0x29), BASE, ARG_OPRZ1 }, /* pseudo */
+ { "negq", OPRL(0x10,0x29), BASE, ARG_OPRLZ1 }, /* pseudo */
+ { "subq", OPR(0x10,0x29), BASE, ARG_OPR },
+ { "subq", OPRL(0x10,0x29), BASE, ARG_OPRL },
+ { "s4subq", OPR(0x10,0x2B), BASE, ARG_OPR },
+ { "s4subq", OPRL(0x10,0x2B), BASE, ARG_OPRL },
+ { "cmpeq", OPR(0x10,0x2D), BASE, ARG_OPR },
+ { "cmpeq", OPRL(0x10,0x2D), BASE, ARG_OPRL },
+ { "s8addq", OPR(0x10,0x32), BASE, ARG_OPR },
+ { "s8addq", OPRL(0x10,0x32), BASE, ARG_OPRL },
+ { "s8subq", OPR(0x10,0x3B), BASE, ARG_OPR },
+ { "s8subq", OPRL(0x10,0x3B), BASE, ARG_OPRL },
+ { "cmpule", OPR(0x10,0x3D), BASE, ARG_OPR },
+ { "cmpule", OPRL(0x10,0x3D), BASE, ARG_OPRL },
+ { "addl/v", OPR(0x10,0x40), BASE, ARG_OPR },
+ { "addl/v", OPRL(0x10,0x40), BASE, ARG_OPRL },
+ { "negl/v", OPR(0x10,0x49), BASE, ARG_OPRZ1 }, /* pseudo */
+ { "negl/v", OPRL(0x10,0x49), BASE, ARG_OPRLZ1 }, /* pseudo */
+ { "subl/v", OPR(0x10,0x49), BASE, ARG_OPR },
+ { "subl/v", OPRL(0x10,0x49), BASE, ARG_OPRL },
+ { "cmplt", OPR(0x10,0x4D), BASE, ARG_OPR },
+ { "cmplt", OPRL(0x10,0x4D), BASE, ARG_OPRL },
+ { "addq/v", OPR(0x10,0x60), BASE, ARG_OPR },
+ { "addq/v", OPRL(0x10,0x60), BASE, ARG_OPRL },
+ { "negq/v", OPR(0x10,0x69), BASE, ARG_OPRZ1 }, /* pseudo */
+ { "negq/v", OPRL(0x10,0x69), BASE, ARG_OPRLZ1 }, /* pseudo */
+ { "subq/v", OPR(0x10,0x69), BASE, ARG_OPR },
+ { "subq/v", OPRL(0x10,0x69), BASE, ARG_OPRL },
+ { "cmple", OPR(0x10,0x6D), BASE, ARG_OPR },
+ { "cmple", OPRL(0x10,0x6D), BASE, ARG_OPRL },
+
+ { "and", OPR(0x11,0x00), BASE, ARG_OPR },
+ { "and", OPRL(0x11,0x00), BASE, ARG_OPRL },
+ { "andnot", OPR(0x11,0x08), BASE, ARG_OPR }, /* alias */
+ { "andnot", OPRL(0x11,0x08), BASE, ARG_OPRL }, /* alias */
+ { "bic", OPR(0x11,0x08), BASE, ARG_OPR },
+ { "bic", OPRL(0x11,0x08), BASE, ARG_OPRL },
+ { "cmovlbs", OPR(0x11,0x14), BASE, ARG_OPR },
+ { "cmovlbs", OPRL(0x11,0x14), BASE, ARG_OPRL },
+ { "cmovlbc", OPR(0x11,0x16), BASE, ARG_OPR },
+ { "cmovlbc", OPRL(0x11,0x16), BASE, ARG_OPRL },
+ { "nop", OPR(0x11,0x20), BASE, { ZA, ZB, ZC } }, /* pseudo */
+ { "clr", OPR(0x11,0x20), BASE, { ZA, ZB, RC } }, /* pseudo */
+ { "mov", OPR(0x11,0x20), BASE, { ZA, RB, RC } }, /* pseudo */
+ { "mov", OPR(0x11,0x20), BASE, { RA, RBA, RC } }, /* pseudo */
+ { "mov", OPRL(0x11,0x20), BASE, { ZA, LIT, RC } }, /* pseudo */
+ { "or", OPR(0x11,0x20), BASE, ARG_OPR }, /* alias */
+ { "or", OPRL(0x11,0x20), BASE, ARG_OPRL }, /* alias */
+ { "bis", OPR(0x11,0x20), BASE, ARG_OPR },
+ { "bis", OPRL(0x11,0x20), BASE, ARG_OPRL },
+ { "cmoveq", OPR(0x11,0x24), BASE, ARG_OPR },
+ { "cmoveq", OPRL(0x11,0x24), BASE, ARG_OPRL },
+ { "cmovne", OPR(0x11,0x26), BASE, ARG_OPR },
+ { "cmovne", OPRL(0x11,0x26), BASE, ARG_OPRL },
+ { "not", OPR(0x11,0x28), BASE, ARG_OPRZ1 }, /* pseudo */
+ { "not", OPRL(0x11,0x28), BASE, ARG_OPRLZ1 }, /* pseudo */
+ { "ornot", OPR(0x11,0x28), BASE, ARG_OPR },
+ { "ornot", OPRL(0x11,0x28), BASE, ARG_OPRL },
+ { "xor", OPR(0x11,0x40), BASE, ARG_OPR },
+ { "xor", OPRL(0x11,0x40), BASE, ARG_OPRL },
+ { "cmovlt", OPR(0x11,0x44), BASE, ARG_OPR },
+ { "cmovlt", OPRL(0x11,0x44), BASE, ARG_OPRL },
+ { "cmovge", OPR(0x11,0x46), BASE, ARG_OPR },
+ { "cmovge", OPRL(0x11,0x46), BASE, ARG_OPRL },
+ { "eqv", OPR(0x11,0x48), BASE, ARG_OPR },
+ { "eqv", OPRL(0x11,0x48), BASE, ARG_OPRL },
+ { "xornot", OPR(0x11,0x48), BASE, ARG_OPR }, /* alias */
+ { "xornot", OPRL(0x11,0x48), BASE, ARG_OPRL }, /* alias */
+ { "amask", OPR(0x11,0x61), BASE, ARG_OPRZ1 }, /* ev56 but */
+ { "amask", OPRL(0x11,0x61), BASE, ARG_OPRLZ1 }, /* ev56 but */
+ { "cmovle", OPR(0x11,0x64), BASE, ARG_OPR },
+ { "cmovle", OPRL(0x11,0x64), BASE, ARG_OPRL },
+ { "cmovgt", OPR(0x11,0x66), BASE, ARG_OPR },
+ { "cmovgt", OPRL(0x11,0x66), BASE, ARG_OPRL },
+ { "implver", OPRL_(0x11,0x6C)|(31<<21)|(1<<13),
+ 0xFFFFFFE0, BASE, { RC } }, /* ev56 but */
+
+ { "mskbl", OPR(0x12,0x02), BASE, ARG_OPR },
+ { "mskbl", OPRL(0x12,0x02), BASE, ARG_OPRL },
+ { "extbl", OPR(0x12,0x06), BASE, ARG_OPR },
+ { "extbl", OPRL(0x12,0x06), BASE, ARG_OPRL },
+ { "insbl", OPR(0x12,0x0B), BASE, ARG_OPR },
+ { "insbl", OPRL(0x12,0x0B), BASE, ARG_OPRL },
+ { "mskwl", OPR(0x12,0x12), BASE, ARG_OPR },
+ { "mskwl", OPRL(0x12,0x12), BASE, ARG_OPRL },
+ { "extwl", OPR(0x12,0x16), BASE, ARG_OPR },
+ { "extwl", OPRL(0x12,0x16), BASE, ARG_OPRL },
+ { "inswl", OPR(0x12,0x1B), BASE, ARG_OPR },
+ { "inswl", OPRL(0x12,0x1B), BASE, ARG_OPRL },
+ { "mskll", OPR(0x12,0x22), BASE, ARG_OPR },
+ { "mskll", OPRL(0x12,0x22), BASE, ARG_OPRL },
+ { "extll", OPR(0x12,0x26), BASE, ARG_OPR },
+ { "extll", OPRL(0x12,0x26), BASE, ARG_OPRL },
+ { "insll", OPR(0x12,0x2B), BASE, ARG_OPR },
+ { "insll", OPRL(0x12,0x2B), BASE, ARG_OPRL },
+ { "zap", OPR(0x12,0x30), BASE, ARG_OPR },
+ { "zap", OPRL(0x12,0x30), BASE, ARG_OPRL },
+ { "zapnot", OPR(0x12,0x31), BASE, ARG_OPR },
+ { "zapnot", OPRL(0x12,0x31), BASE, ARG_OPRL },
+ { "mskql", OPR(0x12,0x32), BASE, ARG_OPR },
+ { "mskql", OPRL(0x12,0x32), BASE, ARG_OPRL },
+ { "srl", OPR(0x12,0x34), BASE, ARG_OPR },
+ { "srl", OPRL(0x12,0x34), BASE, ARG_OPRL },
+ { "extql", OPR(0x12,0x36), BASE, ARG_OPR },
+ { "extql", OPRL(0x12,0x36), BASE, ARG_OPRL },
+ { "sll", OPR(0x12,0x39), BASE, ARG_OPR },
+ { "sll", OPRL(0x12,0x39), BASE, ARG_OPRL },
+ { "insql", OPR(0x12,0x3B), BASE, ARG_OPR },
+ { "insql", OPRL(0x12,0x3B), BASE, ARG_OPRL },
+ { "sra", OPR(0x12,0x3C), BASE, ARG_OPR },
+ { "sra", OPRL(0x12,0x3C), BASE, ARG_OPRL },
+ { "mskwh", OPR(0x12,0x52), BASE, ARG_OPR },
+ { "mskwh", OPRL(0x12,0x52), BASE, ARG_OPRL },
+ { "inswh", OPR(0x12,0x57), BASE, ARG_OPR },
+ { "inswh", OPRL(0x12,0x57), BASE, ARG_OPRL },
+ { "extwh", OPR(0x12,0x5A), BASE, ARG_OPR },
+ { "extwh", OPRL(0x12,0x5A), BASE, ARG_OPRL },
+ { "msklh", OPR(0x12,0x62), BASE, ARG_OPR },
+ { "msklh", OPRL(0x12,0x62), BASE, ARG_OPRL },
+ { "inslh", OPR(0x12,0x67), BASE, ARG_OPR },
+ { "inslh", OPRL(0x12,0x67), BASE, ARG_OPRL },
+ { "extlh", OPR(0x12,0x6A), BASE, ARG_OPR },
+ { "extlh", OPRL(0x12,0x6A), BASE, ARG_OPRL },
+ { "mskqh", OPR(0x12,0x72), BASE, ARG_OPR },
+ { "mskqh", OPRL(0x12,0x72), BASE, ARG_OPRL },
+ { "insqh", OPR(0x12,0x77), BASE, ARG_OPR },
+ { "insqh", OPRL(0x12,0x77), BASE, ARG_OPRL },
+ { "extqh", OPR(0x12,0x7A), BASE, ARG_OPR },
+ { "extqh", OPRL(0x12,0x7A), BASE, ARG_OPRL },
+
+ { "mull", OPR(0x13,0x00), BASE, ARG_OPR },
+ { "mull", OPRL(0x13,0x00), BASE, ARG_OPRL },
+ { "mulq", OPR(0x13,0x20), BASE, ARG_OPR },
+ { "mulq", OPRL(0x13,0x20), BASE, ARG_OPRL },
+ { "umulh", OPR(0x13,0x30), BASE, ARG_OPR },
+ { "umulh", OPRL(0x13,0x30), BASE, ARG_OPRL },
+ { "mull/v", OPR(0x13,0x40), BASE, ARG_OPR },
+ { "mull/v", OPRL(0x13,0x40), BASE, ARG_OPRL },
+ { "mulq/v", OPR(0x13,0x60), BASE, ARG_OPR },
+ { "mulq/v", OPRL(0x13,0x60), BASE, ARG_OPRL },
+
+ { "itofs", FP(0x14,0x004), CIX, { RA, ZB, FC } },
+ { "sqrtf/c", FP(0x14,0x00A), CIX, ARG_FPZ1 },
+ { "sqrts/c", FP(0x14,0x00B), CIX, ARG_FPZ1 },
+ { "itoff", FP(0x14,0x014), CIX, { RA, ZB, FC } },
+ { "itoft", FP(0x14,0x024), CIX, { RA, ZB, FC } },
+ { "sqrtg/c", FP(0x14,0x02A), CIX, ARG_FPZ1 },
+ { "sqrtt/c", FP(0x14,0x02B), CIX, ARG_FPZ1 },
+ { "sqrts/m", FP(0x14,0x04B), CIX, ARG_FPZ1 },
+ { "sqrtt/m", FP(0x14,0x06B), CIX, ARG_FPZ1 },
+ { "sqrtf", FP(0x14,0x08A), CIX, ARG_FPZ1 },
+ { "sqrts", FP(0x14,0x08B), CIX, ARG_FPZ1 },
+ { "sqrtg", FP(0x14,0x0AA), CIX, ARG_FPZ1 },
+ { "sqrtt", FP(0x14,0x0AB), CIX, ARG_FPZ1 },
+ { "sqrts/d", FP(0x14,0x0CB), CIX, ARG_FPZ1 },
+ { "sqrtt/d", FP(0x14,0x0EB), CIX, ARG_FPZ1 },
+ { "sqrtf/uc", FP(0x14,0x10A), CIX, ARG_FPZ1 },
+ { "sqrts/uc", FP(0x14,0x10B), CIX, ARG_FPZ1 },
+ { "sqrtg/uc", FP(0x14,0x12A), CIX, ARG_FPZ1 },
+ { "sqrtt/uc", FP(0x14,0x12B), CIX, ARG_FPZ1 },
+ { "sqrts/um", FP(0x14,0x14B), CIX, ARG_FPZ1 },
+ { "sqrtt/um", FP(0x14,0x16B), CIX, ARG_FPZ1 },
+ { "sqrtf/u", FP(0x14,0x18A), CIX, ARG_FPZ1 },
+ { "sqrts/u", FP(0x14,0x18B), CIX, ARG_FPZ1 },
+ { "sqrtg/u", FP(0x14,0x1AA), CIX, ARG_FPZ1 },
+ { "sqrtt/u", FP(0x14,0x1AB), CIX, ARG_FPZ1 },
+ { "sqrts/ud", FP(0x14,0x1CB), CIX, ARG_FPZ1 },
+ { "sqrtt/ud", FP(0x14,0x1EB), CIX, ARG_FPZ1 },
+ { "sqrtf/sc", FP(0x14,0x40A), CIX, ARG_FPZ1 },
+ { "sqrtg/sc", FP(0x14,0x42A), CIX, ARG_FPZ1 },
+ { "sqrtf/s", FP(0x14,0x48A), CIX, ARG_FPZ1 },
+ { "sqrtg/s", FP(0x14,0x4AA), CIX, ARG_FPZ1 },
+ { "sqrtf/suc", FP(0x14,0x50A), CIX, ARG_FPZ1 },
+ { "sqrts/suc", FP(0x14,0x50B), CIX, ARG_FPZ1 },
+ { "sqrtg/suc", FP(0x14,0x52A), CIX, ARG_FPZ1 },
+ { "sqrtt/suc", FP(0x14,0x52B), CIX, ARG_FPZ1 },
+ { "sqrts/sum", FP(0x14,0x54B), CIX, ARG_FPZ1 },
+ { "sqrtt/sum", FP(0x14,0x56B), CIX, ARG_FPZ1 },
+ { "sqrtf/su", FP(0x14,0x58A), CIX, ARG_FPZ1 },
+ { "sqrts/su", FP(0x14,0x58B), CIX, ARG_FPZ1 },
+ { "sqrtg/su", FP(0x14,0x5AA), CIX, ARG_FPZ1 },
+ { "sqrtt/su", FP(0x14,0x5AB), CIX, ARG_FPZ1 },
+ { "sqrts/sud", FP(0x14,0x5CB), CIX, ARG_FPZ1 },
+ { "sqrtt/sud", FP(0x14,0x5EB), CIX, ARG_FPZ1 },
+ { "sqrts/suic", FP(0x14,0x70B), CIX, ARG_FPZ1 },
+ { "sqrtt/suic", FP(0x14,0x72B), CIX, ARG_FPZ1 },
+ { "sqrts/suim", FP(0x14,0x74B), CIX, ARG_FPZ1 },
+ { "sqrtt/suim", FP(0x14,0x76B), CIX, ARG_FPZ1 },
+ { "sqrts/sui", FP(0x14,0x78B), CIX, ARG_FPZ1 },
+ { "sqrtt/sui", FP(0x14,0x7AB), CIX, ARG_FPZ1 },
+ { "sqrts/suid", FP(0x14,0x7CB), CIX, ARG_FPZ1 },
+ { "sqrtt/suid", FP(0x14,0x7EB), CIX, ARG_FPZ1 },
+
+ { "addf/c", FP(0x15,0x000), BASE, ARG_FP },
+ { "subf/c", FP(0x15,0x001), BASE, ARG_FP },
+ { "mulf/c", FP(0x15,0x002), BASE, ARG_FP },
+ { "divf/c", FP(0x15,0x003), BASE, ARG_FP },
+ { "cvtdg/c", FP(0x15,0x01E), BASE, ARG_FPZ1 },
+ { "addg/c", FP(0x15,0x020), BASE, ARG_FP },
+ { "subg/c", FP(0x15,0x021), BASE, ARG_FP },
+ { "mulg/c", FP(0x15,0x022), BASE, ARG_FP },
+ { "divg/c", FP(0x15,0x023), BASE, ARG_FP },
+ { "cvtgf/c", FP(0x15,0x02C), BASE, ARG_FPZ1 },
+ { "cvtgd/c", FP(0x15,0x02D), BASE, ARG_FPZ1 },
+ { "cvtgq/c", FP(0x15,0x02F), BASE, ARG_FPZ1 },
+ { "cvtqf/c", FP(0x15,0x03C), BASE, ARG_FPZ1 },
+ { "cvtqg/c", FP(0x15,0x03E), BASE, ARG_FPZ1 },
+ { "addf", FP(0x15,0x080), BASE, ARG_FP },
+ { "negf", FP(0x15,0x081), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subf", FP(0x15,0x081), BASE, ARG_FP },
+ { "mulf", FP(0x15,0x082), BASE, ARG_FP },
+ { "divf", FP(0x15,0x083), BASE, ARG_FP },
+ { "cvtdg", FP(0x15,0x09E), BASE, ARG_FPZ1 },
+ { "addg", FP(0x15,0x0A0), BASE, ARG_FP },
+ { "negg", FP(0x15,0x0A1), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subg", FP(0x15,0x0A1), BASE, ARG_FP },
+ { "mulg", FP(0x15,0x0A2), BASE, ARG_FP },
+ { "divg", FP(0x15,0x0A3), BASE, ARG_FP },
+ { "cmpgeq", FP(0x15,0x0A5), BASE, ARG_FP },
+ { "cmpglt", FP(0x15,0x0A6), BASE, ARG_FP },
+ { "cmpgle", FP(0x15,0x0A7), BASE, ARG_FP },
+ { "cvtgf", FP(0x15,0x0AC), BASE, ARG_FPZ1 },
+ { "cvtgd", FP(0x15,0x0AD), BASE, ARG_FPZ1 },
+ { "cvtgq", FP(0x15,0x0AF), BASE, ARG_FPZ1 },
+ { "cvtqf", FP(0x15,0x0BC), BASE, ARG_FPZ1 },
+ { "cvtqg", FP(0x15,0x0BE), BASE, ARG_FPZ1 },
+ { "addf/uc", FP(0x15,0x100), BASE, ARG_FP },
+ { "subf/uc", FP(0x15,0x101), BASE, ARG_FP },
+ { "mulf/uc", FP(0x15,0x102), BASE, ARG_FP },
+ { "divf/uc", FP(0x15,0x103), BASE, ARG_FP },
+ { "cvtdg/uc", FP(0x15,0x11E), BASE, ARG_FPZ1 },
+ { "addg/uc", FP(0x15,0x120), BASE, ARG_FP },
+ { "subg/uc", FP(0x15,0x121), BASE, ARG_FP },
+ { "mulg/uc", FP(0x15,0x122), BASE, ARG_FP },
+ { "divg/uc", FP(0x15,0x123), BASE, ARG_FP },
+ { "cvtgf/uc", FP(0x15,0x12C), BASE, ARG_FPZ1 },
+ { "cvtgd/uc", FP(0x15,0x12D), BASE, ARG_FPZ1 },
+ { "cvtgq/vc", FP(0x15,0x12F), BASE, ARG_FPZ1 },
+ { "addf/u", FP(0x15,0x180), BASE, ARG_FP },
+ { "subf/u", FP(0x15,0x181), BASE, ARG_FP },
+ { "mulf/u", FP(0x15,0x182), BASE, ARG_FP },
+ { "divf/u", FP(0x15,0x183), BASE, ARG_FP },
+ { "cvtdg/u", FP(0x15,0x19E), BASE, ARG_FPZ1 },
+ { "addg/u", FP(0x15,0x1A0), BASE, ARG_FP },
+ { "subg/u", FP(0x15,0x1A1), BASE, ARG_FP },
+ { "mulg/u", FP(0x15,0x1A2), BASE, ARG_FP },
+ { "divg/u", FP(0x15,0x1A3), BASE, ARG_FP },
+ { "cvtgf/u", FP(0x15,0x1AC), BASE, ARG_FPZ1 },
+ { "cvtgd/u", FP(0x15,0x1AD), BASE, ARG_FPZ1 },
+ { "cvtgq/v", FP(0x15,0x1AF), BASE, ARG_FPZ1 },
+ { "addf/sc", FP(0x15,0x400), BASE, ARG_FP },
+ { "subf/sc", FP(0x15,0x401), BASE, ARG_FP },
+ { "mulf/sc", FP(0x15,0x402), BASE, ARG_FP },
+ { "divf/sc", FP(0x15,0x403), BASE, ARG_FP },
+ { "cvtdg/sc", FP(0x15,0x41E), BASE, ARG_FPZ1 },
+ { "addg/sc", FP(0x15,0x420), BASE, ARG_FP },
+ { "subg/sc", FP(0x15,0x421), BASE, ARG_FP },
+ { "mulg/sc", FP(0x15,0x422), BASE, ARG_FP },
+ { "divg/sc", FP(0x15,0x423), BASE, ARG_FP },
+ { "cvtgf/sc", FP(0x15,0x42C), BASE, ARG_FPZ1 },
+ { "cvtgd/sc", FP(0x15,0x42D), BASE, ARG_FPZ1 },
+ { "cvtgq/sc", FP(0x15,0x42F), BASE, ARG_FPZ1 },
+ { "addf/s", FP(0x15,0x480), BASE, ARG_FP },
+ { "negf/s", FP(0x15,0x481), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subf/s", FP(0x15,0x481), BASE, ARG_FP },
+ { "mulf/s", FP(0x15,0x482), BASE, ARG_FP },
+ { "divf/s", FP(0x15,0x483), BASE, ARG_FP },
+ { "cvtdg/s", FP(0x15,0x49E), BASE, ARG_FPZ1 },
+ { "addg/s", FP(0x15,0x4A0), BASE, ARG_FP },
+ { "negg/s", FP(0x15,0x4A1), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subg/s", FP(0x15,0x4A1), BASE, ARG_FP },
+ { "mulg/s", FP(0x15,0x4A2), BASE, ARG_FP },
+ { "divg/s", FP(0x15,0x4A3), BASE, ARG_FP },
+ { "cmpgeq/s", FP(0x15,0x4A5), BASE, ARG_FP },
+ { "cmpglt/s", FP(0x15,0x4A6), BASE, ARG_FP },
+ { "cmpgle/s", FP(0x15,0x4A7), BASE, ARG_FP },
+ { "cvtgf/s", FP(0x15,0x4AC), BASE, ARG_FPZ1 },
+ { "cvtgd/s", FP(0x15,0x4AD), BASE, ARG_FPZ1 },
+ { "cvtgq/s", FP(0x15,0x4AF), BASE, ARG_FPZ1 },
+ { "addf/suc", FP(0x15,0x500), BASE, ARG_FP },
+ { "subf/suc", FP(0x15,0x501), BASE, ARG_FP },
+ { "mulf/suc", FP(0x15,0x502), BASE, ARG_FP },
+ { "divf/suc", FP(0x15,0x503), BASE, ARG_FP },
+ { "cvtdg/suc", FP(0x15,0x51E), BASE, ARG_FPZ1 },
+ { "addg/suc", FP(0x15,0x520), BASE, ARG_FP },
+ { "subg/suc", FP(0x15,0x521), BASE, ARG_FP },
+ { "mulg/suc", FP(0x15,0x522), BASE, ARG_FP },
+ { "divg/suc", FP(0x15,0x523), BASE, ARG_FP },
+ { "cvtgf/suc", FP(0x15,0x52C), BASE, ARG_FPZ1 },
+ { "cvtgd/suc", FP(0x15,0x52D), BASE, ARG_FPZ1 },
+ { "cvtgq/svc", FP(0x15,0x52F), BASE, ARG_FPZ1 },
+ { "addf/su", FP(0x15,0x580), BASE, ARG_FP },
+ { "subf/su", FP(0x15,0x581), BASE, ARG_FP },
+ { "mulf/su", FP(0x15,0x582), BASE, ARG_FP },
+ { "divf/su", FP(0x15,0x583), BASE, ARG_FP },
+ { "cvtdg/su", FP(0x15,0x59E), BASE, ARG_FPZ1 },
+ { "addg/su", FP(0x15,0x5A0), BASE, ARG_FP },
+ { "subg/su", FP(0x15,0x5A1), BASE, ARG_FP },
+ { "mulg/su", FP(0x15,0x5A2), BASE, ARG_FP },
+ { "divg/su", FP(0x15,0x5A3), BASE, ARG_FP },
+ { "cvtgf/su", FP(0x15,0x5AC), BASE, ARG_FPZ1 },
+ { "cvtgd/su", FP(0x15,0x5AD), BASE, ARG_FPZ1 },
+ { "cvtgq/sv", FP(0x15,0x5AF), BASE, ARG_FPZ1 },
+
+ { "adds/c", FP(0x16,0x000), BASE, ARG_FP },
+ { "subs/c", FP(0x16,0x001), BASE, ARG_FP },
+ { "muls/c", FP(0x16,0x002), BASE, ARG_FP },
+ { "divs/c", FP(0x16,0x003), BASE, ARG_FP },
+ { "addt/c", FP(0x16,0x020), BASE, ARG_FP },
+ { "subt/c", FP(0x16,0x021), BASE, ARG_FP },
+ { "mult/c", FP(0x16,0x022), BASE, ARG_FP },
+ { "divt/c", FP(0x16,0x023), BASE, ARG_FP },
+ { "cvtts/c", FP(0x16,0x02C), BASE, ARG_FPZ1 },
+ { "cvttq/c", FP(0x16,0x02F), BASE, ARG_FPZ1 },
+ { "cvtqs/c", FP(0x16,0x03C), BASE, ARG_FPZ1 },
+ { "cvtqt/c", FP(0x16,0x03E), BASE, ARG_FPZ1 },
+ { "adds/m", FP(0x16,0x040), BASE, ARG_FP },
+ { "subs/m", FP(0x16,0x041), BASE, ARG_FP },
+ { "muls/m", FP(0x16,0x042), BASE, ARG_FP },
+ { "divs/m", FP(0x16,0x043), BASE, ARG_FP },
+ { "addt/m", FP(0x16,0x060), BASE, ARG_FP },
+ { "subt/m", FP(0x16,0x061), BASE, ARG_FP },
+ { "mult/m", FP(0x16,0x062), BASE, ARG_FP },
+ { "divt/m", FP(0x16,0x063), BASE, ARG_FP },
+ { "cvtts/m", FP(0x16,0x06C), BASE, ARG_FPZ1 },
+ { "cvttq/m", FP(0x16,0x06F), BASE, ARG_FPZ1 },
+ { "cvtqs/m", FP(0x16,0x07C), BASE, ARG_FPZ1 },
+ { "cvtqt/m", FP(0x16,0x07E), BASE, ARG_FPZ1 },
+ { "adds", FP(0x16,0x080), BASE, ARG_FP },
+ { "negs", FP(0x16,0x081), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subs", FP(0x16,0x081), BASE, ARG_FP },
+ { "muls", FP(0x16,0x082), BASE, ARG_FP },
+ { "divs", FP(0x16,0x083), BASE, ARG_FP },
+ { "addt", FP(0x16,0x0A0), BASE, ARG_FP },
+ { "negt", FP(0x16,0x0A1), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subt", FP(0x16,0x0A1), BASE, ARG_FP },
+ { "mult", FP(0x16,0x0A2), BASE, ARG_FP },
+ { "divt", FP(0x16,0x0A3), BASE, ARG_FP },
+ { "cmptun", FP(0x16,0x0A4), BASE, ARG_FP },
+ { "cmpteq", FP(0x16,0x0A5), BASE, ARG_FP },
+ { "cmptlt", FP(0x16,0x0A6), BASE, ARG_FP },
+ { "cmptle", FP(0x16,0x0A7), BASE, ARG_FP },
+ { "cvtts", FP(0x16,0x0AC), BASE, ARG_FPZ1 },
+ { "cvttq", FP(0x16,0x0AF), BASE, ARG_FPZ1 },
+ { "cvtqs", FP(0x16,0x0BC), BASE, ARG_FPZ1 },
+ { "cvtqt", FP(0x16,0x0BE), BASE, ARG_FPZ1 },
+ { "adds/d", FP(0x16,0x0C0), BASE, ARG_FP },
+ { "subs/d", FP(0x16,0x0C1), BASE, ARG_FP },
+ { "muls/d", FP(0x16,0x0C2), BASE, ARG_FP },
+ { "divs/d", FP(0x16,0x0C3), BASE, ARG_FP },
+ { "addt/d", FP(0x16,0x0E0), BASE, ARG_FP },
+ { "subt/d", FP(0x16,0x0E1), BASE, ARG_FP },
+ { "mult/d", FP(0x16,0x0E2), BASE, ARG_FP },
+ { "divt/d", FP(0x16,0x0E3), BASE, ARG_FP },
+ { "cvtts/d", FP(0x16,0x0EC), BASE, ARG_FPZ1 },
+ { "cvttq/d", FP(0x16,0x0EF), BASE, ARG_FPZ1 },
+ { "cvtqs/d", FP(0x16,0x0FC), BASE, ARG_FPZ1 },
+ { "cvtqt/d", FP(0x16,0x0FE), BASE, ARG_FPZ1 },
+ { "adds/uc", FP(0x16,0x100), BASE, ARG_FP },
+ { "subs/uc", FP(0x16,0x101), BASE, ARG_FP },
+ { "muls/uc", FP(0x16,0x102), BASE, ARG_FP },
+ { "divs/uc", FP(0x16,0x103), BASE, ARG_FP },
+ { "addt/uc", FP(0x16,0x120), BASE, ARG_FP },
+ { "subt/uc", FP(0x16,0x121), BASE, ARG_FP },
+ { "mult/uc", FP(0x16,0x122), BASE, ARG_FP },
+ { "divt/uc", FP(0x16,0x123), BASE, ARG_FP },
+ { "cvtts/uc", FP(0x16,0x12C), BASE, ARG_FPZ1 },
+ { "cvttq/vc", FP(0x16,0x12F), BASE, ARG_FPZ1 },
+ { "adds/um", FP(0x16,0x140), BASE, ARG_FP },
+ { "subs/um", FP(0x16,0x141), BASE, ARG_FP },
+ { "muls/um", FP(0x16,0x142), BASE, ARG_FP },
+ { "divs/um", FP(0x16,0x143), BASE, ARG_FP },
+ { "addt/um", FP(0x16,0x160), BASE, ARG_FP },
+ { "subt/um", FP(0x16,0x161), BASE, ARG_FP },
+ { "mult/um", FP(0x16,0x162), BASE, ARG_FP },
+ { "divt/um", FP(0x16,0x163), BASE, ARG_FP },
+ { "cvtts/um", FP(0x16,0x16C), BASE, ARG_FPZ1 },
+ { "cvttq/vm", FP(0x16,0x16F), BASE, ARG_FPZ1 },
+ { "adds/u", FP(0x16,0x180), BASE, ARG_FP },
+ { "subs/u", FP(0x16,0x181), BASE, ARG_FP },
+ { "muls/u", FP(0x16,0x182), BASE, ARG_FP },
+ { "divs/u", FP(0x16,0x183), BASE, ARG_FP },
+ { "addt/u", FP(0x16,0x1A0), BASE, ARG_FP },
+ { "subt/u", FP(0x16,0x1A1), BASE, ARG_FP },
+ { "mult/u", FP(0x16,0x1A2), BASE, ARG_FP },
+ { "divt/u", FP(0x16,0x1A3), BASE, ARG_FP },
+ { "cvtts/u", FP(0x16,0x1AC), BASE, ARG_FPZ1 },
+ { "cvttq/v", FP(0x16,0x1AF), BASE, ARG_FPZ1 },
+ { "adds/ud", FP(0x16,0x1C0), BASE, ARG_FP },
+ { "subs/ud", FP(0x16,0x1C1), BASE, ARG_FP },
+ { "muls/ud", FP(0x16,0x1C2), BASE, ARG_FP },
+ { "divs/ud", FP(0x16,0x1C3), BASE, ARG_FP },
+ { "addt/ud", FP(0x16,0x1E0), BASE, ARG_FP },
+ { "subt/ud", FP(0x16,0x1E1), BASE, ARG_FP },
+ { "mult/ud", FP(0x16,0x1E2), BASE, ARG_FP },
+ { "divt/ud", FP(0x16,0x1E3), BASE, ARG_FP },
+ { "cvtts/ud", FP(0x16,0x1EC), BASE, ARG_FPZ1 },
+ { "cvttq/vd", FP(0x16,0x1EF), BASE, ARG_FPZ1 },
+ { "cvtst", FP(0x16,0x2AC), BASE, ARG_FPZ1 },
+ { "adds/suc", FP(0x16,0x500), BASE, ARG_FP },
+ { "subs/suc", FP(0x16,0x501), BASE, ARG_FP },
+ { "muls/suc", FP(0x16,0x502), BASE, ARG_FP },
+ { "divs/suc", FP(0x16,0x503), BASE, ARG_FP },
+ { "addt/suc", FP(0x16,0x520), BASE, ARG_FP },
+ { "subt/suc", FP(0x16,0x521), BASE, ARG_FP },
+ { "mult/suc", FP(0x16,0x522), BASE, ARG_FP },
+ { "divt/suc", FP(0x16,0x523), BASE, ARG_FP },
+ { "cvtts/suc", FP(0x16,0x52C), BASE, ARG_FPZ1 },
+ { "cvttq/svc", FP(0x16,0x52F), BASE, ARG_FPZ1 },
+ { "adds/sum", FP(0x16,0x540), BASE, ARG_FP },
+ { "subs/sum", FP(0x16,0x541), BASE, ARG_FP },
+ { "muls/sum", FP(0x16,0x542), BASE, ARG_FP },
+ { "divs/sum", FP(0x16,0x543), BASE, ARG_FP },
+ { "addt/sum", FP(0x16,0x560), BASE, ARG_FP },
+ { "subt/sum", FP(0x16,0x561), BASE, ARG_FP },
+ { "mult/sum", FP(0x16,0x562), BASE, ARG_FP },
+ { "divt/sum", FP(0x16,0x563), BASE, ARG_FP },
+ { "cvtts/sum", FP(0x16,0x56C), BASE, ARG_FPZ1 },
+ { "cvttq/svm", FP(0x16,0x56F), BASE, ARG_FPZ1 },
+ { "adds/su", FP(0x16,0x580), BASE, ARG_FP },
+ { "negs/su", FP(0x16,0x581), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subs/su", FP(0x16,0x581), BASE, ARG_FP },
+ { "muls/su", FP(0x16,0x582), BASE, ARG_FP },
+ { "divs/su", FP(0x16,0x583), BASE, ARG_FP },
+ { "addt/su", FP(0x16,0x5A0), BASE, ARG_FP },
+ { "negt/su", FP(0x16,0x5A1), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subt/su", FP(0x16,0x5A1), BASE, ARG_FP },
+ { "mult/su", FP(0x16,0x5A2), BASE, ARG_FP },
+ { "divt/su", FP(0x16,0x5A3), BASE, ARG_FP },
+ { "cmptun/su", FP(0x16,0x5A4), BASE, ARG_FP },
+ { "cmpteq/su", FP(0x16,0x5A5), BASE, ARG_FP },
+ { "cmptlt/su", FP(0x16,0x5A6), BASE, ARG_FP },
+ { "cmptle/su", FP(0x16,0x5A7), BASE, ARG_FP },
+ { "cvtts/su", FP(0x16,0x5AC), BASE, ARG_FPZ1 },
+ { "cvttq/sv", FP(0x16,0x5AF), BASE, ARG_FPZ1 },
+ { "adds/sud", FP(0x16,0x5C0), BASE, ARG_FP },
+ { "subs/sud", FP(0x16,0x5C1), BASE, ARG_FP },
+ { "muls/sud", FP(0x16,0x5C2), BASE, ARG_FP },
+ { "divs/sud", FP(0x16,0x5C3), BASE, ARG_FP },
+ { "addt/sud", FP(0x16,0x5E0), BASE, ARG_FP },
+ { "subt/sud", FP(0x16,0x5E1), BASE, ARG_FP },
+ { "mult/sud", FP(0x16,0x5E2), BASE, ARG_FP },
+ { "divt/sud", FP(0x16,0x5E3), BASE, ARG_FP },
+ { "cvtts/sud", FP(0x16,0x5EC), BASE, ARG_FPZ1 },
+ { "cvttq/svd", FP(0x16,0x5EF), BASE, ARG_FPZ1 },
+ { "cvtst/s", FP(0x16,0x6AC), BASE, ARG_FPZ1 },
+ { "adds/suic", FP(0x16,0x700), BASE, ARG_FP },
+ { "subs/suic", FP(0x16,0x701), BASE, ARG_FP },
+ { "muls/suic", FP(0x16,0x702), BASE, ARG_FP },
+ { "divs/suic", FP(0x16,0x703), BASE, ARG_FP },
+ { "addt/suic", FP(0x16,0x720), BASE, ARG_FP },
+ { "subt/suic", FP(0x16,0x721), BASE, ARG_FP },
+ { "mult/suic", FP(0x16,0x722), BASE, ARG_FP },
+ { "divt/suic", FP(0x16,0x723), BASE, ARG_FP },
+ { "cvtts/suic", FP(0x16,0x72C), BASE, ARG_FPZ1 },
+ { "cvttq/svic", FP(0x16,0x72F), BASE, ARG_FPZ1 },
+ { "cvtqs/suic", FP(0x16,0x73C), BASE, ARG_FPZ1 },
+ { "cvtqt/suic", FP(0x16,0x73E), BASE, ARG_FPZ1 },
+ { "adds/suim", FP(0x16,0x740), BASE, ARG_FP },
+ { "subs/suim", FP(0x16,0x741), BASE, ARG_FP },
+ { "muls/suim", FP(0x16,0x742), BASE, ARG_FP },
+ { "divs/suim", FP(0x16,0x743), BASE, ARG_FP },
+ { "addt/suim", FP(0x16,0x760), BASE, ARG_FP },
+ { "subt/suim", FP(0x16,0x761), BASE, ARG_FP },
+ { "mult/suim", FP(0x16,0x762), BASE, ARG_FP },
+ { "divt/suim", FP(0x16,0x763), BASE, ARG_FP },
+ { "cvtts/suim", FP(0x16,0x76C), BASE, ARG_FPZ1 },
+ { "cvttq/svim", FP(0x16,0x76F), BASE, ARG_FPZ1 },
+ { "cvtqs/suim", FP(0x16,0x77C), BASE, ARG_FPZ1 },
+ { "cvtqt/suim", FP(0x16,0x77E), BASE, ARG_FPZ1 },
+ { "adds/sui", FP(0x16,0x780), BASE, ARG_FP },
+ { "negs/sui", FP(0x16,0x781), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subs/sui", FP(0x16,0x781), BASE, ARG_FP },
+ { "muls/sui", FP(0x16,0x782), BASE, ARG_FP },
+ { "divs/sui", FP(0x16,0x783), BASE, ARG_FP },
+ { "addt/sui", FP(0x16,0x7A0), BASE, ARG_FP },
+ { "negt/sui", FP(0x16,0x7A1), BASE, ARG_FPZ1 }, /* pseudo */
+ { "subt/sui", FP(0x16,0x7A1), BASE, ARG_FP },
+ { "mult/sui", FP(0x16,0x7A2), BASE, ARG_FP },
+ { "divt/sui", FP(0x16,0x7A3), BASE, ARG_FP },
+ { "cvtts/sui", FP(0x16,0x7AC), BASE, ARG_FPZ1 },
+ { "cvttq/svi", FP(0x16,0x7AF), BASE, ARG_FPZ1 },
+ { "cvtqs/sui", FP(0x16,0x7BC), BASE, ARG_FPZ1 },
+ { "cvtqt/sui", FP(0x16,0x7BE), BASE, ARG_FPZ1 },
+ { "adds/suid", FP(0x16,0x7C0), BASE, ARG_FP },
+ { "subs/suid", FP(0x16,0x7C1), BASE, ARG_FP },
+ { "muls/suid", FP(0x16,0x7C2), BASE, ARG_FP },
+ { "divs/suid", FP(0x16,0x7C3), BASE, ARG_FP },
+ { "addt/suid", FP(0x16,0x7E0), BASE, ARG_FP },
+ { "subt/suid", FP(0x16,0x7E1), BASE, ARG_FP },
+ { "mult/suid", FP(0x16,0x7E2), BASE, ARG_FP },
+ { "divt/suid", FP(0x16,0x7E3), BASE, ARG_FP },
+ { "cvtts/suid", FP(0x16,0x7EC), BASE, ARG_FPZ1 },
+ { "cvttq/svid", FP(0x16,0x7EF), BASE, ARG_FPZ1 },
+ { "cvtqs/suid", FP(0x16,0x7FC), BASE, ARG_FPZ1 },
+ { "cvtqt/suid", FP(0x16,0x7FE), BASE, ARG_FPZ1 },
+
+ { "cvtlq", FP(0x17,0x010), BASE, ARG_FPZ1 },
+ { "fnop", FP(0x17,0x020), BASE, { ZA, ZB, ZC } }, /* pseudo */
+ { "fclr", FP(0x17,0x020), BASE, { ZA, ZB, FC } }, /* pseudo */
+ { "fabs", FP(0x17,0x020), BASE, ARG_FPZ1 }, /* pseudo */
+ { "fmov", FP(0x17,0x020), BASE, { FA, RBA, FC } }, /* pseudo */
+ { "cpys", FP(0x17,0x020), BASE, ARG_FP },
+ { "fneg", FP(0x17,0x021), BASE, { FA, RBA, FC } }, /* pseudo */
+ { "cpysn", FP(0x17,0x021), BASE, ARG_FP },
+ { "cpyse", FP(0x17,0x022), BASE, ARG_FP },
+ { "mt_fpcr", FP(0x17,0x024), BASE, { FA, RBA, RCA } },
+ { "mf_fpcr", FP(0x17,0x025), BASE, { FA, RBA, RCA } },
+ { "fcmoveq", FP(0x17,0x02A), BASE, ARG_FP },
+ { "fcmovne", FP(0x17,0x02B), BASE, ARG_FP },
+ { "fcmovlt", FP(0x17,0x02C), BASE, ARG_FP },
+ { "fcmovge", FP(0x17,0x02D), BASE, ARG_FP },
+ { "fcmovle", FP(0x17,0x02E), BASE, ARG_FP },
+ { "fcmovgt", FP(0x17,0x02F), BASE, ARG_FP },
+ { "cvtql", FP(0x17,0x030), BASE, ARG_FPZ1 },
+ { "cvtql/v", FP(0x17,0x130), BASE, ARG_FPZ1 },
+ { "cvtql/sv", FP(0x17,0x530), BASE, ARG_FPZ1 },
+
+ { "trapb", MFC(0x18,0x0000), BASE, ARG_NONE },
+ { "draint", MFC(0x18,0x0000), BASE, ARG_NONE }, /* alias */
+ { "excb", MFC(0x18,0x0400), BASE, ARG_NONE },
+ { "mb", MFC(0x18,0x4000), BASE, ARG_NONE },
+ { "wmb", MFC(0x18,0x4400), BASE, ARG_NONE },
+ { "fetch", MFC(0x18,0x8000), BASE, { ZA, PRB } },
+ { "fetch_m", MFC(0x18,0xA000), BASE, { ZA, PRB } },
+ { "rpcc", MFC(0x18,0xC000), BASE, { RA } },
+ { "rc", MFC(0x18,0xE000), BASE, { RA } },
+ { "ecb", MFC(0x18,0xE800), BASE, { ZA, PRB } }, /* ev56 una */
+ { "rs", MFC(0x18,0xF000), BASE, { RA } },
+ { "wh64", MFC(0x18,0xF800), BASE, { ZA, PRB } }, /* ev56 una */
+ { "wh64en", MFC(0x18,0xFC00), BASE, { ZA, PRB } }, /* ev7 una */
+
+ { "hw_mfpr", OPR(0x19,0x00), EV4, { RA, RBA, EV4EXTHWINDEX } },
+ { "hw_mfpr", OP(0x19), OP_MASK, EV5, { RA, RBA, EV5HWINDEX } },
+ { "hw_mfpr", OP(0x19), OP_MASK, EV6, { RA, ZB, EV6HWINDEX } },
+ { "hw_mfpr/i", OPR(0x19,0x01), EV4, ARG_EV4HWMPR },
+ { "hw_mfpr/a", OPR(0x19,0x02), EV4, ARG_EV4HWMPR },
+ { "hw_mfpr/ai", OPR(0x19,0x03), EV4, ARG_EV4HWMPR },
+ { "hw_mfpr/p", OPR(0x19,0x04), EV4, ARG_EV4HWMPR },
+ { "hw_mfpr/pi", OPR(0x19,0x05), EV4, ARG_EV4HWMPR },
+ { "hw_mfpr/pa", OPR(0x19,0x06), EV4, ARG_EV4HWMPR },
+ { "hw_mfpr/pai", OPR(0x19,0x07), EV4, ARG_EV4HWMPR },
+ { "pal19", PCD(0x19), BASE, ARG_PCD },
+
+ { "jmp", MBR_(0x1A,0), MBR_MASK | 0x3FFF, /* pseudo */
+ BASE, { ZA, CPRB } },
+ { "jmp", MBR(0x1A,0), BASE, { RA, CPRB, JMPHINT } },
+ { "jsr", MBR(0x1A,1), BASE, { RA, CPRB, JMPHINT } },
+ { "ret", MBR_(0x1A,2) | (31 << 21) | (26 << 16) | 1,/* pseudo */
+ 0xFFFFFFFF, BASE, { 0 } },
+ { "ret", MBR(0x1A,2), BASE, { RA, CPRB, RETHINT } },
+ { "jcr", MBR(0x1A,3), BASE, { RA, CPRB, RETHINT } }, /* alias */
+ { "jsr_coroutine", MBR(0x1A,3), BASE, { RA, CPRB, RETHINT } },
+
+ { "hw_ldl", EV4HWMEM(0x1B,0x0), EV4, ARG_EV4HWMEM },
+ { "hw_ldl", EV5HWMEM(0x1B,0x00), EV5, ARG_EV5HWMEM },
+ { "hw_ldl", EV6HWMEM(0x1B,0x8), EV6, ARG_EV6HWMEM },
+ { "hw_ldl/a", EV4HWMEM(0x1B,0x4), EV4, ARG_EV4HWMEM },
+ { "hw_ldl/a", EV5HWMEM(0x1B,0x10), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/a", EV6HWMEM(0x1B,0xC), EV6, ARG_EV6HWMEM },
+ { "hw_ldl/al", EV5HWMEM(0x1B,0x11), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/ar", EV4HWMEM(0x1B,0x6), EV4, ARG_EV4HWMEM },
+ { "hw_ldl/av", EV5HWMEM(0x1B,0x12), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/avl", EV5HWMEM(0x1B,0x13), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/aw", EV5HWMEM(0x1B,0x18), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/awl", EV5HWMEM(0x1B,0x19), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/awv", EV5HWMEM(0x1B,0x1a), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/awvl", EV5HWMEM(0x1B,0x1b), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/l", EV5HWMEM(0x1B,0x01), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/p", EV4HWMEM(0x1B,0x8), EV4, ARG_EV4HWMEM },
+ { "hw_ldl/p", EV5HWMEM(0x1B,0x20), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/p", EV6HWMEM(0x1B,0x0), EV6, ARG_EV6HWMEM },
+ { "hw_ldl/pa", EV4HWMEM(0x1B,0xC), EV4, ARG_EV4HWMEM },
+ { "hw_ldl/pa", EV5HWMEM(0x1B,0x30), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pal", EV5HWMEM(0x1B,0x31), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/par", EV4HWMEM(0x1B,0xE), EV4, ARG_EV4HWMEM },
+ { "hw_ldl/pav", EV5HWMEM(0x1B,0x32), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pavl", EV5HWMEM(0x1B,0x33), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/paw", EV5HWMEM(0x1B,0x38), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pawl", EV5HWMEM(0x1B,0x39), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pawv", EV5HWMEM(0x1B,0x3a), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pawvl", EV5HWMEM(0x1B,0x3b), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pl", EV5HWMEM(0x1B,0x21), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pr", EV4HWMEM(0x1B,0xA), EV4, ARG_EV4HWMEM },
+ { "hw_ldl/pv", EV5HWMEM(0x1B,0x22), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pvl", EV5HWMEM(0x1B,0x23), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pw", EV5HWMEM(0x1B,0x28), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pwl", EV5HWMEM(0x1B,0x29), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pwv", EV5HWMEM(0x1B,0x2a), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/pwvl", EV5HWMEM(0x1B,0x2b), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/r", EV4HWMEM(0x1B,0x2), EV4, ARG_EV4HWMEM },
+ { "hw_ldl/v", EV5HWMEM(0x1B,0x02), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/v", EV6HWMEM(0x1B,0x4), EV6, ARG_EV6HWMEM },
+ { "hw_ldl/vl", EV5HWMEM(0x1B,0x03), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/w", EV5HWMEM(0x1B,0x08), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/w", EV6HWMEM(0x1B,0xA), EV6, ARG_EV6HWMEM },
+ { "hw_ldl/wa", EV6HWMEM(0x1B,0xE), EV6, ARG_EV6HWMEM },
+ { "hw_ldl/wl", EV5HWMEM(0x1B,0x09), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/wv", EV5HWMEM(0x1B,0x0a), EV5, ARG_EV5HWMEM },
+ { "hw_ldl/wvl", EV5HWMEM(0x1B,0x0b), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l", EV5HWMEM(0x1B,0x01), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/a", EV5HWMEM(0x1B,0x11), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/av", EV5HWMEM(0x1B,0x13), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/aw", EV5HWMEM(0x1B,0x19), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/awv", EV5HWMEM(0x1B,0x1b), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/p", EV5HWMEM(0x1B,0x21), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/p", EV6HWMEM(0x1B,0x2), EV6, ARG_EV6HWMEM },
+ { "hw_ldl_l/pa", EV5HWMEM(0x1B,0x31), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/pav", EV5HWMEM(0x1B,0x33), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/paw", EV5HWMEM(0x1B,0x39), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/pawv", EV5HWMEM(0x1B,0x3b), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/pv", EV5HWMEM(0x1B,0x23), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/pw", EV5HWMEM(0x1B,0x29), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/pwv", EV5HWMEM(0x1B,0x2b), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/v", EV5HWMEM(0x1B,0x03), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/w", EV5HWMEM(0x1B,0x09), EV5, ARG_EV5HWMEM },
+ { "hw_ldl_l/wv", EV5HWMEM(0x1B,0x0b), EV5, ARG_EV5HWMEM },
+ { "hw_ldq", EV4HWMEM(0x1B,0x1), EV4, ARG_EV4HWMEM },
+ { "hw_ldq", EV5HWMEM(0x1B,0x04), EV5, ARG_EV5HWMEM },
+ { "hw_ldq", EV6HWMEM(0x1B,0x9), EV6, ARG_EV6HWMEM },
+ { "hw_ldq/a", EV4HWMEM(0x1B,0x5), EV4, ARG_EV4HWMEM },
+ { "hw_ldq/a", EV5HWMEM(0x1B,0x14), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/a", EV6HWMEM(0x1B,0xD), EV6, ARG_EV6HWMEM },
+ { "hw_ldq/al", EV5HWMEM(0x1B,0x15), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/ar", EV4HWMEM(0x1B,0x7), EV4, ARG_EV4HWMEM },
+ { "hw_ldq/av", EV5HWMEM(0x1B,0x16), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/avl", EV5HWMEM(0x1B,0x17), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/aw", EV5HWMEM(0x1B,0x1c), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/awl", EV5HWMEM(0x1B,0x1d), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/awv", EV5HWMEM(0x1B,0x1e), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/awvl", EV5HWMEM(0x1B,0x1f), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/l", EV5HWMEM(0x1B,0x05), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/p", EV4HWMEM(0x1B,0x9), EV4, ARG_EV4HWMEM },
+ { "hw_ldq/p", EV5HWMEM(0x1B,0x24), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/p", EV6HWMEM(0x1B,0x1), EV6, ARG_EV6HWMEM },
+ { "hw_ldq/pa", EV4HWMEM(0x1B,0xD), EV4, ARG_EV4HWMEM },
+ { "hw_ldq/pa", EV5HWMEM(0x1B,0x34), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pal", EV5HWMEM(0x1B,0x35), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/par", EV4HWMEM(0x1B,0xF), EV4, ARG_EV4HWMEM },
+ { "hw_ldq/pav", EV5HWMEM(0x1B,0x36), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pavl", EV5HWMEM(0x1B,0x37), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/paw", EV5HWMEM(0x1B,0x3c), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pawl", EV5HWMEM(0x1B,0x3d), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pawv", EV5HWMEM(0x1B,0x3e), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pawvl", EV5HWMEM(0x1B,0x3f), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pl", EV5HWMEM(0x1B,0x25), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pr", EV4HWMEM(0x1B,0xB), EV4, ARG_EV4HWMEM },
+ { "hw_ldq/pv", EV5HWMEM(0x1B,0x26), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pvl", EV5HWMEM(0x1B,0x27), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pw", EV5HWMEM(0x1B,0x2c), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pwl", EV5HWMEM(0x1B,0x2d), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pwv", EV5HWMEM(0x1B,0x2e), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/pwvl", EV5HWMEM(0x1B,0x2f), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/r", EV4HWMEM(0x1B,0x3), EV4, ARG_EV4HWMEM },
+ { "hw_ldq/v", EV5HWMEM(0x1B,0x06), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/v", EV6HWMEM(0x1B,0x5), EV6, ARG_EV6HWMEM },
+ { "hw_ldq/vl", EV5HWMEM(0x1B,0x07), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/w", EV5HWMEM(0x1B,0x0c), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/w", EV6HWMEM(0x1B,0xB), EV6, ARG_EV6HWMEM },
+ { "hw_ldq/wa", EV6HWMEM(0x1B,0xF), EV6, ARG_EV6HWMEM },
+ { "hw_ldq/wl", EV5HWMEM(0x1B,0x0d), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/wv", EV5HWMEM(0x1B,0x0e), EV5, ARG_EV5HWMEM },
+ { "hw_ldq/wvl", EV5HWMEM(0x1B,0x0f), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l", EV5HWMEM(0x1B,0x05), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/a", EV5HWMEM(0x1B,0x15), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/av", EV5HWMEM(0x1B,0x17), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/aw", EV5HWMEM(0x1B,0x1d), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/awv", EV5HWMEM(0x1B,0x1f), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/p", EV5HWMEM(0x1B,0x25), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/p", EV6HWMEM(0x1B,0x3), EV6, ARG_EV6HWMEM },
+ { "hw_ldq_l/pa", EV5HWMEM(0x1B,0x35), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/pav", EV5HWMEM(0x1B,0x37), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/paw", EV5HWMEM(0x1B,0x3d), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/pawv", EV5HWMEM(0x1B,0x3f), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/pv", EV5HWMEM(0x1B,0x27), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/pw", EV5HWMEM(0x1B,0x2d), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/pwv", EV5HWMEM(0x1B,0x2f), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/v", EV5HWMEM(0x1B,0x07), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/w", EV5HWMEM(0x1B,0x0d), EV5, ARG_EV5HWMEM },
+ { "hw_ldq_l/wv", EV5HWMEM(0x1B,0x0f), EV5, ARG_EV5HWMEM },
+ { "hw_ld", EV4HWMEM(0x1B,0x0), EV4, ARG_EV4HWMEM },
+ { "hw_ld", EV5HWMEM(0x1B,0x00), EV5, ARG_EV5HWMEM },
+ { "hw_ld/a", EV4HWMEM(0x1B,0x4), EV4, ARG_EV4HWMEM },
+ { "hw_ld/a", EV5HWMEM(0x1B,0x10), EV5, ARG_EV5HWMEM },
+ { "hw_ld/al", EV5HWMEM(0x1B,0x11), EV5, ARG_EV5HWMEM },
+ { "hw_ld/aq", EV4HWMEM(0x1B,0x5), EV4, ARG_EV4HWMEM },
+ { "hw_ld/aq", EV5HWMEM(0x1B,0x14), EV5, ARG_EV5HWMEM },
+ { "hw_ld/aql", EV5HWMEM(0x1B,0x15), EV5, ARG_EV5HWMEM },
+ { "hw_ld/aqv", EV5HWMEM(0x1B,0x16), EV5, ARG_EV5HWMEM },
+ { "hw_ld/aqvl", EV5HWMEM(0x1B,0x17), EV5, ARG_EV5HWMEM },
+ { "hw_ld/ar", EV4HWMEM(0x1B,0x6), EV4, ARG_EV4HWMEM },
+ { "hw_ld/arq", EV4HWMEM(0x1B,0x7), EV4, ARG_EV4HWMEM },
+ { "hw_ld/av", EV5HWMEM(0x1B,0x12), EV5, ARG_EV5HWMEM },
+ { "hw_ld/avl", EV5HWMEM(0x1B,0x13), EV5, ARG_EV5HWMEM },
+ { "hw_ld/aw", EV5HWMEM(0x1B,0x18), EV5, ARG_EV5HWMEM },
+ { "hw_ld/awl", EV5HWMEM(0x1B,0x19), EV5, ARG_EV5HWMEM },
+ { "hw_ld/awq", EV5HWMEM(0x1B,0x1c), EV5, ARG_EV5HWMEM },
+ { "hw_ld/awql", EV5HWMEM(0x1B,0x1d), EV5, ARG_EV5HWMEM },
+ { "hw_ld/awqv", EV5HWMEM(0x1B,0x1e), EV5, ARG_EV5HWMEM },
+ { "hw_ld/awqvl", EV5HWMEM(0x1B,0x1f), EV5, ARG_EV5HWMEM },
+ { "hw_ld/awv", EV5HWMEM(0x1B,0x1a), EV5, ARG_EV5HWMEM },
+ { "hw_ld/awvl", EV5HWMEM(0x1B,0x1b), EV5, ARG_EV5HWMEM },
+ { "hw_ld/l", EV5HWMEM(0x1B,0x01), EV5, ARG_EV5HWMEM },
+ { "hw_ld/p", EV4HWMEM(0x1B,0x8), EV4, ARG_EV4HWMEM },
+ { "hw_ld/p", EV5HWMEM(0x1B,0x20), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pa", EV4HWMEM(0x1B,0xC), EV4, ARG_EV4HWMEM },
+ { "hw_ld/pa", EV5HWMEM(0x1B,0x30), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pal", EV5HWMEM(0x1B,0x31), EV5, ARG_EV5HWMEM },
+ { "hw_ld/paq", EV4HWMEM(0x1B,0xD), EV4, ARG_EV4HWMEM },
+ { "hw_ld/paq", EV5HWMEM(0x1B,0x34), EV5, ARG_EV5HWMEM },
+ { "hw_ld/paql", EV5HWMEM(0x1B,0x35), EV5, ARG_EV5HWMEM },
+ { "hw_ld/paqv", EV5HWMEM(0x1B,0x36), EV5, ARG_EV5HWMEM },
+ { "hw_ld/paqvl", EV5HWMEM(0x1B,0x37), EV5, ARG_EV5HWMEM },
+ { "hw_ld/par", EV4HWMEM(0x1B,0xE), EV4, ARG_EV4HWMEM },
+ { "hw_ld/parq", EV4HWMEM(0x1B,0xF), EV4, ARG_EV4HWMEM },
+ { "hw_ld/pav", EV5HWMEM(0x1B,0x32), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pavl", EV5HWMEM(0x1B,0x33), EV5, ARG_EV5HWMEM },
+ { "hw_ld/paw", EV5HWMEM(0x1B,0x38), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pawl", EV5HWMEM(0x1B,0x39), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pawq", EV5HWMEM(0x1B,0x3c), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pawql", EV5HWMEM(0x1B,0x3d), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pawqv", EV5HWMEM(0x1B,0x3e), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pawqvl", EV5HWMEM(0x1B,0x3f), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pawv", EV5HWMEM(0x1B,0x3a), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pawvl", EV5HWMEM(0x1B,0x3b), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pl", EV5HWMEM(0x1B,0x21), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pq", EV4HWMEM(0x1B,0x9), EV4, ARG_EV4HWMEM },
+ { "hw_ld/pq", EV5HWMEM(0x1B,0x24), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pql", EV5HWMEM(0x1B,0x25), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pqv", EV5HWMEM(0x1B,0x26), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pqvl", EV5HWMEM(0x1B,0x27), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pr", EV4HWMEM(0x1B,0xA), EV4, ARG_EV4HWMEM },
+ { "hw_ld/prq", EV4HWMEM(0x1B,0xB), EV4, ARG_EV4HWMEM },
+ { "hw_ld/pv", EV5HWMEM(0x1B,0x22), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pvl", EV5HWMEM(0x1B,0x23), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pw", EV5HWMEM(0x1B,0x28), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pwl", EV5HWMEM(0x1B,0x29), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pwq", EV5HWMEM(0x1B,0x2c), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pwql", EV5HWMEM(0x1B,0x2d), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pwqv", EV5HWMEM(0x1B,0x2e), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pwqvl", EV5HWMEM(0x1B,0x2f), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pwv", EV5HWMEM(0x1B,0x2a), EV5, ARG_EV5HWMEM },
+ { "hw_ld/pwvl", EV5HWMEM(0x1B,0x2b), EV5, ARG_EV5HWMEM },
+ { "hw_ld/q", EV4HWMEM(0x1B,0x1), EV4, ARG_EV4HWMEM },
+ { "hw_ld/q", EV5HWMEM(0x1B,0x04), EV5, ARG_EV5HWMEM },
+ { "hw_ld/ql", EV5HWMEM(0x1B,0x05), EV5, ARG_EV5HWMEM },
+ { "hw_ld/qv", EV5HWMEM(0x1B,0x06), EV5, ARG_EV5HWMEM },
+ { "hw_ld/qvl", EV5HWMEM(0x1B,0x07), EV5, ARG_EV5HWMEM },
+ { "hw_ld/r", EV4HWMEM(0x1B,0x2), EV4, ARG_EV4HWMEM },
+ { "hw_ld/rq", EV4HWMEM(0x1B,0x3), EV4, ARG_EV4HWMEM },
+ { "hw_ld/v", EV5HWMEM(0x1B,0x02), EV5, ARG_EV5HWMEM },
+ { "hw_ld/vl", EV5HWMEM(0x1B,0x03), EV5, ARG_EV5HWMEM },
+ { "hw_ld/w", EV5HWMEM(0x1B,0x08), EV5, ARG_EV5HWMEM },
+ { "hw_ld/wl", EV5HWMEM(0x1B,0x09), EV5, ARG_EV5HWMEM },
+ { "hw_ld/wq", EV5HWMEM(0x1B,0x0c), EV5, ARG_EV5HWMEM },
+ { "hw_ld/wql", EV5HWMEM(0x1B,0x0d), EV5, ARG_EV5HWMEM },
+ { "hw_ld/wqv", EV5HWMEM(0x1B,0x0e), EV5, ARG_EV5HWMEM },
+ { "hw_ld/wqvl", EV5HWMEM(0x1B,0x0f), EV5, ARG_EV5HWMEM },
+ { "hw_ld/wv", EV5HWMEM(0x1B,0x0a), EV5, ARG_EV5HWMEM },
+ { "hw_ld/wvl", EV5HWMEM(0x1B,0x0b), EV5, ARG_EV5HWMEM },
+ { "pal1b", PCD(0x1B), BASE, ARG_PCD },
+
+ { "sextb", OPR(0x1C, 0x00), BWX, ARG_OPRZ1 },
+ { "sextw", OPR(0x1C, 0x01), BWX, ARG_OPRZ1 },
+ { "ctpop", OPR(0x1C, 0x30), CIX, ARG_OPRZ1 },
+ { "perr", OPR(0x1C, 0x31), MAX, ARG_OPR },
+ { "ctlz", OPR(0x1C, 0x32), CIX, ARG_OPRZ1 },
+ { "cttz", OPR(0x1C, 0x33), CIX, ARG_OPRZ1 },
+ { "unpkbw", OPR(0x1C, 0x34), MAX, ARG_OPRZ1 },
+ { "unpkbl", OPR(0x1C, 0x35), MAX, ARG_OPRZ1 },
+ { "pkwb", OPR(0x1C, 0x36), MAX, ARG_OPRZ1 },
+ { "pklb", OPR(0x1C, 0x37), MAX, ARG_OPRZ1 },
+ { "minsb8", OPR(0x1C, 0x38), MAX, ARG_OPR },
+ { "minsb8", OPRL(0x1C, 0x38), MAX, ARG_OPRL },
+ { "minsw4", OPR(0x1C, 0x39), MAX, ARG_OPR },
+ { "minsw4", OPRL(0x1C, 0x39), MAX, ARG_OPRL },
+ { "minub8", OPR(0x1C, 0x3A), MAX, ARG_OPR },
+ { "minub8", OPRL(0x1C, 0x3A), MAX, ARG_OPRL },
+ { "minuw4", OPR(0x1C, 0x3B), MAX, ARG_OPR },
+ { "minuw4", OPRL(0x1C, 0x3B), MAX, ARG_OPRL },
+ { "maxub8", OPR(0x1C, 0x3C), MAX, ARG_OPR },
+ { "maxub8", OPRL(0x1C, 0x3C), MAX, ARG_OPRL },
+ { "maxuw4", OPR(0x1C, 0x3D), MAX, ARG_OPR },
+ { "maxuw4", OPRL(0x1C, 0x3D), MAX, ARG_OPRL },
+ { "maxsb8", OPR(0x1C, 0x3E), MAX, ARG_OPR },
+ { "maxsb8", OPRL(0x1C, 0x3E), MAX, ARG_OPRL },
+ { "maxsw4", OPR(0x1C, 0x3F), MAX, ARG_OPR },
+ { "maxsw4", OPRL(0x1C, 0x3F), MAX, ARG_OPRL },
+ { "ftoit", FP(0x1C, 0x70), CIX, { FA, ZB, RC } },
+ { "ftois", FP(0x1C, 0x78), CIX, { FA, ZB, RC } },
+
+ { "hw_mtpr", OPR(0x1D,0x00), EV4, { RA, RBA, EV4EXTHWINDEX } },
+ { "hw_mtpr", OP(0x1D), OP_MASK, EV5, { RA, RBA, EV5HWINDEX } },
+ { "hw_mtpr", OP(0x1D), OP_MASK, EV6, { ZA, RB, EV6HWINDEX } },
+ { "hw_mtpr/i", OPR(0x1D,0x01), EV4, ARG_EV4HWMPR },
+ { "hw_mtpr/a", OPR(0x1D,0x02), EV4, ARG_EV4HWMPR },
+ { "hw_mtpr/ai", OPR(0x1D,0x03), EV4, ARG_EV4HWMPR },
+ { "hw_mtpr/p", OPR(0x1D,0x04), EV4, ARG_EV4HWMPR },
+ { "hw_mtpr/pi", OPR(0x1D,0x05), EV4, ARG_EV4HWMPR },
+ { "hw_mtpr/pa", OPR(0x1D,0x06), EV4, ARG_EV4HWMPR },
+ { "hw_mtpr/pai", OPR(0x1D,0x07), EV4, ARG_EV4HWMPR },
+ { "pal1d", PCD(0x1D), BASE, ARG_PCD },
+
+ { "hw_rei", SPCD(0x1E,0x3FF8000), EV4|EV5, ARG_NONE },
+ { "hw_rei_stall", SPCD(0x1E,0x3FFC000), EV5, ARG_NONE },
+ { "hw_jmp", EV6HWMBR(0x1E,0x0), EV6, { ZA, PRB, EV6HWJMPHINT } },
+ { "hw_jsr", EV6HWMBR(0x1E,0x2), EV6, { ZA, PRB, EV6HWJMPHINT } },
+ { "hw_ret", EV6HWMBR(0x1E,0x4), EV6, { ZA, PRB } },
+ { "hw_jcr", EV6HWMBR(0x1E,0x6), EV6, { ZA, PRB } },
+ { "hw_coroutine", EV6HWMBR(0x1E,0x6), EV6, { ZA, PRB } }, /* alias */
+ { "hw_jmp/stall", EV6HWMBR(0x1E,0x1), EV6, { ZA, PRB, EV6HWJMPHINT } },
+ { "hw_jsr/stall", EV6HWMBR(0x1E,0x3), EV6, { ZA, PRB, EV6HWJMPHINT } },
+ { "hw_ret/stall", EV6HWMBR(0x1E,0x5), EV6, { ZA, PRB } },
+ { "hw_jcr/stall", EV6HWMBR(0x1E,0x7), EV6, { ZA, PRB } },
+ { "hw_coroutine/stall", EV6HWMBR(0x1E,0x7), EV6, { ZA, PRB } }, /* alias */
+ { "pal1e", PCD(0x1E), BASE, ARG_PCD },
+
+ { "hw_stl", EV4HWMEM(0x1F,0x0), EV4, ARG_EV4HWMEM },
+ { "hw_stl", EV5HWMEM(0x1F,0x00), EV5, ARG_EV5HWMEM },
+ { "hw_stl", EV6HWMEM(0x1F,0x4), EV6, ARG_EV6HWMEM }, /* ??? 8 */
+ { "hw_stl/a", EV4HWMEM(0x1F,0x4), EV4, ARG_EV4HWMEM },
+ { "hw_stl/a", EV5HWMEM(0x1F,0x10), EV5, ARG_EV5HWMEM },
+ { "hw_stl/a", EV6HWMEM(0x1F,0xC), EV6, ARG_EV6HWMEM },
+ { "hw_stl/ac", EV5HWMEM(0x1F,0x11), EV5, ARG_EV5HWMEM },
+ { "hw_stl/ar", EV4HWMEM(0x1F,0x6), EV4, ARG_EV4HWMEM },
+ { "hw_stl/av", EV5HWMEM(0x1F,0x12), EV5, ARG_EV5HWMEM },
+ { "hw_stl/avc", EV5HWMEM(0x1F,0x13), EV5, ARG_EV5HWMEM },
+ { "hw_stl/c", EV5HWMEM(0x1F,0x01), EV5, ARG_EV5HWMEM },
+ { "hw_stl/p", EV4HWMEM(0x1F,0x8), EV4, ARG_EV4HWMEM },
+ { "hw_stl/p", EV5HWMEM(0x1F,0x20), EV5, ARG_EV5HWMEM },
+ { "hw_stl/p", EV6HWMEM(0x1F,0x0), EV6, ARG_EV6HWMEM },
+ { "hw_stl/pa", EV4HWMEM(0x1F,0xC), EV4, ARG_EV4HWMEM },
+ { "hw_stl/pa", EV5HWMEM(0x1F,0x30), EV5, ARG_EV5HWMEM },
+ { "hw_stl/pac", EV5HWMEM(0x1F,0x31), EV5, ARG_EV5HWMEM },
+ { "hw_stl/pav", EV5HWMEM(0x1F,0x32), EV5, ARG_EV5HWMEM },
+ { "hw_stl/pavc", EV5HWMEM(0x1F,0x33), EV5, ARG_EV5HWMEM },
+ { "hw_stl/pc", EV5HWMEM(0x1F,0x21), EV5, ARG_EV5HWMEM },
+ { "hw_stl/pr", EV4HWMEM(0x1F,0xA), EV4, ARG_EV4HWMEM },
+ { "hw_stl/pv", EV5HWMEM(0x1F,0x22), EV5, ARG_EV5HWMEM },
+ { "hw_stl/pvc", EV5HWMEM(0x1F,0x23), EV5, ARG_EV5HWMEM },
+ { "hw_stl/r", EV4HWMEM(0x1F,0x2), EV4, ARG_EV4HWMEM },
+ { "hw_stl/v", EV5HWMEM(0x1F,0x02), EV5, ARG_EV5HWMEM },
+ { "hw_stl/vc", EV5HWMEM(0x1F,0x03), EV5, ARG_EV5HWMEM },
+ { "hw_stl_c", EV5HWMEM(0x1F,0x01), EV5, ARG_EV5HWMEM },
+ { "hw_stl_c/a", EV5HWMEM(0x1F,0x11), EV5, ARG_EV5HWMEM },
+ { "hw_stl_c/av", EV5HWMEM(0x1F,0x13), EV5, ARG_EV5HWMEM },
+ { "hw_stl_c/p", EV5HWMEM(0x1F,0x21), EV5, ARG_EV5HWMEM },
+ { "hw_stl_c/p", EV6HWMEM(0x1F,0x2), EV6, ARG_EV6HWMEM },
+ { "hw_stl_c/pa", EV5HWMEM(0x1F,0x31), EV5, ARG_EV5HWMEM },
+ { "hw_stl_c/pav", EV5HWMEM(0x1F,0x33), EV5, ARG_EV5HWMEM },
+ { "hw_stl_c/pv", EV5HWMEM(0x1F,0x23), EV5, ARG_EV5HWMEM },
+ { "hw_stl_c/v", EV5HWMEM(0x1F,0x03), EV5, ARG_EV5HWMEM },
+ { "hw_stq", EV4HWMEM(0x1F,0x1), EV4, ARG_EV4HWMEM },
+ { "hw_stq", EV5HWMEM(0x1F,0x04), EV5, ARG_EV5HWMEM },
+ { "hw_stq", EV6HWMEM(0x1F,0x5), EV6, ARG_EV6HWMEM }, /* ??? 9 */
+ { "hw_stq/a", EV4HWMEM(0x1F,0x5), EV4, ARG_EV4HWMEM },
+ { "hw_stq/a", EV5HWMEM(0x1F,0x14), EV5, ARG_EV5HWMEM },
+ { "hw_stq/a", EV6HWMEM(0x1F,0xD), EV6, ARG_EV6HWMEM },
+ { "hw_stq/ac", EV5HWMEM(0x1F,0x15), EV5, ARG_EV5HWMEM },
+ { "hw_stq/ar", EV4HWMEM(0x1F,0x7), EV4, ARG_EV4HWMEM },
+ { "hw_stq/av", EV5HWMEM(0x1F,0x16), EV5, ARG_EV5HWMEM },
+ { "hw_stq/avc", EV5HWMEM(0x1F,0x17), EV5, ARG_EV5HWMEM },
+ { "hw_stq/c", EV5HWMEM(0x1F,0x05), EV5, ARG_EV5HWMEM },
+ { "hw_stq/p", EV4HWMEM(0x1F,0x9), EV4, ARG_EV4HWMEM },
+ { "hw_stq/p", EV5HWMEM(0x1F,0x24), EV5, ARG_EV5HWMEM },
+ { "hw_stq/p", EV6HWMEM(0x1F,0x1), EV6, ARG_EV6HWMEM },
+ { "hw_stq/pa", EV4HWMEM(0x1F,0xD), EV4, ARG_EV4HWMEM },
+ { "hw_stq/pa", EV5HWMEM(0x1F,0x34), EV5, ARG_EV5HWMEM },
+ { "hw_stq/pac", EV5HWMEM(0x1F,0x35), EV5, ARG_EV5HWMEM },
+ { "hw_stq/par", EV4HWMEM(0x1F,0xE), EV4, ARG_EV4HWMEM },
+ { "hw_stq/par", EV4HWMEM(0x1F,0xF), EV4, ARG_EV4HWMEM },
+ { "hw_stq/pav", EV5HWMEM(0x1F,0x36), EV5, ARG_EV5HWMEM },
+ { "hw_stq/pavc", EV5HWMEM(0x1F,0x37), EV5, ARG_EV5HWMEM },
+ { "hw_stq/pc", EV5HWMEM(0x1F,0x25), EV5, ARG_EV5HWMEM },
+ { "hw_stq/pr", EV4HWMEM(0x1F,0xB), EV4, ARG_EV4HWMEM },
+ { "hw_stq/pv", EV5HWMEM(0x1F,0x26), EV5, ARG_EV5HWMEM },
+ { "hw_stq/pvc", EV5HWMEM(0x1F,0x27), EV5, ARG_EV5HWMEM },
+ { "hw_stq/r", EV4HWMEM(0x1F,0x3), EV4, ARG_EV4HWMEM },
+ { "hw_stq/v", EV5HWMEM(0x1F,0x06), EV5, ARG_EV5HWMEM },
+ { "hw_stq/vc", EV5HWMEM(0x1F,0x07), EV5, ARG_EV5HWMEM },
+ { "hw_stq_c", EV5HWMEM(0x1F,0x05), EV5, ARG_EV5HWMEM },
+ { "hw_stq_c/a", EV5HWMEM(0x1F,0x15), EV5, ARG_EV5HWMEM },
+ { "hw_stq_c/av", EV5HWMEM(0x1F,0x17), EV5, ARG_EV5HWMEM },
+ { "hw_stq_c/p", EV5HWMEM(0x1F,0x25), EV5, ARG_EV5HWMEM },
+ { "hw_stq_c/p", EV6HWMEM(0x1F,0x3), EV6, ARG_EV6HWMEM },
+ { "hw_stq_c/pa", EV5HWMEM(0x1F,0x35), EV5, ARG_EV5HWMEM },
+ { "hw_stq_c/pav", EV5HWMEM(0x1F,0x37), EV5, ARG_EV5HWMEM },
+ { "hw_stq_c/pv", EV5HWMEM(0x1F,0x27), EV5, ARG_EV5HWMEM },
+ { "hw_stq_c/v", EV5HWMEM(0x1F,0x07), EV5, ARG_EV5HWMEM },
+ { "hw_st", EV4HWMEM(0x1F,0x0), EV4, ARG_EV4HWMEM },
+ { "hw_st", EV5HWMEM(0x1F,0x00), EV5, ARG_EV5HWMEM },
+ { "hw_st/a", EV4HWMEM(0x1F,0x4), EV4, ARG_EV4HWMEM },
+ { "hw_st/a", EV5HWMEM(0x1F,0x10), EV5, ARG_EV5HWMEM },
+ { "hw_st/ac", EV5HWMEM(0x1F,0x11), EV5, ARG_EV5HWMEM },
+ { "hw_st/aq", EV4HWMEM(0x1F,0x5), EV4, ARG_EV4HWMEM },
+ { "hw_st/aq", EV5HWMEM(0x1F,0x14), EV5, ARG_EV5HWMEM },
+ { "hw_st/aqc", EV5HWMEM(0x1F,0x15), EV5, ARG_EV5HWMEM },
+ { "hw_st/aqv", EV5HWMEM(0x1F,0x16), EV5, ARG_EV5HWMEM },
+ { "hw_st/aqvc", EV5HWMEM(0x1F,0x17), EV5, ARG_EV5HWMEM },
+ { "hw_st/ar", EV4HWMEM(0x1F,0x6), EV4, ARG_EV4HWMEM },
+ { "hw_st/arq", EV4HWMEM(0x1F,0x7), EV4, ARG_EV4HWMEM },
+ { "hw_st/av", EV5HWMEM(0x1F,0x12), EV5, ARG_EV5HWMEM },
+ { "hw_st/avc", EV5HWMEM(0x1F,0x13), EV5, ARG_EV5HWMEM },
+ { "hw_st/c", EV5HWMEM(0x1F,0x01), EV5, ARG_EV5HWMEM },
+ { "hw_st/p", EV4HWMEM(0x1F,0x8), EV4, ARG_EV4HWMEM },
+ { "hw_st/p", EV5HWMEM(0x1F,0x20), EV5, ARG_EV5HWMEM },
+ { "hw_st/pa", EV4HWMEM(0x1F,0xC), EV4, ARG_EV4HWMEM },
+ { "hw_st/pa", EV5HWMEM(0x1F,0x30), EV5, ARG_EV5HWMEM },
+ { "hw_st/pac", EV5HWMEM(0x1F,0x31), EV5, ARG_EV5HWMEM },
+ { "hw_st/paq", EV4HWMEM(0x1F,0xD), EV4, ARG_EV4HWMEM },
+ { "hw_st/paq", EV5HWMEM(0x1F,0x34), EV5, ARG_EV5HWMEM },
+ { "hw_st/paqc", EV5HWMEM(0x1F,0x35), EV5, ARG_EV5HWMEM },
+ { "hw_st/paqv", EV5HWMEM(0x1F,0x36), EV5, ARG_EV5HWMEM },
+ { "hw_st/paqvc", EV5HWMEM(0x1F,0x37), EV5, ARG_EV5HWMEM },
+ { "hw_st/par", EV4HWMEM(0x1F,0xE), EV4, ARG_EV4HWMEM },
+ { "hw_st/parq", EV4HWMEM(0x1F,0xF), EV4, ARG_EV4HWMEM },
+ { "hw_st/pav", EV5HWMEM(0x1F,0x32), EV5, ARG_EV5HWMEM },
+ { "hw_st/pavc", EV5HWMEM(0x1F,0x33), EV5, ARG_EV5HWMEM },
+ { "hw_st/pc", EV5HWMEM(0x1F,0x21), EV5, ARG_EV5HWMEM },
+ { "hw_st/pq", EV4HWMEM(0x1F,0x9), EV4, ARG_EV4HWMEM },
+ { "hw_st/pq", EV5HWMEM(0x1F,0x24), EV5, ARG_EV5HWMEM },
+ { "hw_st/pqc", EV5HWMEM(0x1F,0x25), EV5, ARG_EV5HWMEM },
+ { "hw_st/pqv", EV5HWMEM(0x1F,0x26), EV5, ARG_EV5HWMEM },
+ { "hw_st/pqvc", EV5HWMEM(0x1F,0x27), EV5, ARG_EV5HWMEM },
+ { "hw_st/pr", EV4HWMEM(0x1F,0xA), EV4, ARG_EV4HWMEM },
+ { "hw_st/prq", EV4HWMEM(0x1F,0xB), EV4, ARG_EV4HWMEM },
+ { "hw_st/pv", EV5HWMEM(0x1F,0x22), EV5, ARG_EV5HWMEM },
+ { "hw_st/pvc", EV5HWMEM(0x1F,0x23), EV5, ARG_EV5HWMEM },
+ { "hw_st/q", EV4HWMEM(0x1F,0x1), EV4, ARG_EV4HWMEM },
+ { "hw_st/q", EV5HWMEM(0x1F,0x04), EV5, ARG_EV5HWMEM },
+ { "hw_st/qc", EV5HWMEM(0x1F,0x05), EV5, ARG_EV5HWMEM },
+ { "hw_st/qv", EV5HWMEM(0x1F,0x06), EV5, ARG_EV5HWMEM },
+ { "hw_st/qvc", EV5HWMEM(0x1F,0x07), EV5, ARG_EV5HWMEM },
+ { "hw_st/r", EV4HWMEM(0x1F,0x2), EV4, ARG_EV4HWMEM },
+ { "hw_st/v", EV5HWMEM(0x1F,0x02), EV5, ARG_EV5HWMEM },
+ { "hw_st/vc", EV5HWMEM(0x1F,0x03), EV5, ARG_EV5HWMEM },
+ { "pal1f", PCD(0x1F), BASE, ARG_PCD },
+
+ { "ldf", MEM(0x20), BASE, ARG_FMEM },
+ { "ldg", MEM(0x21), BASE, ARG_FMEM },
+ { "lds", MEM(0x22), BASE, ARG_FMEM },
+ { "ldt", MEM(0x23), BASE, ARG_FMEM },
+ { "stf", MEM(0x24), BASE, ARG_FMEM },
+ { "stg", MEM(0x25), BASE, ARG_FMEM },
+ { "sts", MEM(0x26), BASE, ARG_FMEM },
+ { "stt", MEM(0x27), BASE, ARG_FMEM },
+
+ { "ldl", MEM(0x28), BASE, ARG_MEM },
+ { "ldq", MEM(0x29), BASE, ARG_MEM },
+ { "ldl_l", MEM(0x2A), BASE, ARG_MEM },
+ { "ldq_l", MEM(0x2B), BASE, ARG_MEM },
+ { "stl", MEM(0x2C), BASE, ARG_MEM },
+ { "stq", MEM(0x2D), BASE, ARG_MEM },
+ { "stl_c", MEM(0x2E), BASE, ARG_MEM },
+ { "stq_c", MEM(0x2F), BASE, ARG_MEM },
+
+ { "br", BRA(0x30), BASE, { ZA, BDISP } }, /* pseudo */
+ { "br", BRA(0x30), BASE, ARG_BRA },
+ { "fbeq", BRA(0x31), BASE, ARG_FBRA },
+ { "fblt", BRA(0x32), BASE, ARG_FBRA },
+ { "fble", BRA(0x33), BASE, ARG_FBRA },
+ { "bsr", BRA(0x34), BASE, ARG_BRA },
+ { "fbne", BRA(0x35), BASE, ARG_FBRA },
+ { "fbge", BRA(0x36), BASE, ARG_FBRA },
+ { "fbgt", BRA(0x37), BASE, ARG_FBRA },
+ { "blbc", BRA(0x38), BASE, ARG_BRA },
+ { "beq", BRA(0x39), BASE, ARG_BRA },
+ { "blt", BRA(0x3A), BASE, ARG_BRA },
+ { "ble", BRA(0x3B), BASE, ARG_BRA },
+ { "blbs", BRA(0x3C), BASE, ARG_BRA },
+ { "bne", BRA(0x3D), BASE, ARG_BRA },
+ { "bge", BRA(0x3E), BASE, ARG_BRA },
+ { "bgt", BRA(0x3F), BASE, ARG_BRA },
+};
+
+const unsigned alpha_num_opcodes = sizeof(alpha_opcodes)/sizeof(*alpha_opcodes);
+
+/* OSF register names. */
+
+static const char * const osf_regnames[64] = {
+ "v0", "t0", "t1", "t2", "t3", "t4", "t5", "t6",
+ "t7", "s0", "s1", "s2", "s3", "s4", "s5", "fp",
+ "a0", "a1", "a2", "a3", "a4", "a5", "t8", "t9",
+ "t10", "t11", "ra", "t12", "at", "gp", "sp", "zero",
+ "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
+ "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
+ "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
+ "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31"
+};
+
+/* VMS register names. */
+
+static const char * const vms_regnames[64] = {
+ "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
+ "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15",
+ "R16", "R17", "R18", "R19", "R20", "R21", "R22", "R23",
+ "R24", "AI", "RA", "PV", "AT", "FP", "SP", "RZ",
+ "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7",
+ "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15",
+ "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23",
+ "F24", "F25", "F26", "F27", "F28", "F29", "F30", "FZ"
+};
+
+/* Disassemble Alpha instructions. */
+
+int
+print_insn_alpha (bfd_vma memaddr, struct disassemble_info *info)
+{
+ static const struct alpha_opcode *opcode_index[AXP_NOPS+1];
+ const char * const * regnames;
+ const struct alpha_opcode *opcode, *opcode_end;
+ const unsigned char *opindex;
+ unsigned insn, op, isa_mask;
+ int need_comma;
+
+ /* Initialize the majorop table the first time through */
+ if (!opcode_index[0])
+ {
+ opcode = alpha_opcodes;
+ opcode_end = opcode + alpha_num_opcodes;
+
+ for (op = 0; op < AXP_NOPS; ++op)
+ {
+ opcode_index[op] = opcode;
+ while (opcode < opcode_end && op == AXP_OP (opcode->opcode))
+ ++opcode;
+ }
+ opcode_index[op] = opcode;
+ }
+
+ if (info->flavour == bfd_target_evax_flavour)
+ regnames = vms_regnames;
+ else
+ regnames = osf_regnames;
+
+ isa_mask = AXP_OPCODE_NOPAL;
+ switch (info->mach)
+ {
+ case bfd_mach_alpha_ev4:
+ isa_mask |= AXP_OPCODE_EV4;
+ break;
+ case bfd_mach_alpha_ev5:
+ isa_mask |= AXP_OPCODE_EV5;
+ break;
+ case bfd_mach_alpha_ev6:
+ isa_mask |= AXP_OPCODE_EV6;
+ break;
+ }
+
+ /* Read the insn into a host word */
+ {
+ bfd_byte buffer[4];
+ int status = (*info->read_memory_func) (memaddr, buffer, 4, info);
+ if (status != 0)
+ {
+ (*info->memory_error_func) (status, memaddr, info);
+ return -1;
+ }
+ insn = bfd_getl32 (buffer);
+ }
+
+ /* Get the major opcode of the instruction. */
+ op = AXP_OP (insn);
+
+ /* Find the first match in the opcode table. */
+ opcode_end = opcode_index[op + 1];
+ for (opcode = opcode_index[op]; opcode < opcode_end; ++opcode)
+ {
+ if ((insn ^ opcode->opcode) & opcode->mask)
+ continue;
+
+ if (!(opcode->flags & isa_mask))
+ continue;
+
+ /* Make two passes over the operands. First see if any of them
+ have extraction functions, and, if they do, make sure the
+ instruction is valid. */
+ {
+ int invalid = 0;
+ for (opindex = opcode->operands; *opindex != 0; opindex++)
+ {
+ const struct alpha_operand *operand = alpha_operands + *opindex;
+ if (operand->extract)
+ (*operand->extract) (insn, &invalid);
+ }
+ if (invalid)
+ continue;
+ }
+
+ /* The instruction is valid. */
+ goto found;
+ }
+
+ /* No instruction found */
+ (*info->fprintf_func) (info->stream, ".long %#08x", insn);
+
+ return 4;
+
+found:
+ (*info->fprintf_func) (info->stream, "%s", opcode->name);
+ if (opcode->operands[0] != 0)
+ (*info->fprintf_func) (info->stream, "\t");
+
+ /* Now extract and print the operands. */
+ need_comma = 0;
+ for (opindex = opcode->operands; *opindex != 0; opindex++)
+ {
+ const struct alpha_operand *operand = alpha_operands + *opindex;
+ int value;
+
+ /* Operands that are marked FAKE are simply ignored. We
+ already made sure that the extract function considered
+ the instruction to be valid. */
+ if ((operand->flags & AXP_OPERAND_FAKE) != 0)
+ continue;
+
+ /* Extract the value from the instruction. */
+ if (operand->extract)
+ value = (*operand->extract) (insn, (int *) NULL);
+ else
+ {
+ value = (insn >> operand->shift) & ((1 << operand->bits) - 1);
+ if (operand->flags & AXP_OPERAND_SIGNED)
+ {
+ int signbit = 1 << (operand->bits - 1);
+ value = (value ^ signbit) - signbit;
+ }
+ }
+
+ if (need_comma &&
+ ((operand->flags & (AXP_OPERAND_PARENS | AXP_OPERAND_COMMA))
+ != AXP_OPERAND_PARENS))
+ {
+ (*info->fprintf_func) (info->stream, ",");
+ }
+ if (operand->flags & AXP_OPERAND_PARENS)
+ (*info->fprintf_func) (info->stream, "(");
+
+ /* Print the operand as directed by the flags. */
+ if (operand->flags & AXP_OPERAND_IR)
+ (*info->fprintf_func) (info->stream, "%s", regnames[value]);
+ else if (operand->flags & AXP_OPERAND_FPR)
+ (*info->fprintf_func) (info->stream, "%s", regnames[value + 32]);
+ else if (operand->flags & AXP_OPERAND_RELATIVE)
+ (*info->print_address_func) (memaddr + 4 + value, info);
+ else if (operand->flags & AXP_OPERAND_SIGNED)
+ (*info->fprintf_func) (info->stream, "%d", value);
+ else
+ (*info->fprintf_func) (info->stream, "%#x", value);
+
+ if (operand->flags & AXP_OPERAND_PARENS)
+ (*info->fprintf_func) (info->stream, ")");
+ need_comma = 1;
+ }
+
+ return 4;
+}
diff --git a/qemu-0.15.x/alpha.ld b/qemu-0.15.x/alpha.ld
new file mode 100644
index 0000000..906d76b
--- /dev/null
+++ b/qemu-0.15.x/alpha.ld
@@ -0,0 +1,127 @@
+OUTPUT_FORMAT("elf64-alpha", "elf64-alpha",
+ "elf64-alpha")
+OUTPUT_ARCH(alpha)
+ENTRY(__start)
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+ . = 0x60000000 + SIZEOF_HEADERS;
+ .interp : { *(.interp) }
+ .hash : { *(.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .gnu.version : { *(.gnu.version) }
+ .gnu.version_d : { *(.gnu.version_d) }
+ .gnu.version_r : { *(.gnu.version_r) }
+ .rel.text :
+ { *(.rel.text) *(.rel.gnu.linkonce.t*) }
+ .rela.text :
+ { *(.rela.text) *(.rela.gnu.linkonce.t*) }
+ .rel.data :
+ { *(.rel.data) *(.rel.gnu.linkonce.d*) }
+ .rela.data :
+ { *(.rela.data) *(.rela.gnu.linkonce.d*) }
+ .rel.rodata :
+ { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }
+ .rela.rodata :
+ { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
+ .rel.got : { *(.rel.got) }
+ .rela.got : { *(.rela.got) }
+ .rel.ctors : { *(.rel.ctors) }
+ .rela.ctors : { *(.rela.ctors) }
+ .rel.dtors : { *(.rel.dtors) }
+ .rela.dtors : { *(.rela.dtors) }
+ .rel.init : { *(.rel.init) }
+ .rela.init : { *(.rela.init) }
+ .rel.fini : { *(.rel.fini) }
+ .rela.fini : { *(.rela.fini) }
+ .rel.bss : { *(.rel.bss) }
+ .rela.bss : { *(.rela.bss) }
+ .rel.plt : { *(.rel.plt) }
+ .rela.plt : { *(.rela.plt) }
+ .init : { *(.init) } =0x47ff041f
+ .text :
+ {
+ *(.text)
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ *(.gnu.linkonce.t*)
+ } =0x47ff041f
+ _etext = .;
+ PROVIDE (etext = .);
+ .fini : { *(.fini) } =0x47ff041f
+ .rodata : { *(.rodata) *(.gnu.linkonce.r*) }
+ .rodata1 : { *(.rodata1) }
+ .reginfo : { *(.reginfo) }
+ /* Adjust the address for the data segment. We want to adjust up to
+ the same address within the page on the next page up. */
+ . = ALIGN(0x100000) + (. & (0x100000 - 1));
+ .data :
+ {
+ *(.data)
+ *(.gnu.linkonce.d*)
+ CONSTRUCTORS
+ }
+ .data1 : { *(.data1) }
+ .ctors :
+ {
+ *(.ctors)
+ }
+ .dtors :
+ {
+ *(.dtors)
+ }
+ .plt : { *(.plt) }
+ .got : { *(.got.plt) *(.got) }
+ .dynamic : { *(.dynamic) }
+ /* We want the small data sections together, so single-instruction offsets
+ can access them all, and initialized data all before uninitialized, so
+ we can shorten the on-disk segment size. */
+ .sdata : { *(.sdata) }
+ _edata = .;
+ PROVIDE (edata = .);
+ __bss_start = .;
+ .sbss : { *(.sbss) *(.scommon) }
+ .bss :
+ {
+ *(.dynbss)
+ *(.bss)
+ *(COMMON)
+ }
+ _end = . ;
+ PROVIDE (end = .);
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* These must appear regardless of . */
+}
diff --git a/qemu-0.15.x/arch_init.c b/qemu-0.15.x/arch_init.c
new file mode 100644
index 0000000..484b39d
--- /dev/null
+++ b/qemu-0.15.x/arch_init.c
@@ -0,0 +1,733 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * 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.
+ */
+#include <stdint.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#ifndef _WIN32
+#include <sys/types.h>
+#include <sys/mman.h>
+#endif
+#include "config.h"
+#include "monitor.h"
+#include "sysemu.h"
+#include "arch_init.h"
+#include "audio/audio.h"
+#include "hw/pc.h"
+#include "hw/pci.h"
+#include "hw/audiodev.h"
+#include "kvm.h"
+#include "migration.h"
+#include "net.h"
+#include "gdbstub.h"
+#include "hw/smbios.h"
+
+#ifdef TARGET_SPARC
+int graphic_width = 1024;
+int graphic_height = 768;
+int graphic_depth = 8;
+#else
+int graphic_width = 800;
+int graphic_height = 600;
+int graphic_depth = 15;
+#endif
+
+const char arch_config_name[] = CONFIG_QEMU_CONFDIR "/target-" TARGET_ARCH ".conf";
+
+#if defined(TARGET_ALPHA)
+#define QEMU_ARCH QEMU_ARCH_ALPHA
+#elif defined(TARGET_ARM)
+#define QEMU_ARCH QEMU_ARCH_ARM
+#elif defined(TARGET_CRIS)
+#define QEMU_ARCH QEMU_ARCH_CRIS
+#elif defined(TARGET_I386)
+#define QEMU_ARCH QEMU_ARCH_I386
+#elif defined(TARGET_M68K)
+#define QEMU_ARCH QEMU_ARCH_M68K
+#elif defined(TARGET_LM32)
+#define QEMU_ARCH QEMU_ARCH_LM32
+#elif defined(TARGET_MICROBLAZE)
+#define QEMU_ARCH QEMU_ARCH_MICROBLAZE
+#elif defined(TARGET_MIPS)
+#define QEMU_ARCH QEMU_ARCH_MIPS
+#elif defined(TARGET_PPC)
+#define QEMU_ARCH QEMU_ARCH_PPC
+#elif defined(TARGET_S390X)
+#define QEMU_ARCH QEMU_ARCH_S390X
+#elif defined(TARGET_SH4)
+#define QEMU_ARCH QEMU_ARCH_SH4
+#elif defined(TARGET_SPARC)
+#define QEMU_ARCH QEMU_ARCH_SPARC
+#endif
+
+const uint32_t arch_type = QEMU_ARCH;
+
+/***********************************************************/
+/* ram save/restore */
+
+#define RAM_SAVE_FLAG_FULL 0x01 /* Obsolete, not used anymore */
+#define RAM_SAVE_FLAG_COMPRESS 0x02
+#define RAM_SAVE_FLAG_MEM_SIZE 0x04
+#define RAM_SAVE_FLAG_PAGE 0x08
+#define RAM_SAVE_FLAG_EOS 0x10
+#define RAM_SAVE_FLAG_CONTINUE 0x20
+
+static int is_dup_page(uint8_t *page, uint8_t ch)
+{
+ uint32_t val = ch << 24 | ch << 16 | ch << 8 | ch;
+ uint32_t *array = (uint32_t *)page;
+ int i;
+
+ for (i = 0; i < (TARGET_PAGE_SIZE / 4); i++) {
+ if (array[i] != val) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static RAMBlock *last_block;
+static ram_addr_t last_offset;
+
+static int ram_save_block(QEMUFile *f)
+{
+ RAMBlock *block = last_block;
+ ram_addr_t offset = last_offset;
+ ram_addr_t current_addr;
+ int bytes_sent = 0;
+
+ if (!block)
+ block = QLIST_FIRST(&ram_list.blocks);
+
+ current_addr = block->offset + offset;
+
+ do {
+ if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) {
+ uint8_t *p;
+ int cont = (block == last_block) ? RAM_SAVE_FLAG_CONTINUE : 0;
+
+ cpu_physical_memory_reset_dirty(current_addr,
+ current_addr + TARGET_PAGE_SIZE,
+ MIGRATION_DIRTY_FLAG);
+
+ p = block->host + offset;
+
+ if (is_dup_page(p, *p)) {
+ qemu_put_be64(f, offset | cont | RAM_SAVE_FLAG_COMPRESS);
+ if (!cont) {
+ qemu_put_byte(f, strlen(block->idstr));
+ qemu_put_buffer(f, (uint8_t *)block->idstr,
+ strlen(block->idstr));
+ }
+ qemu_put_byte(f, *p);
+ bytes_sent = 1;
+ } else {
+ qemu_put_be64(f, offset | cont | RAM_SAVE_FLAG_PAGE);
+ if (!cont) {
+ qemu_put_byte(f, strlen(block->idstr));
+ qemu_put_buffer(f, (uint8_t *)block->idstr,
+ strlen(block->idstr));
+ }
+ qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
+ bytes_sent = TARGET_PAGE_SIZE;
+ }
+
+ break;
+ }
+
+ offset += TARGET_PAGE_SIZE;
+ if (offset >= block->length) {
+ offset = 0;
+ block = QLIST_NEXT(block, next);
+ if (!block)
+ block = QLIST_FIRST(&ram_list.blocks);
+ }
+
+ current_addr = block->offset + offset;
+
+ } while (current_addr != last_block->offset + last_offset);
+
+ last_block = block;
+ last_offset = offset;
+
+ return bytes_sent;
+}
+
+static uint64_t bytes_transferred;
+
+static ram_addr_t ram_save_remaining(void)
+{
+ RAMBlock *block;
+ ram_addr_t count = 0;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ ram_addr_t addr;
+ for (addr = block->offset; addr < block->offset + block->length;
+ addr += TARGET_PAGE_SIZE) {
+ if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) {
+ count++;
+ }
+ }
+ }
+
+ return count;
+}
+
+uint64_t ram_bytes_remaining(void)
+{
+ return ram_save_remaining() * TARGET_PAGE_SIZE;
+}
+
+uint64_t ram_bytes_transferred(void)
+{
+ return bytes_transferred;
+}
+
+uint64_t ram_bytes_total(void)
+{
+ RAMBlock *block;
+ uint64_t total = 0;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next)
+ total += block->length;
+
+ return total;
+}
+
+static int block_compar(const void *a, const void *b)
+{
+ RAMBlock * const *ablock = a;
+ RAMBlock * const *bblock = b;
+ if ((*ablock)->offset < (*bblock)->offset) {
+ return -1;
+ } else if ((*ablock)->offset > (*bblock)->offset) {
+ return 1;
+ }
+ return 0;
+}
+
+static void sort_ram_list(void)
+{
+ RAMBlock *block, *nblock, **blocks;
+ int n;
+ n = 0;
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ ++n;
+ }
+ blocks = qemu_malloc(n * sizeof *blocks);
+ n = 0;
+ QLIST_FOREACH_SAFE(block, &ram_list.blocks, next, nblock) {
+ blocks[n++] = block;
+ QLIST_REMOVE(block, next);
+ }
+ qsort(blocks, n, sizeof *blocks, block_compar);
+ while (--n >= 0) {
+ QLIST_INSERT_HEAD(&ram_list.blocks, blocks[n], next);
+ }
+ qemu_free(blocks);
+}
+
+int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
+{
+ ram_addr_t addr;
+ uint64_t bytes_transferred_last;
+ double bwidth = 0;
+ uint64_t expected_time = 0;
+
+ if (stage < 0) {
+ cpu_physical_memory_set_dirty_tracking(0);
+ return 0;
+ }
+
+ if (cpu_physical_sync_dirty_bitmap(0, TARGET_PHYS_ADDR_MAX) != 0) {
+ qemu_file_set_error(f);
+ return 0;
+ }
+
+ if (stage == 1) {
+ RAMBlock *block;
+ bytes_transferred = 0;
+ last_block = NULL;
+ last_offset = 0;
+ sort_ram_list();
+
+ /* Make sure all dirty bits are set */
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ for (addr = block->offset; addr < block->offset + block->length;
+ addr += TARGET_PAGE_SIZE) {
+ if (!cpu_physical_memory_get_dirty(addr,
+ MIGRATION_DIRTY_FLAG)) {
+ cpu_physical_memory_set_dirty(addr);
+ }
+ }
+ }
+
+ /* Enable dirty memory tracking */
+ cpu_physical_memory_set_dirty_tracking(1);
+
+ qemu_put_be64(f, ram_bytes_total() | RAM_SAVE_FLAG_MEM_SIZE);
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ qemu_put_byte(f, strlen(block->idstr));
+ qemu_put_buffer(f, (uint8_t *)block->idstr, strlen(block->idstr));
+ qemu_put_be64(f, block->length);
+ }
+ }
+
+ bytes_transferred_last = bytes_transferred;
+ bwidth = qemu_get_clock_ns(rt_clock);
+
+ while (!qemu_file_rate_limit(f)) {
+ int bytes_sent;
+
+ bytes_sent = ram_save_block(f);
+ bytes_transferred += bytes_sent;
+ if (bytes_sent == 0) { /* no more blocks */
+ break;
+ }
+ }
+
+ bwidth = qemu_get_clock_ns(rt_clock) - bwidth;
+ bwidth = (bytes_transferred - bytes_transferred_last) / bwidth;
+
+ /* if we haven't transferred anything this round, force expected_time to a
+ * a very high value, but without crashing */
+ if (bwidth == 0) {
+ bwidth = 0.000001;
+ }
+
+ /* try transferring iterative blocks of memory */
+ if (stage == 3) {
+ int bytes_sent;
+
+ /* flush all remaining blocks regardless of rate limiting */
+ while ((bytes_sent = ram_save_block(f)) != 0) {
+ bytes_transferred += bytes_sent;
+ }
+ cpu_physical_memory_set_dirty_tracking(0);
+ }
+
+ qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
+
+ expected_time = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth;
+
+ return (stage == 2) && (expected_time <= migrate_max_downtime());
+}
+
+static inline void *host_from_stream_offset(QEMUFile *f,
+ ram_addr_t offset,
+ int flags)
+{
+ static RAMBlock *block = NULL;
+ char id[256];
+ uint8_t len;
+
+ if (flags & RAM_SAVE_FLAG_CONTINUE) {
+ if (!block) {
+ fprintf(stderr, "Ack, bad migration stream!\n");
+ return NULL;
+ }
+
+ return block->host + offset;
+ }
+
+ len = qemu_get_byte(f);
+ qemu_get_buffer(f, (uint8_t *)id, len);
+ id[len] = 0;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (!strncmp(id, block->idstr, sizeof(id)))
+ return block->host + offset;
+ }
+
+ fprintf(stderr, "Can't find block %s!\n", id);
+ return NULL;
+}
+
+int ram_load(QEMUFile *f, void *opaque, int version_id)
+{
+ ram_addr_t addr;
+ int flags;
+
+ if (version_id < 3 || version_id > 4) {
+ return -EINVAL;
+ }
+
+ do {
+ addr = qemu_get_be64(f);
+
+ flags = addr & ~TARGET_PAGE_MASK;
+ addr &= TARGET_PAGE_MASK;
+
+ if (flags & RAM_SAVE_FLAG_MEM_SIZE) {
+ if (version_id == 3) {
+ if (addr != ram_bytes_total()) {
+ return -EINVAL;
+ }
+ } else {
+ /* Synchronize RAM block list */
+ char id[256];
+ ram_addr_t length;
+ ram_addr_t total_ram_bytes = addr;
+
+ while (total_ram_bytes) {
+ RAMBlock *block;
+ uint8_t len;
+
+ len = qemu_get_byte(f);
+ qemu_get_buffer(f, (uint8_t *)id, len);
+ id[len] = 0;
+ length = qemu_get_be64(f);
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (!strncmp(id, block->idstr, sizeof(id))) {
+ if (block->length != length)
+ return -EINVAL;
+ break;
+ }
+ }
+
+ if (!block) {
+ fprintf(stderr, "Unknown ramblock \"%s\", cannot "
+ "accept migration\n", id);
+ return -EINVAL;
+ }
+
+ total_ram_bytes -= length;
+ }
+ }
+ }
+
+ if (flags & RAM_SAVE_FLAG_COMPRESS) {
+ void *host;
+ uint8_t ch;
+
+ if (version_id == 3)
+ host = qemu_get_ram_ptr(addr);
+ else
+ host = host_from_stream_offset(f, addr, flags);
+ if (!host) {
+ return -EINVAL;
+ }
+
+ ch = qemu_get_byte(f);
+ memset(host, ch, TARGET_PAGE_SIZE);
+#ifndef _WIN32
+ if (ch == 0 &&
+ (!kvm_enabled() || kvm_has_sync_mmu())) {
+ qemu_madvise(host, TARGET_PAGE_SIZE, QEMU_MADV_DONTNEED);
+ }
+#endif
+ } else if (flags & RAM_SAVE_FLAG_PAGE) {
+ void *host;
+
+ if (version_id == 3)
+ host = qemu_get_ram_ptr(addr);
+ else
+ host = host_from_stream_offset(f, addr, flags);
+
+ qemu_get_buffer(f, host, TARGET_PAGE_SIZE);
+ }
+ if (qemu_file_has_error(f)) {
+ return -EIO;
+ }
+ } while (!(flags & RAM_SAVE_FLAG_EOS));
+
+ return 0;
+}
+
+void qemu_service_io(void)
+{
+ qemu_notify_event();
+}
+
+#ifdef HAS_AUDIO
+struct soundhw {
+ const char *name;
+ const char *descr;
+ int enabled;
+ int isa;
+ union {
+ int (*init_isa) (qemu_irq *pic);
+ int (*init_pci) (PCIBus *bus);
+ } init;
+};
+
+static struct soundhw soundhw[] = {
+#ifdef HAS_AUDIO_CHOICE
+#if defined(TARGET_I386) || defined(TARGET_MIPS)
+ {
+ "pcspk",
+ "PC speaker",
+ 0,
+ 1,
+ { .init_isa = pcspk_audio_init }
+ },
+#endif
+
+#ifdef CONFIG_SB16
+ {
+ "sb16",
+ "Creative Sound Blaster 16",
+ 0,
+ 1,
+ { .init_isa = SB16_init }
+ },
+#endif
+
+#ifdef CONFIG_CS4231A
+ {
+ "cs4231a",
+ "CS4231A",
+ 0,
+ 1,
+ { .init_isa = cs4231a_init }
+ },
+#endif
+
+#ifdef CONFIG_ADLIB
+ {
+ "adlib",
+#ifdef HAS_YMF262
+ "Yamaha YMF262 (OPL3)",
+#else
+ "Yamaha YM3812 (OPL2)",
+#endif
+ 0,
+ 1,
+ { .init_isa = Adlib_init }
+ },
+#endif
+
+#ifdef CONFIG_GUS
+ {
+ "gus",
+ "Gravis Ultrasound GF1",
+ 0,
+ 1,
+ { .init_isa = GUS_init }
+ },
+#endif
+
+#ifdef CONFIG_AC97
+ {
+ "ac97",
+ "Intel 82801AA AC97 Audio",
+ 0,
+ 0,
+ { .init_pci = ac97_init }
+ },
+#endif
+
+#ifdef CONFIG_ES1370
+ {
+ "es1370",
+ "ENSONIQ AudioPCI ES1370",
+ 0,
+ 0,
+ { .init_pci = es1370_init }
+ },
+#endif
+
+#ifdef CONFIG_HDA
+ {
+ "hda",
+ "Intel HD Audio",
+ 0,
+ 0,
+ { .init_pci = intel_hda_and_codec_init }
+ },
+#endif
+
+#endif /* HAS_AUDIO_CHOICE */
+
+ { NULL, NULL, 0, 0, { NULL } }
+};
+
+void select_soundhw(const char *optarg)
+{
+ struct soundhw *c;
+
+ if (*optarg == '?') {
+ show_valid_cards:
+
+ printf("Valid sound card names (comma separated):\n");
+ for (c = soundhw; c->name; ++c) {
+ printf ("%-11s %s\n", c->name, c->descr);
+ }
+ printf("\n-soundhw all will enable all of the above\n");
+ exit(*optarg != '?');
+ }
+ else {
+ size_t l;
+ const char *p;
+ char *e;
+ int bad_card = 0;
+
+ if (!strcmp(optarg, "all")) {
+ for (c = soundhw; c->name; ++c) {
+ c->enabled = 1;
+ }
+ return;
+ }
+
+ p = optarg;
+ while (*p) {
+ e = strchr(p, ',');
+ l = !e ? strlen(p) : (size_t) (e - p);
+
+ for (c = soundhw; c->name; ++c) {
+ if (!strncmp(c->name, p, l) && !c->name[l]) {
+ c->enabled = 1;
+ break;
+ }
+ }
+
+ if (!c->name) {
+ if (l > 80) {
+ fprintf(stderr,
+ "Unknown sound card name (too big to show)\n");
+ }
+ else {
+ fprintf(stderr, "Unknown sound card name `%.*s'\n",
+ (int) l, p);
+ }
+ bad_card = 1;
+ }
+ p += l + (e != NULL);
+ }
+
+ if (bad_card) {
+ goto show_valid_cards;
+ }
+ }
+}
+
+void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus)
+{
+ struct soundhw *c;
+
+ for (c = soundhw; c->name; ++c) {
+ if (c->enabled) {
+ if (c->isa) {
+ if (isa_pic) {
+ c->init.init_isa(isa_pic);
+ }
+ } else {
+ if (pci_bus) {
+ c->init.init_pci(pci_bus);
+ }
+ }
+ }
+ }
+}
+#else
+void select_soundhw(const char *optarg)
+{
+}
+void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus)
+{
+}
+#endif
+
+int qemu_uuid_parse(const char *str, uint8_t *uuid)
+{
+ int ret;
+
+ if (strlen(str) != 36) {
+ return -1;
+ }
+
+ ret = sscanf(str, UUID_FMT, &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]);
+
+ if (ret != 16) {
+ return -1;
+ }
+#ifdef TARGET_I386
+ smbios_add_field(1, offsetof(struct smbios_type_1, uuid), 16, uuid);
+#endif
+ return 0;
+}
+
+void do_acpitable_option(const char *optarg)
+{
+#ifdef TARGET_I386
+ if (acpi_table_add(optarg) < 0) {
+ fprintf(stderr, "Wrong acpi table provided\n");
+ exit(1);
+ }
+#endif
+}
+
+void do_smbios_option(const char *optarg)
+{
+#ifdef TARGET_I386
+ if (smbios_entry_add(optarg) < 0) {
+ fprintf(stderr, "Wrong smbios provided\n");
+ exit(1);
+ }
+#endif
+}
+
+void cpudef_init(void)
+{
+#if defined(cpudef_setup)
+ cpudef_setup(); /* parse cpu definitions in target config file */
+#endif
+}
+
+int audio_available(void)
+{
+#ifdef HAS_AUDIO
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+int tcg_available(void)
+{
+ return 1;
+}
+
+int kvm_available(void)
+{
+#ifdef CONFIG_KVM
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+int xen_available(void)
+{
+#ifdef CONFIG_XEN
+ return 1;
+#else
+ return 0;
+#endif
+}
diff --git a/qemu-0.15.x/arch_init.h b/qemu-0.15.x/arch_init.h
new file mode 100644
index 0000000..2de9f08
--- /dev/null
+++ b/qemu-0.15.x/arch_init.h
@@ -0,0 +1,34 @@
+#ifndef QEMU_ARCH_INIT_H
+#define QEMU_ARCH_INIT_H
+
+extern const char arch_config_name[];
+
+enum {
+ QEMU_ARCH_ALL = -1,
+ QEMU_ARCH_ALPHA = 1,
+ QEMU_ARCH_ARM = 2,
+ QEMU_ARCH_CRIS = 4,
+ QEMU_ARCH_I386 = 8,
+ QEMU_ARCH_M68K = 16,
+ QEMU_ARCH_LM32 = 32,
+ QEMU_ARCH_MICROBLAZE = 64,
+ QEMU_ARCH_MIPS = 128,
+ QEMU_ARCH_PPC = 256,
+ QEMU_ARCH_S390X = 512,
+ QEMU_ARCH_SH4 = 1024,
+ QEMU_ARCH_SPARC = 2048,
+};
+
+extern const uint32_t arch_type;
+
+void select_soundhw(const char *optarg);
+void do_acpitable_option(const char *optarg);
+void do_smbios_option(const char *optarg);
+void cpudef_init(void);
+int audio_available(void);
+void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus);
+int tcg_available(void);
+int kvm_available(void);
+int xen_available(void);
+
+#endif
diff --git a/qemu-0.15.x/arm-dis.c b/qemu-0.15.x/arm-dis.c
new file mode 100644
index 0000000..3ece02c
--- /dev/null
+++ b/qemu-0.15.x/arm-dis.c
@@ -0,0 +1,4136 @@
+/* Instruction printing code for the ARM
+ Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+ 2007, Free Software Foundation, Inc.
+ Contributed by Richard Earnshaw (rwe(a)pegasus.esprit.ec.org)
+ Modification by James G. Smith (jsmith(a)cygnus.co.uk)
+
+ This file is part of libopcodes.
+
+ 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, see <http://www.gnu.org/licenses/>. */
+
+/* Start of qemu specific additions. Mostly this is stub definitions
+ for things we don't care about. */
+
+#include "dis-asm.h"
+#define ATTRIBUTE_UNUSED __attribute__((unused))
+#define ISSPACE(x) ((x) == ' ' || (x) == '\t' || (x) == '\n')
+
+#define ARM_EXT_V1 0
+#define ARM_EXT_V2 0
+#define ARM_EXT_V2S 0
+#define ARM_EXT_V3 0
+#define ARM_EXT_V3M 0
+#define ARM_EXT_V4 0
+#define ARM_EXT_V4T 0
+#define ARM_EXT_V5 0
+#define ARM_EXT_V5T 0
+#define ARM_EXT_V5ExP 0
+#define ARM_EXT_V5E 0
+#define ARM_EXT_V5J 0
+#define ARM_EXT_V6 0
+#define ARM_EXT_V6K 0
+#define ARM_EXT_V6Z 0
+#define ARM_EXT_V6T2 0
+#define ARM_EXT_V7 0
+#define ARM_EXT_DIV 0
+
+/* Co-processor space extensions. */
+#define ARM_CEXT_XSCALE 0
+#define ARM_CEXT_MAVERICK 0
+#define ARM_CEXT_IWMMXT 0
+
+#define FPU_FPA_EXT_V1 0
+#define FPU_FPA_EXT_V2 0
+#define FPU_VFP_EXT_NONE 0
+#define FPU_VFP_EXT_V1xD 0
+#define FPU_VFP_EXT_V1 0
+#define FPU_VFP_EXT_V2 0
+#define FPU_MAVERICK 0
+#define FPU_VFP_EXT_V3 0
+#define FPU_NEON_EXT_V1 0
+
+/* Assume host uses ieee float. */
+static void floatformat_to_double (unsigned char *data, double *dest)
+{
+ union {
+ uint32_t i;
+ float f;
+ } u;
+ u.i = data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24);
+ *dest = u.f;
+}
+
+/* End of qemu specific additions. */
+
+/* FIXME: Belongs in global header. */
+#ifndef strneq
+#define strneq(a,b,n) (strncmp ((a), (b), (n)) == 0)
+#endif
+
+#ifndef NUM_ELEM
+#define NUM_ELEM(a) (sizeof (a) / sizeof (a)[0])
+#endif
+
+struct opcode32
+{
+ unsigned long arch; /* Architecture defining this insn. */
+ unsigned long value, mask; /* Recognise insn if (op&mask)==value. */
+ const char *assembler; /* How to disassemble this insn. */
+};
+
+struct opcode16
+{
+ unsigned long arch; /* Architecture defining this insn. */
+ unsigned short value, mask; /* Recognise insn if (op&mask)==value. */
+ const char *assembler; /* How to disassemble this insn. */
+};
+
+/* print_insn_coprocessor recognizes the following format control codes:
+
+ %% %
+
+ %c print condition code (always bits 28-31 in ARM mode)
+ %q print shifter argument
+ %u print condition code (unconditional in ARM mode)
+ %A print address for ldc/stc/ldf/stf instruction
+ %B print vstm/vldm register list
+ %C print vstr/vldr address operand
+ %I print cirrus signed shift immediate: bits 0..3|4..6
+ %F print the COUNT field of a LFM/SFM instruction.
+ %P print floating point precision in arithmetic insn
+ %Q print floating point precision in ldf/stf insn
+ %R print floating point rounding mode
+
+ %<bitfield>r print as an ARM register
+ %<bitfield>d print the bitfield in decimal
+ %<bitfield>k print immediate for VFPv3 conversion instruction
+ %<bitfield>x print the bitfield in hex
+ %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
+ %<bitfield>f print a floating point constant if >7 else a
+ floating point register
+ %<bitfield>w print as an iWMMXt width field - [bhwd]ss/us
+ %<bitfield>g print as an iWMMXt 64-bit register
+ %<bitfield>G print as an iWMMXt general purpose or control register
+ %<bitfield>D print as a NEON D register
+ %<bitfield>Q print as a NEON Q register
+
+ %y<code> print a single precision VFP reg.
+ Codes: 0=>Sm, 1=>Sd, 2=>Sn, 3=>multi-list, 4=>Sm pair
+ %z<code> print a double precision VFP reg
+ Codes: 0=>Dm, 1=>Dd, 2=>Dn, 3=>multi-list
+
+ %<bitfield>'c print specified char iff bitfield is all ones
+ %<bitfield>`c print specified char iff bitfield is all zeroes
+ %<bitfield>?ab... select from array of values in big endian order
+
+ %L print as an iWMMXt N/M width field.
+ %Z print the Immediate of a WSHUFH instruction.
+ %l like 'A' except use byte offsets for 'B' & 'H'
+ versions.
+ %i print 5-bit immediate in bits 8,3..0
+ (print "32" when 0)
+ %r print register offset address for wldt/wstr instruction
+*/
+
+/* Common coprocessor opcodes shared between Arm and Thumb-2. */
+
+static const struct opcode32 coprocessor_opcodes[] =
+{
+ /* XScale instructions. */
+ {ARM_CEXT_XSCALE, 0x0e200010, 0x0fff0ff0, "mia%c\tacc0, %0-3r, %12-15r"},
+ {ARM_CEXT_XSCALE, 0x0e280010, 0x0fff0ff0, "miaph%c\tacc0, %0-3r, %12-15r"},
+ {ARM_CEXT_XSCALE, 0x0e2c0010, 0x0ffc0ff0, "mia%17'T%17`B%16'T%16`B%c\tacc0, %0-3r, %12-15r"},
+ {ARM_CEXT_XSCALE, 0x0c400000, 0x0ff00fff, "mar%c\tacc0, %12-15r, %16-19r"},
+ {ARM_CEXT_XSCALE, 0x0c500000, 0x0ff00fff, "mra%c\t%12-15r, %16-19r, acc0"},
+
+ /* Intel Wireless MMX technology instructions. */
+#define FIRST_IWMMXT_INSN 0x0e130130
+#define IWMMXT_INSN_COUNT 73
+ {ARM_CEXT_IWMMXT, 0x0e130130, 0x0f3f0fff, "tandc%22-23w%c\t%12-15r"},
+ {ARM_CEXT_XSCALE, 0x0e400010, 0x0ff00f3f, "tbcst%6-7w%c\t%16-19g, %12-15r"},
+ {ARM_CEXT_XSCALE, 0x0e130170, 0x0f3f0ff8, "textrc%22-23w%c\t%12-15r, #%0-2d"},
+ {ARM_CEXT_XSCALE, 0x0e100070, 0x0f300ff0, "textrm%3?su%22-23w%c\t%12-15r, %16-19g, #%0-2d"},
+ {ARM_CEXT_XSCALE, 0x0e600010, 0x0ff00f38, "tinsr%6-7w%c\t%16-19g, %12-15r, #%0-2d"},
+ {ARM_CEXT_XSCALE, 0x0e000110, 0x0ff00fff, "tmcr%c\t%16-19G, %12-15r"},
+ {ARM_CEXT_XSCALE, 0x0c400000, 0x0ff00ff0, "tmcrr%c\t%0-3g, %12-15r, %16-19r"},
+ {ARM_CEXT_XSCALE, 0x0e2c0010, 0x0ffc0e10, "tmia%17?tb%16?tb%c\t%5-8g, %0-3r, %12-15r"},
+ {ARM_CEXT_XSCALE, 0x0e200010, 0x0fff0e10, "tmia%c\t%5-8g, %0-3r, %12-15r"},
+ {ARM_CEXT_XSCALE, 0x0e280010, 0x0fff0e10, "tmiaph%c\t%5-8g, %0-3r, %12-15r"},
+ {ARM_CEXT_XSCALE, 0x0e100030, 0x0f300fff, "tmovmsk%22-23w%c\t%12-15r, %16-19g"},
+ {ARM_CEXT_XSCALE, 0x0e100110, 0x0ff00ff0, "tmrc%c\t%12-15r, %16-19G"},
+ {ARM_CEXT_XSCALE, 0x0c500000, 0x0ff00ff0, "tmrrc%c\t%12-15r, %16-19r, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e130150, 0x0f3f0fff, "torc%22-23w%c\t%12-15r"},
+ {ARM_CEXT_XSCALE, 0x0e130190, 0x0f3f0fff, "torvsc%22-23w%c\t%12-15r"},
+ {ARM_CEXT_XSCALE, 0x0e2001c0, 0x0f300fff, "wabs%22-23w%c\t%12-15g, %16-19g"},
+ {ARM_CEXT_XSCALE, 0x0e0001c0, 0x0f300fff, "wacc%22-23w%c\t%12-15g, %16-19g"},
+ {ARM_CEXT_XSCALE, 0x0e000180, 0x0f000ff0, "wadd%20-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e2001a0, 0x0f300ff0, "waddbhus%22?ml%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0ea001a0, 0x0ff00ff0, "waddsubhx%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e000020, 0x0f800ff0, "waligni%c\t%12-15g, %16-19g, %0-3g, #%20-22d"},
+ {ARM_CEXT_XSCALE, 0x0e800020, 0x0fc00ff0, "walignr%20-21d%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e200000, 0x0fe00ff0, "wand%20'n%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e800000, 0x0fa00ff0, "wavg2%22?hb%20'r%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e400000, 0x0fe00ff0, "wavg4%20'r%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e000060, 0x0f300ff0, "wcmpeq%22-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e100060, 0x0f100ff0, "wcmpgt%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0xfc500100, 0xfe500f00, "wldrd\t%12-15g, %r"},
+ {ARM_CEXT_XSCALE, 0xfc100100, 0xfe500f00, "wldrw\t%12-15G, %A"},
+ {ARM_CEXT_XSCALE, 0x0c100000, 0x0e100e00, "wldr%L%c\t%12-15g, %l"},
+ {ARM_CEXT_XSCALE, 0x0e400100, 0x0fc00ff0, "wmac%21?su%20'z%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e800100, 0x0fc00ff0, "wmadd%21?su%20'x%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0ec00100, 0x0fd00ff0, "wmadd%21?sun%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e000160, 0x0f100ff0, "wmax%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e000080, 0x0f100fe0, "wmerge%c\t%12-15g, %16-19g, %0-3g, #%21-23d"},
+ {ARM_CEXT_XSCALE, 0x0e0000a0, 0x0f800ff0, "wmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e800120, 0x0f800ff0, "wmiaw%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e100160, 0x0f100ff0, "wmin%21?su%22-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e000100, 0x0fc00ff0, "wmul%21?su%20?ml%23'r%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0ed00100, 0x0fd00ff0, "wmul%21?sumr%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0ee000c0, 0x0fe00ff0, "wmulwsm%20`r%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0ec000c0, 0x0fe00ff0, "wmulwum%20`r%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0eb000c0, 0x0ff00ff0, "wmulwl%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e8000a0, 0x0f800ff0, "wqmia%21?tb%20?tb%22'n%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e100080, 0x0fd00ff0, "wqmulm%21'r%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0ec000e0, 0x0fd00ff0, "wqmulwm%21'r%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e000000, 0x0ff00ff0, "wor%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e000080, 0x0f000ff0, "wpack%20-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0xfe300040, 0xff300ef0, "wror%22-23w\t%12-15g, %16-19g, #%i"},
+ {ARM_CEXT_XSCALE, 0x0e300040, 0x0f300ff0, "wror%22-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e300140, 0x0f300ff0, "wror%22-23wg%c\t%12-15g, %16-19g, %0-3G"},
+ {ARM_CEXT_XSCALE, 0x0e000120, 0x0fa00ff0, "wsad%22?hb%20'z%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e0001e0, 0x0f000ff0, "wshufh%c\t%12-15g, %16-19g, #%Z"},
+ {ARM_CEXT_XSCALE, 0xfe100040, 0xff300ef0, "wsll%22-23w\t%12-15g, %16-19g, #%i"},
+ {ARM_CEXT_XSCALE, 0x0e100040, 0x0f300ff0, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e100148, 0x0f300ffc, "wsll%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
+ {ARM_CEXT_XSCALE, 0xfe000040, 0xff300ef0, "wsra%22-23w\t%12-15g, %16-19g, #%i"},
+ {ARM_CEXT_XSCALE, 0x0e000040, 0x0f300ff0, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e000148, 0x0f300ffc, "wsra%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
+ {ARM_CEXT_XSCALE, 0xfe200040, 0xff300ef0, "wsrl%22-23w\t%12-15g, %16-19g, #%i"},
+ {ARM_CEXT_XSCALE, 0x0e200040, 0x0f300ff0, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e200148, 0x0f300ffc, "wsrl%22-23w%8'g%c\t%12-15g, %16-19g, %0-3G"},
+ {ARM_CEXT_XSCALE, 0xfc400100, 0xfe500f00, "wstrd\t%12-15g, %r"},
+ {ARM_CEXT_XSCALE, 0xfc000100, 0xfe500f00, "wstrw\t%12-15G, %A"},
+ {ARM_CEXT_XSCALE, 0x0c000000, 0x0e100e00, "wstr%L%c\t%12-15g, %l"},
+ {ARM_CEXT_XSCALE, 0x0e0001a0, 0x0f000ff0, "wsub%20-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0ed001c0, 0x0ff00ff0, "wsubaddhx%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e1001c0, 0x0f300ff0, "wabsdiff%22-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e0000c0, 0x0fd00fff, "wunpckeh%21?sub%c\t%12-15g, %16-19g"},
+ {ARM_CEXT_XSCALE, 0x0e4000c0, 0x0fd00fff, "wunpckeh%21?suh%c\t%12-15g, %16-19g"},
+ {ARM_CEXT_XSCALE, 0x0e8000c0, 0x0fd00fff, "wunpckeh%21?suw%c\t%12-15g, %16-19g"},
+ {ARM_CEXT_XSCALE, 0x0e0000e0, 0x0f100fff, "wunpckel%21?su%22-23w%c\t%12-15g, %16-19g"},
+ {ARM_CEXT_XSCALE, 0x0e1000c0, 0x0f300ff0, "wunpckih%22-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e1000e0, 0x0f300ff0, "wunpckil%22-23w%c\t%12-15g, %16-19g, %0-3g"},
+ {ARM_CEXT_XSCALE, 0x0e100000, 0x0ff00ff0, "wxor%c\t%12-15g, %16-19g, %0-3g"},
+
+ /* Floating point coprocessor (FPA) instructions */
+ {FPU_FPA_EXT_V1, 0x0e000100, 0x0ff08f10, "adf%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e100100, 0x0ff08f10, "muf%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e200100, 0x0ff08f10, "suf%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e300100, 0x0ff08f10, "rsf%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e400100, 0x0ff08f10, "dvf%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e500100, 0x0ff08f10, "rdf%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e600100, 0x0ff08f10, "pow%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e700100, 0x0ff08f10, "rpw%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e800100, 0x0ff08f10, "rmf%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e900100, 0x0ff08f10, "fml%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0ea00100, 0x0ff08f10, "fdv%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0eb00100, 0x0ff08f10, "frd%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0ec00100, 0x0ff08f10, "pol%c%P%R\t%12-14f, %16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e008100, 0x0ff08f10, "mvf%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e108100, 0x0ff08f10, "mnf%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e208100, 0x0ff08f10, "abs%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e308100, 0x0ff08f10, "rnd%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e408100, 0x0ff08f10, "sqt%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e508100, 0x0ff08f10, "log%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e608100, 0x0ff08f10, "lgn%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e708100, 0x0ff08f10, "exp%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e808100, 0x0ff08f10, "sin%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e908100, 0x0ff08f10, "cos%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0ea08100, 0x0ff08f10, "tan%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0eb08100, 0x0ff08f10, "asn%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0ec08100, 0x0ff08f10, "acs%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0ed08100, 0x0ff08f10, "atn%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0ee08100, 0x0ff08f10, "urd%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0ef08100, 0x0ff08f10, "nrm%c%P%R\t%12-14f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0e000110, 0x0ff00f1f, "flt%c%P%R\t%16-18f, %12-15r"},
+ {FPU_FPA_EXT_V1, 0x0e100110, 0x0fff0f98, "fix%c%R\t%12-15r, %0-2f"},
+ {FPU_FPA_EXT_V1, 0x0e200110, 0x0fff0fff, "wfs%c\t%12-15r"},
+ {FPU_FPA_EXT_V1, 0x0e300110, 0x0fff0fff, "rfs%c\t%12-15r"},
+ {FPU_FPA_EXT_V1, 0x0e400110, 0x0fff0fff, "wfc%c\t%12-15r"},
+ {FPU_FPA_EXT_V1, 0x0e500110, 0x0fff0fff, "rfc%c\t%12-15r"},
+ {FPU_FPA_EXT_V1, 0x0e90f110, 0x0ff8fff0, "cmf%c\t%16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0eb0f110, 0x0ff8fff0, "cnf%c\t%16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0ed0f110, 0x0ff8fff0, "cmfe%c\t%16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0ef0f110, 0x0ff8fff0, "cnfe%c\t%16-18f, %0-3f"},
+ {FPU_FPA_EXT_V1, 0x0c000100, 0x0e100f00, "stf%c%Q\t%12-14f, %A"},
+ {FPU_FPA_EXT_V1, 0x0c100100, 0x0e100f00, "ldf%c%Q\t%12-14f, %A"},
+ {FPU_FPA_EXT_V2, 0x0c000200, 0x0e100f00, "sfm%c\t%12-14f, %F, %A"},
+ {FPU_FPA_EXT_V2, 0x0c100200, 0x0e100f00, "lfm%c\t%12-14f, %F, %A"},
+
+ /* Register load/store */
+ {FPU_NEON_EXT_V1, 0x0d200b00, 0x0fb00f01, "vstmdb%c\t%16-19r%21'!, %B"},
+ {FPU_NEON_EXT_V1, 0x0d300b00, 0x0fb00f01, "vldmdb%c\t%16-19r%21'!, %B"},
+ {FPU_NEON_EXT_V1, 0x0c800b00, 0x0f900f01, "vstmia%c\t%16-19r%21'!, %B"},
+ {FPU_NEON_EXT_V1, 0x0c900b00, 0x0f900f01, "vldmia%c\t%16-19r%21'!, %B"},
+ {FPU_NEON_EXT_V1, 0x0d000b00, 0x0f300f00, "vstr%c\t%12-15,22D, %C"},
+ {FPU_NEON_EXT_V1, 0x0d100b00, 0x0f300f00, "vldr%c\t%12-15,22D, %C"},
+
+ /* Data transfer between ARM and NEON registers */
+ {FPU_NEON_EXT_V1, 0x0e800b10, 0x0ff00f70, "vdup%c.32\t%16-19,7D, %12-15r"},
+ {FPU_NEON_EXT_V1, 0x0e800b30, 0x0ff00f70, "vdup%c.16\t%16-19,7D, %12-15r"},
+ {FPU_NEON_EXT_V1, 0x0ea00b10, 0x0ff00f70, "vdup%c.32\t%16-19,7Q, %12-15r"},
+ {FPU_NEON_EXT_V1, 0x0ea00b30, 0x0ff00f70, "vdup%c.16\t%16-19,7Q, %12-15r"},
+ {FPU_NEON_EXT_V1, 0x0ec00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7D, %12-15r"},
+ {FPU_NEON_EXT_V1, 0x0ee00b10, 0x0ff00f70, "vdup%c.8\t%16-19,7Q, %12-15r"},
+ {FPU_NEON_EXT_V1, 0x0c400b10, 0x0ff00fd0, "vmov%c\t%0-3,5D, %12-15r, %16-19r"},
+ {FPU_NEON_EXT_V1, 0x0c500b10, 0x0ff00fd0, "vmov%c\t%12-15r, %16-19r, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0x0e000b10, 0x0fd00f70, "vmov%c.32\t%16-19,7D[%21d], %12-15r"},
+ {FPU_NEON_EXT_V1, 0x0e100b10, 0x0f500f70, "vmov%c.32\t%12-15r, %16-19,7D[%21d]"},
+ {FPU_NEON_EXT_V1, 0x0e000b30, 0x0fd00f30, "vmov%c.16\t%16-19,7D[%6,21d], %12-15r"},
+ {FPU_NEON_EXT_V1, 0x0e100b30, 0x0f500f30, "vmov%c.%23?us16\t%12-15r, %16-19,7D[%6,21d]"},
+ {FPU_NEON_EXT_V1, 0x0e400b10, 0x0fd00f10, "vmov%c.8\t%16-19,7D[%5,6,21d], %12-15r"},
+ {FPU_NEON_EXT_V1, 0x0e500b10, 0x0f500f10, "vmov%c.%23?us8\t%12-15r, %16-19,7D[%5,6,21d]"},
+
+ /* Floating point coprocessor (VFP) instructions */
+ {FPU_VFP_EXT_V1xD, 0x0ef1fa10, 0x0fffffff, "fmstat%c"},
+ {FPU_VFP_EXT_V1xD, 0x0ee00a10, 0x0fff0fff, "fmxr%c\tfpsid, %12-15r"},
+ {FPU_VFP_EXT_V1xD, 0x0ee10a10, 0x0fff0fff, "fmxr%c\tfpscr, %12-15r"},
+ {FPU_VFP_EXT_V1xD, 0x0ee60a10, 0x0fff0fff, "fmxr%c\tmvfr1, %12-15r"},
+ {FPU_VFP_EXT_V1xD, 0x0ee70a10, 0x0fff0fff, "fmxr%c\tmvfr0, %12-15r"},
+ {FPU_VFP_EXT_V1xD, 0x0ee80a10, 0x0fff0fff, "fmxr%c\tfpexc, %12-15r"},
+ {FPU_VFP_EXT_V1xD, 0x0ee90a10, 0x0fff0fff, "fmxr%c\tfpinst, %12-15r\t@ Impl def"},
+ {FPU_VFP_EXT_V1xD, 0x0eea0a10, 0x0fff0fff, "fmxr%c\tfpinst2, %12-15r\t@ Impl def"},
+ {FPU_VFP_EXT_V1xD, 0x0ef00a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpsid"},
+ {FPU_VFP_EXT_V1xD, 0x0ef10a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpscr"},
+ {FPU_VFP_EXT_V1xD, 0x0ef60a10, 0x0fff0fff, "fmrx%c\t%12-15r, mvfr1"},
+ {FPU_VFP_EXT_V1xD, 0x0ef70a10, 0x0fff0fff, "fmrx%c\t%12-15r, mvfr0"},
+ {FPU_VFP_EXT_V1xD, 0x0ef80a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpexc"},
+ {FPU_VFP_EXT_V1xD, 0x0ef90a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpinst\t@ Impl def"},
+ {FPU_VFP_EXT_V1xD, 0x0efa0a10, 0x0fff0fff, "fmrx%c\t%12-15r, fpinst2\t@ Impl def"},
+ {FPU_VFP_EXT_V1, 0x0e000b10, 0x0ff00fff, "fmdlr%c\t%z2, %12-15r"},
+ {FPU_VFP_EXT_V1, 0x0e100b10, 0x0ff00fff, "fmrdl%c\t%12-15r, %z2"},
+ {FPU_VFP_EXT_V1, 0x0e200b10, 0x0ff00fff, "fmdhr%c\t%z2, %12-15r"},
+ {FPU_VFP_EXT_V1, 0x0e300b10, 0x0ff00fff, "fmrdh%c\t%12-15r, %z2"},
+ {FPU_VFP_EXT_V1xD, 0x0ee00a10, 0x0ff00fff, "fmxr%c\t<impl def %16-19x>, %12-15r"},
+ {FPU_VFP_EXT_V1xD, 0x0ef00a10, 0x0ff00fff, "fmrx%c\t%12-15r, <impl def %16-19x>"},
+ {FPU_VFP_EXT_V1xD, 0x0e000a10, 0x0ff00f7f, "fmsr%c\t%y2, %12-15r"},
+ {FPU_VFP_EXT_V1xD, 0x0e100a10, 0x0ff00f7f, "fmrs%c\t%12-15r, %y2"},
+ {FPU_VFP_EXT_V1xD, 0x0eb50a40, 0x0fbf0f70, "fcmp%7'ezs%c\t%y1"},
+ {FPU_VFP_EXT_V1, 0x0eb50b40, 0x0fbf0f70, "fcmp%7'ezd%c\t%z1"},
+ {FPU_VFP_EXT_V1xD, 0x0eb00a40, 0x0fbf0fd0, "fcpys%c\t%y1, %y0"},
+ {FPU_VFP_EXT_V1xD, 0x0eb00ac0, 0x0fbf0fd0, "fabss%c\t%y1, %y0"},
+ {FPU_VFP_EXT_V1, 0x0eb00b40, 0x0fbf0fd0, "fcpyd%c\t%z1, %z0"},
+ {FPU_VFP_EXT_V1, 0x0eb00bc0, 0x0fbf0fd0, "fabsd%c\t%z1, %z0"},
+ {FPU_VFP_EXT_V1xD, 0x0eb10a40, 0x0fbf0fd0, "fnegs%c\t%y1, %y0"},
+ {FPU_VFP_EXT_V1xD, 0x0eb10ac0, 0x0fbf0fd0, "fsqrts%c\t%y1, %y0"},
+ {FPU_VFP_EXT_V1, 0x0eb10b40, 0x0fbf0fd0, "fnegd%c\t%z1, %z0"},
+ {FPU_VFP_EXT_V1, 0x0eb10bc0, 0x0fbf0fd0, "fsqrtd%c\t%z1, %z0"},
+ {FPU_VFP_EXT_V1, 0x0eb70ac0, 0x0fbf0fd0, "fcvtds%c\t%z1, %y0"},
+ {FPU_VFP_EXT_V1, 0x0eb70bc0, 0x0fbf0fd0, "fcvtsd%c\t%y1, %z0"},
+ {FPU_VFP_EXT_V1xD, 0x0eb80a40, 0x0fbf0fd0, "fuitos%c\t%y1, %y0"},
+ {FPU_VFP_EXT_V1xD, 0x0eb80ac0, 0x0fbf0fd0, "fsitos%c\t%y1, %y0"},
+ {FPU_VFP_EXT_V1, 0x0eb80b40, 0x0fbf0fd0, "fuitod%c\t%z1, %y0"},
+ {FPU_VFP_EXT_V1, 0x0eb80bc0, 0x0fbf0fd0, "fsitod%c\t%z1, %y0"},
+ {FPU_VFP_EXT_V1xD, 0x0eb40a40, 0x0fbf0f50, "fcmp%7'es%c\t%y1, %y0"},
+ {FPU_VFP_EXT_V1, 0x0eb40b40, 0x0fbf0f50, "fcmp%7'ed%c\t%z1, %z0"},
+ {FPU_VFP_EXT_V3, 0x0eba0a40, 0x0fbe0f50, "f%16?us%7?lhtos%c\t%y1, #%5,0-3k"},
+ {FPU_VFP_EXT_V3, 0x0eba0b40, 0x0fbe0f50, "f%16?us%7?lhtod%c\t%z1, #%5,0-3k"},
+ {FPU_VFP_EXT_V1xD, 0x0ebc0a40, 0x0fbe0f50, "fto%16?sui%7'zs%c\t%y1, %y0"},
+ {FPU_VFP_EXT_V1, 0x0ebc0b40, 0x0fbe0f50, "fto%16?sui%7'zd%c\t%y1, %z0"},
+ {FPU_VFP_EXT_V3, 0x0ebe0a40, 0x0fbe0f50, "fto%16?us%7?lhs%c\t%y1, #%5,0-3k"},
+ {FPU_VFP_EXT_V3, 0x0ebe0b40, 0x0fbe0f50, "fto%16?us%7?lhd%c\t%z1, #%5,0-3k"},
+ {FPU_VFP_EXT_V1, 0x0c500b10, 0x0fb00ff0, "fmrrd%c\t%12-15r, %16-19r, %z0"},
+ {FPU_VFP_EXT_V3, 0x0eb00a00, 0x0fb00ff0, "fconsts%c\t%y1, #%0-3,16-19d"},
+ {FPU_VFP_EXT_V3, 0x0eb00b00, 0x0fb00ff0, "fconstd%c\t%z1, #%0-3,16-19d"},
+ {FPU_VFP_EXT_V2, 0x0c400a10, 0x0ff00fd0, "fmsrr%c\t%y4, %12-15r, %16-19r"},
+ {FPU_VFP_EXT_V2, 0x0c400b10, 0x0ff00fd0, "fmdrr%c\t%z0, %12-15r, %16-19r"},
+ {FPU_VFP_EXT_V2, 0x0c500a10, 0x0ff00fd0, "fmrrs%c\t%12-15r, %16-19r, %y4"},
+ {FPU_VFP_EXT_V1xD, 0x0e000a00, 0x0fb00f50, "fmacs%c\t%y1, %y2, %y0"},
+ {FPU_VFP_EXT_V1xD, 0x0e000a40, 0x0fb00f50, "fnmacs%c\t%y1, %y2, %y0"},
+ {FPU_VFP_EXT_V1, 0x0e000b00, 0x0fb00f50, "fmacd%c\t%z1, %z2, %z0"},
+ {FPU_VFP_EXT_V1, 0x0e000b40, 0x0fb00f50, "fnmacd%c\t%z1, %z2, %z0"},
+ {FPU_VFP_EXT_V1xD, 0x0e100a00, 0x0fb00f50, "fmscs%c\t%y1, %y2, %y0"},
+ {FPU_VFP_EXT_V1xD, 0x0e100a40, 0x0fb00f50, "fnmscs%c\t%y1, %y2, %y0"},
+ {FPU_VFP_EXT_V1, 0x0e100b00, 0x0fb00f50, "fmscd%c\t%z1, %z2, %z0"},
+ {FPU_VFP_EXT_V1, 0x0e100b40, 0x0fb00f50, "fnmscd%c\t%z1, %z2, %z0"},
+ {FPU_VFP_EXT_V1xD, 0x0e200a00, 0x0fb00f50, "fmuls%c\t%y1, %y2, %y0"},
+ {FPU_VFP_EXT_V1xD, 0x0e200a40, 0x0fb00f50, "fnmuls%c\t%y1, %y2, %y0"},
+ {FPU_VFP_EXT_V1, 0x0e200b00, 0x0fb00f50, "fmuld%c\t%z1, %z2, %z0"},
+ {FPU_VFP_EXT_V1, 0x0e200b40, 0x0fb00f50, "fnmuld%c\t%z1, %z2, %z0"},
+ {FPU_VFP_EXT_V1xD, 0x0e300a00, 0x0fb00f50, "fadds%c\t%y1, %y2, %y0"},
+ {FPU_VFP_EXT_V1xD, 0x0e300a40, 0x0fb00f50, "fsubs%c\t%y1, %y2, %y0"},
+ {FPU_VFP_EXT_V1, 0x0e300b00, 0x0fb00f50, "faddd%c\t%z1, %z2, %z0"},
+ {FPU_VFP_EXT_V1, 0x0e300b40, 0x0fb00f50, "fsubd%c\t%z1, %z2, %z0"},
+ {FPU_VFP_EXT_V1xD, 0x0e800a00, 0x0fb00f50, "fdivs%c\t%y1, %y2, %y0"},
+ {FPU_VFP_EXT_V1, 0x0e800b00, 0x0fb00f50, "fdivd%c\t%z1, %z2, %z0"},
+ {FPU_VFP_EXT_V1xD, 0x0d200a00, 0x0fb00f00, "fstmdbs%c\t%16-19r!, %y3"},
+ {FPU_VFP_EXT_V1xD, 0x0d200b00, 0x0fb00f00, "fstmdb%0?xd%c\t%16-19r!, %z3"},
+ {FPU_VFP_EXT_V1xD, 0x0d300a00, 0x0fb00f00, "fldmdbs%c\t%16-19r!, %y3"},
+ {FPU_VFP_EXT_V1xD, 0x0d300b00, 0x0fb00f00, "fldmdb%0?xd%c\t%16-19r!, %z3"},
+ {FPU_VFP_EXT_V1xD, 0x0d000a00, 0x0f300f00, "fsts%c\t%y1, %A"},
+ {FPU_VFP_EXT_V1, 0x0d000b00, 0x0f300f00, "fstd%c\t%z1, %A"},
+ {FPU_VFP_EXT_V1xD, 0x0d100a00, 0x0f300f00, "flds%c\t%y1, %A"},
+ {FPU_VFP_EXT_V1, 0x0d100b00, 0x0f300f00, "fldd%c\t%z1, %A"},
+ {FPU_VFP_EXT_V1xD, 0x0c800a00, 0x0f900f00, "fstmias%c\t%16-19r%21'!, %y3"},
+ {FPU_VFP_EXT_V1xD, 0x0c800b00, 0x0f900f00, "fstmia%0?xd%c\t%16-19r%21'!, %z3"},
+ {FPU_VFP_EXT_V1xD, 0x0c900a00, 0x0f900f00, "fldmias%c\t%16-19r%21'!, %y3"},
+ {FPU_VFP_EXT_V1xD, 0x0c900b00, 0x0f900f00, "fldmia%0?xd%c\t%16-19r%21'!, %z3"},
+
+ /* Cirrus coprocessor instructions. */
+ {ARM_CEXT_MAVERICK, 0x0d100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0c100400, 0x0f500f00, "cfldrs%c\tmvf%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0d500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0c500400, 0x0f500f00, "cfldrd%c\tmvd%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0d100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0c100500, 0x0f500f00, "cfldr32%c\tmvfx%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0d500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0c500500, 0x0f500f00, "cfldr64%c\tmvdx%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0d000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0c000400, 0x0f500f00, "cfstrs%c\tmvf%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0d400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0c400400, 0x0f500f00, "cfstrd%c\tmvd%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0d000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0c000500, 0x0f500f00, "cfstr32%c\tmvfx%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0d400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0c400500, 0x0f500f00, "cfstr64%c\tmvdx%12-15d, %A"},
+ {ARM_CEXT_MAVERICK, 0x0e000450, 0x0ff00ff0, "cfmvsr%c\tmvf%16-19d, %12-15r"},
+ {ARM_CEXT_MAVERICK, 0x0e100450, 0x0ff00ff0, "cfmvrs%c\t%12-15r, mvf%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e000410, 0x0ff00ff0, "cfmvdlr%c\tmvd%16-19d, %12-15r"},
+ {ARM_CEXT_MAVERICK, 0x0e100410, 0x0ff00ff0, "cfmvrdl%c\t%12-15r, mvd%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e000430, 0x0ff00ff0, "cfmvdhr%c\tmvd%16-19d, %12-15r"},
+ {ARM_CEXT_MAVERICK, 0x0e100430, 0x0ff00fff, "cfmvrdh%c\t%12-15r, mvd%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e000510, 0x0ff00fff, "cfmv64lr%c\tmvdx%16-19d, %12-15r"},
+ {ARM_CEXT_MAVERICK, 0x0e100510, 0x0ff00fff, "cfmvr64l%c\t%12-15r, mvdx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e000530, 0x0ff00fff, "cfmv64hr%c\tmvdx%16-19d, %12-15r"},
+ {ARM_CEXT_MAVERICK, 0x0e100530, 0x0ff00fff, "cfmvr64h%c\t%12-15r, mvdx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e200440, 0x0ff00fff, "cfmval32%c\tmvax%12-15d, mvfx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e100440, 0x0ff00fff, "cfmv32al%c\tmvfx%12-15d, mvax%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e200460, 0x0ff00fff, "cfmvam32%c\tmvax%12-15d, mvfx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e100460, 0x0ff00fff, "cfmv32am%c\tmvfx%12-15d, mvax%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e200480, 0x0ff00fff, "cfmvah32%c\tmvax%12-15d, mvfx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e100480, 0x0ff00fff, "cfmv32ah%c\tmvfx%12-15d, mvax%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e2004a0, 0x0ff00fff, "cfmva32%c\tmvax%12-15d, mvfx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e1004a0, 0x0ff00fff, "cfmv32a%c\tmvfx%12-15d, mvax%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e2004c0, 0x0ff00fff, "cfmva64%c\tmvax%12-15d, mvdx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e1004c0, 0x0ff00fff, "cfmv64a%c\tmvdx%12-15d, mvax%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e2004e0, 0x0fff0fff, "cfmvsc32%c\tdspsc, mvdx%12-15d"},
+ {ARM_CEXT_MAVERICK, 0x0e1004e0, 0x0fff0fff, "cfmv32sc%c\tmvdx%12-15d, dspsc"},
+ {ARM_CEXT_MAVERICK, 0x0e000400, 0x0ff00fff, "cfcpys%c\tmvf%12-15d, mvf%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e000420, 0x0ff00fff, "cfcpyd%c\tmvd%12-15d, mvd%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e000460, 0x0ff00fff, "cfcvtsd%c\tmvd%12-15d, mvf%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e000440, 0x0ff00fff, "cfcvtds%c\tmvf%12-15d, mvd%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e000480, 0x0ff00fff, "cfcvt32s%c\tmvf%12-15d, mvfx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e0004a0, 0x0ff00fff, "cfcvt32d%c\tmvd%12-15d, mvfx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e0004c0, 0x0ff00fff, "cfcvt64s%c\tmvf%12-15d, mvdx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e0004e0, 0x0ff00fff, "cfcvt64d%c\tmvd%12-15d, mvdx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e100580, 0x0ff00fff, "cfcvts32%c\tmvfx%12-15d, mvf%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e1005a0, 0x0ff00fff, "cfcvtd32%c\tmvfx%12-15d, mvd%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e1005c0, 0x0ff00fff, "cftruncs32%c\tmvfx%12-15d, mvf%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e1005e0, 0x0ff00fff, "cftruncd32%c\tmvfx%12-15d, mvd%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e000550, 0x0ff00ff0, "cfrshl32%c\tmvfx%16-19d, mvfx%0-3d, %12-15r"},
+ {ARM_CEXT_MAVERICK, 0x0e000570, 0x0ff00ff0, "cfrshl64%c\tmvdx%16-19d, mvdx%0-3d, %12-15r"},
+ {ARM_CEXT_MAVERICK, 0x0e000500, 0x0ff00f10, "cfsh32%c\tmvfx%12-15d, mvfx%16-19d, #%I"},
+ {ARM_CEXT_MAVERICK, 0x0e200500, 0x0ff00f10, "cfsh64%c\tmvdx%12-15d, mvdx%16-19d, #%I"},
+ {ARM_CEXT_MAVERICK, 0x0e100490, 0x0ff00ff0, "cfcmps%c\t%12-15r, mvf%16-19d, mvf%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e1004b0, 0x0ff00ff0, "cfcmpd%c\t%12-15r, mvd%16-19d, mvd%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e100590, 0x0ff00ff0, "cfcmp32%c\t%12-15r, mvfx%16-19d, mvfx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e1005b0, 0x0ff00ff0, "cfcmp64%c\t%12-15r, mvdx%16-19d, mvdx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e300400, 0x0ff00fff, "cfabss%c\tmvf%12-15d, mvf%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e300420, 0x0ff00fff, "cfabsd%c\tmvd%12-15d, mvd%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e300440, 0x0ff00fff, "cfnegs%c\tmvf%12-15d, mvf%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e300460, 0x0ff00fff, "cfnegd%c\tmvd%12-15d, mvd%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e300480, 0x0ff00ff0, "cfadds%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e3004a0, 0x0ff00ff0, "cfaddd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e3004c0, 0x0ff00ff0, "cfsubs%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e3004e0, 0x0ff00ff0, "cfsubd%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e100400, 0x0ff00ff0, "cfmuls%c\tmvf%12-15d, mvf%16-19d, mvf%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e100420, 0x0ff00ff0, "cfmuld%c\tmvd%12-15d, mvd%16-19d, mvd%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e300500, 0x0ff00fff, "cfabs32%c\tmvfx%12-15d, mvfx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e300520, 0x0ff00fff, "cfabs64%c\tmvdx%12-15d, mvdx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e300540, 0x0ff00fff, "cfneg32%c\tmvfx%12-15d, mvfx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e300560, 0x0ff00fff, "cfneg64%c\tmvdx%12-15d, mvdx%16-19d"},
+ {ARM_CEXT_MAVERICK, 0x0e300580, 0x0ff00ff0, "cfadd32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e3005a0, 0x0ff00ff0, "cfadd64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e3005c0, 0x0ff00ff0, "cfsub32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e3005e0, 0x0ff00ff0, "cfsub64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e100500, 0x0ff00ff0, "cfmul32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e100520, 0x0ff00ff0, "cfmul64%c\tmvdx%12-15d, mvdx%16-19d, mvdx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e100540, 0x0ff00ff0, "cfmac32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e100560, 0x0ff00ff0, "cfmsc32%c\tmvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e000600, 0x0ff00f10, "cfmadd32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e100600, 0x0ff00f10, "cfmsub32%c\tmvax%5-7d, mvfx%12-15d, mvfx%16-19d, mvfx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e200600, 0x0ff00f10, "cfmadda32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
+ {ARM_CEXT_MAVERICK, 0x0e300600, 0x0ff00f10, "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
+
+ /* Generic coprocessor instructions */
+ {ARM_EXT_V2, 0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
+ {ARM_EXT_V2, 0x0c500000, 0x0ff00000, "mrrc%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
+ {ARM_EXT_V2, 0x0e000000, 0x0f000010, "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
+ {ARM_EXT_V2, 0x0e100010, 0x0f100010, "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
+ {ARM_EXT_V2, 0x0e000010, 0x0f100010, "mcr%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
+ {ARM_EXT_V2, 0x0c000000, 0x0e100000, "stc%22'l%c\t%8-11d, cr%12-15d, %A"},
+ {ARM_EXT_V2, 0x0c100000, 0x0e100000, "ldc%22'l%c\t%8-11d, cr%12-15d, %A"},
+
+ /* V6 coprocessor instructions */
+ {ARM_EXT_V6, 0xfc500000, 0xfff00000, "mrrc2%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
+ {ARM_EXT_V6, 0xfc400000, 0xfff00000, "mcrr2%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
+
+ /* V5 coprocessor instructions */
+ {ARM_EXT_V5, 0xfc100000, 0xfe100000, "ldc2%22'l%c\t%8-11d, cr%12-15d, %A"},
+ {ARM_EXT_V5, 0xfc000000, 0xfe100000, "stc2%22'l%c\t%8-11d, cr%12-15d, %A"},
+ {ARM_EXT_V5, 0xfe000000, 0xff000010, "cdp2%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
+ {ARM_EXT_V5, 0xfe000010, 0xff100010, "mcr2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
+ {ARM_EXT_V5, 0xfe100010, 0xff100010, "mrc2%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
+
+ {0, 0, 0, 0}
+};
+
+/* Neon opcode table: This does not encode the top byte -- that is
+ checked by the print_insn_neon routine, as it depends on whether we are
+ doing thumb32 or arm32 disassembly. */
+
+/* print_insn_neon recognizes the following format control codes:
+
+ %% %
+
+ %c print condition code
+ %A print v{st,ld}[1234] operands
+ %B print v{st,ld}[1234] any one operands
+ %C print v{st,ld}[1234] single->all operands
+ %D print scalar
+ %E print vmov, vmvn, vorr, vbic encoded constant
+ %F print vtbl,vtbx register list
+
+ %<bitfield>r print as an ARM register
+ %<bitfield>d print the bitfield in decimal
+ %<bitfield>e print the 2^N - bitfield in decimal
+ %<bitfield>D print as a NEON D register
+ %<bitfield>Q print as a NEON Q register
+ %<bitfield>R print as a NEON D or Q register
+ %<bitfield>Sn print byte scaled width limited by n
+ %<bitfield>Tn print short scaled width limited by n
+ %<bitfield>Un print long scaled width limited by n
+
+ %<bitfield>'c print specified char iff bitfield is all ones
+ %<bitfield>`c print specified char iff bitfield is all zeroes
+ %<bitfield>?ab... select from array of values in big endian order */
+
+static const struct opcode32 neon_opcodes[] =
+{
+ /* Extract */
+ {FPU_NEON_EXT_V1, 0xf2b00840, 0xffb00850, "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
+ {FPU_NEON_EXT_V1, 0xf2b00000, 0xffb00810, "vext%c.8\t%12-15,22R, %16-19,7R, %0-3,5R, #%8-11d"},
+
+ /* Move data element to all lanes */
+ {FPU_NEON_EXT_V1, 0xf3b40c00, 0xffb70f90, "vdup%c.32\t%12-15,22R, %0-3,5D[%19d]"},
+ {FPU_NEON_EXT_V1, 0xf3b20c00, 0xffb30f90, "vdup%c.16\t%12-15,22R, %0-3,5D[%18-19d]"},
+ {FPU_NEON_EXT_V1, 0xf3b10c00, 0xffb10f90, "vdup%c.8\t%12-15,22R, %0-3,5D[%17-19d]"},
+
+ /* Table lookup */
+ {FPU_NEON_EXT_V1, 0xf3b00800, 0xffb00c50, "vtbl%c.8\t%12-15,22D, %F, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf3b00840, 0xffb00c50, "vtbx%c.8\t%12-15,22D, %F, %0-3,5D"},
+
+ /* Two registers, miscellaneous */
+ {FPU_NEON_EXT_V1, 0xf2880a10, 0xfebf0fd0, "vmovl%c.%24?us8\t%12-15,22Q, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2900a10, 0xfebf0fd0, "vmovl%c.%24?us16\t%12-15,22Q, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2a00a10, 0xfebf0fd0, "vmovl%c.%24?us32\t%12-15,22Q, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf3b00500, 0xffbf0f90, "vcnt%c.8\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00580, 0xffbf0f90, "vmvn%c\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b20000, 0xffbf0f90, "vswp%c\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b20200, 0xffb30fd0, "vmovn%c.i%18-19T2\t%12-15,22D, %0-3,5Q"},
+ {FPU_NEON_EXT_V1, 0xf3b20240, 0xffb30fd0, "vqmovun%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
+ {FPU_NEON_EXT_V1, 0xf3b20280, 0xffb30fd0, "vqmovn%c.s%18-19T2\t%12-15,22D, %0-3,5Q"},
+ {FPU_NEON_EXT_V1, 0xf3b202c0, 0xffb30fd0, "vqmovn%c.u%18-19T2\t%12-15,22D, %0-3,5Q"},
+ {FPU_NEON_EXT_V1, 0xf3b20300, 0xffb30fd0, "vshll%c.i%18-19S2\t%12-15,22Q, %0-3,5D, #%18-19S2"},
+ {FPU_NEON_EXT_V1, 0xf3bb0400, 0xffbf0e90, "vrecpe%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3bb0480, 0xffbf0e90, "vrsqrte%c.%8?fu%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00000, 0xffb30f90, "vrev64%c.%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00080, 0xffb30f90, "vrev32%c.%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00100, 0xffb30f90, "vrev16%c.%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00400, 0xffb30f90, "vcls%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00480, 0xffb30f90, "vclz%c.i%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00700, 0xffb30f90, "vqabs%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00780, 0xffb30f90, "vqneg%c.s%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b20080, 0xffb30f90, "vtrn%c.%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b20100, 0xffb30f90, "vuzp%c.%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b20180, 0xffb30f90, "vzip%c.%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b10000, 0xffb30b90, "vcgt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
+ {FPU_NEON_EXT_V1, 0xf3b10080, 0xffb30b90, "vcge%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
+ {FPU_NEON_EXT_V1, 0xf3b10100, 0xffb30b90, "vceq%c.%10?fi%18-19S2\t%12-15,22R, %0-3,5R, #0"},
+ {FPU_NEON_EXT_V1, 0xf3b10180, 0xffb30b90, "vcle%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
+ {FPU_NEON_EXT_V1, 0xf3b10200, 0xffb30b90, "vclt%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R, #0"},
+ {FPU_NEON_EXT_V1, 0xf3b10300, 0xffb30b90, "vabs%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b10380, 0xffb30b90, "vneg%c.%10?fs%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00200, 0xffb30f10, "vpaddl%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b00600, 0xffb30f10, "vpadal%c.%7?us%18-19S2\t%12-15,22R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3b30600, 0xffb30e10, "vcvt%c.%7-8?usff%18-19Sa.%7-8?ffus%18-19Sa\t%12-15,22R, %0-3,5R"},
+
+ /* Three registers of the same length */
+ {FPU_NEON_EXT_V1, 0xf2000110, 0xffb00f10, "vand%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2100110, 0xffb00f10, "vbic%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2200110, 0xffb00f10, "vorr%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2300110, 0xffb00f10, "vorn%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000110, 0xffb00f10, "veor%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3100110, 0xffb00f10, "vbsl%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3200110, 0xffb00f10, "vbit%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3300110, 0xffb00f10, "vbif%c\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000d00, 0xffa00f10, "vadd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000d10, 0xffa00f10, "vmla%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000e00, 0xffa00f10, "vceq%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000f00, 0xffa00f10, "vmax%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000f10, 0xffa00f10, "vrecps%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2200d00, 0xffa00f10, "vsub%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2200d10, 0xffa00f10, "vmls%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2200f00, 0xffa00f10, "vmin%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2200f10, 0xffa00f10, "vrsqrts%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000d00, 0xffa00f10, "vpadd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000d10, 0xffa00f10, "vmul%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000e00, 0xffa00f10, "vcge%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000e10, 0xffa00f10, "vacge%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000f00, 0xffa00f10, "vpmax%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3200d00, 0xffa00f10, "vabd%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3200e00, 0xffa00f10, "vcgt%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3200e10, 0xffa00f10, "vacgt%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3200f00, 0xffa00f10, "vpmin%c.f%20U0\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000800, 0xff800f10, "vadd%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000810, 0xff800f10, "vtst%c.%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000900, 0xff800f10, "vmla%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000b00, 0xff800f10, "vqdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000b10, 0xff800f10, "vpadd%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000800, 0xff800f10, "vsub%c.i%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000810, 0xff800f10, "vceq%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000900, 0xff800f10, "vmls%c.i%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf3000b00, 0xff800f10, "vqrdmulh%c.s%20-21S6\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000000, 0xfe800f10, "vhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000010, 0xfe800f10, "vqadd%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000100, 0xfe800f10, "vrhadd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000200, 0xfe800f10, "vhsub%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000210, 0xfe800f10, "vqsub%c.%24?us%20-21S3\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000300, 0xfe800f10, "vcgt%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000310, 0xfe800f10, "vcge%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000400, 0xfe800f10, "vshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
+ {FPU_NEON_EXT_V1, 0xf2000410, 0xfe800f10, "vqshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
+ {FPU_NEON_EXT_V1, 0xf2000500, 0xfe800f10, "vrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
+ {FPU_NEON_EXT_V1, 0xf2000510, 0xfe800f10, "vqrshl%c.%24?us%20-21S3\t%12-15,22R, %0-3,5R, %16-19,7R"},
+ {FPU_NEON_EXT_V1, 0xf2000600, 0xfe800f10, "vmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000610, 0xfe800f10, "vmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000700, 0xfe800f10, "vabd%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000710, 0xfe800f10, "vaba%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000910, 0xfe800f10, "vmul%c.%24?pi%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000a00, 0xfe800f10, "vpmax%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+ {FPU_NEON_EXT_V1, 0xf2000a10, 0xfe800f10, "vpmin%c.%24?us%20-21S2\t%12-15,22R, %16-19,7R, %0-3,5R"},
+
+ /* One register and an immediate value */
+ {FPU_NEON_EXT_V1, 0xf2800e10, 0xfeb80fb0, "vmov%c.i8\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800e30, 0xfeb80fb0, "vmov%c.i64\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800f10, 0xfeb80fb0, "vmov%c.f32\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800810, 0xfeb80db0, "vmov%c.i16\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800830, 0xfeb80db0, "vmvn%c.i16\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800910, 0xfeb80db0, "vorr%c.i16\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800930, 0xfeb80db0, "vbic%c.i16\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800c10, 0xfeb80eb0, "vmov%c.i32\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800c30, 0xfeb80eb0, "vmvn%c.i32\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800110, 0xfeb809b0, "vorr%c.i32\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800130, 0xfeb809b0, "vbic%c.i32\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800010, 0xfeb808b0, "vmov%c.i32\t%12-15,22R, %E"},
+ {FPU_NEON_EXT_V1, 0xf2800030, 0xfeb808b0, "vmvn%c.i32\t%12-15,22R, %E"},
+
+ /* Two registers and a shift amount */
+ {FPU_NEON_EXT_V1, 0xf2880810, 0xffb80fd0, "vshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880850, 0xffb80fd0, "vrshrn%c.i16\t%12-15,22D, %0-3,5Q, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880810, 0xfeb80fd0, "vqshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880850, 0xfeb80fd0, "vqrshrun%c.s16\t%12-15,22D, %0-3,5Q, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880910, 0xfeb80fd0, "vqshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880950, 0xfeb80fd0, "vqrshrn%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880a10, 0xfeb80fd0, "vshll%c.%24?us8\t%12-15,22D, %0-3,5Q, #%16-18d"},
+ {FPU_NEON_EXT_V1, 0xf2900810, 0xffb00fd0, "vshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2900850, 0xffb00fd0, "vrshrn%c.i32\t%12-15,22D, %0-3,5Q, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2880510, 0xffb80f90, "vshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
+ {FPU_NEON_EXT_V1, 0xf3880410, 0xffb80f90, "vsri%c.8\t%12-15,22R, %0-3,5R, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf3880510, 0xffb80f90, "vsli%c.8\t%12-15,22R, %0-3,5R, #%16-18d"},
+ {FPU_NEON_EXT_V1, 0xf3880610, 0xffb80f90, "vqshlu%c.s8\t%12-15,22R, %0-3,5R, #%16-18d"},
+ {FPU_NEON_EXT_V1, 0xf2900810, 0xfeb00fd0, "vqshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2900850, 0xfeb00fd0, "vqrshrun%c.s32\t%12-15,22D, %0-3,5Q, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2900910, 0xfeb00fd0, "vqshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2900950, 0xfeb00fd0, "vqrshrn%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2900a10, 0xfeb00fd0, "vshll%c.%24?us16\t%12-15,22D, %0-3,5Q, #%16-19d"},
+ {FPU_NEON_EXT_V1, 0xf2880010, 0xfeb80f90, "vshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880110, 0xfeb80f90, "vsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880210, 0xfeb80f90, "vrshr%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880310, 0xfeb80f90, "vrsra%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18e"},
+ {FPU_NEON_EXT_V1, 0xf2880710, 0xfeb80f90, "vqshl%c.%24?us8\t%12-15,22R, %0-3,5R, #%16-18d"},
+ {FPU_NEON_EXT_V1, 0xf2a00810, 0xffa00fd0, "vshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2a00850, 0xffa00fd0, "vrshrn%c.i64\t%12-15,22D, %0-3,5Q, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2900510, 0xffb00f90, "vshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
+ {FPU_NEON_EXT_V1, 0xf3900410, 0xffb00f90, "vsri%c.16\t%12-15,22R, %0-3,5R, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf3900510, 0xffb00f90, "vsli%c.16\t%12-15,22R, %0-3,5R, #%16-19d"},
+ {FPU_NEON_EXT_V1, 0xf3900610, 0xffb00f90, "vqshlu%c.s16\t%12-15,22R, %0-3,5R, #%16-19d"},
+ {FPU_NEON_EXT_V1, 0xf2a00a10, 0xfea00fd0, "vshll%c.%24?us32\t%12-15,22D, %0-3,5Q, #%16-20d"},
+ {FPU_NEON_EXT_V1, 0xf2900010, 0xfeb00f90, "vshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2900110, 0xfeb00f90, "vsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2900210, 0xfeb00f90, "vrshr%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2900310, 0xfeb00f90, "vrsra%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19e"},
+ {FPU_NEON_EXT_V1, 0xf2900710, 0xfeb00f90, "vqshl%c.%24?us16\t%12-15,22R, %0-3,5R, #%16-19d"},
+ {FPU_NEON_EXT_V1, 0xf2800810, 0xfec00fd0, "vqshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2800850, 0xfec00fd0, "vqrshrun%c.s64\t%12-15,22D, %0-3,5Q, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2800910, 0xfec00fd0, "vqshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2800950, 0xfec00fd0, "vqrshrn%c.%24?us64\t%12-15,22D, %0-3,5Q, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2a00510, 0xffa00f90, "vshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
+ {FPU_NEON_EXT_V1, 0xf3a00410, 0xffa00f90, "vsri%c.32\t%12-15,22R, %0-3,5R, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf3a00510, 0xffa00f90, "vsli%c.32\t%12-15,22R, %0-3,5R, #%16-20d"},
+ {FPU_NEON_EXT_V1, 0xf3a00610, 0xffa00f90, "vqshlu%c.s32\t%12-15,22R, %0-3,5R, #%16-20d"},
+ {FPU_NEON_EXT_V1, 0xf2a00010, 0xfea00f90, "vshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2a00110, 0xfea00f90, "vsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2a00210, 0xfea00f90, "vrshr%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2a00310, 0xfea00f90, "vrsra%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20e"},
+ {FPU_NEON_EXT_V1, 0xf2a00710, 0xfea00f90, "vqshl%c.%24?us32\t%12-15,22R, %0-3,5R, #%16-20d"},
+ {FPU_NEON_EXT_V1, 0xf2800590, 0xff800f90, "vshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
+ {FPU_NEON_EXT_V1, 0xf3800490, 0xff800f90, "vsri%c.64\t%12-15,22R, %0-3,5R, #%16-21e"},
+ {FPU_NEON_EXT_V1, 0xf3800590, 0xff800f90, "vsli%c.64\t%12-15,22R, %0-3,5R, #%16-21d"},
+ {FPU_NEON_EXT_V1, 0xf3800690, 0xff800f90, "vqshlu%c.s64\t%12-15,22R, %0-3,5R, #%16-21d"},
+ {FPU_NEON_EXT_V1, 0xf2800090, 0xfe800f90, "vshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
+ {FPU_NEON_EXT_V1, 0xf2800190, 0xfe800f90, "vsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
+ {FPU_NEON_EXT_V1, 0xf2800290, 0xfe800f90, "vrshr%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
+ {FPU_NEON_EXT_V1, 0xf2800390, 0xfe800f90, "vrsra%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21e"},
+ {FPU_NEON_EXT_V1, 0xf2800790, 0xfe800f90, "vqshl%c.%24?us64\t%12-15,22R, %0-3,5R, #%16-21d"},
+ {FPU_NEON_EXT_V1, 0xf2a00e10, 0xfea00e90, "vcvt%c.%24,8?usff32.%24,8?ffus32\t%12-15,22R, %0-3,5R, #%16-20e"},
+
+ /* Three registers of different lengths */
+ {FPU_NEON_EXT_V1, 0xf2800e00, 0xfea00f50, "vmull%c.p%20S0\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800400, 0xff800f50, "vaddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
+ {FPU_NEON_EXT_V1, 0xf2800600, 0xff800f50, "vsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
+ {FPU_NEON_EXT_V1, 0xf2800900, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800b00, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800d00, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf3800400, 0xff800f50, "vraddhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
+ {FPU_NEON_EXT_V1, 0xf3800600, 0xff800f50, "vrsubhn%c.i%20-21T2\t%12-15,22D, %16-19,7Q, %0-3,5Q"},
+ {FPU_NEON_EXT_V1, 0xf2800000, 0xfe800f50, "vaddl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800100, 0xfe800f50, "vaddw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800200, 0xfe800f50, "vsubl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800300, 0xfe800f50, "vsubw%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7Q, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800500, 0xfe800f50, "vabal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800700, 0xfe800f50, "vabdl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800800, 0xfe800f50, "vmlal%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800a00, 0xfe800f50, "vmlsl%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+ {FPU_NEON_EXT_V1, 0xf2800c00, 0xfe800f50, "vmull%c.%24?us%20-21S2\t%12-15,22Q, %16-19,7D, %0-3,5D"},
+
+ /* Two registers and a scalar */
+ {FPU_NEON_EXT_V1, 0xf2800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800140, 0xff800f50, "vmla%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800340, 0xff800f50, "vqdmlal%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800540, 0xff800f50, "vmls%c.f%20-21S6\t%12-15,22D, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800740, 0xff800f50, "vqdmlsl%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22D, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800940, 0xff800f50, "vmul%c.f%20-21Sa\t%12-15,22D, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800b40, 0xff800f50, "vqdmull%c.s%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22D, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf3800040, 0xff800f50, "vmla%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
+ {FPU_NEON_EXT_V1, 0xf3800140, 0xff800f50, "vmla%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
+ {FPU_NEON_EXT_V1, 0xf3800440, 0xff800f50, "vmls%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
+ {FPU_NEON_EXT_V1, 0xf3800540, 0xff800f50, "vmls%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
+ {FPU_NEON_EXT_V1, 0xf3800840, 0xff800f50, "vmul%c.i%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
+ {FPU_NEON_EXT_V1, 0xf3800940, 0xff800f50, "vmul%c.f%20-21Sa\t%12-15,22Q, %16-19,7Q, %D"},
+ {FPU_NEON_EXT_V1, 0xf3800c40, 0xff800f50, "vqdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
+ {FPU_NEON_EXT_V1, 0xf3800d40, 0xff800f50, "vqrdmulh%c.s%20-21S6\t%12-15,22Q, %16-19,7Q, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800240, 0xfe800f50, "vmlal%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800640, 0xfe800f50, "vmlsl%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
+ {FPU_NEON_EXT_V1, 0xf2800a40, 0xfe800f50, "vmull%c.%24?us%20-21S6\t%12-15,22Q, %16-19,7D, %D"},
+
+ /* Element and structure load/store */
+ {FPU_NEON_EXT_V1, 0xf4a00fc0, 0xffb00fc0, "vld4%c.32\t%C"},
+ {FPU_NEON_EXT_V1, 0xf4a00c00, 0xffb00f00, "vld1%c.%6-7S2\t%C"},
+ {FPU_NEON_EXT_V1, 0xf4a00d00, 0xffb00f00, "vld2%c.%6-7S2\t%C"},
+ {FPU_NEON_EXT_V1, 0xf4a00e00, 0xffb00f00, "vld3%c.%6-7S2\t%C"},
+ {FPU_NEON_EXT_V1, 0xf4a00f00, 0xffb00f00, "vld4%c.%6-7S2\t%C"},
+ {FPU_NEON_EXT_V1, 0xf4000200, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4000300, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4000400, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4000500, 0xff900f00, "v%21?ls%21?dt3%c.%6-7S2\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4000600, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4000700, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4000800, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4000900, 0xff900f00, "v%21?ls%21?dt2%c.%6-7S2\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4000a00, 0xff900f00, "v%21?ls%21?dt1%c.%6-7S3\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4000000, 0xff900e00, "v%21?ls%21?dt4%c.%6-7S2\t%A"},
+ {FPU_NEON_EXT_V1, 0xf4800000, 0xff900300, "v%21?ls%21?dt1%c.%10-11S2\t%B"},
+ {FPU_NEON_EXT_V1, 0xf4800100, 0xff900300, "v%21?ls%21?dt2%c.%10-11S2\t%B"},
+ {FPU_NEON_EXT_V1, 0xf4800200, 0xff900300, "v%21?ls%21?dt3%c.%10-11S2\t%B"},
+ {FPU_NEON_EXT_V1, 0xf4800300, 0xff900300, "v%21?ls%21?dt4%c.%10-11S2\t%B"},
+
+ {0,0 ,0, 0}
+};
+
+/* Opcode tables: ARM, 16-bit Thumb, 32-bit Thumb. All three are partially
+ ordered: they must be searched linearly from the top to obtain a correct
+ match. */
+
+/* print_insn_arm recognizes the following format control codes:
+
+ %% %
+
+ %a print address for ldr/str instruction
+ %s print address for ldr/str halfword/signextend instruction
+ %b print branch destination
+ %c print condition code (always bits 28-31)
+ %m print register mask for ldm/stm instruction
+ %o print operand2 (immediate or register + shift)
+ %p print 'p' iff bits 12-15 are 15
+ %t print 't' iff bit 21 set and bit 24 clear
+ %B print arm BLX(1) destination
+ %C print the PSR sub type.
+ %U print barrier type.
+ %P print address for pli instruction.
+
+ %<bitfield>r print as an ARM register
+ %<bitfield>d print the bitfield in decimal
+ %<bitfield>W print the bitfield plus one in decimal
+ %<bitfield>x print the bitfield in hex
+ %<bitfield>X print the bitfield as 1 hex digit without leading "0x"
+
+ %<bitfield>'c print specified char iff bitfield is all ones
+ %<bitfield>`c print specified char iff bitfield is all zeroes
+ %<bitfield>?ab... select from array of values in big endian order
+
+ %e print arm SMI operand (bits 0..7,8..19).
+ %E print the LSB and WIDTH fields of a BFI or BFC instruction.
+ %V print the 16-bit immediate field of a MOVT or MOVW instruction. */
+
+static const struct opcode32 arm_opcodes[] =
+{
+ /* ARM instructions. */
+ {ARM_EXT_V1, 0xe1a00000, 0xffffffff, "nop\t\t\t(mov r0,r0)"},
+ {ARM_EXT_V4T | ARM_EXT_V5, 0x012FFF10, 0x0ffffff0, "bx%c\t%0-3r"},
+ {ARM_EXT_V2, 0x00000090, 0x0fe000f0, "mul%20's%c\t%16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V2, 0x00200090, 0x0fe000f0, "mla%20's%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V2S, 0x01000090, 0x0fb00ff0, "swp%22'b%c\t%12-15r, %0-3r, [%16-19r]"},
+ {ARM_EXT_V3M, 0x00800090, 0x0fa000f0, "%22?sumull%20's%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V3M, 0x00a00090, 0x0fa000f0, "%22?sumlal%20's%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
+
+ /* V7 instructions. */
+ {ARM_EXT_V7, 0xf450f000, 0xfd70f000, "pli\t%P"},
+ {ARM_EXT_V7, 0x0320f0f0, 0x0ffffff0, "dbg%c\t#%0-3d"},
+ {ARM_EXT_V7, 0xf57ff050, 0xfffffff0, "dmb\t%U"},
+ {ARM_EXT_V7, 0xf57ff040, 0xfffffff0, "dsb\t%U"},
+ {ARM_EXT_V7, 0xf57ff060, 0xfffffff0, "isb\t%U"},
+
+ /* ARM V6T2 instructions. */
+ {ARM_EXT_V6T2, 0x07c0001f, 0x0fe0007f, "bfc%c\t%12-15r, %E"},
+ {ARM_EXT_V6T2, 0x07c00010, 0x0fe00070, "bfi%c\t%12-15r, %0-3r, %E"},
+ {ARM_EXT_V6T2, 0x00600090, 0x0ff000f0, "mls%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V6T2, 0x006000b0, 0x0f7000f0, "strht%c\t%12-15r, %s"},
+ {ARM_EXT_V6T2, 0x00300090, 0x0f300090, "ldr%6's%5?hbt%c\t%12-15r, %s"},
+ {ARM_EXT_V6T2, 0x03000000, 0x0ff00000, "movw%c\t%12-15r, %V"},
+ {ARM_EXT_V6T2, 0x03400000, 0x0ff00000, "movt%c\t%12-15r, %V"},
+ {ARM_EXT_V6T2, 0x06ff0f30, 0x0fff0ff0, "rbit%c\t%12-15r, %0-3r"},
+ {ARM_EXT_V6T2, 0x07a00050, 0x0fa00070, "%22?usbfx%c\t%12-15r, %0-3r, #%7-11d, #%16-20W"},
+
+ /* ARM V6Z instructions. */
+ {ARM_EXT_V6Z, 0x01600070, 0x0ff000f0, "smc%c\t%e"},
+
+ /* ARM V6K instructions. */
+ {ARM_EXT_V6K, 0xf57ff01f, 0xffffffff, "clrex"},
+ {ARM_EXT_V6K, 0x01d00f9f, 0x0ff00fff, "ldrexb%c\t%12-15r, [%16-19r]"},
+ {ARM_EXT_V6K, 0x01b00f9f, 0x0ff00fff, "ldrexd%c\t%12-15r, [%16-19r]"},
+ {ARM_EXT_V6K, 0x01f00f9f, 0x0ff00fff, "ldrexh%c\t%12-15r, [%16-19r]"},
+ {ARM_EXT_V6K, 0x01c00f90, 0x0ff00ff0, "strexb%c\t%12-15r, %0-3r, [%16-19r]"},
+ {ARM_EXT_V6K, 0x01a00f90, 0x0ff00ff0, "strexd%c\t%12-15r, %0-3r, [%16-19r]"},
+ {ARM_EXT_V6K, 0x01e00f90, 0x0ff00ff0, "strexh%c\t%12-15r, %0-3r, [%16-19r]"},
+
+ /* ARM V6K NOP hints. */
+ {ARM_EXT_V6K, 0x0320f001, 0x0fffffff, "yield%c"},
+ {ARM_EXT_V6K, 0x0320f002, 0x0fffffff, "wfe%c"},
+ {ARM_EXT_V6K, 0x0320f003, 0x0fffffff, "wfi%c"},
+ {ARM_EXT_V6K, 0x0320f004, 0x0fffffff, "sev%c"},
+ {ARM_EXT_V6K, 0x0320f000, 0x0fffff00, "nop%c\t{%0-7d}"},
+
+ /* ARM V6 instructions. */
+ {ARM_EXT_V6, 0xf1080000, 0xfffffe3f, "cpsie\t%8'a%7'i%6'f"},
+ {ARM_EXT_V6, 0xf10a0000, 0xfffffe20, "cpsie\t%8'a%7'i%6'f,#%0-4d"},
+ {ARM_EXT_V6, 0xf10C0000, 0xfffffe3f, "cpsid\t%8'a%7'i%6'f"},
+ {ARM_EXT_V6, 0xf10e0000, 0xfffffe20, "cpsid\t%8'a%7'i%6'f,#%0-4d"},
+ {ARM_EXT_V6, 0xf1000000, 0xfff1fe20, "cps\t#%0-4d"},
+ {ARM_EXT_V6, 0x06800010, 0x0ff00ff0, "pkhbt%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06800010, 0x0ff00070, "pkhbt%c\t%12-15r, %16-19r, %0-3r, lsl #%7-11d"},
+ {ARM_EXT_V6, 0x06800050, 0x0ff00ff0, "pkhtb%c\t%12-15r, %16-19r, %0-3r, asr #32"},
+ {ARM_EXT_V6, 0x06800050, 0x0ff00070, "pkhtb%c\t%12-15r, %16-19r, %0-3r, asr #%7-11d"},
+ {ARM_EXT_V6, 0x01900f9f, 0x0ff00fff, "ldrex%c\tr%12-15d, [%16-19r]"},
+ {ARM_EXT_V6, 0x06200f10, 0x0ff00ff0, "qadd16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06200f90, 0x0ff00ff0, "qadd8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06200f30, 0x0ff00ff0, "qaddsubx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06200f70, 0x0ff00ff0, "qsub16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06200ff0, 0x0ff00ff0, "qsub8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06200f50, 0x0ff00ff0, "qsubaddx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06100f10, 0x0ff00ff0, "sadd16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06100f90, 0x0ff00ff0, "sadd8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06100f30, 0x0ff00ff0, "saddaddx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06300f10, 0x0ff00ff0, "shadd16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06300f90, 0x0ff00ff0, "shadd8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06300f30, 0x0ff00ff0, "shaddsubx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06300f70, 0x0ff00ff0, "shsub16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06300ff0, 0x0ff00ff0, "shsub8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06300f50, 0x0ff00ff0, "shsubaddx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06100f70, 0x0ff00ff0, "ssub16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06100ff0, 0x0ff00ff0, "ssub8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06100f50, 0x0ff00ff0, "ssubaddx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06500f10, 0x0ff00ff0, "uadd16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06500f90, 0x0ff00ff0, "uadd8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06500f30, 0x0ff00ff0, "uaddsubx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06700f10, 0x0ff00ff0, "uhadd16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06700f90, 0x0ff00ff0, "uhadd8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06700f30, 0x0ff00ff0, "uhaddsubx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06700f70, 0x0ff00ff0, "uhsub16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06700ff0, 0x0ff00ff0, "uhsub8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06700f50, 0x0ff00ff0, "uhsubaddx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06600f10, 0x0ff00ff0, "uqadd16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06600f90, 0x0ff00ff0, "uqadd8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06600f30, 0x0ff00ff0, "uqaddsubx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06600f70, 0x0ff00ff0, "uqsub16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06600ff0, 0x0ff00ff0, "uqsub8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06600f50, 0x0ff00ff0, "uqsubaddx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06500f70, 0x0ff00ff0, "usub16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06500ff0, 0x0ff00ff0, "usub8%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06500f50, 0x0ff00ff0, "usubaddx%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06bf0f30, 0x0fff0ff0, "rev%c\t\%12-15r, %0-3r"},
+ {ARM_EXT_V6, 0x06bf0fb0, 0x0fff0ff0, "rev16%c\t\%12-15r, %0-3r"},
+ {ARM_EXT_V6, 0x06ff0fb0, 0x0fff0ff0, "revsh%c\t\%12-15r, %0-3r"},
+ {ARM_EXT_V6, 0xf8100a00, 0xfe50ffff, "rfe%23?id%24?ba\t\%16-19r%21'!"},
+ {ARM_EXT_V6, 0x06bf0070, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r"},
+ {ARM_EXT_V6, 0x06bf0470, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06bf0870, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06bf0c70, 0x0fff0ff0, "sxth%c\t%12-15r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x068f0070, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r"},
+ {ARM_EXT_V6, 0x068f0470, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x068f0870, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x068f0c70, 0x0fff0ff0, "sxtb16%c\t%12-15r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06af0070, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r"},
+ {ARM_EXT_V6, 0x06af0470, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06af0870, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06af0c70, 0x0fff0ff0, "sxtb%c\t%12-15r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06ff0070, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r"},
+ {ARM_EXT_V6, 0x06ff0470, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06ff0870, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06ff0c70, 0x0fff0ff0, "uxth%c\t%12-15r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06cf0070, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r"},
+ {ARM_EXT_V6, 0x06cf0470, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06cf0870, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06cf0c70, 0x0fff0ff0, "uxtb16%c\t%12-15r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06ef0070, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r"},
+ {ARM_EXT_V6, 0x06ef0470, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06ef0870, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06ef0c70, 0x0fff0ff0, "uxtb%c\t%12-15r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06b00070, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06b00470, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06b00870, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06b00c70, 0x0ff00ff0, "sxtah%c\t%12-15r, %16-19r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06800070, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06800470, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06800870, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06800c70, 0x0ff00ff0, "sxtab16%c\t%12-15r, %16-19r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06a00070, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06a00470, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06a00870, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06a00c70, 0x0ff00ff0, "sxtab%c\t%12-15r, %16-19r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06f00070, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06f00470, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06f00870, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06f00c70, 0x0ff00ff0, "uxtah%c\t%12-15r, %16-19r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06c00070, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06c00470, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06c00870, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06c00c70, 0x0ff00ff0, "uxtab16%c\t%12-15r, %16-19r, %0-3r, ROR #24"},
+ {ARM_EXT_V6, 0x06e00070, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0x06e00470, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ror #8"},
+ {ARM_EXT_V6, 0x06e00870, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ror #16"},
+ {ARM_EXT_V6, 0x06e00c70, 0x0ff00ff0, "uxtab%c\t%12-15r, %16-19r, %0-3r, ror #24"},
+ {ARM_EXT_V6, 0x06800fb0, 0x0ff00ff0, "sel%c\t%12-15r, %16-19r, %0-3r"},
+ {ARM_EXT_V6, 0xf1010000, 0xfffffc00, "setend\t%9?ble"},
+ {ARM_EXT_V6, 0x0700f010, 0x0ff0f0d0, "smuad%5'x%c\t%16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V6, 0x0700f050, 0x0ff0f0d0, "smusd%5'x%c\t%16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V6, 0x07000010, 0x0ff000d0, "smlad%5'x%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V6, 0x07400010, 0x0ff000d0, "smlald%5'x%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V6, 0x07000050, 0x0ff000d0, "smlsd%5'x%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V6, 0x07400050, 0x0ff000d0, "smlsld%5'x%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V6, 0x0750f010, 0x0ff0f0d0, "smmul%5'r%c\t%16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V6, 0x07500010, 0x0ff000d0, "smmla%5'r%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V6, 0x075000d0, 0x0ff000d0, "smmls%5'r%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V6, 0xf84d0500, 0xfe5fffe0, "srs%23?id%24?ba\t%16-19r%21'!, #%0-4d"},
+ {ARM_EXT_V6, 0x06a00010, 0x0fe00ff0, "ssat%c\t%12-15r, #%16-20W, %0-3r"},
+ {ARM_EXT_V6, 0x06a00010, 0x0fe00070, "ssat%c\t%12-15r, #%16-20W, %0-3r, lsl #%7-11d"},
+ {ARM_EXT_V6, 0x06a00050, 0x0fe00070, "ssat%c\t%12-15r, #%16-20W, %0-3r, asr #%7-11d"},
+ {ARM_EXT_V6, 0x06a00f30, 0x0ff00ff0, "ssat16%c\t%12-15r, #%16-19W, %0-3r"},
+ {ARM_EXT_V6, 0x01800f90, 0x0ff00ff0, "strex%c\t%12-15r, %0-3r, [%16-19r]"},
+ {ARM_EXT_V6, 0x00400090, 0x0ff000f0, "umaal%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V6, 0x0780f010, 0x0ff0f0f0, "usad8%c\t%16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V6, 0x07800010, 0x0ff000f0, "usada8%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V6, 0x06e00010, 0x0fe00ff0, "usat%c\t%12-15r, #%16-20d, %0-3r"},
+ {ARM_EXT_V6, 0x06e00010, 0x0fe00070, "usat%c\t%12-15r, #%16-20d, %0-3r, lsl #%7-11d"},
+ {ARM_EXT_V6, 0x06e00050, 0x0fe00070, "usat%c\t%12-15r, #%16-20d, %0-3r, asr #%7-11d"},
+ {ARM_EXT_V6, 0x06e00f30, 0x0ff00ff0, "usat16%c\t%12-15r, #%16-19d, %0-3r"},
+
+ /* V5J instruction. */
+ {ARM_EXT_V5J, 0x012fff20, 0x0ffffff0, "bxj%c\t%0-3r"},
+
+ /* V5 Instructions. */
+ {ARM_EXT_V5, 0xe1200070, 0xfff000f0, "bkpt\t0x%16-19X%12-15X%8-11X%0-3X"},
+ {ARM_EXT_V5, 0xfa000000, 0xfe000000, "blx\t%B"},
+ {ARM_EXT_V5, 0x012fff30, 0x0ffffff0, "blx%c\t%0-3r"},
+ {ARM_EXT_V5, 0x016f0f10, 0x0fff0ff0, "clz%c\t%12-15r, %0-3r"},
+
+ /* V5E "El Segundo" Instructions. */
+ {ARM_EXT_V5E, 0x000000d0, 0x0e1000f0, "ldrd%c\t%12-15r, %s"},
+ {ARM_EXT_V5E, 0x000000f0, 0x0e1000f0, "strd%c\t%12-15r, %s"},
+ {ARM_EXT_V5E, 0xf450f000, 0xfc70f000, "pld\t%a"},
+ {ARM_EXT_V5ExP, 0x01000080, 0x0ff000f0, "smlabb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V5ExP, 0x010000a0, 0x0ff000f0, "smlatb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V5ExP, 0x010000c0, 0x0ff000f0, "smlabt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V5ExP, 0x010000e0, 0x0ff000f0, "smlatt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+
+ {ARM_EXT_V5ExP, 0x01200080, 0x0ff000f0, "smlawb%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+ {ARM_EXT_V5ExP, 0x012000c0, 0x0ff000f0, "smlawt%c\t%16-19r, %0-3r, %8-11r, %12-15r"},
+
+ {ARM_EXT_V5ExP, 0x01400080, 0x0ff000f0, "smlalbb%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V5ExP, 0x014000a0, 0x0ff000f0, "smlaltb%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V5ExP, 0x014000c0, 0x0ff000f0, "smlalbt%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V5ExP, 0x014000e0, 0x0ff000f0, "smlaltt%c\t%12-15r, %16-19r, %0-3r, %8-11r"},
+
+ {ARM_EXT_V5ExP, 0x01600080, 0x0ff0f0f0, "smulbb%c\t%16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V5ExP, 0x016000a0, 0x0ff0f0f0, "smultb%c\t%16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V5ExP, 0x016000c0, 0x0ff0f0f0, "smulbt%c\t%16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V5ExP, 0x016000e0, 0x0ff0f0f0, "smultt%c\t%16-19r, %0-3r, %8-11r"},
+
+ {ARM_EXT_V5ExP, 0x012000a0, 0x0ff0f0f0, "smulwb%c\t%16-19r, %0-3r, %8-11r"},
+ {ARM_EXT_V5ExP, 0x012000e0, 0x0ff0f0f0, "smulwt%c\t%16-19r, %0-3r, %8-11r"},
+
+ {ARM_EXT_V5ExP, 0x01000050, 0x0ff00ff0, "qadd%c\t%12-15r, %0-3r, %16-19r"},
+ {ARM_EXT_V5ExP, 0x01400050, 0x0ff00ff0, "qdadd%c\t%12-15r, %0-3r, %16-19r"},
+ {ARM_EXT_V5ExP, 0x01200050, 0x0ff00ff0, "qsub%c\t%12-15r, %0-3r, %16-19r"},
+ {ARM_EXT_V5ExP, 0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15r, %0-3r, %16-19r"},
+
+ /* ARM Instructions. */
+ {ARM_EXT_V1, 0x00000090, 0x0e100090, "str%6's%5?hb%c\t%12-15r, %s"},
+ {ARM_EXT_V1, 0x00100090, 0x0e100090, "ldr%6's%5?hb%c\t%12-15r, %s"},
+ {ARM_EXT_V1, 0x00000000, 0x0de00000, "and%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V1, 0x00200000, 0x0de00000, "eor%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V1, 0x00400000, 0x0de00000, "sub%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V1, 0x00600000, 0x0de00000, "rsb%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V1, 0x00800000, 0x0de00000, "add%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V1, 0x00a00000, 0x0de00000, "adc%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V1, 0x00c00000, 0x0de00000, "sbc%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V1, 0x00e00000, 0x0de00000, "rsc%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V3, 0x0120f000, 0x0db0f000, "msr%c\t%22?SCPSR%C, %o"},
+ {ARM_EXT_V3, 0x010f0000, 0x0fbf0fff, "mrs%c\t%12-15r, %22?SCPSR"},
+ {ARM_EXT_V1, 0x01000000, 0x0de00000, "tst%p%c\t%16-19r, %o"},
+ {ARM_EXT_V1, 0x01200000, 0x0de00000, "teq%p%c\t%16-19r, %o"},
+ {ARM_EXT_V1, 0x01400000, 0x0de00000, "cmp%p%c\t%16-19r, %o"},
+ {ARM_EXT_V1, 0x01600000, 0x0de00000, "cmn%p%c\t%16-19r, %o"},
+ {ARM_EXT_V1, 0x01800000, 0x0de00000, "orr%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V1, 0x03a00000, 0x0fef0000, "mov%20's%c\t%12-15r, %o"},
+ {ARM_EXT_V1, 0x01a00000, 0x0def0ff0, "mov%20's%c\t%12-15r, %0-3r"},
+ {ARM_EXT_V1, 0x01a00000, 0x0def0060, "lsl%20's%c\t%12-15r, %q"},
+ {ARM_EXT_V1, 0x01a00020, 0x0def0060, "lsr%20's%c\t%12-15r, %q"},
+ {ARM_EXT_V1, 0x01a00040, 0x0def0060, "asr%20's%c\t%12-15r, %q"},
+ {ARM_EXT_V1, 0x01a00060, 0x0def0ff0, "rrx%20's%c\t%12-15r, %0-3r"},
+ {ARM_EXT_V1, 0x01a00060, 0x0def0060, "ror%20's%c\t%12-15r, %q"},
+ {ARM_EXT_V1, 0x01c00000, 0x0de00000, "bic%20's%c\t%12-15r, %16-19r, %o"},
+ {ARM_EXT_V1, 0x01e00000, 0x0de00000, "mvn%20's%c\t%12-15r, %o"},
+ {ARM_EXT_V1, 0x052d0004, 0x0fff0fff, "push%c\t{%12-15r}\t\t; (str%c %12-15r, %a)"},
+ {ARM_EXT_V1, 0x04000000, 0x0e100000, "str%22'b%t%c\t%12-15r, %a"},
+ {ARM_EXT_V1, 0x06000000, 0x0e100ff0, "str%22'b%t%c\t%12-15r, %a"},
+ {ARM_EXT_V1, 0x04000000, 0x0c100010, "str%22'b%t%c\t%12-15r, %a"},
+ {ARM_EXT_V1, 0x06000010, 0x0e000010, "undefined"},
+ {ARM_EXT_V1, 0x049d0004, 0x0fff0fff, "pop%c\t{%12-15r}\t\t; (ldr%c %12-15r, %a)"},
+ {ARM_EXT_V1, 0x04100000, 0x0c100000, "ldr%22'b%t%c\t%12-15r, %a"},
+ {ARM_EXT_V1, 0x092d0000, 0x0fff0000, "push%c\t%m"},
+ {ARM_EXT_V1, 0x08800000, 0x0ff00000, "stm%c\t%16-19r%21'!, %m%22'^"},
+ {ARM_EXT_V1, 0x08000000, 0x0e100000, "stm%23?id%24?ba%c\t%16-19r%21'!, %m%22'^"},
+ {ARM_EXT_V1, 0x08bd0000, 0x0fff0000, "pop%c\t%m"},
+ {ARM_EXT_V1, 0x08900000, 0x0f900000, "ldm%c\t%16-19r%21'!, %m%22'^"},
+ {ARM_EXT_V1, 0x08100000, 0x0e100000, "ldm%23?id%24?ba%c\t%16-19r%21'!, %m%22'^"},
+ {ARM_EXT_V1, 0x0a000000, 0x0e000000, "b%24'l%c\t%b"},
+ {ARM_EXT_V1, 0x0f000000, 0x0f000000, "svc%c\t%0-23x"},
+
+ /* The rest. */
+ {ARM_EXT_V1, 0x00000000, 0x00000000, "undefined instruction %0-31x"},
+ {0, 0x00000000, 0x00000000, 0}
+};
+
+/* print_insn_thumb16 recognizes the following format control codes:
+
+ %S print Thumb register (bits 3..5 as high number if bit 6 set)
+ %D print Thumb register (bits 0..2 as high number if bit 7 set)
+ %<bitfield>I print bitfield as a signed decimal
+ (top bit of range being the sign bit)
+ %N print Thumb register mask (with LR)
+ %O print Thumb register mask (with PC)
+ %M print Thumb register mask
+ %b print CZB's 6-bit unsigned branch destination
+ %s print Thumb right-shift immediate (6..10; 0 == 32).
+ %c print the condition code
+ %C print the condition code, or "s" if not conditional
+ %x print warning if conditional an not at end of IT block"
+ %X print "\t; unpredictable <IT:code>" if conditional
+ %I print IT instruction suffix and operands
+ %<bitfield>r print bitfield as an ARM register
+ %<bitfield>d print bitfield as a decimal
+ %<bitfield>H print (bitfield * 2) as a decimal
+ %<bitfield>W print (bitfield * 4) as a decimal
+ %<bitfield>a print (bitfield * 4) as a pc-rel offset + decoded symbol
+ %<bitfield>B print Thumb branch destination (signed displacement)
+ %<bitfield>c print bitfield as a condition code
+ %<bitnum>'c print specified char iff bit is one
+ %<bitnum>?ab print a if bit is one else print b. */
+
+static const struct opcode16 thumb_opcodes[] =
+{
+ /* Thumb instructions. */
+
+ /* ARM V6K no-argument instructions. */
+ {ARM_EXT_V6K, 0xbf00, 0xffff, "nop%c"},
+ {ARM_EXT_V6K, 0xbf10, 0xffff, "yield%c"},
+ {ARM_EXT_V6K, 0xbf20, 0xffff, "wfe%c"},
+ {ARM_EXT_V6K, 0xbf30, 0xffff, "wfi%c"},
+ {ARM_EXT_V6K, 0xbf40, 0xffff, "sev%c"},
+ {ARM_EXT_V6K, 0xbf00, 0xff0f, "nop%c\t{%4-7d}"},
+
+ /* ARM V6T2 instructions. */
+ {ARM_EXT_V6T2, 0xb900, 0xfd00, "cbnz\t%0-2r, %b%X"},
+ {ARM_EXT_V6T2, 0xb100, 0xfd00, "cbz\t%0-2r, %b%X"},
+ {ARM_EXT_V6T2, 0xbf00, 0xff00, "it%I%X"},
+
+ /* ARM V6. */
+ {ARM_EXT_V6, 0xb660, 0xfff8, "cpsie\t%2'a%1'i%0'f%X"},
+ {ARM_EXT_V6, 0xb670, 0xfff8, "cpsid\t%2'a%1'i%0'f%X"},
+ {ARM_EXT_V6, 0x4600, 0xffc0, "mov%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V6, 0xba00, 0xffc0, "rev%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V6, 0xba40, 0xffc0, "rev16%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V6, 0xbac0, 0xffc0, "revsh%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V6, 0xb650, 0xfff7, "setend\t%3?ble%X"},
+ {ARM_EXT_V6, 0xb200, 0xffc0, "sxth%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V6, 0xb240, 0xffc0, "sxtb%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V6, 0xb280, 0xffc0, "uxth%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V6, 0xb2c0, 0xffc0, "uxtb%c\t%0-2r, %3-5r"},
+
+ /* ARM V5 ISA extends Thumb. */
+ {ARM_EXT_V5T, 0xbe00, 0xff00, "bkpt\t%0-7x"}, /* Is always unconditional. */
+ /* This is BLX(2). BLX(1) is a 32-bit instruction. */
+ {ARM_EXT_V5T, 0x4780, 0xff87, "blx%c\t%3-6r%x"}, /* note: 4 bit register number. */
+ /* ARM V4T ISA (Thumb v1). */
+ {ARM_EXT_V4T, 0x46C0, 0xFFFF, "nop%c\t\t\t(mov r8, r8)"},
+ /* Format 4. */
+ {ARM_EXT_V4T, 0x4000, 0xFFC0, "and%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4040, 0xFFC0, "eor%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4080, 0xFFC0, "lsl%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x40C0, 0xFFC0, "lsr%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4100, 0xFFC0, "asr%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4140, 0xFFC0, "adc%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4180, 0xFFC0, "sbc%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x41C0, 0xFFC0, "ror%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4200, 0xFFC0, "tst%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4240, 0xFFC0, "neg%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4280, 0xFFC0, "cmp%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x42C0, 0xFFC0, "cmn%c\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4300, 0xFFC0, "orr%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4340, 0xFFC0, "mul%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x4380, 0xFFC0, "bic%C\t%0-2r, %3-5r"},
+ {ARM_EXT_V4T, 0x43C0, 0xFFC0, "mvn%C\t%0-2r, %3-5r"},
+ /* format 13 */
+ {ARM_EXT_V4T, 0xB000, 0xFF80, "add%c\tsp, #%0-6W"},
+ {ARM_EXT_V4T, 0xB080, 0xFF80, "sub%c\tsp, #%0-6W"},
+ /* format 5 */
+ {ARM_EXT_V4T, 0x4700, 0xFF80, "bx%c\t%S%x"},
+ {ARM_EXT_V4T, 0x4400, 0xFF00, "add%c\t%D, %S"},
+ {ARM_EXT_V4T, 0x4500, 0xFF00, "cmp%c\t%D, %S"},
+ {ARM_EXT_V4T, 0x4600, 0xFF00, "mov%c\t%D, %S"},
+ /* format 14 */
+ {ARM_EXT_V4T, 0xB400, 0xFE00, "push%c\t%N"},
+ {ARM_EXT_V4T, 0xBC00, 0xFE00, "pop%c\t%O"},
+ /* format 2 */
+ {ARM_EXT_V4T, 0x1800, 0xFE00, "add%C\t%0-2r, %3-5r, %6-8r"},
+ {ARM_EXT_V4T, 0x1A00, 0xFE00, "sub%C\t%0-2r, %3-5r, %6-8r"},
+ {ARM_EXT_V4T, 0x1C00, 0xFE00, "add%C\t%0-2r, %3-5r, #%6-8d"},
+ {ARM_EXT_V4T, 0x1E00, 0xFE00, "sub%C\t%0-2r, %3-5r, #%6-8d"},
+ /* format 8 */
+ {ARM_EXT_V4T, 0x5200, 0xFE00, "strh%c\t%0-2r, [%3-5r, %6-8r]"},
+ {ARM_EXT_V4T, 0x5A00, 0xFE00, "ldrh%c\t%0-2r, [%3-5r, %6-8r]"},
+ {ARM_EXT_V4T, 0x5600, 0xF600, "ldrs%11?hb%c\t%0-2r, [%3-5r, %6-8r]"},
+ /* format 7 */
+ {ARM_EXT_V4T, 0x5000, 0xFA00, "str%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
+ {ARM_EXT_V4T, 0x5800, 0xFA00, "ldr%10'b%c\t%0-2r, [%3-5r, %6-8r]"},
+ /* format 1 */
+ {ARM_EXT_V4T, 0x0000, 0xF800, "lsl%C\t%0-2r, %3-5r, #%6-10d"},
+ {ARM_EXT_V4T, 0x0800, 0xF800, "lsr%C\t%0-2r, %3-5r, %s"},
+ {ARM_EXT_V4T, 0x1000, 0xF800, "asr%C\t%0-2r, %3-5r, %s"},
+ /* format 3 */
+ {ARM_EXT_V4T, 0x2000, 0xF800, "mov%C\t%8-10r, #%0-7d"},
+ {ARM_EXT_V4T, 0x2800, 0xF800, "cmp%c\t%8-10r, #%0-7d"},
+ {ARM_EXT_V4T, 0x3000, 0xF800, "add%C\t%8-10r, #%0-7d"},
+ {ARM_EXT_V4T, 0x3800, 0xF800, "sub%C\t%8-10r, #%0-7d"},
+ /* format 6 */
+ {ARM_EXT_V4T, 0x4800, 0xF800, "ldr%c\t%8-10r, [pc, #%0-7W]\t(%0-7a)"}, /* TODO: Disassemble PC relative "LDR rD,=<symbolic>" */
+ /* format 9 */
+ {ARM_EXT_V4T, 0x6000, 0xF800, "str%c\t%0-2r, [%3-5r, #%6-10W]"},
+ {ARM_EXT_V4T, 0x6800, 0xF800, "ldr%c\t%0-2r, [%3-5r, #%6-10W]"},
+ {ARM_EXT_V4T, 0x7000, 0xF800, "strb%c\t%0-2r, [%3-5r, #%6-10d]"},
+ {ARM_EXT_V4T, 0x7800, 0xF800, "ldrb%c\t%0-2r, [%3-5r, #%6-10d]"},
+ /* format 10 */
+ {ARM_EXT_V4T, 0x8000, 0xF800, "strh%c\t%0-2r, [%3-5r, #%6-10H]"},
+ {ARM_EXT_V4T, 0x8800, 0xF800, "ldrh%c\t%0-2r, [%3-5r, #%6-10H]"},
+ /* format 11 */
+ {ARM_EXT_V4T, 0x9000, 0xF800, "str%c\t%8-10r, [sp, #%0-7W]"},
+ {ARM_EXT_V4T, 0x9800, 0xF800, "ldr%c\t%8-10r, [sp, #%0-7W]"},
+ /* format 12 */
+ {ARM_EXT_V4T, 0xA000, 0xF800, "add%c\t%8-10r, pc, #%0-7W\t(adr %8-10r, %0-7a)"},
+ {ARM_EXT_V4T, 0xA800, 0xF800, "add%c\t%8-10r, sp, #%0-7W"},
+ /* format 15 */
+ {ARM_EXT_V4T, 0xC000, 0xF800, "stmia%c\t%8-10r!, %M"},
+ {ARM_EXT_V4T, 0xC800, 0xF800, "ldmia%c\t%8-10r!, %M"},
+ /* format 17 */
+ {ARM_EXT_V4T, 0xDF00, 0xFF00, "svc%c\t%0-7d"},
+ /* format 16 */
+ {ARM_EXT_V4T, 0xDE00, 0xFE00, "undefined"},
+ {ARM_EXT_V4T, 0xD000, 0xF000, "b%8-11c.n\t%0-7B%X"},
+ /* format 18 */
+ {ARM_EXT_V4T, 0xE000, 0xF800, "b%c.n\t%0-10B%x"},
+
+ /* The E800 .. FFFF range is unconditionally redirected to the
+ 32-bit table, because even in pre-V6T2 ISAs, BL and BLX(1) pairs
+ are processed via that table. Thus, we can never encounter a
+ bare "second half of BL/BLX(1)" instruction here. */
+ {ARM_EXT_V1, 0x0000, 0x0000, "undefined"},
+ {0, 0, 0, 0}
+};
+
+/* Thumb32 opcodes use the same table structure as the ARM opcodes.
+ We adopt the convention that hw1 is the high 16 bits of .value and
+ .mask, hw2 the low 16 bits.
+
+ print_insn_thumb32 recognizes the following format control codes:
+
+ %% %
+
+ %I print a 12-bit immediate from hw1[10],hw2[14:12,7:0]
+ %M print a modified 12-bit immediate (same location)
+ %J print a 16-bit immediate from hw1[3:0,10],hw2[14:12,7:0]
+ %K print a 16-bit immediate from hw2[3:0],hw1[3:0],hw2[11:4]
+ %S print a possibly-shifted Rm
+
+ %a print the address of a plain load/store
+ %w print the width and signedness of a core load/store
+ %m print register mask for ldm/stm
+
+ %E print the lsb and width fields of a bfc/bfi instruction
+ %F print the lsb and width fields of a sbfx/ubfx instruction
+ %b print a conditional branch offset
+ %B print an unconditional branch offset
+ %s print the shift field of an SSAT instruction
+ %R print the rotation field of an SXT instruction
+ %U print barrier type.
+ %P print address for pli instruction.
+ %c print the condition code
+ %x print warning if conditional an not at end of IT block"
+ %X print "\t; unpredictable <IT:code>" if conditional
+
+ %<bitfield>d print bitfield in decimal
+ %<bitfield>W print bitfield*4 in decimal
+ %<bitfield>r print bitfield as an ARM register
+ %<bitfield>c print bitfield as a condition code
+
+ %<bitfield>'c print specified char iff bitfield is all ones
+ %<bitfield>`c print specified char iff bitfield is all zeroes
+ %<bitfield>?ab... select from array of values in big endian order
+
+ With one exception at the bottom (done because BL and BLX(1) need
+ to come dead last), this table was machine-sorted first in
+ decreasing order of number of bits set in the mask, then in
+ increasing numeric order of mask, then in increasing numeric order
+ of opcode. This order is not the clearest for a human reader, but
+ is guaranteed never to catch a special-case bit pattern with a more
+ general mask, which is important, because this instruction encoding
+ makes heavy use of special-case bit patterns. */
+static const struct opcode32 thumb32_opcodes[] =
+{
+ /* V7 instructions. */
+ {ARM_EXT_V7, 0xf910f000, 0xff70f000, "pli%c\t%a"},
+ {ARM_EXT_V7, 0xf3af80f0, 0xfffffff0, "dbg%c\t#%0-3d"},
+ {ARM_EXT_V7, 0xf3bf8f50, 0xfffffff0, "dmb%c\t%U"},
+ {ARM_EXT_V7, 0xf3bf8f40, 0xfffffff0, "dsb%c\t%U"},
+ {ARM_EXT_V7, 0xf3bf8f60, 0xfffffff0, "isb%c\t%U"},
+ {ARM_EXT_DIV, 0xfb90f0f0, 0xfff0f0f0, "sdiv%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_DIV, 0xfbb0f0f0, 0xfff0f0f0, "udiv%c\t%8-11r, %16-19r, %0-3r"},
+
+ /* Instructions defined in the basic V6T2 set. */
+ {ARM_EXT_V6T2, 0xf3af8000, 0xffffffff, "nop%c.w"},
+ {ARM_EXT_V6T2, 0xf3af8001, 0xffffffff, "yield%c.w"},
+ {ARM_EXT_V6T2, 0xf3af8002, 0xffffffff, "wfe%c.w"},
+ {ARM_EXT_V6T2, 0xf3af8003, 0xffffffff, "wfi%c.w"},
+ {ARM_EXT_V6T2, 0xf3af9004, 0xffffffff, "sev%c.w"},
+ {ARM_EXT_V6T2, 0xf3af8000, 0xffffff00, "nop%c.w\t{%0-7d}"},
+
+ {ARM_EXT_V6T2, 0xf3bf8f2f, 0xffffffff, "clrex%c"},
+ {ARM_EXT_V6T2, 0xf3af8400, 0xffffff1f, "cpsie.w\t%7'a%6'i%5'f%X"},
+ {ARM_EXT_V6T2, 0xf3af8600, 0xffffff1f, "cpsid.w\t%7'a%6'i%5'f%X"},
+ {ARM_EXT_V6T2, 0xf3c08f00, 0xfff0ffff, "bxj%c\t%16-19r%x"},
+ {ARM_EXT_V6T2, 0xe810c000, 0xffd0ffff, "rfedb%c\t%16-19r%21'!"},
+ {ARM_EXT_V6T2, 0xe990c000, 0xffd0ffff, "rfeia%c\t%16-19r%21'!"},
+ {ARM_EXT_V6T2, 0xf3ef8000, 0xffeff000, "mrs%c\t%8-11r, %D"},
+ {ARM_EXT_V6T2, 0xf3af8100, 0xffffffe0, "cps\t#%0-4d%X"},
+ {ARM_EXT_V6T2, 0xe8d0f000, 0xfff0fff0, "tbb%c\t[%16-19r, %0-3r]%x"},
+ {ARM_EXT_V6T2, 0xe8d0f010, 0xfff0fff0, "tbh%c\t[%16-19r, %0-3r, lsl #1]%x"},
+ {ARM_EXT_V6T2, 0xf3af8500, 0xffffff00, "cpsie\t%7'a%6'i%5'f, #%0-4d%X"},
+ {ARM_EXT_V6T2, 0xf3af8700, 0xffffff00, "cpsid\t%7'a%6'i%5'f, #%0-4d%X"},
+ {ARM_EXT_V6T2, 0xf3de8f00, 0xffffff00, "subs%c\tpc, lr, #%0-7d"},
+ {ARM_EXT_V6T2, 0xf3808000, 0xffe0f000, "msr%c\t%C, %16-19r"},
+ {ARM_EXT_V6T2, 0xe8500f00, 0xfff00fff, "ldrex%c\t%12-15r, [%16-19r]"},
+ {ARM_EXT_V6T2, 0xe8d00f4f, 0xfff00fef, "ldrex%4?hb%c\t%12-15r, [%16-19r]"},
+ {ARM_EXT_V6T2, 0xe800c000, 0xffd0ffe0, "srsdb%c\t%16-19r%21'!, #%0-4d"},
+ {ARM_EXT_V6T2, 0xe980c000, 0xffd0ffe0, "srsia%c\t%16-19r%21'!, #%0-4d"},
+ {ARM_EXT_V6T2, 0xfa0ff080, 0xfffff0c0, "sxth%c.w\t%8-11r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa1ff080, 0xfffff0c0, "uxth%c.w\t%8-11r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa2ff080, 0xfffff0c0, "sxtb16%c\t%8-11r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa3ff080, 0xfffff0c0, "uxtb16%c\t%8-11r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa4ff080, 0xfffff0c0, "sxtb%c.w\t%8-11r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa5ff080, 0xfffff0c0, "uxtb%c.w\t%8-11r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xe8400000, 0xfff000ff, "strex%c\t%8-11r, %12-15r, [%16-19r]"},
+ {ARM_EXT_V6T2, 0xe8d0007f, 0xfff000ff, "ldrexd%c\t%12-15r, %8-11r, [%16-19r]"},
+ {ARM_EXT_V6T2, 0xfa80f000, 0xfff0f0f0, "sadd8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa80f010, 0xfff0f0f0, "qadd8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa80f020, 0xfff0f0f0, "shadd8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa80f040, 0xfff0f0f0, "uadd8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa80f050, 0xfff0f0f0, "uqadd8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa80f060, 0xfff0f0f0, "uhadd8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa80f080, 0xfff0f0f0, "qadd%c\t%8-11r, %0-3r, %16-19r"},
+ {ARM_EXT_V6T2, 0xfa80f090, 0xfff0f0f0, "qdadd%c\t%8-11r, %0-3r, %16-19r"},
+ {ARM_EXT_V6T2, 0xfa80f0a0, 0xfff0f0f0, "qsub%c\t%8-11r, %0-3r, %16-19r"},
+ {ARM_EXT_V6T2, 0xfa80f0b0, 0xfff0f0f0, "qdsub%c\t%8-11r, %0-3r, %16-19r"},
+ {ARM_EXT_V6T2, 0xfa90f000, 0xfff0f0f0, "sadd16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa90f010, 0xfff0f0f0, "qadd16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa90f020, 0xfff0f0f0, "shadd16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa90f040, 0xfff0f0f0, "uadd16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa90f050, 0xfff0f0f0, "uqadd16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa90f060, 0xfff0f0f0, "uhadd16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa90f080, 0xfff0f0f0, "rev%c.w\t%8-11r, %16-19r"},
+ {ARM_EXT_V6T2, 0xfa90f090, 0xfff0f0f0, "rev16%c.w\t%8-11r, %16-19r"},
+ {ARM_EXT_V6T2, 0xfa90f0a0, 0xfff0f0f0, "rbit%c\t%8-11r, %16-19r"},
+ {ARM_EXT_V6T2, 0xfa90f0b0, 0xfff0f0f0, "revsh%c.w\t%8-11r, %16-19r"},
+ {ARM_EXT_V6T2, 0xfaa0f000, 0xfff0f0f0, "saddsubx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfaa0f010, 0xfff0f0f0, "qaddsubx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfaa0f020, 0xfff0f0f0, "shaddsubx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfaa0f040, 0xfff0f0f0, "uaddsubx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfaa0f050, 0xfff0f0f0, "uqaddsubx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfaa0f060, 0xfff0f0f0, "uhaddsubx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfaa0f080, 0xfff0f0f0, "sel%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfab0f080, 0xfff0f0f0, "clz%c\t%8-11r, %16-19r"},
+ {ARM_EXT_V6T2, 0xfac0f000, 0xfff0f0f0, "ssub8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfac0f010, 0xfff0f0f0, "qsub8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfac0f020, 0xfff0f0f0, "shsub8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfac0f040, 0xfff0f0f0, "usub8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfac0f050, 0xfff0f0f0, "uqsub8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfac0f060, 0xfff0f0f0, "uhsub8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfad0f000, 0xfff0f0f0, "ssub16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfad0f010, 0xfff0f0f0, "qsub16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfad0f020, 0xfff0f0f0, "shsub16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfad0f040, 0xfff0f0f0, "usub16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfad0f050, 0xfff0f0f0, "uqsub16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfad0f060, 0xfff0f0f0, "uhsub16%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfae0f000, 0xfff0f0f0, "ssubaddx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfae0f010, 0xfff0f0f0, "qsubaddx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfae0f020, 0xfff0f0f0, "shsubaddx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfae0f040, 0xfff0f0f0, "usubaddx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfae0f050, 0xfff0f0f0, "uqsubaddx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfae0f060, 0xfff0f0f0, "uhsubaddx%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfb00f000, 0xfff0f0f0, "mul%c.w\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfb70f000, 0xfff0f0f0, "usad8%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa00f000, 0xffe0f0f0, "lsl%20's%c.w\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa20f000, 0xffe0f0f0, "lsr%20's%c.w\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa40f000, 0xffe0f0f0, "asr%20's%c.w\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa60f000, 0xffe0f0f0, "ror%20's%c.w\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xe8c00f40, 0xfff00fe0, "strex%4?hb%c\t%0-3r, %12-15r, [%16-19r]"},
+ {ARM_EXT_V6T2, 0xf3200000, 0xfff0f0e0, "ssat16%c\t%8-11r, #%0-4d, %16-19r"},
+ {ARM_EXT_V6T2, 0xf3a00000, 0xfff0f0e0, "usat16%c\t%8-11r, #%0-4d, %16-19r"},
+ {ARM_EXT_V6T2, 0xfb20f000, 0xfff0f0e0, "smuad%4'x%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfb30f000, 0xfff0f0e0, "smulw%4?tb%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfb40f000, 0xfff0f0e0, "smusd%4'x%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfb50f000, 0xfff0f0e0, "smmul%4'r%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfa00f080, 0xfff0f0c0, "sxtah%c\t%8-11r, %16-19r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa10f080, 0xfff0f0c0, "uxtah%c\t%8-11r, %16-19r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa20f080, 0xfff0f0c0, "sxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa30f080, 0xfff0f0c0, "uxtab16%c\t%8-11r, %16-19r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa40f080, 0xfff0f0c0, "sxtab%c\t%8-11r, %16-19r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfa50f080, 0xfff0f0c0, "uxtab%c\t%8-11r, %16-19r, %0-3r%R"},
+ {ARM_EXT_V6T2, 0xfb10f000, 0xfff0f0c0, "smul%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xf36f0000, 0xffff8020, "bfc%c\t%8-11r, %E"},
+ {ARM_EXT_V6T2, 0xea100f00, 0xfff08f00, "tst%c.w\t%16-19r, %S"},
+ {ARM_EXT_V6T2, 0xea900f00, 0xfff08f00, "teq%c\t%16-19r, %S"},
+ {ARM_EXT_V6T2, 0xeb100f00, 0xfff08f00, "cmn%c.w\t%16-19r, %S"},
+ {ARM_EXT_V6T2, 0xebb00f00, 0xfff08f00, "cmp%c.w\t%16-19r, %S"},
+ {ARM_EXT_V6T2, 0xf0100f00, 0xfbf08f00, "tst%c.w\t%16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf0900f00, 0xfbf08f00, "teq%c\t%16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf1100f00, 0xfbf08f00, "cmn%c.w\t%16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf1b00f00, 0xfbf08f00, "cmp%c.w\t%16-19r, %M"},
+ {ARM_EXT_V6T2, 0xea4f0000, 0xffef8000, "mov%20's%c.w\t%8-11r, %S"},
+ {ARM_EXT_V6T2, 0xea6f0000, 0xffef8000, "mvn%20's%c.w\t%8-11r, %S"},
+ {ARM_EXT_V6T2, 0xe8c00070, 0xfff000f0, "strexd%c\t%0-3r, %12-15r, %8-11r, [%16-19r]"},
+ {ARM_EXT_V6T2, 0xfb000000, 0xfff000f0, "mla%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
+ {ARM_EXT_V6T2, 0xfb000010, 0xfff000f0, "mls%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
+ {ARM_EXT_V6T2, 0xfb700000, 0xfff000f0, "usada8%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
+ {ARM_EXT_V6T2, 0xfb800000, 0xfff000f0, "smull%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfba00000, 0xfff000f0, "umull%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfbc00000, 0xfff000f0, "smlal%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfbe00000, 0xfff000f0, "umlal%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfbe00060, 0xfff000f0, "umaal%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xe8500f00, 0xfff00f00, "ldrex%c\t%12-15r, [%16-19r, #%0-7W]"},
+ {ARM_EXT_V6T2, 0xf7f08000, 0xfff0f000, "smc%c\t%K"},
+ {ARM_EXT_V6T2, 0xf04f0000, 0xfbef8000, "mov%20's%c.w\t%8-11r, %M"},
+ {ARM_EXT_V6T2, 0xf06f0000, 0xfbef8000, "mvn%20's%c.w\t%8-11r, %M"},
+ {ARM_EXT_V6T2, 0xf810f000, 0xff70f000, "pld%c\t%a"},
+ {ARM_EXT_V6T2, 0xfb200000, 0xfff000e0, "smlad%4'x%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
+ {ARM_EXT_V6T2, 0xfb300000, 0xfff000e0, "smlaw%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
+ {ARM_EXT_V6T2, 0xfb400000, 0xfff000e0, "smlsd%4'x%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
+ {ARM_EXT_V6T2, 0xfb500000, 0xfff000e0, "smmla%4'r%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
+ {ARM_EXT_V6T2, 0xfb600000, 0xfff000e0, "smmls%4'r%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
+ {ARM_EXT_V6T2, 0xfbc000c0, 0xfff000e0, "smlald%4'x%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xfbd000c0, 0xfff000e0, "smlsld%4'x%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xeac00000, 0xfff08030, "pkhbt%c\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xeac00020, 0xfff08030, "pkhtb%c\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xf3400000, 0xfff08020, "sbfx%c\t%8-11r, %16-19r, %F"},
+ {ARM_EXT_V6T2, 0xf3c00000, 0xfff08020, "ubfx%c\t%8-11r, %16-19r, %F"},
+ {ARM_EXT_V6T2, 0xf8000e00, 0xff900f00, "str%wt%c\t%12-15r, %a"},
+ {ARM_EXT_V6T2, 0xfb100000, 0xfff000c0, "smla%5?tb%4?tb%c\t%8-11r, %16-19r, %0-3r, %12-15r"},
+ {ARM_EXT_V6T2, 0xfbc00080, 0xfff000c0, "smlal%5?tb%4?tb%c\t%12-15r, %8-11r, %16-19r, %0-3r"},
+ {ARM_EXT_V6T2, 0xf3600000, 0xfff08020, "bfi%c\t%8-11r, %16-19r, %E"},
+ {ARM_EXT_V6T2, 0xf8100e00, 0xfe900f00, "ldr%wt%c\t%12-15r, %a"},
+ {ARM_EXT_V6T2, 0xf3000000, 0xffd08020, "ssat%c\t%8-11r, #%0-4d, %16-19r%s"},
+ {ARM_EXT_V6T2, 0xf3800000, 0xffd08020, "usat%c\t%8-11r, #%0-4d, %16-19r%s"},
+ {ARM_EXT_V6T2, 0xf2000000, 0xfbf08000, "addw%c\t%8-11r, %16-19r, %I"},
+ {ARM_EXT_V6T2, 0xf2400000, 0xfbf08000, "movw%c\t%8-11r, %J"},
+ {ARM_EXT_V6T2, 0xf2a00000, 0xfbf08000, "subw%c\t%8-11r, %16-19r, %I"},
+ {ARM_EXT_V6T2, 0xf2c00000, 0xfbf08000, "movt%c\t%8-11r, %J"},
+ {ARM_EXT_V6T2, 0xea000000, 0xffe08000, "and%20's%c.w\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xea200000, 0xffe08000, "bic%20's%c.w\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xea400000, 0xffe08000, "orr%20's%c.w\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xea600000, 0xffe08000, "orn%20's%c\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xea800000, 0xffe08000, "eor%20's%c.w\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xeb000000, 0xffe08000, "add%20's%c.w\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xeb400000, 0xffe08000, "adc%20's%c.w\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xeb600000, 0xffe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xeba00000, 0xffe08000, "sub%20's%c.w\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xebc00000, 0xffe08000, "rsb%20's%c\t%8-11r, %16-19r, %S"},
+ {ARM_EXT_V6T2, 0xe8400000, 0xfff00000, "strex%c\t%8-11r, %12-15r, [%16-19r, #%0-7W]"},
+ {ARM_EXT_V6T2, 0xf0000000, 0xfbe08000, "and%20's%c.w\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf0200000, 0xfbe08000, "bic%20's%c.w\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf0400000, 0xfbe08000, "orr%20's%c.w\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf0600000, 0xfbe08000, "orn%20's%c\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf0800000, 0xfbe08000, "eor%20's%c.w\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf1000000, 0xfbe08000, "add%20's%c.w\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf1400000, 0xfbe08000, "adc%20's%c.w\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf1600000, 0xfbe08000, "sbc%20's%c.w\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf1a00000, 0xfbe08000, "sub%20's%c.w\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xf1c00000, 0xfbe08000, "rsb%20's%c\t%8-11r, %16-19r, %M"},
+ {ARM_EXT_V6T2, 0xe8800000, 0xffd00000, "stmia%c.w\t%16-19r%21'!, %m"},
+ {ARM_EXT_V6T2, 0xe8900000, 0xffd00000, "ldmia%c.w\t%16-19r%21'!, %m"},
+ {ARM_EXT_V6T2, 0xe9000000, 0xffd00000, "stmdb%c\t%16-19r%21'!, %m"},
+ {ARM_EXT_V6T2, 0xe9100000, 0xffd00000, "ldmdb%c\t%16-19r%21'!, %m"},
+ {ARM_EXT_V6T2, 0xe9c00000, 0xffd000ff, "strd%c\t%12-15r, %8-11r, [%16-19r]"},
+ {ARM_EXT_V6T2, 0xe9d00000, 0xffd000ff, "ldrd%c\t%12-15r, %8-11r, [%16-19r]"},
+ {ARM_EXT_V6T2, 0xe9400000, 0xff500000, "strd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!"},
+ {ARM_EXT_V6T2, 0xe9500000, 0xff500000, "ldrd%c\t%12-15r, %8-11r, [%16-19r, #%23`-%0-7W]%21'!"},
+ {ARM_EXT_V6T2, 0xe8600000, 0xff700000, "strd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W"},
+ {ARM_EXT_V6T2, 0xe8700000, 0xff700000, "ldrd%c\t%12-15r, %8-11r, [%16-19r], #%23`-%0-7W"},
+ {ARM_EXT_V6T2, 0xf8000000, 0xff100000, "str%w%c.w\t%12-15r, %a"},
+ {ARM_EXT_V6T2, 0xf8100000, 0xfe100000, "ldr%w%c.w\t%12-15r, %a"},
+
+ /* Filter out Bcc with cond=E or F, which are used for other instructions. */
+ {ARM_EXT_V6T2, 0xf3c08000, 0xfbc0d000, "undefined (bcc, cond=0xF)"},
+ {ARM_EXT_V6T2, 0xf3808000, 0xfbc0d000, "undefined (bcc, cond=0xE)"},
+ {ARM_EXT_V6T2, 0xf0008000, 0xf800d000, "b%22-25c.w\t%b%X"},
+ {ARM_EXT_V6T2, 0xf0009000, 0xf800d000, "b%c.w\t%B%x"},
+
+ /* These have been 32-bit since the invention of Thumb. */
+ {ARM_EXT_V4T, 0xf000c000, 0xf800d000, "blx%c\t%B%x"},
+ {ARM_EXT_V4T, 0xf000d000, 0xf800d000, "bl%c\t%B%x"},
+
+ /* Fallback. */
+ {ARM_EXT_V1, 0x00000000, 0x00000000, "undefined"},
+ {0, 0, 0, 0}
+};
+
+static const char *const arm_conditional[] =
+{"eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
+ "hi", "ls", "ge", "lt", "gt", "le", "al", "<und>", ""};
+
+static const char *const arm_fp_const[] =
+{"0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0"};
+
+static const char *const arm_shift[] =
+{"lsl", "lsr", "asr", "ror"};
+
+typedef struct
+{
+ const char *name;
+ const char *description;
+ const char *reg_names[16];
+}
+arm_regname;
+
+static const arm_regname regnames[] =
+{
+ { "raw" , "Select raw register names",
+ { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"}},
+ { "gcc", "Select register names used by GCC",
+ { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "sl", "fp", "ip", "sp", "lr", "pc" }},
+ { "std", "Select register names used in ARM's ISA documentation",
+ { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc" }},
+ { "apcs", "Select register names used in the APCS",
+ { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "sl", "fp", "ip", "sp", "lr", "pc" }},
+ { "atpcs", "Select register names used in the ATPCS",
+ { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "IP", "SP", "LR", "PC" }},
+ { "special-atpcs", "Select special register names used in the ATPCS",
+ { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL", "FP", "IP", "SP", "LR", "PC" }},
+};
+
+static const char *const iwmmxt_wwnames[] =
+{"b", "h", "w", "d"};
+
+static const char *const iwmmxt_wwssnames[] =
+{"b", "bus", "bc", "bss",
+ "h", "hus", "hc", "hss",
+ "w", "wus", "wc", "wss",
+ "d", "dus", "dc", "dss"
+};
+
+static const char *const iwmmxt_regnames[] =
+{ "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7",
+ "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"
+};
+
+static const char *const iwmmxt_cregnames[] =
+{ "wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved",
+ "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"
+};
+
+/* Default to GCC register name set. */
+static unsigned int regname_selected = 1;
+
+#define NUM_ARM_REGNAMES NUM_ELEM (regnames)
+#define arm_regnames regnames[regname_selected].reg_names
+
+static bfd_boolean force_thumb = false;
+
+/* Current IT instruction state. This contains the same state as the IT
+ bits in the CPSR. */
+static unsigned int ifthen_state;
+/* IT state for the next instruction. */
+static unsigned int ifthen_next_state;
+/* The address of the insn for which the IT state is valid. */
+static bfd_vma ifthen_address;
+#define IFTHEN_COND ((ifthen_state >> 4) & 0xf)
+
+/* Cached mapping symbol state. */
+enum map_type {
+ MAP_ARM,
+ MAP_THUMB,
+ MAP_DATA
+};
+
+enum map_type last_type;
+int last_mapping_sym = -1;
+bfd_vma last_mapping_addr = 0;
+
+/* Decode a bitfield of the form matching regexp (N(-N)?,)*N(-N)?.
+ Returns pointer to following character of the format string and
+ fills in *VALUEP and *WIDTHP with the extracted value and number of
+ bits extracted. WIDTHP can be NULL. */
+
+static const char *
+arm_decode_bitfield (const char *ptr, unsigned long insn,
+ unsigned long *valuep, int *widthp)
+{
+ unsigned long value = 0;
+ int width = 0;
+
+ do
+ {
+ int start, end;
+ int bits;
+
+ for (start = 0; *ptr >= '0' && *ptr <= '9'; ptr++)
+ start = start * 10 + *ptr - '0';
+ if (*ptr == '-')
+ for (end = 0, ptr++; *ptr >= '0' && *ptr <= '9'; ptr++)
+ end = end * 10 + *ptr - '0';
+ else
+ end = start;
+ bits = end - start;
+ if (bits < 0)
+ abort ();
+ value |= ((insn >> start) & ((2ul << bits) - 1)) << width;
+ width += bits + 1;
+ }
+ while (*ptr++ == ',');
+ *valuep = value;
+ if (widthp)
+ *widthp = width;
+ return ptr - 1;
+}
+
+static void
+arm_decode_shift (long given, fprintf_function func, void *stream,
+ int print_shift)
+{
+ func (stream, "%s", arm_regnames[given & 0xf]);
+
+ if ((given & 0xff0) != 0)
+ {
+ if ((given & 0x10) == 0)
+ {
+ int amount = (given & 0xf80) >> 7;
+ int shift = (given & 0x60) >> 5;
+
+ if (amount == 0)
+ {
+ if (shift == 3)
+ {
+ func (stream, ", rrx");
+ return;
+ }
+
+ amount = 32;
+ }
+
+ if (print_shift)
+ func (stream, ", %s #%d", arm_shift[shift], amount);
+ else
+ func (stream, ", #%d", amount);
+ }
+ else if (print_shift)
+ func (stream, ", %s %s", arm_shift[(given & 0x60) >> 5],
+ arm_regnames[(given & 0xf00) >> 8]);
+ else
+ func (stream, ", %s", arm_regnames[(given & 0xf00) >> 8]);
+ }
+}
+
+/* Print one coprocessor instruction on INFO->STREAM.
+ Return true if the instuction matched, false if this is not a
+ recognised coprocessor instruction. */
+
+static bfd_boolean
+print_insn_coprocessor (bfd_vma pc, struct disassemble_info *info, long given,
+ bfd_boolean thumb)
+{
+ const struct opcode32 *insn;
+ void *stream = info->stream;
+ fprintf_function func = info->fprintf_func;
+ unsigned long mask;
+ unsigned long value;
+ int cond;
+
+ for (insn = coprocessor_opcodes; insn->assembler; insn++)
+ {
+ if (insn->value == FIRST_IWMMXT_INSN
+ && info->mach != bfd_mach_arm_XScale
+ && info->mach != bfd_mach_arm_iWMMXt
+ && info->mach != bfd_mach_arm_iWMMXt2)
+ insn = insn + IWMMXT_INSN_COUNT;
+
+ mask = insn->mask;
+ value = insn->value;
+ if (thumb)
+ {
+ /* The high 4 bits are 0xe for Arm conditional instructions, and
+ 0xe for arm unconditional instructions. The rest of the
+ encoding is the same. */
+ mask |= 0xf0000000;
+ value |= 0xe0000000;
+ if (ifthen_state)
+ cond = IFTHEN_COND;
+ else
+ cond = 16;
+ }
+ else
+ {
+ /* Only match unconditional instuctions against unconditional
+ patterns. */
+ if ((given & 0xf0000000) == 0xf0000000)
+ {
+ mask |= 0xf0000000;
+ cond = 16;
+ }
+ else
+ {
+ cond = (given >> 28) & 0xf;
+ if (cond == 0xe)
+ cond = 16;
+ }
+ }
+ if ((given & mask) == value)
+ {
+ const char *c;
+
+ for (c = insn->assembler; *c; c++)
+ {
+ if (*c == '%')
+ {
+ switch (*++c)
+ {
+ case '%':
+ func (stream, "%%");
+ break;
+
+ case 'A':
+ func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
+
+ if ((given & (1 << 24)) != 0)
+ {
+ int offset = given & 0xff;
+
+ if (offset)
+ func (stream, ", #%s%d]%s",
+ ((given & 0x00800000) == 0 ? "-" : ""),
+ offset * 4,
+ ((given & 0x00200000) != 0 ? "!" : ""));
+ else
+ func (stream, "]");
+ }
+ else
+ {
+ int offset = given & 0xff;
+
+ func (stream, "]");
+
+ if (given & (1 << 21))
+ {
+ if (offset)
+ func (stream, ", #%s%d",
+ ((given & 0x00800000) == 0 ? "-" : ""),
+ offset * 4);
+ }
+ else
+ func (stream, ", {%d}", offset);
+ }
+ break;
+
+ case 'B':
+ {
+ int regno = ((given >> 12) & 0xf) | ((given >> (22 - 4)) & 0x10);
+ int offset = (given >> 1) & 0x3f;
+
+ if (offset == 1)
+ func (stream, "{d%d}", regno);
+ else if (regno + offset > 32)
+ func (stream, "{d%d-<overflow reg d%d>}", regno, regno + offset - 1);
+ else
+ func (stream, "{d%d-d%d}", regno, regno + offset - 1);
+ }
+ break;
+
+ case 'C':
+ {
+ int rn = (given >> 16) & 0xf;
+ int offset = (given & 0xff) * 4;
+ int add = (given >> 23) & 1;
+
+ func (stream, "[%s", arm_regnames[rn]);
+
+ if (offset)
+ {
+ if (!add)
+ offset = -offset;
+ func (stream, ", #%d", offset);
+ }
+ func (stream, "]");
+ if (rn == 15)
+ {
+ func (stream, "\t; ");
+ /* FIXME: Unsure if info->bytes_per_chunk is the
+ right thing to use here. */
+ info->print_address_func (offset + pc
+ + info->bytes_per_chunk * 2, info);
+ }
+ }
+ break;
+
+ case 'c':
+ func (stream, "%s", arm_conditional[cond]);
+ break;
+
+ case 'I':
+ /* Print a Cirrus/DSP shift immediate. */
+ /* Immediates are 7bit signed ints with bits 0..3 in
+ bits 0..3 of opcode and bits 4..6 in bits 5..7
+ of opcode. */
+ {
+ int imm;
+
+ imm = (given & 0xf) | ((given & 0xe0) >> 1);
+
+ /* Is ``imm'' a negative number? */
+ if (imm & 0x40)
+ imm |= (-1 << 7);
+
+ func (stream, "%d", imm);
+ }
+
+ break;
+
+ case 'F':
+ switch (given & 0x00408000)
+ {
+ case 0:
+ func (stream, "4");
+ break;
+ case 0x8000:
+ func (stream, "1");
+ break;
+ case 0x00400000:
+ func (stream, "2");
+ break;
+ default:
+ func (stream, "3");
+ }
+ break;
+
+ case 'P':
+ switch (given & 0x00080080)
+ {
+ case 0:
+ func (stream, "s");
+ break;
+ case 0x80:
+ func (stream, "d");
+ break;
+ case 0x00080000:
+ func (stream, "e");
+ break;
+ default:
+ func (stream, _("<illegal precision>"));
+ break;
+ }
+ break;
+ case 'Q':
+ switch (given & 0x00408000)
+ {
+ case 0:
+ func (stream, "s");
+ break;
+ case 0x8000:
+ func (stream, "d");
+ break;
+ case 0x00400000:
+ func (stream, "e");
+ break;
+ default:
+ func (stream, "p");
+ break;
+ }
+ break;
+ case 'R':
+ switch (given & 0x60)
+ {
+ case 0:
+ break;
+ case 0x20:
+ func (stream, "p");
+ break;
+ case 0x40:
+ func (stream, "m");
+ break;
+ default:
+ func (stream, "z");
+ break;
+ }
+ break;
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ int width;
+ unsigned long value;
+
+ c = arm_decode_bitfield (c, given, &value, &width);
+
+ switch (*c)
+ {
+ case 'r':
+ func (stream, "%s", arm_regnames[value]);
+ break;
+ case 'D':
+ func (stream, "d%ld", value);
+ break;
+ case 'Q':
+ if (value & 1)
+ func (stream, "<illegal reg q%ld.5>", value >> 1);
+ else
+ func (stream, "q%ld", value >> 1);
+ break;
+ case 'd':
+ func (stream, "%ld", value);
+ break;
+ case 'k':
+ {
+ int from = (given & (1 << 7)) ? 32 : 16;
+ func (stream, "%ld", from - value);
+ }
+ break;
+
+ case 'f':
+ if (value > 7)
+ func (stream, "#%s", arm_fp_const[value & 7]);
+ else
+ func (stream, "f%ld", value);
+ break;
+
+ case 'w':
+ if (width == 2)
+ func (stream, "%s", iwmmxt_wwnames[value]);
+ else
+ func (stream, "%s", iwmmxt_wwssnames[value]);
+ break;
+
+ case 'g':
+ func (stream, "%s", iwmmxt_regnames[value]);
+ break;
+ case 'G':
+ func (stream, "%s", iwmmxt_cregnames[value]);
+ break;
+
+ case 'x':
+ func (stream, "0x%lx", value);
+ break;
+
+ case '`':
+ c++;
+ if (value == 0)
+ func (stream, "%c", *c);
+ break;
+ case '\'':
+ c++;
+ if (value == ((1ul << width) - 1))
+ func (stream, "%c", *c);
+ break;
+ case '?':
+ func (stream, "%c", c[(1 << width) - (int)value]);
+ c += 1 << width;
+ break;
+ default:
+ abort ();
+ }
+ break;
+
+ case 'y':
+ case 'z':
+ {
+ int single = *c++ == 'y';
+ int regno;
+
+ switch (*c)
+ {
+ case '4': /* Sm pair */
+ func (stream, "{");
+ /* Fall through. */
+ case '0': /* Sm, Dm */
+ regno = given & 0x0000000f;
+ if (single)
+ {
+ regno <<= 1;
+ regno += (given >> 5) & 1;
+ }
+ else
+ regno += ((given >> 5) & 1) << 4;
+ break;
+
+ case '1': /* Sd, Dd */
+ regno = (given >> 12) & 0x0000000f;
+ if (single)
+ {
+ regno <<= 1;
+ regno += (given >> 22) & 1;
+ }
+ else
+ regno += ((given >> 22) & 1) << 4;
+ break;
+
+ case '2': /* Sn, Dn */
+ regno = (given >> 16) & 0x0000000f;
+ if (single)
+ {
+ regno <<= 1;
+ regno += (given >> 7) & 1;
+ }
+ else
+ regno += ((given >> 7) & 1) << 4;
+ break;
+
+ case '3': /* List */
+ func (stream, "{");
+ regno = (given >> 12) & 0x0000000f;
+ if (single)
+ {
+ regno <<= 1;
+ regno += (given >> 22) & 1;
+ }
+ else
+ regno += ((given >> 22) & 1) << 4;
+ break;
+
+ default:
+ abort ();
+ }
+
+ func (stream, "%c%d", single ? 's' : 'd', regno);
+
+ if (*c == '3')
+ {
+ int count = given & 0xff;
+
+ if (single == 0)
+ count >>= 1;
+
+ if (--count)
+ {
+ func (stream, "-%c%d",
+ single ? 's' : 'd',
+ regno + count);
+ }
+
+ func (stream, "}");
+ }
+ else if (*c == '4')
+ func (stream, ", %c%d}", single ? 's' : 'd',
+ regno + 1);
+ }
+ break;
+
+ case 'L':
+ switch (given & 0x00400100)
+ {
+ case 0x00000000: func (stream, "b"); break;
+ case 0x00400000: func (stream, "h"); break;
+ case 0x00000100: func (stream, "w"); break;
+ case 0x00400100: func (stream, "d"); break;
+ default:
+ break;
+ }
+ break;
+
+ case 'Z':
+ {
+ int value;
+ /* given (20, 23) | given (0, 3) */
+ value = ((given >> 16) & 0xf0) | (given & 0xf);
+ func (stream, "%d", value);
+ }
+ break;
+
+ case 'l':
+ /* This is like the 'A' operator, except that if
+ the width field "M" is zero, then the offset is
+ *not* multiplied by four. */
+ {
+ int offset = given & 0xff;
+ int multiplier = (given & 0x00000100) ? 4 : 1;
+
+ func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
+
+ if (offset)
+ {
+ if ((given & 0x01000000) != 0)
+ func (stream, ", #%s%d]%s",
+ ((given & 0x00800000) == 0 ? "-" : ""),
+ offset * multiplier,
+ ((given & 0x00200000) != 0 ? "!" : ""));
+ else
+ func (stream, "], #%s%d",
+ ((given & 0x00800000) == 0 ? "-" : ""),
+ offset * multiplier);
+ }
+ else
+ func (stream, "]");
+ }
+ break;
+
+ case 'r':
+ {
+ int imm4 = (given >> 4) & 0xf;
+ int puw_bits = ((given >> 22) & 6) | ((given >> 21) & 1);
+ int ubit = (given >> 23) & 1;
+ const char *rm = arm_regnames [given & 0xf];
+ const char *rn = arm_regnames [(given >> 16) & 0xf];
+
+ switch (puw_bits)
+ {
+ case 1:
+ /* fall through */
+ case 3:
+ func (stream, "[%s], %c%s", rn, ubit ? '+' : '-', rm);
+ if (imm4)
+ func (stream, ", lsl #%d", imm4);
+ break;
+
+ case 4:
+ /* fall through */
+ case 5:
+ /* fall through */
+ case 6:
+ /* fall through */
+ case 7:
+ func (stream, "[%s, %c%s", rn, ubit ? '+' : '-', rm);
+ if (imm4 > 0)
+ func (stream, ", lsl #%d", imm4);
+ func (stream, "]");
+ if (puw_bits == 5 || puw_bits == 7)
+ func (stream, "!");
+ break;
+
+ default:
+ func (stream, "INVALID");
+ }
+ }
+ break;
+
+ case 'i':
+ {
+ long imm5;
+ imm5 = ((given & 0x100) >> 4) | (given & 0xf);
+ func (stream, "%ld", (imm5 == 0) ? 32 : imm5);
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ }
+ else
+ func (stream, "%c", *c);
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+static void
+print_arm_address (bfd_vma pc, struct disassemble_info *info, long given)
+{
+ void *stream = info->stream;
+ fprintf_function func = info->fprintf_func;
+
+ if (((given & 0x000f0000) == 0x000f0000)
+ && ((given & 0x02000000) == 0))
+ {
+ int offset = given & 0xfff;
+
+ func (stream, "[pc");
+
+ if (given & 0x01000000)
+ {
+ if ((given & 0x00800000) == 0)
+ offset = - offset;
+
+ /* Pre-indexed. */
+ func (stream, ", #%d]", offset);
+
+ offset += pc + 8;
+
+ /* Cope with the possibility of write-back
+ being used. Probably a very dangerous thing
+ for the programmer to do, but who are we to
+ argue ? */
+ if (given & 0x00200000)
+ func (stream, "!");
+ }
+ else
+ {
+ /* Post indexed. */
+ func (stream, "], #%d", offset);
+
+ /* ie ignore the offset. */
+ offset = pc + 8;
+ }
+
+ func (stream, "\t; ");
+ info->print_address_func (offset, info);
+ }
+ else
+ {
+ func (stream, "[%s",
+ arm_regnames[(given >> 16) & 0xf]);
+ if ((given & 0x01000000) != 0)
+ {
+ if ((given & 0x02000000) == 0)
+ {
+ int offset = given & 0xfff;
+ if (offset)
+ func (stream, ", #%s%d",
+ (((given & 0x00800000) == 0)
+ ? "-" : ""), offset);
+ }
+ else
+ {
+ func (stream, ", %s",
+ (((given & 0x00800000) == 0)
+ ? "-" : ""));
+ arm_decode_shift (given, func, stream, 1);
+ }
+
+ func (stream, "]%s",
+ ((given & 0x00200000) != 0) ? "!" : "");
+ }
+ else
+ {
+ if ((given & 0x02000000) == 0)
+ {
+ int offset = given & 0xfff;
+ if (offset)
+ func (stream, "], #%s%d",
+ (((given & 0x00800000) == 0)
+ ? "-" : ""), offset);
+ else
+ func (stream, "]");
+ }
+ else
+ {
+ func (stream, "], %s",
+ (((given & 0x00800000) == 0)
+ ? "-" : ""));
+ arm_decode_shift (given, func, stream, 1);
+ }
+ }
+ }
+}
+
+/* Print one neon instruction on INFO->STREAM.
+ Return true if the instuction matched, false if this is not a
+ recognised neon instruction. */
+
+static bfd_boolean
+print_insn_neon (struct disassemble_info *info, long given, bfd_boolean thumb)
+{
+ const struct opcode32 *insn;
+ void *stream = info->stream;
+ fprintf_function func = info->fprintf_func;
+
+ if (thumb)
+ {
+ if ((given & 0xef000000) == 0xef000000)
+ {
+ /* move bit 28 to bit 24 to translate Thumb2 to ARM encoding. */
+ unsigned long bit28 = given & (1 << 28);
+
+ given &= 0x00ffffff;
+ if (bit28)
+ given |= 0xf3000000;
+ else
+ given |= 0xf2000000;
+ }
+ else if ((given & 0xff000000) == 0xf9000000)
+ given ^= 0xf9000000 ^ 0xf4000000;
+ else
+ return false;
+ }
+
+ for (insn = neon_opcodes; insn->assembler; insn++)
+ {
+ if ((given & insn->mask) == insn->value)
+ {
+ const char *c;
+
+ for (c = insn->assembler; *c; c++)
+ {
+ if (*c == '%')
+ {
+ switch (*++c)
+ {
+ case '%':
+ func (stream, "%%");
+ break;
+
+ case 'c':
+ if (thumb && ifthen_state)
+ func (stream, "%s", arm_conditional[IFTHEN_COND]);
+ break;
+
+ case 'A':
+ {
+ static const unsigned char enc[16] =
+ {
+ 0x4, 0x14, /* st4 0,1 */
+ 0x4, /* st1 2 */
+ 0x4, /* st2 3 */
+ 0x3, /* st3 4 */
+ 0x13, /* st3 5 */
+ 0x3, /* st1 6 */
+ 0x1, /* st1 7 */
+ 0x2, /* st2 8 */
+ 0x12, /* st2 9 */
+ 0x2, /* st1 10 */
+ 0, 0, 0, 0, 0
+ };
+ int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
+ int rn = ((given >> 16) & 0xf);
+ int rm = ((given >> 0) & 0xf);
+ int align = ((given >> 4) & 0x3);
+ int type = ((given >> 8) & 0xf);
+ int n = enc[type] & 0xf;
+ int stride = (enc[type] >> 4) + 1;
+ int ix;
+
+ func (stream, "{");
+ if (stride > 1)
+ for (ix = 0; ix != n; ix++)
+ func (stream, "%sd%d", ix ? "," : "", rd + ix * stride);
+ else if (n == 1)
+ func (stream, "d%d", rd);
+ else
+ func (stream, "d%d-d%d", rd, rd + n - 1);
+ func (stream, "}, [%s", arm_regnames[rn]);
+ if (align)
+ func (stream, ", :%d", 32 << align);
+ func (stream, "]");
+ if (rm == 0xd)
+ func (stream, "!");
+ else if (rm != 0xf)
+ func (stream, ", %s", arm_regnames[rm]);
+ }
+ break;
+
+ case 'B':
+ {
+ int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
+ int rn = ((given >> 16) & 0xf);
+ int rm = ((given >> 0) & 0xf);
+ int idx_align = ((given >> 4) & 0xf);
+ int align = 0;
+ int size = ((given >> 10) & 0x3);
+ int idx = idx_align >> (size + 1);
+ int length = ((given >> 8) & 3) + 1;
+ int stride = 1;
+ int i;
+
+ if (length > 1 && size > 0)
+ stride = (idx_align & (1 << size)) ? 2 : 1;
+
+ switch (length)
+ {
+ case 1:
+ {
+ int amask = (1 << size) - 1;
+ if ((idx_align & (1 << size)) != 0)
+ return false;
+ if (size > 0)
+ {
+ if ((idx_align & amask) == amask)
+ align = 8 << size;
+ else if ((idx_align & amask) != 0)
+ return false;
+ }
+ }
+ break;
+
+ case 2:
+ if (size == 2 && (idx_align & 2) != 0)
+ return false;
+ align = (idx_align & 1) ? 16 << size : 0;
+ break;
+
+ case 3:
+ if ((size == 2 && (idx_align & 3) != 0)
+ || (idx_align & 1) != 0)
+ return false;
+ break;
+
+ case 4:
+ if (size == 2)
+ {
+ if ((idx_align & 3) == 3)
+ return false;
+ align = (idx_align & 3) * 64;
+ }
+ else
+ align = (idx_align & 1) ? 32 << size : 0;
+ break;
+
+ default:
+ abort ();
+ }
+
+ func (stream, "{");
+ for (i = 0; i < length; i++)
+ func (stream, "%sd%d[%d]", (i == 0) ? "" : ",",
+ rd + i * stride, idx);
+ func (stream, "}, [%s", arm_regnames[rn]);
+ if (align)
+ func (stream, ", :%d", align);
+ func (stream, "]");
+ if (rm == 0xd)
+ func (stream, "!");
+ else if (rm != 0xf)
+ func (stream, ", %s", arm_regnames[rm]);
+ }
+ break;
+
+ case 'C':
+ {
+ int rd = ((given >> 12) & 0xf) | (((given >> 22) & 1) << 4);
+ int rn = ((given >> 16) & 0xf);
+ int rm = ((given >> 0) & 0xf);
+ int align = ((given >> 4) & 0x1);
+ int size = ((given >> 6) & 0x3);
+ int type = ((given >> 8) & 0x3);
+ int n = type + 1;
+ int stride = ((given >> 5) & 0x1);
+ int ix;
+
+ if (stride && (n == 1))
+ n++;
+ else
+ stride++;
+
+ func (stream, "{");
+ if (stride > 1)
+ for (ix = 0; ix != n; ix++)
+ func (stream, "%sd%d[]", ix ? "," : "", rd + ix * stride);
+ else if (n == 1)
+ func (stream, "d%d[]", rd);
+ else
+ func (stream, "d%d[]-d%d[]", rd, rd + n - 1);
+ func (stream, "}, [%s", arm_regnames[rn]);
+ if (align)
+ {
+ int align = (8 * (type + 1)) << size;
+ if (type == 3)
+ align = (size > 1) ? align >> 1 : align;
+ if (type == 2 || (type == 0 && !size))
+ func (stream, ", :<bad align %d>", align);
+ else
+ func (stream, ", :%d", align);
+ }
+ func (stream, "]");
+ if (rm == 0xd)
+ func (stream, "!");
+ else if (rm != 0xf)
+ func (stream, ", %s", arm_regnames[rm]);
+ }
+ break;
+
+ case 'D':
+ {
+ int raw_reg = (given & 0xf) | ((given >> 1) & 0x10);
+ int size = (given >> 20) & 3;
+ int reg = raw_reg & ((4 << size) - 1);
+ int ix = raw_reg >> size >> 2;
+
+ func (stream, "d%d[%d]", reg, ix);
+ }
+ break;
+
+ case 'E':
+ /* Neon encoded constant for mov, mvn, vorr, vbic */
+ {
+ int bits = 0;
+ int cmode = (given >> 8) & 0xf;
+ int op = (given >> 5) & 0x1;
+ unsigned long value = 0, hival = 0;
+ unsigned shift;
+ int size = 0;
+ int isfloat = 0;
+
+ bits |= ((given >> 24) & 1) << 7;
+ bits |= ((given >> 16) & 7) << 4;
+ bits |= ((given >> 0) & 15) << 0;
+
+ if (cmode < 8)
+ {
+ shift = (cmode >> 1) & 3;
+ value = (unsigned long)bits << (8 * shift);
+ size = 32;
+ }
+ else if (cmode < 12)
+ {
+ shift = (cmode >> 1) & 1;
+ value = (unsigned long)bits << (8 * shift);
+ size = 16;
+ }
+ else if (cmode < 14)
+ {
+ shift = (cmode & 1) + 1;
+ value = (unsigned long)bits << (8 * shift);
+ value |= (1ul << (8 * shift)) - 1;
+ size = 32;
+ }
+ else if (cmode == 14)
+ {
+ if (op)
+ {
+ /* bit replication into bytes */
+ int ix;
+ unsigned long mask;
+
+ value = 0;
+ hival = 0;
+ for (ix = 7; ix >= 0; ix--)
+ {
+ mask = ((bits >> ix) & 1) ? 0xff : 0;
+ if (ix <= 3)
+ value = (value << 8) | mask;
+ else
+ hival = (hival << 8) | mask;
+ }
+ size = 64;
+ }
+ else
+ {
+ /* byte replication */
+ value = (unsigned long)bits;
+ size = 8;
+ }
+ }
+ else if (!op)
+ {
+ /* floating point encoding */
+ int tmp;
+
+ value = (unsigned long)(bits & 0x7f) << 19;
+ value |= (unsigned long)(bits & 0x80) << 24;
+ tmp = bits & 0x40 ? 0x3c : 0x40;
+ value |= (unsigned long)tmp << 24;
+ size = 32;
+ isfloat = 1;
+ }
+ else
+ {
+ func (stream, "<illegal constant %.8x:%x:%x>",
+ bits, cmode, op);
+ break;
+ }
+ switch (size)
+ {
+ case 8:
+ func (stream, "#%ld\t; 0x%.2lx", value, value);
+ break;
+
+ case 16:
+ func (stream, "#%ld\t; 0x%.4lx", value, value);
+ break;
+
+ case 32:
+ if (isfloat)
+ {
+ unsigned char valbytes[4];
+ double fvalue;
+
+ /* Do this a byte at a time so we don't have to
+ worry about the host's endianness. */
+ valbytes[0] = value & 0xff;
+ valbytes[1] = (value >> 8) & 0xff;
+ valbytes[2] = (value >> 16) & 0xff;
+ valbytes[3] = (value >> 24) & 0xff;
+
+ floatformat_to_double (valbytes, &fvalue);
+
+ func (stream, "#%.7g\t; 0x%.8lx", fvalue,
+ value);
+ }
+ else
+ func (stream, "#%ld\t; 0x%.8lx",
+ (long) ((value & 0x80000000)
+ ? value | ~0xffffffffl : value), value);
+ break;
+
+ case 64:
+ func (stream, "#0x%.8lx%.8lx", hival, value);
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ break;
+
+ case 'F':
+ {
+ int regno = ((given >> 16) & 0xf) | ((given >> (7 - 4)) & 0x10);
+ int num = (given >> 8) & 0x3;
+
+ if (!num)
+ func (stream, "{d%d}", regno);
+ else if (num + regno >= 32)
+ func (stream, "{d%d-<overflow reg d%d}", regno, regno + num);
+ else
+ func (stream, "{d%d-d%d}", regno, regno + num);
+ }
+ break;
+
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ int width;
+ unsigned long value;
+
+ c = arm_decode_bitfield (c, given, &value, &width);
+
+ switch (*c)
+ {
+ case 'r':
+ func (stream, "%s", arm_regnames[value]);
+ break;
+ case 'd':
+ func (stream, "%ld", value);
+ break;
+ case 'e':
+ func (stream, "%ld", (1ul << width) - value);
+ break;
+
+ case 'S':
+ case 'T':
+ case 'U':
+ /* various width encodings */
+ {
+ int base = 8 << (*c - 'S'); /* 8,16 or 32 */
+ int limit;
+ unsigned low, high;
+
+ c++;
+ if (*c >= '0' && *c <= '9')
+ limit = *c - '0';
+ else if (*c >= 'a' && *c <= 'f')
+ limit = *c - 'a' + 10;
+ else
+ abort ();
+ low = limit >> 2;
+ high = limit & 3;
+
+ if (value < low || value > high)
+ func (stream, "<illegal width %d>", base << value);
+ else
+ func (stream, "%d", base << value);
+ }
+ break;
+ case 'R':
+ if (given & (1 << 6))
+ goto Q;
+ /* FALLTHROUGH */
+ case 'D':
+ func (stream, "d%ld", value);
+ break;
+ case 'Q':
+ Q:
+ if (value & 1)
+ func (stream, "<illegal reg q%ld.5>", value >> 1);
+ else
+ func (stream, "q%ld", value >> 1);
+ break;
+
+ case '`':
+ c++;
+ if (value == 0)
+ func (stream, "%c", *c);
+ break;
+ case '\'':
+ c++;
+ if (value == ((1ul << width) - 1))
+ func (stream, "%c", *c);
+ break;
+ case '?':
+ func (stream, "%c", c[(1 << width) - (int)value]);
+ c += 1 << width;
+ break;
+ default:
+ abort ();
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ }
+ else
+ func (stream, "%c", *c);
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+/* Print one ARM instruction from PC on INFO->STREAM. */
+
+static void
+print_insn_arm_internal (bfd_vma pc, struct disassemble_info *info, long given)
+{
+ const struct opcode32 *insn;
+ void *stream = info->stream;
+ fprintf_function func = info->fprintf_func;
+
+ if (print_insn_coprocessor (pc, info, given, false))
+ return;
+
+ if (print_insn_neon (info, given, false))
+ return;
+
+ for (insn = arm_opcodes; insn->assembler; insn++)
+ {
+ if (insn->value == FIRST_IWMMXT_INSN
+ && info->mach != bfd_mach_arm_XScale
+ && info->mach != bfd_mach_arm_iWMMXt)
+ insn = insn + IWMMXT_INSN_COUNT;
+
+ if ((given & insn->mask) == insn->value
+ /* Special case: an instruction with all bits set in the condition field
+ (0xFnnn_nnnn) is only matched if all those bits are set in insn->mask,
+ or by the catchall at the end of the table. */
+ && ((given & 0xF0000000) != 0xF0000000
+ || (insn->mask & 0xF0000000) == 0xF0000000
+ || (insn->mask == 0 && insn->value == 0)))
+ {
+ const char *c;
+
+ for (c = insn->assembler; *c; c++)
+ {
+ if (*c == '%')
+ {
+ switch (*++c)
+ {
+ case '%':
+ func (stream, "%%");
+ break;
+
+ case 'a':
+ print_arm_address (pc, info, given);
+ break;
+
+ case 'P':
+ /* Set P address bit and use normal address
+ printing routine. */
+ print_arm_address (pc, info, given | (1 << 24));
+ break;
+
+ case 's':
+ if ((given & 0x004f0000) == 0x004f0000)
+ {
+ /* PC relative with immediate offset. */
+ int offset = ((given & 0xf00) >> 4) | (given & 0xf);
+
+ if ((given & 0x00800000) == 0)
+ offset = -offset;
+
+ func (stream, "[pc, #%d]\t; ", offset);
+ info->print_address_func (offset + pc + 8, info);
+ }
+ else
+ {
+ func (stream, "[%s",
+ arm_regnames[(given >> 16) & 0xf]);
+ if ((given & 0x01000000) != 0)
+ {
+ /* Pre-indexed. */
+ if ((given & 0x00400000) == 0x00400000)
+ {
+ /* Immediate. */
+ int offset = ((given & 0xf00) >> 4) | (given & 0xf);
+ if (offset)
+ func (stream, ", #%s%d",
+ (((given & 0x00800000) == 0)
+ ? "-" : ""), offset);
+ }
+ else
+ {
+ /* Register. */
+ func (stream, ", %s%s",
+ (((given & 0x00800000) == 0)
+ ? "-" : ""),
+ arm_regnames[given & 0xf]);
+ }
+
+ func (stream, "]%s",
+ ((given & 0x00200000) != 0) ? "!" : "");
+ }
+ else
+ {
+ /* Post-indexed. */
+ if ((given & 0x00400000) == 0x00400000)
+ {
+ /* Immediate. */
+ int offset = ((given & 0xf00) >> 4) | (given & 0xf);
+ if (offset)
+ func (stream, "], #%s%d",
+ (((given & 0x00800000) == 0)
+ ? "-" : ""), offset);
+ else
+ func (stream, "]");
+ }
+ else
+ {
+ /* Register. */
+ func (stream, "], %s%s",
+ (((given & 0x00800000) == 0)
+ ? "-" : ""),
+ arm_regnames[given & 0xf]);
+ }
+ }
+ }
+ break;
+
+ case 'b':
+ {
+ int disp = (((given & 0xffffff) ^ 0x800000) - 0x800000);
+ info->print_address_func (disp*4 + pc + 8, info);
+ }
+ break;
+
+ case 'c':
+ if (((given >> 28) & 0xf) != 0xe)
+ func (stream, "%s",
+ arm_conditional [(given >> 28) & 0xf]);
+ break;
+
+ case 'm':
+ {
+ int started = 0;
+ int reg;
+
+ func (stream, "{");
+ for (reg = 0; reg < 16; reg++)
+ if ((given & (1 << reg)) != 0)
+ {
+ if (started)
+ func (stream, ", ");
+ started = 1;
+ func (stream, "%s", arm_regnames[reg]);
+ }
+ func (stream, "}");
+ }
+ break;
+
+ case 'q':
+ arm_decode_shift (given, func, stream, 0);
+ break;
+
+ case 'o':
+ if ((given & 0x02000000) != 0)
+ {
+ int rotate = (given & 0xf00) >> 7;
+ int immed = (given & 0xff);
+ immed = (((immed << (32 - rotate))
+ | (immed >> rotate)) & 0xffffffff);
+ func (stream, "#%d\t; 0x%x", immed, immed);
+ }
+ else
+ arm_decode_shift (given, func, stream, 1);
+ break;
+
+ case 'p':
+ if ((given & 0x0000f000) == 0x0000f000)
+ func (stream, "p");
+ break;
+
+ case 't':
+ if ((given & 0x01200000) == 0x00200000)
+ func (stream, "t");
+ break;
+
+ case 'A':
+ func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
+
+ if ((given & (1 << 24)) != 0)
+ {
+ int offset = given & 0xff;
+
+ if (offset)
+ func (stream, ", #%s%d]%s",
+ ((given & 0x00800000) == 0 ? "-" : ""),
+ offset * 4,
+ ((given & 0x00200000) != 0 ? "!" : ""));
+ else
+ func (stream, "]");
+ }
+ else
+ {
+ int offset = given & 0xff;
+
+ func (stream, "]");
+
+ if (given & (1 << 21))
+ {
+ if (offset)
+ func (stream, ", #%s%d",
+ ((given & 0x00800000) == 0 ? "-" : ""),
+ offset * 4);
+ }
+ else
+ func (stream, ", {%d}", offset);
+ }
+ break;
+
+ case 'B':
+ /* Print ARM V5 BLX(1) address: pc+25 bits. */
+ {
+ bfd_vma address;
+ bfd_vma offset = 0;
+
+ if (given & 0x00800000)
+ /* Is signed, hi bits should be ones. */
+ offset = (-1) ^ 0x00ffffff;
+
+ /* Offset is (SignExtend(offset field)<<2). */
+ offset += given & 0x00ffffff;
+ offset <<= 2;
+ address = offset + pc + 8;
+
+ if (given & 0x01000000)
+ /* H bit allows addressing to 2-byte boundaries. */
+ address += 2;
+
+ info->print_address_func (address, info);
+ }
+ break;
+
+ case 'C':
+ func (stream, "_");
+ if (given & 0x80000)
+ func (stream, "f");
+ if (given & 0x40000)
+ func (stream, "s");
+ if (given & 0x20000)
+ func (stream, "x");
+ if (given & 0x10000)
+ func (stream, "c");
+ break;
+
+ case 'U':
+ switch (given & 0xf)
+ {
+ case 0xf: func(stream, "sy"); break;
+ case 0x7: func(stream, "un"); break;
+ case 0xe: func(stream, "st"); break;
+ case 0x6: func(stream, "unst"); break;
+ default:
+ func(stream, "#%d", (int)given & 0xf);
+ break;
+ }
+ break;
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ int width;
+ unsigned long value;
+
+ c = arm_decode_bitfield (c, given, &value, &width);
+
+ switch (*c)
+ {
+ case 'r':
+ func (stream, "%s", arm_regnames[value]);
+ break;
+ case 'd':
+ func (stream, "%ld", value);
+ break;
+ case 'b':
+ func (stream, "%ld", value * 8);
+ break;
+ case 'W':
+ func (stream, "%ld", value + 1);
+ break;
+ case 'x':
+ func (stream, "0x%08lx", value);
+
+ /* Some SWI instructions have special
+ meanings. */
+ if ((given & 0x0fffffff) == 0x0FF00000)
+ func (stream, "\t; IMB");
+ else if ((given & 0x0fffffff) == 0x0FF00001)
+ func (stream, "\t; IMBRange");
+ break;
+ case 'X':
+ func (stream, "%01lx", value & 0xf);
+ break;
+ case '`':
+ c++;
+ if (value == 0)
+ func (stream, "%c", *c);
+ break;
+ case '\'':
+ c++;
+ if (value == ((1ul << width) - 1))
+ func (stream, "%c", *c);
+ break;
+ case '?':
+ func (stream, "%c", c[(1 << width) - (int)value]);
+ c += 1 << width;
+ break;
+ default:
+ abort ();
+ }
+ break;
+
+ case 'e':
+ {
+ int imm;
+
+ imm = (given & 0xf) | ((given & 0xfff00) >> 4);
+ func (stream, "%d", imm);
+ }
+ break;
+
+ case 'E':
+ /* LSB and WIDTH fields of BFI or BFC. The machine-
+ language instruction encodes LSB and MSB. */
+ {
+ long msb = (given & 0x001f0000) >> 16;
+ long lsb = (given & 0x00000f80) >> 7;
+
+ long width = msb - lsb + 1;
+ if (width > 0)
+ func (stream, "#%lu, #%lu", lsb, width);
+ else
+ func (stream, "(invalid: %lu:%lu)", lsb, msb);
+ }
+ break;
+
+ case 'V':
+ /* 16-bit unsigned immediate from a MOVT or MOVW
+ instruction, encoded in bits 0:11 and 15:19. */
+ {
+ long hi = (given & 0x000f0000) >> 4;
+ long lo = (given & 0x00000fff);
+ long imm16 = hi | lo;
+ func (stream, "#%lu\t; 0x%lx", imm16, imm16);
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ }
+ else
+ func (stream, "%c", *c);
+ }
+ return;
+ }
+ }
+ abort ();
+}
+
+/* Print one 16-bit Thumb instruction from PC on INFO->STREAM. */
+
+static void
+print_insn_thumb16 (bfd_vma pc, struct disassemble_info *info, long given)
+{
+ const struct opcode16 *insn;
+ void *stream = info->stream;
+ fprintf_function func = info->fprintf_func;
+
+ for (insn = thumb_opcodes; insn->assembler; insn++)
+ if ((given & insn->mask) == insn->value)
+ {
+ const char *c = insn->assembler;
+ for (; *c; c++)
+ {
+ int domaskpc = 0;
+ int domasklr = 0;
+
+ if (*c != '%')
+ {
+ func (stream, "%c", *c);
+ continue;
+ }
+
+ switch (*++c)
+ {
+ case '%':
+ func (stream, "%%");
+ break;
+
+ case 'c':
+ if (ifthen_state)
+ func (stream, "%s", arm_conditional[IFTHEN_COND]);
+ break;
+
+ case 'C':
+ if (ifthen_state)
+ func (stream, "%s", arm_conditional[IFTHEN_COND]);
+ else
+ func (stream, "s");
+ break;
+
+ case 'I':
+ {
+ unsigned int tmp;
+
+ ifthen_next_state = given & 0xff;
+ for (tmp = given << 1; tmp & 0xf; tmp <<= 1)
+ func (stream, ((given ^ tmp) & 0x10) ? "e" : "t");
+ func (stream, "\t%s", arm_conditional[(given >> 4) & 0xf]);
+ }
+ break;
+
+ case 'x':
+ if (ifthen_next_state)
+ func (stream, "\t; unpredictable branch in IT block\n");
+ break;
+
+ case 'X':
+ if (ifthen_state)
+ func (stream, "\t; unpredictable <IT:%s>",
+ arm_conditional[IFTHEN_COND]);
+ break;
+
+ case 'S':
+ {
+ long reg;
+
+ reg = (given >> 3) & 0x7;
+ if (given & (1 << 6))
+ reg += 8;
+
+ func (stream, "%s", arm_regnames[reg]);
+ }
+ break;
+
+ case 'D':
+ {
+ long reg;
+
+ reg = given & 0x7;
+ if (given & (1 << 7))
+ reg += 8;
+
+ func (stream, "%s", arm_regnames[reg]);
+ }
+ break;
+
+ case 'N':
+ if (given & (1 << 8))
+ domasklr = 1;
+ /* Fall through. */
+ case 'O':
+ if (*c == 'O' && (given & (1 << 8)))
+ domaskpc = 1;
+ /* Fall through. */
+ case 'M':
+ {
+ int started = 0;
+ int reg;
+
+ func (stream, "{");
+
+ /* It would be nice if we could spot
+ ranges, and generate the rS-rE format: */
+ for (reg = 0; (reg < 8); reg++)
+ if ((given & (1 << reg)) != 0)
+ {
+ if (started)
+ func (stream, ", ");
+ started = 1;
+ func (stream, "%s", arm_regnames[reg]);
+ }
+
+ if (domasklr)
+ {
+ if (started)
+ func (stream, ", ");
+ started = 1;
+ func (stream, "%s", arm_regnames[14] /* "lr" */);
+ }
+
+ if (domaskpc)
+ {
+ if (started)
+ func (stream, ", ");
+ func (stream, "%s", arm_regnames[15] /* "pc" */);
+ }
+
+ func (stream, "}");
+ }
+ break;
+
+ case 'b':
+ /* Print ARM V6T2 CZB address: pc+4+6 bits. */
+ {
+ bfd_vma address = (pc + 4
+ + ((given & 0x00f8) >> 2)
+ + ((given & 0x0200) >> 3));
+ info->print_address_func (address, info);
+ }
+ break;
+
+ case 's':
+ /* Right shift immediate -- bits 6..10; 1-31 print
+ as themselves, 0 prints as 32. */
+ {
+ long imm = (given & 0x07c0) >> 6;
+ if (imm == 0)
+ imm = 32;
+ func (stream, "#%ld", imm);
+ }
+ break;
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ int bitstart = *c++ - '0';
+ int bitend = 0;
+
+ while (*c >= '0' && *c <= '9')
+ bitstart = (bitstart * 10) + *c++ - '0';
+
+ switch (*c)
+ {
+ case '-':
+ {
+ long reg;
+
+ c++;
+ while (*c >= '0' && *c <= '9')
+ bitend = (bitend * 10) + *c++ - '0';
+ if (!bitend)
+ abort ();
+ reg = given >> bitstart;
+ reg &= (2 << (bitend - bitstart)) - 1;
+ switch (*c)
+ {
+ case 'r':
+ func (stream, "%s", arm_regnames[reg]);
+ break;
+
+ case 'd':
+ func (stream, "%ld", reg);
+ break;
+
+ case 'H':
+ func (stream, "%ld", reg << 1);
+ break;
+
+ case 'W':
+ func (stream, "%ld", reg << 2);
+ break;
+
+ case 'a':
+ /* PC-relative address -- the bottom two
+ bits of the address are dropped
+ before the calculation. */
+ info->print_address_func
+ (((pc + 4) & ~3) + (reg << 2), info);
+ break;
+
+ case 'x':
+ func (stream, "0x%04lx", reg);
+ break;
+
+ case 'B':
+ reg = ((reg ^ (1 << bitend)) - (1 << bitend));
+ info->print_address_func (reg * 2 + pc + 4, info);
+ break;
+
+ case 'c':
+ func (stream, "%s", arm_conditional [reg]);
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ break;
+
+ case '\'':
+ c++;
+ if ((given & (1 << bitstart)) != 0)
+ func (stream, "%c", *c);
+ break;
+
+ case '?':
+ ++c;
+ if ((given & (1 << bitstart)) != 0)
+ func (stream, "%c", *c++);
+ else
+ func (stream, "%c", *++c);
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ return;
+ }
+
+ /* No match. */
+ abort ();
+}
+
+/* Return the name of an V7M special register. */
+static const char *
+psr_name (int regno)
+{
+ switch (regno)
+ {
+ case 0: return "APSR";
+ case 1: return "IAPSR";
+ case 2: return "EAPSR";
+ case 3: return "PSR";
+ case 5: return "IPSR";
+ case 6: return "EPSR";
+ case 7: return "IEPSR";
+ case 8: return "MSP";
+ case 9: return "PSP";
+ case 16: return "PRIMASK";
+ case 17: return "BASEPRI";
+ case 18: return "BASEPRI_MASK";
+ case 19: return "FAULTMASK";
+ case 20: return "CONTROL";
+ default: return "<unknown>";
+ }
+}
+
+/* Print one 32-bit Thumb instruction from PC on INFO->STREAM. */
+
+static void
+print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
+{
+ const struct opcode32 *insn;
+ void *stream = info->stream;
+ fprintf_function func = info->fprintf_func;
+
+ if (print_insn_coprocessor (pc, info, given, true))
+ return;
+
+ if (print_insn_neon (info, given, true))
+ return;
+
+ for (insn = thumb32_opcodes; insn->assembler; insn++)
+ if ((given & insn->mask) == insn->value)
+ {
+ const char *c = insn->assembler;
+ for (; *c; c++)
+ {
+ if (*c != '%')
+ {
+ func (stream, "%c", *c);
+ continue;
+ }
+
+ switch (*++c)
+ {
+ case '%':
+ func (stream, "%%");
+ break;
+
+ case 'c':
+ if (ifthen_state)
+ func (stream, "%s", arm_conditional[IFTHEN_COND]);
+ break;
+
+ case 'x':
+ if (ifthen_next_state)
+ func (stream, "\t; unpredictable branch in IT block\n");
+ break;
+
+ case 'X':
+ if (ifthen_state)
+ func (stream, "\t; unpredictable <IT:%s>",
+ arm_conditional[IFTHEN_COND]);
+ break;
+
+ case 'I':
+ {
+ unsigned int imm12 = 0;
+ imm12 |= (given & 0x000000ffu);
+ imm12 |= (given & 0x00007000u) >> 4;
+ imm12 |= (given & 0x04000000u) >> 15;
+ func (stream, "#%u\t; 0x%x", imm12, imm12);
+ }
+ break;
+
+ case 'M':
+ {
+ unsigned int bits = 0, imm, imm8, mod;
+ bits |= (given & 0x000000ffu);
+ bits |= (given & 0x00007000u) >> 4;
+ bits |= (given & 0x04000000u) >> 15;
+ imm8 = (bits & 0x0ff);
+ mod = (bits & 0xf00) >> 8;
+ switch (mod)
+ {
+ case 0: imm = imm8; break;
+ case 1: imm = ((imm8<<16) | imm8); break;
+ case 2: imm = ((imm8<<24) | (imm8 << 8)); break;
+ case 3: imm = ((imm8<<24) | (imm8 << 16) | (imm8 << 8) | imm8); break;
+ default:
+ mod = (bits & 0xf80) >> 7;
+ imm8 = (bits & 0x07f) | 0x80;
+ imm = (((imm8 << (32 - mod)) | (imm8 >> mod)) & 0xffffffff);
+ }
+ func (stream, "#%u\t; 0x%x", imm, imm);
+ }
+ break;
+
+ case 'J':
+ {
+ unsigned int imm = 0;
+ imm |= (given & 0x000000ffu);
+ imm |= (given & 0x00007000u) >> 4;
+ imm |= (given & 0x04000000u) >> 15;
+ imm |= (given & 0x000f0000u) >> 4;
+ func (stream, "#%u\t; 0x%x", imm, imm);
+ }
+ break;
+
+ case 'K':
+ {
+ unsigned int imm = 0;
+ imm |= (given & 0x000f0000u) >> 16;
+ imm |= (given & 0x00000ff0u) >> 0;
+ imm |= (given & 0x0000000fu) << 12;
+ func (stream, "#%u\t; 0x%x", imm, imm);
+ }
+ break;
+
+ case 'S':
+ {
+ unsigned int reg = (given & 0x0000000fu);
+ unsigned int stp = (given & 0x00000030u) >> 4;
+ unsigned int imm = 0;
+ imm |= (given & 0x000000c0u) >> 6;
+ imm |= (given & 0x00007000u) >> 10;
+
+ func (stream, "%s", arm_regnames[reg]);
+ switch (stp)
+ {
+ case 0:
+ if (imm > 0)
+ func (stream, ", lsl #%u", imm);
+ break;
+
+ case 1:
+ if (imm == 0)
+ imm = 32;
+ func (stream, ", lsr #%u", imm);
+ break;
+
+ case 2:
+ if (imm == 0)
+ imm = 32;
+ func (stream, ", asr #%u", imm);
+ break;
+
+ case 3:
+ if (imm == 0)
+ func (stream, ", rrx");
+ else
+ func (stream, ", ror #%u", imm);
+ }
+ }
+ break;
+
+ case 'a':
+ {
+ unsigned int Rn = (given & 0x000f0000) >> 16;
+ unsigned int U = (given & 0x00800000) >> 23;
+ unsigned int op = (given & 0x00000f00) >> 8;
+ unsigned int i12 = (given & 0x00000fff);
+ unsigned int i8 = (given & 0x000000ff);
+ bfd_boolean writeback = false, postind = false;
+ int offset = 0;
+
+ func (stream, "[%s", arm_regnames[Rn]);
+ if (U) /* 12-bit positive immediate offset */
+ offset = i12;
+ else if (Rn == 15) /* 12-bit negative immediate offset */
+ offset = -(int)i12;
+ else if (op == 0x0) /* shifted register offset */
+ {
+ unsigned int Rm = (i8 & 0x0f);
+ unsigned int sh = (i8 & 0x30) >> 4;
+ func (stream, ", %s", arm_regnames[Rm]);
+ if (sh)
+ func (stream, ", lsl #%u", sh);
+ func (stream, "]");
+ break;
+ }
+ else switch (op)
+ {
+ case 0xE: /* 8-bit positive immediate offset */
+ offset = i8;
+ break;
+
+ case 0xC: /* 8-bit negative immediate offset */
+ offset = -i8;
+ break;
+
+ case 0xF: /* 8-bit + preindex with wb */
+ offset = i8;
+ writeback = true;
+ break;
+
+ case 0xD: /* 8-bit - preindex with wb */
+ offset = -i8;
+ writeback = true;
+ break;
+
+ case 0xB: /* 8-bit + postindex */
+ offset = i8;
+ postind = true;
+ break;
+
+ case 0x9: /* 8-bit - postindex */
+ offset = -i8;
+ postind = true;
+ break;
+
+ default:
+ func (stream, ", <undefined>]");
+ goto skip;
+ }
+
+ if (postind)
+ func (stream, "], #%d", offset);
+ else
+ {
+ if (offset)
+ func (stream, ", #%d", offset);
+ func (stream, writeback ? "]!" : "]");
+ }
+
+ if (Rn == 15)
+ {
+ func (stream, "\t; ");
+ info->print_address_func (((pc + 4) & ~3) + offset, info);
+ }
+ }
+ skip:
+ break;
+
+ case 'A':
+ {
+ unsigned int P = (given & 0x01000000) >> 24;
+ unsigned int U = (given & 0x00800000) >> 23;
+ unsigned int W = (given & 0x00400000) >> 21;
+ unsigned int Rn = (given & 0x000f0000) >> 16;
+ unsigned int off = (given & 0x000000ff);
+
+ func (stream, "[%s", arm_regnames[Rn]);
+ if (P)
+ {
+ if (off || !U)
+ func (stream, ", #%c%u", U ? '+' : '-', off * 4);
+ func (stream, "]");
+ if (W)
+ func (stream, "!");
+ }
+ else
+ {
+ func (stream, "], ");
+ if (W)
+ func (stream, "#%c%u", U ? '+' : '-', off * 4);
+ else
+ func (stream, "{%u}", off);
+ }
+ }
+ break;
+
+ case 'w':
+ {
+ unsigned int Sbit = (given & 0x01000000) >> 24;
+ unsigned int type = (given & 0x00600000) >> 21;
+ switch (type)
+ {
+ case 0: func (stream, Sbit ? "sb" : "b"); break;
+ case 1: func (stream, Sbit ? "sh" : "h"); break;
+ case 2:
+ if (Sbit)
+ func (stream, "??");
+ break;
+ case 3:
+ func (stream, "??");
+ break;
+ }
+ }
+ break;
+
+ case 'm':
+ {
+ int started = 0;
+ int reg;
+
+ func (stream, "{");
+ for (reg = 0; reg < 16; reg++)
+ if ((given & (1 << reg)) != 0)
+ {
+ if (started)
+ func (stream, ", ");
+ started = 1;
+ func (stream, "%s", arm_regnames[reg]);
+ }
+ func (stream, "}");
+ }
+ break;
+
+ case 'E':
+ {
+ unsigned int msb = (given & 0x0000001f);
+ unsigned int lsb = 0;
+ lsb |= (given & 0x000000c0u) >> 6;
+ lsb |= (given & 0x00007000u) >> 10;
+ func (stream, "#%u, #%u", lsb, msb - lsb + 1);
+ }
+ break;
+
+ case 'F':
+ {
+ unsigned int width = (given & 0x0000001f) + 1;
+ unsigned int lsb = 0;
+ lsb |= (given & 0x000000c0u) >> 6;
+ lsb |= (given & 0x00007000u) >> 10;
+ func (stream, "#%u, #%u", lsb, width);
+ }
+ break;
+
+ case 'b':
+ {
+ unsigned int S = (given & 0x04000000u) >> 26;
+ unsigned int J1 = (given & 0x00002000u) >> 13;
+ unsigned int J2 = (given & 0x00000800u) >> 11;
+ int offset = 0;
+
+ offset |= !S << 20;
+ offset |= J2 << 19;
+ offset |= J1 << 18;
+ offset |= (given & 0x003f0000) >> 4;
+ offset |= (given & 0x000007ff) << 1;
+ offset -= (1 << 20);
+
+ info->print_address_func (pc + 4 + offset, info);
+ }
+ break;
+
+ case 'B':
+ {
+ unsigned int S = (given & 0x04000000u) >> 26;
+ unsigned int I1 = (given & 0x00002000u) >> 13;
+ unsigned int I2 = (given & 0x00000800u) >> 11;
+ int offset = 0;
+
+ offset |= !S << 24;
+ offset |= !(I1 ^ S) << 23;
+ offset |= !(I2 ^ S) << 22;
+ offset |= (given & 0x03ff0000u) >> 4;
+ offset |= (given & 0x000007ffu) << 1;
+ offset -= (1 << 24);
+ offset += pc + 4;
+
+ /* BLX target addresses are always word aligned. */
+ if ((given & 0x00001000u) == 0)
+ offset &= ~2u;
+
+ info->print_address_func (offset, info);
+ }
+ break;
+
+ case 's':
+ {
+ unsigned int shift = 0;
+ shift |= (given & 0x000000c0u) >> 6;
+ shift |= (given & 0x00007000u) >> 10;
+ if (given & 0x00200000u)
+ func (stream, ", asr #%u", shift);
+ else if (shift)
+ func (stream, ", lsl #%u", shift);
+ /* else print nothing - lsl #0 */
+ }
+ break;
+
+ case 'R':
+ {
+ unsigned int rot = (given & 0x00000030) >> 4;
+ if (rot)
+ func (stream, ", ror #%u", rot * 8);
+ }
+ break;
+
+ case 'U':
+ switch (given & 0xf)
+ {
+ case 0xf: func(stream, "sy"); break;
+ case 0x7: func(stream, "un"); break;
+ case 0xe: func(stream, "st"); break;
+ case 0x6: func(stream, "unst"); break;
+ default:
+ func(stream, "#%d", (int)given & 0xf);
+ break;
+ }
+ break;
+
+ case 'C':
+ if ((given & 0xff) == 0)
+ {
+ func (stream, "%cPSR_", (given & 0x100000) ? 'S' : 'C');
+ if (given & 0x800)
+ func (stream, "f");
+ if (given & 0x400)
+ func (stream, "s");
+ if (given & 0x200)
+ func (stream, "x");
+ if (given & 0x100)
+ func (stream, "c");
+ }
+ else
+ {
+ func (stream, "%s", psr_name (given & 0xff));
+ }
+ break;
+
+ case 'D':
+ if ((given & 0xff) == 0)
+ func (stream, "%cPSR", (given & 0x100000) ? 'S' : 'C');
+ else
+ func (stream, "%s", psr_name (given & 0xff));
+ break;
+
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ {
+ int width;
+ unsigned long val;
+
+ c = arm_decode_bitfield (c, given, &val, &width);
+
+ switch (*c)
+ {
+ case 'd': func (stream, "%lu", val); break;
+ case 'W': func (stream, "%lu", val * 4); break;
+ case 'r': func (stream, "%s", arm_regnames[val]); break;
+
+ case 'c':
+ func (stream, "%s", arm_conditional[val]);
+ break;
+
+ case '\'':
+ c++;
+ if (val == ((1ul << width) - 1))
+ func (stream, "%c", *c);
+ break;
+
+ case '`':
+ c++;
+ if (val == 0)
+ func (stream, "%c", *c);
+ break;
+
+ case '?':
+ func (stream, "%c", c[(1 << width) - (int)val]);
+ c += 1 << width;
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ return;
+ }
+
+ /* No match. */
+ abort ();
+}
+
+/* Print data bytes on INFO->STREAM. */
+
+static void
+print_insn_data (bfd_vma pc ATTRIBUTE_UNUSED, struct disassemble_info *info,
+ long given)
+{
+ switch (info->bytes_per_chunk)
+ {
+ case 1:
+ info->fprintf_func (info->stream, ".byte\t0x%02lx", given);
+ break;
+ case 2:
+ info->fprintf_func (info->stream, ".short\t0x%04lx", given);
+ break;
+ case 4:
+ info->fprintf_func (info->stream, ".word\t0x%08lx", given);
+ break;
+ default:
+ abort ();
+ }
+}
+
+/* Search back through the insn stream to determine if this instruction is
+ conditionally executed. */
+static void
+find_ifthen_state (bfd_vma pc, struct disassemble_info *info,
+ bfd_boolean little)
+{
+ unsigned char b[2];
+ unsigned int insn;
+ int status;
+ /* COUNT is twice the number of instructions seen. It will be odd if we
+ just crossed an instruction boundary. */
+ int count;
+ int it_count;
+ unsigned int seen_it;
+ bfd_vma addr;
+
+ ifthen_address = pc;
+ ifthen_state = 0;
+
+ addr = pc;
+ count = 1;
+ it_count = 0;
+ seen_it = 0;
+ /* Scan backwards looking for IT instructions, keeping track of where
+ instruction boundaries are. We don't know if something is actually an
+ IT instruction until we find a definite instruction boundary. */
+ for (;;)
+ {
+ if (addr == 0 || info->symbol_at_address_func(addr, info))
+ {
+ /* A symbol must be on an instruction boundary, and will not
+ be within an IT block. */
+ if (seen_it && (count & 1))
+ break;
+
+ return;
+ }
+ addr -= 2;
+ status = info->read_memory_func (addr, (bfd_byte *)b, 2, info);
+ if (status)
+ return;
+
+ if (little)
+ insn = (b[0]) | (b[1] << 8);
+ else
+ insn = (b[1]) | (b[0] << 8);
+ if (seen_it)
+ {
+ if ((insn & 0xf800) < 0xe800)
+ {
+ /* Addr + 2 is an instruction boundary. See if this matches
+ the expected boundary based on the position of the last
+ IT candidate. */
+ if (count & 1)
+ break;
+ seen_it = 0;
+ }
+ }
+ if ((insn & 0xff00) == 0xbf00 && (insn & 0xf) != 0)
+ {
+ /* This could be an IT instruction. */
+ seen_it = insn;
+ it_count = count >> 1;
+ }
+ if ((insn & 0xf800) >= 0xe800)
+ count++;
+ else
+ count = (count + 2) | 1;
+ /* IT blocks contain at most 4 instructions. */
+ if (count >= 8 && !seen_it)
+ return;
+ }
+ /* We found an IT instruction. */
+ ifthen_state = (seen_it & 0xe0) | ((seen_it << it_count) & 0x1f);
+ if ((ifthen_state & 0xf) == 0)
+ ifthen_state = 0;
+}
+
+/* NOTE: There are no checks in these routines that
+ the relevant number of data bytes exist. */
+
+int
+print_insn_arm (bfd_vma pc, struct disassemble_info *info)
+{
+ unsigned char b[4];
+ long given;
+ int status;
+ int is_thumb = false;
+ int is_data = false;
+ unsigned int size = 4;
+ void (*printer) (bfd_vma, struct disassemble_info *, long);
+#if 0
+ bfd_boolean found = false;
+
+ if (info->disassembler_options)
+ {
+ parse_disassembler_options (info->disassembler_options);
+
+ /* To avoid repeated parsing of these options, we remove them here. */
+ info->disassembler_options = NULL;
+ }
+
+ /* First check the full symtab for a mapping symbol, even if there
+ are no usable non-mapping symbols for this address. */
+ if (info->symtab != NULL
+ && bfd_asymbol_flavour (*info->symtab) == bfd_target_elf_flavour)
+ {
+ bfd_vma addr;
+ int n;
+ int last_sym = -1;
+ enum map_type type = MAP_ARM;
+
+ if (pc <= last_mapping_addr)
+ last_mapping_sym = -1;
+ is_thumb = (last_type == MAP_THUMB);
+ found = false;
+ /* Start scanning at the start of the function, or wherever
+ we finished last time. */
+ n = info->symtab_pos + 1;
+ if (n < last_mapping_sym)
+ n = last_mapping_sym;
+
+ /* Scan up to the location being disassembled. */
+ for (; n < info->symtab_size; n++)
+ {
+ addr = bfd_asymbol_value (info->symtab[n]);
+ if (addr > pc)
+ break;
+ if ((info->section == NULL
+ || info->section == info->symtab[n]->section)
+ && get_sym_code_type (info, n, &type))
+ {
+ last_sym = n;
+ found = true;
+ }
+ }
+
+ if (!found)
+ {
+ n = info->symtab_pos;
+ if (n < last_mapping_sym - 1)
+ n = last_mapping_sym - 1;
+
+ /* No mapping symbol found at this address. Look backwards
+ for a preceeding one. */
+ for (; n >= 0; n--)
+ {
+ if (get_sym_code_type (info, n, &type))
+ {
+ last_sym = n;
+ found = true;
+ break;
+ }
+ }
+ }
+
+ last_mapping_sym = last_sym;
+ last_type = type;
+ is_thumb = (last_type == MAP_THUMB);
+ is_data = (last_type == MAP_DATA);
+
+ /* Look a little bit ahead to see if we should print out
+ two or four bytes of data. If there's a symbol,
+ mapping or otherwise, after two bytes then don't
+ print more. */
+ if (is_data)
+ {
+ size = 4 - (pc & 3);
+ for (n = last_sym + 1; n < info->symtab_size; n++)
+ {
+ addr = bfd_asymbol_value (info->symtab[n]);
+ if (addr > pc)
+ {
+ if (addr - pc < size)
+ size = addr - pc;
+ break;
+ }
+ }
+ /* If the next symbol is after three bytes, we need to
+ print only part of the data, so that we can use either
+ .byte or .short. */
+ if (size == 3)
+ size = (pc & 1) ? 1 : 2;
+ }
+ }
+
+ if (info->symbols != NULL)
+ {
+ if (bfd_asymbol_flavour (*info->symbols) == bfd_target_coff_flavour)
+ {
+ coff_symbol_type * cs;
+
+ cs = coffsymbol (*info->symbols);
+ is_thumb = ( cs->native->u.syment.n_sclass == C_THUMBEXT
+ || cs->native->u.syment.n_sclass == C_THUMBSTAT
+ || cs->native->u.syment.n_sclass == C_THUMBLABEL
+ || cs->native->u.syment.n_sclass == C_THUMBEXTFUNC
+ || cs->native->u.syment.n_sclass == C_THUMBSTATFUNC);
+ }
+ else if (bfd_asymbol_flavour (*info->symbols) == bfd_target_elf_flavour
+ && !found)
+ {
+ /* If no mapping symbol has been found then fall back to the type
+ of the function symbol. */
+ elf_symbol_type * es;
+ unsigned int type;
+
+ es = *(elf_symbol_type **)(info->symbols);
+ type = ELF_ST_TYPE (es->internal_elf_sym.st_info);
+
+ is_thumb = (type == STT_ARM_TFUNC) || (type == STT_ARM_16BIT);
+ }
+ }
+#else
+ int little;
+
+ little = (info->endian == BFD_ENDIAN_LITTLE);
+ is_thumb |= (pc & 1);
+ pc &= ~(bfd_vma)1;
+#endif
+
+ if (force_thumb)
+ is_thumb = true;
+
+ info->bytes_per_line = 4;
+
+ if (is_data)
+ {
+ int i;
+
+ /* size was already set above. */
+ info->bytes_per_chunk = size;
+ printer = print_insn_data;
+
+ status = info->read_memory_func (pc, (bfd_byte *)b, size, info);
+ given = 0;
+ if (little)
+ for (i = size - 1; i >= 0; i--)
+ given = b[i] | (given << 8);
+ else
+ for (i = 0; i < (int) size; i++)
+ given = b[i] | (given << 8);
+ }
+ else if (!is_thumb)
+ {
+ /* In ARM mode endianness is a straightforward issue: the instruction
+ is four bytes long and is either ordered 0123 or 3210. */
+ printer = print_insn_arm_internal;
+ info->bytes_per_chunk = 4;
+ size = 4;
+
+ status = info->read_memory_func (pc, (bfd_byte *)b, 4, info);
+ if (little)
+ given = (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
+ else
+ given = (b[3]) | (b[2] << 8) | (b[1] << 16) | (b[0] << 24);
+ }
+ else
+ {
+ /* In Thumb mode we have the additional wrinkle of two
+ instruction lengths. Fortunately, the bits that determine
+ the length of the current instruction are always to be found
+ in the first two bytes. */
+ printer = print_insn_thumb16;
+ info->bytes_per_chunk = 2;
+ size = 2;
+
+ status = info->read_memory_func (pc, (bfd_byte *)b, 2, info);
+ if (little)
+ given = (b[0]) | (b[1] << 8);
+ else
+ given = (b[1]) | (b[0] << 8);
+
+ if (!status)
+ {
+ /* These bit patterns signal a four-byte Thumb
+ instruction. */
+ if ((given & 0xF800) == 0xF800
+ || (given & 0xF800) == 0xF000
+ || (given & 0xF800) == 0xE800)
+ {
+ status = info->read_memory_func (pc + 2, (bfd_byte *)b, 2, info);
+ if (little)
+ given = (b[0]) | (b[1] << 8) | (given << 16);
+ else
+ given = (b[1]) | (b[0] << 8) | (given << 16);
+
+ printer = print_insn_thumb32;
+ size = 4;
+ }
+ }
+
+ if (ifthen_address != pc)
+ find_ifthen_state(pc, info, little);
+
+ if (ifthen_state)
+ {
+ if ((ifthen_state & 0xf) == 0x8)
+ ifthen_next_state = 0;
+ else
+ ifthen_next_state = (ifthen_state & 0xe0)
+ | ((ifthen_state & 0xf) << 1);
+ }
+ }
+
+ if (status)
+ {
+ info->memory_error_func (status, pc, info);
+ return -1;
+ }
+ if (info->flags & INSN_HAS_RELOC)
+ /* If the instruction has a reloc associated with it, then
+ the offset field in the instruction will actually be the
+ addend for the reloc. (We are using REL type relocs).
+ In such cases, we can ignore the pc when computing
+ addresses, since the addend is not currently pc-relative. */
+ pc = 0;
+
+ /* We include the hexdump of the instruction. The format here
+ matches that used by objdump and the ARM ARM (in particular,
+ 32 bit Thumb instructions are displayed as pairs of halfwords,
+ not as a single word.) */
+ if (is_thumb)
+ {
+ if (size == 2)
+ {
+ info->fprintf_func(info->stream, "%04lx ",
+ ((unsigned long)given) & 0xffff);
+ }
+ else
+ {
+ info->fprintf_func(info->stream, "%04lx %04lx ",
+ (((unsigned long)given) >> 16) & 0xffff,
+ ((unsigned long)given) & 0xffff);
+ }
+ }
+ else
+ {
+ info->fprintf_func(info->stream, "%08lx ",
+ ((unsigned long)given) & 0xffffffff);
+ }
+
+ printer (pc, info, given);
+
+ if (is_thumb)
+ {
+ ifthen_state = ifthen_next_state;
+ ifthen_address += size;
+ }
+ return size;
+}
diff --git a/qemu-0.15.x/arm-semi.c b/qemu-0.15.x/arm-semi.c
new file mode 100644
index 0000000..873518a
--- /dev/null
+++ b/qemu-0.15.x/arm-semi.c
@@ -0,0 +1,509 @@
+/*
+ * Arm "Angel" semihosting syscalls
+ *
+ * Copyright (c) 2005, 2007 CodeSourcery.
+ * Written by Paul Brook.
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+
+#include "cpu.h"
+#ifdef CONFIG_USER_ONLY
+#include "qemu.h"
+
+#define ARM_ANGEL_HEAP_SIZE (128 * 1024 * 1024)
+#else
+#include "qemu-common.h"
+#include "gdbstub.h"
+#include "hw/arm-misc.h"
+#endif
+
+#define SYS_OPEN 0x01
+#define SYS_CLOSE 0x02
+#define SYS_WRITEC 0x03
+#define SYS_WRITE0 0x04
+#define SYS_WRITE 0x05
+#define SYS_READ 0x06
+#define SYS_READC 0x07
+#define SYS_ISTTY 0x09
+#define SYS_SEEK 0x0a
+#define SYS_FLEN 0x0c
+#define SYS_TMPNAM 0x0d
+#define SYS_REMOVE 0x0e
+#define SYS_RENAME 0x0f
+#define SYS_CLOCK 0x10
+#define SYS_TIME 0x11
+#define SYS_SYSTEM 0x12
+#define SYS_ERRNO 0x13
+#define SYS_GET_CMDLINE 0x15
+#define SYS_HEAPINFO 0x16
+#define SYS_EXIT 0x18
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+#define GDB_O_RDONLY 0x000
+#define GDB_O_WRONLY 0x001
+#define GDB_O_RDWR 0x002
+#define GDB_O_APPEND 0x008
+#define GDB_O_CREAT 0x200
+#define GDB_O_TRUNC 0x400
+#define GDB_O_BINARY 0
+
+static int gdb_open_modeflags[12] = {
+ GDB_O_RDONLY,
+ GDB_O_RDONLY | GDB_O_BINARY,
+ GDB_O_RDWR,
+ GDB_O_RDWR | GDB_O_BINARY,
+ GDB_O_WRONLY | GDB_O_CREAT | GDB_O_TRUNC,
+ GDB_O_WRONLY | GDB_O_CREAT | GDB_O_TRUNC | GDB_O_BINARY,
+ GDB_O_RDWR | GDB_O_CREAT | GDB_O_TRUNC,
+ GDB_O_RDWR | GDB_O_CREAT | GDB_O_TRUNC | GDB_O_BINARY,
+ GDB_O_WRONLY | GDB_O_CREAT | GDB_O_APPEND,
+ GDB_O_WRONLY | GDB_O_CREAT | GDB_O_APPEND | GDB_O_BINARY,
+ GDB_O_RDWR | GDB_O_CREAT | GDB_O_APPEND,
+ GDB_O_RDWR | GDB_O_CREAT | GDB_O_APPEND | GDB_O_BINARY
+};
+
+static int open_modeflags[12] = {
+ O_RDONLY,
+ O_RDONLY | O_BINARY,
+ O_RDWR,
+ O_RDWR | O_BINARY,
+ O_WRONLY | O_CREAT | O_TRUNC,
+ O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
+ O_RDWR | O_CREAT | O_TRUNC,
+ O_RDWR | O_CREAT | O_TRUNC | O_BINARY,
+ O_WRONLY | O_CREAT | O_APPEND,
+ O_WRONLY | O_CREAT | O_APPEND | O_BINARY,
+ O_RDWR | O_CREAT | O_APPEND,
+ O_RDWR | O_CREAT | O_APPEND | O_BINARY
+};
+
+#ifdef CONFIG_USER_ONLY
+static inline uint32_t set_swi_errno(TaskState *ts, uint32_t code)
+{
+ if (code == (uint32_t)-1)
+ ts->swi_errno = errno;
+ return code;
+}
+#else
+static inline uint32_t set_swi_errno(CPUState *env, uint32_t code)
+{
+ return code;
+}
+
+#include "softmmu-semi.h"
+#endif
+
+static target_ulong arm_semi_syscall_len;
+
+#if !defined(CONFIG_USER_ONLY)
+static target_ulong syscall_err;
+#endif
+
+static void arm_semi_cb(CPUState *env, target_ulong ret, target_ulong err)
+{
+#ifdef CONFIG_USER_ONLY
+ TaskState *ts = env->opaque;
+#endif
+
+ if (ret == (target_ulong)-1) {
+#ifdef CONFIG_USER_ONLY
+ ts->swi_errno = err;
+#else
+ syscall_err = err;
+#endif
+ env->regs[0] = ret;
+ } else {
+ /* Fixup syscalls that use nonstardard return conventions. */
+ switch (env->regs[0]) {
+ case SYS_WRITE:
+ case SYS_READ:
+ env->regs[0] = arm_semi_syscall_len - ret;
+ break;
+ case SYS_SEEK:
+ env->regs[0] = 0;
+ break;
+ default:
+ env->regs[0] = ret;
+ break;
+ }
+ }
+}
+
+static void arm_semi_flen_cb(CPUState *env, target_ulong ret, target_ulong err)
+{
+ /* The size is always stored in big-endian order, extract
+ the value. We assume the size always fit in 32 bits. */
+ uint32_t size;
+ cpu_memory_rw_debug(env, env->regs[13]-64+32, (uint8_t *)&size, 4, 0);
+ env->regs[0] = be32_to_cpu(size);
+#ifdef CONFIG_USER_ONLY
+ ((TaskState *)env->opaque)->swi_errno = err;
+#else
+ syscall_err = err;
+#endif
+}
+
+#define ARG(n) \
+({ \
+ target_ulong __arg; \
+ /* FIXME - handle get_user() failure */ \
+ get_user_ual(__arg, args + (n) * 4); \
+ __arg; \
+})
+#define SET_ARG(n, val) put_user_ual(val, args + (n) * 4)
+uint32_t do_arm_semihosting(CPUState *env)
+{
+ target_ulong args;
+ char * s;
+ int nr;
+ uint32_t ret;
+ uint32_t len;
+#ifdef CONFIG_USER_ONLY
+ TaskState *ts = env->opaque;
+#else
+ CPUState *ts = env;
+#endif
+
+ nr = env->regs[0];
+ args = env->regs[1];
+ switch (nr) {
+ case SYS_OPEN:
+ if (!(s = lock_user_string(ARG(0))))
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ return (uint32_t)-1;
+ if (ARG(1) >= 12)
+ return (uint32_t)-1;
+ if (strcmp(s, ":tt") == 0) {
+ if (ARG(1) < 4)
+ return STDIN_FILENO;
+ else
+ return STDOUT_FILENO;
+ }
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_cb, "open,%s,%x,1a4", ARG(0),
+ (int)ARG(2)+1, gdb_open_modeflags[ARG(1)]);
+ return env->regs[0];
+ } else {
+ ret = set_swi_errno(ts, open(s, open_modeflags[ARG(1)], 0644));
+ }
+ unlock_user(s, ARG(0), 0);
+ return ret;
+ case SYS_CLOSE:
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_cb, "close,%x", ARG(0));
+ return env->regs[0];
+ } else {
+ return set_swi_errno(ts, close(ARG(0)));
+ }
+ case SYS_WRITEC:
+ {
+ char c;
+
+ if (get_user_u8(c, args))
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ return (uint32_t)-1;
+ /* Write to debug console. stderr is near enough. */
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_cb, "write,2,%x,1", args);
+ return env->regs[0];
+ } else {
+ return write(STDERR_FILENO, &c, 1);
+ }
+ }
+ case SYS_WRITE0:
+ if (!(s = lock_user_string(args)))
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ return (uint32_t)-1;
+ len = strlen(s);
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_cb, "write,2,%x,%x\n", args, len);
+ ret = env->regs[0];
+ } else {
+ ret = write(STDERR_FILENO, s, len);
+ }
+ unlock_user(s, args, 0);
+ return ret;
+ case SYS_WRITE:
+ len = ARG(2);
+ if (use_gdb_syscalls()) {
+ arm_semi_syscall_len = len;
+ gdb_do_syscall(arm_semi_cb, "write,%x,%x,%x", ARG(0), ARG(1), len);
+ return env->regs[0];
+ } else {
+ if (!(s = lock_user(VERIFY_READ, ARG(1), len, 1)))
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ return (uint32_t)-1;
+ ret = set_swi_errno(ts, write(ARG(0), s, len));
+ unlock_user(s, ARG(1), 0);
+ if (ret == (uint32_t)-1)
+ return -1;
+ return len - ret;
+ }
+ case SYS_READ:
+ len = ARG(2);
+ if (use_gdb_syscalls()) {
+ arm_semi_syscall_len = len;
+ gdb_do_syscall(arm_semi_cb, "read,%x,%x,%x", ARG(0), ARG(1), len);
+ return env->regs[0];
+ } else {
+ if (!(s = lock_user(VERIFY_WRITE, ARG(1), len, 0)))
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ return (uint32_t)-1;
+ do
+ ret = set_swi_errno(ts, read(ARG(0), s, len));
+ while (ret == -1 && errno == EINTR);
+ unlock_user(s, ARG(1), len);
+ if (ret == (uint32_t)-1)
+ return -1;
+ return len - ret;
+ }
+ case SYS_READC:
+ /* XXX: Read from debug cosole. Not implemented. */
+ return 0;
+ case SYS_ISTTY:
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_cb, "isatty,%x", ARG(0));
+ return env->regs[0];
+ } else {
+ return isatty(ARG(0));
+ }
+ case SYS_SEEK:
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_cb, "lseek,%x,%x,0", ARG(0), ARG(1));
+ return env->regs[0];
+ } else {
+ ret = set_swi_errno(ts, lseek(ARG(0), ARG(1), SEEK_SET));
+ if (ret == (uint32_t)-1)
+ return -1;
+ return 0;
+ }
+ case SYS_FLEN:
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_flen_cb, "fstat,%x,%x",
+ ARG(0), env->regs[13]-64);
+ return env->regs[0];
+ } else {
+ struct stat buf;
+ ret = set_swi_errno(ts, fstat(ARG(0), &buf));
+ if (ret == (uint32_t)-1)
+ return -1;
+ return buf.st_size;
+ }
+ case SYS_TMPNAM:
+ /* XXX: Not implemented. */
+ return -1;
+ case SYS_REMOVE:
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_cb, "unlink,%s", ARG(0), (int)ARG(1)+1);
+ ret = env->regs[0];
+ } else {
+ if (!(s = lock_user_string(ARG(0))))
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ return (uint32_t)-1;
+ ret = set_swi_errno(ts, remove(s));
+ unlock_user(s, ARG(0), 0);
+ }
+ return ret;
+ case SYS_RENAME:
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_cb, "rename,%s,%s",
+ ARG(0), (int)ARG(1)+1, ARG(2), (int)ARG(3)+1);
+ return env->regs[0];
+ } else {
+ char *s2;
+ s = lock_user_string(ARG(0));
+ s2 = lock_user_string(ARG(2));
+ if (!s || !s2)
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ ret = (uint32_t)-1;
+ else
+ ret = set_swi_errno(ts, rename(s, s2));
+ if (s2)
+ unlock_user(s2, ARG(2), 0);
+ if (s)
+ unlock_user(s, ARG(0), 0);
+ return ret;
+ }
+ case SYS_CLOCK:
+ return clock() / (CLOCKS_PER_SEC / 100);
+ case SYS_TIME:
+ return set_swi_errno(ts, time(NULL));
+ case SYS_SYSTEM:
+ if (use_gdb_syscalls()) {
+ gdb_do_syscall(arm_semi_cb, "system,%s", ARG(0), (int)ARG(1)+1);
+ return env->regs[0];
+ } else {
+ if (!(s = lock_user_string(ARG(0))))
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ return (uint32_t)-1;
+ ret = set_swi_errno(ts, system(s));
+ unlock_user(s, ARG(0), 0);
+ return ret;
+ }
+ case SYS_ERRNO:
+#ifdef CONFIG_USER_ONLY
+ return ts->swi_errno;
+#else
+ return syscall_err;
+#endif
+ case SYS_GET_CMDLINE:
+ {
+ /* Build a command-line from the original argv.
+ *
+ * The inputs are:
+ * * ARG(0), pointer to a buffer of at least the size
+ * specified in ARG(1).
+ * * ARG(1), size of the buffer pointed to by ARG(0) in
+ * bytes.
+ *
+ * The outputs are:
+ * * ARG(0), pointer to null-terminated string of the
+ * command line.
+ * * ARG(1), length of the string pointed to by ARG(0).
+ */
+
+ char *output_buffer;
+ size_t input_size = ARG(1);
+ size_t output_size;
+ int status = 0;
+
+ /* Compute the size of the output string. */
+#if !defined(CONFIG_USER_ONLY)
+ output_size = strlen(ts->boot_info->kernel_filename)
+ + 1 /* Separating space. */
+ + strlen(ts->boot_info->kernel_cmdline)
+ + 1; /* Terminating null byte. */
+#else
+ unsigned int i;
+
+ output_size = ts->info->arg_end - ts->info->arg_start;
+ if (!output_size) {
+ /* We special-case the "empty command line" case (argc==0).
+ Just provide the terminating 0. */
+ output_size = 1;
+ }
+#endif
+
+ if (output_size > input_size) {
+ /* Not enough space to store command-line arguments. */
+ return -1;
+ }
+
+ /* Adjust the command-line length. */
+ SET_ARG(1, output_size - 1);
+
+ /* Lock the buffer on the ARM side. */
+ output_buffer = lock_user(VERIFY_WRITE, ARG(0), output_size, 0);
+ if (!output_buffer) {
+ return -1;
+ }
+
+ /* Copy the command-line arguments. */
+#if !defined(CONFIG_USER_ONLY)
+ pstrcpy(output_buffer, output_size, ts->boot_info->kernel_filename);
+ pstrcat(output_buffer, output_size, " ");
+ pstrcat(output_buffer, output_size, ts->boot_info->kernel_cmdline);
+#else
+ if (output_size == 1) {
+ /* Empty command-line. */
+ output_buffer[0] = '\0';
+ goto out;
+ }
+
+ if (copy_from_user(output_buffer, ts->info->arg_start,
+ output_size)) {
+ status = -1;
+ goto out;
+ }
+
+ /* Separate arguments by white spaces. */
+ for (i = 0; i < output_size - 1; i++) {
+ if (output_buffer[i] == 0) {
+ output_buffer[i] = ' ';
+ }
+ }
+ out:
+#endif
+ /* Unlock the buffer on the ARM side. */
+ unlock_user(output_buffer, ARG(0), output_size);
+
+ return status;
+ }
+ case SYS_HEAPINFO:
+ {
+ uint32_t *ptr;
+ uint32_t limit;
+
+#ifdef CONFIG_USER_ONLY
+ /* Some C libraries assume the heap immediately follows .bss, so
+ allocate it using sbrk. */
+ if (!ts->heap_limit) {
+ abi_ulong ret;
+
+ ts->heap_base = do_brk(0);
+ limit = ts->heap_base + ARM_ANGEL_HEAP_SIZE;
+ /* Try a big heap, and reduce the size if that fails. */
+ for (;;) {
+ ret = do_brk(limit);
+ if (ret >= limit) {
+ break;
+ }
+ limit = (ts->heap_base >> 1) + (limit >> 1);
+ }
+ ts->heap_limit = limit;
+ }
+
+ if (!(ptr = lock_user(VERIFY_WRITE, ARG(0), 16, 0)))
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ return (uint32_t)-1;
+ ptr[0] = tswap32(ts->heap_base);
+ ptr[1] = tswap32(ts->heap_limit);
+ ptr[2] = tswap32(ts->stack_base);
+ ptr[3] = tswap32(0); /* Stack limit. */
+ unlock_user(ptr, ARG(0), 16);
+#else
+ limit = ram_size;
+ if (!(ptr = lock_user(VERIFY_WRITE, ARG(0), 16, 0)))
+ /* FIXME - should this error code be -TARGET_EFAULT ? */
+ return (uint32_t)-1;
+ /* TODO: Make this use the limit of the loaded application. */
+ ptr[0] = tswap32(limit / 2);
+ ptr[1] = tswap32(limit);
+ ptr[2] = tswap32(limit); /* Stack base */
+ ptr[3] = tswap32(0); /* Stack limit. */
+ unlock_user(ptr, ARG(0), 16);
+#endif
+ return 0;
+ }
+ case SYS_EXIT:
+ gdb_exit(env, 0);
+ exit(0);
+ default:
+ fprintf(stderr, "qemu: Unsupported SemiHosting SWI 0x%02x\n", nr);
+ cpu_dump_state(env, stderr, fprintf, 0);
+ abort();
+ }
+}
diff --git a/qemu-0.15.x/arm.ld b/qemu-0.15.x/arm.ld
new file mode 100644
index 0000000..7f13da9
--- /dev/null
+++ b/qemu-0.15.x/arm.ld
@@ -0,0 +1,153 @@
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm",
+ "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+ . = 0x60000000 + SIZEOF_HEADERS;
+ .interp : { *(.interp) }
+ .hash : { *(.hash) }
+ .dynsym : { *(.dynsym) }
+ .dynstr : { *(.dynstr) }
+ .gnu.version : { *(.gnu.version) }
+ .gnu.version_d : { *(.gnu.version_d) }
+ .gnu.version_r : { *(.gnu.version_r) }
+ .rel.text :
+ { *(.rel.text) *(.rel.gnu.linkonce.t*) }
+ .rela.text :
+ { *(.rela.text) *(.rela.gnu.linkonce.t*) }
+ .rel.data :
+ { *(.rel.data) *(.rel.gnu.linkonce.d*) }
+ .rela.data :
+ { *(.rela.data) *(.rela.gnu.linkonce.d*) }
+ .rel.rodata :
+ { *(.rel.rodata) *(.rel.gnu.linkonce.r*) }
+ .rela.rodata :
+ { *(.rela.rodata) *(.rela.gnu.linkonce.r*) }
+ .rel.got : { *(.rel.got) }
+ .rela.got : { *(.rela.got) }
+ .rel.ctors : { *(.rel.ctors) }
+ .rela.ctors : { *(.rela.ctors) }
+ .rel.dtors : { *(.rel.dtors) }
+ .rela.dtors : { *(.rela.dtors) }
+ .rel.init : { *(.rel.init) }
+ .rela.init : { *(.rela.init) }
+ .rel.fini : { *(.rel.fini) }
+ .rela.fini : { *(.rela.fini) }
+ .rel.bss : { *(.rel.bss) }
+ .rela.bss : { *(.rela.bss) }
+ .rel.plt : { *(.rel.plt) }
+ .rela.plt : { *(.rela.plt) }
+ .init : { *(.init) } =0x47ff041f
+ .text :
+ {
+ *(.text)
+ /* .gnu.warning sections are handled specially by elf32.em. */
+ *(.gnu.warning)
+ *(.gnu.linkonce.t*)
+ } =0x47ff041f
+ _etext = .;
+ PROVIDE (etext = .);
+ .fini : { *(.fini) } =0x47ff041f
+ .rodata : { *(.rodata) *(.gnu.linkonce.r*) }
+ .rodata1 : { *(.rodata1) }
+ .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) }
+ __exidx_start = .;
+ .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }
+ __exidx_end = .;
+ .reginfo : { *(.reginfo) }
+ /* Adjust the address for the data segment. We want to adjust up to
+ the same address within the page on the next page up. */
+ . = ALIGN(0x100000) + (. & (0x100000 - 1));
+ .data :
+ {
+ *(.gen_code)
+ *(.data)
+ *(.gnu.linkonce.d*)
+ CONSTRUCTORS
+ }
+ .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) }
+ .data1 : { *(.data1) }
+ .preinit_array :
+ {
+ PROVIDE (__preinit_array_start = .);
+ KEEP (*(.preinit_array))
+ PROVIDE (__preinit_array_end = .);
+ }
+ .init_array :
+ {
+ PROVIDE (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array))
+ PROVIDE (__init_array_end = .);
+ }
+ .fini_array :
+ {
+ PROVIDE (__fini_array_start = .);
+ KEEP (*(.fini_array))
+ KEEP (*(SORT(.fini_array.*)))
+ PROVIDE (__fini_array_end = .);
+ }
+ .ctors :
+ {
+ *(.ctors)
+ }
+ .dtors :
+ {
+ *(.dtors)
+ }
+ .plt : { *(.plt) }
+ .got : { *(.got.plt) *(.got) }
+ .dynamic : { *(.dynamic) }
+ /* We want the small data sections together, so single-instruction offsets
+ can access them all, and initialized data all before uninitialized, so
+ we can shorten the on-disk segment size. */
+ .sdata : { *(.sdata) }
+ _edata = .;
+ PROVIDE (edata = .);
+ __bss_start = .;
+ .sbss : { *(.sbss) *(.scommon) }
+ .bss :
+ {
+ *(.dynbss)
+ *(.bss)
+ *(COMMON)
+ }
+ _end = . ;
+ PROVIDE (end = .);
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /* These must appear regardless of . */
+}
diff --git a/qemu-0.15.x/async.c b/qemu-0.15.x/async.c
new file mode 100644
index 0000000..fd313df
--- /dev/null
+++ b/qemu-0.15.x/async.c
@@ -0,0 +1,217 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * 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.
+ */
+
+#include "qemu-common.h"
+#include "qemu-aio.h"
+
+/*
+ * An AsyncContext protects the callbacks of AIO requests and Bottom Halves
+ * against interfering with each other. A typical example is qcow2 that accepts
+ * asynchronous requests, but relies for manipulation of its metadata on
+ * synchronous bdrv_read/write that doesn't trigger any callbacks.
+ *
+ * However, these functions are often emulated using AIO which means that AIO
+ * callbacks must be run - but at the same time we must not run callbacks of
+ * other requests as they might start to modify metadata and corrupt the
+ * internal state of the caller of bdrv_read/write.
+ *
+ * To achieve the desired semantics we switch into a new AsyncContext.
+ * Callbacks must only be run if they belong to the current AsyncContext.
+ * Otherwise they need to be queued until their own context is active again.
+ * This is how you can make qemu_aio_wait() wait only for your own callbacks.
+ *
+ * The AsyncContexts form a stack. When you leave a AsyncContexts, you always
+ * return to the old ("parent") context.
+ */
+struct AsyncContext {
+ /* Consecutive number of the AsyncContext (position in the stack) */
+ int id;
+
+ /* Anchor of the list of Bottom Halves belonging to the context */
+ struct QEMUBH *first_bh;
+
+ /* Link to parent context */
+ struct AsyncContext *parent;
+};
+
+/* The currently active AsyncContext */
+static struct AsyncContext *async_context = &(struct AsyncContext) { 0 };
+
+/*
+ * Enter a new AsyncContext. Already scheduled Bottom Halves and AIO callbacks
+ * won't be called until this context is left again.
+ */
+void async_context_push(void)
+{
+ struct AsyncContext *new = qemu_mallocz(sizeof(*new));
+ new->parent = async_context;
+ new->id = async_context->id + 1;
+ async_context = new;
+}
+
+/* Run queued AIO completions and destroy Bottom Half */
+static void bh_run_aio_completions(void *opaque)
+{
+ QEMUBH **bh = opaque;
+ qemu_bh_delete(*bh);
+ qemu_free(bh);
+ qemu_aio_process_queue();
+}
+/*
+ * Leave the currently active AsyncContext. All Bottom Halves belonging to the
+ * old context are executed before changing the context.
+ */
+void async_context_pop(void)
+{
+ struct AsyncContext *old = async_context;
+ QEMUBH **bh;
+
+ /* Flush the bottom halves, we don't want to lose them */
+ while (qemu_bh_poll());
+
+ /* Switch back to the parent context */
+ async_context = async_context->parent;
+ qemu_free(old);
+
+ if (async_context == NULL) {
+ abort();
+ }
+
+ /* Schedule BH to run any queued AIO completions as soon as possible */
+ bh = qemu_malloc(sizeof(*bh));
+ *bh = qemu_bh_new(bh_run_aio_completions, bh);
+ qemu_bh_schedule(*bh);
+}
+
+/*
+ * Returns the ID of the currently active AsyncContext
+ */
+int get_async_context_id(void)
+{
+ return async_context->id;
+}
+
+/***********************************************************/
+/* bottom halves (can be seen as timers which expire ASAP) */
+
+struct QEMUBH {
+ QEMUBHFunc *cb;
+ void *opaque;
+ int scheduled;
+ int idle;
+ int deleted;
+ QEMUBH *next;
+};
+
+QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
+{
+ QEMUBH *bh;
+ bh = qemu_mallocz(sizeof(QEMUBH));
+ bh->cb = cb;
+ bh->opaque = opaque;
+ bh->next = async_context->first_bh;
+ async_context->first_bh = bh;
+ return bh;
+}
+
+int qemu_bh_poll(void)
+{
+ QEMUBH *bh, **bhp, *next;
+ int ret;
+
+ ret = 0;
+ for (bh = async_context->first_bh; bh; bh = next) {
+ next = bh->next;
+ if (!bh->deleted && bh->scheduled) {
+ bh->scheduled = 0;
+ if (!bh->idle)
+ ret = 1;
+ bh->idle = 0;
+ bh->cb(bh->opaque);
+ }
+ }
+
+ /* remove deleted bhs */
+ bhp = &async_context->first_bh;
+ while (*bhp) {
+ bh = *bhp;
+ if (bh->deleted) {
+ *bhp = bh->next;
+ qemu_free(bh);
+ } else
+ bhp = &bh->next;
+ }
+
+ return ret;
+}
+
+void qemu_bh_schedule_idle(QEMUBH *bh)
+{
+ if (bh->scheduled)
+ return;
+ bh->scheduled = 1;
+ bh->idle = 1;
+}
+
+void qemu_bh_schedule(QEMUBH *bh)
+{
+ if (bh->scheduled)
+ return;
+ bh->scheduled = 1;
+ bh->idle = 0;
+ /* stop the currently executing CPU to execute the BH ASAP */
+ qemu_notify_event();
+}
+
+void qemu_bh_cancel(QEMUBH *bh)
+{
+ bh->scheduled = 0;
+}
+
+void qemu_bh_delete(QEMUBH *bh)
+{
+ bh->scheduled = 0;
+ bh->deleted = 1;
+}
+
+void qemu_bh_update_timeout(int *timeout)
+{
+ QEMUBH *bh;
+
+ for (bh = async_context->first_bh; bh; bh = bh->next) {
+ if (!bh->deleted && bh->scheduled) {
+ if (bh->idle) {
+ /* idle bottom halves will be polled at least
+ * every 10ms */
+ *timeout = MIN(10, *timeout);
+ } else {
+ /* non-idle bottom halves will be executed
+ * immediately */
+ *timeout = 0;
+ break;
+ }
+ }
+ }
+}
+
diff --git a/qemu-0.15.x/audio/alsaaudio.c b/qemu-0.15.x/audio/alsaaudio.c
new file mode 100644
index 0000000..4d72014
--- /dev/null
+++ b/qemu-0.15.x/audio/alsaaudio.c
@@ -0,0 +1,1260 @@
+/*
+ * QEMU ALSA audio driver
+ *
+ * Copyright (c) 2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#include <alsa/asoundlib.h>
+#include "qemu-common.h"
+#include "qemu-char.h"
+#include "audio.h"
+
+#if QEMU_GNUC_PREREQ(4, 3)
+#pragma GCC diagnostic ignored "-Waddress"
+#endif
+
+#define AUDIO_CAP "alsa"
+#include "audio_int.h"
+
+struct pollhlp {
+ snd_pcm_t *handle;
+ struct pollfd *pfds;
+ int count;
+ int mask;
+};
+
+typedef struct ALSAVoiceOut {
+ HWVoiceOut hw;
+ int wpos;
+ int pending;
+ void *pcm_buf;
+ snd_pcm_t *handle;
+ struct pollhlp pollhlp;
+} ALSAVoiceOut;
+
+typedef struct ALSAVoiceIn {
+ HWVoiceIn hw;
+ snd_pcm_t *handle;
+ void *pcm_buf;
+ struct pollhlp pollhlp;
+} ALSAVoiceIn;
+
+static struct {
+ int size_in_usec_in;
+ int size_in_usec_out;
+ const char *pcm_name_in;
+ const char *pcm_name_out;
+ unsigned int buffer_size_in;
+ unsigned int period_size_in;
+ unsigned int buffer_size_out;
+ unsigned int period_size_out;
+ unsigned int threshold;
+
+ int buffer_size_in_overridden;
+ int period_size_in_overridden;
+
+ int buffer_size_out_overridden;
+ int period_size_out_overridden;
+ int verbose;
+} conf = {
+ .buffer_size_out = 4096,
+ .period_size_out = 1024,
+ .pcm_name_out = "default",
+ .pcm_name_in = "default",
+};
+
+struct alsa_params_req {
+ int freq;
+ snd_pcm_format_t fmt;
+ int nchannels;
+ int size_in_usec;
+ int override_mask;
+ unsigned int buffer_size;
+ unsigned int period_size;
+};
+
+struct alsa_params_obt {
+ int freq;
+ audfmt_e fmt;
+ int endianness;
+ int nchannels;
+ snd_pcm_uframes_t samples;
+};
+
+static void GCC_FMT_ATTR (2, 3) alsa_logerr (int err, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n", snd_strerror (err));
+}
+
+static void GCC_FMT_ATTR (3, 4) alsa_logerr2 (
+ int err,
+ const char *typ,
+ const char *fmt,
+ ...
+ )
+{
+ va_list ap;
+
+ AUD_log (AUDIO_CAP, "Could not initialize %s\n", typ);
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n", snd_strerror (err));
+}
+
+static void alsa_fini_poll (struct pollhlp *hlp)
+{
+ int i;
+ struct pollfd *pfds = hlp->pfds;
+
+ if (pfds) {
+ for (i = 0; i < hlp->count; ++i) {
+ qemu_set_fd_handler (pfds[i].fd, NULL, NULL, NULL);
+ }
+ qemu_free (pfds);
+ }
+ hlp->pfds = NULL;
+ hlp->count = 0;
+ hlp->handle = NULL;
+}
+
+static void alsa_anal_close1 (snd_pcm_t **handlep)
+{
+ int err = snd_pcm_close (*handlep);
+ if (err) {
+ alsa_logerr (err, "Failed to close PCM handle %p\n", *handlep);
+ }
+ *handlep = NULL;
+}
+
+static void alsa_anal_close (snd_pcm_t **handlep, struct pollhlp *hlp)
+{
+ alsa_fini_poll (hlp);
+ alsa_anal_close1 (handlep);
+}
+
+static int alsa_recover (snd_pcm_t *handle)
+{
+ int err = snd_pcm_prepare (handle);
+ if (err < 0) {
+ alsa_logerr (err, "Failed to prepare handle %p\n", handle);
+ return -1;
+ }
+ return 0;
+}
+
+static int alsa_resume (snd_pcm_t *handle)
+{
+ int err = snd_pcm_resume (handle);
+ if (err < 0) {
+ alsa_logerr (err, "Failed to resume handle %p\n", handle);
+ return -1;
+ }
+ return 0;
+}
+
+static void alsa_poll_handler (void *opaque)
+{
+ int err, count;
+ snd_pcm_state_t state;
+ struct pollhlp *hlp = opaque;
+ unsigned short revents;
+
+ count = poll (hlp->pfds, hlp->count, 0);
+ if (count < 0) {
+ dolog ("alsa_poll_handler: poll %s\n", strerror (errno));
+ return;
+ }
+
+ if (!count) {
+ return;
+ }
+
+ /* XXX: ALSA example uses initial count, not the one returned by
+ poll, correct? */
+ err = snd_pcm_poll_descriptors_revents (hlp->handle, hlp->pfds,
+ hlp->count, &revents);
+ if (err < 0) {
+ alsa_logerr (err, "snd_pcm_poll_descriptors_revents");
+ return;
+ }
+
+ if (!(revents & hlp->mask)) {
+ if (conf.verbose) {
+ dolog ("revents = %d\n", revents);
+ }
+ return;
+ }
+
+ state = snd_pcm_state (hlp->handle);
+ switch (state) {
+ case SND_PCM_STATE_SETUP:
+ alsa_recover (hlp->handle);
+ break;
+
+ case SND_PCM_STATE_XRUN:
+ alsa_recover (hlp->handle);
+ break;
+
+ case SND_PCM_STATE_SUSPENDED:
+ alsa_resume (hlp->handle);
+ break;
+
+ case SND_PCM_STATE_PREPARED:
+ audio_run ("alsa run (prepared)");
+ break;
+
+ case SND_PCM_STATE_RUNNING:
+ audio_run ("alsa run (running)");
+ break;
+
+ default:
+ dolog ("Unexpected state %d\n", state);
+ }
+}
+
+static int alsa_poll_helper (snd_pcm_t *handle, struct pollhlp *hlp, int mask)
+{
+ int i, count, err;
+ struct pollfd *pfds;
+
+ count = snd_pcm_poll_descriptors_count (handle);
+ if (count <= 0) {
+ dolog ("Could not initialize poll mode\n"
+ "Invalid number of poll descriptors %d\n", count);
+ return -1;
+ }
+
+ pfds = audio_calloc ("alsa_poll_helper", count, sizeof (*pfds));
+ if (!pfds) {
+ dolog ("Could not initialize poll mode\n");
+ return -1;
+ }
+
+ err = snd_pcm_poll_descriptors (handle, pfds, count);
+ if (err < 0) {
+ alsa_logerr (err, "Could not initialize poll mode\n"
+ "Could not obtain poll descriptors\n");
+ qemu_free (pfds);
+ return -1;
+ }
+
+ for (i = 0; i < count; ++i) {
+ if (pfds[i].events & POLLIN) {
+ err = qemu_set_fd_handler (pfds[i].fd, alsa_poll_handler,
+ NULL, hlp);
+ }
+ if (pfds[i].events & POLLOUT) {
+ if (conf.verbose) {
+ dolog ("POLLOUT %d %d\n", i, pfds[i].fd);
+ }
+ err = qemu_set_fd_handler (pfds[i].fd, NULL,
+ alsa_poll_handler, hlp);
+ }
+ if (conf.verbose) {
+ dolog ("Set handler events=%#x index=%d fd=%d err=%d\n",
+ pfds[i].events, i, pfds[i].fd, err);
+ }
+
+ if (err) {
+ dolog ("Failed to set handler events=%#x index=%d fd=%d err=%d\n",
+ pfds[i].events, i, pfds[i].fd, err);
+
+ while (i--) {
+ qemu_set_fd_handler (pfds[i].fd, NULL, NULL, NULL);
+ }
+ qemu_free (pfds);
+ return -1;
+ }
+ }
+ hlp->pfds = pfds;
+ hlp->count = count;
+ hlp->handle = handle;
+ hlp->mask = mask;
+ return 0;
+}
+
+static int alsa_poll_out (HWVoiceOut *hw)
+{
+ ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
+
+ return alsa_poll_helper (alsa->handle, &alsa->pollhlp, POLLOUT);
+}
+
+static int alsa_poll_in (HWVoiceIn *hw)
+{
+ ALSAVoiceIn *alsa = (ALSAVoiceIn *) hw;
+
+ return alsa_poll_helper (alsa->handle, &alsa->pollhlp, POLLIN);
+}
+
+static int alsa_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static snd_pcm_format_t aud_to_alsafmt (audfmt_e fmt, int endianness)
+{
+ switch (fmt) {
+ case AUD_FMT_S8:
+ return SND_PCM_FORMAT_S8;
+
+ case AUD_FMT_U8:
+ return SND_PCM_FORMAT_U8;
+
+ case AUD_FMT_S16:
+ if (endianness) {
+ return SND_PCM_FORMAT_S16_BE;
+ }
+ else {
+ return SND_PCM_FORMAT_S16_LE;
+ }
+
+ case AUD_FMT_U16:
+ if (endianness) {
+ return SND_PCM_FORMAT_U16_BE;
+ }
+ else {
+ return SND_PCM_FORMAT_U16_LE;
+ }
+
+ case AUD_FMT_S32:
+ if (endianness) {
+ return SND_PCM_FORMAT_S32_BE;
+ }
+ else {
+ return SND_PCM_FORMAT_S32_LE;
+ }
+
+ case AUD_FMT_U32:
+ if (endianness) {
+ return SND_PCM_FORMAT_U32_BE;
+ }
+ else {
+ return SND_PCM_FORMAT_U32_LE;
+ }
+
+ default:
+ dolog ("Internal logic error: Bad audio format %d\n", fmt);
+#ifdef DEBUG_AUDIO
+ abort ();
+#endif
+ return SND_PCM_FORMAT_U8;
+ }
+}
+
+static int alsa_to_audfmt (snd_pcm_format_t alsafmt, audfmt_e *fmt,
+ int *endianness)
+{
+ switch (alsafmt) {
+ case SND_PCM_FORMAT_S8:
+ *endianness = 0;
+ *fmt = AUD_FMT_S8;
+ break;
+
+ case SND_PCM_FORMAT_U8:
+ *endianness = 0;
+ *fmt = AUD_FMT_U8;
+ break;
+
+ case SND_PCM_FORMAT_S16_LE:
+ *endianness = 0;
+ *fmt = AUD_FMT_S16;
+ break;
+
+ case SND_PCM_FORMAT_U16_LE:
+ *endianness = 0;
+ *fmt = AUD_FMT_U16;
+ break;
+
+ case SND_PCM_FORMAT_S16_BE:
+ *endianness = 1;
+ *fmt = AUD_FMT_S16;
+ break;
+
+ case SND_PCM_FORMAT_U16_BE:
+ *endianness = 1;
+ *fmt = AUD_FMT_U16;
+ break;
+
+ case SND_PCM_FORMAT_S32_LE:
+ *endianness = 0;
+ *fmt = AUD_FMT_S32;
+ break;
+
+ case SND_PCM_FORMAT_U32_LE:
+ *endianness = 0;
+ *fmt = AUD_FMT_U32;
+ break;
+
+ case SND_PCM_FORMAT_S32_BE:
+ *endianness = 1;
+ *fmt = AUD_FMT_S32;
+ break;
+
+ case SND_PCM_FORMAT_U32_BE:
+ *endianness = 1;
+ *fmt = AUD_FMT_U32;
+ break;
+
+ default:
+ dolog ("Unrecognized audio format %d\n", alsafmt);
+ return -1;
+ }
+
+ return 0;
+}
+
+static void alsa_dump_info (struct alsa_params_req *req,
+ struct alsa_params_obt *obt,
+ snd_pcm_format_t obtfmt)
+{
+ dolog ("parameter | requested value | obtained value\n");
+ dolog ("format | %10d | %10d\n", req->fmt, obtfmt);
+ dolog ("channels | %10d | %10d\n",
+ req->nchannels, obt->nchannels);
+ dolog ("frequency | %10d | %10d\n", req->freq, obt->freq);
+ dolog ("============================================\n");
+ dolog ("requested: buffer size %d period size %d\n",
+ req->buffer_size, req->period_size);
+ dolog ("obtained: samples %ld\n", obt->samples);
+}
+
+static void alsa_set_threshold (snd_pcm_t *handle, snd_pcm_uframes_t threshold)
+{
+ int err;
+ snd_pcm_sw_params_t *sw_params;
+
+ snd_pcm_sw_params_alloca (&sw_params);
+
+ err = snd_pcm_sw_params_current (handle, sw_params);
+ if (err < 0) {
+ dolog ("Could not fully initialize DAC\n");
+ alsa_logerr (err, "Failed to get current software parameters\n");
+ return;
+ }
+
+ err = snd_pcm_sw_params_set_start_threshold (handle, sw_params, threshold);
+ if (err < 0) {
+ dolog ("Could not fully initialize DAC\n");
+ alsa_logerr (err, "Failed to set software threshold to %ld\n",
+ threshold);
+ return;
+ }
+
+ err = snd_pcm_sw_params (handle, sw_params);
+ if (err < 0) {
+ dolog ("Could not fully initialize DAC\n");
+ alsa_logerr (err, "Failed to set software parameters\n");
+ return;
+ }
+}
+
+static int alsa_open (int in, struct alsa_params_req *req,
+ struct alsa_params_obt *obt, snd_pcm_t **handlep)
+{
+ snd_pcm_t *handle;
+ snd_pcm_hw_params_t *hw_params;
+ int err;
+ int size_in_usec;
+ unsigned int freq, nchannels;
+ const char *pcm_name = in ? conf.pcm_name_in : conf.pcm_name_out;
+ snd_pcm_uframes_t obt_buffer_size;
+ const char *typ = in ? "ADC" : "DAC";
+ snd_pcm_format_t obtfmt;
+
+ freq = req->freq;
+ nchannels = req->nchannels;
+ size_in_usec = req->size_in_usec;
+
+ snd_pcm_hw_params_alloca (&hw_params);
+
+ err = snd_pcm_open (
+ &handle,
+ pcm_name,
+ in ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK,
+ SND_PCM_NONBLOCK
+ );
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to open `%s':\n", pcm_name);
+ return -1;
+ }
+
+ err = snd_pcm_hw_params_any (handle, hw_params);
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to initialize hardware parameters\n");
+ goto err;
+ }
+
+ err = snd_pcm_hw_params_set_access (
+ handle,
+ hw_params,
+ SND_PCM_ACCESS_RW_INTERLEAVED
+ );
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to set access type\n");
+ goto err;
+ }
+
+ err = snd_pcm_hw_params_set_format (handle, hw_params, req->fmt);
+ if (err < 0 && conf.verbose) {
+ alsa_logerr2 (err, typ, "Failed to set format %d\n", req->fmt);
+ }
+
+ err = snd_pcm_hw_params_set_rate_near (handle, hw_params, &freq, 0);
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to set frequency %d\n", req->freq);
+ goto err;
+ }
+
+ err = snd_pcm_hw_params_set_channels_near (
+ handle,
+ hw_params,
+ &nchannels
+ );
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to set number of channels %d\n",
+ req->nchannels);
+ goto err;
+ }
+
+ if (nchannels != 1 && nchannels != 2) {
+ alsa_logerr2 (err, typ,
+ "Can not handle obtained number of channels %d\n",
+ nchannels);
+ goto err;
+ }
+
+ if (req->buffer_size) {
+ unsigned long obt;
+
+ if (size_in_usec) {
+ int dir = 0;
+ unsigned int btime = req->buffer_size;
+
+ err = snd_pcm_hw_params_set_buffer_time_near (
+ handle,
+ hw_params,
+ &btime,
+ &dir
+ );
+ obt = btime;
+ }
+ else {
+ snd_pcm_uframes_t bsize = req->buffer_size;
+
+ err = snd_pcm_hw_params_set_buffer_size_near (
+ handle,
+ hw_params,
+ &bsize
+ );
+ obt = bsize;
+ }
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to set buffer %s to %d\n",
+ size_in_usec ? "time" : "size", req->buffer_size);
+ goto err;
+ }
+
+ if ((req->override_mask & 2) && (obt - req->buffer_size))
+ dolog ("Requested buffer %s %u was rejected, using %lu\n",
+ size_in_usec ? "time" : "size", req->buffer_size, obt);
+ }
+
+ if (req->period_size) {
+ unsigned long obt;
+
+ if (size_in_usec) {
+ int dir = 0;
+ unsigned int ptime = req->period_size;
+
+ err = snd_pcm_hw_params_set_period_time_near (
+ handle,
+ hw_params,
+ &ptime,
+ &dir
+ );
+ obt = ptime;
+ }
+ else {
+ int dir = 0;
+ snd_pcm_uframes_t psize = req->period_size;
+
+ err = snd_pcm_hw_params_set_period_size_near (
+ handle,
+ hw_params,
+ &psize,
+ &dir
+ );
+ obt = psize;
+ }
+
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to set period %s to %d\n",
+ size_in_usec ? "time" : "size", req->period_size);
+ goto err;
+ }
+
+ if (((req->override_mask & 1) && (obt - req->period_size)))
+ dolog ("Requested period %s %u was rejected, using %lu\n",
+ size_in_usec ? "time" : "size", req->period_size, obt);
+ }
+
+ err = snd_pcm_hw_params (handle, hw_params);
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to apply audio parameters\n");
+ goto err;
+ }
+
+ err = snd_pcm_hw_params_get_buffer_size (hw_params, &obt_buffer_size);
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to get buffer size\n");
+ goto err;
+ }
+
+ err = snd_pcm_hw_params_get_format (hw_params, &obtfmt);
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Failed to get format\n");
+ goto err;
+ }
+
+ if (alsa_to_audfmt (obtfmt, &obt->fmt, &obt->endianness)) {
+ dolog ("Invalid format was returned %d\n", obtfmt);
+ goto err;
+ }
+
+ err = snd_pcm_prepare (handle);
+ if (err < 0) {
+ alsa_logerr2 (err, typ, "Could not prepare handle %p\n", handle);
+ goto err;
+ }
+
+ if (!in && conf.threshold) {
+ snd_pcm_uframes_t threshold;
+ int bytes_per_sec;
+
+ bytes_per_sec = freq << (nchannels == 2);
+
+ switch (obt->fmt) {
+ case AUD_FMT_S8:
+ case AUD_FMT_U8:
+ break;
+
+ case AUD_FMT_S16:
+ case AUD_FMT_U16:
+ bytes_per_sec <<= 1;
+ break;
+
+ case AUD_FMT_S32:
+ case AUD_FMT_U32:
+ bytes_per_sec <<= 2;
+ break;
+ }
+
+ threshold = (conf.threshold * bytes_per_sec) / 1000;
+ alsa_set_threshold (handle, threshold);
+ }
+
+ obt->nchannels = nchannels;
+ obt->freq = freq;
+ obt->samples = obt_buffer_size;
+
+ *handlep = handle;
+
+ if (conf.verbose &&
+ (obtfmt != req->fmt ||
+ obt->nchannels != req->nchannels ||
+ obt->freq != req->freq)) {
+ dolog ("Audio parameters for %s\n", typ);
+ alsa_dump_info (req, obt, obtfmt);
+ }
+
+#ifdef DEBUG
+ alsa_dump_info (req, obt, obtfmt);
+#endif
+ return 0;
+
+ err:
+ alsa_anal_close1 (&handle);
+ return -1;
+}
+
+static snd_pcm_sframes_t alsa_get_avail (snd_pcm_t *handle)
+{
+ snd_pcm_sframes_t avail;
+
+ avail = snd_pcm_avail_update (handle);
+ if (avail < 0) {
+ if (avail == -EPIPE) {
+ if (!alsa_recover (handle)) {
+ avail = snd_pcm_avail_update (handle);
+ }
+ }
+
+ if (avail < 0) {
+ alsa_logerr (avail,
+ "Could not obtain number of available frames\n");
+ return -1;
+ }
+ }
+
+ return avail;
+}
+
+static void alsa_write_pending (ALSAVoiceOut *alsa)
+{
+ HWVoiceOut *hw = &alsa->hw;
+
+ while (alsa->pending) {
+ int left_till_end_samples = hw->samples - alsa->wpos;
+ int len = audio_MIN (alsa->pending, left_till_end_samples);
+ char *src = advance (alsa->pcm_buf, alsa->wpos << hw->info.shift);
+
+ while (len) {
+ snd_pcm_sframes_t written;
+
+ written = snd_pcm_writei (alsa->handle, src, len);
+
+ if (written <= 0) {
+ switch (written) {
+ case 0:
+ if (conf.verbose) {
+ dolog ("Failed to write %d frames (wrote zero)\n", len);
+ }
+ return;
+
+ case -EPIPE:
+ if (alsa_recover (alsa->handle)) {
+ alsa_logerr (written, "Failed to write %d frames\n",
+ len);
+ return;
+ }
+ if (conf.verbose) {
+ dolog ("Recovering from playback xrun\n");
+ }
+ continue;
+
+ case -ESTRPIPE:
+ /* stream is suspended and waiting for an
+ application recovery */
+ if (alsa_resume (alsa->handle)) {
+ alsa_logerr (written, "Failed to write %d frames\n",
+ len);
+ return;
+ }
+ if (conf.verbose) {
+ dolog ("Resuming suspended output stream\n");
+ }
+ continue;
+
+ case -EAGAIN:
+ return;
+
+ default:
+ alsa_logerr (written, "Failed to write %d frames from %p\n",
+ len, src);
+ return;
+ }
+ }
+
+ alsa->wpos = (alsa->wpos + written) % hw->samples;
+ alsa->pending -= written;
+ len -= written;
+ }
+ }
+}
+
+static int alsa_run_out (HWVoiceOut *hw, int live)
+{
+ ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
+ int decr;
+ snd_pcm_sframes_t avail;
+
+ avail = alsa_get_avail (alsa->handle);
+ if (avail < 0) {
+ dolog ("Could not get number of available playback frames\n");
+ return 0;
+ }
+
+ decr = audio_MIN (live, avail);
+ decr = audio_pcm_hw_clip_out (hw, alsa->pcm_buf, decr, alsa->pending);
+ alsa->pending += decr;
+ alsa_write_pending (alsa);
+ return decr;
+}
+
+static void alsa_fini_out (HWVoiceOut *hw)
+{
+ ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
+
+ ldebug ("alsa_fini\n");
+ alsa_anal_close (&alsa->handle, &alsa->pollhlp);
+
+ if (alsa->pcm_buf) {
+ qemu_free (alsa->pcm_buf);
+ alsa->pcm_buf = NULL;
+ }
+}
+
+static int alsa_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
+ struct alsa_params_req req;
+ struct alsa_params_obt obt;
+ snd_pcm_t *handle;
+ struct audsettings obt_as;
+
+ req.fmt = aud_to_alsafmt (as->fmt, as->endianness);
+ req.freq = as->freq;
+ req.nchannels = as->nchannels;
+ req.period_size = conf.period_size_out;
+ req.buffer_size = conf.buffer_size_out;
+ req.size_in_usec = conf.size_in_usec_out;
+ req.override_mask =
+ (conf.period_size_out_overridden ? 1 : 0) |
+ (conf.buffer_size_out_overridden ? 2 : 0);
+
+ if (alsa_open (0, &req, &obt, &handle)) {
+ return -1;
+ }
+
+ obt_as.freq = obt.freq;
+ obt_as.nchannels = obt.nchannels;
+ obt_as.fmt = obt.fmt;
+ obt_as.endianness = obt.endianness;
+
+ audio_pcm_init_info (&hw->info, &obt_as);
+ hw->samples = obt.samples;
+
+ alsa->pcm_buf = audio_calloc (AUDIO_FUNC, obt.samples, 1 << hw->info.shift);
+ if (!alsa->pcm_buf) {
+ dolog ("Could not allocate DAC buffer (%d samples, each %d bytes)\n",
+ hw->samples, 1 << hw->info.shift);
+ alsa_anal_close1 (&handle);
+ return -1;
+ }
+
+ alsa->handle = handle;
+ return 0;
+}
+
+#define VOICE_CTL_PAUSE 0
+#define VOICE_CTL_PREPARE 1
+#define VOICE_CTL_START 2
+
+static int alsa_voice_ctl (snd_pcm_t *handle, const char *typ, int ctl)
+{
+ int err;
+
+ if (ctl == VOICE_CTL_PAUSE) {
+ err = snd_pcm_drop (handle);
+ if (err < 0) {
+ alsa_logerr (err, "Could not stop %s\n", typ);
+ return -1;
+ }
+ }
+ else {
+ err = snd_pcm_prepare (handle);
+ if (err < 0) {
+ alsa_logerr (err, "Could not prepare handle for %s\n", typ);
+ return -1;
+ }
+ if (ctl == VOICE_CTL_START) {
+ err = snd_pcm_start(handle);
+ if (err < 0) {
+ alsa_logerr (err, "Could not start handle for %s\n", typ);
+ return -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int alsa_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ {
+ va_list ap;
+ int poll_mode;
+
+ va_start (ap, cmd);
+ poll_mode = va_arg (ap, int);
+ va_end (ap);
+
+ ldebug ("enabling voice\n");
+ if (poll_mode && alsa_poll_out (hw)) {
+ poll_mode = 0;
+ }
+ hw->poll_mode = poll_mode;
+ return alsa_voice_ctl (alsa->handle, "playback", VOICE_CTL_PREPARE);
+ }
+
+ case VOICE_DISABLE:
+ ldebug ("disabling voice\n");
+ if (hw->poll_mode) {
+ hw->poll_mode = 0;
+ alsa_fini_poll (&alsa->pollhlp);
+ }
+ return alsa_voice_ctl (alsa->handle, "playback", VOICE_CTL_PAUSE);
+ }
+
+ return -1;
+}
+
+static int alsa_init_in (HWVoiceIn *hw, struct audsettings *as)
+{
+ ALSAVoiceIn *alsa = (ALSAVoiceIn *) hw;
+ struct alsa_params_req req;
+ struct alsa_params_obt obt;
+ snd_pcm_t *handle;
+ struct audsettings obt_as;
+
+ req.fmt = aud_to_alsafmt (as->fmt, as->endianness);
+ req.freq = as->freq;
+ req.nchannels = as->nchannels;
+ req.period_size = conf.period_size_in;
+ req.buffer_size = conf.buffer_size_in;
+ req.size_in_usec = conf.size_in_usec_in;
+ req.override_mask =
+ (conf.period_size_in_overridden ? 1 : 0) |
+ (conf.buffer_size_in_overridden ? 2 : 0);
+
+ if (alsa_open (1, &req, &obt, &handle)) {
+ return -1;
+ }
+
+ obt_as.freq = obt.freq;
+ obt_as.nchannels = obt.nchannels;
+ obt_as.fmt = obt.fmt;
+ obt_as.endianness = obt.endianness;
+
+ audio_pcm_init_info (&hw->info, &obt_as);
+ hw->samples = obt.samples;
+
+ alsa->pcm_buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
+ if (!alsa->pcm_buf) {
+ dolog ("Could not allocate ADC buffer (%d samples, each %d bytes)\n",
+ hw->samples, 1 << hw->info.shift);
+ alsa_anal_close1 (&handle);
+ return -1;
+ }
+
+ alsa->handle = handle;
+ return 0;
+}
+
+static void alsa_fini_in (HWVoiceIn *hw)
+{
+ ALSAVoiceIn *alsa = (ALSAVoiceIn *) hw;
+
+ alsa_anal_close (&alsa->handle, &alsa->pollhlp);
+
+ if (alsa->pcm_buf) {
+ qemu_free (alsa->pcm_buf);
+ alsa->pcm_buf = NULL;
+ }
+}
+
+static int alsa_run_in (HWVoiceIn *hw)
+{
+ ALSAVoiceIn *alsa = (ALSAVoiceIn *) hw;
+ int hwshift = hw->info.shift;
+ int i;
+ int live = audio_pcm_hw_get_live_in (hw);
+ int dead = hw->samples - live;
+ int decr;
+ struct {
+ int add;
+ int len;
+ } bufs[2] = {
+ { .add = hw->wpos, .len = 0 },
+ { .add = 0, .len = 0 }
+ };
+ snd_pcm_sframes_t avail;
+ snd_pcm_uframes_t read_samples = 0;
+
+ if (!dead) {
+ return 0;
+ }
+
+ avail = alsa_get_avail (alsa->handle);
+ if (avail < 0) {
+ dolog ("Could not get number of captured frames\n");
+ return 0;
+ }
+
+ if (!avail) {
+ snd_pcm_state_t state;
+
+ state = snd_pcm_state (alsa->handle);
+ switch (state) {
+ case SND_PCM_STATE_PREPARED:
+ avail = hw->samples;
+ break;
+ case SND_PCM_STATE_SUSPENDED:
+ /* stream is suspended and waiting for an application recovery */
+ if (alsa_resume (alsa->handle)) {
+ dolog ("Failed to resume suspended input stream\n");
+ return 0;
+ }
+ if (conf.verbose) {
+ dolog ("Resuming suspended input stream\n");
+ }
+ break;
+ default:
+ if (conf.verbose) {
+ dolog ("No frames available and ALSA state is %d\n", state);
+ }
+ return 0;
+ }
+ }
+
+ decr = audio_MIN (dead, avail);
+ if (!decr) {
+ return 0;
+ }
+
+ if (hw->wpos + decr > hw->samples) {
+ bufs[0].len = (hw->samples - hw->wpos);
+ bufs[1].len = (decr - (hw->samples - hw->wpos));
+ }
+ else {
+ bufs[0].len = decr;
+ }
+
+ for (i = 0; i < 2; ++i) {
+ void *src;
+ struct st_sample *dst;
+ snd_pcm_sframes_t nread;
+ snd_pcm_uframes_t len;
+
+ len = bufs[i].len;
+
+ src = advance (alsa->pcm_buf, bufs[i].add << hwshift);
+ dst = hw->conv_buf + bufs[i].add;
+
+ while (len) {
+ nread = snd_pcm_readi (alsa->handle, src, len);
+
+ if (nread <= 0) {
+ switch (nread) {
+ case 0:
+ if (conf.verbose) {
+ dolog ("Failed to read %ld frames (read zero)\n", len);
+ }
+ goto exit;
+
+ case -EPIPE:
+ if (alsa_recover (alsa->handle)) {
+ alsa_logerr (nread, "Failed to read %ld frames\n", len);
+ goto exit;
+ }
+ if (conf.verbose) {
+ dolog ("Recovering from capture xrun\n");
+ }
+ continue;
+
+ case -EAGAIN:
+ goto exit;
+
+ default:
+ alsa_logerr (
+ nread,
+ "Failed to read %ld frames from %p\n",
+ len,
+ src
+ );
+ goto exit;
+ }
+ }
+
+ hw->conv (dst, src, nread);
+
+ src = advance (src, nread << hwshift);
+ dst += nread;
+
+ read_samples += nread;
+ len -= nread;
+ }
+ }
+
+ exit:
+ hw->wpos = (hw->wpos + read_samples) % hw->samples;
+ return read_samples;
+}
+
+static int alsa_read (SWVoiceIn *sw, void *buf, int size)
+{
+ return audio_pcm_sw_read (sw, buf, size);
+}
+
+static int alsa_ctl_in (HWVoiceIn *hw, int cmd, ...)
+{
+ ALSAVoiceIn *alsa = (ALSAVoiceIn *) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ {
+ va_list ap;
+ int poll_mode;
+
+ va_start (ap, cmd);
+ poll_mode = va_arg (ap, int);
+ va_end (ap);
+
+ ldebug ("enabling voice\n");
+ if (poll_mode && alsa_poll_in (hw)) {
+ poll_mode = 0;
+ }
+ hw->poll_mode = poll_mode;
+
+ return alsa_voice_ctl (alsa->handle, "capture", VOICE_CTL_START);
+ }
+
+ case VOICE_DISABLE:
+ ldebug ("disabling voice\n");
+ if (hw->poll_mode) {
+ hw->poll_mode = 0;
+ alsa_fini_poll (&alsa->pollhlp);
+ }
+ return alsa_voice_ctl (alsa->handle, "capture", VOICE_CTL_PAUSE);
+ }
+
+ return -1;
+}
+
+static void *alsa_audio_init (void)
+{
+ return &conf;
+}
+
+static void alsa_audio_fini (void *opaque)
+{
+ (void) opaque;
+}
+
+static struct audio_option alsa_options[] = {
+ {
+ .name = "DAC_SIZE_IN_USEC",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.size_in_usec_out,
+ .descr = "DAC period/buffer size in microseconds (otherwise in frames)"
+ },
+ {
+ .name = "DAC_PERIOD_SIZE",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.period_size_out,
+ .descr = "DAC period size (0 to go with system default)",
+ .overriddenp = &conf.period_size_out_overridden
+ },
+ {
+ .name = "DAC_BUFFER_SIZE",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.buffer_size_out,
+ .descr = "DAC buffer size (0 to go with system default)",
+ .overriddenp = &conf.buffer_size_out_overridden
+ },
+ {
+ .name = "ADC_SIZE_IN_USEC",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.size_in_usec_in,
+ .descr =
+ "ADC period/buffer size in microseconds (otherwise in frames)"
+ },
+ {
+ .name = "ADC_PERIOD_SIZE",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.period_size_in,
+ .descr = "ADC period size (0 to go with system default)",
+ .overriddenp = &conf.period_size_in_overridden
+ },
+ {
+ .name = "ADC_BUFFER_SIZE",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.buffer_size_in,
+ .descr = "ADC buffer size (0 to go with system default)",
+ .overriddenp = &conf.buffer_size_in_overridden
+ },
+ {
+ .name = "THRESHOLD",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.threshold,
+ .descr = "(undocumented)"
+ },
+ {
+ .name = "DAC_DEV",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.pcm_name_out,
+ .descr = "DAC device name (for instance dmix)"
+ },
+ {
+ .name = "ADC_DEV",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.pcm_name_in,
+ .descr = "ADC device name"
+ },
+ {
+ .name = "VERBOSE",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.verbose,
+ .descr = "Behave in a more verbose way"
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops alsa_pcm_ops = {
+ .init_out = alsa_init_out,
+ .fini_out = alsa_fini_out,
+ .run_out = alsa_run_out,
+ .write = alsa_write,
+ .ctl_out = alsa_ctl_out,
+
+ .init_in = alsa_init_in,
+ .fini_in = alsa_fini_in,
+ .run_in = alsa_run_in,
+ .read = alsa_read,
+ .ctl_in = alsa_ctl_in,
+};
+
+struct audio_driver alsa_audio_driver = {
+ .name = "alsa",
+ .descr = "ALSA http://www.alsa-project.org",
+ .options = alsa_options,
+ .init = alsa_audio_init,
+ .fini = alsa_audio_fini,
+ .pcm_ops = &alsa_pcm_ops,
+ .can_be_default = 1,
+ .max_voices_out = INT_MAX,
+ .max_voices_in = INT_MAX,
+ .voice_size_out = sizeof (ALSAVoiceOut),
+ .voice_size_in = sizeof (ALSAVoiceIn)
+};
diff --git a/qemu-0.15.x/audio/audio.c b/qemu-0.15.x/audio/audio.c
new file mode 100644
index 0000000..50d2b64
--- /dev/null
+++ b/qemu-0.15.x/audio/audio.c
@@ -0,0 +1,2066 @@
+/*
+ * QEMU Audio subsystem
+ *
+ * Copyright (c) 2003-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#include "hw/hw.h"
+#include "audio.h"
+#include "monitor.h"
+#include "qemu-timer.h"
+#include "sysemu.h"
+
+#define AUDIO_CAP "audio"
+#include "audio_int.h"
+
+/* #define DEBUG_PLIVE */
+/* #define DEBUG_LIVE */
+/* #define DEBUG_OUT */
+/* #define DEBUG_CAPTURE */
+/* #define DEBUG_POLL */
+
+#define SW_NAME(sw) (sw)->name ? (sw)->name : "unknown"
+
+
+/* Order of CONFIG_AUDIO_DRIVERS is import.
+ The 1st one is the one used by default, that is the reason
+ that we generate the list.
+*/
+static struct audio_driver *drvtab[] = {
+#ifdef CONFIG_SPICE
+ &spice_audio_driver,
+#endif
+ CONFIG_AUDIO_DRIVERS
+ &no_audio_driver,
+ &wav_audio_driver
+};
+
+struct fixed_settings {
+ int enabled;
+ int nb_voices;
+ int greedy;
+ struct audsettings settings;
+};
+
+static struct {
+ struct fixed_settings fixed_out;
+ struct fixed_settings fixed_in;
+ union {
+ int hertz;
+ int64_t ticks;
+ } period;
+ int plive;
+ int log_to_monitor;
+ int try_poll_in;
+ int try_poll_out;
+} conf = {
+ .fixed_out = { /* DAC fixed settings */
+ .enabled = 1,
+ .nb_voices = 1,
+ .greedy = 1,
+ .settings = {
+ .freq = 44100,
+ .nchannels = 2,
+ .fmt = AUD_FMT_S16,
+ .endianness = AUDIO_HOST_ENDIANNESS,
+ }
+ },
+
+ .fixed_in = { /* ADC fixed settings */
+ .enabled = 1,
+ .nb_voices = 1,
+ .greedy = 1,
+ .settings = {
+ .freq = 44100,
+ .nchannels = 2,
+ .fmt = AUD_FMT_S16,
+ .endianness = AUDIO_HOST_ENDIANNESS,
+ }
+ },
+
+ .period = { .hertz = 250 },
+ .plive = 0,
+ .log_to_monitor = 0,
+ .try_poll_in = 1,
+ .try_poll_out = 1,
+};
+
+static AudioState glob_audio_state;
+
+const struct mixeng_volume nominal_volume = {
+ .mute = 0,
+#ifdef FLOAT_MIXENG
+ .r = 1.0,
+ .l = 1.0,
+#else
+ .r = 1ULL << 32,
+ .l = 1ULL << 32,
+#endif
+};
+
+#ifdef AUDIO_IS_FLAWLESS_AND_NO_CHECKS_ARE_REQURIED
+#error No its not
+#else
+static void audio_print_options (const char *prefix,
+ struct audio_option *opt);
+
+int audio_bug (const char *funcname, int cond)
+{
+ if (cond) {
+ static int shown;
+
+ AUD_log (NULL, "A bug was just triggered in %s\n", funcname);
+ if (!shown) {
+ struct audio_driver *d;
+
+ shown = 1;
+ AUD_log (NULL, "Save all your work and restart without audio\n");
+ AUD_log (NULL, "Please send bug report to av1474(a)comtv.ru\n");
+ AUD_log (NULL, "I am sorry\n");
+ d = glob_audio_state.drv;
+ if (d) {
+ audio_print_options (d->name, d->options);
+ }
+ }
+ AUD_log (NULL, "Context:\n");
+
+#if defined AUDIO_BREAKPOINT_ON_BUG
+# if defined HOST_I386
+# if defined __GNUC__
+ __asm__ ("int3");
+# elif defined _MSC_VER
+ _asm _emit 0xcc;
+# else
+ abort ();
+# endif
+# else
+ abort ();
+# endif
+#endif
+ }
+
+ return cond;
+}
+#endif
+
+static inline int audio_bits_to_index (int bits)
+{
+ switch (bits) {
+ case 8:
+ return 0;
+
+ case 16:
+ return 1;
+
+ case 32:
+ return 2;
+
+ default:
+ audio_bug ("bits_to_index", 1);
+ AUD_log (NULL, "invalid bits %d\n", bits);
+ return 0;
+ }
+}
+
+void *audio_calloc (const char *funcname, int nmemb, size_t size)
+{
+ int cond;
+ size_t len;
+
+ len = nmemb * size;
+ cond = !nmemb || !size;
+ cond |= nmemb < 0;
+ cond |= len < size;
+
+ if (audio_bug ("audio_calloc", cond)) {
+ AUD_log (NULL, "%s passed invalid arguments to audio_calloc\n",
+ funcname);
+ AUD_log (NULL, "nmemb=%d size=%zu (len=%zu)\n", nmemb, size, len);
+ return NULL;
+ }
+
+ return qemu_mallocz (len);
+}
+
+static char *audio_alloc_prefix (const char *s)
+{
+ const char qemu_prefix[] = "QEMU_";
+ size_t len, i;
+ char *r, *u;
+
+ if (!s) {
+ return NULL;
+ }
+
+ len = strlen (s);
+ r = qemu_malloc (len + sizeof (qemu_prefix));
+
+ u = r + sizeof (qemu_prefix) - 1;
+
+ pstrcpy (r, len + sizeof (qemu_prefix), qemu_prefix);
+ pstrcat (r, len + sizeof (qemu_prefix), s);
+
+ for (i = 0; i < len; ++i) {
+ u[i] = qemu_toupper(u[i]);
+ }
+
+ return r;
+}
+
+static const char *audio_audfmt_to_string (audfmt_e fmt)
+{
+ switch (fmt) {
+ case AUD_FMT_U8:
+ return "U8";
+
+ case AUD_FMT_U16:
+ return "U16";
+
+ case AUD_FMT_S8:
+ return "S8";
+
+ case AUD_FMT_S16:
+ return "S16";
+
+ case AUD_FMT_U32:
+ return "U32";
+
+ case AUD_FMT_S32:
+ return "S32";
+ }
+
+ dolog ("Bogus audfmt %d returning S16\n", fmt);
+ return "S16";
+}
+
+static audfmt_e audio_string_to_audfmt (const char *s, audfmt_e defval,
+ int *defaultp)
+{
+ if (!strcasecmp (s, "u8")) {
+ *defaultp = 0;
+ return AUD_FMT_U8;
+ }
+ else if (!strcasecmp (s, "u16")) {
+ *defaultp = 0;
+ return AUD_FMT_U16;
+ }
+ else if (!strcasecmp (s, "u32")) {
+ *defaultp = 0;
+ return AUD_FMT_U32;
+ }
+ else if (!strcasecmp (s, "s8")) {
+ *defaultp = 0;
+ return AUD_FMT_S8;
+ }
+ else if (!strcasecmp (s, "s16")) {
+ *defaultp = 0;
+ return AUD_FMT_S16;
+ }
+ else if (!strcasecmp (s, "s32")) {
+ *defaultp = 0;
+ return AUD_FMT_S32;
+ }
+ else {
+ dolog ("Bogus audio format `%s' using %s\n",
+ s, audio_audfmt_to_string (defval));
+ *defaultp = 1;
+ return defval;
+ }
+}
+
+static audfmt_e audio_get_conf_fmt (const char *envname,
+ audfmt_e defval,
+ int *defaultp)
+{
+ const char *var = getenv (envname);
+ if (!var) {
+ *defaultp = 1;
+ return defval;
+ }
+ return audio_string_to_audfmt (var, defval, defaultp);
+}
+
+static int audio_get_conf_int (const char *key, int defval, int *defaultp)
+{
+ int val;
+ char *strval;
+
+ strval = getenv (key);
+ if (strval) {
+ *defaultp = 0;
+ val = atoi (strval);
+ return val;
+ }
+ else {
+ *defaultp = 1;
+ return defval;
+ }
+}
+
+static const char *audio_get_conf_str (const char *key,
+ const char *defval,
+ int *defaultp)
+{
+ const char *val = getenv (key);
+ if (!val) {
+ *defaultp = 1;
+ return defval;
+ }
+ else {
+ *defaultp = 0;
+ return val;
+ }
+}
+
+void AUD_vlog (const char *cap, const char *fmt, va_list ap)
+{
+ if (conf.log_to_monitor) {
+ if (cap) {
+ monitor_printf(default_mon, "%s: ", cap);
+ }
+
+ monitor_vprintf(default_mon, fmt, ap);
+ }
+ else {
+ if (cap) {
+ fprintf (stderr, "%s: ", cap);
+ }
+
+ vfprintf (stderr, fmt, ap);
+ }
+}
+
+void AUD_log (const char *cap, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (cap, fmt, ap);
+ va_end (ap);
+}
+
+static void audio_print_options (const char *prefix,
+ struct audio_option *opt)
+{
+ char *uprefix;
+
+ if (!prefix) {
+ dolog ("No prefix specified\n");
+ return;
+ }
+
+ if (!opt) {
+ dolog ("No options\n");
+ return;
+ }
+
+ uprefix = audio_alloc_prefix (prefix);
+
+ for (; opt->name; opt++) {
+ const char *state = "default";
+ printf (" %s_%s: ", uprefix, opt->name);
+
+ if (opt->overriddenp && *opt->overriddenp) {
+ state = "current";
+ }
+
+ switch (opt->tag) {
+ case AUD_OPT_BOOL:
+ {
+ int *intp = opt->valp;
+ printf ("boolean, %s = %d\n", state, *intp ? 1 : 0);
+ }
+ break;
+
+ case AUD_OPT_INT:
+ {
+ int *intp = opt->valp;
+ printf ("integer, %s = %d\n", state, *intp);
+ }
+ break;
+
+ case AUD_OPT_FMT:
+ {
+ audfmt_e *fmtp = opt->valp;
+ printf (
+ "format, %s = %s, (one of: U8 S8 U16 S16 U32 S32)\n",
+ state,
+ audio_audfmt_to_string (*fmtp)
+ );
+ }
+ break;
+
+ case AUD_OPT_STR:
+ {
+ const char **strp = opt->valp;
+ printf ("string, %s = %s\n",
+ state,
+ *strp ? *strp : "(not set)");
+ }
+ break;
+
+ default:
+ printf ("???\n");
+ dolog ("Bad value tag for option %s_%s %d\n",
+ uprefix, opt->name, opt->tag);
+ break;
+ }
+ printf (" %s\n", opt->descr);
+ }
+
+ qemu_free (uprefix);
+}
+
+static void audio_process_options (const char *prefix,
+ struct audio_option *opt)
+{
+ char *optname;
+ const char qemu_prefix[] = "QEMU_";
+ size_t preflen, optlen;
+
+ if (audio_bug (AUDIO_FUNC, !prefix)) {
+ dolog ("prefix = NULL\n");
+ return;
+ }
+
+ if (audio_bug (AUDIO_FUNC, !opt)) {
+ dolog ("opt = NULL\n");
+ return;
+ }
+
+ preflen = strlen (prefix);
+
+ for (; opt->name; opt++) {
+ size_t len, i;
+ int def;
+
+ if (!opt->valp) {
+ dolog ("Option value pointer for `%s' is not set\n",
+ opt->name);
+ continue;
+ }
+
+ len = strlen (opt->name);
+ /* len of opt->name + len of prefix + size of qemu_prefix
+ * (includes trailing zero) + zero + underscore (on behalf of
+ * sizeof) */
+ optlen = len + preflen + sizeof (qemu_prefix) + 1;
+ optname = qemu_malloc (optlen);
+
+ pstrcpy (optname, optlen, qemu_prefix);
+
+ /* copy while upper-casing, including trailing zero */
+ for (i = 0; i <= preflen; ++i) {
+ optname[i + sizeof (qemu_prefix) - 1] = qemu_toupper(prefix[i]);
+ }
+ pstrcat (optname, optlen, "_");
+ pstrcat (optname, optlen, opt->name);
+
+ def = 1;
+ switch (opt->tag) {
+ case AUD_OPT_BOOL:
+ case AUD_OPT_INT:
+ {
+ int *intp = opt->valp;
+ *intp = audio_get_conf_int (optname, *intp, &def);
+ }
+ break;
+
+ case AUD_OPT_FMT:
+ {
+ audfmt_e *fmtp = opt->valp;
+ *fmtp = audio_get_conf_fmt (optname, *fmtp, &def);
+ }
+ break;
+
+ case AUD_OPT_STR:
+ {
+ const char **strp = opt->valp;
+ *strp = audio_get_conf_str (optname, *strp, &def);
+ }
+ break;
+
+ default:
+ dolog ("Bad value tag for option `%s' - %d\n",
+ optname, opt->tag);
+ break;
+ }
+
+ if (!opt->overriddenp) {
+ opt->overriddenp = &opt->overridden;
+ }
+ *opt->overriddenp = !def;
+ qemu_free (optname);
+ }
+}
+
+static void audio_print_settings (struct audsettings *as)
+{
+ dolog ("frequency=%d nchannels=%d fmt=", as->freq, as->nchannels);
+
+ switch (as->fmt) {
+ case AUD_FMT_S8:
+ AUD_log (NULL, "S8");
+ break;
+ case AUD_FMT_U8:
+ AUD_log (NULL, "U8");
+ break;
+ case AUD_FMT_S16:
+ AUD_log (NULL, "S16");
+ break;
+ case AUD_FMT_U16:
+ AUD_log (NULL, "U16");
+ break;
+ case AUD_FMT_S32:
+ AUD_log (NULL, "S32");
+ break;
+ case AUD_FMT_U32:
+ AUD_log (NULL, "U32");
+ break;
+ default:
+ AUD_log (NULL, "invalid(%d)", as->fmt);
+ break;
+ }
+
+ AUD_log (NULL, " endianness=");
+ switch (as->endianness) {
+ case 0:
+ AUD_log (NULL, "little");
+ break;
+ case 1:
+ AUD_log (NULL, "big");
+ break;
+ default:
+ AUD_log (NULL, "invalid");
+ break;
+ }
+ AUD_log (NULL, "\n");
+}
+
+static int audio_validate_settings (struct audsettings *as)
+{
+ int invalid;
+
+ invalid = as->nchannels != 1 && as->nchannels != 2;
+ invalid |= as->endianness != 0 && as->endianness != 1;
+
+ switch (as->fmt) {
+ case AUD_FMT_S8:
+ case AUD_FMT_U8:
+ case AUD_FMT_S16:
+ case AUD_FMT_U16:
+ case AUD_FMT_S32:
+ case AUD_FMT_U32:
+ break;
+ default:
+ invalid = 1;
+ break;
+ }
+
+ invalid |= as->freq <= 0;
+ return invalid ? -1 : 0;
+}
+
+static int audio_pcm_info_eq (struct audio_pcm_info *info, struct audsettings *as)
+{
+ int bits = 8, sign = 0;
+
+ switch (as->fmt) {
+ case AUD_FMT_S8:
+ sign = 1;
+ case AUD_FMT_U8:
+ break;
+
+ case AUD_FMT_S16:
+ sign = 1;
+ case AUD_FMT_U16:
+ bits = 16;
+ break;
+
+ case AUD_FMT_S32:
+ sign = 1;
+ case AUD_FMT_U32:
+ bits = 32;
+ break;
+ }
+ return info->freq == as->freq
+ && info->nchannels == as->nchannels
+ && info->sign == sign
+ && info->bits == bits
+ && info->swap_endianness == (as->endianness != AUDIO_HOST_ENDIANNESS);
+}
+
+void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as)
+{
+ int bits = 8, sign = 0, shift = 0;
+
+ switch (as->fmt) {
+ case AUD_FMT_S8:
+ sign = 1;
+ case AUD_FMT_U8:
+ break;
+
+ case AUD_FMT_S16:
+ sign = 1;
+ case AUD_FMT_U16:
+ bits = 16;
+ shift = 1;
+ break;
+
+ case AUD_FMT_S32:
+ sign = 1;
+ case AUD_FMT_U32:
+ bits = 32;
+ shift = 2;
+ break;
+ }
+
+ info->freq = as->freq;
+ info->bits = bits;
+ info->sign = sign;
+ info->nchannels = as->nchannels;
+ info->shift = (as->nchannels == 2) + shift;
+ info->align = (1 << info->shift) - 1;
+ info->bytes_per_second = info->freq << info->shift;
+ info->swap_endianness = (as->endianness != AUDIO_HOST_ENDIANNESS);
+}
+
+void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len)
+{
+ if (!len) {
+ return;
+ }
+
+ if (info->sign) {
+ memset (buf, 0x00, len << info->shift);
+ }
+ else {
+ switch (info->bits) {
+ case 8:
+ memset (buf, 0x80, len << info->shift);
+ break;
+
+ case 16:
+ {
+ int i;
+ uint16_t *p = buf;
+ int shift = info->nchannels - 1;
+ short s = INT16_MAX;
+
+ if (info->swap_endianness) {
+ s = bswap16 (s);
+ }
+
+ for (i = 0; i < len << shift; i++) {
+ p[i] = s;
+ }
+ }
+ break;
+
+ case 32:
+ {
+ int i;
+ uint32_t *p = buf;
+ int shift = info->nchannels - 1;
+ int32_t s = INT32_MAX;
+
+ if (info->swap_endianness) {
+ s = bswap32 (s);
+ }
+
+ for (i = 0; i < len << shift; i++) {
+ p[i] = s;
+ }
+ }
+ break;
+
+ default:
+ AUD_log (NULL, "audio_pcm_info_clear_buf: invalid bits %d\n",
+ info->bits);
+ break;
+ }
+ }
+}
+
+/*
+ * Capture
+ */
+static void noop_conv (struct st_sample *dst, const void *src, int samples)
+{
+ (void) src;
+ (void) dst;
+ (void) samples;
+}
+
+static CaptureVoiceOut *audio_pcm_capture_find_specific (
+ struct audsettings *as
+ )
+{
+ CaptureVoiceOut *cap;
+ AudioState *s = &glob_audio_state;
+
+ for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
+ if (audio_pcm_info_eq (&cap->hw.info, as)) {
+ return cap;
+ }
+ }
+ return NULL;
+}
+
+static void audio_notify_capture (CaptureVoiceOut *cap, audcnotification_e cmd)
+{
+ struct capture_callback *cb;
+
+#ifdef DEBUG_CAPTURE
+ dolog ("notification %d sent\n", cmd);
+#endif
+ for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
+ cb->ops.notify (cb->opaque, cmd);
+ }
+}
+
+static void audio_capture_maybe_changed (CaptureVoiceOut *cap, int enabled)
+{
+ if (cap->hw.enabled != enabled) {
+ audcnotification_e cmd;
+ cap->hw.enabled = enabled;
+ cmd = enabled ? AUD_CNOTIFY_ENABLE : AUD_CNOTIFY_DISABLE;
+ audio_notify_capture (cap, cmd);
+ }
+}
+
+static void audio_recalc_and_notify_capture (CaptureVoiceOut *cap)
+{
+ HWVoiceOut *hw = &cap->hw;
+ SWVoiceOut *sw;
+ int enabled = 0;
+
+ for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
+ if (sw->active) {
+ enabled = 1;
+ break;
+ }
+ }
+ audio_capture_maybe_changed (cap, enabled);
+}
+
+static void audio_detach_capture (HWVoiceOut *hw)
+{
+ SWVoiceCap *sc = hw->cap_head.lh_first;
+
+ while (sc) {
+ SWVoiceCap *sc1 = sc->entries.le_next;
+ SWVoiceOut *sw = &sc->sw;
+ CaptureVoiceOut *cap = sc->cap;
+ int was_active = sw->active;
+
+ if (sw->rate) {
+ st_rate_stop (sw->rate);
+ sw->rate = NULL;
+ }
+
+ QLIST_REMOVE (sw, entries);
+ QLIST_REMOVE (sc, entries);
+ qemu_free (sc);
+ if (was_active) {
+ /* We have removed soft voice from the capture:
+ this might have changed the overall status of the capture
+ since this might have been the only active voice */
+ audio_recalc_and_notify_capture (cap);
+ }
+ sc = sc1;
+ }
+}
+
+static int audio_attach_capture (HWVoiceOut *hw)
+{
+ AudioState *s = &glob_audio_state;
+ CaptureVoiceOut *cap;
+
+ audio_detach_capture (hw);
+ for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
+ SWVoiceCap *sc;
+ SWVoiceOut *sw;
+ HWVoiceOut *hw_cap = &cap->hw;
+
+ sc = audio_calloc (AUDIO_FUNC, 1, sizeof (*sc));
+ if (!sc) {
+ dolog ("Could not allocate soft capture voice (%zu bytes)\n",
+ sizeof (*sc));
+ return -1;
+ }
+
+ sc->cap = cap;
+ sw = &sc->sw;
+ sw->hw = hw_cap;
+ sw->info = hw->info;
+ sw->empty = 1;
+ sw->active = hw->enabled;
+ sw->conv = noop_conv;
+ sw->ratio = ((int64_t) hw_cap->info.freq << 32) / sw->info.freq;
+ sw->rate = st_rate_start (sw->info.freq, hw_cap->info.freq);
+ if (!sw->rate) {
+ dolog ("Could not start rate conversion for `%s'\n", SW_NAME (sw));
+ qemu_free (sw);
+ return -1;
+ }
+ QLIST_INSERT_HEAD (&hw_cap->sw_head, sw, entries);
+ QLIST_INSERT_HEAD (&hw->cap_head, sc, entries);
+#ifdef DEBUG_CAPTURE
+ asprintf (&sw->name, "for %p %d,%d,%d",
+ hw, sw->info.freq, sw->info.bits, sw->info.nchannels);
+ dolog ("Added %s active = %d\n", sw->name, sw->active);
+#endif
+ if (sw->active) {
+ audio_capture_maybe_changed (cap, 1);
+ }
+ }
+ return 0;
+}
+
+/*
+ * Hard voice (capture)
+ */
+static int audio_pcm_hw_find_min_in (HWVoiceIn *hw)
+{
+ SWVoiceIn *sw;
+ int m = hw->total_samples_captured;
+
+ for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
+ if (sw->active) {
+ m = audio_MIN (m, sw->total_hw_samples_acquired);
+ }
+ }
+ return m;
+}
+
+int audio_pcm_hw_get_live_in (HWVoiceIn *hw)
+{
+ int live = hw->total_samples_captured - audio_pcm_hw_find_min_in (hw);
+ if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
+ dolog ("live=%d hw->samples=%d\n", live, hw->samples);
+ return 0;
+ }
+ return live;
+}
+
+int audio_pcm_hw_clip_out (HWVoiceOut *hw, void *pcm_buf,
+ int live, int pending)
+{
+ int left = hw->samples - pending;
+ int len = audio_MIN (left, live);
+ int clipped = 0;
+
+ while (len) {
+ struct st_sample *src = hw->mix_buf + hw->rpos;
+ uint8_t *dst = advance (pcm_buf, hw->rpos << hw->info.shift);
+ int samples_till_end_of_buf = hw->samples - hw->rpos;
+ int samples_to_clip = audio_MIN (len, samples_till_end_of_buf);
+
+ hw->clip (dst, src, samples_to_clip);
+
+ hw->rpos = (hw->rpos + samples_to_clip) % hw->samples;
+ len -= samples_to_clip;
+ clipped += samples_to_clip;
+ }
+ return clipped;
+}
+
+/*
+ * Soft voice (capture)
+ */
+static int audio_pcm_sw_get_rpos_in (SWVoiceIn *sw)
+{
+ HWVoiceIn *hw = sw->hw;
+ int live = hw->total_samples_captured - sw->total_hw_samples_acquired;
+ int rpos;
+
+ if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
+ dolog ("live=%d hw->samples=%d\n", live, hw->samples);
+ return 0;
+ }
+
+ rpos = hw->wpos - live;
+ if (rpos >= 0) {
+ return rpos;
+ }
+ else {
+ return hw->samples + rpos;
+ }
+}
+
+int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int size)
+{
+ HWVoiceIn *hw = sw->hw;
+ int samples, live, ret = 0, swlim, isamp, osamp, rpos, total = 0;
+ struct st_sample *src, *dst = sw->buf;
+
+ rpos = audio_pcm_sw_get_rpos_in (sw) % hw->samples;
+
+ live = hw->total_samples_captured - sw->total_hw_samples_acquired;
+ if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
+ dolog ("live_in=%d hw->samples=%d\n", live, hw->samples);
+ return 0;
+ }
+
+ samples = size >> sw->info.shift;
+ if (!live) {
+ return 0;
+ }
+
+ swlim = (live * sw->ratio) >> 32;
+ swlim = audio_MIN (swlim, samples);
+
+ while (swlim) {
+ src = hw->conv_buf + rpos;
+ isamp = hw->wpos - rpos;
+ /* XXX: <= ? */
+ if (isamp <= 0) {
+ isamp = hw->samples - rpos;
+ }
+
+ if (!isamp) {
+ break;
+ }
+ osamp = swlim;
+
+ if (audio_bug (AUDIO_FUNC, osamp < 0)) {
+ dolog ("osamp=%d\n", osamp);
+ return 0;
+ }
+
+ st_rate_flow (sw->rate, src, dst, &isamp, &osamp);
+ swlim -= osamp;
+ rpos = (rpos + isamp) % hw->samples;
+ dst += osamp;
+ ret += osamp;
+ total += isamp;
+ }
+
+ mixeng_volume (sw->buf, ret, &sw->vol);
+
+ sw->clip (buf, sw->buf, ret);
+ sw->total_hw_samples_acquired += total;
+ return ret << sw->info.shift;
+}
+
+/*
+ * Hard voice (playback)
+ */
+static int audio_pcm_hw_find_min_out (HWVoiceOut *hw, int *nb_livep)
+{
+ SWVoiceOut *sw;
+ int m = INT_MAX;
+ int nb_live = 0;
+
+ for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
+ if (sw->active || !sw->empty) {
+ m = audio_MIN (m, sw->total_hw_samples_mixed);
+ nb_live += 1;
+ }
+ }
+
+ *nb_livep = nb_live;
+ return m;
+}
+
+static int audio_pcm_hw_get_live_out (HWVoiceOut *hw, int *nb_live)
+{
+ int smin;
+ int nb_live1;
+
+ smin = audio_pcm_hw_find_min_out (hw, &nb_live1);
+ if (nb_live) {
+ *nb_live = nb_live1;
+ }
+
+ if (nb_live1) {
+ int live = smin;
+
+ if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
+ dolog ("live=%d hw->samples=%d\n", live, hw->samples);
+ return 0;
+ }
+ return live;
+ }
+ return 0;
+}
+
+/*
+ * Soft voice (playback)
+ */
+int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int size)
+{
+ int hwsamples, samples, isamp, osamp, wpos, live, dead, left, swlim, blck;
+ int ret = 0, pos = 0, total = 0;
+
+ if (!sw) {
+ return size;
+ }
+
+ hwsamples = sw->hw->samples;
+
+ live = sw->total_hw_samples_mixed;
+ if (audio_bug (AUDIO_FUNC, live < 0 || live > hwsamples)){
+ dolog ("live=%d hw->samples=%d\n", live, hwsamples);
+ return 0;
+ }
+
+ if (live == hwsamples) {
+#ifdef DEBUG_OUT
+ dolog ("%s is full %d\n", sw->name, live);
+#endif
+ return 0;
+ }
+
+ wpos = (sw->hw->rpos + live) % hwsamples;
+ samples = size >> sw->info.shift;
+
+ dead = hwsamples - live;
+ swlim = ((int64_t) dead << 32) / sw->ratio;
+ swlim = audio_MIN (swlim, samples);
+ if (swlim) {
+ sw->conv (sw->buf, buf, swlim);
+ mixeng_volume (sw->buf, swlim, &sw->vol);
+ }
+
+ while (swlim) {
+ dead = hwsamples - live;
+ left = hwsamples - wpos;
+ blck = audio_MIN (dead, left);
+ if (!blck) {
+ break;
+ }
+ isamp = swlim;
+ osamp = blck;
+ st_rate_flow_mix (
+ sw->rate,
+ sw->buf + pos,
+ sw->hw->mix_buf + wpos,
+ &isamp,
+ &osamp
+ );
+ ret += isamp;
+ swlim -= isamp;
+ pos += isamp;
+ live += osamp;
+ wpos = (wpos + osamp) % hwsamples;
+ total += osamp;
+ }
+
+ sw->total_hw_samples_mixed += total;
+ sw->empty = sw->total_hw_samples_mixed == 0;
+
+#ifdef DEBUG_OUT
+ dolog (
+ "%s: write size %d ret %d total sw %d\n",
+ SW_NAME (sw),
+ size >> sw->info.shift,
+ ret,
+ sw->total_hw_samples_mixed
+ );
+#endif
+
+ return ret << sw->info.shift;
+}
+
+#ifdef DEBUG_AUDIO
+static void audio_pcm_print_info (const char *cap, struct audio_pcm_info *info)
+{
+ dolog ("%s: bits %d, sign %d, freq %d, nchan %d\n",
+ cap, info->bits, info->sign, info->freq, info->nchannels);
+}
+#endif
+
+#define DAC
+#include "audio_template.h"
+#undef DAC
+#include "audio_template.h"
+
+/*
+ * Timer
+ */
+static int audio_is_timer_needed (void)
+{
+ HWVoiceIn *hwi = NULL;
+ HWVoiceOut *hwo = NULL;
+
+ while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
+ if (!hwo->poll_mode) return 1;
+ }
+ while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
+ if (!hwi->poll_mode) return 1;
+ }
+ return 0;
+}
+
+static void audio_reset_timer (AudioState *s)
+{
+ if (audio_is_timer_needed ()) {
+ qemu_mod_timer (s->ts, qemu_get_clock_ns (vm_clock) + 1);
+ }
+ else {
+ qemu_del_timer (s->ts);
+ }
+}
+
+static void audio_timer (void *opaque)
+{
+ audio_run ("timer");
+ audio_reset_timer (opaque);
+}
+
+/*
+ * Public API
+ */
+int AUD_write (SWVoiceOut *sw, void *buf, int size)
+{
+ int bytes;
+
+ if (!sw) {
+ /* XXX: Consider options */
+ return size;
+ }
+
+ if (!sw->hw->enabled) {
+ dolog ("Writing to disabled voice %s\n", SW_NAME (sw));
+ return 0;
+ }
+
+ bytes = sw->hw->pcm_ops->write (sw, buf, size);
+ return bytes;
+}
+
+int AUD_read (SWVoiceIn *sw, void *buf, int size)
+{
+ int bytes;
+
+ if (!sw) {
+ /* XXX: Consider options */
+ return size;
+ }
+
+ if (!sw->hw->enabled) {
+ dolog ("Reading from disabled voice %s\n", SW_NAME (sw));
+ return 0;
+ }
+
+ bytes = sw->hw->pcm_ops->read (sw, buf, size);
+ return bytes;
+}
+
+int AUD_get_buffer_size_out (SWVoiceOut *sw)
+{
+ return sw->hw->samples << sw->hw->info.shift;
+}
+
+void AUD_set_active_out (SWVoiceOut *sw, int on)
+{
+ HWVoiceOut *hw;
+
+ if (!sw) {
+ return;
+ }
+
+ hw = sw->hw;
+ if (sw->active != on) {
+ AudioState *s = &glob_audio_state;
+ SWVoiceOut *temp_sw;
+ SWVoiceCap *sc;
+
+ if (on) {
+ hw->pending_disable = 0;
+ if (!hw->enabled) {
+ hw->enabled = 1;
+ if (s->vm_running) {
+ hw->pcm_ops->ctl_out (hw, VOICE_ENABLE, conf.try_poll_out);
+ audio_reset_timer (s);
+ }
+ }
+ }
+ else {
+ if (hw->enabled) {
+ int nb_active = 0;
+
+ for (temp_sw = hw->sw_head.lh_first; temp_sw;
+ temp_sw = temp_sw->entries.le_next) {
+ nb_active += temp_sw->active != 0;
+ }
+
+ hw->pending_disable = nb_active == 1;
+ }
+ }
+
+ for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
+ sc->sw.active = hw->enabled;
+ if (hw->enabled) {
+ audio_capture_maybe_changed (sc->cap, 1);
+ }
+ }
+ sw->active = on;
+ }
+}
+
+void AUD_set_active_in (SWVoiceIn *sw, int on)
+{
+ HWVoiceIn *hw;
+
+ if (!sw) {
+ return;
+ }
+
+ hw = sw->hw;
+ if (sw->active != on) {
+ AudioState *s = &glob_audio_state;
+ SWVoiceIn *temp_sw;
+
+ if (on) {
+ if (!hw->enabled) {
+ hw->enabled = 1;
+ if (s->vm_running) {
+ hw->pcm_ops->ctl_in (hw, VOICE_ENABLE, conf.try_poll_in);
+ audio_reset_timer (s);
+ }
+ }
+ sw->total_hw_samples_acquired = hw->total_samples_captured;
+ }
+ else {
+ if (hw->enabled) {
+ int nb_active = 0;
+
+ for (temp_sw = hw->sw_head.lh_first; temp_sw;
+ temp_sw = temp_sw->entries.le_next) {
+ nb_active += temp_sw->active != 0;
+ }
+
+ if (nb_active == 1) {
+ hw->enabled = 0;
+ hw->pcm_ops->ctl_in (hw, VOICE_DISABLE);
+ }
+ }
+ }
+ sw->active = on;
+ }
+}
+
+static int audio_get_avail (SWVoiceIn *sw)
+{
+ int live;
+
+ if (!sw) {
+ return 0;
+ }
+
+ live = sw->hw->total_samples_captured - sw->total_hw_samples_acquired;
+ if (audio_bug (AUDIO_FUNC, live < 0 || live > sw->hw->samples)) {
+ dolog ("live=%d sw->hw->samples=%d\n", live, sw->hw->samples);
+ return 0;
+ }
+
+ ldebug (
+ "%s: get_avail live %d ret %" PRId64 "\n",
+ SW_NAME (sw),
+ live, (((int64_t) live << 32) / sw->ratio) << sw->info.shift
+ );
+
+ return (((int64_t) live << 32) / sw->ratio) << sw->info.shift;
+}
+
+static int audio_get_free (SWVoiceOut *sw)
+{
+ int live, dead;
+
+ if (!sw) {
+ return 0;
+ }
+
+ live = sw->total_hw_samples_mixed;
+
+ if (audio_bug (AUDIO_FUNC, live < 0 || live > sw->hw->samples)) {
+ dolog ("live=%d sw->hw->samples=%d\n", live, sw->hw->samples);
+ return 0;
+ }
+
+ dead = sw->hw->samples - live;
+
+#ifdef DEBUG_OUT
+ dolog ("%s: get_free live %d dead %d ret %" PRId64 "\n",
+ SW_NAME (sw),
+ live, dead, (((int64_t) dead << 32) / sw->ratio) << sw->info.shift);
+#endif
+
+ return (((int64_t) dead << 32) / sw->ratio) << sw->info.shift;
+}
+
+static void audio_capture_mix_and_clear (HWVoiceOut *hw, int rpos, int samples)
+{
+ int n;
+
+ if (hw->enabled) {
+ SWVoiceCap *sc;
+
+ for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
+ SWVoiceOut *sw = &sc->sw;
+ int rpos2 = rpos;
+
+ n = samples;
+ while (n) {
+ int till_end_of_hw = hw->samples - rpos2;
+ int to_write = audio_MIN (till_end_of_hw, n);
+ int bytes = to_write << hw->info.shift;
+ int written;
+
+ sw->buf = hw->mix_buf + rpos2;
+ written = audio_pcm_sw_write (sw, NULL, bytes);
+ if (written - bytes) {
+ dolog ("Could not mix %d bytes into a capture "
+ "buffer, mixed %d\n",
+ bytes, written);
+ break;
+ }
+ n -= to_write;
+ rpos2 = (rpos2 + to_write) % hw->samples;
+ }
+ }
+ }
+
+ n = audio_MIN (samples, hw->samples - rpos);
+ mixeng_clear (hw->mix_buf + rpos, n);
+ mixeng_clear (hw->mix_buf, samples - n);
+}
+
+static void audio_run_out (AudioState *s)
+{
+ HWVoiceOut *hw = NULL;
+ SWVoiceOut *sw;
+
+ while ((hw = audio_pcm_hw_find_any_enabled_out (hw))) {
+ int played;
+ int live, free, nb_live, cleanup_required, prev_rpos;
+
+ live = audio_pcm_hw_get_live_out (hw, &nb_live);
+ if (!nb_live) {
+ live = 0;
+ }
+
+ if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
+ dolog ("live=%d hw->samples=%d\n", live, hw->samples);
+ continue;
+ }
+
+ if (hw->pending_disable && !nb_live) {
+ SWVoiceCap *sc;
+#ifdef DEBUG_OUT
+ dolog ("Disabling voice\n");
+#endif
+ hw->enabled = 0;
+ hw->pending_disable = 0;
+ hw->pcm_ops->ctl_out (hw, VOICE_DISABLE);
+ for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
+ sc->sw.active = 0;
+ audio_recalc_and_notify_capture (sc->cap);
+ }
+ continue;
+ }
+
+ if (!live) {
+ for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
+ if (sw->active) {
+ free = audio_get_free (sw);
+ if (free > 0) {
+ sw->callback.fn (sw->callback.opaque, free);
+ }
+ }
+ }
+ continue;
+ }
+
+ prev_rpos = hw->rpos;
+ played = hw->pcm_ops->run_out (hw, live);
+ if (audio_bug (AUDIO_FUNC, hw->rpos >= hw->samples)) {
+ dolog ("hw->rpos=%d hw->samples=%d played=%d\n",
+ hw->rpos, hw->samples, played);
+ hw->rpos = 0;
+ }
+
+#ifdef DEBUG_OUT
+ dolog ("played=%d\n", played);
+#endif
+
+ if (played) {
+ hw->ts_helper += played;
+ audio_capture_mix_and_clear (hw, prev_rpos, played);
+ }
+
+ cleanup_required = 0;
+ for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
+ if (!sw->active && sw->empty) {
+ continue;
+ }
+
+ if (audio_bug (AUDIO_FUNC, played > sw->total_hw_samples_mixed)) {
+ dolog ("played=%d sw->total_hw_samples_mixed=%d\n",
+ played, sw->total_hw_samples_mixed);
+ played = sw->total_hw_samples_mixed;
+ }
+
+ sw->total_hw_samples_mixed -= played;
+
+ if (!sw->total_hw_samples_mixed) {
+ sw->empty = 1;
+ cleanup_required |= !sw->active && !sw->callback.fn;
+ }
+
+ if (sw->active) {
+ free = audio_get_free (sw);
+ if (free > 0) {
+ sw->callback.fn (sw->callback.opaque, free);
+ }
+ }
+ }
+
+ if (cleanup_required) {
+ SWVoiceOut *sw1;
+
+ sw = hw->sw_head.lh_first;
+ while (sw) {
+ sw1 = sw->entries.le_next;
+ if (!sw->active && !sw->callback.fn) {
+#ifdef DEBUG_PLIVE
+ dolog ("Finishing with old voice\n");
+#endif
+ audio_close_out (sw);
+ }
+ sw = sw1;
+ }
+ }
+ }
+}
+
+static void audio_run_in (AudioState *s)
+{
+ HWVoiceIn *hw = NULL;
+
+ while ((hw = audio_pcm_hw_find_any_enabled_in (hw))) {
+ SWVoiceIn *sw;
+ int captured, min;
+
+ captured = hw->pcm_ops->run_in (hw);
+
+ min = audio_pcm_hw_find_min_in (hw);
+ hw->total_samples_captured += captured - min;
+ hw->ts_helper += captured;
+
+ for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
+ sw->total_hw_samples_acquired -= min;
+
+ if (sw->active) {
+ int avail;
+
+ avail = audio_get_avail (sw);
+ if (avail > 0) {
+ sw->callback.fn (sw->callback.opaque, avail);
+ }
+ }
+ }
+ }
+}
+
+static void audio_run_capture (AudioState *s)
+{
+ CaptureVoiceOut *cap;
+
+ for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
+ int live, rpos, captured;
+ HWVoiceOut *hw = &cap->hw;
+ SWVoiceOut *sw;
+
+ captured = live = audio_pcm_hw_get_live_out (hw, NULL);
+ rpos = hw->rpos;
+ while (live) {
+ int left = hw->samples - rpos;
+ int to_capture = audio_MIN (live, left);
+ struct st_sample *src;
+ struct capture_callback *cb;
+
+ src = hw->mix_buf + rpos;
+ hw->clip (cap->buf, src, to_capture);
+ mixeng_clear (src, to_capture);
+
+ for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
+ cb->ops.capture (cb->opaque, cap->buf,
+ to_capture << hw->info.shift);
+ }
+ rpos = (rpos + to_capture) % hw->samples;
+ live -= to_capture;
+ }
+ hw->rpos = rpos;
+
+ for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
+ if (!sw->active && sw->empty) {
+ continue;
+ }
+
+ if (audio_bug (AUDIO_FUNC, captured > sw->total_hw_samples_mixed)) {
+ dolog ("captured=%d sw->total_hw_samples_mixed=%d\n",
+ captured, sw->total_hw_samples_mixed);
+ captured = sw->total_hw_samples_mixed;
+ }
+
+ sw->total_hw_samples_mixed -= captured;
+ sw->empty = sw->total_hw_samples_mixed == 0;
+ }
+ }
+}
+
+void audio_run (const char *msg)
+{
+ AudioState *s = &glob_audio_state;
+
+ audio_run_out (s);
+ audio_run_in (s);
+ audio_run_capture (s);
+#ifdef DEBUG_POLL
+ {
+ static double prevtime;
+ double currtime;
+ struct timeval tv;
+
+ if (gettimeofday (&tv, NULL)) {
+ perror ("audio_run: gettimeofday");
+ return;
+ }
+
+ currtime = tv.tv_sec + tv.tv_usec * 1e-6;
+ dolog ("Elapsed since last %s: %f\n", msg, currtime - prevtime);
+ prevtime = currtime;
+ }
+#endif
+}
+
+static struct audio_option audio_options[] = {
+ /* DAC */
+ {
+ .name = "DAC_FIXED_SETTINGS",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.fixed_out.enabled,
+ .descr = "Use fixed settings for host DAC"
+ },
+ {
+ .name = "DAC_FIXED_FREQ",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.fixed_out.settings.freq,
+ .descr = "Frequency for fixed host DAC"
+ },
+ {
+ .name = "DAC_FIXED_FMT",
+ .tag = AUD_OPT_FMT,
+ .valp = &conf.fixed_out.settings.fmt,
+ .descr = "Format for fixed host DAC"
+ },
+ {
+ .name = "DAC_FIXED_CHANNELS",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.fixed_out.settings.nchannels,
+ .descr = "Number of channels for fixed DAC (1 - mono, 2 - stereo)"
+ },
+ {
+ .name = "DAC_VOICES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.fixed_out.nb_voices,
+ .descr = "Number of voices for DAC"
+ },
+ {
+ .name = "DAC_TRY_POLL",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.try_poll_out,
+ .descr = "Attempt using poll mode for DAC"
+ },
+ /* ADC */
+ {
+ .name = "ADC_FIXED_SETTINGS",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.fixed_in.enabled,
+ .descr = "Use fixed settings for host ADC"
+ },
+ {
+ .name = "ADC_FIXED_FREQ",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.fixed_in.settings.freq,
+ .descr = "Frequency for fixed host ADC"
+ },
+ {
+ .name = "ADC_FIXED_FMT",
+ .tag = AUD_OPT_FMT,
+ .valp = &conf.fixed_in.settings.fmt,
+ .descr = "Format for fixed host ADC"
+ },
+ {
+ .name = "ADC_FIXED_CHANNELS",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.fixed_in.settings.nchannels,
+ .descr = "Number of channels for fixed ADC (1 - mono, 2 - stereo)"
+ },
+ {
+ .name = "ADC_VOICES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.fixed_in.nb_voices,
+ .descr = "Number of voices for ADC"
+ },
+ {
+ .name = "ADC_TRY_POLL",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.try_poll_in,
+ .descr = "Attempt using poll mode for ADC"
+ },
+ /* Misc */
+ {
+ .name = "TIMER_PERIOD",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.period.hertz,
+ .descr = "Timer period in HZ (0 - use lowest possible)"
+ },
+ {
+ .name = "PLIVE",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.plive,
+ .descr = "(undocumented)"
+ },
+ {
+ .name = "LOG_TO_MONITOR",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.log_to_monitor,
+ .descr = "Print logging messages to monitor instead of stderr"
+ },
+ { /* End of list */ }
+};
+
+static void audio_pp_nb_voices (const char *typ, int nb)
+{
+ switch (nb) {
+ case 0:
+ printf ("Does not support %s\n", typ);
+ break;
+ case 1:
+ printf ("One %s voice\n", typ);
+ break;
+ case INT_MAX:
+ printf ("Theoretically supports many %s voices\n", typ);
+ break;
+ default:
+ printf ("Theoretically supports upto %d %s voices\n", nb, typ);
+ break;
+ }
+
+}
+
+void AUD_help (void)
+{
+ size_t i;
+
+ audio_process_options ("AUDIO", audio_options);
+ for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
+ struct audio_driver *d = drvtab[i];
+ if (d->options) {
+ audio_process_options (d->name, d->options);
+ }
+ }
+
+ printf ("Audio options:\n");
+ audio_print_options ("AUDIO", audio_options);
+ printf ("\n");
+
+ printf ("Available drivers:\n");
+
+ for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
+ struct audio_driver *d = drvtab[i];
+
+ printf ("Name: %s\n", d->name);
+ printf ("Description: %s\n", d->descr);
+
+ audio_pp_nb_voices ("playback", d->max_voices_out);
+ audio_pp_nb_voices ("capture", d->max_voices_in);
+
+ if (d->options) {
+ printf ("Options:\n");
+ audio_print_options (d->name, d->options);
+ }
+ else {
+ printf ("No options\n");
+ }
+ printf ("\n");
+ }
+
+ printf (
+ "Options are settable through environment variables.\n"
+ "Example:\n"
+#ifdef _WIN32
+ " set QEMU_AUDIO_DRV=wav\n"
+ " set QEMU_WAV_PATH=c:\\tune.wav\n"
+#else
+ " export QEMU_AUDIO_DRV=wav\n"
+ " export QEMU_WAV_PATH=$HOME/tune.wav\n"
+ "(for csh replace export with setenv in the above)\n"
+#endif
+ " qemu ...\n\n"
+ );
+}
+
+static int audio_driver_init (AudioState *s, struct audio_driver *drv)
+{
+ if (drv->options) {
+ audio_process_options (drv->name, drv->options);
+ }
+ s->drv_opaque = drv->init ();
+
+ if (s->drv_opaque) {
+ audio_init_nb_voices_out (drv);
+ audio_init_nb_voices_in (drv);
+ s->drv = drv;
+ return 0;
+ }
+ else {
+ dolog ("Could not init `%s' audio driver\n", drv->name);
+ return -1;
+ }
+}
+
+static void audio_vm_change_state_handler (void *opaque, int running,
+ int reason)
+{
+ AudioState *s = opaque;
+ HWVoiceOut *hwo = NULL;
+ HWVoiceIn *hwi = NULL;
+ int op = running ? VOICE_ENABLE : VOICE_DISABLE;
+
+ s->vm_running = running;
+ while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
+ hwo->pcm_ops->ctl_out (hwo, op, conf.try_poll_out);
+ }
+
+ while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
+ hwi->pcm_ops->ctl_in (hwi, op, conf.try_poll_in);
+ }
+ audio_reset_timer (s);
+}
+
+static void audio_atexit (void)
+{
+ AudioState *s = &glob_audio_state;
+ HWVoiceOut *hwo = NULL;
+ HWVoiceIn *hwi = NULL;
+
+ while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
+ SWVoiceCap *sc;
+
+ hwo->pcm_ops->ctl_out (hwo, VOICE_DISABLE);
+ hwo->pcm_ops->fini_out (hwo);
+
+ for (sc = hwo->cap_head.lh_first; sc; sc = sc->entries.le_next) {
+ CaptureVoiceOut *cap = sc->cap;
+ struct capture_callback *cb;
+
+ for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
+ cb->ops.destroy (cb->opaque);
+ }
+ }
+ }
+
+ while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
+ hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
+ hwi->pcm_ops->fini_in (hwi);
+ }
+
+ if (s->drv) {
+ s->drv->fini (s->drv_opaque);
+ }
+}
+
+static const VMStateDescription vmstate_audio = {
+ .name = "audio",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .fields = (VMStateField []) {
+ VMSTATE_END_OF_LIST()
+ }
+};
+
+static void audio_init (void)
+{
+ size_t i;
+ int done = 0;
+ const char *drvname;
+ VMChangeStateEntry *e;
+ AudioState *s = &glob_audio_state;
+
+ if (s->drv) {
+ return;
+ }
+
+ QLIST_INIT (&s->hw_head_out);
+ QLIST_INIT (&s->hw_head_in);
+ QLIST_INIT (&s->cap_head);
+ atexit (audio_atexit);
+
+ s->ts = qemu_new_timer_ns (vm_clock, audio_timer, s);
+ if (!s->ts) {
+ hw_error("Could not create audio timer\n");
+ }
+
+ audio_process_options ("AUDIO", audio_options);
+
+ s->nb_hw_voices_out = conf.fixed_out.nb_voices;
+ s->nb_hw_voices_in = conf.fixed_in.nb_voices;
+
+ if (s->nb_hw_voices_out <= 0) {
+ dolog ("Bogus number of playback voices %d, setting to 1\n",
+ s->nb_hw_voices_out);
+ s->nb_hw_voices_out = 1;
+ }
+
+ if (s->nb_hw_voices_in <= 0) {
+ dolog ("Bogus number of capture voices %d, setting to 0\n",
+ s->nb_hw_voices_in);
+ s->nb_hw_voices_in = 0;
+ }
+
+ {
+ int def;
+ drvname = audio_get_conf_str ("QEMU_AUDIO_DRV", NULL, &def);
+ }
+
+ if (drvname) {
+ int found = 0;
+
+ for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
+ if (!strcmp (drvname, drvtab[i]->name)) {
+ done = !audio_driver_init (s, drvtab[i]);
+ found = 1;
+ break;
+ }
+ }
+
+ if (!found) {
+ dolog ("Unknown audio driver `%s'\n", drvname);
+ dolog ("Run with -audio-help to list available drivers\n");
+ }
+ }
+
+ if (!done) {
+ for (i = 0; !done && i < ARRAY_SIZE (drvtab); i++) {
+ if (drvtab[i]->can_be_default) {
+ done = !audio_driver_init (s, drvtab[i]);
+ }
+ }
+ }
+
+ if (!done) {
+ done = !audio_driver_init (s, &no_audio_driver);
+ if (!done) {
+ hw_error("Could not initialize audio subsystem\n");
+ }
+ else {
+ dolog ("warning: Using timer based audio emulation\n");
+ }
+ }
+
+ if (conf.period.hertz <= 0) {
+ if (conf.period.hertz < 0) {
+ dolog ("warning: Timer period is negative - %d "
+ "treating as zero\n",
+ conf.period.hertz);
+ }
+ conf.period.ticks = 1;
+ } else {
+ conf.period.ticks =
+ muldiv64 (1, get_ticks_per_sec (), conf.period.hertz);
+ }
+
+ e = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s);
+ if (!e) {
+ dolog ("warning: Could not register change state handler\n"
+ "(Audio can continue looping even after stopping the VM)\n");
+ }
+
+ QLIST_INIT (&s->card_head);
+ vmstate_register (NULL, 0, &vmstate_audio, s);
+}
+
+void AUD_register_card (const char *name, QEMUSoundCard *card)
+{
+ audio_init ();
+ card->name = qemu_strdup (name);
+ memset (&card->entries, 0, sizeof (card->entries));
+ QLIST_INSERT_HEAD (&glob_audio_state.card_head, card, entries);
+}
+
+void AUD_remove_card (QEMUSoundCard *card)
+{
+ QLIST_REMOVE (card, entries);
+ qemu_free (card->name);
+}
+
+
+CaptureVoiceOut *AUD_add_capture (
+ struct audsettings *as,
+ struct audio_capture_ops *ops,
+ void *cb_opaque
+ )
+{
+ AudioState *s = &glob_audio_state;
+ CaptureVoiceOut *cap;
+ struct capture_callback *cb;
+
+ if (audio_validate_settings (as)) {
+ dolog ("Invalid settings were passed when trying to add capture\n");
+ audio_print_settings (as);
+ goto err0;
+ }
+
+ cb = audio_calloc (AUDIO_FUNC, 1, sizeof (*cb));
+ if (!cb) {
+ dolog ("Could not allocate capture callback information, size %zu\n",
+ sizeof (*cb));
+ goto err0;
+ }
+ cb->ops = *ops;
+ cb->opaque = cb_opaque;
+
+ cap = audio_pcm_capture_find_specific (as);
+ if (cap) {
+ QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
+ return cap;
+ }
+ else {
+ HWVoiceOut *hw;
+ CaptureVoiceOut *cap;
+
+ cap = audio_calloc (AUDIO_FUNC, 1, sizeof (*cap));
+ if (!cap) {
+ dolog ("Could not allocate capture voice, size %zu\n",
+ sizeof (*cap));
+ goto err1;
+ }
+
+ hw = &cap->hw;
+ QLIST_INIT (&hw->sw_head);
+ QLIST_INIT (&cap->cb_head);
+
+ /* XXX find a more elegant way */
+ hw->samples = 4096 * 4;
+ hw->mix_buf = audio_calloc (AUDIO_FUNC, hw->samples,
+ sizeof (struct st_sample));
+ if (!hw->mix_buf) {
+ dolog ("Could not allocate capture mix buffer (%d samples)\n",
+ hw->samples);
+ goto err2;
+ }
+
+ audio_pcm_init_info (&hw->info, as);
+
+ cap->buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
+ if (!cap->buf) {
+ dolog ("Could not allocate capture buffer "
+ "(%d samples, each %d bytes)\n",
+ hw->samples, 1 << hw->info.shift);
+ goto err3;
+ }
+
+ hw->clip = mixeng_clip
+ [hw->info.nchannels == 2]
+ [hw->info.sign]
+ [hw->info.swap_endianness]
+ [audio_bits_to_index (hw->info.bits)];
+
+ QLIST_INSERT_HEAD (&s->cap_head, cap, entries);
+ QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
+
+ hw = NULL;
+ while ((hw = audio_pcm_hw_find_any_out (hw))) {
+ audio_attach_capture (hw);
+ }
+ return cap;
+
+ err3:
+ qemu_free (cap->hw.mix_buf);
+ err2:
+ qemu_free (cap);
+ err1:
+ qemu_free (cb);
+ err0:
+ return NULL;
+ }
+}
+
+void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)
+{
+ struct capture_callback *cb;
+
+ for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
+ if (cb->opaque == cb_opaque) {
+ cb->ops.destroy (cb_opaque);
+ QLIST_REMOVE (cb, entries);
+ qemu_free (cb);
+
+ if (!cap->cb_head.lh_first) {
+ SWVoiceOut *sw = cap->hw.sw_head.lh_first, *sw1;
+
+ while (sw) {
+ SWVoiceCap *sc = (SWVoiceCap *) sw;
+#ifdef DEBUG_CAPTURE
+ dolog ("freeing %s\n", sw->name);
+#endif
+
+ sw1 = sw->entries.le_next;
+ if (sw->rate) {
+ st_rate_stop (sw->rate);
+ sw->rate = NULL;
+ }
+ QLIST_REMOVE (sw, entries);
+ QLIST_REMOVE (sc, entries);
+ qemu_free (sc);
+ sw = sw1;
+ }
+ QLIST_REMOVE (cap, entries);
+ qemu_free (cap);
+ }
+ return;
+ }
+ }
+}
+
+void AUD_set_volume_out (SWVoiceOut *sw, int mute, uint8_t lvol, uint8_t rvol)
+{
+ if (sw) {
+ sw->vol.mute = mute;
+ sw->vol.l = nominal_volume.l * lvol / 255;
+ sw->vol.r = nominal_volume.r * rvol / 255;
+ }
+}
+
+void AUD_set_volume_in (SWVoiceIn *sw, int mute, uint8_t lvol, uint8_t rvol)
+{
+ if (sw) {
+ sw->vol.mute = mute;
+ sw->vol.l = nominal_volume.l * lvol / 255;
+ sw->vol.r = nominal_volume.r * rvol / 255;
+ }
+}
diff --git a/qemu-0.15.x/audio/audio.h b/qemu-0.15.x/audio/audio.h
new file mode 100644
index 0000000..a70fda9
--- /dev/null
+++ b/qemu-0.15.x/audio/audio.h
@@ -0,0 +1,166 @@
+/*
+ * QEMU Audio subsystem header
+ *
+ * Copyright (c) 2003-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#ifndef QEMU_AUDIO_H
+#define QEMU_AUDIO_H
+
+#include "config-host.h"
+#include "qemu-queue.h"
+
+typedef void (*audio_callback_fn) (void *opaque, int avail);
+
+typedef enum {
+ AUD_FMT_U8,
+ AUD_FMT_S8,
+ AUD_FMT_U16,
+ AUD_FMT_S16,
+ AUD_FMT_U32,
+ AUD_FMT_S32
+} audfmt_e;
+
+#ifdef HOST_WORDS_BIGENDIAN
+#define AUDIO_HOST_ENDIANNESS 1
+#else
+#define AUDIO_HOST_ENDIANNESS 0
+#endif
+
+struct audsettings {
+ int freq;
+ int nchannels;
+ audfmt_e fmt;
+ int endianness;
+};
+
+typedef enum {
+ AUD_CNOTIFY_ENABLE,
+ AUD_CNOTIFY_DISABLE
+} audcnotification_e;
+
+struct audio_capture_ops {
+ void (*notify) (void *opaque, audcnotification_e cmd);
+ void (*capture) (void *opaque, void *buf, int size);
+ void (*destroy) (void *opaque);
+};
+
+struct capture_ops {
+ void (*info) (void *opaque);
+ void (*destroy) (void *opaque);
+};
+
+typedef struct CaptureState {
+ void *opaque;
+ struct capture_ops ops;
+ QLIST_ENTRY (CaptureState) entries;
+} CaptureState;
+
+typedef struct SWVoiceOut SWVoiceOut;
+typedef struct CaptureVoiceOut CaptureVoiceOut;
+typedef struct SWVoiceIn SWVoiceIn;
+
+typedef struct QEMUSoundCard {
+ char *name;
+ QLIST_ENTRY (QEMUSoundCard) entries;
+} QEMUSoundCard;
+
+typedef struct QEMUAudioTimeStamp {
+ uint64_t old_ts;
+} QEMUAudioTimeStamp;
+
+void AUD_vlog (const char *cap, const char *fmt, va_list ap) GCC_FMT_ATTR(2, 0);
+void AUD_log (const char *cap, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
+
+void AUD_help (void);
+void AUD_register_card (const char *name, QEMUSoundCard *card);
+void AUD_remove_card (QEMUSoundCard *card);
+CaptureVoiceOut *AUD_add_capture (
+ struct audsettings *as,
+ struct audio_capture_ops *ops,
+ void *opaque
+ );
+void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque);
+
+SWVoiceOut *AUD_open_out (
+ QEMUSoundCard *card,
+ SWVoiceOut *sw,
+ const char *name,
+ void *callback_opaque,
+ audio_callback_fn callback_fn,
+ struct audsettings *settings
+ );
+
+void AUD_close_out (QEMUSoundCard *card, SWVoiceOut *sw);
+int AUD_write (SWVoiceOut *sw, void *pcm_buf, int size);
+int AUD_get_buffer_size_out (SWVoiceOut *sw);
+void AUD_set_active_out (SWVoiceOut *sw, int on);
+int AUD_is_active_out (SWVoiceOut *sw);
+
+void AUD_init_time_stamp_out (SWVoiceOut *sw, QEMUAudioTimeStamp *ts);
+uint64_t AUD_get_elapsed_usec_out (SWVoiceOut *sw, QEMUAudioTimeStamp *ts);
+
+void AUD_set_volume_out (SWVoiceOut *sw, int mute, uint8_t lvol, uint8_t rvol);
+void AUD_set_volume_in (SWVoiceIn *sw, int mute, uint8_t lvol, uint8_t rvol);
+
+SWVoiceIn *AUD_open_in (
+ QEMUSoundCard *card,
+ SWVoiceIn *sw,
+ const char *name,
+ void *callback_opaque,
+ audio_callback_fn callback_fn,
+ struct audsettings *settings
+ );
+
+void AUD_close_in (QEMUSoundCard *card, SWVoiceIn *sw);
+int AUD_read (SWVoiceIn *sw, void *pcm_buf, int size);
+void AUD_set_active_in (SWVoiceIn *sw, int on);
+int AUD_is_active_in (SWVoiceIn *sw);
+
+void AUD_init_time_stamp_in (SWVoiceIn *sw, QEMUAudioTimeStamp *ts);
+uint64_t AUD_get_elapsed_usec_in (SWVoiceIn *sw, QEMUAudioTimeStamp *ts);
+
+static inline void *advance (void *p, int incr)
+{
+ uint8_t *d = p;
+ return (d + incr);
+}
+
+#ifdef __GNUC__
+#define audio_MIN(a, b) ( __extension__ ({ \
+ __typeof (a) ta = a; \
+ __typeof (b) tb = b; \
+ ((ta)>(tb)?(tb):(ta)); \
+}))
+
+#define audio_MAX(a, b) ( __extension__ ({ \
+ __typeof (a) ta = a; \
+ __typeof (b) tb = b; \
+ ((ta)<(tb)?(tb):(ta)); \
+}))
+#else
+#define audio_MIN(a, b) ((a)>(b)?(b):(a))
+#define audio_MAX(a, b) ((a)<(b)?(b):(a))
+#endif
+
+int wav_start_capture (CaptureState *s, const char *path, int freq,
+ int bits, int nchannels);
+
+#endif /* audio.h */
diff --git a/qemu-0.15.x/audio/audio_int.h b/qemu-0.15.x/audio/audio_int.h
new file mode 100644
index 0000000..2003f8b
--- /dev/null
+++ b/qemu-0.15.x/audio/audio_int.h
@@ -0,0 +1,282 @@
+/*
+ * QEMU Audio subsystem header
+ *
+ * Copyright (c) 2003-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#ifndef QEMU_AUDIO_INT_H
+#define QEMU_AUDIO_INT_H
+
+#ifdef CONFIG_COREAUDIO
+#define FLOAT_MIXENG
+/* #define RECIPROCAL */
+#endif
+#include "mixeng.h"
+
+struct audio_pcm_ops;
+
+typedef enum {
+ AUD_OPT_INT,
+ AUD_OPT_FMT,
+ AUD_OPT_STR,
+ AUD_OPT_BOOL
+} audio_option_tag_e;
+
+struct audio_option {
+ const char *name;
+ audio_option_tag_e tag;
+ void *valp;
+ const char *descr;
+ int *overriddenp;
+ int overridden;
+};
+
+struct audio_callback {
+ void *opaque;
+ audio_callback_fn fn;
+};
+
+struct audio_pcm_info {
+ int bits;
+ int sign;
+ int freq;
+ int nchannels;
+ int align;
+ int shift;
+ int bytes_per_second;
+ int swap_endianness;
+};
+
+typedef struct SWVoiceCap SWVoiceCap;
+
+typedef struct HWVoiceOut {
+ int enabled;
+ int poll_mode;
+ int pending_disable;
+ struct audio_pcm_info info;
+
+ f_sample *clip;
+
+ int rpos;
+ uint64_t ts_helper;
+
+ struct st_sample *mix_buf;
+
+ int samples;
+ QLIST_HEAD (sw_out_listhead, SWVoiceOut) sw_head;
+ QLIST_HEAD (sw_cap_listhead, SWVoiceCap) cap_head;
+ struct audio_pcm_ops *pcm_ops;
+ QLIST_ENTRY (HWVoiceOut) entries;
+} HWVoiceOut;
+
+typedef struct HWVoiceIn {
+ int enabled;
+ int poll_mode;
+ struct audio_pcm_info info;
+
+ t_sample *conv;
+
+ int wpos;
+ int total_samples_captured;
+ uint64_t ts_helper;
+
+ struct st_sample *conv_buf;
+
+ int samples;
+ QLIST_HEAD (sw_in_listhead, SWVoiceIn) sw_head;
+ struct audio_pcm_ops *pcm_ops;
+ QLIST_ENTRY (HWVoiceIn) entries;
+} HWVoiceIn;
+
+struct SWVoiceOut {
+ QEMUSoundCard *card;
+ struct audio_pcm_info info;
+ t_sample *conv;
+ int64_t ratio;
+ struct st_sample *buf;
+ void *rate;
+ int total_hw_samples_mixed;
+ int active;
+ int empty;
+ HWVoiceOut *hw;
+ char *name;
+ struct mixeng_volume vol;
+ struct audio_callback callback;
+ QLIST_ENTRY (SWVoiceOut) entries;
+};
+
+struct SWVoiceIn {
+ QEMUSoundCard *card;
+ int active;
+ struct audio_pcm_info info;
+ int64_t ratio;
+ void *rate;
+ int total_hw_samples_acquired;
+ struct st_sample *buf;
+ f_sample *clip;
+ HWVoiceIn *hw;
+ char *name;
+ struct mixeng_volume vol;
+ struct audio_callback callback;
+ QLIST_ENTRY (SWVoiceIn) entries;
+};
+
+struct audio_driver {
+ const char *name;
+ const char *descr;
+ struct audio_option *options;
+ void *(*init) (void);
+ void (*fini) (void *);
+ struct audio_pcm_ops *pcm_ops;
+ int can_be_default;
+ int max_voices_out;
+ int max_voices_in;
+ int voice_size_out;
+ int voice_size_in;
+};
+
+struct audio_pcm_ops {
+ int (*init_out)(HWVoiceOut *hw, struct audsettings *as);
+ void (*fini_out)(HWVoiceOut *hw);
+ int (*run_out) (HWVoiceOut *hw, int live);
+ int (*write) (SWVoiceOut *sw, void *buf, int size);
+ int (*ctl_out) (HWVoiceOut *hw, int cmd, ...);
+
+ int (*init_in) (HWVoiceIn *hw, struct audsettings *as);
+ void (*fini_in) (HWVoiceIn *hw);
+ int (*run_in) (HWVoiceIn *hw);
+ int (*read) (SWVoiceIn *sw, void *buf, int size);
+ int (*ctl_in) (HWVoiceIn *hw, int cmd, ...);
+};
+
+struct capture_callback {
+ struct audio_capture_ops ops;
+ void *opaque;
+ QLIST_ENTRY (capture_callback) entries;
+};
+
+struct CaptureVoiceOut {
+ HWVoiceOut hw;
+ void *buf;
+ QLIST_HEAD (cb_listhead, capture_callback) cb_head;
+ QLIST_ENTRY (CaptureVoiceOut) entries;
+};
+
+struct SWVoiceCap {
+ SWVoiceOut sw;
+ CaptureVoiceOut *cap;
+ QLIST_ENTRY (SWVoiceCap) entries;
+};
+
+struct AudioState {
+ struct audio_driver *drv;
+ void *drv_opaque;
+
+ QEMUTimer *ts;
+ QLIST_HEAD (card_listhead, QEMUSoundCard) card_head;
+ QLIST_HEAD (hw_in_listhead, HWVoiceIn) hw_head_in;
+ QLIST_HEAD (hw_out_listhead, HWVoiceOut) hw_head_out;
+ QLIST_HEAD (cap_listhead, CaptureVoiceOut) cap_head;
+ int nb_hw_voices_out;
+ int nb_hw_voices_in;
+ int vm_running;
+};
+
+extern struct audio_driver no_audio_driver;
+extern struct audio_driver oss_audio_driver;
+extern struct audio_driver sdl_audio_driver;
+extern struct audio_driver wav_audio_driver;
+extern struct audio_driver fmod_audio_driver;
+extern struct audio_driver alsa_audio_driver;
+extern struct audio_driver coreaudio_audio_driver;
+extern struct audio_driver dsound_audio_driver;
+extern struct audio_driver esd_audio_driver;
+extern struct audio_driver pa_audio_driver;
+extern struct audio_driver spice_audio_driver;
+extern struct audio_driver winwave_audio_driver;
+extern const struct mixeng_volume nominal_volume;
+
+void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as);
+void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len);
+
+int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int len);
+int audio_pcm_hw_get_live_in (HWVoiceIn *hw);
+
+int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int len);
+
+int audio_pcm_hw_clip_out (HWVoiceOut *hw, void *pcm_buf,
+ int live, int pending);
+
+int audio_bug (const char *funcname, int cond);
+void *audio_calloc (const char *funcname, int nmemb, size_t size);
+
+void audio_run (const char *msg);
+
+#define VOICE_ENABLE 1
+#define VOICE_DISABLE 2
+
+static inline int audio_ring_dist (int dst, int src, int len)
+{
+ return (dst >= src) ? (dst - src) : (len - src + dst);
+}
+
+static void GCC_ATTR dolog (const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+}
+
+#ifdef DEBUG
+static void GCC_ATTR ldebug (const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+}
+#else
+#if defined NDEBUG && defined __GNUC__
+#define ldebug(...)
+#elif defined NDEBUG && defined _MSC_VER
+#define ldebug __noop
+#else
+static void GCC_ATTR ldebug (const char *fmt, ...)
+{
+ (void) fmt;
+}
+#endif
+#endif
+
+#undef GCC_ATTR
+
+#define AUDIO_STRINGIFY_(n) #n
+#define AUDIO_STRINGIFY(n) AUDIO_STRINGIFY_(n)
+
+#if defined _MSC_VER || defined __GNUC__
+#define AUDIO_FUNC __FUNCTION__
+#else
+#define AUDIO_FUNC __FILE__ ":" AUDIO_STRINGIFY (__LINE__)
+#endif
+
+#endif /* audio_int.h */
diff --git a/qemu-0.15.x/audio/audio_pt_int.c b/qemu-0.15.x/audio/audio_pt_int.c
new file mode 100644
index 0000000..9a9c306
--- /dev/null
+++ b/qemu-0.15.x/audio/audio_pt_int.c
@@ -0,0 +1,173 @@
+#include "qemu-common.h"
+#include "audio.h"
+
+#define AUDIO_CAP "audio-pt"
+
+#include "audio_int.h"
+#include "audio_pt_int.h"
+
+static void GCC_FMT_ATTR(3, 4) logerr (struct audio_pt *pt, int err,
+ const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (pt->drv, fmt, ap);
+ va_end (ap);
+
+ AUD_log (NULL, "\n");
+ AUD_log (pt->drv, "Reason: %s\n", strerror (err));
+}
+
+int audio_pt_init (struct audio_pt *p, void *(*func) (void *),
+ void *opaque, const char *drv, const char *cap)
+{
+ int err, err2;
+ const char *efunc;
+ sigset_t set, old_set;
+
+ p->drv = drv;
+
+ err = sigfillset (&set);
+ if (err) {
+ logerr (p, errno, "%s(%s): sigfillset failed", cap, AUDIO_FUNC);
+ return -1;
+ }
+
+ err = pthread_mutex_init (&p->mutex, NULL);
+ if (err) {
+ efunc = "pthread_mutex_init";
+ goto err0;
+ }
+
+ err = pthread_cond_init (&p->cond, NULL);
+ if (err) {
+ efunc = "pthread_cond_init";
+ goto err1;
+ }
+
+ err = pthread_sigmask (SIG_BLOCK, &set, &old_set);
+ if (err) {
+ efunc = "pthread_sigmask";
+ goto err2;
+ }
+
+ err = pthread_create (&p->thread, NULL, func, opaque);
+
+ err2 = pthread_sigmask (SIG_SETMASK, &old_set, NULL);
+ if (err2) {
+ logerr (p, err2, "%s(%s): pthread_sigmask (restore) failed",
+ cap, AUDIO_FUNC);
+ /* We have failed to restore original signal mask, all bets are off,
+ so terminate the process */
+ exit (EXIT_FAILURE);
+ }
+
+ if (err) {
+ efunc = "pthread_create";
+ goto err2;
+ }
+
+ return 0;
+
+ err2:
+ err2 = pthread_cond_destroy (&p->cond);
+ if (err2) {
+ logerr (p, err2, "%s(%s): pthread_cond_destroy failed", cap, AUDIO_FUNC);
+ }
+
+ err1:
+ err2 = pthread_mutex_destroy (&p->mutex);
+ if (err2) {
+ logerr (p, err2, "%s(%s): pthread_mutex_destroy failed", cap, AUDIO_FUNC);
+ }
+
+ err0:
+ logerr (p, err, "%s(%s): %s failed", cap, AUDIO_FUNC, efunc);
+ return -1;
+}
+
+int audio_pt_fini (struct audio_pt *p, const char *cap)
+{
+ int err, ret = 0;
+
+ err = pthread_cond_destroy (&p->cond);
+ if (err) {
+ logerr (p, err, "%s(%s): pthread_cond_destroy failed", cap, AUDIO_FUNC);
+ ret = -1;
+ }
+
+ err = pthread_mutex_destroy (&p->mutex);
+ if (err) {
+ logerr (p, err, "%s(%s): pthread_mutex_destroy failed", cap, AUDIO_FUNC);
+ ret = -1;
+ }
+ return ret;
+}
+
+int audio_pt_lock (struct audio_pt *p, const char *cap)
+{
+ int err;
+
+ err = pthread_mutex_lock (&p->mutex);
+ if (err) {
+ logerr (p, err, "%s(%s): pthread_mutex_lock failed", cap, AUDIO_FUNC);
+ return -1;
+ }
+ return 0;
+}
+
+int audio_pt_unlock (struct audio_pt *p, const char *cap)
+{
+ int err;
+
+ err = pthread_mutex_unlock (&p->mutex);
+ if (err) {
+ logerr (p, err, "%s(%s): pthread_mutex_unlock failed", cap, AUDIO_FUNC);
+ return -1;
+ }
+ return 0;
+}
+
+int audio_pt_wait (struct audio_pt *p, const char *cap)
+{
+ int err;
+
+ err = pthread_cond_wait (&p->cond, &p->mutex);
+ if (err) {
+ logerr (p, err, "%s(%s): pthread_cond_wait failed", cap, AUDIO_FUNC);
+ return -1;
+ }
+ return 0;
+}
+
+int audio_pt_unlock_and_signal (struct audio_pt *p, const char *cap)
+{
+ int err;
+
+ err = pthread_mutex_unlock (&p->mutex);
+ if (err) {
+ logerr (p, err, "%s(%s): pthread_mutex_unlock failed", cap, AUDIO_FUNC);
+ return -1;
+ }
+ err = pthread_cond_signal (&p->cond);
+ if (err) {
+ logerr (p, err, "%s(%s): pthread_cond_signal failed", cap, AUDIO_FUNC);
+ return -1;
+ }
+ return 0;
+}
+
+int audio_pt_join (struct audio_pt *p, void **arg, const char *cap)
+{
+ int err;
+ void *ret;
+
+ err = pthread_join (p->thread, &ret);
+ if (err) {
+ logerr (p, err, "%s(%s): pthread_join failed", cap, AUDIO_FUNC);
+ return -1;
+ }
+ *arg = ret;
+ return 0;
+}
diff --git a/qemu-0.15.x/audio/audio_pt_int.h b/qemu-0.15.x/audio/audio_pt_int.h
new file mode 100644
index 0000000..0dfff76
--- /dev/null
+++ b/qemu-0.15.x/audio/audio_pt_int.h
@@ -0,0 +1,22 @@
+#ifndef QEMU_AUDIO_PT_INT_H
+#define QEMU_AUDIO_PT_INT_H
+
+#include <pthread.h>
+
+struct audio_pt {
+ const char *drv;
+ pthread_t thread;
+ pthread_cond_t cond;
+ pthread_mutex_t mutex;
+};
+
+int audio_pt_init (struct audio_pt *, void *(*) (void *), void *,
+ const char *, const char *);
+int audio_pt_fini (struct audio_pt *, const char *);
+int audio_pt_lock (struct audio_pt *, const char *);
+int audio_pt_unlock (struct audio_pt *, const char *);
+int audio_pt_wait (struct audio_pt *, const char *);
+int audio_pt_unlock_and_signal (struct audio_pt *, const char *);
+int audio_pt_join (struct audio_pt *, void **, const char *);
+
+#endif /* audio_pt_int.h */
diff --git a/qemu-0.15.x/audio/audio_template.h b/qemu-0.15.x/audio/audio_template.h
new file mode 100644
index 0000000..fd4469e
--- /dev/null
+++ b/qemu-0.15.x/audio/audio_template.h
@@ -0,0 +1,560 @@
+/*
+ * QEMU Audio subsystem header
+ *
+ * Copyright (c) 2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+
+#ifdef DAC
+#define NAME "playback"
+#define HWBUF hw->mix_buf
+#define TYPE out
+#define HW HWVoiceOut
+#define SW SWVoiceOut
+#else
+#define NAME "capture"
+#define TYPE in
+#define HW HWVoiceIn
+#define SW SWVoiceIn
+#define HWBUF hw->conv_buf
+#endif
+
+static void glue (audio_init_nb_voices_, TYPE) (struct audio_driver *drv)
+{
+ AudioState *s = &glob_audio_state;
+ int max_voices = glue (drv->max_voices_, TYPE);
+ int voice_size = glue (drv->voice_size_, TYPE);
+
+ if (glue (s->nb_hw_voices_, TYPE) > max_voices) {
+ if (!max_voices) {
+#ifdef DAC
+ dolog ("Driver `%s' does not support " NAME "\n", drv->name);
+#endif
+ }
+ else {
+ dolog ("Driver `%s' does not support %d " NAME " voices, max %d\n",
+ drv->name,
+ glue (s->nb_hw_voices_, TYPE),
+ max_voices);
+ }
+ glue (s->nb_hw_voices_, TYPE) = max_voices;
+ }
+
+ if (audio_bug (AUDIO_FUNC, !voice_size && max_voices)) {
+ dolog ("drv=`%s' voice_size=0 max_voices=%d\n",
+ drv->name, max_voices);
+ glue (s->nb_hw_voices_, TYPE) = 0;
+ }
+
+ if (audio_bug (AUDIO_FUNC, voice_size && !max_voices)) {
+ dolog ("drv=`%s' voice_size=%d max_voices=0\n",
+ drv->name, voice_size);
+ }
+}
+
+static void glue (audio_pcm_hw_free_resources_, TYPE) (HW *hw)
+{
+ if (HWBUF) {
+ qemu_free (HWBUF);
+ }
+
+ HWBUF = NULL;
+}
+
+static int glue (audio_pcm_hw_alloc_resources_, TYPE) (HW *hw)
+{
+ HWBUF = audio_calloc (AUDIO_FUNC, hw->samples, sizeof (struct st_sample));
+ if (!HWBUF) {
+ dolog ("Could not allocate " NAME " buffer (%d samples)\n",
+ hw->samples);
+ return -1;
+ }
+
+ return 0;
+}
+
+static void glue (audio_pcm_sw_free_resources_, TYPE) (SW *sw)
+{
+ if (sw->buf) {
+ qemu_free (sw->buf);
+ }
+
+ if (sw->rate) {
+ st_rate_stop (sw->rate);
+ }
+
+ sw->buf = NULL;
+ sw->rate = NULL;
+}
+
+static int glue (audio_pcm_sw_alloc_resources_, TYPE) (SW *sw)
+{
+ int samples;
+
+ samples = ((int64_t) sw->hw->samples << 32) / sw->ratio;
+
+ sw->buf = audio_calloc (AUDIO_FUNC, samples, sizeof (struct st_sample));
+ if (!sw->buf) {
+ dolog ("Could not allocate buffer for `%s' (%d samples)\n",
+ SW_NAME (sw), samples);
+ return -1;
+ }
+
+#ifdef DAC
+ sw->rate = st_rate_start (sw->info.freq, sw->hw->info.freq);
+#else
+ sw->rate = st_rate_start (sw->hw->info.freq, sw->info.freq);
+#endif
+ if (!sw->rate) {
+ qemu_free (sw->buf);
+ sw->buf = NULL;
+ return -1;
+ }
+ return 0;
+}
+
+static int glue (audio_pcm_sw_init_, TYPE) (
+ SW *sw,
+ HW *hw,
+ const char *name,
+ struct audsettings *as
+ )
+{
+ int err;
+
+ audio_pcm_init_info (&sw->info, as);
+ sw->hw = hw;
+ sw->active = 0;
+#ifdef DAC
+ sw->ratio = ((int64_t) sw->hw->info.freq << 32) / sw->info.freq;
+ sw->total_hw_samples_mixed = 0;
+ sw->empty = 1;
+#else
+ sw->ratio = ((int64_t) sw->info.freq << 32) / sw->hw->info.freq;
+#endif
+
+#ifdef DAC
+ sw->conv = mixeng_conv
+#else
+ sw->clip = mixeng_clip
+#endif
+ [sw->info.nchannels == 2]
+ [sw->info.sign]
+ [sw->info.swap_endianness]
+ [audio_bits_to_index (sw->info.bits)];
+
+ sw->name = qemu_strdup (name);
+ err = glue (audio_pcm_sw_alloc_resources_, TYPE) (sw);
+ if (err) {
+ qemu_free (sw->name);
+ sw->name = NULL;
+ }
+ return err;
+}
+
+static void glue (audio_pcm_sw_fini_, TYPE) (SW *sw)
+{
+ glue (audio_pcm_sw_free_resources_, TYPE) (sw);
+ if (sw->name) {
+ qemu_free (sw->name);
+ sw->name = NULL;
+ }
+}
+
+static void glue (audio_pcm_hw_add_sw_, TYPE) (HW *hw, SW *sw)
+{
+ QLIST_INSERT_HEAD (&hw->sw_head, sw, entries);
+}
+
+static void glue (audio_pcm_hw_del_sw_, TYPE) (SW *sw)
+{
+ QLIST_REMOVE (sw, entries);
+}
+
+static void glue (audio_pcm_hw_gc_, TYPE) (HW **hwp)
+{
+ AudioState *s = &glob_audio_state;
+ HW *hw = *hwp;
+
+ if (!hw->sw_head.lh_first) {
+#ifdef DAC
+ audio_detach_capture (hw);
+#endif
+ QLIST_REMOVE (hw, entries);
+ glue (s->nb_hw_voices_, TYPE) += 1;
+ glue (audio_pcm_hw_free_resources_ ,TYPE) (hw);
+ glue (hw->pcm_ops->fini_, TYPE) (hw);
+ qemu_free (hw);
+ *hwp = NULL;
+ }
+}
+
+static HW *glue (audio_pcm_hw_find_any_, TYPE) (HW *hw)
+{
+ AudioState *s = &glob_audio_state;
+ return hw ? hw->entries.le_next : glue (s->hw_head_, TYPE).lh_first;
+}
+
+static HW *glue (audio_pcm_hw_find_any_enabled_, TYPE) (HW *hw)
+{
+ while ((hw = glue (audio_pcm_hw_find_any_, TYPE) (hw))) {
+ if (hw->enabled) {
+ return hw;
+ }
+ }
+ return NULL;
+}
+
+static HW *glue (audio_pcm_hw_find_specific_, TYPE) (
+ HW *hw,
+ struct audsettings *as
+ )
+{
+ while ((hw = glue (audio_pcm_hw_find_any_, TYPE) (hw))) {
+ if (audio_pcm_info_eq (&hw->info, as)) {
+ return hw;
+ }
+ }
+ return NULL;
+}
+
+static HW *glue (audio_pcm_hw_add_new_, TYPE) (struct audsettings *as)
+{
+ HW *hw;
+ AudioState *s = &glob_audio_state;
+ struct audio_driver *drv = s->drv;
+
+ if (!glue (s->nb_hw_voices_, TYPE)) {
+ return NULL;
+ }
+
+ if (audio_bug (AUDIO_FUNC, !drv)) {
+ dolog ("No host audio driver\n");
+ return NULL;
+ }
+
+ if (audio_bug (AUDIO_FUNC, !drv->pcm_ops)) {
+ dolog ("Host audio driver without pcm_ops\n");
+ return NULL;
+ }
+
+ hw = audio_calloc (AUDIO_FUNC, 1, glue (drv->voice_size_, TYPE));
+ if (!hw) {
+ dolog ("Can not allocate voice `%s' size %d\n",
+ drv->name, glue (drv->voice_size_, TYPE));
+ return NULL;
+ }
+
+ hw->pcm_ops = drv->pcm_ops;
+ QLIST_INIT (&hw->sw_head);
+#ifdef DAC
+ QLIST_INIT (&hw->cap_head);
+#endif
+ if (glue (hw->pcm_ops->init_, TYPE) (hw, as)) {
+ goto err0;
+ }
+
+ if (audio_bug (AUDIO_FUNC, hw->samples <= 0)) {
+ dolog ("hw->samples=%d\n", hw->samples);
+ goto err1;
+ }
+
+#ifdef DAC
+ hw->clip = mixeng_clip
+#else
+ hw->conv = mixeng_conv
+#endif
+ [hw->info.nchannels == 2]
+ [hw->info.sign]
+ [hw->info.swap_endianness]
+ [audio_bits_to_index (hw->info.bits)];
+
+ if (glue (audio_pcm_hw_alloc_resources_, TYPE) (hw)) {
+ goto err1;
+ }
+
+ QLIST_INSERT_HEAD (&s->glue (hw_head_, TYPE), hw, entries);
+ glue (s->nb_hw_voices_, TYPE) -= 1;
+#ifdef DAC
+ audio_attach_capture (hw);
+#endif
+ return hw;
+
+ err1:
+ glue (hw->pcm_ops->fini_, TYPE) (hw);
+ err0:
+ qemu_free (hw);
+ return NULL;
+}
+
+static HW *glue (audio_pcm_hw_add_, TYPE) (struct audsettings *as)
+{
+ HW *hw;
+
+ if (glue (conf.fixed_, TYPE).enabled && glue (conf.fixed_, TYPE).greedy) {
+ hw = glue (audio_pcm_hw_add_new_, TYPE) (as);
+ if (hw) {
+ return hw;
+ }
+ }
+
+ hw = glue (audio_pcm_hw_find_specific_, TYPE) (NULL, as);
+ if (hw) {
+ return hw;
+ }
+
+ hw = glue (audio_pcm_hw_add_new_, TYPE) (as);
+ if (hw) {
+ return hw;
+ }
+
+ return glue (audio_pcm_hw_find_any_, TYPE) (NULL);
+}
+
+static SW *glue (audio_pcm_create_voice_pair_, TYPE) (
+ const char *sw_name,
+ struct audsettings *as
+ )
+{
+ SW *sw;
+ HW *hw;
+ struct audsettings hw_as;
+
+ if (glue (conf.fixed_, TYPE).enabled) {
+ hw_as = glue (conf.fixed_, TYPE).settings;
+ }
+ else {
+ hw_as = *as;
+ }
+
+ sw = audio_calloc (AUDIO_FUNC, 1, sizeof (*sw));
+ if (!sw) {
+ dolog ("Could not allocate soft voice `%s' (%zu bytes)\n",
+ sw_name ? sw_name : "unknown", sizeof (*sw));
+ goto err1;
+ }
+
+ hw = glue (audio_pcm_hw_add_, TYPE) (&hw_as);
+ if (!hw) {
+ goto err2;
+ }
+
+ glue (audio_pcm_hw_add_sw_, TYPE) (hw, sw);
+
+ if (glue (audio_pcm_sw_init_, TYPE) (sw, hw, sw_name, as)) {
+ goto err3;
+ }
+
+ return sw;
+
+err3:
+ glue (audio_pcm_hw_del_sw_, TYPE) (sw);
+ glue (audio_pcm_hw_gc_, TYPE) (&hw);
+err2:
+ qemu_free (sw);
+err1:
+ return NULL;
+}
+
+static void glue (audio_close_, TYPE) (SW *sw)
+{
+ glue (audio_pcm_sw_fini_, TYPE) (sw);
+ glue (audio_pcm_hw_del_sw_, TYPE) (sw);
+ glue (audio_pcm_hw_gc_, TYPE) (&sw->hw);
+ qemu_free (sw);
+}
+
+void glue (AUD_close_, TYPE) (QEMUSoundCard *card, SW *sw)
+{
+ if (sw) {
+ if (audio_bug (AUDIO_FUNC, !card)) {
+ dolog ("card=%p\n", card);
+ return;
+ }
+
+ glue (audio_close_, TYPE) (sw);
+ }
+}
+
+SW *glue (AUD_open_, TYPE) (
+ QEMUSoundCard *card,
+ SW *sw,
+ const char *name,
+ void *callback_opaque ,
+ audio_callback_fn callback_fn,
+ struct audsettings *as
+ )
+{
+ AudioState *s = &glob_audio_state;
+#ifdef DAC
+ int live = 0;
+ SW *old_sw = NULL;
+#endif
+
+ ldebug ("open %s, freq %d, nchannels %d, fmt %d\n",
+ name, as->freq, as->nchannels, as->fmt);
+
+ if (audio_bug (AUDIO_FUNC, !card || !name || !callback_fn || !as)) {
+ dolog ("card=%p name=%p callback_fn=%p as=%p\n",
+ card, name, callback_fn, as);
+ goto fail;
+ }
+
+ if (audio_bug (AUDIO_FUNC, audio_validate_settings (as))) {
+ audio_print_settings (as);
+ goto fail;
+ }
+
+ if (audio_bug (AUDIO_FUNC, !s->drv)) {
+ dolog ("Can not open `%s' (no host audio driver)\n", name);
+ goto fail;
+ }
+
+ if (sw && audio_pcm_info_eq (&sw->info, as)) {
+ return sw;
+ }
+
+#ifdef DAC
+ if (conf.plive && sw && (!sw->active && !sw->empty)) {
+ live = sw->total_hw_samples_mixed;
+
+#ifdef DEBUG_PLIVE
+ dolog ("Replacing voice %s with %d live samples\n", SW_NAME (sw), live);
+ dolog ("Old %s freq %d, bits %d, channels %d\n",
+ SW_NAME (sw), sw->info.freq, sw->info.bits, sw->info.nchannels);
+ dolog ("New %s freq %d, bits %d, channels %d\n",
+ name,
+ as->freq,
+ (as->fmt == AUD_FMT_S16 || as->fmt == AUD_FMT_U16) ? 16 : 8,
+ as->nchannels);
+#endif
+
+ if (live) {
+ old_sw = sw;
+ old_sw->callback.fn = NULL;
+ sw = NULL;
+ }
+ }
+#endif
+
+ if (!glue (conf.fixed_, TYPE).enabled && sw) {
+ glue (AUD_close_, TYPE) (card, sw);
+ sw = NULL;
+ }
+
+ if (sw) {
+ HW *hw = sw->hw;
+
+ if (!hw) {
+ dolog ("Internal logic error voice `%s' has no hardware store\n",
+ SW_NAME (sw));
+ goto fail;
+ }
+
+ glue (audio_pcm_sw_fini_, TYPE) (sw);
+ if (glue (audio_pcm_sw_init_, TYPE) (sw, hw, name, as)) {
+ goto fail;
+ }
+ }
+ else {
+ sw = glue (audio_pcm_create_voice_pair_, TYPE) (name, as);
+ if (!sw) {
+ dolog ("Failed to create voice `%s'\n", name);
+ return NULL;
+ }
+ }
+
+ sw->card = card;
+ sw->vol = nominal_volume;
+ sw->callback.fn = callback_fn;
+ sw->callback.opaque = callback_opaque;
+
+#ifdef DAC
+ if (live) {
+ int mixed =
+ (live << old_sw->info.shift)
+ * old_sw->info.bytes_per_second
+ / sw->info.bytes_per_second;
+
+#ifdef DEBUG_PLIVE
+ dolog ("Silence will be mixed %d\n", mixed);
+#endif
+ sw->total_hw_samples_mixed += mixed;
+ }
+#endif
+
+#ifdef DEBUG_AUDIO
+ dolog ("%s\n", name);
+ audio_pcm_print_info ("hw", &sw->hw->info);
+ audio_pcm_print_info ("sw", &sw->info);
+#endif
+
+ return sw;
+
+ fail:
+ glue (AUD_close_, TYPE) (card, sw);
+ return NULL;
+}
+
+int glue (AUD_is_active_, TYPE) (SW *sw)
+{
+ return sw ? sw->active : 0;
+}
+
+void glue (AUD_init_time_stamp_, TYPE) (SW *sw, QEMUAudioTimeStamp *ts)
+{
+ if (!sw) {
+ return;
+ }
+
+ ts->old_ts = sw->hw->ts_helper;
+}
+
+uint64_t glue (AUD_get_elapsed_usec_, TYPE) (SW *sw, QEMUAudioTimeStamp *ts)
+{
+ uint64_t delta, cur_ts, old_ts;
+
+ if (!sw) {
+ return 0;
+ }
+
+ cur_ts = sw->hw->ts_helper;
+ old_ts = ts->old_ts;
+ /* dolog ("cur %" PRId64 " old %" PRId64 "\n", cur_ts, old_ts); */
+
+ if (cur_ts >= old_ts) {
+ delta = cur_ts - old_ts;
+ }
+ else {
+ delta = UINT64_MAX - old_ts + cur_ts;
+ }
+
+ if (!delta) {
+ return 0;
+ }
+
+ return muldiv64 (delta, sw->hw->info.freq, 1000000);
+}
+
+#undef TYPE
+#undef HW
+#undef SW
+#undef HWBUF
+#undef NAME
diff --git a/qemu-0.15.x/audio/audio_win_int.c b/qemu-0.15.x/audio/audio_win_int.c
new file mode 100644
index 0000000..5869052
--- /dev/null
+++ b/qemu-0.15.x/audio/audio_win_int.c
@@ -0,0 +1,108 @@
+/* public domain */
+
+#include "qemu-common.h"
+#include "audio.h"
+
+#define AUDIO_CAP "win-int"
+#include <windows.h>
+#include <mmsystem.h>
+
+#include "audio.h"
+#include "audio_int.h"
+#include "audio_win_int.h"
+
+int waveformat_from_audio_settings (WAVEFORMATEX *wfx,
+ struct audsettings *as)
+{
+ memset (wfx, 0, sizeof (*wfx));
+
+ wfx->wFormatTag = WAVE_FORMAT_PCM;
+ wfx->nChannels = as->nchannels;
+ wfx->nSamplesPerSec = as->freq;
+ wfx->nAvgBytesPerSec = as->freq << (as->nchannels == 2);
+ wfx->nBlockAlign = 1 << (as->nchannels == 2);
+ wfx->cbSize = 0;
+
+ switch (as->fmt) {
+ case AUD_FMT_S8:
+ case AUD_FMT_U8:
+ wfx->wBitsPerSample = 8;
+ break;
+
+ case AUD_FMT_S16:
+ case AUD_FMT_U16:
+ wfx->wBitsPerSample = 16;
+ wfx->nAvgBytesPerSec <<= 1;
+ wfx->nBlockAlign <<= 1;
+ break;
+
+ case AUD_FMT_S32:
+ case AUD_FMT_U32:
+ wfx->wBitsPerSample = 32;
+ wfx->nAvgBytesPerSec <<= 2;
+ wfx->nBlockAlign <<= 2;
+ break;
+
+ default:
+ dolog ("Internal logic error: Bad audio format %d\n", as->freq);
+ return -1;
+ }
+
+ return 0;
+}
+
+int waveformat_to_audio_settings (WAVEFORMATEX *wfx,
+ struct audsettings *as)
+{
+ if (wfx->wFormatTag != WAVE_FORMAT_PCM) {
+ dolog ("Invalid wave format, tag is not PCM, but %d\n",
+ wfx->wFormatTag);
+ return -1;
+ }
+
+ if (!wfx->nSamplesPerSec) {
+ dolog ("Invalid wave format, frequency is zero\n");
+ return -1;
+ }
+ as->freq = wfx->nSamplesPerSec;
+
+ switch (wfx->nChannels) {
+ case 1:
+ as->nchannels = 1;
+ break;
+
+ case 2:
+ as->nchannels = 2;
+ break;
+
+ default:
+ dolog (
+ "Invalid wave format, number of channels is not 1 or 2, but %d\n",
+ wfx->nChannels
+ );
+ return -1;
+ }
+
+ switch (wfx->wBitsPerSample) {
+ case 8:
+ as->fmt = AUD_FMT_U8;
+ break;
+
+ case 16:
+ as->fmt = AUD_FMT_S16;
+ break;
+
+ case 32:
+ as->fmt = AUD_FMT_S32;
+ break;
+
+ default:
+ dolog ("Invalid wave format, bits per sample is not "
+ "8, 16 or 32, but %d\n",
+ wfx->wBitsPerSample);
+ return -1;
+ }
+
+ return 0;
+}
+
diff --git a/qemu-0.15.x/audio/audio_win_int.h b/qemu-0.15.x/audio/audio_win_int.h
new file mode 100644
index 0000000..fa5b3cb
--- /dev/null
+++ b/qemu-0.15.x/audio/audio_win_int.h
@@ -0,0 +1,10 @@
+#ifndef AUDIO_WIN_INT_H
+#define AUDIO_WIN_INT_H
+
+int waveformat_from_audio_settings (WAVEFORMATEX *wfx,
+ struct audsettings *as);
+
+int waveformat_to_audio_settings (WAVEFORMATEX *wfx,
+ struct audsettings *as);
+
+#endif /* AUDIO_WIN_INT_H */
diff --git a/qemu-0.15.x/audio/coreaudio.c b/qemu-0.15.x/audio/coreaudio.c
new file mode 100644
index 0000000..5964c62
--- /dev/null
+++ b/qemu-0.15.x/audio/coreaudio.c
@@ -0,0 +1,549 @@
+/*
+ * QEMU OS X CoreAudio audio driver
+ *
+ * Copyright (c) 2005 Mike Kronenberg
+ *
+ * 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.
+ */
+
+#include <CoreAudio/CoreAudio.h>
+#include <string.h> /* strerror */
+#include <pthread.h> /* pthread_X */
+
+#include "qemu-common.h"
+#include "audio.h"
+
+#define AUDIO_CAP "coreaudio"
+#include "audio_int.h"
+
+struct {
+ int buffer_frames;
+ int nbuffers;
+ int isAtexit;
+} conf = {
+ .buffer_frames = 512,
+ .nbuffers = 4,
+ .isAtexit = 0
+};
+
+typedef struct coreaudioVoiceOut {
+ HWVoiceOut hw;
+ pthread_mutex_t mutex;
+ int isAtexit;
+ AudioDeviceID outputDeviceID;
+ UInt32 audioDevicePropertyBufferFrameSize;
+ AudioStreamBasicDescription outputStreamBasicDescription;
+ int live;
+ int decr;
+ int rpos;
+} coreaudioVoiceOut;
+
+static void coreaudio_logstatus (OSStatus status)
+{
+ const char *str = "BUG";
+
+ switch(status) {
+ case kAudioHardwareNoError:
+ str = "kAudioHardwareNoError";
+ break;
+
+ case kAudioHardwareNotRunningError:
+ str = "kAudioHardwareNotRunningError";
+ break;
+
+ case kAudioHardwareUnspecifiedError:
+ str = "kAudioHardwareUnspecifiedError";
+ break;
+
+ case kAudioHardwareUnknownPropertyError:
+ str = "kAudioHardwareUnknownPropertyError";
+ break;
+
+ case kAudioHardwareBadPropertySizeError:
+ str = "kAudioHardwareBadPropertySizeError";
+ break;
+
+ case kAudioHardwareIllegalOperationError:
+ str = "kAudioHardwareIllegalOperationError";
+ break;
+
+ case kAudioHardwareBadDeviceError:
+ str = "kAudioHardwareBadDeviceError";
+ break;
+
+ case kAudioHardwareBadStreamError:
+ str = "kAudioHardwareBadStreamError";
+ break;
+
+ case kAudioHardwareUnsupportedOperationError:
+ str = "kAudioHardwareUnsupportedOperationError";
+ break;
+
+ case kAudioDeviceUnsupportedFormatError:
+ str = "kAudioDeviceUnsupportedFormatError";
+ break;
+
+ case kAudioDevicePermissionsError:
+ str = "kAudioDevicePermissionsError";
+ break;
+
+ default:
+ AUD_log (AUDIO_CAP, "Reason: status code %" PRId32 "\n", (int32_t)status);
+ return;
+ }
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n", str);
+}
+
+static void GCC_FMT_ATTR (2, 3) coreaudio_logerr (
+ OSStatus status,
+ const char *fmt,
+ ...
+ )
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_log (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ coreaudio_logstatus (status);
+}
+
+static void GCC_FMT_ATTR (3, 4) coreaudio_logerr2 (
+ OSStatus status,
+ const char *typ,
+ const char *fmt,
+ ...
+ )
+{
+ va_list ap;
+
+ AUD_log (AUDIO_CAP, "Could not initialize %s\n", typ);
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ coreaudio_logstatus (status);
+}
+
+static inline UInt32 isPlaying (AudioDeviceID outputDeviceID)
+{
+ OSStatus status;
+ UInt32 result = 0;
+ UInt32 propertySize = sizeof(outputDeviceID);
+ status = AudioDeviceGetProperty(
+ outputDeviceID, 0, 0,
+ kAudioDevicePropertyDeviceIsRunning, &propertySize, &result);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr(status,
+ "Could not determine whether Device is playing\n");
+ }
+ return result;
+}
+
+static void coreaudio_atexit (void)
+{
+ conf.isAtexit = 1;
+}
+
+static int coreaudio_lock (coreaudioVoiceOut *core, const char *fn_name)
+{
+ int err;
+
+ err = pthread_mutex_lock (&core->mutex);
+ if (err) {
+ dolog ("Could not lock voice for %s\nReason: %s\n",
+ fn_name, strerror (err));
+ return -1;
+ }
+ return 0;
+}
+
+static int coreaudio_unlock (coreaudioVoiceOut *core, const char *fn_name)
+{
+ int err;
+
+ err = pthread_mutex_unlock (&core->mutex);
+ if (err) {
+ dolog ("Could not unlock voice for %s\nReason: %s\n",
+ fn_name, strerror (err));
+ return -1;
+ }
+ return 0;
+}
+
+static int coreaudio_run_out (HWVoiceOut *hw, int live)
+{
+ int decr;
+ coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw;
+
+ if (coreaudio_lock (core, "coreaudio_run_out")) {
+ return 0;
+ }
+
+ if (core->decr > live) {
+ ldebug ("core->decr %d live %d core->live %d\n",
+ core->decr,
+ live,
+ core->live);
+ }
+
+ decr = audio_MIN (core->decr, live);
+ core->decr -= decr;
+
+ core->live = live - decr;
+ hw->rpos = core->rpos;
+
+ coreaudio_unlock (core, "coreaudio_run_out");
+ return decr;
+}
+
+/* callback to feed audiooutput buffer */
+static OSStatus audioDeviceIOProc(
+ AudioDeviceID inDevice,
+ const AudioTimeStamp* inNow,
+ const AudioBufferList* inInputData,
+ const AudioTimeStamp* inInputTime,
+ AudioBufferList* outOutputData,
+ const AudioTimeStamp* inOutputTime,
+ void* hwptr)
+{
+ UInt32 frame, frameCount;
+ float *out = outOutputData->mBuffers[0].mData;
+ HWVoiceOut *hw = hwptr;
+ coreaudioVoiceOut *core = (coreaudioVoiceOut *) hwptr;
+ int rpos, live;
+ struct st_sample *src;
+#ifndef FLOAT_MIXENG
+#ifdef RECIPROCAL
+ const float scale = 1.f / UINT_MAX;
+#else
+ const float scale = UINT_MAX;
+#endif
+#endif
+
+ if (coreaudio_lock (core, "audioDeviceIOProc")) {
+ inInputTime = 0;
+ return 0;
+ }
+
+ frameCount = core->audioDevicePropertyBufferFrameSize;
+ live = core->live;
+
+ /* if there are not enough samples, set signal and return */
+ if (live < frameCount) {
+ inInputTime = 0;
+ coreaudio_unlock (core, "audioDeviceIOProc(empty)");
+ return 0;
+ }
+
+ rpos = core->rpos;
+ src = hw->mix_buf + rpos;
+
+ /* fill buffer */
+ for (frame = 0; frame < frameCount; frame++) {
+#ifdef FLOAT_MIXENG
+ *out++ = src[frame].l; /* left channel */
+ *out++ = src[frame].r; /* right channel */
+#else
+#ifdef RECIPROCAL
+ *out++ = src[frame].l * scale; /* left channel */
+ *out++ = src[frame].r * scale; /* right channel */
+#else
+ *out++ = src[frame].l / scale; /* left channel */
+ *out++ = src[frame].r / scale; /* right channel */
+#endif
+#endif
+ }
+
+ rpos = (rpos + frameCount) % hw->samples;
+ core->decr += frameCount;
+ core->rpos = rpos;
+
+ coreaudio_unlock (core, "audioDeviceIOProc");
+ return 0;
+}
+
+static int coreaudio_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static int coreaudio_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ OSStatus status;
+ coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw;
+ UInt32 propertySize;
+ int err;
+ const char *typ = "playback";
+ AudioValueRange frameRange;
+
+ /* create mutex */
+ err = pthread_mutex_init(&core->mutex, NULL);
+ if (err) {
+ dolog("Could not create mutex\nReason: %s\n", strerror (err));
+ return -1;
+ }
+
+ audio_pcm_init_info (&hw->info, as);
+
+ /* open default output device */
+ propertySize = sizeof(core->outputDeviceID);
+ status = AudioHardwareGetProperty(
+ kAudioHardwarePropertyDefaultOutputDevice,
+ &propertySize,
+ &core->outputDeviceID);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr2 (status, typ,
+ "Could not get default output Device\n");
+ return -1;
+ }
+ if (core->outputDeviceID == kAudioDeviceUnknown) {
+ dolog ("Could not initialize %s - Unknown Audiodevice\n", typ);
+ return -1;
+ }
+
+ /* get minimum and maximum buffer frame sizes */
+ propertySize = sizeof(frameRange);
+ status = AudioDeviceGetProperty(
+ core->outputDeviceID,
+ 0,
+ 0,
+ kAudioDevicePropertyBufferFrameSizeRange,
+ &propertySize,
+ &frameRange);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr2 (status, typ,
+ "Could not get device buffer frame range\n");
+ return -1;
+ }
+
+ if (frameRange.mMinimum > conf.buffer_frames) {
+ core->audioDevicePropertyBufferFrameSize = (UInt32) frameRange.mMinimum;
+ dolog ("warning: Upsizing Buffer Frames to %f\n", frameRange.mMinimum);
+ }
+ else if (frameRange.mMaximum < conf.buffer_frames) {
+ core->audioDevicePropertyBufferFrameSize = (UInt32) frameRange.mMaximum;
+ dolog ("warning: Downsizing Buffer Frames to %f\n", frameRange.mMaximum);
+ }
+ else {
+ core->audioDevicePropertyBufferFrameSize = conf.buffer_frames;
+ }
+
+ /* set Buffer Frame Size */
+ propertySize = sizeof(core->audioDevicePropertyBufferFrameSize);
+ status = AudioDeviceSetProperty(
+ core->outputDeviceID,
+ NULL,
+ 0,
+ false,
+ kAudioDevicePropertyBufferFrameSize,
+ propertySize,
+ &core->audioDevicePropertyBufferFrameSize);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr2 (status, typ,
+ "Could not set device buffer frame size %" PRIu32 "\n",
+ (uint32_t)core->audioDevicePropertyBufferFrameSize);
+ return -1;
+ }
+
+ /* get Buffer Frame Size */
+ propertySize = sizeof(core->audioDevicePropertyBufferFrameSize);
+ status = AudioDeviceGetProperty(
+ core->outputDeviceID,
+ 0,
+ false,
+ kAudioDevicePropertyBufferFrameSize,
+ &propertySize,
+ &core->audioDevicePropertyBufferFrameSize);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr2 (status, typ,
+ "Could not get device buffer frame size\n");
+ return -1;
+ }
+ hw->samples = conf.nbuffers * core->audioDevicePropertyBufferFrameSize;
+
+ /* get StreamFormat */
+ propertySize = sizeof(core->outputStreamBasicDescription);
+ status = AudioDeviceGetProperty(
+ core->outputDeviceID,
+ 0,
+ false,
+ kAudioDevicePropertyStreamFormat,
+ &propertySize,
+ &core->outputStreamBasicDescription);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr2 (status, typ,
+ "Could not get Device Stream properties\n");
+ core->outputDeviceID = kAudioDeviceUnknown;
+ return -1;
+ }
+
+ /* set Samplerate */
+ core->outputStreamBasicDescription.mSampleRate = (Float64) as->freq;
+ propertySize = sizeof(core->outputStreamBasicDescription);
+ status = AudioDeviceSetProperty(
+ core->outputDeviceID,
+ 0,
+ 0,
+ 0,
+ kAudioDevicePropertyStreamFormat,
+ propertySize,
+ &core->outputStreamBasicDescription);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr2 (status, typ, "Could not set samplerate %d\n",
+ as->freq);
+ core->outputDeviceID = kAudioDeviceUnknown;
+ return -1;
+ }
+
+ /* set Callback */
+ status = AudioDeviceAddIOProc(core->outputDeviceID, audioDeviceIOProc, hw);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr2 (status, typ, "Could not set IOProc\n");
+ core->outputDeviceID = kAudioDeviceUnknown;
+ return -1;
+ }
+
+ /* start Playback */
+ if (!isPlaying(core->outputDeviceID)) {
+ status = AudioDeviceStart(core->outputDeviceID, audioDeviceIOProc);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr2 (status, typ, "Could not start playback\n");
+ AudioDeviceRemoveIOProc(core->outputDeviceID, audioDeviceIOProc);
+ core->outputDeviceID = kAudioDeviceUnknown;
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static void coreaudio_fini_out (HWVoiceOut *hw)
+{
+ OSStatus status;
+ int err;
+ coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw;
+
+ if (!conf.isAtexit) {
+ /* stop playback */
+ if (isPlaying(core->outputDeviceID)) {
+ status = AudioDeviceStop(core->outputDeviceID, audioDeviceIOProc);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr (status, "Could not stop playback\n");
+ }
+ }
+
+ /* remove callback */
+ status = AudioDeviceRemoveIOProc(core->outputDeviceID,
+ audioDeviceIOProc);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr (status, "Could not remove IOProc\n");
+ }
+ }
+ core->outputDeviceID = kAudioDeviceUnknown;
+
+ /* destroy mutex */
+ err = pthread_mutex_destroy(&core->mutex);
+ if (err) {
+ dolog("Could not destroy mutex\nReason: %s\n", strerror (err));
+ }
+}
+
+static int coreaudio_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ OSStatus status;
+ coreaudioVoiceOut *core = (coreaudioVoiceOut *) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ /* start playback */
+ if (!isPlaying(core->outputDeviceID)) {
+ status = AudioDeviceStart(core->outputDeviceID, audioDeviceIOProc);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr (status, "Could not resume playback\n");
+ }
+ }
+ break;
+
+ case VOICE_DISABLE:
+ /* stop playback */
+ if (!conf.isAtexit) {
+ if (isPlaying(core->outputDeviceID)) {
+ status = AudioDeviceStop(core->outputDeviceID, audioDeviceIOProc);
+ if (status != kAudioHardwareNoError) {
+ coreaudio_logerr (status, "Could not pause playback\n");
+ }
+ }
+ }
+ break;
+ }
+ return 0;
+}
+
+static void *coreaudio_audio_init (void)
+{
+ atexit(coreaudio_atexit);
+ return &coreaudio_audio_init;
+}
+
+static void coreaudio_audio_fini (void *opaque)
+{
+ (void) opaque;
+}
+
+static struct audio_option coreaudio_options[] = {
+ {
+ .name = "BUFFER_SIZE",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.buffer_frames,
+ .descr = "Size of the buffer in frames"
+ },
+ {
+ .name = "BUFFER_COUNT",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.nbuffers,
+ .descr = "Number of buffers"
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops coreaudio_pcm_ops = {
+ .init_out = coreaudio_init_out,
+ .fini_out = coreaudio_fini_out,
+ .run_out = coreaudio_run_out,
+ .write = coreaudio_write,
+ .ctl_out = coreaudio_ctl_out
+};
+
+struct audio_driver coreaudio_audio_driver = {
+ .name = "coreaudio",
+ .descr = "CoreAudio http://developer.apple.com/audio/coreaudio.html",
+ .options = coreaudio_options,
+ .init = coreaudio_audio_init,
+ .fini = coreaudio_audio_fini,
+ .pcm_ops = &coreaudio_pcm_ops,
+ .can_be_default = 1,
+ .max_voices_out = 1,
+ .max_voices_in = 0,
+ .voice_size_out = sizeof (coreaudioVoiceOut),
+ .voice_size_in = 0
+};
diff --git a/qemu-0.15.x/audio/dsound_template.h b/qemu-0.15.x/audio/dsound_template.h
new file mode 100644
index 0000000..8b37d16
--- /dev/null
+++ b/qemu-0.15.x/audio/dsound_template.h
@@ -0,0 +1,293 @@
+/*
+ * QEMU DirectSound audio driver header
+ *
+ * Copyright (c) 2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#ifdef DSBTYPE_IN
+#define NAME "capture buffer"
+#define NAME2 "DirectSoundCapture"
+#define TYPE in
+#define IFACE IDirectSoundCaptureBuffer
+#define BUFPTR LPDIRECTSOUNDCAPTUREBUFFER
+#define FIELD dsound_capture_buffer
+#define FIELD2 dsound_capture
+#else
+#define NAME "playback buffer"
+#define NAME2 "DirectSound"
+#define TYPE out
+#define IFACE IDirectSoundBuffer
+#define BUFPTR LPDIRECTSOUNDBUFFER
+#define FIELD dsound_buffer
+#define FIELD2 dsound
+#endif
+
+static int glue (dsound_unlock_, TYPE) (
+ BUFPTR buf,
+ LPVOID p1,
+ LPVOID p2,
+ DWORD blen1,
+ DWORD blen2
+ )
+{
+ HRESULT hr;
+
+ hr = glue (IFACE, _Unlock) (buf, p1, blen1, p2, blen2);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not unlock " NAME "\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static int glue (dsound_lock_, TYPE) (
+ BUFPTR buf,
+ struct audio_pcm_info *info,
+ DWORD pos,
+ DWORD len,
+ LPVOID *p1p,
+ LPVOID *p2p,
+ DWORD *blen1p,
+ DWORD *blen2p,
+ int entire
+ )
+{
+ HRESULT hr;
+ int i;
+ LPVOID p1 = NULL, p2 = NULL;
+ DWORD blen1 = 0, blen2 = 0;
+ DWORD flag;
+
+#ifdef DSBTYPE_IN
+ flag = entire ? DSCBLOCK_ENTIREBUFFER : 0;
+#else
+ flag = entire ? DSBLOCK_ENTIREBUFFER : 0;
+#endif
+ for (i = 0; i < conf.lock_retries; ++i) {
+ hr = glue (IFACE, _Lock) (
+ buf,
+ pos,
+ len,
+ &p1,
+ &blen1,
+ &p2,
+ &blen2,
+ flag
+ );
+
+ if (FAILED (hr)) {
+#ifndef DSBTYPE_IN
+ if (hr == DSERR_BUFFERLOST) {
+ if (glue (dsound_restore_, TYPE) (buf)) {
+ dsound_logerr (hr, "Could not lock " NAME "\n");
+ goto fail;
+ }
+ continue;
+ }
+#endif
+ dsound_logerr (hr, "Could not lock " NAME "\n");
+ goto fail;
+ }
+
+ break;
+ }
+
+ if (i == conf.lock_retries) {
+ dolog ("%d attempts to lock " NAME " failed\n", i);
+ goto fail;
+ }
+
+ if ((p1 && (blen1 & info->align)) || (p2 && (blen2 & info->align))) {
+ dolog ("DirectSound returned misaligned buffer %ld %ld\n",
+ blen1, blen2);
+ glue (dsound_unlock_, TYPE) (buf, p1, p2, blen1, blen2);
+ goto fail;
+ }
+
+ if (!p1 && blen1) {
+ dolog ("warning: !p1 && blen1=%ld\n", blen1);
+ blen1 = 0;
+ }
+
+ if (!p2 && blen2) {
+ dolog ("warning: !p2 && blen2=%ld\n", blen2);
+ blen2 = 0;
+ }
+
+ *p1p = p1;
+ *p2p = p2;
+ *blen1p = blen1;
+ *blen2p = blen2;
+ return 0;
+
+ fail:
+ *p1p = NULL - 1;
+ *p2p = NULL - 1;
+ *blen1p = -1;
+ *blen2p = -1;
+ return -1;
+}
+
+#ifdef DSBTYPE_IN
+static void dsound_fini_in (HWVoiceIn *hw)
+#else
+static void dsound_fini_out (HWVoiceOut *hw)
+#endif
+{
+ HRESULT hr;
+#ifdef DSBTYPE_IN
+ DSoundVoiceIn *ds = (DSoundVoiceIn *) hw;
+#else
+ DSoundVoiceOut *ds = (DSoundVoiceOut *) hw;
+#endif
+
+ if (ds->FIELD) {
+ hr = glue (IFACE, _Stop) (ds->FIELD);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not stop " NAME "\n");
+ }
+
+ hr = glue (IFACE, _Release) (ds->FIELD);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not release " NAME "\n");
+ }
+ ds->FIELD = NULL;
+ }
+}
+
+#ifdef DSBTYPE_IN
+static int dsound_init_in (HWVoiceIn *hw, struct audsettings *as)
+#else
+static int dsound_init_out (HWVoiceOut *hw, struct audsettings *as)
+#endif
+{
+ int err;
+ HRESULT hr;
+ dsound *s = &glob_dsound;
+ WAVEFORMATEX wfx;
+ struct audsettings obt_as;
+#ifdef DSBTYPE_IN
+ const char *typ = "ADC";
+ DSoundVoiceIn *ds = (DSoundVoiceIn *) hw;
+ DSCBUFFERDESC bd;
+ DSCBCAPS bc;
+#else
+ const char *typ = "DAC";
+ DSoundVoiceOut *ds = (DSoundVoiceOut *) hw;
+ DSBUFFERDESC bd;
+ DSBCAPS bc;
+#endif
+
+ if (!s->FIELD2) {
+ dolog ("Attempt to initialize voice without " NAME2 " object\n");
+ return -1;
+ }
+
+ err = waveformat_from_audio_settings (&wfx, as);
+ if (err) {
+ return -1;
+ }
+
+ memset (&bd, 0, sizeof (bd));
+ bd.dwSize = sizeof (bd);
+ bd.lpwfxFormat = &wfx;
+#ifdef DSBTYPE_IN
+ bd.dwBufferBytes = conf.bufsize_in;
+ hr = IDirectSoundCapture_CreateCaptureBuffer (
+ s->dsound_capture,
+ &bd,
+ &ds->dsound_capture_buffer,
+ NULL
+ );
+#else
+ bd.dwFlags = DSBCAPS_STICKYFOCUS | DSBCAPS_GETCURRENTPOSITION2;
+ bd.dwBufferBytes = conf.bufsize_out;
+ hr = IDirectSound_CreateSoundBuffer (
+ s->dsound,
+ &bd,
+ &ds->dsound_buffer,
+ NULL
+ );
+#endif
+
+ if (FAILED (hr)) {
+ dsound_logerr2 (hr, typ, "Could not create " NAME "\n");
+ return -1;
+ }
+
+ hr = glue (IFACE, _GetFormat) (ds->FIELD, &wfx, sizeof (wfx), NULL);
+ if (FAILED (hr)) {
+ dsound_logerr2 (hr, typ, "Could not get " NAME " format\n");
+ goto fail0;
+ }
+
+#ifdef DEBUG_DSOUND
+ dolog (NAME "\n");
+ print_wave_format (&wfx);
+#endif
+
+ memset (&bc, 0, sizeof (bc));
+ bc.dwSize = sizeof (bc);
+
+ hr = glue (IFACE, _GetCaps) (ds->FIELD, &bc);
+ if (FAILED (hr)) {
+ dsound_logerr2 (hr, typ, "Could not get " NAME " format\n");
+ goto fail0;
+ }
+
+ err = waveformat_to_audio_settings (&wfx, &obt_as);
+ if (err) {
+ goto fail0;
+ }
+
+ ds->first_time = 1;
+ obt_as.endianness = 0;
+ audio_pcm_init_info (&hw->info, &obt_as);
+
+ if (bc.dwBufferBytes & hw->info.align) {
+ dolog (
+ "GetCaps returned misaligned buffer size %ld, alignment %d\n",
+ bc.dwBufferBytes, hw->info.align + 1
+ );
+ }
+ hw->samples = bc.dwBufferBytes >> hw->info.shift;
+
+#ifdef DEBUG_DSOUND
+ dolog ("caps %ld, desc %ld\n",
+ bc.dwBufferBytes, bd.dwBufferBytes);
+
+ dolog ("bufsize %d, freq %d, chan %d, fmt %d\n",
+ hw->bufsize, settings.freq, settings.nchannels, settings.fmt);
+#endif
+ return 0;
+
+ fail0:
+ glue (dsound_fini_, TYPE) (hw);
+ return -1;
+}
+
+#undef NAME
+#undef NAME2
+#undef TYPE
+#undef IFACE
+#undef BUFPTR
+#undef FIELD
+#undef FIELD2
diff --git a/qemu-0.15.x/audio/dsoundaudio.c b/qemu-0.15.x/audio/dsoundaudio.c
new file mode 100644
index 0000000..e2d89fd
--- /dev/null
+++ b/qemu-0.15.x/audio/dsoundaudio.c
@@ -0,0 +1,1030 @@
+/*
+ * QEMU DirectSound audio driver
+ *
+ * Copyright (c) 2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+
+/*
+ * SEAL 1.07 by Carlos 'pel' Hasan was used as documentation
+ */
+
+#include "qemu-common.h"
+#include "audio.h"
+
+#define AUDIO_CAP "dsound"
+#include "audio_int.h"
+
+#include <windows.h>
+#include <mmsystem.h>
+#include <objbase.h>
+#include <dsound.h>
+
+#include "audio_win_int.h"
+
+/* #define DEBUG_DSOUND */
+
+static struct {
+ int lock_retries;
+ int restore_retries;
+ int getstatus_retries;
+ int set_primary;
+ int bufsize_in;
+ int bufsize_out;
+ struct audsettings settings;
+ int latency_millis;
+} conf = {
+ .lock_retries = 1,
+ .restore_retries = 1,
+ .getstatus_retries = 1,
+ .set_primary = 0,
+ .bufsize_in = 16384,
+ .bufsize_out = 16384,
+ .settings.freq = 44100,
+ .settings.nchannels = 2,
+ .settings.fmt = AUD_FMT_S16,
+ .latency_millis = 10
+};
+
+typedef struct {
+ LPDIRECTSOUND dsound;
+ LPDIRECTSOUNDCAPTURE dsound_capture;
+ LPDIRECTSOUNDBUFFER dsound_primary_buffer;
+ struct audsettings settings;
+} dsound;
+
+static dsound glob_dsound;
+
+typedef struct {
+ HWVoiceOut hw;
+ LPDIRECTSOUNDBUFFER dsound_buffer;
+ DWORD old_pos;
+ int first_time;
+#ifdef DEBUG_DSOUND
+ DWORD old_ppos;
+ DWORD played;
+ DWORD mixed;
+#endif
+} DSoundVoiceOut;
+
+typedef struct {
+ HWVoiceIn hw;
+ int first_time;
+ LPDIRECTSOUNDCAPTUREBUFFER dsound_capture_buffer;
+} DSoundVoiceIn;
+
+static void dsound_log_hresult (HRESULT hr)
+{
+ const char *str = "BUG";
+
+ switch (hr) {
+ case DS_OK:
+ str = "The method succeeded";
+ break;
+#ifdef DS_NO_VIRTUALIZATION
+ case DS_NO_VIRTUALIZATION:
+ str = "The buffer was created, but another 3D algorithm was substituted";
+ break;
+#endif
+#ifdef DS_INCOMPLETE
+ case DS_INCOMPLETE:
+ str = "The method succeeded, but not all the optional effects were obtained";
+ break;
+#endif
+#ifdef DSERR_ACCESSDENIED
+ case DSERR_ACCESSDENIED:
+ str = "The request failed because access was denied";
+ break;
+#endif
+#ifdef DSERR_ALLOCATED
+ case DSERR_ALLOCATED:
+ str = "The request failed because resources, such as a priority level, were already in use by another caller";
+ break;
+#endif
+#ifdef DSERR_ALREADYINITIALIZED
+ case DSERR_ALREADYINITIALIZED:
+ str = "The object is already initialized";
+ break;
+#endif
+#ifdef DSERR_BADFORMAT
+ case DSERR_BADFORMAT:
+ str = "The specified wave format is not supported";
+ break;
+#endif
+#ifdef DSERR_BADSENDBUFFERGUID
+ case DSERR_BADSENDBUFFERGUID:
+ str = "The GUID specified in an audiopath file does not match a valid mix-in buffer";
+ break;
+#endif
+#ifdef DSERR_BUFFERLOST
+ case DSERR_BUFFERLOST:
+ str = "The buffer memory has been lost and must be restored";
+ break;
+#endif
+#ifdef DSERR_BUFFERTOOSMALL
+ case DSERR_BUFFERTOOSMALL:
+ str = "The buffer size is not great enough to enable effects processing";
+ break;
+#endif
+#ifdef DSERR_CONTROLUNAVAIL
+ case DSERR_CONTROLUNAVAIL:
+ str = "The buffer control (volume, pan, and so on) requested by the caller is not available. Controls must be specified when the buffer is created, using the dwFlags member of DSBUFFERDESC";
+ break;
+#endif
+#ifdef DSERR_DS8_REQUIRED
+ case DSERR_DS8_REQUIRED:
+ str = "A DirectSound object of class CLSID_DirectSound8 or later is required for the requested functionality. For more information, see IDirectSound8 Interface";
+ break;
+#endif
+#ifdef DSERR_FXUNAVAILABLE
+ case DSERR_FXUNAVAILABLE:
+ str = "The effects requested could not be found on the system, or they are in the wrong order or in the wrong location; for example, an effect expected in hardware was found in software";
+ break;
+#endif
+#ifdef DSERR_GENERIC
+ case DSERR_GENERIC :
+ str = "An undetermined error occurred inside the DirectSound subsystem";
+ break;
+#endif
+#ifdef DSERR_INVALIDCALL
+ case DSERR_INVALIDCALL:
+ str = "This function is not valid for the current state of this object";
+ break;
+#endif
+#ifdef DSERR_INVALIDPARAM
+ case DSERR_INVALIDPARAM:
+ str = "An invalid parameter was passed to the returning function";
+ break;
+#endif
+#ifdef DSERR_NOAGGREGATION
+ case DSERR_NOAGGREGATION:
+ str = "The object does not support aggregation";
+ break;
+#endif
+#ifdef DSERR_NODRIVER
+ case DSERR_NODRIVER:
+ str = "No sound driver is available for use, or the given GUID is not a valid DirectSound device ID";
+ break;
+#endif
+#ifdef DSERR_NOINTERFACE
+ case DSERR_NOINTERFACE:
+ str = "The requested COM interface is not available";
+ break;
+#endif
+#ifdef DSERR_OBJECTNOTFOUND
+ case DSERR_OBJECTNOTFOUND:
+ str = "The requested object was not found";
+ break;
+#endif
+#ifdef DSERR_OTHERAPPHASPRIO
+ case DSERR_OTHERAPPHASPRIO:
+ str = "Another application has a higher priority level, preventing this call from succeeding";
+ break;
+#endif
+#ifdef DSERR_OUTOFMEMORY
+ case DSERR_OUTOFMEMORY:
+ str = "The DirectSound subsystem could not allocate sufficient memory to complete the caller's request";
+ break;
+#endif
+#ifdef DSERR_PRIOLEVELNEEDED
+ case DSERR_PRIOLEVELNEEDED:
+ str = "A cooperative level of DSSCL_PRIORITY or higher is required";
+ break;
+#endif
+#ifdef DSERR_SENDLOOP
+ case DSERR_SENDLOOP:
+ str = "A circular loop of send effects was detected";
+ break;
+#endif
+#ifdef DSERR_UNINITIALIZED
+ case DSERR_UNINITIALIZED:
+ str = "The Initialize method has not been called or has not been called successfully before other methods were called";
+ break;
+#endif
+#ifdef DSERR_UNSUPPORTED
+ case DSERR_UNSUPPORTED:
+ str = "The function called is not supported at this time";
+ break;
+#endif
+ default:
+ AUD_log (AUDIO_CAP, "Reason: Unknown (HRESULT %#lx)\n", hr);
+ return;
+ }
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n", str);
+}
+
+static void GCC_FMT_ATTR (2, 3) dsound_logerr (
+ HRESULT hr,
+ const char *fmt,
+ ...
+ )
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ dsound_log_hresult (hr);
+}
+
+static void GCC_FMT_ATTR (3, 4) dsound_logerr2 (
+ HRESULT hr,
+ const char *typ,
+ const char *fmt,
+ ...
+ )
+{
+ va_list ap;
+
+ AUD_log (AUDIO_CAP, "Could not initialize %s\n", typ);
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ dsound_log_hresult (hr);
+}
+
+static DWORD millis_to_bytes (struct audio_pcm_info *info, DWORD millis)
+{
+ return (millis * info->bytes_per_second) / 1000;
+}
+
+#ifdef DEBUG_DSOUND
+static void print_wave_format (WAVEFORMATEX *wfx)
+{
+ dolog ("tag = %d\n", wfx->wFormatTag);
+ dolog ("nChannels = %d\n", wfx->nChannels);
+ dolog ("nSamplesPerSec = %ld\n", wfx->nSamplesPerSec);
+ dolog ("nAvgBytesPerSec = %ld\n", wfx->nAvgBytesPerSec);
+ dolog ("nBlockAlign = %d\n", wfx->nBlockAlign);
+ dolog ("wBitsPerSample = %d\n", wfx->wBitsPerSample);
+ dolog ("cbSize = %d\n", wfx->cbSize);
+}
+#endif
+
+static int dsound_restore_out (LPDIRECTSOUNDBUFFER dsb)
+{
+ HRESULT hr;
+ int i;
+
+ for (i = 0; i < conf.restore_retries; ++i) {
+ hr = IDirectSoundBuffer_Restore (dsb);
+
+ switch (hr) {
+ case DS_OK:
+ return 0;
+
+ case DSERR_BUFFERLOST:
+ continue;
+
+ default:
+ dsound_logerr (hr, "Could not restore playback buffer\n");
+ return -1;
+ }
+ }
+
+ dolog ("%d attempts to restore playback buffer failed\n", i);
+ return -1;
+}
+
+#include "dsound_template.h"
+#define DSBTYPE_IN
+#include "dsound_template.h"
+#undef DSBTYPE_IN
+
+static int dsound_get_status_out (LPDIRECTSOUNDBUFFER dsb, DWORD *statusp)
+{
+ HRESULT hr;
+ int i;
+
+ for (i = 0; i < conf.getstatus_retries; ++i) {
+ hr = IDirectSoundBuffer_GetStatus (dsb, statusp);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not get playback buffer status\n");
+ return -1;
+ }
+
+ if (*statusp & DSERR_BUFFERLOST) {
+ if (dsound_restore_out (dsb)) {
+ return -1;
+ }
+ continue;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+static int dsound_get_status_in (LPDIRECTSOUNDCAPTUREBUFFER dscb,
+ DWORD *statusp)
+{
+ HRESULT hr;
+
+ hr = IDirectSoundCaptureBuffer_GetStatus (dscb, statusp);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not get capture buffer status\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static void dsound_write_sample (HWVoiceOut *hw, uint8_t *dst, int dst_len)
+{
+ int src_len1 = dst_len;
+ int src_len2 = 0;
+ int pos = hw->rpos + dst_len;
+ struct st_sample *src1 = hw->mix_buf + hw->rpos;
+ struct st_sample *src2 = NULL;
+
+ if (pos > hw->samples) {
+ src_len1 = hw->samples - hw->rpos;
+ src2 = hw->mix_buf;
+ src_len2 = dst_len - src_len1;
+ pos = src_len2;
+ }
+
+ if (src_len1) {
+ hw->clip (dst, src1, src_len1);
+ }
+
+ if (src_len2) {
+ dst = advance (dst, src_len1 << hw->info.shift);
+ hw->clip (dst, src2, src_len2);
+ }
+
+ hw->rpos = pos % hw->samples;
+}
+
+static void dsound_clear_sample (HWVoiceOut *hw, LPDIRECTSOUNDBUFFER dsb)
+{
+ int err;
+ LPVOID p1, p2;
+ DWORD blen1, blen2, len1, len2;
+
+ err = dsound_lock_out (
+ dsb,
+ &hw->info,
+ 0,
+ hw->samples << hw->info.shift,
+ &p1, &p2,
+ &blen1, &blen2,
+ 1
+ );
+ if (err) {
+ return;
+ }
+
+ len1 = blen1 >> hw->info.shift;
+ len2 = blen2 >> hw->info.shift;
+
+#ifdef DEBUG_DSOUND
+ dolog ("clear %p,%ld,%ld %p,%ld,%ld\n",
+ p1, blen1, len1,
+ p2, blen2, len2);
+#endif
+
+ if (p1 && len1) {
+ audio_pcm_info_clear_buf (&hw->info, p1, len1);
+ }
+
+ if (p2 && len2) {
+ audio_pcm_info_clear_buf (&hw->info, p2, len2);
+ }
+
+ dsound_unlock_out (dsb, p1, p2, blen1, blen2);
+}
+
+static void dsound_close (dsound *s)
+{
+ HRESULT hr;
+
+ if (s->dsound_primary_buffer) {
+ hr = IDirectSoundBuffer_Release (s->dsound_primary_buffer);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not release primary buffer\n");
+ }
+ s->dsound_primary_buffer = NULL;
+ }
+}
+
+static int dsound_open (dsound *s)
+{
+ int err;
+ HRESULT hr;
+ WAVEFORMATEX wfx;
+ DSBUFFERDESC dsbd;
+ HWND hwnd;
+
+ hwnd = GetForegroundWindow ();
+ hr = IDirectSound_SetCooperativeLevel (
+ s->dsound,
+ hwnd,
+ DSSCL_PRIORITY
+ );
+
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not set cooperative level for window %p\n",
+ hwnd);
+ return -1;
+ }
+
+ if (!conf.set_primary) {
+ return 0;
+ }
+
+ err = waveformat_from_audio_settings (&wfx, &conf.settings);
+ if (err) {
+ return -1;
+ }
+
+ memset (&dsbd, 0, sizeof (dsbd));
+ dsbd.dwSize = sizeof (dsbd);
+ dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER;
+ dsbd.dwBufferBytes = 0;
+ dsbd.lpwfxFormat = NULL;
+
+ hr = IDirectSound_CreateSoundBuffer (
+ s->dsound,
+ &dsbd,
+ &s->dsound_primary_buffer,
+ NULL
+ );
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not create primary playback buffer\n");
+ return -1;
+ }
+
+ hr = IDirectSoundBuffer_SetFormat (s->dsound_primary_buffer, &wfx);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not set primary playback buffer format\n");
+ }
+
+ hr = IDirectSoundBuffer_GetFormat (
+ s->dsound_primary_buffer,
+ &wfx,
+ sizeof (wfx),
+ NULL
+ );
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not get primary playback buffer format\n");
+ goto fail0;
+ }
+
+#ifdef DEBUG_DSOUND
+ dolog ("Primary\n");
+ print_wave_format (&wfx);
+#endif
+
+ err = waveformat_to_audio_settings (&wfx, &s->settings);
+ if (err) {
+ goto fail0;
+ }
+
+ return 0;
+
+ fail0:
+ dsound_close (s);
+ return -1;
+}
+
+static int dsound_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ HRESULT hr;
+ DWORD status;
+ DSoundVoiceOut *ds = (DSoundVoiceOut *) hw;
+ LPDIRECTSOUNDBUFFER dsb = ds->dsound_buffer;
+
+ if (!dsb) {
+ dolog ("Attempt to control voice without a buffer\n");
+ return 0;
+ }
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ if (dsound_get_status_out (dsb, &status)) {
+ return -1;
+ }
+
+ if (status & DSBSTATUS_PLAYING) {
+ dolog ("warning: Voice is already playing\n");
+ return 0;
+ }
+
+ dsound_clear_sample (hw, dsb);
+
+ hr = IDirectSoundBuffer_Play (dsb, 0, 0, DSBPLAY_LOOPING);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not start playing buffer\n");
+ return -1;
+ }
+ break;
+
+ case VOICE_DISABLE:
+ if (dsound_get_status_out (dsb, &status)) {
+ return -1;
+ }
+
+ if (status & DSBSTATUS_PLAYING) {
+ hr = IDirectSoundBuffer_Stop (dsb);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not stop playing buffer\n");
+ return -1;
+ }
+ }
+ else {
+ dolog ("warning: Voice is not playing\n");
+ }
+ break;
+ }
+ return 0;
+}
+
+static int dsound_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static int dsound_run_out (HWVoiceOut *hw, int live)
+{
+ int err;
+ HRESULT hr;
+ DSoundVoiceOut *ds = (DSoundVoiceOut *) hw;
+ LPDIRECTSOUNDBUFFER dsb = ds->dsound_buffer;
+ int len, hwshift;
+ DWORD blen1, blen2;
+ DWORD len1, len2;
+ DWORD decr;
+ DWORD wpos, ppos, old_pos;
+ LPVOID p1, p2;
+ int bufsize;
+
+ if (!dsb) {
+ dolog ("Attempt to run empty with playback buffer\n");
+ return 0;
+ }
+
+ hwshift = hw->info.shift;
+ bufsize = hw->samples << hwshift;
+
+ hr = IDirectSoundBuffer_GetCurrentPosition (
+ dsb,
+ &ppos,
+ ds->first_time ? &wpos : NULL
+ );
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not get playback buffer position\n");
+ return 0;
+ }
+
+ len = live << hwshift;
+
+ if (ds->first_time) {
+ if (conf.latency_millis) {
+ DWORD cur_blat;
+
+ cur_blat = audio_ring_dist (wpos, ppos, bufsize);
+ ds->first_time = 0;
+ old_pos = wpos;
+ old_pos +=
+ millis_to_bytes (&hw->info, conf.latency_millis) - cur_blat;
+ old_pos %= bufsize;
+ old_pos &= ~hw->info.align;
+ }
+ else {
+ old_pos = wpos;
+ }
+#ifdef DEBUG_DSOUND
+ ds->played = 0;
+ ds->mixed = 0;
+#endif
+ }
+ else {
+ if (ds->old_pos == ppos) {
+#ifdef DEBUG_DSOUND
+ dolog ("old_pos == ppos\n");
+#endif
+ return 0;
+ }
+
+#ifdef DEBUG_DSOUND
+ ds->played += audio_ring_dist (ds->old_pos, ppos, hw->bufsize);
+#endif
+ old_pos = ds->old_pos;
+ }
+
+ if ((old_pos < ppos) && ((old_pos + len) > ppos)) {
+ len = ppos - old_pos;
+ }
+ else {
+ if ((old_pos > ppos) && ((old_pos + len) > (ppos + bufsize))) {
+ len = bufsize - old_pos + ppos;
+ }
+ }
+
+ if (audio_bug (AUDIO_FUNC, len < 0 || len > bufsize)) {
+ dolog ("len=%d bufsize=%d old_pos=%ld ppos=%ld\n",
+ len, bufsize, old_pos, ppos);
+ return 0;
+ }
+
+ len &= ~hw->info.align;
+ if (!len) {
+ return 0;
+ }
+
+#ifdef DEBUG_DSOUND
+ ds->old_ppos = ppos;
+#endif
+ err = dsound_lock_out (
+ dsb,
+ &hw->info,
+ old_pos,
+ len,
+ &p1, &p2,
+ &blen1, &blen2,
+ 0
+ );
+ if (err) {
+ return 0;
+ }
+
+ len1 = blen1 >> hwshift;
+ len2 = blen2 >> hwshift;
+ decr = len1 + len2;
+
+ if (p1 && len1) {
+ dsound_write_sample (hw, p1, len1);
+ }
+
+ if (p2 && len2) {
+ dsound_write_sample (hw, p2, len2);
+ }
+
+ dsound_unlock_out (dsb, p1, p2, blen1, blen2);
+ ds->old_pos = (old_pos + (decr << hwshift)) % bufsize;
+
+#ifdef DEBUG_DSOUND
+ ds->mixed += decr << hwshift;
+
+ dolog ("played %lu mixed %lu diff %ld sec %f\n",
+ ds->played,
+ ds->mixed,
+ ds->mixed - ds->played,
+ abs (ds->mixed - ds->played) / (double) hw->info.bytes_per_second);
+#endif
+ return decr;
+}
+
+static int dsound_ctl_in (HWVoiceIn *hw, int cmd, ...)
+{
+ HRESULT hr;
+ DWORD status;
+ DSoundVoiceIn *ds = (DSoundVoiceIn *) hw;
+ LPDIRECTSOUNDCAPTUREBUFFER dscb = ds->dsound_capture_buffer;
+
+ if (!dscb) {
+ dolog ("Attempt to control capture voice without a buffer\n");
+ return -1;
+ }
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ if (dsound_get_status_in (dscb, &status)) {
+ return -1;
+ }
+
+ if (status & DSCBSTATUS_CAPTURING) {
+ dolog ("warning: Voice is already capturing\n");
+ return 0;
+ }
+
+ /* clear ?? */
+
+ hr = IDirectSoundCaptureBuffer_Start (dscb, DSCBSTART_LOOPING);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not start capturing\n");
+ return -1;
+ }
+ break;
+
+ case VOICE_DISABLE:
+ if (dsound_get_status_in (dscb, &status)) {
+ return -1;
+ }
+
+ if (status & DSCBSTATUS_CAPTURING) {
+ hr = IDirectSoundCaptureBuffer_Stop (dscb);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not stop capturing\n");
+ return -1;
+ }
+ }
+ else {
+ dolog ("warning: Voice is not capturing\n");
+ }
+ break;
+ }
+ return 0;
+}
+
+static int dsound_read (SWVoiceIn *sw, void *buf, int len)
+{
+ return audio_pcm_sw_read (sw, buf, len);
+}
+
+static int dsound_run_in (HWVoiceIn *hw)
+{
+ int err;
+ HRESULT hr;
+ DSoundVoiceIn *ds = (DSoundVoiceIn *) hw;
+ LPDIRECTSOUNDCAPTUREBUFFER dscb = ds->dsound_capture_buffer;
+ int live, len, dead;
+ DWORD blen1, blen2;
+ DWORD len1, len2;
+ DWORD decr;
+ DWORD cpos, rpos;
+ LPVOID p1, p2;
+ int hwshift;
+
+ if (!dscb) {
+ dolog ("Attempt to run without capture buffer\n");
+ return 0;
+ }
+
+ hwshift = hw->info.shift;
+
+ live = audio_pcm_hw_get_live_in (hw);
+ dead = hw->samples - live;
+ if (!dead) {
+ return 0;
+ }
+
+ hr = IDirectSoundCaptureBuffer_GetCurrentPosition (
+ dscb,
+ &cpos,
+ ds->first_time ? &rpos : NULL
+ );
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not get capture buffer position\n");
+ return 0;
+ }
+
+ if (ds->first_time) {
+ ds->first_time = 0;
+ if (rpos & hw->info.align) {
+ ldebug ("warning: Misaligned capture read position %ld(%d)\n",
+ rpos, hw->info.align);
+ }
+ hw->wpos = rpos >> hwshift;
+ }
+
+ if (cpos & hw->info.align) {
+ ldebug ("warning: Misaligned capture position %ld(%d)\n",
+ cpos, hw->info.align);
+ }
+ cpos >>= hwshift;
+
+ len = audio_ring_dist (cpos, hw->wpos, hw->samples);
+ if (!len) {
+ return 0;
+ }
+ len = audio_MIN (len, dead);
+
+ err = dsound_lock_in (
+ dscb,
+ &hw->info,
+ hw->wpos << hwshift,
+ len << hwshift,
+ &p1,
+ &p2,
+ &blen1,
+ &blen2,
+ 0
+ );
+ if (err) {
+ return 0;
+ }
+
+ len1 = blen1 >> hwshift;
+ len2 = blen2 >> hwshift;
+ decr = len1 + len2;
+
+ if (p1 && len1) {
+ hw->conv (hw->conv_buf + hw->wpos, p1, len1);
+ }
+
+ if (p2 && len2) {
+ hw->conv (hw->conv_buf, p2, len2);
+ }
+
+ dsound_unlock_in (dscb, p1, p2, blen1, blen2);
+ hw->wpos = (hw->wpos + decr) % hw->samples;
+ return decr;
+}
+
+static void dsound_audio_fini (void *opaque)
+{
+ HRESULT hr;
+ dsound *s = opaque;
+
+ if (!s->dsound) {
+ return;
+ }
+
+ hr = IDirectSound_Release (s->dsound);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not release DirectSound\n");
+ }
+ s->dsound = NULL;
+
+ if (!s->dsound_capture) {
+ return;
+ }
+
+ hr = IDirectSoundCapture_Release (s->dsound_capture);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not release DirectSoundCapture\n");
+ }
+ s->dsound_capture = NULL;
+}
+
+static void *dsound_audio_init (void)
+{
+ int err;
+ HRESULT hr;
+ dsound *s = &glob_dsound;
+
+ hr = CoInitialize (NULL);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not initialize COM\n");
+ return NULL;
+ }
+
+ hr = CoCreateInstance (
+ &CLSID_DirectSound,
+ NULL,
+ CLSCTX_ALL,
+ &IID_IDirectSound,
+ (void **) &s->dsound
+ );
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not create DirectSound instance\n");
+ return NULL;
+ }
+
+ hr = IDirectSound_Initialize (s->dsound, NULL);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not initialize DirectSound\n");
+
+ hr = IDirectSound_Release (s->dsound);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not release DirectSound\n");
+ }
+ s->dsound = NULL;
+ return NULL;
+ }
+
+ hr = CoCreateInstance (
+ &CLSID_DirectSoundCapture,
+ NULL,
+ CLSCTX_ALL,
+ &IID_IDirectSoundCapture,
+ (void **) &s->dsound_capture
+ );
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not create DirectSoundCapture instance\n");
+ }
+ else {
+ hr = IDirectSoundCapture_Initialize (s->dsound_capture, NULL);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not initialize DirectSoundCapture\n");
+
+ hr = IDirectSoundCapture_Release (s->dsound_capture);
+ if (FAILED (hr)) {
+ dsound_logerr (hr, "Could not release DirectSoundCapture\n");
+ }
+ s->dsound_capture = NULL;
+ }
+ }
+
+ err = dsound_open (s);
+ if (err) {
+ dsound_audio_fini (s);
+ return NULL;
+ }
+
+ return s;
+}
+
+static struct audio_option dsound_options[] = {
+ {
+ .name = "LOCK_RETRIES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.lock_retries,
+ .descr = "Number of times to attempt locking the buffer"
+ },
+ {
+ .name = "RESTOURE_RETRIES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.restore_retries,
+ .descr = "Number of times to attempt restoring the buffer"
+ },
+ {
+ .name = "GETSTATUS_RETRIES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.getstatus_retries,
+ .descr = "Number of times to attempt getting status of the buffer"
+ },
+ {
+ .name = "SET_PRIMARY",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.set_primary,
+ .descr = "Set the parameters of primary buffer"
+ },
+ {
+ .name = "LATENCY_MILLIS",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.latency_millis,
+ .descr = "(undocumented)"
+ },
+ {
+ .name = "PRIMARY_FREQ",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.settings.freq,
+ .descr = "Primary buffer frequency"
+ },
+ {
+ .name = "PRIMARY_CHANNELS",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.settings.nchannels,
+ .descr = "Primary buffer number of channels (1 - mono, 2 - stereo)"
+ },
+ {
+ .name = "PRIMARY_FMT",
+ .tag = AUD_OPT_FMT,
+ .valp = &conf.settings.fmt,
+ .descr = "Primary buffer format"
+ },
+ {
+ .name = "BUFSIZE_OUT",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.bufsize_out,
+ .descr = "(undocumented)"
+ },
+ {
+ .name = "BUFSIZE_IN",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.bufsize_in,
+ .descr = "(undocumented)"
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops dsound_pcm_ops = {
+ .init_out = dsound_init_out,
+ .fini_out = dsound_fini_out,
+ .run_out = dsound_run_out,
+ .write = dsound_write,
+ .ctl_out = dsound_ctl_out,
+
+ .init_in = dsound_init_in,
+ .fini_in = dsound_fini_in,
+ .run_in = dsound_run_in,
+ .read = dsound_read,
+ .ctl_in = dsound_ctl_in
+};
+
+struct audio_driver dsound_audio_driver = {
+ .name = "dsound",
+ .descr = "DirectSound http://wikipedia.org/wiki/DirectSound",
+ .options = dsound_options,
+ .init = dsound_audio_init,
+ .fini = dsound_audio_fini,
+ .pcm_ops = &dsound_pcm_ops,
+ .can_be_default = 1,
+ .max_voices_out = INT_MAX,
+ .max_voices_in = 1,
+ .voice_size_out = sizeof (DSoundVoiceOut),
+ .voice_size_in = sizeof (DSoundVoiceIn)
+};
diff --git a/qemu-0.15.x/audio/esdaudio.c b/qemu-0.15.x/audio/esdaudio.c
new file mode 100644
index 0000000..ff97b39
--- /dev/null
+++ b/qemu-0.15.x/audio/esdaudio.c
@@ -0,0 +1,557 @@
+/*
+ * QEMU ESD audio driver
+ *
+ * Copyright (c) 2006 Frederick Reeve (brushed up by malc)
+ *
+ * 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.
+ */
+#include <esd.h>
+#include "qemu-common.h"
+#include "audio.h"
+
+#define AUDIO_CAP "esd"
+#include "audio_int.h"
+#include "audio_pt_int.h"
+
+typedef struct {
+ HWVoiceOut hw;
+ int done;
+ int live;
+ int decr;
+ int rpos;
+ void *pcm_buf;
+ int fd;
+ struct audio_pt pt;
+} ESDVoiceOut;
+
+typedef struct {
+ HWVoiceIn hw;
+ int done;
+ int dead;
+ int incr;
+ int wpos;
+ void *pcm_buf;
+ int fd;
+ struct audio_pt pt;
+} ESDVoiceIn;
+
+static struct {
+ int samples;
+ int divisor;
+ char *dac_host;
+ char *adc_host;
+} conf = {
+ .samples = 1024,
+ .divisor = 2,
+};
+
+static void GCC_FMT_ATTR (2, 3) qesd_logerr (int err, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n", strerror (err));
+}
+
+/* playback */
+static void *qesd_thread_out (void *arg)
+{
+ ESDVoiceOut *esd = arg;
+ HWVoiceOut *hw = &esd->hw;
+ int threshold;
+
+ threshold = conf.divisor ? hw->samples / conf.divisor : 0;
+
+ if (audio_pt_lock (&esd->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ for (;;) {
+ int decr, to_mix, rpos;
+
+ for (;;) {
+ if (esd->done) {
+ goto exit;
+ }
+
+ if (esd->live > threshold) {
+ break;
+ }
+
+ if (audio_pt_wait (&esd->pt, AUDIO_FUNC)) {
+ goto exit;
+ }
+ }
+
+ decr = to_mix = esd->live;
+ rpos = hw->rpos;
+
+ if (audio_pt_unlock (&esd->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ while (to_mix) {
+ ssize_t written;
+ int chunk = audio_MIN (to_mix, hw->samples - rpos);
+ struct st_sample *src = hw->mix_buf + rpos;
+
+ hw->clip (esd->pcm_buf, src, chunk);
+
+ again:
+ written = write (esd->fd, esd->pcm_buf, chunk << hw->info.shift);
+ if (written == -1) {
+ if (errno == EINTR || errno == EAGAIN) {
+ goto again;
+ }
+ qesd_logerr (errno, "write failed\n");
+ return NULL;
+ }
+
+ if (written != chunk << hw->info.shift) {
+ int wsamples = written >> hw->info.shift;
+ int wbytes = wsamples << hw->info.shift;
+ if (wbytes != written) {
+ dolog ("warning: Misaligned write %d (requested %zd), "
+ "alignment %d\n",
+ wbytes, written, hw->info.align + 1);
+ }
+ to_mix -= wsamples;
+ rpos = (rpos + wsamples) % hw->samples;
+ break;
+ }
+
+ rpos = (rpos + chunk) % hw->samples;
+ to_mix -= chunk;
+ }
+
+ if (audio_pt_lock (&esd->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ esd->rpos = rpos;
+ esd->live -= decr;
+ esd->decr += decr;
+ }
+
+ exit:
+ audio_pt_unlock (&esd->pt, AUDIO_FUNC);
+ return NULL;
+}
+
+static int qesd_run_out (HWVoiceOut *hw, int live)
+{
+ int decr;
+ ESDVoiceOut *esd = (ESDVoiceOut *) hw;
+
+ if (audio_pt_lock (&esd->pt, AUDIO_FUNC)) {
+ return 0;
+ }
+
+ decr = audio_MIN (live, esd->decr);
+ esd->decr -= decr;
+ esd->live = live - decr;
+ hw->rpos = esd->rpos;
+ if (esd->live > 0) {
+ audio_pt_unlock_and_signal (&esd->pt, AUDIO_FUNC);
+ }
+ else {
+ audio_pt_unlock (&esd->pt, AUDIO_FUNC);
+ }
+ return decr;
+}
+
+static int qesd_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static int qesd_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ ESDVoiceOut *esd = (ESDVoiceOut *) hw;
+ struct audsettings obt_as = *as;
+ int esdfmt = ESD_STREAM | ESD_PLAY;
+
+ esdfmt |= (as->nchannels == 2) ? ESD_STEREO : ESD_MONO;
+ switch (as->fmt) {
+ case AUD_FMT_S8:
+ case AUD_FMT_U8:
+ esdfmt |= ESD_BITS8;
+ obt_as.fmt = AUD_FMT_U8;
+ break;
+
+ case AUD_FMT_S32:
+ case AUD_FMT_U32:
+ dolog ("Will use 16 instead of 32 bit samples\n");
+
+ case AUD_FMT_S16:
+ case AUD_FMT_U16:
+ deffmt:
+ esdfmt |= ESD_BITS16;
+ obt_as.fmt = AUD_FMT_S16;
+ break;
+
+ default:
+ dolog ("Internal logic error: Bad audio format %d\n", as->fmt);
+ goto deffmt;
+
+ }
+ obt_as.endianness = AUDIO_HOST_ENDIANNESS;
+
+ audio_pcm_init_info (&hw->info, &obt_as);
+
+ hw->samples = conf.samples;
+ esd->pcm_buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
+ if (!esd->pcm_buf) {
+ dolog ("Could not allocate buffer (%d bytes)\n",
+ hw->samples << hw->info.shift);
+ return -1;
+ }
+
+ esd->fd = esd_play_stream (esdfmt, as->freq, conf.dac_host, NULL);
+ if (esd->fd < 0) {
+ qesd_logerr (errno, "esd_play_stream failed\n");
+ goto fail1;
+ }
+
+ if (audio_pt_init (&esd->pt, qesd_thread_out, esd, AUDIO_CAP, AUDIO_FUNC)) {
+ goto fail2;
+ }
+
+ return 0;
+
+ fail2:
+ if (close (esd->fd)) {
+ qesd_logerr (errno, "%s: close on esd socket(%d) failed\n",
+ AUDIO_FUNC, esd->fd);
+ }
+ esd->fd = -1;
+
+ fail1:
+ qemu_free (esd->pcm_buf);
+ esd->pcm_buf = NULL;
+ return -1;
+}
+
+static void qesd_fini_out (HWVoiceOut *hw)
+{
+ void *ret;
+ ESDVoiceOut *esd = (ESDVoiceOut *) hw;
+
+ audio_pt_lock (&esd->pt, AUDIO_FUNC);
+ esd->done = 1;
+ audio_pt_unlock_and_signal (&esd->pt, AUDIO_FUNC);
+ audio_pt_join (&esd->pt, &ret, AUDIO_FUNC);
+
+ if (esd->fd >= 0) {
+ if (close (esd->fd)) {
+ qesd_logerr (errno, "failed to close esd socket\n");
+ }
+ esd->fd = -1;
+ }
+
+ audio_pt_fini (&esd->pt, AUDIO_FUNC);
+
+ qemu_free (esd->pcm_buf);
+ esd->pcm_buf = NULL;
+}
+
+static int qesd_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ (void) hw;
+ (void) cmd;
+ return 0;
+}
+
+/* capture */
+static void *qesd_thread_in (void *arg)
+{
+ ESDVoiceIn *esd = arg;
+ HWVoiceIn *hw = &esd->hw;
+ int threshold;
+
+ threshold = conf.divisor ? hw->samples / conf.divisor : 0;
+
+ if (audio_pt_lock (&esd->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ for (;;) {
+ int incr, to_grab, wpos;
+
+ for (;;) {
+ if (esd->done) {
+ goto exit;
+ }
+
+ if (esd->dead > threshold) {
+ break;
+ }
+
+ if (audio_pt_wait (&esd->pt, AUDIO_FUNC)) {
+ goto exit;
+ }
+ }
+
+ incr = to_grab = esd->dead;
+ wpos = hw->wpos;
+
+ if (audio_pt_unlock (&esd->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ while (to_grab) {
+ ssize_t nread;
+ int chunk = audio_MIN (to_grab, hw->samples - wpos);
+ void *buf = advance (esd->pcm_buf, wpos);
+
+ again:
+ nread = read (esd->fd, buf, chunk << hw->info.shift);
+ if (nread == -1) {
+ if (errno == EINTR || errno == EAGAIN) {
+ goto again;
+ }
+ qesd_logerr (errno, "read failed\n");
+ return NULL;
+ }
+
+ if (nread != chunk << hw->info.shift) {
+ int rsamples = nread >> hw->info.shift;
+ int rbytes = rsamples << hw->info.shift;
+ if (rbytes != nread) {
+ dolog ("warning: Misaligned write %d (requested %zd), "
+ "alignment %d\n",
+ rbytes, nread, hw->info.align + 1);
+ }
+ to_grab -= rsamples;
+ wpos = (wpos + rsamples) % hw->samples;
+ break;
+ }
+
+ hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift);
+ wpos = (wpos + chunk) % hw->samples;
+ to_grab -= chunk;
+ }
+
+ if (audio_pt_lock (&esd->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ esd->wpos = wpos;
+ esd->dead -= incr;
+ esd->incr += incr;
+ }
+
+ exit:
+ audio_pt_unlock (&esd->pt, AUDIO_FUNC);
+ return NULL;
+}
+
+static int qesd_run_in (HWVoiceIn *hw)
+{
+ int live, incr, dead;
+ ESDVoiceIn *esd = (ESDVoiceIn *) hw;
+
+ if (audio_pt_lock (&esd->pt, AUDIO_FUNC)) {
+ return 0;
+ }
+
+ live = audio_pcm_hw_get_live_in (hw);
+ dead = hw->samples - live;
+ incr = audio_MIN (dead, esd->incr);
+ esd->incr -= incr;
+ esd->dead = dead - incr;
+ hw->wpos = esd->wpos;
+ if (esd->dead > 0) {
+ audio_pt_unlock_and_signal (&esd->pt, AUDIO_FUNC);
+ }
+ else {
+ audio_pt_unlock (&esd->pt, AUDIO_FUNC);
+ }
+ return incr;
+}
+
+static int qesd_read (SWVoiceIn *sw, void *buf, int len)
+{
+ return audio_pcm_sw_read (sw, buf, len);
+}
+
+static int qesd_init_in (HWVoiceIn *hw, struct audsettings *as)
+{
+ ESDVoiceIn *esd = (ESDVoiceIn *) hw;
+ struct audsettings obt_as = *as;
+ int esdfmt = ESD_STREAM | ESD_RECORD;
+
+ esdfmt |= (as->nchannels == 2) ? ESD_STEREO : ESD_MONO;
+ switch (as->fmt) {
+ case AUD_FMT_S8:
+ case AUD_FMT_U8:
+ esdfmt |= ESD_BITS8;
+ obt_as.fmt = AUD_FMT_U8;
+ break;
+
+ case AUD_FMT_S16:
+ case AUD_FMT_U16:
+ esdfmt |= ESD_BITS16;
+ obt_as.fmt = AUD_FMT_S16;
+ break;
+
+ case AUD_FMT_S32:
+ case AUD_FMT_U32:
+ dolog ("Will use 16 instead of 32 bit samples\n");
+ esdfmt |= ESD_BITS16;
+ obt_as.fmt = AUD_FMT_S16;
+ break;
+ }
+ obt_as.endianness = AUDIO_HOST_ENDIANNESS;
+
+ audio_pcm_init_info (&hw->info, &obt_as);
+
+ hw->samples = conf.samples;
+ esd->pcm_buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
+ if (!esd->pcm_buf) {
+ dolog ("Could not allocate buffer (%d bytes)\n",
+ hw->samples << hw->info.shift);
+ return -1;
+ }
+
+ esd->fd = esd_record_stream (esdfmt, as->freq, conf.adc_host, NULL);
+ if (esd->fd < 0) {
+ qesd_logerr (errno, "esd_record_stream failed\n");
+ goto fail1;
+ }
+
+ if (audio_pt_init (&esd->pt, qesd_thread_in, esd, AUDIO_CAP, AUDIO_FUNC)) {
+ goto fail2;
+ }
+
+ return 0;
+
+ fail2:
+ if (close (esd->fd)) {
+ qesd_logerr (errno, "%s: close on esd socket(%d) failed\n",
+ AUDIO_FUNC, esd->fd);
+ }
+ esd->fd = -1;
+
+ fail1:
+ qemu_free (esd->pcm_buf);
+ esd->pcm_buf = NULL;
+ return -1;
+}
+
+static void qesd_fini_in (HWVoiceIn *hw)
+{
+ void *ret;
+ ESDVoiceIn *esd = (ESDVoiceIn *) hw;
+
+ audio_pt_lock (&esd->pt, AUDIO_FUNC);
+ esd->done = 1;
+ audio_pt_unlock_and_signal (&esd->pt, AUDIO_FUNC);
+ audio_pt_join (&esd->pt, &ret, AUDIO_FUNC);
+
+ if (esd->fd >= 0) {
+ if (close (esd->fd)) {
+ qesd_logerr (errno, "failed to close esd socket\n");
+ }
+ esd->fd = -1;
+ }
+
+ audio_pt_fini (&esd->pt, AUDIO_FUNC);
+
+ qemu_free (esd->pcm_buf);
+ esd->pcm_buf = NULL;
+}
+
+static int qesd_ctl_in (HWVoiceIn *hw, int cmd, ...)
+{
+ (void) hw;
+ (void) cmd;
+ return 0;
+}
+
+/* common */
+static void *qesd_audio_init (void)
+{
+ return &conf;
+}
+
+static void qesd_audio_fini (void *opaque)
+{
+ (void) opaque;
+ ldebug ("esd_fini");
+}
+
+struct audio_option qesd_options[] = {
+ {
+ .name = "SAMPLES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.samples,
+ .descr = "buffer size in samples"
+ },
+ {
+ .name = "DIVISOR",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.divisor,
+ .descr = "threshold divisor"
+ },
+ {
+ .name = "DAC_HOST",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.dac_host,
+ .descr = "playback host"
+ },
+ {
+ .name = "ADC_HOST",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.adc_host,
+ .descr = "capture host"
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops qesd_pcm_ops = {
+ .init_out = qesd_init_out,
+ .fini_out = qesd_fini_out,
+ .run_out = qesd_run_out,
+ .write = qesd_write,
+ .ctl_out = qesd_ctl_out,
+
+ .init_in = qesd_init_in,
+ .fini_in = qesd_fini_in,
+ .run_in = qesd_run_in,
+ .read = qesd_read,
+ .ctl_in = qesd_ctl_in,
+};
+
+struct audio_driver esd_audio_driver = {
+ .name = "esd",
+ .descr = "http://en.wikipedia.org/wiki/Esound",
+ .options = qesd_options,
+ .init = qesd_audio_init,
+ .fini = qesd_audio_fini,
+ .pcm_ops = &qesd_pcm_ops,
+ .can_be_default = 0,
+ .max_voices_out = INT_MAX,
+ .max_voices_in = INT_MAX,
+ .voice_size_out = sizeof (ESDVoiceOut),
+ .voice_size_in = sizeof (ESDVoiceIn)
+};
diff --git a/qemu-0.15.x/audio/fmodaudio.c b/qemu-0.15.x/audio/fmodaudio.c
new file mode 100644
index 0000000..c34cf53
--- /dev/null
+++ b/qemu-0.15.x/audio/fmodaudio.c
@@ -0,0 +1,687 @@
+/*
+ * QEMU FMOD audio driver
+ *
+ * Copyright (c) 2004-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#include <fmod.h>
+#include <fmod_errors.h>
+#include "qemu-common.h"
+#include "audio.h"
+
+#define AUDIO_CAP "fmod"
+#include "audio_int.h"
+
+typedef struct FMODVoiceOut {
+ HWVoiceOut hw;
+ unsigned int old_pos;
+ FSOUND_SAMPLE *fmod_sample;
+ int channel;
+} FMODVoiceOut;
+
+typedef struct FMODVoiceIn {
+ HWVoiceIn hw;
+ FSOUND_SAMPLE *fmod_sample;
+} FMODVoiceIn;
+
+static struct {
+ const char *drvname;
+ int nb_samples;
+ int freq;
+ int nb_channels;
+ int bufsize;
+ int broken_adc;
+} conf = {
+ .nb_samples = 2048 * 2,
+ .freq = 44100,
+ .nb_channels = 2,
+};
+
+static void GCC_FMT_ATTR (1, 2) fmod_logerr (const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n",
+ FMOD_ErrorString (FSOUND_GetError ()));
+}
+
+static void GCC_FMT_ATTR (2, 3) fmod_logerr2 (
+ const char *typ,
+ const char *fmt,
+ ...
+ )
+{
+ va_list ap;
+
+ AUD_log (AUDIO_CAP, "Could not initialize %s\n", typ);
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n",
+ FMOD_ErrorString (FSOUND_GetError ()));
+}
+
+static int fmod_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static void fmod_clear_sample (FMODVoiceOut *fmd)
+{
+ HWVoiceOut *hw = &fmd->hw;
+ int status;
+ void *p1 = 0, *p2 = 0;
+ unsigned int len1 = 0, len2 = 0;
+
+ status = FSOUND_Sample_Lock (
+ fmd->fmod_sample,
+ 0,
+ hw->samples << hw->info.shift,
+ &p1,
+ &p2,
+ &len1,
+ &len2
+ );
+
+ if (!status) {
+ fmod_logerr ("Failed to lock sample\n");
+ return;
+ }
+
+ if ((len1 & hw->info.align) || (len2 & hw->info.align)) {
+ dolog ("Lock returned misaligned length %d, %d, alignment %d\n",
+ len1, len2, hw->info.align + 1);
+ goto fail;
+ }
+
+ if ((len1 + len2) - (hw->samples << hw->info.shift)) {
+ dolog ("Lock returned incomplete length %d, %d\n",
+ len1 + len2, hw->samples << hw->info.shift);
+ goto fail;
+ }
+
+ audio_pcm_info_clear_buf (&hw->info, p1, hw->samples);
+
+ fail:
+ status = FSOUND_Sample_Unlock (fmd->fmod_sample, p1, p2, len1, len2);
+ if (!status) {
+ fmod_logerr ("Failed to unlock sample\n");
+ }
+}
+
+static void fmod_write_sample (HWVoiceOut *hw, uint8_t *dst, int dst_len)
+{
+ int src_len1 = dst_len;
+ int src_len2 = 0;
+ int pos = hw->rpos + dst_len;
+ struct st_sample *src1 = hw->mix_buf + hw->rpos;
+ struct st_sample *src2 = NULL;
+
+ if (pos > hw->samples) {
+ src_len1 = hw->samples - hw->rpos;
+ src2 = hw->mix_buf;
+ src_len2 = dst_len - src_len1;
+ pos = src_len2;
+ }
+
+ if (src_len1) {
+ hw->clip (dst, src1, src_len1);
+ }
+
+ if (src_len2) {
+ dst = advance (dst, src_len1 << hw->info.shift);
+ hw->clip (dst, src2, src_len2);
+ }
+
+ hw->rpos = pos % hw->samples;
+}
+
+static int fmod_unlock_sample (FSOUND_SAMPLE *sample, void *p1, void *p2,
+ unsigned int blen1, unsigned int blen2)
+{
+ int status = FSOUND_Sample_Unlock (sample, p1, p2, blen1, blen2);
+ if (!status) {
+ fmod_logerr ("Failed to unlock sample\n");
+ return -1;
+ }
+ return 0;
+}
+
+static int fmod_lock_sample (
+ FSOUND_SAMPLE *sample,
+ struct audio_pcm_info *info,
+ int pos,
+ int len,
+ void **p1,
+ void **p2,
+ unsigned int *blen1,
+ unsigned int *blen2
+ )
+{
+ int status;
+
+ status = FSOUND_Sample_Lock (
+ sample,
+ pos << info->shift,
+ len << info->shift,
+ p1,
+ p2,
+ blen1,
+ blen2
+ );
+
+ if (!status) {
+ fmod_logerr ("Failed to lock sample\n");
+ return -1;
+ }
+
+ if ((*blen1 & info->align) || (*blen2 & info->align)) {
+ dolog ("Lock returned misaligned length %d, %d, alignment %d\n",
+ *blen1, *blen2, info->align + 1);
+
+ fmod_unlock_sample (sample, *p1, *p2, *blen1, *blen2);
+
+ *p1 = NULL - 1;
+ *p2 = NULL - 1;
+ *blen1 = ~0U;
+ *blen2 = ~0U;
+ return -1;
+ }
+
+ if (!*p1 && *blen1) {
+ dolog ("warning: !p1 && blen1=%d\n", *blen1);
+ *blen1 = 0;
+ }
+
+ if (!p2 && *blen2) {
+ dolog ("warning: !p2 && blen2=%d\n", *blen2);
+ *blen2 = 0;
+ }
+
+ return 0;
+}
+
+static int fmod_run_out (HWVoiceOut *hw, int live)
+{
+ FMODVoiceOut *fmd = (FMODVoiceOut *) hw;
+ int decr;
+ void *p1 = 0, *p2 = 0;
+ unsigned int blen1 = 0, blen2 = 0;
+ unsigned int len1 = 0, len2 = 0;
+
+ if (!hw->pending_disable) {
+ return 0;
+ }
+
+ decr = live;
+
+ if (fmd->channel >= 0) {
+ int len = decr;
+ int old_pos = fmd->old_pos;
+ int ppos = FSOUND_GetCurrentPosition (fmd->channel);
+
+ if (ppos == old_pos || !ppos) {
+ return 0;
+ }
+
+ if ((old_pos < ppos) && ((old_pos + len) > ppos)) {
+ len = ppos - old_pos;
+ }
+ else {
+ if ((old_pos > ppos) && ((old_pos + len) > (ppos + hw->samples))) {
+ len = hw->samples - old_pos + ppos;
+ }
+ }
+ decr = len;
+
+ if (audio_bug (AUDIO_FUNC, decr < 0)) {
+ dolog ("decr=%d live=%d ppos=%d old_pos=%d len=%d\n",
+ decr, live, ppos, old_pos, len);
+ return 0;
+ }
+ }
+
+
+ if (!decr) {
+ return 0;
+ }
+
+ if (fmod_lock_sample (fmd->fmod_sample, &fmd->hw.info,
+ fmd->old_pos, decr,
+ &p1, &p2,
+ &blen1, &blen2)) {
+ return 0;
+ }
+
+ len1 = blen1 >> hw->info.shift;
+ len2 = blen2 >> hw->info.shift;
+ ldebug ("%p %p %d %d %d %d\n", p1, p2, len1, len2, blen1, blen2);
+ decr = len1 + len2;
+
+ if (p1 && len1) {
+ fmod_write_sample (hw, p1, len1);
+ }
+
+ if (p2 && len2) {
+ fmod_write_sample (hw, p2, len2);
+ }
+
+ fmod_unlock_sample (fmd->fmod_sample, p1, p2, blen1, blen2);
+
+ fmd->old_pos = (fmd->old_pos + decr) % hw->samples;
+ return decr;
+}
+
+static int aud_to_fmodfmt (audfmt_e fmt, int stereo)
+{
+ int mode = FSOUND_LOOP_NORMAL;
+
+ switch (fmt) {
+ case AUD_FMT_S8:
+ mode |= FSOUND_SIGNED | FSOUND_8BITS;
+ break;
+
+ case AUD_FMT_U8:
+ mode |= FSOUND_UNSIGNED | FSOUND_8BITS;
+ break;
+
+ case AUD_FMT_S16:
+ mode |= FSOUND_SIGNED | FSOUND_16BITS;
+ break;
+
+ case AUD_FMT_U16:
+ mode |= FSOUND_UNSIGNED | FSOUND_16BITS;
+ break;
+
+ default:
+ dolog ("Internal logic error: Bad audio format %d\n", fmt);
+#ifdef DEBUG_FMOD
+ abort ();
+#endif
+ mode |= FSOUND_8BITS;
+ }
+ mode |= stereo ? FSOUND_STEREO : FSOUND_MONO;
+ return mode;
+}
+
+static void fmod_fini_out (HWVoiceOut *hw)
+{
+ FMODVoiceOut *fmd = (FMODVoiceOut *) hw;
+
+ if (fmd->fmod_sample) {
+ FSOUND_Sample_Free (fmd->fmod_sample);
+ fmd->fmod_sample = 0;
+
+ if (fmd->channel >= 0) {
+ FSOUND_StopSound (fmd->channel);
+ }
+ }
+}
+
+static int fmod_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ int bits16, mode, channel;
+ FMODVoiceOut *fmd = (FMODVoiceOut *) hw;
+ struct audsettings obt_as = *as;
+
+ mode = aud_to_fmodfmt (as->fmt, as->nchannels == 2 ? 1 : 0);
+ fmd->fmod_sample = FSOUND_Sample_Alloc (
+ FSOUND_FREE, /* index */
+ conf.nb_samples, /* length */
+ mode, /* mode */
+ as->freq, /* freq */
+ 255, /* volume */
+ 128, /* pan */
+ 255 /* priority */
+ );
+
+ if (!fmd->fmod_sample) {
+ fmod_logerr2 ("DAC", "Failed to allocate FMOD sample\n");
+ return -1;
+ }
+
+ channel = FSOUND_PlaySoundEx (FSOUND_FREE, fmd->fmod_sample, 0, 1);
+ if (channel < 0) {
+ fmod_logerr2 ("DAC", "Failed to start playing sound\n");
+ FSOUND_Sample_Free (fmd->fmod_sample);
+ return -1;
+ }
+ fmd->channel = channel;
+
+ /* FMOD always operates on little endian frames? */
+ obt_as.endianness = 0;
+ audio_pcm_init_info (&hw->info, &obt_as);
+ bits16 = (mode & FSOUND_16BITS) != 0;
+ hw->samples = conf.nb_samples;
+ return 0;
+}
+
+static int fmod_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ int status;
+ FMODVoiceOut *fmd = (FMODVoiceOut *) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ fmod_clear_sample (fmd);
+ status = FSOUND_SetPaused (fmd->channel, 0);
+ if (!status) {
+ fmod_logerr ("Failed to resume channel %d\n", fmd->channel);
+ }
+ break;
+
+ case VOICE_DISABLE:
+ status = FSOUND_SetPaused (fmd->channel, 1);
+ if (!status) {
+ fmod_logerr ("Failed to pause channel %d\n", fmd->channel);
+ }
+ break;
+ }
+ return 0;
+}
+
+static int fmod_init_in (HWVoiceIn *hw, struct audsettings *as)
+{
+ int bits16, mode;
+ FMODVoiceIn *fmd = (FMODVoiceIn *) hw;
+ struct audsettings obt_as = *as;
+
+ if (conf.broken_adc) {
+ return -1;
+ }
+
+ mode = aud_to_fmodfmt (as->fmt, as->nchannels == 2 ? 1 : 0);
+ fmd->fmod_sample = FSOUND_Sample_Alloc (
+ FSOUND_FREE, /* index */
+ conf.nb_samples, /* length */
+ mode, /* mode */
+ as->freq, /* freq */
+ 255, /* volume */
+ 128, /* pan */
+ 255 /* priority */
+ );
+
+ if (!fmd->fmod_sample) {
+ fmod_logerr2 ("ADC", "Failed to allocate FMOD sample\n");
+ return -1;
+ }
+
+ /* FMOD always operates on little endian frames? */
+ obt_as.endianness = 0;
+ audio_pcm_init_info (&hw->info, &obt_as);
+ bits16 = (mode & FSOUND_16BITS) != 0;
+ hw->samples = conf.nb_samples;
+ return 0;
+}
+
+static void fmod_fini_in (HWVoiceIn *hw)
+{
+ FMODVoiceIn *fmd = (FMODVoiceIn *) hw;
+
+ if (fmd->fmod_sample) {
+ FSOUND_Record_Stop ();
+ FSOUND_Sample_Free (fmd->fmod_sample);
+ fmd->fmod_sample = 0;
+ }
+}
+
+static int fmod_run_in (HWVoiceIn *hw)
+{
+ FMODVoiceIn *fmd = (FMODVoiceIn *) hw;
+ int hwshift = hw->info.shift;
+ int live, dead, new_pos, len;
+ unsigned int blen1 = 0, blen2 = 0;
+ unsigned int len1, len2;
+ unsigned int decr;
+ void *p1, *p2;
+
+ live = audio_pcm_hw_get_live_in (hw);
+ dead = hw->samples - live;
+ if (!dead) {
+ return 0;
+ }
+
+ new_pos = FSOUND_Record_GetPosition ();
+ if (new_pos < 0) {
+ fmod_logerr ("Could not get recording position\n");
+ return 0;
+ }
+
+ len = audio_ring_dist (new_pos, hw->wpos, hw->samples);
+ if (!len) {
+ return 0;
+ }
+ len = audio_MIN (len, dead);
+
+ if (fmod_lock_sample (fmd->fmod_sample, &fmd->hw.info,
+ hw->wpos, len,
+ &p1, &p2,
+ &blen1, &blen2)) {
+ return 0;
+ }
+
+ len1 = blen1 >> hwshift;
+ len2 = blen2 >> hwshift;
+ decr = len1 + len2;
+
+ if (p1 && blen1) {
+ hw->conv (hw->conv_buf + hw->wpos, p1, len1);
+ }
+ if (p2 && len2) {
+ hw->conv (hw->conv_buf, p2, len2);
+ }
+
+ fmod_unlock_sample (fmd->fmod_sample, p1, p2, blen1, blen2);
+ hw->wpos = (hw->wpos + decr) % hw->samples;
+ return decr;
+}
+
+static struct {
+ const char *name;
+ int type;
+} drvtab[] = {
+ { .name = "none", .type = FSOUND_OUTPUT_NOSOUND },
+#ifdef _WIN32
+ { .name = "winmm", .type = FSOUND_OUTPUT_WINMM },
+ { .name = "dsound", .type = FSOUND_OUTPUT_DSOUND },
+ { .name = "a3d", .type = FSOUND_OUTPUT_A3D },
+ { .name = "asio", .type = FSOUND_OUTPUT_ASIO },
+#endif
+#ifdef __linux__
+ { .name = "oss", .type = FSOUND_OUTPUT_OSS },
+ { .name = "alsa", .type = FSOUND_OUTPUT_ALSA },
+ { .name = "esd", .type = FSOUND_OUTPUT_ESD },
+#endif
+#ifdef __APPLE__
+ { .name = "mac", .type = FSOUND_OUTPUT_MAC },
+#endif
+#if 0
+ { .name = "xbox", .type = FSOUND_OUTPUT_XBOX },
+ { .name = "ps2", .type = FSOUND_OUTPUT_PS2 },
+ { .name = "gcube", .type = FSOUND_OUTPUT_GC },
+#endif
+ { .name = "none-realtime", .type = FSOUND_OUTPUT_NOSOUND_NONREALTIME }
+};
+
+static void *fmod_audio_init (void)
+{
+ size_t i;
+ double ver;
+ int status;
+ int output_type = -1;
+ const char *drv = conf.drvname;
+
+ ver = FSOUND_GetVersion ();
+ if (ver < FMOD_VERSION) {
+ dolog ("Wrong FMOD version %f, need at least %f\n", ver, FMOD_VERSION);
+ return NULL;
+ }
+
+#ifdef __linux__
+ if (ver < 3.75) {
+ dolog ("FMOD before 3.75 has bug preventing ADC from working\n"
+ "ADC will be disabled.\n");
+ conf.broken_adc = 1;
+ }
+#endif
+
+ if (drv) {
+ int found = 0;
+ for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
+ if (!strcmp (drv, drvtab[i].name)) {
+ output_type = drvtab[i].type;
+ found = 1;
+ break;
+ }
+ }
+ if (!found) {
+ dolog ("Unknown FMOD driver `%s'\n", drv);
+ dolog ("Valid drivers:\n");
+ for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
+ dolog (" %s\n", drvtab[i].name);
+ }
+ }
+ }
+
+ if (output_type != -1) {
+ status = FSOUND_SetOutput (output_type);
+ if (!status) {
+ fmod_logerr ("FSOUND_SetOutput(%d) failed\n", output_type);
+ return NULL;
+ }
+ }
+
+ if (conf.bufsize) {
+ status = FSOUND_SetBufferSize (conf.bufsize);
+ if (!status) {
+ fmod_logerr ("FSOUND_SetBufferSize (%d) failed\n", conf.bufsize);
+ }
+ }
+
+ status = FSOUND_Init (conf.freq, conf.nb_channels, 0);
+ if (!status) {
+ fmod_logerr ("FSOUND_Init failed\n");
+ return NULL;
+ }
+
+ return &conf;
+}
+
+static int fmod_read (SWVoiceIn *sw, void *buf, int size)
+{
+ return audio_pcm_sw_read (sw, buf, size);
+}
+
+static int fmod_ctl_in (HWVoiceIn *hw, int cmd, ...)
+{
+ int status;
+ FMODVoiceIn *fmd = (FMODVoiceIn *) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ status = FSOUND_Record_StartSample (fmd->fmod_sample, 1);
+ if (!status) {
+ fmod_logerr ("Failed to start recording\n");
+ }
+ break;
+
+ case VOICE_DISABLE:
+ status = FSOUND_Record_Stop ();
+ if (!status) {
+ fmod_logerr ("Failed to stop recording\n");
+ }
+ break;
+ }
+ return 0;
+}
+
+static void fmod_audio_fini (void *opaque)
+{
+ (void) opaque;
+ FSOUND_Close ();
+}
+
+static struct audio_option fmod_options[] = {
+ {
+ .name = "DRV",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.drvname,
+ .descr = "FMOD driver"
+ },
+ {
+ .name = "FREQ",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.freq,
+ .descr = "Default frequency"
+ },
+ {
+ .name = "SAMPLES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.nb_samples,
+ .descr = "Buffer size in samples"
+ },
+ {
+ .name = "CHANNELS",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.nb_channels,
+ .descr = "Number of default channels (1 - mono, 2 - stereo)"
+ },
+ {
+ .name = "BUFSIZE",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.bufsize,
+ .descr = "(undocumented)"
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops fmod_pcm_ops = {
+ .init_out = fmod_init_out,
+ .fini_out = fmod_fini_out,
+ .run_out = fmod_run_out,
+ .write = fmod_write,
+ .ctl_out = fmod_ctl_out,
+
+ .init_in = fmod_init_in,
+ .fini_in = fmod_fini_in,
+ .run_in = fmod_run_in,
+ .read = fmod_read,
+ .ctl_in = fmod_ctl_in
+};
+
+struct audio_driver fmod_audio_driver = {
+ .name = "fmod",
+ .descr = "FMOD 3.xx http://www.fmod.org",
+ .options = fmod_options,
+ .init = fmod_audio_init,
+ .fini = fmod_audio_fini,
+ .pcm_ops = &fmod_pcm_ops,
+ .can_be_default = 1,
+ .max_voices_out = INT_MAX,
+ .max_voices_in = INT_MAX,
+ .voice_size_out = sizeof (FMODVoiceOut),
+ .voice_size_in = sizeof (FMODVoiceIn)
+};
diff --git a/qemu-0.15.x/audio/mixeng.c b/qemu-0.15.x/audio/mixeng.c
new file mode 100644
index 0000000..4a9e8eb
--- /dev/null
+++ b/qemu-0.15.x/audio/mixeng.c
@@ -0,0 +1,360 @@
+/*
+ * QEMU Mixing engine
+ *
+ * Copyright (c) 2004-2005 Vassili Karpov (malc)
+ * Copyright (c) 1998 Fabrice Bellard
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "audio.h"
+
+#define AUDIO_CAP "mixeng"
+#include "audio_int.h"
+
+/* 8 bit */
+#define ENDIAN_CONVERSION natural
+#define ENDIAN_CONVERT(v) (v)
+
+/* Signed 8 bit */
+#define IN_T int8_t
+#define IN_MIN SCHAR_MIN
+#define IN_MAX SCHAR_MAX
+#define SIGNED
+#define SHIFT 8
+#include "mixeng_template.h"
+#undef SIGNED
+#undef IN_MAX
+#undef IN_MIN
+#undef IN_T
+#undef SHIFT
+
+/* Unsigned 8 bit */
+#define IN_T uint8_t
+#define IN_MIN 0
+#define IN_MAX UCHAR_MAX
+#define SHIFT 8
+#include "mixeng_template.h"
+#undef IN_MAX
+#undef IN_MIN
+#undef IN_T
+#undef SHIFT
+
+#undef ENDIAN_CONVERT
+#undef ENDIAN_CONVERSION
+
+/* Signed 16 bit */
+#define IN_T int16_t
+#define IN_MIN SHRT_MIN
+#define IN_MAX SHRT_MAX
+#define SIGNED
+#define SHIFT 16
+#define ENDIAN_CONVERSION natural
+#define ENDIAN_CONVERT(v) (v)
+#include "mixeng_template.h"
+#undef ENDIAN_CONVERT
+#undef ENDIAN_CONVERSION
+#define ENDIAN_CONVERSION swap
+#define ENDIAN_CONVERT(v) bswap16 (v)
+#include "mixeng_template.h"
+#undef ENDIAN_CONVERT
+#undef ENDIAN_CONVERSION
+#undef SIGNED
+#undef IN_MAX
+#undef IN_MIN
+#undef IN_T
+#undef SHIFT
+
+/* Unsigned 16 bit */
+#define IN_T uint16_t
+#define IN_MIN 0
+#define IN_MAX USHRT_MAX
+#define SHIFT 16
+#define ENDIAN_CONVERSION natural
+#define ENDIAN_CONVERT(v) (v)
+#include "mixeng_template.h"
+#undef ENDIAN_CONVERT
+#undef ENDIAN_CONVERSION
+#define ENDIAN_CONVERSION swap
+#define ENDIAN_CONVERT(v) bswap16 (v)
+#include "mixeng_template.h"
+#undef ENDIAN_CONVERT
+#undef ENDIAN_CONVERSION
+#undef IN_MAX
+#undef IN_MIN
+#undef IN_T
+#undef SHIFT
+
+/* Signed 32 bit */
+#define IN_T int32_t
+#define IN_MIN INT32_MIN
+#define IN_MAX INT32_MAX
+#define SIGNED
+#define SHIFT 32
+#define ENDIAN_CONVERSION natural
+#define ENDIAN_CONVERT(v) (v)
+#include "mixeng_template.h"
+#undef ENDIAN_CONVERT
+#undef ENDIAN_CONVERSION
+#define ENDIAN_CONVERSION swap
+#define ENDIAN_CONVERT(v) bswap32 (v)
+#include "mixeng_template.h"
+#undef ENDIAN_CONVERT
+#undef ENDIAN_CONVERSION
+#undef SIGNED
+#undef IN_MAX
+#undef IN_MIN
+#undef IN_T
+#undef SHIFT
+
+/* Unsigned 32 bit */
+#define IN_T uint32_t
+#define IN_MIN 0
+#define IN_MAX UINT32_MAX
+#define SHIFT 32
+#define ENDIAN_CONVERSION natural
+#define ENDIAN_CONVERT(v) (v)
+#include "mixeng_template.h"
+#undef ENDIAN_CONVERT
+#undef ENDIAN_CONVERSION
+#define ENDIAN_CONVERSION swap
+#define ENDIAN_CONVERT(v) bswap32 (v)
+#include "mixeng_template.h"
+#undef ENDIAN_CONVERT
+#undef ENDIAN_CONVERSION
+#undef IN_MAX
+#undef IN_MIN
+#undef IN_T
+#undef SHIFT
+
+t_sample *mixeng_conv[2][2][2][3] = {
+ {
+ {
+ {
+ conv_natural_uint8_t_to_mono,
+ conv_natural_uint16_t_to_mono,
+ conv_natural_uint32_t_to_mono
+ },
+ {
+ conv_natural_uint8_t_to_mono,
+ conv_swap_uint16_t_to_mono,
+ conv_swap_uint32_t_to_mono,
+ }
+ },
+ {
+ {
+ conv_natural_int8_t_to_mono,
+ conv_natural_int16_t_to_mono,
+ conv_natural_int32_t_to_mono
+ },
+ {
+ conv_natural_int8_t_to_mono,
+ conv_swap_int16_t_to_mono,
+ conv_swap_int32_t_to_mono
+ }
+ }
+ },
+ {
+ {
+ {
+ conv_natural_uint8_t_to_stereo,
+ conv_natural_uint16_t_to_stereo,
+ conv_natural_uint32_t_to_stereo
+ },
+ {
+ conv_natural_uint8_t_to_stereo,
+ conv_swap_uint16_t_to_stereo,
+ conv_swap_uint32_t_to_stereo
+ }
+ },
+ {
+ {
+ conv_natural_int8_t_to_stereo,
+ conv_natural_int16_t_to_stereo,
+ conv_natural_int32_t_to_stereo
+ },
+ {
+ conv_natural_int8_t_to_stereo,
+ conv_swap_int16_t_to_stereo,
+ conv_swap_int32_t_to_stereo,
+ }
+ }
+ }
+};
+
+f_sample *mixeng_clip[2][2][2][3] = {
+ {
+ {
+ {
+ clip_natural_uint8_t_from_mono,
+ clip_natural_uint16_t_from_mono,
+ clip_natural_uint32_t_from_mono
+ },
+ {
+ clip_natural_uint8_t_from_mono,
+ clip_swap_uint16_t_from_mono,
+ clip_swap_uint32_t_from_mono
+ }
+ },
+ {
+ {
+ clip_natural_int8_t_from_mono,
+ clip_natural_int16_t_from_mono,
+ clip_natural_int32_t_from_mono
+ },
+ {
+ clip_natural_int8_t_from_mono,
+ clip_swap_int16_t_from_mono,
+ clip_swap_int32_t_from_mono
+ }
+ }
+ },
+ {
+ {
+ {
+ clip_natural_uint8_t_from_stereo,
+ clip_natural_uint16_t_from_stereo,
+ clip_natural_uint32_t_from_stereo
+ },
+ {
+ clip_natural_uint8_t_from_stereo,
+ clip_swap_uint16_t_from_stereo,
+ clip_swap_uint32_t_from_stereo
+ }
+ },
+ {
+ {
+ clip_natural_int8_t_from_stereo,
+ clip_natural_int16_t_from_stereo,
+ clip_natural_int32_t_from_stereo
+ },
+ {
+ clip_natural_int8_t_from_stereo,
+ clip_swap_int16_t_from_stereo,
+ clip_swap_int32_t_from_stereo
+ }
+ }
+ }
+};
+
+/*
+ * August 21, 1998
+ * Copyright 1998 Fabrice Bellard.
+ *
+ * [Rewrote completly the code of Lance Norskog And Sundry
+ * Contributors with a more efficient algorithm.]
+ *
+ * This source code is freely redistributable and may be used for
+ * any purpose. This copyright notice must be maintained.
+ * Lance Norskog And Sundry Contributors are not responsible for
+ * the consequences of using this software.
+ */
+
+/*
+ * Sound Tools rate change effect file.
+ */
+/*
+ * Linear Interpolation.
+ *
+ * The use of fractional increment allows us to use no buffer. It
+ * avoid the problems at the end of the buffer we had with the old
+ * method which stored a possibly big buffer of size
+ * lcm(in_rate,out_rate).
+ *
+ * Limited to 16 bit samples and sampling frequency <= 65535 Hz. If
+ * the input & output frequencies are equal, a delay of one sample is
+ * introduced. Limited to processing 32-bit count worth of samples.
+ *
+ * 1 << FRAC_BITS evaluating to zero in several places. Changed with
+ * an (unsigned long) cast to make it safe. MarkMLl 2/1/99
+ */
+
+/* Private data */
+struct rate {
+ uint64_t opos;
+ uint64_t opos_inc;
+ uint32_t ipos; /* position in the input stream (integer) */
+ struct st_sample ilast; /* last sample in the input stream */
+};
+
+/*
+ * Prepare processing.
+ */
+void *st_rate_start (int inrate, int outrate)
+{
+ struct rate *rate = audio_calloc (AUDIO_FUNC, 1, sizeof (*rate));
+
+ if (!rate) {
+ dolog ("Could not allocate resampler (%zu bytes)\n", sizeof (*rate));
+ return NULL;
+ }
+
+ rate->opos = 0;
+
+ /* increment */
+ rate->opos_inc = ((uint64_t) inrate << 32) / outrate;
+
+ rate->ipos = 0;
+ rate->ilast.l = 0;
+ rate->ilast.r = 0;
+ return rate;
+}
+
+#define NAME st_rate_flow_mix
+#define OP(a, b) a += b
+#include "rate_template.h"
+
+#define NAME st_rate_flow
+#define OP(a, b) a = b
+#include "rate_template.h"
+
+void st_rate_stop (void *opaque)
+{
+ qemu_free (opaque);
+}
+
+void mixeng_clear (struct st_sample *buf, int len)
+{
+ memset (buf, 0, len * sizeof (struct st_sample));
+}
+
+void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol)
+{
+#ifdef CONFIG_MIXEMU
+ if (vol->mute) {
+ mixeng_clear (buf, len);
+ return;
+ }
+
+ while (len--) {
+#ifdef FLOAT_MIXENG
+ buf->l = buf->l * vol->l;
+ buf->r = buf->r * vol->r;
+#else
+ buf->l = (buf->l * vol->l) >> 32;
+ buf->r = (buf->r * vol->r) >> 32;
+#endif
+ buf += 1;
+ }
+#else
+ (void) buf;
+ (void) len;
+ (void) vol;
+#endif
+}
diff --git a/qemu-0.15.x/audio/mixeng.h b/qemu-0.15.x/audio/mixeng.h
new file mode 100644
index 0000000..9de443b
--- /dev/null
+++ b/qemu-0.15.x/audio/mixeng.h
@@ -0,0 +1,51 @@
+/*
+ * QEMU Mixing engine header
+ *
+ * Copyright (c) 2004-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#ifndef QEMU_MIXENG_H
+#define QEMU_MIXENG_H
+
+#ifdef FLOAT_MIXENG
+typedef float mixeng_real;
+struct mixeng_volume { int mute; mixeng_real r; mixeng_real l; };
+struct st_sample { mixeng_real l; mixeng_real r; };
+#else
+struct mixeng_volume { int mute; int64_t r; int64_t l; };
+struct st_sample { int64_t l; int64_t r; };
+#endif
+
+typedef void (t_sample) (struct st_sample *dst, const void *src, int samples);
+typedef void (f_sample) (void *dst, const struct st_sample *src, int samples);
+
+extern t_sample *mixeng_conv[2][2][2][3];
+extern f_sample *mixeng_clip[2][2][2][3];
+
+void *st_rate_start (int inrate, int outrate);
+void st_rate_flow (void *opaque, struct st_sample *ibuf, struct st_sample *obuf,
+ int *isamp, int *osamp);
+void st_rate_flow_mix (void *opaque, struct st_sample *ibuf, struct st_sample *obuf,
+ int *isamp, int *osamp);
+void st_rate_stop (void *opaque);
+void mixeng_clear (struct st_sample *buf, int len);
+void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol);
+
+#endif /* mixeng.h */
diff --git a/qemu-0.15.x/audio/mixeng_template.h b/qemu-0.15.x/audio/mixeng_template.h
new file mode 100644
index 0000000..e644c23
--- /dev/null
+++ b/qemu-0.15.x/audio/mixeng_template.h
@@ -0,0 +1,152 @@
+/*
+ * QEMU Mixing engine
+ *
+ * Copyright (c) 2004-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+
+/*
+ * Tusen tack till Mike Nordell
+ * dec++'ified by Dscho
+ */
+
+#ifndef SIGNED
+#define HALF (IN_MAX >> 1)
+#endif
+
+#define ET glue (ENDIAN_CONVERSION, glue (_, IN_T))
+
+#ifdef FLOAT_MIXENG
+static mixeng_real inline glue (conv_, ET) (IN_T v)
+{
+ IN_T nv = ENDIAN_CONVERT (v);
+
+#ifdef RECIPROCAL
+#ifdef SIGNED
+ return nv * (1.f / (mixeng_real) (IN_MAX - IN_MIN));
+#else
+ return (nv - HALF) * (1.f / (mixeng_real) IN_MAX);
+#endif
+#else /* !RECIPROCAL */
+#ifdef SIGNED
+ return nv / (mixeng_real) ((mixeng_real) IN_MAX - IN_MIN);
+#else
+ return (nv - HALF) / (mixeng_real) IN_MAX;
+#endif
+#endif
+}
+
+static IN_T inline glue (clip_, ET) (mixeng_real v)
+{
+ if (v >= 0.5) {
+ return IN_MAX;
+ }
+ else if (v < -0.5) {
+ return IN_MIN;
+ }
+
+#ifdef SIGNED
+ return ENDIAN_CONVERT ((IN_T) (v * ((mixeng_real) IN_MAX - IN_MIN)));
+#else
+ return ENDIAN_CONVERT ((IN_T) ((v * IN_MAX) + HALF));
+#endif
+}
+
+#else /* !FLOAT_MIXENG */
+
+static inline int64_t glue (conv_, ET) (IN_T v)
+{
+ IN_T nv = ENDIAN_CONVERT (v);
+#ifdef SIGNED
+ return ((int64_t) nv) << (32 - SHIFT);
+#else
+ return ((int64_t) nv - HALF) << (32 - SHIFT);
+#endif
+}
+
+static inline IN_T glue (clip_, ET) (int64_t v)
+{
+ if (v >= 0x7f000000) {
+ return IN_MAX;
+ }
+ else if (v < -2147483648LL) {
+ return IN_MIN;
+ }
+
+#ifdef SIGNED
+ return ENDIAN_CONVERT ((IN_T) (v >> (32 - SHIFT)));
+#else
+ return ENDIAN_CONVERT ((IN_T) ((v >> (32 - SHIFT)) + HALF));
+#endif
+}
+#endif
+
+static void glue (glue (conv_, ET), _to_stereo)
+ (struct st_sample *dst, const void *src, int samples)
+{
+ struct st_sample *out = dst;
+ IN_T *in = (IN_T *) src;
+
+ while (samples--) {
+ out->l = glue (conv_, ET) (*in++);
+ out->r = glue (conv_, ET) (*in++);
+ out += 1;
+ }
+}
+
+static void glue (glue (conv_, ET), _to_mono)
+ (struct st_sample *dst, const void *src, int samples)
+{
+ struct st_sample *out = dst;
+ IN_T *in = (IN_T *) src;
+
+ while (samples--) {
+ out->l = glue (conv_, ET) (in[0]);
+ out->r = out->l;
+ out += 1;
+ in += 1;
+ }
+}
+
+static void glue (glue (clip_, ET), _from_stereo)
+ (void *dst, const struct st_sample *src, int samples)
+{
+ const struct st_sample *in = src;
+ IN_T *out = (IN_T *) dst;
+ while (samples--) {
+ *out++ = glue (clip_, ET) (in->l);
+ *out++ = glue (clip_, ET) (in->r);
+ in += 1;
+ }
+}
+
+static void glue (glue (clip_, ET), _from_mono)
+ (void *dst, const struct st_sample *src, int samples)
+{
+ const struct st_sample *in = src;
+ IN_T *out = (IN_T *) dst;
+ while (samples--) {
+ *out++ = glue (clip_, ET) (in->l + in->r);
+ in += 1;
+ }
+}
+
+#undef ET
+#undef HALF
diff --git a/qemu-0.15.x/audio/noaudio.c b/qemu-0.15.x/audio/noaudio.c
new file mode 100644
index 0000000..54958f8
--- /dev/null
+++ b/qemu-0.15.x/audio/noaudio.c
@@ -0,0 +1,173 @@
+/*
+ * QEMU Timer based audio emulation
+ *
+ * Copyright (c) 2004-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "audio.h"
+#include "qemu-timer.h"
+
+#define AUDIO_CAP "noaudio"
+#include "audio_int.h"
+
+typedef struct NoVoiceOut {
+ HWVoiceOut hw;
+ int64_t old_ticks;
+} NoVoiceOut;
+
+typedef struct NoVoiceIn {
+ HWVoiceIn hw;
+ int64_t old_ticks;
+} NoVoiceIn;
+
+static int no_run_out (HWVoiceOut *hw, int live)
+{
+ NoVoiceOut *no = (NoVoiceOut *) hw;
+ int decr, samples;
+ int64_t now;
+ int64_t ticks;
+ int64_t bytes;
+
+ now = qemu_get_clock_ns (vm_clock);
+ ticks = now - no->old_ticks;
+ bytes = muldiv64 (ticks, hw->info.bytes_per_second, get_ticks_per_sec ());
+ bytes = audio_MIN (bytes, INT_MAX);
+ samples = bytes >> hw->info.shift;
+
+ no->old_ticks = now;
+ decr = audio_MIN (live, samples);
+ hw->rpos = (hw->rpos + decr) % hw->samples;
+ return decr;
+}
+
+static int no_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static int no_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ audio_pcm_init_info (&hw->info, as);
+ hw->samples = 1024;
+ return 0;
+}
+
+static void no_fini_out (HWVoiceOut *hw)
+{
+ (void) hw;
+}
+
+static int no_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ (void) hw;
+ (void) cmd;
+ return 0;
+}
+
+static int no_init_in (HWVoiceIn *hw, struct audsettings *as)
+{
+ audio_pcm_init_info (&hw->info, as);
+ hw->samples = 1024;
+ return 0;
+}
+
+static void no_fini_in (HWVoiceIn *hw)
+{
+ (void) hw;
+}
+
+static int no_run_in (HWVoiceIn *hw)
+{
+ NoVoiceIn *no = (NoVoiceIn *) hw;
+ int live = audio_pcm_hw_get_live_in (hw);
+ int dead = hw->samples - live;
+ int samples = 0;
+
+ if (dead) {
+ int64_t now = qemu_get_clock_ns (vm_clock);
+ int64_t ticks = now - no->old_ticks;
+ int64_t bytes =
+ muldiv64 (ticks, hw->info.bytes_per_second, get_ticks_per_sec ());
+
+ no->old_ticks = now;
+ bytes = audio_MIN (bytes, INT_MAX);
+ samples = bytes >> hw->info.shift;
+ samples = audio_MIN (samples, dead);
+ }
+ return samples;
+}
+
+static int no_read (SWVoiceIn *sw, void *buf, int size)
+{
+ /* use custom code here instead of audio_pcm_sw_read() to avoid
+ * useless resampling/mixing */
+ int samples = size >> sw->info.shift;
+ int total = sw->hw->total_samples_captured - sw->total_hw_samples_acquired;
+ int to_clear = audio_MIN (samples, total);
+ sw->total_hw_samples_acquired += total;
+ audio_pcm_info_clear_buf (&sw->info, buf, to_clear);
+ return to_clear << sw->info.shift;
+}
+
+static int no_ctl_in (HWVoiceIn *hw, int cmd, ...)
+{
+ (void) hw;
+ (void) cmd;
+ return 0;
+}
+
+static void *no_audio_init (void)
+{
+ return &no_audio_init;
+}
+
+static void no_audio_fini (void *opaque)
+{
+ (void) opaque;
+}
+
+static struct audio_pcm_ops no_pcm_ops = {
+ .init_out = no_init_out,
+ .fini_out = no_fini_out,
+ .run_out = no_run_out,
+ .write = no_write,
+ .ctl_out = no_ctl_out,
+
+ .init_in = no_init_in,
+ .fini_in = no_fini_in,
+ .run_in = no_run_in,
+ .read = no_read,
+ .ctl_in = no_ctl_in
+};
+
+struct audio_driver no_audio_driver = {
+ .name = "none",
+ .descr = "Timer based audio emulation",
+ .options = NULL,
+ .init = no_audio_init,
+ .fini = no_audio_fini,
+ .pcm_ops = &no_pcm_ops,
+ .can_be_default = 1,
+ .max_voices_out = INT_MAX,
+ .max_voices_in = INT_MAX,
+ .voice_size_out = sizeof (NoVoiceOut),
+ .voice_size_in = sizeof (NoVoiceIn)
+};
diff --git a/qemu-0.15.x/audio/ossaudio.c b/qemu-0.15.x/audio/ossaudio.c
new file mode 100644
index 0000000..b49e102
--- /dev/null
+++ b/qemu-0.15.x/audio/ossaudio.c
@@ -0,0 +1,944 @@
+/*
+ * QEMU OSS audio driver
+ *
+ * Copyright (c) 2003-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#ifdef __OpenBSD__
+#include <soundcard.h>
+#else
+#include <sys/soundcard.h>
+#endif
+#include "qemu-common.h"
+#include "host-utils.h"
+#include "qemu-char.h"
+#include "audio.h"
+
+#define AUDIO_CAP "oss"
+#include "audio_int.h"
+
+#if defined OSS_GETVERSION && defined SNDCTL_DSP_POLICY
+#define USE_DSP_POLICY
+#endif
+
+typedef struct OSSVoiceOut {
+ HWVoiceOut hw;
+ void *pcm_buf;
+ int fd;
+ int wpos;
+ int nfrags;
+ int fragsize;
+ int mmapped;
+ int pending;
+} OSSVoiceOut;
+
+typedef struct OSSVoiceIn {
+ HWVoiceIn hw;
+ void *pcm_buf;
+ int fd;
+ int nfrags;
+ int fragsize;
+} OSSVoiceIn;
+
+static struct {
+ int try_mmap;
+ int nfrags;
+ int fragsize;
+ const char *devpath_out;
+ const char *devpath_in;
+ int debug;
+ int exclusive;
+ int policy;
+} conf = {
+ .try_mmap = 0,
+ .nfrags = 4,
+ .fragsize = 4096,
+ .devpath_out = "/dev/dsp",
+ .devpath_in = "/dev/dsp",
+ .debug = 0,
+ .exclusive = 0,
+ .policy = 5
+};
+
+struct oss_params {
+ int freq;
+ audfmt_e fmt;
+ int nchannels;
+ int nfrags;
+ int fragsize;
+};
+
+static void GCC_FMT_ATTR (2, 3) oss_logerr (int err, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n", strerror (err));
+}
+
+static void GCC_FMT_ATTR (3, 4) oss_logerr2 (
+ int err,
+ const char *typ,
+ const char *fmt,
+ ...
+ )
+{
+ va_list ap;
+
+ AUD_log (AUDIO_CAP, "Could not initialize %s\n", typ);
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n", strerror (err));
+}
+
+static void oss_anal_close (int *fdp)
+{
+ int err;
+
+ qemu_set_fd_handler (*fdp, NULL, NULL, NULL);
+ err = close (*fdp);
+ if (err) {
+ oss_logerr (errno, "Failed to close file(fd=%d)\n", *fdp);
+ }
+ *fdp = -1;
+}
+
+static void oss_helper_poll_out (void *opaque)
+{
+ (void) opaque;
+ audio_run ("oss_poll_out");
+}
+
+static void oss_helper_poll_in (void *opaque)
+{
+ (void) opaque;
+ audio_run ("oss_poll_in");
+}
+
+static int oss_poll_out (HWVoiceOut *hw)
+{
+ OSSVoiceOut *oss = (OSSVoiceOut *) hw;
+
+ return qemu_set_fd_handler (oss->fd, NULL, oss_helper_poll_out, NULL);
+}
+
+static int oss_poll_in (HWVoiceIn *hw)
+{
+ OSSVoiceIn *oss = (OSSVoiceIn *) hw;
+
+ return qemu_set_fd_handler (oss->fd, oss_helper_poll_in, NULL, NULL);
+}
+
+static int oss_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static int aud_to_ossfmt (audfmt_e fmt, int endianness)
+{
+ switch (fmt) {
+ case AUD_FMT_S8:
+ return AFMT_S8;
+
+ case AUD_FMT_U8:
+ return AFMT_U8;
+
+ case AUD_FMT_S16:
+ if (endianness) {
+ return AFMT_S16_BE;
+ }
+ else {
+ return AFMT_S16_LE;
+ }
+
+ case AUD_FMT_U16:
+ if (endianness) {
+ return AFMT_U16_BE;
+ }
+ else {
+ return AFMT_U16_LE;
+ }
+
+ default:
+ dolog ("Internal logic error: Bad audio format %d\n", fmt);
+#ifdef DEBUG_AUDIO
+ abort ();
+#endif
+ return AFMT_U8;
+ }
+}
+
+static int oss_to_audfmt (int ossfmt, audfmt_e *fmt, int *endianness)
+{
+ switch (ossfmt) {
+ case AFMT_S8:
+ *endianness = 0;
+ *fmt = AUD_FMT_S8;
+ break;
+
+ case AFMT_U8:
+ *endianness = 0;
+ *fmt = AUD_FMT_U8;
+ break;
+
+ case AFMT_S16_LE:
+ *endianness = 0;
+ *fmt = AUD_FMT_S16;
+ break;
+
+ case AFMT_U16_LE:
+ *endianness = 0;
+ *fmt = AUD_FMT_U16;
+ break;
+
+ case AFMT_S16_BE:
+ *endianness = 1;
+ *fmt = AUD_FMT_S16;
+ break;
+
+ case AFMT_U16_BE:
+ *endianness = 1;
+ *fmt = AUD_FMT_U16;
+ break;
+
+ default:
+ dolog ("Unrecognized audio format %d\n", ossfmt);
+ return -1;
+ }
+
+ return 0;
+}
+
+#if defined DEBUG_MISMATCHES || defined DEBUG
+static void oss_dump_info (struct oss_params *req, struct oss_params *obt)
+{
+ dolog ("parameter | requested value | obtained value\n");
+ dolog ("format | %10d | %10d\n", req->fmt, obt->fmt);
+ dolog ("channels | %10d | %10d\n",
+ req->nchannels, obt->nchannels);
+ dolog ("frequency | %10d | %10d\n", req->freq, obt->freq);
+ dolog ("nfrags | %10d | %10d\n", req->nfrags, obt->nfrags);
+ dolog ("fragsize | %10d | %10d\n",
+ req->fragsize, obt->fragsize);
+}
+#endif
+
+#ifdef USE_DSP_POLICY
+static int oss_get_version (int fd, int *version, const char *typ)
+{
+ if (ioctl (fd, OSS_GETVERSION, &version)) {
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+ /*
+ * Looks like atm (20100109) FreeBSD knows OSS_GETVERSION
+ * since 7.x, but currently only on the mixer device (or in
+ * the Linuxolator), and in the native version that part of
+ * the code is in fact never reached so the ioctl fails anyway.
+ * Until this is fixed, just check the errno and if its what
+ * FreeBSD's sound drivers return atm assume they are new enough.
+ */
+ if (errno == EINVAL) {
+ *version = 0x040000;
+ return 0;
+ }
+#endif
+ oss_logerr2 (errno, typ, "Failed to get OSS version\n");
+ return -1;
+ }
+ return 0;
+}
+#endif
+
+static int oss_open (int in, struct oss_params *req,
+ struct oss_params *obt, int *pfd)
+{
+ int fd;
+ int oflags = conf.exclusive ? O_EXCL : 0;
+ audio_buf_info abinfo;
+ int fmt, freq, nchannels;
+ int setfragment = 1;
+ const char *dspname = in ? conf.devpath_in : conf.devpath_out;
+ const char *typ = in ? "ADC" : "DAC";
+
+ /* Kludge needed to have working mmap on Linux */
+ oflags |= conf.try_mmap ? O_RDWR : (in ? O_RDONLY : O_WRONLY);
+
+ fd = open (dspname, oflags | O_NONBLOCK);
+ if (-1 == fd) {
+ oss_logerr2 (errno, typ, "Failed to open `%s'\n", dspname);
+ return -1;
+ }
+
+ freq = req->freq;
+ nchannels = req->nchannels;
+ fmt = req->fmt;
+
+ if (ioctl (fd, SNDCTL_DSP_SAMPLESIZE, &fmt)) {
+ oss_logerr2 (errno, typ, "Failed to set sample size %d\n", req->fmt);
+ goto err;
+ }
+
+ if (ioctl (fd, SNDCTL_DSP_CHANNELS, &nchannels)) {
+ oss_logerr2 (errno, typ, "Failed to set number of channels %d\n",
+ req->nchannels);
+ goto err;
+ }
+
+ if (ioctl (fd, SNDCTL_DSP_SPEED, &freq)) {
+ oss_logerr2 (errno, typ, "Failed to set frequency %d\n", req->freq);
+ goto err;
+ }
+
+ if (ioctl (fd, SNDCTL_DSP_NONBLOCK, NULL)) {
+ oss_logerr2 (errno, typ, "Failed to set non-blocking mode\n");
+ goto err;
+ }
+
+#ifdef USE_DSP_POLICY
+ if (conf.policy >= 0) {
+ int version;
+
+ if (!oss_get_version (fd, &version, typ)) {
+ if (conf.debug) {
+ dolog ("OSS version = %#x\n", version);
+ }
+
+ if (version >= 0x040000) {
+ int policy = conf.policy;
+ if (ioctl (fd, SNDCTL_DSP_POLICY, &policy)) {
+ oss_logerr2 (errno, typ,
+ "Failed to set timing policy to %d\n",
+ conf.policy);
+ goto err;
+ }
+ setfragment = 0;
+ }
+ }
+ }
+#endif
+
+ if (setfragment) {
+ int mmmmssss = (req->nfrags << 16) | ctz32 (req->fragsize);
+ if (ioctl (fd, SNDCTL_DSP_SETFRAGMENT, &mmmmssss)) {
+ oss_logerr2 (errno, typ, "Failed to set buffer length (%d, %d)\n",
+ req->nfrags, req->fragsize);
+ goto err;
+ }
+ }
+
+ if (ioctl (fd, in ? SNDCTL_DSP_GETISPACE : SNDCTL_DSP_GETOSPACE, &abinfo)) {
+ oss_logerr2 (errno, typ, "Failed to get buffer length\n");
+ goto err;
+ }
+
+ if (!abinfo.fragstotal || !abinfo.fragsize) {
+ AUD_log (AUDIO_CAP, "Returned bogus buffer information(%d, %d) for %s\n",
+ abinfo.fragstotal, abinfo.fragsize, typ);
+ goto err;
+ }
+
+ obt->fmt = fmt;
+ obt->nchannels = nchannels;
+ obt->freq = freq;
+ obt->nfrags = abinfo.fragstotal;
+ obt->fragsize = abinfo.fragsize;
+ *pfd = fd;
+
+#ifdef DEBUG_MISMATCHES
+ if ((req->fmt != obt->fmt) ||
+ (req->nchannels != obt->nchannels) ||
+ (req->freq != obt->freq) ||
+ (req->fragsize != obt->fragsize) ||
+ (req->nfrags != obt->nfrags)) {
+ dolog ("Audio parameters mismatch\n");
+ oss_dump_info (req, obt);
+ }
+#endif
+
+#ifdef DEBUG
+ oss_dump_info (req, obt);
+#endif
+ return 0;
+
+ err:
+ oss_anal_close (&fd);
+ return -1;
+}
+
+static void oss_write_pending (OSSVoiceOut *oss)
+{
+ HWVoiceOut *hw = &oss->hw;
+
+ if (oss->mmapped) {
+ return;
+ }
+
+ while (oss->pending) {
+ int samples_written;
+ ssize_t bytes_written;
+ int samples_till_end = hw->samples - oss->wpos;
+ int samples_to_write = audio_MIN (oss->pending, samples_till_end);
+ int bytes_to_write = samples_to_write << hw->info.shift;
+ void *pcm = advance (oss->pcm_buf, oss->wpos << hw->info.shift);
+
+ bytes_written = write (oss->fd, pcm, bytes_to_write);
+ if (bytes_written < 0) {
+ if (errno != EAGAIN) {
+ oss_logerr (errno, "failed to write %d bytes\n",
+ bytes_to_write);
+ }
+ break;
+ }
+
+ if (bytes_written & hw->info.align) {
+ dolog ("misaligned write asked for %d, but got %zd\n",
+ bytes_to_write, bytes_written);
+ return;
+ }
+
+ samples_written = bytes_written >> hw->info.shift;
+ oss->pending -= samples_written;
+ oss->wpos = (oss->wpos + samples_written) % hw->samples;
+ if (bytes_written - bytes_to_write) {
+ break;
+ }
+ }
+}
+
+static int oss_run_out (HWVoiceOut *hw, int live)
+{
+ OSSVoiceOut *oss = (OSSVoiceOut *) hw;
+ int err, decr;
+ struct audio_buf_info abinfo;
+ struct count_info cntinfo;
+ int bufsize;
+
+ bufsize = hw->samples << hw->info.shift;
+
+ if (oss->mmapped) {
+ int bytes, pos;
+
+ err = ioctl (oss->fd, SNDCTL_DSP_GETOPTR, &cntinfo);
+ if (err < 0) {
+ oss_logerr (errno, "SNDCTL_DSP_GETOPTR failed\n");
+ return 0;
+ }
+
+ pos = hw->rpos << hw->info.shift;
+ bytes = audio_ring_dist (cntinfo.ptr, pos, bufsize);
+ decr = audio_MIN (bytes >> hw->info.shift, live);
+ }
+ else {
+ err = ioctl (oss->fd, SNDCTL_DSP_GETOSPACE, &abinfo);
+ if (err < 0) {
+ oss_logerr (errno, "SNDCTL_DSP_GETOPTR failed\n");
+ return 0;
+ }
+
+ if (abinfo.bytes > bufsize) {
+ if (conf.debug) {
+ dolog ("warning: Invalid available size, size=%d bufsize=%d\n"
+ "please report your OS/audio hw to av1474(a)comtv.ru\n",
+ abinfo.bytes, bufsize);
+ }
+ abinfo.bytes = bufsize;
+ }
+
+ if (abinfo.bytes < 0) {
+ if (conf.debug) {
+ dolog ("warning: Invalid available size, size=%d bufsize=%d\n",
+ abinfo.bytes, bufsize);
+ }
+ return 0;
+ }
+
+ decr = audio_MIN (abinfo.bytes >> hw->info.shift, live);
+ if (!decr) {
+ return 0;
+ }
+ }
+
+ decr = audio_pcm_hw_clip_out (hw, oss->pcm_buf, decr, oss->pending);
+ oss->pending += decr;
+ oss_write_pending (oss);
+
+ return decr;
+}
+
+static void oss_fini_out (HWVoiceOut *hw)
+{
+ int err;
+ OSSVoiceOut *oss = (OSSVoiceOut *) hw;
+
+ ldebug ("oss_fini\n");
+ oss_anal_close (&oss->fd);
+
+ if (oss->pcm_buf) {
+ if (oss->mmapped) {
+ err = munmap (oss->pcm_buf, hw->samples << hw->info.shift);
+ if (err) {
+ oss_logerr (errno, "Failed to unmap buffer %p, size %d\n",
+ oss->pcm_buf, hw->samples << hw->info.shift);
+ }
+ }
+ else {
+ qemu_free (oss->pcm_buf);
+ }
+ oss->pcm_buf = NULL;
+ }
+}
+
+static int oss_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ OSSVoiceOut *oss = (OSSVoiceOut *) hw;
+ struct oss_params req, obt;
+ int endianness;
+ int err;
+ int fd;
+ audfmt_e effective_fmt;
+ struct audsettings obt_as;
+
+ oss->fd = -1;
+
+ req.fmt = aud_to_ossfmt (as->fmt, as->endianness);
+ req.freq = as->freq;
+ req.nchannels = as->nchannels;
+ req.fragsize = conf.fragsize;
+ req.nfrags = conf.nfrags;
+
+ if (oss_open (0, &req, &obt, &fd)) {
+ return -1;
+ }
+
+ err = oss_to_audfmt (obt.fmt, &effective_fmt, &endianness);
+ if (err) {
+ oss_anal_close (&fd);
+ return -1;
+ }
+
+ obt_as.freq = obt.freq;
+ obt_as.nchannels = obt.nchannels;
+ obt_as.fmt = effective_fmt;
+ obt_as.endianness = endianness;
+
+ audio_pcm_init_info (&hw->info, &obt_as);
+ oss->nfrags = obt.nfrags;
+ oss->fragsize = obt.fragsize;
+
+ if (obt.nfrags * obt.fragsize & hw->info.align) {
+ dolog ("warning: Misaligned DAC buffer, size %d, alignment %d\n",
+ obt.nfrags * obt.fragsize, hw->info.align + 1);
+ }
+
+ hw->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
+
+ oss->mmapped = 0;
+ if (conf.try_mmap) {
+ oss->pcm_buf = mmap (
+ NULL,
+ hw->samples << hw->info.shift,
+ PROT_READ | PROT_WRITE,
+ MAP_SHARED,
+ fd,
+ 0
+ );
+ if (oss->pcm_buf == MAP_FAILED) {
+ oss_logerr (errno, "Failed to map %d bytes of DAC\n",
+ hw->samples << hw->info.shift);
+ }
+ else {
+ int err;
+ int trig = 0;
+ if (ioctl (fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
+ oss_logerr (errno, "SNDCTL_DSP_SETTRIGGER 0 failed\n");
+ }
+ else {
+ trig = PCM_ENABLE_OUTPUT;
+ if (ioctl (fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
+ oss_logerr (
+ errno,
+ "SNDCTL_DSP_SETTRIGGER PCM_ENABLE_OUTPUT failed\n"
+ );
+ }
+ else {
+ oss->mmapped = 1;
+ }
+ }
+
+ if (!oss->mmapped) {
+ err = munmap (oss->pcm_buf, hw->samples << hw->info.shift);
+ if (err) {
+ oss_logerr (errno, "Failed to unmap buffer %p size %d\n",
+ oss->pcm_buf, hw->samples << hw->info.shift);
+ }
+ }
+ }
+ }
+
+ if (!oss->mmapped) {
+ oss->pcm_buf = audio_calloc (
+ AUDIO_FUNC,
+ hw->samples,
+ 1 << hw->info.shift
+ );
+ if (!oss->pcm_buf) {
+ dolog (
+ "Could not allocate DAC buffer (%d samples, each %d bytes)\n",
+ hw->samples,
+ 1 << hw->info.shift
+ );
+ oss_anal_close (&fd);
+ return -1;
+ }
+ }
+
+ oss->fd = fd;
+ return 0;
+}
+
+static int oss_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ int trig;
+ OSSVoiceOut *oss = (OSSVoiceOut *) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ {
+ va_list ap;
+ int poll_mode;
+
+ va_start (ap, cmd);
+ poll_mode = va_arg (ap, int);
+ va_end (ap);
+
+ ldebug ("enabling voice\n");
+ if (poll_mode && oss_poll_out (hw)) {
+ poll_mode = 0;
+ }
+ hw->poll_mode = poll_mode;
+
+ if (!oss->mmapped) {
+ return 0;
+ }
+
+ audio_pcm_info_clear_buf (&hw->info, oss->pcm_buf, hw->samples);
+ trig = PCM_ENABLE_OUTPUT;
+ if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
+ oss_logerr (
+ errno,
+ "SNDCTL_DSP_SETTRIGGER PCM_ENABLE_OUTPUT failed\n"
+ );
+ return -1;
+ }
+ }
+ break;
+
+ case VOICE_DISABLE:
+ if (hw->poll_mode) {
+ qemu_set_fd_handler (oss->fd, NULL, NULL, NULL);
+ hw->poll_mode = 0;
+ }
+
+ if (!oss->mmapped) {
+ return 0;
+ }
+
+ ldebug ("disabling voice\n");
+ trig = 0;
+ if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
+ oss_logerr (errno, "SNDCTL_DSP_SETTRIGGER 0 failed\n");
+ return -1;
+ }
+ break;
+ }
+ return 0;
+}
+
+static int oss_init_in (HWVoiceIn *hw, struct audsettings *as)
+{
+ OSSVoiceIn *oss = (OSSVoiceIn *) hw;
+ struct oss_params req, obt;
+ int endianness;
+ int err;
+ int fd;
+ audfmt_e effective_fmt;
+ struct audsettings obt_as;
+
+ oss->fd = -1;
+
+ req.fmt = aud_to_ossfmt (as->fmt, as->endianness);
+ req.freq = as->freq;
+ req.nchannels = as->nchannels;
+ req.fragsize = conf.fragsize;
+ req.nfrags = conf.nfrags;
+ if (oss_open (1, &req, &obt, &fd)) {
+ return -1;
+ }
+
+ err = oss_to_audfmt (obt.fmt, &effective_fmt, &endianness);
+ if (err) {
+ oss_anal_close (&fd);
+ return -1;
+ }
+
+ obt_as.freq = obt.freq;
+ obt_as.nchannels = obt.nchannels;
+ obt_as.fmt = effective_fmt;
+ obt_as.endianness = endianness;
+
+ audio_pcm_init_info (&hw->info, &obt_as);
+ oss->nfrags = obt.nfrags;
+ oss->fragsize = obt.fragsize;
+
+ if (obt.nfrags * obt.fragsize & hw->info.align) {
+ dolog ("warning: Misaligned ADC buffer, size %d, alignment %d\n",
+ obt.nfrags * obt.fragsize, hw->info.align + 1);
+ }
+
+ hw->samples = (obt.nfrags * obt.fragsize) >> hw->info.shift;
+ oss->pcm_buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
+ if (!oss->pcm_buf) {
+ dolog ("Could not allocate ADC buffer (%d samples, each %d bytes)\n",
+ hw->samples, 1 << hw->info.shift);
+ oss_anal_close (&fd);
+ return -1;
+ }
+
+ oss->fd = fd;
+ return 0;
+}
+
+static void oss_fini_in (HWVoiceIn *hw)
+{
+ OSSVoiceIn *oss = (OSSVoiceIn *) hw;
+
+ oss_anal_close (&oss->fd);
+
+ if (oss->pcm_buf) {
+ qemu_free (oss->pcm_buf);
+ oss->pcm_buf = NULL;
+ }
+}
+
+static int oss_run_in (HWVoiceIn *hw)
+{
+ OSSVoiceIn *oss = (OSSVoiceIn *) hw;
+ int hwshift = hw->info.shift;
+ int i;
+ int live = audio_pcm_hw_get_live_in (hw);
+ int dead = hw->samples - live;
+ size_t read_samples = 0;
+ struct {
+ int add;
+ int len;
+ } bufs[2] = {
+ { .add = hw->wpos, .len = 0 },
+ { .add = 0, .len = 0 }
+ };
+
+ if (!dead) {
+ return 0;
+ }
+
+ if (hw->wpos + dead > hw->samples) {
+ bufs[0].len = (hw->samples - hw->wpos) << hwshift;
+ bufs[1].len = (dead - (hw->samples - hw->wpos)) << hwshift;
+ }
+ else {
+ bufs[0].len = dead << hwshift;
+ }
+
+ for (i = 0; i < 2; ++i) {
+ ssize_t nread;
+
+ if (bufs[i].len) {
+ void *p = advance (oss->pcm_buf, bufs[i].add << hwshift);
+ nread = read (oss->fd, p, bufs[i].len);
+
+ if (nread > 0) {
+ if (nread & hw->info.align) {
+ dolog ("warning: Misaligned read %zd (requested %d), "
+ "alignment %d\n", nread, bufs[i].add << hwshift,
+ hw->info.align + 1);
+ }
+ read_samples += nread >> hwshift;
+ hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift);
+ }
+
+ if (bufs[i].len - nread) {
+ if (nread == -1) {
+ switch (errno) {
+ case EINTR:
+ case EAGAIN:
+ break;
+ default:
+ oss_logerr (
+ errno,
+ "Failed to read %d bytes of audio (to %p)\n",
+ bufs[i].len, p
+ );
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ hw->wpos = (hw->wpos + read_samples) % hw->samples;
+ return read_samples;
+}
+
+static int oss_read (SWVoiceIn *sw, void *buf, int size)
+{
+ return audio_pcm_sw_read (sw, buf, size);
+}
+
+static int oss_ctl_in (HWVoiceIn *hw, int cmd, ...)
+{
+ OSSVoiceIn *oss = (OSSVoiceIn *) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ {
+ va_list ap;
+ int poll_mode;
+
+ va_start (ap, cmd);
+ poll_mode = va_arg (ap, int);
+ va_end (ap);
+
+ if (poll_mode && oss_poll_in (hw)) {
+ poll_mode = 0;
+ }
+ hw->poll_mode = poll_mode;
+ }
+ break;
+
+ case VOICE_DISABLE:
+ if (hw->poll_mode) {
+ hw->poll_mode = 0;
+ qemu_set_fd_handler (oss->fd, NULL, NULL, NULL);
+ }
+ break;
+ }
+ return 0;
+}
+
+static void *oss_audio_init (void)
+{
+ return &conf;
+}
+
+static void oss_audio_fini (void *opaque)
+{
+ (void) opaque;
+}
+
+static struct audio_option oss_options[] = {
+ {
+ .name = "FRAGSIZE",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.fragsize,
+ .descr = "Fragment size in bytes"
+ },
+ {
+ .name = "NFRAGS",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.nfrags,
+ .descr = "Number of fragments"
+ },
+ {
+ .name = "MMAP",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.try_mmap,
+ .descr = "Try using memory mapped access"
+ },
+ {
+ .name = "DAC_DEV",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.devpath_out,
+ .descr = "Path to DAC device"
+ },
+ {
+ .name = "ADC_DEV",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.devpath_in,
+ .descr = "Path to ADC device"
+ },
+ {
+ .name = "EXCLUSIVE",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.exclusive,
+ .descr = "Open device in exclusive mode (vmix wont work)"
+ },
+#ifdef USE_DSP_POLICY
+ {
+ .name = "POLICY",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.policy,
+ .descr = "Set the timing policy of the device, -1 to use fragment mode",
+ },
+#endif
+ {
+ .name = "DEBUG",
+ .tag = AUD_OPT_BOOL,
+ .valp = &conf.debug,
+ .descr = "Turn on some debugging messages"
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops oss_pcm_ops = {
+ .init_out = oss_init_out,
+ .fini_out = oss_fini_out,
+ .run_out = oss_run_out,
+ .write = oss_write,
+ .ctl_out = oss_ctl_out,
+
+ .init_in = oss_init_in,
+ .fini_in = oss_fini_in,
+ .run_in = oss_run_in,
+ .read = oss_read,
+ .ctl_in = oss_ctl_in
+};
+
+struct audio_driver oss_audio_driver = {
+ .name = "oss",
+ .descr = "OSS http://www.opensound.com",
+ .options = oss_options,
+ .init = oss_audio_init,
+ .fini = oss_audio_fini,
+ .pcm_ops = &oss_pcm_ops,
+ .can_be_default = 1,
+ .max_voices_out = INT_MAX,
+ .max_voices_in = INT_MAX,
+ .voice_size_out = sizeof (OSSVoiceOut),
+ .voice_size_in = sizeof (OSSVoiceIn)
+};
diff --git a/qemu-0.15.x/audio/paaudio.c b/qemu-0.15.x/audio/paaudio.c
new file mode 100644
index 0000000..fb4510e
--- /dev/null
+++ b/qemu-0.15.x/audio/paaudio.c
@@ -0,0 +1,525 @@
+/* public domain */
+#include "qemu-common.h"
+#include "audio.h"
+
+#include <pulse/simple.h>
+#include <pulse/error.h>
+
+#define AUDIO_CAP "pulseaudio"
+#include "audio_int.h"
+#include "audio_pt_int.h"
+
+typedef struct {
+ HWVoiceOut hw;
+ int done;
+ int live;
+ int decr;
+ int rpos;
+ pa_simple *s;
+ void *pcm_buf;
+ struct audio_pt pt;
+} PAVoiceOut;
+
+typedef struct {
+ HWVoiceIn hw;
+ int done;
+ int dead;
+ int incr;
+ int wpos;
+ pa_simple *s;
+ void *pcm_buf;
+ struct audio_pt pt;
+} PAVoiceIn;
+
+static struct {
+ int samples;
+ char *server;
+ char *sink;
+ char *source;
+} conf = {
+ .samples = 4096,
+};
+
+static void GCC_FMT_ATTR (2, 3) qpa_logerr (int err, const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n", pa_strerror (err));
+}
+
+static void *qpa_thread_out (void *arg)
+{
+ PAVoiceOut *pa = arg;
+ HWVoiceOut *hw = &pa->hw;
+
+ if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ for (;;) {
+ int decr, to_mix, rpos;
+
+ for (;;) {
+ if (pa->done) {
+ goto exit;
+ }
+
+ if (pa->live > 0) {
+ break;
+ }
+
+ if (audio_pt_wait (&pa->pt, AUDIO_FUNC)) {
+ goto exit;
+ }
+ }
+
+ decr = to_mix = audio_MIN (pa->live, conf.samples >> 2);
+ rpos = pa->rpos;
+
+ if (audio_pt_unlock (&pa->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ while (to_mix) {
+ int error;
+ int chunk = audio_MIN (to_mix, hw->samples - rpos);
+ struct st_sample *src = hw->mix_buf + rpos;
+
+ hw->clip (pa->pcm_buf, src, chunk);
+
+ if (pa_simple_write (pa->s, pa->pcm_buf,
+ chunk << hw->info.shift, &error) < 0) {
+ qpa_logerr (error, "pa_simple_write failed\n");
+ return NULL;
+ }
+
+ rpos = (rpos + chunk) % hw->samples;
+ to_mix -= chunk;
+ }
+
+ if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ pa->rpos = rpos;
+ pa->live -= decr;
+ pa->decr += decr;
+ }
+
+ exit:
+ audio_pt_unlock (&pa->pt, AUDIO_FUNC);
+ return NULL;
+}
+
+static int qpa_run_out (HWVoiceOut *hw, int live)
+{
+ int decr;
+ PAVoiceOut *pa = (PAVoiceOut *) hw;
+
+ if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {
+ return 0;
+ }
+
+ decr = audio_MIN (live, pa->decr);
+ pa->decr -= decr;
+ pa->live = live - decr;
+ hw->rpos = pa->rpos;
+ if (pa->live > 0) {
+ audio_pt_unlock_and_signal (&pa->pt, AUDIO_FUNC);
+ }
+ else {
+ audio_pt_unlock (&pa->pt, AUDIO_FUNC);
+ }
+ return decr;
+}
+
+static int qpa_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+/* capture */
+static void *qpa_thread_in (void *arg)
+{
+ PAVoiceIn *pa = arg;
+ HWVoiceIn *hw = &pa->hw;
+
+ if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ for (;;) {
+ int incr, to_grab, wpos;
+
+ for (;;) {
+ if (pa->done) {
+ goto exit;
+ }
+
+ if (pa->dead > 0) {
+ break;
+ }
+
+ if (audio_pt_wait (&pa->pt, AUDIO_FUNC)) {
+ goto exit;
+ }
+ }
+
+ incr = to_grab = audio_MIN (pa->dead, conf.samples >> 2);
+ wpos = pa->wpos;
+
+ if (audio_pt_unlock (&pa->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ while (to_grab) {
+ int error;
+ int chunk = audio_MIN (to_grab, hw->samples - wpos);
+ void *buf = advance (pa->pcm_buf, wpos);
+
+ if (pa_simple_read (pa->s, buf,
+ chunk << hw->info.shift, &error) < 0) {
+ qpa_logerr (error, "pa_simple_read failed\n");
+ return NULL;
+ }
+
+ hw->conv (hw->conv_buf + wpos, buf, chunk);
+ wpos = (wpos + chunk) % hw->samples;
+ to_grab -= chunk;
+ }
+
+ if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {
+ return NULL;
+ }
+
+ pa->wpos = wpos;
+ pa->dead -= incr;
+ pa->incr += incr;
+ }
+
+ exit:
+ audio_pt_unlock (&pa->pt, AUDIO_FUNC);
+ return NULL;
+}
+
+static int qpa_run_in (HWVoiceIn *hw)
+{
+ int live, incr, dead;
+ PAVoiceIn *pa = (PAVoiceIn *) hw;
+
+ if (audio_pt_lock (&pa->pt, AUDIO_FUNC)) {
+ return 0;
+ }
+
+ live = audio_pcm_hw_get_live_in (hw);
+ dead = hw->samples - live;
+ incr = audio_MIN (dead, pa->incr);
+ pa->incr -= incr;
+ pa->dead = dead - incr;
+ hw->wpos = pa->wpos;
+ if (pa->dead > 0) {
+ audio_pt_unlock_and_signal (&pa->pt, AUDIO_FUNC);
+ }
+ else {
+ audio_pt_unlock (&pa->pt, AUDIO_FUNC);
+ }
+ return incr;
+}
+
+static int qpa_read (SWVoiceIn *sw, void *buf, int len)
+{
+ return audio_pcm_sw_read (sw, buf, len);
+}
+
+static pa_sample_format_t audfmt_to_pa (audfmt_e afmt, int endianness)
+{
+ int format;
+
+ switch (afmt) {
+ case AUD_FMT_S8:
+ case AUD_FMT_U8:
+ format = PA_SAMPLE_U8;
+ break;
+ case AUD_FMT_S16:
+ case AUD_FMT_U16:
+ format = endianness ? PA_SAMPLE_S16BE : PA_SAMPLE_S16LE;
+ break;
+ case AUD_FMT_S32:
+ case AUD_FMT_U32:
+ format = endianness ? PA_SAMPLE_S32BE : PA_SAMPLE_S32LE;
+ break;
+ default:
+ dolog ("Internal logic error: Bad audio format %d\n", afmt);
+ format = PA_SAMPLE_U8;
+ break;
+ }
+ return format;
+}
+
+static audfmt_e pa_to_audfmt (pa_sample_format_t fmt, int *endianness)
+{
+ switch (fmt) {
+ case PA_SAMPLE_U8:
+ return AUD_FMT_U8;
+ case PA_SAMPLE_S16BE:
+ *endianness = 1;
+ return AUD_FMT_S16;
+ case PA_SAMPLE_S16LE:
+ *endianness = 0;
+ return AUD_FMT_S16;
+ case PA_SAMPLE_S32BE:
+ *endianness = 1;
+ return AUD_FMT_S32;
+ case PA_SAMPLE_S32LE:
+ *endianness = 0;
+ return AUD_FMT_S32;
+ default:
+ dolog ("Internal logic error: Bad pa_sample_format %d\n", fmt);
+ return AUD_FMT_U8;
+ }
+}
+
+static int qpa_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ int error;
+ static pa_sample_spec ss;
+ static pa_buffer_attr ba;
+ struct audsettings obt_as = *as;
+ PAVoiceOut *pa = (PAVoiceOut *) hw;
+
+ ss.format = audfmt_to_pa (as->fmt, as->endianness);
+ ss.channels = as->nchannels;
+ ss.rate = as->freq;
+
+ /*
+ * qemu audio tick runs at 250 Hz (by default), so processing
+ * data chunks worth 4 ms of sound should be a good fit.
+ */
+ ba.tlength = pa_usec_to_bytes (4 * 1000, &ss);
+ ba.minreq = pa_usec_to_bytes (2 * 1000, &ss);
+ ba.maxlength = -1;
+ ba.prebuf = -1;
+
+ obt_as.fmt = pa_to_audfmt (ss.format, &obt_as.endianness);
+
+ pa->s = pa_simple_new (
+ conf.server,
+ "qemu",
+ PA_STREAM_PLAYBACK,
+ conf.sink,
+ "pcm.playback",
+ &ss,
+ NULL, /* channel map */
+ &ba, /* buffering attributes */
+ &error
+ );
+ if (!pa->s) {
+ qpa_logerr (error, "pa_simple_new for playback failed\n");
+ goto fail1;
+ }
+
+ audio_pcm_init_info (&hw->info, &obt_as);
+ hw->samples = conf.samples;
+ pa->pcm_buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
+ pa->rpos = hw->rpos;
+ if (!pa->pcm_buf) {
+ dolog ("Could not allocate buffer (%d bytes)\n",
+ hw->samples << hw->info.shift);
+ goto fail2;
+ }
+
+ if (audio_pt_init (&pa->pt, qpa_thread_out, hw, AUDIO_CAP, AUDIO_FUNC)) {
+ goto fail3;
+ }
+
+ return 0;
+
+ fail3:
+ qemu_free (pa->pcm_buf);
+ pa->pcm_buf = NULL;
+ fail2:
+ pa_simple_free (pa->s);
+ pa->s = NULL;
+ fail1:
+ return -1;
+}
+
+static int qpa_init_in (HWVoiceIn *hw, struct audsettings *as)
+{
+ int error;
+ static pa_sample_spec ss;
+ struct audsettings obt_as = *as;
+ PAVoiceIn *pa = (PAVoiceIn *) hw;
+
+ ss.format = audfmt_to_pa (as->fmt, as->endianness);
+ ss.channels = as->nchannels;
+ ss.rate = as->freq;
+
+ obt_as.fmt = pa_to_audfmt (ss.format, &obt_as.endianness);
+
+ pa->s = pa_simple_new (
+ conf.server,
+ "qemu",
+ PA_STREAM_RECORD,
+ conf.source,
+ "pcm.capture",
+ &ss,
+ NULL, /* channel map */
+ NULL, /* buffering attributes */
+ &error
+ );
+ if (!pa->s) {
+ qpa_logerr (error, "pa_simple_new for capture failed\n");
+ goto fail1;
+ }
+
+ audio_pcm_init_info (&hw->info, &obt_as);
+ hw->samples = conf.samples;
+ pa->pcm_buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
+ pa->wpos = hw->wpos;
+ if (!pa->pcm_buf) {
+ dolog ("Could not allocate buffer (%d bytes)\n",
+ hw->samples << hw->info.shift);
+ goto fail2;
+ }
+
+ if (audio_pt_init (&pa->pt, qpa_thread_in, hw, AUDIO_CAP, AUDIO_FUNC)) {
+ goto fail3;
+ }
+
+ return 0;
+
+ fail3:
+ qemu_free (pa->pcm_buf);
+ pa->pcm_buf = NULL;
+ fail2:
+ pa_simple_free (pa->s);
+ pa->s = NULL;
+ fail1:
+ return -1;
+}
+
+static void qpa_fini_out (HWVoiceOut *hw)
+{
+ void *ret;
+ PAVoiceOut *pa = (PAVoiceOut *) hw;
+
+ audio_pt_lock (&pa->pt, AUDIO_FUNC);
+ pa->done = 1;
+ audio_pt_unlock_and_signal (&pa->pt, AUDIO_FUNC);
+ audio_pt_join (&pa->pt, &ret, AUDIO_FUNC);
+
+ if (pa->s) {
+ pa_simple_free (pa->s);
+ pa->s = NULL;
+ }
+
+ audio_pt_fini (&pa->pt, AUDIO_FUNC);
+ qemu_free (pa->pcm_buf);
+ pa->pcm_buf = NULL;
+}
+
+static void qpa_fini_in (HWVoiceIn *hw)
+{
+ void *ret;
+ PAVoiceIn *pa = (PAVoiceIn *) hw;
+
+ audio_pt_lock (&pa->pt, AUDIO_FUNC);
+ pa->done = 1;
+ audio_pt_unlock_and_signal (&pa->pt, AUDIO_FUNC);
+ audio_pt_join (&pa->pt, &ret, AUDIO_FUNC);
+
+ if (pa->s) {
+ pa_simple_free (pa->s);
+ pa->s = NULL;
+ }
+
+ audio_pt_fini (&pa->pt, AUDIO_FUNC);
+ qemu_free (pa->pcm_buf);
+ pa->pcm_buf = NULL;
+}
+
+static int qpa_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ (void) hw;
+ (void) cmd;
+ return 0;
+}
+
+static int qpa_ctl_in (HWVoiceIn *hw, int cmd, ...)
+{
+ (void) hw;
+ (void) cmd;
+ return 0;
+}
+
+/* common */
+static void *qpa_audio_init (void)
+{
+ return &conf;
+}
+
+static void qpa_audio_fini (void *opaque)
+{
+ (void) opaque;
+}
+
+struct audio_option qpa_options[] = {
+ {
+ .name = "SAMPLES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.samples,
+ .descr = "buffer size in samples"
+ },
+ {
+ .name = "SERVER",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.server,
+ .descr = "server address"
+ },
+ {
+ .name = "SINK",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.sink,
+ .descr = "sink device name"
+ },
+ {
+ .name = "SOURCE",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.source,
+ .descr = "source device name"
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops qpa_pcm_ops = {
+ .init_out = qpa_init_out,
+ .fini_out = qpa_fini_out,
+ .run_out = qpa_run_out,
+ .write = qpa_write,
+ .ctl_out = qpa_ctl_out,
+
+ .init_in = qpa_init_in,
+ .fini_in = qpa_fini_in,
+ .run_in = qpa_run_in,
+ .read = qpa_read,
+ .ctl_in = qpa_ctl_in
+};
+
+struct audio_driver pa_audio_driver = {
+ .name = "pa",
+ .descr = "http://www.pulseaudio.org/",
+ .options = qpa_options,
+ .init = qpa_audio_init,
+ .fini = qpa_audio_fini,
+ .pcm_ops = &qpa_pcm_ops,
+ .can_be_default = 1,
+ .max_voices_out = INT_MAX,
+ .max_voices_in = INT_MAX,
+ .voice_size_out = sizeof (PAVoiceOut),
+ .voice_size_in = sizeof (PAVoiceIn)
+};
diff --git a/qemu-0.15.x/audio/rate_template.h b/qemu-0.15.x/audio/rate_template.h
new file mode 100644
index 0000000..bd4b1c7
--- /dev/null
+++ b/qemu-0.15.x/audio/rate_template.h
@@ -0,0 +1,111 @@
+/*
+ * QEMU Mixing engine
+ *
+ * Copyright (c) 2004-2005 Vassili Karpov (malc)
+ * Copyright (c) 1998 Fabrice Bellard
+ *
+ * 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.
+ */
+
+/*
+ * Processed signed long samples from ibuf to obuf.
+ * Return number of samples processed.
+ */
+void NAME (void *opaque, struct st_sample *ibuf, struct st_sample *obuf,
+ int *isamp, int *osamp)
+{
+ struct rate *rate = opaque;
+ struct st_sample *istart, *iend;
+ struct st_sample *ostart, *oend;
+ struct st_sample ilast, icur, out;
+#ifdef FLOAT_MIXENG
+ mixeng_real t;
+#else
+ int64_t t;
+#endif
+
+ ilast = rate->ilast;
+
+ istart = ibuf;
+ iend = ibuf + *isamp;
+
+ ostart = obuf;
+ oend = obuf + *osamp;
+
+ if (rate->opos_inc == (1ULL + UINT_MAX)) {
+ int i, n = *isamp > *osamp ? *osamp : *isamp;
+ for (i = 0; i < n; i++) {
+ OP (obuf[i].l, ibuf[i].l);
+ OP (obuf[i].r, ibuf[i].r);
+ }
+ *isamp = n;
+ *osamp = n;
+ return;
+ }
+
+ while (obuf < oend) {
+
+ /* Safety catch to make sure we have input samples. */
+ if (ibuf >= iend) {
+ break;
+ }
+
+ /* read as many input samples so that ipos > opos */
+
+ while (rate->ipos <= (rate->opos >> 32)) {
+ ilast = *ibuf++;
+ rate->ipos++;
+ /* See if we finished the input buffer yet */
+ if (ibuf >= iend) {
+ goto the_end;
+ }
+ }
+
+ icur = *ibuf;
+
+ /* interpolate */
+#ifdef FLOAT_MIXENG
+#ifdef RECIPROCAL
+ t = (rate->opos & UINT_MAX) * (1.f / UINT_MAX);
+#else
+ t = (rate->opos & UINT_MAX) / (mixeng_real) UINT_MAX;
+#endif
+ out.l = (ilast.l * (1.0 - t)) + icur.l * t;
+ out.r = (ilast.r * (1.0 - t)) + icur.r * t;
+#else
+ t = rate->opos & 0xffffffff;
+ out.l = (ilast.l * ((int64_t) UINT_MAX - t) + icur.l * t) >> 32;
+ out.r = (ilast.r * ((int64_t) UINT_MAX - t) + icur.r * t) >> 32;
+#endif
+
+ /* output sample & increment position */
+ OP (obuf->l, out.l);
+ OP (obuf->r, out.r);
+ obuf += 1;
+ rate->opos += rate->opos_inc;
+ }
+
+the_end:
+ *isamp = ibuf - istart;
+ *osamp = obuf - ostart;
+ rate->ilast = ilast;
+}
+
+#undef NAME
+#undef OP
diff --git a/qemu-0.15.x/audio/sdlaudio.c b/qemu-0.15.x/audio/sdlaudio.c
new file mode 100644
index 0000000..d24daa5
--- /dev/null
+++ b/qemu-0.15.x/audio/sdlaudio.c
@@ -0,0 +1,458 @@
+/*
+ * QEMU SDL audio driver
+ *
+ * Copyright (c) 2004-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#include <SDL.h>
+#include <SDL_thread.h>
+#include "qemu-common.h"
+#include "audio.h"
+
+#ifndef _WIN32
+#ifdef __sun__
+#define _POSIX_PTHREAD_SEMANTICS 1
+#elif defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
+#include <pthread.h>
+#endif
+#endif
+
+#define AUDIO_CAP "sdl"
+#include "audio_int.h"
+
+typedef struct SDLVoiceOut {
+ HWVoiceOut hw;
+ int live;
+ int rpos;
+ int decr;
+} SDLVoiceOut;
+
+static struct {
+ int nb_samples;
+} conf = {
+ .nb_samples = 1024
+};
+
+static struct SDLAudioState {
+ int exit;
+ SDL_mutex *mutex;
+ SDL_sem *sem;
+ int initialized;
+} glob_sdl;
+typedef struct SDLAudioState SDLAudioState;
+
+static void GCC_FMT_ATTR (1, 2) sdl_logerr (const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (AUDIO_CAP, "Reason: %s\n", SDL_GetError ());
+}
+
+static int sdl_lock (SDLAudioState *s, const char *forfn)
+{
+ if (SDL_LockMutex (s->mutex)) {
+ sdl_logerr ("SDL_LockMutex for %s failed\n", forfn);
+ return -1;
+ }
+ return 0;
+}
+
+static int sdl_unlock (SDLAudioState *s, const char *forfn)
+{
+ if (SDL_UnlockMutex (s->mutex)) {
+ sdl_logerr ("SDL_UnlockMutex for %s failed\n", forfn);
+ return -1;
+ }
+ return 0;
+}
+
+static int sdl_post (SDLAudioState *s, const char *forfn)
+{
+ if (SDL_SemPost (s->sem)) {
+ sdl_logerr ("SDL_SemPost for %s failed\n", forfn);
+ return -1;
+ }
+ return 0;
+}
+
+static int sdl_wait (SDLAudioState *s, const char *forfn)
+{
+ if (SDL_SemWait (s->sem)) {
+ sdl_logerr ("SDL_SemWait for %s failed\n", forfn);
+ return -1;
+ }
+ return 0;
+}
+
+static int sdl_unlock_and_post (SDLAudioState *s, const char *forfn)
+{
+ if (sdl_unlock (s, forfn)) {
+ return -1;
+ }
+
+ return sdl_post (s, forfn);
+}
+
+static int aud_to_sdlfmt (audfmt_e fmt)
+{
+ switch (fmt) {
+ case AUD_FMT_S8:
+ return AUDIO_S8;
+
+ case AUD_FMT_U8:
+ return AUDIO_U8;
+
+ case AUD_FMT_S16:
+ return AUDIO_S16LSB;
+
+ case AUD_FMT_U16:
+ return AUDIO_U16LSB;
+
+ default:
+ dolog ("Internal logic error: Bad audio format %d\n", fmt);
+#ifdef DEBUG_AUDIO
+ abort ();
+#endif
+ return AUDIO_U8;
+ }
+}
+
+static int sdl_to_audfmt(int sdlfmt, audfmt_e *fmt, int *endianness)
+{
+ switch (sdlfmt) {
+ case AUDIO_S8:
+ *endianness = 0;
+ *fmt = AUD_FMT_S8;
+ break;
+
+ case AUDIO_U8:
+ *endianness = 0;
+ *fmt = AUD_FMT_U8;
+ break;
+
+ case AUDIO_S16LSB:
+ *endianness = 0;
+ *fmt = AUD_FMT_S16;
+ break;
+
+ case AUDIO_U16LSB:
+ *endianness = 0;
+ *fmt = AUD_FMT_U16;
+ break;
+
+ case AUDIO_S16MSB:
+ *endianness = 1;
+ *fmt = AUD_FMT_S16;
+ break;
+
+ case AUDIO_U16MSB:
+ *endianness = 1;
+ *fmt = AUD_FMT_U16;
+ break;
+
+ default:
+ dolog ("Unrecognized SDL audio format %d\n", sdlfmt);
+ return -1;
+ }
+
+ return 0;
+}
+
+static int sdl_open (SDL_AudioSpec *req, SDL_AudioSpec *obt)
+{
+ int status;
+#ifndef _WIN32
+ int err;
+ sigset_t new, old;
+
+ /* Make sure potential threads created by SDL don't hog signals. */
+ err = sigfillset (&new);
+ if (err) {
+ dolog ("sdl_open: sigfillset failed: %s\n", strerror (errno));
+ return -1;
+ }
+ err = pthread_sigmask (SIG_BLOCK, &new, &old);
+ if (err) {
+ dolog ("sdl_open: pthread_sigmask failed: %s\n", strerror (err));
+ return -1;
+ }
+#endif
+
+ status = SDL_OpenAudio (req, obt);
+ if (status) {
+ sdl_logerr ("SDL_OpenAudio failed\n");
+ }
+
+#ifndef _WIN32
+ err = pthread_sigmask (SIG_SETMASK, &old, NULL);
+ if (err) {
+ dolog ("sdl_open: pthread_sigmask (restore) failed: %s\n",
+ strerror (errno));
+ /* We have failed to restore original signal mask, all bets are off,
+ so exit the process */
+ exit (EXIT_FAILURE);
+ }
+#endif
+ return status;
+}
+
+static void sdl_close (SDLAudioState *s)
+{
+ if (s->initialized) {
+ sdl_lock (s, "sdl_close");
+ s->exit = 1;
+ sdl_unlock_and_post (s, "sdl_close");
+ SDL_PauseAudio (1);
+ SDL_CloseAudio ();
+ s->initialized = 0;
+ }
+}
+
+static void sdl_callback (void *opaque, Uint8 *buf, int len)
+{
+ SDLVoiceOut *sdl = opaque;
+ SDLAudioState *s = &glob_sdl;
+ HWVoiceOut *hw = &sdl->hw;
+ int samples = len >> hw->info.shift;
+
+ if (s->exit) {
+ return;
+ }
+
+ while (samples) {
+ int to_mix, decr;
+
+ /* dolog ("in callback samples=%d\n", samples); */
+ sdl_wait (s, "sdl_callback");
+ if (s->exit) {
+ return;
+ }
+
+ if (sdl_lock (s, "sdl_callback")) {
+ return;
+ }
+
+ if (audio_bug (AUDIO_FUNC, sdl->live < 0 || sdl->live > hw->samples)) {
+ dolog ("sdl->live=%d hw->samples=%d\n",
+ sdl->live, hw->samples);
+ return;
+ }
+
+ if (!sdl->live) {
+ goto again;
+ }
+
+ /* dolog ("in callback live=%d\n", live); */
+ to_mix = audio_MIN (samples, sdl->live);
+ decr = to_mix;
+ while (to_mix) {
+ int chunk = audio_MIN (to_mix, hw->samples - hw->rpos);
+ struct st_sample *src = hw->mix_buf + hw->rpos;
+
+ /* dolog ("in callback to_mix %d, chunk %d\n", to_mix, chunk); */
+ hw->clip (buf, src, chunk);
+ sdl->rpos = (sdl->rpos + chunk) % hw->samples;
+ to_mix -= chunk;
+ buf += chunk << hw->info.shift;
+ }
+ samples -= decr;
+ sdl->live -= decr;
+ sdl->decr += decr;
+
+ again:
+ if (sdl_unlock (s, "sdl_callback")) {
+ return;
+ }
+ }
+ /* dolog ("done len=%d\n", len); */
+}
+
+static int sdl_write_out (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static int sdl_run_out (HWVoiceOut *hw, int live)
+{
+ int decr;
+ SDLVoiceOut *sdl = (SDLVoiceOut *) hw;
+ SDLAudioState *s = &glob_sdl;
+
+ if (sdl_lock (s, "sdl_run_out")) {
+ return 0;
+ }
+
+ if (sdl->decr > live) {
+ ldebug ("sdl->decr %d live %d sdl->live %d\n",
+ sdl->decr,
+ live,
+ sdl->live);
+ }
+
+ decr = audio_MIN (sdl->decr, live);
+ sdl->decr -= decr;
+
+ sdl->live = live - decr;
+ hw->rpos = sdl->rpos;
+
+ if (sdl->live > 0) {
+ sdl_unlock_and_post (s, "sdl_run_out");
+ }
+ else {
+ sdl_unlock (s, "sdl_run_out");
+ }
+ return decr;
+}
+
+static void sdl_fini_out (HWVoiceOut *hw)
+{
+ (void) hw;
+
+ sdl_close (&glob_sdl);
+}
+
+static int sdl_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ SDLVoiceOut *sdl = (SDLVoiceOut *) hw;
+ SDLAudioState *s = &glob_sdl;
+ SDL_AudioSpec req, obt;
+ int endianness;
+ int err;
+ audfmt_e effective_fmt;
+ struct audsettings obt_as;
+
+ req.freq = as->freq;
+ req.format = aud_to_sdlfmt (as->fmt);
+ req.channels = as->nchannels;
+ req.samples = conf.nb_samples;
+ req.callback = sdl_callback;
+ req.userdata = sdl;
+
+ if (sdl_open (&req, &obt)) {
+ return -1;
+ }
+
+ err = sdl_to_audfmt(obt.format, &effective_fmt, &endianness);
+ if (err) {
+ sdl_close (s);
+ return -1;
+ }
+
+ obt_as.freq = obt.freq;
+ obt_as.nchannels = obt.channels;
+ obt_as.fmt = effective_fmt;
+ obt_as.endianness = endianness;
+
+ audio_pcm_init_info (&hw->info, &obt_as);
+ hw->samples = obt.samples;
+
+ s->initialized = 1;
+ s->exit = 0;
+ SDL_PauseAudio (0);
+ return 0;
+}
+
+static int sdl_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ (void) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ SDL_PauseAudio (0);
+ break;
+
+ case VOICE_DISABLE:
+ SDL_PauseAudio (1);
+ break;
+ }
+ return 0;
+}
+
+static void *sdl_audio_init (void)
+{
+ SDLAudioState *s = &glob_sdl;
+
+ if (SDL_InitSubSystem (SDL_INIT_AUDIO)) {
+ sdl_logerr ("SDL failed to initialize audio subsystem\n");
+ return NULL;
+ }
+
+ s->mutex = SDL_CreateMutex ();
+ if (!s->mutex) {
+ sdl_logerr ("Failed to create SDL mutex\n");
+ SDL_QuitSubSystem (SDL_INIT_AUDIO);
+ return NULL;
+ }
+
+ s->sem = SDL_CreateSemaphore (0);
+ if (!s->sem) {
+ sdl_logerr ("Failed to create SDL semaphore\n");
+ SDL_DestroyMutex (s->mutex);
+ SDL_QuitSubSystem (SDL_INIT_AUDIO);
+ return NULL;
+ }
+
+ return s;
+}
+
+static void sdl_audio_fini (void *opaque)
+{
+ SDLAudioState *s = opaque;
+ sdl_close (s);
+ SDL_DestroySemaphore (s->sem);
+ SDL_DestroyMutex (s->mutex);
+ SDL_QuitSubSystem (SDL_INIT_AUDIO);
+}
+
+static struct audio_option sdl_options[] = {
+ {
+ .name = "SAMPLES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.nb_samples,
+ .descr = "Size of SDL buffer in samples"
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops sdl_pcm_ops = {
+ .init_out = sdl_init_out,
+ .fini_out = sdl_fini_out,
+ .run_out = sdl_run_out,
+ .write = sdl_write_out,
+ .ctl_out = sdl_ctl_out,
+};
+
+struct audio_driver sdl_audio_driver = {
+ .name = "sdl",
+ .descr = "SDL http://www.libsdl.org",
+ .options = sdl_options,
+ .init = sdl_audio_init,
+ .fini = sdl_audio_fini,
+ .pcm_ops = &sdl_pcm_ops,
+ .can_be_default = 1,
+ .max_voices_out = 1,
+ .max_voices_in = 0,
+ .voice_size_out = sizeof (SDLVoiceOut),
+ .voice_size_in = 0
+};
diff --git a/qemu-0.15.x/audio/spiceaudio.c b/qemu-0.15.x/audio/spiceaudio.c
new file mode 100644
index 0000000..f972110
--- /dev/null
+++ b/qemu-0.15.x/audio/spiceaudio.c
@@ -0,0 +1,345 @@
+/*
+ * Copyright (C) 2010 Red Hat, Inc.
+ *
+ * maintained by Gerd Hoffmann <kraxel(a)redhat.com>
+ *
+ * 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 or
+ * (at your option) version 3 of the License.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "hw/hw.h"
+#include "qemu-timer.h"
+#include "ui/qemu-spice.h"
+
+#define AUDIO_CAP "spice"
+#include "audio.h"
+#include "audio_int.h"
+
+#define LINE_IN_SAMPLES 1024
+#define LINE_OUT_SAMPLES 1024
+
+typedef struct SpiceRateCtl {
+ int64_t start_ticks;
+ int64_t bytes_sent;
+} SpiceRateCtl;
+
+typedef struct SpiceVoiceOut {
+ HWVoiceOut hw;
+ SpicePlaybackInstance sin;
+ SpiceRateCtl rate;
+ int active;
+ uint32_t *frame;
+ uint32_t *fpos;
+ uint32_t fsize;
+} SpiceVoiceOut;
+
+typedef struct SpiceVoiceIn {
+ HWVoiceIn hw;
+ SpiceRecordInstance sin;
+ SpiceRateCtl rate;
+ int active;
+ uint32_t samples[LINE_IN_SAMPLES];
+} SpiceVoiceIn;
+
+static const SpicePlaybackInterface playback_sif = {
+ .base.type = SPICE_INTERFACE_PLAYBACK,
+ .base.description = "playback",
+ .base.major_version = SPICE_INTERFACE_PLAYBACK_MAJOR,
+ .base.minor_version = SPICE_INTERFACE_PLAYBACK_MINOR,
+};
+
+static const SpiceRecordInterface record_sif = {
+ .base.type = SPICE_INTERFACE_RECORD,
+ .base.description = "record",
+ .base.major_version = SPICE_INTERFACE_RECORD_MAJOR,
+ .base.minor_version = SPICE_INTERFACE_RECORD_MINOR,
+};
+
+static void *spice_audio_init (void)
+{
+ if (!using_spice) {
+ return NULL;
+ }
+ return &spice_audio_init;
+}
+
+static void spice_audio_fini (void *opaque)
+{
+ /* nothing */
+}
+
+static void rate_start (SpiceRateCtl *rate)
+{
+ memset (rate, 0, sizeof (*rate));
+ rate->start_ticks = qemu_get_clock_ns (vm_clock);
+}
+
+static int rate_get_samples (struct audio_pcm_info *info, SpiceRateCtl *rate)
+{
+ int64_t now;
+ int64_t ticks;
+ int64_t bytes;
+ int64_t samples;
+
+ now = qemu_get_clock_ns (vm_clock);
+ ticks = now - rate->start_ticks;
+ bytes = muldiv64 (ticks, info->bytes_per_second, get_ticks_per_sec ());
+ samples = (bytes - rate->bytes_sent) >> info->shift;
+ if (samples < 0 || samples > 65536) {
+ fprintf (stderr, "Resetting rate control (%" PRId64 " samples)\n", samples);
+ rate_start (rate);
+ samples = 0;
+ }
+ rate->bytes_sent += samples << info->shift;
+ return samples;
+}
+
+/* playback */
+
+static int line_out_init (HWVoiceOut *hw, struct audsettings *as)
+{
+ SpiceVoiceOut *out = container_of (hw, SpiceVoiceOut, hw);
+ struct audsettings settings;
+
+ settings.freq = SPICE_INTERFACE_PLAYBACK_FREQ;
+ settings.nchannels = SPICE_INTERFACE_PLAYBACK_CHAN;
+ settings.fmt = AUD_FMT_S16;
+ settings.endianness = AUDIO_HOST_ENDIANNESS;
+
+ audio_pcm_init_info (&hw->info, &settings);
+ hw->samples = LINE_OUT_SAMPLES;
+ out->active = 0;
+
+ out->sin.base.sif = &playback_sif.base;
+ qemu_spice_add_interface (&out->sin.base);
+ return 0;
+}
+
+static void line_out_fini (HWVoiceOut *hw)
+{
+ SpiceVoiceOut *out = container_of (hw, SpiceVoiceOut, hw);
+
+ spice_server_remove_interface (&out->sin.base);
+}
+
+static int line_out_run (HWVoiceOut *hw, int live)
+{
+ SpiceVoiceOut *out = container_of (hw, SpiceVoiceOut, hw);
+ int rpos, decr;
+ int samples;
+
+ if (!live) {
+ return 0;
+ }
+
+ decr = rate_get_samples (&hw->info, &out->rate);
+ decr = audio_MIN (live, decr);
+
+ samples = decr;
+ rpos = hw->rpos;
+ while (samples) {
+ int left_till_end_samples = hw->samples - rpos;
+ int len = audio_MIN (samples, left_till_end_samples);
+
+ if (!out->frame) {
+ spice_server_playback_get_buffer (&out->sin, &out->frame, &out->fsize);
+ out->fpos = out->frame;
+ }
+ if (out->frame) {
+ len = audio_MIN (len, out->fsize);
+ hw->clip (out->fpos, hw->mix_buf + rpos, len);
+ out->fsize -= len;
+ out->fpos += len;
+ if (out->fsize == 0) {
+ spice_server_playback_put_samples (&out->sin, out->frame);
+ out->frame = out->fpos = NULL;
+ }
+ }
+ rpos = (rpos + len) % hw->samples;
+ samples -= len;
+ }
+ hw->rpos = rpos;
+ return decr;
+}
+
+static int line_out_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static int line_out_ctl (HWVoiceOut *hw, int cmd, ...)
+{
+ SpiceVoiceOut *out = container_of (hw, SpiceVoiceOut, hw);
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ if (out->active) {
+ break;
+ }
+ out->active = 1;
+ rate_start (&out->rate);
+ spice_server_playback_start (&out->sin);
+ break;
+ case VOICE_DISABLE:
+ if (!out->active) {
+ break;
+ }
+ out->active = 0;
+ if (out->frame) {
+ memset (out->fpos, 0, out->fsize << 2);
+ spice_server_playback_put_samples (&out->sin, out->frame);
+ out->frame = out->fpos = NULL;
+ }
+ spice_server_playback_stop (&out->sin);
+ break;
+ }
+ return 0;
+}
+
+/* record */
+
+static int line_in_init (HWVoiceIn *hw, struct audsettings *as)
+{
+ SpiceVoiceIn *in = container_of (hw, SpiceVoiceIn, hw);
+ struct audsettings settings;
+
+ settings.freq = SPICE_INTERFACE_RECORD_FREQ;
+ settings.nchannels = SPICE_INTERFACE_RECORD_CHAN;
+ settings.fmt = AUD_FMT_S16;
+ settings.endianness = AUDIO_HOST_ENDIANNESS;
+
+ audio_pcm_init_info (&hw->info, &settings);
+ hw->samples = LINE_IN_SAMPLES;
+ in->active = 0;
+
+ in->sin.base.sif = &record_sif.base;
+ qemu_spice_add_interface (&in->sin.base);
+ return 0;
+}
+
+static void line_in_fini (HWVoiceIn *hw)
+{
+ SpiceVoiceIn *in = container_of (hw, SpiceVoiceIn, hw);
+
+ spice_server_remove_interface (&in->sin.base);
+}
+
+static int line_in_run (HWVoiceIn *hw)
+{
+ SpiceVoiceIn *in = container_of (hw, SpiceVoiceIn, hw);
+ int num_samples;
+ int ready;
+ int len[2];
+ uint64_t delta_samp;
+ const uint32_t *samples;
+
+ if (!(num_samples = hw->samples - audio_pcm_hw_get_live_in (hw))) {
+ return 0;
+ }
+
+ delta_samp = rate_get_samples (&hw->info, &in->rate);
+ num_samples = audio_MIN (num_samples, delta_samp);
+
+ ready = spice_server_record_get_samples (&in->sin, in->samples, num_samples);
+ samples = in->samples;
+ if (ready == 0) {
+ static const uint32_t silence[LINE_IN_SAMPLES];
+ samples = silence;
+ ready = LINE_IN_SAMPLES;
+ }
+
+ num_samples = audio_MIN (ready, num_samples);
+
+ if (hw->wpos + num_samples > hw->samples) {
+ len[0] = hw->samples - hw->wpos;
+ len[1] = num_samples - len[0];
+ } else {
+ len[0] = num_samples;
+ len[1] = 0;
+ }
+
+ hw->conv (hw->conv_buf + hw->wpos, samples, len[0]);
+
+ if (len[1]) {
+ hw->conv (hw->conv_buf, samples + len[0], len[1]);
+ }
+
+ hw->wpos = (hw->wpos + num_samples) % hw->samples;
+
+ return num_samples;
+}
+
+static int line_in_read (SWVoiceIn *sw, void *buf, int size)
+{
+ return audio_pcm_sw_read (sw, buf, size);
+}
+
+static int line_in_ctl (HWVoiceIn *hw, int cmd, ...)
+{
+ SpiceVoiceIn *in = container_of (hw, SpiceVoiceIn, hw);
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ if (in->active) {
+ break;
+ }
+ in->active = 1;
+ rate_start (&in->rate);
+ spice_server_record_start (&in->sin);
+ break;
+ case VOICE_DISABLE:
+ if (!in->active) {
+ break;
+ }
+ in->active = 0;
+ spice_server_record_stop (&in->sin);
+ break;
+ }
+ return 0;
+}
+
+static struct audio_option audio_options[] = {
+ { /* end of list */ },
+};
+
+static struct audio_pcm_ops audio_callbacks = {
+ .init_out = line_out_init,
+ .fini_out = line_out_fini,
+ .run_out = line_out_run,
+ .write = line_out_write,
+ .ctl_out = line_out_ctl,
+
+ .init_in = line_in_init,
+ .fini_in = line_in_fini,
+ .run_in = line_in_run,
+ .read = line_in_read,
+ .ctl_in = line_in_ctl,
+};
+
+struct audio_driver spice_audio_driver = {
+ .name = "spice",
+ .descr = "spice audio driver",
+ .options = audio_options,
+ .init = spice_audio_init,
+ .fini = spice_audio_fini,
+ .pcm_ops = &audio_callbacks,
+ .max_voices_out = 1,
+ .max_voices_in = 1,
+ .voice_size_out = sizeof (SpiceVoiceOut),
+ .voice_size_in = sizeof (SpiceVoiceIn),
+};
+
+void qemu_spice_audio_init (void)
+{
+ spice_audio_driver.can_be_default = 1;
+}
diff --git a/qemu-0.15.x/audio/wavaudio.c b/qemu-0.15.x/audio/wavaudio.c
new file mode 100644
index 0000000..294f357
--- /dev/null
+++ b/qemu-0.15.x/audio/wavaudio.c
@@ -0,0 +1,262 @@
+/*
+ * QEMU WAV audio driver
+ *
+ * Copyright (c) 2004-2005 Vassili Karpov (malc)
+ *
+ * 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.
+ */
+#include "hw/hw.h"
+#include "qemu-timer.h"
+#include "audio.h"
+
+#define AUDIO_CAP "wav"
+#include "audio_int.h"
+
+typedef struct WAVVoiceOut {
+ HWVoiceOut hw;
+ QEMUFile *f;
+ int64_t old_ticks;
+ void *pcm_buf;
+ int total_samples;
+} WAVVoiceOut;
+
+static struct {
+ struct audsettings settings;
+ const char *wav_path;
+} conf = {
+ .settings.freq = 44100,
+ .settings.nchannels = 2,
+ .settings.fmt = AUD_FMT_S16,
+ .wav_path = "qemu.wav"
+};
+
+static int wav_run_out (HWVoiceOut *hw, int live)
+{
+ WAVVoiceOut *wav = (WAVVoiceOut *) hw;
+ int rpos, decr, samples;
+ uint8_t *dst;
+ struct st_sample *src;
+ int64_t now = qemu_get_clock_ns (vm_clock);
+ int64_t ticks = now - wav->old_ticks;
+ int64_t bytes =
+ muldiv64 (ticks, hw->info.bytes_per_second, get_ticks_per_sec ());
+
+ if (bytes > INT_MAX) {
+ samples = INT_MAX >> hw->info.shift;
+ }
+ else {
+ samples = bytes >> hw->info.shift;
+ }
+
+ wav->old_ticks = now;
+ decr = audio_MIN (live, samples);
+ samples = decr;
+ rpos = hw->rpos;
+ while (samples) {
+ int left_till_end_samples = hw->samples - rpos;
+ int convert_samples = audio_MIN (samples, left_till_end_samples);
+
+ src = hw->mix_buf + rpos;
+ dst = advance (wav->pcm_buf, rpos << hw->info.shift);
+
+ hw->clip (dst, src, convert_samples);
+ qemu_put_buffer (wav->f, dst, convert_samples << hw->info.shift);
+
+ rpos = (rpos + convert_samples) % hw->samples;
+ samples -= convert_samples;
+ wav->total_samples += convert_samples;
+ }
+
+ hw->rpos = rpos;
+ return decr;
+}
+
+static int wav_write_out (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+/* VICE code: Store number as little endian. */
+static void le_store (uint8_t *buf, uint32_t val, int len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ buf[i] = (uint8_t) (val & 0xff);
+ val >>= 8;
+ }
+}
+
+static int wav_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ WAVVoiceOut *wav = (WAVVoiceOut *) hw;
+ int bits16 = 0, stereo = 0;
+ uint8_t hdr[] = {
+ 0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56,
+ 0x45, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04,
+ 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00
+ };
+ struct audsettings wav_as = conf.settings;
+
+ (void) as;
+
+ stereo = wav_as.nchannels == 2;
+ switch (wav_as.fmt) {
+ case AUD_FMT_S8:
+ case AUD_FMT_U8:
+ bits16 = 0;
+ break;
+
+ case AUD_FMT_S16:
+ case AUD_FMT_U16:
+ bits16 = 1;
+ break;
+
+ case AUD_FMT_S32:
+ case AUD_FMT_U32:
+ dolog ("WAVE files can not handle 32bit formats\n");
+ return -1;
+ }
+
+ hdr[34] = bits16 ? 0x10 : 0x08;
+
+ wav_as.endianness = 0;
+ audio_pcm_init_info (&hw->info, &wav_as);
+
+ hw->samples = 1024;
+ wav->pcm_buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
+ if (!wav->pcm_buf) {
+ dolog ("Could not allocate buffer (%d bytes)\n",
+ hw->samples << hw->info.shift);
+ return -1;
+ }
+
+ le_store (hdr + 22, hw->info.nchannels, 2);
+ le_store (hdr + 24, hw->info.freq, 4);
+ le_store (hdr + 28, hw->info.freq << (bits16 + stereo), 4);
+ le_store (hdr + 32, 1 << (bits16 + stereo), 2);
+
+ wav->f = qemu_fopen (conf.wav_path, "wb");
+ if (!wav->f) {
+ dolog ("Failed to open wave file `%s'\nReason: %s\n",
+ conf.wav_path, strerror (errno));
+ qemu_free (wav->pcm_buf);
+ wav->pcm_buf = NULL;
+ return -1;
+ }
+
+ qemu_put_buffer (wav->f, hdr, sizeof (hdr));
+ return 0;
+}
+
+static void wav_fini_out (HWVoiceOut *hw)
+{
+ WAVVoiceOut *wav = (WAVVoiceOut *) hw;
+ uint8_t rlen[4];
+ uint8_t dlen[4];
+ uint32_t datalen = wav->total_samples << hw->info.shift;
+ uint32_t rifflen = datalen + 36;
+
+ if (!wav->f) {
+ return;
+ }
+
+ le_store (rlen, rifflen, 4);
+ le_store (dlen, datalen, 4);
+
+ qemu_fseek (wav->f, 4, SEEK_SET);
+ qemu_put_buffer (wav->f, rlen, 4);
+
+ qemu_fseek (wav->f, 32, SEEK_CUR);
+ qemu_put_buffer (wav->f, dlen, 4);
+
+ qemu_fclose (wav->f);
+ wav->f = NULL;
+
+ qemu_free (wav->pcm_buf);
+ wav->pcm_buf = NULL;
+}
+
+static int wav_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ (void) hw;
+ (void) cmd;
+ return 0;
+}
+
+static void *wav_audio_init (void)
+{
+ return &conf;
+}
+
+static void wav_audio_fini (void *opaque)
+{
+ (void) opaque;
+ ldebug ("wav_fini");
+}
+
+static struct audio_option wav_options[] = {
+ {
+ .name = "FREQUENCY",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.settings.freq,
+ .descr = "Frequency"
+ },
+ {
+ .name = "FORMAT",
+ .tag = AUD_OPT_FMT,
+ .valp = &conf.settings.fmt,
+ .descr = "Format"
+ },
+ {
+ .name = "DAC_FIXED_CHANNELS",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.settings.nchannels,
+ .descr = "Number of channels (1 - mono, 2 - stereo)"
+ },
+ {
+ .name = "PATH",
+ .tag = AUD_OPT_STR,
+ .valp = &conf.wav_path,
+ .descr = "Path to wave file"
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops wav_pcm_ops = {
+ .init_out = wav_init_out,
+ .fini_out = wav_fini_out,
+ .run_out = wav_run_out,
+ .write = wav_write_out,
+ .ctl_out = wav_ctl_out,
+};
+
+struct audio_driver wav_audio_driver = {
+ .name = "wav",
+ .descr = "WAV renderer http://wikipedia.org/wiki/WAV",
+ .options = wav_options,
+ .init = wav_audio_init,
+ .fini = wav_audio_fini,
+ .pcm_ops = &wav_pcm_ops,
+ .can_be_default = 0,
+ .max_voices_out = 1,
+ .max_voices_in = 0,
+ .voice_size_out = sizeof (WAVVoiceOut),
+ .voice_size_in = 0
+};
diff --git a/qemu-0.15.x/audio/wavcapture.c b/qemu-0.15.x/audio/wavcapture.c
new file mode 100644
index 0000000..1f49cd1
--- /dev/null
+++ b/qemu-0.15.x/audio/wavcapture.c
@@ -0,0 +1,161 @@
+#include "hw/hw.h"
+#include "monitor.h"
+#include "audio.h"
+
+typedef struct {
+ QEMUFile *f;
+ int bytes;
+ char *path;
+ int freq;
+ int bits;
+ int nchannels;
+ CaptureVoiceOut *cap;
+} WAVState;
+
+/* VICE code: Store number as little endian. */
+static void le_store (uint8_t *buf, uint32_t val, int len)
+{
+ int i;
+ for (i = 0; i < len; i++) {
+ buf[i] = (uint8_t) (val & 0xff);
+ val >>= 8;
+ }
+}
+
+static void wav_notify (void *opaque, audcnotification_e cmd)
+{
+ (void) opaque;
+ (void) cmd;
+}
+
+static void wav_destroy (void *opaque)
+{
+ WAVState *wav = opaque;
+ uint8_t rlen[4];
+ uint8_t dlen[4];
+ uint32_t datalen = wav->bytes;
+ uint32_t rifflen = datalen + 36;
+
+ if (wav->f) {
+ le_store (rlen, rifflen, 4);
+ le_store (dlen, datalen, 4);
+
+ qemu_fseek (wav->f, 4, SEEK_SET);
+ qemu_put_buffer (wav->f, rlen, 4);
+
+ qemu_fseek (wav->f, 32, SEEK_CUR);
+ qemu_put_buffer (wav->f, dlen, 4);
+ qemu_fclose (wav->f);
+ }
+
+ qemu_free (wav->path);
+}
+
+static void wav_capture (void *opaque, void *buf, int size)
+{
+ WAVState *wav = opaque;
+
+ qemu_put_buffer (wav->f, buf, size);
+ wav->bytes += size;
+}
+
+static void wav_capture_destroy (void *opaque)
+{
+ WAVState *wav = opaque;
+
+ AUD_del_capture (wav->cap, wav);
+}
+
+static void wav_capture_info (void *opaque)
+{
+ WAVState *wav = opaque;
+ char *path = wav->path;
+
+ monitor_printf(cur_mon, "Capturing audio(%d,%d,%d) to %s: %d bytes\n",
+ wav->freq, wav->bits, wav->nchannels,
+ path ? path : "<not available>", wav->bytes);
+}
+
+static struct capture_ops wav_capture_ops = {
+ .destroy = wav_capture_destroy,
+ .info = wav_capture_info
+};
+
+int wav_start_capture (CaptureState *s, const char *path, int freq,
+ int bits, int nchannels)
+{
+ Monitor *mon = cur_mon;
+ WAVState *wav;
+ uint8_t hdr[] = {
+ 0x52, 0x49, 0x46, 0x46, 0x00, 0x00, 0x00, 0x00, 0x57, 0x41, 0x56,
+ 0x45, 0x66, 0x6d, 0x74, 0x20, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x02, 0x00, 0x44, 0xac, 0x00, 0x00, 0x10, 0xb1, 0x02, 0x00, 0x04,
+ 0x00, 0x10, 0x00, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00
+ };
+ struct audsettings as;
+ struct audio_capture_ops ops;
+ int stereo, bits16, shift;
+ CaptureVoiceOut *cap;
+
+ if (bits != 8 && bits != 16) {
+ monitor_printf(mon, "incorrect bit count %d, must be 8 or 16\n", bits);
+ return -1;
+ }
+
+ if (nchannels != 1 && nchannels != 2) {
+ monitor_printf(mon, "incorrect channel count %d, must be 1 or 2\n",
+ nchannels);
+ return -1;
+ }
+
+ stereo = nchannels == 2;
+ bits16 = bits == 16;
+
+ as.freq = freq;
+ as.nchannels = 1 << stereo;
+ as.fmt = bits16 ? AUD_FMT_S16 : AUD_FMT_U8;
+ as.endianness = 0;
+
+ ops.notify = wav_notify;
+ ops.capture = wav_capture;
+ ops.destroy = wav_destroy;
+
+ wav = qemu_mallocz (sizeof (*wav));
+
+ shift = bits16 + stereo;
+ hdr[34] = bits16 ? 0x10 : 0x08;
+
+ le_store (hdr + 22, as.nchannels, 2);
+ le_store (hdr + 24, freq, 4);
+ le_store (hdr + 28, freq << shift, 4);
+ le_store (hdr + 32, 1 << shift, 2);
+
+ wav->f = qemu_fopen (path, "wb");
+ if (!wav->f) {
+ monitor_printf(mon, "Failed to open wave file `%s'\nReason: %s\n",
+ path, strerror (errno));
+ qemu_free (wav);
+ return -1;
+ }
+
+ wav->path = qemu_strdup (path);
+ wav->bits = bits;
+ wav->nchannels = nchannels;
+ wav->freq = freq;
+
+ qemu_put_buffer (wav->f, hdr, sizeof (hdr));
+
+ cap = AUD_add_capture (&as, &ops, wav);
+ if (!cap) {
+ monitor_printf(mon, "Failed to add audio capture\n");
+ qemu_free (wav->path);
+ qemu_fclose (wav->f);
+ qemu_free (wav);
+ return -1;
+ }
+
+ wav->cap = cap;
+ s->opaque = wav;
+ s->ops = wav_capture_ops;
+ return 0;
+}
diff --git a/qemu-0.15.x/audio/winwaveaudio.c b/qemu-0.15.x/audio/winwaveaudio.c
new file mode 100644
index 0000000..e5ad3c6
--- /dev/null
+++ b/qemu-0.15.x/audio/winwaveaudio.c
@@ -0,0 +1,723 @@
+/* public domain */
+
+#include "qemu-common.h"
+#include "sysemu.h"
+#include "audio.h"
+
+#define AUDIO_CAP "winwave"
+#include "audio_int.h"
+
+#include <windows.h>
+#include <mmsystem.h>
+
+#include "audio_win_int.h"
+
+static struct {
+ int dac_headers;
+ int dac_samples;
+ int adc_headers;
+ int adc_samples;
+} conf = {
+ .dac_headers = 4,
+ .dac_samples = 1024,
+ .adc_headers = 4,
+ .adc_samples = 1024
+};
+
+typedef struct {
+ HWVoiceOut hw;
+ HWAVEOUT hwo;
+ WAVEHDR *hdrs;
+ HANDLE event;
+ void *pcm_buf;
+ int avail;
+ int pending;
+ int curhdr;
+ int paused;
+ CRITICAL_SECTION crit_sect;
+} WaveVoiceOut;
+
+typedef struct {
+ HWVoiceIn hw;
+ HWAVEIN hwi;
+ WAVEHDR *hdrs;
+ HANDLE event;
+ void *pcm_buf;
+ int curhdr;
+ int paused;
+ int rpos;
+ int avail;
+ CRITICAL_SECTION crit_sect;
+} WaveVoiceIn;
+
+static void winwave_log_mmresult (MMRESULT mr)
+{
+ const char *str = "BUG";
+
+ switch (mr) {
+ case MMSYSERR_NOERROR:
+ str = "Success";
+ break;
+
+ case MMSYSERR_INVALHANDLE:
+ str = "Specified device handle is invalid";
+ break;
+
+ case MMSYSERR_BADDEVICEID:
+ str = "Specified device id is out of range";
+ break;
+
+ case MMSYSERR_NODRIVER:
+ str = "No device driver is present";
+ break;
+
+ case MMSYSERR_NOMEM:
+ str = "Unable to allocate or locl memory";
+ break;
+
+ case WAVERR_SYNC:
+ str = "Device is synchronous but waveOutOpen was called "
+ "without using the WINWAVE_ALLOWSYNC flag";
+ break;
+
+ case WAVERR_UNPREPARED:
+ str = "The data block pointed to by the pwh parameter "
+ "hasn't been prepared";
+ break;
+
+ case WAVERR_STILLPLAYING:
+ str = "There are still buffers in the queue";
+ break;
+
+ default:
+ dolog ("Reason: Unknown (MMRESULT %#x)\n", mr);
+ return;
+ }
+
+ dolog ("Reason: %s\n", str);
+}
+
+static void GCC_FMT_ATTR (2, 3) winwave_logerr (
+ MMRESULT mr,
+ const char *fmt,
+ ...
+ )
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ AUD_vlog (AUDIO_CAP, fmt, ap);
+ va_end (ap);
+
+ AUD_log (NULL, " failed\n");
+ winwave_log_mmresult (mr);
+}
+
+static void winwave_anal_close_out (WaveVoiceOut *wave)
+{
+ MMRESULT mr;
+
+ mr = waveOutClose (wave->hwo);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutClose");
+ }
+ wave->hwo = NULL;
+}
+
+static void CALLBACK winwave_callback_out (
+ HWAVEOUT hwo,
+ UINT msg,
+ DWORD_PTR dwInstance,
+ DWORD_PTR dwParam1,
+ DWORD_PTR dwParam2
+ )
+{
+ WaveVoiceOut *wave = (WaveVoiceOut *) dwInstance;
+
+ switch (msg) {
+ case WOM_DONE:
+ {
+ WAVEHDR *h = (WAVEHDR *) dwParam1;
+ if (!h->dwUser) {
+ h->dwUser = 1;
+ EnterCriticalSection (&wave->crit_sect);
+ {
+ wave->avail += conf.dac_samples;
+ }
+ LeaveCriticalSection (&wave->crit_sect);
+ if (wave->hw.poll_mode) {
+ if (!SetEvent (wave->event)) {
+ dolog ("DAC SetEvent failed %lx\n", GetLastError ());
+ }
+ }
+ }
+ }
+ break;
+
+ case WOM_CLOSE:
+ case WOM_OPEN:
+ break;
+
+ default:
+ dolog ("unknown wave out callback msg %x\n", msg);
+ }
+}
+
+static int winwave_init_out (HWVoiceOut *hw, struct audsettings *as)
+{
+ int i;
+ int err;
+ MMRESULT mr;
+ WAVEFORMATEX wfx;
+ WaveVoiceOut *wave;
+
+ wave = (WaveVoiceOut *) hw;
+
+ InitializeCriticalSection (&wave->crit_sect);
+
+ err = waveformat_from_audio_settings (&wfx, as);
+ if (err) {
+ goto err0;
+ }
+
+ mr = waveOutOpen (&wave->hwo, WAVE_MAPPER, &wfx,
+ (DWORD_PTR) winwave_callback_out,
+ (DWORD_PTR) wave, CALLBACK_FUNCTION);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutOpen");
+ goto err1;
+ }
+
+ wave->hdrs = audio_calloc (AUDIO_FUNC, conf.dac_headers,
+ sizeof (*wave->hdrs));
+ if (!wave->hdrs) {
+ goto err2;
+ }
+
+ audio_pcm_init_info (&hw->info, as);
+ hw->samples = conf.dac_samples * conf.dac_headers;
+ wave->avail = hw->samples;
+
+ wave->pcm_buf = audio_calloc (AUDIO_FUNC, conf.dac_samples,
+ conf.dac_headers << hw->info.shift);
+ if (!wave->pcm_buf) {
+ goto err3;
+ }
+
+ for (i = 0; i < conf.dac_headers; ++i) {
+ WAVEHDR *h = &wave->hdrs[i];
+
+ h->dwUser = 0;
+ h->dwBufferLength = conf.dac_samples << hw->info.shift;
+ h->lpData = advance (wave->pcm_buf, i * h->dwBufferLength);
+ h->dwFlags = 0;
+
+ mr = waveOutPrepareHeader (wave->hwo, h, sizeof (*h));
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutPrepareHeader(%d)", i);
+ goto err4;
+ }
+ }
+
+ return 0;
+
+ err4:
+ qemu_free (wave->pcm_buf);
+ err3:
+ qemu_free (wave->hdrs);
+ err2:
+ winwave_anal_close_out (wave);
+ err1:
+ err0:
+ return -1;
+}
+
+static int winwave_write (SWVoiceOut *sw, void *buf, int len)
+{
+ return audio_pcm_sw_write (sw, buf, len);
+}
+
+static int winwave_run_out (HWVoiceOut *hw, int live)
+{
+ WaveVoiceOut *wave = (WaveVoiceOut *) hw;
+ int decr;
+ int doreset;
+
+ EnterCriticalSection (&wave->crit_sect);
+ {
+ decr = audio_MIN (live, wave->avail);
+ decr = audio_pcm_hw_clip_out (hw, wave->pcm_buf, decr, wave->pending);
+ wave->pending += decr;
+ wave->avail -= decr;
+ }
+ LeaveCriticalSection (&wave->crit_sect);
+
+ doreset = hw->poll_mode && (wave->pending >= conf.dac_samples);
+ if (doreset && !ResetEvent (wave->event)) {
+ dolog ("DAC ResetEvent failed %lx\n", GetLastError ());
+ }
+
+ while (wave->pending >= conf.dac_samples) {
+ MMRESULT mr;
+ WAVEHDR *h = &wave->hdrs[wave->curhdr];
+
+ h->dwUser = 0;
+ mr = waveOutWrite (wave->hwo, h, sizeof (*h));
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutWrite(%d)", wave->curhdr);
+ break;
+ }
+
+ wave->pending -= conf.dac_samples;
+ wave->curhdr = (wave->curhdr + 1) % conf.dac_headers;
+ }
+
+ return decr;
+}
+
+static void winwave_poll (void *opaque)
+{
+ (void) opaque;
+ audio_run ("winwave_poll");
+}
+
+static void winwave_fini_out (HWVoiceOut *hw)
+{
+ int i;
+ MMRESULT mr;
+ WaveVoiceOut *wave = (WaveVoiceOut *) hw;
+
+ mr = waveOutReset (wave->hwo);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutReset");
+ }
+
+ for (i = 0; i < conf.dac_headers; ++i) {
+ mr = waveOutUnprepareHeader (wave->hwo, &wave->hdrs[i],
+ sizeof (wave->hdrs[i]));
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutUnprepareHeader(%d)", i);
+ }
+ }
+
+ winwave_anal_close_out (wave);
+
+ if (wave->event) {
+ qemu_del_wait_object (wave->event, winwave_poll, wave);
+ if (!CloseHandle (wave->event)) {
+ dolog ("DAC CloseHandle failed %lx\n", GetLastError ());
+ }
+ wave->event = NULL;
+ }
+
+ qemu_free (wave->pcm_buf);
+ wave->pcm_buf = NULL;
+
+ qemu_free (wave->hdrs);
+ wave->hdrs = NULL;
+}
+
+static int winwave_ctl_out (HWVoiceOut *hw, int cmd, ...)
+{
+ MMRESULT mr;
+ WaveVoiceOut *wave = (WaveVoiceOut *) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ {
+ va_list ap;
+ int poll_mode;
+
+ va_start (ap, cmd);
+ poll_mode = va_arg (ap, int);
+ va_end (ap);
+
+ if (poll_mode && !wave->event) {
+ wave->event = CreateEvent (NULL, TRUE, TRUE, NULL);
+ if (!wave->event) {
+ dolog ("DAC CreateEvent: %lx, poll mode will be disabled\n",
+ GetLastError ());
+ }
+ }
+
+ if (wave->event) {
+ int ret;
+
+ ret = qemu_add_wait_object (wave->event, winwave_poll, wave);
+ hw->poll_mode = (ret == 0);
+ }
+ else {
+ hw->poll_mode = 0;
+ }
+ if (wave->paused) {
+ mr = waveOutRestart (wave->hwo);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutRestart");
+ }
+ wave->paused = 0;
+ }
+ }
+ return 0;
+
+ case VOICE_DISABLE:
+ if (!wave->paused) {
+ mr = waveOutPause (wave->hwo);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveOutPause");
+ }
+ else {
+ wave->paused = 1;
+ }
+ }
+ if (wave->event) {
+ qemu_del_wait_object (wave->event, winwave_poll, wave);
+ }
+ return 0;
+ }
+ return -1;
+}
+
+static void winwave_anal_close_in (WaveVoiceIn *wave)
+{
+ MMRESULT mr;
+
+ mr = waveInClose (wave->hwi);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveInClose");
+ }
+ wave->hwi = NULL;
+}
+
+static void CALLBACK winwave_callback_in (
+ HWAVEIN *hwi,
+ UINT msg,
+ DWORD_PTR dwInstance,
+ DWORD_PTR dwParam1,
+ DWORD_PTR dwParam2
+ )
+{
+ WaveVoiceIn *wave = (WaveVoiceIn *) dwInstance;
+
+ switch (msg) {
+ case WIM_DATA:
+ {
+ WAVEHDR *h = (WAVEHDR *) dwParam1;
+ if (!h->dwUser) {
+ h->dwUser = 1;
+ EnterCriticalSection (&wave->crit_sect);
+ {
+ wave->avail += conf.adc_samples;
+ }
+ LeaveCriticalSection (&wave->crit_sect);
+ if (wave->hw.poll_mode) {
+ if (!SetEvent (wave->event)) {
+ dolog ("ADC SetEvent failed %lx\n", GetLastError ());
+ }
+ }
+ }
+ }
+ break;
+
+ case WIM_CLOSE:
+ case WIM_OPEN:
+ break;
+
+ default:
+ dolog ("unknown wave in callback msg %x\n", msg);
+ }
+}
+
+static void winwave_add_buffers (WaveVoiceIn *wave, int samples)
+{
+ int doreset;
+
+ doreset = wave->hw.poll_mode && (samples >= conf.adc_samples);
+ if (doreset && !ResetEvent (wave->event)) {
+ dolog ("ADC ResetEvent failed %lx\n", GetLastError ());
+ }
+
+ while (samples >= conf.adc_samples) {
+ MMRESULT mr;
+ WAVEHDR *h = &wave->hdrs[wave->curhdr];
+
+ h->dwUser = 0;
+ mr = waveInAddBuffer (wave->hwi, h, sizeof (*h));
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveInAddBuffer(%d)", wave->curhdr);
+ }
+ wave->curhdr = (wave->curhdr + 1) % conf.adc_headers;
+ samples -= conf.adc_samples;
+ }
+}
+
+static int winwave_init_in (HWVoiceIn *hw, struct audsettings *as)
+{
+ int i;
+ int err;
+ MMRESULT mr;
+ WAVEFORMATEX wfx;
+ WaveVoiceIn *wave;
+
+ wave = (WaveVoiceIn *) hw;
+
+ InitializeCriticalSection (&wave->crit_sect);
+
+ err = waveformat_from_audio_settings (&wfx, as);
+ if (err) {
+ goto err0;
+ }
+
+ mr = waveInOpen (&wave->hwi, WAVE_MAPPER, &wfx,
+ (DWORD_PTR) winwave_callback_in,
+ (DWORD_PTR) wave, CALLBACK_FUNCTION);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveInOpen");
+ goto err1;
+ }
+
+ wave->hdrs = audio_calloc (AUDIO_FUNC, conf.dac_headers,
+ sizeof (*wave->hdrs));
+ if (!wave->hdrs) {
+ goto err2;
+ }
+
+ audio_pcm_init_info (&hw->info, as);
+ hw->samples = conf.adc_samples * conf.adc_headers;
+ wave->avail = 0;
+
+ wave->pcm_buf = audio_calloc (AUDIO_FUNC, conf.adc_samples,
+ conf.adc_headers << hw->info.shift);
+ if (!wave->pcm_buf) {
+ goto err3;
+ }
+
+ for (i = 0; i < conf.adc_headers; ++i) {
+ WAVEHDR *h = &wave->hdrs[i];
+
+ h->dwUser = 0;
+ h->dwBufferLength = conf.adc_samples << hw->info.shift;
+ h->lpData = advance (wave->pcm_buf, i * h->dwBufferLength);
+ h->dwFlags = 0;
+
+ mr = waveInPrepareHeader (wave->hwi, h, sizeof (*h));
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveInPrepareHeader(%d)", i);
+ goto err4;
+ }
+ }
+
+ wave->paused = 1;
+ winwave_add_buffers (wave, hw->samples);
+ return 0;
+
+ err4:
+ qemu_free (wave->pcm_buf);
+ err3:
+ qemu_free (wave->hdrs);
+ err2:
+ winwave_anal_close_in (wave);
+ err1:
+ err0:
+ return -1;
+}
+
+static void winwave_fini_in (HWVoiceIn *hw)
+{
+ int i;
+ MMRESULT mr;
+ WaveVoiceIn *wave = (WaveVoiceIn *) hw;
+
+ mr = waveInReset (wave->hwi);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveInReset");
+ }
+
+ for (i = 0; i < conf.adc_headers; ++i) {
+ mr = waveInUnprepareHeader (wave->hwi, &wave->hdrs[i],
+ sizeof (wave->hdrs[i]));
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveInUnprepareHeader(%d)", i);
+ }
+ }
+
+ winwave_anal_close_in (wave);
+
+ if (wave->event) {
+ qemu_del_wait_object (wave->event, winwave_poll, wave);
+ if (!CloseHandle (wave->event)) {
+ dolog ("ADC CloseHandle failed %lx\n", GetLastError ());
+ }
+ wave->event = NULL;
+ }
+
+ qemu_free (wave->pcm_buf);
+ wave->pcm_buf = NULL;
+
+ qemu_free (wave->hdrs);
+ wave->hdrs = NULL;
+}
+
+static int winwave_run_in (HWVoiceIn *hw)
+{
+ WaveVoiceIn *wave = (WaveVoiceIn *) hw;
+ int live = audio_pcm_hw_get_live_in (hw);
+ int dead = hw->samples - live;
+ int decr, ret;
+
+ if (!dead) {
+ return 0;
+ }
+
+ EnterCriticalSection (&wave->crit_sect);
+ {
+ decr = audio_MIN (dead, wave->avail);
+ wave->avail -= decr;
+ }
+ LeaveCriticalSection (&wave->crit_sect);
+
+ ret = decr;
+ while (decr) {
+ int left = hw->samples - hw->wpos;
+ int conv = audio_MIN (left, decr);
+ hw->conv (hw->conv_buf + hw->wpos,
+ advance (wave->pcm_buf, wave->rpos << hw->info.shift),
+ conv);
+
+ wave->rpos = (wave->rpos + conv) % hw->samples;
+ hw->wpos = (hw->wpos + conv) % hw->samples;
+ decr -= conv;
+ }
+
+ winwave_add_buffers (wave, ret);
+ return ret;
+}
+
+static int winwave_read (SWVoiceIn *sw, void *buf, int size)
+{
+ return audio_pcm_sw_read (sw, buf, size);
+}
+
+static int winwave_ctl_in (HWVoiceIn *hw, int cmd, ...)
+{
+ MMRESULT mr;
+ WaveVoiceIn *wave = (WaveVoiceIn *) hw;
+
+ switch (cmd) {
+ case VOICE_ENABLE:
+ {
+ va_list ap;
+ int poll_mode;
+
+ va_start (ap, cmd);
+ poll_mode = va_arg (ap, int);
+ va_end (ap);
+
+ if (poll_mode && !wave->event) {
+ wave->event = CreateEvent (NULL, TRUE, TRUE, NULL);
+ if (!wave->event) {
+ dolog ("ADC CreateEvent: %lx, poll mode will be disabled\n",
+ GetLastError ());
+ }
+ }
+
+ if (wave->event) {
+ int ret;
+
+ ret = qemu_add_wait_object (wave->event, winwave_poll, wave);
+ hw->poll_mode = (ret == 0);
+ }
+ else {
+ hw->poll_mode = 0;
+ }
+ if (wave->paused) {
+ mr = waveInStart (wave->hwi);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveInStart");
+ }
+ wave->paused = 0;
+ }
+ }
+ return 0;
+
+ case VOICE_DISABLE:
+ if (!wave->paused) {
+ mr = waveInStop (wave->hwi);
+ if (mr != MMSYSERR_NOERROR) {
+ winwave_logerr (mr, "waveInStop");
+ }
+ else {
+ wave->paused = 1;
+ }
+ }
+ if (wave->event) {
+ qemu_del_wait_object (wave->event, winwave_poll, wave);
+ }
+ return 0;
+ }
+ return 0;
+}
+
+static void *winwave_audio_init (void)
+{
+ return &conf;
+}
+
+static void winwave_audio_fini (void *opaque)
+{
+ (void) opaque;
+}
+
+static struct audio_option winwave_options[] = {
+ {
+ .name = "DAC_HEADERS",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.dac_headers,
+ .descr = "DAC number of headers",
+ },
+ {
+ .name = "DAC_SAMPLES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.dac_samples,
+ .descr = "DAC number of samples per header",
+ },
+ {
+ .name = "ADC_HEADERS",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.adc_headers,
+ .descr = "ADC number of headers",
+ },
+ {
+ .name = "ADC_SAMPLES",
+ .tag = AUD_OPT_INT,
+ .valp = &conf.adc_samples,
+ .descr = "ADC number of samples per header",
+ },
+ { /* End of list */ }
+};
+
+static struct audio_pcm_ops winwave_pcm_ops = {
+ .init_out = winwave_init_out,
+ .fini_out = winwave_fini_out,
+ .run_out = winwave_run_out,
+ .write = winwave_write,
+ .ctl_out = winwave_ctl_out,
+ .init_in = winwave_init_in,
+ .fini_in = winwave_fini_in,
+ .run_in = winwave_run_in,
+ .read = winwave_read,
+ .ctl_in = winwave_ctl_in
+};
+
+struct audio_driver winwave_audio_driver = {
+ .name = "winwave",
+ .descr = "Windows Waveform Audio http://msdn.microsoft.com",
+ .options = winwave_options,
+ .init = winwave_audio_init,
+ .fini = winwave_audio_fini,
+ .pcm_ops = &winwave_pcm_ops,
+ .can_be_default = 1,
+ .max_voices_out = INT_MAX,
+ .max_voices_in = INT_MAX,
+ .voice_size_out = sizeof (WaveVoiceOut),
+ .voice_size_in = sizeof (WaveVoiceIn)
+};
diff --git a/qemu-0.15.x/balloon.c b/qemu-0.15.x/balloon.c
new file mode 100644
index 0000000..f56fdc1
--- /dev/null
+++ b/qemu-0.15.x/balloon.c
@@ -0,0 +1,164 @@
+/*
+ * Generic Balloon handlers and management
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ * Copyright (C) 2011 Red Hat, Inc.
+ * Copyright (C) 2011 Amit Shah <amit.shah(a)redhat.com>
+ *
+ * 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.
+ */
+
+#include "monitor.h"
+#include "qjson.h"
+#include "qint.h"
+#include "cpu-common.h"
+#include "kvm.h"
+#include "balloon.h"
+#include "trace.h"
+
+static QEMUBalloonEvent *balloon_event_fn;
+static QEMUBalloonStatus *balloon_stat_fn;
+static void *balloon_opaque;
+
+int qemu_add_balloon_handler(QEMUBalloonEvent *event_func,
+ QEMUBalloonStatus *stat_func, void *opaque)
+{
+ if (balloon_event_fn || balloon_stat_fn || balloon_opaque) {
+ /* We're already registered one balloon handler. How many can
+ * a guest really have?
+ */
+ error_report("Another balloon device already registered");
+ return -1;
+ }
+ balloon_event_fn = event_func;
+ balloon_stat_fn = stat_func;
+ balloon_opaque = opaque;
+ return 0;
+}
+
+static int qemu_balloon(ram_addr_t target)
+{
+ if (!balloon_event_fn) {
+ return 0;
+ }
+ trace_balloon_event(balloon_opaque, target);
+ balloon_event_fn(balloon_opaque, target);
+ return 1;
+}
+
+static int qemu_balloon_status(MonitorCompletion cb, void *opaque)
+{
+ if (!balloon_stat_fn) {
+ return 0;
+ }
+ balloon_stat_fn(balloon_opaque, cb, opaque);
+ return 1;
+}
+
+static void print_balloon_stat(const char *key, QObject *obj, void *opaque)
+{
+ Monitor *mon = opaque;
+
+ if (strcmp(key, "actual")) {
+ monitor_printf(mon, ",%s=%" PRId64, key,
+ qint_get_int(qobject_to_qint(obj)));
+ }
+}
+
+void monitor_print_balloon(Monitor *mon, const QObject *data)
+{
+ QDict *qdict;
+
+ qdict = qobject_to_qdict(data);
+ if (!qdict_haskey(qdict, "actual")) {
+ return;
+ }
+ monitor_printf(mon, "balloon: actual=%" PRId64,
+ qdict_get_int(qdict, "actual") >> 20);
+ qdict_iter(qdict, print_balloon_stat, mon);
+ monitor_printf(mon, "\n");
+}
+
+/**
+ * do_info_balloon(): Balloon information
+ *
+ * Make an asynchronous request for balloon info. When the request completes
+ * a QDict will be returned according to the following specification:
+ *
+ * - "actual": current balloon value in bytes
+ * The following fields may or may not be present:
+ * - "mem_swapped_in": Amount of memory swapped in (bytes)
+ * - "mem_swapped_out": Amount of memory swapped out (bytes)
+ * - "major_page_faults": Number of major faults
+ * - "minor_page_faults": Number of minor faults
+ * - "free_mem": Total amount of free and unused memory (bytes)
+ * - "total_mem": Total amount of available memory (bytes)
+ *
+ * Example:
+ *
+ * { "actual": 1073741824, "mem_swapped_in": 0, "mem_swapped_out": 0,
+ * "major_page_faults": 142, "minor_page_faults": 239245,
+ * "free_mem": 1014185984, "total_mem": 1044668416 }
+ */
+int do_info_balloon(Monitor *mon, MonitorCompletion cb, void *opaque)
+{
+ int ret;
+
+ if (kvm_enabled() && !kvm_has_sync_mmu()) {
+ qerror_report(QERR_KVM_MISSING_CAP, "synchronous MMU", "balloon");
+ return -1;
+ }
+
+ ret = qemu_balloon_status(cb, opaque);
+ if (!ret) {
+ qerror_report(QERR_DEVICE_NOT_ACTIVE, "balloon");
+ return -1;
+ }
+
+ return 0;
+}
+
+/**
+ * do_balloon(): Request VM to change its memory allocation
+ */
+int do_balloon(Monitor *mon, const QDict *params,
+ MonitorCompletion cb, void *opaque)
+{
+ int64_t target;
+ int ret;
+
+ if (kvm_enabled() && !kvm_has_sync_mmu()) {
+ qerror_report(QERR_KVM_MISSING_CAP, "synchronous MMU", "balloon");
+ return -1;
+ }
+
+ target = qdict_get_int(params, "value");
+ if (target <= 0) {
+ qerror_report(QERR_INVALID_PARAMETER_VALUE, "target", "a size");
+ return -1;
+ }
+ ret = qemu_balloon(target);
+ if (ret == 0) {
+ qerror_report(QERR_DEVICE_NOT_ACTIVE, "balloon");
+ return -1;
+ }
+
+ cb(opaque, NULL);
+ return 0;
+}
diff --git a/qemu-0.15.x/balloon.h b/qemu-0.15.x/balloon.h
new file mode 100644
index 0000000..3df14e6
--- /dev/null
+++ b/qemu-0.15.x/balloon.h
@@ -0,0 +1,31 @@
+/*
+ * Balloon
+ *
+ * Copyright IBM, Corp. 2008
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef _QEMU_BALLOON_H
+#define _QEMU_BALLOON_H
+
+#include "monitor.h"
+
+typedef void (QEMUBalloonEvent)(void *opaque, ram_addr_t target);
+typedef void (QEMUBalloonStatus)(void *opaque, MonitorCompletion cb,
+ void *cb_data);
+
+int qemu_add_balloon_handler(QEMUBalloonEvent *event_func,
+ QEMUBalloonStatus *stat_func, void *opaque);
+
+void monitor_print_balloon(Monitor *mon, const QObject *data);
+int do_info_balloon(Monitor *mon, MonitorCompletion cb, void *opaque);
+int do_balloon(Monitor *mon, const QDict *params,
+ MonitorCompletion cb, void *opaque);
+
+#endif
diff --git a/qemu-0.15.x/bitmap.c b/qemu-0.15.x/bitmap.c
new file mode 100644
index 0000000..a62c8ba
--- /dev/null
+++ b/qemu-0.15.x/bitmap.c
@@ -0,0 +1,256 @@
+/*
+ * Bitmap Module
+ *
+ * Stolen from linux/src/lib/bitmap.c
+ *
+ * Copyright (C) 2010 Corentin Chary
+ *
+ * This source code is licensed under the GNU General Public License,
+ * Version 2.
+ */
+
+#include "bitops.h"
+#include "bitmap.h"
+
+/*
+ * bitmaps provide an array of bits, implemented using an an
+ * array of unsigned longs. The number of valid bits in a
+ * given bitmap does _not_ need to be an exact multiple of
+ * BITS_PER_LONG.
+ *
+ * The possible unused bits in the last, partially used word
+ * of a bitmap are 'don't care'. The implementation makes
+ * no particular effort to keep them zero. It ensures that
+ * their value will not affect the results of any operation.
+ * The bitmap operations that return Boolean (bitmap_empty,
+ * for example) or scalar (bitmap_weight, for example) results
+ * carefully filter out these unused bits from impacting their
+ * results.
+ *
+ * These operations actually hold to a slightly stronger rule:
+ * if you don't input any bitmaps to these ops that have some
+ * unused bits set, then they won't output any set unused bits
+ * in output bitmaps.
+ *
+ * The byte ordering of bitmaps is more natural on little
+ * endian architectures.
+ */
+
+int slow_bitmap_empty(const unsigned long *bitmap, int bits)
+{
+ int k, lim = bits/BITS_PER_LONG;
+
+ for (k = 0; k < lim; ++k) {
+ if (bitmap[k]) {
+ return 0;
+ }
+ }
+ if (bits % BITS_PER_LONG) {
+ if (bitmap[k] & BITMAP_LAST_WORD_MASK(bits)) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+int slow_bitmap_full(const unsigned long *bitmap, int bits)
+{
+ int k, lim = bits/BITS_PER_LONG;
+
+ for (k = 0; k < lim; ++k) {
+ if (~bitmap[k]) {
+ return 0;
+ }
+ }
+
+ if (bits % BITS_PER_LONG) {
+ if (~bitmap[k] & BITMAP_LAST_WORD_MASK(bits)) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+int slow_bitmap_equal(const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits)
+{
+ int k, lim = bits/BITS_PER_LONG;
+
+ for (k = 0; k < lim; ++k) {
+ if (bitmap1[k] != bitmap2[k]) {
+ return 0;
+ }
+ }
+
+ if (bits % BITS_PER_LONG) {
+ if ((bitmap1[k] ^ bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+void slow_bitmap_complement(unsigned long *dst, const unsigned long *src,
+ int bits)
+{
+ int k, lim = bits/BITS_PER_LONG;
+
+ for (k = 0; k < lim; ++k) {
+ dst[k] = ~src[k];
+ }
+
+ if (bits % BITS_PER_LONG) {
+ dst[k] = ~src[k] & BITMAP_LAST_WORD_MASK(bits);
+ }
+}
+
+int slow_bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits)
+{
+ int k;
+ int nr = BITS_TO_LONGS(bits);
+ unsigned long result = 0;
+
+ for (k = 0; k < nr; k++) {
+ result |= (dst[k] = bitmap1[k] & bitmap2[k]);
+ }
+ return result != 0;
+}
+
+void slow_bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits)
+{
+ int k;
+ int nr = BITS_TO_LONGS(bits);
+
+ for (k = 0; k < nr; k++) {
+ dst[k] = bitmap1[k] | bitmap2[k];
+ }
+}
+
+void slow_bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits)
+{
+ int k;
+ int nr = BITS_TO_LONGS(bits);
+
+ for (k = 0; k < nr; k++) {
+ dst[k] = bitmap1[k] ^ bitmap2[k];
+ }
+}
+
+int slow_bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits)
+{
+ int k;
+ int nr = BITS_TO_LONGS(bits);
+ unsigned long result = 0;
+
+ for (k = 0; k < nr; k++) {
+ result |= (dst[k] = bitmap1[k] & ~bitmap2[k]);
+ }
+ return result != 0;
+}
+
+#define BITMAP_FIRST_WORD_MASK(start) (~0UL << ((start) % BITS_PER_LONG))
+
+void bitmap_set(unsigned long *map, int start, int nr)
+{
+ unsigned long *p = map + BIT_WORD(start);
+ const int size = start + nr;
+ int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG);
+ unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start);
+
+ while (nr - bits_to_set >= 0) {
+ *p |= mask_to_set;
+ nr -= bits_to_set;
+ bits_to_set = BITS_PER_LONG;
+ mask_to_set = ~0UL;
+ p++;
+ }
+ if (nr) {
+ mask_to_set &= BITMAP_LAST_WORD_MASK(size);
+ *p |= mask_to_set;
+ }
+}
+
+void bitmap_clear(unsigned long *map, int start, int nr)
+{
+ unsigned long *p = map + BIT_WORD(start);
+ const int size = start + nr;
+ int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG);
+ unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start);
+
+ while (nr - bits_to_clear >= 0) {
+ *p &= ~mask_to_clear;
+ nr -= bits_to_clear;
+ bits_to_clear = BITS_PER_LONG;
+ mask_to_clear = ~0UL;
+ p++;
+ }
+ if (nr) {
+ mask_to_clear &= BITMAP_LAST_WORD_MASK(size);
+ *p &= ~mask_to_clear;
+ }
+}
+
+#define ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
+
+/**
+ * bitmap_find_next_zero_area - find a contiguous aligned zero area
+ * @map: The address to base the search on
+ * @size: The bitmap size in bits
+ * @start: The bitnumber to start searching at
+ * @nr: The number of zeroed bits we're looking for
+ * @align_mask: Alignment mask for zero area
+ *
+ * The @align_mask should be one less than a power of 2; the effect is that
+ * the bit offset of all zero areas this function finds is multiples of that
+ * power of 2. A @align_mask of 0 means no alignment is required.
+ */
+unsigned long bitmap_find_next_zero_area(unsigned long *map,
+ unsigned long size,
+ unsigned long start,
+ unsigned int nr,
+ unsigned long align_mask)
+{
+ unsigned long index, end, i;
+again:
+ index = find_next_zero_bit(map, size, start);
+
+ /* Align allocation */
+ index = ALIGN_MASK(index, align_mask);
+
+ end = index + nr;
+ if (end > size) {
+ return end;
+ }
+ i = find_next_bit(map, end, index);
+ if (i < end) {
+ start = i + 1;
+ goto again;
+ }
+ return index;
+}
+
+int slow_bitmap_intersects(const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits)
+{
+ int k, lim = bits/BITS_PER_LONG;
+
+ for (k = 0; k < lim; ++k) {
+ if (bitmap1[k] & bitmap2[k]) {
+ return 1;
+ }
+ }
+
+ if (bits % BITS_PER_LONG) {
+ if ((bitmap1[k] & bitmap2[k]) & BITMAP_LAST_WORD_MASK(bits)) {
+ return 1;
+ }
+ }
+ return 0;
+}
diff --git a/qemu-0.15.x/bitmap.h b/qemu-0.15.x/bitmap.h
new file mode 100644
index 0000000..efd5d3a
--- /dev/null
+++ b/qemu-0.15.x/bitmap.h
@@ -0,0 +1,222 @@
+/*
+ * Bitmap Module
+ *
+ * Copyright (C) 2010 Corentin Chary <corentin.chary(a)gmail.com>
+ *
+ * Mostly inspired by (stolen from) linux/bitmap.h and linux/bitops.h
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ */
+
+#ifndef BITMAP_H
+#define BITMAP_H
+
+#include "qemu-common.h"
+#include "bitops.h"
+
+/*
+ * The available bitmap operations and their rough meaning in the
+ * case that the bitmap is a single unsigned long are thus:
+ *
+ * Note that nbits should be always a compile time evaluable constant.
+ * Otherwise many inlines will generate horrible code.
+ *
+ * bitmap_zero(dst, nbits) *dst = 0UL
+ * bitmap_fill(dst, nbits) *dst = ~0UL
+ * bitmap_copy(dst, src, nbits) *dst = *src
+ * bitmap_and(dst, src1, src2, nbits) *dst = *src1 & *src2
+ * bitmap_or(dst, src1, src2, nbits) *dst = *src1 | *src2
+ * bitmap_xor(dst, src1, src2, nbits) *dst = *src1 ^ *src2
+ * bitmap_andnot(dst, src1, src2, nbits) *dst = *src1 & ~(*src2)
+ * bitmap_complement(dst, src, nbits) *dst = ~(*src)
+ * bitmap_equal(src1, src2, nbits) Are *src1 and *src2 equal?
+ * bitmap_intersects(src1, src2, nbits) Do *src1 and *src2 overlap?
+ * bitmap_empty(src, nbits) Are all bits zero in *src?
+ * bitmap_full(src, nbits) Are all bits set in *src?
+ * bitmap_set(dst, pos, nbits) Set specified bit area
+ * bitmap_clear(dst, pos, nbits) Clear specified bit area
+ * bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
+ */
+
+/*
+ * Also the following operations apply to bitmaps.
+ *
+ * set_bit(bit, addr) *addr |= bit
+ * clear_bit(bit, addr) *addr &= ~bit
+ * change_bit(bit, addr) *addr ^= bit
+ * test_bit(bit, addr) Is bit set in *addr?
+ * test_and_set_bit(bit, addr) Set bit and return old value
+ * test_and_clear_bit(bit, addr) Clear bit and return old value
+ * test_and_change_bit(bit, addr) Change bit and return old value
+ * find_first_zero_bit(addr, nbits) Position first zero bit in *addr
+ * find_first_bit(addr, nbits) Position first set bit in *addr
+ * find_next_zero_bit(addr, nbits, bit) Position next zero bit in *addr >= bit
+ * find_next_bit(addr, nbits, bit) Position next set bit in *addr >= bit
+ */
+
+#define BITMAP_LAST_WORD_MASK(nbits) \
+ ( \
+ ((nbits) % BITS_PER_LONG) ? \
+ (1UL<<((nbits) % BITS_PER_LONG))-1 : ~0UL \
+ )
+
+#define DECLARE_BITMAP(name,bits) \
+ unsigned long name[BITS_TO_LONGS(bits)]
+
+#define small_nbits(nbits) \
+ ((nbits) <= BITS_PER_LONG)
+
+int slow_bitmap_empty(const unsigned long *bitmap, int bits);
+int slow_bitmap_full(const unsigned long *bitmap, int bits);
+int slow_bitmap_equal(const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits);
+void slow_bitmap_complement(unsigned long *dst, const unsigned long *src,
+ int bits);
+void slow_bitmap_shift_right(unsigned long *dst,
+ const unsigned long *src, int shift, int bits);
+void slow_bitmap_shift_left(unsigned long *dst,
+ const unsigned long *src, int shift, int bits);
+int slow_bitmap_and(unsigned long *dst, const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits);
+void slow_bitmap_or(unsigned long *dst, const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits);
+void slow_bitmap_xor(unsigned long *dst, const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits);
+int slow_bitmap_andnot(unsigned long *dst, const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits);
+int slow_bitmap_intersects(const unsigned long *bitmap1,
+ const unsigned long *bitmap2, int bits);
+
+static inline unsigned long *bitmap_new(int nbits)
+{
+ int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
+ return qemu_mallocz(len);
+}
+
+static inline void bitmap_zero(unsigned long *dst, int nbits)
+{
+ if (small_nbits(nbits)) {
+ *dst = 0UL;
+ } else {
+ int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
+ memset(dst, 0, len);
+ }
+}
+
+static inline void bitmap_fill(unsigned long *dst, int nbits)
+{
+ size_t nlongs = BITS_TO_LONGS(nbits);
+ if (!small_nbits(nbits)) {
+ int len = (nlongs - 1) * sizeof(unsigned long);
+ memset(dst, 0xff, len);
+ }
+ dst[nlongs - 1] = BITMAP_LAST_WORD_MASK(nbits);
+}
+
+static inline void bitmap_copy(unsigned long *dst, const unsigned long *src,
+ int nbits)
+{
+ if (small_nbits(nbits)) {
+ *dst = *src;
+ } else {
+ int len = BITS_TO_LONGS(nbits) * sizeof(unsigned long);
+ memcpy(dst, src, len);
+ }
+}
+
+static inline int bitmap_and(unsigned long *dst, const unsigned long *src1,
+ const unsigned long *src2, int nbits)
+{
+ if (small_nbits(nbits)) {
+ return (*dst = *src1 & *src2) != 0;
+ }
+ return slow_bitmap_and(dst, src1, src2, nbits);
+}
+
+static inline void bitmap_or(unsigned long *dst, const unsigned long *src1,
+ const unsigned long *src2, int nbits)
+{
+ if (small_nbits(nbits)) {
+ *dst = *src1 | *src2;
+ } else {
+ slow_bitmap_or(dst, src1, src2, nbits);
+ }
+}
+
+static inline void bitmap_xor(unsigned long *dst, const unsigned long *src1,
+ const unsigned long *src2, int nbits)
+{
+ if (small_nbits(nbits)) {
+ *dst = *src1 ^ *src2;
+ } else {
+ slow_bitmap_xor(dst, src1, src2, nbits);
+ }
+}
+
+static inline int bitmap_andnot(unsigned long *dst, const unsigned long *src1,
+ const unsigned long *src2, int nbits)
+{
+ if (small_nbits(nbits)) {
+ return (*dst = *src1 & ~(*src2)) != 0;
+ }
+ return slow_bitmap_andnot(dst, src1, src2, nbits);
+}
+
+static inline void bitmap_complement(unsigned long *dst, const unsigned long *src,
+ int nbits)
+{
+ if (small_nbits(nbits)) {
+ *dst = ~(*src) & BITMAP_LAST_WORD_MASK(nbits);
+ } else {
+ slow_bitmap_complement(dst, src, nbits);
+ }
+}
+
+static inline int bitmap_equal(const unsigned long *src1,
+ const unsigned long *src2, int nbits)
+{
+ if (small_nbits(nbits)) {
+ return ! ((*src1 ^ *src2) & BITMAP_LAST_WORD_MASK(nbits));
+ } else {
+ return slow_bitmap_equal(src1, src2, nbits);
+ }
+}
+
+static inline int bitmap_empty(const unsigned long *src, int nbits)
+{
+ if (small_nbits(nbits)) {
+ return ! (*src & BITMAP_LAST_WORD_MASK(nbits));
+ } else {
+ return slow_bitmap_empty(src, nbits);
+ }
+}
+
+static inline int bitmap_full(const unsigned long *src, int nbits)
+{
+ if (small_nbits(nbits)) {
+ return ! (~(*src) & BITMAP_LAST_WORD_MASK(nbits));
+ } else {
+ return slow_bitmap_full(src, nbits);
+ }
+}
+
+static inline int bitmap_intersects(const unsigned long *src1,
+ const unsigned long *src2, int nbits)
+{
+ if (small_nbits(nbits)) {
+ return ((*src1 & *src2) & BITMAP_LAST_WORD_MASK(nbits)) != 0;
+ } else {
+ return slow_bitmap_intersects(src1, src2, nbits);
+ }
+}
+
+void bitmap_set(unsigned long *map, int i, int len);
+void bitmap_clear(unsigned long *map, int start, int nr);
+unsigned long bitmap_find_next_zero_area(unsigned long *map,
+ unsigned long size,
+ unsigned long start,
+ unsigned int nr,
+ unsigned long align_mask);
+
+#endif /* BITMAP_H */
diff --git a/qemu-0.15.x/bitops.c b/qemu-0.15.x/bitops.c
new file mode 100644
index 0000000..d9de71f
--- /dev/null
+++ b/qemu-0.15.x/bitops.c
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells(a)redhat.com)
+ * Copyright (C) 2008 IBM Corporation
+ * Written by Rusty Russell <rusty(a)rustcorp.com.au>
+ * (Inspired by David Howell's find_next_bit implementation)
+ *
+ * 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.
+ */
+
+#include "bitops.h"
+
+#define BITOP_WORD(nr) ((nr) / BITS_PER_LONG)
+
+/*
+ * Find the next set bit in a memory region.
+ */
+unsigned long find_next_bit(const unsigned long *addr, unsigned long size,
+ unsigned long offset)
+{
+ const unsigned long *p = addr + BITOP_WORD(offset);
+ unsigned long result = offset & ~(BITS_PER_LONG-1);
+ unsigned long tmp;
+
+ if (offset >= size) {
+ return size;
+ }
+ size -= result;
+ offset %= BITS_PER_LONG;
+ if (offset) {
+ tmp = *(p++);
+ tmp &= (~0UL << offset);
+ if (size < BITS_PER_LONG) {
+ goto found_first;
+ }
+ if (tmp) {
+ goto found_middle;
+ }
+ size -= BITS_PER_LONG;
+ result += BITS_PER_LONG;
+ }
+ while (size & ~(BITS_PER_LONG-1)) {
+ if ((tmp = *(p++))) {
+ goto found_middle;
+ }
+ result += BITS_PER_LONG;
+ size -= BITS_PER_LONG;
+ }
+ if (!size) {
+ return result;
+ }
+ tmp = *p;
+
+found_first:
+ tmp &= (~0UL >> (BITS_PER_LONG - size));
+ if (tmp == 0UL) { /* Are any bits set? */
+ return result + size; /* Nope. */
+ }
+found_middle:
+ return result + bitops_ffsl(tmp);
+}
+
+/*
+ * This implementation of find_{first,next}_zero_bit was stolen from
+ * Linus' asm-alpha/bitops.h.
+ */
+unsigned long find_next_zero_bit(const unsigned long *addr, unsigned long size,
+ unsigned long offset)
+{
+ const unsigned long *p = addr + BITOP_WORD(offset);
+ unsigned long result = offset & ~(BITS_PER_LONG-1);
+ unsigned long tmp;
+
+ if (offset >= size) {
+ return size;
+ }
+ size -= result;
+ offset %= BITS_PER_LONG;
+ if (offset) {
+ tmp = *(p++);
+ tmp |= ~0UL >> (BITS_PER_LONG - offset);
+ if (size < BITS_PER_LONG) {
+ goto found_first;
+ }
+ if (~tmp) {
+ goto found_middle;
+ }
+ size -= BITS_PER_LONG;
+ result += BITS_PER_LONG;
+ }
+ while (size & ~(BITS_PER_LONG-1)) {
+ if (~(tmp = *(p++))) {
+ goto found_middle;
+ }
+ result += BITS_PER_LONG;
+ size -= BITS_PER_LONG;
+ }
+ if (!size) {
+ return result;
+ }
+ tmp = *p;
+
+found_first:
+ tmp |= ~0UL << size;
+ if (tmp == ~0UL) { /* Are any bits zero? */
+ return result + size; /* Nope. */
+ }
+found_middle:
+ return result + ffz(tmp);
+}
+
+unsigned long find_last_bit(const unsigned long *addr, unsigned long size)
+{
+ unsigned long words;
+ unsigned long tmp;
+
+ /* Start at final word. */
+ words = size / BITS_PER_LONG;
+
+ /* Partial final word? */
+ if (size & (BITS_PER_LONG-1)) {
+ tmp = (addr[words] & (~0UL >> (BITS_PER_LONG
+ - (size & (BITS_PER_LONG-1)))));
+ if (tmp) {
+ goto found;
+ }
+ }
+
+ while (words) {
+ tmp = addr[--words];
+ if (tmp) {
+ found:
+ return words * BITS_PER_LONG + bitops_flsl(tmp);
+ }
+ }
+
+ /* Not found */
+ return size;
+}
diff --git a/qemu-0.15.x/bitops.h b/qemu-0.15.x/bitops.h
new file mode 100644
index 0000000..07d1a06
--- /dev/null
+++ b/qemu-0.15.x/bitops.h
@@ -0,0 +1,272 @@
+/*
+ * Bitops Module
+ *
+ * Copyright (C) 2010 Corentin Chary <corentin.chary(a)gmail.com>
+ *
+ * Mostly inspired by (stolen from) linux/bitmap.h and linux/bitops.h
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ */
+
+#ifndef BITOPS_H
+#define BITOPS_H
+
+#include "qemu-common.h"
+
+#define BITS_PER_BYTE CHAR_BIT
+#define BITS_PER_LONG (sizeof (unsigned long) * BITS_PER_BYTE)
+
+#define BIT(nr) (1UL << (nr))
+#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
+#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
+#define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
+
+/**
+ * bitops_ffs - find first bit in word.
+ * @word: The word to search
+ *
+ * Undefined if no bit exists, so code should check against 0 first.
+ */
+static unsigned long bitops_ffsl(unsigned long word)
+{
+ int num = 0;
+
+#if LONG_MAX > 0x7FFFFFFF
+ if ((word & 0xffffffff) == 0) {
+ num += 32;
+ word >>= 32;
+ }
+#endif
+ if ((word & 0xffff) == 0) {
+ num += 16;
+ word >>= 16;
+ }
+ if ((word & 0xff) == 0) {
+ num += 8;
+ word >>= 8;
+ }
+ if ((word & 0xf) == 0) {
+ num += 4;
+ word >>= 4;
+ }
+ if ((word & 0x3) == 0) {
+ num += 2;
+ word >>= 2;
+ }
+ if ((word & 0x1) == 0) {
+ num += 1;
+ }
+ return num;
+}
+
+/**
+ * bitops_fls - find last (most-significant) set bit in a long word
+ * @word: the word to search
+ *
+ * Undefined if no set bit exists, so code should check against 0 first.
+ */
+static inline unsigned long bitops_flsl(unsigned long word)
+{
+ int num = BITS_PER_LONG - 1;
+
+#if LONG_MAX > 0x7FFFFFFF
+ if (!(word & (~0ul << 32))) {
+ num -= 32;
+ word <<= 32;
+ }
+#endif
+ if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
+ num -= 16;
+ word <<= 16;
+ }
+ if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
+ num -= 8;
+ word <<= 8;
+ }
+ if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
+ num -= 4;
+ word <<= 4;
+ }
+ if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
+ num -= 2;
+
+ word <<= 2;
+ }
+ if (!(word & (~0ul << (BITS_PER_LONG-1))))
+ num -= 1;
+ return num;
+}
+
+/**
+ * ffz - find first zero in word.
+ * @word: The word to search
+ *
+ * Undefined if no zero exists, so code should check against ~0UL first.
+ */
+static inline unsigned long ffz(unsigned long word)
+{
+ return bitops_ffsl(~word);
+}
+
+/**
+ * set_bit - Set a bit in memory
+ * @nr: the bit to set
+ * @addr: the address to start counting from
+ */
+static inline void set_bit(int nr, volatile unsigned long *addr)
+{
+ unsigned long mask = BIT_MASK(nr);
+ unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
+
+ *p |= mask;
+}
+
+/**
+ * clear_bit - Clears a bit in memory
+ * @nr: Bit to clear
+ * @addr: Address to start counting from
+ */
+static inline void clear_bit(int nr, volatile unsigned long *addr)
+{
+ unsigned long mask = BIT_MASK(nr);
+ unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
+
+ *p &= ~mask;
+}
+
+/**
+ * change_bit - Toggle a bit in memory
+ * @nr: Bit to change
+ * @addr: Address to start counting from
+ */
+static inline void change_bit(int nr, volatile unsigned long *addr)
+{
+ unsigned long mask = BIT_MASK(nr);
+ unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
+
+ *p ^= mask;
+}
+
+/**
+ * test_and_set_bit - Set a bit and return its old value
+ * @nr: Bit to set
+ * @addr: Address to count from
+ */
+static inline int test_and_set_bit(int nr, volatile unsigned long *addr)
+{
+ unsigned long mask = BIT_MASK(nr);
+ unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
+ unsigned long old = *p;
+
+ *p = old | mask;
+ return (old & mask) != 0;
+}
+
+/**
+ * test_and_clear_bit - Clear a bit and return its old value
+ * @nr: Bit to clear
+ * @addr: Address to count from
+ */
+static inline int test_and_clear_bit(int nr, volatile unsigned long *addr)
+{
+ unsigned long mask = BIT_MASK(nr);
+ unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
+ unsigned long old = *p;
+
+ *p = old & ~mask;
+ return (old & mask) != 0;
+}
+
+/**
+ * test_and_change_bit - Change a bit and return its old value
+ * @nr: Bit to change
+ * @addr: Address to count from
+ */
+static inline int test_and_change_bit(int nr, volatile unsigned long *addr)
+{
+ unsigned long mask = BIT_MASK(nr);
+ unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
+ unsigned long old = *p;
+
+ *p = old ^ mask;
+ return (old & mask) != 0;
+}
+
+/**
+ * test_bit - Determine whether a bit is set
+ * @nr: bit number to test
+ * @addr: Address to start counting from
+ */
+static inline int test_bit(int nr, const volatile unsigned long *addr)
+{
+ return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
+}
+
+/**
+ * find_last_bit - find the last set bit in a memory region
+ * @addr: The address to start the search at
+ * @size: The maximum size to search
+ *
+ * Returns the bit number of the first set bit, or size.
+ */
+unsigned long find_last_bit(const unsigned long *addr,
+ unsigned long size);
+
+/**
+ * find_next_bit - find the next set bit in a memory region
+ * @addr: The address to base the search on
+ * @offset: The bitnumber to start searching at
+ * @size: The bitmap size in bits
+ */
+unsigned long find_next_bit(const unsigned long *addr,
+ unsigned long size, unsigned long offset);
+
+/**
+ * find_next_zero_bit - find the next cleared bit in a memory region
+ * @addr: The address to base the search on
+ * @offset: The bitnumber to start searching at
+ * @size: The bitmap size in bits
+ */
+
+unsigned long find_next_zero_bit(const unsigned long *addr,
+ unsigned long size,
+ unsigned long offset);
+
+/**
+ * find_first_bit - find the first set bit in a memory region
+ * @addr: The address to start the search at
+ * @size: The maximum size to search
+ *
+ * Returns the bit number of the first set bit.
+ */
+static inline unsigned long find_first_bit(const unsigned long *addr,
+ unsigned long size)
+{
+ return find_next_bit(addr, size, 0);
+}
+
+/**
+ * find_first_zero_bit - find the first cleared bit in a memory region
+ * @addr: The address to start the search at
+ * @size: The maximum size to search
+ *
+ * Returns the bit number of the first cleared bit.
+ */
+static inline unsigned long find_first_zero_bit(const unsigned long *addr,
+ unsigned long size)
+{
+ return find_next_zero_bit(addr, size, 0);
+}
+
+static inline unsigned long hweight_long(unsigned long w)
+{
+ unsigned long count;
+
+ for (count = 0; w; w >>= 1) {
+ count += w & 1;
+ }
+ return count;
+}
+
+#endif
diff --git a/qemu-0.15.x/block-migration.c b/qemu-0.15.x/block-migration.c
new file mode 100644
index 0000000..0936c7d
--- /dev/null
+++ b/qemu-0.15.x/block-migration.c
@@ -0,0 +1,731 @@
+/*
+ * QEMU live block migration
+ *
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ * Liran Schour <lirans(a)il.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-common.h"
+#include "block_int.h"
+#include "hw/hw.h"
+#include "qemu-queue.h"
+#include "qemu-timer.h"
+#include "monitor.h"
+#include "block-migration.h"
+#include "migration.h"
+#include "blockdev.h"
+#include <assert.h>
+
+#define BLOCK_SIZE (BDRV_SECTORS_PER_DIRTY_CHUNK << BDRV_SECTOR_BITS)
+
+#define BLK_MIG_FLAG_DEVICE_BLOCK 0x01
+#define BLK_MIG_FLAG_EOS 0x02
+#define BLK_MIG_FLAG_PROGRESS 0x04
+
+#define MAX_IS_ALLOCATED_SEARCH 65536
+
+//#define DEBUG_BLK_MIGRATION
+
+#ifdef DEBUG_BLK_MIGRATION
+#define DPRINTF(fmt, ...) \
+ do { printf("blk_migration: " fmt, ## __VA_ARGS__); } while (0)
+#else
+#define DPRINTF(fmt, ...) \
+ do { } while (0)
+#endif
+
+typedef struct BlkMigDevState {
+ BlockDriverState *bs;
+ int bulk_completed;
+ int shared_base;
+ int64_t cur_sector;
+ int64_t cur_dirty;
+ int64_t completed_sectors;
+ int64_t total_sectors;
+ int64_t dirty;
+ QSIMPLEQ_ENTRY(BlkMigDevState) entry;
+ unsigned long *aio_bitmap;
+} BlkMigDevState;
+
+typedef struct BlkMigBlock {
+ uint8_t *buf;
+ BlkMigDevState *bmds;
+ int64_t sector;
+ int nr_sectors;
+ struct iovec iov;
+ QEMUIOVector qiov;
+ BlockDriverAIOCB *aiocb;
+ int ret;
+ QSIMPLEQ_ENTRY(BlkMigBlock) entry;
+} BlkMigBlock;
+
+typedef struct BlkMigState {
+ int blk_enable;
+ int shared_base;
+ QSIMPLEQ_HEAD(bmds_list, BlkMigDevState) bmds_list;
+ QSIMPLEQ_HEAD(blk_list, BlkMigBlock) blk_list;
+ int submitted;
+ int read_done;
+ int transferred;
+ int64_t total_sector_sum;
+ int prev_progress;
+ int bulk_completed;
+ long double total_time;
+ long double prev_time_offset;
+ int reads;
+} BlkMigState;
+
+static BlkMigState block_mig_state;
+
+static void blk_send(QEMUFile *f, BlkMigBlock * blk)
+{
+ int len;
+
+ /* sector number and flags */
+ qemu_put_be64(f, (blk->sector << BDRV_SECTOR_BITS)
+ | BLK_MIG_FLAG_DEVICE_BLOCK);
+
+ /* device name */
+ len = strlen(blk->bmds->bs->device_name);
+ qemu_put_byte(f, len);
+ qemu_put_buffer(f, (uint8_t *)blk->bmds->bs->device_name, len);
+
+ qemu_put_buffer(f, blk->buf, BLOCK_SIZE);
+}
+
+int blk_mig_active(void)
+{
+ return !QSIMPLEQ_EMPTY(&block_mig_state.bmds_list);
+}
+
+uint64_t blk_mig_bytes_transferred(void)
+{
+ BlkMigDevState *bmds;
+ uint64_t sum = 0;
+
+ QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
+ sum += bmds->completed_sectors;
+ }
+ return sum << BDRV_SECTOR_BITS;
+}
+
+uint64_t blk_mig_bytes_remaining(void)
+{
+ return blk_mig_bytes_total() - blk_mig_bytes_transferred();
+}
+
+uint64_t blk_mig_bytes_total(void)
+{
+ BlkMigDevState *bmds;
+ uint64_t sum = 0;
+
+ QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
+ sum += bmds->total_sectors;
+ }
+ return sum << BDRV_SECTOR_BITS;
+}
+
+static inline long double compute_read_bwidth(void)
+{
+ assert(block_mig_state.total_time != 0);
+ return (block_mig_state.reads / block_mig_state.total_time) * BLOCK_SIZE;
+}
+
+static int bmds_aio_inflight(BlkMigDevState *bmds, int64_t sector)
+{
+ int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;
+
+ if ((sector << BDRV_SECTOR_BITS) < bdrv_getlength(bmds->bs)) {
+ return !!(bmds->aio_bitmap[chunk / (sizeof(unsigned long) * 8)] &
+ (1UL << (chunk % (sizeof(unsigned long) * 8))));
+ } else {
+ return 0;
+ }
+}
+
+static void bmds_set_aio_inflight(BlkMigDevState *bmds, int64_t sector_num,
+ int nb_sectors, int set)
+{
+ int64_t start, end;
+ unsigned long val, idx, bit;
+
+ start = sector_num / BDRV_SECTORS_PER_DIRTY_CHUNK;
+ end = (sector_num + nb_sectors - 1) / BDRV_SECTORS_PER_DIRTY_CHUNK;
+
+ for (; start <= end; start++) {
+ idx = start / (sizeof(unsigned long) * 8);
+ bit = start % (sizeof(unsigned long) * 8);
+ val = bmds->aio_bitmap[idx];
+ if (set) {
+ val |= 1UL << bit;
+ } else {
+ val &= ~(1UL << bit);
+ }
+ bmds->aio_bitmap[idx] = val;
+ }
+}
+
+static void alloc_aio_bitmap(BlkMigDevState *bmds)
+{
+ BlockDriverState *bs = bmds->bs;
+ int64_t bitmap_size;
+
+ bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) +
+ BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
+ bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8;
+
+ bmds->aio_bitmap = qemu_mallocz(bitmap_size);
+}
+
+static void blk_mig_read_cb(void *opaque, int ret)
+{
+ long double curr_time = qemu_get_clock_ns(rt_clock);
+ BlkMigBlock *blk = opaque;
+
+ blk->ret = ret;
+
+ block_mig_state.reads++;
+ block_mig_state.total_time += (curr_time - block_mig_state.prev_time_offset);
+ block_mig_state.prev_time_offset = curr_time;
+
+ QSIMPLEQ_INSERT_TAIL(&block_mig_state.blk_list, blk, entry);
+ bmds_set_aio_inflight(blk->bmds, blk->sector, blk->nr_sectors, 0);
+
+ block_mig_state.submitted--;
+ block_mig_state.read_done++;
+ assert(block_mig_state.submitted >= 0);
+}
+
+static int mig_save_device_bulk(Monitor *mon, QEMUFile *f,
+ BlkMigDevState *bmds)
+{
+ int64_t total_sectors = bmds->total_sectors;
+ int64_t cur_sector = bmds->cur_sector;
+ BlockDriverState *bs = bmds->bs;
+ BlkMigBlock *blk;
+ int nr_sectors;
+
+ if (bmds->shared_base) {
+ while (cur_sector < total_sectors &&
+ !bdrv_is_allocated(bs, cur_sector, MAX_IS_ALLOCATED_SEARCH,
+ &nr_sectors)) {
+ cur_sector += nr_sectors;
+ }
+ }
+
+ if (cur_sector >= total_sectors) {
+ bmds->cur_sector = bmds->completed_sectors = total_sectors;
+ return 1;
+ }
+
+ bmds->completed_sectors = cur_sector;
+
+ cur_sector &= ~((int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK - 1);
+
+ /* we are going to transfer a full block even if it is not allocated */
+ nr_sectors = BDRV_SECTORS_PER_DIRTY_CHUNK;
+
+ if (total_sectors - cur_sector < BDRV_SECTORS_PER_DIRTY_CHUNK) {
+ nr_sectors = total_sectors - cur_sector;
+ }
+
+ blk = qemu_malloc(sizeof(BlkMigBlock));
+ blk->buf = qemu_malloc(BLOCK_SIZE);
+ blk->bmds = bmds;
+ blk->sector = cur_sector;
+ blk->nr_sectors = nr_sectors;
+
+ blk->iov.iov_base = blk->buf;
+ blk->iov.iov_len = nr_sectors * BDRV_SECTOR_SIZE;
+ qemu_iovec_init_external(&blk->qiov, &blk->iov, 1);
+
+ if (block_mig_state.submitted == 0) {
+ block_mig_state.prev_time_offset = qemu_get_clock_ns(rt_clock);
+ }
+
+ blk->aiocb = bdrv_aio_readv(bs, cur_sector, &blk->qiov,
+ nr_sectors, blk_mig_read_cb, blk);
+ if (!blk->aiocb) {
+ goto error;
+ }
+ block_mig_state.submitted++;
+
+ bdrv_reset_dirty(bs, cur_sector, nr_sectors);
+ bmds->cur_sector = cur_sector + nr_sectors;
+
+ return (bmds->cur_sector >= total_sectors);
+
+error:
+ monitor_printf(mon, "Error reading sector %" PRId64 "\n", cur_sector);
+ qemu_file_set_error(f);
+ qemu_free(blk->buf);
+ qemu_free(blk);
+ return 0;
+}
+
+static void set_dirty_tracking(int enable)
+{
+ BlkMigDevState *bmds;
+
+ QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
+ bdrv_set_dirty_tracking(bmds->bs, enable);
+ }
+}
+
+static void init_blk_migration_it(void *opaque, BlockDriverState *bs)
+{
+ Monitor *mon = opaque;
+ BlkMigDevState *bmds;
+ int64_t sectors;
+
+ if (!bdrv_is_read_only(bs)) {
+ sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
+ if (sectors <= 0) {
+ return;
+ }
+
+ bmds = qemu_mallocz(sizeof(BlkMigDevState));
+ bmds->bs = bs;
+ bmds->bulk_completed = 0;
+ bmds->total_sectors = sectors;
+ bmds->completed_sectors = 0;
+ bmds->shared_base = block_mig_state.shared_base;
+ alloc_aio_bitmap(bmds);
+ drive_get_ref(drive_get_by_blockdev(bs));
+ bdrv_set_in_use(bs, 1);
+
+ block_mig_state.total_sector_sum += sectors;
+
+ if (bmds->shared_base) {
+ monitor_printf(mon, "Start migration for %s with shared base "
+ "image\n",
+ bs->device_name);
+ } else {
+ monitor_printf(mon, "Start full migration for %s\n",
+ bs->device_name);
+ }
+
+ QSIMPLEQ_INSERT_TAIL(&block_mig_state.bmds_list, bmds, entry);
+ }
+}
+
+static void init_blk_migration(Monitor *mon, QEMUFile *f)
+{
+ block_mig_state.submitted = 0;
+ block_mig_state.read_done = 0;
+ block_mig_state.transferred = 0;
+ block_mig_state.total_sector_sum = 0;
+ block_mig_state.prev_progress = -1;
+ block_mig_state.bulk_completed = 0;
+ block_mig_state.total_time = 0;
+ block_mig_state.reads = 0;
+
+ bdrv_iterate(init_blk_migration_it, mon);
+}
+
+static int blk_mig_save_bulked_block(Monitor *mon, QEMUFile *f)
+{
+ int64_t completed_sector_sum = 0;
+ BlkMigDevState *bmds;
+ int progress;
+ int ret = 0;
+
+ QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
+ if (bmds->bulk_completed == 0) {
+ if (mig_save_device_bulk(mon, f, bmds) == 1) {
+ /* completed bulk section for this device */
+ bmds->bulk_completed = 1;
+ }
+ completed_sector_sum += bmds->completed_sectors;
+ ret = 1;
+ break;
+ } else {
+ completed_sector_sum += bmds->completed_sectors;
+ }
+ }
+
+ if (block_mig_state.total_sector_sum != 0) {
+ progress = completed_sector_sum * 100 /
+ block_mig_state.total_sector_sum;
+ } else {
+ progress = 100;
+ }
+ if (progress != block_mig_state.prev_progress) {
+ block_mig_state.prev_progress = progress;
+ qemu_put_be64(f, (progress << BDRV_SECTOR_BITS)
+ | BLK_MIG_FLAG_PROGRESS);
+ monitor_printf(mon, "Completed %d %%\r", progress);
+ monitor_flush(mon);
+ }
+
+ return ret;
+}
+
+static void blk_mig_reset_dirty_cursor(void)
+{
+ BlkMigDevState *bmds;
+
+ QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
+ bmds->cur_dirty = 0;
+ }
+}
+
+static int mig_save_device_dirty(Monitor *mon, QEMUFile *f,
+ BlkMigDevState *bmds, int is_async)
+{
+ BlkMigBlock *blk;
+ int64_t total_sectors = bmds->total_sectors;
+ int64_t sector;
+ int nr_sectors;
+
+ for (sector = bmds->cur_dirty; sector < bmds->total_sectors;) {
+ if (bmds_aio_inflight(bmds, sector)) {
+ qemu_aio_flush();
+ }
+ if (bdrv_get_dirty(bmds->bs, sector)) {
+
+ if (total_sectors - sector < BDRV_SECTORS_PER_DIRTY_CHUNK) {
+ nr_sectors = total_sectors - sector;
+ } else {
+ nr_sectors = BDRV_SECTORS_PER_DIRTY_CHUNK;
+ }
+ blk = qemu_malloc(sizeof(BlkMigBlock));
+ blk->buf = qemu_malloc(BLOCK_SIZE);
+ blk->bmds = bmds;
+ blk->sector = sector;
+ blk->nr_sectors = nr_sectors;
+
+ if (is_async) {
+ blk->iov.iov_base = blk->buf;
+ blk->iov.iov_len = nr_sectors * BDRV_SECTOR_SIZE;
+ qemu_iovec_init_external(&blk->qiov, &blk->iov, 1);
+
+ if (block_mig_state.submitted == 0) {
+ block_mig_state.prev_time_offset = qemu_get_clock_ns(rt_clock);
+ }
+
+ blk->aiocb = bdrv_aio_readv(bmds->bs, sector, &blk->qiov,
+ nr_sectors, blk_mig_read_cb, blk);
+ if (!blk->aiocb) {
+ goto error;
+ }
+ block_mig_state.submitted++;
+ bmds_set_aio_inflight(bmds, sector, nr_sectors, 1);
+ } else {
+ if (bdrv_read(bmds->bs, sector, blk->buf,
+ nr_sectors) < 0) {
+ goto error;
+ }
+ blk_send(f, blk);
+
+ qemu_free(blk->buf);
+ qemu_free(blk);
+ }
+
+ bdrv_reset_dirty(bmds->bs, sector, nr_sectors);
+ break;
+ }
+ sector += BDRV_SECTORS_PER_DIRTY_CHUNK;
+ bmds->cur_dirty = sector;
+ }
+
+ return (bmds->cur_dirty >= bmds->total_sectors);
+
+error:
+ monitor_printf(mon, "Error reading sector %" PRId64 "\n", sector);
+ qemu_file_set_error(f);
+ qemu_free(blk->buf);
+ qemu_free(blk);
+ return 0;
+}
+
+static int blk_mig_save_dirty_block(Monitor *mon, QEMUFile *f, int is_async)
+{
+ BlkMigDevState *bmds;
+ int ret = 0;
+
+ QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
+ if (mig_save_device_dirty(mon, f, bmds, is_async) == 0) {
+ ret = 1;
+ break;
+ }
+ }
+
+ return ret;
+}
+
+static void flush_blks(QEMUFile* f)
+{
+ BlkMigBlock *blk;
+
+ DPRINTF("%s Enter submitted %d read_done %d transferred %d\n",
+ __FUNCTION__, block_mig_state.submitted, block_mig_state.read_done,
+ block_mig_state.transferred);
+
+ while ((blk = QSIMPLEQ_FIRST(&block_mig_state.blk_list)) != NULL) {
+ if (qemu_file_rate_limit(f)) {
+ break;
+ }
+ if (blk->ret < 0) {
+ qemu_file_set_error(f);
+ break;
+ }
+ blk_send(f, blk);
+
+ QSIMPLEQ_REMOVE_HEAD(&block_mig_state.blk_list, entry);
+ qemu_free(blk->buf);
+ qemu_free(blk);
+
+ block_mig_state.read_done--;
+ block_mig_state.transferred++;
+ assert(block_mig_state.read_done >= 0);
+ }
+
+ DPRINTF("%s Exit submitted %d read_done %d transferred %d\n", __FUNCTION__,
+ block_mig_state.submitted, block_mig_state.read_done,
+ block_mig_state.transferred);
+}
+
+static int64_t get_remaining_dirty(void)
+{
+ BlkMigDevState *bmds;
+ int64_t dirty = 0;
+
+ QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
+ dirty += bdrv_get_dirty_count(bmds->bs);
+ }
+
+ return dirty * BLOCK_SIZE;
+}
+
+static int is_stage2_completed(void)
+{
+ int64_t remaining_dirty;
+ long double bwidth;
+
+ if (block_mig_state.bulk_completed == 1) {
+
+ remaining_dirty = get_remaining_dirty();
+ if (remaining_dirty == 0) {
+ return 1;
+ }
+
+ bwidth = compute_read_bwidth();
+
+ if ((remaining_dirty / bwidth) <=
+ migrate_max_downtime()) {
+ /* finish stage2 because we think that we can finish remaing work
+ below max_downtime */
+
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static void blk_mig_cleanup(Monitor *mon)
+{
+ BlkMigDevState *bmds;
+ BlkMigBlock *blk;
+
+ set_dirty_tracking(0);
+
+ while ((bmds = QSIMPLEQ_FIRST(&block_mig_state.bmds_list)) != NULL) {
+ QSIMPLEQ_REMOVE_HEAD(&block_mig_state.bmds_list, entry);
+ bdrv_set_in_use(bmds->bs, 0);
+ drive_put_ref(drive_get_by_blockdev(bmds->bs));
+ qemu_free(bmds->aio_bitmap);
+ qemu_free(bmds);
+ }
+
+ while ((blk = QSIMPLEQ_FIRST(&block_mig_state.blk_list)) != NULL) {
+ QSIMPLEQ_REMOVE_HEAD(&block_mig_state.blk_list, entry);
+ qemu_free(blk->buf);
+ qemu_free(blk);
+ }
+
+ monitor_printf(mon, "\n");
+}
+
+static int block_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
+{
+ DPRINTF("Enter save live stage %d submitted %d transferred %d\n",
+ stage, block_mig_state.submitted, block_mig_state.transferred);
+
+ if (stage < 0) {
+ blk_mig_cleanup(mon);
+ return 0;
+ }
+
+ if (block_mig_state.blk_enable != 1) {
+ /* no need to migrate storage */
+ qemu_put_be64(f, BLK_MIG_FLAG_EOS);
+ return 1;
+ }
+
+ if (stage == 1) {
+ init_blk_migration(mon, f);
+
+ /* start track dirty blocks */
+ set_dirty_tracking(1);
+ }
+
+ flush_blks(f);
+
+ if (qemu_file_has_error(f)) {
+ blk_mig_cleanup(mon);
+ return 0;
+ }
+
+ blk_mig_reset_dirty_cursor();
+
+ if (stage == 2) {
+ /* control the rate of transfer */
+ while ((block_mig_state.submitted +
+ block_mig_state.read_done) * BLOCK_SIZE <
+ qemu_file_get_rate_limit(f)) {
+ if (block_mig_state.bulk_completed == 0) {
+ /* first finish the bulk phase */
+ if (blk_mig_save_bulked_block(mon, f) == 0) {
+ /* finished saving bulk on all devices */
+ block_mig_state.bulk_completed = 1;
+ }
+ } else {
+ if (blk_mig_save_dirty_block(mon, f, 1) == 0) {
+ /* no more dirty blocks */
+ break;
+ }
+ }
+ }
+
+ flush_blks(f);
+
+ if (qemu_file_has_error(f)) {
+ blk_mig_cleanup(mon);
+ return 0;
+ }
+ }
+
+ if (stage == 3) {
+ /* we know for sure that save bulk is completed and
+ all async read completed */
+ assert(block_mig_state.submitted == 0);
+
+ while (blk_mig_save_dirty_block(mon, f, 0) != 0);
+ blk_mig_cleanup(mon);
+
+ /* report completion */
+ qemu_put_be64(f, (100 << BDRV_SECTOR_BITS) | BLK_MIG_FLAG_PROGRESS);
+
+ if (qemu_file_has_error(f)) {
+ return 0;
+ }
+
+ monitor_printf(mon, "Block migration completed\n");
+ }
+
+ qemu_put_be64(f, BLK_MIG_FLAG_EOS);
+
+ return ((stage == 2) && is_stage2_completed());
+}
+
+static int block_load(QEMUFile *f, void *opaque, int version_id)
+{
+ static int banner_printed;
+ int len, flags;
+ char device_name[256];
+ int64_t addr;
+ BlockDriverState *bs, *bs_prev = NULL;
+ uint8_t *buf;
+ int64_t total_sectors = 0;
+ int nr_sectors;
+
+ do {
+ addr = qemu_get_be64(f);
+
+ flags = addr & ~BDRV_SECTOR_MASK;
+ addr >>= BDRV_SECTOR_BITS;
+
+ if (flags & BLK_MIG_FLAG_DEVICE_BLOCK) {
+ int ret;
+ /* get device name */
+ len = qemu_get_byte(f);
+ qemu_get_buffer(f, (uint8_t *)device_name, len);
+ device_name[len] = '\0';
+
+ bs = bdrv_find(device_name);
+ if (!bs) {
+ fprintf(stderr, "Error unknown block device %s\n",
+ device_name);
+ return -EINVAL;
+ }
+
+ if (bs != bs_prev) {
+ bs_prev = bs;
+ total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
+ if (total_sectors <= 0) {
+ error_report("Error getting length of block device %s",
+ device_name);
+ return -EINVAL;
+ }
+ }
+
+ if (total_sectors - addr < BDRV_SECTORS_PER_DIRTY_CHUNK) {
+ nr_sectors = total_sectors - addr;
+ } else {
+ nr_sectors = BDRV_SECTORS_PER_DIRTY_CHUNK;
+ }
+
+ buf = qemu_malloc(BLOCK_SIZE);
+
+ qemu_get_buffer(f, buf, BLOCK_SIZE);
+ ret = bdrv_write(bs, addr, buf, nr_sectors);
+
+ qemu_free(buf);
+ if (ret < 0) {
+ return ret;
+ }
+ } else if (flags & BLK_MIG_FLAG_PROGRESS) {
+ if (!banner_printed) {
+ printf("Receiving block device images\n");
+ banner_printed = 1;
+ }
+ printf("Completed %d %%%c", (int)addr,
+ (addr == 100) ? '\n' : '\r');
+ fflush(stdout);
+ } else if (!(flags & BLK_MIG_FLAG_EOS)) {
+ fprintf(stderr, "Unknown flags\n");
+ return -EINVAL;
+ }
+ if (qemu_file_has_error(f)) {
+ return -EIO;
+ }
+ } while (!(flags & BLK_MIG_FLAG_EOS));
+
+ return 0;
+}
+
+static void block_set_params(int blk_enable, int shared_base, void *opaque)
+{
+ block_mig_state.blk_enable = blk_enable;
+ block_mig_state.shared_base = shared_base;
+
+ /* shared base means that blk_enable = 1 */
+ block_mig_state.blk_enable |= shared_base;
+}
+
+void blk_mig_init(void)
+{
+ QSIMPLEQ_INIT(&block_mig_state.bmds_list);
+ QSIMPLEQ_INIT(&block_mig_state.blk_list);
+
+ register_savevm_live(NULL, "block", 0, 1, block_set_params,
+ block_save_live, NULL, block_load, &block_mig_state);
+}
diff --git a/qemu-0.15.x/block-migration.h b/qemu-0.15.x/block-migration.h
new file mode 100644
index 0000000..ffa8ac0
--- /dev/null
+++ b/qemu-0.15.x/block-migration.h
@@ -0,0 +1,23 @@
+/*
+ * QEMU live block migration
+ *
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ * Liran Schour <lirans(a)il.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef BLOCK_MIGRATION_H
+#define BLOCK_MIGRATION_H
+
+void blk_mig_init(void);
+int blk_mig_active(void);
+uint64_t blk_mig_bytes_transferred(void);
+uint64_t blk_mig_bytes_remaining(void);
+uint64_t blk_mig_bytes_total(void);
+
+#endif /* BLOCK_MIGRATION_H */
diff --git a/qemu-0.15.x/block.c b/qemu-0.15.x/block.c
new file mode 100644
index 0000000..9549b9e
--- /dev/null
+++ b/qemu-0.15.x/block.c
@@ -0,0 +1,3039 @@
+/*
+ * QEMU System Emulator block driver
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * 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.
+ */
+#include "config-host.h"
+#include "qemu-common.h"
+#include "trace.h"
+#include "monitor.h"
+#include "block_int.h"
+#include "module.h"
+#include "qemu-objects.h"
+
+#ifdef CONFIG_BSD
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/queue.h>
+#ifndef __DragonFly__
+#include <sys/disk.h>
+#endif
+#endif
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque);
+static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque);
+static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque);
+static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque);
+static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors);
+static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors);
+
+static QTAILQ_HEAD(, BlockDriverState) bdrv_states =
+ QTAILQ_HEAD_INITIALIZER(bdrv_states);
+
+static QLIST_HEAD(, BlockDriver) bdrv_drivers =
+ QLIST_HEAD_INITIALIZER(bdrv_drivers);
+
+/* The device to use for VM snapshots */
+static BlockDriverState *bs_snapshots;
+
+/* If non-zero, use only whitelisted block drivers */
+static int use_bdrv_whitelist;
+
+#ifdef _WIN32
+static int is_windows_drive_prefix(const char *filename)
+{
+ return (((filename[0] >= 'a' && filename[0] <= 'z') ||
+ (filename[0] >= 'A' && filename[0] <= 'Z')) &&
+ filename[1] == ':');
+}
+
+int is_windows_drive(const char *filename)
+{
+ if (is_windows_drive_prefix(filename) &&
+ filename[2] == '\0')
+ return 1;
+ if (strstart(filename, "\\\\.\\", NULL) ||
+ strstart(filename, "//./", NULL))
+ return 1;
+ return 0;
+}
+#endif
+
+/* check if the path starts with "<protocol>:" */
+static int path_has_protocol(const char *path)
+{
+#ifdef _WIN32
+ if (is_windows_drive(path) ||
+ is_windows_drive_prefix(path)) {
+ return 0;
+ }
+#endif
+
+ return strchr(path, ':') != NULL;
+}
+
+int path_is_absolute(const char *path)
+{
+ const char *p;
+#ifdef _WIN32
+ /* specific case for names like: "\\.\d:" */
+ if (*path == '/' || *path == '\\')
+ return 1;
+#endif
+ p = strchr(path, ':');
+ if (p)
+ p++;
+ else
+ p = path;
+#ifdef _WIN32
+ return (*p == '/' || *p == '\\');
+#else
+ return (*p == '/');
+#endif
+}
+
+/* if filename is absolute, just copy it to dest. Otherwise, build a
+ path to it by considering it is relative to base_path. URL are
+ supported. */
+void path_combine(char *dest, int dest_size,
+ const char *base_path,
+ const char *filename)
+{
+ const char *p, *p1;
+ int len;
+
+ if (dest_size <= 0)
+ return;
+ if (path_is_absolute(filename)) {
+ pstrcpy(dest, dest_size, filename);
+ } else {
+ p = strchr(base_path, ':');
+ if (p)
+ p++;
+ else
+ p = base_path;
+ p1 = strrchr(base_path, '/');
+#ifdef _WIN32
+ {
+ const char *p2;
+ p2 = strrchr(base_path, '\\');
+ if (!p1 || p2 > p1)
+ p1 = p2;
+ }
+#endif
+ if (p1)
+ p1++;
+ else
+ p1 = base_path;
+ if (p1 > p)
+ p = p1;
+ len = p - base_path;
+ if (len > dest_size - 1)
+ len = dest_size - 1;
+ memcpy(dest, base_path, len);
+ dest[len] = '\0';
+ pstrcat(dest, dest_size, filename);
+ }
+}
+
+void bdrv_register(BlockDriver *bdrv)
+{
+ if (!bdrv->bdrv_aio_readv) {
+ /* add AIO emulation layer */
+ bdrv->bdrv_aio_readv = bdrv_aio_readv_em;
+ bdrv->bdrv_aio_writev = bdrv_aio_writev_em;
+ } else if (!bdrv->bdrv_read) {
+ /* add synchronous IO emulation layer */
+ bdrv->bdrv_read = bdrv_read_em;
+ bdrv->bdrv_write = bdrv_write_em;
+ }
+
+ if (!bdrv->bdrv_aio_flush)
+ bdrv->bdrv_aio_flush = bdrv_aio_flush_em;
+
+ QLIST_INSERT_HEAD(&bdrv_drivers, bdrv, list);
+}
+
+/* create a new block device (by default it is empty) */
+BlockDriverState *bdrv_new(const char *device_name)
+{
+ BlockDriverState *bs;
+
+ bs = qemu_mallocz(sizeof(BlockDriverState));
+ pstrcpy(bs->device_name, sizeof(bs->device_name), device_name);
+ if (device_name[0] != '\0') {
+ QTAILQ_INSERT_TAIL(&bdrv_states, bs, list);
+ }
+ return bs;
+}
+
+BlockDriver *bdrv_find_format(const char *format_name)
+{
+ BlockDriver *drv1;
+ QLIST_FOREACH(drv1, &bdrv_drivers, list) {
+ if (!strcmp(drv1->format_name, format_name)) {
+ return drv1;
+ }
+ }
+ return NULL;
+}
+
+static int bdrv_is_whitelisted(BlockDriver *drv)
+{
+ static const char *whitelist[] = {
+ CONFIG_BDRV_WHITELIST
+ };
+ const char **p;
+
+ if (!whitelist[0])
+ return 1; /* no whitelist, anything goes */
+
+ for (p = whitelist; *p; p++) {
+ if (!strcmp(drv->format_name, *p)) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+BlockDriver *bdrv_find_whitelisted_format(const char *format_name)
+{
+ BlockDriver *drv = bdrv_find_format(format_name);
+ return drv && bdrv_is_whitelisted(drv) ? drv : NULL;
+}
+
+int bdrv_create(BlockDriver *drv, const char* filename,
+ QEMUOptionParameter *options)
+{
+ if (!drv->bdrv_create)
+ return -ENOTSUP;
+
+ return drv->bdrv_create(filename, options);
+}
+
+int bdrv_create_file(const char* filename, QEMUOptionParameter *options)
+{
+ BlockDriver *drv;
+
+ drv = bdrv_find_protocol(filename);
+ if (drv == NULL) {
+ return -ENOENT;
+ }
+
+ return bdrv_create(drv, filename, options);
+}
+
+#ifdef _WIN32
+void get_tmp_filename(char *filename, int size)
+{
+ char temp_dir[MAX_PATH];
+
+ GetTempPath(MAX_PATH, temp_dir);
+ GetTempFileName(temp_dir, "qem", 0, filename);
+}
+#else
+void get_tmp_filename(char *filename, int size)
+{
+ int fd;
+ const char *tmpdir;
+ /* XXX: race condition possible */
+ tmpdir = getenv("TMPDIR");
+ if (!tmpdir)
+ tmpdir = "/tmp";
+ snprintf(filename, size, "%s/vl.XXXXXX", tmpdir);
+ fd = mkstemp(filename);
+ close(fd);
+}
+#endif
+
+/*
+ * Detect host devices. By convention, /dev/cdrom[N] is always
+ * recognized as a host CDROM.
+ */
+static BlockDriver *find_hdev_driver(const char *filename)
+{
+ int score_max = 0, score;
+ BlockDriver *drv = NULL, *d;
+
+ QLIST_FOREACH(d, &bdrv_drivers, list) {
+ if (d->bdrv_probe_device) {
+ score = d->bdrv_probe_device(filename);
+ if (score > score_max) {
+ score_max = score;
+ drv = d;
+ }
+ }
+ }
+
+ return drv;
+}
+
+BlockDriver *bdrv_find_protocol(const char *filename)
+{
+ BlockDriver *drv1;
+ char protocol[128];
+ int len;
+ const char *p;
+
+ /* TODO Drivers without bdrv_file_open must be specified explicitly */
+
+ /*
+ * XXX(hch): we really should not let host device detection
+ * override an explicit protocol specification, but moving this
+ * later breaks access to device names with colons in them.
+ * Thanks to the brain-dead persistent naming schemes on udev-
+ * based Linux systems those actually are quite common.
+ */
+ drv1 = find_hdev_driver(filename);
+ if (drv1) {
+ return drv1;
+ }
+
+ if (!path_has_protocol(filename)) {
+ return bdrv_find_format("file");
+ }
+ p = strchr(filename, ':');
+ assert(p != NULL);
+ len = p - filename;
+ if (len > sizeof(protocol) - 1)
+ len = sizeof(protocol) - 1;
+ memcpy(protocol, filename, len);
+ protocol[len] = '\0';
+ QLIST_FOREACH(drv1, &bdrv_drivers, list) {
+ if (drv1->protocol_name &&
+ !strcmp(drv1->protocol_name, protocol)) {
+ return drv1;
+ }
+ }
+ return NULL;
+}
+
+static int find_image_format(const char *filename, BlockDriver **pdrv)
+{
+ int ret, score, score_max;
+ BlockDriver *drv1, *drv;
+ uint8_t buf[2048];
+ BlockDriverState *bs;
+
+ ret = bdrv_file_open(&bs, filename, 0);
+ if (ret < 0) {
+ *pdrv = NULL;
+ return ret;
+ }
+
+ /* Return the raw BlockDriver * to scsi-generic devices or empty drives */
+ if (bs->sg || !bdrv_is_inserted(bs)) {
+ bdrv_delete(bs);
+ drv = bdrv_find_format("raw");
+ if (!drv) {
+ ret = -ENOENT;
+ }
+ *pdrv = drv;
+ return ret;
+ }
+
+ ret = bdrv_pread(bs, 0, buf, sizeof(buf));
+ bdrv_delete(bs);
+ if (ret < 0) {
+ *pdrv = NULL;
+ return ret;
+ }
+
+ score_max = 0;
+ drv = NULL;
+ QLIST_FOREACH(drv1, &bdrv_drivers, list) {
+ if (drv1->bdrv_probe) {
+ score = drv1->bdrv_probe(buf, ret, filename);
+ if (score > score_max) {
+ score_max = score;
+ drv = drv1;
+ }
+ }
+ }
+ if (!drv) {
+ ret = -ENOENT;
+ }
+ *pdrv = drv;
+ return ret;
+}
+
+/**
+ * Set the current 'total_sectors' value
+ */
+static int refresh_total_sectors(BlockDriverState *bs, int64_t hint)
+{
+ BlockDriver *drv = bs->drv;
+
+ /* Do not attempt drv->bdrv_getlength() on scsi-generic devices */
+ if (bs->sg)
+ return 0;
+
+ /* query actual device if possible, otherwise just trust the hint */
+ if (drv->bdrv_getlength) {
+ int64_t length = drv->bdrv_getlength(bs);
+ if (length < 0) {
+ return length;
+ }
+ hint = length >> BDRV_SECTOR_BITS;
+ }
+
+ bs->total_sectors = hint;
+ return 0;
+}
+
+/*
+ * Common part for opening disk images and files
+ */
+static int bdrv_open_common(BlockDriverState *bs, const char *filename,
+ int flags, BlockDriver *drv)
+{
+ int ret, open_flags;
+
+ assert(drv != NULL);
+
+ bs->file = NULL;
+ bs->total_sectors = 0;
+ bs->encrypted = 0;
+ bs->valid_key = 0;
+ bs->open_flags = flags;
+ /* buffer_alignment defaulted to 512, drivers can change this value */
+ bs->buffer_alignment = 512;
+
+ pstrcpy(bs->filename, sizeof(bs->filename), filename);
+
+ if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv)) {
+ return -ENOTSUP;
+ }
+
+ bs->drv = drv;
+ bs->opaque = qemu_mallocz(drv->instance_size);
+
+ if (flags & BDRV_O_CACHE_WB)
+ bs->enable_write_cache = 1;
+
+ /*
+ * Clear flags that are internal to the block layer before opening the
+ * image.
+ */
+ open_flags = flags & ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
+
+ /*
+ * Snapshots should be writable.
+ */
+ if (bs->is_temporary) {
+ open_flags |= BDRV_O_RDWR;
+ }
+
+ /* Open the image, either directly or using a protocol */
+ if (drv->bdrv_file_open) {
+ ret = drv->bdrv_file_open(bs, filename, open_flags);
+ } else {
+ ret = bdrv_file_open(&bs->file, filename, open_flags);
+ if (ret >= 0) {
+ ret = drv->bdrv_open(bs, open_flags);
+ }
+ }
+
+ if (ret < 0) {
+ goto free_and_fail;
+ }
+
+ bs->keep_read_only = bs->read_only = !(open_flags & BDRV_O_RDWR);
+
+ ret = refresh_total_sectors(bs, bs->total_sectors);
+ if (ret < 0) {
+ goto free_and_fail;
+ }
+
+#ifndef _WIN32
+ if (bs->is_temporary) {
+ unlink(filename);
+ }
+#endif
+ return 0;
+
+free_and_fail:
+ if (bs->file) {
+ bdrv_delete(bs->file);
+ bs->file = NULL;
+ }
+ qemu_free(bs->opaque);
+ bs->opaque = NULL;
+ bs->drv = NULL;
+ return ret;
+}
+
+/*
+ * Opens a file using a protocol (file, host_device, nbd, ...)
+ */
+int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
+{
+ BlockDriverState *bs;
+ BlockDriver *drv;
+ int ret;
+
+ drv = bdrv_find_protocol(filename);
+ if (!drv) {
+ return -ENOENT;
+ }
+
+ bs = bdrv_new("");
+ ret = bdrv_open_common(bs, filename, flags, drv);
+ if (ret < 0) {
+ bdrv_delete(bs);
+ return ret;
+ }
+ bs->growable = 1;
+ *pbs = bs;
+ return 0;
+}
+
+/*
+ * Opens a disk image (raw, qcow2, vmdk, ...)
+ */
+int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
+ BlockDriver *drv)
+{
+ int ret;
+
+ if (flags & BDRV_O_SNAPSHOT) {
+ BlockDriverState *bs1;
+ int64_t total_size;
+ int is_protocol = 0;
+ BlockDriver *bdrv_qcow2;
+ QEMUOptionParameter *options;
+ char tmp_filename[PATH_MAX];
+ char backing_filename[PATH_MAX];
+
+ /* if snapshot, we create a temporary backing file and open it
+ instead of opening 'filename' directly */
+
+ /* if there is a backing file, use it */
+ bs1 = bdrv_new("");
+ ret = bdrv_open(bs1, filename, 0, drv);
+ if (ret < 0) {
+ bdrv_delete(bs1);
+ return ret;
+ }
+ total_size = bdrv_getlength(bs1) & BDRV_SECTOR_MASK;
+
+ if (bs1->drv && bs1->drv->protocol_name)
+ is_protocol = 1;
+
+ bdrv_delete(bs1);
+
+ get_tmp_filename(tmp_filename, sizeof(tmp_filename));
+
+ /* Real path is meaningless for protocols */
+ if (is_protocol)
+ snprintf(backing_filename, sizeof(backing_filename),
+ "%s", filename);
+ else if (!realpath(filename, backing_filename))
+ return -errno;
+
+ bdrv_qcow2 = bdrv_find_format("qcow2");
+ options = parse_option_parameters("", bdrv_qcow2->create_options, NULL);
+
+ set_option_parameter_int(options, BLOCK_OPT_SIZE, total_size);
+ set_option_parameter(options, BLOCK_OPT_BACKING_FILE, backing_filename);
+ if (drv) {
+ set_option_parameter(options, BLOCK_OPT_BACKING_FMT,
+ drv->format_name);
+ }
+
+ ret = bdrv_create(bdrv_qcow2, tmp_filename, options);
+ free_option_parameters(options);
+ if (ret < 0) {
+ return ret;
+ }
+
+ filename = tmp_filename;
+ drv = bdrv_qcow2;
+ bs->is_temporary = 1;
+ }
+
+ /* Find the right image format driver */
+ if (!drv) {
+ ret = find_image_format(filename, &drv);
+ }
+
+ if (!drv) {
+ goto unlink_and_fail;
+ }
+
+ /* Open the image */
+ ret = bdrv_open_common(bs, filename, flags, drv);
+ if (ret < 0) {
+ goto unlink_and_fail;
+ }
+
+ /* If there is a backing file, use it */
+ if ((flags & BDRV_O_NO_BACKING) == 0 && bs->backing_file[0] != '\0') {
+ char backing_filename[PATH_MAX];
+ int back_flags;
+ BlockDriver *back_drv = NULL;
+
+ bs->backing_hd = bdrv_new("");
+
+ if (path_has_protocol(bs->backing_file)) {
+ pstrcpy(backing_filename, sizeof(backing_filename),
+ bs->backing_file);
+ } else {
+ path_combine(backing_filename, sizeof(backing_filename),
+ filename, bs->backing_file);
+ }
+
+ if (bs->backing_format[0] != '\0') {
+ back_drv = bdrv_find_format(bs->backing_format);
+ }
+
+ /* backing files always opened read-only */
+ back_flags =
+ flags & ~(BDRV_O_RDWR | BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING);
+
+ ret = bdrv_open(bs->backing_hd, backing_filename, back_flags, back_drv);
+ if (ret < 0) {
+ bdrv_close(bs);
+ return ret;
+ }
+ if (bs->is_temporary) {
+ bs->backing_hd->keep_read_only = !(flags & BDRV_O_RDWR);
+ } else {
+ /* base image inherits from "parent" */
+ bs->backing_hd->keep_read_only = bs->keep_read_only;
+ }
+ }
+
+ if (!bdrv_key_required(bs)) {
+ /* call the change callback */
+ bs->media_changed = 1;
+ if (bs->change_cb)
+ bs->change_cb(bs->change_opaque, CHANGE_MEDIA);
+ }
+
+ return 0;
+
+unlink_and_fail:
+ if (bs->is_temporary) {
+ unlink(filename);
+ }
+ return ret;
+}
+
+void bdrv_close(BlockDriverState *bs)
+{
+ if (bs->drv) {
+ if (bs == bs_snapshots) {
+ bs_snapshots = NULL;
+ }
+ if (bs->backing_hd) {
+ bdrv_delete(bs->backing_hd);
+ bs->backing_hd = NULL;
+ }
+ bs->drv->bdrv_close(bs);
+ qemu_free(bs->opaque);
+#ifdef _WIN32
+ if (bs->is_temporary) {
+ unlink(bs->filename);
+ }
+#endif
+ bs->opaque = NULL;
+ bs->drv = NULL;
+
+ if (bs->file != NULL) {
+ bdrv_close(bs->file);
+ }
+
+ /* call the change callback */
+ bs->media_changed = 1;
+ if (bs->change_cb)
+ bs->change_cb(bs->change_opaque, CHANGE_MEDIA);
+ }
+}
+
+void bdrv_close_all(void)
+{
+ BlockDriverState *bs;
+
+ QTAILQ_FOREACH(bs, &bdrv_states, list) {
+ bdrv_close(bs);
+ }
+}
+
+/* make a BlockDriverState anonymous by removing from bdrv_state list.
+ Also, NULL terminate the device_name to prevent double remove */
+void bdrv_make_anon(BlockDriverState *bs)
+{
+ if (bs->device_name[0] != '\0') {
+ QTAILQ_REMOVE(&bdrv_states, bs, list);
+ }
+ bs->device_name[0] = '\0';
+}
+
+void bdrv_delete(BlockDriverState *bs)
+{
+ assert(!bs->peer);
+
+ /* remove from list, if necessary */
+ bdrv_make_anon(bs);
+
+ bdrv_close(bs);
+ if (bs->file != NULL) {
+ bdrv_delete(bs->file);
+ }
+
+ assert(bs != bs_snapshots);
+ qemu_free(bs);
+}
+
+int bdrv_attach(BlockDriverState *bs, DeviceState *qdev)
+{
+ if (bs->peer) {
+ return -EBUSY;
+ }
+ bs->peer = qdev;
+ return 0;
+}
+
+void bdrv_detach(BlockDriverState *bs, DeviceState *qdev)
+{
+ assert(bs->peer == qdev);
+ bs->peer = NULL;
+}
+
+DeviceState *bdrv_get_attached(BlockDriverState *bs)
+{
+ return bs->peer;
+}
+
+/*
+ * Run consistency checks on an image
+ *
+ * Returns 0 if the check could be completed (it doesn't mean that the image is
+ * free of errors) or -errno when an internal error occurred. The results of the
+ * check are stored in res.
+ */
+int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res)
+{
+ if (bs->drv->bdrv_check == NULL) {
+ return -ENOTSUP;
+ }
+
+ memset(res, 0, sizeof(*res));
+ return bs->drv->bdrv_check(bs, res);
+}
+
+#define COMMIT_BUF_SECTORS 2048
+
+/* commit COW file into the raw image */
+int bdrv_commit(BlockDriverState *bs)
+{
+ BlockDriver *drv = bs->drv;
+ BlockDriver *backing_drv;
+ int64_t sector, total_sectors;
+ int n, ro, open_flags;
+ int ret = 0, rw_ret = 0;
+ uint8_t *buf;
+ char filename[1024];
+ BlockDriverState *bs_rw, *bs_ro;
+
+ if (!drv)
+ return -ENOMEDIUM;
+
+ if (!bs->backing_hd) {
+ return -ENOTSUP;
+ }
+
+ if (bs->backing_hd->keep_read_only) {
+ return -EACCES;
+ }
+
+ backing_drv = bs->backing_hd->drv;
+ ro = bs->backing_hd->read_only;
+ strncpy(filename, bs->backing_hd->filename, sizeof(filename));
+ open_flags = bs->backing_hd->open_flags;
+
+ if (ro) {
+ /* re-open as RW */
+ bdrv_delete(bs->backing_hd);
+ bs->backing_hd = NULL;
+ bs_rw = bdrv_new("");
+ rw_ret = bdrv_open(bs_rw, filename, open_flags | BDRV_O_RDWR,
+ backing_drv);
+ if (rw_ret < 0) {
+ bdrv_delete(bs_rw);
+ /* try to re-open read-only */
+ bs_ro = bdrv_new("");
+ ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
+ backing_drv);
+ if (ret < 0) {
+ bdrv_delete(bs_ro);
+ /* drive not functional anymore */
+ bs->drv = NULL;
+ return ret;
+ }
+ bs->backing_hd = bs_ro;
+ return rw_ret;
+ }
+ bs->backing_hd = bs_rw;
+ }
+
+ total_sectors = bdrv_getlength(bs) >> BDRV_SECTOR_BITS;
+ buf = qemu_malloc(COMMIT_BUF_SECTORS * BDRV_SECTOR_SIZE);
+
+ for (sector = 0; sector < total_sectors; sector += n) {
+ if (drv->bdrv_is_allocated(bs, sector, COMMIT_BUF_SECTORS, &n)) {
+
+ if (bdrv_read(bs, sector, buf, n) != 0) {
+ ret = -EIO;
+ goto ro_cleanup;
+ }
+
+ if (bdrv_write(bs->backing_hd, sector, buf, n) != 0) {
+ ret = -EIO;
+ goto ro_cleanup;
+ }
+ }
+ }
+
+ if (drv->bdrv_make_empty) {
+ ret = drv->bdrv_make_empty(bs);
+ bdrv_flush(bs);
+ }
+
+ /*
+ * Make sure all data we wrote to the backing device is actually
+ * stable on disk.
+ */
+ if (bs->backing_hd)
+ bdrv_flush(bs->backing_hd);
+
+ro_cleanup:
+ qemu_free(buf);
+
+ if (ro) {
+ /* re-open as RO */
+ bdrv_delete(bs->backing_hd);
+ bs->backing_hd = NULL;
+ bs_ro = bdrv_new("");
+ ret = bdrv_open(bs_ro, filename, open_flags & ~BDRV_O_RDWR,
+ backing_drv);
+ if (ret < 0) {
+ bdrv_delete(bs_ro);
+ /* drive not functional anymore */
+ bs->drv = NULL;
+ return ret;
+ }
+ bs->backing_hd = bs_ro;
+ bs->backing_hd->keep_read_only = 0;
+ }
+
+ return ret;
+}
+
+void bdrv_commit_all(void)
+{
+ BlockDriverState *bs;
+
+ QTAILQ_FOREACH(bs, &bdrv_states, list) {
+ bdrv_commit(bs);
+ }
+}
+
+/*
+ * Return values:
+ * 0 - success
+ * -EINVAL - backing format specified, but no file
+ * -ENOSPC - can't update the backing file because no space is left in the
+ * image file header
+ * -ENOTSUP - format driver doesn't support changing the backing file
+ */
+int bdrv_change_backing_file(BlockDriverState *bs,
+ const char *backing_file, const char *backing_fmt)
+{
+ BlockDriver *drv = bs->drv;
+
+ if (drv->bdrv_change_backing_file != NULL) {
+ return drv->bdrv_change_backing_file(bs, backing_file, backing_fmt);
+ } else {
+ return -ENOTSUP;
+ }
+}
+
+static int bdrv_check_byte_request(BlockDriverState *bs, int64_t offset,
+ size_t size)
+{
+ int64_t len;
+
+ if (!bdrv_is_inserted(bs))
+ return -ENOMEDIUM;
+
+ if (bs->growable)
+ return 0;
+
+ len = bdrv_getlength(bs);
+
+ if (offset < 0)
+ return -EIO;
+
+ if ((offset > len) || (len - offset < size))
+ return -EIO;
+
+ return 0;
+}
+
+static int bdrv_check_request(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors)
+{
+ return bdrv_check_byte_request(bs, sector_num * BDRV_SECTOR_SIZE,
+ nb_sectors * BDRV_SECTOR_SIZE);
+}
+
+/* return < 0 if error. See bdrv_write() for the return codes */
+int bdrv_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BlockDriver *drv = bs->drv;
+
+ if (!drv)
+ return -ENOMEDIUM;
+ if (bdrv_check_request(bs, sector_num, nb_sectors))
+ return -EIO;
+
+ return drv->bdrv_read(bs, sector_num, buf, nb_sectors);
+}
+
+static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors, int dirty)
+{
+ int64_t start, end;
+ unsigned long val, idx, bit;
+
+ start = sector_num / BDRV_SECTORS_PER_DIRTY_CHUNK;
+ end = (sector_num + nb_sectors - 1) / BDRV_SECTORS_PER_DIRTY_CHUNK;
+
+ for (; start <= end; start++) {
+ idx = start / (sizeof(unsigned long) * 8);
+ bit = start % (sizeof(unsigned long) * 8);
+ val = bs->dirty_bitmap[idx];
+ if (dirty) {
+ if (!(val & (1UL << bit))) {
+ bs->dirty_count++;
+ val |= 1UL << bit;
+ }
+ } else {
+ if (val & (1UL << bit)) {
+ bs->dirty_count--;
+ val &= ~(1UL << bit);
+ }
+ }
+ bs->dirty_bitmap[idx] = val;
+ }
+}
+
+/* Return < 0 if error. Important errors are:
+ -EIO generic I/O error (may happen for all errors)
+ -ENOMEDIUM No media inserted.
+ -EINVAL Invalid sector number or nb_sectors
+ -EACCES Trying to write a read-only device
+*/
+int bdrv_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BlockDriver *drv = bs->drv;
+ if (!bs->drv)
+ return -ENOMEDIUM;
+ if (bs->read_only)
+ return -EACCES;
+ if (bdrv_check_request(bs, sector_num, nb_sectors))
+ return -EIO;
+
+ if (bs->dirty_bitmap) {
+ set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
+ }
+
+ if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
+ bs->wr_highest_sector = sector_num + nb_sectors - 1;
+ }
+
+ return drv->bdrv_write(bs, sector_num, buf, nb_sectors);
+}
+
+int bdrv_pread(BlockDriverState *bs, int64_t offset,
+ void *buf, int count1)
+{
+ uint8_t tmp_buf[BDRV_SECTOR_SIZE];
+ int len, nb_sectors, count;
+ int64_t sector_num;
+ int ret;
+
+ count = count1;
+ /* first read to align to sector start */
+ len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
+ if (len > count)
+ len = count;
+ sector_num = offset >> BDRV_SECTOR_BITS;
+ if (len > 0) {
+ if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
+ return ret;
+ memcpy(buf, tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), len);
+ count -= len;
+ if (count == 0)
+ return count1;
+ sector_num++;
+ buf += len;
+ }
+
+ /* read the sectors "in place" */
+ nb_sectors = count >> BDRV_SECTOR_BITS;
+ if (nb_sectors > 0) {
+ if ((ret = bdrv_read(bs, sector_num, buf, nb_sectors)) < 0)
+ return ret;
+ sector_num += nb_sectors;
+ len = nb_sectors << BDRV_SECTOR_BITS;
+ buf += len;
+ count -= len;
+ }
+
+ /* add data from the last sector */
+ if (count > 0) {
+ if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
+ return ret;
+ memcpy(buf, tmp_buf, count);
+ }
+ return count1;
+}
+
+int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
+ const void *buf, int count1)
+{
+ uint8_t tmp_buf[BDRV_SECTOR_SIZE];
+ int len, nb_sectors, count;
+ int64_t sector_num;
+ int ret;
+
+ count = count1;
+ /* first write to align to sector start */
+ len = (BDRV_SECTOR_SIZE - offset) & (BDRV_SECTOR_SIZE - 1);
+ if (len > count)
+ len = count;
+ sector_num = offset >> BDRV_SECTOR_BITS;
+ if (len > 0) {
+ if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
+ return ret;
+ memcpy(tmp_buf + (offset & (BDRV_SECTOR_SIZE - 1)), buf, len);
+ if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
+ return ret;
+ count -= len;
+ if (count == 0)
+ return count1;
+ sector_num++;
+ buf += len;
+ }
+
+ /* write the sectors "in place" */
+ nb_sectors = count >> BDRV_SECTOR_BITS;
+ if (nb_sectors > 0) {
+ if ((ret = bdrv_write(bs, sector_num, buf, nb_sectors)) < 0)
+ return ret;
+ sector_num += nb_sectors;
+ len = nb_sectors << BDRV_SECTOR_BITS;
+ buf += len;
+ count -= len;
+ }
+
+ /* add data from the last sector */
+ if (count > 0) {
+ if ((ret = bdrv_read(bs, sector_num, tmp_buf, 1)) < 0)
+ return ret;
+ memcpy(tmp_buf, buf, count);
+ if ((ret = bdrv_write(bs, sector_num, tmp_buf, 1)) < 0)
+ return ret;
+ }
+ return count1;
+}
+
+/*
+ * Writes to the file and ensures that no writes are reordered across this
+ * request (acts as a barrier)
+ *
+ * Returns 0 on success, -errno in error cases.
+ */
+int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
+ const void *buf, int count)
+{
+ int ret;
+
+ ret = bdrv_pwrite(bs, offset, buf, count);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /* No flush needed for cache=writethrough, it uses O_DSYNC */
+ if ((bs->open_flags & BDRV_O_CACHE_MASK) != 0) {
+ bdrv_flush(bs);
+ }
+
+ return 0;
+}
+
+/*
+ * Writes to the file and ensures that no writes are reordered across this
+ * request (acts as a barrier)
+ *
+ * Returns 0 on success, -errno in error cases.
+ */
+int bdrv_write_sync(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ return bdrv_pwrite_sync(bs, BDRV_SECTOR_SIZE * sector_num,
+ buf, BDRV_SECTOR_SIZE * nb_sectors);
+}
+
+/**
+ * Truncate file to 'offset' bytes (needed only for file protocols)
+ */
+int bdrv_truncate(BlockDriverState *bs, int64_t offset)
+{
+ BlockDriver *drv = bs->drv;
+ int ret;
+ if (!drv)
+ return -ENOMEDIUM;
+ if (!drv->bdrv_truncate)
+ return -ENOTSUP;
+ if (bs->read_only)
+ return -EACCES;
+ if (bdrv_in_use(bs))
+ return -EBUSY;
+ ret = drv->bdrv_truncate(bs, offset);
+ if (ret == 0) {
+ ret = refresh_total_sectors(bs, offset >> BDRV_SECTOR_BITS);
+ if (bs->change_cb) {
+ bs->change_cb(bs->change_opaque, CHANGE_SIZE);
+ }
+ }
+ return ret;
+}
+
+/**
+ * Length of a allocated file in bytes. Sparse files are counted by actual
+ * allocated space. Return < 0 if error or unknown.
+ */
+int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv) {
+ return -ENOMEDIUM;
+ }
+ if (drv->bdrv_get_allocated_file_size) {
+ return drv->bdrv_get_allocated_file_size(bs);
+ }
+ if (bs->file) {
+ return bdrv_get_allocated_file_size(bs->file);
+ }
+ return -ENOTSUP;
+}
+
+/**
+ * Length of a file in bytes. Return < 0 if error or unknown.
+ */
+int64_t bdrv_getlength(BlockDriverState *bs)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv)
+ return -ENOMEDIUM;
+
+ if (bs->growable || bs->removable) {
+ if (drv->bdrv_getlength) {
+ return drv->bdrv_getlength(bs);
+ }
+ }
+ return bs->total_sectors * BDRV_SECTOR_SIZE;
+}
+
+/* return 0 as number of sectors if no device present or error */
+void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr)
+{
+ int64_t length;
+ length = bdrv_getlength(bs);
+ if (length < 0)
+ length = 0;
+ else
+ length = length >> BDRV_SECTOR_BITS;
+ *nb_sectors_ptr = length;
+}
+
+struct partition {
+ uint8_t boot_ind; /* 0x80 - active */
+ uint8_t head; /* starting head */
+ uint8_t sector; /* starting sector */
+ uint8_t cyl; /* starting cylinder */
+ uint8_t sys_ind; /* What partition type */
+ uint8_t end_head; /* end head */
+ uint8_t end_sector; /* end sector */
+ uint8_t end_cyl; /* end cylinder */
+ uint32_t start_sect; /* starting sector counting from 0 */
+ uint32_t nr_sects; /* nr of sectors in partition */
+} __attribute__((packed));
+
+/* try to guess the disk logical geometry from the MSDOS partition table. Return 0 if OK, -1 if could not guess */
+static int guess_disk_lchs(BlockDriverState *bs,
+ int *pcylinders, int *pheads, int *psectors)
+{
+ uint8_t buf[BDRV_SECTOR_SIZE];
+ int ret, i, heads, sectors, cylinders;
+ struct partition *p;
+ uint32_t nr_sects;
+ uint64_t nb_sectors;
+
+ bdrv_get_geometry(bs, &nb_sectors);
+
+ ret = bdrv_read(bs, 0, buf, 1);
+ if (ret < 0)
+ return -1;
+ /* test msdos magic */
+ if (buf[510] != 0x55 || buf[511] != 0xaa)
+ return -1;
+ for(i = 0; i < 4; i++) {
+ p = ((struct partition *)(buf + 0x1be)) + i;
+ nr_sects = le32_to_cpu(p->nr_sects);
+ if (nr_sects && p->end_head) {
+ /* We make the assumption that the partition terminates on
+ a cylinder boundary */
+ heads = p->end_head + 1;
+ sectors = p->end_sector & 63;
+ if (sectors == 0)
+ continue;
+ cylinders = nb_sectors / (heads * sectors);
+ if (cylinders < 1 || cylinders > 16383)
+ continue;
+ *pheads = heads;
+ *psectors = sectors;
+ *pcylinders = cylinders;
+#if 0
+ printf("guessed geometry: LCHS=%d %d %d\n",
+ cylinders, heads, sectors);
+#endif
+ return 0;
+ }
+ }
+ return -1;
+}
+
+void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs)
+{
+ int translation, lba_detected = 0;
+ int cylinders, heads, secs;
+ uint64_t nb_sectors;
+
+ /* if a geometry hint is available, use it */
+ bdrv_get_geometry(bs, &nb_sectors);
+ bdrv_get_geometry_hint(bs, &cylinders, &heads, &secs);
+ translation = bdrv_get_translation_hint(bs);
+ if (cylinders != 0) {
+ *pcyls = cylinders;
+ *pheads = heads;
+ *psecs = secs;
+ } else {
+ if (guess_disk_lchs(bs, &cylinders, &heads, &secs) == 0) {
+ if (heads > 16) {
+ /* if heads > 16, it means that a BIOS LBA
+ translation was active, so the default
+ hardware geometry is OK */
+ lba_detected = 1;
+ goto default_geometry;
+ } else {
+ *pcyls = cylinders;
+ *pheads = heads;
+ *psecs = secs;
+ /* disable any translation to be in sync with
+ the logical geometry */
+ if (translation == BIOS_ATA_TRANSLATION_AUTO) {
+ bdrv_set_translation_hint(bs,
+ BIOS_ATA_TRANSLATION_NONE);
+ }
+ }
+ } else {
+ default_geometry:
+ /* if no geometry, use a standard physical disk geometry */
+ cylinders = nb_sectors / (16 * 63);
+
+ if (cylinders > 16383)
+ cylinders = 16383;
+ else if (cylinders < 2)
+ cylinders = 2;
+ *pcyls = cylinders;
+ *pheads = 16;
+ *psecs = 63;
+ if ((lba_detected == 1) && (translation == BIOS_ATA_TRANSLATION_AUTO)) {
+ if ((*pcyls * *pheads) <= 131072) {
+ bdrv_set_translation_hint(bs,
+ BIOS_ATA_TRANSLATION_LARGE);
+ } else {
+ bdrv_set_translation_hint(bs,
+ BIOS_ATA_TRANSLATION_LBA);
+ }
+ }
+ }
+ bdrv_set_geometry_hint(bs, *pcyls, *pheads, *psecs);
+ }
+}
+
+void bdrv_set_geometry_hint(BlockDriverState *bs,
+ int cyls, int heads, int secs)
+{
+ bs->cyls = cyls;
+ bs->heads = heads;
+ bs->secs = secs;
+}
+
+void bdrv_set_translation_hint(BlockDriverState *bs, int translation)
+{
+ bs->translation = translation;
+}
+
+void bdrv_get_geometry_hint(BlockDriverState *bs,
+ int *pcyls, int *pheads, int *psecs)
+{
+ *pcyls = bs->cyls;
+ *pheads = bs->heads;
+ *psecs = bs->secs;
+}
+
+/* Recognize floppy formats */
+typedef struct FDFormat {
+ FDriveType drive;
+ uint8_t last_sect;
+ uint8_t max_track;
+ uint8_t max_head;
+} FDFormat;
+
+static const FDFormat fd_formats[] = {
+ /* First entry is default format */
+ /* 1.44 MB 3"1/2 floppy disks */
+ { FDRIVE_DRV_144, 18, 80, 1, },
+ { FDRIVE_DRV_144, 20, 80, 1, },
+ { FDRIVE_DRV_144, 21, 80, 1, },
+ { FDRIVE_DRV_144, 21, 82, 1, },
+ { FDRIVE_DRV_144, 21, 83, 1, },
+ { FDRIVE_DRV_144, 22, 80, 1, },
+ { FDRIVE_DRV_144, 23, 80, 1, },
+ { FDRIVE_DRV_144, 24, 80, 1, },
+ /* 2.88 MB 3"1/2 floppy disks */
+ { FDRIVE_DRV_288, 36, 80, 1, },
+ { FDRIVE_DRV_288, 39, 80, 1, },
+ { FDRIVE_DRV_288, 40, 80, 1, },
+ { FDRIVE_DRV_288, 44, 80, 1, },
+ { FDRIVE_DRV_288, 48, 80, 1, },
+ /* 720 kB 3"1/2 floppy disks */
+ { FDRIVE_DRV_144, 9, 80, 1, },
+ { FDRIVE_DRV_144, 10, 80, 1, },
+ { FDRIVE_DRV_144, 10, 82, 1, },
+ { FDRIVE_DRV_144, 10, 83, 1, },
+ { FDRIVE_DRV_144, 13, 80, 1, },
+ { FDRIVE_DRV_144, 14, 80, 1, },
+ /* 1.2 MB 5"1/4 floppy disks */
+ { FDRIVE_DRV_120, 15, 80, 1, },
+ { FDRIVE_DRV_120, 18, 80, 1, },
+ { FDRIVE_DRV_120, 18, 82, 1, },
+ { FDRIVE_DRV_120, 18, 83, 1, },
+ { FDRIVE_DRV_120, 20, 80, 1, },
+ /* 720 kB 5"1/4 floppy disks */
+ { FDRIVE_DRV_120, 9, 80, 1, },
+ { FDRIVE_DRV_120, 11, 80, 1, },
+ /* 360 kB 5"1/4 floppy disks */
+ { FDRIVE_DRV_120, 9, 40, 1, },
+ { FDRIVE_DRV_120, 9, 40, 0, },
+ { FDRIVE_DRV_120, 10, 41, 1, },
+ { FDRIVE_DRV_120, 10, 42, 1, },
+ /* 320 kB 5"1/4 floppy disks */
+ { FDRIVE_DRV_120, 8, 40, 1, },
+ { FDRIVE_DRV_120, 8, 40, 0, },
+ /* 360 kB must match 5"1/4 better than 3"1/2... */
+ { FDRIVE_DRV_144, 9, 80, 0, },
+ /* end */
+ { FDRIVE_DRV_NONE, -1, -1, 0, },
+};
+
+void bdrv_get_floppy_geometry_hint(BlockDriverState *bs, int *nb_heads,
+ int *max_track, int *last_sect,
+ FDriveType drive_in, FDriveType *drive)
+{
+ const FDFormat *parse;
+ uint64_t nb_sectors, size;
+ int i, first_match, match;
+
+ bdrv_get_geometry_hint(bs, nb_heads, max_track, last_sect);
+ if (*nb_heads != 0 && *max_track != 0 && *last_sect != 0) {
+ /* User defined disk */
+ } else {
+ bdrv_get_geometry(bs, &nb_sectors);
+ match = -1;
+ first_match = -1;
+ for (i = 0; ; i++) {
+ parse = &fd_formats[i];
+ if (parse->drive == FDRIVE_DRV_NONE) {
+ break;
+ }
+ if (drive_in == parse->drive ||
+ drive_in == FDRIVE_DRV_NONE) {
+ size = (parse->max_head + 1) * parse->max_track *
+ parse->last_sect;
+ if (nb_sectors == size) {
+ match = i;
+ break;
+ }
+ if (first_match == -1) {
+ first_match = i;
+ }
+ }
+ }
+ if (match == -1) {
+ if (first_match == -1) {
+ match = 1;
+ } else {
+ match = first_match;
+ }
+ parse = &fd_formats[match];
+ }
+ *nb_heads = parse->max_head + 1;
+ *max_track = parse->max_track;
+ *last_sect = parse->last_sect;
+ *drive = parse->drive;
+ }
+}
+
+int bdrv_get_translation_hint(BlockDriverState *bs)
+{
+ return bs->translation;
+}
+
+void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error,
+ BlockErrorAction on_write_error)
+{
+ bs->on_read_error = on_read_error;
+ bs->on_write_error = on_write_error;
+}
+
+BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read)
+{
+ return is_read ? bs->on_read_error : bs->on_write_error;
+}
+
+void bdrv_set_removable(BlockDriverState *bs, int removable)
+{
+ bs->removable = removable;
+ if (removable && bs == bs_snapshots) {
+ bs_snapshots = NULL;
+ }
+}
+
+int bdrv_is_removable(BlockDriverState *bs)
+{
+ return bs->removable;
+}
+
+int bdrv_is_read_only(BlockDriverState *bs)
+{
+ return bs->read_only;
+}
+
+int bdrv_is_sg(BlockDriverState *bs)
+{
+ return bs->sg;
+}
+
+int bdrv_enable_write_cache(BlockDriverState *bs)
+{
+ return bs->enable_write_cache;
+}
+
+/* XXX: no longer used */
+void bdrv_set_change_cb(BlockDriverState *bs,
+ void (*change_cb)(void *opaque, int reason),
+ void *opaque)
+{
+ bs->change_cb = change_cb;
+ bs->change_opaque = opaque;
+}
+
+int bdrv_is_encrypted(BlockDriverState *bs)
+{
+ if (bs->backing_hd && bs->backing_hd->encrypted)
+ return 1;
+ return bs->encrypted;
+}
+
+int bdrv_key_required(BlockDriverState *bs)
+{
+ BlockDriverState *backing_hd = bs->backing_hd;
+
+ if (backing_hd && backing_hd->encrypted && !backing_hd->valid_key)
+ return 1;
+ return (bs->encrypted && !bs->valid_key);
+}
+
+int bdrv_set_key(BlockDriverState *bs, const char *key)
+{
+ int ret;
+ if (bs->backing_hd && bs->backing_hd->encrypted) {
+ ret = bdrv_set_key(bs->backing_hd, key);
+ if (ret < 0)
+ return ret;
+ if (!bs->encrypted)
+ return 0;
+ }
+ if (!bs->encrypted) {
+ return -EINVAL;
+ } else if (!bs->drv || !bs->drv->bdrv_set_key) {
+ return -ENOMEDIUM;
+ }
+ ret = bs->drv->bdrv_set_key(bs, key);
+ if (ret < 0) {
+ bs->valid_key = 0;
+ } else if (!bs->valid_key) {
+ bs->valid_key = 1;
+ /* call the change callback now, we skipped it on open */
+ bs->media_changed = 1;
+ if (bs->change_cb)
+ bs->change_cb(bs->change_opaque, CHANGE_MEDIA);
+ }
+ return ret;
+}
+
+void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size)
+{
+ if (!bs->drv) {
+ buf[0] = '\0';
+ } else {
+ pstrcpy(buf, buf_size, bs->drv->format_name);
+ }
+}
+
+void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
+ void *opaque)
+{
+ BlockDriver *drv;
+
+ QLIST_FOREACH(drv, &bdrv_drivers, list) {
+ it(opaque, drv->format_name);
+ }
+}
+
+BlockDriverState *bdrv_find(const char *name)
+{
+ BlockDriverState *bs;
+
+ QTAILQ_FOREACH(bs, &bdrv_states, list) {
+ if (!strcmp(name, bs->device_name)) {
+ return bs;
+ }
+ }
+ return NULL;
+}
+
+BlockDriverState *bdrv_next(BlockDriverState *bs)
+{
+ if (!bs) {
+ return QTAILQ_FIRST(&bdrv_states);
+ }
+ return QTAILQ_NEXT(bs, list);
+}
+
+void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs), void *opaque)
+{
+ BlockDriverState *bs;
+
+ QTAILQ_FOREACH(bs, &bdrv_states, list) {
+ it(opaque, bs);
+ }
+}
+
+const char *bdrv_get_device_name(BlockDriverState *bs)
+{
+ return bs->device_name;
+}
+
+int bdrv_flush(BlockDriverState *bs)
+{
+ if (bs->open_flags & BDRV_O_NO_FLUSH) {
+ return 0;
+ }
+
+ if (bs->drv && bs->drv->bdrv_flush) {
+ return bs->drv->bdrv_flush(bs);
+ }
+
+ /*
+ * Some block drivers always operate in either writethrough or unsafe mode
+ * and don't support bdrv_flush therefore. Usually qemu doesn't know how
+ * the server works (because the behaviour is hardcoded or depends on
+ * server-side configuration), so we can't ensure that everything is safe
+ * on disk. Returning an error doesn't work because that would break guests
+ * even if the server operates in writethrough mode.
+ *
+ * Let's hope the user knows what he's doing.
+ */
+ return 0;
+}
+
+void bdrv_flush_all(void)
+{
+ BlockDriverState *bs;
+
+ QTAILQ_FOREACH(bs, &bdrv_states, list) {
+ if (bs->drv && !bdrv_is_read_only(bs) &&
+ (!bdrv_is_removable(bs) || bdrv_is_inserted(bs))) {
+ bdrv_flush(bs);
+ }
+ }
+}
+
+int bdrv_has_zero_init(BlockDriverState *bs)
+{
+ assert(bs->drv);
+
+ if (bs->drv->bdrv_has_zero_init) {
+ return bs->drv->bdrv_has_zero_init(bs);
+ }
+
+ return 1;
+}
+
+int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
+{
+ if (!bs->drv) {
+ return -ENOMEDIUM;
+ }
+ if (!bs->drv->bdrv_discard) {
+ return 0;
+ }
+ return bs->drv->bdrv_discard(bs, sector_num, nb_sectors);
+}
+
+/*
+ * Returns true iff the specified sector is present in the disk image. Drivers
+ * not implementing the functionality are assumed to not support backing files,
+ * hence all their sectors are reported as allocated.
+ *
+ * 'pnum' is set to the number of sectors (including and immediately following
+ * the specified sector) that are known to be in the same
+ * allocated/unallocated state.
+ *
+ * 'nb_sectors' is the max value 'pnum' should be set to.
+ */
+int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
+ int *pnum)
+{
+ int64_t n;
+ if (!bs->drv->bdrv_is_allocated) {
+ if (sector_num >= bs->total_sectors) {
+ *pnum = 0;
+ return 0;
+ }
+ n = bs->total_sectors - sector_num;
+ *pnum = (n < nb_sectors) ? (n) : (nb_sectors);
+ return 1;
+ }
+ return bs->drv->bdrv_is_allocated(bs, sector_num, nb_sectors, pnum);
+}
+
+void bdrv_mon_event(const BlockDriverState *bdrv,
+ BlockMonEventAction action, int is_read)
+{
+ QObject *data;
+ const char *action_str;
+
+ switch (action) {
+ case BDRV_ACTION_REPORT:
+ action_str = "report";
+ break;
+ case BDRV_ACTION_IGNORE:
+ action_str = "ignore";
+ break;
+ case BDRV_ACTION_STOP:
+ action_str = "stop";
+ break;
+ default:
+ abort();
+ }
+
+ data = qobject_from_jsonf("{ 'device': %s, 'action': %s, 'operation': %s }",
+ bdrv->device_name,
+ action_str,
+ is_read ? "read" : "write");
+ monitor_protocol_event(QEVENT_BLOCK_IO_ERROR, data);
+
+ qobject_decref(data);
+}
+
+static void bdrv_print_dict(QObject *obj, void *opaque)
+{
+ QDict *bs_dict;
+ Monitor *mon = opaque;
+
+ bs_dict = qobject_to_qdict(obj);
+
+ monitor_printf(mon, "%s: removable=%d",
+ qdict_get_str(bs_dict, "device"),
+ qdict_get_bool(bs_dict, "removable"));
+
+ if (qdict_get_bool(bs_dict, "removable")) {
+ monitor_printf(mon, " locked=%d", qdict_get_bool(bs_dict, "locked"));
+ }
+
+ if (qdict_haskey(bs_dict, "inserted")) {
+ QDict *qdict = qobject_to_qdict(qdict_get(bs_dict, "inserted"));
+
+ monitor_printf(mon, " file=");
+ monitor_print_filename(mon, qdict_get_str(qdict, "file"));
+ if (qdict_haskey(qdict, "backing_file")) {
+ monitor_printf(mon, " backing_file=");
+ monitor_print_filename(mon, qdict_get_str(qdict, "backing_file"));
+ }
+ monitor_printf(mon, " ro=%d drv=%s encrypted=%d",
+ qdict_get_bool(qdict, "ro"),
+ qdict_get_str(qdict, "drv"),
+ qdict_get_bool(qdict, "encrypted"));
+ } else {
+ monitor_printf(mon, " [not inserted]");
+ }
+
+ monitor_printf(mon, "\n");
+}
+
+void bdrv_info_print(Monitor *mon, const QObject *data)
+{
+ qlist_iter(qobject_to_qlist(data), bdrv_print_dict, mon);
+}
+
+void bdrv_info(Monitor *mon, QObject **ret_data)
+{
+ QList *bs_list;
+ BlockDriverState *bs;
+
+ bs_list = qlist_new();
+
+ QTAILQ_FOREACH(bs, &bdrv_states, list) {
+ QObject *bs_obj;
+
+ bs_obj = qobject_from_jsonf("{ 'device': %s, 'type': 'unknown', "
+ "'removable': %i, 'locked': %i }",
+ bs->device_name, bs->removable,
+ bs->locked);
+
+ if (bs->drv) {
+ QObject *obj;
+ QDict *bs_dict = qobject_to_qdict(bs_obj);
+
+ obj = qobject_from_jsonf("{ 'file': %s, 'ro': %i, 'drv': %s, "
+ "'encrypted': %i }",
+ bs->filename, bs->read_only,
+ bs->drv->format_name,
+ bdrv_is_encrypted(bs));
+ if (bs->backing_file[0] != '\0') {
+ QDict *qdict = qobject_to_qdict(obj);
+ qdict_put(qdict, "backing_file",
+ qstring_from_str(bs->backing_file));
+ }
+
+ qdict_put_obj(bs_dict, "inserted", obj);
+ }
+ qlist_append_obj(bs_list, bs_obj);
+ }
+
+ *ret_data = QOBJECT(bs_list);
+}
+
+static void bdrv_stats_iter(QObject *data, void *opaque)
+{
+ QDict *qdict;
+ Monitor *mon = opaque;
+
+ qdict = qobject_to_qdict(data);
+ monitor_printf(mon, "%s:", qdict_get_str(qdict, "device"));
+
+ qdict = qobject_to_qdict(qdict_get(qdict, "stats"));
+ monitor_printf(mon, " rd_bytes=%" PRId64
+ " wr_bytes=%" PRId64
+ " rd_operations=%" PRId64
+ " wr_operations=%" PRId64
+ "\n",
+ qdict_get_int(qdict, "rd_bytes"),
+ qdict_get_int(qdict, "wr_bytes"),
+ qdict_get_int(qdict, "rd_operations"),
+ qdict_get_int(qdict, "wr_operations"));
+}
+
+void bdrv_stats_print(Monitor *mon, const QObject *data)
+{
+ qlist_iter(qobject_to_qlist(data), bdrv_stats_iter, mon);
+}
+
+static QObject* bdrv_info_stats_bs(BlockDriverState *bs)
+{
+ QObject *res;
+ QDict *dict;
+
+ res = qobject_from_jsonf("{ 'stats': {"
+ "'rd_bytes': %" PRId64 ","
+ "'wr_bytes': %" PRId64 ","
+ "'rd_operations': %" PRId64 ","
+ "'wr_operations': %" PRId64 ","
+ "'wr_highest_offset': %" PRId64
+ "} }",
+ bs->rd_bytes, bs->wr_bytes,
+ bs->rd_ops, bs->wr_ops,
+ bs->wr_highest_sector *
+ (uint64_t)BDRV_SECTOR_SIZE);
+ dict = qobject_to_qdict(res);
+
+ if (*bs->device_name) {
+ qdict_put(dict, "device", qstring_from_str(bs->device_name));
+ }
+
+ if (bs->file) {
+ QObject *parent = bdrv_info_stats_bs(bs->file);
+ qdict_put_obj(dict, "parent", parent);
+ }
+
+ return res;
+}
+
+void bdrv_info_stats(Monitor *mon, QObject **ret_data)
+{
+ QObject *obj;
+ QList *devices;
+ BlockDriverState *bs;
+
+ devices = qlist_new();
+
+ QTAILQ_FOREACH(bs, &bdrv_states, list) {
+ obj = bdrv_info_stats_bs(bs);
+ qlist_append_obj(devices, obj);
+ }
+
+ *ret_data = QOBJECT(devices);
+}
+
+const char *bdrv_get_encrypted_filename(BlockDriverState *bs)
+{
+ if (bs->backing_hd && bs->backing_hd->encrypted)
+ return bs->backing_file;
+ else if (bs->encrypted)
+ return bs->filename;
+ else
+ return NULL;
+}
+
+void bdrv_get_backing_filename(BlockDriverState *bs,
+ char *filename, int filename_size)
+{
+ if (!bs->backing_file) {
+ pstrcpy(filename, filename_size, "");
+ } else {
+ pstrcpy(filename, filename_size, bs->backing_file);
+ }
+}
+
+int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv)
+ return -ENOMEDIUM;
+ if (!drv->bdrv_write_compressed)
+ return -ENOTSUP;
+ if (bdrv_check_request(bs, sector_num, nb_sectors))
+ return -EIO;
+
+ if (bs->dirty_bitmap) {
+ set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
+ }
+
+ return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors);
+}
+
+int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv)
+ return -ENOMEDIUM;
+ if (!drv->bdrv_get_info)
+ return -ENOTSUP;
+ memset(bdi, 0, sizeof(*bdi));
+ return drv->bdrv_get_info(bs, bdi);
+}
+
+int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
+ int64_t pos, int size)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv)
+ return -ENOMEDIUM;
+ if (drv->bdrv_save_vmstate)
+ return drv->bdrv_save_vmstate(bs, buf, pos, size);
+ if (bs->file)
+ return bdrv_save_vmstate(bs->file, buf, pos, size);
+ return -ENOTSUP;
+}
+
+int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
+ int64_t pos, int size)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv)
+ return -ENOMEDIUM;
+ if (drv->bdrv_load_vmstate)
+ return drv->bdrv_load_vmstate(bs, buf, pos, size);
+ if (bs->file)
+ return bdrv_load_vmstate(bs->file, buf, pos, size);
+ return -ENOTSUP;
+}
+
+void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event)
+{
+ BlockDriver *drv = bs->drv;
+
+ if (!drv || !drv->bdrv_debug_event) {
+ return;
+ }
+
+ return drv->bdrv_debug_event(bs, event);
+
+}
+
+/**************************************************************/
+/* handling of snapshots */
+
+int bdrv_can_snapshot(BlockDriverState *bs)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv || bdrv_is_removable(bs) || bdrv_is_read_only(bs)) {
+ return 0;
+ }
+
+ if (!drv->bdrv_snapshot_create) {
+ if (bs->file != NULL) {
+ return bdrv_can_snapshot(bs->file);
+ }
+ return 0;
+ }
+
+ return 1;
+}
+
+int bdrv_is_snapshot(BlockDriverState *bs)
+{
+ return !!(bs->open_flags & BDRV_O_SNAPSHOT);
+}
+
+BlockDriverState *bdrv_snapshots(void)
+{
+ BlockDriverState *bs;
+
+ if (bs_snapshots) {
+ return bs_snapshots;
+ }
+
+ bs = NULL;
+ while ((bs = bdrv_next(bs))) {
+ if (bdrv_can_snapshot(bs)) {
+ bs_snapshots = bs;
+ return bs;
+ }
+ }
+ return NULL;
+}
+
+int bdrv_snapshot_create(BlockDriverState *bs,
+ QEMUSnapshotInfo *sn_info)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv)
+ return -ENOMEDIUM;
+ if (drv->bdrv_snapshot_create)
+ return drv->bdrv_snapshot_create(bs, sn_info);
+ if (bs->file)
+ return bdrv_snapshot_create(bs->file, sn_info);
+ return -ENOTSUP;
+}
+
+int bdrv_snapshot_goto(BlockDriverState *bs,
+ const char *snapshot_id)
+{
+ BlockDriver *drv = bs->drv;
+ int ret, open_ret;
+
+ if (!drv)
+ return -ENOMEDIUM;
+ if (drv->bdrv_snapshot_goto)
+ return drv->bdrv_snapshot_goto(bs, snapshot_id);
+
+ if (bs->file) {
+ drv->bdrv_close(bs);
+ ret = bdrv_snapshot_goto(bs->file, snapshot_id);
+ open_ret = drv->bdrv_open(bs, bs->open_flags);
+ if (open_ret < 0) {
+ bdrv_delete(bs->file);
+ bs->drv = NULL;
+ return open_ret;
+ }
+ return ret;
+ }
+
+ return -ENOTSUP;
+}
+
+int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv)
+ return -ENOMEDIUM;
+ if (drv->bdrv_snapshot_delete)
+ return drv->bdrv_snapshot_delete(bs, snapshot_id);
+ if (bs->file)
+ return bdrv_snapshot_delete(bs->file, snapshot_id);
+ return -ENOTSUP;
+}
+
+int bdrv_snapshot_list(BlockDriverState *bs,
+ QEMUSnapshotInfo **psn_info)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv)
+ return -ENOMEDIUM;
+ if (drv->bdrv_snapshot_list)
+ return drv->bdrv_snapshot_list(bs, psn_info);
+ if (bs->file)
+ return bdrv_snapshot_list(bs->file, psn_info);
+ return -ENOTSUP;
+}
+
+int bdrv_snapshot_load_tmp(BlockDriverState *bs,
+ const char *snapshot_name)
+{
+ BlockDriver *drv = bs->drv;
+ if (!drv) {
+ return -ENOMEDIUM;
+ }
+ if (!bs->read_only) {
+ return -EINVAL;
+ }
+ if (drv->bdrv_snapshot_load_tmp) {
+ return drv->bdrv_snapshot_load_tmp(bs, snapshot_name);
+ }
+ return -ENOTSUP;
+}
+
+#define NB_SUFFIXES 4
+
+char *get_human_readable_size(char *buf, int buf_size, int64_t size)
+{
+ static const char suffixes[NB_SUFFIXES] = "KMGT";
+ int64_t base;
+ int i;
+
+ if (size <= 999) {
+ snprintf(buf, buf_size, "%" PRId64, size);
+ } else {
+ base = 1024;
+ for(i = 0; i < NB_SUFFIXES; i++) {
+ if (size < (10 * base)) {
+ snprintf(buf, buf_size, "%0.1f%c",
+ (double)size / base,
+ suffixes[i]);
+ break;
+ } else if (size < (1000 * base) || i == (NB_SUFFIXES - 1)) {
+ snprintf(buf, buf_size, "%" PRId64 "%c",
+ ((size + (base >> 1)) / base),
+ suffixes[i]);
+ break;
+ }
+ base = base * 1024;
+ }
+ }
+ return buf;
+}
+
+char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn)
+{
+ char buf1[128], date_buf[128], clock_buf[128];
+#ifdef _WIN32
+ struct tm *ptm;
+#else
+ struct tm tm;
+#endif
+ time_t ti;
+ int64_t secs;
+
+ if (!sn) {
+ snprintf(buf, buf_size,
+ "%-10s%-20s%7s%20s%15s",
+ "ID", "TAG", "VM SIZE", "DATE", "VM CLOCK");
+ } else {
+ ti = sn->date_sec;
+#ifdef _WIN32
+ ptm = localtime(&ti);
+ strftime(date_buf, sizeof(date_buf),
+ "%Y-%m-%d %H:%M:%S", ptm);
+#else
+ localtime_r(&ti, &tm);
+ strftime(date_buf, sizeof(date_buf),
+ "%Y-%m-%d %H:%M:%S", &tm);
+#endif
+ secs = sn->vm_clock_nsec / 1000000000;
+ snprintf(clock_buf, sizeof(clock_buf),
+ "%02d:%02d:%02d.%03d",
+ (int)(secs / 3600),
+ (int)((secs / 60) % 60),
+ (int)(secs % 60),
+ (int)((sn->vm_clock_nsec / 1000000) % 1000));
+ snprintf(buf, buf_size,
+ "%-10s%-20s%7s%20s%15s",
+ sn->id_str, sn->name,
+ get_human_readable_size(buf1, sizeof(buf1), sn->vm_state_size),
+ date_buf,
+ clock_buf);
+ }
+ return buf;
+}
+
+
+/**************************************************************/
+/* async I/Os */
+
+BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BlockDriver *drv = bs->drv;
+ BlockDriverAIOCB *ret;
+
+ trace_bdrv_aio_readv(bs, sector_num, nb_sectors, opaque);
+
+ if (!drv)
+ return NULL;
+ if (bdrv_check_request(bs, sector_num, nb_sectors))
+ return NULL;
+
+ ret = drv->bdrv_aio_readv(bs, sector_num, qiov, nb_sectors,
+ cb, opaque);
+
+ if (ret) {
+ /* Update stats even though technically transfer has not happened. */
+ bs->rd_bytes += (unsigned) nb_sectors * BDRV_SECTOR_SIZE;
+ bs->rd_ops ++;
+ }
+
+ return ret;
+}
+
+typedef struct BlockCompleteData {
+ BlockDriverCompletionFunc *cb;
+ void *opaque;
+ BlockDriverState *bs;
+ int64_t sector_num;
+ int nb_sectors;
+} BlockCompleteData;
+
+static void block_complete_cb(void *opaque, int ret)
+{
+ BlockCompleteData *b = opaque;
+
+ if (b->bs->dirty_bitmap) {
+ set_dirty_bitmap(b->bs, b->sector_num, b->nb_sectors, 1);
+ }
+ b->cb(b->opaque, ret);
+ qemu_free(b);
+}
+
+static BlockCompleteData *blk_dirty_cb_alloc(BlockDriverState *bs,
+ int64_t sector_num,
+ int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ BlockCompleteData *blkdata = qemu_mallocz(sizeof(BlockCompleteData));
+
+ blkdata->bs = bs;
+ blkdata->cb = cb;
+ blkdata->opaque = opaque;
+ blkdata->sector_num = sector_num;
+ blkdata->nb_sectors = nb_sectors;
+
+ return blkdata;
+}
+
+BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BlockDriver *drv = bs->drv;
+ BlockDriverAIOCB *ret;
+ BlockCompleteData *blk_cb_data;
+
+ trace_bdrv_aio_writev(bs, sector_num, nb_sectors, opaque);
+
+ if (!drv)
+ return NULL;
+ if (bs->read_only)
+ return NULL;
+ if (bdrv_check_request(bs, sector_num, nb_sectors))
+ return NULL;
+
+ if (bs->dirty_bitmap) {
+ blk_cb_data = blk_dirty_cb_alloc(bs, sector_num, nb_sectors, cb,
+ opaque);
+ cb = &block_complete_cb;
+ opaque = blk_cb_data;
+ }
+
+ ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors,
+ cb, opaque);
+
+ if (ret) {
+ /* Update stats even though technically transfer has not happened. */
+ bs->wr_bytes += (unsigned) nb_sectors * BDRV_SECTOR_SIZE;
+ bs->wr_ops ++;
+ if (bs->wr_highest_sector < sector_num + nb_sectors - 1) {
+ bs->wr_highest_sector = sector_num + nb_sectors - 1;
+ }
+ }
+
+ return ret;
+}
+
+
+typedef struct MultiwriteCB {
+ int error;
+ int num_requests;
+ int num_callbacks;
+ struct {
+ BlockDriverCompletionFunc *cb;
+ void *opaque;
+ QEMUIOVector *free_qiov;
+ void *free_buf;
+ } callbacks[];
+} MultiwriteCB;
+
+static void multiwrite_user_cb(MultiwriteCB *mcb)
+{
+ int i;
+
+ for (i = 0; i < mcb->num_callbacks; i++) {
+ mcb->callbacks[i].cb(mcb->callbacks[i].opaque, mcb->error);
+ if (mcb->callbacks[i].free_qiov) {
+ qemu_iovec_destroy(mcb->callbacks[i].free_qiov);
+ }
+ qemu_free(mcb->callbacks[i].free_qiov);
+ qemu_vfree(mcb->callbacks[i].free_buf);
+ }
+}
+
+static void multiwrite_cb(void *opaque, int ret)
+{
+ MultiwriteCB *mcb = opaque;
+
+ trace_multiwrite_cb(mcb, ret);
+
+ if (ret < 0 && !mcb->error) {
+ mcb->error = ret;
+ }
+
+ mcb->num_requests--;
+ if (mcb->num_requests == 0) {
+ multiwrite_user_cb(mcb);
+ qemu_free(mcb);
+ }
+}
+
+static int multiwrite_req_compare(const void *a, const void *b)
+{
+ const BlockRequest *req1 = a, *req2 = b;
+
+ /*
+ * Note that we can't simply subtract req2->sector from req1->sector
+ * here as that could overflow the return value.
+ */
+ if (req1->sector > req2->sector) {
+ return 1;
+ } else if (req1->sector < req2->sector) {
+ return -1;
+ } else {
+ return 0;
+ }
+}
+
+/*
+ * Takes a bunch of requests and tries to merge them. Returns the number of
+ * requests that remain after merging.
+ */
+static int multiwrite_merge(BlockDriverState *bs, BlockRequest *reqs,
+ int num_reqs, MultiwriteCB *mcb)
+{
+ int i, outidx;
+
+ // Sort requests by start sector
+ qsort(reqs, num_reqs, sizeof(*reqs), &multiwrite_req_compare);
+
+ // Check if adjacent requests touch the same clusters. If so, combine them,
+ // filling up gaps with zero sectors.
+ outidx = 0;
+ for (i = 1; i < num_reqs; i++) {
+ int merge = 0;
+ int64_t oldreq_last = reqs[outidx].sector + reqs[outidx].nb_sectors;
+
+ // This handles the cases that are valid for all block drivers, namely
+ // exactly sequential writes and overlapping writes.
+ if (reqs[i].sector <= oldreq_last) {
+ merge = 1;
+ }
+
+ // The block driver may decide that it makes sense to combine requests
+ // even if there is a gap of some sectors between them. In this case,
+ // the gap is filled with zeros (therefore only applicable for yet
+ // unused space in format like qcow2).
+ if (!merge && bs->drv->bdrv_merge_requests) {
+ merge = bs->drv->bdrv_merge_requests(bs, &reqs[outidx], &reqs[i]);
+ }
+
+ if (reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1 > IOV_MAX) {
+ merge = 0;
+ }
+
+ if (merge) {
+ size_t size;
+ QEMUIOVector *qiov = qemu_mallocz(sizeof(*qiov));
+ qemu_iovec_init(qiov,
+ reqs[outidx].qiov->niov + reqs[i].qiov->niov + 1);
+
+ // Add the first request to the merged one. If the requests are
+ // overlapping, drop the last sectors of the first request.
+ size = (reqs[i].sector - reqs[outidx].sector) << 9;
+ qemu_iovec_concat(qiov, reqs[outidx].qiov, size);
+
+ // We might need to add some zeros between the two requests
+ if (reqs[i].sector > oldreq_last) {
+ size_t zero_bytes = (reqs[i].sector - oldreq_last) << 9;
+ uint8_t *buf = qemu_blockalign(bs, zero_bytes);
+ memset(buf, 0, zero_bytes);
+ qemu_iovec_add(qiov, buf, zero_bytes);
+ mcb->callbacks[i].free_buf = buf;
+ }
+
+ // Add the second request
+ qemu_iovec_concat(qiov, reqs[i].qiov, reqs[i].qiov->size);
+
+ reqs[outidx].nb_sectors = qiov->size >> 9;
+ reqs[outidx].qiov = qiov;
+
+ mcb->callbacks[i].free_qiov = reqs[outidx].qiov;
+ } else {
+ outidx++;
+ reqs[outidx].sector = reqs[i].sector;
+ reqs[outidx].nb_sectors = reqs[i].nb_sectors;
+ reqs[outidx].qiov = reqs[i].qiov;
+ }
+ }
+
+ return outidx + 1;
+}
+
+/*
+ * Submit multiple AIO write requests at once.
+ *
+ * On success, the function returns 0 and all requests in the reqs array have
+ * been submitted. In error case this function returns -1, and any of the
+ * requests may or may not be submitted yet. In particular, this means that the
+ * callback will be called for some of the requests, for others it won't. The
+ * caller must check the error field of the BlockRequest to wait for the right
+ * callbacks (if error != 0, no callback will be called).
+ *
+ * The implementation may modify the contents of the reqs array, e.g. to merge
+ * requests. However, the fields opaque and error are left unmodified as they
+ * are used to signal failure for a single request to the caller.
+ */
+int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs)
+{
+ BlockDriverAIOCB *acb;
+ MultiwriteCB *mcb;
+ int i;
+
+ /* don't submit writes if we don't have a medium */
+ if (bs->drv == NULL) {
+ for (i = 0; i < num_reqs; i++) {
+ reqs[i].error = -ENOMEDIUM;
+ }
+ return -1;
+ }
+
+ if (num_reqs == 0) {
+ return 0;
+ }
+
+ // Create MultiwriteCB structure
+ mcb = qemu_mallocz(sizeof(*mcb) + num_reqs * sizeof(*mcb->callbacks));
+ mcb->num_requests = 0;
+ mcb->num_callbacks = num_reqs;
+
+ for (i = 0; i < num_reqs; i++) {
+ mcb->callbacks[i].cb = reqs[i].cb;
+ mcb->callbacks[i].opaque = reqs[i].opaque;
+ }
+
+ // Check for mergable requests
+ num_reqs = multiwrite_merge(bs, reqs, num_reqs, mcb);
+
+ trace_bdrv_aio_multiwrite(mcb, mcb->num_callbacks, num_reqs);
+
+ /*
+ * Run the aio requests. As soon as one request can't be submitted
+ * successfully, fail all requests that are not yet submitted (we must
+ * return failure for all requests anyway)
+ *
+ * num_requests cannot be set to the right value immediately: If
+ * bdrv_aio_writev fails for some request, num_requests would be too high
+ * and therefore multiwrite_cb() would never recognize the multiwrite
+ * request as completed. We also cannot use the loop variable i to set it
+ * when the first request fails because the callback may already have been
+ * called for previously submitted requests. Thus, num_requests must be
+ * incremented for each request that is submitted.
+ *
+ * The problem that callbacks may be called early also means that we need
+ * to take care that num_requests doesn't become 0 before all requests are
+ * submitted - multiwrite_cb() would consider the multiwrite request
+ * completed. A dummy request that is "completed" by a manual call to
+ * multiwrite_cb() takes care of this.
+ */
+ mcb->num_requests = 1;
+
+ // Run the aio requests
+ for (i = 0; i < num_reqs; i++) {
+ mcb->num_requests++;
+ acb = bdrv_aio_writev(bs, reqs[i].sector, reqs[i].qiov,
+ reqs[i].nb_sectors, multiwrite_cb, mcb);
+
+ if (acb == NULL) {
+ // We can only fail the whole thing if no request has been
+ // submitted yet. Otherwise we'll wait for the submitted AIOs to
+ // complete and report the error in the callback.
+ if (i == 0) {
+ trace_bdrv_aio_multiwrite_earlyfail(mcb);
+ goto fail;
+ } else {
+ trace_bdrv_aio_multiwrite_latefail(mcb, i);
+ multiwrite_cb(mcb, -EIO);
+ break;
+ }
+ }
+ }
+
+ /* Complete the dummy request */
+ multiwrite_cb(mcb, 0);
+
+ return 0;
+
+fail:
+ for (i = 0; i < mcb->num_callbacks; i++) {
+ reqs[i].error = -EIO;
+ }
+ qemu_free(mcb);
+ return -1;
+}
+
+BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BlockDriver *drv = bs->drv;
+
+ trace_bdrv_aio_flush(bs, opaque);
+
+ if (bs->open_flags & BDRV_O_NO_FLUSH) {
+ return bdrv_aio_noop_em(bs, cb, opaque);
+ }
+
+ if (!drv)
+ return NULL;
+ return drv->bdrv_aio_flush(bs, cb, opaque);
+}
+
+void bdrv_aio_cancel(BlockDriverAIOCB *acb)
+{
+ acb->pool->cancel(acb);
+}
+
+
+/**************************************************************/
+/* async block device emulation */
+
+typedef struct BlockDriverAIOCBSync {
+ BlockDriverAIOCB common;
+ QEMUBH *bh;
+ int ret;
+ /* vector translation state */
+ QEMUIOVector *qiov;
+ uint8_t *bounce;
+ int is_write;
+} BlockDriverAIOCBSync;
+
+static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
+{
+ BlockDriverAIOCBSync *acb =
+ container_of(blockacb, BlockDriverAIOCBSync, common);
+ qemu_bh_delete(acb->bh);
+ acb->bh = NULL;
+ qemu_aio_release(acb);
+}
+
+static AIOPool bdrv_em_aio_pool = {
+ .aiocb_size = sizeof(BlockDriverAIOCBSync),
+ .cancel = bdrv_aio_cancel_em,
+};
+
+static void bdrv_aio_bh_cb(void *opaque)
+{
+ BlockDriverAIOCBSync *acb = opaque;
+
+ if (!acb->is_write)
+ qemu_iovec_from_buffer(acb->qiov, acb->bounce, acb->qiov->size);
+ qemu_vfree(acb->bounce);
+ acb->common.cb(acb->common.opaque, acb->ret);
+ qemu_bh_delete(acb->bh);
+ acb->bh = NULL;
+ qemu_aio_release(acb);
+}
+
+static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
+ int64_t sector_num,
+ QEMUIOVector *qiov,
+ int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque,
+ int is_write)
+
+{
+ BlockDriverAIOCBSync *acb;
+
+ acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
+ acb->is_write = is_write;
+ acb->qiov = qiov;
+ acb->bounce = qemu_blockalign(bs, qiov->size);
+
+ if (!acb->bh)
+ acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
+
+ if (is_write) {
+ qemu_iovec_to_buffer(acb->qiov, acb->bounce);
+ acb->ret = bdrv_write(bs, sector_num, acb->bounce, nb_sectors);
+ } else {
+ acb->ret = bdrv_read(bs, sector_num, acb->bounce, nb_sectors);
+ }
+
+ qemu_bh_schedule(acb->bh);
+
+ return &acb->common;
+}
+
+static BlockDriverAIOCB *bdrv_aio_readv_em(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
+}
+
+static BlockDriverAIOCB *bdrv_aio_writev_em(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
+}
+
+static BlockDriverAIOCB *bdrv_aio_flush_em(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BlockDriverAIOCBSync *acb;
+
+ acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
+ acb->is_write = 1; /* don't bounce in the completion hadler */
+ acb->qiov = NULL;
+ acb->bounce = NULL;
+ acb->ret = 0;
+
+ if (!acb->bh)
+ acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
+
+ bdrv_flush(bs);
+ qemu_bh_schedule(acb->bh);
+ return &acb->common;
+}
+
+static BlockDriverAIOCB *bdrv_aio_noop_em(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BlockDriverAIOCBSync *acb;
+
+ acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
+ acb->is_write = 1; /* don't bounce in the completion handler */
+ acb->qiov = NULL;
+ acb->bounce = NULL;
+ acb->ret = 0;
+
+ if (!acb->bh) {
+ acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
+ }
+
+ qemu_bh_schedule(acb->bh);
+ return &acb->common;
+}
+
+/**************************************************************/
+/* sync block device emulation */
+
+static void bdrv_rw_em_cb(void *opaque, int ret)
+{
+ *(int *)opaque = ret;
+}
+
+#define NOT_DONE 0x7fffffff
+
+static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ int async_ret;
+ BlockDriverAIOCB *acb;
+ struct iovec iov;
+ QEMUIOVector qiov;
+
+ async_context_push();
+
+ async_ret = NOT_DONE;
+ iov.iov_base = (void *)buf;
+ iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
+ qemu_iovec_init_external(&qiov, &iov, 1);
+ acb = bdrv_aio_readv(bs, sector_num, &qiov, nb_sectors,
+ bdrv_rw_em_cb, &async_ret);
+ if (acb == NULL) {
+ async_ret = -1;
+ goto fail;
+ }
+
+ while (async_ret == NOT_DONE) {
+ qemu_aio_wait();
+ }
+
+
+fail:
+ async_context_pop();
+ return async_ret;
+}
+
+static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ int async_ret;
+ BlockDriverAIOCB *acb;
+ struct iovec iov;
+ QEMUIOVector qiov;
+
+ async_context_push();
+
+ async_ret = NOT_DONE;
+ iov.iov_base = (void *)buf;
+ iov.iov_len = nb_sectors * BDRV_SECTOR_SIZE;
+ qemu_iovec_init_external(&qiov, &iov, 1);
+ acb = bdrv_aio_writev(bs, sector_num, &qiov, nb_sectors,
+ bdrv_rw_em_cb, &async_ret);
+ if (acb == NULL) {
+ async_ret = -1;
+ goto fail;
+ }
+ while (async_ret == NOT_DONE) {
+ qemu_aio_wait();
+ }
+
+fail:
+ async_context_pop();
+ return async_ret;
+}
+
+void bdrv_init(void)
+{
+ module_call_init(MODULE_INIT_BLOCK);
+}
+
+void bdrv_init_with_whitelist(void)
+{
+ use_bdrv_whitelist = 1;
+ bdrv_init();
+}
+
+void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BlockDriverAIOCB *acb;
+
+ if (pool->free_aiocb) {
+ acb = pool->free_aiocb;
+ pool->free_aiocb = acb->next;
+ } else {
+ acb = qemu_mallocz(pool->aiocb_size);
+ acb->pool = pool;
+ }
+ acb->bs = bs;
+ acb->cb = cb;
+ acb->opaque = opaque;
+ return acb;
+}
+
+void qemu_aio_release(void *p)
+{
+ BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
+ AIOPool *pool = acb->pool;
+ acb->next = pool->free_aiocb;
+ pool->free_aiocb = acb;
+}
+
+/**************************************************************/
+/* removable device support */
+
+/**
+ * Return TRUE if the media is present
+ */
+int bdrv_is_inserted(BlockDriverState *bs)
+{
+ BlockDriver *drv = bs->drv;
+ int ret;
+ if (!drv)
+ return 0;
+ if (!drv->bdrv_is_inserted)
+ return !bs->tray_open;
+ ret = drv->bdrv_is_inserted(bs);
+ return ret;
+}
+
+/**
+ * Return TRUE if the media changed since the last call to this
+ * function. It is currently only used for floppy disks
+ */
+int bdrv_media_changed(BlockDriverState *bs)
+{
+ BlockDriver *drv = bs->drv;
+ int ret;
+
+ if (!drv || !drv->bdrv_media_changed)
+ ret = -ENOTSUP;
+ else
+ ret = drv->bdrv_media_changed(bs);
+ if (ret == -ENOTSUP)
+ ret = bs->media_changed;
+ bs->media_changed = 0;
+ return ret;
+}
+
+/**
+ * If eject_flag is TRUE, eject the media. Otherwise, close the tray
+ */
+int bdrv_eject(BlockDriverState *bs, int eject_flag)
+{
+ BlockDriver *drv = bs->drv;
+ int ret;
+
+ if (bs->locked) {
+ return -EBUSY;
+ }
+
+ if (!drv || !drv->bdrv_eject) {
+ ret = -ENOTSUP;
+ } else {
+ ret = drv->bdrv_eject(bs, eject_flag);
+ }
+ if (ret == -ENOTSUP) {
+ ret = 0;
+ }
+ if (ret >= 0) {
+ bs->tray_open = eject_flag;
+ }
+
+ return ret;
+}
+
+int bdrv_is_locked(BlockDriverState *bs)
+{
+ return bs->locked;
+}
+
+/**
+ * Lock or unlock the media (if it is locked, the user won't be able
+ * to eject it manually).
+ */
+void bdrv_set_locked(BlockDriverState *bs, int locked)
+{
+ BlockDriver *drv = bs->drv;
+
+ trace_bdrv_set_locked(bs, locked);
+
+ bs->locked = locked;
+ if (drv && drv->bdrv_set_locked) {
+ drv->bdrv_set_locked(bs, locked);
+ }
+}
+
+/* needed for generic scsi interface */
+
+int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
+{
+ BlockDriver *drv = bs->drv;
+
+ if (drv && drv->bdrv_ioctl)
+ return drv->bdrv_ioctl(bs, req, buf);
+ return -ENOTSUP;
+}
+
+BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
+ unsigned long int req, void *buf,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BlockDriver *drv = bs->drv;
+
+ if (drv && drv->bdrv_aio_ioctl)
+ return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
+ return NULL;
+}
+
+
+
+void *qemu_blockalign(BlockDriverState *bs, size_t size)
+{
+ return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
+}
+
+void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable)
+{
+ int64_t bitmap_size;
+
+ bs->dirty_count = 0;
+ if (enable) {
+ if (!bs->dirty_bitmap) {
+ bitmap_size = (bdrv_getlength(bs) >> BDRV_SECTOR_BITS) +
+ BDRV_SECTORS_PER_DIRTY_CHUNK * 8 - 1;
+ bitmap_size /= BDRV_SECTORS_PER_DIRTY_CHUNK * 8;
+
+ bs->dirty_bitmap = qemu_mallocz(bitmap_size);
+ }
+ } else {
+ if (bs->dirty_bitmap) {
+ qemu_free(bs->dirty_bitmap);
+ bs->dirty_bitmap = NULL;
+ }
+ }
+}
+
+int bdrv_get_dirty(BlockDriverState *bs, int64_t sector)
+{
+ int64_t chunk = sector / (int64_t)BDRV_SECTORS_PER_DIRTY_CHUNK;
+
+ if (bs->dirty_bitmap &&
+ (sector << BDRV_SECTOR_BITS) < bdrv_getlength(bs)) {
+ return !!(bs->dirty_bitmap[chunk / (sizeof(unsigned long) * 8)] &
+ (1UL << (chunk % (sizeof(unsigned long) * 8))));
+ } else {
+ return 0;
+ }
+}
+
+void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
+ int nr_sectors)
+{
+ set_dirty_bitmap(bs, cur_sector, nr_sectors, 0);
+}
+
+int64_t bdrv_get_dirty_count(BlockDriverState *bs)
+{
+ return bs->dirty_count;
+}
+
+void bdrv_set_in_use(BlockDriverState *bs, int in_use)
+{
+ assert(bs->in_use != in_use);
+ bs->in_use = in_use;
+}
+
+int bdrv_in_use(BlockDriverState *bs)
+{
+ return bs->in_use;
+}
+
+int bdrv_img_create(const char *filename, const char *fmt,
+ const char *base_filename, const char *base_fmt,
+ char *options, uint64_t img_size, int flags)
+{
+ QEMUOptionParameter *param = NULL, *create_options = NULL;
+ QEMUOptionParameter *backing_fmt, *backing_file, *size;
+ BlockDriverState *bs = NULL;
+ BlockDriver *drv, *proto_drv;
+ BlockDriver *backing_drv = NULL;
+ int ret = 0;
+
+ /* Find driver and parse its options */
+ drv = bdrv_find_format(fmt);
+ if (!drv) {
+ error_report("Unknown file format '%s'", fmt);
+ ret = -EINVAL;
+ goto out;
+ }
+
+ proto_drv = bdrv_find_protocol(filename);
+ if (!proto_drv) {
+ error_report("Unknown protocol '%s'", filename);
+ ret = -EINVAL;
+ goto out;
+ }
+
+ create_options = append_option_parameters(create_options,
+ drv->create_options);
+ create_options = append_option_parameters(create_options,
+ proto_drv->create_options);
+
+ /* Create parameter list with default values */
+ param = parse_option_parameters("", create_options, param);
+
+ set_option_parameter_int(param, BLOCK_OPT_SIZE, img_size);
+
+ /* Parse -o options */
+ if (options) {
+ param = parse_option_parameters(options, create_options, param);
+ if (param == NULL) {
+ error_report("Invalid options for file format '%s'.", fmt);
+ ret = -EINVAL;
+ goto out;
+ }
+ }
+
+ if (base_filename) {
+ if (set_option_parameter(param, BLOCK_OPT_BACKING_FILE,
+ base_filename)) {
+ error_report("Backing file not supported for file format '%s'",
+ fmt);
+ ret = -EINVAL;
+ goto out;
+ }
+ }
+
+ if (base_fmt) {
+ if (set_option_parameter(param, BLOCK_OPT_BACKING_FMT, base_fmt)) {
+ error_report("Backing file format not supported for file "
+ "format '%s'", fmt);
+ ret = -EINVAL;
+ goto out;
+ }
+ }
+
+ backing_file = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
+ if (backing_file && backing_file->value.s) {
+ if (!strcmp(filename, backing_file->value.s)) {
+ error_report("Error: Trying to create an image with the "
+ "same filename as the backing file");
+ ret = -EINVAL;
+ goto out;
+ }
+ }
+
+ backing_fmt = get_option_parameter(param, BLOCK_OPT_BACKING_FMT);
+ if (backing_fmt && backing_fmt->value.s) {
+ backing_drv = bdrv_find_format(backing_fmt->value.s);
+ if (!backing_drv) {
+ error_report("Unknown backing file format '%s'",
+ backing_fmt->value.s);
+ ret = -EINVAL;
+ goto out;
+ }
+ }
+
+ // The size for the image must always be specified, with one exception:
+ // If we are using a backing file, we can obtain the size from there
+ size = get_option_parameter(param, BLOCK_OPT_SIZE);
+ if (size && size->value.n == -1) {
+ if (backing_file && backing_file->value.s) {
+ uint64_t size;
+ char buf[32];
+
+ bs = bdrv_new("");
+
+ ret = bdrv_open(bs, backing_file->value.s, flags, backing_drv);
+ if (ret < 0) {
+ error_report("Could not open '%s'", backing_file->value.s);
+ goto out;
+ }
+ bdrv_get_geometry(bs, &size);
+ size *= 512;
+
+ snprintf(buf, sizeof(buf), "%" PRId64, size);
+ set_option_parameter(param, BLOCK_OPT_SIZE, buf);
+ } else {
+ error_report("Image creation needs a size parameter");
+ ret = -EINVAL;
+ goto out;
+ }
+ }
+
+ printf("Formatting '%s', fmt=%s ", filename, fmt);
+ print_option_parameters(param);
+ puts("");
+
+ ret = bdrv_create(drv, filename, param);
+
+ if (ret < 0) {
+ if (ret == -ENOTSUP) {
+ error_report("Formatting or formatting option not supported for "
+ "file format '%s'", fmt);
+ } else if (ret == -EFBIG) {
+ error_report("The image size is too large for file format '%s'",
+ fmt);
+ } else {
+ error_report("%s: error while creating %s: %s", filename, fmt,
+ strerror(-ret));
+ }
+ }
+
+out:
+ free_option_parameters(create_options);
+ free_option_parameters(param);
+
+ if (bs) {
+ bdrv_delete(bs);
+ }
+
+ return ret;
+}
diff --git a/qemu-0.15.x/block.h b/qemu-0.15.x/block.h
new file mode 100644
index 0000000..59cc410
--- /dev/null
+++ b/qemu-0.15.x/block.h
@@ -0,0 +1,305 @@
+#ifndef BLOCK_H
+#define BLOCK_H
+
+#include "qemu-aio.h"
+#include "qemu-common.h"
+#include "qemu-option.h"
+#include "qobject.h"
+
+/* block.c */
+typedef struct BlockDriver BlockDriver;
+
+typedef struct BlockDriverInfo {
+ /* in bytes, 0 if irrelevant */
+ int cluster_size;
+ /* offset at which the VM state can be saved (0 if not possible) */
+ int64_t vm_state_offset;
+} BlockDriverInfo;
+
+typedef struct QEMUSnapshotInfo {
+ char id_str[128]; /* unique snapshot id */
+ /* the following fields are informative. They are not needed for
+ the consistency of the snapshot */
+ char name[256]; /* user choosen name */
+ uint32_t vm_state_size; /* VM state info size */
+ uint32_t date_sec; /* UTC date of the snapshot */
+ uint32_t date_nsec;
+ uint64_t vm_clock_nsec; /* VM clock relative to boot */
+} QEMUSnapshotInfo;
+
+#define BDRV_O_RDWR 0x0002
+#define BDRV_O_SNAPSHOT 0x0008 /* open the file read only and save writes in a snapshot */
+#define BDRV_O_NOCACHE 0x0020 /* do not use the host page cache */
+#define BDRV_O_CACHE_WB 0x0040 /* use write-back caching */
+#define BDRV_O_NATIVE_AIO 0x0080 /* use native AIO instead of the thread pool */
+#define BDRV_O_NO_BACKING 0x0100 /* don't open the backing file */
+#define BDRV_O_NO_FLUSH 0x0200 /* disable flushing on this disk */
+
+#define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH)
+
+#define BDRV_SECTOR_BITS 9
+#define BDRV_SECTOR_SIZE (1ULL << BDRV_SECTOR_BITS)
+#define BDRV_SECTOR_MASK ~(BDRV_SECTOR_SIZE - 1)
+
+typedef enum {
+ BLOCK_ERR_REPORT, BLOCK_ERR_IGNORE, BLOCK_ERR_STOP_ENOSPC,
+ BLOCK_ERR_STOP_ANY
+} BlockErrorAction;
+
+typedef enum {
+ BDRV_ACTION_REPORT, BDRV_ACTION_IGNORE, BDRV_ACTION_STOP
+} BlockMonEventAction;
+
+void bdrv_mon_event(const BlockDriverState *bdrv,
+ BlockMonEventAction action, int is_read);
+void bdrv_info_print(Monitor *mon, const QObject *data);
+void bdrv_info(Monitor *mon, QObject **ret_data);
+void bdrv_stats_print(Monitor *mon, const QObject *data);
+void bdrv_info_stats(Monitor *mon, QObject **ret_data);
+
+void bdrv_init(void);
+void bdrv_init_with_whitelist(void);
+BlockDriver *bdrv_find_protocol(const char *filename);
+BlockDriver *bdrv_find_format(const char *format_name);
+BlockDriver *bdrv_find_whitelisted_format(const char *format_name);
+int bdrv_create(BlockDriver *drv, const char* filename,
+ QEMUOptionParameter *options);
+int bdrv_create_file(const char* filename, QEMUOptionParameter *options);
+BlockDriverState *bdrv_new(const char *device_name);
+void bdrv_make_anon(BlockDriverState *bs);
+void bdrv_delete(BlockDriverState *bs);
+int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags);
+int bdrv_open(BlockDriverState *bs, const char *filename, int flags,
+ BlockDriver *drv);
+void bdrv_close(BlockDriverState *bs);
+int bdrv_attach(BlockDriverState *bs, DeviceState *qdev);
+void bdrv_detach(BlockDriverState *bs, DeviceState *qdev);
+DeviceState *bdrv_get_attached(BlockDriverState *bs);
+int bdrv_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors);
+int bdrv_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors);
+int bdrv_pread(BlockDriverState *bs, int64_t offset,
+ void *buf, int count);
+int bdrv_pwrite(BlockDriverState *bs, int64_t offset,
+ const void *buf, int count);
+int bdrv_pwrite_sync(BlockDriverState *bs, int64_t offset,
+ const void *buf, int count);
+int bdrv_write_sync(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors);
+int bdrv_truncate(BlockDriverState *bs, int64_t offset);
+int64_t bdrv_getlength(BlockDriverState *bs);
+int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
+void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr);
+void bdrv_guess_geometry(BlockDriverState *bs, int *pcyls, int *pheads, int *psecs);
+int bdrv_commit(BlockDriverState *bs);
+void bdrv_commit_all(void);
+int bdrv_change_backing_file(BlockDriverState *bs,
+ const char *backing_file, const char *backing_fmt);
+void bdrv_register(BlockDriver *bdrv);
+
+
+typedef struct BdrvCheckResult {
+ int corruptions;
+ int leaks;
+ int check_errors;
+} BdrvCheckResult;
+
+int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res);
+
+/* async block I/O */
+typedef struct BlockDriverAIOCB BlockDriverAIOCB;
+typedef void BlockDriverCompletionFunc(void *opaque, int ret);
+typedef void BlockDriverDirtyHandler(BlockDriverState *bs, int64_t sector,
+ int sector_num);
+BlockDriverAIOCB *bdrv_aio_readv(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *iov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque);
+BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *iov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque);
+BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque);
+void bdrv_aio_cancel(BlockDriverAIOCB *acb);
+
+typedef struct BlockRequest {
+ /* Fields to be filled by multiwrite caller */
+ int64_t sector;
+ int nb_sectors;
+ QEMUIOVector *qiov;
+ BlockDriverCompletionFunc *cb;
+ void *opaque;
+
+ /* Filled by multiwrite implementation */
+ int error;
+} BlockRequest;
+
+int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs,
+ int num_reqs);
+
+/* sg packet commands */
+int bdrv_ioctl(BlockDriverState *bs, unsigned long int req, void *buf);
+BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
+ unsigned long int req, void *buf,
+ BlockDriverCompletionFunc *cb, void *opaque);
+
+/* Ensure contents are flushed to disk. */
+int bdrv_flush(BlockDriverState *bs);
+void bdrv_flush_all(void);
+void bdrv_close_all(void);
+
+int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors);
+int bdrv_has_zero_init(BlockDriverState *bs);
+int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors,
+ int *pnum);
+
+#define BIOS_ATA_TRANSLATION_AUTO 0
+#define BIOS_ATA_TRANSLATION_NONE 1
+#define BIOS_ATA_TRANSLATION_LBA 2
+#define BIOS_ATA_TRANSLATION_LARGE 3
+#define BIOS_ATA_TRANSLATION_RECHS 4
+
+void bdrv_set_geometry_hint(BlockDriverState *bs,
+ int cyls, int heads, int secs);
+void bdrv_set_translation_hint(BlockDriverState *bs, int translation);
+void bdrv_get_geometry_hint(BlockDriverState *bs,
+ int *pcyls, int *pheads, int *psecs);
+typedef enum FDriveType {
+ FDRIVE_DRV_144 = 0x00, /* 1.44 MB 3"5 drive */
+ FDRIVE_DRV_288 = 0x01, /* 2.88 MB 3"5 drive */
+ FDRIVE_DRV_120 = 0x02, /* 1.2 MB 5"25 drive */
+ FDRIVE_DRV_NONE = 0x03, /* No drive connected */
+} FDriveType;
+
+void bdrv_get_floppy_geometry_hint(BlockDriverState *bs, int *nb_heads,
+ int *max_track, int *last_sect,
+ FDriveType drive_in, FDriveType *drive);
+int bdrv_get_translation_hint(BlockDriverState *bs);
+void bdrv_set_on_error(BlockDriverState *bs, BlockErrorAction on_read_error,
+ BlockErrorAction on_write_error);
+BlockErrorAction bdrv_get_on_error(BlockDriverState *bs, int is_read);
+void bdrv_set_removable(BlockDriverState *bs, int removable);
+int bdrv_is_removable(BlockDriverState *bs);
+int bdrv_is_read_only(BlockDriverState *bs);
+int bdrv_is_sg(BlockDriverState *bs);
+int bdrv_enable_write_cache(BlockDriverState *bs);
+int bdrv_is_inserted(BlockDriverState *bs);
+int bdrv_media_changed(BlockDriverState *bs);
+int bdrv_is_locked(BlockDriverState *bs);
+void bdrv_set_locked(BlockDriverState *bs, int locked);
+int bdrv_eject(BlockDriverState *bs, int eject_flag);
+void bdrv_set_change_cb(BlockDriverState *bs,
+ void (*change_cb)(void *opaque, int reason),
+ void *opaque);
+void bdrv_get_format(BlockDriverState *bs, char *buf, int buf_size);
+BlockDriverState *bdrv_find(const char *name);
+BlockDriverState *bdrv_next(BlockDriverState *bs);
+void bdrv_iterate(void (*it)(void *opaque, BlockDriverState *bs),
+ void *opaque);
+int bdrv_is_encrypted(BlockDriverState *bs);
+int bdrv_key_required(BlockDriverState *bs);
+int bdrv_set_key(BlockDriverState *bs, const char *key);
+int bdrv_query_missing_keys(void);
+void bdrv_iterate_format(void (*it)(void *opaque, const char *name),
+ void *opaque);
+const char *bdrv_get_device_name(BlockDriverState *bs);
+int bdrv_write_compressed(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors);
+int bdrv_get_info(BlockDriverState *bs, BlockDriverInfo *bdi);
+
+const char *bdrv_get_encrypted_filename(BlockDriverState *bs);
+void bdrv_get_backing_filename(BlockDriverState *bs,
+ char *filename, int filename_size);
+int bdrv_can_snapshot(BlockDriverState *bs);
+int bdrv_is_snapshot(BlockDriverState *bs);
+BlockDriverState *bdrv_snapshots(void);
+int bdrv_snapshot_create(BlockDriverState *bs,
+ QEMUSnapshotInfo *sn_info);
+int bdrv_snapshot_goto(BlockDriverState *bs,
+ const char *snapshot_id);
+int bdrv_snapshot_delete(BlockDriverState *bs, const char *snapshot_id);
+int bdrv_snapshot_list(BlockDriverState *bs,
+ QEMUSnapshotInfo **psn_info);
+int bdrv_snapshot_load_tmp(BlockDriverState *bs,
+ const char *snapshot_name);
+char *bdrv_snapshot_dump(char *buf, int buf_size, QEMUSnapshotInfo *sn);
+
+char *get_human_readable_size(char *buf, int buf_size, int64_t size);
+int path_is_absolute(const char *path);
+void path_combine(char *dest, int dest_size,
+ const char *base_path,
+ const char *filename);
+
+int bdrv_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
+ int64_t pos, int size);
+
+int bdrv_load_vmstate(BlockDriverState *bs, uint8_t *buf,
+ int64_t pos, int size);
+
+int bdrv_img_create(const char *filename, const char *fmt,
+ const char *base_filename, const char *base_fmt,
+ char *options, uint64_t img_size, int flags);
+
+#define BDRV_SECTORS_PER_DIRTY_CHUNK 2048
+
+void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable);
+int bdrv_get_dirty(BlockDriverState *bs, int64_t sector);
+void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
+ int nr_sectors);
+int64_t bdrv_get_dirty_count(BlockDriverState *bs);
+
+void bdrv_set_in_use(BlockDriverState *bs, int in_use);
+int bdrv_in_use(BlockDriverState *bs);
+
+typedef enum {
+ BLKDBG_L1_UPDATE,
+
+ BLKDBG_L1_GROW_ALLOC_TABLE,
+ BLKDBG_L1_GROW_WRITE_TABLE,
+ BLKDBG_L1_GROW_ACTIVATE_TABLE,
+
+ BLKDBG_L2_LOAD,
+ BLKDBG_L2_UPDATE,
+ BLKDBG_L2_UPDATE_COMPRESSED,
+ BLKDBG_L2_ALLOC_COW_READ,
+ BLKDBG_L2_ALLOC_WRITE,
+
+ BLKDBG_READ,
+ BLKDBG_READ_AIO,
+ BLKDBG_READ_BACKING,
+ BLKDBG_READ_BACKING_AIO,
+ BLKDBG_READ_COMPRESSED,
+
+ BLKDBG_WRITE_AIO,
+ BLKDBG_WRITE_COMPRESSED,
+
+ BLKDBG_VMSTATE_LOAD,
+ BLKDBG_VMSTATE_SAVE,
+
+ BLKDBG_COW_READ,
+ BLKDBG_COW_WRITE,
+
+ BLKDBG_REFTABLE_LOAD,
+ BLKDBG_REFTABLE_GROW,
+
+ BLKDBG_REFBLOCK_LOAD,
+ BLKDBG_REFBLOCK_UPDATE,
+ BLKDBG_REFBLOCK_UPDATE_PART,
+ BLKDBG_REFBLOCK_ALLOC,
+ BLKDBG_REFBLOCK_ALLOC_HOOKUP,
+ BLKDBG_REFBLOCK_ALLOC_WRITE,
+ BLKDBG_REFBLOCK_ALLOC_WRITE_BLOCKS,
+ BLKDBG_REFBLOCK_ALLOC_WRITE_TABLE,
+ BLKDBG_REFBLOCK_ALLOC_SWITCH_TABLE,
+
+ BLKDBG_CLUSTER_ALLOC,
+ BLKDBG_CLUSTER_ALLOC_BYTES,
+ BLKDBG_CLUSTER_FREE,
+
+ BLKDBG_EVENT_MAX,
+} BlkDebugEvent;
+
+#define BLKDBG_EVENT(bs, evt) bdrv_debug_event(bs, evt)
+void bdrv_debug_event(BlockDriverState *bs, BlkDebugEvent event);
+
+#endif
diff --git a/qemu-0.15.x/block/blkdebug.c b/qemu-0.15.x/block/blkdebug.c
new file mode 100644
index 0000000..cd9eb80
--- /dev/null
+++ b/qemu-0.15.x/block/blkdebug.c
@@ -0,0 +1,471 @@
+/*
+ * Block protocol for I/O error injection
+ *
+ * Copyright (c) 2010 Kevin Wolf <kwolf(a)redhat.com>
+ *
+ * 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.
+ */
+
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+
+typedef struct BlkdebugVars {
+ int state;
+
+ /* If inject_errno != 0, an error is injected for requests */
+ int inject_errno;
+
+ /* Decides if all future requests fail (false) or only the next one and
+ * after the next request inject_errno is reset to 0 (true) */
+ bool inject_once;
+
+ /* Decides if aio_readv/writev fails right away (true) or returns an error
+ * return value only in the callback (false) */
+ bool inject_immediately;
+} BlkdebugVars;
+
+typedef struct BDRVBlkdebugState {
+ BlkdebugVars vars;
+ QLIST_HEAD(list, BlkdebugRule) rules[BLKDBG_EVENT_MAX];
+} BDRVBlkdebugState;
+
+typedef struct BlkdebugAIOCB {
+ BlockDriverAIOCB common;
+ QEMUBH *bh;
+ int ret;
+} BlkdebugAIOCB;
+
+static void blkdebug_aio_cancel(BlockDriverAIOCB *blockacb);
+
+static AIOPool blkdebug_aio_pool = {
+ .aiocb_size = sizeof(BlkdebugAIOCB),
+ .cancel = blkdebug_aio_cancel,
+};
+
+enum {
+ ACTION_INJECT_ERROR,
+ ACTION_SET_STATE,
+};
+
+typedef struct BlkdebugRule {
+ BlkDebugEvent event;
+ int action;
+ int state;
+ union {
+ struct {
+ int error;
+ int immediately;
+ int once;
+ } inject;
+ struct {
+ int new_state;
+ } set_state;
+ } options;
+ QLIST_ENTRY(BlkdebugRule) next;
+} BlkdebugRule;
+
+static QemuOptsList inject_error_opts = {
+ .name = "inject-error",
+ .head = QTAILQ_HEAD_INITIALIZER(inject_error_opts.head),
+ .desc = {
+ {
+ .name = "event",
+ .type = QEMU_OPT_STRING,
+ },
+ {
+ .name = "state",
+ .type = QEMU_OPT_NUMBER,
+ },
+ {
+ .name = "errno",
+ .type = QEMU_OPT_NUMBER,
+ },
+ {
+ .name = "once",
+ .type = QEMU_OPT_BOOL,
+ },
+ {
+ .name = "immediately",
+ .type = QEMU_OPT_BOOL,
+ },
+ { /* end of list */ }
+ },
+};
+
+static QemuOptsList set_state_opts = {
+ .name = "set-state",
+ .head = QTAILQ_HEAD_INITIALIZER(set_state_opts.head),
+ .desc = {
+ {
+ .name = "event",
+ .type = QEMU_OPT_STRING,
+ },
+ {
+ .name = "state",
+ .type = QEMU_OPT_NUMBER,
+ },
+ {
+ .name = "new_state",
+ .type = QEMU_OPT_NUMBER,
+ },
+ { /* end of list */ }
+ },
+};
+
+static QemuOptsList *config_groups[] = {
+ &inject_error_opts,
+ &set_state_opts,
+ NULL
+};
+
+static const char *event_names[BLKDBG_EVENT_MAX] = {
+ [BLKDBG_L1_UPDATE] = "l1_update",
+ [BLKDBG_L1_GROW_ALLOC_TABLE] = "l1_grow.alloc_table",
+ [BLKDBG_L1_GROW_WRITE_TABLE] = "l1_grow.write_table",
+ [BLKDBG_L1_GROW_ACTIVATE_TABLE] = "l1_grow.activate_table",
+
+ [BLKDBG_L2_LOAD] = "l2_load",
+ [BLKDBG_L2_UPDATE] = "l2_update",
+ [BLKDBG_L2_UPDATE_COMPRESSED] = "l2_update_compressed",
+ [BLKDBG_L2_ALLOC_COW_READ] = "l2_alloc.cow_read",
+ [BLKDBG_L2_ALLOC_WRITE] = "l2_alloc.write",
+
+ [BLKDBG_READ] = "read",
+ [BLKDBG_READ_AIO] = "read_aio",
+ [BLKDBG_READ_BACKING] = "read_backing",
+ [BLKDBG_READ_BACKING_AIO] = "read_backing_aio",
+ [BLKDBG_READ_COMPRESSED] = "read_compressed",
+
+ [BLKDBG_WRITE_AIO] = "write_aio",
+ [BLKDBG_WRITE_COMPRESSED] = "write_compressed",
+
+ [BLKDBG_VMSTATE_LOAD] = "vmstate_load",
+ [BLKDBG_VMSTATE_SAVE] = "vmstate_save",
+
+ [BLKDBG_COW_READ] = "cow_read",
+ [BLKDBG_COW_WRITE] = "cow_write",
+
+ [BLKDBG_REFTABLE_LOAD] = "reftable_load",
+ [BLKDBG_REFTABLE_GROW] = "reftable_grow",
+
+ [BLKDBG_REFBLOCK_LOAD] = "refblock_load",
+ [BLKDBG_REFBLOCK_UPDATE] = "refblock_update",
+ [BLKDBG_REFBLOCK_UPDATE_PART] = "refblock_update_part",
+ [BLKDBG_REFBLOCK_ALLOC] = "refblock_alloc",
+ [BLKDBG_REFBLOCK_ALLOC_HOOKUP] = "refblock_alloc.hookup",
+ [BLKDBG_REFBLOCK_ALLOC_WRITE] = "refblock_alloc.write",
+ [BLKDBG_REFBLOCK_ALLOC_WRITE_BLOCKS] = "refblock_alloc.write_blocks",
+ [BLKDBG_REFBLOCK_ALLOC_WRITE_TABLE] = "refblock_alloc.write_table",
+ [BLKDBG_REFBLOCK_ALLOC_SWITCH_TABLE] = "refblock_alloc.switch_table",
+
+ [BLKDBG_CLUSTER_ALLOC] = "cluster_alloc",
+ [BLKDBG_CLUSTER_ALLOC_BYTES] = "cluster_alloc_bytes",
+ [BLKDBG_CLUSTER_FREE] = "cluster_free",
+};
+
+static int get_event_by_name(const char *name, BlkDebugEvent *event)
+{
+ int i;
+
+ for (i = 0; i < BLKDBG_EVENT_MAX; i++) {
+ if (!strcmp(event_names[i], name)) {
+ *event = i;
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+struct add_rule_data {
+ BDRVBlkdebugState *s;
+ int action;
+};
+
+static int add_rule(QemuOpts *opts, void *opaque)
+{
+ struct add_rule_data *d = opaque;
+ BDRVBlkdebugState *s = d->s;
+ const char* event_name;
+ BlkDebugEvent event;
+ struct BlkdebugRule *rule;
+
+ /* Find the right event for the rule */
+ event_name = qemu_opt_get(opts, "event");
+ if (!event_name || get_event_by_name(event_name, &event) < 0) {
+ return -1;
+ }
+
+ /* Set attributes common for all actions */
+ rule = qemu_mallocz(sizeof(*rule));
+ *rule = (struct BlkdebugRule) {
+ .event = event,
+ .action = d->action,
+ .state = qemu_opt_get_number(opts, "state", 0),
+ };
+
+ /* Parse action-specific options */
+ switch (d->action) {
+ case ACTION_INJECT_ERROR:
+ rule->options.inject.error = qemu_opt_get_number(opts, "errno", EIO);
+ rule->options.inject.once = qemu_opt_get_bool(opts, "once", 0);
+ rule->options.inject.immediately =
+ qemu_opt_get_bool(opts, "immediately", 0);
+ break;
+
+ case ACTION_SET_STATE:
+ rule->options.set_state.new_state =
+ qemu_opt_get_number(opts, "new_state", 0);
+ break;
+ };
+
+ /* Add the rule */
+ QLIST_INSERT_HEAD(&s->rules[event], rule, next);
+
+ return 0;
+}
+
+static int read_config(BDRVBlkdebugState *s, const char *filename)
+{
+ FILE *f;
+ int ret;
+ struct add_rule_data d;
+
+ f = fopen(filename, "r");
+ if (f == NULL) {
+ return -errno;
+ }
+
+ ret = qemu_config_parse(f, config_groups, filename);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ d.s = s;
+ d.action = ACTION_INJECT_ERROR;
+ qemu_opts_foreach(&inject_error_opts, add_rule, &d, 0);
+
+ d.action = ACTION_SET_STATE;
+ qemu_opts_foreach(&set_state_opts, add_rule, &d, 0);
+
+ ret = 0;
+fail:
+ qemu_opts_reset(&inject_error_opts);
+ qemu_opts_reset(&set_state_opts);
+ fclose(f);
+ return ret;
+}
+
+/* Valid blkdebug filenames look like blkdebug:path/to/config:path/to/image */
+static int blkdebug_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVBlkdebugState *s = bs->opaque;
+ int ret;
+ char *config, *c;
+
+ /* Parse the blkdebug: prefix */
+ if (strncmp(filename, "blkdebug:", strlen("blkdebug:"))) {
+ return -EINVAL;
+ }
+ filename += strlen("blkdebug:");
+
+ /* Read rules from config file */
+ c = strchr(filename, ':');
+ if (c == NULL) {
+ return -EINVAL;
+ }
+
+ config = strdup(filename);
+ config[c - filename] = '\0';
+ ret = read_config(s, config);
+ free(config);
+ if (ret < 0) {
+ return ret;
+ }
+ filename = c + 1;
+
+ /* Set initial state */
+ s->vars.state = 1;
+
+ /* Open the backing file */
+ ret = bdrv_file_open(&bs->file, filename, flags);
+ if (ret < 0) {
+ return ret;
+ }
+
+ return 0;
+}
+
+static void error_callback_bh(void *opaque)
+{
+ struct BlkdebugAIOCB *acb = opaque;
+ qemu_bh_delete(acb->bh);
+ acb->common.cb(acb->common.opaque, acb->ret);
+ qemu_aio_release(acb);
+}
+
+static void blkdebug_aio_cancel(BlockDriverAIOCB *blockacb)
+{
+ BlkdebugAIOCB *acb = container_of(blockacb, BlkdebugAIOCB, common);
+ qemu_aio_release(acb);
+}
+
+static BlockDriverAIOCB *inject_error(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVBlkdebugState *s = bs->opaque;
+ int error = s->vars.inject_errno;
+ struct BlkdebugAIOCB *acb;
+ QEMUBH *bh;
+
+ if (s->vars.inject_once) {
+ s->vars.inject_errno = 0;
+ }
+
+ if (s->vars.inject_immediately) {
+ return NULL;
+ }
+
+ acb = qemu_aio_get(&blkdebug_aio_pool, bs, cb, opaque);
+ acb->ret = -error;
+
+ bh = qemu_bh_new(error_callback_bh, acb);
+ acb->bh = bh;
+ qemu_bh_schedule(bh);
+
+ return &acb->common;
+}
+
+static BlockDriverAIOCB *blkdebug_aio_readv(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVBlkdebugState *s = bs->opaque;
+
+ if (s->vars.inject_errno) {
+ return inject_error(bs, cb, opaque);
+ }
+
+ BlockDriverAIOCB *acb =
+ bdrv_aio_readv(bs->file, sector_num, qiov, nb_sectors, cb, opaque);
+ return acb;
+}
+
+static BlockDriverAIOCB *blkdebug_aio_writev(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVBlkdebugState *s = bs->opaque;
+
+ if (s->vars.inject_errno) {
+ return inject_error(bs, cb, opaque);
+ }
+
+ BlockDriverAIOCB *acb =
+ bdrv_aio_writev(bs->file, sector_num, qiov, nb_sectors, cb, opaque);
+ return acb;
+}
+
+static void blkdebug_close(BlockDriverState *bs)
+{
+ BDRVBlkdebugState *s = bs->opaque;
+ BlkdebugRule *rule, *next;
+ int i;
+
+ for (i = 0; i < BLKDBG_EVENT_MAX; i++) {
+ QLIST_FOREACH_SAFE(rule, &s->rules[i], next, next) {
+ QLIST_REMOVE(rule, next);
+ qemu_free(rule);
+ }
+ }
+}
+
+static int blkdebug_flush(BlockDriverState *bs)
+{
+ return bdrv_flush(bs->file);
+}
+
+static BlockDriverAIOCB *blkdebug_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_flush(bs->file, cb, opaque);
+}
+
+static void process_rule(BlockDriverState *bs, struct BlkdebugRule *rule,
+ BlkdebugVars *old_vars)
+{
+ BDRVBlkdebugState *s = bs->opaque;
+ BlkdebugVars *vars = &s->vars;
+
+ /* Only process rules for the current state */
+ if (rule->state && rule->state != old_vars->state) {
+ return;
+ }
+
+ /* Take the action */
+ switch (rule->action) {
+ case ACTION_INJECT_ERROR:
+ vars->inject_errno = rule->options.inject.error;
+ vars->inject_once = rule->options.inject.once;
+ vars->inject_immediately = rule->options.inject.immediately;
+ break;
+
+ case ACTION_SET_STATE:
+ vars->state = rule->options.set_state.new_state;
+ break;
+ }
+}
+
+static void blkdebug_debug_event(BlockDriverState *bs, BlkDebugEvent event)
+{
+ BDRVBlkdebugState *s = bs->opaque;
+ struct BlkdebugRule *rule;
+ BlkdebugVars old_vars = s->vars;
+
+ assert((int)event >= 0 && event < BLKDBG_EVENT_MAX);
+
+ QLIST_FOREACH(rule, &s->rules[event], next) {
+ process_rule(bs, rule, &old_vars);
+ }
+}
+
+static BlockDriver bdrv_blkdebug = {
+ .format_name = "blkdebug",
+ .protocol_name = "blkdebug",
+
+ .instance_size = sizeof(BDRVBlkdebugState),
+
+ .bdrv_file_open = blkdebug_open,
+ .bdrv_close = blkdebug_close,
+ .bdrv_flush = blkdebug_flush,
+
+ .bdrv_aio_readv = blkdebug_aio_readv,
+ .bdrv_aio_writev = blkdebug_aio_writev,
+ .bdrv_aio_flush = blkdebug_aio_flush,
+
+ .bdrv_debug_event = blkdebug_debug_event,
+};
+
+static void bdrv_blkdebug_init(void)
+{
+ bdrv_register(&bdrv_blkdebug);
+}
+
+block_init(bdrv_blkdebug_init);
diff --git a/qemu-0.15.x/block/blkverify.c b/qemu-0.15.x/block/blkverify.c
new file mode 100644
index 0000000..c7522b4
--- /dev/null
+++ b/qemu-0.15.x/block/blkverify.c
@@ -0,0 +1,383 @@
+/*
+ * Block protocol for block driver correctness testing
+ *
+ * Copyright (C) 2010 IBM, Corp.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include <stdarg.h>
+#include "qemu_socket.h" /* for EINPROGRESS on Windows */
+#include "block_int.h"
+
+typedef struct {
+ BlockDriverState *test_file;
+} BDRVBlkverifyState;
+
+typedef struct BlkverifyAIOCB BlkverifyAIOCB;
+struct BlkverifyAIOCB {
+ BlockDriverAIOCB common;
+ QEMUBH *bh;
+
+ /* Request metadata */
+ bool is_write;
+ int64_t sector_num;
+ int nb_sectors;
+
+ int ret; /* first completed request's result */
+ unsigned int done; /* completion counter */
+ bool *finished; /* completion signal for cancel */
+
+ QEMUIOVector *qiov; /* user I/O vector */
+ QEMUIOVector raw_qiov; /* cloned I/O vector for raw file */
+ void *buf; /* buffer for raw file I/O */
+
+ void (*verify)(BlkverifyAIOCB *acb);
+};
+
+static void blkverify_aio_cancel(BlockDriverAIOCB *blockacb)
+{
+ BlkverifyAIOCB *acb = (BlkverifyAIOCB *)blockacb;
+ bool finished = false;
+
+ /* Wait until request completes, invokes its callback, and frees itself */
+ acb->finished = &finished;
+ while (!finished) {
+ qemu_aio_wait();
+ }
+}
+
+static AIOPool blkverify_aio_pool = {
+ .aiocb_size = sizeof(BlkverifyAIOCB),
+ .cancel = blkverify_aio_cancel,
+};
+
+static void GCC_FMT_ATTR(2, 3) blkverify_err(BlkverifyAIOCB *acb,
+ const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ fprintf(stderr, "blkverify: %s sector_num=%" PRId64 " nb_sectors=%d ",
+ acb->is_write ? "write" : "read", acb->sector_num,
+ acb->nb_sectors);
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, "\n");
+ va_end(ap);
+ exit(1);
+}
+
+/* Valid blkverify filenames look like blkverify:path/to/raw_image:path/to/image */
+static int blkverify_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVBlkverifyState *s = bs->opaque;
+ int ret;
+ char *raw, *c;
+
+ /* Parse the blkverify: prefix */
+ if (strncmp(filename, "blkverify:", strlen("blkverify:"))) {
+ return -EINVAL;
+ }
+ filename += strlen("blkverify:");
+
+ /* Parse the raw image filename */
+ c = strchr(filename, ':');
+ if (c == NULL) {
+ return -EINVAL;
+ }
+
+ raw = strdup(filename);
+ raw[c - filename] = '\0';
+ ret = bdrv_file_open(&bs->file, raw, flags);
+ free(raw);
+ if (ret < 0) {
+ return ret;
+ }
+ filename = c + 1;
+
+ /* Open the test file */
+ s->test_file = bdrv_new("");
+ ret = bdrv_open(s->test_file, filename, flags, NULL);
+ if (ret < 0) {
+ bdrv_delete(s->test_file);
+ s->test_file = NULL;
+ return ret;
+ }
+
+ return 0;
+}
+
+static void blkverify_close(BlockDriverState *bs)
+{
+ BDRVBlkverifyState *s = bs->opaque;
+
+ bdrv_delete(s->test_file);
+ s->test_file = NULL;
+}
+
+static int blkverify_flush(BlockDriverState *bs)
+{
+ BDRVBlkverifyState *s = bs->opaque;
+
+ /* Only flush test file, the raw file is not important */
+ return bdrv_flush(s->test_file);
+}
+
+static int64_t blkverify_getlength(BlockDriverState *bs)
+{
+ BDRVBlkverifyState *s = bs->opaque;
+
+ return bdrv_getlength(s->test_file);
+}
+
+/**
+ * Check that I/O vector contents are identical
+ *
+ * @a: I/O vector
+ * @b: I/O vector
+ * @ret: Offset to first mismatching byte or -1 if match
+ */
+static ssize_t blkverify_iovec_compare(QEMUIOVector *a, QEMUIOVector *b)
+{
+ int i;
+ ssize_t offset = 0;
+
+ assert(a->niov == b->niov);
+ for (i = 0; i < a->niov; i++) {
+ size_t len = 0;
+ uint8_t *p = (uint8_t *)a->iov[i].iov_base;
+ uint8_t *q = (uint8_t *)b->iov[i].iov_base;
+
+ assert(a->iov[i].iov_len == b->iov[i].iov_len);
+ while (len < a->iov[i].iov_len && *p++ == *q++) {
+ len++;
+ }
+
+ offset += len;
+
+ if (len != a->iov[i].iov_len) {
+ return offset;
+ }
+ }
+ return -1;
+}
+
+typedef struct {
+ int src_index;
+ struct iovec *src_iov;
+ void *dest_base;
+} IOVectorSortElem;
+
+static int sortelem_cmp_src_base(const void *a, const void *b)
+{
+ const IOVectorSortElem *elem_a = a;
+ const IOVectorSortElem *elem_b = b;
+
+ /* Don't overflow */
+ if (elem_a->src_iov->iov_base < elem_b->src_iov->iov_base) {
+ return -1;
+ } else if (elem_a->src_iov->iov_base > elem_b->src_iov->iov_base) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+static int sortelem_cmp_src_index(const void *a, const void *b)
+{
+ const IOVectorSortElem *elem_a = a;
+ const IOVectorSortElem *elem_b = b;
+
+ return elem_a->src_index - elem_b->src_index;
+}
+
+/**
+ * Copy contents of I/O vector
+ *
+ * The relative relationships of overlapping iovecs are preserved. This is
+ * necessary to ensure identical semantics in the cloned I/O vector.
+ */
+static void blkverify_iovec_clone(QEMUIOVector *dest, const QEMUIOVector *src,
+ void *buf)
+{
+ IOVectorSortElem sortelems[src->niov];
+ void *last_end;
+ int i;
+
+ /* Sort by source iovecs by base address */
+ for (i = 0; i < src->niov; i++) {
+ sortelems[i].src_index = i;
+ sortelems[i].src_iov = &src->iov[i];
+ }
+ qsort(sortelems, src->niov, sizeof(sortelems[0]), sortelem_cmp_src_base);
+
+ /* Allocate buffer space taking into account overlapping iovecs */
+ last_end = NULL;
+ for (i = 0; i < src->niov; i++) {
+ struct iovec *cur = sortelems[i].src_iov;
+ ptrdiff_t rewind = 0;
+
+ /* Detect overlap */
+ if (last_end && last_end > cur->iov_base) {
+ rewind = last_end - cur->iov_base;
+ }
+
+ sortelems[i].dest_base = buf - rewind;
+ buf += cur->iov_len - MIN(rewind, cur->iov_len);
+ last_end = MAX(cur->iov_base + cur->iov_len, last_end);
+ }
+
+ /* Sort by source iovec index and build destination iovec */
+ qsort(sortelems, src->niov, sizeof(sortelems[0]), sortelem_cmp_src_index);
+ for (i = 0; i < src->niov; i++) {
+ qemu_iovec_add(dest, sortelems[i].dest_base, src->iov[i].iov_len);
+ }
+}
+
+static BlkverifyAIOCB *blkverify_aio_get(BlockDriverState *bs, bool is_write,
+ int64_t sector_num, QEMUIOVector *qiov,
+ int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ BlkverifyAIOCB *acb = qemu_aio_get(&blkverify_aio_pool, bs, cb, opaque);
+
+ acb->bh = NULL;
+ acb->is_write = is_write;
+ acb->sector_num = sector_num;
+ acb->nb_sectors = nb_sectors;
+ acb->ret = -EINPROGRESS;
+ acb->done = 0;
+ acb->qiov = qiov;
+ acb->buf = NULL;
+ acb->verify = NULL;
+ acb->finished = NULL;
+ return acb;
+}
+
+static void blkverify_aio_bh(void *opaque)
+{
+ BlkverifyAIOCB *acb = opaque;
+
+ qemu_bh_delete(acb->bh);
+ if (acb->buf) {
+ qemu_iovec_destroy(&acb->raw_qiov);
+ qemu_vfree(acb->buf);
+ }
+ acb->common.cb(acb->common.opaque, acb->ret);
+ if (acb->finished) {
+ *acb->finished = true;
+ }
+ qemu_aio_release(acb);
+}
+
+static void blkverify_aio_cb(void *opaque, int ret)
+{
+ BlkverifyAIOCB *acb = opaque;
+
+ switch (++acb->done) {
+ case 1:
+ acb->ret = ret;
+ break;
+
+ case 2:
+ if (acb->ret != ret) {
+ blkverify_err(acb, "return value mismatch %d != %d", acb->ret, ret);
+ }
+
+ if (acb->verify) {
+ acb->verify(acb);
+ }
+
+ acb->bh = qemu_bh_new(blkverify_aio_bh, acb);
+ qemu_bh_schedule(acb->bh);
+ break;
+ }
+}
+
+static void blkverify_verify_readv(BlkverifyAIOCB *acb)
+{
+ ssize_t offset = blkverify_iovec_compare(acb->qiov, &acb->raw_qiov);
+ if (offset != -1) {
+ blkverify_err(acb, "contents mismatch in sector %" PRId64,
+ acb->sector_num + (int64_t)(offset / BDRV_SECTOR_SIZE));
+ }
+}
+
+static BlockDriverAIOCB *blkverify_aio_readv(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVBlkverifyState *s = bs->opaque;
+ BlkverifyAIOCB *acb = blkverify_aio_get(bs, false, sector_num, qiov,
+ nb_sectors, cb, opaque);
+
+ acb->verify = blkverify_verify_readv;
+ acb->buf = qemu_blockalign(bs->file, qiov->size);
+ qemu_iovec_init(&acb->raw_qiov, acb->qiov->niov);
+ blkverify_iovec_clone(&acb->raw_qiov, qiov, acb->buf);
+
+ if (!bdrv_aio_readv(s->test_file, sector_num, qiov, nb_sectors,
+ blkverify_aio_cb, acb)) {
+ blkverify_aio_cb(acb, -EIO);
+ }
+ if (!bdrv_aio_readv(bs->file, sector_num, &acb->raw_qiov, nb_sectors,
+ blkverify_aio_cb, acb)) {
+ blkverify_aio_cb(acb, -EIO);
+ }
+ return &acb->common;
+}
+
+static BlockDriverAIOCB *blkverify_aio_writev(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVBlkverifyState *s = bs->opaque;
+ BlkverifyAIOCB *acb = blkverify_aio_get(bs, true, sector_num, qiov,
+ nb_sectors, cb, opaque);
+
+ if (!bdrv_aio_writev(s->test_file, sector_num, qiov, nb_sectors,
+ blkverify_aio_cb, acb)) {
+ blkverify_aio_cb(acb, -EIO);
+ }
+ if (!bdrv_aio_writev(bs->file, sector_num, qiov, nb_sectors,
+ blkverify_aio_cb, acb)) {
+ blkverify_aio_cb(acb, -EIO);
+ }
+ return &acb->common;
+}
+
+static BlockDriverAIOCB *blkverify_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ BDRVBlkverifyState *s = bs->opaque;
+
+ /* Only flush test file, the raw file is not important */
+ return bdrv_aio_flush(s->test_file, cb, opaque);
+}
+
+static BlockDriver bdrv_blkverify = {
+ .format_name = "blkverify",
+ .protocol_name = "blkverify",
+
+ .instance_size = sizeof(BDRVBlkverifyState),
+
+ .bdrv_getlength = blkverify_getlength,
+
+ .bdrv_file_open = blkverify_open,
+ .bdrv_close = blkverify_close,
+ .bdrv_flush = blkverify_flush,
+
+ .bdrv_aio_readv = blkverify_aio_readv,
+ .bdrv_aio_writev = blkverify_aio_writev,
+ .bdrv_aio_flush = blkverify_aio_flush,
+};
+
+static void bdrv_blkverify_init(void)
+{
+ bdrv_register(&bdrv_blkverify);
+}
+
+block_init(bdrv_blkverify_init);
diff --git a/qemu-0.15.x/block/bochs.c b/qemu-0.15.x/block/bochs.c
new file mode 100644
index 0000000..5fe2fa3
--- /dev/null
+++ b/qemu-0.15.x/block/bochs.c
@@ -0,0 +1,230 @@
+/*
+ * Block driver for the various disk image formats used by Bochs
+ * Currently only for "growing" type in read-only mode
+ *
+ * Copyright (c) 2005 Alex Beregszaszi
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+
+/**************************************************************/
+
+#define HEADER_MAGIC "Bochs Virtual HD Image"
+#define HEADER_VERSION 0x00020000
+#define HEADER_V1 0x00010000
+#define HEADER_SIZE 512
+
+#define REDOLOG_TYPE "Redolog"
+#define GROWING_TYPE "Growing"
+
+// not allocated: 0xffffffff
+
+// always little-endian
+struct bochs_header_v1 {
+ char magic[32]; // "Bochs Virtual HD Image"
+ char type[16]; // "Redolog"
+ char subtype[16]; // "Undoable" / "Volatile" / "Growing"
+ uint32_t version;
+ uint32_t header; // size of header
+
+ union {
+ struct {
+ uint32_t catalog; // num of entries
+ uint32_t bitmap; // bitmap size
+ uint32_t extent; // extent size
+ uint64_t disk; // disk size
+ char padding[HEADER_SIZE - 64 - 8 - 20];
+ } redolog;
+ char padding[HEADER_SIZE - 64 - 8];
+ } extra;
+};
+
+// always little-endian
+struct bochs_header {
+ char magic[32]; // "Bochs Virtual HD Image"
+ char type[16]; // "Redolog"
+ char subtype[16]; // "Undoable" / "Volatile" / "Growing"
+ uint32_t version;
+ uint32_t header; // size of header
+
+ union {
+ struct {
+ uint32_t catalog; // num of entries
+ uint32_t bitmap; // bitmap size
+ uint32_t extent; // extent size
+ uint32_t reserved; // for ???
+ uint64_t disk; // disk size
+ char padding[HEADER_SIZE - 64 - 8 - 24];
+ } redolog;
+ char padding[HEADER_SIZE - 64 - 8];
+ } extra;
+};
+
+typedef struct BDRVBochsState {
+ uint32_t *catalog_bitmap;
+ int catalog_size;
+
+ int data_offset;
+
+ int bitmap_blocks;
+ int extent_blocks;
+ int extent_size;
+} BDRVBochsState;
+
+static int bochs_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ const struct bochs_header *bochs = (const void *)buf;
+
+ if (buf_size < HEADER_SIZE)
+ return 0;
+
+ if (!strcmp(bochs->magic, HEADER_MAGIC) &&
+ !strcmp(bochs->type, REDOLOG_TYPE) &&
+ !strcmp(bochs->subtype, GROWING_TYPE) &&
+ ((le32_to_cpu(bochs->version) == HEADER_VERSION) ||
+ (le32_to_cpu(bochs->version) == HEADER_V1)))
+ return 100;
+
+ return 0;
+}
+
+static int bochs_open(BlockDriverState *bs, int flags)
+{
+ BDRVBochsState *s = bs->opaque;
+ int i;
+ struct bochs_header bochs;
+ struct bochs_header_v1 header_v1;
+
+ bs->read_only = 1; // no write support yet
+
+ if (bdrv_pread(bs->file, 0, &bochs, sizeof(bochs)) != sizeof(bochs)) {
+ goto fail;
+ }
+
+ if (strcmp(bochs.magic, HEADER_MAGIC) ||
+ strcmp(bochs.type, REDOLOG_TYPE) ||
+ strcmp(bochs.subtype, GROWING_TYPE) ||
+ ((le32_to_cpu(bochs.version) != HEADER_VERSION) &&
+ (le32_to_cpu(bochs.version) != HEADER_V1))) {
+ goto fail;
+ }
+
+ if (le32_to_cpu(bochs.version) == HEADER_V1) {
+ memcpy(&header_v1, &bochs, sizeof(bochs));
+ bs->total_sectors = le64_to_cpu(header_v1.extra.redolog.disk) / 512;
+ } else {
+ bs->total_sectors = le64_to_cpu(bochs.extra.redolog.disk) / 512;
+ }
+
+ s->catalog_size = le32_to_cpu(bochs.extra.redolog.catalog);
+ s->catalog_bitmap = qemu_malloc(s->catalog_size * 4);
+ if (bdrv_pread(bs->file, le32_to_cpu(bochs.header), s->catalog_bitmap,
+ s->catalog_size * 4) != s->catalog_size * 4)
+ goto fail;
+ for (i = 0; i < s->catalog_size; i++)
+ le32_to_cpus(&s->catalog_bitmap[i]);
+
+ s->data_offset = le32_to_cpu(bochs.header) + (s->catalog_size * 4);
+
+ s->bitmap_blocks = 1 + (le32_to_cpu(bochs.extra.redolog.bitmap) - 1) / 512;
+ s->extent_blocks = 1 + (le32_to_cpu(bochs.extra.redolog.extent) - 1) / 512;
+
+ s->extent_size = le32_to_cpu(bochs.extra.redolog.extent);
+
+ return 0;
+ fail:
+ return -1;
+}
+
+static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num)
+{
+ BDRVBochsState *s = bs->opaque;
+ int64_t offset = sector_num * 512;
+ int64_t extent_index, extent_offset, bitmap_offset;
+ char bitmap_entry;
+
+ // seek to sector
+ extent_index = offset / s->extent_size;
+ extent_offset = (offset % s->extent_size) / 512;
+
+ if (s->catalog_bitmap[extent_index] == 0xffffffff) {
+ return -1; /* not allocated */
+ }
+
+ bitmap_offset = s->data_offset + (512 * s->catalog_bitmap[extent_index] *
+ (s->extent_blocks + s->bitmap_blocks));
+
+ /* read in bitmap for current extent */
+ if (bdrv_pread(bs->file, bitmap_offset + (extent_offset / 8),
+ &bitmap_entry, 1) != 1) {
+ return -1;
+ }
+
+ if (!((bitmap_entry >> (extent_offset % 8)) & 1)) {
+ return -1; /* not allocated */
+ }
+
+ return bitmap_offset + (512 * (s->bitmap_blocks + extent_offset));
+}
+
+static int bochs_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ int ret;
+
+ while (nb_sectors > 0) {
+ int64_t block_offset = seek_to_sector(bs, sector_num);
+ if (block_offset >= 0) {
+ ret = bdrv_pread(bs->file, block_offset, buf, 512);
+ if (ret != 512) {
+ return -1;
+ }
+ } else
+ memset(buf, 0, 512);
+ nb_sectors--;
+ sector_num++;
+ buf += 512;
+ }
+ return 0;
+}
+
+static void bochs_close(BlockDriverState *bs)
+{
+ BDRVBochsState *s = bs->opaque;
+ qemu_free(s->catalog_bitmap);
+}
+
+static BlockDriver bdrv_bochs = {
+ .format_name = "bochs",
+ .instance_size = sizeof(BDRVBochsState),
+ .bdrv_probe = bochs_probe,
+ .bdrv_open = bochs_open,
+ .bdrv_read = bochs_read,
+ .bdrv_close = bochs_close,
+};
+
+static void bdrv_bochs_init(void)
+{
+ bdrv_register(&bdrv_bochs);
+}
+
+block_init(bdrv_bochs_init);
diff --git a/qemu-0.15.x/block/cloop.c b/qemu-0.15.x/block/cloop.c
new file mode 100644
index 0000000..fe015c4
--- /dev/null
+++ b/qemu-0.15.x/block/cloop.c
@@ -0,0 +1,171 @@
+/*
+ * QEMU Block driver for CLOOP images
+ *
+ * Copyright (c) 2004 Johannes E. Schindelin
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+#include <zlib.h>
+
+typedef struct BDRVCloopState {
+ uint32_t block_size;
+ uint32_t n_blocks;
+ uint64_t* offsets;
+ uint32_t sectors_per_block;
+ uint32_t current_block;
+ uint8_t *compressed_block;
+ uint8_t *uncompressed_block;
+ z_stream zstream;
+} BDRVCloopState;
+
+static int cloop_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ const char* magic_version_2_0="#!/bin/sh\n"
+ "#V2.0 Format\n"
+ "modprobe cloop file=$0 && mount -r -t iso9660 /dev/cloop $1\n";
+ int length=strlen(magic_version_2_0);
+ if(length>buf_size)
+ length=buf_size;
+ if(!memcmp(magic_version_2_0,buf,length))
+ return 2;
+ return 0;
+}
+
+static int cloop_open(BlockDriverState *bs, int flags)
+{
+ BDRVCloopState *s = bs->opaque;
+ uint32_t offsets_size,max_compressed_block_size=1,i;
+
+ bs->read_only = 1;
+
+ /* read header */
+ if (bdrv_pread(bs->file, 128, &s->block_size, 4) < 4) {
+ goto cloop_close;
+ }
+ s->block_size = be32_to_cpu(s->block_size);
+
+ if (bdrv_pread(bs->file, 128 + 4, &s->n_blocks, 4) < 4) {
+ goto cloop_close;
+ }
+ s->n_blocks = be32_to_cpu(s->n_blocks);
+
+ /* read offsets */
+ offsets_size = s->n_blocks * sizeof(uint64_t);
+ s->offsets = qemu_malloc(offsets_size);
+ if (bdrv_pread(bs->file, 128 + 4 + 4, s->offsets, offsets_size) <
+ offsets_size) {
+ goto cloop_close;
+ }
+ for(i=0;i<s->n_blocks;i++) {
+ s->offsets[i]=be64_to_cpu(s->offsets[i]);
+ if(i>0) {
+ uint32_t size=s->offsets[i]-s->offsets[i-1];
+ if(size>max_compressed_block_size)
+ max_compressed_block_size=size;
+ }
+ }
+
+ /* initialize zlib engine */
+ s->compressed_block = qemu_malloc(max_compressed_block_size+1);
+ s->uncompressed_block = qemu_malloc(s->block_size);
+ if(inflateInit(&s->zstream) != Z_OK)
+ goto cloop_close;
+ s->current_block=s->n_blocks;
+
+ s->sectors_per_block = s->block_size/512;
+ bs->total_sectors = s->n_blocks*s->sectors_per_block;
+ return 0;
+
+cloop_close:
+ return -1;
+}
+
+static inline int cloop_read_block(BlockDriverState *bs, int block_num)
+{
+ BDRVCloopState *s = bs->opaque;
+
+ if(s->current_block != block_num) {
+ int ret;
+ uint32_t bytes = s->offsets[block_num+1]-s->offsets[block_num];
+
+ ret = bdrv_pread(bs->file, s->offsets[block_num], s->compressed_block,
+ bytes);
+ if (ret != bytes)
+ return -1;
+
+ s->zstream.next_in = s->compressed_block;
+ s->zstream.avail_in = bytes;
+ s->zstream.next_out = s->uncompressed_block;
+ s->zstream.avail_out = s->block_size;
+ ret = inflateReset(&s->zstream);
+ if(ret != Z_OK)
+ return -1;
+ ret = inflate(&s->zstream, Z_FINISH);
+ if(ret != Z_STREAM_END || s->zstream.total_out != s->block_size)
+ return -1;
+
+ s->current_block = block_num;
+ }
+ return 0;
+}
+
+static int cloop_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVCloopState *s = bs->opaque;
+ int i;
+
+ for(i=0;i<nb_sectors;i++) {
+ uint32_t sector_offset_in_block=((sector_num+i)%s->sectors_per_block),
+ block_num=(sector_num+i)/s->sectors_per_block;
+ if(cloop_read_block(bs, block_num) != 0)
+ return -1;
+ memcpy(buf+i*512,s->uncompressed_block+sector_offset_in_block*512,512);
+ }
+ return 0;
+}
+
+static void cloop_close(BlockDriverState *bs)
+{
+ BDRVCloopState *s = bs->opaque;
+ if(s->n_blocks>0)
+ free(s->offsets);
+ free(s->compressed_block);
+ free(s->uncompressed_block);
+ inflateEnd(&s->zstream);
+}
+
+static BlockDriver bdrv_cloop = {
+ .format_name = "cloop",
+ .instance_size = sizeof(BDRVCloopState),
+ .bdrv_probe = cloop_probe,
+ .bdrv_open = cloop_open,
+ .bdrv_read = cloop_read,
+ .bdrv_close = cloop_close,
+};
+
+static void bdrv_cloop_init(void)
+{
+ bdrv_register(&bdrv_cloop);
+}
+
+block_init(bdrv_cloop_init);
diff --git a/qemu-0.15.x/block/cow.c b/qemu-0.15.x/block/cow.c
new file mode 100644
index 0000000..4cf543c
--- /dev/null
+++ b/qemu-0.15.x/block/cow.c
@@ -0,0 +1,324 @@
+/*
+ * Block driver for the COW format
+ *
+ * Copyright (c) 2004 Fabrice Bellard
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+
+/**************************************************************/
+/* COW block driver using file system holes */
+
+/* user mode linux compatible COW file */
+#define COW_MAGIC 0x4f4f4f4d /* MOOO */
+#define COW_VERSION 2
+
+struct cow_header_v2 {
+ uint32_t magic;
+ uint32_t version;
+ char backing_file[1024];
+ int32_t mtime;
+ uint64_t size;
+ uint32_t sectorsize;
+};
+
+typedef struct BDRVCowState {
+ int64_t cow_sectors_offset;
+} BDRVCowState;
+
+static int cow_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ const struct cow_header_v2 *cow_header = (const void *)buf;
+
+ if (buf_size >= sizeof(struct cow_header_v2) &&
+ be32_to_cpu(cow_header->magic) == COW_MAGIC &&
+ be32_to_cpu(cow_header->version) == COW_VERSION)
+ return 100;
+ else
+ return 0;
+}
+
+static int cow_open(BlockDriverState *bs, int flags)
+{
+ BDRVCowState *s = bs->opaque;
+ struct cow_header_v2 cow_header;
+ int bitmap_size;
+ int64_t size;
+
+ /* see if it is a cow image */
+ if (bdrv_pread(bs->file, 0, &cow_header, sizeof(cow_header)) !=
+ sizeof(cow_header)) {
+ goto fail;
+ }
+
+ if (be32_to_cpu(cow_header.magic) != COW_MAGIC ||
+ be32_to_cpu(cow_header.version) != COW_VERSION) {
+ goto fail;
+ }
+
+ /* cow image found */
+ size = be64_to_cpu(cow_header.size);
+ bs->total_sectors = size / 512;
+
+ pstrcpy(bs->backing_file, sizeof(bs->backing_file),
+ cow_header.backing_file);
+
+ bitmap_size = ((bs->total_sectors + 7) >> 3) + sizeof(cow_header);
+ s->cow_sectors_offset = (bitmap_size + 511) & ~511;
+ return 0;
+ fail:
+ return -1;
+}
+
+/*
+ * XXX(hch): right now these functions are extremly ineffcient.
+ * We should just read the whole bitmap we'll need in one go instead.
+ */
+static inline int cow_set_bit(BlockDriverState *bs, int64_t bitnum)
+{
+ uint64_t offset = sizeof(struct cow_header_v2) + bitnum / 8;
+ uint8_t bitmap;
+ int ret;
+
+ ret = bdrv_pread(bs->file, offset, &bitmap, sizeof(bitmap));
+ if (ret < 0) {
+ return ret;
+ }
+
+ bitmap |= (1 << (bitnum % 8));
+
+ ret = bdrv_pwrite_sync(bs->file, offset, &bitmap, sizeof(bitmap));
+ if (ret < 0) {
+ return ret;
+ }
+ return 0;
+}
+
+static inline int is_bit_set(BlockDriverState *bs, int64_t bitnum)
+{
+ uint64_t offset = sizeof(struct cow_header_v2) + bitnum / 8;
+ uint8_t bitmap;
+ int ret;
+
+ ret = bdrv_pread(bs->file, offset, &bitmap, sizeof(bitmap));
+ if (ret < 0) {
+ return ret;
+ }
+
+ return !!(bitmap & (1 << (bitnum % 8)));
+}
+
+/* Return true if first block has been changed (ie. current version is
+ * in COW file). Set the number of continuous blocks for which that
+ * is true. */
+static int cow_is_allocated(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors, int *num_same)
+{
+ int changed;
+
+ if (nb_sectors == 0) {
+ *num_same = nb_sectors;
+ return 0;
+ }
+
+ changed = is_bit_set(bs, sector_num);
+ if (changed < 0) {
+ return 0; /* XXX: how to return I/O errors? */
+ }
+
+ for (*num_same = 1; *num_same < nb_sectors; (*num_same)++) {
+ if (is_bit_set(bs, sector_num + *num_same) != changed)
+ break;
+ }
+
+ return changed;
+}
+
+static int cow_update_bitmap(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors)
+{
+ int error = 0;
+ int i;
+
+ for (i = 0; i < nb_sectors; i++) {
+ error = cow_set_bit(bs, sector_num + i);
+ if (error) {
+ break;
+ }
+ }
+
+ return error;
+}
+
+static int cow_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVCowState *s = bs->opaque;
+ int ret, n;
+
+ while (nb_sectors > 0) {
+ if (cow_is_allocated(bs, sector_num, nb_sectors, &n)) {
+ ret = bdrv_pread(bs->file,
+ s->cow_sectors_offset + sector_num * 512,
+ buf, n * 512);
+ if (ret != n * 512)
+ return -1;
+ } else {
+ if (bs->backing_hd) {
+ /* read from the base image */
+ ret = bdrv_read(bs->backing_hd, sector_num, buf, n);
+ if (ret < 0)
+ return -1;
+ } else {
+ memset(buf, 0, n * 512);
+ }
+ }
+ nb_sectors -= n;
+ sector_num += n;
+ buf += n * 512;
+ }
+ return 0;
+}
+
+static int cow_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BDRVCowState *s = bs->opaque;
+ int ret;
+
+ ret = bdrv_pwrite(bs->file, s->cow_sectors_offset + sector_num * 512,
+ buf, nb_sectors * 512);
+ if (ret != nb_sectors * 512)
+ return -1;
+
+ return cow_update_bitmap(bs, sector_num, nb_sectors);
+}
+
+static void cow_close(BlockDriverState *bs)
+{
+}
+
+static int cow_create(const char *filename, QEMUOptionParameter *options)
+{
+ int fd, cow_fd;
+ struct cow_header_v2 cow_header;
+ struct stat st;
+ int64_t image_sectors = 0;
+ const char *image_filename = NULL;
+ int ret;
+
+ /* Read out options */
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ image_sectors = options->value.n / 512;
+ } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
+ image_filename = options->value.s;
+ }
+ options++;
+ }
+
+ cow_fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
+ 0644);
+ if (cow_fd < 0)
+ return -errno;
+ memset(&cow_header, 0, sizeof(cow_header));
+ cow_header.magic = cpu_to_be32(COW_MAGIC);
+ cow_header.version = cpu_to_be32(COW_VERSION);
+ if (image_filename) {
+ /* Note: if no file, we put a dummy mtime */
+ cow_header.mtime = cpu_to_be32(0);
+
+ fd = open(image_filename, O_RDONLY | O_BINARY);
+ if (fd < 0) {
+ close(cow_fd);
+ goto mtime_fail;
+ }
+ if (fstat(fd, &st) != 0) {
+ close(fd);
+ goto mtime_fail;
+ }
+ close(fd);
+ cow_header.mtime = cpu_to_be32(st.st_mtime);
+ mtime_fail:
+ pstrcpy(cow_header.backing_file, sizeof(cow_header.backing_file),
+ image_filename);
+ }
+ cow_header.sectorsize = cpu_to_be32(512);
+ cow_header.size = cpu_to_be64(image_sectors * 512);
+ ret = qemu_write_full(cow_fd, &cow_header, sizeof(cow_header));
+ if (ret != sizeof(cow_header)) {
+ ret = -errno;
+ goto exit;
+ }
+
+ /* resize to include at least all the bitmap */
+ ret = ftruncate(cow_fd, sizeof(cow_header) + ((image_sectors + 7) >> 3));
+ if (ret) {
+ ret = -errno;
+ goto exit;
+ }
+
+exit:
+ close(cow_fd);
+ return ret;
+}
+
+static int cow_flush(BlockDriverState *bs)
+{
+ return bdrv_flush(bs->file);
+}
+
+static QEMUOptionParameter cow_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ {
+ .name = BLOCK_OPT_BACKING_FILE,
+ .type = OPT_STRING,
+ .help = "File name of a base image"
+ },
+ { NULL }
+};
+
+static BlockDriver bdrv_cow = {
+ .format_name = "cow",
+ .instance_size = sizeof(BDRVCowState),
+ .bdrv_probe = cow_probe,
+ .bdrv_open = cow_open,
+ .bdrv_read = cow_read,
+ .bdrv_write = cow_write,
+ .bdrv_close = cow_close,
+ .bdrv_create = cow_create,
+ .bdrv_flush = cow_flush,
+ .bdrv_is_allocated = cow_is_allocated,
+
+ .create_options = cow_create_options,
+};
+
+static void bdrv_cow_init(void)
+{
+ bdrv_register(&bdrv_cow);
+}
+
+block_init(bdrv_cow_init);
diff --git a/qemu-0.15.x/block/curl.c b/qemu-0.15.x/block/curl.c
new file mode 100644
index 0000000..407f095
--- /dev/null
+++ b/qemu-0.15.x/block/curl.c
@@ -0,0 +1,564 @@
+/*
+ * QEMU Block driver for CURL images
+ *
+ * Copyright (c) 2009 Alexander Graf <agraf(a)suse.de>
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "block_int.h"
+#include <curl/curl.h>
+
+// #define DEBUG
+// #define DEBUG_VERBOSE
+
+#ifdef DEBUG_CURL
+#define DPRINTF(fmt, ...) do { printf(fmt, ## __VA_ARGS__); } while (0)
+#else
+#define DPRINTF(fmt, ...) do { } while (0)
+#endif
+
+#define CURL_NUM_STATES 8
+#define CURL_NUM_ACB 8
+#define SECTOR_SIZE 512
+#define READ_AHEAD_SIZE (256 * 1024)
+
+#define FIND_RET_NONE 0
+#define FIND_RET_OK 1
+#define FIND_RET_WAIT 2
+
+struct BDRVCURLState;
+
+typedef struct CURLAIOCB {
+ BlockDriverAIOCB common;
+ QEMUIOVector *qiov;
+ size_t start;
+ size_t end;
+} CURLAIOCB;
+
+typedef struct CURLState
+{
+ struct BDRVCURLState *s;
+ CURLAIOCB *acb[CURL_NUM_ACB];
+ CURL *curl;
+ char *orig_buf;
+ size_t buf_start;
+ size_t buf_off;
+ size_t buf_len;
+ char range[128];
+ char errmsg[CURL_ERROR_SIZE];
+ char in_use;
+} CURLState;
+
+typedef struct BDRVCURLState {
+ CURLM *multi;
+ size_t len;
+ CURLState states[CURL_NUM_STATES];
+ char *url;
+ size_t readahead_size;
+} BDRVCURLState;
+
+static void curl_clean_state(CURLState *s);
+static void curl_multi_do(void *arg);
+
+static int curl_sock_cb(CURL *curl, curl_socket_t fd, int action,
+ void *s, void *sp)
+{
+ DPRINTF("CURL (AIO): Sock action %d on fd %d\n", action, fd);
+ switch (action) {
+ case CURL_POLL_IN:
+ qemu_aio_set_fd_handler(fd, curl_multi_do, NULL, NULL, NULL, s);
+ break;
+ case CURL_POLL_OUT:
+ qemu_aio_set_fd_handler(fd, NULL, curl_multi_do, NULL, NULL, s);
+ break;
+ case CURL_POLL_INOUT:
+ qemu_aio_set_fd_handler(fd, curl_multi_do,
+ curl_multi_do, NULL, NULL, s);
+ break;
+ case CURL_POLL_REMOVE:
+ qemu_aio_set_fd_handler(fd, NULL, NULL, NULL, NULL, NULL);
+ break;
+ }
+
+ return 0;
+}
+
+static size_t curl_size_cb(void *ptr, size_t size, size_t nmemb, void *opaque)
+{
+ CURLState *s = ((CURLState*)opaque);
+ size_t realsize = size * nmemb;
+ size_t fsize;
+
+ if(sscanf(ptr, "Content-Length: %zd", &fsize) == 1) {
+ s->s->len = fsize;
+ }
+
+ return realsize;
+}
+
+static size_t curl_read_cb(void *ptr, size_t size, size_t nmemb, void *opaque)
+{
+ CURLState *s = ((CURLState*)opaque);
+ size_t realsize = size * nmemb;
+ int i;
+
+ DPRINTF("CURL: Just reading %zd bytes\n", realsize);
+
+ if (!s || !s->orig_buf)
+ goto read_end;
+
+ memcpy(s->orig_buf + s->buf_off, ptr, realsize);
+ s->buf_off += realsize;
+
+ for(i=0; i<CURL_NUM_ACB; i++) {
+ CURLAIOCB *acb = s->acb[i];
+
+ if (!acb)
+ continue;
+
+ if ((s->buf_off >= acb->end)) {
+ qemu_iovec_from_buffer(acb->qiov, s->orig_buf + acb->start,
+ acb->end - acb->start);
+ acb->common.cb(acb->common.opaque, 0);
+ qemu_aio_release(acb);
+ s->acb[i] = NULL;
+ }
+ }
+
+read_end:
+ return realsize;
+}
+
+static int curl_find_buf(BDRVCURLState *s, size_t start, size_t len,
+ CURLAIOCB *acb)
+{
+ int i;
+ size_t end = start + len;
+
+ for (i=0; i<CURL_NUM_STATES; i++) {
+ CURLState *state = &s->states[i];
+ size_t buf_end = (state->buf_start + state->buf_off);
+ size_t buf_fend = (state->buf_start + state->buf_len);
+
+ if (!state->orig_buf)
+ continue;
+ if (!state->buf_off)
+ continue;
+
+ // Does the existing buffer cover our section?
+ if ((start >= state->buf_start) &&
+ (start <= buf_end) &&
+ (end >= state->buf_start) &&
+ (end <= buf_end))
+ {
+ char *buf = state->orig_buf + (start - state->buf_start);
+
+ qemu_iovec_from_buffer(acb->qiov, buf, len);
+ acb->common.cb(acb->common.opaque, 0);
+
+ return FIND_RET_OK;
+ }
+
+ // Wait for unfinished chunks
+ if ((start >= state->buf_start) &&
+ (start <= buf_fend) &&
+ (end >= state->buf_start) &&
+ (end <= buf_fend))
+ {
+ int j;
+
+ acb->start = start - state->buf_start;
+ acb->end = acb->start + len;
+
+ for (j=0; j<CURL_NUM_ACB; j++) {
+ if (!state->acb[j]) {
+ state->acb[j] = acb;
+ return FIND_RET_WAIT;
+ }
+ }
+ }
+ }
+
+ return FIND_RET_NONE;
+}
+
+static void curl_multi_do(void *arg)
+{
+ BDRVCURLState *s = (BDRVCURLState *)arg;
+ int running;
+ int r;
+ int msgs_in_queue;
+
+ if (!s->multi)
+ return;
+
+ do {
+ r = curl_multi_socket_all(s->multi, &running);
+ } while(r == CURLM_CALL_MULTI_PERFORM);
+
+ /* Try to find done transfers, so we can free the easy
+ * handle again. */
+ do {
+ CURLMsg *msg;
+ msg = curl_multi_info_read(s->multi, &msgs_in_queue);
+
+ if (!msg)
+ break;
+ if (msg->msg == CURLMSG_NONE)
+ break;
+
+ switch (msg->msg) {
+ case CURLMSG_DONE:
+ {
+ CURLState *state = NULL;
+ curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, (char**)&state);
+ curl_clean_state(state);
+ break;
+ }
+ default:
+ msgs_in_queue = 0;
+ break;
+ }
+ } while(msgs_in_queue);
+}
+
+static CURLState *curl_init_state(BDRVCURLState *s)
+{
+ CURLState *state = NULL;
+ int i, j;
+
+ do {
+ for (i=0; i<CURL_NUM_STATES; i++) {
+ for (j=0; j<CURL_NUM_ACB; j++)
+ if (s->states[i].acb[j])
+ continue;
+ if (s->states[i].in_use)
+ continue;
+
+ state = &s->states[i];
+ state->in_use = 1;
+ break;
+ }
+ if (!state) {
+ usleep(100);
+ curl_multi_do(s);
+ }
+ } while(!state);
+
+ if (state->curl)
+ goto has_curl;
+
+ state->curl = curl_easy_init();
+ if (!state->curl)
+ return NULL;
+ curl_easy_setopt(state->curl, CURLOPT_URL, s->url);
+ curl_easy_setopt(state->curl, CURLOPT_TIMEOUT, 5);
+ curl_easy_setopt(state->curl, CURLOPT_WRITEFUNCTION, (void *)curl_read_cb);
+ curl_easy_setopt(state->curl, CURLOPT_WRITEDATA, (void *)state);
+ curl_easy_setopt(state->curl, CURLOPT_PRIVATE, (void *)state);
+ curl_easy_setopt(state->curl, CURLOPT_AUTOREFERER, 1);
+ curl_easy_setopt(state->curl, CURLOPT_FOLLOWLOCATION, 1);
+ curl_easy_setopt(state->curl, CURLOPT_NOSIGNAL, 1);
+ curl_easy_setopt(state->curl, CURLOPT_ERRORBUFFER, state->errmsg);
+
+#ifdef DEBUG_VERBOSE
+ curl_easy_setopt(state->curl, CURLOPT_VERBOSE, 1);
+#endif
+
+has_curl:
+
+ state->s = s;
+
+ return state;
+}
+
+static void curl_clean_state(CURLState *s)
+{
+ if (s->s->multi)
+ curl_multi_remove_handle(s->s->multi, s->curl);
+ s->in_use = 0;
+}
+
+static int curl_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVCURLState *s = bs->opaque;
+ CURLState *state = NULL;
+ double d;
+
+ #define RA_OPTSTR ":readahead="
+ char *file;
+ char *ra;
+ const char *ra_val;
+ int parse_state = 0;
+
+ static int inited = 0;
+
+ file = qemu_strdup(filename);
+ s->readahead_size = READ_AHEAD_SIZE;
+
+ /* Parse a trailing ":readahead=#:" param, if present. */
+ ra = file + strlen(file) - 1;
+ while (ra >= file) {
+ if (parse_state == 0) {
+ if (*ra == ':')
+ parse_state++;
+ else
+ break;
+ } else if (parse_state == 1) {
+ if (*ra > '9' || *ra < '0') {
+ char *opt_start = ra - strlen(RA_OPTSTR) + 1;
+ if (opt_start > file &&
+ strncmp(opt_start, RA_OPTSTR, strlen(RA_OPTSTR)) == 0) {
+ ra_val = ra + 1;
+ ra -= strlen(RA_OPTSTR) - 1;
+ *ra = '\0';
+ s->readahead_size = atoi(ra_val);
+ break;
+ } else {
+ break;
+ }
+ }
+ }
+ ra--;
+ }
+
+ if ((s->readahead_size & 0x1ff) != 0) {
+ fprintf(stderr, "HTTP_READAHEAD_SIZE %zd is not a multiple of 512\n",
+ s->readahead_size);
+ goto out_noclean;
+ }
+
+ if (!inited) {
+ curl_global_init(CURL_GLOBAL_ALL);
+ inited = 1;
+ }
+
+ DPRINTF("CURL: Opening %s\n", file);
+ s->url = file;
+ state = curl_init_state(s);
+ if (!state)
+ goto out_noclean;
+
+ // Get file size
+
+ curl_easy_setopt(state->curl, CURLOPT_NOBODY, 1);
+ curl_easy_setopt(state->curl, CURLOPT_WRITEFUNCTION, (void *)curl_size_cb);
+ if (curl_easy_perform(state->curl))
+ goto out;
+ curl_easy_getinfo(state->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &d);
+ curl_easy_setopt(state->curl, CURLOPT_WRITEFUNCTION, (void *)curl_read_cb);
+ curl_easy_setopt(state->curl, CURLOPT_NOBODY, 0);
+ if (d)
+ s->len = (size_t)d;
+ else if(!s->len)
+ goto out;
+ DPRINTF("CURL: Size = %zd\n", s->len);
+
+ curl_clean_state(state);
+ curl_easy_cleanup(state->curl);
+ state->curl = NULL;
+
+ // Now we know the file exists and its size, so let's
+ // initialize the multi interface!
+
+ s->multi = curl_multi_init();
+ curl_multi_setopt( s->multi, CURLMOPT_SOCKETDATA, s);
+ curl_multi_setopt( s->multi, CURLMOPT_SOCKETFUNCTION, curl_sock_cb );
+ curl_multi_do(s);
+
+ return 0;
+
+out:
+ fprintf(stderr, "CURL: Error opening file: %s\n", state->errmsg);
+ curl_easy_cleanup(state->curl);
+ state->curl = NULL;
+out_noclean:
+ qemu_free(file);
+ return -EINVAL;
+}
+
+static void curl_aio_cancel(BlockDriverAIOCB *blockacb)
+{
+ // Do we have to implement canceling? Seems to work without...
+}
+
+static AIOPool curl_aio_pool = {
+ .aiocb_size = sizeof(CURLAIOCB),
+ .cancel = curl_aio_cancel,
+};
+
+static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVCURLState *s = bs->opaque;
+ CURLAIOCB *acb;
+ size_t start = sector_num * SECTOR_SIZE;
+ size_t end;
+ CURLState *state;
+
+ acb = qemu_aio_get(&curl_aio_pool, bs, cb, opaque);
+ if (!acb)
+ return NULL;
+
+ acb->qiov = qiov;
+
+ // In case we have the requested data already (e.g. read-ahead),
+ // we can just call the callback and be done.
+
+ switch (curl_find_buf(s, start, nb_sectors * SECTOR_SIZE, acb)) {
+ case FIND_RET_OK:
+ qemu_aio_release(acb);
+ // fall through
+ case FIND_RET_WAIT:
+ return &acb->common;
+ default:
+ break;
+ }
+
+ // No cache found, so let's start a new request
+
+ state = curl_init_state(s);
+ if (!state)
+ return NULL;
+
+ acb->start = 0;
+ acb->end = (nb_sectors * SECTOR_SIZE);
+
+ state->buf_off = 0;
+ if (state->orig_buf)
+ qemu_free(state->orig_buf);
+ state->buf_start = start;
+ state->buf_len = acb->end + s->readahead_size;
+ end = MIN(start + state->buf_len, s->len) - 1;
+ state->orig_buf = qemu_malloc(state->buf_len);
+ state->acb[0] = acb;
+
+ snprintf(state->range, 127, "%zd-%zd", start, end);
+ DPRINTF("CURL (AIO): Reading %d at %zd (%s)\n",
+ (nb_sectors * SECTOR_SIZE), start, state->range);
+ curl_easy_setopt(state->curl, CURLOPT_RANGE, state->range);
+
+ curl_multi_add_handle(s->multi, state->curl);
+ curl_multi_do(s);
+
+ return &acb->common;
+}
+
+static void curl_close(BlockDriverState *bs)
+{
+ BDRVCURLState *s = bs->opaque;
+ int i;
+
+ DPRINTF("CURL: Close\n");
+ for (i=0; i<CURL_NUM_STATES; i++) {
+ if (s->states[i].in_use)
+ curl_clean_state(&s->states[i]);
+ if (s->states[i].curl) {
+ curl_easy_cleanup(s->states[i].curl);
+ s->states[i].curl = NULL;
+ }
+ if (s->states[i].orig_buf) {
+ qemu_free(s->states[i].orig_buf);
+ s->states[i].orig_buf = NULL;
+ }
+ }
+ if (s->multi)
+ curl_multi_cleanup(s->multi);
+ if (s->url)
+ free(s->url);
+}
+
+static int64_t curl_getlength(BlockDriverState *bs)
+{
+ BDRVCURLState *s = bs->opaque;
+ return s->len;
+}
+
+static BlockDriver bdrv_http = {
+ .format_name = "http",
+ .protocol_name = "http",
+
+ .instance_size = sizeof(BDRVCURLState),
+ .bdrv_file_open = curl_open,
+ .bdrv_close = curl_close,
+ .bdrv_getlength = curl_getlength,
+
+ .bdrv_aio_readv = curl_aio_readv,
+};
+
+static BlockDriver bdrv_https = {
+ .format_name = "https",
+ .protocol_name = "https",
+
+ .instance_size = sizeof(BDRVCURLState),
+ .bdrv_file_open = curl_open,
+ .bdrv_close = curl_close,
+ .bdrv_getlength = curl_getlength,
+
+ .bdrv_aio_readv = curl_aio_readv,
+};
+
+static BlockDriver bdrv_ftp = {
+ .format_name = "ftp",
+ .protocol_name = "ftp",
+
+ .instance_size = sizeof(BDRVCURLState),
+ .bdrv_file_open = curl_open,
+ .bdrv_close = curl_close,
+ .bdrv_getlength = curl_getlength,
+
+ .bdrv_aio_readv = curl_aio_readv,
+};
+
+static BlockDriver bdrv_ftps = {
+ .format_name = "ftps",
+ .protocol_name = "ftps",
+
+ .instance_size = sizeof(BDRVCURLState),
+ .bdrv_file_open = curl_open,
+ .bdrv_close = curl_close,
+ .bdrv_getlength = curl_getlength,
+
+ .bdrv_aio_readv = curl_aio_readv,
+};
+
+static BlockDriver bdrv_tftp = {
+ .format_name = "tftp",
+ .protocol_name = "tftp",
+
+ .instance_size = sizeof(BDRVCURLState),
+ .bdrv_file_open = curl_open,
+ .bdrv_close = curl_close,
+ .bdrv_getlength = curl_getlength,
+
+ .bdrv_aio_readv = curl_aio_readv,
+};
+
+static void curl_block_init(void)
+{
+ bdrv_register(&bdrv_http);
+ bdrv_register(&bdrv_https);
+ bdrv_register(&bdrv_ftp);
+ bdrv_register(&bdrv_ftps);
+ bdrv_register(&bdrv_tftp);
+}
+
+block_init(curl_block_init);
diff --git a/qemu-0.15.x/block/dmg.c b/qemu-0.15.x/block/dmg.c
new file mode 100644
index 0000000..a3c815b
--- /dev/null
+++ b/qemu-0.15.x/block/dmg.c
@@ -0,0 +1,312 @@
+/*
+ * QEMU Block driver for DMG images
+ *
+ * Copyright (c) 2004 Johannes E. Schindelin
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "block_int.h"
+#include "bswap.h"
+#include "module.h"
+#include <zlib.h>
+
+typedef struct BDRVDMGState {
+ /* each chunk contains a certain number of sectors,
+ * offsets[i] is the offset in the .dmg file,
+ * lengths[i] is the length of the compressed chunk,
+ * sectors[i] is the sector beginning at offsets[i],
+ * sectorcounts[i] is the number of sectors in that chunk,
+ * the sectors array is ordered
+ * 0<=i<n_chunks */
+
+ uint32_t n_chunks;
+ uint32_t* types;
+ uint64_t* offsets;
+ uint64_t* lengths;
+ uint64_t* sectors;
+ uint64_t* sectorcounts;
+ uint32_t current_chunk;
+ uint8_t *compressed_chunk;
+ uint8_t *uncompressed_chunk;
+ z_stream zstream;
+} BDRVDMGState;
+
+static int dmg_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ int len=strlen(filename);
+ if(len>4 && !strcmp(filename+len-4,".dmg"))
+ return 2;
+ return 0;
+}
+
+static off_t read_off(BlockDriverState *bs, int64_t offset)
+{
+ uint64_t buffer;
+ if (bdrv_pread(bs->file, offset, &buffer, 8) < 8)
+ return 0;
+ return be64_to_cpu(buffer);
+}
+
+static off_t read_uint32(BlockDriverState *bs, int64_t offset)
+{
+ uint32_t buffer;
+ if (bdrv_pread(bs->file, offset, &buffer, 4) < 4)
+ return 0;
+ return be32_to_cpu(buffer);
+}
+
+static int dmg_open(BlockDriverState *bs, int flags)
+{
+ BDRVDMGState *s = bs->opaque;
+ off_t info_begin,info_end,last_in_offset,last_out_offset;
+ uint32_t count;
+ uint32_t max_compressed_size=1,max_sectors_per_chunk=1,i;
+ int64_t offset;
+
+ bs->read_only = 1;
+ s->n_chunks = 0;
+ s->offsets = s->lengths = s->sectors = s->sectorcounts = NULL;
+
+ /* read offset of info blocks */
+ offset = bdrv_getlength(bs->file);
+ if (offset < 0) {
+ goto fail;
+ }
+ offset -= 0x1d8;
+
+ info_begin = read_off(bs, offset);
+ if (info_begin == 0) {
+ goto fail;
+ }
+
+ if (read_uint32(bs, info_begin) != 0x100) {
+ goto fail;
+ }
+
+ count = read_uint32(bs, info_begin + 4);
+ if (count == 0) {
+ goto fail;
+ }
+ info_end = info_begin + count;
+
+ offset = info_begin + 0x100;
+
+ /* read offsets */
+ last_in_offset = last_out_offset = 0;
+ while (offset < info_end) {
+ uint32_t type;
+
+ count = read_uint32(bs, offset);
+ if(count==0)
+ goto fail;
+ offset += 4;
+
+ type = read_uint32(bs, offset);
+ if (type == 0x6d697368 && count >= 244) {
+ int new_size, chunk_count;
+
+ offset += 4;
+ offset += 200;
+
+ chunk_count = (count-204)/40;
+ new_size = sizeof(uint64_t) * (s->n_chunks + chunk_count);
+ s->types = qemu_realloc(s->types, new_size/2);
+ s->offsets = qemu_realloc(s->offsets, new_size);
+ s->lengths = qemu_realloc(s->lengths, new_size);
+ s->sectors = qemu_realloc(s->sectors, new_size);
+ s->sectorcounts = qemu_realloc(s->sectorcounts, new_size);
+
+ for(i=s->n_chunks;i<s->n_chunks+chunk_count;i++) {
+ s->types[i] = read_uint32(bs, offset);
+ offset += 4;
+ if(s->types[i]!=0x80000005 && s->types[i]!=1 && s->types[i]!=2) {
+ if(s->types[i]==0xffffffff) {
+ last_in_offset = s->offsets[i-1]+s->lengths[i-1];
+ last_out_offset = s->sectors[i-1]+s->sectorcounts[i-1];
+ }
+ chunk_count--;
+ i--;
+ offset += 36;
+ continue;
+ }
+ offset += 4;
+
+ s->sectors[i] = last_out_offset+read_off(bs, offset);
+ offset += 8;
+
+ s->sectorcounts[i] = read_off(bs, offset);
+ offset += 8;
+
+ s->offsets[i] = last_in_offset+read_off(bs, offset);
+ offset += 8;
+
+ s->lengths[i] = read_off(bs, offset);
+ offset += 8;
+
+ if(s->lengths[i]>max_compressed_size)
+ max_compressed_size = s->lengths[i];
+ if(s->sectorcounts[i]>max_sectors_per_chunk)
+ max_sectors_per_chunk = s->sectorcounts[i];
+ }
+ s->n_chunks+=chunk_count;
+ }
+ }
+
+ /* initialize zlib engine */
+ s->compressed_chunk = qemu_malloc(max_compressed_size+1);
+ s->uncompressed_chunk = qemu_malloc(512*max_sectors_per_chunk);
+ if(inflateInit(&s->zstream) != Z_OK)
+ goto fail;
+
+ s->current_chunk = s->n_chunks;
+
+ return 0;
+fail:
+ return -1;
+}
+
+static inline int is_sector_in_chunk(BDRVDMGState* s,
+ uint32_t chunk_num,int sector_num)
+{
+ if(chunk_num>=s->n_chunks || s->sectors[chunk_num]>sector_num ||
+ s->sectors[chunk_num]+s->sectorcounts[chunk_num]<=sector_num)
+ return 0;
+ else
+ return -1;
+}
+
+static inline uint32_t search_chunk(BDRVDMGState* s,int sector_num)
+{
+ /* binary search */
+ uint32_t chunk1=0,chunk2=s->n_chunks,chunk3;
+ while(chunk1!=chunk2) {
+ chunk3 = (chunk1+chunk2)/2;
+ if(s->sectors[chunk3]>sector_num)
+ chunk2 = chunk3;
+ else if(s->sectors[chunk3]+s->sectorcounts[chunk3]>sector_num)
+ return chunk3;
+ else
+ chunk1 = chunk3;
+ }
+ return s->n_chunks; /* error */
+}
+
+static inline int dmg_read_chunk(BlockDriverState *bs, int sector_num)
+{
+ BDRVDMGState *s = bs->opaque;
+
+ if(!is_sector_in_chunk(s,s->current_chunk,sector_num)) {
+ int ret;
+ uint32_t chunk = search_chunk(s,sector_num);
+
+ if(chunk>=s->n_chunks)
+ return -1;
+
+ s->current_chunk = s->n_chunks;
+ switch(s->types[chunk]) {
+ case 0x80000005: { /* zlib compressed */
+ int i;
+
+ /* we need to buffer, because only the chunk as whole can be
+ * inflated. */
+ i=0;
+ do {
+ ret = bdrv_pread(bs->file, s->offsets[chunk] + i,
+ s->compressed_chunk+i, s->lengths[chunk]-i);
+ if(ret<0 && errno==EINTR)
+ ret=0;
+ i+=ret;
+ } while(ret>=0 && ret+i<s->lengths[chunk]);
+
+ if (ret != s->lengths[chunk])
+ return -1;
+
+ s->zstream.next_in = s->compressed_chunk;
+ s->zstream.avail_in = s->lengths[chunk];
+ s->zstream.next_out = s->uncompressed_chunk;
+ s->zstream.avail_out = 512*s->sectorcounts[chunk];
+ ret = inflateReset(&s->zstream);
+ if(ret != Z_OK)
+ return -1;
+ ret = inflate(&s->zstream, Z_FINISH);
+ if(ret != Z_STREAM_END || s->zstream.total_out != 512*s->sectorcounts[chunk])
+ return -1;
+ break; }
+ case 1: /* copy */
+ ret = bdrv_pread(bs->file, s->offsets[chunk],
+ s->uncompressed_chunk, s->lengths[chunk]);
+ if (ret != s->lengths[chunk])
+ return -1;
+ break;
+ case 2: /* zero */
+ memset(s->uncompressed_chunk, 0, 512*s->sectorcounts[chunk]);
+ break;
+ }
+ s->current_chunk = chunk;
+ }
+ return 0;
+}
+
+static int dmg_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVDMGState *s = bs->opaque;
+ int i;
+
+ for(i=0;i<nb_sectors;i++) {
+ uint32_t sector_offset_in_chunk;
+ if(dmg_read_chunk(bs, sector_num+i) != 0)
+ return -1;
+ sector_offset_in_chunk = sector_num+i-s->sectors[s->current_chunk];
+ memcpy(buf+i*512,s->uncompressed_chunk+sector_offset_in_chunk*512,512);
+ }
+ return 0;
+}
+
+static void dmg_close(BlockDriverState *bs)
+{
+ BDRVDMGState *s = bs->opaque;
+ if(s->n_chunks>0) {
+ free(s->types);
+ free(s->offsets);
+ free(s->lengths);
+ free(s->sectors);
+ free(s->sectorcounts);
+ }
+ free(s->compressed_chunk);
+ free(s->uncompressed_chunk);
+ inflateEnd(&s->zstream);
+}
+
+static BlockDriver bdrv_dmg = {
+ .format_name = "dmg",
+ .instance_size = sizeof(BDRVDMGState),
+ .bdrv_probe = dmg_probe,
+ .bdrv_open = dmg_open,
+ .bdrv_read = dmg_read,
+ .bdrv_close = dmg_close,
+};
+
+static void bdrv_dmg_init(void)
+{
+ bdrv_register(&bdrv_dmg);
+}
+
+block_init(bdrv_dmg_init);
diff --git a/qemu-0.15.x/block/nbd.c b/qemu-0.15.x/block/nbd.c
new file mode 100644
index 0000000..7a52f62
--- /dev/null
+++ b/qemu-0.15.x/block/nbd.c
@@ -0,0 +1,272 @@
+/*
+ * QEMU Block driver for NBD
+ *
+ * Copyright (C) 2008 Bull S.A.S.
+ * Author: Laurent Vivier <Laurent.Vivier(a)bull.net>
+ *
+ * Some parts:
+ * Copyright (C) 2007 Anthony Liguori <anthony(a)codemonkey.ws>
+ *
+ * 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.
+ */
+
+#include "qemu-common.h"
+#include "nbd.h"
+#include "module.h"
+#include "qemu_socket.h"
+
+#include <sys/types.h>
+#include <unistd.h>
+
+#define EN_OPTSTR ":exportname="
+
+/* #define DEBUG_NBD */
+
+#if defined(DEBUG_NBD)
+#define logout(fmt, ...) \
+ fprintf(stderr, "nbd\t%-24s" fmt, __func__, ##__VA_ARGS__)
+#else
+#define logout(fmt, ...) ((void)0)
+#endif
+
+typedef struct BDRVNBDState {
+ int sock;
+ off_t size;
+ size_t blocksize;
+ char *export_name; /* An NBD server may export several devices */
+
+ /* If it begins with '/', this is a UNIX domain socket. Otherwise,
+ * it's a string of the form <hostname|ip4|\[ip6\]>:port
+ */
+ char *host_spec;
+} BDRVNBDState;
+
+static int nbd_config(BDRVNBDState *s, const char *filename, int flags)
+{
+ char *file;
+ char *export_name;
+ const char *host_spec;
+ const char *unixpath;
+ int err = -EINVAL;
+
+ file = qemu_strdup(filename);
+
+ export_name = strstr(file, EN_OPTSTR);
+ if (export_name) {
+ if (export_name[strlen(EN_OPTSTR)] == 0) {
+ goto out;
+ }
+ export_name[0] = 0; /* truncate 'file' */
+ export_name += strlen(EN_OPTSTR);
+ s->export_name = qemu_strdup(export_name);
+ }
+
+ /* extract the host_spec - fail if it's not nbd:... */
+ if (!strstart(file, "nbd:", &host_spec)) {
+ goto out;
+ }
+
+ /* are we a UNIX or TCP socket? */
+ if (strstart(host_spec, "unix:", &unixpath)) {
+ if (unixpath[0] != '/') { /* We demand an absolute path*/
+ goto out;
+ }
+ s->host_spec = qemu_strdup(unixpath);
+ } else {
+ s->host_spec = qemu_strdup(host_spec);
+ }
+
+ err = 0;
+
+out:
+ qemu_free(file);
+ if (err != 0) {
+ qemu_free(s->export_name);
+ qemu_free(s->host_spec);
+ }
+ return err;
+}
+
+static int nbd_establish_connection(BlockDriverState *bs)
+{
+ BDRVNBDState *s = bs->opaque;
+ int sock;
+ int ret;
+ off_t size;
+ size_t blocksize;
+ uint32_t nbdflags;
+
+ if (s->host_spec[0] == '/') {
+ sock = unix_socket_outgoing(s->host_spec);
+ } else {
+ sock = tcp_socket_outgoing_spec(s->host_spec);
+ }
+
+ /* Failed to establish connection */
+ if (sock == -1) {
+ logout("Failed to establish connection to NBD server\n");
+ return -errno;
+ }
+
+ /* NBD handshake */
+ ret = nbd_receive_negotiate(sock, s->export_name, &nbdflags, &size,
+ &blocksize);
+ if (ret == -1) {
+ logout("Failed to negotiate with the NBD server\n");
+ closesocket(sock);
+ return -errno;
+ }
+
+ /* Now that we're connected, set the socket to be non-blocking */
+ socket_set_nonblock(sock);
+
+ s->sock = sock;
+ s->size = size;
+ s->blocksize = blocksize;
+
+ logout("Established connection with NBD server\n");
+ return 0;
+}
+
+static void nbd_teardown_connection(BlockDriverState *bs)
+{
+ BDRVNBDState *s = bs->opaque;
+ struct nbd_request request;
+
+ request.type = NBD_CMD_DISC;
+ request.handle = (uint64_t)(intptr_t)bs;
+ request.from = 0;
+ request.len = 0;
+ nbd_send_request(s->sock, &request);
+
+ closesocket(s->sock);
+}
+
+static int nbd_open(BlockDriverState *bs, const char* filename, int flags)
+{
+ BDRVNBDState *s = bs->opaque;
+ int result;
+
+ /* Pop the config into our state object. Exit if invalid. */
+ result = nbd_config(s, filename, flags);
+ if (result != 0) {
+ return result;
+ }
+
+ /* establish TCP connection, return error if it fails
+ * TODO: Configurable retry-until-timeout behaviour.
+ */
+ result = nbd_establish_connection(bs);
+
+ return result;
+}
+
+static int nbd_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVNBDState *s = bs->opaque;
+ struct nbd_request request;
+ struct nbd_reply reply;
+
+ request.type = NBD_CMD_READ;
+ request.handle = (uint64_t)(intptr_t)bs;
+ request.from = sector_num * 512;;
+ request.len = nb_sectors * 512;
+
+ if (nbd_send_request(s->sock, &request) == -1)
+ return -errno;
+
+ if (nbd_receive_reply(s->sock, &reply) == -1)
+ return -errno;
+
+ if (reply.error !=0)
+ return -reply.error;
+
+ if (reply.handle != request.handle)
+ return -EIO;
+
+ if (nbd_wr_sync(s->sock, buf, request.len, 1) != request.len)
+ return -EIO;
+
+ return 0;
+}
+
+static int nbd_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BDRVNBDState *s = bs->opaque;
+ struct nbd_request request;
+ struct nbd_reply reply;
+
+ request.type = NBD_CMD_WRITE;
+ request.handle = (uint64_t)(intptr_t)bs;
+ request.from = sector_num * 512;;
+ request.len = nb_sectors * 512;
+
+ if (nbd_send_request(s->sock, &request) == -1)
+ return -errno;
+
+ if (nbd_wr_sync(s->sock, (uint8_t*)buf, request.len, 0) != request.len)
+ return -EIO;
+
+ if (nbd_receive_reply(s->sock, &reply) == -1)
+ return -errno;
+
+ if (reply.error !=0)
+ return -reply.error;
+
+ if (reply.handle != request.handle)
+ return -EIO;
+
+ return 0;
+}
+
+static void nbd_close(BlockDriverState *bs)
+{
+ BDRVNBDState *s = bs->opaque;
+ qemu_free(s->export_name);
+ qemu_free(s->host_spec);
+
+ nbd_teardown_connection(bs);
+}
+
+static int64_t nbd_getlength(BlockDriverState *bs)
+{
+ BDRVNBDState *s = bs->opaque;
+
+ return s->size;
+}
+
+static BlockDriver bdrv_nbd = {
+ .format_name = "nbd",
+ .instance_size = sizeof(BDRVNBDState),
+ .bdrv_file_open = nbd_open,
+ .bdrv_read = nbd_read,
+ .bdrv_write = nbd_write,
+ .bdrv_close = nbd_close,
+ .bdrv_getlength = nbd_getlength,
+ .protocol_name = "nbd",
+};
+
+static void bdrv_nbd_init(void)
+{
+ bdrv_register(&bdrv_nbd);
+}
+
+block_init(bdrv_nbd_init);
diff --git a/qemu-0.15.x/block/parallels.c b/qemu-0.15.x/block/parallels.c
new file mode 100644
index 0000000..35a14aa
--- /dev/null
+++ b/qemu-0.15.x/block/parallels.c
@@ -0,0 +1,157 @@
+/*
+ * Block driver for Parallels disk image format
+ *
+ * Copyright (c) 2007 Alex Beregszaszi
+ *
+ * This code is based on comparing different disk images created by Parallels.
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+
+/**************************************************************/
+
+#define HEADER_MAGIC "WithoutFreeSpace"
+#define HEADER_VERSION 2
+#define HEADER_SIZE 64
+
+// always little-endian
+struct parallels_header {
+ char magic[16]; // "WithoutFreeSpace"
+ uint32_t version;
+ uint32_t heads;
+ uint32_t cylinders;
+ uint32_t tracks;
+ uint32_t catalog_entries;
+ uint32_t nb_sectors;
+ char padding[24];
+} __attribute__((packed));
+
+typedef struct BDRVParallelsState {
+
+ uint32_t *catalog_bitmap;
+ int catalog_size;
+
+ int tracks;
+} BDRVParallelsState;
+
+static int parallels_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ const struct parallels_header *ph = (const void *)buf;
+
+ if (buf_size < HEADER_SIZE)
+ return 0;
+
+ if (!memcmp(ph->magic, HEADER_MAGIC, 16) &&
+ (le32_to_cpu(ph->version) == HEADER_VERSION))
+ return 100;
+
+ return 0;
+}
+
+static int parallels_open(BlockDriverState *bs, int flags)
+{
+ BDRVParallelsState *s = bs->opaque;
+ int i;
+ struct parallels_header ph;
+
+ bs->read_only = 1; // no write support yet
+
+ if (bdrv_pread(bs->file, 0, &ph, sizeof(ph)) != sizeof(ph))
+ goto fail;
+
+ if (memcmp(ph.magic, HEADER_MAGIC, 16) ||
+ (le32_to_cpu(ph.version) != HEADER_VERSION)) {
+ goto fail;
+ }
+
+ bs->total_sectors = le32_to_cpu(ph.nb_sectors);
+
+ s->tracks = le32_to_cpu(ph.tracks);
+
+ s->catalog_size = le32_to_cpu(ph.catalog_entries);
+ s->catalog_bitmap = qemu_malloc(s->catalog_size * 4);
+ if (bdrv_pread(bs->file, 64, s->catalog_bitmap, s->catalog_size * 4) !=
+ s->catalog_size * 4)
+ goto fail;
+ for (i = 0; i < s->catalog_size; i++)
+ le32_to_cpus(&s->catalog_bitmap[i]);
+
+ return 0;
+fail:
+ if (s->catalog_bitmap)
+ qemu_free(s->catalog_bitmap);
+ return -1;
+}
+
+static int64_t seek_to_sector(BlockDriverState *bs, int64_t sector_num)
+{
+ BDRVParallelsState *s = bs->opaque;
+ uint32_t index, offset;
+
+ index = sector_num / s->tracks;
+ offset = sector_num % s->tracks;
+
+ /* not allocated */
+ if ((index > s->catalog_size) || (s->catalog_bitmap[index] == 0))
+ return -1;
+ return (uint64_t)(s->catalog_bitmap[index] + offset) * 512;
+}
+
+static int parallels_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ while (nb_sectors > 0) {
+ int64_t position = seek_to_sector(bs, sector_num);
+ if (position >= 0) {
+ if (bdrv_pread(bs->file, position, buf, 512) != 512)
+ return -1;
+ } else {
+ memset(buf, 0, 512);
+ }
+ nb_sectors--;
+ sector_num++;
+ buf += 512;
+ }
+ return 0;
+}
+
+static void parallels_close(BlockDriverState *bs)
+{
+ BDRVParallelsState *s = bs->opaque;
+ qemu_free(s->catalog_bitmap);
+}
+
+static BlockDriver bdrv_parallels = {
+ .format_name = "parallels",
+ .instance_size = sizeof(BDRVParallelsState),
+ .bdrv_probe = parallels_probe,
+ .bdrv_open = parallels_open,
+ .bdrv_read = parallels_read,
+ .bdrv_close = parallels_close,
+};
+
+static void bdrv_parallels_init(void)
+{
+ bdrv_register(&bdrv_parallels);
+}
+
+block_init(bdrv_parallels_init);
diff --git a/qemu-0.15.x/block/qcow.c b/qemu-0.15.x/block/qcow.c
new file mode 100644
index 0000000..227b104
--- /dev/null
+++ b/qemu-0.15.x/block/qcow.c
@@ -0,0 +1,1037 @@
+/*
+ * Block driver for the QCOW format
+ *
+ * Copyright (c) 2004-2006 Fabrice Bellard
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+#include <zlib.h>
+#include "aes.h"
+
+/**************************************************************/
+/* QEMU COW block driver with compression and encryption support */
+
+#define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb)
+#define QCOW_VERSION 1
+
+#define QCOW_CRYPT_NONE 0
+#define QCOW_CRYPT_AES 1
+
+#define QCOW_OFLAG_COMPRESSED (1LL << 63)
+
+typedef struct QCowHeader {
+ uint32_t magic;
+ uint32_t version;
+ uint64_t backing_file_offset;
+ uint32_t backing_file_size;
+ uint32_t mtime;
+ uint64_t size; /* in bytes */
+ uint8_t cluster_bits;
+ uint8_t l2_bits;
+ uint32_t crypt_method;
+ uint64_t l1_table_offset;
+} QCowHeader;
+
+#define L2_CACHE_SIZE 16
+
+typedef struct BDRVQcowState {
+ int cluster_bits;
+ int cluster_size;
+ int cluster_sectors;
+ int l2_bits;
+ int l2_size;
+ int l1_size;
+ uint64_t cluster_offset_mask;
+ uint64_t l1_table_offset;
+ uint64_t *l1_table;
+ uint64_t *l2_cache;
+ uint64_t l2_cache_offsets[L2_CACHE_SIZE];
+ uint32_t l2_cache_counts[L2_CACHE_SIZE];
+ uint8_t *cluster_cache;
+ uint8_t *cluster_data;
+ uint64_t cluster_cache_offset;
+ uint32_t crypt_method; /* current crypt method, 0 if no key yet */
+ uint32_t crypt_method_header;
+ AES_KEY aes_encrypt_key;
+ AES_KEY aes_decrypt_key;
+} BDRVQcowState;
+
+static int decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset);
+
+static int qcow_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ const QCowHeader *cow_header = (const void *)buf;
+
+ if (buf_size >= sizeof(QCowHeader) &&
+ be32_to_cpu(cow_header->magic) == QCOW_MAGIC &&
+ be32_to_cpu(cow_header->version) == QCOW_VERSION)
+ return 100;
+ else
+ return 0;
+}
+
+static int qcow_open(BlockDriverState *bs, int flags)
+{
+ BDRVQcowState *s = bs->opaque;
+ int len, i, shift;
+ QCowHeader header;
+
+ if (bdrv_pread(bs->file, 0, &header, sizeof(header)) != sizeof(header))
+ goto fail;
+ be32_to_cpus(&header.magic);
+ be32_to_cpus(&header.version);
+ be64_to_cpus(&header.backing_file_offset);
+ be32_to_cpus(&header.backing_file_size);
+ be32_to_cpus(&header.mtime);
+ be64_to_cpus(&header.size);
+ be32_to_cpus(&header.crypt_method);
+ be64_to_cpus(&header.l1_table_offset);
+
+ if (header.magic != QCOW_MAGIC || header.version != QCOW_VERSION)
+ goto fail;
+ if (header.size <= 1 || header.cluster_bits < 9)
+ goto fail;
+ if (header.crypt_method > QCOW_CRYPT_AES)
+ goto fail;
+ s->crypt_method_header = header.crypt_method;
+ if (s->crypt_method_header)
+ bs->encrypted = 1;
+ s->cluster_bits = header.cluster_bits;
+ s->cluster_size = 1 << s->cluster_bits;
+ s->cluster_sectors = 1 << (s->cluster_bits - 9);
+ s->l2_bits = header.l2_bits;
+ s->l2_size = 1 << s->l2_bits;
+ bs->total_sectors = header.size / 512;
+ s->cluster_offset_mask = (1LL << (63 - s->cluster_bits)) - 1;
+
+ /* read the level 1 table */
+ shift = s->cluster_bits + s->l2_bits;
+ s->l1_size = (header.size + (1LL << shift) - 1) >> shift;
+
+ s->l1_table_offset = header.l1_table_offset;
+ s->l1_table = qemu_malloc(s->l1_size * sizeof(uint64_t));
+ if (!s->l1_table)
+ goto fail;
+ if (bdrv_pread(bs->file, s->l1_table_offset, s->l1_table, s->l1_size * sizeof(uint64_t)) !=
+ s->l1_size * sizeof(uint64_t))
+ goto fail;
+ for(i = 0;i < s->l1_size; i++) {
+ be64_to_cpus(&s->l1_table[i]);
+ }
+ /* alloc L2 cache */
+ s->l2_cache = qemu_malloc(s->l2_size * L2_CACHE_SIZE * sizeof(uint64_t));
+ if (!s->l2_cache)
+ goto fail;
+ s->cluster_cache = qemu_malloc(s->cluster_size);
+ if (!s->cluster_cache)
+ goto fail;
+ s->cluster_data = qemu_malloc(s->cluster_size);
+ if (!s->cluster_data)
+ goto fail;
+ s->cluster_cache_offset = -1;
+
+ /* read the backing file name */
+ if (header.backing_file_offset != 0) {
+ len = header.backing_file_size;
+ if (len > 1023)
+ len = 1023;
+ if (bdrv_pread(bs->file, header.backing_file_offset, bs->backing_file, len) != len)
+ goto fail;
+ bs->backing_file[len] = '\0';
+ }
+ return 0;
+
+ fail:
+ qemu_free(s->l1_table);
+ qemu_free(s->l2_cache);
+ qemu_free(s->cluster_cache);
+ qemu_free(s->cluster_data);
+ return -1;
+}
+
+static int qcow_set_key(BlockDriverState *bs, const char *key)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint8_t keybuf[16];
+ int len, i;
+
+ memset(keybuf, 0, 16);
+ len = strlen(key);
+ if (len > 16)
+ len = 16;
+ /* XXX: we could compress the chars to 7 bits to increase
+ entropy */
+ for(i = 0;i < len;i++) {
+ keybuf[i] = key[i];
+ }
+ s->crypt_method = s->crypt_method_header;
+
+ if (AES_set_encrypt_key(keybuf, 128, &s->aes_encrypt_key) != 0)
+ return -1;
+ if (AES_set_decrypt_key(keybuf, 128, &s->aes_decrypt_key) != 0)
+ return -1;
+#if 0
+ /* test */
+ {
+ uint8_t in[16];
+ uint8_t out[16];
+ uint8_t tmp[16];
+ for(i=0;i<16;i++)
+ in[i] = i;
+ AES_encrypt(in, tmp, &s->aes_encrypt_key);
+ AES_decrypt(tmp, out, &s->aes_decrypt_key);
+ for(i = 0; i < 16; i++)
+ printf(" %02x", tmp[i]);
+ printf("\n");
+ for(i = 0; i < 16; i++)
+ printf(" %02x", out[i]);
+ printf("\n");
+ }
+#endif
+ return 0;
+}
+
+/* The crypt function is compatible with the linux cryptoloop
+ algorithm for < 4 GB images. NOTE: out_buf == in_buf is
+ supported */
+static void encrypt_sectors(BDRVQcowState *s, int64_t sector_num,
+ uint8_t *out_buf, const uint8_t *in_buf,
+ int nb_sectors, int enc,
+ const AES_KEY *key)
+{
+ union {
+ uint64_t ll[2];
+ uint8_t b[16];
+ } ivec;
+ int i;
+
+ for(i = 0; i < nb_sectors; i++) {
+ ivec.ll[0] = cpu_to_le64(sector_num);
+ ivec.ll[1] = 0;
+ AES_cbc_encrypt(in_buf, out_buf, 512, key,
+ ivec.b, enc);
+ sector_num++;
+ in_buf += 512;
+ out_buf += 512;
+ }
+}
+
+/* 'allocate' is:
+ *
+ * 0 to not allocate.
+ *
+ * 1 to allocate a normal cluster (for sector indexes 'n_start' to
+ * 'n_end')
+ *
+ * 2 to allocate a compressed cluster of size
+ * 'compressed_size'. 'compressed_size' must be > 0 and <
+ * cluster_size
+ *
+ * return 0 if not allocated.
+ */
+static uint64_t get_cluster_offset(BlockDriverState *bs,
+ uint64_t offset, int allocate,
+ int compressed_size,
+ int n_start, int n_end)
+{
+ BDRVQcowState *s = bs->opaque;
+ int min_index, i, j, l1_index, l2_index;
+ uint64_t l2_offset, *l2_table, cluster_offset, tmp;
+ uint32_t min_count;
+ int new_l2_table;
+
+ l1_index = offset >> (s->l2_bits + s->cluster_bits);
+ l2_offset = s->l1_table[l1_index];
+ new_l2_table = 0;
+ if (!l2_offset) {
+ if (!allocate)
+ return 0;
+ /* allocate a new l2 entry */
+ l2_offset = bdrv_getlength(bs->file);
+ /* round to cluster size */
+ l2_offset = (l2_offset + s->cluster_size - 1) & ~(s->cluster_size - 1);
+ /* update the L1 entry */
+ s->l1_table[l1_index] = l2_offset;
+ tmp = cpu_to_be64(l2_offset);
+ if (bdrv_pwrite_sync(bs->file,
+ s->l1_table_offset + l1_index * sizeof(tmp),
+ &tmp, sizeof(tmp)) < 0)
+ return 0;
+ new_l2_table = 1;
+ }
+ for(i = 0; i < L2_CACHE_SIZE; i++) {
+ if (l2_offset == s->l2_cache_offsets[i]) {
+ /* increment the hit count */
+ if (++s->l2_cache_counts[i] == 0xffffffff) {
+ for(j = 0; j < L2_CACHE_SIZE; j++) {
+ s->l2_cache_counts[j] >>= 1;
+ }
+ }
+ l2_table = s->l2_cache + (i << s->l2_bits);
+ goto found;
+ }
+ }
+ /* not found: load a new entry in the least used one */
+ min_index = 0;
+ min_count = 0xffffffff;
+ for(i = 0; i < L2_CACHE_SIZE; i++) {
+ if (s->l2_cache_counts[i] < min_count) {
+ min_count = s->l2_cache_counts[i];
+ min_index = i;
+ }
+ }
+ l2_table = s->l2_cache + (min_index << s->l2_bits);
+ if (new_l2_table) {
+ memset(l2_table, 0, s->l2_size * sizeof(uint64_t));
+ if (bdrv_pwrite_sync(bs->file, l2_offset, l2_table,
+ s->l2_size * sizeof(uint64_t)) < 0)
+ return 0;
+ } else {
+ if (bdrv_pread(bs->file, l2_offset, l2_table, s->l2_size * sizeof(uint64_t)) !=
+ s->l2_size * sizeof(uint64_t))
+ return 0;
+ }
+ s->l2_cache_offsets[min_index] = l2_offset;
+ s->l2_cache_counts[min_index] = 1;
+ found:
+ l2_index = (offset >> s->cluster_bits) & (s->l2_size - 1);
+ cluster_offset = be64_to_cpu(l2_table[l2_index]);
+ if (!cluster_offset ||
+ ((cluster_offset & QCOW_OFLAG_COMPRESSED) && allocate == 1)) {
+ if (!allocate)
+ return 0;
+ /* allocate a new cluster */
+ if ((cluster_offset & QCOW_OFLAG_COMPRESSED) &&
+ (n_end - n_start) < s->cluster_sectors) {
+ /* if the cluster is already compressed, we must
+ decompress it in the case it is not completely
+ overwritten */
+ if (decompress_cluster(bs, cluster_offset) < 0)
+ return 0;
+ cluster_offset = bdrv_getlength(bs->file);
+ cluster_offset = (cluster_offset + s->cluster_size - 1) &
+ ~(s->cluster_size - 1);
+ /* write the cluster content */
+ if (bdrv_pwrite(bs->file, cluster_offset, s->cluster_cache, s->cluster_size) !=
+ s->cluster_size)
+ return -1;
+ } else {
+ cluster_offset = bdrv_getlength(bs->file);
+ if (allocate == 1) {
+ /* round to cluster size */
+ cluster_offset = (cluster_offset + s->cluster_size - 1) &
+ ~(s->cluster_size - 1);
+ bdrv_truncate(bs->file, cluster_offset + s->cluster_size);
+ /* if encrypted, we must initialize the cluster
+ content which won't be written */
+ if (s->crypt_method &&
+ (n_end - n_start) < s->cluster_sectors) {
+ uint64_t start_sect;
+ start_sect = (offset & ~(s->cluster_size - 1)) >> 9;
+ memset(s->cluster_data + 512, 0x00, 512);
+ for(i = 0; i < s->cluster_sectors; i++) {
+ if (i < n_start || i >= n_end) {
+ encrypt_sectors(s, start_sect + i,
+ s->cluster_data,
+ s->cluster_data + 512, 1, 1,
+ &s->aes_encrypt_key);
+ if (bdrv_pwrite(bs->file, cluster_offset + i * 512,
+ s->cluster_data, 512) != 512)
+ return -1;
+ }
+ }
+ }
+ } else if (allocate == 2) {
+ cluster_offset |= QCOW_OFLAG_COMPRESSED |
+ (uint64_t)compressed_size << (63 - s->cluster_bits);
+ }
+ }
+ /* update L2 table */
+ tmp = cpu_to_be64(cluster_offset);
+ l2_table[l2_index] = tmp;
+ if (bdrv_pwrite_sync(bs->file, l2_offset + l2_index * sizeof(tmp),
+ &tmp, sizeof(tmp)) < 0)
+ return 0;
+ }
+ return cluster_offset;
+}
+
+static int qcow_is_allocated(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors, int *pnum)
+{
+ BDRVQcowState *s = bs->opaque;
+ int index_in_cluster, n;
+ uint64_t cluster_offset;
+
+ cluster_offset = get_cluster_offset(bs, sector_num << 9, 0, 0, 0, 0);
+ index_in_cluster = sector_num & (s->cluster_sectors - 1);
+ n = s->cluster_sectors - index_in_cluster;
+ if (n > nb_sectors)
+ n = nb_sectors;
+ *pnum = n;
+ return (cluster_offset != 0);
+}
+
+static int decompress_buffer(uint8_t *out_buf, int out_buf_size,
+ const uint8_t *buf, int buf_size)
+{
+ z_stream strm1, *strm = &strm1;
+ int ret, out_len;
+
+ memset(strm, 0, sizeof(*strm));
+
+ strm->next_in = (uint8_t *)buf;
+ strm->avail_in = buf_size;
+ strm->next_out = out_buf;
+ strm->avail_out = out_buf_size;
+
+ ret = inflateInit2(strm, -12);
+ if (ret != Z_OK)
+ return -1;
+ ret = inflate(strm, Z_FINISH);
+ out_len = strm->next_out - out_buf;
+ if ((ret != Z_STREAM_END && ret != Z_BUF_ERROR) ||
+ out_len != out_buf_size) {
+ inflateEnd(strm);
+ return -1;
+ }
+ inflateEnd(strm);
+ return 0;
+}
+
+static int decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret, csize;
+ uint64_t coffset;
+
+ coffset = cluster_offset & s->cluster_offset_mask;
+ if (s->cluster_cache_offset != coffset) {
+ csize = cluster_offset >> (63 - s->cluster_bits);
+ csize &= (s->cluster_size - 1);
+ ret = bdrv_pread(bs->file, coffset, s->cluster_data, csize);
+ if (ret != csize)
+ return -1;
+ if (decompress_buffer(s->cluster_cache, s->cluster_size,
+ s->cluster_data, csize) < 0) {
+ return -1;
+ }
+ s->cluster_cache_offset = coffset;
+ }
+ return 0;
+}
+
+#if 0
+
+static int qcow_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret, index_in_cluster, n;
+ uint64_t cluster_offset;
+
+ while (nb_sectors > 0) {
+ cluster_offset = get_cluster_offset(bs, sector_num << 9, 0, 0, 0, 0);
+ index_in_cluster = sector_num & (s->cluster_sectors - 1);
+ n = s->cluster_sectors - index_in_cluster;
+ if (n > nb_sectors)
+ n = nb_sectors;
+ if (!cluster_offset) {
+ if (bs->backing_hd) {
+ /* read from the base image */
+ ret = bdrv_read(bs->backing_hd, sector_num, buf, n);
+ if (ret < 0)
+ return -1;
+ } else {
+ memset(buf, 0, 512 * n);
+ }
+ } else if (cluster_offset & QCOW_OFLAG_COMPRESSED) {
+ if (decompress_cluster(bs, cluster_offset) < 0)
+ return -1;
+ memcpy(buf, s->cluster_cache + index_in_cluster * 512, 512 * n);
+ } else {
+ ret = bdrv_pread(bs->file, cluster_offset + index_in_cluster * 512, buf, n * 512);
+ if (ret != n * 512)
+ return -1;
+ if (s->crypt_method) {
+ encrypt_sectors(s, sector_num, buf, buf, n, 0,
+ &s->aes_decrypt_key);
+ }
+ }
+ nb_sectors -= n;
+ sector_num += n;
+ buf += n * 512;
+ }
+ return 0;
+}
+#endif
+
+typedef struct QCowAIOCB {
+ BlockDriverAIOCB common;
+ int64_t sector_num;
+ QEMUIOVector *qiov;
+ uint8_t *buf;
+ void *orig_buf;
+ int nb_sectors;
+ int n;
+ uint64_t cluster_offset;
+ uint8_t *cluster_data;
+ struct iovec hd_iov;
+ bool is_write;
+ QEMUBH *bh;
+ QEMUIOVector hd_qiov;
+ BlockDriverAIOCB *hd_aiocb;
+} QCowAIOCB;
+
+static void qcow_aio_cancel(BlockDriverAIOCB *blockacb)
+{
+ QCowAIOCB *acb = container_of(blockacb, QCowAIOCB, common);
+ if (acb->hd_aiocb)
+ bdrv_aio_cancel(acb->hd_aiocb);
+ qemu_aio_release(acb);
+}
+
+static AIOPool qcow_aio_pool = {
+ .aiocb_size = sizeof(QCowAIOCB),
+ .cancel = qcow_aio_cancel,
+};
+
+static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque, int is_write)
+{
+ QCowAIOCB *acb;
+
+ acb = qemu_aio_get(&qcow_aio_pool, bs, cb, opaque);
+ if (!acb)
+ return NULL;
+ acb->hd_aiocb = NULL;
+ acb->sector_num = sector_num;
+ acb->qiov = qiov;
+ acb->is_write = is_write;
+
+ if (qiov->niov > 1) {
+ acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
+ if (is_write)
+ qemu_iovec_to_buffer(qiov, acb->buf);
+ } else {
+ acb->buf = (uint8_t *)qiov->iov->iov_base;
+ }
+ acb->nb_sectors = nb_sectors;
+ acb->n = 0;
+ acb->cluster_offset = 0;
+ return acb;
+}
+
+static void qcow_aio_read_cb(void *opaque, int ret);
+static void qcow_aio_write_cb(void *opaque, int ret);
+
+static void qcow_aio_rw_bh(void *opaque)
+{
+ QCowAIOCB *acb = opaque;
+ qemu_bh_delete(acb->bh);
+ acb->bh = NULL;
+
+ if (acb->is_write) {
+ qcow_aio_write_cb(opaque, 0);
+ } else {
+ qcow_aio_read_cb(opaque, 0);
+ }
+}
+
+static int qcow_schedule_bh(QEMUBHFunc *cb, QCowAIOCB *acb)
+{
+ if (acb->bh) {
+ return -EIO;
+ }
+
+ acb->bh = qemu_bh_new(cb, acb);
+ if (!acb->bh) {
+ return -EIO;
+ }
+
+ qemu_bh_schedule(acb->bh);
+
+ return 0;
+}
+
+static void qcow_aio_read_cb(void *opaque, int ret)
+{
+ QCowAIOCB *acb = opaque;
+ BlockDriverState *bs = acb->common.bs;
+ BDRVQcowState *s = bs->opaque;
+ int index_in_cluster;
+
+ acb->hd_aiocb = NULL;
+ if (ret < 0)
+ goto done;
+
+ redo:
+ /* post process the read buffer */
+ if (!acb->cluster_offset) {
+ /* nothing to do */
+ } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
+ /* nothing to do */
+ } else {
+ if (s->crypt_method) {
+ encrypt_sectors(s, acb->sector_num, acb->buf, acb->buf,
+ acb->n, 0,
+ &s->aes_decrypt_key);
+ }
+ }
+
+ acb->nb_sectors -= acb->n;
+ acb->sector_num += acb->n;
+ acb->buf += acb->n * 512;
+
+ if (acb->nb_sectors == 0) {
+ /* request completed */
+ ret = 0;
+ goto done;
+ }
+
+ /* prepare next AIO request */
+ acb->cluster_offset = get_cluster_offset(bs, acb->sector_num << 9,
+ 0, 0, 0, 0);
+ index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
+ acb->n = s->cluster_sectors - index_in_cluster;
+ if (acb->n > acb->nb_sectors)
+ acb->n = acb->nb_sectors;
+
+ if (!acb->cluster_offset) {
+ if (bs->backing_hd) {
+ /* read from the base image */
+ acb->hd_iov.iov_base = (void *)acb->buf;
+ acb->hd_iov.iov_len = acb->n * 512;
+ qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
+ acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num,
+ &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ } else {
+ /* Note: in this case, no need to wait */
+ memset(acb->buf, 0, 512 * acb->n);
+ goto redo;
+ }
+ } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
+ /* add AIO support for compressed blocks ? */
+ if (decompress_cluster(bs, acb->cluster_offset) < 0) {
+ ret = -EIO;
+ goto done;
+ }
+ memcpy(acb->buf,
+ s->cluster_cache + index_in_cluster * 512, 512 * acb->n);
+ goto redo;
+ } else {
+ if ((acb->cluster_offset & 511) != 0) {
+ ret = -EIO;
+ goto done;
+ }
+ acb->hd_iov.iov_base = (void *)acb->buf;
+ acb->hd_iov.iov_len = acb->n * 512;
+ qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
+ acb->hd_aiocb = bdrv_aio_readv(bs->file,
+ (acb->cluster_offset >> 9) + index_in_cluster,
+ &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ }
+
+ return;
+
+done:
+ if (acb->qiov->niov > 1) {
+ qemu_iovec_from_buffer(acb->qiov, acb->orig_buf, acb->qiov->size);
+ qemu_vfree(acb->orig_buf);
+ }
+ acb->common.cb(acb->common.opaque, ret);
+ qemu_aio_release(acb);
+}
+
+static BlockDriverAIOCB *qcow_aio_readv(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ QCowAIOCB *acb;
+ int ret;
+
+ acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
+ if (!acb)
+ return NULL;
+
+ ret = qcow_schedule_bh(qcow_aio_rw_bh, acb);
+ if (ret < 0) {
+ if (acb->qiov->niov > 1) {
+ qemu_vfree(acb->orig_buf);
+ }
+ qemu_aio_release(acb);
+ return NULL;
+ }
+
+ return &acb->common;
+}
+
+static void qcow_aio_write_cb(void *opaque, int ret)
+{
+ QCowAIOCB *acb = opaque;
+ BlockDriverState *bs = acb->common.bs;
+ BDRVQcowState *s = bs->opaque;
+ int index_in_cluster;
+ uint64_t cluster_offset;
+ const uint8_t *src_buf;
+
+ acb->hd_aiocb = NULL;
+
+ if (ret < 0)
+ goto done;
+
+ acb->nb_sectors -= acb->n;
+ acb->sector_num += acb->n;
+ acb->buf += acb->n * 512;
+
+ if (acb->nb_sectors == 0) {
+ /* request completed */
+ ret = 0;
+ goto done;
+ }
+
+ index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
+ acb->n = s->cluster_sectors - index_in_cluster;
+ if (acb->n > acb->nb_sectors)
+ acb->n = acb->nb_sectors;
+ cluster_offset = get_cluster_offset(bs, acb->sector_num << 9, 1, 0,
+ index_in_cluster,
+ index_in_cluster + acb->n);
+ if (!cluster_offset || (cluster_offset & 511) != 0) {
+ ret = -EIO;
+ goto done;
+ }
+ if (s->crypt_method) {
+ if (!acb->cluster_data) {
+ acb->cluster_data = qemu_mallocz(s->cluster_size);
+ if (!acb->cluster_data) {
+ ret = -ENOMEM;
+ goto done;
+ }
+ }
+ encrypt_sectors(s, acb->sector_num, acb->cluster_data, acb->buf,
+ acb->n, 1, &s->aes_encrypt_key);
+ src_buf = acb->cluster_data;
+ } else {
+ src_buf = acb->buf;
+ }
+
+ acb->hd_iov.iov_base = (void *)src_buf;
+ acb->hd_iov.iov_len = acb->n * 512;
+ qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
+ acb->hd_aiocb = bdrv_aio_writev(bs->file,
+ (cluster_offset >> 9) + index_in_cluster,
+ &acb->hd_qiov, acb->n,
+ qcow_aio_write_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ return;
+
+done:
+ if (acb->qiov->niov > 1)
+ qemu_vfree(acb->orig_buf);
+ acb->common.cb(acb->common.opaque, ret);
+ qemu_aio_release(acb);
+}
+
+static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVQcowState *s = bs->opaque;
+ QCowAIOCB *acb;
+ int ret;
+
+ s->cluster_cache_offset = -1; /* disable compressed cache */
+
+ acb = qcow_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
+ if (!acb)
+ return NULL;
+
+
+ ret = qcow_schedule_bh(qcow_aio_rw_bh, acb);
+ if (ret < 0) {
+ if (acb->qiov->niov > 1) {
+ qemu_vfree(acb->orig_buf);
+ }
+ qemu_aio_release(acb);
+ return NULL;
+ }
+
+ return &acb->common;
+}
+
+static void qcow_close(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ qemu_free(s->l1_table);
+ qemu_free(s->l2_cache);
+ qemu_free(s->cluster_cache);
+ qemu_free(s->cluster_data);
+}
+
+static int qcow_create(const char *filename, QEMUOptionParameter *options)
+{
+ int fd, header_size, backing_filename_len, l1_size, i, shift;
+ QCowHeader header;
+ uint64_t tmp;
+ int64_t total_size = 0;
+ const char *backing_file = NULL;
+ int flags = 0;
+ int ret;
+
+ /* Read out options */
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ total_size = options->value.n / 512;
+ } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
+ backing_file = options->value.s;
+ } else if (!strcmp(options->name, BLOCK_OPT_ENCRYPT)) {
+ flags |= options->value.n ? BLOCK_FLAG_ENCRYPT : 0;
+ }
+ options++;
+ }
+
+ fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
+ if (fd < 0)
+ return -errno;
+ memset(&header, 0, sizeof(header));
+ header.magic = cpu_to_be32(QCOW_MAGIC);
+ header.version = cpu_to_be32(QCOW_VERSION);
+ header.size = cpu_to_be64(total_size * 512);
+ header_size = sizeof(header);
+ backing_filename_len = 0;
+ if (backing_file) {
+ if (strcmp(backing_file, "fat:")) {
+ header.backing_file_offset = cpu_to_be64(header_size);
+ backing_filename_len = strlen(backing_file);
+ header.backing_file_size = cpu_to_be32(backing_filename_len);
+ header_size += backing_filename_len;
+ } else {
+ /* special backing file for vvfat */
+ backing_file = NULL;
+ }
+ header.cluster_bits = 9; /* 512 byte cluster to avoid copying
+ unmodifyed sectors */
+ header.l2_bits = 12; /* 32 KB L2 tables */
+ } else {
+ header.cluster_bits = 12; /* 4 KB clusters */
+ header.l2_bits = 9; /* 4 KB L2 tables */
+ }
+ header_size = (header_size + 7) & ~7;
+ shift = header.cluster_bits + header.l2_bits;
+ l1_size = ((total_size * 512) + (1LL << shift) - 1) >> shift;
+
+ header.l1_table_offset = cpu_to_be64(header_size);
+ if (flags & BLOCK_FLAG_ENCRYPT) {
+ header.crypt_method = cpu_to_be32(QCOW_CRYPT_AES);
+ } else {
+ header.crypt_method = cpu_to_be32(QCOW_CRYPT_NONE);
+ }
+
+ /* write all the data */
+ ret = qemu_write_full(fd, &header, sizeof(header));
+ if (ret != sizeof(header)) {
+ ret = -errno;
+ goto exit;
+ }
+
+ if (backing_file) {
+ ret = qemu_write_full(fd, backing_file, backing_filename_len);
+ if (ret != backing_filename_len) {
+ ret = -errno;
+ goto exit;
+ }
+
+ }
+ lseek(fd, header_size, SEEK_SET);
+ tmp = 0;
+ for(i = 0;i < l1_size; i++) {
+ ret = qemu_write_full(fd, &tmp, sizeof(tmp));
+ if (ret != sizeof(tmp)) {
+ ret = -errno;
+ goto exit;
+ }
+ }
+
+ ret = 0;
+exit:
+ close(fd);
+ return ret;
+}
+
+static int qcow_make_empty(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint32_t l1_length = s->l1_size * sizeof(uint64_t);
+ int ret;
+
+ memset(s->l1_table, 0, l1_length);
+ if (bdrv_pwrite_sync(bs->file, s->l1_table_offset, s->l1_table,
+ l1_length) < 0)
+ return -1;
+ ret = bdrv_truncate(bs->file, s->l1_table_offset + l1_length);
+ if (ret < 0)
+ return ret;
+
+ memset(s->l2_cache, 0, s->l2_size * L2_CACHE_SIZE * sizeof(uint64_t));
+ memset(s->l2_cache_offsets, 0, L2_CACHE_SIZE * sizeof(uint64_t));
+ memset(s->l2_cache_counts, 0, L2_CACHE_SIZE * sizeof(uint32_t));
+
+ return 0;
+}
+
+/* XXX: put compressed sectors first, then all the cluster aligned
+ tables to avoid losing bytes in alignment */
+static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BDRVQcowState *s = bs->opaque;
+ z_stream strm;
+ int ret, out_len;
+ uint8_t *out_buf;
+ uint64_t cluster_offset;
+
+ if (nb_sectors != s->cluster_sectors)
+ return -EINVAL;
+
+ out_buf = qemu_malloc(s->cluster_size + (s->cluster_size / 1000) + 128);
+ if (!out_buf)
+ return -1;
+
+ /* best compression, small window, no zlib header */
+ memset(&strm, 0, sizeof(strm));
+ ret = deflateInit2(&strm, Z_DEFAULT_COMPRESSION,
+ Z_DEFLATED, -12,
+ 9, Z_DEFAULT_STRATEGY);
+ if (ret != 0) {
+ qemu_free(out_buf);
+ return -1;
+ }
+
+ strm.avail_in = s->cluster_size;
+ strm.next_in = (uint8_t *)buf;
+ strm.avail_out = s->cluster_size;
+ strm.next_out = out_buf;
+
+ ret = deflate(&strm, Z_FINISH);
+ if (ret != Z_STREAM_END && ret != Z_OK) {
+ qemu_free(out_buf);
+ deflateEnd(&strm);
+ return -1;
+ }
+ out_len = strm.next_out - out_buf;
+
+ deflateEnd(&strm);
+
+ if (ret != Z_STREAM_END || out_len >= s->cluster_size) {
+ /* could not compress: write normal cluster */
+ bdrv_write(bs, sector_num, buf, s->cluster_sectors);
+ } else {
+ cluster_offset = get_cluster_offset(bs, sector_num << 9, 2,
+ out_len, 0, 0);
+ cluster_offset &= s->cluster_offset_mask;
+ if (bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len) != out_len) {
+ qemu_free(out_buf);
+ return -1;
+ }
+ }
+
+ qemu_free(out_buf);
+ return 0;
+}
+
+static int qcow_flush(BlockDriverState *bs)
+{
+ return bdrv_flush(bs->file);
+}
+
+static BlockDriverAIOCB *qcow_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_flush(bs->file, cb, opaque);
+}
+
+static int qcow_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
+{
+ BDRVQcowState *s = bs->opaque;
+ bdi->cluster_size = s->cluster_size;
+ return 0;
+}
+
+
+static QEMUOptionParameter qcow_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ {
+ .name = BLOCK_OPT_BACKING_FILE,
+ .type = OPT_STRING,
+ .help = "File name of a base image"
+ },
+ {
+ .name = BLOCK_OPT_ENCRYPT,
+ .type = OPT_FLAG,
+ .help = "Encrypt the image"
+ },
+ { NULL }
+};
+
+static BlockDriver bdrv_qcow = {
+ .format_name = "qcow",
+ .instance_size = sizeof(BDRVQcowState),
+ .bdrv_probe = qcow_probe,
+ .bdrv_open = qcow_open,
+ .bdrv_close = qcow_close,
+ .bdrv_create = qcow_create,
+ .bdrv_flush = qcow_flush,
+ .bdrv_is_allocated = qcow_is_allocated,
+ .bdrv_set_key = qcow_set_key,
+ .bdrv_make_empty = qcow_make_empty,
+ .bdrv_aio_readv = qcow_aio_readv,
+ .bdrv_aio_writev = qcow_aio_writev,
+ .bdrv_aio_flush = qcow_aio_flush,
+ .bdrv_write_compressed = qcow_write_compressed,
+ .bdrv_get_info = qcow_get_info,
+
+ .create_options = qcow_create_options,
+};
+
+static void bdrv_qcow_init(void)
+{
+ bdrv_register(&bdrv_qcow);
+}
+
+block_init(bdrv_qcow_init);
diff --git a/qemu-0.15.x/block/qcow2-cache.c b/qemu-0.15.x/block/qcow2-cache.c
new file mode 100644
index 0000000..8408847
--- /dev/null
+++ b/qemu-0.15.x/block/qcow2-cache.c
@@ -0,0 +1,326 @@
+/*
+ * L2/refcount table cache for the QCOW2 format
+ *
+ * Copyright (c) 2010 Kevin Wolf <kwolf(a)redhat.com>
+ *
+ * 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.
+ */
+
+#include "block_int.h"
+#include "qemu-common.h"
+#include "qcow2.h"
+
+typedef struct Qcow2CachedTable {
+ void* table;
+ int64_t offset;
+ bool dirty;
+ int cache_hits;
+ int ref;
+} Qcow2CachedTable;
+
+struct Qcow2Cache {
+ Qcow2CachedTable* entries;
+ struct Qcow2Cache* depends;
+ int size;
+ bool depends_on_flush;
+ bool writethrough;
+};
+
+Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
+ bool writethrough)
+{
+ BDRVQcowState *s = bs->opaque;
+ Qcow2Cache *c;
+ int i;
+
+ c = qemu_mallocz(sizeof(*c));
+ c->size = num_tables;
+ c->entries = qemu_mallocz(sizeof(*c->entries) * num_tables);
+ c->writethrough = writethrough;
+
+ for (i = 0; i < c->size; i++) {
+ c->entries[i].table = qemu_blockalign(bs, s->cluster_size);
+ }
+
+ return c;
+}
+
+int qcow2_cache_destroy(BlockDriverState* bs, Qcow2Cache *c)
+{
+ int i;
+
+ for (i = 0; i < c->size; i++) {
+ assert(c->entries[i].ref == 0);
+ qemu_vfree(c->entries[i].table);
+ }
+
+ qemu_free(c->entries);
+ qemu_free(c);
+
+ return 0;
+}
+
+static int qcow2_cache_flush_dependency(BlockDriverState *bs, Qcow2Cache *c)
+{
+ int ret;
+
+ ret = qcow2_cache_flush(bs, c->depends);
+ if (ret < 0) {
+ return ret;
+ }
+
+ c->depends = NULL;
+ c->depends_on_flush = false;
+
+ return 0;
+}
+
+static int qcow2_cache_entry_flush(BlockDriverState *bs, Qcow2Cache *c, int i)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret = 0;
+
+ if (!c->entries[i].dirty || !c->entries[i].offset) {
+ return 0;
+ }
+
+ if (c->depends) {
+ ret = qcow2_cache_flush_dependency(bs, c);
+ } else if (c->depends_on_flush) {
+ ret = bdrv_flush(bs->file);
+ if (ret >= 0) {
+ c->depends_on_flush = false;
+ }
+ }
+
+ if (ret < 0) {
+ return ret;
+ }
+
+ if (c == s->refcount_block_cache) {
+ BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_UPDATE_PART);
+ } else if (c == s->l2_table_cache) {
+ BLKDBG_EVENT(bs->file, BLKDBG_L2_UPDATE);
+ }
+
+ ret = bdrv_pwrite(bs->file, c->entries[i].offset, c->entries[i].table,
+ s->cluster_size);
+ if (ret < 0) {
+ return ret;
+ }
+
+ c->entries[i].dirty = false;
+
+ return 0;
+}
+
+int qcow2_cache_flush(BlockDriverState *bs, Qcow2Cache *c)
+{
+ int result = 0;
+ int ret;
+ int i;
+
+ for (i = 0; i < c->size; i++) {
+ ret = qcow2_cache_entry_flush(bs, c, i);
+ if (ret < 0 && result != -ENOSPC) {
+ result = ret;
+ }
+ }
+
+ if (result == 0) {
+ ret = bdrv_flush(bs->file);
+ if (ret < 0) {
+ result = ret;
+ }
+ }
+
+ return result;
+}
+
+int qcow2_cache_set_dependency(BlockDriverState *bs, Qcow2Cache *c,
+ Qcow2Cache *dependency)
+{
+ int ret;
+
+ if (dependency->depends) {
+ ret = qcow2_cache_flush_dependency(bs, dependency);
+ if (ret < 0) {
+ return ret;
+ }
+ }
+
+ if (c->depends && (c->depends != dependency)) {
+ ret = qcow2_cache_flush_dependency(bs, c);
+ if (ret < 0) {
+ return ret;
+ }
+ }
+
+ c->depends = dependency;
+ return 0;
+}
+
+void qcow2_cache_depends_on_flush(Qcow2Cache *c)
+{
+ c->depends_on_flush = true;
+}
+
+static int qcow2_cache_find_entry_to_replace(Qcow2Cache *c)
+{
+ int i;
+ int min_count = INT_MAX;
+ int min_index = -1;
+
+
+ for (i = 0; i < c->size; i++) {
+ if (c->entries[i].ref) {
+ continue;
+ }
+
+ if (c->entries[i].cache_hits < min_count) {
+ min_index = i;
+ min_count = c->entries[i].cache_hits;
+ }
+
+ /* Give newer hits priority */
+ /* TODO Check how to optimize the replacement strategy */
+ c->entries[i].cache_hits /= 2;
+ }
+
+ if (min_index == -1) {
+ /* This can't happen in current synchronous code, but leave the check
+ * here as a reminder for whoever starts using AIO with the cache */
+ abort();
+ }
+ return min_index;
+}
+
+static int qcow2_cache_do_get(BlockDriverState *bs, Qcow2Cache *c,
+ uint64_t offset, void **table, bool read_from_disk)
+{
+ BDRVQcowState *s = bs->opaque;
+ int i;
+ int ret;
+
+ /* Check if the table is already cached */
+ for (i = 0; i < c->size; i++) {
+ if (c->entries[i].offset == offset) {
+ goto found;
+ }
+ }
+
+ /* If not, write a table back and replace it */
+ i = qcow2_cache_find_entry_to_replace(c);
+ if (i < 0) {
+ return i;
+ }
+
+ ret = qcow2_cache_entry_flush(bs, c, i);
+ if (ret < 0) {
+ return ret;
+ }
+
+ c->entries[i].offset = 0;
+ if (read_from_disk) {
+ if (c == s->l2_table_cache) {
+ BLKDBG_EVENT(bs->file, BLKDBG_L2_LOAD);
+ }
+
+ ret = bdrv_pread(bs->file, offset, c->entries[i].table, s->cluster_size);
+ if (ret < 0) {
+ return ret;
+ }
+ }
+
+ /* Give the table some hits for the start so that it won't be replaced
+ * immediately. The number 32 is completely arbitrary. */
+ c->entries[i].cache_hits = 32;
+ c->entries[i].offset = offset;
+
+ /* And return the right table */
+found:
+ c->entries[i].cache_hits++;
+ c->entries[i].ref++;
+ *table = c->entries[i].table;
+ return 0;
+}
+
+int qcow2_cache_get(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
+ void **table)
+{
+ return qcow2_cache_do_get(bs, c, offset, table, true);
+}
+
+int qcow2_cache_get_empty(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
+ void **table)
+{
+ return qcow2_cache_do_get(bs, c, offset, table, false);
+}
+
+int qcow2_cache_put(BlockDriverState *bs, Qcow2Cache *c, void **table)
+{
+ int i;
+
+ for (i = 0; i < c->size; i++) {
+ if (c->entries[i].table == *table) {
+ goto found;
+ }
+ }
+ return -ENOENT;
+
+found:
+ c->entries[i].ref--;
+ *table = NULL;
+
+ assert(c->entries[i].ref >= 0);
+
+ if (c->writethrough) {
+ return qcow2_cache_entry_flush(bs, c, i);
+ } else {
+ return 0;
+ }
+}
+
+void qcow2_cache_entry_mark_dirty(Qcow2Cache *c, void *table)
+{
+ int i;
+
+ for (i = 0; i < c->size; i++) {
+ if (c->entries[i].table == table) {
+ goto found;
+ }
+ }
+ abort();
+
+found:
+ c->entries[i].dirty = true;
+}
+
+bool qcow2_cache_set_writethrough(BlockDriverState *bs, Qcow2Cache *c,
+ bool enable)
+{
+ bool old = c->writethrough;
+
+ if (!old && enable) {
+ qcow2_cache_flush(bs, c);
+ }
+
+ c->writethrough = enable;
+ return old;
+}
diff --git a/qemu-0.15.x/block/qcow2-cluster.c b/qemu-0.15.x/block/qcow2-cluster.c
new file mode 100644
index 0000000..882f50a
--- /dev/null
+++ b/qemu-0.15.x/block/qcow2-cluster.c
@@ -0,0 +1,979 @@
+/*
+ * Block driver for the QCOW version 2 format
+ *
+ * Copyright (c) 2004-2006 Fabrice Bellard
+ *
+ * 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.
+ */
+
+#include <zlib.h>
+
+#include "qemu-common.h"
+#include "block_int.h"
+#include "block/qcow2.h"
+
+int qcow2_grow_l1_table(BlockDriverState *bs, int min_size, bool exact_size)
+{
+ BDRVQcowState *s = bs->opaque;
+ int new_l1_size, new_l1_size2, ret, i;
+ uint64_t *new_l1_table;
+ int64_t new_l1_table_offset;
+ uint8_t data[12];
+
+ if (min_size <= s->l1_size)
+ return 0;
+
+ if (exact_size) {
+ new_l1_size = min_size;
+ } else {
+ /* Bump size up to reduce the number of times we have to grow */
+ new_l1_size = s->l1_size;
+ if (new_l1_size == 0) {
+ new_l1_size = 1;
+ }
+ while (min_size > new_l1_size) {
+ new_l1_size = (new_l1_size * 3 + 1) / 2;
+ }
+ }
+
+#ifdef DEBUG_ALLOC2
+ printf("grow l1_table from %d to %d\n", s->l1_size, new_l1_size);
+#endif
+
+ new_l1_size2 = sizeof(uint64_t) * new_l1_size;
+ new_l1_table = qemu_mallocz(align_offset(new_l1_size2, 512));
+ memcpy(new_l1_table, s->l1_table, s->l1_size * sizeof(uint64_t));
+
+ /* write new table (align to cluster) */
+ BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_ALLOC_TABLE);
+ new_l1_table_offset = qcow2_alloc_clusters(bs, new_l1_size2);
+ if (new_l1_table_offset < 0) {
+ qemu_free(new_l1_table);
+ return new_l1_table_offset;
+ }
+
+ ret = qcow2_cache_flush(bs, s->refcount_block_cache);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_WRITE_TABLE);
+ for(i = 0; i < s->l1_size; i++)
+ new_l1_table[i] = cpu_to_be64(new_l1_table[i]);
+ ret = bdrv_pwrite_sync(bs->file, new_l1_table_offset, new_l1_table, new_l1_size2);
+ if (ret < 0)
+ goto fail;
+ for(i = 0; i < s->l1_size; i++)
+ new_l1_table[i] = be64_to_cpu(new_l1_table[i]);
+
+ /* set new table */
+ BLKDBG_EVENT(bs->file, BLKDBG_L1_GROW_ACTIVATE_TABLE);
+ cpu_to_be32w((uint32_t*)data, new_l1_size);
+ cpu_to_be64wu((uint64_t*)(data + 4), new_l1_table_offset);
+ ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, l1_size), data,sizeof(data));
+ if (ret < 0) {
+ goto fail;
+ }
+ qemu_free(s->l1_table);
+ qcow2_free_clusters(bs, s->l1_table_offset, s->l1_size * sizeof(uint64_t));
+ s->l1_table_offset = new_l1_table_offset;
+ s->l1_table = new_l1_table;
+ s->l1_size = new_l1_size;
+ return 0;
+ fail:
+ qemu_free(new_l1_table);
+ qcow2_free_clusters(bs, new_l1_table_offset, new_l1_size2);
+ return ret;
+}
+
+/*
+ * l2_load
+ *
+ * Loads a L2 table into memory. If the table is in the cache, the cache
+ * is used; otherwise the L2 table is loaded from the image file.
+ *
+ * Returns a pointer to the L2 table on success, or NULL if the read from
+ * the image file failed.
+ */
+
+static int l2_load(BlockDriverState *bs, uint64_t l2_offset,
+ uint64_t **l2_table)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret;
+
+ ret = qcow2_cache_get(bs, s->l2_table_cache, l2_offset, (void**) l2_table);
+
+ return ret;
+}
+
+/*
+ * Writes one sector of the L1 table to the disk (can't update single entries
+ * and we really don't want bdrv_pread to perform a read-modify-write)
+ */
+#define L1_ENTRIES_PER_SECTOR (512 / 8)
+static int write_l1_entry(BlockDriverState *bs, int l1_index)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint64_t buf[L1_ENTRIES_PER_SECTOR];
+ int l1_start_index;
+ int i, ret;
+
+ l1_start_index = l1_index & ~(L1_ENTRIES_PER_SECTOR - 1);
+ for (i = 0; i < L1_ENTRIES_PER_SECTOR; i++) {
+ buf[i] = cpu_to_be64(s->l1_table[l1_start_index + i]);
+ }
+
+ BLKDBG_EVENT(bs->file, BLKDBG_L1_UPDATE);
+ ret = bdrv_pwrite_sync(bs->file, s->l1_table_offset + 8 * l1_start_index,
+ buf, sizeof(buf));
+ if (ret < 0) {
+ return ret;
+ }
+
+ return 0;
+}
+
+/*
+ * l2_allocate
+ *
+ * Allocate a new l2 entry in the file. If l1_index points to an already
+ * used entry in the L2 table (i.e. we are doing a copy on write for the L2
+ * table) copy the contents of the old L2 table into the newly allocated one.
+ * Otherwise the new table is initialized with zeros.
+ *
+ */
+
+static int l2_allocate(BlockDriverState *bs, int l1_index, uint64_t **table)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint64_t old_l2_offset;
+ uint64_t *l2_table;
+ int64_t l2_offset;
+ int ret;
+
+ old_l2_offset = s->l1_table[l1_index];
+
+ /* allocate a new l2 entry */
+
+ l2_offset = qcow2_alloc_clusters(bs, s->l2_size * sizeof(uint64_t));
+ if (l2_offset < 0) {
+ return l2_offset;
+ }
+
+ ret = qcow2_cache_flush(bs, s->refcount_block_cache);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ /* allocate a new entry in the l2 cache */
+
+ ret = qcow2_cache_get_empty(bs, s->l2_table_cache, l2_offset, (void**) table);
+ if (ret < 0) {
+ return ret;
+ }
+
+ l2_table = *table;
+
+ if (old_l2_offset == 0) {
+ /* if there was no old l2 table, clear the new table */
+ memset(l2_table, 0, s->l2_size * sizeof(uint64_t));
+ } else {
+ uint64_t* old_table;
+
+ /* if there was an old l2 table, read it from the disk */
+ BLKDBG_EVENT(bs->file, BLKDBG_L2_ALLOC_COW_READ);
+ ret = qcow2_cache_get(bs, s->l2_table_cache, old_l2_offset,
+ (void**) &old_table);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ memcpy(l2_table, old_table, s->cluster_size);
+
+ ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &old_table);
+ if (ret < 0) {
+ goto fail;
+ }
+ }
+
+ /* write the l2 table to the file */
+ BLKDBG_EVENT(bs->file, BLKDBG_L2_ALLOC_WRITE);
+
+ qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
+ ret = qcow2_cache_flush(bs, s->l2_table_cache);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ /* update the L1 entry */
+ s->l1_table[l1_index] = l2_offset | QCOW_OFLAG_COPIED;
+ ret = write_l1_entry(bs, l1_index);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ *table = l2_table;
+ return 0;
+
+fail:
+ qcow2_cache_put(bs, s->l2_table_cache, (void**) table);
+ s->l1_table[l1_index] = old_l2_offset;
+ return ret;
+}
+
+static int count_contiguous_clusters(uint64_t nb_clusters, int cluster_size,
+ uint64_t *l2_table, uint64_t start, uint64_t mask)
+{
+ int i;
+ uint64_t offset = be64_to_cpu(l2_table[0]) & ~mask;
+
+ if (!offset)
+ return 0;
+
+ for (i = start; i < start + nb_clusters; i++)
+ if (offset + (uint64_t) i * cluster_size != (be64_to_cpu(l2_table[i]) & ~mask))
+ break;
+
+ return (i - start);
+}
+
+static int count_contiguous_free_clusters(uint64_t nb_clusters, uint64_t *l2_table)
+{
+ int i = 0;
+
+ while(nb_clusters-- && l2_table[i] == 0)
+ i++;
+
+ return i;
+}
+
+/* The crypt function is compatible with the linux cryptoloop
+ algorithm for < 4 GB images. NOTE: out_buf == in_buf is
+ supported */
+void qcow2_encrypt_sectors(BDRVQcowState *s, int64_t sector_num,
+ uint8_t *out_buf, const uint8_t *in_buf,
+ int nb_sectors, int enc,
+ const AES_KEY *key)
+{
+ union {
+ uint64_t ll[2];
+ uint8_t b[16];
+ } ivec;
+ int i;
+
+ for(i = 0; i < nb_sectors; i++) {
+ ivec.ll[0] = cpu_to_le64(sector_num);
+ ivec.ll[1] = 0;
+ AES_cbc_encrypt(in_buf, out_buf, 512, key,
+ ivec.b, enc);
+ sector_num++;
+ in_buf += 512;
+ out_buf += 512;
+ }
+}
+
+
+static int qcow2_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret, index_in_cluster, n, n1;
+ uint64_t cluster_offset;
+ struct iovec iov;
+ QEMUIOVector qiov;
+
+ while (nb_sectors > 0) {
+ n = nb_sectors;
+
+ ret = qcow2_get_cluster_offset(bs, sector_num << 9, &n,
+ &cluster_offset);
+ if (ret < 0) {
+ return ret;
+ }
+
+ index_in_cluster = sector_num & (s->cluster_sectors - 1);
+ if (!cluster_offset) {
+ if (bs->backing_hd) {
+ /* read from the base image */
+ iov.iov_base = buf;
+ iov.iov_len = n * 512;
+ qemu_iovec_init_external(&qiov, &iov, 1);
+
+ n1 = qcow2_backing_read1(bs->backing_hd, &qiov, sector_num, n);
+ if (n1 > 0) {
+ BLKDBG_EVENT(bs->file, BLKDBG_READ_BACKING);
+ ret = bdrv_read(bs->backing_hd, sector_num, buf, n1);
+ if (ret < 0)
+ return -1;
+ }
+ } else {
+ memset(buf, 0, 512 * n);
+ }
+ } else if (cluster_offset & QCOW_OFLAG_COMPRESSED) {
+ if (qcow2_decompress_cluster(bs, cluster_offset) < 0)
+ return -1;
+ memcpy(buf, s->cluster_cache + index_in_cluster * 512, 512 * n);
+ } else {
+ BLKDBG_EVENT(bs->file, BLKDBG_READ);
+ ret = bdrv_pread(bs->file, cluster_offset + index_in_cluster * 512, buf, n * 512);
+ if (ret != n * 512)
+ return -1;
+ if (s->crypt_method) {
+ qcow2_encrypt_sectors(s, sector_num, buf, buf, n, 0,
+ &s->aes_decrypt_key);
+ }
+ }
+ nb_sectors -= n;
+ sector_num += n;
+ buf += n * 512;
+ }
+ return 0;
+}
+
+static int copy_sectors(BlockDriverState *bs, uint64_t start_sect,
+ uint64_t cluster_offset, int n_start, int n_end)
+{
+ BDRVQcowState *s = bs->opaque;
+ int n, ret;
+
+ n = n_end - n_start;
+ if (n <= 0)
+ return 0;
+ BLKDBG_EVENT(bs->file, BLKDBG_COW_READ);
+ ret = qcow2_read(bs, start_sect + n_start, s->cluster_data, n);
+ if (ret < 0)
+ return ret;
+ if (s->crypt_method) {
+ qcow2_encrypt_sectors(s, start_sect + n_start,
+ s->cluster_data,
+ s->cluster_data, n, 1,
+ &s->aes_encrypt_key);
+ }
+ BLKDBG_EVENT(bs->file, BLKDBG_COW_WRITE);
+ ret = bdrv_write(bs->file, (cluster_offset >> 9) + n_start,
+ s->cluster_data, n);
+ if (ret < 0)
+ return ret;
+ return 0;
+}
+
+
+/*
+ * get_cluster_offset
+ *
+ * For a given offset of the disk image, find the cluster offset in
+ * qcow2 file. The offset is stored in *cluster_offset.
+ *
+ * on entry, *num is the number of contiguous clusters we'd like to
+ * access following offset.
+ *
+ * on exit, *num is the number of contiguous clusters we can read.
+ *
+ * Return 0, if the offset is found
+ * Return -errno, otherwise.
+ *
+ */
+
+int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset,
+ int *num, uint64_t *cluster_offset)
+{
+ BDRVQcowState *s = bs->opaque;
+ unsigned int l1_index, l2_index;
+ uint64_t l2_offset, *l2_table;
+ int l1_bits, c;
+ unsigned int index_in_cluster, nb_clusters;
+ uint64_t nb_available, nb_needed;
+ int ret;
+
+ index_in_cluster = (offset >> 9) & (s->cluster_sectors - 1);
+ nb_needed = *num + index_in_cluster;
+
+ l1_bits = s->l2_bits + s->cluster_bits;
+
+ /* compute how many bytes there are between the offset and
+ * the end of the l1 entry
+ */
+
+ nb_available = (1ULL << l1_bits) - (offset & ((1ULL << l1_bits) - 1));
+
+ /* compute the number of available sectors */
+
+ nb_available = (nb_available >> 9) + index_in_cluster;
+
+ if (nb_needed > nb_available) {
+ nb_needed = nb_available;
+ }
+
+ *cluster_offset = 0;
+
+ /* seek the the l2 offset in the l1 table */
+
+ l1_index = offset >> l1_bits;
+ if (l1_index >= s->l1_size)
+ goto out;
+
+ l2_offset = s->l1_table[l1_index];
+
+ /* seek the l2 table of the given l2 offset */
+
+ if (!l2_offset)
+ goto out;
+
+ /* load the l2 table in memory */
+
+ l2_offset &= ~QCOW_OFLAG_COPIED;
+ ret = l2_load(bs, l2_offset, &l2_table);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /* find the cluster offset for the given disk offset */
+
+ l2_index = (offset >> s->cluster_bits) & (s->l2_size - 1);
+ *cluster_offset = be64_to_cpu(l2_table[l2_index]);
+ nb_clusters = size_to_clusters(s, nb_needed << 9);
+
+ if (!*cluster_offset) {
+ /* how many empty clusters ? */
+ c = count_contiguous_free_clusters(nb_clusters, &l2_table[l2_index]);
+ } else {
+ /* how many allocated clusters ? */
+ c = count_contiguous_clusters(nb_clusters, s->cluster_size,
+ &l2_table[l2_index], 0, QCOW_OFLAG_COPIED);
+ }
+
+ qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+
+ nb_available = (c * s->cluster_sectors);
+out:
+ if (nb_available > nb_needed)
+ nb_available = nb_needed;
+
+ *num = nb_available - index_in_cluster;
+
+ *cluster_offset &=~QCOW_OFLAG_COPIED;
+ return 0;
+}
+
+/*
+ * get_cluster_table
+ *
+ * for a given disk offset, load (and allocate if needed)
+ * the l2 table.
+ *
+ * the l2 table offset in the qcow2 file and the cluster index
+ * in the l2 table are given to the caller.
+ *
+ * Returns 0 on success, -errno in failure case
+ */
+static int get_cluster_table(BlockDriverState *bs, uint64_t offset,
+ uint64_t **new_l2_table,
+ uint64_t *new_l2_offset,
+ int *new_l2_index)
+{
+ BDRVQcowState *s = bs->opaque;
+ unsigned int l1_index, l2_index;
+ uint64_t l2_offset;
+ uint64_t *l2_table = NULL;
+ int ret;
+
+ /* seek the the l2 offset in the l1 table */
+
+ l1_index = offset >> (s->l2_bits + s->cluster_bits);
+ if (l1_index >= s->l1_size) {
+ ret = qcow2_grow_l1_table(bs, l1_index + 1, false);
+ if (ret < 0) {
+ return ret;
+ }
+ }
+ l2_offset = s->l1_table[l1_index];
+
+ /* seek the l2 table of the given l2 offset */
+
+ if (l2_offset & QCOW_OFLAG_COPIED) {
+ /* load the l2 table in memory */
+ l2_offset &= ~QCOW_OFLAG_COPIED;
+ ret = l2_load(bs, l2_offset, &l2_table);
+ if (ret < 0) {
+ return ret;
+ }
+ } else {
+ /* First allocate a new L2 table (and do COW if needed) */
+ ret = l2_allocate(bs, l1_index, &l2_table);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /* Then decrease the refcount of the old table */
+ if (l2_offset) {
+ qcow2_free_clusters(bs, l2_offset, s->l2_size * sizeof(uint64_t));
+ }
+ l2_offset = s->l1_table[l1_index] & ~QCOW_OFLAG_COPIED;
+ }
+
+ /* find the cluster offset for the given disk offset */
+
+ l2_index = (offset >> s->cluster_bits) & (s->l2_size - 1);
+
+ *new_l2_table = l2_table;
+ *new_l2_offset = l2_offset;
+ *new_l2_index = l2_index;
+
+ return 0;
+}
+
+/*
+ * alloc_compressed_cluster_offset
+ *
+ * For a given offset of the disk image, return cluster offset in
+ * qcow2 file.
+ *
+ * If the offset is not found, allocate a new compressed cluster.
+ *
+ * Return the cluster offset if successful,
+ * Return 0, otherwise.
+ *
+ */
+
+uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
+ uint64_t offset,
+ int compressed_size)
+{
+ BDRVQcowState *s = bs->opaque;
+ int l2_index, ret;
+ uint64_t l2_offset, *l2_table;
+ int64_t cluster_offset;
+ int nb_csectors;
+
+ ret = get_cluster_table(bs, offset, &l2_table, &l2_offset, &l2_index);
+ if (ret < 0) {
+ return 0;
+ }
+
+ cluster_offset = be64_to_cpu(l2_table[l2_index]);
+ if (cluster_offset & QCOW_OFLAG_COPIED)
+ return cluster_offset & ~QCOW_OFLAG_COPIED;
+
+ if (cluster_offset)
+ qcow2_free_any_clusters(bs, cluster_offset, 1);
+
+ cluster_offset = qcow2_alloc_bytes(bs, compressed_size);
+ if (cluster_offset < 0) {
+ qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+ return 0;
+ }
+
+ nb_csectors = ((cluster_offset + compressed_size - 1) >> 9) -
+ (cluster_offset >> 9);
+
+ cluster_offset |= QCOW_OFLAG_COMPRESSED |
+ ((uint64_t)nb_csectors << s->csize_shift);
+
+ /* update L2 table */
+
+ /* compressed clusters never have the copied flag */
+
+ BLKDBG_EVENT(bs->file, BLKDBG_L2_UPDATE_COMPRESSED);
+ qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
+ l2_table[l2_index] = cpu_to_be64(cluster_offset);
+ ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+ if (ret < 0) {
+ return 0;
+ }
+
+ return cluster_offset;
+}
+
+int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m)
+{
+ BDRVQcowState *s = bs->opaque;
+ int i, j = 0, l2_index, ret;
+ uint64_t *old_cluster, start_sect, l2_offset, *l2_table;
+ uint64_t cluster_offset = m->cluster_offset;
+ bool cow = false;
+
+ if (m->nb_clusters == 0)
+ return 0;
+
+ old_cluster = qemu_malloc(m->nb_clusters * sizeof(uint64_t));
+
+ /* copy content of unmodified sectors */
+ start_sect = (m->offset & ~(s->cluster_size - 1)) >> 9;
+ if (m->n_start) {
+ cow = true;
+ ret = copy_sectors(bs, start_sect, cluster_offset, 0, m->n_start);
+ if (ret < 0)
+ goto err;
+ }
+
+ if (m->nb_available & (s->cluster_sectors - 1)) {
+ uint64_t end = m->nb_available & ~(uint64_t)(s->cluster_sectors - 1);
+ cow = true;
+ ret = copy_sectors(bs, start_sect + end, cluster_offset + (end << 9),
+ m->nb_available - end, s->cluster_sectors);
+ if (ret < 0)
+ goto err;
+ }
+
+ /*
+ * Update L2 table.
+ *
+ * Before we update the L2 table to actually point to the new cluster, we
+ * need to be sure that the refcounts have been increased and COW was
+ * handled.
+ */
+ if (cow) {
+ qcow2_cache_depends_on_flush(s->l2_table_cache);
+ }
+
+ qcow2_cache_set_dependency(bs, s->l2_table_cache, s->refcount_block_cache);
+ ret = get_cluster_table(bs, m->offset, &l2_table, &l2_offset, &l2_index);
+ if (ret < 0) {
+ goto err;
+ }
+ qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
+
+ for (i = 0; i < m->nb_clusters; i++) {
+ /* if two concurrent writes happen to the same unallocated cluster
+ * each write allocates separate cluster and writes data concurrently.
+ * The first one to complete updates l2 table with pointer to its
+ * cluster the second one has to do RMW (which is done above by
+ * copy_sectors()), update l2 table with its cluster pointer and free
+ * old cluster. This is what this loop does */
+ if(l2_table[l2_index + i] != 0)
+ old_cluster[j++] = l2_table[l2_index + i];
+
+ l2_table[l2_index + i] = cpu_to_be64((cluster_offset +
+ (i << s->cluster_bits)) | QCOW_OFLAG_COPIED);
+ }
+
+
+ ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+ if (ret < 0) {
+ goto err;
+ }
+
+ /*
+ * If this was a COW, we need to decrease the refcount of the old cluster.
+ * Also flush bs->file to get the right order for L2 and refcount update.
+ */
+ if (j != 0) {
+ for (i = 0; i < j; i++) {
+ qcow2_free_any_clusters(bs,
+ be64_to_cpu(old_cluster[i]) & ~QCOW_OFLAG_COPIED, 1);
+ }
+ }
+
+ ret = 0;
+err:
+ qemu_free(old_cluster);
+ return ret;
+ }
+
+/*
+ * alloc_cluster_offset
+ *
+ * For a given offset of the disk image, return cluster offset in qcow2 file.
+ * If the offset is not found, allocate a new cluster.
+ *
+ * If the cluster was already allocated, m->nb_clusters is set to 0,
+ * m->depends_on is set to NULL and the other fields in m are meaningless.
+ *
+ * If the cluster is newly allocated, m->nb_clusters is set to the number of
+ * contiguous clusters that have been allocated. This may be 0 if the request
+ * conflict with another write request in flight; in this case, m->depends_on
+ * is set and the remaining fields of m are meaningless.
+ *
+ * If m->nb_clusters is non-zero, the other fields of m are valid and contain
+ * information about the first allocated cluster.
+ *
+ * Return 0 on success and -errno in error cases
+ */
+int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset,
+ int n_start, int n_end, int *num, QCowL2Meta *m)
+{
+ BDRVQcowState *s = bs->opaque;
+ int l2_index, ret;
+ uint64_t l2_offset, *l2_table;
+ int64_t cluster_offset;
+ unsigned int nb_clusters, i = 0;
+ QCowL2Meta *old_alloc;
+
+ ret = get_cluster_table(bs, offset, &l2_table, &l2_offset, &l2_index);
+ if (ret < 0) {
+ return ret;
+ }
+
+ nb_clusters = size_to_clusters(s, n_end << 9);
+
+ nb_clusters = MIN(nb_clusters, s->l2_size - l2_index);
+
+ cluster_offset = be64_to_cpu(l2_table[l2_index]);
+
+ /* We keep all QCOW_OFLAG_COPIED clusters */
+
+ if (cluster_offset & QCOW_OFLAG_COPIED) {
+ nb_clusters = count_contiguous_clusters(nb_clusters, s->cluster_size,
+ &l2_table[l2_index], 0, 0);
+
+ cluster_offset &= ~QCOW_OFLAG_COPIED;
+ m->nb_clusters = 0;
+ m->depends_on = NULL;
+
+ goto out;
+ }
+
+ /* for the moment, multiple compressed clusters are not managed */
+
+ if (cluster_offset & QCOW_OFLAG_COMPRESSED)
+ nb_clusters = 1;
+
+ /* how many available clusters ? */
+
+ while (i < nb_clusters) {
+ i += count_contiguous_clusters(nb_clusters - i, s->cluster_size,
+ &l2_table[l2_index], i, 0);
+ if ((i >= nb_clusters) || be64_to_cpu(l2_table[l2_index + i])) {
+ break;
+ }
+
+ i += count_contiguous_free_clusters(nb_clusters - i,
+ &l2_table[l2_index + i]);
+ if (i >= nb_clusters) {
+ break;
+ }
+
+ cluster_offset = be64_to_cpu(l2_table[l2_index + i]);
+
+ if ((cluster_offset & QCOW_OFLAG_COPIED) ||
+ (cluster_offset & QCOW_OFLAG_COMPRESSED))
+ break;
+ }
+ assert(i <= nb_clusters);
+ nb_clusters = i;
+
+ /*
+ * Check if there already is an AIO write request in flight which allocates
+ * the same cluster. In this case we need to wait until the previous
+ * request has completed and updated the L2 table accordingly.
+ */
+ QLIST_FOREACH(old_alloc, &s->cluster_allocs, next_in_flight) {
+
+ uint64_t end_offset = offset + nb_clusters * s->cluster_size;
+ uint64_t old_offset = old_alloc->offset;
+ uint64_t old_end_offset = old_alloc->offset +
+ old_alloc->nb_clusters * s->cluster_size;
+
+ if (end_offset < old_offset || offset > old_end_offset) {
+ /* No intersection */
+ } else {
+ if (offset < old_offset) {
+ /* Stop at the start of a running allocation */
+ nb_clusters = (old_offset - offset) >> s->cluster_bits;
+ } else {
+ nb_clusters = 0;
+ }
+
+ if (nb_clusters == 0) {
+ /* Set dependency and wait for a callback */
+ m->depends_on = old_alloc;
+ m->nb_clusters = 0;
+ *num = 0;
+
+ goto out_wait_dependency;
+ }
+ }
+ }
+
+ if (!nb_clusters) {
+ abort();
+ }
+
+ QLIST_INSERT_HEAD(&s->cluster_allocs, m, next_in_flight);
+
+ /* allocate a new cluster */
+
+ cluster_offset = qcow2_alloc_clusters(bs, nb_clusters * s->cluster_size);
+ if (cluster_offset < 0) {
+ ret = cluster_offset;
+ goto fail;
+ }
+
+ /* save info needed for meta data update */
+ m->offset = offset;
+ m->n_start = n_start;
+ m->nb_clusters = nb_clusters;
+
+out:
+ ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+ if (ret < 0) {
+ goto fail_put;
+ }
+
+ m->nb_available = MIN(nb_clusters << (s->cluster_bits - 9), n_end);
+ m->cluster_offset = cluster_offset;
+
+ *num = m->nb_available - n_start;
+
+ return 0;
+
+out_wait_dependency:
+ return qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+
+fail:
+ qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+fail_put:
+ QLIST_REMOVE(m, next_in_flight);
+ return ret;
+}
+
+static int decompress_buffer(uint8_t *out_buf, int out_buf_size,
+ const uint8_t *buf, int buf_size)
+{
+ z_stream strm1, *strm = &strm1;
+ int ret, out_len;
+
+ memset(strm, 0, sizeof(*strm));
+
+ strm->next_in = (uint8_t *)buf;
+ strm->avail_in = buf_size;
+ strm->next_out = out_buf;
+ strm->avail_out = out_buf_size;
+
+ ret = inflateInit2(strm, -12);
+ if (ret != Z_OK)
+ return -1;
+ ret = inflate(strm, Z_FINISH);
+ out_len = strm->next_out - out_buf;
+ if ((ret != Z_STREAM_END && ret != Z_BUF_ERROR) ||
+ out_len != out_buf_size) {
+ inflateEnd(strm);
+ return -1;
+ }
+ inflateEnd(strm);
+ return 0;
+}
+
+int qcow2_decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret, csize, nb_csectors, sector_offset;
+ uint64_t coffset;
+
+ coffset = cluster_offset & s->cluster_offset_mask;
+ if (s->cluster_cache_offset != coffset) {
+ nb_csectors = ((cluster_offset >> s->csize_shift) & s->csize_mask) + 1;
+ sector_offset = coffset & 511;
+ csize = nb_csectors * 512 - sector_offset;
+ BLKDBG_EVENT(bs->file, BLKDBG_READ_COMPRESSED);
+ ret = bdrv_read(bs->file, coffset >> 9, s->cluster_data, nb_csectors);
+ if (ret < 0) {
+ return ret;
+ }
+ if (decompress_buffer(s->cluster_cache, s->cluster_size,
+ s->cluster_data + sector_offset, csize) < 0) {
+ return -EIO;
+ }
+ s->cluster_cache_offset = coffset;
+ }
+ return 0;
+}
+
+/*
+ * This discards as many clusters of nb_clusters as possible at once (i.e.
+ * all clusters in the same L2 table) and returns the number of discarded
+ * clusters.
+ */
+static int discard_single_l2(BlockDriverState *bs, uint64_t offset,
+ unsigned int nb_clusters)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint64_t l2_offset, *l2_table;
+ int l2_index;
+ int ret;
+ int i;
+
+ ret = get_cluster_table(bs, offset, &l2_table, &l2_offset, &l2_index);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /* Limit nb_clusters to one L2 table */
+ nb_clusters = MIN(nb_clusters, s->l2_size - l2_index);
+
+ for (i = 0; i < nb_clusters; i++) {
+ uint64_t old_offset;
+
+ old_offset = be64_to_cpu(l2_table[l2_index + i]);
+ old_offset &= ~QCOW_OFLAG_COPIED;
+
+ if (old_offset == 0) {
+ continue;
+ }
+
+ /* First remove L2 entries */
+ qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
+ l2_table[l2_index + i] = cpu_to_be64(0);
+
+ /* Then decrease the refcount */
+ qcow2_free_any_clusters(bs, old_offset, 1);
+ }
+
+ ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+ if (ret < 0) {
+ return ret;
+ }
+
+ return nb_clusters;
+}
+
+int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset,
+ int nb_sectors)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint64_t end_offset;
+ unsigned int nb_clusters;
+ int ret;
+
+ end_offset = offset + (nb_sectors << BDRV_SECTOR_BITS);
+
+ /* Round start up and end down */
+ offset = align_offset(offset, s->cluster_size);
+ end_offset &= ~(s->cluster_size - 1);
+
+ if (offset > end_offset) {
+ return 0;
+ }
+
+ nb_clusters = size_to_clusters(s, end_offset - offset);
+
+ /* Each L2 table is handled by its own loop iteration */
+ while (nb_clusters > 0) {
+ ret = discard_single_l2(bs, offset, nb_clusters);
+ if (ret < 0) {
+ return ret;
+ }
+
+ nb_clusters -= ret;
+ offset += (ret * s->cluster_size);
+ }
+
+ return 0;
+}
diff --git a/qemu-0.15.x/block/qcow2-refcount.c b/qemu-0.15.x/block/qcow2-refcount.c
new file mode 100644
index 0000000..14b2f67
--- /dev/null
+++ b/qemu-0.15.x/block/qcow2-refcount.c
@@ -0,0 +1,1185 @@
+/*
+ * Block driver for the QCOW version 2 format
+ *
+ * Copyright (c) 2004-2006 Fabrice Bellard
+ *
+ * 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.
+ */
+
+#include "qemu-common.h"
+#include "block_int.h"
+#include "block/qcow2.h"
+
+static int64_t alloc_clusters_noref(BlockDriverState *bs, int64_t size);
+static int QEMU_WARN_UNUSED_RESULT update_refcount(BlockDriverState *bs,
+ int64_t offset, int64_t length,
+ int addend);
+
+
+/*********************************************************/
+/* refcount handling */
+
+int qcow2_refcount_init(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret, refcount_table_size2, i;
+
+ refcount_table_size2 = s->refcount_table_size * sizeof(uint64_t);
+ s->refcount_table = qemu_malloc(refcount_table_size2);
+ if (s->refcount_table_size > 0) {
+ BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_LOAD);
+ ret = bdrv_pread(bs->file, s->refcount_table_offset,
+ s->refcount_table, refcount_table_size2);
+ if (ret != refcount_table_size2)
+ goto fail;
+ for(i = 0; i < s->refcount_table_size; i++)
+ be64_to_cpus(&s->refcount_table[i]);
+ }
+ return 0;
+ fail:
+ return -ENOMEM;
+}
+
+void qcow2_refcount_close(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ qemu_free(s->refcount_table);
+}
+
+
+static int load_refcount_block(BlockDriverState *bs,
+ int64_t refcount_block_offset,
+ void **refcount_block)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret;
+
+ BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_LOAD);
+ ret = qcow2_cache_get(bs, s->refcount_block_cache, refcount_block_offset,
+ refcount_block);
+
+ return ret;
+}
+
+/*
+ * Returns the refcount of the cluster given by its index. Any non-negative
+ * return value is the refcount of the cluster, negative values are -errno
+ * and indicate an error.
+ */
+static int get_refcount(BlockDriverState *bs, int64_t cluster_index)
+{
+ BDRVQcowState *s = bs->opaque;
+ int refcount_table_index, block_index;
+ int64_t refcount_block_offset;
+ int ret;
+ uint16_t *refcount_block;
+ uint16_t refcount;
+
+ refcount_table_index = cluster_index >> (s->cluster_bits - REFCOUNT_SHIFT);
+ if (refcount_table_index >= s->refcount_table_size)
+ return 0;
+ refcount_block_offset = s->refcount_table[refcount_table_index];
+ if (!refcount_block_offset)
+ return 0;
+
+ ret = qcow2_cache_get(bs, s->refcount_block_cache, refcount_block_offset,
+ (void**) &refcount_block);
+ if (ret < 0) {
+ return ret;
+ }
+
+ block_index = cluster_index &
+ ((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1);
+ refcount = be16_to_cpu(refcount_block[block_index]);
+
+ ret = qcow2_cache_put(bs, s->refcount_block_cache,
+ (void**) &refcount_block);
+ if (ret < 0) {
+ return ret;
+ }
+
+ return refcount;
+}
+
+/*
+ * Rounds the refcount table size up to avoid growing the table for each single
+ * refcount block that is allocated.
+ */
+static unsigned int next_refcount_table_size(BDRVQcowState *s,
+ unsigned int min_size)
+{
+ unsigned int min_clusters = (min_size >> (s->cluster_bits - 3)) + 1;
+ unsigned int refcount_table_clusters =
+ MAX(1, s->refcount_table_size >> (s->cluster_bits - 3));
+
+ while (min_clusters > refcount_table_clusters) {
+ refcount_table_clusters = (refcount_table_clusters * 3 + 1) / 2;
+ }
+
+ return refcount_table_clusters << (s->cluster_bits - 3);
+}
+
+
+/* Checks if two offsets are described by the same refcount block */
+static int in_same_refcount_block(BDRVQcowState *s, uint64_t offset_a,
+ uint64_t offset_b)
+{
+ uint64_t block_a = offset_a >> (2 * s->cluster_bits - REFCOUNT_SHIFT);
+ uint64_t block_b = offset_b >> (2 * s->cluster_bits - REFCOUNT_SHIFT);
+
+ return (block_a == block_b);
+}
+
+/*
+ * Loads a refcount block. If it doesn't exist yet, it is allocated first
+ * (including growing the refcount table if needed).
+ *
+ * Returns 0 on success or -errno in error case
+ */
+static int alloc_refcount_block(BlockDriverState *bs,
+ int64_t cluster_index, uint16_t **refcount_block)
+{
+ BDRVQcowState *s = bs->opaque;
+ unsigned int refcount_table_index;
+ int ret;
+
+ BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC);
+
+ /* Find the refcount block for the given cluster */
+ refcount_table_index = cluster_index >> (s->cluster_bits - REFCOUNT_SHIFT);
+
+ if (refcount_table_index < s->refcount_table_size) {
+
+ uint64_t refcount_block_offset =
+ s->refcount_table[refcount_table_index];
+
+ /* If it's already there, we're done */
+ if (refcount_block_offset) {
+ return load_refcount_block(bs, refcount_block_offset,
+ (void**) refcount_block);
+ }
+ }
+
+ /*
+ * If we came here, we need to allocate something. Something is at least
+ * a cluster for the new refcount block. It may also include a new refcount
+ * table if the old refcount table is too small.
+ *
+ * Note that allocating clusters here needs some special care:
+ *
+ * - We can't use the normal qcow2_alloc_clusters(), it would try to
+ * increase the refcount and very likely we would end up with an endless
+ * recursion. Instead we must place the refcount blocks in a way that
+ * they can describe them themselves.
+ *
+ * - We need to consider that at this point we are inside update_refcounts
+ * and doing the initial refcount increase. This means that some clusters
+ * have already been allocated by the caller, but their refcount isn't
+ * accurate yet. free_cluster_index tells us where this allocation ends
+ * as long as we don't overwrite it by freeing clusters.
+ *
+ * - alloc_clusters_noref and qcow2_free_clusters may load a different
+ * refcount block into the cache
+ */
+
+ *refcount_block = NULL;
+
+ /* We write to the refcount table, so we might depend on L2 tables */
+ qcow2_cache_flush(bs, s->l2_table_cache);
+
+ /* Allocate the refcount block itself and mark it as used */
+ int64_t new_block = alloc_clusters_noref(bs, s->cluster_size);
+ if (new_block < 0) {
+ return new_block;
+ }
+
+#ifdef DEBUG_ALLOC2
+ fprintf(stderr, "qcow2: Allocate refcount block %d for %" PRIx64
+ " at %" PRIx64 "\n",
+ refcount_table_index, cluster_index << s->cluster_bits, new_block);
+#endif
+
+ if (in_same_refcount_block(s, new_block, cluster_index << s->cluster_bits)) {
+ /* Zero the new refcount block before updating it */
+ ret = qcow2_cache_get_empty(bs, s->refcount_block_cache, new_block,
+ (void**) refcount_block);
+ if (ret < 0) {
+ goto fail_block;
+ }
+
+ memset(*refcount_block, 0, s->cluster_size);
+
+ /* The block describes itself, need to update the cache */
+ int block_index = (new_block >> s->cluster_bits) &
+ ((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1);
+ (*refcount_block)[block_index] = cpu_to_be16(1);
+ } else {
+ /* Described somewhere else. This can recurse at most twice before we
+ * arrive at a block that describes itself. */
+ ret = update_refcount(bs, new_block, s->cluster_size, 1);
+ if (ret < 0) {
+ goto fail_block;
+ }
+
+ bdrv_flush(bs->file);
+
+ /* Initialize the new refcount block only after updating its refcount,
+ * update_refcount uses the refcount cache itself */
+ ret = qcow2_cache_get_empty(bs, s->refcount_block_cache, new_block,
+ (void**) refcount_block);
+ if (ret < 0) {
+ goto fail_block;
+ }
+
+ memset(*refcount_block, 0, s->cluster_size);
+ }
+
+ /* Now the new refcount block needs to be written to disk */
+ BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE);
+ qcow2_cache_entry_mark_dirty(s->refcount_block_cache, *refcount_block);
+ ret = qcow2_cache_flush(bs, s->refcount_block_cache);
+ if (ret < 0) {
+ goto fail_block;
+ }
+
+ /* If the refcount table is big enough, just hook the block up there */
+ if (refcount_table_index < s->refcount_table_size) {
+ uint64_t data64 = cpu_to_be64(new_block);
+ BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_HOOKUP);
+ ret = bdrv_pwrite_sync(bs->file,
+ s->refcount_table_offset + refcount_table_index * sizeof(uint64_t),
+ &data64, sizeof(data64));
+ if (ret < 0) {
+ goto fail_block;
+ }
+
+ s->refcount_table[refcount_table_index] = new_block;
+ return 0;
+ }
+
+ ret = qcow2_cache_put(bs, s->refcount_block_cache, (void**) refcount_block);
+ if (ret < 0) {
+ goto fail_block;
+ }
+
+ /*
+ * If we come here, we need to grow the refcount table. Again, a new
+ * refcount table needs some space and we can't simply allocate to avoid
+ * endless recursion.
+ *
+ * Therefore let's grab new refcount blocks at the end of the image, which
+ * will describe themselves and the new refcount table. This way we can
+ * reference them only in the new table and do the switch to the new
+ * refcount table at once without producing an inconsistent state in
+ * between.
+ */
+ BLKDBG_EVENT(bs->file, BLKDBG_REFTABLE_GROW);
+
+ /* Calculate the number of refcount blocks needed so far */
+ uint64_t refcount_block_clusters = 1 << (s->cluster_bits - REFCOUNT_SHIFT);
+ uint64_t blocks_used = (s->free_cluster_index +
+ refcount_block_clusters - 1) / refcount_block_clusters;
+
+ /* And now we need at least one block more for the new metadata */
+ uint64_t table_size = next_refcount_table_size(s, blocks_used + 1);
+ uint64_t last_table_size;
+ uint64_t blocks_clusters;
+ do {
+ uint64_t table_clusters = size_to_clusters(s, table_size);
+ blocks_clusters = 1 +
+ ((table_clusters + refcount_block_clusters - 1)
+ / refcount_block_clusters);
+ uint64_t meta_clusters = table_clusters + blocks_clusters;
+
+ last_table_size = table_size;
+ table_size = next_refcount_table_size(s, blocks_used +
+ ((meta_clusters + refcount_block_clusters - 1)
+ / refcount_block_clusters));
+
+ } while (last_table_size != table_size);
+
+#ifdef DEBUG_ALLOC2
+ fprintf(stderr, "qcow2: Grow refcount table %" PRId32 " => %" PRId64 "\n",
+ s->refcount_table_size, table_size);
+#endif
+
+ /* Create the new refcount table and blocks */
+ uint64_t meta_offset = (blocks_used * refcount_block_clusters) *
+ s->cluster_size;
+ uint64_t table_offset = meta_offset + blocks_clusters * s->cluster_size;
+ uint16_t *new_blocks = qemu_mallocz(blocks_clusters * s->cluster_size);
+ uint64_t *new_table = qemu_mallocz(table_size * sizeof(uint64_t));
+
+ assert(meta_offset >= (s->free_cluster_index * s->cluster_size));
+
+ /* Fill the new refcount table */
+ memcpy(new_table, s->refcount_table,
+ s->refcount_table_size * sizeof(uint64_t));
+ new_table[refcount_table_index] = new_block;
+
+ int i;
+ for (i = 0; i < blocks_clusters; i++) {
+ new_table[blocks_used + i] = meta_offset + (i * s->cluster_size);
+ }
+
+ /* Fill the refcount blocks */
+ uint64_t table_clusters = size_to_clusters(s, table_size * sizeof(uint64_t));
+ int block = 0;
+ for (i = 0; i < table_clusters + blocks_clusters; i++) {
+ new_blocks[block++] = cpu_to_be16(1);
+ }
+
+ /* Write refcount blocks to disk */
+ BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE_BLOCKS);
+ ret = bdrv_pwrite_sync(bs->file, meta_offset, new_blocks,
+ blocks_clusters * s->cluster_size);
+ qemu_free(new_blocks);
+ if (ret < 0) {
+ goto fail_table;
+ }
+
+ /* Write refcount table to disk */
+ for(i = 0; i < table_size; i++) {
+ cpu_to_be64s(&new_table[i]);
+ }
+
+ BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_WRITE_TABLE);
+ ret = bdrv_pwrite_sync(bs->file, table_offset, new_table,
+ table_size * sizeof(uint64_t));
+ if (ret < 0) {
+ goto fail_table;
+ }
+
+ for(i = 0; i < table_size; i++) {
+ cpu_to_be64s(&new_table[i]);
+ }
+
+ /* Hook up the new refcount table in the qcow2 header */
+ uint8_t data[12];
+ cpu_to_be64w((uint64_t*)data, table_offset);
+ cpu_to_be32w((uint32_t*)(data + 8), table_clusters);
+ BLKDBG_EVENT(bs->file, BLKDBG_REFBLOCK_ALLOC_SWITCH_TABLE);
+ ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, refcount_table_offset),
+ data, sizeof(data));
+ if (ret < 0) {
+ goto fail_table;
+ }
+
+ /* And switch it in memory */
+ uint64_t old_table_offset = s->refcount_table_offset;
+ uint64_t old_table_size = s->refcount_table_size;
+
+ qemu_free(s->refcount_table);
+ s->refcount_table = new_table;
+ s->refcount_table_size = table_size;
+ s->refcount_table_offset = table_offset;
+
+ /* Free old table. Remember, we must not change free_cluster_index */
+ uint64_t old_free_cluster_index = s->free_cluster_index;
+ qcow2_free_clusters(bs, old_table_offset, old_table_size * sizeof(uint64_t));
+ s->free_cluster_index = old_free_cluster_index;
+
+ ret = load_refcount_block(bs, new_block, (void**) refcount_block);
+ if (ret < 0) {
+ return ret;
+ }
+
+ return new_block;
+
+fail_table:
+ qemu_free(new_table);
+fail_block:
+ if (*refcount_block != NULL) {
+ qcow2_cache_put(bs, s->refcount_block_cache, (void**) refcount_block);
+ }
+ return ret;
+}
+
+/* XXX: cache several refcount block clusters ? */
+static int QEMU_WARN_UNUSED_RESULT update_refcount(BlockDriverState *bs,
+ int64_t offset, int64_t length, int addend)
+{
+ BDRVQcowState *s = bs->opaque;
+ int64_t start, last, cluster_offset;
+ uint16_t *refcount_block = NULL;
+ int64_t old_table_index = -1;
+ int ret;
+
+#ifdef DEBUG_ALLOC2
+ printf("update_refcount: offset=%" PRId64 " size=%" PRId64 " addend=%d\n",
+ offset, length, addend);
+#endif
+ if (length < 0) {
+ return -EINVAL;
+ } else if (length == 0) {
+ return 0;
+ }
+
+ if (addend < 0) {
+ qcow2_cache_set_dependency(bs, s->refcount_block_cache,
+ s->l2_table_cache);
+ }
+
+ start = offset & ~(s->cluster_size - 1);
+ last = (offset + length - 1) & ~(s->cluster_size - 1);
+ for(cluster_offset = start; cluster_offset <= last;
+ cluster_offset += s->cluster_size)
+ {
+ int block_index, refcount;
+ int64_t cluster_index = cluster_offset >> s->cluster_bits;
+ int64_t table_index =
+ cluster_index >> (s->cluster_bits - REFCOUNT_SHIFT);
+
+ /* Load the refcount block and allocate it if needed */
+ if (table_index != old_table_index) {
+ if (refcount_block) {
+ ret = qcow2_cache_put(bs, s->refcount_block_cache,
+ (void**) &refcount_block);
+ if (ret < 0) {
+ goto fail;
+ }
+ }
+
+ ret = alloc_refcount_block(bs, cluster_index, &refcount_block);
+ if (ret < 0) {
+ goto fail;
+ }
+ }
+ old_table_index = table_index;
+
+ qcow2_cache_entry_mark_dirty(s->refcount_block_cache, refcount_block);
+
+ /* we can update the count and save it */
+ block_index = cluster_index &
+ ((1 << (s->cluster_bits - REFCOUNT_SHIFT)) - 1);
+
+ refcount = be16_to_cpu(refcount_block[block_index]);
+ refcount += addend;
+ if (refcount < 0 || refcount > 0xffff) {
+ ret = -EINVAL;
+ goto fail;
+ }
+ if (refcount == 0 && cluster_index < s->free_cluster_index) {
+ s->free_cluster_index = cluster_index;
+ }
+ refcount_block[block_index] = cpu_to_be16(refcount);
+ }
+
+ ret = 0;
+fail:
+ /* Write last changed block to disk */
+ if (refcount_block) {
+ int wret;
+ wret = qcow2_cache_put(bs, s->refcount_block_cache,
+ (void**) &refcount_block);
+ if (wret < 0) {
+ return ret < 0 ? ret : wret;
+ }
+ }
+
+ /*
+ * Try do undo any updates if an error is returned (This may succeed in
+ * some cases like ENOSPC for allocating a new refcount block)
+ */
+ if (ret < 0) {
+ int dummy;
+ dummy = update_refcount(bs, offset, cluster_offset - offset, -addend);
+ (void)dummy;
+ }
+
+ return ret;
+}
+
+/*
+ * Increases or decreases the refcount of a given cluster by one.
+ * addend must be 1 or -1.
+ *
+ * If the return value is non-negative, it is the new refcount of the cluster.
+ * If it is negative, it is -errno and indicates an error.
+ */
+static int update_cluster_refcount(BlockDriverState *bs,
+ int64_t cluster_index,
+ int addend)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret;
+
+ ret = update_refcount(bs, cluster_index << s->cluster_bits, 1, addend);
+ if (ret < 0) {
+ return ret;
+ }
+
+ bdrv_flush(bs->file);
+
+ return get_refcount(bs, cluster_index);
+}
+
+
+
+/*********************************************************/
+/* cluster allocation functions */
+
+
+
+/* return < 0 if error */
+static int64_t alloc_clusters_noref(BlockDriverState *bs, int64_t size)
+{
+ BDRVQcowState *s = bs->opaque;
+ int i, nb_clusters, refcount;
+
+ nb_clusters = size_to_clusters(s, size);
+retry:
+ for(i = 0; i < nb_clusters; i++) {
+ int64_t next_cluster_index = s->free_cluster_index++;
+ refcount = get_refcount(bs, next_cluster_index);
+
+ if (refcount < 0) {
+ return refcount;
+ } else if (refcount != 0) {
+ goto retry;
+ }
+ }
+#ifdef DEBUG_ALLOC2
+ printf("alloc_clusters: size=%" PRId64 " -> %" PRId64 "\n",
+ size,
+ (s->free_cluster_index - nb_clusters) << s->cluster_bits);
+#endif
+ return (s->free_cluster_index - nb_clusters) << s->cluster_bits;
+}
+
+int64_t qcow2_alloc_clusters(BlockDriverState *bs, int64_t size)
+{
+ int64_t offset;
+ int ret;
+
+ BLKDBG_EVENT(bs->file, BLKDBG_CLUSTER_ALLOC);
+ offset = alloc_clusters_noref(bs, size);
+ if (offset < 0) {
+ return offset;
+ }
+
+ ret = update_refcount(bs, offset, size, 1);
+ if (ret < 0) {
+ return ret;
+ }
+
+ return offset;
+}
+
+/* only used to allocate compressed sectors. We try to allocate
+ contiguous sectors. size must be <= cluster_size */
+int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
+{
+ BDRVQcowState *s = bs->opaque;
+ int64_t offset, cluster_offset;
+ int free_in_cluster;
+
+ BLKDBG_EVENT(bs->file, BLKDBG_CLUSTER_ALLOC_BYTES);
+ assert(size > 0 && size <= s->cluster_size);
+ if (s->free_byte_offset == 0) {
+ s->free_byte_offset = qcow2_alloc_clusters(bs, s->cluster_size);
+ if (s->free_byte_offset < 0) {
+ return s->free_byte_offset;
+ }
+ }
+ redo:
+ free_in_cluster = s->cluster_size -
+ (s->free_byte_offset & (s->cluster_size - 1));
+ if (size <= free_in_cluster) {
+ /* enough space in current cluster */
+ offset = s->free_byte_offset;
+ s->free_byte_offset += size;
+ free_in_cluster -= size;
+ if (free_in_cluster == 0)
+ s->free_byte_offset = 0;
+ if ((offset & (s->cluster_size - 1)) != 0)
+ update_cluster_refcount(bs, offset >> s->cluster_bits, 1);
+ } else {
+ offset = qcow2_alloc_clusters(bs, s->cluster_size);
+ if (offset < 0) {
+ return offset;
+ }
+ cluster_offset = s->free_byte_offset & ~(s->cluster_size - 1);
+ if ((cluster_offset + s->cluster_size) == offset) {
+ /* we are lucky: contiguous data */
+ offset = s->free_byte_offset;
+ update_cluster_refcount(bs, offset >> s->cluster_bits, 1);
+ s->free_byte_offset += size;
+ } else {
+ s->free_byte_offset = offset;
+ goto redo;
+ }
+ }
+
+ bdrv_flush(bs->file);
+ return offset;
+}
+
+void qcow2_free_clusters(BlockDriverState *bs,
+ int64_t offset, int64_t size)
+{
+ int ret;
+
+ BLKDBG_EVENT(bs->file, BLKDBG_CLUSTER_FREE);
+ ret = update_refcount(bs, offset, size, -1);
+ if (ret < 0) {
+ fprintf(stderr, "qcow2_free_clusters failed: %s\n", strerror(-ret));
+ /* TODO Remember the clusters to free them later and avoid leaking */
+ }
+}
+
+/*
+ * free_any_clusters
+ *
+ * free clusters according to its type: compressed or not
+ *
+ */
+
+void qcow2_free_any_clusters(BlockDriverState *bs,
+ uint64_t cluster_offset, int nb_clusters)
+{
+ BDRVQcowState *s = bs->opaque;
+
+ /* free the cluster */
+
+ if (cluster_offset & QCOW_OFLAG_COMPRESSED) {
+ int nb_csectors;
+ nb_csectors = ((cluster_offset >> s->csize_shift) &
+ s->csize_mask) + 1;
+ qcow2_free_clusters(bs,
+ (cluster_offset & s->cluster_offset_mask) & ~511,
+ nb_csectors * 512);
+ return;
+ }
+
+ qcow2_free_clusters(bs, cluster_offset, nb_clusters << s->cluster_bits);
+
+ return;
+}
+
+
+
+/*********************************************************/
+/* snapshots and image creation */
+
+
+
+void qcow2_create_refcount_update(QCowCreateState *s, int64_t offset,
+ int64_t size)
+{
+ int refcount;
+ int64_t start, last, cluster_offset;
+ uint16_t *p;
+
+ start = offset & ~(s->cluster_size - 1);
+ last = (offset + size - 1) & ~(s->cluster_size - 1);
+ for(cluster_offset = start; cluster_offset <= last;
+ cluster_offset += s->cluster_size) {
+ p = &s->refcount_block[cluster_offset >> s->cluster_bits];
+ refcount = be16_to_cpu(*p);
+ refcount++;
+ *p = cpu_to_be16(refcount);
+ }
+}
+
+/* update the refcounts of snapshots and the copied flag */
+int qcow2_update_snapshot_refcount(BlockDriverState *bs,
+ int64_t l1_table_offset, int l1_size, int addend)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint64_t *l1_table, *l2_table, l2_offset, offset, l1_size2, l1_allocated;
+ int64_t old_offset, old_l2_offset;
+ int i, j, l1_modified = 0, nb_csectors, refcount;
+ int ret;
+ bool old_l2_writethrough, old_refcount_writethrough;
+
+ /* Switch caches to writeback mode during update */
+ old_l2_writethrough =
+ qcow2_cache_set_writethrough(bs, s->l2_table_cache, false);
+ old_refcount_writethrough =
+ qcow2_cache_set_writethrough(bs, s->refcount_block_cache, false);
+
+ l2_table = NULL;
+ l1_table = NULL;
+ l1_size2 = l1_size * sizeof(uint64_t);
+ if (l1_table_offset != s->l1_table_offset) {
+ if (l1_size2 != 0) {
+ l1_table = qemu_mallocz(align_offset(l1_size2, 512));
+ } else {
+ l1_table = NULL;
+ }
+ l1_allocated = 1;
+ if (bdrv_pread(bs->file, l1_table_offset,
+ l1_table, l1_size2) != l1_size2)
+ {
+ ret = -EIO;
+ goto fail;
+ }
+
+ for(i = 0;i < l1_size; i++)
+ be64_to_cpus(&l1_table[i]);
+ } else {
+ assert(l1_size == s->l1_size);
+ l1_table = s->l1_table;
+ l1_allocated = 0;
+ }
+
+ for(i = 0; i < l1_size; i++) {
+ l2_offset = l1_table[i];
+ if (l2_offset) {
+ old_l2_offset = l2_offset;
+ l2_offset &= ~QCOW_OFLAG_COPIED;
+
+ ret = qcow2_cache_get(bs, s->l2_table_cache, l2_offset,
+ (void**) &l2_table);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ for(j = 0; j < s->l2_size; j++) {
+ offset = be64_to_cpu(l2_table[j]);
+ if (offset != 0) {
+ old_offset = offset;
+ offset &= ~QCOW_OFLAG_COPIED;
+ if (offset & QCOW_OFLAG_COMPRESSED) {
+ nb_csectors = ((offset >> s->csize_shift) &
+ s->csize_mask) + 1;
+ if (addend != 0) {
+ int ret;
+ ret = update_refcount(bs,
+ (offset & s->cluster_offset_mask) & ~511,
+ nb_csectors * 512, addend);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ /* TODO Flushing once for the whole function should
+ * be enough */
+ bdrv_flush(bs->file);
+ }
+ /* compressed clusters are never modified */
+ refcount = 2;
+ } else {
+ if (addend != 0) {
+ refcount = update_cluster_refcount(bs, offset >> s->cluster_bits, addend);
+ } else {
+ refcount = get_refcount(bs, offset >> s->cluster_bits);
+ }
+
+ if (refcount < 0) {
+ ret = -EIO;
+ goto fail;
+ }
+ }
+
+ if (refcount == 1) {
+ offset |= QCOW_OFLAG_COPIED;
+ }
+ if (offset != old_offset) {
+ if (addend > 0) {
+ qcow2_cache_set_dependency(bs, s->l2_table_cache,
+ s->refcount_block_cache);
+ }
+ l2_table[j] = cpu_to_be64(offset);
+ qcow2_cache_entry_mark_dirty(s->l2_table_cache, l2_table);
+ }
+ }
+ }
+
+ ret = qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+ if (ret < 0) {
+ goto fail;
+ }
+
+
+ if (addend != 0) {
+ refcount = update_cluster_refcount(bs, l2_offset >> s->cluster_bits, addend);
+ } else {
+ refcount = get_refcount(bs, l2_offset >> s->cluster_bits);
+ }
+ if (refcount < 0) {
+ ret = -EIO;
+ goto fail;
+ } else if (refcount == 1) {
+ l2_offset |= QCOW_OFLAG_COPIED;
+ }
+ if (l2_offset != old_l2_offset) {
+ l1_table[i] = l2_offset;
+ l1_modified = 1;
+ }
+ }
+ }
+
+ ret = 0;
+fail:
+ if (l2_table) {
+ qcow2_cache_put(bs, s->l2_table_cache, (void**) &l2_table);
+ }
+
+ /* Enable writethrough cache mode again */
+ qcow2_cache_set_writethrough(bs, s->l2_table_cache, old_l2_writethrough);
+ qcow2_cache_set_writethrough(bs, s->refcount_block_cache,
+ old_refcount_writethrough);
+
+ if (l1_modified) {
+ for(i = 0; i < l1_size; i++)
+ cpu_to_be64s(&l1_table[i]);
+ if (bdrv_pwrite_sync(bs->file, l1_table_offset, l1_table,
+ l1_size2) < 0)
+ goto fail;
+ for(i = 0; i < l1_size; i++)
+ be64_to_cpus(&l1_table[i]);
+ }
+ if (l1_allocated)
+ qemu_free(l1_table);
+ return ret;
+}
+
+
+
+
+/*********************************************************/
+/* refcount checking functions */
+
+
+
+/*
+ * Increases the refcount for a range of clusters in a given refcount table.
+ * This is used to construct a temporary refcount table out of L1 and L2 tables
+ * which can be compared the the refcount table saved in the image.
+ *
+ * Modifies the number of errors in res.
+ */
+static void inc_refcounts(BlockDriverState *bs,
+ BdrvCheckResult *res,
+ uint16_t *refcount_table,
+ int refcount_table_size,
+ int64_t offset, int64_t size)
+{
+ BDRVQcowState *s = bs->opaque;
+ int64_t start, last, cluster_offset;
+ int k;
+
+ if (size <= 0)
+ return;
+
+ start = offset & ~(s->cluster_size - 1);
+ last = (offset + size - 1) & ~(s->cluster_size - 1);
+ for(cluster_offset = start; cluster_offset <= last;
+ cluster_offset += s->cluster_size) {
+ k = cluster_offset >> s->cluster_bits;
+ if (k < 0) {
+ fprintf(stderr, "ERROR: invalid cluster offset=0x%" PRIx64 "\n",
+ cluster_offset);
+ res->corruptions++;
+ } else if (k >= refcount_table_size) {
+ fprintf(stderr, "Warning: cluster offset=0x%" PRIx64 " is after "
+ "the end of the image file, can't properly check refcounts.\n",
+ cluster_offset);
+ res->check_errors++;
+ } else {
+ if (++refcount_table[k] == 0) {
+ fprintf(stderr, "ERROR: overflow cluster offset=0x%" PRIx64
+ "\n", cluster_offset);
+ res->corruptions++;
+ }
+ }
+ }
+}
+
+/*
+ * Increases the refcount in the given refcount table for the all clusters
+ * referenced in the L2 table. While doing so, performs some checks on L2
+ * entries.
+ *
+ * Returns the number of errors found by the checks or -errno if an internal
+ * error occurred.
+ */
+static int check_refcounts_l2(BlockDriverState *bs, BdrvCheckResult *res,
+ uint16_t *refcount_table, int refcount_table_size, int64_t l2_offset,
+ int check_copied)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint64_t *l2_table, offset;
+ int i, l2_size, nb_csectors, refcount;
+
+ /* Read L2 table from disk */
+ l2_size = s->l2_size * sizeof(uint64_t);
+ l2_table = qemu_malloc(l2_size);
+
+ if (bdrv_pread(bs->file, l2_offset, l2_table, l2_size) != l2_size)
+ goto fail;
+
+ /* Do the actual checks */
+ for(i = 0; i < s->l2_size; i++) {
+ offset = be64_to_cpu(l2_table[i]);
+ if (offset != 0) {
+ if (offset & QCOW_OFLAG_COMPRESSED) {
+ /* Compressed clusters don't have QCOW_OFLAG_COPIED */
+ if (offset & QCOW_OFLAG_COPIED) {
+ fprintf(stderr, "ERROR: cluster %" PRId64 ": "
+ "copied flag must never be set for compressed "
+ "clusters\n", offset >> s->cluster_bits);
+ offset &= ~QCOW_OFLAG_COPIED;
+ res->corruptions++;
+ }
+
+ /* Mark cluster as used */
+ nb_csectors = ((offset >> s->csize_shift) &
+ s->csize_mask) + 1;
+ offset &= s->cluster_offset_mask;
+ inc_refcounts(bs, res, refcount_table, refcount_table_size,
+ offset & ~511, nb_csectors * 512);
+ } else {
+ /* QCOW_OFLAG_COPIED must be set iff refcount == 1 */
+ if (check_copied) {
+ uint64_t entry = offset;
+ offset &= ~QCOW_OFLAG_COPIED;
+ refcount = get_refcount(bs, offset >> s->cluster_bits);
+ if (refcount < 0) {
+ fprintf(stderr, "Can't get refcount for offset %"
+ PRIx64 ": %s\n", entry, strerror(-refcount));
+ goto fail;
+ }
+ if ((refcount == 1) != ((entry & QCOW_OFLAG_COPIED) != 0)) {
+ fprintf(stderr, "ERROR OFLAG_COPIED: offset=%"
+ PRIx64 " refcount=%d\n", entry, refcount);
+ res->corruptions++;
+ }
+ }
+
+ /* Mark cluster as used */
+ offset &= ~QCOW_OFLAG_COPIED;
+ inc_refcounts(bs, res, refcount_table,refcount_table_size,
+ offset, s->cluster_size);
+
+ /* Correct offsets are cluster aligned */
+ if (offset & (s->cluster_size - 1)) {
+ fprintf(stderr, "ERROR offset=%" PRIx64 ": Cluster is not "
+ "properly aligned; L2 entry corrupted.\n", offset);
+ res->corruptions++;
+ }
+ }
+ }
+ }
+
+ qemu_free(l2_table);
+ return 0;
+
+fail:
+ fprintf(stderr, "ERROR: I/O error in check_refcounts_l2\n");
+ qemu_free(l2_table);
+ return -EIO;
+}
+
+/*
+ * Increases the refcount for the L1 table, its L2 tables and all referenced
+ * clusters in the given refcount table. While doing so, performs some checks
+ * on L1 and L2 entries.
+ *
+ * Returns the number of errors found by the checks or -errno if an internal
+ * error occurred.
+ */
+static int check_refcounts_l1(BlockDriverState *bs,
+ BdrvCheckResult *res,
+ uint16_t *refcount_table,
+ int refcount_table_size,
+ int64_t l1_table_offset, int l1_size,
+ int check_copied)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint64_t *l1_table, l2_offset, l1_size2;
+ int i, refcount, ret;
+
+ l1_size2 = l1_size * sizeof(uint64_t);
+
+ /* Mark L1 table as used */
+ inc_refcounts(bs, res, refcount_table, refcount_table_size,
+ l1_table_offset, l1_size2);
+
+ /* Read L1 table entries from disk */
+ if (l1_size2 == 0) {
+ l1_table = NULL;
+ } else {
+ l1_table = qemu_malloc(l1_size2);
+ if (bdrv_pread(bs->file, l1_table_offset,
+ l1_table, l1_size2) != l1_size2)
+ goto fail;
+ for(i = 0;i < l1_size; i++)
+ be64_to_cpus(&l1_table[i]);
+ }
+
+ /* Do the actual checks */
+ for(i = 0; i < l1_size; i++) {
+ l2_offset = l1_table[i];
+ if (l2_offset) {
+ /* QCOW_OFLAG_COPIED must be set iff refcount == 1 */
+ if (check_copied) {
+ refcount = get_refcount(bs, (l2_offset & ~QCOW_OFLAG_COPIED)
+ >> s->cluster_bits);
+ if (refcount < 0) {
+ fprintf(stderr, "Can't get refcount for l2_offset %"
+ PRIx64 ": %s\n", l2_offset, strerror(-refcount));
+ goto fail;
+ }
+ if ((refcount == 1) != ((l2_offset & QCOW_OFLAG_COPIED) != 0)) {
+ fprintf(stderr, "ERROR OFLAG_COPIED: l2_offset=%" PRIx64
+ " refcount=%d\n", l2_offset, refcount);
+ res->corruptions++;
+ }
+ }
+
+ /* Mark L2 table as used */
+ l2_offset &= ~QCOW_OFLAG_COPIED;
+ inc_refcounts(bs, res, refcount_table, refcount_table_size,
+ l2_offset, s->cluster_size);
+
+ /* L2 tables are cluster aligned */
+ if (l2_offset & (s->cluster_size - 1)) {
+ fprintf(stderr, "ERROR l2_offset=%" PRIx64 ": Table is not "
+ "cluster aligned; L1 entry corrupted\n", l2_offset);
+ res->corruptions++;
+ }
+
+ /* Process and check L2 entries */
+ ret = check_refcounts_l2(bs, res, refcount_table,
+ refcount_table_size, l2_offset, check_copied);
+ if (ret < 0) {
+ goto fail;
+ }
+ }
+ }
+ qemu_free(l1_table);
+ return 0;
+
+fail:
+ fprintf(stderr, "ERROR: I/O error in check_refcounts_l1\n");
+ res->check_errors++;
+ qemu_free(l1_table);
+ return -EIO;
+}
+
+/*
+ * Checks an image for refcount consistency.
+ *
+ * Returns 0 if no errors are found, the number of errors in case the image is
+ * detected as corrupted, and -errno when an internal error occurred.
+ */
+int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res)
+{
+ BDRVQcowState *s = bs->opaque;
+ int64_t size;
+ int nb_clusters, refcount1, refcount2, i;
+ QCowSnapshot *sn;
+ uint16_t *refcount_table;
+ int ret;
+
+ size = bdrv_getlength(bs->file);
+ nb_clusters = size_to_clusters(s, size);
+ refcount_table = qemu_mallocz(nb_clusters * sizeof(uint16_t));
+
+ /* header */
+ inc_refcounts(bs, res, refcount_table, nb_clusters,
+ 0, s->cluster_size);
+
+ /* current L1 table */
+ ret = check_refcounts_l1(bs, res, refcount_table, nb_clusters,
+ s->l1_table_offset, s->l1_size, 1);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ /* snapshots */
+ for(i = 0; i < s->nb_snapshots; i++) {
+ sn = s->snapshots + i;
+ ret = check_refcounts_l1(bs, res, refcount_table, nb_clusters,
+ sn->l1_table_offset, sn->l1_size, 0);
+ if (ret < 0) {
+ goto fail;
+ }
+ }
+ inc_refcounts(bs, res, refcount_table, nb_clusters,
+ s->snapshots_offset, s->snapshots_size);
+
+ /* refcount data */
+ inc_refcounts(bs, res, refcount_table, nb_clusters,
+ s->refcount_table_offset,
+ s->refcount_table_size * sizeof(uint64_t));
+
+ for(i = 0; i < s->refcount_table_size; i++) {
+ uint64_t offset, cluster;
+ offset = s->refcount_table[i];
+ cluster = offset >> s->cluster_bits;
+
+ /* Refcount blocks are cluster aligned */
+ if (offset & (s->cluster_size - 1)) {
+ fprintf(stderr, "ERROR refcount block %d is not "
+ "cluster aligned; refcount table entry corrupted\n", i);
+ res->corruptions++;
+ continue;
+ }
+
+ if (cluster >= nb_clusters) {
+ fprintf(stderr, "ERROR refcount block %d is outside image\n", i);
+ res->corruptions++;
+ continue;
+ }
+
+ if (offset != 0) {
+ inc_refcounts(bs, res, refcount_table, nb_clusters,
+ offset, s->cluster_size);
+ if (refcount_table[cluster] != 1) {
+ fprintf(stderr, "ERROR refcount block %d refcount=%d\n",
+ i, refcount_table[cluster]);
+ res->corruptions++;
+ }
+ }
+ }
+
+ /* compare ref counts */
+ for(i = 0; i < nb_clusters; i++) {
+ refcount1 = get_refcount(bs, i);
+ if (refcount1 < 0) {
+ fprintf(stderr, "Can't get refcount for cluster %d: %s\n",
+ i, strerror(-refcount1));
+ res->check_errors++;
+ continue;
+ }
+
+ refcount2 = refcount_table[i];
+ if (refcount1 != refcount2) {
+ fprintf(stderr, "%s cluster %d refcount=%d reference=%d\n",
+ refcount1 < refcount2 ? "ERROR" : "Leaked",
+ i, refcount1, refcount2);
+ if (refcount1 < refcount2) {
+ res->corruptions++;
+ } else {
+ res->leaks++;
+ }
+ }
+ }
+
+ ret = 0;
+
+fail:
+ qemu_free(refcount_table);
+
+ return ret;
+}
+
diff --git a/qemu-0.15.x/block/qcow2-snapshot.c b/qemu-0.15.x/block/qcow2-snapshot.c
new file mode 100644
index 0000000..e32bcf0
--- /dev/null
+++ b/qemu-0.15.x/block/qcow2-snapshot.c
@@ -0,0 +1,457 @@
+/*
+ * Block driver for the QCOW version 2 format
+ *
+ * Copyright (c) 2004-2006 Fabrice Bellard
+ *
+ * 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.
+ */
+
+#include "qemu-common.h"
+#include "block_int.h"
+#include "block/qcow2.h"
+
+typedef struct __attribute__((packed)) QCowSnapshotHeader {
+ /* header is 8 byte aligned */
+ uint64_t l1_table_offset;
+
+ uint32_t l1_size;
+ uint16_t id_str_size;
+ uint16_t name_size;
+
+ uint32_t date_sec;
+ uint32_t date_nsec;
+
+ uint64_t vm_clock_nsec;
+
+ uint32_t vm_state_size;
+ uint32_t extra_data_size; /* for extension */
+ /* extra data follows */
+ /* id_str follows */
+ /* name follows */
+} QCowSnapshotHeader;
+
+void qcow2_free_snapshots(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ int i;
+
+ for(i = 0; i < s->nb_snapshots; i++) {
+ qemu_free(s->snapshots[i].name);
+ qemu_free(s->snapshots[i].id_str);
+ }
+ qemu_free(s->snapshots);
+ s->snapshots = NULL;
+ s->nb_snapshots = 0;
+}
+
+int qcow2_read_snapshots(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ QCowSnapshotHeader h;
+ QCowSnapshot *sn;
+ int i, id_str_size, name_size;
+ int64_t offset;
+ uint32_t extra_data_size;
+
+ if (!s->nb_snapshots) {
+ s->snapshots = NULL;
+ s->snapshots_size = 0;
+ return 0;
+ }
+
+ offset = s->snapshots_offset;
+ s->snapshots = qemu_mallocz(s->nb_snapshots * sizeof(QCowSnapshot));
+ for(i = 0; i < s->nb_snapshots; i++) {
+ offset = align_offset(offset, 8);
+ if (bdrv_pread(bs->file, offset, &h, sizeof(h)) != sizeof(h))
+ goto fail;
+ offset += sizeof(h);
+ sn = s->snapshots + i;
+ sn->l1_table_offset = be64_to_cpu(h.l1_table_offset);
+ sn->l1_size = be32_to_cpu(h.l1_size);
+ sn->vm_state_size = be32_to_cpu(h.vm_state_size);
+ sn->date_sec = be32_to_cpu(h.date_sec);
+ sn->date_nsec = be32_to_cpu(h.date_nsec);
+ sn->vm_clock_nsec = be64_to_cpu(h.vm_clock_nsec);
+ extra_data_size = be32_to_cpu(h.extra_data_size);
+
+ id_str_size = be16_to_cpu(h.id_str_size);
+ name_size = be16_to_cpu(h.name_size);
+
+ offset += extra_data_size;
+
+ sn->id_str = qemu_malloc(id_str_size + 1);
+ if (bdrv_pread(bs->file, offset, sn->id_str, id_str_size) != id_str_size)
+ goto fail;
+ offset += id_str_size;
+ sn->id_str[id_str_size] = '\0';
+
+ sn->name = qemu_malloc(name_size + 1);
+ if (bdrv_pread(bs->file, offset, sn->name, name_size) != name_size)
+ goto fail;
+ offset += name_size;
+ sn->name[name_size] = '\0';
+ }
+ s->snapshots_size = offset - s->snapshots_offset;
+ return 0;
+ fail:
+ qcow2_free_snapshots(bs);
+ return -1;
+}
+
+/* add at the end of the file a new list of snapshots */
+static int qcow2_write_snapshots(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ QCowSnapshot *sn;
+ QCowSnapshotHeader h;
+ int i, name_size, id_str_size, snapshots_size;
+ uint64_t data64;
+ uint32_t data32;
+ int64_t offset, snapshots_offset;
+
+ /* compute the size of the snapshots */
+ offset = 0;
+ for(i = 0; i < s->nb_snapshots; i++) {
+ sn = s->snapshots + i;
+ offset = align_offset(offset, 8);
+ offset += sizeof(h);
+ offset += strlen(sn->id_str);
+ offset += strlen(sn->name);
+ }
+ snapshots_size = offset;
+
+ snapshots_offset = qcow2_alloc_clusters(bs, snapshots_size);
+ bdrv_flush(bs->file);
+ offset = snapshots_offset;
+ if (offset < 0) {
+ return offset;
+ }
+
+ for(i = 0; i < s->nb_snapshots; i++) {
+ sn = s->snapshots + i;
+ memset(&h, 0, sizeof(h));
+ h.l1_table_offset = cpu_to_be64(sn->l1_table_offset);
+ h.l1_size = cpu_to_be32(sn->l1_size);
+ h.vm_state_size = cpu_to_be32(sn->vm_state_size);
+ h.date_sec = cpu_to_be32(sn->date_sec);
+ h.date_nsec = cpu_to_be32(sn->date_nsec);
+ h.vm_clock_nsec = cpu_to_be64(sn->vm_clock_nsec);
+
+ id_str_size = strlen(sn->id_str);
+ name_size = strlen(sn->name);
+ h.id_str_size = cpu_to_be16(id_str_size);
+ h.name_size = cpu_to_be16(name_size);
+ offset = align_offset(offset, 8);
+ if (bdrv_pwrite_sync(bs->file, offset, &h, sizeof(h)) < 0)
+ goto fail;
+ offset += sizeof(h);
+ if (bdrv_pwrite_sync(bs->file, offset, sn->id_str, id_str_size) < 0)
+ goto fail;
+ offset += id_str_size;
+ if (bdrv_pwrite_sync(bs->file, offset, sn->name, name_size) < 0)
+ goto fail;
+ offset += name_size;
+ }
+
+ /* update the various header fields */
+ data64 = cpu_to_be64(snapshots_offset);
+ if (bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, snapshots_offset),
+ &data64, sizeof(data64)) < 0)
+ goto fail;
+ data32 = cpu_to_be32(s->nb_snapshots);
+ if (bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, nb_snapshots),
+ &data32, sizeof(data32)) < 0)
+ goto fail;
+
+ /* free the old snapshot table */
+ qcow2_free_clusters(bs, s->snapshots_offset, s->snapshots_size);
+ s->snapshots_offset = snapshots_offset;
+ s->snapshots_size = snapshots_size;
+ return 0;
+ fail:
+ return -1;
+}
+
+static void find_new_snapshot_id(BlockDriverState *bs,
+ char *id_str, int id_str_size)
+{
+ BDRVQcowState *s = bs->opaque;
+ QCowSnapshot *sn;
+ int i, id, id_max = 0;
+
+ for(i = 0; i < s->nb_snapshots; i++) {
+ sn = s->snapshots + i;
+ id = strtoul(sn->id_str, NULL, 10);
+ if (id > id_max)
+ id_max = id;
+ }
+ snprintf(id_str, id_str_size, "%d", id_max + 1);
+}
+
+static int find_snapshot_by_id(BlockDriverState *bs, const char *id_str)
+{
+ BDRVQcowState *s = bs->opaque;
+ int i;
+
+ for(i = 0; i < s->nb_snapshots; i++) {
+ if (!strcmp(s->snapshots[i].id_str, id_str))
+ return i;
+ }
+ return -1;
+}
+
+static int find_snapshot_by_id_or_name(BlockDriverState *bs, const char *name)
+{
+ BDRVQcowState *s = bs->opaque;
+ int i, ret;
+
+ ret = find_snapshot_by_id(bs, name);
+ if (ret >= 0)
+ return ret;
+ for(i = 0; i < s->nb_snapshots; i++) {
+ if (!strcmp(s->snapshots[i].name, name))
+ return i;
+ }
+ return -1;
+}
+
+/* if no id is provided, a new one is constructed */
+int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
+{
+ BDRVQcowState *s = bs->opaque;
+ QCowSnapshot *snapshots1, sn1, *sn = &sn1;
+ int i, ret;
+ uint64_t *l1_table = NULL;
+ int64_t l1_table_offset;
+
+ memset(sn, 0, sizeof(*sn));
+
+ if (sn_info->id_str[0] == '\0') {
+ /* compute a new id */
+ find_new_snapshot_id(bs, sn_info->id_str, sizeof(sn_info->id_str));
+ }
+
+ /* check that the ID is unique */
+ if (find_snapshot_by_id(bs, sn_info->id_str) >= 0)
+ return -ENOENT;
+
+ sn->id_str = qemu_strdup(sn_info->id_str);
+ if (!sn->id_str)
+ goto fail;
+ sn->name = qemu_strdup(sn_info->name);
+ if (!sn->name)
+ goto fail;
+ sn->vm_state_size = sn_info->vm_state_size;
+ sn->date_sec = sn_info->date_sec;
+ sn->date_nsec = sn_info->date_nsec;
+ sn->vm_clock_nsec = sn_info->vm_clock_nsec;
+
+ ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 1);
+ if (ret < 0)
+ goto fail;
+
+ /* create the L1 table of the snapshot */
+ l1_table_offset = qcow2_alloc_clusters(bs, s->l1_size * sizeof(uint64_t));
+ if (l1_table_offset < 0) {
+ goto fail;
+ }
+ bdrv_flush(bs->file);
+
+ sn->l1_table_offset = l1_table_offset;
+ sn->l1_size = s->l1_size;
+
+ if (s->l1_size != 0) {
+ l1_table = qemu_malloc(s->l1_size * sizeof(uint64_t));
+ } else {
+ l1_table = NULL;
+ }
+
+ for(i = 0; i < s->l1_size; i++) {
+ l1_table[i] = cpu_to_be64(s->l1_table[i]);
+ }
+ if (bdrv_pwrite_sync(bs->file, sn->l1_table_offset,
+ l1_table, s->l1_size * sizeof(uint64_t)) < 0)
+ goto fail;
+ qemu_free(l1_table);
+ l1_table = NULL;
+
+ snapshots1 = qemu_malloc((s->nb_snapshots + 1) * sizeof(QCowSnapshot));
+ if (s->snapshots) {
+ memcpy(snapshots1, s->snapshots, s->nb_snapshots * sizeof(QCowSnapshot));
+ qemu_free(s->snapshots);
+ }
+ s->snapshots = snapshots1;
+ s->snapshots[s->nb_snapshots++] = *sn;
+
+ if (qcow2_write_snapshots(bs) < 0)
+ goto fail;
+#ifdef DEBUG_ALLOC
+ qcow2_check_refcounts(bs);
+#endif
+ return 0;
+ fail:
+ qemu_free(sn->name);
+ qemu_free(l1_table);
+ return -1;
+}
+
+/* copy the snapshot 'snapshot_name' into the current disk image */
+int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id)
+{
+ BDRVQcowState *s = bs->opaque;
+ QCowSnapshot *sn;
+ int i, snapshot_index;
+ int cur_l1_bytes, sn_l1_bytes;
+
+ snapshot_index = find_snapshot_by_id_or_name(bs, snapshot_id);
+ if (snapshot_index < 0)
+ return -ENOENT;
+ sn = &s->snapshots[snapshot_index];
+
+ if (qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, -1) < 0)
+ goto fail;
+
+ if (qcow2_grow_l1_table(bs, sn->l1_size, true) < 0)
+ goto fail;
+
+ cur_l1_bytes = s->l1_size * sizeof(uint64_t);
+ sn_l1_bytes = sn->l1_size * sizeof(uint64_t);
+
+ if (cur_l1_bytes > sn_l1_bytes) {
+ memset(s->l1_table + sn->l1_size, 0, cur_l1_bytes - sn_l1_bytes);
+ }
+
+ /* copy the snapshot l1 table to the current l1 table */
+ if (bdrv_pread(bs->file, sn->l1_table_offset,
+ s->l1_table, sn_l1_bytes) < 0)
+ goto fail;
+ if (bdrv_pwrite_sync(bs->file, s->l1_table_offset,
+ s->l1_table, cur_l1_bytes) < 0)
+ goto fail;
+ for(i = 0;i < s->l1_size; i++) {
+ be64_to_cpus(&s->l1_table[i]);
+ }
+
+ if (qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 1) < 0)
+ goto fail;
+
+#ifdef DEBUG_ALLOC
+ qcow2_check_refcounts(bs);
+#endif
+ return 0;
+ fail:
+ return -EIO;
+}
+
+int qcow2_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
+{
+ BDRVQcowState *s = bs->opaque;
+ QCowSnapshot *sn;
+ int snapshot_index, ret;
+
+ snapshot_index = find_snapshot_by_id_or_name(bs, snapshot_id);
+ if (snapshot_index < 0)
+ return -ENOENT;
+ sn = &s->snapshots[snapshot_index];
+
+ ret = qcow2_update_snapshot_refcount(bs, sn->l1_table_offset, sn->l1_size, -1);
+ if (ret < 0)
+ return ret;
+ /* must update the copied flag on the current cluster offsets */
+ ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 0);
+ if (ret < 0)
+ return ret;
+ qcow2_free_clusters(bs, sn->l1_table_offset, sn->l1_size * sizeof(uint64_t));
+
+ qemu_free(sn->id_str);
+ qemu_free(sn->name);
+ memmove(sn, sn + 1, (s->nb_snapshots - snapshot_index - 1) * sizeof(*sn));
+ s->nb_snapshots--;
+ ret = qcow2_write_snapshots(bs);
+ if (ret < 0) {
+ /* XXX: restore snapshot if error ? */
+ return ret;
+ }
+#ifdef DEBUG_ALLOC
+ qcow2_check_refcounts(bs);
+#endif
+ return 0;
+}
+
+int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
+{
+ BDRVQcowState *s = bs->opaque;
+ QEMUSnapshotInfo *sn_tab, *sn_info;
+ QCowSnapshot *sn;
+ int i;
+
+ if (!s->nb_snapshots) {
+ *psn_tab = NULL;
+ return s->nb_snapshots;
+ }
+
+ sn_tab = qemu_mallocz(s->nb_snapshots * sizeof(QEMUSnapshotInfo));
+ for(i = 0; i < s->nb_snapshots; i++) {
+ sn_info = sn_tab + i;
+ sn = s->snapshots + i;
+ pstrcpy(sn_info->id_str, sizeof(sn_info->id_str),
+ sn->id_str);
+ pstrcpy(sn_info->name, sizeof(sn_info->name),
+ sn->name);
+ sn_info->vm_state_size = sn->vm_state_size;
+ sn_info->date_sec = sn->date_sec;
+ sn_info->date_nsec = sn->date_nsec;
+ sn_info->vm_clock_nsec = sn->vm_clock_nsec;
+ }
+ *psn_tab = sn_tab;
+ return s->nb_snapshots;
+}
+
+int qcow2_snapshot_load_tmp(BlockDriverState *bs, const char *snapshot_name)
+{
+ int i, snapshot_index, l1_size2;
+ BDRVQcowState *s = bs->opaque;
+ QCowSnapshot *sn;
+
+ snapshot_index = find_snapshot_by_id_or_name(bs, snapshot_name);
+ if (snapshot_index < 0) {
+ return -ENOENT;
+ }
+
+ sn = &s->snapshots[snapshot_index];
+ s->l1_size = sn->l1_size;
+ l1_size2 = s->l1_size * sizeof(uint64_t);
+ if (s->l1_table != NULL) {
+ qemu_free(s->l1_table);
+ }
+
+ s->l1_table_offset = sn->l1_table_offset;
+ s->l1_table = qemu_mallocz(align_offset(l1_size2, 512));
+
+ if (bdrv_pread(bs->file, sn->l1_table_offset,
+ s->l1_table, l1_size2) != l1_size2) {
+ return -1;
+ }
+
+ for(i = 0;i < s->l1_size; i++) {
+ be64_to_cpus(&s->l1_table[i]);
+ }
+ return 0;
+}
diff --git a/qemu-0.15.x/block/qcow2.c b/qemu-0.15.x/block/qcow2.c
new file mode 100644
index 0000000..48e1b95
--- /dev/null
+++ b/qemu-0.15.x/block/qcow2.c
@@ -0,0 +1,1419 @@
+/*
+ * Block driver for the QCOW version 2 format
+ *
+ * Copyright (c) 2004-2006 Fabrice Bellard
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+#include <zlib.h>
+#include "aes.h"
+#include "block/qcow2.h"
+#include "qemu-error.h"
+#include "qerror.h"
+
+/*
+ Differences with QCOW:
+
+ - Support for multiple incremental snapshots.
+ - Memory management by reference counts.
+ - Clusters which have a reference count of one have the bit
+ QCOW_OFLAG_COPIED to optimize write performance.
+ - Size of compressed clusters is stored in sectors to reduce bit usage
+ in the cluster offsets.
+ - Support for storing additional data (such as the VM state) in the
+ snapshots.
+ - If a backing store is used, the cluster size is not constrained
+ (could be backported to QCOW).
+ - L2 tables have always a size of one cluster.
+*/
+
+
+typedef struct {
+ uint32_t magic;
+ uint32_t len;
+} QCowExtension;
+#define QCOW2_EXT_MAGIC_END 0
+#define QCOW2_EXT_MAGIC_BACKING_FORMAT 0xE2792ACA
+
+static int qcow2_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ const QCowHeader *cow_header = (const void *)buf;
+
+ if (buf_size >= sizeof(QCowHeader) &&
+ be32_to_cpu(cow_header->magic) == QCOW_MAGIC &&
+ be32_to_cpu(cow_header->version) >= QCOW_VERSION)
+ return 100;
+ else
+ return 0;
+}
+
+
+/*
+ * read qcow2 extension and fill bs
+ * start reading from start_offset
+ * finish reading upon magic of value 0 or when end_offset reached
+ * unknown magic is skipped (future extension this version knows nothing about)
+ * return 0 upon success, non-0 otherwise
+ */
+static int qcow2_read_extensions(BlockDriverState *bs, uint64_t start_offset,
+ uint64_t end_offset)
+{
+ QCowExtension ext;
+ uint64_t offset;
+
+#ifdef DEBUG_EXT
+ printf("qcow2_read_extensions: start=%ld end=%ld\n", start_offset, end_offset);
+#endif
+ offset = start_offset;
+ while (offset < end_offset) {
+
+#ifdef DEBUG_EXT
+ /* Sanity check */
+ if (offset > s->cluster_size)
+ printf("qcow2_read_extension: suspicious offset %lu\n", offset);
+
+ printf("attemting to read extended header in offset %lu\n", offset);
+#endif
+
+ if (bdrv_pread(bs->file, offset, &ext, sizeof(ext)) != sizeof(ext)) {
+ fprintf(stderr, "qcow2_read_extension: ERROR: "
+ "pread fail from offset %" PRIu64 "\n",
+ offset);
+ return 1;
+ }
+ be32_to_cpus(&ext.magic);
+ be32_to_cpus(&ext.len);
+ offset += sizeof(ext);
+#ifdef DEBUG_EXT
+ printf("ext.magic = 0x%x\n", ext.magic);
+#endif
+ switch (ext.magic) {
+ case QCOW2_EXT_MAGIC_END:
+ return 0;
+
+ case QCOW2_EXT_MAGIC_BACKING_FORMAT:
+ if (ext.len >= sizeof(bs->backing_format)) {
+ fprintf(stderr, "ERROR: ext_backing_format: len=%u too large"
+ " (>=%zu)\n",
+ ext.len, sizeof(bs->backing_format));
+ return 2;
+ }
+ if (bdrv_pread(bs->file, offset , bs->backing_format,
+ ext.len) != ext.len)
+ return 3;
+ bs->backing_format[ext.len] = '\0';
+#ifdef DEBUG_EXT
+ printf("Qcow2: Got format extension %s\n", bs->backing_format);
+#endif
+ offset = ((offset + ext.len + 7) & ~7);
+ break;
+
+ default:
+ /* unknown magic -- just skip it */
+ offset = ((offset + ext.len + 7) & ~7);
+ break;
+ }
+ }
+
+ return 0;
+}
+
+
+static int qcow2_open(BlockDriverState *bs, int flags)
+{
+ BDRVQcowState *s = bs->opaque;
+ int len, i, ret = 0;
+ QCowHeader header;
+ uint64_t ext_end;
+ bool writethrough;
+
+ ret = bdrv_pread(bs->file, 0, &header, sizeof(header));
+ if (ret < 0) {
+ goto fail;
+ }
+ be32_to_cpus(&header.magic);
+ be32_to_cpus(&header.version);
+ be64_to_cpus(&header.backing_file_offset);
+ be32_to_cpus(&header.backing_file_size);
+ be64_to_cpus(&header.size);
+ be32_to_cpus(&header.cluster_bits);
+ be32_to_cpus(&header.crypt_method);
+ be64_to_cpus(&header.l1_table_offset);
+ be32_to_cpus(&header.l1_size);
+ be64_to_cpus(&header.refcount_table_offset);
+ be32_to_cpus(&header.refcount_table_clusters);
+ be64_to_cpus(&header.snapshots_offset);
+ be32_to_cpus(&header.nb_snapshots);
+
+ if (header.magic != QCOW_MAGIC) {
+ ret = -EINVAL;
+ goto fail;
+ }
+ if (header.version != QCOW_VERSION) {
+ char version[64];
+ snprintf(version, sizeof(version), "QCOW version %d", header.version);
+ qerror_report(QERR_UNKNOWN_BLOCK_FORMAT_FEATURE,
+ bs->device_name, "qcow2", version);
+ ret = -ENOTSUP;
+ goto fail;
+ }
+ if (header.cluster_bits < MIN_CLUSTER_BITS ||
+ header.cluster_bits > MAX_CLUSTER_BITS) {
+ ret = -EINVAL;
+ goto fail;
+ }
+ if (header.crypt_method > QCOW_CRYPT_AES) {
+ ret = -EINVAL;
+ goto fail;
+ }
+ s->crypt_method_header = header.crypt_method;
+ if (s->crypt_method_header) {
+ bs->encrypted = 1;
+ }
+ s->cluster_bits = header.cluster_bits;
+ s->cluster_size = 1 << s->cluster_bits;
+ s->cluster_sectors = 1 << (s->cluster_bits - 9);
+ s->l2_bits = s->cluster_bits - 3; /* L2 is always one cluster */
+ s->l2_size = 1 << s->l2_bits;
+ bs->total_sectors = header.size / 512;
+ s->csize_shift = (62 - (s->cluster_bits - 8));
+ s->csize_mask = (1 << (s->cluster_bits - 8)) - 1;
+ s->cluster_offset_mask = (1LL << s->csize_shift) - 1;
+ s->refcount_table_offset = header.refcount_table_offset;
+ s->refcount_table_size =
+ header.refcount_table_clusters << (s->cluster_bits - 3);
+
+ s->snapshots_offset = header.snapshots_offset;
+ s->nb_snapshots = header.nb_snapshots;
+
+ /* read the level 1 table */
+ s->l1_size = header.l1_size;
+ s->l1_vm_state_index = size_to_l1(s, header.size);
+ /* the L1 table must contain at least enough entries to put
+ header.size bytes */
+ if (s->l1_size < s->l1_vm_state_index) {
+ ret = -EINVAL;
+ goto fail;
+ }
+ s->l1_table_offset = header.l1_table_offset;
+ if (s->l1_size > 0) {
+ s->l1_table = qemu_mallocz(
+ align_offset(s->l1_size * sizeof(uint64_t), 512));
+ ret = bdrv_pread(bs->file, s->l1_table_offset, s->l1_table,
+ s->l1_size * sizeof(uint64_t));
+ if (ret < 0) {
+ goto fail;
+ }
+ for(i = 0;i < s->l1_size; i++) {
+ be64_to_cpus(&s->l1_table[i]);
+ }
+ }
+
+ /* alloc L2 table/refcount block cache */
+ writethrough = ((flags & BDRV_O_CACHE_WB) == 0);
+ s->l2_table_cache = qcow2_cache_create(bs, L2_CACHE_SIZE, writethrough);
+ s->refcount_block_cache = qcow2_cache_create(bs, REFCOUNT_CACHE_SIZE,
+ writethrough);
+
+ s->cluster_cache = qemu_malloc(s->cluster_size);
+ /* one more sector for decompressed data alignment */
+ s->cluster_data = qemu_malloc(QCOW_MAX_CRYPT_CLUSTERS * s->cluster_size
+ + 512);
+ s->cluster_cache_offset = -1;
+
+ ret = qcow2_refcount_init(bs);
+ if (ret != 0) {
+ goto fail;
+ }
+
+ QLIST_INIT(&s->cluster_allocs);
+
+ /* read qcow2 extensions */
+ if (header.backing_file_offset) {
+ ext_end = header.backing_file_offset;
+ } else {
+ ext_end = s->cluster_size;
+ }
+ if (qcow2_read_extensions(bs, sizeof(header), ext_end)) {
+ ret = -EINVAL;
+ goto fail;
+ }
+
+ /* read the backing file name */
+ if (header.backing_file_offset != 0) {
+ len = header.backing_file_size;
+ if (len > 1023) {
+ len = 1023;
+ }
+ ret = bdrv_pread(bs->file, header.backing_file_offset,
+ bs->backing_file, len);
+ if (ret < 0) {
+ goto fail;
+ }
+ bs->backing_file[len] = '\0';
+ }
+ if (qcow2_read_snapshots(bs) < 0) {
+ ret = -EINVAL;
+ goto fail;
+ }
+
+#ifdef DEBUG_ALLOC
+ qcow2_check_refcounts(bs);
+#endif
+ return ret;
+
+ fail:
+ qcow2_free_snapshots(bs);
+ qcow2_refcount_close(bs);
+ qemu_free(s->l1_table);
+ if (s->l2_table_cache) {
+ qcow2_cache_destroy(bs, s->l2_table_cache);
+ }
+ qemu_free(s->cluster_cache);
+ qemu_free(s->cluster_data);
+ return ret;
+}
+
+static int qcow2_set_key(BlockDriverState *bs, const char *key)
+{
+ BDRVQcowState *s = bs->opaque;
+ uint8_t keybuf[16];
+ int len, i;
+
+ memset(keybuf, 0, 16);
+ len = strlen(key);
+ if (len > 16)
+ len = 16;
+ /* XXX: we could compress the chars to 7 bits to increase
+ entropy */
+ for(i = 0;i < len;i++) {
+ keybuf[i] = key[i];
+ }
+ s->crypt_method = s->crypt_method_header;
+
+ if (AES_set_encrypt_key(keybuf, 128, &s->aes_encrypt_key) != 0)
+ return -1;
+ if (AES_set_decrypt_key(keybuf, 128, &s->aes_decrypt_key) != 0)
+ return -1;
+#if 0
+ /* test */
+ {
+ uint8_t in[16];
+ uint8_t out[16];
+ uint8_t tmp[16];
+ for(i=0;i<16;i++)
+ in[i] = i;
+ AES_encrypt(in, tmp, &s->aes_encrypt_key);
+ AES_decrypt(tmp, out, &s->aes_decrypt_key);
+ for(i = 0; i < 16; i++)
+ printf(" %02x", tmp[i]);
+ printf("\n");
+ for(i = 0; i < 16; i++)
+ printf(" %02x", out[i]);
+ printf("\n");
+ }
+#endif
+ return 0;
+}
+
+static int qcow2_is_allocated(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors, int *pnum)
+{
+ uint64_t cluster_offset;
+ int ret;
+
+ *pnum = nb_sectors;
+ /* FIXME We can get errors here, but the bdrv_is_allocated interface can't
+ * pass them on today */
+ ret = qcow2_get_cluster_offset(bs, sector_num << 9, pnum, &cluster_offset);
+ if (ret < 0) {
+ *pnum = 0;
+ }
+
+ return (cluster_offset != 0);
+}
+
+/* handle reading after the end of the backing file */
+int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov,
+ int64_t sector_num, int nb_sectors)
+{
+ int n1;
+ if ((sector_num + nb_sectors) <= bs->total_sectors)
+ return nb_sectors;
+ if (sector_num >= bs->total_sectors)
+ n1 = 0;
+ else
+ n1 = bs->total_sectors - sector_num;
+
+ qemu_iovec_memset_skip(qiov, 0, 512 * (nb_sectors - n1), 512 * n1);
+
+ return n1;
+}
+
+typedef struct QCowAIOCB {
+ BlockDriverAIOCB common;
+ int64_t sector_num;
+ QEMUIOVector *qiov;
+ int remaining_sectors;
+ int cur_nr_sectors; /* number of sectors in current iteration */
+ uint64_t bytes_done;
+ uint64_t cluster_offset;
+ uint8_t *cluster_data;
+ bool is_write;
+ BlockDriverAIOCB *hd_aiocb;
+ QEMUIOVector hd_qiov;
+ QEMUBH *bh;
+ QCowL2Meta l2meta;
+ QLIST_ENTRY(QCowAIOCB) next_depend;
+} QCowAIOCB;
+
+static void qcow2_aio_cancel(BlockDriverAIOCB *blockacb)
+{
+ QCowAIOCB *acb = container_of(blockacb, QCowAIOCB, common);
+ if (acb->hd_aiocb)
+ bdrv_aio_cancel(acb->hd_aiocb);
+ qemu_aio_release(acb);
+}
+
+static AIOPool qcow2_aio_pool = {
+ .aiocb_size = sizeof(QCowAIOCB),
+ .cancel = qcow2_aio_cancel,
+};
+
+static void qcow2_aio_read_cb(void *opaque, int ret);
+static void qcow2_aio_write_cb(void *opaque, int ret);
+
+static void qcow2_aio_rw_bh(void *opaque)
+{
+ QCowAIOCB *acb = opaque;
+ qemu_bh_delete(acb->bh);
+ acb->bh = NULL;
+
+ if (acb->is_write) {
+ qcow2_aio_write_cb(opaque, 0);
+ } else {
+ qcow2_aio_read_cb(opaque, 0);
+ }
+}
+
+static int qcow2_schedule_bh(QEMUBHFunc *cb, QCowAIOCB *acb)
+{
+ if (acb->bh)
+ return -EIO;
+
+ acb->bh = qemu_bh_new(cb, acb);
+ if (!acb->bh)
+ return -EIO;
+
+ qemu_bh_schedule(acb->bh);
+
+ return 0;
+}
+
+static void qcow2_aio_read_cb(void *opaque, int ret)
+{
+ QCowAIOCB *acb = opaque;
+ BlockDriverState *bs = acb->common.bs;
+ BDRVQcowState *s = bs->opaque;
+ int index_in_cluster, n1;
+
+ acb->hd_aiocb = NULL;
+ if (ret < 0)
+ goto done;
+
+ /* post process the read buffer */
+ if (!acb->cluster_offset) {
+ /* nothing to do */
+ } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
+ /* nothing to do */
+ } else {
+ if (s->crypt_method) {
+ qcow2_encrypt_sectors(s, acb->sector_num, acb->cluster_data,
+ acb->cluster_data, acb->cur_nr_sectors, 0, &s->aes_decrypt_key);
+ qemu_iovec_reset(&acb->hd_qiov);
+ qemu_iovec_copy(&acb->hd_qiov, acb->qiov, acb->bytes_done,
+ acb->cur_nr_sectors * 512);
+ qemu_iovec_from_buffer(&acb->hd_qiov, acb->cluster_data,
+ 512 * acb->cur_nr_sectors);
+ }
+ }
+
+ acb->remaining_sectors -= acb->cur_nr_sectors;
+ acb->sector_num += acb->cur_nr_sectors;
+ acb->bytes_done += acb->cur_nr_sectors * 512;
+
+ if (acb->remaining_sectors == 0) {
+ /* request completed */
+ ret = 0;
+ goto done;
+ }
+
+ /* prepare next AIO request */
+ acb->cur_nr_sectors = acb->remaining_sectors;
+ if (s->crypt_method) {
+ acb->cur_nr_sectors = MIN(acb->cur_nr_sectors,
+ QCOW_MAX_CRYPT_CLUSTERS * s->cluster_sectors);
+ }
+
+ ret = qcow2_get_cluster_offset(bs, acb->sector_num << 9,
+ &acb->cur_nr_sectors, &acb->cluster_offset);
+ if (ret < 0) {
+ goto done;
+ }
+
+ index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
+
+ qemu_iovec_reset(&acb->hd_qiov);
+ qemu_iovec_copy(&acb->hd_qiov, acb->qiov, acb->bytes_done,
+ acb->cur_nr_sectors * 512);
+
+ if (!acb->cluster_offset) {
+
+ if (bs->backing_hd) {
+ /* read from the base image */
+ n1 = qcow2_backing_read1(bs->backing_hd, &acb->hd_qiov,
+ acb->sector_num, acb->cur_nr_sectors);
+ if (n1 > 0) {
+ BLKDBG_EVENT(bs->file, BLKDBG_READ_BACKING_AIO);
+ acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num,
+ &acb->hd_qiov, n1, qcow2_aio_read_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ } else {
+ ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb);
+ if (ret < 0)
+ goto done;
+ }
+ } else {
+ /* Note: in this case, no need to wait */
+ qemu_iovec_memset(&acb->hd_qiov, 0, 512 * acb->cur_nr_sectors);
+ ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb);
+ if (ret < 0)
+ goto done;
+ }
+ } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
+ /* add AIO support for compressed blocks ? */
+ ret = qcow2_decompress_cluster(bs, acb->cluster_offset);
+ if (ret < 0) {
+ goto done;
+ }
+
+ qemu_iovec_from_buffer(&acb->hd_qiov,
+ s->cluster_cache + index_in_cluster * 512,
+ 512 * acb->cur_nr_sectors);
+
+ ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb);
+ if (ret < 0)
+ goto done;
+ } else {
+ if ((acb->cluster_offset & 511) != 0) {
+ ret = -EIO;
+ goto done;
+ }
+
+ if (s->crypt_method) {
+ /*
+ * For encrypted images, read everything into a temporary
+ * contiguous buffer on which the AES functions can work.
+ */
+ if (!acb->cluster_data) {
+ acb->cluster_data =
+ qemu_mallocz(QCOW_MAX_CRYPT_CLUSTERS * s->cluster_size);
+ }
+
+ assert(acb->cur_nr_sectors <=
+ QCOW_MAX_CRYPT_CLUSTERS * s->cluster_sectors);
+ qemu_iovec_reset(&acb->hd_qiov);
+ qemu_iovec_add(&acb->hd_qiov, acb->cluster_data,
+ 512 * acb->cur_nr_sectors);
+ }
+
+ BLKDBG_EVENT(bs->file, BLKDBG_READ_AIO);
+ acb->hd_aiocb = bdrv_aio_readv(bs->file,
+ (acb->cluster_offset >> 9) + index_in_cluster,
+ &acb->hd_qiov, acb->cur_nr_sectors,
+ qcow2_aio_read_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ }
+
+ return;
+done:
+ acb->common.cb(acb->common.opaque, ret);
+ qemu_iovec_destroy(&acb->hd_qiov);
+ qemu_aio_release(acb);
+}
+
+static QCowAIOCB *qcow2_aio_setup(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque, int is_write)
+{
+ QCowAIOCB *acb;
+
+ acb = qemu_aio_get(&qcow2_aio_pool, bs, cb, opaque);
+ if (!acb)
+ return NULL;
+ acb->hd_aiocb = NULL;
+ acb->sector_num = sector_num;
+ acb->qiov = qiov;
+ acb->is_write = is_write;
+
+ qemu_iovec_init(&acb->hd_qiov, qiov->niov);
+
+ acb->bytes_done = 0;
+ acb->remaining_sectors = nb_sectors;
+ acb->cur_nr_sectors = 0;
+ acb->cluster_offset = 0;
+ acb->l2meta.nb_clusters = 0;
+ QLIST_INIT(&acb->l2meta.dependent_requests);
+ return acb;
+}
+
+static BlockDriverAIOCB *qcow2_aio_readv(BlockDriverState *bs,
+ int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ QCowAIOCB *acb;
+ int ret;
+
+ acb = qcow2_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
+ if (!acb)
+ return NULL;
+
+ ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb);
+ if (ret < 0) {
+ qemu_iovec_destroy(&acb->hd_qiov);
+ qemu_aio_release(acb);
+ return NULL;
+ }
+
+ return &acb->common;
+}
+
+static void run_dependent_requests(QCowL2Meta *m)
+{
+ QCowAIOCB *req;
+ QCowAIOCB *next;
+
+ /* Take the request off the list of running requests */
+ if (m->nb_clusters != 0) {
+ QLIST_REMOVE(m, next_in_flight);
+ }
+
+ /* Restart all dependent requests */
+ QLIST_FOREACH_SAFE(req, &m->dependent_requests, next_depend, next) {
+ qcow2_aio_write_cb(req, 0);
+ }
+
+ /* Empty the list for the next part of the request */
+ QLIST_INIT(&m->dependent_requests);
+}
+
+static void qcow2_aio_write_cb(void *opaque, int ret)
+{
+ QCowAIOCB *acb = opaque;
+ BlockDriverState *bs = acb->common.bs;
+ BDRVQcowState *s = bs->opaque;
+ int index_in_cluster;
+ int n_end;
+
+ acb->hd_aiocb = NULL;
+
+ if (ret >= 0) {
+ ret = qcow2_alloc_cluster_link_l2(bs, &acb->l2meta);
+ }
+
+ run_dependent_requests(&acb->l2meta);
+
+ if (ret < 0)
+ goto done;
+
+ acb->remaining_sectors -= acb->cur_nr_sectors;
+ acb->sector_num += acb->cur_nr_sectors;
+ acb->bytes_done += acb->cur_nr_sectors * 512;
+
+ if (acb->remaining_sectors == 0) {
+ /* request completed */
+ ret = 0;
+ goto done;
+ }
+
+ index_in_cluster = acb->sector_num & (s->cluster_sectors - 1);
+ n_end = index_in_cluster + acb->remaining_sectors;
+ if (s->crypt_method &&
+ n_end > QCOW_MAX_CRYPT_CLUSTERS * s->cluster_sectors)
+ n_end = QCOW_MAX_CRYPT_CLUSTERS * s->cluster_sectors;
+
+ ret = qcow2_alloc_cluster_offset(bs, acb->sector_num << 9,
+ index_in_cluster, n_end, &acb->cur_nr_sectors, &acb->l2meta);
+ if (ret < 0) {
+ goto done;
+ }
+
+ acb->cluster_offset = acb->l2meta.cluster_offset;
+
+ /* Need to wait for another request? If so, we are done for now. */
+ if (acb->l2meta.nb_clusters == 0 && acb->l2meta.depends_on != NULL) {
+ QLIST_INSERT_HEAD(&acb->l2meta.depends_on->dependent_requests,
+ acb, next_depend);
+ return;
+ }
+
+ assert((acb->cluster_offset & 511) == 0);
+
+ qemu_iovec_reset(&acb->hd_qiov);
+ qemu_iovec_copy(&acb->hd_qiov, acb->qiov, acb->bytes_done,
+ acb->cur_nr_sectors * 512);
+
+ if (s->crypt_method) {
+ if (!acb->cluster_data) {
+ acb->cluster_data = qemu_mallocz(QCOW_MAX_CRYPT_CLUSTERS *
+ s->cluster_size);
+ }
+
+ assert(acb->hd_qiov.size <= QCOW_MAX_CRYPT_CLUSTERS * s->cluster_size);
+ qemu_iovec_to_buffer(&acb->hd_qiov, acb->cluster_data);
+
+ qcow2_encrypt_sectors(s, acb->sector_num, acb->cluster_data,
+ acb->cluster_data, acb->cur_nr_sectors, 1, &s->aes_encrypt_key);
+
+ qemu_iovec_reset(&acb->hd_qiov);
+ qemu_iovec_add(&acb->hd_qiov, acb->cluster_data,
+ acb->cur_nr_sectors * 512);
+ }
+
+ BLKDBG_EVENT(bs->file, BLKDBG_WRITE_AIO);
+ acb->hd_aiocb = bdrv_aio_writev(bs->file,
+ (acb->cluster_offset >> 9) + index_in_cluster,
+ &acb->hd_qiov, acb->cur_nr_sectors,
+ qcow2_aio_write_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto fail;
+ }
+
+ return;
+
+fail:
+ if (acb->l2meta.nb_clusters != 0) {
+ QLIST_REMOVE(&acb->l2meta, next_in_flight);
+ }
+done:
+ acb->common.cb(acb->common.opaque, ret);
+ qemu_iovec_destroy(&acb->hd_qiov);
+ qemu_aio_release(acb);
+}
+
+static BlockDriverAIOCB *qcow2_aio_writev(BlockDriverState *bs,
+ int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ BDRVQcowState *s = bs->opaque;
+ QCowAIOCB *acb;
+ int ret;
+
+ s->cluster_cache_offset = -1; /* disable compressed cache */
+
+ acb = qcow2_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
+ if (!acb)
+ return NULL;
+
+ ret = qcow2_schedule_bh(qcow2_aio_rw_bh, acb);
+ if (ret < 0) {
+ qemu_iovec_destroy(&acb->hd_qiov);
+ qemu_aio_release(acb);
+ return NULL;
+ }
+
+ return &acb->common;
+}
+
+static void qcow2_close(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ qemu_free(s->l1_table);
+
+ qcow2_cache_flush(bs, s->l2_table_cache);
+ qcow2_cache_flush(bs, s->refcount_block_cache);
+
+ qcow2_cache_destroy(bs, s->l2_table_cache);
+ qcow2_cache_destroy(bs, s->refcount_block_cache);
+
+ qemu_free(s->cluster_cache);
+ qemu_free(s->cluster_data);
+ qcow2_refcount_close(bs);
+}
+
+/*
+ * Updates the variable length parts of the qcow2 header, i.e. the backing file
+ * name and all extensions. qcow2 was not designed to allow such changes, so if
+ * we run out of space (we can only use the first cluster) this function may
+ * fail.
+ *
+ * Returns 0 on success, -errno in error cases.
+ */
+static int qcow2_update_ext_header(BlockDriverState *bs,
+ const char *backing_file, const char *backing_fmt)
+{
+ size_t backing_file_len = 0;
+ size_t backing_fmt_len = 0;
+ BDRVQcowState *s = bs->opaque;
+ QCowExtension ext_backing_fmt = {0, 0};
+ int ret;
+
+ /* Backing file format doesn't make sense without a backing file */
+ if (backing_fmt && !backing_file) {
+ return -EINVAL;
+ }
+
+ /* Prepare the backing file format extension if needed */
+ if (backing_fmt) {
+ ext_backing_fmt.len = cpu_to_be32(strlen(backing_fmt));
+ ext_backing_fmt.magic = cpu_to_be32(QCOW2_EXT_MAGIC_BACKING_FORMAT);
+ backing_fmt_len = ((sizeof(ext_backing_fmt)
+ + strlen(backing_fmt) + 7) & ~7);
+ }
+
+ /* Check if we can fit the new header into the first cluster */
+ if (backing_file) {
+ backing_file_len = strlen(backing_file);
+ }
+
+ size_t header_size = sizeof(QCowHeader) + backing_file_len
+ + backing_fmt_len;
+
+ if (header_size > s->cluster_size) {
+ return -ENOSPC;
+ }
+
+ /* Rewrite backing file name and qcow2 extensions */
+ size_t ext_size = header_size - sizeof(QCowHeader);
+ uint8_t buf[ext_size];
+ size_t offset = 0;
+ size_t backing_file_offset = 0;
+
+ if (backing_file) {
+ if (backing_fmt) {
+ int padding = backing_fmt_len -
+ (sizeof(ext_backing_fmt) + strlen(backing_fmt));
+
+ memcpy(buf + offset, &ext_backing_fmt, sizeof(ext_backing_fmt));
+ offset += sizeof(ext_backing_fmt);
+
+ memcpy(buf + offset, backing_fmt, strlen(backing_fmt));
+ offset += strlen(backing_fmt);
+
+ memset(buf + offset, 0, padding);
+ offset += padding;
+ }
+
+ memcpy(buf + offset, backing_file, backing_file_len);
+ backing_file_offset = sizeof(QCowHeader) + offset;
+ }
+
+ ret = bdrv_pwrite_sync(bs->file, sizeof(QCowHeader), buf, ext_size);
+ if (ret < 0) {
+ goto fail;
+ }
+
+ /* Update header fields */
+ uint64_t be_backing_file_offset = cpu_to_be64(backing_file_offset);
+ uint32_t be_backing_file_size = cpu_to_be32(backing_file_len);
+
+ ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, backing_file_offset),
+ &be_backing_file_offset, sizeof(uint64_t));
+ if (ret < 0) {
+ goto fail;
+ }
+
+ ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, backing_file_size),
+ &be_backing_file_size, sizeof(uint32_t));
+ if (ret < 0) {
+ goto fail;
+ }
+
+ ret = 0;
+fail:
+ return ret;
+}
+
+static int qcow2_change_backing_file(BlockDriverState *bs,
+ const char *backing_file, const char *backing_fmt)
+{
+ return qcow2_update_ext_header(bs, backing_file, backing_fmt);
+}
+
+static int preallocate(BlockDriverState *bs)
+{
+ uint64_t nb_sectors;
+ uint64_t offset;
+ int num;
+ int ret;
+ QCowL2Meta meta;
+
+ nb_sectors = bdrv_getlength(bs) >> 9;
+ offset = 0;
+ QLIST_INIT(&meta.dependent_requests);
+ meta.cluster_offset = 0;
+
+ while (nb_sectors) {
+ num = MIN(nb_sectors, INT_MAX >> 9);
+ ret = qcow2_alloc_cluster_offset(bs, offset, 0, num, &num, &meta);
+ if (ret < 0) {
+ return ret;
+ }
+
+ ret = qcow2_alloc_cluster_link_l2(bs, &meta);
+ if (ret < 0) {
+ qcow2_free_any_clusters(bs, meta.cluster_offset, meta.nb_clusters);
+ return ret;
+ }
+
+ /* There are no dependent requests, but we need to remove our request
+ * from the list of in-flight requests */
+ run_dependent_requests(&meta);
+
+ /* TODO Preallocate data if requested */
+
+ nb_sectors -= num;
+ offset += num << 9;
+ }
+
+ /*
+ * It is expected that the image file is large enough to actually contain
+ * all of the allocated clusters (otherwise we get failing reads after
+ * EOF). Extend the image to the last allocated sector.
+ */
+ if (meta.cluster_offset != 0) {
+ uint8_t buf[512];
+ memset(buf, 0, 512);
+ ret = bdrv_write(bs->file, (meta.cluster_offset >> 9) + num - 1, buf, 1);
+ if (ret < 0) {
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+static int qcow2_create2(const char *filename, int64_t total_size,
+ const char *backing_file, const char *backing_format,
+ int flags, size_t cluster_size, int prealloc,
+ QEMUOptionParameter *options)
+{
+ /* Calulate cluster_bits */
+ int cluster_bits;
+ cluster_bits = ffs(cluster_size) - 1;
+ if (cluster_bits < MIN_CLUSTER_BITS || cluster_bits > MAX_CLUSTER_BITS ||
+ (1 << cluster_bits) != cluster_size)
+ {
+ error_report(
+ "Cluster size must be a power of two between %d and %dk",
+ 1 << MIN_CLUSTER_BITS, 1 << (MAX_CLUSTER_BITS - 10));
+ return -EINVAL;
+ }
+
+ /*
+ * Open the image file and write a minimal qcow2 header.
+ *
+ * We keep things simple and start with a zero-sized image. We also
+ * do without refcount blocks or a L1 table for now. We'll fix the
+ * inconsistency later.
+ *
+ * We do need a refcount table because growing the refcount table means
+ * allocating two new refcount blocks - the seconds of which would be at
+ * 2 GB for 64k clusters, and we don't want to have a 2 GB initial file
+ * size for any qcow2 image.
+ */
+ BlockDriverState* bs;
+ QCowHeader header;
+ uint8_t* refcount_table;
+ int ret;
+
+ ret = bdrv_create_file(filename, options);
+ if (ret < 0) {
+ return ret;
+ }
+
+ ret = bdrv_file_open(&bs, filename, BDRV_O_RDWR);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /* Write the header */
+ memset(&header, 0, sizeof(header));
+ header.magic = cpu_to_be32(QCOW_MAGIC);
+ header.version = cpu_to_be32(QCOW_VERSION);
+ header.cluster_bits = cpu_to_be32(cluster_bits);
+ header.size = cpu_to_be64(0);
+ header.l1_table_offset = cpu_to_be64(0);
+ header.l1_size = cpu_to_be32(0);
+ header.refcount_table_offset = cpu_to_be64(cluster_size);
+ header.refcount_table_clusters = cpu_to_be32(1);
+
+ if (flags & BLOCK_FLAG_ENCRYPT) {
+ header.crypt_method = cpu_to_be32(QCOW_CRYPT_AES);
+ } else {
+ header.crypt_method = cpu_to_be32(QCOW_CRYPT_NONE);
+ }
+
+ ret = bdrv_pwrite(bs, 0, &header, sizeof(header));
+ if (ret < 0) {
+ goto out;
+ }
+
+ /* Write an empty refcount table */
+ refcount_table = qemu_mallocz(cluster_size);
+ ret = bdrv_pwrite(bs, cluster_size, refcount_table, cluster_size);
+ qemu_free(refcount_table);
+
+ if (ret < 0) {
+ goto out;
+ }
+
+ bdrv_close(bs);
+
+ /*
+ * And now open the image and make it consistent first (i.e. increase the
+ * refcount of the cluster that is occupied by the header and the refcount
+ * table)
+ */
+ BlockDriver* drv = bdrv_find_format("qcow2");
+ assert(drv != NULL);
+ ret = bdrv_open(bs, filename,
+ BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH, drv);
+ if (ret < 0) {
+ goto out;
+ }
+
+ ret = qcow2_alloc_clusters(bs, 2 * cluster_size);
+ if (ret < 0) {
+ goto out;
+
+ } else if (ret != 0) {
+ error_report("Huh, first cluster in empty image is already in use?");
+ abort();
+ }
+
+ /* Okay, now that we have a valid image, let's give it the right size */
+ ret = bdrv_truncate(bs, total_size * BDRV_SECTOR_SIZE);
+ if (ret < 0) {
+ goto out;
+ }
+
+ /* Want a backing file? There you go.*/
+ if (backing_file) {
+ ret = bdrv_change_backing_file(bs, backing_file, backing_format);
+ if (ret < 0) {
+ goto out;
+ }
+ }
+
+ /* And if we're supposed to preallocate metadata, do that now */
+ if (prealloc) {
+ ret = preallocate(bs);
+ if (ret < 0) {
+ goto out;
+ }
+ }
+
+ ret = 0;
+out:
+ bdrv_delete(bs);
+ return ret;
+}
+
+static int qcow2_create(const char *filename, QEMUOptionParameter *options)
+{
+ const char *backing_file = NULL;
+ const char *backing_fmt = NULL;
+ uint64_t sectors = 0;
+ int flags = 0;
+ size_t cluster_size = DEFAULT_CLUSTER_SIZE;
+ int prealloc = 0;
+
+ /* Read out options */
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ sectors = options->value.n / 512;
+ } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
+ backing_file = options->value.s;
+ } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FMT)) {
+ backing_fmt = options->value.s;
+ } else if (!strcmp(options->name, BLOCK_OPT_ENCRYPT)) {
+ flags |= options->value.n ? BLOCK_FLAG_ENCRYPT : 0;
+ } else if (!strcmp(options->name, BLOCK_OPT_CLUSTER_SIZE)) {
+ if (options->value.n) {
+ cluster_size = options->value.n;
+ }
+ } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
+ if (!options->value.s || !strcmp(options->value.s, "off")) {
+ prealloc = 0;
+ } else if (!strcmp(options->value.s, "metadata")) {
+ prealloc = 1;
+ } else {
+ fprintf(stderr, "Invalid preallocation mode: '%s'\n",
+ options->value.s);
+ return -EINVAL;
+ }
+ }
+ options++;
+ }
+
+ if (backing_file && prealloc) {
+ fprintf(stderr, "Backing file and preallocation cannot be used at "
+ "the same time\n");
+ return -EINVAL;
+ }
+
+ return qcow2_create2(filename, sectors, backing_file, backing_fmt, flags,
+ cluster_size, prealloc, options);
+}
+
+static int qcow2_make_empty(BlockDriverState *bs)
+{
+#if 0
+ /* XXX: not correct */
+ BDRVQcowState *s = bs->opaque;
+ uint32_t l1_length = s->l1_size * sizeof(uint64_t);
+ int ret;
+
+ memset(s->l1_table, 0, l1_length);
+ if (bdrv_pwrite(bs->file, s->l1_table_offset, s->l1_table, l1_length) < 0)
+ return -1;
+ ret = bdrv_truncate(bs->file, s->l1_table_offset + l1_length);
+ if (ret < 0)
+ return ret;
+
+ l2_cache_reset(bs);
+#endif
+ return 0;
+}
+
+static int qcow2_discard(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors)
+{
+ return qcow2_discard_clusters(bs, sector_num << BDRV_SECTOR_BITS,
+ nb_sectors);
+}
+
+static int qcow2_truncate(BlockDriverState *bs, int64_t offset)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret, new_l1_size;
+
+ if (offset & 511) {
+ return -EINVAL;
+ }
+
+ /* cannot proceed if image has snapshots */
+ if (s->nb_snapshots) {
+ return -ENOTSUP;
+ }
+
+ /* shrinking is currently not supported */
+ if (offset < bs->total_sectors * 512) {
+ return -ENOTSUP;
+ }
+
+ new_l1_size = size_to_l1(s, offset);
+ ret = qcow2_grow_l1_table(bs, new_l1_size, true);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /* write updated header.size */
+ offset = cpu_to_be64(offset);
+ ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, size),
+ &offset, sizeof(uint64_t));
+ if (ret < 0) {
+ return ret;
+ }
+
+ s->l1_vm_state_index = new_l1_size;
+ return 0;
+}
+
+/* XXX: put compressed sectors first, then all the cluster aligned
+ tables to avoid losing bytes in alignment */
+static int qcow2_write_compressed(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BDRVQcowState *s = bs->opaque;
+ z_stream strm;
+ int ret, out_len;
+ uint8_t *out_buf;
+ uint64_t cluster_offset;
+
+ if (nb_sectors == 0) {
+ /* align end of file to a sector boundary to ease reading with
+ sector based I/Os */
+ cluster_offset = bdrv_getlength(bs->file);
+ cluster_offset = (cluster_offset + 511) & ~511;
+ bdrv_truncate(bs->file, cluster_offset);
+ return 0;
+ }
+
+ if (nb_sectors != s->cluster_sectors)
+ return -EINVAL;
+
+ out_buf = qemu_malloc(s->cluster_size + (s->cluster_size / 1000) + 128);
+
+ /* best compression, small window, no zlib header */
+ memset(&strm, 0, sizeof(strm));
+ ret = deflateInit2(&strm, Z_DEFAULT_COMPRESSION,
+ Z_DEFLATED, -12,
+ 9, Z_DEFAULT_STRATEGY);
+ if (ret != 0) {
+ qemu_free(out_buf);
+ return -1;
+ }
+
+ strm.avail_in = s->cluster_size;
+ strm.next_in = (uint8_t *)buf;
+ strm.avail_out = s->cluster_size;
+ strm.next_out = out_buf;
+
+ ret = deflate(&strm, Z_FINISH);
+ if (ret != Z_STREAM_END && ret != Z_OK) {
+ qemu_free(out_buf);
+ deflateEnd(&strm);
+ return -1;
+ }
+ out_len = strm.next_out - out_buf;
+
+ deflateEnd(&strm);
+
+ if (ret != Z_STREAM_END || out_len >= s->cluster_size) {
+ /* could not compress: write normal cluster */
+ bdrv_write(bs, sector_num, buf, s->cluster_sectors);
+ } else {
+ cluster_offset = qcow2_alloc_compressed_cluster_offset(bs,
+ sector_num << 9, out_len);
+ if (!cluster_offset)
+ return -1;
+ cluster_offset &= s->cluster_offset_mask;
+ BLKDBG_EVENT(bs->file, BLKDBG_WRITE_COMPRESSED);
+ if (bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len) != out_len) {
+ qemu_free(out_buf);
+ return -1;
+ }
+ }
+
+ qemu_free(out_buf);
+ return 0;
+}
+
+static int qcow2_flush(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret;
+
+ ret = qcow2_cache_flush(bs, s->l2_table_cache);
+ if (ret < 0) {
+ return ret;
+ }
+
+ ret = qcow2_cache_flush(bs, s->refcount_block_cache);
+ if (ret < 0) {
+ return ret;
+ }
+
+ return bdrv_flush(bs->file);
+}
+
+static BlockDriverAIOCB *qcow2_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ BDRVQcowState *s = bs->opaque;
+ int ret;
+
+ ret = qcow2_cache_flush(bs, s->l2_table_cache);
+ if (ret < 0) {
+ return NULL;
+ }
+
+ ret = qcow2_cache_flush(bs, s->refcount_block_cache);
+ if (ret < 0) {
+ return NULL;
+ }
+
+ return bdrv_aio_flush(bs->file, cb, opaque);
+}
+
+static int64_t qcow2_vm_state_offset(BDRVQcowState *s)
+{
+ return (int64_t)s->l1_vm_state_index << (s->cluster_bits + s->l2_bits);
+}
+
+static int qcow2_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
+{
+ BDRVQcowState *s = bs->opaque;
+ bdi->cluster_size = s->cluster_size;
+ bdi->vm_state_offset = qcow2_vm_state_offset(s);
+ return 0;
+}
+
+
+static int qcow2_check(BlockDriverState *bs, BdrvCheckResult *result)
+{
+ return qcow2_check_refcounts(bs, result);
+}
+
+#if 0
+static void dump_refcounts(BlockDriverState *bs)
+{
+ BDRVQcowState *s = bs->opaque;
+ int64_t nb_clusters, k, k1, size;
+ int refcount;
+
+ size = bdrv_getlength(bs->file);
+ nb_clusters = size_to_clusters(s, size);
+ for(k = 0; k < nb_clusters;) {
+ k1 = k;
+ refcount = get_refcount(bs, k);
+ k++;
+ while (k < nb_clusters && get_refcount(bs, k) == refcount)
+ k++;
+ printf("%" PRId64 ": refcount=%d nb=%" PRId64 "\n", k, refcount,
+ k - k1);
+ }
+}
+#endif
+
+static int qcow2_save_vmstate(BlockDriverState *bs, const uint8_t *buf,
+ int64_t pos, int size)
+{
+ BDRVQcowState *s = bs->opaque;
+ int growable = bs->growable;
+ int ret;
+
+ BLKDBG_EVENT(bs->file, BLKDBG_VMSTATE_SAVE);
+ bs->growable = 1;
+ ret = bdrv_pwrite(bs, qcow2_vm_state_offset(s) + pos, buf, size);
+ bs->growable = growable;
+
+ return ret;
+}
+
+static int qcow2_load_vmstate(BlockDriverState *bs, uint8_t *buf,
+ int64_t pos, int size)
+{
+ BDRVQcowState *s = bs->opaque;
+ int growable = bs->growable;
+ int ret;
+
+ BLKDBG_EVENT(bs->file, BLKDBG_VMSTATE_LOAD);
+ bs->growable = 1;
+ ret = bdrv_pread(bs, qcow2_vm_state_offset(s) + pos, buf, size);
+ bs->growable = growable;
+
+ return ret;
+}
+
+static QEMUOptionParameter qcow2_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ {
+ .name = BLOCK_OPT_BACKING_FILE,
+ .type = OPT_STRING,
+ .help = "File name of a base image"
+ },
+ {
+ .name = BLOCK_OPT_BACKING_FMT,
+ .type = OPT_STRING,
+ .help = "Image format of the base image"
+ },
+ {
+ .name = BLOCK_OPT_ENCRYPT,
+ .type = OPT_FLAG,
+ .help = "Encrypt the image"
+ },
+ {
+ .name = BLOCK_OPT_CLUSTER_SIZE,
+ .type = OPT_SIZE,
+ .help = "qcow2 cluster size",
+ .value = { .n = DEFAULT_CLUSTER_SIZE },
+ },
+ {
+ .name = BLOCK_OPT_PREALLOC,
+ .type = OPT_STRING,
+ .help = "Preallocation mode (allowed values: off, metadata)"
+ },
+ { NULL }
+};
+
+static BlockDriver bdrv_qcow2 = {
+ .format_name = "qcow2",
+ .instance_size = sizeof(BDRVQcowState),
+ .bdrv_probe = qcow2_probe,
+ .bdrv_open = qcow2_open,
+ .bdrv_close = qcow2_close,
+ .bdrv_create = qcow2_create,
+ .bdrv_flush = qcow2_flush,
+ .bdrv_is_allocated = qcow2_is_allocated,
+ .bdrv_set_key = qcow2_set_key,
+ .bdrv_make_empty = qcow2_make_empty,
+
+ .bdrv_aio_readv = qcow2_aio_readv,
+ .bdrv_aio_writev = qcow2_aio_writev,
+ .bdrv_aio_flush = qcow2_aio_flush,
+
+ .bdrv_discard = qcow2_discard,
+ .bdrv_truncate = qcow2_truncate,
+ .bdrv_write_compressed = qcow2_write_compressed,
+
+ .bdrv_snapshot_create = qcow2_snapshot_create,
+ .bdrv_snapshot_goto = qcow2_snapshot_goto,
+ .bdrv_snapshot_delete = qcow2_snapshot_delete,
+ .bdrv_snapshot_list = qcow2_snapshot_list,
+ .bdrv_snapshot_load_tmp = qcow2_snapshot_load_tmp,
+ .bdrv_get_info = qcow2_get_info,
+
+ .bdrv_save_vmstate = qcow2_save_vmstate,
+ .bdrv_load_vmstate = qcow2_load_vmstate,
+
+ .bdrv_change_backing_file = qcow2_change_backing_file,
+
+ .create_options = qcow2_create_options,
+ .bdrv_check = qcow2_check,
+};
+
+static void bdrv_qcow2_init(void)
+{
+ bdrv_register(&bdrv_qcow2);
+}
+
+block_init(bdrv_qcow2_init);
diff --git a/qemu-0.15.x/block/qcow2.h b/qemu-0.15.x/block/qcow2.h
new file mode 100644
index 0000000..6a0a21b
--- /dev/null
+++ b/qemu-0.15.x/block/qcow2.h
@@ -0,0 +1,246 @@
+/*
+ * Block driver for the QCOW version 2 format
+ *
+ * Copyright (c) 2004-2006 Fabrice Bellard
+ *
+ * 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.
+ */
+
+#ifndef BLOCK_QCOW2_H
+#define BLOCK_QCOW2_H
+
+#include "aes.h"
+
+//#define DEBUG_ALLOC
+//#define DEBUG_ALLOC2
+//#define DEBUG_EXT
+
+#define QCOW_MAGIC (('Q' << 24) | ('F' << 16) | ('I' << 8) | 0xfb)
+#define QCOW_VERSION 2
+
+#define QCOW_CRYPT_NONE 0
+#define QCOW_CRYPT_AES 1
+
+#define QCOW_MAX_CRYPT_CLUSTERS 32
+
+/* indicate that the refcount of the referenced cluster is exactly one. */
+#define QCOW_OFLAG_COPIED (1LL << 63)
+/* indicate that the cluster is compressed (they never have the copied flag) */
+#define QCOW_OFLAG_COMPRESSED (1LL << 62)
+
+#define REFCOUNT_SHIFT 1 /* refcount size is 2 bytes */
+
+#define MIN_CLUSTER_BITS 9
+#define MAX_CLUSTER_BITS 21
+
+#define L2_CACHE_SIZE 16
+
+/* Must be at least 4 to cover all cases of refcount table growth */
+#define REFCOUNT_CACHE_SIZE 4
+
+#define DEFAULT_CLUSTER_SIZE 65536
+
+typedef struct QCowHeader {
+ uint32_t magic;
+ uint32_t version;
+ uint64_t backing_file_offset;
+ uint32_t backing_file_size;
+ uint32_t cluster_bits;
+ uint64_t size; /* in bytes */
+ uint32_t crypt_method;
+ uint32_t l1_size; /* XXX: save number of clusters instead ? */
+ uint64_t l1_table_offset;
+ uint64_t refcount_table_offset;
+ uint32_t refcount_table_clusters;
+ uint32_t nb_snapshots;
+ uint64_t snapshots_offset;
+} QCowHeader;
+
+typedef struct QCowSnapshot {
+ uint64_t l1_table_offset;
+ uint32_t l1_size;
+ char *id_str;
+ char *name;
+ uint32_t vm_state_size;
+ uint32_t date_sec;
+ uint32_t date_nsec;
+ uint64_t vm_clock_nsec;
+} QCowSnapshot;
+
+struct Qcow2Cache;
+typedef struct Qcow2Cache Qcow2Cache;
+
+typedef struct BDRVQcowState {
+ int cluster_bits;
+ int cluster_size;
+ int cluster_sectors;
+ int l2_bits;
+ int l2_size;
+ int l1_size;
+ int l1_vm_state_index;
+ int csize_shift;
+ int csize_mask;
+ uint64_t cluster_offset_mask;
+ uint64_t l1_table_offset;
+ uint64_t *l1_table;
+
+ Qcow2Cache* l2_table_cache;
+ Qcow2Cache* refcount_block_cache;
+
+ uint8_t *cluster_cache;
+ uint8_t *cluster_data;
+ uint64_t cluster_cache_offset;
+ QLIST_HEAD(QCowClusterAlloc, QCowL2Meta) cluster_allocs;
+
+ uint64_t *refcount_table;
+ uint64_t refcount_table_offset;
+ uint32_t refcount_table_size;
+ int64_t free_cluster_index;
+ int64_t free_byte_offset;
+
+ uint32_t crypt_method; /* current crypt method, 0 if no key yet */
+ uint32_t crypt_method_header;
+ AES_KEY aes_encrypt_key;
+ AES_KEY aes_decrypt_key;
+ uint64_t snapshots_offset;
+ int snapshots_size;
+ int nb_snapshots;
+ QCowSnapshot *snapshots;
+} BDRVQcowState;
+
+/* XXX: use std qcow open function ? */
+typedef struct QCowCreateState {
+ int cluster_size;
+ int cluster_bits;
+ uint16_t *refcount_block;
+ uint64_t *refcount_table;
+ int64_t l1_table_offset;
+ int64_t refcount_table_offset;
+ int64_t refcount_block_offset;
+} QCowCreateState;
+
+struct QCowAIOCB;
+
+/* XXX This could be private for qcow2-cluster.c */
+typedef struct QCowL2Meta
+{
+ uint64_t offset;
+ uint64_t cluster_offset;
+ int n_start;
+ int nb_available;
+ int nb_clusters;
+ struct QCowL2Meta *depends_on;
+ QLIST_HEAD(QCowAioDependencies, QCowAIOCB) dependent_requests;
+
+ QLIST_ENTRY(QCowL2Meta) next_in_flight;
+} QCowL2Meta;
+
+static inline int size_to_clusters(BDRVQcowState *s, int64_t size)
+{
+ return (size + (s->cluster_size - 1)) >> s->cluster_bits;
+}
+
+static inline int size_to_l1(BDRVQcowState *s, int64_t size)
+{
+ int shift = s->cluster_bits + s->l2_bits;
+ return (size + (1ULL << shift) - 1) >> shift;
+}
+
+static inline int64_t align_offset(int64_t offset, int n)
+{
+ offset = (offset + n - 1) & ~(n - 1);
+ return offset;
+}
+
+
+// FIXME Need qcow2_ prefix to global functions
+
+/* qcow2.c functions */
+int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov,
+ int64_t sector_num, int nb_sectors);
+
+/* qcow2-refcount.c functions */
+int qcow2_refcount_init(BlockDriverState *bs);
+void qcow2_refcount_close(BlockDriverState *bs);
+
+int64_t qcow2_alloc_clusters(BlockDriverState *bs, int64_t size);
+int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size);
+void qcow2_free_clusters(BlockDriverState *bs,
+ int64_t offset, int64_t size);
+void qcow2_free_any_clusters(BlockDriverState *bs,
+ uint64_t cluster_offset, int nb_clusters);
+
+void qcow2_create_refcount_update(QCowCreateState *s, int64_t offset,
+ int64_t size);
+int qcow2_update_snapshot_refcount(BlockDriverState *bs,
+ int64_t l1_table_offset, int l1_size, int addend);
+
+int qcow2_check_refcounts(BlockDriverState *bs, BdrvCheckResult *res);
+
+/* qcow2-cluster.c functions */
+int qcow2_grow_l1_table(BlockDriverState *bs, int min_size, bool exact_size);
+void qcow2_l2_cache_reset(BlockDriverState *bs);
+int qcow2_decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset);
+void qcow2_encrypt_sectors(BDRVQcowState *s, int64_t sector_num,
+ uint8_t *out_buf, const uint8_t *in_buf,
+ int nb_sectors, int enc,
+ const AES_KEY *key);
+
+int qcow2_get_cluster_offset(BlockDriverState *bs, uint64_t offset,
+ int *num, uint64_t *cluster_offset);
+int qcow2_alloc_cluster_offset(BlockDriverState *bs, uint64_t offset,
+ int n_start, int n_end, int *num, QCowL2Meta *m);
+uint64_t qcow2_alloc_compressed_cluster_offset(BlockDriverState *bs,
+ uint64_t offset,
+ int compressed_size);
+
+int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m);
+int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset,
+ int nb_sectors);
+
+/* qcow2-snapshot.c functions */
+int qcow2_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info);
+int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id);
+int qcow2_snapshot_delete(BlockDriverState *bs, const char *snapshot_id);
+int qcow2_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab);
+int qcow2_snapshot_load_tmp(BlockDriverState *bs, const char *snapshot_name);
+
+void qcow2_free_snapshots(BlockDriverState *bs);
+int qcow2_read_snapshots(BlockDriverState *bs);
+
+/* qcow2-cache.c functions */
+Qcow2Cache *qcow2_cache_create(BlockDriverState *bs, int num_tables,
+ bool writethrough);
+int qcow2_cache_destroy(BlockDriverState* bs, Qcow2Cache *c);
+bool qcow2_cache_set_writethrough(BlockDriverState *bs, Qcow2Cache *c,
+ bool enable);
+
+void qcow2_cache_entry_mark_dirty(Qcow2Cache *c, void *table);
+int qcow2_cache_flush(BlockDriverState *bs, Qcow2Cache *c);
+int qcow2_cache_set_dependency(BlockDriverState *bs, Qcow2Cache *c,
+ Qcow2Cache *dependency);
+void qcow2_cache_depends_on_flush(Qcow2Cache *c);
+
+int qcow2_cache_get(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
+ void **table);
+int qcow2_cache_get_empty(BlockDriverState *bs, Qcow2Cache *c, uint64_t offset,
+ void **table);
+int qcow2_cache_put(BlockDriverState *bs, Qcow2Cache *c, void **table);
+
+#endif
diff --git a/qemu-0.15.x/block/qed-check.c b/qemu-0.15.x/block/qed-check.c
new file mode 100644
index 0000000..22cd07f
--- /dev/null
+++ b/qemu-0.15.x/block/qed-check.c
@@ -0,0 +1,211 @@
+/*
+ * QEMU Enhanced Disk Format Consistency Check
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ * Stefan Hajnoczi <stefanha(a)linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+
+#include "qed.h"
+
+typedef struct {
+ BDRVQEDState *s;
+ BdrvCheckResult *result;
+ bool fix; /* whether to fix invalid offsets */
+
+ uint64_t nclusters;
+ uint32_t *used_clusters; /* referenced cluster bitmap */
+
+ QEDRequest request;
+} QEDCheck;
+
+static bool qed_test_bit(uint32_t *bitmap, uint64_t n) {
+ return !!(bitmap[n / 32] & (1 << (n % 32)));
+}
+
+static void qed_set_bit(uint32_t *bitmap, uint64_t n) {
+ bitmap[n / 32] |= 1 << (n % 32);
+}
+
+/**
+ * Set bitmap bits for clusters
+ *
+ * @check: Check structure
+ * @offset: Starting offset in bytes
+ * @n: Number of clusters
+ */
+static bool qed_set_used_clusters(QEDCheck *check, uint64_t offset,
+ unsigned int n)
+{
+ uint64_t cluster = qed_bytes_to_clusters(check->s, offset);
+ unsigned int corruptions = 0;
+
+ while (n-- != 0) {
+ /* Clusters should only be referenced once */
+ if (qed_test_bit(check->used_clusters, cluster)) {
+ corruptions++;
+ }
+
+ qed_set_bit(check->used_clusters, cluster);
+ cluster++;
+ }
+
+ check->result->corruptions += corruptions;
+ return corruptions == 0;
+}
+
+/**
+ * Check an L2 table
+ *
+ * @ret: Number of invalid cluster offsets
+ */
+static unsigned int qed_check_l2_table(QEDCheck *check, QEDTable *table)
+{
+ BDRVQEDState *s = check->s;
+ unsigned int i, num_invalid = 0;
+
+ for (i = 0; i < s->table_nelems; i++) {
+ uint64_t offset = table->offsets[i];
+
+ if (qed_offset_is_unalloc_cluster(offset) ||
+ qed_offset_is_zero_cluster(offset)) {
+ continue;
+ }
+
+ /* Detect invalid cluster offset */
+ if (!qed_check_cluster_offset(s, offset)) {
+ if (check->fix) {
+ table->offsets[i] = 0;
+ } else {
+ check->result->corruptions++;
+ }
+
+ num_invalid++;
+ continue;
+ }
+
+ qed_set_used_clusters(check, offset, 1);
+ }
+
+ return num_invalid;
+}
+
+/**
+ * Descend tables and check each cluster is referenced once only
+ */
+static int qed_check_l1_table(QEDCheck *check, QEDTable *table)
+{
+ BDRVQEDState *s = check->s;
+ unsigned int i, num_invalid_l1 = 0;
+ int ret, last_error = 0;
+
+ /* Mark L1 table clusters used */
+ qed_set_used_clusters(check, s->header.l1_table_offset,
+ s->header.table_size);
+
+ for (i = 0; i < s->table_nelems; i++) {
+ unsigned int num_invalid_l2;
+ uint64_t offset = table->offsets[i];
+
+ if (qed_offset_is_unalloc_cluster(offset)) {
+ continue;
+ }
+
+ /* Detect invalid L2 offset */
+ if (!qed_check_table_offset(s, offset)) {
+ /* Clear invalid offset */
+ if (check->fix) {
+ table->offsets[i] = 0;
+ } else {
+ check->result->corruptions++;
+ }
+
+ num_invalid_l1++;
+ continue;
+ }
+
+ if (!qed_set_used_clusters(check, offset, s->header.table_size)) {
+ continue; /* skip an invalid table */
+ }
+
+ ret = qed_read_l2_table_sync(s, &check->request, offset);
+ if (ret) {
+ check->result->check_errors++;
+ last_error = ret;
+ continue;
+ }
+
+ num_invalid_l2 = qed_check_l2_table(check,
+ check->request.l2_table->table);
+
+ /* Write out fixed L2 table */
+ if (num_invalid_l2 > 0 && check->fix) {
+ ret = qed_write_l2_table_sync(s, &check->request, 0,
+ s->table_nelems, false);
+ if (ret) {
+ check->result->check_errors++;
+ last_error = ret;
+ continue;
+ }
+ }
+ }
+
+ /* Drop reference to final table */
+ qed_unref_l2_cache_entry(check->request.l2_table);
+ check->request.l2_table = NULL;
+
+ /* Write out fixed L1 table */
+ if (num_invalid_l1 > 0 && check->fix) {
+ ret = qed_write_l1_table_sync(s, 0, s->table_nelems);
+ if (ret) {
+ check->result->check_errors++;
+ last_error = ret;
+ }
+ }
+
+ return last_error;
+}
+
+/**
+ * Check for unreferenced (leaked) clusters
+ */
+static void qed_check_for_leaks(QEDCheck *check)
+{
+ BDRVQEDState *s = check->s;
+ uint64_t i;
+
+ for (i = s->header.header_size; i < check->nclusters; i++) {
+ if (!qed_test_bit(check->used_clusters, i)) {
+ check->result->leaks++;
+ }
+ }
+}
+
+int qed_check(BDRVQEDState *s, BdrvCheckResult *result, bool fix)
+{
+ QEDCheck check = {
+ .s = s,
+ .result = result,
+ .nclusters = qed_bytes_to_clusters(s, s->file_size),
+ .request = { .l2_table = NULL },
+ .fix = fix,
+ };
+ int ret;
+
+ check.used_clusters = qemu_mallocz(((check.nclusters + 31) / 32) *
+ sizeof(check.used_clusters[0]));
+
+ ret = qed_check_l1_table(&check, s->l1_table);
+ if (ret == 0) {
+ /* Only check for leaks if entire image was scanned successfully */
+ qed_check_for_leaks(&check);
+ }
+
+ qemu_free(check.used_clusters);
+ return ret;
+}
diff --git a/qemu-0.15.x/block/qed-cluster.c b/qemu-0.15.x/block/qed-cluster.c
new file mode 100644
index 0000000..3e19ad1
--- /dev/null
+++ b/qemu-0.15.x/block/qed-cluster.c
@@ -0,0 +1,165 @@
+/*
+ * QEMU Enhanced Disk Format Cluster functions
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ * Stefan Hajnoczi <stefanha(a)linux.vnet.ibm.com>
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+
+#include "qed.h"
+
+/**
+ * Count the number of contiguous data clusters
+ *
+ * @s: QED state
+ * @table: L2 table
+ * @index: First cluster index
+ * @n: Maximum number of clusters
+ * @offset: Set to first cluster offset
+ *
+ * This function scans tables for contiguous clusters. A contiguous run of
+ * clusters may be allocated, unallocated, or zero.
+ */
+static unsigned int qed_count_contiguous_clusters(BDRVQEDState *s,
+ QEDTable *table,
+ unsigned int index,
+ unsigned int n,
+ uint64_t *offset)
+{
+ unsigned int end = MIN(index + n, s->table_nelems);
+ uint64_t last = table->offsets[index];
+ unsigned int i;
+
+ *offset = last;
+
+ for (i = index + 1; i < end; i++) {
+ if (qed_offset_is_unalloc_cluster(last)) {
+ /* Counting unallocated clusters */
+ if (!qed_offset_is_unalloc_cluster(table->offsets[i])) {
+ break;
+ }
+ } else if (qed_offset_is_zero_cluster(last)) {
+ /* Counting zero clusters */
+ if (!qed_offset_is_zero_cluster(table->offsets[i])) {
+ break;
+ }
+ } else {
+ /* Counting allocated clusters */
+ if (table->offsets[i] != last + s->header.cluster_size) {
+ break;
+ }
+ last = table->offsets[i];
+ }
+ }
+ return i - index;
+}
+
+typedef struct {
+ BDRVQEDState *s;
+ uint64_t pos;
+ size_t len;
+
+ QEDRequest *request;
+
+ /* User callback */
+ QEDFindClusterFunc *cb;
+ void *opaque;
+} QEDFindClusterCB;
+
+static void qed_find_cluster_cb(void *opaque, int ret)
+{
+ QEDFindClusterCB *find_cluster_cb = opaque;
+ BDRVQEDState *s = find_cluster_cb->s;
+ QEDRequest *request = find_cluster_cb->request;
+ uint64_t offset = 0;
+ size_t len = 0;
+ unsigned int index;
+ unsigned int n;
+
+ if (ret) {
+ goto out;
+ }
+
+ index = qed_l2_index(s, find_cluster_cb->pos);
+ n = qed_bytes_to_clusters(s,
+ qed_offset_into_cluster(s, find_cluster_cb->pos) +
+ find_cluster_cb->len);
+ n = qed_count_contiguous_clusters(s, request->l2_table->table,
+ index, n, &offset);
+
+ if (qed_offset_is_unalloc_cluster(offset)) {
+ ret = QED_CLUSTER_L2;
+ } else if (qed_offset_is_zero_cluster(offset)) {
+ ret = QED_CLUSTER_ZERO;
+ } else if (qed_check_cluster_offset(s, offset)) {
+ ret = QED_CLUSTER_FOUND;
+ } else {
+ ret = -EINVAL;
+ }
+
+ len = MIN(find_cluster_cb->len, n * s->header.cluster_size -
+ qed_offset_into_cluster(s, find_cluster_cb->pos));
+
+out:
+ find_cluster_cb->cb(find_cluster_cb->opaque, ret, offset, len);
+ qemu_free(find_cluster_cb);
+}
+
+/**
+ * Find the offset of a data cluster
+ *
+ * @s: QED state
+ * @request: L2 cache entry
+ * @pos: Byte position in device
+ * @len: Number of bytes
+ * @cb: Completion function
+ * @opaque: User data for completion function
+ *
+ * This function translates a position in the block device to an offset in the
+ * image file. It invokes the cb completion callback to report back the
+ * translated offset or unallocated range in the image file.
+ *
+ * If the L2 table exists, request->l2_table points to the L2 table cache entry
+ * and the caller must free the reference when they are finished. The cache
+ * entry is exposed in this way to avoid callers having to read the L2 table
+ * again later during request processing. If request->l2_table is non-NULL it
+ * will be unreferenced before taking on the new cache entry.
+ */
+void qed_find_cluster(BDRVQEDState *s, QEDRequest *request, uint64_t pos,
+ size_t len, QEDFindClusterFunc *cb, void *opaque)
+{
+ QEDFindClusterCB *find_cluster_cb;
+ uint64_t l2_offset;
+
+ /* Limit length to L2 boundary. Requests are broken up at the L2 boundary
+ * so that a request acts on one L2 table at a time.
+ */
+ len = MIN(len, (((pos >> s->l1_shift) + 1) << s->l1_shift) - pos);
+
+ l2_offset = s->l1_table->offsets[qed_l1_index(s, pos)];
+ if (qed_offset_is_unalloc_cluster(l2_offset)) {
+ cb(opaque, QED_CLUSTER_L1, 0, len);
+ return;
+ }
+ if (!qed_check_table_offset(s, l2_offset)) {
+ cb(opaque, -EINVAL, 0, 0);
+ return;
+ }
+
+ find_cluster_cb = qemu_malloc(sizeof(*find_cluster_cb));
+ find_cluster_cb->s = s;
+ find_cluster_cb->pos = pos;
+ find_cluster_cb->len = len;
+ find_cluster_cb->cb = cb;
+ find_cluster_cb->opaque = opaque;
+ find_cluster_cb->request = request;
+
+ qed_read_l2_table(s, request, l2_offset,
+ qed_find_cluster_cb, find_cluster_cb);
+}
diff --git a/qemu-0.15.x/block/qed-gencb.c b/qemu-0.15.x/block/qed-gencb.c
new file mode 100644
index 0000000..1513dc6
--- /dev/null
+++ b/qemu-0.15.x/block/qed-gencb.c
@@ -0,0 +1,32 @@
+/*
+ * QEMU Enhanced Disk Format
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ * Stefan Hajnoczi <stefanha(a)linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+
+#include "qed.h"
+
+void *gencb_alloc(size_t len, BlockDriverCompletionFunc *cb, void *opaque)
+{
+ GenericCB *gencb = qemu_malloc(len);
+ gencb->cb = cb;
+ gencb->opaque = opaque;
+ return gencb;
+}
+
+void gencb_complete(void *opaque, int ret)
+{
+ GenericCB *gencb = opaque;
+ BlockDriverCompletionFunc *cb = gencb->cb;
+ void *user_opaque = gencb->opaque;
+
+ qemu_free(gencb);
+ cb(user_opaque, ret);
+}
diff --git a/qemu-0.15.x/block/qed-l2-cache.c b/qemu-0.15.x/block/qed-l2-cache.c
new file mode 100644
index 0000000..57518a4
--- /dev/null
+++ b/qemu-0.15.x/block/qed-l2-cache.c
@@ -0,0 +1,173 @@
+/*
+ * QEMU Enhanced Disk Format L2 Cache
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+
+/*
+ * L2 table cache usage is as follows:
+ *
+ * An open image has one L2 table cache that is used to avoid accessing the
+ * image file for recently referenced L2 tables.
+ *
+ * Cluster offset lookup translates the logical offset within the block device
+ * to a cluster offset within the image file. This is done by indexing into
+ * the L1 and L2 tables which store cluster offsets. It is here where the L2
+ * table cache serves up recently referenced L2 tables.
+ *
+ * If there is a cache miss, that L2 table is read from the image file and
+ * committed to the cache. Subsequent accesses to that L2 table will be served
+ * from the cache until the table is evicted from the cache.
+ *
+ * L2 tables are also committed to the cache when new L2 tables are allocated
+ * in the image file. Since the L2 table cache is write-through, the new L2
+ * table is first written out to the image file and then committed to the
+ * cache.
+ *
+ * Multiple I/O requests may be using an L2 table cache entry at any given
+ * time. That means an entry may be in use across several requests and
+ * reference counting is needed to free the entry at the correct time. In
+ * particular, an entry evicted from the cache will only be freed once all
+ * references are dropped.
+ *
+ * An in-flight I/O request will hold a reference to a L2 table cache entry for
+ * the period during which it needs to access the L2 table. This includes
+ * cluster offset lookup, L2 table allocation, and L2 table update when a new
+ * data cluster has been allocated.
+ *
+ * An interesting case occurs when two requests need to access an L2 table that
+ * is not in the cache. Since the operation to read the table from the image
+ * file takes some time to complete, both requests may see a cache miss and
+ * start reading the L2 table from the image file. The first to finish will
+ * commit its L2 table into the cache. When the second tries to commit its
+ * table will be deleted in favor of the existing cache entry.
+ */
+
+#include "trace.h"
+#include "qed.h"
+
+/* Each L2 holds 2GB so this let's us fully cache a 100GB disk */
+#define MAX_L2_CACHE_SIZE 50
+
+/**
+ * Initialize the L2 cache
+ */
+void qed_init_l2_cache(L2TableCache *l2_cache)
+{
+ QTAILQ_INIT(&l2_cache->entries);
+ l2_cache->n_entries = 0;
+}
+
+/**
+ * Free the L2 cache
+ */
+void qed_free_l2_cache(L2TableCache *l2_cache)
+{
+ CachedL2Table *entry, *next_entry;
+
+ QTAILQ_FOREACH_SAFE(entry, &l2_cache->entries, node, next_entry) {
+ qemu_vfree(entry->table);
+ qemu_free(entry);
+ }
+}
+
+/**
+ * Allocate an uninitialized entry from the cache
+ *
+ * The returned entry has a reference count of 1 and is owned by the caller.
+ * The caller must allocate the actual table field for this entry and it must
+ * be freeable using qemu_vfree().
+ */
+CachedL2Table *qed_alloc_l2_cache_entry(L2TableCache *l2_cache)
+{
+ CachedL2Table *entry;
+
+ entry = qemu_mallocz(sizeof(*entry));
+ entry->ref++;
+
+ trace_qed_alloc_l2_cache_entry(l2_cache, entry);
+
+ return entry;
+}
+
+/**
+ * Decrease an entry's reference count and free if necessary when the reference
+ * count drops to zero.
+ */
+void qed_unref_l2_cache_entry(CachedL2Table *entry)
+{
+ if (!entry) {
+ return;
+ }
+
+ entry->ref--;
+ trace_qed_unref_l2_cache_entry(entry, entry->ref);
+ if (entry->ref == 0) {
+ qemu_vfree(entry->table);
+ qemu_free(entry);
+ }
+}
+
+/**
+ * Find an entry in the L2 cache. This may return NULL and it's up to the
+ * caller to satisfy the cache miss.
+ *
+ * For a cached entry, this function increases the reference count and returns
+ * the entry.
+ */
+CachedL2Table *qed_find_l2_cache_entry(L2TableCache *l2_cache, uint64_t offset)
+{
+ CachedL2Table *entry;
+
+ QTAILQ_FOREACH(entry, &l2_cache->entries, node) {
+ if (entry->offset == offset) {
+ trace_qed_find_l2_cache_entry(l2_cache, entry, offset, entry->ref);
+ entry->ref++;
+ return entry;
+ }
+ }
+ return NULL;
+}
+
+/**
+ * Commit an L2 cache entry into the cache. This is meant to be used as part of
+ * the process to satisfy a cache miss. A caller would allocate an entry which
+ * is not actually in the L2 cache and then once the entry was valid and
+ * present on disk, the entry can be committed into the cache.
+ *
+ * Since the cache is write-through, it's important that this function is not
+ * called until the entry is present on disk and the L1 has been updated to
+ * point to the entry.
+ *
+ * N.B. This function steals a reference to the l2_table from the caller so the
+ * caller must obtain a new reference by issuing a call to
+ * qed_find_l2_cache_entry().
+ */
+void qed_commit_l2_cache_entry(L2TableCache *l2_cache, CachedL2Table *l2_table)
+{
+ CachedL2Table *entry;
+
+ entry = qed_find_l2_cache_entry(l2_cache, l2_table->offset);
+ if (entry) {
+ qed_unref_l2_cache_entry(entry);
+ qed_unref_l2_cache_entry(l2_table);
+ return;
+ }
+
+ if (l2_cache->n_entries >= MAX_L2_CACHE_SIZE) {
+ entry = QTAILQ_FIRST(&l2_cache->entries);
+ QTAILQ_REMOVE(&l2_cache->entries, entry, node);
+ l2_cache->n_entries--;
+ qed_unref_l2_cache_entry(entry);
+ }
+
+ l2_cache->n_entries++;
+ QTAILQ_INSERT_TAIL(&l2_cache->entries, l2_table, node);
+}
diff --git a/qemu-0.15.x/block/qed-table.c b/qemu-0.15.x/block/qed-table.c
new file mode 100644
index 0000000..5c5d4b4
--- /dev/null
+++ b/qemu-0.15.x/block/qed-table.c
@@ -0,0 +1,319 @@
+/*
+ * QEMU Enhanced Disk Format Table I/O
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ * Stefan Hajnoczi <stefanha(a)linux.vnet.ibm.com>
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+
+#include "trace.h"
+#include "qemu_socket.h" /* for EINPROGRESS on Windows */
+#include "qed.h"
+
+typedef struct {
+ GenericCB gencb;
+ BDRVQEDState *s;
+ QEDTable *table;
+
+ struct iovec iov;
+ QEMUIOVector qiov;
+} QEDReadTableCB;
+
+static void qed_read_table_cb(void *opaque, int ret)
+{
+ QEDReadTableCB *read_table_cb = opaque;
+ QEDTable *table = read_table_cb->table;
+ int noffsets = read_table_cb->iov.iov_len / sizeof(uint64_t);
+ int i;
+
+ /* Handle I/O error */
+ if (ret) {
+ goto out;
+ }
+
+ /* Byteswap offsets */
+ for (i = 0; i < noffsets; i++) {
+ table->offsets[i] = le64_to_cpu(table->offsets[i]);
+ }
+
+out:
+ /* Completion */
+ trace_qed_read_table_cb(read_table_cb->s, read_table_cb->table, ret);
+ gencb_complete(&read_table_cb->gencb, ret);
+}
+
+static void qed_read_table(BDRVQEDState *s, uint64_t offset, QEDTable *table,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ QEDReadTableCB *read_table_cb = gencb_alloc(sizeof(*read_table_cb),
+ cb, opaque);
+ QEMUIOVector *qiov = &read_table_cb->qiov;
+ BlockDriverAIOCB *aiocb;
+
+ trace_qed_read_table(s, offset, table);
+
+ read_table_cb->s = s;
+ read_table_cb->table = table;
+ read_table_cb->iov.iov_base = table->offsets,
+ read_table_cb->iov.iov_len = s->header.cluster_size * s->header.table_size,
+
+ qemu_iovec_init_external(qiov, &read_table_cb->iov, 1);
+ aiocb = bdrv_aio_readv(s->bs->file, offset / BDRV_SECTOR_SIZE, qiov,
+ read_table_cb->iov.iov_len / BDRV_SECTOR_SIZE,
+ qed_read_table_cb, read_table_cb);
+ if (!aiocb) {
+ qed_read_table_cb(read_table_cb, -EIO);
+ }
+}
+
+typedef struct {
+ GenericCB gencb;
+ BDRVQEDState *s;
+ QEDTable *orig_table;
+ QEDTable *table;
+ bool flush; /* flush after write? */
+
+ struct iovec iov;
+ QEMUIOVector qiov;
+} QEDWriteTableCB;
+
+static void qed_write_table_cb(void *opaque, int ret)
+{
+ QEDWriteTableCB *write_table_cb = opaque;
+
+ trace_qed_write_table_cb(write_table_cb->s,
+ write_table_cb->orig_table,
+ write_table_cb->flush,
+ ret);
+
+ if (ret) {
+ goto out;
+ }
+
+ if (write_table_cb->flush) {
+ /* We still need to flush first */
+ write_table_cb->flush = false;
+ bdrv_aio_flush(write_table_cb->s->bs, qed_write_table_cb,
+ write_table_cb);
+ return;
+ }
+
+out:
+ qemu_vfree(write_table_cb->table);
+ gencb_complete(&write_table_cb->gencb, ret);
+ return;
+}
+
+/**
+ * Write out an updated part or all of a table
+ *
+ * @s: QED state
+ * @offset: Offset of table in image file, in bytes
+ * @table: Table
+ * @index: Index of first element
+ * @n: Number of elements
+ * @flush: Whether or not to sync to disk
+ * @cb: Completion function
+ * @opaque: Argument for completion function
+ */
+static void qed_write_table(BDRVQEDState *s, uint64_t offset, QEDTable *table,
+ unsigned int index, unsigned int n, bool flush,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ QEDWriteTableCB *write_table_cb;
+ BlockDriverAIOCB *aiocb;
+ unsigned int sector_mask = BDRV_SECTOR_SIZE / sizeof(uint64_t) - 1;
+ unsigned int start, end, i;
+ size_t len_bytes;
+
+ trace_qed_write_table(s, offset, table, index, n);
+
+ /* Calculate indices of the first and one after last elements */
+ start = index & ~sector_mask;
+ end = (index + n + sector_mask) & ~sector_mask;
+
+ len_bytes = (end - start) * sizeof(uint64_t);
+
+ write_table_cb = gencb_alloc(sizeof(*write_table_cb), cb, opaque);
+ write_table_cb->s = s;
+ write_table_cb->orig_table = table;
+ write_table_cb->flush = flush;
+ write_table_cb->table = qemu_blockalign(s->bs, len_bytes);
+ write_table_cb->iov.iov_base = write_table_cb->table->offsets;
+ write_table_cb->iov.iov_len = len_bytes;
+ qemu_iovec_init_external(&write_table_cb->qiov, &write_table_cb->iov, 1);
+
+ /* Byteswap table */
+ for (i = start; i < end; i++) {
+ uint64_t le_offset = cpu_to_le64(table->offsets[i]);
+ write_table_cb->table->offsets[i - start] = le_offset;
+ }
+
+ /* Adjust for offset into table */
+ offset += start * sizeof(uint64_t);
+
+ aiocb = bdrv_aio_writev(s->bs->file, offset / BDRV_SECTOR_SIZE,
+ &write_table_cb->qiov,
+ write_table_cb->iov.iov_len / BDRV_SECTOR_SIZE,
+ qed_write_table_cb, write_table_cb);
+ if (!aiocb) {
+ qed_write_table_cb(write_table_cb, -EIO);
+ }
+}
+
+/**
+ * Propagate return value from async callback
+ */
+static void qed_sync_cb(void *opaque, int ret)
+{
+ *(int *)opaque = ret;
+}
+
+int qed_read_l1_table_sync(BDRVQEDState *s)
+{
+ int ret = -EINPROGRESS;
+
+ async_context_push();
+
+ qed_read_table(s, s->header.l1_table_offset,
+ s->l1_table, qed_sync_cb, &ret);
+ while (ret == -EINPROGRESS) {
+ qemu_aio_wait();
+ }
+
+ async_context_pop();
+
+ return ret;
+}
+
+void qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BLKDBG_EVENT(s->bs->file, BLKDBG_L1_UPDATE);
+ qed_write_table(s, s->header.l1_table_offset,
+ s->l1_table, index, n, false, cb, opaque);
+}
+
+int qed_write_l1_table_sync(BDRVQEDState *s, unsigned int index,
+ unsigned int n)
+{
+ int ret = -EINPROGRESS;
+
+ async_context_push();
+
+ qed_write_l1_table(s, index, n, qed_sync_cb, &ret);
+ while (ret == -EINPROGRESS) {
+ qemu_aio_wait();
+ }
+
+ async_context_pop();
+
+ return ret;
+}
+
+typedef struct {
+ GenericCB gencb;
+ BDRVQEDState *s;
+ uint64_t l2_offset;
+ QEDRequest *request;
+} QEDReadL2TableCB;
+
+static void qed_read_l2_table_cb(void *opaque, int ret)
+{
+ QEDReadL2TableCB *read_l2_table_cb = opaque;
+ QEDRequest *request = read_l2_table_cb->request;
+ BDRVQEDState *s = read_l2_table_cb->s;
+ CachedL2Table *l2_table = request->l2_table;
+ uint64_t l2_offset = read_l2_table_cb->l2_offset;
+
+ if (ret) {
+ /* can't trust loaded L2 table anymore */
+ qed_unref_l2_cache_entry(l2_table);
+ request->l2_table = NULL;
+ } else {
+ l2_table->offset = l2_offset;
+
+ qed_commit_l2_cache_entry(&s->l2_cache, l2_table);
+
+ /* This is guaranteed to succeed because we just committed the entry
+ * to the cache.
+ */
+ request->l2_table = qed_find_l2_cache_entry(&s->l2_cache, l2_offset);
+ assert(request->l2_table != NULL);
+ }
+
+ gencb_complete(&read_l2_table_cb->gencb, ret);
+}
+
+void qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ QEDReadL2TableCB *read_l2_table_cb;
+
+ qed_unref_l2_cache_entry(request->l2_table);
+
+ /* Check for cached L2 entry */
+ request->l2_table = qed_find_l2_cache_entry(&s->l2_cache, offset);
+ if (request->l2_table) {
+ cb(opaque, 0);
+ return;
+ }
+
+ request->l2_table = qed_alloc_l2_cache_entry(&s->l2_cache);
+ request->l2_table->table = qed_alloc_table(s);
+
+ read_l2_table_cb = gencb_alloc(sizeof(*read_l2_table_cb), cb, opaque);
+ read_l2_table_cb->s = s;
+ read_l2_table_cb->l2_offset = offset;
+ read_l2_table_cb->request = request;
+
+ BLKDBG_EVENT(s->bs->file, BLKDBG_L2_LOAD);
+ qed_read_table(s, offset, request->l2_table->table,
+ qed_read_l2_table_cb, read_l2_table_cb);
+}
+
+int qed_read_l2_table_sync(BDRVQEDState *s, QEDRequest *request, uint64_t offset)
+{
+ int ret = -EINPROGRESS;
+
+ async_context_push();
+
+ qed_read_l2_table(s, request, offset, qed_sync_cb, &ret);
+ while (ret == -EINPROGRESS) {
+ qemu_aio_wait();
+ }
+
+ async_context_pop();
+ return ret;
+}
+
+void qed_write_l2_table(BDRVQEDState *s, QEDRequest *request,
+ unsigned int index, unsigned int n, bool flush,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BLKDBG_EVENT(s->bs->file, BLKDBG_L2_UPDATE);
+ qed_write_table(s, request->l2_table->offset,
+ request->l2_table->table, index, n, flush, cb, opaque);
+}
+
+int qed_write_l2_table_sync(BDRVQEDState *s, QEDRequest *request,
+ unsigned int index, unsigned int n, bool flush)
+{
+ int ret = -EINPROGRESS;
+
+ async_context_push();
+
+ qed_write_l2_table(s, request, index, n, flush, qed_sync_cb, &ret);
+ while (ret == -EINPROGRESS) {
+ qemu_aio_wait();
+ }
+
+ async_context_pop();
+ return ret;
+}
diff --git a/qemu-0.15.x/block/qed.c b/qemu-0.15.x/block/qed.c
new file mode 100644
index 0000000..4dc33be
--- /dev/null
+++ b/qemu-0.15.x/block/qed.c
@@ -0,0 +1,1504 @@
+/*
+ * QEMU Enhanced Disk Format
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ * Stefan Hajnoczi <stefanha(a)linux.vnet.ibm.com>
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+
+#include "qemu-timer.h"
+#include "trace.h"
+#include "qed.h"
+#include "qerror.h"
+
+static void qed_aio_cancel(BlockDriverAIOCB *blockacb)
+{
+ QEDAIOCB *acb = (QEDAIOCB *)blockacb;
+ bool finished = false;
+
+ /* Wait for the request to finish */
+ acb->finished = &finished;
+ while (!finished) {
+ qemu_aio_wait();
+ }
+}
+
+static AIOPool qed_aio_pool = {
+ .aiocb_size = sizeof(QEDAIOCB),
+ .cancel = qed_aio_cancel,
+};
+
+static int bdrv_qed_probe(const uint8_t *buf, int buf_size,
+ const char *filename)
+{
+ const QEDHeader *header = (const QEDHeader *)buf;
+
+ if (buf_size < sizeof(*header)) {
+ return 0;
+ }
+ if (le32_to_cpu(header->magic) != QED_MAGIC) {
+ return 0;
+ }
+ return 100;
+}
+
+/**
+ * Check whether an image format is raw
+ *
+ * @fmt: Backing file format, may be NULL
+ */
+static bool qed_fmt_is_raw(const char *fmt)
+{
+ return fmt && strcmp(fmt, "raw") == 0;
+}
+
+static void qed_header_le_to_cpu(const QEDHeader *le, QEDHeader *cpu)
+{
+ cpu->magic = le32_to_cpu(le->magic);
+ cpu->cluster_size = le32_to_cpu(le->cluster_size);
+ cpu->table_size = le32_to_cpu(le->table_size);
+ cpu->header_size = le32_to_cpu(le->header_size);
+ cpu->features = le64_to_cpu(le->features);
+ cpu->compat_features = le64_to_cpu(le->compat_features);
+ cpu->autoclear_features = le64_to_cpu(le->autoclear_features);
+ cpu->l1_table_offset = le64_to_cpu(le->l1_table_offset);
+ cpu->image_size = le64_to_cpu(le->image_size);
+ cpu->backing_filename_offset = le32_to_cpu(le->backing_filename_offset);
+ cpu->backing_filename_size = le32_to_cpu(le->backing_filename_size);
+}
+
+static void qed_header_cpu_to_le(const QEDHeader *cpu, QEDHeader *le)
+{
+ le->magic = cpu_to_le32(cpu->magic);
+ le->cluster_size = cpu_to_le32(cpu->cluster_size);
+ le->table_size = cpu_to_le32(cpu->table_size);
+ le->header_size = cpu_to_le32(cpu->header_size);
+ le->features = cpu_to_le64(cpu->features);
+ le->compat_features = cpu_to_le64(cpu->compat_features);
+ le->autoclear_features = cpu_to_le64(cpu->autoclear_features);
+ le->l1_table_offset = cpu_to_le64(cpu->l1_table_offset);
+ le->image_size = cpu_to_le64(cpu->image_size);
+ le->backing_filename_offset = cpu_to_le32(cpu->backing_filename_offset);
+ le->backing_filename_size = cpu_to_le32(cpu->backing_filename_size);
+}
+
+static int qed_write_header_sync(BDRVQEDState *s)
+{
+ QEDHeader le;
+ int ret;
+
+ qed_header_cpu_to_le(&s->header, &le);
+ ret = bdrv_pwrite(s->bs->file, 0, &le, sizeof(le));
+ if (ret != sizeof(le)) {
+ return ret;
+ }
+ return 0;
+}
+
+typedef struct {
+ GenericCB gencb;
+ BDRVQEDState *s;
+ struct iovec iov;
+ QEMUIOVector qiov;
+ int nsectors;
+ uint8_t *buf;
+} QEDWriteHeaderCB;
+
+static void qed_write_header_cb(void *opaque, int ret)
+{
+ QEDWriteHeaderCB *write_header_cb = opaque;
+
+ qemu_vfree(write_header_cb->buf);
+ gencb_complete(write_header_cb, ret);
+}
+
+static void qed_write_header_read_cb(void *opaque, int ret)
+{
+ QEDWriteHeaderCB *write_header_cb = opaque;
+ BDRVQEDState *s = write_header_cb->s;
+ BlockDriverAIOCB *acb;
+
+ if (ret) {
+ qed_write_header_cb(write_header_cb, ret);
+ return;
+ }
+
+ /* Update header */
+ qed_header_cpu_to_le(&s->header, (QEDHeader *)write_header_cb->buf);
+
+ acb = bdrv_aio_writev(s->bs->file, 0, &write_header_cb->qiov,
+ write_header_cb->nsectors, qed_write_header_cb,
+ write_header_cb);
+ if (!acb) {
+ qed_write_header_cb(write_header_cb, -EIO);
+ }
+}
+
+/**
+ * Update header in-place (does not rewrite backing filename or other strings)
+ *
+ * This function only updates known header fields in-place and does not affect
+ * extra data after the QED header.
+ */
+static void qed_write_header(BDRVQEDState *s, BlockDriverCompletionFunc cb,
+ void *opaque)
+{
+ /* We must write full sectors for O_DIRECT but cannot necessarily generate
+ * the data following the header if an unrecognized compat feature is
+ * active. Therefore, first read the sectors containing the header, update
+ * them, and write back.
+ */
+
+ BlockDriverAIOCB *acb;
+ int nsectors = (sizeof(QEDHeader) + BDRV_SECTOR_SIZE - 1) /
+ BDRV_SECTOR_SIZE;
+ size_t len = nsectors * BDRV_SECTOR_SIZE;
+ QEDWriteHeaderCB *write_header_cb = gencb_alloc(sizeof(*write_header_cb),
+ cb, opaque);
+
+ write_header_cb->s = s;
+ write_header_cb->nsectors = nsectors;
+ write_header_cb->buf = qemu_blockalign(s->bs, len);
+ write_header_cb->iov.iov_base = write_header_cb->buf;
+ write_header_cb->iov.iov_len = len;
+ qemu_iovec_init_external(&write_header_cb->qiov, &write_header_cb->iov, 1);
+
+ acb = bdrv_aio_readv(s->bs->file, 0, &write_header_cb->qiov, nsectors,
+ qed_write_header_read_cb, write_header_cb);
+ if (!acb) {
+ qed_write_header_cb(write_header_cb, -EIO);
+ }
+}
+
+static uint64_t qed_max_image_size(uint32_t cluster_size, uint32_t table_size)
+{
+ uint64_t table_entries;
+ uint64_t l2_size;
+
+ table_entries = (table_size * cluster_size) / sizeof(uint64_t);
+ l2_size = table_entries * cluster_size;
+
+ return l2_size * table_entries;
+}
+
+static bool qed_is_cluster_size_valid(uint32_t cluster_size)
+{
+ if (cluster_size < QED_MIN_CLUSTER_SIZE ||
+ cluster_size > QED_MAX_CLUSTER_SIZE) {
+ return false;
+ }
+ if (cluster_size & (cluster_size - 1)) {
+ return false; /* not power of 2 */
+ }
+ return true;
+}
+
+static bool qed_is_table_size_valid(uint32_t table_size)
+{
+ if (table_size < QED_MIN_TABLE_SIZE ||
+ table_size > QED_MAX_TABLE_SIZE) {
+ return false;
+ }
+ if (table_size & (table_size - 1)) {
+ return false; /* not power of 2 */
+ }
+ return true;
+}
+
+static bool qed_is_image_size_valid(uint64_t image_size, uint32_t cluster_size,
+ uint32_t table_size)
+{
+ if (image_size % BDRV_SECTOR_SIZE != 0) {
+ return false; /* not multiple of sector size */
+ }
+ if (image_size > qed_max_image_size(cluster_size, table_size)) {
+ return false; /* image is too large */
+ }
+ return true;
+}
+
+/**
+ * Read a string of known length from the image file
+ *
+ * @file: Image file
+ * @offset: File offset to start of string, in bytes
+ * @n: String length in bytes
+ * @buf: Destination buffer
+ * @buflen: Destination buffer length in bytes
+ * @ret: 0 on success, -errno on failure
+ *
+ * The string is NUL-terminated.
+ */
+static int qed_read_string(BlockDriverState *file, uint64_t offset, size_t n,
+ char *buf, size_t buflen)
+{
+ int ret;
+ if (n >= buflen) {
+ return -EINVAL;
+ }
+ ret = bdrv_pread(file, offset, buf, n);
+ if (ret < 0) {
+ return ret;
+ }
+ buf[n] = '\0';
+ return 0;
+}
+
+/**
+ * Allocate new clusters
+ *
+ * @s: QED state
+ * @n: Number of contiguous clusters to allocate
+ * @ret: Offset of first allocated cluster
+ *
+ * This function only produces the offset where the new clusters should be
+ * written. It updates BDRVQEDState but does not make any changes to the image
+ * file.
+ */
+static uint64_t qed_alloc_clusters(BDRVQEDState *s, unsigned int n)
+{
+ uint64_t offset = s->file_size;
+ s->file_size += n * s->header.cluster_size;
+ return offset;
+}
+
+QEDTable *qed_alloc_table(BDRVQEDState *s)
+{
+ /* Honor O_DIRECT memory alignment requirements */
+ return qemu_blockalign(s->bs,
+ s->header.cluster_size * s->header.table_size);
+}
+
+/**
+ * Allocate a new zeroed L2 table
+ */
+static CachedL2Table *qed_new_l2_table(BDRVQEDState *s)
+{
+ CachedL2Table *l2_table = qed_alloc_l2_cache_entry(&s->l2_cache);
+
+ l2_table->table = qed_alloc_table(s);
+ l2_table->offset = qed_alloc_clusters(s, s->header.table_size);
+
+ memset(l2_table->table->offsets, 0,
+ s->header.cluster_size * s->header.table_size);
+ return l2_table;
+}
+
+static void qed_aio_next_io(void *opaque, int ret);
+
+static void qed_plug_allocating_write_reqs(BDRVQEDState *s)
+{
+ assert(!s->allocating_write_reqs_plugged);
+
+ s->allocating_write_reqs_plugged = true;
+}
+
+static void qed_unplug_allocating_write_reqs(BDRVQEDState *s)
+{
+ QEDAIOCB *acb;
+
+ assert(s->allocating_write_reqs_plugged);
+
+ s->allocating_write_reqs_plugged = false;
+
+ acb = QSIMPLEQ_FIRST(&s->allocating_write_reqs);
+ if (acb) {
+ qed_aio_next_io(acb, 0);
+ }
+}
+
+static void qed_finish_clear_need_check(void *opaque, int ret)
+{
+ /* Do nothing */
+}
+
+static void qed_flush_after_clear_need_check(void *opaque, int ret)
+{
+ BDRVQEDState *s = opaque;
+
+ bdrv_aio_flush(s->bs, qed_finish_clear_need_check, s);
+
+ /* No need to wait until flush completes */
+ qed_unplug_allocating_write_reqs(s);
+}
+
+static void qed_clear_need_check(void *opaque, int ret)
+{
+ BDRVQEDState *s = opaque;
+
+ if (ret) {
+ qed_unplug_allocating_write_reqs(s);
+ return;
+ }
+
+ s->header.features &= ~QED_F_NEED_CHECK;
+ qed_write_header(s, qed_flush_after_clear_need_check, s);
+}
+
+static void qed_need_check_timer_cb(void *opaque)
+{
+ BDRVQEDState *s = opaque;
+
+ /* The timer should only fire when allocating writes have drained */
+ assert(!QSIMPLEQ_FIRST(&s->allocating_write_reqs));
+
+ trace_qed_need_check_timer_cb(s);
+
+ qed_plug_allocating_write_reqs(s);
+
+ /* Ensure writes are on disk before clearing flag */
+ bdrv_aio_flush(s->bs, qed_clear_need_check, s);
+}
+
+static void qed_start_need_check_timer(BDRVQEDState *s)
+{
+ trace_qed_start_need_check_timer(s);
+
+ /* Use vm_clock so we don't alter the image file while suspended for
+ * migration.
+ */
+ qemu_mod_timer(s->need_check_timer, qemu_get_clock_ns(vm_clock) +
+ get_ticks_per_sec() * QED_NEED_CHECK_TIMEOUT);
+}
+
+/* It's okay to call this multiple times or when no timer is started */
+static void qed_cancel_need_check_timer(BDRVQEDState *s)
+{
+ trace_qed_cancel_need_check_timer(s);
+ qemu_del_timer(s->need_check_timer);
+}
+
+static int bdrv_qed_open(BlockDriverState *bs, int flags)
+{
+ BDRVQEDState *s = bs->opaque;
+ QEDHeader le_header;
+ int64_t file_size;
+ int ret;
+
+ s->bs = bs;
+ QSIMPLEQ_INIT(&s->allocating_write_reqs);
+
+ ret = bdrv_pread(bs->file, 0, &le_header, sizeof(le_header));
+ if (ret < 0) {
+ return ret;
+ }
+ ret = 0; /* ret should always be 0 or -errno */
+ qed_header_le_to_cpu(&le_header, &s->header);
+
+ if (s->header.magic != QED_MAGIC) {
+ return -EINVAL;
+ }
+ if (s->header.features & ~QED_FEATURE_MASK) {
+ /* image uses unsupported feature bits */
+ char buf[64];
+ snprintf(buf, sizeof(buf), "%" PRIx64,
+ s->header.features & ~QED_FEATURE_MASK);
+ qerror_report(QERR_UNKNOWN_BLOCK_FORMAT_FEATURE,
+ bs->device_name, "QED", buf);
+ return -ENOTSUP;
+ }
+ if (!qed_is_cluster_size_valid(s->header.cluster_size)) {
+ return -EINVAL;
+ }
+
+ /* Round down file size to the last cluster */
+ file_size = bdrv_getlength(bs->file);
+ if (file_size < 0) {
+ return file_size;
+ }
+ s->file_size = qed_start_of_cluster(s, file_size);
+
+ if (!qed_is_table_size_valid(s->header.table_size)) {
+ return -EINVAL;
+ }
+ if (!qed_is_image_size_valid(s->header.image_size,
+ s->header.cluster_size,
+ s->header.table_size)) {
+ return -EINVAL;
+ }
+ if (!qed_check_table_offset(s, s->header.l1_table_offset)) {
+ return -EINVAL;
+ }
+
+ s->table_nelems = (s->header.cluster_size * s->header.table_size) /
+ sizeof(uint64_t);
+ s->l2_shift = ffs(s->header.cluster_size) - 1;
+ s->l2_mask = s->table_nelems - 1;
+ s->l1_shift = s->l2_shift + ffs(s->table_nelems) - 1;
+
+ if ((s->header.features & QED_F_BACKING_FILE)) {
+ if ((uint64_t)s->header.backing_filename_offset +
+ s->header.backing_filename_size >
+ s->header.cluster_size * s->header.header_size) {
+ return -EINVAL;
+ }
+
+ ret = qed_read_string(bs->file, s->header.backing_filename_offset,
+ s->header.backing_filename_size, bs->backing_file,
+ sizeof(bs->backing_file));
+ if (ret < 0) {
+ return ret;
+ }
+
+ if (s->header.features & QED_F_BACKING_FORMAT_NO_PROBE) {
+ pstrcpy(bs->backing_format, sizeof(bs->backing_format), "raw");
+ }
+ }
+
+ /* Reset unknown autoclear feature bits. This is a backwards
+ * compatibility mechanism that allows images to be opened by older
+ * programs, which "knock out" unknown feature bits. When an image is
+ * opened by a newer program again it can detect that the autoclear
+ * feature is no longer valid.
+ */
+ if ((s->header.autoclear_features & ~QED_AUTOCLEAR_FEATURE_MASK) != 0 &&
+ !bdrv_is_read_only(bs->file)) {
+ s->header.autoclear_features &= QED_AUTOCLEAR_FEATURE_MASK;
+
+ ret = qed_write_header_sync(s);
+ if (ret) {
+ return ret;
+ }
+
+ /* From here on only known autoclear feature bits are valid */
+ bdrv_flush(bs->file);
+ }
+
+ s->l1_table = qed_alloc_table(s);
+ qed_init_l2_cache(&s->l2_cache);
+
+ ret = qed_read_l1_table_sync(s);
+ if (ret) {
+ goto out;
+ }
+
+ /* If image was not closed cleanly, check consistency */
+ if (s->header.features & QED_F_NEED_CHECK) {
+ /* Read-only images cannot be fixed. There is no risk of corruption
+ * since write operations are not possible. Therefore, allow
+ * potentially inconsistent images to be opened read-only. This can
+ * aid data recovery from an otherwise inconsistent image.
+ */
+ if (!bdrv_is_read_only(bs->file)) {
+ BdrvCheckResult result = {0};
+
+ ret = qed_check(s, &result, true);
+ if (ret) {
+ goto out;
+ }
+ if (!result.corruptions && !result.check_errors) {
+ /* Ensure fixes reach storage before clearing check bit */
+ bdrv_flush(s->bs);
+
+ s->header.features &= ~QED_F_NEED_CHECK;
+ qed_write_header_sync(s);
+ }
+ }
+ }
+
+ s->need_check_timer = qemu_new_timer_ns(vm_clock,
+ qed_need_check_timer_cb, s);
+
+out:
+ if (ret) {
+ qed_free_l2_cache(&s->l2_cache);
+ qemu_vfree(s->l1_table);
+ }
+ return ret;
+}
+
+static void bdrv_qed_close(BlockDriverState *bs)
+{
+ BDRVQEDState *s = bs->opaque;
+
+ qed_cancel_need_check_timer(s);
+ qemu_free_timer(s->need_check_timer);
+
+ /* Ensure writes reach stable storage */
+ bdrv_flush(bs->file);
+
+ /* Clean shutdown, no check required on next open */
+ if (s->header.features & QED_F_NEED_CHECK) {
+ s->header.features &= ~QED_F_NEED_CHECK;
+ qed_write_header_sync(s);
+ }
+
+ qed_free_l2_cache(&s->l2_cache);
+ qemu_vfree(s->l1_table);
+}
+
+static int bdrv_qed_flush(BlockDriverState *bs)
+{
+ return bdrv_flush(bs->file);
+}
+
+static int qed_create(const char *filename, uint32_t cluster_size,
+ uint64_t image_size, uint32_t table_size,
+ const char *backing_file, const char *backing_fmt)
+{
+ QEDHeader header = {
+ .magic = QED_MAGIC,
+ .cluster_size = cluster_size,
+ .table_size = table_size,
+ .header_size = 1,
+ .features = 0,
+ .compat_features = 0,
+ .l1_table_offset = cluster_size,
+ .image_size = image_size,
+ };
+ QEDHeader le_header;
+ uint8_t *l1_table = NULL;
+ size_t l1_size = header.cluster_size * header.table_size;
+ int ret = 0;
+ BlockDriverState *bs = NULL;
+
+ ret = bdrv_create_file(filename, NULL);
+ if (ret < 0) {
+ return ret;
+ }
+
+ ret = bdrv_file_open(&bs, filename, BDRV_O_RDWR | BDRV_O_CACHE_WB);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /* File must start empty and grow, check truncate is supported */
+ ret = bdrv_truncate(bs, 0);
+ if (ret < 0) {
+ goto out;
+ }
+
+ if (backing_file) {
+ header.features |= QED_F_BACKING_FILE;
+ header.backing_filename_offset = sizeof(le_header);
+ header.backing_filename_size = strlen(backing_file);
+
+ if (qed_fmt_is_raw(backing_fmt)) {
+ header.features |= QED_F_BACKING_FORMAT_NO_PROBE;
+ }
+ }
+
+ qed_header_cpu_to_le(&header, &le_header);
+ ret = bdrv_pwrite(bs, 0, &le_header, sizeof(le_header));
+ if (ret < 0) {
+ goto out;
+ }
+ ret = bdrv_pwrite(bs, sizeof(le_header), backing_file,
+ header.backing_filename_size);
+ if (ret < 0) {
+ goto out;
+ }
+
+ l1_table = qemu_mallocz(l1_size);
+ ret = bdrv_pwrite(bs, header.l1_table_offset, l1_table, l1_size);
+ if (ret < 0) {
+ goto out;
+ }
+
+ ret = 0; /* success */
+out:
+ qemu_free(l1_table);
+ bdrv_delete(bs);
+ return ret;
+}
+
+static int bdrv_qed_create(const char *filename, QEMUOptionParameter *options)
+{
+ uint64_t image_size = 0;
+ uint32_t cluster_size = QED_DEFAULT_CLUSTER_SIZE;
+ uint32_t table_size = QED_DEFAULT_TABLE_SIZE;
+ const char *backing_file = NULL;
+ const char *backing_fmt = NULL;
+
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ image_size = options->value.n;
+ } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
+ backing_file = options->value.s;
+ } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FMT)) {
+ backing_fmt = options->value.s;
+ } else if (!strcmp(options->name, BLOCK_OPT_CLUSTER_SIZE)) {
+ if (options->value.n) {
+ cluster_size = options->value.n;
+ }
+ } else if (!strcmp(options->name, BLOCK_OPT_TABLE_SIZE)) {
+ if (options->value.n) {
+ table_size = options->value.n;
+ }
+ }
+ options++;
+ }
+
+ if (!qed_is_cluster_size_valid(cluster_size)) {
+ fprintf(stderr, "QED cluster size must be within range [%u, %u] and power of 2\n",
+ QED_MIN_CLUSTER_SIZE, QED_MAX_CLUSTER_SIZE);
+ return -EINVAL;
+ }
+ if (!qed_is_table_size_valid(table_size)) {
+ fprintf(stderr, "QED table size must be within range [%u, %u] and power of 2\n",
+ QED_MIN_TABLE_SIZE, QED_MAX_TABLE_SIZE);
+ return -EINVAL;
+ }
+ if (!qed_is_image_size_valid(image_size, cluster_size, table_size)) {
+ fprintf(stderr, "QED image size must be a non-zero multiple of "
+ "cluster size and less than %" PRIu64 " bytes\n",
+ qed_max_image_size(cluster_size, table_size));
+ return -EINVAL;
+ }
+
+ return qed_create(filename, cluster_size, image_size, table_size,
+ backing_file, backing_fmt);
+}
+
+typedef struct {
+ int is_allocated;
+ int *pnum;
+} QEDIsAllocatedCB;
+
+static void qed_is_allocated_cb(void *opaque, int ret, uint64_t offset, size_t len)
+{
+ QEDIsAllocatedCB *cb = opaque;
+ *cb->pnum = len / BDRV_SECTOR_SIZE;
+ cb->is_allocated = (ret == QED_CLUSTER_FOUND || ret == QED_CLUSTER_ZERO);
+}
+
+static int bdrv_qed_is_allocated(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors, int *pnum)
+{
+ BDRVQEDState *s = bs->opaque;
+ uint64_t pos = (uint64_t)sector_num * BDRV_SECTOR_SIZE;
+ size_t len = (size_t)nb_sectors * BDRV_SECTOR_SIZE;
+ QEDIsAllocatedCB cb = {
+ .is_allocated = -1,
+ .pnum = pnum,
+ };
+ QEDRequest request = { .l2_table = NULL };
+
+ async_context_push();
+
+ qed_find_cluster(s, &request, pos, len, qed_is_allocated_cb, &cb);
+
+ while (cb.is_allocated == -1) {
+ qemu_aio_wait();
+ }
+
+ async_context_pop();
+
+ qed_unref_l2_cache_entry(request.l2_table);
+
+ return cb.is_allocated;
+}
+
+static int bdrv_qed_make_empty(BlockDriverState *bs)
+{
+ return -ENOTSUP;
+}
+
+static BDRVQEDState *acb_to_s(QEDAIOCB *acb)
+{
+ return acb->common.bs->opaque;
+}
+
+/**
+ * Read from the backing file or zero-fill if no backing file
+ *
+ * @s: QED state
+ * @pos: Byte position in device
+ * @qiov: Destination I/O vector
+ * @cb: Completion function
+ * @opaque: User data for completion function
+ *
+ * This function reads qiov->size bytes starting at pos from the backing file.
+ * If there is no backing file then zeroes are read.
+ */
+static void qed_read_backing_file(BDRVQEDState *s, uint64_t pos,
+ QEMUIOVector *qiov,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BlockDriverAIOCB *aiocb;
+ uint64_t backing_length = 0;
+ size_t size;
+
+ /* If there is a backing file, get its length. Treat the absence of a
+ * backing file like a zero length backing file.
+ */
+ if (s->bs->backing_hd) {
+ int64_t l = bdrv_getlength(s->bs->backing_hd);
+ if (l < 0) {
+ cb(opaque, l);
+ return;
+ }
+ backing_length = l;
+ }
+
+ /* Zero all sectors if reading beyond the end of the backing file */
+ if (pos >= backing_length ||
+ pos + qiov->size > backing_length) {
+ qemu_iovec_memset(qiov, 0, qiov->size);
+ }
+
+ /* Complete now if there are no backing file sectors to read */
+ if (pos >= backing_length) {
+ cb(opaque, 0);
+ return;
+ }
+
+ /* If the read straddles the end of the backing file, shorten it */
+ size = MIN((uint64_t)backing_length - pos, qiov->size);
+
+ BLKDBG_EVENT(s->bs->file, BLKDBG_READ_BACKING);
+ aiocb = bdrv_aio_readv(s->bs->backing_hd, pos / BDRV_SECTOR_SIZE,
+ qiov, size / BDRV_SECTOR_SIZE, cb, opaque);
+ if (!aiocb) {
+ cb(opaque, -EIO);
+ }
+}
+
+typedef struct {
+ GenericCB gencb;
+ BDRVQEDState *s;
+ QEMUIOVector qiov;
+ struct iovec iov;
+ uint64_t offset;
+} CopyFromBackingFileCB;
+
+static void qed_copy_from_backing_file_cb(void *opaque, int ret)
+{
+ CopyFromBackingFileCB *copy_cb = opaque;
+ qemu_vfree(copy_cb->iov.iov_base);
+ gencb_complete(©_cb->gencb, ret);
+}
+
+static void qed_copy_from_backing_file_write(void *opaque, int ret)
+{
+ CopyFromBackingFileCB *copy_cb = opaque;
+ BDRVQEDState *s = copy_cb->s;
+ BlockDriverAIOCB *aiocb;
+
+ if (ret) {
+ qed_copy_from_backing_file_cb(copy_cb, ret);
+ return;
+ }
+
+ BLKDBG_EVENT(s->bs->file, BLKDBG_COW_WRITE);
+ aiocb = bdrv_aio_writev(s->bs->file, copy_cb->offset / BDRV_SECTOR_SIZE,
+ ©_cb->qiov,
+ copy_cb->qiov.size / BDRV_SECTOR_SIZE,
+ qed_copy_from_backing_file_cb, copy_cb);
+ if (!aiocb) {
+ qed_copy_from_backing_file_cb(copy_cb, -EIO);
+ }
+}
+
+/**
+ * Copy data from backing file into the image
+ *
+ * @s: QED state
+ * @pos: Byte position in device
+ * @len: Number of bytes
+ * @offset: Byte offset in image file
+ * @cb: Completion function
+ * @opaque: User data for completion function
+ */
+static void qed_copy_from_backing_file(BDRVQEDState *s, uint64_t pos,
+ uint64_t len, uint64_t offset,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ CopyFromBackingFileCB *copy_cb;
+
+ /* Skip copy entirely if there is no work to do */
+ if (len == 0) {
+ cb(opaque, 0);
+ return;
+ }
+
+ copy_cb = gencb_alloc(sizeof(*copy_cb), cb, opaque);
+ copy_cb->s = s;
+ copy_cb->offset = offset;
+ copy_cb->iov.iov_base = qemu_blockalign(s->bs, len);
+ copy_cb->iov.iov_len = len;
+ qemu_iovec_init_external(©_cb->qiov, ©_cb->iov, 1);
+
+ qed_read_backing_file(s, pos, ©_cb->qiov,
+ qed_copy_from_backing_file_write, copy_cb);
+}
+
+/**
+ * Link one or more contiguous clusters into a table
+ *
+ * @s: QED state
+ * @table: L2 table
+ * @index: First cluster index
+ * @n: Number of contiguous clusters
+ * @cluster: First cluster offset
+ *
+ * The cluster offset may be an allocated byte offset in the image file, the
+ * zero cluster marker, or the unallocated cluster marker.
+ */
+static void qed_update_l2_table(BDRVQEDState *s, QEDTable *table, int index,
+ unsigned int n, uint64_t cluster)
+{
+ int i;
+ for (i = index; i < index + n; i++) {
+ table->offsets[i] = cluster;
+ if (!qed_offset_is_unalloc_cluster(cluster) &&
+ !qed_offset_is_zero_cluster(cluster)) {
+ cluster += s->header.cluster_size;
+ }
+ }
+}
+
+static void qed_aio_complete_bh(void *opaque)
+{
+ QEDAIOCB *acb = opaque;
+ BlockDriverCompletionFunc *cb = acb->common.cb;
+ void *user_opaque = acb->common.opaque;
+ int ret = acb->bh_ret;
+ bool *finished = acb->finished;
+
+ qemu_bh_delete(acb->bh);
+ qemu_aio_release(acb);
+
+ /* Invoke callback */
+ cb(user_opaque, ret);
+
+ /* Signal cancel completion */
+ if (finished) {
+ *finished = true;
+ }
+}
+
+static void qed_aio_complete(QEDAIOCB *acb, int ret)
+{
+ BDRVQEDState *s = acb_to_s(acb);
+
+ trace_qed_aio_complete(s, acb, ret);
+
+ /* Free resources */
+ qemu_iovec_destroy(&acb->cur_qiov);
+ qed_unref_l2_cache_entry(acb->request.l2_table);
+
+ /* Arrange for a bh to invoke the completion function */
+ acb->bh_ret = ret;
+ acb->bh = qemu_bh_new(qed_aio_complete_bh, acb);
+ qemu_bh_schedule(acb->bh);
+
+ /* Start next allocating write request waiting behind this one. Note that
+ * requests enqueue themselves when they first hit an unallocated cluster
+ * but they wait until the entire request is finished before waking up the
+ * next request in the queue. This ensures that we don't cycle through
+ * requests multiple times but rather finish one at a time completely.
+ */
+ if (acb == QSIMPLEQ_FIRST(&s->allocating_write_reqs)) {
+ QSIMPLEQ_REMOVE_HEAD(&s->allocating_write_reqs, next);
+ acb = QSIMPLEQ_FIRST(&s->allocating_write_reqs);
+ if (acb) {
+ qed_aio_next_io(acb, 0);
+ } else if (s->header.features & QED_F_NEED_CHECK) {
+ qed_start_need_check_timer(s);
+ }
+ }
+}
+
+/**
+ * Commit the current L2 table to the cache
+ */
+static void qed_commit_l2_update(void *opaque, int ret)
+{
+ QEDAIOCB *acb = opaque;
+ BDRVQEDState *s = acb_to_s(acb);
+ CachedL2Table *l2_table = acb->request.l2_table;
+ uint64_t l2_offset = l2_table->offset;
+
+ qed_commit_l2_cache_entry(&s->l2_cache, l2_table);
+
+ /* This is guaranteed to succeed because we just committed the entry to the
+ * cache.
+ */
+ acb->request.l2_table = qed_find_l2_cache_entry(&s->l2_cache, l2_offset);
+ assert(acb->request.l2_table != NULL);
+
+ qed_aio_next_io(opaque, ret);
+}
+
+/**
+ * Update L1 table with new L2 table offset and write it out
+ */
+static void qed_aio_write_l1_update(void *opaque, int ret)
+{
+ QEDAIOCB *acb = opaque;
+ BDRVQEDState *s = acb_to_s(acb);
+ int index;
+
+ if (ret) {
+ qed_aio_complete(acb, ret);
+ return;
+ }
+
+ index = qed_l1_index(s, acb->cur_pos);
+ s->l1_table->offsets[index] = acb->request.l2_table->offset;
+
+ qed_write_l1_table(s, index, 1, qed_commit_l2_update, acb);
+}
+
+/**
+ * Update L2 table with new cluster offsets and write them out
+ */
+static void qed_aio_write_l2_update(void *opaque, int ret)
+{
+ QEDAIOCB *acb = opaque;
+ BDRVQEDState *s = acb_to_s(acb);
+ bool need_alloc = acb->find_cluster_ret == QED_CLUSTER_L1;
+ int index;
+
+ if (ret) {
+ goto err;
+ }
+
+ if (need_alloc) {
+ qed_unref_l2_cache_entry(acb->request.l2_table);
+ acb->request.l2_table = qed_new_l2_table(s);
+ }
+
+ index = qed_l2_index(s, acb->cur_pos);
+ qed_update_l2_table(s, acb->request.l2_table->table, index, acb->cur_nclusters,
+ acb->cur_cluster);
+
+ if (need_alloc) {
+ /* Write out the whole new L2 table */
+ qed_write_l2_table(s, &acb->request, 0, s->table_nelems, true,
+ qed_aio_write_l1_update, acb);
+ } else {
+ /* Write out only the updated part of the L2 table */
+ qed_write_l2_table(s, &acb->request, index, acb->cur_nclusters, false,
+ qed_aio_next_io, acb);
+ }
+ return;
+
+err:
+ qed_aio_complete(acb, ret);
+}
+
+/**
+ * Flush new data clusters before updating the L2 table
+ *
+ * This flush is necessary when a backing file is in use. A crash during an
+ * allocating write could result in empty clusters in the image. If the write
+ * only touched a subregion of the cluster, then backing image sectors have
+ * been lost in the untouched region. The solution is to flush after writing a
+ * new data cluster and before updating the L2 table.
+ */
+static void qed_aio_write_flush_before_l2_update(void *opaque, int ret)
+{
+ QEDAIOCB *acb = opaque;
+ BDRVQEDState *s = acb_to_s(acb);
+
+ if (!bdrv_aio_flush(s->bs->file, qed_aio_write_l2_update, opaque)) {
+ qed_aio_complete(acb, -EIO);
+ }
+}
+
+/**
+ * Write data to the image file
+ */
+static void qed_aio_write_main(void *opaque, int ret)
+{
+ QEDAIOCB *acb = opaque;
+ BDRVQEDState *s = acb_to_s(acb);
+ uint64_t offset = acb->cur_cluster +
+ qed_offset_into_cluster(s, acb->cur_pos);
+ BlockDriverCompletionFunc *next_fn;
+ BlockDriverAIOCB *file_acb;
+
+ trace_qed_aio_write_main(s, acb, ret, offset, acb->cur_qiov.size);
+
+ if (ret) {
+ qed_aio_complete(acb, ret);
+ return;
+ }
+
+ if (acb->find_cluster_ret == QED_CLUSTER_FOUND) {
+ next_fn = qed_aio_next_io;
+ } else {
+ if (s->bs->backing_hd) {
+ next_fn = qed_aio_write_flush_before_l2_update;
+ } else {
+ next_fn = qed_aio_write_l2_update;
+ }
+ }
+
+ BLKDBG_EVENT(s->bs->file, BLKDBG_WRITE_AIO);
+ file_acb = bdrv_aio_writev(s->bs->file, offset / BDRV_SECTOR_SIZE,
+ &acb->cur_qiov,
+ acb->cur_qiov.size / BDRV_SECTOR_SIZE,
+ next_fn, acb);
+ if (!file_acb) {
+ qed_aio_complete(acb, -EIO);
+ }
+}
+
+/**
+ * Populate back untouched region of new data cluster
+ */
+static void qed_aio_write_postfill(void *opaque, int ret)
+{
+ QEDAIOCB *acb = opaque;
+ BDRVQEDState *s = acb_to_s(acb);
+ uint64_t start = acb->cur_pos + acb->cur_qiov.size;
+ uint64_t len =
+ qed_start_of_cluster(s, start + s->header.cluster_size - 1) - start;
+ uint64_t offset = acb->cur_cluster +
+ qed_offset_into_cluster(s, acb->cur_pos) +
+ acb->cur_qiov.size;
+
+ if (ret) {
+ qed_aio_complete(acb, ret);
+ return;
+ }
+
+ trace_qed_aio_write_postfill(s, acb, start, len, offset);
+ qed_copy_from_backing_file(s, start, len, offset,
+ qed_aio_write_main, acb);
+}
+
+/**
+ * Populate front untouched region of new data cluster
+ */
+static void qed_aio_write_prefill(void *opaque, int ret)
+{
+ QEDAIOCB *acb = opaque;
+ BDRVQEDState *s = acb_to_s(acb);
+ uint64_t start = qed_start_of_cluster(s, acb->cur_pos);
+ uint64_t len = qed_offset_into_cluster(s, acb->cur_pos);
+
+ trace_qed_aio_write_prefill(s, acb, start, len, acb->cur_cluster);
+ qed_copy_from_backing_file(s, start, len, acb->cur_cluster,
+ qed_aio_write_postfill, acb);
+}
+
+/**
+ * Check if the QED_F_NEED_CHECK bit should be set during allocating write
+ */
+static bool qed_should_set_need_check(BDRVQEDState *s)
+{
+ /* The flush before L2 update path ensures consistency */
+ if (s->bs->backing_hd) {
+ return false;
+ }
+
+ return !(s->header.features & QED_F_NEED_CHECK);
+}
+
+/**
+ * Write new data cluster
+ *
+ * @acb: Write request
+ * @len: Length in bytes
+ *
+ * This path is taken when writing to previously unallocated clusters.
+ */
+static void qed_aio_write_alloc(QEDAIOCB *acb, size_t len)
+{
+ BDRVQEDState *s = acb_to_s(acb);
+
+ /* Cancel timer when the first allocating request comes in */
+ if (QSIMPLEQ_EMPTY(&s->allocating_write_reqs)) {
+ qed_cancel_need_check_timer(s);
+ }
+
+ /* Freeze this request if another allocating write is in progress */
+ if (acb != QSIMPLEQ_FIRST(&s->allocating_write_reqs)) {
+ QSIMPLEQ_INSERT_TAIL(&s->allocating_write_reqs, acb, next);
+ }
+ if (acb != QSIMPLEQ_FIRST(&s->allocating_write_reqs) ||
+ s->allocating_write_reqs_plugged) {
+ return; /* wait for existing request to finish */
+ }
+
+ acb->cur_nclusters = qed_bytes_to_clusters(s,
+ qed_offset_into_cluster(s, acb->cur_pos) + len);
+ acb->cur_cluster = qed_alloc_clusters(s, acb->cur_nclusters);
+ qemu_iovec_copy(&acb->cur_qiov, acb->qiov, acb->qiov_offset, len);
+
+ if (qed_should_set_need_check(s)) {
+ s->header.features |= QED_F_NEED_CHECK;
+ qed_write_header(s, qed_aio_write_prefill, acb);
+ } else {
+ qed_aio_write_prefill(acb, 0);
+ }
+}
+
+/**
+ * Write data cluster in place
+ *
+ * @acb: Write request
+ * @offset: Cluster offset in bytes
+ * @len: Length in bytes
+ *
+ * This path is taken when writing to already allocated clusters.
+ */
+static void qed_aio_write_inplace(QEDAIOCB *acb, uint64_t offset, size_t len)
+{
+ /* Calculate the I/O vector */
+ acb->cur_cluster = offset;
+ qemu_iovec_copy(&acb->cur_qiov, acb->qiov, acb->qiov_offset, len);
+
+ /* Do the actual write */
+ qed_aio_write_main(acb, 0);
+}
+
+/**
+ * Write data cluster
+ *
+ * @opaque: Write request
+ * @ret: QED_CLUSTER_FOUND, QED_CLUSTER_L2, QED_CLUSTER_L1,
+ * or -errno
+ * @offset: Cluster offset in bytes
+ * @len: Length in bytes
+ *
+ * Callback from qed_find_cluster().
+ */
+static void qed_aio_write_data(void *opaque, int ret,
+ uint64_t offset, size_t len)
+{
+ QEDAIOCB *acb = opaque;
+
+ trace_qed_aio_write_data(acb_to_s(acb), acb, ret, offset, len);
+
+ acb->find_cluster_ret = ret;
+
+ switch (ret) {
+ case QED_CLUSTER_FOUND:
+ qed_aio_write_inplace(acb, offset, len);
+ break;
+
+ case QED_CLUSTER_L2:
+ case QED_CLUSTER_L1:
+ case QED_CLUSTER_ZERO:
+ qed_aio_write_alloc(acb, len);
+ break;
+
+ default:
+ qed_aio_complete(acb, ret);
+ break;
+ }
+}
+
+/**
+ * Read data cluster
+ *
+ * @opaque: Read request
+ * @ret: QED_CLUSTER_FOUND, QED_CLUSTER_L2, QED_CLUSTER_L1,
+ * or -errno
+ * @offset: Cluster offset in bytes
+ * @len: Length in bytes
+ *
+ * Callback from qed_find_cluster().
+ */
+static void qed_aio_read_data(void *opaque, int ret,
+ uint64_t offset, size_t len)
+{
+ QEDAIOCB *acb = opaque;
+ BDRVQEDState *s = acb_to_s(acb);
+ BlockDriverState *bs = acb->common.bs;
+ BlockDriverAIOCB *file_acb;
+
+ /* Adjust offset into cluster */
+ offset += qed_offset_into_cluster(s, acb->cur_pos);
+
+ trace_qed_aio_read_data(s, acb, ret, offset, len);
+
+ if (ret < 0) {
+ goto err;
+ }
+
+ qemu_iovec_copy(&acb->cur_qiov, acb->qiov, acb->qiov_offset, len);
+
+ /* Handle zero cluster and backing file reads */
+ if (ret == QED_CLUSTER_ZERO) {
+ qemu_iovec_memset(&acb->cur_qiov, 0, acb->cur_qiov.size);
+ qed_aio_next_io(acb, 0);
+ return;
+ } else if (ret != QED_CLUSTER_FOUND) {
+ qed_read_backing_file(s, acb->cur_pos, &acb->cur_qiov,
+ qed_aio_next_io, acb);
+ return;
+ }
+
+ BLKDBG_EVENT(bs->file, BLKDBG_READ_AIO);
+ file_acb = bdrv_aio_readv(bs->file, offset / BDRV_SECTOR_SIZE,
+ &acb->cur_qiov,
+ acb->cur_qiov.size / BDRV_SECTOR_SIZE,
+ qed_aio_next_io, acb);
+ if (!file_acb) {
+ ret = -EIO;
+ goto err;
+ }
+ return;
+
+err:
+ qed_aio_complete(acb, ret);
+}
+
+/**
+ * Begin next I/O or complete the request
+ */
+static void qed_aio_next_io(void *opaque, int ret)
+{
+ QEDAIOCB *acb = opaque;
+ BDRVQEDState *s = acb_to_s(acb);
+ QEDFindClusterFunc *io_fn =
+ acb->is_write ? qed_aio_write_data : qed_aio_read_data;
+
+ trace_qed_aio_next_io(s, acb, ret, acb->cur_pos + acb->cur_qiov.size);
+
+ /* Handle I/O error */
+ if (ret) {
+ qed_aio_complete(acb, ret);
+ return;
+ }
+
+ acb->qiov_offset += acb->cur_qiov.size;
+ acb->cur_pos += acb->cur_qiov.size;
+ qemu_iovec_reset(&acb->cur_qiov);
+
+ /* Complete request */
+ if (acb->cur_pos >= acb->end_pos) {
+ qed_aio_complete(acb, 0);
+ return;
+ }
+
+ /* Find next cluster and start I/O */
+ qed_find_cluster(s, &acb->request,
+ acb->cur_pos, acb->end_pos - acb->cur_pos,
+ io_fn, acb);
+}
+
+static BlockDriverAIOCB *qed_aio_setup(BlockDriverState *bs,
+ int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque, bool is_write)
+{
+ QEDAIOCB *acb = qemu_aio_get(&qed_aio_pool, bs, cb, opaque);
+
+ trace_qed_aio_setup(bs->opaque, acb, sector_num, nb_sectors,
+ opaque, is_write);
+
+ acb->is_write = is_write;
+ acb->finished = NULL;
+ acb->qiov = qiov;
+ acb->qiov_offset = 0;
+ acb->cur_pos = (uint64_t)sector_num * BDRV_SECTOR_SIZE;
+ acb->end_pos = acb->cur_pos + nb_sectors * BDRV_SECTOR_SIZE;
+ acb->request.l2_table = NULL;
+ qemu_iovec_init(&acb->cur_qiov, qiov->niov);
+
+ /* Start request */
+ qed_aio_next_io(acb, 0);
+ return &acb->common;
+}
+
+static BlockDriverAIOCB *bdrv_qed_aio_readv(BlockDriverState *bs,
+ int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ return qed_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, false);
+}
+
+static BlockDriverAIOCB *bdrv_qed_aio_writev(BlockDriverState *bs,
+ int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ return qed_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, true);
+}
+
+static BlockDriverAIOCB *bdrv_qed_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ return bdrv_aio_flush(bs->file, cb, opaque);
+}
+
+static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset)
+{
+ BDRVQEDState *s = bs->opaque;
+ uint64_t old_image_size;
+ int ret;
+
+ if (!qed_is_image_size_valid(offset, s->header.cluster_size,
+ s->header.table_size)) {
+ return -EINVAL;
+ }
+
+ /* Shrinking is currently not supported */
+ if ((uint64_t)offset < s->header.image_size) {
+ return -ENOTSUP;
+ }
+
+ old_image_size = s->header.image_size;
+ s->header.image_size = offset;
+ ret = qed_write_header_sync(s);
+ if (ret < 0) {
+ s->header.image_size = old_image_size;
+ }
+ return ret;
+}
+
+static int64_t bdrv_qed_getlength(BlockDriverState *bs)
+{
+ BDRVQEDState *s = bs->opaque;
+ return s->header.image_size;
+}
+
+static int bdrv_qed_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
+{
+ BDRVQEDState *s = bs->opaque;
+
+ memset(bdi, 0, sizeof(*bdi));
+ bdi->cluster_size = s->header.cluster_size;
+ return 0;
+}
+
+static int bdrv_qed_change_backing_file(BlockDriverState *bs,
+ const char *backing_file,
+ const char *backing_fmt)
+{
+ BDRVQEDState *s = bs->opaque;
+ QEDHeader new_header, le_header;
+ void *buffer;
+ size_t buffer_len, backing_file_len;
+ int ret;
+
+ /* Refuse to set backing filename if unknown compat feature bits are
+ * active. If the image uses an unknown compat feature then we may not
+ * know the layout of data following the header structure and cannot safely
+ * add a new string.
+ */
+ if (backing_file && (s->header.compat_features &
+ ~QED_COMPAT_FEATURE_MASK)) {
+ return -ENOTSUP;
+ }
+
+ memcpy(&new_header, &s->header, sizeof(new_header));
+
+ new_header.features &= ~(QED_F_BACKING_FILE |
+ QED_F_BACKING_FORMAT_NO_PROBE);
+
+ /* Adjust feature flags */
+ if (backing_file) {
+ new_header.features |= QED_F_BACKING_FILE;
+
+ if (qed_fmt_is_raw(backing_fmt)) {
+ new_header.features |= QED_F_BACKING_FORMAT_NO_PROBE;
+ }
+ }
+
+ /* Calculate new header size */
+ backing_file_len = 0;
+
+ if (backing_file) {
+ backing_file_len = strlen(backing_file);
+ }
+
+ buffer_len = sizeof(new_header);
+ new_header.backing_filename_offset = buffer_len;
+ new_header.backing_filename_size = backing_file_len;
+ buffer_len += backing_file_len;
+
+ /* Make sure we can rewrite header without failing */
+ if (buffer_len > new_header.header_size * new_header.cluster_size) {
+ return -ENOSPC;
+ }
+
+ /* Prepare new header */
+ buffer = qemu_malloc(buffer_len);
+
+ qed_header_cpu_to_le(&new_header, &le_header);
+ memcpy(buffer, &le_header, sizeof(le_header));
+ buffer_len = sizeof(le_header);
+
+ memcpy(buffer + buffer_len, backing_file, backing_file_len);
+ buffer_len += backing_file_len;
+
+ /* Write new header */
+ ret = bdrv_pwrite_sync(bs->file, 0, buffer, buffer_len);
+ qemu_free(buffer);
+ if (ret == 0) {
+ memcpy(&s->header, &new_header, sizeof(new_header));
+ }
+ return ret;
+}
+
+static int bdrv_qed_check(BlockDriverState *bs, BdrvCheckResult *result)
+{
+ BDRVQEDState *s = bs->opaque;
+
+ return qed_check(s, result, false);
+}
+
+static QEMUOptionParameter qed_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size (in bytes)"
+ }, {
+ .name = BLOCK_OPT_BACKING_FILE,
+ .type = OPT_STRING,
+ .help = "File name of a base image"
+ }, {
+ .name = BLOCK_OPT_BACKING_FMT,
+ .type = OPT_STRING,
+ .help = "Image format of the base image"
+ }, {
+ .name = BLOCK_OPT_CLUSTER_SIZE,
+ .type = OPT_SIZE,
+ .help = "Cluster size (in bytes)",
+ .value = { .n = QED_DEFAULT_CLUSTER_SIZE },
+ }, {
+ .name = BLOCK_OPT_TABLE_SIZE,
+ .type = OPT_SIZE,
+ .help = "L1/L2 table size (in clusters)"
+ },
+ { /* end of list */ }
+};
+
+static BlockDriver bdrv_qed = {
+ .format_name = "qed",
+ .instance_size = sizeof(BDRVQEDState),
+ .create_options = qed_create_options,
+
+ .bdrv_probe = bdrv_qed_probe,
+ .bdrv_open = bdrv_qed_open,
+ .bdrv_close = bdrv_qed_close,
+ .bdrv_create = bdrv_qed_create,
+ .bdrv_flush = bdrv_qed_flush,
+ .bdrv_is_allocated = bdrv_qed_is_allocated,
+ .bdrv_make_empty = bdrv_qed_make_empty,
+ .bdrv_aio_readv = bdrv_qed_aio_readv,
+ .bdrv_aio_writev = bdrv_qed_aio_writev,
+ .bdrv_aio_flush = bdrv_qed_aio_flush,
+ .bdrv_truncate = bdrv_qed_truncate,
+ .bdrv_getlength = bdrv_qed_getlength,
+ .bdrv_get_info = bdrv_qed_get_info,
+ .bdrv_change_backing_file = bdrv_qed_change_backing_file,
+ .bdrv_check = bdrv_qed_check,
+};
+
+static void bdrv_qed_init(void)
+{
+ bdrv_register(&bdrv_qed);
+}
+
+block_init(bdrv_qed_init);
diff --git a/qemu-0.15.x/block/qed.h b/qemu-0.15.x/block/qed.h
new file mode 100644
index 0000000..388fdb3
--- /dev/null
+++ b/qemu-0.15.x/block/qed.h
@@ -0,0 +1,334 @@
+/*
+ * QEMU Enhanced Disk Format
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ * Stefan Hajnoczi <stefanha(a)linux.vnet.ibm.com>
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+
+#ifndef BLOCK_QED_H
+#define BLOCK_QED_H
+
+#include "block_int.h"
+
+/* The layout of a QED file is as follows:
+ *
+ * +--------+----------+----------+----------+-----+
+ * | header | L1 table | cluster0 | cluster1 | ... |
+ * +--------+----------+----------+----------+-----+
+ *
+ * There is a 2-level pagetable for cluster allocation:
+ *
+ * +----------+
+ * | L1 table |
+ * +----------+
+ * ,------' | '------.
+ * +----------+ | +----------+
+ * | L2 table | ... | L2 table |
+ * +----------+ +----------+
+ * ,------' | '------.
+ * +----------+ | +----------+
+ * | Data | ... | Data |
+ * +----------+ +----------+
+ *
+ * The L1 table is fixed size and always present. L2 tables are allocated on
+ * demand. The L1 table size determines the maximum possible image size; it
+ * can be influenced using the cluster_size and table_size values.
+ *
+ * All fields are little-endian on disk.
+ */
+
+enum {
+ QED_MAGIC = 'Q' | 'E' << 8 | 'D' << 16 | '\0' << 24,
+
+ /* The image supports a backing file */
+ QED_F_BACKING_FILE = 0x01,
+
+ /* The image needs a consistency check before use */
+ QED_F_NEED_CHECK = 0x02,
+
+ /* The backing file format must not be probed, treat as raw image */
+ QED_F_BACKING_FORMAT_NO_PROBE = 0x04,
+
+ /* Feature bits must be used when the on-disk format changes */
+ QED_FEATURE_MASK = QED_F_BACKING_FILE | /* supported feature bits */
+ QED_F_NEED_CHECK |
+ QED_F_BACKING_FORMAT_NO_PROBE,
+ QED_COMPAT_FEATURE_MASK = 0, /* supported compat feature bits */
+ QED_AUTOCLEAR_FEATURE_MASK = 0, /* supported autoclear feature bits */
+
+ /* Data is stored in groups of sectors called clusters. Cluster size must
+ * be large to avoid keeping too much metadata. I/O requests that have
+ * sub-cluster size will require read-modify-write.
+ */
+ QED_MIN_CLUSTER_SIZE = 4 * 1024, /* in bytes */
+ QED_MAX_CLUSTER_SIZE = 64 * 1024 * 1024,
+ QED_DEFAULT_CLUSTER_SIZE = 64 * 1024,
+
+ /* Allocated clusters are tracked using a 2-level pagetable. Table size is
+ * a multiple of clusters so large maximum image sizes can be supported
+ * without jacking up the cluster size too much.
+ */
+ QED_MIN_TABLE_SIZE = 1, /* in clusters */
+ QED_MAX_TABLE_SIZE = 16,
+ QED_DEFAULT_TABLE_SIZE = 4,
+
+ /* Delay to flush and clean image after last allocating write completes */
+ QED_NEED_CHECK_TIMEOUT = 5, /* in seconds */
+};
+
+typedef struct {
+ uint32_t magic; /* QED\0 */
+
+ uint32_t cluster_size; /* in bytes */
+ uint32_t table_size; /* for L1 and L2 tables, in clusters */
+ uint32_t header_size; /* in clusters */
+
+ uint64_t features; /* format feature bits */
+ uint64_t compat_features; /* compatible feature bits */
+ uint64_t autoclear_features; /* self-resetting feature bits */
+
+ uint64_t l1_table_offset; /* in bytes */
+ uint64_t image_size; /* total logical image size, in bytes */
+
+ /* if (features & QED_F_BACKING_FILE) */
+ uint32_t backing_filename_offset; /* in bytes from start of header */
+ uint32_t backing_filename_size; /* in bytes */
+} QEDHeader;
+
+typedef struct {
+ uint64_t offsets[0]; /* in bytes */
+} QEDTable;
+
+/* The L2 cache is a simple write-through cache for L2 structures */
+typedef struct CachedL2Table {
+ QEDTable *table;
+ uint64_t offset; /* offset=0 indicates an invalidate entry */
+ QTAILQ_ENTRY(CachedL2Table) node;
+ int ref;
+} CachedL2Table;
+
+typedef struct {
+ QTAILQ_HEAD(, CachedL2Table) entries;
+ unsigned int n_entries;
+} L2TableCache;
+
+typedef struct QEDRequest {
+ CachedL2Table *l2_table;
+} QEDRequest;
+
+typedef struct QEDAIOCB {
+ BlockDriverAIOCB common;
+ QEMUBH *bh;
+ int bh_ret; /* final return status for completion bh */
+ QSIMPLEQ_ENTRY(QEDAIOCB) next; /* next request */
+ bool is_write; /* false - read, true - write */
+ bool *finished; /* signal for cancel completion */
+ uint64_t end_pos; /* request end on block device, in bytes */
+
+ /* User scatter-gather list */
+ QEMUIOVector *qiov;
+ size_t qiov_offset; /* byte count already processed */
+
+ /* Current cluster scatter-gather list */
+ QEMUIOVector cur_qiov;
+ uint64_t cur_pos; /* position on block device, in bytes */
+ uint64_t cur_cluster; /* cluster offset in image file */
+ unsigned int cur_nclusters; /* number of clusters being accessed */
+ int find_cluster_ret; /* used for L1/L2 update */
+
+ QEDRequest request;
+} QEDAIOCB;
+
+typedef struct {
+ BlockDriverState *bs; /* device */
+ uint64_t file_size; /* length of image file, in bytes */
+
+ QEDHeader header; /* always cpu-endian */
+ QEDTable *l1_table;
+ L2TableCache l2_cache; /* l2 table cache */
+ uint32_t table_nelems;
+ uint32_t l1_shift;
+ uint32_t l2_shift;
+ uint32_t l2_mask;
+
+ /* Allocating write request queue */
+ QSIMPLEQ_HEAD(, QEDAIOCB) allocating_write_reqs;
+ bool allocating_write_reqs_plugged;
+
+ /* Periodic flush and clear need check flag */
+ QEMUTimer *need_check_timer;
+} BDRVQEDState;
+
+enum {
+ QED_CLUSTER_FOUND, /* cluster found */
+ QED_CLUSTER_ZERO, /* zero cluster found */
+ QED_CLUSTER_L2, /* cluster missing in L2 */
+ QED_CLUSTER_L1, /* cluster missing in L1 */
+};
+
+/**
+ * qed_find_cluster() completion callback
+ *
+ * @opaque: User data for completion callback
+ * @ret: QED_CLUSTER_FOUND Success
+ * QED_CLUSTER_L2 Data cluster unallocated in L2
+ * QED_CLUSTER_L1 L2 unallocated in L1
+ * -errno POSIX error occurred
+ * @offset: Data cluster offset
+ * @len: Contiguous bytes starting from cluster offset
+ *
+ * This function is invoked when qed_find_cluster() completes.
+ *
+ * On success ret is QED_CLUSTER_FOUND and offset/len are a contiguous range
+ * in the image file.
+ *
+ * On failure ret is QED_CLUSTER_L2 or QED_CLUSTER_L1 for missing L2 or L1
+ * table offset, respectively. len is number of contiguous unallocated bytes.
+ */
+typedef void QEDFindClusterFunc(void *opaque, int ret, uint64_t offset, size_t len);
+
+/**
+ * Generic callback for chaining async callbacks
+ */
+typedef struct {
+ BlockDriverCompletionFunc *cb;
+ void *opaque;
+} GenericCB;
+
+void *gencb_alloc(size_t len, BlockDriverCompletionFunc *cb, void *opaque);
+void gencb_complete(void *opaque, int ret);
+
+/**
+ * L2 cache functions
+ */
+void qed_init_l2_cache(L2TableCache *l2_cache);
+void qed_free_l2_cache(L2TableCache *l2_cache);
+CachedL2Table *qed_alloc_l2_cache_entry(L2TableCache *l2_cache);
+void qed_unref_l2_cache_entry(CachedL2Table *entry);
+CachedL2Table *qed_find_l2_cache_entry(L2TableCache *l2_cache, uint64_t offset);
+void qed_commit_l2_cache_entry(L2TableCache *l2_cache, CachedL2Table *l2_table);
+
+/**
+ * Table I/O functions
+ */
+int qed_read_l1_table_sync(BDRVQEDState *s);
+void qed_write_l1_table(BDRVQEDState *s, unsigned int index, unsigned int n,
+ BlockDriverCompletionFunc *cb, void *opaque);
+int qed_write_l1_table_sync(BDRVQEDState *s, unsigned int index,
+ unsigned int n);
+int qed_read_l2_table_sync(BDRVQEDState *s, QEDRequest *request,
+ uint64_t offset);
+void qed_read_l2_table(BDRVQEDState *s, QEDRequest *request, uint64_t offset,
+ BlockDriverCompletionFunc *cb, void *opaque);
+void qed_write_l2_table(BDRVQEDState *s, QEDRequest *request,
+ unsigned int index, unsigned int n, bool flush,
+ BlockDriverCompletionFunc *cb, void *opaque);
+int qed_write_l2_table_sync(BDRVQEDState *s, QEDRequest *request,
+ unsigned int index, unsigned int n, bool flush);
+
+/**
+ * Cluster functions
+ */
+void qed_find_cluster(BDRVQEDState *s, QEDRequest *request, uint64_t pos,
+ size_t len, QEDFindClusterFunc *cb, void *opaque);
+
+/**
+ * Consistency check
+ */
+int qed_check(BDRVQEDState *s, BdrvCheckResult *result, bool fix);
+
+QEDTable *qed_alloc_table(BDRVQEDState *s);
+
+/**
+ * Round down to the start of a cluster
+ */
+static inline uint64_t qed_start_of_cluster(BDRVQEDState *s, uint64_t offset)
+{
+ return offset & ~(uint64_t)(s->header.cluster_size - 1);
+}
+
+static inline uint64_t qed_offset_into_cluster(BDRVQEDState *s, uint64_t offset)
+{
+ return offset & (s->header.cluster_size - 1);
+}
+
+static inline uint64_t qed_bytes_to_clusters(BDRVQEDState *s, uint64_t bytes)
+{
+ return qed_start_of_cluster(s, bytes + (s->header.cluster_size - 1)) /
+ (s->header.cluster_size - 1);
+}
+
+static inline unsigned int qed_l1_index(BDRVQEDState *s, uint64_t pos)
+{
+ return pos >> s->l1_shift;
+}
+
+static inline unsigned int qed_l2_index(BDRVQEDState *s, uint64_t pos)
+{
+ return (pos >> s->l2_shift) & s->l2_mask;
+}
+
+/**
+ * Test if a cluster offset is valid
+ */
+static inline bool qed_check_cluster_offset(BDRVQEDState *s, uint64_t offset)
+{
+ uint64_t header_size = (uint64_t)s->header.header_size *
+ s->header.cluster_size;
+
+ if (offset & (s->header.cluster_size - 1)) {
+ return false;
+ }
+ return offset >= header_size && offset < s->file_size;
+}
+
+/**
+ * Test if a table offset is valid
+ */
+static inline bool qed_check_table_offset(BDRVQEDState *s, uint64_t offset)
+{
+ uint64_t end_offset = offset + (s->header.table_size - 1) *
+ s->header.cluster_size;
+
+ /* Overflow check */
+ if (end_offset <= offset) {
+ return false;
+ }
+
+ return qed_check_cluster_offset(s, offset) &&
+ qed_check_cluster_offset(s, end_offset);
+}
+
+static inline bool qed_offset_is_cluster_aligned(BDRVQEDState *s,
+ uint64_t offset)
+{
+ if (qed_offset_into_cluster(s, offset)) {
+ return false;
+ }
+ return true;
+}
+
+static inline bool qed_offset_is_unalloc_cluster(uint64_t offset)
+{
+ if (offset == 0) {
+ return true;
+ }
+ return false;
+}
+
+static inline bool qed_offset_is_zero_cluster(uint64_t offset)
+{
+ if (offset == 1) {
+ return true;
+ }
+ return false;
+}
+
+#endif /* BLOCK_QED_H */
diff --git a/qemu-0.15.x/block/raw-posix-aio.h b/qemu-0.15.x/block/raw-posix-aio.h
new file mode 100644
index 0000000..dfc63b8
--- /dev/null
+++ b/qemu-0.15.x/block/raw-posix-aio.h
@@ -0,0 +1,43 @@
+/*
+ * QEMU Posix block I/O backend AIO support
+ *
+ * Copyright IBM, Corp. 2008
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+#ifndef QEMU_RAW_POSIX_AIO_H
+#define QEMU_RAW_POSIX_AIO_H
+
+/* AIO request types */
+#define QEMU_AIO_READ 0x0001
+#define QEMU_AIO_WRITE 0x0002
+#define QEMU_AIO_IOCTL 0x0004
+#define QEMU_AIO_FLUSH 0x0008
+#define QEMU_AIO_TYPE_MASK \
+ (QEMU_AIO_READ|QEMU_AIO_WRITE|QEMU_AIO_IOCTL|QEMU_AIO_FLUSH)
+
+/* AIO flags */
+#define QEMU_AIO_MISALIGNED 0x1000
+
+
+/* posix-aio-compat.c - thread pool based implementation */
+int paio_init(void);
+BlockDriverAIOCB *paio_submit(BlockDriverState *bs, int fd,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque, int type);
+BlockDriverAIOCB *paio_ioctl(BlockDriverState *bs, int fd,
+ unsigned long int req, void *buf,
+ BlockDriverCompletionFunc *cb, void *opaque);
+
+/* linux-aio.c - Linux native implementation */
+void *laio_init(void);
+BlockDriverAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque, int type);
+
+#endif /* QEMU_RAW_POSIX_AIO_H */
diff --git a/qemu-0.15.x/block/raw-posix.c b/qemu-0.15.x/block/raw-posix.c
new file mode 100644
index 0000000..cd89c83
--- /dev/null
+++ b/qemu-0.15.x/block/raw-posix.c
@@ -0,0 +1,1552 @@
+/*
+ * Block driver for RAW files (posix)
+ *
+ * Copyright (c) 2006 Fabrice Bellard
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "qemu-timer.h"
+#include "qemu-char.h"
+#include "qemu-log.h"
+#include "block_int.h"
+#include "module.h"
+#include "block/raw-posix-aio.h"
+
+#ifdef CONFIG_COCOA
+#include <paths.h>
+#include <sys/param.h>
+#include <IOKit/IOKitLib.h>
+#include <IOKit/IOBSD.h>
+#include <IOKit/storage/IOMediaBSDClient.h>
+#include <IOKit/storage/IOMedia.h>
+#include <IOKit/storage/IOCDMedia.h>
+//#include <IOKit/storage/IOCDTypes.h>
+#include <CoreFoundation/CoreFoundation.h>
+#endif
+
+#ifdef __sun__
+#define _POSIX_PTHREAD_SEMANTICS 1
+#include <sys/dkio.h>
+#endif
+#ifdef __linux__
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/param.h>
+#include <linux/cdrom.h>
+#include <linux/fd.h>
+#endif
+#if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)
+#include <sys/disk.h>
+#include <sys/cdio.h>
+#endif
+
+#ifdef __OpenBSD__
+#include <sys/ioctl.h>
+#include <sys/disklabel.h>
+#include <sys/dkio.h>
+#endif
+
+#ifdef __NetBSD__
+#include <sys/ioctl.h>
+#include <sys/disklabel.h>
+#include <sys/dkio.h>
+#include <sys/disk.h>
+#endif
+
+#ifdef __DragonFly__
+#include <sys/ioctl.h>
+#include <sys/diskslice.h>
+#endif
+
+#ifdef CONFIG_XFS
+#include <xfs/xfs.h>
+#endif
+
+//#define DEBUG_FLOPPY
+
+//#define DEBUG_BLOCK
+#if defined(DEBUG_BLOCK)
+#define DEBUG_BLOCK_PRINT(formatCstr, ...) do { if (qemu_log_enabled()) \
+ { qemu_log(formatCstr, ## __VA_ARGS__); qemu_log_flush(); } } while (0)
+#else
+#define DEBUG_BLOCK_PRINT(formatCstr, ...)
+#endif
+
+/* OS X does not have O_DSYNC */
+#ifndef O_DSYNC
+#ifdef O_SYNC
+#define O_DSYNC O_SYNC
+#elif defined(O_FSYNC)
+#define O_DSYNC O_FSYNC
+#endif
+#endif
+
+/* Approximate O_DIRECT with O_DSYNC if O_DIRECT isn't available */
+#ifndef O_DIRECT
+#define O_DIRECT O_DSYNC
+#endif
+
+#define FTYPE_FILE 0
+#define FTYPE_CD 1
+#define FTYPE_FD 2
+
+/* if the FD is not accessed during that time (in ns), we try to
+ reopen it to see if the disk has been changed */
+#define FD_OPEN_TIMEOUT (1000000000)
+
+#define MAX_BLOCKSIZE 4096
+
+typedef struct BDRVRawState {
+ int fd;
+ int type;
+ int open_flags;
+#if defined(__linux__)
+ /* linux floppy specific */
+ int64_t fd_open_time;
+ int64_t fd_error_time;
+ int fd_got_error;
+ int fd_media_changed;
+#endif
+#ifdef CONFIG_LINUX_AIO
+ int use_aio;
+ void *aio_ctx;
+#endif
+ uint8_t *aligned_buf;
+ unsigned aligned_buf_size;
+#ifdef CONFIG_XFS
+ bool is_xfs : 1;
+#endif
+} BDRVRawState;
+
+static int fd_open(BlockDriverState *bs);
+static int64_t raw_getlength(BlockDriverState *bs);
+
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+static int cdrom_reopen(BlockDriverState *bs);
+#endif
+
+#if defined(__NetBSD__)
+static int raw_normalize_devicepath(const char **filename)
+{
+ static char namebuf[PATH_MAX];
+ const char *dp, *fname;
+ struct stat sb;
+
+ fname = *filename;
+ dp = strrchr(fname, '/');
+ if (lstat(fname, &sb) < 0) {
+ fprintf(stderr, "%s: stat failed: %s\n",
+ fname, strerror(errno));
+ return -errno;
+ }
+
+ if (!S_ISBLK(sb.st_mode)) {
+ return 0;
+ }
+
+ if (dp == NULL) {
+ snprintf(namebuf, PATH_MAX, "r%s", fname);
+ } else {
+ snprintf(namebuf, PATH_MAX, "%.*s/r%s",
+ (int)(dp - fname), fname, dp + 1);
+ }
+ fprintf(stderr, "%s is a block device", fname);
+ *filename = namebuf;
+ fprintf(stderr, ", using %s\n", *filename);
+
+ return 0;
+}
+#else
+static int raw_normalize_devicepath(const char **filename)
+{
+ return 0;
+}
+#endif
+
+static int raw_open_common(BlockDriverState *bs, const char *filename,
+ int bdrv_flags, int open_flags)
+{
+ BDRVRawState *s = bs->opaque;
+ int fd, ret;
+
+ ret = raw_normalize_devicepath(&filename);
+ if (ret != 0) {
+ return ret;
+ }
+
+ s->open_flags = open_flags | O_BINARY;
+ s->open_flags &= ~O_ACCMODE;
+ if (bdrv_flags & BDRV_O_RDWR) {
+ s->open_flags |= O_RDWR;
+ } else {
+ s->open_flags |= O_RDONLY;
+ }
+
+ /* Use O_DSYNC for write-through caching, no flags for write-back caching,
+ * and O_DIRECT for no caching. */
+ if ((bdrv_flags & BDRV_O_NOCACHE))
+ s->open_flags |= O_DIRECT;
+ if (!(bdrv_flags & BDRV_O_CACHE_WB))
+ s->open_flags |= O_DSYNC;
+
+ s->fd = -1;
+ fd = qemu_open(filename, s->open_flags, 0644);
+ if (fd < 0) {
+ ret = -errno;
+ if (ret == -EROFS)
+ ret = -EACCES;
+ return ret;
+ }
+ s->fd = fd;
+ s->aligned_buf = NULL;
+
+ if ((bdrv_flags & BDRV_O_NOCACHE)) {
+ /*
+ * Allocate a buffer for read/modify/write cycles. Chose the size
+ * pessimistically as we don't know the block size yet.
+ */
+ s->aligned_buf_size = 32 * MAX_BLOCKSIZE;
+ s->aligned_buf = qemu_memalign(MAX_BLOCKSIZE, s->aligned_buf_size);
+ if (s->aligned_buf == NULL) {
+ goto out_close;
+ }
+ }
+
+#ifdef CONFIG_LINUX_AIO
+ if ((bdrv_flags & (BDRV_O_NOCACHE|BDRV_O_NATIVE_AIO)) ==
+ (BDRV_O_NOCACHE|BDRV_O_NATIVE_AIO)) {
+
+ /* We're falling back to POSIX AIO in some cases */
+ paio_init();
+
+ s->aio_ctx = laio_init();
+ if (!s->aio_ctx) {
+ goto out_free_buf;
+ }
+ s->use_aio = 1;
+ } else
+#endif
+ {
+ if (paio_init() < 0) {
+ goto out_free_buf;
+ }
+#ifdef CONFIG_LINUX_AIO
+ s->use_aio = 0;
+#endif
+ }
+
+#ifdef CONFIG_XFS
+ if (platform_test_xfs_fd(s->fd)) {
+ s->is_xfs = 1;
+ }
+#endif
+
+ return 0;
+
+out_free_buf:
+ qemu_vfree(s->aligned_buf);
+out_close:
+ close(fd);
+ return -errno;
+}
+
+static int raw_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVRawState *s = bs->opaque;
+
+ s->type = FTYPE_FILE;
+ return raw_open_common(bs, filename, flags, 0);
+}
+
+/* XXX: use host sector size if necessary with:
+#ifdef DIOCGSECTORSIZE
+ {
+ unsigned int sectorsize = 512;
+ if (!ioctl(fd, DIOCGSECTORSIZE, §orsize) &&
+ sectorsize > bufsize)
+ bufsize = sectorsize;
+ }
+#endif
+#ifdef CONFIG_COCOA
+ uint32_t blockSize = 512;
+ if ( !ioctl( fd, DKIOCGETBLOCKSIZE, &blockSize ) && blockSize > bufsize) {
+ bufsize = blockSize;
+ }
+#endif
+*/
+
+/*
+ * offset and count are in bytes, but must be multiples of 512 for files
+ * opened with O_DIRECT. buf must be aligned to 512 bytes then.
+ *
+ * This function may be called without alignment if the caller ensures
+ * that O_DIRECT is not in effect.
+ */
+static int raw_pread_aligned(BlockDriverState *bs, int64_t offset,
+ uint8_t *buf, int count)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ ret = fd_open(bs);
+ if (ret < 0)
+ return ret;
+
+ ret = pread(s->fd, buf, count, offset);
+ if (ret == count)
+ return ret;
+
+ /* Allow reads beyond the end (needed for pwrite) */
+ if ((ret == 0) && bs->growable) {
+ int64_t size = raw_getlength(bs);
+ if (offset >= size) {
+ memset(buf, 0, count);
+ return count;
+ }
+ }
+
+ DEBUG_BLOCK_PRINT("raw_pread(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
+ "] read failed %d : %d = %s\n",
+ s->fd, bs->filename, offset, buf, count,
+ bs->total_sectors, ret, errno, strerror(errno));
+
+ /* Try harder for CDrom. */
+ if (s->type != FTYPE_FILE) {
+ ret = pread(s->fd, buf, count, offset);
+ if (ret == count)
+ return ret;
+ ret = pread(s->fd, buf, count, offset);
+ if (ret == count)
+ return ret;
+
+ DEBUG_BLOCK_PRINT("raw_pread(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
+ "] retry read failed %d : %d = %s\n",
+ s->fd, bs->filename, offset, buf, count,
+ bs->total_sectors, ret, errno, strerror(errno));
+ }
+
+ return (ret < 0) ? -errno : ret;
+}
+
+/*
+ * offset and count are in bytes, but must be multiples of the sector size
+ * for files opened with O_DIRECT. buf must be aligned to sector size bytes
+ * then.
+ *
+ * This function may be called without alignment if the caller ensures
+ * that O_DIRECT is not in effect.
+ */
+static int raw_pwrite_aligned(BlockDriverState *bs, int64_t offset,
+ const uint8_t *buf, int count)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ ret = fd_open(bs);
+ if (ret < 0)
+ return -errno;
+
+ ret = pwrite(s->fd, buf, count, offset);
+ if (ret == count)
+ return ret;
+
+ DEBUG_BLOCK_PRINT("raw_pwrite(%d:%s, %" PRId64 ", %p, %d) [%" PRId64
+ "] write failed %d : %d = %s\n",
+ s->fd, bs->filename, offset, buf, count,
+ bs->total_sectors, ret, errno, strerror(errno));
+
+ return (ret < 0) ? -errno : ret;
+}
+
+
+/*
+ * offset and count are in bytes and possibly not aligned. For files opened
+ * with O_DIRECT, necessary alignments are ensured before calling
+ * raw_pread_aligned to do the actual read.
+ */
+static int raw_pread(BlockDriverState *bs, int64_t offset,
+ uint8_t *buf, int count)
+{
+ BDRVRawState *s = bs->opaque;
+ unsigned sector_mask = bs->buffer_alignment - 1;
+ int size, ret, shift, sum;
+
+ sum = 0;
+
+ if (s->aligned_buf != NULL) {
+
+ if (offset & sector_mask) {
+ /* align offset on a sector size bytes boundary */
+
+ shift = offset & sector_mask;
+ size = (shift + count + sector_mask) & ~sector_mask;
+ if (size > s->aligned_buf_size)
+ size = s->aligned_buf_size;
+ ret = raw_pread_aligned(bs, offset - shift, s->aligned_buf, size);
+ if (ret < 0)
+ return ret;
+
+ size = bs->buffer_alignment - shift;
+ if (size > count)
+ size = count;
+ memcpy(buf, s->aligned_buf + shift, size);
+
+ buf += size;
+ offset += size;
+ count -= size;
+ sum += size;
+
+ if (count == 0)
+ return sum;
+ }
+ if (count & sector_mask || (uintptr_t) buf & sector_mask) {
+
+ /* read on aligned buffer */
+
+ while (count) {
+
+ size = (count + sector_mask) & ~sector_mask;
+ if (size > s->aligned_buf_size)
+ size = s->aligned_buf_size;
+
+ ret = raw_pread_aligned(bs, offset, s->aligned_buf, size);
+ if (ret < 0) {
+ return ret;
+ } else if (ret == 0) {
+ fprintf(stderr, "raw_pread: read beyond end of file\n");
+ abort();
+ }
+
+ size = ret;
+ if (size > count)
+ size = count;
+
+ memcpy(buf, s->aligned_buf, size);
+
+ buf += size;
+ offset += size;
+ count -= size;
+ sum += size;
+ }
+
+ return sum;
+ }
+ }
+
+ return raw_pread_aligned(bs, offset, buf, count) + sum;
+}
+
+static int raw_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ int ret;
+
+ ret = raw_pread(bs, sector_num * BDRV_SECTOR_SIZE, buf,
+ nb_sectors * BDRV_SECTOR_SIZE);
+ if (ret == (nb_sectors * BDRV_SECTOR_SIZE))
+ ret = 0;
+ return ret;
+}
+
+/*
+ * offset and count are in bytes and possibly not aligned. For files opened
+ * with O_DIRECT, necessary alignments are ensured before calling
+ * raw_pwrite_aligned to do the actual write.
+ */
+static int raw_pwrite(BlockDriverState *bs, int64_t offset,
+ const uint8_t *buf, int count)
+{
+ BDRVRawState *s = bs->opaque;
+ unsigned sector_mask = bs->buffer_alignment - 1;
+ int size, ret, shift, sum;
+
+ sum = 0;
+
+ if (s->aligned_buf != NULL) {
+
+ if (offset & sector_mask) {
+ /* align offset on a sector size bytes boundary */
+ shift = offset & sector_mask;
+ ret = raw_pread_aligned(bs, offset - shift, s->aligned_buf,
+ bs->buffer_alignment);
+ if (ret < 0)
+ return ret;
+
+ size = bs->buffer_alignment - shift;
+ if (size > count)
+ size = count;
+ memcpy(s->aligned_buf + shift, buf, size);
+
+ ret = raw_pwrite_aligned(bs, offset - shift, s->aligned_buf,
+ bs->buffer_alignment);
+ if (ret < 0)
+ return ret;
+
+ buf += size;
+ offset += size;
+ count -= size;
+ sum += size;
+
+ if (count == 0)
+ return sum;
+ }
+ if (count & sector_mask || (uintptr_t) buf & sector_mask) {
+
+ while ((size = (count & ~sector_mask)) != 0) {
+
+ if (size > s->aligned_buf_size)
+ size = s->aligned_buf_size;
+
+ memcpy(s->aligned_buf, buf, size);
+
+ ret = raw_pwrite_aligned(bs, offset, s->aligned_buf, size);
+ if (ret < 0)
+ return ret;
+
+ buf += ret;
+ offset += ret;
+ count -= ret;
+ sum += ret;
+ }
+ /* here, count < sector_size because (count & ~sector_mask) == 0 */
+ if (count) {
+ ret = raw_pread_aligned(bs, offset, s->aligned_buf,
+ bs->buffer_alignment);
+ if (ret < 0)
+ return ret;
+ memcpy(s->aligned_buf, buf, count);
+
+ ret = raw_pwrite_aligned(bs, offset, s->aligned_buf,
+ bs->buffer_alignment);
+ if (ret < 0)
+ return ret;
+ if (count < ret)
+ ret = count;
+
+ sum += ret;
+ }
+ return sum;
+ }
+ }
+ return raw_pwrite_aligned(bs, offset, buf, count) + sum;
+}
+
+static int raw_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ int ret;
+ ret = raw_pwrite(bs, sector_num * BDRV_SECTOR_SIZE, buf,
+ nb_sectors * BDRV_SECTOR_SIZE);
+ if (ret == (nb_sectors * BDRV_SECTOR_SIZE))
+ ret = 0;
+ return ret;
+}
+
+/*
+ * Check if all memory in this vector is sector aligned.
+ */
+static int qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov)
+{
+ int i;
+
+ for (i = 0; i < qiov->niov; i++) {
+ if ((uintptr_t) qiov->iov[i].iov_base % bs->buffer_alignment) {
+ return 0;
+ }
+ }
+
+ return 1;
+}
+
+static BlockDriverAIOCB *raw_aio_submit(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque, int type)
+{
+ BDRVRawState *s = bs->opaque;
+
+ if (fd_open(bs) < 0)
+ return NULL;
+
+ /*
+ * If O_DIRECT is used the buffer needs to be aligned on a sector
+ * boundary. Check if this is the case or telll the low-level
+ * driver that it needs to copy the buffer.
+ */
+ if (s->aligned_buf) {
+ if (!qiov_is_aligned(bs, qiov)) {
+ type |= QEMU_AIO_MISALIGNED;
+#ifdef CONFIG_LINUX_AIO
+ } else if (s->use_aio) {
+ return laio_submit(bs, s->aio_ctx, s->fd, sector_num, qiov,
+ nb_sectors, cb, opaque, type);
+#endif
+ }
+ }
+
+ return paio_submit(bs, s->fd, sector_num, qiov, nb_sectors,
+ cb, opaque, type);
+}
+
+static BlockDriverAIOCB *raw_aio_readv(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return raw_aio_submit(bs, sector_num, qiov, nb_sectors,
+ cb, opaque, QEMU_AIO_READ);
+}
+
+static BlockDriverAIOCB *raw_aio_writev(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return raw_aio_submit(bs, sector_num, qiov, nb_sectors,
+ cb, opaque, QEMU_AIO_WRITE);
+}
+
+static BlockDriverAIOCB *raw_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVRawState *s = bs->opaque;
+
+ if (fd_open(bs) < 0)
+ return NULL;
+
+ return paio_submit(bs, s->fd, 0, NULL, 0, cb, opaque, QEMU_AIO_FLUSH);
+}
+
+static void raw_close(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ if (s->fd >= 0) {
+ close(s->fd);
+ s->fd = -1;
+ if (s->aligned_buf != NULL)
+ qemu_vfree(s->aligned_buf);
+ }
+}
+
+static int raw_truncate(BlockDriverState *bs, int64_t offset)
+{
+ BDRVRawState *s = bs->opaque;
+ if (s->type != FTYPE_FILE)
+ return -ENOTSUP;
+ if (ftruncate(s->fd, offset) < 0)
+ return -errno;
+ return 0;
+}
+
+#ifdef __OpenBSD__
+static int64_t raw_getlength(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ int fd = s->fd;
+ struct stat st;
+
+ if (fstat(fd, &st))
+ return -1;
+ if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
+ struct disklabel dl;
+
+ if (ioctl(fd, DIOCGDINFO, &dl))
+ return -1;
+ return (uint64_t)dl.d_secsize *
+ dl.d_partitions[DISKPART(st.st_rdev)].p_size;
+ } else
+ return st.st_size;
+}
+#elif defined(__NetBSD__)
+static int64_t raw_getlength(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ int fd = s->fd;
+ struct stat st;
+
+ if (fstat(fd, &st))
+ return -1;
+ if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
+ struct dkwedge_info dkw;
+
+ if (ioctl(fd, DIOCGWEDGEINFO, &dkw) != -1) {
+ return dkw.dkw_size * 512;
+ } else {
+ struct disklabel dl;
+
+ if (ioctl(fd, DIOCGDINFO, &dl))
+ return -1;
+ return (uint64_t)dl.d_secsize *
+ dl.d_partitions[DISKPART(st.st_rdev)].p_size;
+ }
+ } else
+ return st.st_size;
+}
+#elif defined(__sun__)
+static int64_t raw_getlength(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ struct dk_minfo minfo;
+ int ret;
+
+ ret = fd_open(bs);
+ if (ret < 0) {
+ return ret;
+ }
+
+ /*
+ * Use the DKIOCGMEDIAINFO ioctl to read the size.
+ */
+ ret = ioctl(s->fd, DKIOCGMEDIAINFO, &minfo);
+ if (ret != -1) {
+ return minfo.dki_lbsize * minfo.dki_capacity;
+ }
+
+ /*
+ * There are reports that lseek on some devices fails, but
+ * irc discussion said that contingency on contingency was overkill.
+ */
+ return lseek(s->fd, 0, SEEK_END);
+}
+#elif defined(CONFIG_BSD)
+static int64_t raw_getlength(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ int fd = s->fd;
+ int64_t size;
+ struct stat sb;
+#if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)
+ int reopened = 0;
+#endif
+ int ret;
+
+ ret = fd_open(bs);
+ if (ret < 0)
+ return ret;
+
+#if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)
+again:
+#endif
+ if (!fstat(fd, &sb) && (S_IFCHR & sb.st_mode)) {
+#ifdef DIOCGMEDIASIZE
+ if (ioctl(fd, DIOCGMEDIASIZE, (off_t *)&size))
+#elif defined(DIOCGPART)
+ {
+ struct partinfo pi;
+ if (ioctl(fd, DIOCGPART, &pi) == 0)
+ size = pi.media_size;
+ else
+ size = 0;
+ }
+ if (size == 0)
+#endif
+#ifdef CONFIG_COCOA
+ size = LONG_LONG_MAX;
+#else
+ size = lseek(fd, 0LL, SEEK_END);
+#endif
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+ switch(s->type) {
+ case FTYPE_CD:
+ /* XXX FreeBSD acd returns UINT_MAX sectors for an empty drive */
+ if (size == 2048LL * (unsigned)-1)
+ size = 0;
+ /* XXX no disc? maybe we need to reopen... */
+ if (size <= 0 && !reopened && cdrom_reopen(bs) >= 0) {
+ reopened = 1;
+ goto again;
+ }
+ }
+#endif
+ } else {
+ size = lseek(fd, 0, SEEK_END);
+ }
+ return size;
+}
+#else
+static int64_t raw_getlength(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ ret = fd_open(bs);
+ if (ret < 0) {
+ return ret;
+ }
+
+ return lseek(s->fd, 0, SEEK_END);
+}
+#endif
+
+static int64_t raw_get_allocated_file_size(BlockDriverState *bs)
+{
+ struct stat st;
+ BDRVRawState *s = bs->opaque;
+
+ if (fstat(s->fd, &st) < 0) {
+ return -errno;
+ }
+ return (int64_t)st.st_blocks * 512;
+}
+
+static int raw_create(const char *filename, QEMUOptionParameter *options)
+{
+ int fd;
+ int result = 0;
+ int64_t total_size = 0;
+
+ /* Read out options */
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ total_size = options->value.n / BDRV_SECTOR_SIZE;
+ }
+ options++;
+ }
+
+ fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
+ 0644);
+ if (fd < 0) {
+ result = -errno;
+ } else {
+ if (ftruncate(fd, total_size * BDRV_SECTOR_SIZE) != 0) {
+ result = -errno;
+ }
+ if (close(fd) != 0) {
+ result = -errno;
+ }
+ }
+ return result;
+}
+
+static int raw_flush(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ return qemu_fdatasync(s->fd);
+}
+
+#ifdef CONFIG_XFS
+static int xfs_discard(BDRVRawState *s, int64_t sector_num, int nb_sectors)
+{
+ struct xfs_flock64 fl;
+
+ memset(&fl, 0, sizeof(fl));
+ fl.l_whence = SEEK_SET;
+ fl.l_start = sector_num << 9;
+ fl.l_len = (int64_t)nb_sectors << 9;
+
+ if (xfsctl(NULL, s->fd, XFS_IOC_UNRESVSP64, &fl) < 0) {
+ DEBUG_BLOCK_PRINT("cannot punch hole (%s)\n", strerror(errno));
+ return -errno;
+ }
+
+ return 0;
+}
+#endif
+
+static int raw_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
+{
+#ifdef CONFIG_XFS
+ BDRVRawState *s = bs->opaque;
+
+ if (s->is_xfs) {
+ return xfs_discard(s, sector_num, nb_sectors);
+ }
+#endif
+
+ return 0;
+}
+
+static QEMUOptionParameter raw_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ { NULL }
+};
+
+static BlockDriver bdrv_file = {
+ .format_name = "file",
+ .protocol_name = "file",
+ .instance_size = sizeof(BDRVRawState),
+ .bdrv_probe = NULL, /* no probe for protocols */
+ .bdrv_file_open = raw_open,
+ .bdrv_read = raw_read,
+ .bdrv_write = raw_write,
+ .bdrv_close = raw_close,
+ .bdrv_create = raw_create,
+ .bdrv_flush = raw_flush,
+ .bdrv_discard = raw_discard,
+
+ .bdrv_aio_readv = raw_aio_readv,
+ .bdrv_aio_writev = raw_aio_writev,
+ .bdrv_aio_flush = raw_aio_flush,
+
+ .bdrv_truncate = raw_truncate,
+ .bdrv_getlength = raw_getlength,
+ .bdrv_get_allocated_file_size
+ = raw_get_allocated_file_size,
+
+ .create_options = raw_create_options,
+};
+
+/***********************************************/
+/* host device */
+
+#ifdef CONFIG_COCOA
+static kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator );
+static kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex maxPathSize );
+
+kern_return_t FindEjectableCDMedia( io_iterator_t *mediaIterator )
+{
+ kern_return_t kernResult;
+ mach_port_t masterPort;
+ CFMutableDictionaryRef classesToMatch;
+
+ kernResult = IOMasterPort( MACH_PORT_NULL, &masterPort );
+ if ( KERN_SUCCESS != kernResult ) {
+ printf( "IOMasterPort returned %d\n", kernResult );
+ }
+
+ classesToMatch = IOServiceMatching( kIOCDMediaClass );
+ if ( classesToMatch == NULL ) {
+ printf( "IOServiceMatching returned a NULL dictionary.\n" );
+ } else {
+ CFDictionarySetValue( classesToMatch, CFSTR( kIOMediaEjectableKey ), kCFBooleanTrue );
+ }
+ kernResult = IOServiceGetMatchingServices( masterPort, classesToMatch, mediaIterator );
+ if ( KERN_SUCCESS != kernResult )
+ {
+ printf( "IOServiceGetMatchingServices returned %d\n", kernResult );
+ }
+
+ return kernResult;
+}
+
+kern_return_t GetBSDPath( io_iterator_t mediaIterator, char *bsdPath, CFIndex maxPathSize )
+{
+ io_object_t nextMedia;
+ kern_return_t kernResult = KERN_FAILURE;
+ *bsdPath = '\0';
+ nextMedia = IOIteratorNext( mediaIterator );
+ if ( nextMedia )
+ {
+ CFTypeRef bsdPathAsCFString;
+ bsdPathAsCFString = IORegistryEntryCreateCFProperty( nextMedia, CFSTR( kIOBSDNameKey ), kCFAllocatorDefault, 0 );
+ if ( bsdPathAsCFString ) {
+ size_t devPathLength;
+ strcpy( bsdPath, _PATH_DEV );
+ strcat( bsdPath, "r" );
+ devPathLength = strlen( bsdPath );
+ if ( CFStringGetCString( bsdPathAsCFString, bsdPath + devPathLength, maxPathSize - devPathLength, kCFStringEncodingASCII ) ) {
+ kernResult = KERN_SUCCESS;
+ }
+ CFRelease( bsdPathAsCFString );
+ }
+ IOObjectRelease( nextMedia );
+ }
+
+ return kernResult;
+}
+
+#endif
+
+static int hdev_probe_device(const char *filename)
+{
+ struct stat st;
+
+ /* allow a dedicated CD-ROM driver to match with a higher priority */
+ if (strstart(filename, "/dev/cdrom", NULL))
+ return 50;
+
+ if (stat(filename, &st) >= 0 &&
+ (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode))) {
+ return 100;
+ }
+
+ return 0;
+}
+
+static int hdev_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVRawState *s = bs->opaque;
+
+#ifdef CONFIG_COCOA
+ if (strstart(filename, "/dev/cdrom", NULL)) {
+ kern_return_t kernResult;
+ io_iterator_t mediaIterator;
+ char bsdPath[ MAXPATHLEN ];
+ int fd;
+
+ kernResult = FindEjectableCDMedia( &mediaIterator );
+ kernResult = GetBSDPath( mediaIterator, bsdPath, sizeof( bsdPath ) );
+
+ if ( bsdPath[ 0 ] != '\0' ) {
+ strcat(bsdPath,"s0");
+ /* some CDs don't have a partition 0 */
+ fd = open(bsdPath, O_RDONLY | O_BINARY | O_LARGEFILE);
+ if (fd < 0) {
+ bsdPath[strlen(bsdPath)-1] = '1';
+ } else {
+ close(fd);
+ }
+ filename = bsdPath;
+ }
+
+ if ( mediaIterator )
+ IOObjectRelease( mediaIterator );
+ }
+#endif
+
+ s->type = FTYPE_FILE;
+#if defined(__linux__)
+ {
+ char resolved_path[ MAXPATHLEN ], *temp;
+
+ temp = realpath(filename, resolved_path);
+ if (temp && strstart(temp, "/dev/sg", NULL)) {
+ bs->sg = 1;
+ }
+ }
+#endif
+
+ return raw_open_common(bs, filename, flags, 0);
+}
+
+#if defined(__linux__)
+/* Note: we do not have a reliable method to detect if the floppy is
+ present. The current method is to try to open the floppy at every
+ I/O and to keep it opened during a few hundreds of ms. */
+static int fd_open(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ int last_media_present;
+
+ if (s->type != FTYPE_FD)
+ return 0;
+ last_media_present = (s->fd >= 0);
+ if (s->fd >= 0 &&
+ (get_clock() - s->fd_open_time) >= FD_OPEN_TIMEOUT) {
+ close(s->fd);
+ s->fd = -1;
+#ifdef DEBUG_FLOPPY
+ printf("Floppy closed\n");
+#endif
+ }
+ if (s->fd < 0) {
+ if (s->fd_got_error &&
+ (get_clock() - s->fd_error_time) < FD_OPEN_TIMEOUT) {
+#ifdef DEBUG_FLOPPY
+ printf("No floppy (open delayed)\n");
+#endif
+ return -EIO;
+ }
+ s->fd = open(bs->filename, s->open_flags & ~O_NONBLOCK);
+ if (s->fd < 0) {
+ s->fd_error_time = get_clock();
+ s->fd_got_error = 1;
+ if (last_media_present)
+ s->fd_media_changed = 1;
+#ifdef DEBUG_FLOPPY
+ printf("No floppy\n");
+#endif
+ return -EIO;
+ }
+#ifdef DEBUG_FLOPPY
+ printf("Floppy opened\n");
+#endif
+ }
+ if (!last_media_present)
+ s->fd_media_changed = 1;
+ s->fd_open_time = get_clock();
+ s->fd_got_error = 0;
+ return 0;
+}
+
+static int hdev_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
+{
+ BDRVRawState *s = bs->opaque;
+
+ return ioctl(s->fd, req, buf);
+}
+
+static BlockDriverAIOCB *hdev_aio_ioctl(BlockDriverState *bs,
+ unsigned long int req, void *buf,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVRawState *s = bs->opaque;
+
+ if (fd_open(bs) < 0)
+ return NULL;
+ return paio_ioctl(bs, s->fd, req, buf, cb, opaque);
+}
+
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+static int fd_open(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+
+ /* this is just to ensure s->fd is sane (its called by io ops) */
+ if (s->fd >= 0)
+ return 0;
+ return -EIO;
+}
+#else /* !linux && !FreeBSD */
+
+static int fd_open(BlockDriverState *bs)
+{
+ return 0;
+}
+
+#endif /* !linux && !FreeBSD */
+
+static int hdev_create(const char *filename, QEMUOptionParameter *options)
+{
+ int fd;
+ int ret = 0;
+ struct stat stat_buf;
+ int64_t total_size = 0;
+
+ /* Read out options */
+ while (options && options->name) {
+ if (!strcmp(options->name, "size")) {
+ total_size = options->value.n / BDRV_SECTOR_SIZE;
+ }
+ options++;
+ }
+
+ fd = open(filename, O_WRONLY | O_BINARY);
+ if (fd < 0)
+ return -errno;
+
+ if (fstat(fd, &stat_buf) < 0)
+ ret = -errno;
+ else if (!S_ISBLK(stat_buf.st_mode) && !S_ISCHR(stat_buf.st_mode))
+ ret = -ENODEV;
+ else if (lseek(fd, 0, SEEK_END) < total_size * BDRV_SECTOR_SIZE)
+ ret = -ENOSPC;
+
+ close(fd);
+ return ret;
+}
+
+static int hdev_has_zero_init(BlockDriverState *bs)
+{
+ return 0;
+}
+
+static BlockDriver bdrv_host_device = {
+ .format_name = "host_device",
+ .protocol_name = "host_device",
+ .instance_size = sizeof(BDRVRawState),
+ .bdrv_probe_device = hdev_probe_device,
+ .bdrv_file_open = hdev_open,
+ .bdrv_close = raw_close,
+ .bdrv_create = hdev_create,
+ .create_options = raw_create_options,
+ .bdrv_has_zero_init = hdev_has_zero_init,
+ .bdrv_flush = raw_flush,
+
+ .bdrv_aio_readv = raw_aio_readv,
+ .bdrv_aio_writev = raw_aio_writev,
+ .bdrv_aio_flush = raw_aio_flush,
+
+ .bdrv_read = raw_read,
+ .bdrv_write = raw_write,
+ .bdrv_getlength = raw_getlength,
+ .bdrv_get_allocated_file_size
+ = raw_get_allocated_file_size,
+
+ /* generic scsi device */
+#ifdef __linux__
+ .bdrv_ioctl = hdev_ioctl,
+ .bdrv_aio_ioctl = hdev_aio_ioctl,
+#endif
+};
+
+#ifdef __linux__
+static int floppy_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ s->type = FTYPE_FD;
+
+ /* open will not fail even if no floppy is inserted, so add O_NONBLOCK */
+ ret = raw_open_common(bs, filename, flags, O_NONBLOCK);
+ if (ret)
+ return ret;
+
+ /* close fd so that we can reopen it as needed */
+ close(s->fd);
+ s->fd = -1;
+ s->fd_media_changed = 1;
+
+ return 0;
+}
+
+static int floppy_probe_device(const char *filename)
+{
+ int fd, ret;
+ int prio = 0;
+ struct floppy_struct fdparam;
+ struct stat st;
+
+ if (strstart(filename, "/dev/fd", NULL))
+ prio = 50;
+
+ fd = open(filename, O_RDONLY | O_NONBLOCK);
+ if (fd < 0) {
+ goto out;
+ }
+ ret = fstat(fd, &st);
+ if (ret == -1 || !S_ISBLK(st.st_mode)) {
+ goto outc;
+ }
+
+ /* Attempt to detect via a floppy specific ioctl */
+ ret = ioctl(fd, FDGETPRM, &fdparam);
+ if (ret >= 0)
+ prio = 100;
+
+outc:
+ close(fd);
+out:
+ return prio;
+}
+
+
+static int floppy_is_inserted(BlockDriverState *bs)
+{
+ return fd_open(bs) >= 0;
+}
+
+static int floppy_media_changed(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ /*
+ * XXX: we do not have a true media changed indication.
+ * It does not work if the floppy is changed without trying to read it.
+ */
+ fd_open(bs);
+ ret = s->fd_media_changed;
+ s->fd_media_changed = 0;
+#ifdef DEBUG_FLOPPY
+ printf("Floppy changed=%d\n", ret);
+#endif
+ return ret;
+}
+
+static int floppy_eject(BlockDriverState *bs, int eject_flag)
+{
+ BDRVRawState *s = bs->opaque;
+ int fd;
+
+ if (s->fd >= 0) {
+ close(s->fd);
+ s->fd = -1;
+ }
+ fd = open(bs->filename, s->open_flags | O_NONBLOCK);
+ if (fd >= 0) {
+ if (ioctl(fd, FDEJECT, 0) < 0)
+ perror("FDEJECT");
+ close(fd);
+ }
+
+ return 0;
+}
+
+static BlockDriver bdrv_host_floppy = {
+ .format_name = "host_floppy",
+ .protocol_name = "host_floppy",
+ .instance_size = sizeof(BDRVRawState),
+ .bdrv_probe_device = floppy_probe_device,
+ .bdrv_file_open = floppy_open,
+ .bdrv_close = raw_close,
+ .bdrv_create = hdev_create,
+ .create_options = raw_create_options,
+ .bdrv_has_zero_init = hdev_has_zero_init,
+ .bdrv_flush = raw_flush,
+
+ .bdrv_aio_readv = raw_aio_readv,
+ .bdrv_aio_writev = raw_aio_writev,
+ .bdrv_aio_flush = raw_aio_flush,
+
+ .bdrv_read = raw_read,
+ .bdrv_write = raw_write,
+ .bdrv_getlength = raw_getlength,
+ .bdrv_get_allocated_file_size
+ = raw_get_allocated_file_size,
+
+ /* removable device support */
+ .bdrv_is_inserted = floppy_is_inserted,
+ .bdrv_media_changed = floppy_media_changed,
+ .bdrv_eject = floppy_eject,
+};
+
+static int cdrom_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVRawState *s = bs->opaque;
+
+ s->type = FTYPE_CD;
+
+ /* open will not fail even if no CD is inserted, so add O_NONBLOCK */
+ return raw_open_common(bs, filename, flags, O_NONBLOCK);
+}
+
+static int cdrom_probe_device(const char *filename)
+{
+ int fd, ret;
+ int prio = 0;
+ struct stat st;
+
+ fd = open(filename, O_RDONLY | O_NONBLOCK);
+ if (fd < 0) {
+ goto out;
+ }
+ ret = fstat(fd, &st);
+ if (ret == -1 || !S_ISBLK(st.st_mode)) {
+ goto outc;
+ }
+
+ /* Attempt to detect via a CDROM specific ioctl */
+ ret = ioctl(fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
+ if (ret >= 0)
+ prio = 100;
+
+outc:
+ close(fd);
+out:
+ return prio;
+}
+
+static int cdrom_is_inserted(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ ret = ioctl(s->fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
+ if (ret == CDS_DISC_OK)
+ return 1;
+ return 0;
+}
+
+static int cdrom_eject(BlockDriverState *bs, int eject_flag)
+{
+ BDRVRawState *s = bs->opaque;
+
+ if (eject_flag) {
+ if (ioctl(s->fd, CDROMEJECT, NULL) < 0)
+ perror("CDROMEJECT");
+ } else {
+ if (ioctl(s->fd, CDROMCLOSETRAY, NULL) < 0)
+ perror("CDROMEJECT");
+ }
+
+ return 0;
+}
+
+static int cdrom_set_locked(BlockDriverState *bs, int locked)
+{
+ BDRVRawState *s = bs->opaque;
+
+ if (ioctl(s->fd, CDROM_LOCKDOOR, locked) < 0) {
+ /*
+ * Note: an error can happen if the distribution automatically
+ * mounts the CD-ROM
+ */
+ /* perror("CDROM_LOCKDOOR"); */
+ }
+
+ return 0;
+}
+
+static BlockDriver bdrv_host_cdrom = {
+ .format_name = "host_cdrom",
+ .protocol_name = "host_cdrom",
+ .instance_size = sizeof(BDRVRawState),
+ .bdrv_probe_device = cdrom_probe_device,
+ .bdrv_file_open = cdrom_open,
+ .bdrv_close = raw_close,
+ .bdrv_create = hdev_create,
+ .create_options = raw_create_options,
+ .bdrv_has_zero_init = hdev_has_zero_init,
+ .bdrv_flush = raw_flush,
+
+ .bdrv_aio_readv = raw_aio_readv,
+ .bdrv_aio_writev = raw_aio_writev,
+ .bdrv_aio_flush = raw_aio_flush,
+
+ .bdrv_read = raw_read,
+ .bdrv_write = raw_write,
+ .bdrv_getlength = raw_getlength,
+ .bdrv_get_allocated_file_size
+ = raw_get_allocated_file_size,
+
+ /* removable device support */
+ .bdrv_is_inserted = cdrom_is_inserted,
+ .bdrv_eject = cdrom_eject,
+ .bdrv_set_locked = cdrom_set_locked,
+
+ /* generic scsi device */
+ .bdrv_ioctl = hdev_ioctl,
+ .bdrv_aio_ioctl = hdev_aio_ioctl,
+};
+#endif /* __linux__ */
+
+#if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)
+static int cdrom_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ s->type = FTYPE_CD;
+
+ ret = raw_open_common(bs, filename, flags, 0);
+ if (ret)
+ return ret;
+
+ /* make sure the door isnt locked at this time */
+ ioctl(s->fd, CDIOCALLOW);
+ return 0;
+}
+
+static int cdrom_probe_device(const char *filename)
+{
+ if (strstart(filename, "/dev/cd", NULL) ||
+ strstart(filename, "/dev/acd", NULL))
+ return 100;
+ return 0;
+}
+
+static int cdrom_reopen(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ int fd;
+
+ /*
+ * Force reread of possibly changed/newly loaded disc,
+ * FreeBSD seems to not notice sometimes...
+ */
+ if (s->fd >= 0)
+ close(s->fd);
+ fd = open(bs->filename, s->open_flags, 0644);
+ if (fd < 0) {
+ s->fd = -1;
+ return -EIO;
+ }
+ s->fd = fd;
+
+ /* make sure the door isnt locked at this time */
+ ioctl(s->fd, CDIOCALLOW);
+ return 0;
+}
+
+static int cdrom_is_inserted(BlockDriverState *bs)
+{
+ return raw_getlength(bs) > 0;
+}
+
+static int cdrom_eject(BlockDriverState *bs, int eject_flag)
+{
+ BDRVRawState *s = bs->opaque;
+
+ if (s->fd < 0)
+ return -ENOTSUP;
+
+ (void) ioctl(s->fd, CDIOCALLOW);
+
+ if (eject_flag) {
+ if (ioctl(s->fd, CDIOCEJECT) < 0)
+ perror("CDIOCEJECT");
+ } else {
+ if (ioctl(s->fd, CDIOCCLOSE) < 0)
+ perror("CDIOCCLOSE");
+ }
+
+ if (cdrom_reopen(bs) < 0)
+ return -ENOTSUP;
+ return 0;
+}
+
+static int cdrom_set_locked(BlockDriverState *bs, int locked)
+{
+ BDRVRawState *s = bs->opaque;
+
+ if (s->fd < 0)
+ return -ENOTSUP;
+ if (ioctl(s->fd, (locked ? CDIOCPREVENT : CDIOCALLOW)) < 0) {
+ /*
+ * Note: an error can happen if the distribution automatically
+ * mounts the CD-ROM
+ */
+ /* perror("CDROM_LOCKDOOR"); */
+ }
+
+ return 0;
+}
+
+static BlockDriver bdrv_host_cdrom = {
+ .format_name = "host_cdrom",
+ .protocol_name = "host_cdrom",
+ .instance_size = sizeof(BDRVRawState),
+ .bdrv_probe_device = cdrom_probe_device,
+ .bdrv_file_open = cdrom_open,
+ .bdrv_close = raw_close,
+ .bdrv_create = hdev_create,
+ .create_options = raw_create_options,
+ .bdrv_has_zero_init = hdev_has_zero_init,
+ .bdrv_flush = raw_flush,
+
+ .bdrv_aio_readv = raw_aio_readv,
+ .bdrv_aio_writev = raw_aio_writev,
+ .bdrv_aio_flush = raw_aio_flush,
+
+ .bdrv_read = raw_read,
+ .bdrv_write = raw_write,
+ .bdrv_getlength = raw_getlength,
+ .bdrv_get_allocated_file_size
+ = raw_get_allocated_file_size,
+
+ /* removable device support */
+ .bdrv_is_inserted = cdrom_is_inserted,
+ .bdrv_eject = cdrom_eject,
+ .bdrv_set_locked = cdrom_set_locked,
+};
+#endif /* __FreeBSD__ */
+
+static void bdrv_file_init(void)
+{
+ /*
+ * Register all the drivers. Note that order is important, the driver
+ * registered last will get probed first.
+ */
+ bdrv_register(&bdrv_file);
+ bdrv_register(&bdrv_host_device);
+#ifdef __linux__
+ bdrv_register(&bdrv_host_floppy);
+ bdrv_register(&bdrv_host_cdrom);
+#endif
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+ bdrv_register(&bdrv_host_cdrom);
+#endif
+}
+
+block_init(bdrv_file_init);
diff --git a/qemu-0.15.x/block/raw-win32.c b/qemu-0.15.x/block/raw-win32.c
new file mode 100644
index 0000000..91067e7
--- /dev/null
+++ b/qemu-0.15.x/block/raw-win32.c
@@ -0,0 +1,459 @@
+/*
+ * Block driver for RAW files (win32)
+ *
+ * Copyright (c) 2006 Fabrice Bellard
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "qemu-timer.h"
+#include "block_int.h"
+#include "module.h"
+#include <windows.h>
+#include <winioctl.h>
+
+#define FTYPE_FILE 0
+#define FTYPE_CD 1
+#define FTYPE_HARDDISK 2
+
+typedef struct BDRVRawState {
+ HANDLE hfile;
+ int type;
+ char drive_path[16]; /* format: "d:\" */
+} BDRVRawState;
+
+int qemu_ftruncate64(int fd, int64_t length)
+{
+ LARGE_INTEGER li;
+ LONG high;
+ HANDLE h;
+ BOOL res;
+
+ if ((GetVersion() & 0x80000000UL) && (length >> 32) != 0)
+ return -1;
+
+ h = (HANDLE)_get_osfhandle(fd);
+
+ /* get current position, ftruncate do not change position */
+ li.HighPart = 0;
+ li.LowPart = SetFilePointer (h, 0, &li.HighPart, FILE_CURRENT);
+ if (li.LowPart == 0xffffffffUL && GetLastError() != NO_ERROR)
+ return -1;
+
+ high = length >> 32;
+ if (!SetFilePointer(h, (DWORD) length, &high, FILE_BEGIN))
+ return -1;
+ res = SetEndOfFile(h);
+
+ /* back to old position */
+ SetFilePointer(h, li.LowPart, &li.HighPart, FILE_BEGIN);
+ return res ? 0 : -1;
+}
+
+static int set_sparse(int fd)
+{
+ DWORD returned;
+ return (int) DeviceIoControl((HANDLE)_get_osfhandle(fd), FSCTL_SET_SPARSE,
+ NULL, 0, NULL, 0, &returned, NULL);
+}
+
+static int raw_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVRawState *s = bs->opaque;
+ int access_flags;
+ DWORD overlapped;
+
+ s->type = FTYPE_FILE;
+
+ if (flags & BDRV_O_RDWR) {
+ access_flags = GENERIC_READ | GENERIC_WRITE;
+ } else {
+ access_flags = GENERIC_READ;
+ }
+
+ overlapped = FILE_ATTRIBUTE_NORMAL;
+ if (flags & BDRV_O_NOCACHE)
+ overlapped |= FILE_FLAG_NO_BUFFERING;
+ if (!(flags & BDRV_O_CACHE_WB))
+ overlapped |= FILE_FLAG_WRITE_THROUGH;
+ s->hfile = CreateFile(filename, access_flags,
+ FILE_SHARE_READ, NULL,
+ OPEN_EXISTING, overlapped, NULL);
+ if (s->hfile == INVALID_HANDLE_VALUE) {
+ int err = GetLastError();
+
+ if (err == ERROR_ACCESS_DENIED)
+ return -EACCES;
+ return -1;
+ }
+ return 0;
+}
+
+static int raw_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVRawState *s = bs->opaque;
+ OVERLAPPED ov;
+ DWORD ret_count;
+ int ret;
+ int64_t offset = sector_num * 512;
+ int count = nb_sectors * 512;
+
+ memset(&ov, 0, sizeof(ov));
+ ov.Offset = offset;
+ ov.OffsetHigh = offset >> 32;
+ ret = ReadFile(s->hfile, buf, count, &ret_count, &ov);
+ if (!ret)
+ return ret_count;
+ if (ret_count == count)
+ ret_count = 0;
+ return ret_count;
+}
+
+static int raw_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BDRVRawState *s = bs->opaque;
+ OVERLAPPED ov;
+ DWORD ret_count;
+ int ret;
+ int64_t offset = sector_num * 512;
+ int count = nb_sectors * 512;
+
+ memset(&ov, 0, sizeof(ov));
+ ov.Offset = offset;
+ ov.OffsetHigh = offset >> 32;
+ ret = WriteFile(s->hfile, buf, count, &ret_count, &ov);
+ if (!ret)
+ return ret_count;
+ if (ret_count == count)
+ ret_count = 0;
+ return ret_count;
+}
+
+static int raw_flush(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ int ret;
+
+ ret = FlushFileBuffers(s->hfile);
+ if (ret == 0) {
+ return -EIO;
+ }
+
+ return 0;
+}
+
+static void raw_close(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ CloseHandle(s->hfile);
+}
+
+static int raw_truncate(BlockDriverState *bs, int64_t offset)
+{
+ BDRVRawState *s = bs->opaque;
+ LONG low, high;
+
+ low = offset;
+ high = offset >> 32;
+ if (!SetFilePointer(s->hfile, low, &high, FILE_BEGIN))
+ return -EIO;
+ if (!SetEndOfFile(s->hfile))
+ return -EIO;
+ return 0;
+}
+
+static int64_t raw_getlength(BlockDriverState *bs)
+{
+ BDRVRawState *s = bs->opaque;
+ LARGE_INTEGER l;
+ ULARGE_INTEGER available, total, total_free;
+ DISK_GEOMETRY_EX dg;
+ DWORD count;
+ BOOL status;
+
+ switch(s->type) {
+ case FTYPE_FILE:
+ l.LowPart = GetFileSize(s->hfile, (PDWORD)&l.HighPart);
+ if (l.LowPart == 0xffffffffUL && GetLastError() != NO_ERROR)
+ return -EIO;
+ break;
+ case FTYPE_CD:
+ if (!GetDiskFreeSpaceEx(s->drive_path, &available, &total, &total_free))
+ return -EIO;
+ l.QuadPart = total.QuadPart;
+ break;
+ case FTYPE_HARDDISK:
+ status = DeviceIoControl(s->hfile, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,
+ NULL, 0, &dg, sizeof(dg), &count, NULL);
+ if (status != 0) {
+ l = dg.DiskSize;
+ }
+ break;
+ default:
+ return -EIO;
+ }
+ return l.QuadPart;
+}
+
+static int64_t raw_get_allocated_file_size(BlockDriverState *bs)
+{
+ typedef DWORD (WINAPI * get_compressed_t)(const char *filename,
+ DWORD * high);
+ get_compressed_t get_compressed;
+ struct _stati64 st;
+ const char *filename = bs->filename;
+ /* WinNT support GetCompressedFileSize to determine allocate size */
+ get_compressed =
+ (get_compressed_t) GetProcAddress(GetModuleHandle("kernel32"),
+ "GetCompressedFileSizeA");
+ if (get_compressed) {
+ DWORD high, low;
+ low = get_compressed(filename, &high);
+ if (low != 0xFFFFFFFFlu || GetLastError() == NO_ERROR) {
+ return (((int64_t) high) << 32) + low;
+ }
+ }
+
+ if (_stati64(filename, &st) < 0) {
+ return -1;
+ }
+ return st.st_size;
+}
+
+static int raw_create(const char *filename, QEMUOptionParameter *options)
+{
+ int fd;
+ int64_t total_size = 0;
+
+ /* Read out options */
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ total_size = options->value.n / 512;
+ }
+ options++;
+ }
+
+ fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
+ 0644);
+ if (fd < 0)
+ return -EIO;
+ set_sparse(fd);
+ ftruncate(fd, total_size * 512);
+ close(fd);
+ return 0;
+}
+
+static QEMUOptionParameter raw_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ { NULL }
+};
+
+static BlockDriver bdrv_file = {
+ .format_name = "file",
+ .protocol_name = "file",
+ .instance_size = sizeof(BDRVRawState),
+ .bdrv_file_open = raw_open,
+ .bdrv_close = raw_close,
+ .bdrv_create = raw_create,
+ .bdrv_flush = raw_flush,
+ .bdrv_read = raw_read,
+ .bdrv_write = raw_write,
+ .bdrv_truncate = raw_truncate,
+ .bdrv_getlength = raw_getlength,
+ .bdrv_get_allocated_file_size
+ = raw_get_allocated_file_size,
+
+ .create_options = raw_create_options,
+};
+
+/***********************************************/
+/* host device */
+
+static int find_cdrom(char *cdrom_name, int cdrom_name_size)
+{
+ char drives[256], *pdrv = drives;
+ UINT type;
+
+ memset(drives, 0, sizeof(drives));
+ GetLogicalDriveStrings(sizeof(drives), drives);
+ while(pdrv[0] != '\0') {
+ type = GetDriveType(pdrv);
+ switch(type) {
+ case DRIVE_CDROM:
+ snprintf(cdrom_name, cdrom_name_size, "\\\\.\\%c:", pdrv[0]);
+ return 0;
+ break;
+ }
+ pdrv += lstrlen(pdrv) + 1;
+ }
+ return -1;
+}
+
+static int find_device_type(BlockDriverState *bs, const char *filename)
+{
+ BDRVRawState *s = bs->opaque;
+ UINT type;
+ const char *p;
+
+ if (strstart(filename, "\\\\.\\", &p) ||
+ strstart(filename, "//./", &p)) {
+ if (stristart(p, "PhysicalDrive", NULL))
+ return FTYPE_HARDDISK;
+ snprintf(s->drive_path, sizeof(s->drive_path), "%c:\\", p[0]);
+ type = GetDriveType(s->drive_path);
+ switch (type) {
+ case DRIVE_REMOVABLE:
+ case DRIVE_FIXED:
+ return FTYPE_HARDDISK;
+ case DRIVE_CDROM:
+ return FTYPE_CD;
+ default:
+ return FTYPE_FILE;
+ }
+ } else {
+ return FTYPE_FILE;
+ }
+}
+
+static int hdev_probe_device(const char *filename)
+{
+ if (strstart(filename, "/dev/cdrom", NULL))
+ return 100;
+ if (is_windows_drive(filename))
+ return 100;
+ return 0;
+}
+
+static int hdev_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVRawState *s = bs->opaque;
+ int access_flags, create_flags;
+ DWORD overlapped;
+ char device_name[64];
+
+ if (strstart(filename, "/dev/cdrom", NULL)) {
+ if (find_cdrom(device_name, sizeof(device_name)) < 0)
+ return -ENOENT;
+ filename = device_name;
+ } else {
+ /* transform drive letters into device name */
+ if (((filename[0] >= 'a' && filename[0] <= 'z') ||
+ (filename[0] >= 'A' && filename[0] <= 'Z')) &&
+ filename[1] == ':' && filename[2] == '\0') {
+ snprintf(device_name, sizeof(device_name), "\\\\.\\%c:", filename[0]);
+ filename = device_name;
+ }
+ }
+ s->type = find_device_type(bs, filename);
+
+ if (flags & BDRV_O_RDWR) {
+ access_flags = GENERIC_READ | GENERIC_WRITE;
+ } else {
+ access_flags = GENERIC_READ;
+ }
+ create_flags = OPEN_EXISTING;
+
+ overlapped = FILE_ATTRIBUTE_NORMAL;
+ if (flags & BDRV_O_NOCACHE)
+ overlapped |= FILE_FLAG_NO_BUFFERING;
+ if (!(flags & BDRV_O_CACHE_WB))
+ overlapped |= FILE_FLAG_WRITE_THROUGH;
+ s->hfile = CreateFile(filename, access_flags,
+ FILE_SHARE_READ, NULL,
+ create_flags, overlapped, NULL);
+ if (s->hfile == INVALID_HANDLE_VALUE) {
+ int err = GetLastError();
+
+ if (err == ERROR_ACCESS_DENIED)
+ return -EACCES;
+ return -1;
+ }
+ return 0;
+}
+
+#if 0
+/***********************************************/
+/* removable device additional commands */
+
+static int raw_is_inserted(BlockDriverState *bs)
+{
+ return 1;
+}
+
+static int raw_media_changed(BlockDriverState *bs)
+{
+ return -ENOTSUP;
+}
+
+static int raw_eject(BlockDriverState *bs, int eject_flag)
+{
+ DWORD ret_count;
+
+ if (s->type == FTYPE_FILE)
+ return -ENOTSUP;
+ if (eject_flag) {
+ DeviceIoControl(s->hfile, IOCTL_STORAGE_EJECT_MEDIA,
+ NULL, 0, NULL, 0, &lpBytesReturned, NULL);
+ } else {
+ DeviceIoControl(s->hfile, IOCTL_STORAGE_LOAD_MEDIA,
+ NULL, 0, NULL, 0, &lpBytesReturned, NULL);
+ }
+}
+
+static int raw_set_locked(BlockDriverState *bs, int locked)
+{
+ return -ENOTSUP;
+}
+#endif
+
+static int hdev_has_zero_init(BlockDriverState *bs)
+{
+ return 0;
+}
+
+static BlockDriver bdrv_host_device = {
+ .format_name = "host_device",
+ .protocol_name = "host_device",
+ .instance_size = sizeof(BDRVRawState),
+ .bdrv_probe_device = hdev_probe_device,
+ .bdrv_file_open = hdev_open,
+ .bdrv_close = raw_close,
+ .bdrv_flush = raw_flush,
+ .bdrv_has_zero_init = hdev_has_zero_init,
+
+ .bdrv_read = raw_read,
+ .bdrv_write = raw_write,
+ .bdrv_getlength = raw_getlength,
+ .bdrv_get_allocated_file_size
+ = raw_get_allocated_file_size,
+};
+
+static void bdrv_file_init(void)
+{
+ bdrv_register(&bdrv_file);
+ bdrv_register(&bdrv_host_device);
+}
+
+block_init(bdrv_file_init);
diff --git a/qemu-0.15.x/block/raw.c b/qemu-0.15.x/block/raw.c
new file mode 100644
index 0000000..b0f72d6
--- /dev/null
+++ b/qemu-0.15.x/block/raw.c
@@ -0,0 +1,156 @@
+
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+
+static int raw_open(BlockDriverState *bs, int flags)
+{
+ bs->sg = bs->file->sg;
+ return 0;
+}
+
+static int raw_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ return bdrv_read(bs->file, sector_num, buf, nb_sectors);
+}
+
+static int raw_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ return bdrv_write(bs->file, sector_num, buf, nb_sectors);
+}
+
+static BlockDriverAIOCB *raw_aio_readv(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_readv(bs->file, sector_num, qiov, nb_sectors, cb, opaque);
+}
+
+static BlockDriverAIOCB *raw_aio_writev(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_writev(bs->file, sector_num, qiov, nb_sectors, cb, opaque);
+}
+
+static void raw_close(BlockDriverState *bs)
+{
+}
+
+static int raw_flush(BlockDriverState *bs)
+{
+ return bdrv_flush(bs->file);
+}
+
+static BlockDriverAIOCB *raw_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_flush(bs->file, cb, opaque);
+}
+
+static int64_t raw_getlength(BlockDriverState *bs)
+{
+ return bdrv_getlength(bs->file);
+}
+
+static int raw_truncate(BlockDriverState *bs, int64_t offset)
+{
+ return bdrv_truncate(bs->file, offset);
+}
+
+static int raw_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ return 1; /* everything can be opened as raw image */
+}
+
+static int raw_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
+{
+ return bdrv_discard(bs->file, sector_num, nb_sectors);
+}
+
+static int raw_is_inserted(BlockDriverState *bs)
+{
+ return bdrv_is_inserted(bs->file);
+}
+
+static int raw_eject(BlockDriverState *bs, int eject_flag)
+{
+ return bdrv_eject(bs->file, eject_flag);
+}
+
+static int raw_set_locked(BlockDriverState *bs, int locked)
+{
+ bdrv_set_locked(bs->file, locked);
+ return 0;
+}
+
+static int raw_ioctl(BlockDriverState *bs, unsigned long int req, void *buf)
+{
+ return bdrv_ioctl(bs->file, req, buf);
+}
+
+static BlockDriverAIOCB *raw_aio_ioctl(BlockDriverState *bs,
+ unsigned long int req, void *buf,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ return bdrv_aio_ioctl(bs->file, req, buf, cb, opaque);
+}
+
+static int raw_create(const char *filename, QEMUOptionParameter *options)
+{
+ return bdrv_create_file(filename, options);
+}
+
+static QEMUOptionParameter raw_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ { NULL }
+};
+
+static int raw_has_zero_init(BlockDriverState *bs)
+{
+ return bdrv_has_zero_init(bs->file);
+}
+
+static BlockDriver bdrv_raw = {
+ .format_name = "raw",
+
+ /* It's really 0, but we need to make qemu_malloc() happy */
+ .instance_size = 1,
+
+ .bdrv_open = raw_open,
+ .bdrv_close = raw_close,
+ .bdrv_read = raw_read,
+ .bdrv_write = raw_write,
+ .bdrv_flush = raw_flush,
+ .bdrv_probe = raw_probe,
+ .bdrv_getlength = raw_getlength,
+ .bdrv_truncate = raw_truncate,
+
+ .bdrv_aio_readv = raw_aio_readv,
+ .bdrv_aio_writev = raw_aio_writev,
+ .bdrv_aio_flush = raw_aio_flush,
+ .bdrv_discard = raw_discard,
+
+ .bdrv_is_inserted = raw_is_inserted,
+ .bdrv_eject = raw_eject,
+ .bdrv_set_locked = raw_set_locked,
+ .bdrv_ioctl = raw_ioctl,
+ .bdrv_aio_ioctl = raw_aio_ioctl,
+
+ .bdrv_create = raw_create,
+ .create_options = raw_create_options,
+ .bdrv_has_zero_init = raw_has_zero_init,
+};
+
+static void bdrv_raw_init(void)
+{
+ bdrv_register(&bdrv_raw);
+}
+
+block_init(bdrv_raw_init);
diff --git a/qemu-0.15.x/block/rbd.c b/qemu-0.15.x/block/rbd.c
new file mode 100644
index 0000000..d5659cd
--- /dev/null
+++ b/qemu-0.15.x/block/rbd.c
@@ -0,0 +1,811 @@
+/*
+ * QEMU Block driver for RADOS (Ceph)
+ *
+ * Copyright (C) 2010-2011 Christian Brunner <chb(a)muc.de>,
+ * Josh Durgin <josh.durgin(a)dreamhost.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include <inttypes.h>
+
+#include "qemu-common.h"
+#include "qemu-error.h"
+
+#include "block_int.h"
+
+#include <rbd/librbd.h>
+
+
+
+/*
+ * When specifying the image filename use:
+ *
+ * rbd:poolname/devicename[@snapshotname][:option1=value1[:option2=value2...]]
+ *
+ * poolname must be the name of an existing rados pool
+ *
+ * devicename is the basename for all objects used to
+ * emulate the raw device.
+ *
+ * Each option given is used to configure rados, and may be
+ * any Ceph option, or "conf". The "conf" option specifies
+ * a Ceph configuration file to read.
+ *
+ * Metadata information (image size, ...) is stored in an
+ * object with the name "devicename.rbd".
+ *
+ * The raw device is split into 4MB sized objects by default.
+ * The sequencenumber is encoded in a 12 byte long hex-string,
+ * and is attached to the devicename, separated by a dot.
+ * e.g. "devicename.1234567890ab"
+ *
+ */
+
+#define OBJ_MAX_SIZE (1UL << OBJ_DEFAULT_OBJ_ORDER)
+
+#define RBD_MAX_CONF_NAME_SIZE 128
+#define RBD_MAX_CONF_VAL_SIZE 512
+#define RBD_MAX_CONF_SIZE 1024
+#define RBD_MAX_POOL_NAME_SIZE 128
+#define RBD_MAX_SNAP_NAME_SIZE 128
+#define RBD_MAX_SNAPS 100
+
+typedef struct RBDAIOCB {
+ BlockDriverAIOCB common;
+ QEMUBH *bh;
+ int ret;
+ QEMUIOVector *qiov;
+ char *bounce;
+ int write;
+ int64_t sector_num;
+ int error;
+ struct BDRVRBDState *s;
+ int cancelled;
+} RBDAIOCB;
+
+typedef struct RADOSCB {
+ int rcbid;
+ RBDAIOCB *acb;
+ struct BDRVRBDState *s;
+ int done;
+ int64_t size;
+ char *buf;
+ int ret;
+} RADOSCB;
+
+#define RBD_FD_READ 0
+#define RBD_FD_WRITE 1
+
+typedef struct BDRVRBDState {
+ int fds[2];
+ rados_t cluster;
+ rados_ioctx_t io_ctx;
+ rbd_image_t image;
+ char name[RBD_MAX_IMAGE_NAME_SIZE];
+ int qemu_aio_count;
+ char *snap;
+ int event_reader_pos;
+ RADOSCB *event_rcb;
+} BDRVRBDState;
+
+static void rbd_aio_bh_cb(void *opaque);
+
+static int qemu_rbd_next_tok(char *dst, int dst_len,
+ char *src, char delim,
+ const char *name,
+ char **p)
+{
+ int l;
+ char *end;
+
+ *p = NULL;
+
+ if (delim != '\0') {
+ end = strchr(src, delim);
+ if (end) {
+ *p = end + 1;
+ *end = '\0';
+ }
+ }
+ l = strlen(src);
+ if (l >= dst_len) {
+ error_report("%s too long", name);
+ return -EINVAL;
+ } else if (l == 0) {
+ error_report("%s too short", name);
+ return -EINVAL;
+ }
+
+ pstrcpy(dst, dst_len, src);
+
+ return 0;
+}
+
+static int qemu_rbd_parsename(const char *filename,
+ char *pool, int pool_len,
+ char *snap, int snap_len,
+ char *name, int name_len,
+ char *conf, int conf_len)
+{
+ const char *start;
+ char *p, *buf;
+ int ret;
+
+ if (!strstart(filename, "rbd:", &start)) {
+ return -EINVAL;
+ }
+
+ buf = qemu_strdup(start);
+ p = buf;
+ *snap = '\0';
+ *conf = '\0';
+
+ ret = qemu_rbd_next_tok(pool, pool_len, p, '/', "pool name", &p);
+ if (ret < 0 || !p) {
+ ret = -EINVAL;
+ goto done;
+ }
+
+ if (strchr(p, '@')) {
+ ret = qemu_rbd_next_tok(name, name_len, p, '@', "object name", &p);
+ if (ret < 0) {
+ goto done;
+ }
+ ret = qemu_rbd_next_tok(snap, snap_len, p, ':', "snap name", &p);
+ } else {
+ ret = qemu_rbd_next_tok(name, name_len, p, ':', "object name", &p);
+ }
+ if (ret < 0 || !p) {
+ goto done;
+ }
+
+ ret = qemu_rbd_next_tok(conf, conf_len, p, '\0', "configuration", &p);
+
+done:
+ qemu_free(buf);
+ return ret;
+}
+
+static int qemu_rbd_set_conf(rados_t cluster, const char *conf)
+{
+ char *p, *buf;
+ char name[RBD_MAX_CONF_NAME_SIZE];
+ char value[RBD_MAX_CONF_VAL_SIZE];
+ int ret = 0;
+
+ buf = qemu_strdup(conf);
+ p = buf;
+
+ while (p) {
+ ret = qemu_rbd_next_tok(name, sizeof(name), p,
+ '=', "conf option name", &p);
+ if (ret < 0) {
+ break;
+ }
+
+ if (!p) {
+ error_report("conf option %s has no value", name);
+ ret = -EINVAL;
+ break;
+ }
+
+ ret = qemu_rbd_next_tok(value, sizeof(value), p,
+ ':', "conf option value", &p);
+ if (ret < 0) {
+ break;
+ }
+
+ if (strcmp(name, "conf")) {
+ ret = rados_conf_set(cluster, name, value);
+ if (ret < 0) {
+ error_report("invalid conf option %s", name);
+ ret = -EINVAL;
+ break;
+ }
+ } else {
+ ret = rados_conf_read_file(cluster, value);
+ if (ret < 0) {
+ error_report("error reading conf file %s", value);
+ break;
+ }
+ }
+ }
+
+ qemu_free(buf);
+ return ret;
+}
+
+static int qemu_rbd_create(const char *filename, QEMUOptionParameter *options)
+{
+ int64_t bytes = 0;
+ int64_t objsize;
+ int obj_order = 0;
+ char pool[RBD_MAX_POOL_NAME_SIZE];
+ char name[RBD_MAX_IMAGE_NAME_SIZE];
+ char snap_buf[RBD_MAX_SNAP_NAME_SIZE];
+ char conf[RBD_MAX_CONF_SIZE];
+ rados_t cluster;
+ rados_ioctx_t io_ctx;
+ int ret;
+
+ if (qemu_rbd_parsename(filename, pool, sizeof(pool),
+ snap_buf, sizeof(snap_buf),
+ name, sizeof(name),
+ conf, sizeof(conf)) < 0) {
+ return -EINVAL;
+ }
+
+ /* Read out options */
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ bytes = options->value.n;
+ } else if (!strcmp(options->name, BLOCK_OPT_CLUSTER_SIZE)) {
+ if (options->value.n) {
+ objsize = options->value.n;
+ if ((objsize - 1) & objsize) { /* not a power of 2? */
+ error_report("obj size needs to be power of 2");
+ return -EINVAL;
+ }
+ if (objsize < 4096) {
+ error_report("obj size too small");
+ return -EINVAL;
+ }
+ obj_order = ffs(objsize) - 1;
+ }
+ }
+ options++;
+ }
+
+ if (rados_create(&cluster, NULL) < 0) {
+ error_report("error initializing");
+ return -EIO;
+ }
+
+ if (strstr(conf, "conf=") == NULL) {
+ if (rados_conf_read_file(cluster, NULL) < 0) {
+ error_report("error reading config file");
+ rados_shutdown(cluster);
+ return -EIO;
+ }
+ }
+
+ if (conf[0] != '\0' &&
+ qemu_rbd_set_conf(cluster, conf) < 0) {
+ error_report("error setting config options");
+ rados_shutdown(cluster);
+ return -EIO;
+ }
+
+ if (rados_connect(cluster) < 0) {
+ error_report("error connecting");
+ rados_shutdown(cluster);
+ return -EIO;
+ }
+
+ if (rados_ioctx_create(cluster, pool, &io_ctx) < 0) {
+ error_report("error opening pool %s", pool);
+ rados_shutdown(cluster);
+ return -EIO;
+ }
+
+ ret = rbd_create(io_ctx, name, bytes, &obj_order);
+ rados_ioctx_destroy(io_ctx);
+ rados_shutdown(cluster);
+
+ return ret;
+}
+
+/*
+ * This aio completion is being called from qemu_rbd_aio_event_reader()
+ * and runs in qemu context. It schedules a bh, but just in case the aio
+ * was not cancelled before.
+ */
+static void qemu_rbd_complete_aio(RADOSCB *rcb)
+{
+ RBDAIOCB *acb = rcb->acb;
+ int64_t r;
+
+ if (acb->cancelled) {
+ qemu_vfree(acb->bounce);
+ qemu_aio_release(acb);
+ goto done;
+ }
+
+ r = rcb->ret;
+
+ if (acb->write) {
+ if (r < 0) {
+ acb->ret = r;
+ acb->error = 1;
+ } else if (!acb->error) {
+ acb->ret = rcb->size;
+ }
+ } else {
+ if (r < 0) {
+ memset(rcb->buf, 0, rcb->size);
+ acb->ret = r;
+ acb->error = 1;
+ } else if (r < rcb->size) {
+ memset(rcb->buf + r, 0, rcb->size - r);
+ if (!acb->error) {
+ acb->ret = rcb->size;
+ }
+ } else if (!acb->error) {
+ acb->ret = r;
+ }
+ }
+ /* Note that acb->bh can be NULL in case where the aio was cancelled */
+ acb->bh = qemu_bh_new(rbd_aio_bh_cb, acb);
+ qemu_bh_schedule(acb->bh);
+done:
+ qemu_free(rcb);
+}
+
+/*
+ * aio fd read handler. It runs in the qemu context and calls the
+ * completion handling of completed rados aio operations.
+ */
+static void qemu_rbd_aio_event_reader(void *opaque)
+{
+ BDRVRBDState *s = opaque;
+
+ ssize_t ret;
+
+ do {
+ char *p = (char *)&s->event_rcb;
+
+ /* now read the rcb pointer that was sent from a non qemu thread */
+ if ((ret = read(s->fds[RBD_FD_READ], p + s->event_reader_pos,
+ sizeof(s->event_rcb) - s->event_reader_pos)) > 0) {
+ if (ret > 0) {
+ s->event_reader_pos += ret;
+ if (s->event_reader_pos == sizeof(s->event_rcb)) {
+ s->event_reader_pos = 0;
+ qemu_rbd_complete_aio(s->event_rcb);
+ s->qemu_aio_count--;
+ }
+ }
+ }
+ } while (ret < 0 && errno == EINTR);
+}
+
+static int qemu_rbd_aio_flush_cb(void *opaque)
+{
+ BDRVRBDState *s = opaque;
+
+ return (s->qemu_aio_count > 0);
+}
+
+static int qemu_rbd_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ BDRVRBDState *s = bs->opaque;
+ char pool[RBD_MAX_POOL_NAME_SIZE];
+ char snap_buf[RBD_MAX_SNAP_NAME_SIZE];
+ char conf[RBD_MAX_CONF_SIZE];
+ int r;
+
+ if (qemu_rbd_parsename(filename, pool, sizeof(pool),
+ snap_buf, sizeof(snap_buf),
+ s->name, sizeof(s->name),
+ conf, sizeof(conf)) < 0) {
+ return -EINVAL;
+ }
+ s->snap = NULL;
+ if (snap_buf[0] != '\0') {
+ s->snap = qemu_strdup(snap_buf);
+ }
+
+ r = rados_create(&s->cluster, NULL);
+ if (r < 0) {
+ error_report("error initializing");
+ return r;
+ }
+
+ if (strstr(conf, "conf=") == NULL) {
+ r = rados_conf_read_file(s->cluster, NULL);
+ if (r < 0) {
+ error_report("error reading config file");
+ rados_shutdown(s->cluster);
+ return r;
+ }
+ }
+
+ if (conf[0] != '\0') {
+ r = qemu_rbd_set_conf(s->cluster, conf);
+ if (r < 0) {
+ error_report("error setting config options");
+ rados_shutdown(s->cluster);
+ return r;
+ }
+ }
+
+ r = rados_connect(s->cluster);
+ if (r < 0) {
+ error_report("error connecting");
+ rados_shutdown(s->cluster);
+ return r;
+ }
+
+ r = rados_ioctx_create(s->cluster, pool, &s->io_ctx);
+ if (r < 0) {
+ error_report("error opening pool %s", pool);
+ rados_shutdown(s->cluster);
+ return r;
+ }
+
+ r = rbd_open(s->io_ctx, s->name, &s->image, s->snap);
+ if (r < 0) {
+ error_report("error reading header from %s", s->name);
+ rados_ioctx_destroy(s->io_ctx);
+ rados_shutdown(s->cluster);
+ return r;
+ }
+
+ bs->read_only = (s->snap != NULL);
+
+ s->event_reader_pos = 0;
+ r = qemu_pipe(s->fds);
+ if (r < 0) {
+ error_report("error opening eventfd");
+ goto failed;
+ }
+ fcntl(s->fds[0], F_SETFL, O_NONBLOCK);
+ fcntl(s->fds[1], F_SETFL, O_NONBLOCK);
+ qemu_aio_set_fd_handler(s->fds[RBD_FD_READ], qemu_rbd_aio_event_reader,
+ NULL, qemu_rbd_aio_flush_cb, NULL, s);
+
+
+ return 0;
+
+failed:
+ rbd_close(s->image);
+ rados_ioctx_destroy(s->io_ctx);
+ rados_shutdown(s->cluster);
+ return r;
+}
+
+static void qemu_rbd_close(BlockDriverState *bs)
+{
+ BDRVRBDState *s = bs->opaque;
+
+ close(s->fds[0]);
+ close(s->fds[1]);
+ qemu_aio_set_fd_handler(s->fds[RBD_FD_READ], NULL , NULL, NULL, NULL,
+ NULL);
+
+ rbd_close(s->image);
+ rados_ioctx_destroy(s->io_ctx);
+ qemu_free(s->snap);
+ rados_shutdown(s->cluster);
+}
+
+/*
+ * Cancel aio. Since we don't reference acb in a non qemu threads,
+ * it is safe to access it here.
+ */
+static void qemu_rbd_aio_cancel(BlockDriverAIOCB *blockacb)
+{
+ RBDAIOCB *acb = (RBDAIOCB *) blockacb;
+ acb->cancelled = 1;
+}
+
+static AIOPool rbd_aio_pool = {
+ .aiocb_size = sizeof(RBDAIOCB),
+ .cancel = qemu_rbd_aio_cancel,
+};
+
+static int qemu_rbd_send_pipe(BDRVRBDState *s, RADOSCB *rcb)
+{
+ int ret = 0;
+ while (1) {
+ fd_set wfd;
+ int fd = s->fds[RBD_FD_WRITE];
+
+ /* send the op pointer to the qemu thread that is responsible
+ for the aio/op completion. Must do it in a qemu thread context */
+ ret = write(fd, (void *)&rcb, sizeof(rcb));
+ if (ret >= 0) {
+ break;
+ }
+ if (errno == EINTR) {
+ continue;
+ }
+ if (errno != EAGAIN) {
+ break;
+ }
+
+ FD_ZERO(&wfd);
+ FD_SET(fd, &wfd);
+ do {
+ ret = select(fd + 1, NULL, &wfd, NULL, NULL);
+ } while (ret < 0 && errno == EINTR);
+ }
+
+ return ret;
+}
+
+/*
+ * This is the callback function for rbd_aio_read and _write
+ *
+ * Note: this function is being called from a non qemu thread so
+ * we need to be careful about what we do here. Generally we only
+ * write to the block notification pipe, and do the rest of the
+ * io completion handling from qemu_rbd_aio_event_reader() which
+ * runs in a qemu context.
+ */
+static void rbd_finish_aiocb(rbd_completion_t c, RADOSCB *rcb)
+{
+ int ret;
+ rcb->ret = rbd_aio_get_return_value(c);
+ rbd_aio_release(c);
+ ret = qemu_rbd_send_pipe(rcb->s, rcb);
+ if (ret < 0) {
+ error_report("failed writing to acb->s->fds");
+ qemu_free(rcb);
+ }
+}
+
+/* Callback when all queued rbd_aio requests are complete */
+
+static void rbd_aio_bh_cb(void *opaque)
+{
+ RBDAIOCB *acb = opaque;
+
+ if (!acb->write) {
+ qemu_iovec_from_buffer(acb->qiov, acb->bounce, acb->qiov->size);
+ }
+ qemu_vfree(acb->bounce);
+ acb->common.cb(acb->common.opaque, (acb->ret > 0 ? 0 : acb->ret));
+ qemu_bh_delete(acb->bh);
+ acb->bh = NULL;
+
+ qemu_aio_release(acb);
+}
+
+static BlockDriverAIOCB *rbd_aio_rw_vector(BlockDriverState *bs,
+ int64_t sector_num,
+ QEMUIOVector *qiov,
+ int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque, int write)
+{
+ RBDAIOCB *acb;
+ RADOSCB *rcb;
+ rbd_completion_t c;
+ int64_t off, size;
+ char *buf;
+ int r;
+
+ BDRVRBDState *s = bs->opaque;
+
+ acb = qemu_aio_get(&rbd_aio_pool, bs, cb, opaque);
+ if (!acb) {
+ return NULL;
+ }
+ acb->write = write;
+ acb->qiov = qiov;
+ acb->bounce = qemu_blockalign(bs, qiov->size);
+ acb->ret = 0;
+ acb->error = 0;
+ acb->s = s;
+ acb->cancelled = 0;
+ acb->bh = NULL;
+
+ if (write) {
+ qemu_iovec_to_buffer(acb->qiov, acb->bounce);
+ }
+
+ buf = acb->bounce;
+
+ off = sector_num * BDRV_SECTOR_SIZE;
+ size = nb_sectors * BDRV_SECTOR_SIZE;
+
+ s->qemu_aio_count++; /* All the RADOSCB */
+
+ rcb = qemu_malloc(sizeof(RADOSCB));
+ rcb->done = 0;
+ rcb->acb = acb;
+ rcb->buf = buf;
+ rcb->s = acb->s;
+ rcb->size = size;
+ r = rbd_aio_create_completion(rcb, (rbd_callback_t) rbd_finish_aiocb, &c);
+ if (r < 0) {
+ goto failed;
+ }
+
+ if (write) {
+ r = rbd_aio_write(s->image, off, size, buf, c);
+ } else {
+ r = rbd_aio_read(s->image, off, size, buf, c);
+ }
+
+ if (r < 0) {
+ goto failed;
+ }
+
+ return &acb->common;
+
+failed:
+ qemu_free(rcb);
+ s->qemu_aio_count--;
+ qemu_aio_release(acb);
+ return NULL;
+}
+
+static BlockDriverAIOCB *qemu_rbd_aio_readv(BlockDriverState *bs,
+ int64_t sector_num,
+ QEMUIOVector *qiov,
+ int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ return rbd_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
+}
+
+static BlockDriverAIOCB *qemu_rbd_aio_writev(BlockDriverState *bs,
+ int64_t sector_num,
+ QEMUIOVector *qiov,
+ int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ return rbd_aio_rw_vector(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
+}
+
+static int qemu_rbd_getinfo(BlockDriverState *bs, BlockDriverInfo *bdi)
+{
+ BDRVRBDState *s = bs->opaque;
+ rbd_image_info_t info;
+ int r;
+
+ r = rbd_stat(s->image, &info, sizeof(info));
+ if (r < 0) {
+ return r;
+ }
+
+ bdi->cluster_size = info.obj_size;
+ return 0;
+}
+
+static int64_t qemu_rbd_getlength(BlockDriverState *bs)
+{
+ BDRVRBDState *s = bs->opaque;
+ rbd_image_info_t info;
+ int r;
+
+ r = rbd_stat(s->image, &info, sizeof(info));
+ if (r < 0) {
+ return r;
+ }
+
+ return info.size;
+}
+
+static int qemu_rbd_truncate(BlockDriverState *bs, int64_t offset)
+{
+ BDRVRBDState *s = bs->opaque;
+ int r;
+
+ r = rbd_resize(s->image, offset);
+ if (r < 0) {
+ return r;
+ }
+
+ return 0;
+}
+
+static int qemu_rbd_snap_create(BlockDriverState *bs,
+ QEMUSnapshotInfo *sn_info)
+{
+ BDRVRBDState *s = bs->opaque;
+ int r;
+
+ if (sn_info->name[0] == '\0') {
+ return -EINVAL; /* we need a name for rbd snapshots */
+ }
+
+ /*
+ * rbd snapshots are using the name as the user controlled unique identifier
+ * we can't use the rbd snapid for that purpose, as it can't be set
+ */
+ if (sn_info->id_str[0] != '\0' &&
+ strcmp(sn_info->id_str, sn_info->name) != 0) {
+ return -EINVAL;
+ }
+
+ if (strlen(sn_info->name) >= sizeof(sn_info->id_str)) {
+ return -ERANGE;
+ }
+
+ r = rbd_snap_create(s->image, sn_info->name);
+ if (r < 0) {
+ error_report("failed to create snap: %s", strerror(-r));
+ return r;
+ }
+
+ return 0;
+}
+
+static int qemu_rbd_snap_list(BlockDriverState *bs,
+ QEMUSnapshotInfo **psn_tab)
+{
+ BDRVRBDState *s = bs->opaque;
+ QEMUSnapshotInfo *sn_info, *sn_tab = NULL;
+ int i, snap_count;
+ rbd_snap_info_t *snaps;
+ int max_snaps = RBD_MAX_SNAPS;
+
+ do {
+ snaps = qemu_malloc(sizeof(*snaps) * max_snaps);
+ snap_count = rbd_snap_list(s->image, snaps, &max_snaps);
+ if (snap_count < 0) {
+ qemu_free(snaps);
+ }
+ } while (snap_count == -ERANGE);
+
+ if (snap_count <= 0) {
+ return snap_count;
+ }
+
+ sn_tab = qemu_mallocz(snap_count * sizeof(QEMUSnapshotInfo));
+
+ for (i = 0; i < snap_count; i++) {
+ const char *snap_name = snaps[i].name;
+
+ sn_info = sn_tab + i;
+ pstrcpy(sn_info->id_str, sizeof(sn_info->id_str), snap_name);
+ pstrcpy(sn_info->name, sizeof(sn_info->name), snap_name);
+
+ sn_info->vm_state_size = snaps[i].size;
+ sn_info->date_sec = 0;
+ sn_info->date_nsec = 0;
+ sn_info->vm_clock_nsec = 0;
+ }
+ rbd_snap_list_end(snaps);
+
+ *psn_tab = sn_tab;
+ return snap_count;
+}
+
+static QEMUOptionParameter qemu_rbd_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ {
+ .name = BLOCK_OPT_CLUSTER_SIZE,
+ .type = OPT_SIZE,
+ .help = "RBD object size"
+ },
+ {NULL}
+};
+
+static BlockDriver bdrv_rbd = {
+ .format_name = "rbd",
+ .instance_size = sizeof(BDRVRBDState),
+ .bdrv_file_open = qemu_rbd_open,
+ .bdrv_close = qemu_rbd_close,
+ .bdrv_create = qemu_rbd_create,
+ .bdrv_get_info = qemu_rbd_getinfo,
+ .create_options = qemu_rbd_create_options,
+ .bdrv_getlength = qemu_rbd_getlength,
+ .bdrv_truncate = qemu_rbd_truncate,
+ .protocol_name = "rbd",
+
+ .bdrv_aio_readv = qemu_rbd_aio_readv,
+ .bdrv_aio_writev = qemu_rbd_aio_writev,
+
+ .bdrv_snapshot_create = qemu_rbd_snap_create,
+ .bdrv_snapshot_list = qemu_rbd_snap_list,
+};
+
+static void bdrv_rbd_init(void)
+{
+ bdrv_register(&bdrv_rbd);
+}
+
+block_init(bdrv_rbd_init);
diff --git a/qemu-0.15.x/block/sheepdog.c b/qemu-0.15.x/block/sheepdog.c
new file mode 100644
index 0000000..e150ac0
--- /dev/null
+++ b/qemu-0.15.x/block/sheepdog.c
@@ -0,0 +1,2083 @@
+/*
+ * Copyright (C) 2009-2010 Nippon Telegraph and Telephone Corporation.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License version
+ * 2 as published by the Free Software Foundation.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "qemu-common.h"
+#include "qemu-error.h"
+#include "qemu_socket.h"
+#include "block_int.h"
+#include "bitops.h"
+
+#define SD_PROTO_VER 0x01
+
+#define SD_DEFAULT_ADDR "localhost"
+#define SD_DEFAULT_PORT "7000"
+
+#define SD_OP_CREATE_AND_WRITE_OBJ 0x01
+#define SD_OP_READ_OBJ 0x02
+#define SD_OP_WRITE_OBJ 0x03
+
+#define SD_OP_NEW_VDI 0x11
+#define SD_OP_LOCK_VDI 0x12
+#define SD_OP_RELEASE_VDI 0x13
+#define SD_OP_GET_VDI_INFO 0x14
+#define SD_OP_READ_VDIS 0x15
+
+#define SD_FLAG_CMD_WRITE 0x01
+#define SD_FLAG_CMD_COW 0x02
+
+#define SD_RES_SUCCESS 0x00 /* Success */
+#define SD_RES_UNKNOWN 0x01 /* Unknown error */
+#define SD_RES_NO_OBJ 0x02 /* No object found */
+#define SD_RES_EIO 0x03 /* I/O error */
+#define SD_RES_VDI_EXIST 0x04 /* Vdi exists already */
+#define SD_RES_INVALID_PARMS 0x05 /* Invalid parameters */
+#define SD_RES_SYSTEM_ERROR 0x06 /* System error */
+#define SD_RES_VDI_LOCKED 0x07 /* Vdi is locked */
+#define SD_RES_NO_VDI 0x08 /* No vdi found */
+#define SD_RES_NO_BASE_VDI 0x09 /* No base vdi found */
+#define SD_RES_VDI_READ 0x0A /* Cannot read requested vdi */
+#define SD_RES_VDI_WRITE 0x0B /* Cannot write requested vdi */
+#define SD_RES_BASE_VDI_READ 0x0C /* Cannot read base vdi */
+#define SD_RES_BASE_VDI_WRITE 0x0D /* Cannot write base vdi */
+#define SD_RES_NO_TAG 0x0E /* Requested tag is not found */
+#define SD_RES_STARTUP 0x0F /* Sheepdog is on starting up */
+#define SD_RES_VDI_NOT_LOCKED 0x10 /* Vdi is not locked */
+#define SD_RES_SHUTDOWN 0x11 /* Sheepdog is shutting down */
+#define SD_RES_NO_MEM 0x12 /* Cannot allocate memory */
+#define SD_RES_FULL_VDI 0x13 /* we already have the maximum vdis */
+#define SD_RES_VER_MISMATCH 0x14 /* Protocol version mismatch */
+#define SD_RES_NO_SPACE 0x15 /* Server has no room for new objects */
+#define SD_RES_WAIT_FOR_FORMAT 0x16 /* Waiting for a format operation */
+#define SD_RES_WAIT_FOR_JOIN 0x17 /* Waiting for other nodes joining */
+#define SD_RES_JOIN_FAILED 0x18 /* Target node had failed to join sheepdog */
+
+/*
+ * Object ID rules
+ *
+ * 0 - 19 (20 bits): data object space
+ * 20 - 31 (12 bits): reserved data object space
+ * 32 - 55 (24 bits): vdi object space
+ * 56 - 59 ( 4 bits): reserved vdi object space
+ * 60 - 63 ( 4 bits): object type indentifier space
+ */
+
+#define VDI_SPACE_SHIFT 32
+#define VDI_BIT (UINT64_C(1) << 63)
+#define VMSTATE_BIT (UINT64_C(1) << 62)
+#define MAX_DATA_OBJS (UINT64_C(1) << 20)
+#define MAX_CHILDREN 1024
+#define SD_MAX_VDI_LEN 256
+#define SD_MAX_VDI_TAG_LEN 256
+#define SD_NR_VDIS (1U << 24)
+#define SD_DATA_OBJ_SIZE (UINT64_C(1) << 22)
+#define SD_MAX_VDI_SIZE (SD_DATA_OBJ_SIZE * MAX_DATA_OBJS)
+#define SECTOR_SIZE 512
+
+#define SD_INODE_SIZE (sizeof(SheepdogInode))
+#define CURRENT_VDI_ID 0
+
+typedef struct SheepdogReq {
+ uint8_t proto_ver;
+ uint8_t opcode;
+ uint16_t flags;
+ uint32_t epoch;
+ uint32_t id;
+ uint32_t data_length;
+ uint32_t opcode_specific[8];
+} SheepdogReq;
+
+typedef struct SheepdogRsp {
+ uint8_t proto_ver;
+ uint8_t opcode;
+ uint16_t flags;
+ uint32_t epoch;
+ uint32_t id;
+ uint32_t data_length;
+ uint32_t result;
+ uint32_t opcode_specific[7];
+} SheepdogRsp;
+
+typedef struct SheepdogObjReq {
+ uint8_t proto_ver;
+ uint8_t opcode;
+ uint16_t flags;
+ uint32_t epoch;
+ uint32_t id;
+ uint32_t data_length;
+ uint64_t oid;
+ uint64_t cow_oid;
+ uint32_t copies;
+ uint32_t rsvd;
+ uint64_t offset;
+} SheepdogObjReq;
+
+typedef struct SheepdogObjRsp {
+ uint8_t proto_ver;
+ uint8_t opcode;
+ uint16_t flags;
+ uint32_t epoch;
+ uint32_t id;
+ uint32_t data_length;
+ uint32_t result;
+ uint32_t copies;
+ uint32_t pad[6];
+} SheepdogObjRsp;
+
+typedef struct SheepdogVdiReq {
+ uint8_t proto_ver;
+ uint8_t opcode;
+ uint16_t flags;
+ uint32_t epoch;
+ uint32_t id;
+ uint32_t data_length;
+ uint64_t vdi_size;
+ uint32_t base_vdi_id;
+ uint32_t copies;
+ uint32_t snapid;
+ uint32_t pad[3];
+} SheepdogVdiReq;
+
+typedef struct SheepdogVdiRsp {
+ uint8_t proto_ver;
+ uint8_t opcode;
+ uint16_t flags;
+ uint32_t epoch;
+ uint32_t id;
+ uint32_t data_length;
+ uint32_t result;
+ uint32_t rsvd;
+ uint32_t vdi_id;
+ uint32_t pad[5];
+} SheepdogVdiRsp;
+
+typedef struct SheepdogInode {
+ char name[SD_MAX_VDI_LEN];
+ char tag[SD_MAX_VDI_TAG_LEN];
+ uint64_t ctime;
+ uint64_t snap_ctime;
+ uint64_t vm_clock_nsec;
+ uint64_t vdi_size;
+ uint64_t vm_state_size;
+ uint16_t copy_policy;
+ uint8_t nr_copies;
+ uint8_t block_size_shift;
+ uint32_t snap_id;
+ uint32_t vdi_id;
+ uint32_t parent_vdi_id;
+ uint32_t child_vdi_id[MAX_CHILDREN];
+ uint32_t data_vdi_id[MAX_DATA_OBJS];
+} SheepdogInode;
+
+/*
+ * 64 bit FNV-1a non-zero initial basis
+ */
+#define FNV1A_64_INIT ((uint64_t)0xcbf29ce484222325ULL)
+
+/*
+ * 64 bit Fowler/Noll/Vo FNV-1a hash code
+ */
+static inline uint64_t fnv_64a_buf(void *buf, size_t len, uint64_t hval)
+{
+ unsigned char *bp = buf;
+ unsigned char *be = bp + len;
+ while (bp < be) {
+ hval ^= (uint64_t) *bp++;
+ hval += (hval << 1) + (hval << 4) + (hval << 5) +
+ (hval << 7) + (hval << 8) + (hval << 40);
+ }
+ return hval;
+}
+
+static inline int is_data_obj_writable(SheepdogInode *inode, unsigned int idx)
+{
+ return inode->vdi_id == inode->data_vdi_id[idx];
+}
+
+static inline int is_data_obj(uint64_t oid)
+{
+ return !(VDI_BIT & oid);
+}
+
+static inline uint64_t data_oid_to_idx(uint64_t oid)
+{
+ return oid & (MAX_DATA_OBJS - 1);
+}
+
+static inline uint64_t vid_to_vdi_oid(uint32_t vid)
+{
+ return VDI_BIT | ((uint64_t)vid << VDI_SPACE_SHIFT);
+}
+
+static inline uint64_t vid_to_vmstate_oid(uint32_t vid, uint32_t idx)
+{
+ return VMSTATE_BIT | ((uint64_t)vid << VDI_SPACE_SHIFT) | idx;
+}
+
+static inline uint64_t vid_to_data_oid(uint32_t vid, uint32_t idx)
+{
+ return ((uint64_t)vid << VDI_SPACE_SHIFT) | idx;
+}
+
+static inline int is_snapshot(struct SheepdogInode *inode)
+{
+ return !!inode->snap_ctime;
+}
+
+#undef dprintf
+#ifdef DEBUG_SDOG
+#define dprintf(fmt, args...) \
+ do { \
+ fprintf(stdout, "%s %d: " fmt, __func__, __LINE__, ##args); \
+ } while (0)
+#else
+#define dprintf(fmt, args...)
+#endif
+
+typedef struct SheepdogAIOCB SheepdogAIOCB;
+
+typedef struct AIOReq {
+ SheepdogAIOCB *aiocb;
+ unsigned int iov_offset;
+
+ uint64_t oid;
+ uint64_t base_oid;
+ uint64_t offset;
+ unsigned int data_len;
+ uint8_t flags;
+ uint32_t id;
+
+ QLIST_ENTRY(AIOReq) outstanding_aio_siblings;
+ QLIST_ENTRY(AIOReq) aioreq_siblings;
+} AIOReq;
+
+enum AIOCBState {
+ AIOCB_WRITE_UDATA,
+ AIOCB_READ_UDATA,
+};
+
+struct SheepdogAIOCB {
+ BlockDriverAIOCB common;
+
+ QEMUIOVector *qiov;
+
+ int64_t sector_num;
+ int nb_sectors;
+
+ int ret;
+ enum AIOCBState aiocb_type;
+
+ QEMUBH *bh;
+ void (*aio_done_func)(SheepdogAIOCB *);
+
+ int canceled;
+
+ QLIST_HEAD(aioreq_head, AIOReq) aioreq_head;
+};
+
+typedef struct BDRVSheepdogState {
+ SheepdogInode inode;
+
+ uint32_t min_dirty_data_idx;
+ uint32_t max_dirty_data_idx;
+
+ char name[SD_MAX_VDI_LEN];
+ int is_snapshot;
+
+ char *addr;
+ char *port;
+ int fd;
+
+ uint32_t aioreq_seq_num;
+ QLIST_HEAD(outstanding_aio_head, AIOReq) outstanding_aio_head;
+} BDRVSheepdogState;
+
+static const char * sd_strerror(int err)
+{
+ int i;
+
+ static const struct {
+ int err;
+ const char *desc;
+ } errors[] = {
+ {SD_RES_SUCCESS, "Success"},
+ {SD_RES_UNKNOWN, "Unknown error"},
+ {SD_RES_NO_OBJ, "No object found"},
+ {SD_RES_EIO, "I/O error"},
+ {SD_RES_VDI_EXIST, "VDI exists already"},
+ {SD_RES_INVALID_PARMS, "Invalid parameters"},
+ {SD_RES_SYSTEM_ERROR, "System error"},
+ {SD_RES_VDI_LOCKED, "VDI is already locked"},
+ {SD_RES_NO_VDI, "No vdi found"},
+ {SD_RES_NO_BASE_VDI, "No base VDI found"},
+ {SD_RES_VDI_READ, "Failed read the requested VDI"},
+ {SD_RES_VDI_WRITE, "Failed to write the requested VDI"},
+ {SD_RES_BASE_VDI_READ, "Failed to read the base VDI"},
+ {SD_RES_BASE_VDI_WRITE, "Failed to write the base VDI"},
+ {SD_RES_NO_TAG, "Failed to find the requested tag"},
+ {SD_RES_STARTUP, "The system is still booting"},
+ {SD_RES_VDI_NOT_LOCKED, "VDI isn't locked"},
+ {SD_RES_SHUTDOWN, "The system is shutting down"},
+ {SD_RES_NO_MEM, "Out of memory on the server"},
+ {SD_RES_FULL_VDI, "We already have the maximum vdis"},
+ {SD_RES_VER_MISMATCH, "Protocol version mismatch"},
+ {SD_RES_NO_SPACE, "Server has no space for new objects"},
+ {SD_RES_WAIT_FOR_FORMAT, "Sheepdog is waiting for a format operation"},
+ {SD_RES_WAIT_FOR_JOIN, "Sheepdog is waiting for other nodes joining"},
+ {SD_RES_JOIN_FAILED, "Target node had failed to join sheepdog"},
+ };
+
+ for (i = 0; i < ARRAY_SIZE(errors); ++i) {
+ if (errors[i].err == err) {
+ return errors[i].desc;
+ }
+ }
+
+ return "Invalid error code";
+}
+
+/*
+ * Sheepdog I/O handling:
+ *
+ * 1. In the sd_aio_readv/writev, read/write requests are added to the
+ * QEMU Bottom Halves.
+ *
+ * 2. In sd_readv_writev_bh_cb, the callbacks of BHs, we send the I/O
+ * requests to the server and link the requests to the
+ * outstanding_list in the BDRVSheepdogState. we exits the
+ * function without waiting for receiving the response.
+ *
+ * 3. We receive the response in aio_read_response, the fd handler to
+ * the sheepdog connection. If metadata update is needed, we send
+ * the write request to the vdi object in sd_write_done, the write
+ * completion function. The AIOCB callback is not called until all
+ * the requests belonging to the AIOCB are finished.
+ */
+
+static inline AIOReq *alloc_aio_req(BDRVSheepdogState *s, SheepdogAIOCB *acb,
+ uint64_t oid, unsigned int data_len,
+ uint64_t offset, uint8_t flags,
+ uint64_t base_oid, unsigned int iov_offset)
+{
+ AIOReq *aio_req;
+
+ aio_req = qemu_malloc(sizeof(*aio_req));
+ aio_req->aiocb = acb;
+ aio_req->iov_offset = iov_offset;
+ aio_req->oid = oid;
+ aio_req->base_oid = base_oid;
+ aio_req->offset = offset;
+ aio_req->data_len = data_len;
+ aio_req->flags = flags;
+ aio_req->id = s->aioreq_seq_num++;
+
+ QLIST_INSERT_HEAD(&s->outstanding_aio_head, aio_req,
+ outstanding_aio_siblings);
+ QLIST_INSERT_HEAD(&acb->aioreq_head, aio_req, aioreq_siblings);
+
+ return aio_req;
+}
+
+static inline int free_aio_req(BDRVSheepdogState *s, AIOReq *aio_req)
+{
+ SheepdogAIOCB *acb = aio_req->aiocb;
+ QLIST_REMOVE(aio_req, outstanding_aio_siblings);
+ QLIST_REMOVE(aio_req, aioreq_siblings);
+ qemu_free(aio_req);
+
+ return !QLIST_EMPTY(&acb->aioreq_head);
+}
+
+static void sd_finish_aiocb(SheepdogAIOCB *acb)
+{
+ if (!acb->canceled) {
+ acb->common.cb(acb->common.opaque, acb->ret);
+ }
+ qemu_aio_release(acb);
+}
+
+static void sd_aio_cancel(BlockDriverAIOCB *blockacb)
+{
+ SheepdogAIOCB *acb = (SheepdogAIOCB *)blockacb;
+
+ /*
+ * Sheepdog cannot cancel the requests which are already sent to
+ * the servers, so we just complete the request with -EIO here.
+ */
+ acb->common.cb(acb->common.opaque, -EIO);
+ acb->canceled = 1;
+}
+
+static AIOPool sd_aio_pool = {
+ .aiocb_size = sizeof(SheepdogAIOCB),
+ .cancel = sd_aio_cancel,
+};
+
+static SheepdogAIOCB *sd_aio_setup(BlockDriverState *bs, QEMUIOVector *qiov,
+ int64_t sector_num, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ SheepdogAIOCB *acb;
+
+ acb = qemu_aio_get(&sd_aio_pool, bs, cb, opaque);
+
+ acb->qiov = qiov;
+
+ acb->sector_num = sector_num;
+ acb->nb_sectors = nb_sectors;
+
+ acb->aio_done_func = NULL;
+ acb->canceled = 0;
+ acb->bh = NULL;
+ acb->ret = 0;
+ QLIST_INIT(&acb->aioreq_head);
+ return acb;
+}
+
+static int sd_schedule_bh(QEMUBHFunc *cb, SheepdogAIOCB *acb)
+{
+ if (acb->bh) {
+ error_report("bug: %d %d", acb->aiocb_type, acb->aiocb_type);
+ return -EIO;
+ }
+
+ acb->bh = qemu_bh_new(cb, acb);
+ qemu_bh_schedule(acb->bh);
+ return 0;
+}
+
+#ifdef _WIN32
+
+struct msghdr {
+ struct iovec *msg_iov;
+ size_t msg_iovlen;
+};
+
+static ssize_t sendmsg(int s, const struct msghdr *msg, int flags)
+{
+ size_t size = 0;
+ char *buf, *p;
+ int i, ret;
+
+ /* count the msg size */
+ for (i = 0; i < msg->msg_iovlen; i++) {
+ size += msg->msg_iov[i].iov_len;
+ }
+ buf = qemu_malloc(size);
+
+ p = buf;
+ for (i = 0; i < msg->msg_iovlen; i++) {
+ memcpy(p, msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len);
+ p += msg->msg_iov[i].iov_len;
+ }
+
+ ret = send(s, buf, size, flags);
+
+ qemu_free(buf);
+ return ret;
+}
+
+static ssize_t recvmsg(int s, struct msghdr *msg, int flags)
+{
+ size_t size = 0;
+ char *buf, *p;
+ int i, ret;
+
+ /* count the msg size */
+ for (i = 0; i < msg->msg_iovlen; i++) {
+ size += msg->msg_iov[i].iov_len;
+ }
+ buf = qemu_malloc(size);
+
+ ret = qemu_recv(s, buf, size, flags);
+ if (ret < 0) {
+ goto out;
+ }
+
+ p = buf;
+ for (i = 0; i < msg->msg_iovlen; i++) {
+ memcpy(msg->msg_iov[i].iov_base, p, msg->msg_iov[i].iov_len);
+ p += msg->msg_iov[i].iov_len;
+ }
+out:
+ qemu_free(buf);
+ return ret;
+}
+
+#endif
+
+/*
+ * Send/recv data with iovec buffers
+ *
+ * This function send/recv data from/to the iovec buffer directly.
+ * The first `offset' bytes in the iovec buffer are skipped and next
+ * `len' bytes are used.
+ *
+ * For example,
+ *
+ * do_send_recv(sockfd, iov, len, offset, 1);
+ *
+ * is equals to
+ *
+ * char *buf = malloc(size);
+ * iov_to_buf(iov, iovcnt, buf, offset, size);
+ * send(sockfd, buf, size, 0);
+ * free(buf);
+ */
+static int do_send_recv(int sockfd, struct iovec *iov, int len, int offset,
+ int write)
+{
+ struct msghdr msg;
+ int ret, diff;
+
+ memset(&msg, 0, sizeof(msg));
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+
+ len += offset;
+
+ while (iov->iov_len < len) {
+ len -= iov->iov_len;
+
+ iov++;
+ msg.msg_iovlen++;
+ }
+
+ diff = iov->iov_len - len;
+ iov->iov_len -= diff;
+
+ while (msg.msg_iov->iov_len <= offset) {
+ offset -= msg.msg_iov->iov_len;
+
+ msg.msg_iov++;
+ msg.msg_iovlen--;
+ }
+
+ msg.msg_iov->iov_base = (char *) msg.msg_iov->iov_base + offset;
+ msg.msg_iov->iov_len -= offset;
+
+ if (write) {
+ ret = sendmsg(sockfd, &msg, 0);
+ } else {
+ ret = recvmsg(sockfd, &msg, 0);
+ }
+
+ msg.msg_iov->iov_base = (char *) msg.msg_iov->iov_base - offset;
+ msg.msg_iov->iov_len += offset;
+
+ iov->iov_len += diff;
+ return ret;
+}
+
+static int connect_to_sdog(const char *addr, const char *port)
+{
+ char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];
+ int fd, ret;
+ struct addrinfo hints, *res, *res0;
+
+ if (!addr) {
+ addr = SD_DEFAULT_ADDR;
+ port = SD_DEFAULT_PORT;
+ }
+
+ memset(&hints, 0, sizeof(hints));
+ hints.ai_socktype = SOCK_STREAM;
+
+ ret = getaddrinfo(addr, port, &hints, &res0);
+ if (ret) {
+ error_report("unable to get address info %s, %s",
+ addr, strerror(errno));
+ return -1;
+ }
+
+ for (res = res0; res; res = res->ai_next) {
+ ret = getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf),
+ sbuf, sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV);
+ if (ret) {
+ continue;
+ }
+
+ fd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
+ if (fd < 0) {
+ continue;
+ }
+
+ reconnect:
+ ret = connect(fd, res->ai_addr, res->ai_addrlen);
+ if (ret < 0) {
+ if (errno == EINTR) {
+ goto reconnect;
+ }
+ break;
+ }
+
+ dprintf("connected to %s:%s\n", addr, port);
+ goto success;
+ }
+ fd = -1;
+ error_report("failed connect to %s:%s", addr, port);
+success:
+ freeaddrinfo(res0);
+ return fd;
+}
+
+static int do_readv_writev(int sockfd, struct iovec *iov, int len,
+ int iov_offset, int write)
+{
+ int ret;
+again:
+ ret = do_send_recv(sockfd, iov, len, iov_offset, write);
+ if (ret < 0) {
+ if (errno == EINTR || errno == EAGAIN) {
+ goto again;
+ }
+ error_report("failed to recv a rsp, %s", strerror(errno));
+ return 1;
+ }
+
+ iov_offset += ret;
+ len -= ret;
+ if (len) {
+ goto again;
+ }
+
+ return 0;
+}
+
+static int do_readv(int sockfd, struct iovec *iov, int len, int iov_offset)
+{
+ return do_readv_writev(sockfd, iov, len, iov_offset, 0);
+}
+
+static int do_writev(int sockfd, struct iovec *iov, int len, int iov_offset)
+{
+ return do_readv_writev(sockfd, iov, len, iov_offset, 1);
+}
+
+static int do_read_write(int sockfd, void *buf, int len, int write)
+{
+ struct iovec iov;
+
+ iov.iov_base = buf;
+ iov.iov_len = len;
+
+ return do_readv_writev(sockfd, &iov, len, 0, write);
+}
+
+static int do_read(int sockfd, void *buf, int len)
+{
+ return do_read_write(sockfd, buf, len, 0);
+}
+
+static int do_write(int sockfd, void *buf, int len)
+{
+ return do_read_write(sockfd, buf, len, 1);
+}
+
+static int send_req(int sockfd, SheepdogReq *hdr, void *data,
+ unsigned int *wlen)
+{
+ int ret;
+ struct iovec iov[2];
+
+ iov[0].iov_base = hdr;
+ iov[0].iov_len = sizeof(*hdr);
+
+ if (*wlen) {
+ iov[1].iov_base = data;
+ iov[1].iov_len = *wlen;
+ }
+
+ ret = do_writev(sockfd, iov, sizeof(*hdr) + *wlen, 0);
+ if (ret) {
+ error_report("failed to send a req, %s", strerror(errno));
+ ret = -1;
+ }
+
+ return ret;
+}
+
+static int do_req(int sockfd, SheepdogReq *hdr, void *data,
+ unsigned int *wlen, unsigned int *rlen)
+{
+ int ret;
+
+ ret = send_req(sockfd, hdr, data, wlen);
+ if (ret) {
+ ret = -1;
+ goto out;
+ }
+
+ ret = do_read(sockfd, hdr, sizeof(*hdr));
+ if (ret) {
+ error_report("failed to get a rsp, %s", strerror(errno));
+ ret = -1;
+ goto out;
+ }
+
+ if (*rlen > hdr->data_length) {
+ *rlen = hdr->data_length;
+ }
+
+ if (*rlen) {
+ ret = do_read(sockfd, data, *rlen);
+ if (ret) {
+ error_report("failed to get the data, %s", strerror(errno));
+ ret = -1;
+ goto out;
+ }
+ }
+ ret = 0;
+out:
+ return ret;
+}
+
+static int add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req,
+ struct iovec *iov, int niov, int create,
+ enum AIOCBState aiocb_type);
+
+/*
+ * This function searchs pending requests to the object `oid', and
+ * sends them.
+ */
+static void send_pending_req(BDRVSheepdogState *s, uint64_t oid, uint32_t id)
+{
+ AIOReq *aio_req, *next;
+ SheepdogAIOCB *acb;
+ int ret;
+
+ QLIST_FOREACH_SAFE(aio_req, &s->outstanding_aio_head,
+ outstanding_aio_siblings, next) {
+ if (id == aio_req->id) {
+ continue;
+ }
+ if (aio_req->oid != oid) {
+ continue;
+ }
+
+ acb = aio_req->aiocb;
+ ret = add_aio_request(s, aio_req, acb->qiov->iov,
+ acb->qiov->niov, 0, acb->aiocb_type);
+ if (ret < 0) {
+ error_report("add_aio_request is failed");
+ free_aio_req(s, aio_req);
+ if (QLIST_EMPTY(&acb->aioreq_head)) {
+ sd_finish_aiocb(acb);
+ }
+ }
+ }
+}
+
+/*
+ * Receive responses of the I/O requests.
+ *
+ * This function is registered as a fd handler, and called from the
+ * main loop when s->fd is ready for reading responses.
+ */
+static void aio_read_response(void *opaque)
+{
+ SheepdogObjRsp rsp;
+ BDRVSheepdogState *s = opaque;
+ int fd = s->fd;
+ int ret;
+ AIOReq *aio_req = NULL;
+ SheepdogAIOCB *acb;
+ int rest;
+ unsigned long idx;
+
+ if (QLIST_EMPTY(&s->outstanding_aio_head)) {
+ return;
+ }
+
+ /* read a header */
+ ret = do_read(fd, &rsp, sizeof(rsp));
+ if (ret) {
+ error_report("failed to get the header, %s", strerror(errno));
+ return;
+ }
+
+ /* find the right aio_req from the outstanding_aio list */
+ QLIST_FOREACH(aio_req, &s->outstanding_aio_head, outstanding_aio_siblings) {
+ if (aio_req->id == rsp.id) {
+ break;
+ }
+ }
+ if (!aio_req) {
+ error_report("cannot find aio_req %x", rsp.id);
+ return;
+ }
+
+ acb = aio_req->aiocb;
+
+ switch (acb->aiocb_type) {
+ case AIOCB_WRITE_UDATA:
+ if (!is_data_obj(aio_req->oid)) {
+ break;
+ }
+ idx = data_oid_to_idx(aio_req->oid);
+
+ if (s->inode.data_vdi_id[idx] != s->inode.vdi_id) {
+ /*
+ * If the object is newly created one, we need to update
+ * the vdi object (metadata object). min_dirty_data_idx
+ * and max_dirty_data_idx are changed to include updated
+ * index between them.
+ */
+ s->inode.data_vdi_id[idx] = s->inode.vdi_id;
+ s->max_dirty_data_idx = MAX(idx, s->max_dirty_data_idx);
+ s->min_dirty_data_idx = MIN(idx, s->min_dirty_data_idx);
+
+ /*
+ * Some requests may be blocked because simultaneous
+ * create requests are not allowed, so we search the
+ * pending requests here.
+ */
+ send_pending_req(s, vid_to_data_oid(s->inode.vdi_id, idx), rsp.id);
+ }
+ break;
+ case AIOCB_READ_UDATA:
+ ret = do_readv(fd, acb->qiov->iov, rsp.data_length,
+ aio_req->iov_offset);
+ if (ret) {
+ error_report("failed to get the data, %s", strerror(errno));
+ return;
+ }
+ break;
+ }
+
+ if (rsp.result != SD_RES_SUCCESS) {
+ acb->ret = -EIO;
+ error_report("%s", sd_strerror(rsp.result));
+ }
+
+ rest = free_aio_req(s, aio_req);
+ if (!rest) {
+ /*
+ * We've finished all requests which belong to the AIOCB, so
+ * we can call the callback now.
+ */
+ acb->aio_done_func(acb);
+ }
+}
+
+static int aio_flush_request(void *opaque)
+{
+ BDRVSheepdogState *s = opaque;
+
+ return !QLIST_EMPTY(&s->outstanding_aio_head);
+}
+
+#if !defined(SOL_TCP) || !defined(TCP_CORK)
+
+static int set_cork(int fd, int v)
+{
+ return 0;
+}
+
+#else
+
+static int set_cork(int fd, int v)
+{
+ return setsockopt(fd, SOL_TCP, TCP_CORK, &v, sizeof(v));
+}
+
+#endif
+
+static int set_nodelay(int fd)
+{
+ int ret, opt;
+
+ opt = 1;
+ ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt));
+ return ret;
+}
+
+/*
+ * Return a socket discriptor to read/write objects.
+ *
+ * We cannot use this discriptor for other operations because
+ * the block driver may be on waiting response from the server.
+ */
+static int get_sheep_fd(BDRVSheepdogState *s)
+{
+ int ret, fd;
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ error_report("%s", strerror(errno));
+ return -1;
+ }
+
+ socket_set_nonblock(fd);
+
+ ret = set_nodelay(fd);
+ if (ret) {
+ error_report("%s", strerror(errno));
+ closesocket(fd);
+ return -1;
+ }
+
+ qemu_aio_set_fd_handler(fd, aio_read_response, NULL, aio_flush_request,
+ NULL, s);
+ return fd;
+}
+
+/*
+ * Parse a filename
+ *
+ * filename must be one of the following formats:
+ * 1. [vdiname]
+ * 2. [vdiname]:[snapid]
+ * 3. [vdiname]:[tag]
+ * 4. [hostname]:[port]:[vdiname]
+ * 5. [hostname]:[port]:[vdiname]:[snapid]
+ * 6. [hostname]:[port]:[vdiname]:[tag]
+ *
+ * You can boot from the snapshot images by specifying `snapid` or
+ * `tag'.
+ *
+ * You can run VMs outside the Sheepdog cluster by specifying
+ * `hostname' and `port' (experimental).
+ */
+static int parse_vdiname(BDRVSheepdogState *s, const char *filename,
+ char *vdi, uint32_t *snapid, char *tag)
+{
+ char *p, *q;
+ int nr_sep;
+
+ p = q = qemu_strdup(filename);
+
+ /* count the number of separators */
+ nr_sep = 0;
+ while (*p) {
+ if (*p == ':') {
+ nr_sep++;
+ }
+ p++;
+ }
+ p = q;
+
+ /* use the first two tokens as hostname and port number. */
+ if (nr_sep >= 2) {
+ s->addr = p;
+ p = strchr(p, ':');
+ *p++ = '\0';
+
+ s->port = p;
+ p = strchr(p, ':');
+ *p++ = '\0';
+ } else {
+ s->addr = NULL;
+ s->port = 0;
+ }
+
+ strncpy(vdi, p, SD_MAX_VDI_LEN);
+
+ p = strchr(vdi, ':');
+ if (p) {
+ *p++ = '\0';
+ *snapid = strtoul(p, NULL, 10);
+ if (*snapid == 0) {
+ strncpy(tag, p, SD_MAX_VDI_TAG_LEN);
+ }
+ } else {
+ *snapid = CURRENT_VDI_ID; /* search current vdi */
+ }
+
+ if (s->addr == NULL) {
+ qemu_free(q);
+ }
+
+ return 0;
+}
+
+static int find_vdi_name(BDRVSheepdogState *s, char *filename, uint32_t snapid,
+ char *tag, uint32_t *vid, int for_snapshot)
+{
+ int ret, fd;
+ SheepdogVdiReq hdr;
+ SheepdogVdiRsp *rsp = (SheepdogVdiRsp *)&hdr;
+ unsigned int wlen, rlen = 0;
+ char buf[SD_MAX_VDI_LEN + SD_MAX_VDI_TAG_LEN];
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ return -1;
+ }
+
+ memset(buf, 0, sizeof(buf));
+ strncpy(buf, filename, SD_MAX_VDI_LEN);
+ strncpy(buf + SD_MAX_VDI_LEN, tag, SD_MAX_VDI_TAG_LEN);
+
+ memset(&hdr, 0, sizeof(hdr));
+ if (for_snapshot) {
+ hdr.opcode = SD_OP_GET_VDI_INFO;
+ } else {
+ hdr.opcode = SD_OP_LOCK_VDI;
+ }
+ wlen = SD_MAX_VDI_LEN + SD_MAX_VDI_TAG_LEN;
+ hdr.proto_ver = SD_PROTO_VER;
+ hdr.data_length = wlen;
+ hdr.snapid = snapid;
+ hdr.flags = SD_FLAG_CMD_WRITE;
+
+ ret = do_req(fd, (SheepdogReq *)&hdr, buf, &wlen, &rlen);
+ if (ret) {
+ ret = -1;
+ goto out;
+ }
+
+ if (rsp->result != SD_RES_SUCCESS) {
+ error_report("cannot get vdi info, %s, %s %d %s",
+ sd_strerror(rsp->result), filename, snapid, tag);
+ ret = -1;
+ goto out;
+ }
+ *vid = rsp->vdi_id;
+
+ ret = 0;
+out:
+ closesocket(fd);
+ return ret;
+}
+
+static int add_aio_request(BDRVSheepdogState *s, AIOReq *aio_req,
+ struct iovec *iov, int niov, int create,
+ enum AIOCBState aiocb_type)
+{
+ int nr_copies = s->inode.nr_copies;
+ SheepdogObjReq hdr;
+ unsigned int wlen;
+ int ret;
+ uint64_t oid = aio_req->oid;
+ unsigned int datalen = aio_req->data_len;
+ uint64_t offset = aio_req->offset;
+ uint8_t flags = aio_req->flags;
+ uint64_t old_oid = aio_req->base_oid;
+
+ if (!nr_copies) {
+ error_report("bug");
+ }
+
+ memset(&hdr, 0, sizeof(hdr));
+
+ if (aiocb_type == AIOCB_READ_UDATA) {
+ wlen = 0;
+ hdr.opcode = SD_OP_READ_OBJ;
+ hdr.flags = flags;
+ } else if (create) {
+ wlen = datalen;
+ hdr.opcode = SD_OP_CREATE_AND_WRITE_OBJ;
+ hdr.flags = SD_FLAG_CMD_WRITE | flags;
+ } else {
+ wlen = datalen;
+ hdr.opcode = SD_OP_WRITE_OBJ;
+ hdr.flags = SD_FLAG_CMD_WRITE | flags;
+ }
+
+ hdr.oid = oid;
+ hdr.cow_oid = old_oid;
+ hdr.copies = s->inode.nr_copies;
+
+ hdr.data_length = datalen;
+ hdr.offset = offset;
+
+ hdr.id = aio_req->id;
+
+ set_cork(s->fd, 1);
+
+ /* send a header */
+ ret = do_write(s->fd, &hdr, sizeof(hdr));
+ if (ret) {
+ error_report("failed to send a req, %s", strerror(errno));
+ return -EIO;
+ }
+
+ if (wlen) {
+ ret = do_writev(s->fd, iov, wlen, aio_req->iov_offset);
+ if (ret) {
+ error_report("failed to send a data, %s", strerror(errno));
+ return -EIO;
+ }
+ }
+
+ set_cork(s->fd, 0);
+
+ return 0;
+}
+
+static int read_write_object(int fd, char *buf, uint64_t oid, int copies,
+ unsigned int datalen, uint64_t offset,
+ int write, int create)
+{
+ SheepdogObjReq hdr;
+ SheepdogObjRsp *rsp = (SheepdogObjRsp *)&hdr;
+ unsigned int wlen, rlen;
+ int ret;
+
+ memset(&hdr, 0, sizeof(hdr));
+
+ if (write) {
+ wlen = datalen;
+ rlen = 0;
+ hdr.flags = SD_FLAG_CMD_WRITE;
+ if (create) {
+ hdr.opcode = SD_OP_CREATE_AND_WRITE_OBJ;
+ } else {
+ hdr.opcode = SD_OP_WRITE_OBJ;
+ }
+ } else {
+ wlen = 0;
+ rlen = datalen;
+ hdr.opcode = SD_OP_READ_OBJ;
+ }
+ hdr.oid = oid;
+ hdr.data_length = datalen;
+ hdr.offset = offset;
+ hdr.copies = copies;
+
+ ret = do_req(fd, (SheepdogReq *)&hdr, buf, &wlen, &rlen);
+ if (ret) {
+ error_report("failed to send a request to the sheep");
+ return -1;
+ }
+
+ switch (rsp->result) {
+ case SD_RES_SUCCESS:
+ return 0;
+ default:
+ error_report("%s", sd_strerror(rsp->result));
+ return -1;
+ }
+}
+
+static int read_object(int fd, char *buf, uint64_t oid, int copies,
+ unsigned int datalen, uint64_t offset)
+{
+ return read_write_object(fd, buf, oid, copies, datalen, offset, 0, 0);
+}
+
+static int write_object(int fd, char *buf, uint64_t oid, int copies,
+ unsigned int datalen, uint64_t offset, int create)
+{
+ return read_write_object(fd, buf, oid, copies, datalen, offset, 1, create);
+}
+
+static int sd_open(BlockDriverState *bs, const char *filename, int flags)
+{
+ int ret, fd;
+ uint32_t vid = 0;
+ BDRVSheepdogState *s = bs->opaque;
+ char vdi[SD_MAX_VDI_LEN], tag[SD_MAX_VDI_TAG_LEN];
+ uint32_t snapid;
+ char *buf = NULL;
+
+ strstart(filename, "sheepdog:", (const char **)&filename);
+
+ QLIST_INIT(&s->outstanding_aio_head);
+ s->fd = -1;
+
+ memset(vdi, 0, sizeof(vdi));
+ memset(tag, 0, sizeof(tag));
+ if (parse_vdiname(s, filename, vdi, &snapid, tag) < 0) {
+ goto out;
+ }
+ s->fd = get_sheep_fd(s);
+ if (s->fd < 0) {
+ goto out;
+ }
+
+ ret = find_vdi_name(s, vdi, snapid, tag, &vid, 0);
+ if (ret) {
+ goto out;
+ }
+
+ if (snapid) {
+ dprintf("%" PRIx32 " snapshot inode was open.\n", vid);
+ s->is_snapshot = 1;
+ }
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ error_report("failed to connect");
+ goto out;
+ }
+
+ buf = qemu_malloc(SD_INODE_SIZE);
+ ret = read_object(fd, buf, vid_to_vdi_oid(vid), 0, SD_INODE_SIZE, 0);
+
+ closesocket(fd);
+
+ if (ret) {
+ goto out;
+ }
+
+ memcpy(&s->inode, buf, sizeof(s->inode));
+ s->min_dirty_data_idx = UINT32_MAX;
+ s->max_dirty_data_idx = 0;
+
+ bs->total_sectors = s->inode.vdi_size / SECTOR_SIZE;
+ strncpy(s->name, vdi, sizeof(s->name));
+ qemu_free(buf);
+ return 0;
+out:
+ qemu_aio_set_fd_handler(s->fd, NULL, NULL, NULL, NULL, NULL);
+ if (s->fd >= 0) {
+ closesocket(s->fd);
+ }
+ qemu_free(buf);
+ return -1;
+}
+
+static int do_sd_create(char *filename, int64_t vdi_size,
+ uint32_t base_vid, uint32_t *vdi_id, int snapshot,
+ const char *addr, const char *port)
+{
+ SheepdogVdiReq hdr;
+ SheepdogVdiRsp *rsp = (SheepdogVdiRsp *)&hdr;
+ int fd, ret;
+ unsigned int wlen, rlen = 0;
+ char buf[SD_MAX_VDI_LEN];
+
+ fd = connect_to_sdog(addr, port);
+ if (fd < 0) {
+ return -EIO;
+ }
+
+ memset(buf, 0, sizeof(buf));
+ strncpy(buf, filename, SD_MAX_VDI_LEN);
+
+ memset(&hdr, 0, sizeof(hdr));
+ hdr.opcode = SD_OP_NEW_VDI;
+ hdr.base_vdi_id = base_vid;
+
+ wlen = SD_MAX_VDI_LEN;
+
+ hdr.flags = SD_FLAG_CMD_WRITE;
+ hdr.snapid = snapshot;
+
+ hdr.data_length = wlen;
+ hdr.vdi_size = vdi_size;
+
+ ret = do_req(fd, (SheepdogReq *)&hdr, buf, &wlen, &rlen);
+
+ closesocket(fd);
+
+ if (ret) {
+ return -EIO;
+ }
+
+ if (rsp->result != SD_RES_SUCCESS) {
+ error_report("%s, %s", sd_strerror(rsp->result), filename);
+ return -EIO;
+ }
+
+ if (vdi_id) {
+ *vdi_id = rsp->vdi_id;
+ }
+
+ return 0;
+}
+
+static int sd_prealloc(const char *filename)
+{
+ BlockDriverState *bs = NULL;
+ uint32_t idx, max_idx;
+ int64_t vdi_size;
+ void *buf = qemu_mallocz(SD_DATA_OBJ_SIZE);
+ int ret;
+
+ ret = bdrv_file_open(&bs, filename, BDRV_O_RDWR);
+ if (ret < 0) {
+ goto out;
+ }
+
+ vdi_size = bdrv_getlength(bs);
+ if (vdi_size < 0) {
+ ret = vdi_size;
+ goto out;
+ }
+ max_idx = DIV_ROUND_UP(vdi_size, SD_DATA_OBJ_SIZE);
+
+ for (idx = 0; idx < max_idx; idx++) {
+ /*
+ * The created image can be a cloned image, so we need to read
+ * a data from the source image.
+ */
+ ret = bdrv_pread(bs, idx * SD_DATA_OBJ_SIZE, buf, SD_DATA_OBJ_SIZE);
+ if (ret < 0) {
+ goto out;
+ }
+ ret = bdrv_pwrite(bs, idx * SD_DATA_OBJ_SIZE, buf, SD_DATA_OBJ_SIZE);
+ if (ret < 0) {
+ goto out;
+ }
+ }
+out:
+ if (bs) {
+ bdrv_delete(bs);
+ }
+ qemu_free(buf);
+
+ return ret;
+}
+
+static int sd_create(const char *filename, QEMUOptionParameter *options)
+{
+ int ret;
+ uint32_t vid = 0, base_vid = 0;
+ int64_t vdi_size = 0;
+ char *backing_file = NULL;
+ BDRVSheepdogState s;
+ char vdi[SD_MAX_VDI_LEN], tag[SD_MAX_VDI_TAG_LEN];
+ uint32_t snapid;
+ int prealloc = 0;
+ const char *vdiname;
+
+ strstart(filename, "sheepdog:", &vdiname);
+
+ memset(&s, 0, sizeof(s));
+ memset(vdi, 0, sizeof(vdi));
+ memset(tag, 0, sizeof(tag));
+ if (parse_vdiname(&s, vdiname, vdi, &snapid, tag) < 0) {
+ error_report("invalid filename");
+ return -EINVAL;
+ }
+
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ vdi_size = options->value.n;
+ } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
+ backing_file = options->value.s;
+ } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
+ if (!options->value.s || !strcmp(options->value.s, "off")) {
+ prealloc = 0;
+ } else if (!strcmp(options->value.s, "full")) {
+ prealloc = 1;
+ } else {
+ error_report("Invalid preallocation mode: '%s'",
+ options->value.s);
+ return -EINVAL;
+ }
+ }
+ options++;
+ }
+
+ if (vdi_size > SD_MAX_VDI_SIZE) {
+ error_report("too big image size");
+ return -EINVAL;
+ }
+
+ if (backing_file) {
+ BlockDriverState *bs;
+ BDRVSheepdogState *s;
+ BlockDriver *drv;
+
+ /* Currently, only Sheepdog backing image is supported. */
+ drv = bdrv_find_protocol(backing_file);
+ if (!drv || strcmp(drv->protocol_name, "sheepdog") != 0) {
+ error_report("backing_file must be a sheepdog image");
+ return -EINVAL;
+ }
+
+ ret = bdrv_file_open(&bs, backing_file, 0);
+ if (ret < 0)
+ return -EIO;
+
+ s = bs->opaque;
+
+ if (!is_snapshot(&s->inode)) {
+ error_report("cannot clone from a non snapshot vdi");
+ bdrv_delete(bs);
+ return -EINVAL;
+ }
+
+ base_vid = s->inode.vdi_id;
+ bdrv_delete(bs);
+ }
+
+ ret = do_sd_create(vdi, vdi_size, base_vid, &vid, 0, s.addr, s.port);
+ if (!prealloc || ret) {
+ return ret;
+ }
+
+ return sd_prealloc(filename);
+}
+
+static void sd_close(BlockDriverState *bs)
+{
+ BDRVSheepdogState *s = bs->opaque;
+ SheepdogVdiReq hdr;
+ SheepdogVdiRsp *rsp = (SheepdogVdiRsp *)&hdr;
+ unsigned int wlen, rlen = 0;
+ int fd, ret;
+
+ dprintf("%s\n", s->name);
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ return;
+ }
+
+ memset(&hdr, 0, sizeof(hdr));
+
+ hdr.opcode = SD_OP_RELEASE_VDI;
+ wlen = strlen(s->name) + 1;
+ hdr.data_length = wlen;
+ hdr.flags = SD_FLAG_CMD_WRITE;
+
+ ret = do_req(fd, (SheepdogReq *)&hdr, s->name, &wlen, &rlen);
+
+ closesocket(fd);
+
+ if (!ret && rsp->result != SD_RES_SUCCESS &&
+ rsp->result != SD_RES_VDI_NOT_LOCKED) {
+ error_report("%s, %s", sd_strerror(rsp->result), s->name);
+ }
+
+ qemu_aio_set_fd_handler(s->fd, NULL, NULL, NULL, NULL, NULL);
+ closesocket(s->fd);
+ qemu_free(s->addr);
+}
+
+static int64_t sd_getlength(BlockDriverState *bs)
+{
+ BDRVSheepdogState *s = bs->opaque;
+
+ return s->inode.vdi_size;
+}
+
+static int sd_truncate(BlockDriverState *bs, int64_t offset)
+{
+ BDRVSheepdogState *s = bs->opaque;
+ int ret, fd;
+ unsigned int datalen;
+
+ if (offset < s->inode.vdi_size) {
+ error_report("shrinking is not supported");
+ return -EINVAL;
+ } else if (offset > SD_MAX_VDI_SIZE) {
+ error_report("too big image size");
+ return -EINVAL;
+ }
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ return -EIO;
+ }
+
+ /* we don't need to update entire object */
+ datalen = SD_INODE_SIZE - sizeof(s->inode.data_vdi_id);
+ s->inode.vdi_size = offset;
+ ret = write_object(fd, (char *)&s->inode, vid_to_vdi_oid(s->inode.vdi_id),
+ s->inode.nr_copies, datalen, 0, 0);
+ close(fd);
+
+ if (ret < 0) {
+ error_report("failed to update an inode.");
+ return -EIO;
+ }
+
+ return 0;
+}
+
+/*
+ * This function is called after writing data objects. If we need to
+ * update metadata, this sends a write request to the vdi object.
+ * Otherwise, this calls the AIOCB callback.
+ */
+static void sd_write_done(SheepdogAIOCB *acb)
+{
+ int ret;
+ BDRVSheepdogState *s = acb->common.bs->opaque;
+ struct iovec iov;
+ AIOReq *aio_req;
+ uint32_t offset, data_len, mn, mx;
+
+ mn = s->min_dirty_data_idx;
+ mx = s->max_dirty_data_idx;
+ if (mn <= mx) {
+ /* we need to update the vdi object. */
+ offset = sizeof(s->inode) - sizeof(s->inode.data_vdi_id) +
+ mn * sizeof(s->inode.data_vdi_id[0]);
+ data_len = (mx - mn + 1) * sizeof(s->inode.data_vdi_id[0]);
+
+ s->min_dirty_data_idx = UINT32_MAX;
+ s->max_dirty_data_idx = 0;
+
+ iov.iov_base = &s->inode;
+ iov.iov_len = sizeof(s->inode);
+ aio_req = alloc_aio_req(s, acb, vid_to_vdi_oid(s->inode.vdi_id),
+ data_len, offset, 0, 0, offset);
+ ret = add_aio_request(s, aio_req, &iov, 1, 0, AIOCB_WRITE_UDATA);
+ if (ret) {
+ free_aio_req(s, aio_req);
+ acb->ret = -EIO;
+ goto out;
+ }
+
+ acb->aio_done_func = sd_finish_aiocb;
+ acb->aiocb_type = AIOCB_WRITE_UDATA;
+ return;
+ }
+out:
+ sd_finish_aiocb(acb);
+}
+
+/*
+ * Create a writable VDI from a snapshot
+ */
+static int sd_create_branch(BDRVSheepdogState *s)
+{
+ int ret, fd;
+ uint32_t vid;
+ char *buf;
+
+ dprintf("%" PRIx32 " is snapshot.\n", s->inode.vdi_id);
+
+ buf = qemu_malloc(SD_INODE_SIZE);
+
+ ret = do_sd_create(s->name, s->inode.vdi_size, s->inode.vdi_id, &vid, 1,
+ s->addr, s->port);
+ if (ret) {
+ goto out;
+ }
+
+ dprintf("%" PRIx32 " is created.\n", vid);
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ error_report("failed to connect");
+ goto out;
+ }
+
+ ret = read_object(fd, buf, vid_to_vdi_oid(vid), s->inode.nr_copies,
+ SD_INODE_SIZE, 0);
+
+ closesocket(fd);
+
+ if (ret < 0) {
+ goto out;
+ }
+
+ memcpy(&s->inode, buf, sizeof(s->inode));
+
+ s->is_snapshot = 0;
+ ret = 0;
+ dprintf("%" PRIx32 " was newly created.\n", s->inode.vdi_id);
+
+out:
+ qemu_free(buf);
+
+ return ret;
+}
+
+/*
+ * Send I/O requests to the server.
+ *
+ * This function sends requests to the server, links the requests to
+ * the outstanding_list in BDRVSheepdogState, and exits without
+ * waiting the response. The responses are received in the
+ * `aio_read_response' function which is called from the main loop as
+ * a fd handler.
+ */
+static void sd_readv_writev_bh_cb(void *p)
+{
+ SheepdogAIOCB *acb = p;
+ int ret = 0;
+ unsigned long len, done = 0, total = acb->nb_sectors * SECTOR_SIZE;
+ unsigned long idx = acb->sector_num * SECTOR_SIZE / SD_DATA_OBJ_SIZE;
+ uint64_t oid;
+ uint64_t offset = (acb->sector_num * SECTOR_SIZE) % SD_DATA_OBJ_SIZE;
+ BDRVSheepdogState *s = acb->common.bs->opaque;
+ SheepdogInode *inode = &s->inode;
+ AIOReq *aio_req;
+
+ qemu_bh_delete(acb->bh);
+ acb->bh = NULL;
+
+ if (acb->aiocb_type == AIOCB_WRITE_UDATA && s->is_snapshot) {
+ /*
+ * In the case we open the snapshot VDI, Sheepdog creates the
+ * writable VDI when we do a write operation first.
+ */
+ ret = sd_create_branch(s);
+ if (ret) {
+ acb->ret = -EIO;
+ goto out;
+ }
+ }
+
+ while (done != total) {
+ uint8_t flags = 0;
+ uint64_t old_oid = 0;
+ int create = 0;
+
+ oid = vid_to_data_oid(inode->data_vdi_id[idx], idx);
+
+ len = MIN(total - done, SD_DATA_OBJ_SIZE - offset);
+
+ if (!inode->data_vdi_id[idx]) {
+ if (acb->aiocb_type == AIOCB_READ_UDATA) {
+ goto done;
+ }
+
+ create = 1;
+ } else if (acb->aiocb_type == AIOCB_WRITE_UDATA
+ && !is_data_obj_writable(inode, idx)) {
+ /* Copy-On-Write */
+ create = 1;
+ old_oid = oid;
+ flags = SD_FLAG_CMD_COW;
+ }
+
+ if (create) {
+ dprintf("update ino (%" PRIu32") %" PRIu64 " %" PRIu64
+ " %" PRIu64 "\n", inode->vdi_id, oid,
+ vid_to_data_oid(inode->data_vdi_id[idx], idx), idx);
+ oid = vid_to_data_oid(inode->vdi_id, idx);
+ dprintf("new oid %lx\n", oid);
+ }
+
+ aio_req = alloc_aio_req(s, acb, oid, len, offset, flags, old_oid, done);
+
+ if (create) {
+ AIOReq *areq;
+ QLIST_FOREACH(areq, &s->outstanding_aio_head,
+ outstanding_aio_siblings) {
+ if (areq == aio_req) {
+ continue;
+ }
+ if (areq->oid == oid) {
+ /*
+ * Sheepdog cannot handle simultaneous create
+ * requests to the same object. So we cannot send
+ * the request until the previous request
+ * finishes.
+ */
+ aio_req->flags = 0;
+ aio_req->base_oid = 0;
+ goto done;
+ }
+ }
+ }
+
+ ret = add_aio_request(s, aio_req, acb->qiov->iov, acb->qiov->niov,
+ create, acb->aiocb_type);
+ if (ret < 0) {
+ error_report("add_aio_request is failed");
+ free_aio_req(s, aio_req);
+ acb->ret = -EIO;
+ goto out;
+ }
+ done:
+ offset = 0;
+ idx++;
+ done += len;
+ }
+out:
+ if (QLIST_EMPTY(&acb->aioreq_head)) {
+ sd_finish_aiocb(acb);
+ }
+}
+
+static BlockDriverAIOCB *sd_aio_writev(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ SheepdogAIOCB *acb;
+
+ if (bs->growable && sector_num + nb_sectors > bs->total_sectors) {
+ /* TODO: shouldn't block here */
+ if (sd_truncate(bs, (sector_num + nb_sectors) * SECTOR_SIZE) < 0) {
+ return NULL;
+ }
+ bs->total_sectors = sector_num + nb_sectors;
+ }
+
+ acb = sd_aio_setup(bs, qiov, sector_num, nb_sectors, cb, opaque);
+ acb->aio_done_func = sd_write_done;
+ acb->aiocb_type = AIOCB_WRITE_UDATA;
+
+ sd_schedule_bh(sd_readv_writev_bh_cb, acb);
+ return &acb->common;
+}
+
+static BlockDriverAIOCB *sd_aio_readv(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb,
+ void *opaque)
+{
+ SheepdogAIOCB *acb;
+ int i;
+
+ acb = sd_aio_setup(bs, qiov, sector_num, nb_sectors, cb, opaque);
+ acb->aiocb_type = AIOCB_READ_UDATA;
+ acb->aio_done_func = sd_finish_aiocb;
+
+ /*
+ * TODO: we can do better; we don't need to initialize
+ * blindly.
+ */
+ for (i = 0; i < qiov->niov; i++) {
+ memset(qiov->iov[i].iov_base, 0, qiov->iov[i].iov_len);
+ }
+
+ sd_schedule_bh(sd_readv_writev_bh_cb, acb);
+ return &acb->common;
+}
+
+static int sd_snapshot_create(BlockDriverState *bs, QEMUSnapshotInfo *sn_info)
+{
+ BDRVSheepdogState *s = bs->opaque;
+ int ret, fd;
+ uint32_t new_vid;
+ SheepdogInode *inode;
+ unsigned int datalen;
+
+ dprintf("sn_info: name %s id_str %s s: name %s vm_state_size %d "
+ "is_snapshot %d\n", sn_info->name, sn_info->id_str,
+ s->name, sn_info->vm_state_size, s->is_snapshot);
+
+ if (s->is_snapshot) {
+ error_report("You can't create a snapshot of a snapshot VDI, "
+ "%s (%" PRIu32 ").", s->name, s->inode.vdi_id);
+
+ return -EINVAL;
+ }
+
+ dprintf("%s %s\n", sn_info->name, sn_info->id_str);
+
+ s->inode.vm_state_size = sn_info->vm_state_size;
+ s->inode.vm_clock_nsec = sn_info->vm_clock_nsec;
+ strncpy(s->inode.tag, sn_info->name, sizeof(s->inode.tag));
+ /* we don't need to update entire object */
+ datalen = SD_INODE_SIZE - sizeof(s->inode.data_vdi_id);
+
+ /* refresh inode. */
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ ret = -EIO;
+ goto cleanup;
+ }
+
+ ret = write_object(fd, (char *)&s->inode, vid_to_vdi_oid(s->inode.vdi_id),
+ s->inode.nr_copies, datalen, 0, 0);
+ if (ret < 0) {
+ error_report("failed to write snapshot's inode.");
+ ret = -EIO;
+ goto cleanup;
+ }
+
+ ret = do_sd_create(s->name, s->inode.vdi_size, s->inode.vdi_id, &new_vid, 1,
+ s->addr, s->port);
+ if (ret < 0) {
+ error_report("failed to create inode for snapshot. %s",
+ strerror(errno));
+ ret = -EIO;
+ goto cleanup;
+ }
+
+ inode = (SheepdogInode *)qemu_malloc(datalen);
+
+ ret = read_object(fd, (char *)inode, vid_to_vdi_oid(new_vid),
+ s->inode.nr_copies, datalen, 0);
+
+ if (ret < 0) {
+ error_report("failed to read new inode info. %s", strerror(errno));
+ ret = -EIO;
+ goto cleanup;
+ }
+
+ memcpy(&s->inode, inode, datalen);
+ dprintf("s->inode: name %s snap_id %x oid %x\n",
+ s->inode.name, s->inode.snap_id, s->inode.vdi_id);
+
+cleanup:
+ closesocket(fd);
+ return ret;
+}
+
+static int sd_snapshot_goto(BlockDriverState *bs, const char *snapshot_id)
+{
+ BDRVSheepdogState *s = bs->opaque;
+ BDRVSheepdogState *old_s;
+ char vdi[SD_MAX_VDI_LEN], tag[SD_MAX_VDI_TAG_LEN];
+ char *buf = NULL;
+ uint32_t vid;
+ uint32_t snapid = 0;
+ int ret = -ENOENT, fd;
+
+ old_s = qemu_malloc(sizeof(BDRVSheepdogState));
+
+ memcpy(old_s, s, sizeof(BDRVSheepdogState));
+
+ memset(vdi, 0, sizeof(vdi));
+ strncpy(vdi, s->name, sizeof(vdi));
+
+ memset(tag, 0, sizeof(tag));
+ snapid = strtoul(snapshot_id, NULL, 10);
+ if (!snapid) {
+ strncpy(tag, s->name, sizeof(tag));
+ }
+
+ ret = find_vdi_name(s, vdi, snapid, tag, &vid, 1);
+ if (ret) {
+ error_report("Failed to find_vdi_name");
+ ret = -ENOENT;
+ goto out;
+ }
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ error_report("failed to connect");
+ goto out;
+ }
+
+ buf = qemu_malloc(SD_INODE_SIZE);
+ ret = read_object(fd, buf, vid_to_vdi_oid(vid), s->inode.nr_copies,
+ SD_INODE_SIZE, 0);
+
+ closesocket(fd);
+
+ if (ret) {
+ ret = -ENOENT;
+ goto out;
+ }
+
+ memcpy(&s->inode, buf, sizeof(s->inode));
+
+ if (!s->inode.vm_state_size) {
+ error_report("Invalid snapshot");
+ ret = -ENOENT;
+ goto out;
+ }
+
+ s->is_snapshot = 1;
+
+ qemu_free(buf);
+ qemu_free(old_s);
+
+ return 0;
+out:
+ /* recover bdrv_sd_state */
+ memcpy(s, old_s, sizeof(BDRVSheepdogState));
+ qemu_free(buf);
+ qemu_free(old_s);
+
+ error_report("failed to open. recover old bdrv_sd_state.");
+
+ return ret;
+}
+
+static int sd_snapshot_delete(BlockDriverState *bs, const char *snapshot_id)
+{
+ /* FIXME: Delete specified snapshot id. */
+ return 0;
+}
+
+static int sd_snapshot_list(BlockDriverState *bs, QEMUSnapshotInfo **psn_tab)
+{
+ BDRVSheepdogState *s = bs->opaque;
+ SheepdogReq req;
+ int fd, nr = 1024, ret, max = BITS_TO_LONGS(SD_NR_VDIS) * sizeof(long);
+ QEMUSnapshotInfo *sn_tab = NULL;
+ unsigned wlen, rlen;
+ int found = 0;
+ static SheepdogInode inode;
+ unsigned long *vdi_inuse;
+ unsigned int start_nr;
+ uint64_t hval;
+ uint32_t vid;
+
+ vdi_inuse = qemu_malloc(max);
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ goto out;
+ }
+
+ rlen = max;
+ wlen = 0;
+
+ memset(&req, 0, sizeof(req));
+
+ req.opcode = SD_OP_READ_VDIS;
+ req.data_length = max;
+
+ ret = do_req(fd, (SheepdogReq *)&req, vdi_inuse, &wlen, &rlen);
+
+ closesocket(fd);
+ if (ret) {
+ goto out;
+ }
+
+ sn_tab = qemu_mallocz(nr * sizeof(*sn_tab));
+
+ /* calculate a vdi id with hash function */
+ hval = fnv_64a_buf(s->name, strlen(s->name), FNV1A_64_INIT);
+ start_nr = hval & (SD_NR_VDIS - 1);
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ error_report("failed to connect");
+ goto out;
+ }
+
+ for (vid = start_nr; found < nr; vid = (vid + 1) % SD_NR_VDIS) {
+ if (!test_bit(vid, vdi_inuse)) {
+ break;
+ }
+
+ /* we don't need to read entire object */
+ ret = read_object(fd, (char *)&inode, vid_to_vdi_oid(vid),
+ 0, SD_INODE_SIZE - sizeof(inode.data_vdi_id), 0);
+
+ if (ret) {
+ continue;
+ }
+
+ if (!strcmp(inode.name, s->name) && is_snapshot(&inode)) {
+ sn_tab[found].date_sec = inode.snap_ctime >> 32;
+ sn_tab[found].date_nsec = inode.snap_ctime & 0xffffffff;
+ sn_tab[found].vm_state_size = inode.vm_state_size;
+ sn_tab[found].vm_clock_nsec = inode.vm_clock_nsec;
+
+ snprintf(sn_tab[found].id_str, sizeof(sn_tab[found].id_str), "%u",
+ inode.snap_id);
+ strncpy(sn_tab[found].name, inode.tag,
+ MIN(sizeof(sn_tab[found].name), sizeof(inode.tag)));
+ found++;
+ }
+ }
+
+ closesocket(fd);
+out:
+ *psn_tab = sn_tab;
+
+ qemu_free(vdi_inuse);
+
+ return found;
+}
+
+static int do_load_save_vmstate(BDRVSheepdogState *s, uint8_t *data,
+ int64_t pos, int size, int load)
+{
+ int fd, create;
+ int ret = 0;
+ unsigned int data_len;
+ uint64_t vmstate_oid;
+ uint32_t vdi_index;
+ uint64_t offset;
+
+ fd = connect_to_sdog(s->addr, s->port);
+ if (fd < 0) {
+ ret = -EIO;
+ goto cleanup;
+ }
+
+ while (size) {
+ vdi_index = pos / SD_DATA_OBJ_SIZE;
+ offset = pos % SD_DATA_OBJ_SIZE;
+
+ data_len = MIN(size, SD_DATA_OBJ_SIZE);
+
+ vmstate_oid = vid_to_vmstate_oid(s->inode.vdi_id, vdi_index);
+
+ create = (offset == 0);
+ if (load) {
+ ret = read_object(fd, (char *)data, vmstate_oid,
+ s->inode.nr_copies, data_len, offset);
+ } else {
+ ret = write_object(fd, (char *)data, vmstate_oid,
+ s->inode.nr_copies, data_len, offset, create);
+ }
+
+ if (ret < 0) {
+ error_report("failed to save vmstate %s", strerror(errno));
+ ret = -EIO;
+ goto cleanup;
+ }
+
+ pos += data_len;
+ size -= data_len;
+ ret += data_len;
+ }
+cleanup:
+ closesocket(fd);
+ return ret;
+}
+
+static int sd_save_vmstate(BlockDriverState *bs, const uint8_t *data,
+ int64_t pos, int size)
+{
+ BDRVSheepdogState *s = bs->opaque;
+
+ return do_load_save_vmstate(s, (uint8_t *)data, pos, size, 0);
+}
+
+static int sd_load_vmstate(BlockDriverState *bs, uint8_t *data,
+ int64_t pos, int size)
+{
+ BDRVSheepdogState *s = bs->opaque;
+
+ return do_load_save_vmstate(s, data, pos, size, 1);
+}
+
+
+static QEMUOptionParameter sd_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ {
+ .name = BLOCK_OPT_BACKING_FILE,
+ .type = OPT_STRING,
+ .help = "File name of a base image"
+ },
+ {
+ .name = BLOCK_OPT_PREALLOC,
+ .type = OPT_STRING,
+ .help = "Preallocation mode (allowed values: off, full)"
+ },
+ { NULL }
+};
+
+BlockDriver bdrv_sheepdog = {
+ .format_name = "sheepdog",
+ .protocol_name = "sheepdog",
+ .instance_size = sizeof(BDRVSheepdogState),
+ .bdrv_file_open = sd_open,
+ .bdrv_close = sd_close,
+ .bdrv_create = sd_create,
+ .bdrv_getlength = sd_getlength,
+ .bdrv_truncate = sd_truncate,
+
+ .bdrv_aio_readv = sd_aio_readv,
+ .bdrv_aio_writev = sd_aio_writev,
+
+ .bdrv_snapshot_create = sd_snapshot_create,
+ .bdrv_snapshot_goto = sd_snapshot_goto,
+ .bdrv_snapshot_delete = sd_snapshot_delete,
+ .bdrv_snapshot_list = sd_snapshot_list,
+
+ .bdrv_save_vmstate = sd_save_vmstate,
+ .bdrv_load_vmstate = sd_load_vmstate,
+
+ .create_options = sd_create_options,
+};
+
+static void bdrv_sheepdog_init(void)
+{
+ bdrv_register(&bdrv_sheepdog);
+}
+block_init(bdrv_sheepdog_init);
diff --git a/qemu-0.15.x/block/vdi.c b/qemu-0.15.x/block/vdi.c
new file mode 100644
index 0000000..261cf9b
--- /dev/null
+++ b/qemu-0.15.x/block/vdi.c
@@ -0,0 +1,999 @@
+/*
+ * Block driver for the Virtual Disk Image (VDI) format
+ *
+ * Copyright (c) 2009 Stefan Weil
+ *
+ * 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) version 3 or 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 <http://www.gnu.org/licenses/>.
+ *
+ * Reference:
+ * http://forums.virtualbox.org/viewtopic.php?t=8046
+ *
+ * This driver supports create / read / write operations on VDI images.
+ *
+ * Todo (see also TODO in code):
+ *
+ * Some features like snapshots are still missing.
+ *
+ * Deallocation of zero-filled blocks and shrinking images are missing, too
+ * (might be added to common block layer).
+ *
+ * Allocation of blocks could be optimized (less writes to block map and
+ * header).
+ *
+ * Read and write of adjacents blocks could be done in one operation
+ * (current code uses one operation per block (1 MiB).
+ *
+ * The code is not thread safe (missing locks for changes in header and
+ * block table, no problem with current QEMU).
+ *
+ * Hints:
+ *
+ * Blocks (VDI documentation) correspond to clusters (QEMU).
+ * QEMU's backing files could be implemented using VDI snapshot files (TODO).
+ * VDI snapshot files may also contain the complete machine state.
+ * Maybe this machine state can be converted to QEMU PC machine snapshot data.
+ *
+ * The driver keeps a block cache (little endian entries) in memory.
+ * For the standard block size (1 MiB), a 1 TiB disk will use 4 MiB RAM,
+ * so this seems to be reasonable.
+ */
+
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+
+#if defined(CONFIG_UUID)
+#include <uuid/uuid.h>
+#else
+/* TODO: move uuid emulation to some central place in QEMU. */
+#include "sysemu.h" /* UUID_FMT */
+typedef unsigned char uuid_t[16];
+void uuid_generate(uuid_t out);
+int uuid_is_null(const uuid_t uu);
+void uuid_unparse(const uuid_t uu, char *out);
+#endif
+
+/* Code configuration options. */
+
+/* Enable debug messages. */
+//~ #define CONFIG_VDI_DEBUG
+
+/* Support write operations on VDI images. */
+#define CONFIG_VDI_WRITE
+
+/* Support non-standard block (cluster) size. This is untested.
+ * Maybe it will be needed for very large images.
+ */
+//~ #define CONFIG_VDI_BLOCK_SIZE
+
+/* Support static (fixed, pre-allocated) images. */
+#define CONFIG_VDI_STATIC_IMAGE
+
+/* Command line option for static images. */
+#define BLOCK_OPT_STATIC "static"
+
+#define KiB 1024
+#define MiB (KiB * KiB)
+
+#define SECTOR_SIZE 512
+#define DEFAULT_CLUSTER_SIZE (1 * MiB)
+
+#if defined(CONFIG_VDI_DEBUG)
+#define logout(fmt, ...) \
+ fprintf(stderr, "vdi\t%-24s" fmt, __func__, ##__VA_ARGS__)
+#else
+#define logout(fmt, ...) ((void)0)
+#endif
+
+/* Image signature. */
+#define VDI_SIGNATURE 0xbeda107f
+
+/* Image version. */
+#define VDI_VERSION_1_1 0x00010001
+
+/* Image type. */
+#define VDI_TYPE_DYNAMIC 1
+#define VDI_TYPE_STATIC 2
+
+/* Innotek / SUN images use these strings in header.text:
+ * "<<< innotek VirtualBox Disk Image >>>\n"
+ * "<<< Sun xVM VirtualBox Disk Image >>>\n"
+ * "<<< Sun VirtualBox Disk Image >>>\n"
+ * The value does not matter, so QEMU created images use a different text.
+ */
+#define VDI_TEXT "<<< QEMU VM Virtual Disk Image >>>\n"
+
+/* Unallocated blocks use this index (no need to convert endianness). */
+#define VDI_UNALLOCATED UINT32_MAX
+
+#if !defined(CONFIG_UUID)
+void uuid_generate(uuid_t out)
+{
+ memset(out, 0, sizeof(uuid_t));
+}
+
+int uuid_is_null(const uuid_t uu)
+{
+ uuid_t null_uuid = { 0 };
+ return memcmp(uu, null_uuid, sizeof(uuid_t)) == 0;
+}
+
+void uuid_unparse(const uuid_t uu, char *out)
+{
+ snprintf(out, 37, UUID_FMT,
+ uu[0], uu[1], uu[2], uu[3], uu[4], uu[5], uu[6], uu[7],
+ uu[8], uu[9], uu[10], uu[11], uu[12], uu[13], uu[14], uu[15]);
+}
+#endif
+
+typedef struct {
+ BlockDriverAIOCB common;
+ int64_t sector_num;
+ QEMUIOVector *qiov;
+ uint8_t *buf;
+ /* Total number of sectors. */
+ int nb_sectors;
+ /* Number of sectors for current AIO. */
+ int n_sectors;
+ /* New allocated block map entry. */
+ uint32_t bmap_first;
+ uint32_t bmap_last;
+ /* Buffer for new allocated block. */
+ void *block_buffer;
+ void *orig_buf;
+ bool is_write;
+ int header_modified;
+ BlockDriverAIOCB *hd_aiocb;
+ struct iovec hd_iov;
+ QEMUIOVector hd_qiov;
+ QEMUBH *bh;
+} VdiAIOCB;
+
+typedef struct {
+ char text[0x40];
+ uint32_t signature;
+ uint32_t version;
+ uint32_t header_size;
+ uint32_t image_type;
+ uint32_t image_flags;
+ char description[256];
+ uint32_t offset_bmap;
+ uint32_t offset_data;
+ uint32_t cylinders; /* disk geometry, unused here */
+ uint32_t heads; /* disk geometry, unused here */
+ uint32_t sectors; /* disk geometry, unused here */
+ uint32_t sector_size;
+ uint32_t unused1;
+ uint64_t disk_size;
+ uint32_t block_size;
+ uint32_t block_extra; /* unused here */
+ uint32_t blocks_in_image;
+ uint32_t blocks_allocated;
+ uuid_t uuid_image;
+ uuid_t uuid_last_snap;
+ uuid_t uuid_link;
+ uuid_t uuid_parent;
+ uint64_t unused2[7];
+} VdiHeader;
+
+typedef struct {
+ /* The block map entries are little endian (even in memory). */
+ uint32_t *bmap;
+ /* Size of block (bytes). */
+ uint32_t block_size;
+ /* Size of block (sectors). */
+ uint32_t block_sectors;
+ /* First sector of block map. */
+ uint32_t bmap_sector;
+ /* VDI header (converted to host endianness). */
+ VdiHeader header;
+} BDRVVdiState;
+
+/* Change UUID from little endian (IPRT = VirtualBox format) to big endian
+ * format (network byte order, standard, see RFC 4122) and vice versa.
+ */
+static void uuid_convert(uuid_t uuid)
+{
+ bswap32s((uint32_t *)&uuid[0]);
+ bswap16s((uint16_t *)&uuid[4]);
+ bswap16s((uint16_t *)&uuid[6]);
+}
+
+static void vdi_header_to_cpu(VdiHeader *header)
+{
+ le32_to_cpus(&header->signature);
+ le32_to_cpus(&header->version);
+ le32_to_cpus(&header->header_size);
+ le32_to_cpus(&header->image_type);
+ le32_to_cpus(&header->image_flags);
+ le32_to_cpus(&header->offset_bmap);
+ le32_to_cpus(&header->offset_data);
+ le32_to_cpus(&header->cylinders);
+ le32_to_cpus(&header->heads);
+ le32_to_cpus(&header->sectors);
+ le32_to_cpus(&header->sector_size);
+ le64_to_cpus(&header->disk_size);
+ le32_to_cpus(&header->block_size);
+ le32_to_cpus(&header->block_extra);
+ le32_to_cpus(&header->blocks_in_image);
+ le32_to_cpus(&header->blocks_allocated);
+ uuid_convert(header->uuid_image);
+ uuid_convert(header->uuid_last_snap);
+ uuid_convert(header->uuid_link);
+ uuid_convert(header->uuid_parent);
+}
+
+static void vdi_header_to_le(VdiHeader *header)
+{
+ cpu_to_le32s(&header->signature);
+ cpu_to_le32s(&header->version);
+ cpu_to_le32s(&header->header_size);
+ cpu_to_le32s(&header->image_type);
+ cpu_to_le32s(&header->image_flags);
+ cpu_to_le32s(&header->offset_bmap);
+ cpu_to_le32s(&header->offset_data);
+ cpu_to_le32s(&header->cylinders);
+ cpu_to_le32s(&header->heads);
+ cpu_to_le32s(&header->sectors);
+ cpu_to_le32s(&header->sector_size);
+ cpu_to_le64s(&header->disk_size);
+ cpu_to_le32s(&header->block_size);
+ cpu_to_le32s(&header->block_extra);
+ cpu_to_le32s(&header->blocks_in_image);
+ cpu_to_le32s(&header->blocks_allocated);
+ cpu_to_le32s(&header->blocks_allocated);
+ uuid_convert(header->uuid_image);
+ uuid_convert(header->uuid_last_snap);
+ uuid_convert(header->uuid_link);
+ uuid_convert(header->uuid_parent);
+}
+
+#if defined(CONFIG_VDI_DEBUG)
+static void vdi_header_print(VdiHeader *header)
+{
+ char uuid[37];
+ logout("text %s", header->text);
+ logout("signature 0x%04x\n", header->signature);
+ logout("header size 0x%04x\n", header->header_size);
+ logout("image type 0x%04x\n", header->image_type);
+ logout("image flags 0x%04x\n", header->image_flags);
+ logout("description %s\n", header->description);
+ logout("offset bmap 0x%04x\n", header->offset_bmap);
+ logout("offset data 0x%04x\n", header->offset_data);
+ logout("cylinders 0x%04x\n", header->cylinders);
+ logout("heads 0x%04x\n", header->heads);
+ logout("sectors 0x%04x\n", header->sectors);
+ logout("sector size 0x%04x\n", header->sector_size);
+ logout("image size 0x%" PRIx64 " B (%" PRIu64 " MiB)\n",
+ header->disk_size, header->disk_size / MiB);
+ logout("block size 0x%04x\n", header->block_size);
+ logout("block extra 0x%04x\n", header->block_extra);
+ logout("blocks tot. 0x%04x\n", header->blocks_in_image);
+ logout("blocks all. 0x%04x\n", header->blocks_allocated);
+ uuid_unparse(header->uuid_image, uuid);
+ logout("uuid image %s\n", uuid);
+ uuid_unparse(header->uuid_last_snap, uuid);
+ logout("uuid snap %s\n", uuid);
+ uuid_unparse(header->uuid_link, uuid);
+ logout("uuid link %s\n", uuid);
+ uuid_unparse(header->uuid_parent, uuid);
+ logout("uuid parent %s\n", uuid);
+}
+#endif
+
+static int vdi_check(BlockDriverState *bs, BdrvCheckResult *res)
+{
+ /* TODO: additional checks possible. */
+ BDRVVdiState *s = (BDRVVdiState *)bs->opaque;
+ uint32_t blocks_allocated = 0;
+ uint32_t block;
+ uint32_t *bmap;
+ logout("\n");
+
+ bmap = qemu_malloc(s->header.blocks_in_image * sizeof(uint32_t));
+ memset(bmap, 0xff, s->header.blocks_in_image * sizeof(uint32_t));
+
+ /* Check block map and value of blocks_allocated. */
+ for (block = 0; block < s->header.blocks_in_image; block++) {
+ uint32_t bmap_entry = le32_to_cpu(s->bmap[block]);
+ if (bmap_entry != VDI_UNALLOCATED) {
+ if (bmap_entry < s->header.blocks_in_image) {
+ blocks_allocated++;
+ if (bmap[bmap_entry] == VDI_UNALLOCATED) {
+ bmap[bmap_entry] = bmap_entry;
+ } else {
+ fprintf(stderr, "ERROR: block index %" PRIu32
+ " also used by %" PRIu32 "\n", bmap[bmap_entry], bmap_entry);
+ res->corruptions++;
+ }
+ } else {
+ fprintf(stderr, "ERROR: block index %" PRIu32
+ " too large, is %" PRIu32 "\n", block, bmap_entry);
+ res->corruptions++;
+ }
+ }
+ }
+ if (blocks_allocated != s->header.blocks_allocated) {
+ fprintf(stderr, "ERROR: allocated blocks mismatch, is %" PRIu32
+ ", should be %" PRIu32 "\n",
+ blocks_allocated, s->header.blocks_allocated);
+ res->corruptions++;
+ }
+
+ qemu_free(bmap);
+
+ return 0;
+}
+
+static int vdi_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
+{
+ /* TODO: vdi_get_info would be needed for machine snapshots.
+ vm_state_offset is still missing. */
+ BDRVVdiState *s = (BDRVVdiState *)bs->opaque;
+ logout("\n");
+ bdi->cluster_size = s->block_size;
+ bdi->vm_state_offset = 0;
+ return 0;
+}
+
+static int vdi_make_empty(BlockDriverState *bs)
+{
+ /* TODO: missing code. */
+ logout("\n");
+ /* The return value for missing code must be 0, see block.c. */
+ return 0;
+}
+
+static int vdi_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ const VdiHeader *header = (const VdiHeader *)buf;
+ int result = 0;
+
+ logout("\n");
+
+ if (buf_size < sizeof(*header)) {
+ /* Header too small, no VDI. */
+ } else if (le32_to_cpu(header->signature) == VDI_SIGNATURE) {
+ result = 100;
+ }
+
+ if (result == 0) {
+ logout("no vdi image\n");
+ } else {
+ logout("%s", header->text);
+ }
+
+ return result;
+}
+
+static int vdi_open(BlockDriverState *bs, int flags)
+{
+ BDRVVdiState *s = bs->opaque;
+ VdiHeader header;
+ size_t bmap_size;
+
+ logout("\n");
+
+ if (bdrv_read(bs->file, 0, (uint8_t *)&header, 1) < 0) {
+ goto fail;
+ }
+
+ vdi_header_to_cpu(&header);
+#if defined(CONFIG_VDI_DEBUG)
+ vdi_header_print(&header);
+#endif
+
+ if (header.disk_size % SECTOR_SIZE != 0) {
+ /* 'VBoxManage convertfromraw' can create images with odd disk sizes.
+ We accept them but round the disk size to the next multiple of
+ SECTOR_SIZE. */
+ logout("odd disk size %" PRIu64 " B, round up\n", header.disk_size);
+ header.disk_size += SECTOR_SIZE - 1;
+ header.disk_size &= ~(SECTOR_SIZE - 1);
+ }
+
+ if (header.version != VDI_VERSION_1_1) {
+ logout("unsupported version %u.%u\n",
+ header.version >> 16, header.version & 0xffff);
+ goto fail;
+ } else if (header.offset_bmap % SECTOR_SIZE != 0) {
+ /* We only support block maps which start on a sector boundary. */
+ logout("unsupported block map offset 0x%x B\n", header.offset_bmap);
+ goto fail;
+ } else if (header.offset_data % SECTOR_SIZE != 0) {
+ /* We only support data blocks which start on a sector boundary. */
+ logout("unsupported data offset 0x%x B\n", header.offset_data);
+ goto fail;
+ } else if (header.sector_size != SECTOR_SIZE) {
+ logout("unsupported sector size %u B\n", header.sector_size);
+ goto fail;
+ } else if (header.block_size != 1 * MiB) {
+ logout("unsupported block size %u B\n", header.block_size);
+ goto fail;
+ } else if (header.disk_size >
+ (uint64_t)header.blocks_in_image * header.block_size) {
+ logout("unsupported disk size %" PRIu64 " B\n", header.disk_size);
+ goto fail;
+ } else if (!uuid_is_null(header.uuid_link)) {
+ logout("link uuid != 0, unsupported\n");
+ goto fail;
+ } else if (!uuid_is_null(header.uuid_parent)) {
+ logout("parent uuid != 0, unsupported\n");
+ goto fail;
+ }
+
+ bs->total_sectors = header.disk_size / SECTOR_SIZE;
+
+ s->block_size = header.block_size;
+ s->block_sectors = header.block_size / SECTOR_SIZE;
+ s->bmap_sector = header.offset_bmap / SECTOR_SIZE;
+ s->header = header;
+
+ bmap_size = header.blocks_in_image * sizeof(uint32_t);
+ bmap_size = (bmap_size + SECTOR_SIZE - 1) / SECTOR_SIZE;
+ if (bmap_size > 0) {
+ s->bmap = qemu_malloc(bmap_size * SECTOR_SIZE);
+ }
+ if (bdrv_read(bs->file, s->bmap_sector, (uint8_t *)s->bmap, bmap_size) < 0) {
+ goto fail_free_bmap;
+ }
+
+ return 0;
+
+ fail_free_bmap:
+ qemu_free(s->bmap);
+
+ fail:
+ return -1;
+}
+
+static int vdi_is_allocated(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors, int *pnum)
+{
+ /* TODO: Check for too large sector_num (in bdrv_is_allocated or here). */
+ BDRVVdiState *s = (BDRVVdiState *)bs->opaque;
+ size_t bmap_index = sector_num / s->block_sectors;
+ size_t sector_in_block = sector_num % s->block_sectors;
+ int n_sectors = s->block_sectors - sector_in_block;
+ uint32_t bmap_entry = le32_to_cpu(s->bmap[bmap_index]);
+ logout("%p, %" PRId64 ", %d, %p\n", bs, sector_num, nb_sectors, pnum);
+ if (n_sectors > nb_sectors) {
+ n_sectors = nb_sectors;
+ }
+ *pnum = n_sectors;
+ return bmap_entry != VDI_UNALLOCATED;
+}
+
+static void vdi_aio_cancel(BlockDriverAIOCB *blockacb)
+{
+ /* TODO: This code is untested. How can I get it executed? */
+ VdiAIOCB *acb = container_of(blockacb, VdiAIOCB, common);
+ logout("\n");
+ if (acb->hd_aiocb) {
+ bdrv_aio_cancel(acb->hd_aiocb);
+ }
+ qemu_aio_release(acb);
+}
+
+static AIOPool vdi_aio_pool = {
+ .aiocb_size = sizeof(VdiAIOCB),
+ .cancel = vdi_aio_cancel,
+};
+
+static VdiAIOCB *vdi_aio_setup(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque, int is_write)
+{
+ VdiAIOCB *acb;
+
+ logout("%p, %" PRId64 ", %p, %d, %p, %p, %d\n",
+ bs, sector_num, qiov, nb_sectors, cb, opaque, is_write);
+
+ acb = qemu_aio_get(&vdi_aio_pool, bs, cb, opaque);
+ if (acb) {
+ acb->hd_aiocb = NULL;
+ acb->sector_num = sector_num;
+ acb->qiov = qiov;
+ acb->is_write = is_write;
+
+ if (qiov->niov > 1) {
+ acb->buf = qemu_blockalign(bs, qiov->size);
+ acb->orig_buf = acb->buf;
+ if (is_write) {
+ qemu_iovec_to_buffer(qiov, acb->buf);
+ }
+ } else {
+ acb->buf = (uint8_t *)qiov->iov->iov_base;
+ }
+ acb->nb_sectors = nb_sectors;
+ acb->n_sectors = 0;
+ acb->bmap_first = VDI_UNALLOCATED;
+ acb->bmap_last = VDI_UNALLOCATED;
+ acb->block_buffer = NULL;
+ acb->header_modified = 0;
+ }
+ return acb;
+}
+
+static int vdi_schedule_bh(QEMUBHFunc *cb, VdiAIOCB *acb)
+{
+ logout("\n");
+
+ if (acb->bh) {
+ return -EIO;
+ }
+
+ acb->bh = qemu_bh_new(cb, acb);
+ if (!acb->bh) {
+ return -EIO;
+ }
+
+ qemu_bh_schedule(acb->bh);
+
+ return 0;
+}
+
+static void vdi_aio_read_cb(void *opaque, int ret);
+static void vdi_aio_write_cb(void *opaque, int ret);
+
+static void vdi_aio_rw_bh(void *opaque)
+{
+ VdiAIOCB *acb = opaque;
+ logout("\n");
+ qemu_bh_delete(acb->bh);
+ acb->bh = NULL;
+
+ if (acb->is_write) {
+ vdi_aio_write_cb(opaque, 0);
+ } else {
+ vdi_aio_read_cb(opaque, 0);
+ }
+}
+
+static void vdi_aio_read_cb(void *opaque, int ret)
+{
+ VdiAIOCB *acb = opaque;
+ BlockDriverState *bs = acb->common.bs;
+ BDRVVdiState *s = bs->opaque;
+ uint32_t bmap_entry;
+ uint32_t block_index;
+ uint32_t sector_in_block;
+ uint32_t n_sectors;
+
+ logout("%u sectors read\n", acb->n_sectors);
+
+ acb->hd_aiocb = NULL;
+
+ if (ret < 0) {
+ goto done;
+ }
+
+ acb->nb_sectors -= acb->n_sectors;
+
+ if (acb->nb_sectors == 0) {
+ /* request completed */
+ ret = 0;
+ goto done;
+ }
+
+ acb->sector_num += acb->n_sectors;
+ acb->buf += acb->n_sectors * SECTOR_SIZE;
+
+ block_index = acb->sector_num / s->block_sectors;
+ sector_in_block = acb->sector_num % s->block_sectors;
+ n_sectors = s->block_sectors - sector_in_block;
+ if (n_sectors > acb->nb_sectors) {
+ n_sectors = acb->nb_sectors;
+ }
+
+ logout("will read %u sectors starting at sector %" PRIu64 "\n",
+ n_sectors, acb->sector_num);
+
+ /* prepare next AIO request */
+ acb->n_sectors = n_sectors;
+ bmap_entry = le32_to_cpu(s->bmap[block_index]);
+ if (bmap_entry == VDI_UNALLOCATED) {
+ /* Block not allocated, return zeros, no need to wait. */
+ memset(acb->buf, 0, n_sectors * SECTOR_SIZE);
+ ret = vdi_schedule_bh(vdi_aio_rw_bh, acb);
+ if (ret < 0) {
+ goto done;
+ }
+ } else {
+ uint64_t offset = s->header.offset_data / SECTOR_SIZE +
+ (uint64_t)bmap_entry * s->block_sectors +
+ sector_in_block;
+ acb->hd_iov.iov_base = (void *)acb->buf;
+ acb->hd_iov.iov_len = n_sectors * SECTOR_SIZE;
+ qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
+ acb->hd_aiocb = bdrv_aio_readv(bs->file, offset, &acb->hd_qiov,
+ n_sectors, vdi_aio_read_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ }
+ return;
+done:
+ if (acb->qiov->niov > 1) {
+ qemu_iovec_from_buffer(acb->qiov, acb->orig_buf, acb->qiov->size);
+ qemu_vfree(acb->orig_buf);
+ }
+ acb->common.cb(acb->common.opaque, ret);
+ qemu_aio_release(acb);
+}
+
+static BlockDriverAIOCB *vdi_aio_readv(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ VdiAIOCB *acb;
+ int ret;
+
+ logout("\n");
+ acb = vdi_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 0);
+ if (!acb) {
+ return NULL;
+ }
+
+ ret = vdi_schedule_bh(vdi_aio_rw_bh, acb);
+ if (ret < 0) {
+ if (acb->qiov->niov > 1) {
+ qemu_vfree(acb->orig_buf);
+ }
+ qemu_aio_release(acb);
+ return NULL;
+ }
+
+ return &acb->common;
+}
+
+static void vdi_aio_write_cb(void *opaque, int ret)
+{
+ VdiAIOCB *acb = opaque;
+ BlockDriverState *bs = acb->common.bs;
+ BDRVVdiState *s = bs->opaque;
+ uint32_t bmap_entry;
+ uint32_t block_index;
+ uint32_t sector_in_block;
+ uint32_t n_sectors;
+
+ acb->hd_aiocb = NULL;
+
+ if (ret < 0) {
+ goto done;
+ }
+
+ acb->nb_sectors -= acb->n_sectors;
+ acb->sector_num += acb->n_sectors;
+ acb->buf += acb->n_sectors * SECTOR_SIZE;
+
+ if (acb->nb_sectors == 0) {
+ logout("finished data write\n");
+ acb->n_sectors = 0;
+ if (acb->header_modified) {
+ VdiHeader *header = acb->block_buffer;
+ logout("now writing modified header\n");
+ assert(acb->bmap_first != VDI_UNALLOCATED);
+ *header = s->header;
+ vdi_header_to_le(header);
+ acb->header_modified = 0;
+ acb->hd_iov.iov_base = acb->block_buffer;
+ acb->hd_iov.iov_len = SECTOR_SIZE;
+ qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
+ acb->hd_aiocb = bdrv_aio_writev(bs->file, 0, &acb->hd_qiov, 1,
+ vdi_aio_write_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ return;
+ } else if (acb->bmap_first != VDI_UNALLOCATED) {
+ /* One or more new blocks were allocated. */
+ uint64_t offset;
+ uint32_t bmap_first;
+ uint32_t bmap_last;
+ qemu_free(acb->block_buffer);
+ acb->block_buffer = NULL;
+ bmap_first = acb->bmap_first;
+ bmap_last = acb->bmap_last;
+ logout("now writing modified block map entry %u...%u\n",
+ bmap_first, bmap_last);
+ /* Write modified sectors from block map. */
+ bmap_first /= (SECTOR_SIZE / sizeof(uint32_t));
+ bmap_last /= (SECTOR_SIZE / sizeof(uint32_t));
+ n_sectors = bmap_last - bmap_first + 1;
+ offset = s->bmap_sector + bmap_first;
+ acb->bmap_first = VDI_UNALLOCATED;
+ acb->hd_iov.iov_base = (void *)((uint8_t *)&s->bmap[0] +
+ bmap_first * SECTOR_SIZE);
+ acb->hd_iov.iov_len = n_sectors * SECTOR_SIZE;
+ qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
+ logout("will write %u block map sectors starting from entry %u\n",
+ n_sectors, bmap_first);
+ acb->hd_aiocb = bdrv_aio_writev(bs->file, offset, &acb->hd_qiov,
+ n_sectors, vdi_aio_write_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ return;
+ }
+ ret = 0;
+ goto done;
+ }
+
+ logout("%u sectors written\n", acb->n_sectors);
+
+ block_index = acb->sector_num / s->block_sectors;
+ sector_in_block = acb->sector_num % s->block_sectors;
+ n_sectors = s->block_sectors - sector_in_block;
+ if (n_sectors > acb->nb_sectors) {
+ n_sectors = acb->nb_sectors;
+ }
+
+ logout("will write %u sectors starting at sector %" PRIu64 "\n",
+ n_sectors, acb->sector_num);
+
+ /* prepare next AIO request */
+ acb->n_sectors = n_sectors;
+ bmap_entry = le32_to_cpu(s->bmap[block_index]);
+ if (bmap_entry == VDI_UNALLOCATED) {
+ /* Allocate new block and write to it. */
+ uint64_t offset;
+ uint8_t *block;
+ bmap_entry = s->header.blocks_allocated;
+ s->bmap[block_index] = cpu_to_le32(bmap_entry);
+ s->header.blocks_allocated++;
+ offset = s->header.offset_data / SECTOR_SIZE +
+ (uint64_t)bmap_entry * s->block_sectors;
+ block = acb->block_buffer;
+ if (block == NULL) {
+ block = qemu_mallocz(s->block_size);
+ acb->block_buffer = block;
+ acb->bmap_first = block_index;
+ assert(!acb->header_modified);
+ acb->header_modified = 1;
+ }
+ acb->bmap_last = block_index;
+ memcpy(block + sector_in_block * SECTOR_SIZE,
+ acb->buf, n_sectors * SECTOR_SIZE);
+ acb->hd_iov.iov_base = (void *)block;
+ acb->hd_iov.iov_len = s->block_size;
+ qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
+ acb->hd_aiocb = bdrv_aio_writev(bs->file, offset,
+ &acb->hd_qiov, s->block_sectors,
+ vdi_aio_write_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ } else {
+ uint64_t offset = s->header.offset_data / SECTOR_SIZE +
+ (uint64_t)bmap_entry * s->block_sectors +
+ sector_in_block;
+ acb->hd_iov.iov_base = (void *)acb->buf;
+ acb->hd_iov.iov_len = n_sectors * SECTOR_SIZE;
+ qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1);
+ acb->hd_aiocb = bdrv_aio_writev(bs->file, offset, &acb->hd_qiov,
+ n_sectors, vdi_aio_write_cb, acb);
+ if (acb->hd_aiocb == NULL) {
+ ret = -EIO;
+ goto done;
+ }
+ }
+
+ return;
+
+done:
+ if (acb->qiov->niov > 1) {
+ qemu_vfree(acb->orig_buf);
+ }
+ acb->common.cb(acb->common.opaque, ret);
+ qemu_aio_release(acb);
+}
+
+static BlockDriverAIOCB *vdi_aio_writev(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ VdiAIOCB *acb;
+ int ret;
+
+ logout("\n");
+ acb = vdi_aio_setup(bs, sector_num, qiov, nb_sectors, cb, opaque, 1);
+ if (!acb) {
+ return NULL;
+ }
+
+ ret = vdi_schedule_bh(vdi_aio_rw_bh, acb);
+ if (ret < 0) {
+ if (acb->qiov->niov > 1) {
+ qemu_vfree(acb->orig_buf);
+ }
+ qemu_aio_release(acb);
+ return NULL;
+ }
+
+ return &acb->common;
+}
+
+static int vdi_create(const char *filename, QEMUOptionParameter *options)
+{
+ int fd;
+ int result = 0;
+ uint64_t bytes = 0;
+ uint32_t blocks;
+ size_t block_size = DEFAULT_CLUSTER_SIZE;
+ uint32_t image_type = VDI_TYPE_DYNAMIC;
+ VdiHeader header;
+ size_t i;
+ size_t bmap_size;
+ uint32_t *bmap;
+
+ logout("\n");
+
+ /* Read out options. */
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ bytes = options->value.n;
+#if defined(CONFIG_VDI_BLOCK_SIZE)
+ } else if (!strcmp(options->name, BLOCK_OPT_CLUSTER_SIZE)) {
+ if (options->value.n) {
+ /* TODO: Additional checks (SECTOR_SIZE * 2^n, ...). */
+ block_size = options->value.n;
+ }
+#endif
+#if defined(CONFIG_VDI_STATIC_IMAGE)
+ } else if (!strcmp(options->name, BLOCK_OPT_STATIC)) {
+ if (options->value.n) {
+ image_type = VDI_TYPE_STATIC;
+ }
+#endif
+ }
+ options++;
+ }
+
+ fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_LARGEFILE,
+ 0644);
+ if (fd < 0) {
+ return -errno;
+ }
+
+ /* We need enough blocks to store the given disk size,
+ so always round up. */
+ blocks = (bytes + block_size - 1) / block_size;
+
+ bmap_size = blocks * sizeof(uint32_t);
+ bmap_size = ((bmap_size + SECTOR_SIZE - 1) & ~(SECTOR_SIZE -1));
+
+ memset(&header, 0, sizeof(header));
+ pstrcpy(header.text, sizeof(header.text), VDI_TEXT);
+ header.signature = VDI_SIGNATURE;
+ header.version = VDI_VERSION_1_1;
+ header.header_size = 0x180;
+ header.image_type = image_type;
+ header.offset_bmap = 0x200;
+ header.offset_data = 0x200 + bmap_size;
+ header.sector_size = SECTOR_SIZE;
+ header.disk_size = bytes;
+ header.block_size = block_size;
+ header.blocks_in_image = blocks;
+ if (image_type == VDI_TYPE_STATIC) {
+ header.blocks_allocated = blocks;
+ }
+ uuid_generate(header.uuid_image);
+ uuid_generate(header.uuid_last_snap);
+ /* There is no need to set header.uuid_link or header.uuid_parent here. */
+#if defined(CONFIG_VDI_DEBUG)
+ vdi_header_print(&header);
+#endif
+ vdi_header_to_le(&header);
+ if (write(fd, &header, sizeof(header)) < 0) {
+ result = -errno;
+ }
+
+ bmap = NULL;
+ if (bmap_size > 0) {
+ bmap = (uint32_t *)qemu_mallocz(bmap_size);
+ }
+ for (i = 0; i < blocks; i++) {
+ if (image_type == VDI_TYPE_STATIC) {
+ bmap[i] = i;
+ } else {
+ bmap[i] = VDI_UNALLOCATED;
+ }
+ }
+ if (write(fd, bmap, bmap_size) < 0) {
+ result = -errno;
+ }
+ qemu_free(bmap);
+ if (image_type == VDI_TYPE_STATIC) {
+ if (ftruncate(fd, sizeof(header) + bmap_size + blocks * block_size)) {
+ result = -errno;
+ }
+ }
+
+ if (close(fd) < 0) {
+ result = -errno;
+ }
+
+ return result;
+}
+
+static void vdi_close(BlockDriverState *bs)
+{
+}
+
+static int vdi_flush(BlockDriverState *bs)
+{
+ logout("\n");
+ return bdrv_flush(bs->file);
+}
+
+
+static QEMUOptionParameter vdi_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+#if defined(CONFIG_VDI_BLOCK_SIZE)
+ {
+ .name = BLOCK_OPT_CLUSTER_SIZE,
+ .type = OPT_SIZE,
+ .help = "VDI cluster (block) size",
+ .value = { .n = DEFAULT_CLUSTER_SIZE },
+ },
+#endif
+#if defined(CONFIG_VDI_STATIC_IMAGE)
+ {
+ .name = BLOCK_OPT_STATIC,
+ .type = OPT_FLAG,
+ .help = "VDI static (pre-allocated) image"
+ },
+#endif
+ /* TODO: An additional option to set UUID values might be useful. */
+ { NULL }
+};
+
+static BlockDriver bdrv_vdi = {
+ .format_name = "vdi",
+ .instance_size = sizeof(BDRVVdiState),
+ .bdrv_probe = vdi_probe,
+ .bdrv_open = vdi_open,
+ .bdrv_close = vdi_close,
+ .bdrv_create = vdi_create,
+ .bdrv_flush = vdi_flush,
+ .bdrv_is_allocated = vdi_is_allocated,
+ .bdrv_make_empty = vdi_make_empty,
+
+ .bdrv_aio_readv = vdi_aio_readv,
+#if defined(CONFIG_VDI_WRITE)
+ .bdrv_aio_writev = vdi_aio_writev,
+#endif
+
+ .bdrv_get_info = vdi_get_info,
+
+ .create_options = vdi_create_options,
+ .bdrv_check = vdi_check,
+};
+
+static void bdrv_vdi_init(void)
+{
+ logout("\n");
+ bdrv_register(&bdrv_vdi);
+}
+
+block_init(bdrv_vdi_init);
diff --git a/qemu-0.15.x/block/vmdk.c b/qemu-0.15.x/block/vmdk.c
new file mode 100644
index 0000000..37478d2
--- /dev/null
+++ b/qemu-0.15.x/block/vmdk.c
@@ -0,0 +1,1363 @@
+/*
+ * Block driver for the VMDK format
+ *
+ * Copyright (c) 2004 Fabrice Bellard
+ * Copyright (c) 2005 Filip Navara
+ *
+ * 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.
+ */
+
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+
+#define VMDK3_MAGIC (('C' << 24) | ('O' << 16) | ('W' << 8) | 'D')
+#define VMDK4_MAGIC (('K' << 24) | ('D' << 16) | ('M' << 8) | 'V')
+
+typedef struct {
+ uint32_t version;
+ uint32_t flags;
+ uint32_t disk_sectors;
+ uint32_t granularity;
+ uint32_t l1dir_offset;
+ uint32_t l1dir_size;
+ uint32_t file_sectors;
+ uint32_t cylinders;
+ uint32_t heads;
+ uint32_t sectors_per_track;
+} VMDK3Header;
+
+typedef struct {
+ uint32_t version;
+ uint32_t flags;
+ int64_t capacity;
+ int64_t granularity;
+ int64_t desc_offset;
+ int64_t desc_size;
+ int32_t num_gtes_per_gte;
+ int64_t rgd_offset;
+ int64_t gd_offset;
+ int64_t grain_offset;
+ char filler[1];
+ char check_bytes[4];
+} __attribute__((packed)) VMDK4Header;
+
+#define L2_CACHE_SIZE 16
+
+typedef struct VmdkExtent {
+ BlockDriverState *file;
+ bool flat;
+ int64_t sectors;
+ int64_t end_sector;
+ int64_t flat_start_offset;
+ int64_t l1_table_offset;
+ int64_t l1_backup_table_offset;
+ uint32_t *l1_table;
+ uint32_t *l1_backup_table;
+ unsigned int l1_size;
+ uint32_t l1_entry_sectors;
+
+ unsigned int l2_size;
+ uint32_t *l2_cache;
+ uint32_t l2_cache_offsets[L2_CACHE_SIZE];
+ uint32_t l2_cache_counts[L2_CACHE_SIZE];
+
+ unsigned int cluster_sectors;
+} VmdkExtent;
+
+typedef struct BDRVVmdkState {
+ int desc_offset;
+ bool cid_updated;
+ uint32_t parent_cid;
+ int num_extents;
+ /* Extent array with num_extents entries, ascend ordered by address */
+ VmdkExtent *extents;
+} BDRVVmdkState;
+
+typedef struct VmdkMetaData {
+ uint32_t offset;
+ unsigned int l1_index;
+ unsigned int l2_index;
+ unsigned int l2_offset;
+ int valid;
+} VmdkMetaData;
+
+static int vmdk_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ uint32_t magic;
+
+ if (buf_size < 4) {
+ return 0;
+ }
+ magic = be32_to_cpu(*(uint32_t *)buf);
+ if (magic == VMDK3_MAGIC ||
+ magic == VMDK4_MAGIC) {
+ return 100;
+ } else {
+ const char *p = (const char *)buf;
+ const char *end = p + buf_size;
+ while (p < end) {
+ if (*p == '#') {
+ /* skip comment line */
+ while (p < end && *p != '\n') {
+ p++;
+ }
+ p++;
+ continue;
+ }
+ if (*p == ' ') {
+ while (p < end && *p == ' ') {
+ p++;
+ }
+ /* skip '\r' if windows line endings used. */
+ if (p < end && *p == '\r') {
+ p++;
+ }
+ /* only accept blank lines before 'version=' line */
+ if (p == end || *p != '\n') {
+ return 0;
+ }
+ p++;
+ continue;
+ }
+ if (end - p >= strlen("version=X\n")) {
+ if (strncmp("version=1\n", p, strlen("version=1\n")) == 0 ||
+ strncmp("version=2\n", p, strlen("version=2\n")) == 0) {
+ return 100;
+ }
+ }
+ if (end - p >= strlen("version=X\r\n")) {
+ if (strncmp("version=1\r\n", p, strlen("version=1\r\n")) == 0 ||
+ strncmp("version=2\r\n", p, strlen("version=2\r\n")) == 0) {
+ return 100;
+ }
+ }
+ return 0;
+ }
+ return 0;
+ }
+}
+
+#define CHECK_CID 1
+
+#define SECTOR_SIZE 512
+#define DESC_SIZE (20 * SECTOR_SIZE) /* 20 sectors of 512 bytes each */
+#define BUF_SIZE 4096
+#define HEADER_SIZE 512 /* first sector of 512 bytes */
+
+static void vmdk_free_extents(BlockDriverState *bs)
+{
+ int i;
+ BDRVVmdkState *s = bs->opaque;
+
+ for (i = 0; i < s->num_extents; i++) {
+ qemu_free(s->extents[i].l1_table);
+ qemu_free(s->extents[i].l2_cache);
+ qemu_free(s->extents[i].l1_backup_table);
+ }
+ qemu_free(s->extents);
+}
+
+static uint32_t vmdk_read_cid(BlockDriverState *bs, int parent)
+{
+ char desc[DESC_SIZE];
+ uint32_t cid;
+ const char *p_name, *cid_str;
+ size_t cid_str_size;
+ BDRVVmdkState *s = bs->opaque;
+
+ if (bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE) != DESC_SIZE) {
+ return 0;
+ }
+
+ if (parent) {
+ cid_str = "parentCID";
+ cid_str_size = sizeof("parentCID");
+ } else {
+ cid_str = "CID";
+ cid_str_size = sizeof("CID");
+ }
+
+ p_name = strstr(desc, cid_str);
+ if (p_name != NULL) {
+ p_name += cid_str_size;
+ sscanf(p_name, "%x", &cid);
+ }
+
+ return cid;
+}
+
+static int vmdk_write_cid(BlockDriverState *bs, uint32_t cid)
+{
+ char desc[DESC_SIZE], tmp_desc[DESC_SIZE];
+ char *p_name, *tmp_str;
+ BDRVVmdkState *s = bs->opaque;
+
+ memset(desc, 0, sizeof(desc));
+ if (bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE) != DESC_SIZE) {
+ return -EIO;
+ }
+
+ tmp_str = strstr(desc, "parentCID");
+ pstrcpy(tmp_desc, sizeof(tmp_desc), tmp_str);
+ p_name = strstr(desc, "CID");
+ if (p_name != NULL) {
+ p_name += sizeof("CID");
+ snprintf(p_name, sizeof(desc) - (p_name - desc), "%x\n", cid);
+ pstrcat(desc, sizeof(desc), tmp_desc);
+ }
+
+ if (bdrv_pwrite_sync(bs->file, s->desc_offset, desc, DESC_SIZE) < 0) {
+ return -EIO;
+ }
+ return 0;
+}
+
+static int vmdk_is_cid_valid(BlockDriverState *bs)
+{
+#ifdef CHECK_CID
+ BDRVVmdkState *s = bs->opaque;
+ BlockDriverState *p_bs = bs->backing_hd;
+ uint32_t cur_pcid;
+
+ if (p_bs) {
+ cur_pcid = vmdk_read_cid(p_bs, 0);
+ if (s->parent_cid != cur_pcid) {
+ /* CID not valid */
+ return 0;
+ }
+ }
+#endif
+ /* CID valid */
+ return 1;
+}
+
+static int vmdk_parent_open(BlockDriverState *bs)
+{
+ char *p_name;
+ char desc[DESC_SIZE + 1];
+ BDRVVmdkState *s = bs->opaque;
+
+ desc[DESC_SIZE] = '\0';
+ if (bdrv_pread(bs->file, s->desc_offset, desc, DESC_SIZE) != DESC_SIZE) {
+ return -1;
+ }
+
+ p_name = strstr(desc, "parentFileNameHint");
+ if (p_name != NULL) {
+ char *end_name;
+
+ p_name += sizeof("parentFileNameHint") + 1;
+ end_name = strchr(p_name, '\"');
+ if (end_name == NULL) {
+ return -1;
+ }
+ if ((end_name - p_name) > sizeof(bs->backing_file) - 1) {
+ return -1;
+ }
+
+ pstrcpy(bs->backing_file, end_name - p_name + 1, p_name);
+ }
+
+ return 0;
+}
+
+/* Create and append extent to the extent array. Return the added VmdkExtent
+ * address. return NULL if allocation failed. */
+static VmdkExtent *vmdk_add_extent(BlockDriverState *bs,
+ BlockDriverState *file, bool flat, int64_t sectors,
+ int64_t l1_offset, int64_t l1_backup_offset,
+ uint32_t l1_size,
+ int l2_size, unsigned int cluster_sectors)
+{
+ VmdkExtent *extent;
+ BDRVVmdkState *s = bs->opaque;
+
+ s->extents = qemu_realloc(s->extents,
+ (s->num_extents + 1) * sizeof(VmdkExtent));
+ extent = &s->extents[s->num_extents];
+ s->num_extents++;
+
+ memset(extent, 0, sizeof(VmdkExtent));
+ extent->file = file;
+ extent->flat = flat;
+ extent->sectors = sectors;
+ extent->l1_table_offset = l1_offset;
+ extent->l1_backup_table_offset = l1_backup_offset;
+ extent->l1_size = l1_size;
+ extent->l1_entry_sectors = l2_size * cluster_sectors;
+ extent->l2_size = l2_size;
+ extent->cluster_sectors = cluster_sectors;
+
+ if (s->num_extents > 1) {
+ extent->end_sector = (*(extent - 1)).end_sector + extent->sectors;
+ } else {
+ extent->end_sector = extent->sectors;
+ }
+ bs->total_sectors = extent->end_sector;
+ return extent;
+}
+
+static int vmdk_init_tables(BlockDriverState *bs, VmdkExtent *extent)
+{
+ int ret;
+ int l1_size, i;
+
+ /* read the L1 table */
+ l1_size = extent->l1_size * sizeof(uint32_t);
+ extent->l1_table = qemu_malloc(l1_size);
+ ret = bdrv_pread(extent->file,
+ extent->l1_table_offset,
+ extent->l1_table,
+ l1_size);
+ if (ret < 0) {
+ goto fail_l1;
+ }
+ for (i = 0; i < extent->l1_size; i++) {
+ le32_to_cpus(&extent->l1_table[i]);
+ }
+
+ if (extent->l1_backup_table_offset) {
+ extent->l1_backup_table = qemu_malloc(l1_size);
+ ret = bdrv_pread(extent->file,
+ extent->l1_backup_table_offset,
+ extent->l1_backup_table,
+ l1_size);
+ if (ret < 0) {
+ goto fail_l1b;
+ }
+ for (i = 0; i < extent->l1_size; i++) {
+ le32_to_cpus(&extent->l1_backup_table[i]);
+ }
+ }
+
+ extent->l2_cache =
+ qemu_malloc(extent->l2_size * L2_CACHE_SIZE * sizeof(uint32_t));
+ return 0;
+ fail_l1b:
+ qemu_free(extent->l1_backup_table);
+ fail_l1:
+ qemu_free(extent->l1_table);
+ return ret;
+}
+
+static int vmdk_open_vmdk3(BlockDriverState *bs, int flags)
+{
+ int ret;
+ uint32_t magic;
+ VMDK3Header header;
+ BDRVVmdkState *s = bs->opaque;
+ VmdkExtent *extent;
+
+ s->desc_offset = 0x200;
+ ret = bdrv_pread(bs->file, sizeof(magic), &header, sizeof(header));
+ if (ret < 0) {
+ goto fail;
+ }
+ extent = vmdk_add_extent(bs,
+ bs->file, false,
+ le32_to_cpu(header.disk_sectors),
+ le32_to_cpu(header.l1dir_offset) << 9,
+ 0, 1 << 6, 1 << 9,
+ le32_to_cpu(header.granularity));
+ ret = vmdk_init_tables(bs, extent);
+ if (ret) {
+ /* vmdk_init_tables cleans up on fail, so only free allocation of
+ * vmdk_add_extent here. */
+ goto fail;
+ }
+ return 0;
+ fail:
+ vmdk_free_extents(bs);
+ return ret;
+}
+
+static int vmdk_open_vmdk4(BlockDriverState *bs, int flags)
+{
+ int ret;
+ uint32_t magic;
+ uint32_t l1_size, l1_entry_sectors;
+ VMDK4Header header;
+ BDRVVmdkState *s = bs->opaque;
+ VmdkExtent *extent;
+
+ s->desc_offset = 0x200;
+ ret = bdrv_pread(bs->file, sizeof(magic), &header, sizeof(header));
+ if (ret < 0) {
+ goto fail;
+ }
+ l1_entry_sectors = le32_to_cpu(header.num_gtes_per_gte)
+ * le64_to_cpu(header.granularity);
+ l1_size = (le64_to_cpu(header.capacity) + l1_entry_sectors - 1)
+ / l1_entry_sectors;
+ extent = vmdk_add_extent(bs, bs->file, false,
+ le64_to_cpu(header.capacity),
+ le64_to_cpu(header.gd_offset) << 9,
+ le64_to_cpu(header.rgd_offset) << 9,
+ l1_size,
+ le32_to_cpu(header.num_gtes_per_gte),
+ le64_to_cpu(header.granularity));
+ if (extent->l1_entry_sectors <= 0) {
+ ret = -EINVAL;
+ goto fail;
+ }
+ /* try to open parent images, if exist */
+ ret = vmdk_parent_open(bs);
+ if (ret) {
+ goto fail;
+ }
+ s->parent_cid = vmdk_read_cid(bs, 1);
+ ret = vmdk_init_tables(bs, extent);
+ if (ret) {
+ goto fail;
+ }
+ return 0;
+ fail:
+ vmdk_free_extents(bs);
+ return ret;
+}
+
+/* find an option value out of descriptor file */
+static int vmdk_parse_description(const char *desc, const char *opt_name,
+ char *buf, int buf_size)
+{
+ char *opt_pos, *opt_end;
+ const char *end = desc + strlen(desc);
+
+ opt_pos = strstr(desc, opt_name);
+ if (!opt_pos) {
+ return -1;
+ }
+ /* Skip "=\"" following opt_name */
+ opt_pos += strlen(opt_name) + 2;
+ if (opt_pos >= end) {
+ return -1;
+ }
+ opt_end = opt_pos;
+ while (opt_end < end && *opt_end != '"') {
+ opt_end++;
+ }
+ if (opt_end == end || buf_size < opt_end - opt_pos + 1) {
+ return -1;
+ }
+ pstrcpy(buf, opt_end - opt_pos + 1, opt_pos);
+ return 0;
+}
+
+static int vmdk_parse_extents(const char *desc, BlockDriverState *bs,
+ const char *desc_file_path)
+{
+ int ret;
+ char access[11];
+ char type[11];
+ char fname[512];
+ const char *p = desc;
+ int64_t sectors = 0;
+ int64_t flat_offset;
+
+ while (*p) {
+ /* parse extent line:
+ * RW [size in sectors] FLAT "file-name.vmdk" OFFSET
+ * or
+ * RW [size in sectors] SPARSE "file-name.vmdk"
+ */
+ flat_offset = -1;
+ ret = sscanf(p, "%10s %" SCNd64 " %10s %511s %" SCNd64,
+ access, §ors, type, fname, &flat_offset);
+ if (ret < 4 || strcmp(access, "RW")) {
+ goto next_line;
+ } else if (!strcmp(type, "FLAT")) {
+ if (ret != 5 || flat_offset < 0) {
+ return -EINVAL;
+ }
+ } else if (ret != 4) {
+ return -EINVAL;
+ }
+
+ /* trim the quotation marks around */
+ if (fname[0] == '"') {
+ memmove(fname, fname + 1, strlen(fname));
+ if (strlen(fname) <= 1 || fname[strlen(fname) - 1] != '"') {
+ return -EINVAL;
+ }
+ fname[strlen(fname) - 1] = '\0';
+ }
+ if (sectors <= 0 ||
+ (strcmp(type, "FLAT") && strcmp(type, "SPARSE")) ||
+ (strcmp(access, "RW"))) {
+ goto next_line;
+ }
+
+ /* save to extents array */
+ if (!strcmp(type, "FLAT")) {
+ /* FLAT extent */
+ char extent_path[PATH_MAX];
+ BlockDriverState *extent_file;
+ VmdkExtent *extent;
+
+ path_combine(extent_path, sizeof(extent_path),
+ desc_file_path, fname);
+ ret = bdrv_file_open(&extent_file, extent_path, bs->open_flags);
+ if (ret) {
+ return ret;
+ }
+ extent = vmdk_add_extent(bs, extent_file, true, sectors,
+ 0, 0, 0, 0, sectors);
+ extent->flat_start_offset = flat_offset;
+ } else {
+ /* SPARSE extent, not supported for now */
+ fprintf(stderr,
+ "VMDK: Not supported extent type \"%s\""".\n", type);
+ return -ENOTSUP;
+ }
+next_line:
+ /* move to next line */
+ while (*p && *p != '\n') {
+ p++;
+ }
+ p++;
+ }
+ return 0;
+}
+
+static int vmdk_open_desc_file(BlockDriverState *bs, int flags)
+{
+ int ret;
+ char buf[2048];
+ char ct[128];
+ BDRVVmdkState *s = bs->opaque;
+
+ ret = bdrv_pread(bs->file, 0, buf, sizeof(buf));
+ if (ret < 0) {
+ return ret;
+ }
+ buf[2047] = '\0';
+ if (vmdk_parse_description(buf, "createType", ct, sizeof(ct))) {
+ return -EINVAL;
+ }
+ if (strcmp(ct, "monolithicFlat")) {
+ fprintf(stderr,
+ "VMDK: Not supported image type \"%s\""".\n", ct);
+ return -ENOTSUP;
+ }
+ s->desc_offset = 0;
+ ret = vmdk_parse_extents(buf, bs, bs->file->filename);
+ if (ret) {
+ return ret;
+ }
+
+ /* try to open parent images, if exist */
+ if (vmdk_parent_open(bs)) {
+ qemu_free(s->extents);
+ return -EINVAL;
+ }
+ s->parent_cid = vmdk_read_cid(bs, 1);
+ return 0;
+}
+
+static int vmdk_open(BlockDriverState *bs, int flags)
+{
+ uint32_t magic;
+
+ if (bdrv_pread(bs->file, 0, &magic, sizeof(magic)) != sizeof(magic)) {
+ return -EIO;
+ }
+
+ magic = be32_to_cpu(magic);
+ if (magic == VMDK3_MAGIC) {
+ return vmdk_open_vmdk3(bs, flags);
+ } else if (magic == VMDK4_MAGIC) {
+ return vmdk_open_vmdk4(bs, flags);
+ } else {
+ return vmdk_open_desc_file(bs, flags);
+ }
+}
+
+static int get_whole_cluster(BlockDriverState *bs,
+ VmdkExtent *extent,
+ uint64_t cluster_offset,
+ uint64_t offset,
+ bool allocate)
+{
+ /* 128 sectors * 512 bytes each = grain size 64KB */
+ uint8_t whole_grain[extent->cluster_sectors * 512];
+
+ /* we will be here if it's first write on non-exist grain(cluster).
+ * try to read from parent image, if exist */
+ if (bs->backing_hd) {
+ int ret;
+
+ if (!vmdk_is_cid_valid(bs)) {
+ return -1;
+ }
+
+ /* floor offset to cluster */
+ offset -= offset % (extent->cluster_sectors * 512);
+ ret = bdrv_read(bs->backing_hd, offset >> 9, whole_grain,
+ extent->cluster_sectors);
+ if (ret < 0) {
+ return -1;
+ }
+
+ /* Write grain only into the active image */
+ ret = bdrv_write(extent->file, cluster_offset, whole_grain,
+ extent->cluster_sectors);
+ if (ret < 0) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+static int vmdk_L2update(VmdkExtent *extent, VmdkMetaData *m_data)
+{
+ /* update L2 table */
+ if (bdrv_pwrite_sync(
+ extent->file,
+ ((int64_t)m_data->l2_offset * 512)
+ + (m_data->l2_index * sizeof(m_data->offset)),
+ &(m_data->offset),
+ sizeof(m_data->offset)
+ ) < 0) {
+ return -1;
+ }
+ /* update backup L2 table */
+ if (extent->l1_backup_table_offset != 0) {
+ m_data->l2_offset = extent->l1_backup_table[m_data->l1_index];
+ if (bdrv_pwrite_sync(
+ extent->file,
+ ((int64_t)m_data->l2_offset * 512)
+ + (m_data->l2_index * sizeof(m_data->offset)),
+ &(m_data->offset), sizeof(m_data->offset)
+ ) < 0) {
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static int get_cluster_offset(BlockDriverState *bs,
+ VmdkExtent *extent,
+ VmdkMetaData *m_data,
+ uint64_t offset,
+ int allocate,
+ uint64_t *cluster_offset)
+{
+ unsigned int l1_index, l2_offset, l2_index;
+ int min_index, i, j;
+ uint32_t min_count, *l2_table, tmp = 0;
+
+ if (m_data) {
+ m_data->valid = 0;
+ }
+ if (extent->flat) {
+ *cluster_offset = extent->flat_start_offset;
+ return 0;
+ }
+
+ l1_index = (offset >> 9) / extent->l1_entry_sectors;
+ if (l1_index >= extent->l1_size) {
+ return -1;
+ }
+ l2_offset = extent->l1_table[l1_index];
+ if (!l2_offset) {
+ return -1;
+ }
+ for (i = 0; i < L2_CACHE_SIZE; i++) {
+ if (l2_offset == extent->l2_cache_offsets[i]) {
+ /* increment the hit count */
+ if (++extent->l2_cache_counts[i] == 0xffffffff) {
+ for (j = 0; j < L2_CACHE_SIZE; j++) {
+ extent->l2_cache_counts[j] >>= 1;
+ }
+ }
+ l2_table = extent->l2_cache + (i * extent->l2_size);
+ goto found;
+ }
+ }
+ /* not found: load a new entry in the least used one */
+ min_index = 0;
+ min_count = 0xffffffff;
+ for (i = 0; i < L2_CACHE_SIZE; i++) {
+ if (extent->l2_cache_counts[i] < min_count) {
+ min_count = extent->l2_cache_counts[i];
+ min_index = i;
+ }
+ }
+ l2_table = extent->l2_cache + (min_index * extent->l2_size);
+ if (bdrv_pread(
+ extent->file,
+ (int64_t)l2_offset * 512,
+ l2_table,
+ extent->l2_size * sizeof(uint32_t)
+ ) != extent->l2_size * sizeof(uint32_t)) {
+ return -1;
+ }
+
+ extent->l2_cache_offsets[min_index] = l2_offset;
+ extent->l2_cache_counts[min_index] = 1;
+ found:
+ l2_index = ((offset >> 9) / extent->cluster_sectors) % extent->l2_size;
+ *cluster_offset = le32_to_cpu(l2_table[l2_index]);
+
+ if (!*cluster_offset) {
+ if (!allocate) {
+ return -1;
+ }
+
+ /* Avoid the L2 tables update for the images that have snapshots. */
+ *cluster_offset = bdrv_getlength(extent->file);
+ bdrv_truncate(
+ extent->file,
+ *cluster_offset + (extent->cluster_sectors << 9)
+ );
+
+ *cluster_offset >>= 9;
+ tmp = cpu_to_le32(*cluster_offset);
+ l2_table[l2_index] = tmp;
+
+ /* First of all we write grain itself, to avoid race condition
+ * that may to corrupt the image.
+ * This problem may occur because of insufficient space on host disk
+ * or inappropriate VM shutdown.
+ */
+ if (get_whole_cluster(
+ bs, extent, *cluster_offset, offset, allocate) == -1) {
+ return -1;
+ }
+
+ if (m_data) {
+ m_data->offset = tmp;
+ m_data->l1_index = l1_index;
+ m_data->l2_index = l2_index;
+ m_data->l2_offset = l2_offset;
+ m_data->valid = 1;
+ }
+ }
+ *cluster_offset <<= 9;
+ return 0;
+}
+
+static VmdkExtent *find_extent(BDRVVmdkState *s,
+ int64_t sector_num, VmdkExtent *start_hint)
+{
+ VmdkExtent *extent = start_hint;
+
+ if (!extent) {
+ extent = &s->extents[0];
+ }
+ while (extent < &s->extents[s->num_extents]) {
+ if (sector_num < extent->end_sector) {
+ return extent;
+ }
+ extent++;
+ }
+ return NULL;
+}
+
+static int vmdk_is_allocated(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors, int *pnum)
+{
+ BDRVVmdkState *s = bs->opaque;
+ int64_t index_in_cluster, n, ret;
+ uint64_t offset;
+ VmdkExtent *extent;
+
+ extent = find_extent(s, sector_num, NULL);
+ if (!extent) {
+ return 0;
+ }
+ ret = get_cluster_offset(bs, extent, NULL,
+ sector_num * 512, 0, &offset);
+ /* get_cluster_offset returning 0 means success */
+ ret = !ret;
+
+ index_in_cluster = sector_num % extent->cluster_sectors;
+ n = extent->cluster_sectors - index_in_cluster;
+ if (n > nb_sectors) {
+ n = nb_sectors;
+ }
+ *pnum = n;
+ return ret;
+}
+
+static int vmdk_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVVmdkState *s = bs->opaque;
+ int ret;
+ uint64_t n, index_in_cluster;
+ VmdkExtent *extent = NULL;
+ uint64_t cluster_offset;
+
+ while (nb_sectors > 0) {
+ extent = find_extent(s, sector_num, extent);
+ if (!extent) {
+ return -EIO;
+ }
+ ret = get_cluster_offset(
+ bs, extent, NULL,
+ sector_num << 9, 0, &cluster_offset);
+ index_in_cluster = sector_num % extent->cluster_sectors;
+ n = extent->cluster_sectors - index_in_cluster;
+ if (n > nb_sectors) {
+ n = nb_sectors;
+ }
+ if (ret) {
+ /* if not allocated, try to read from parent image, if exist */
+ if (bs->backing_hd) {
+ if (!vmdk_is_cid_valid(bs)) {
+ return -EINVAL;
+ }
+ ret = bdrv_read(bs->backing_hd, sector_num, buf, n);
+ if (ret < 0) {
+ return ret;
+ }
+ } else {
+ memset(buf, 0, 512 * n);
+ }
+ } else {
+ ret = bdrv_pread(extent->file,
+ cluster_offset + index_in_cluster * 512,
+ buf, n * 512);
+ if (ret < 0) {
+ return ret;
+ }
+ }
+ nb_sectors -= n;
+ sector_num += n;
+ buf += n * 512;
+ }
+ return 0;
+}
+
+static int vmdk_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BDRVVmdkState *s = bs->opaque;
+ VmdkExtent *extent = NULL;
+ int n, ret;
+ int64_t index_in_cluster;
+ uint64_t cluster_offset;
+ VmdkMetaData m_data;
+
+ if (sector_num > bs->total_sectors) {
+ fprintf(stderr,
+ "(VMDK) Wrong offset: sector_num=0x%" PRIx64
+ " total_sectors=0x%" PRIx64 "\n",
+ sector_num, bs->total_sectors);
+ return -EIO;
+ }
+
+ while (nb_sectors > 0) {
+ extent = find_extent(s, sector_num, extent);
+ if (!extent) {
+ return -EIO;
+ }
+ ret = get_cluster_offset(
+ bs,
+ extent,
+ &m_data,
+ sector_num << 9, 1,
+ &cluster_offset);
+ if (ret) {
+ return -EINVAL;
+ }
+ index_in_cluster = sector_num % extent->cluster_sectors;
+ n = extent->cluster_sectors - index_in_cluster;
+ if (n > nb_sectors) {
+ n = nb_sectors;
+ }
+
+ ret = bdrv_pwrite(extent->file,
+ cluster_offset + index_in_cluster * 512,
+ buf,
+ n * 512);
+ if (ret < 0) {
+ return ret;
+ }
+ if (m_data.valid) {
+ /* update L2 tables */
+ if (vmdk_L2update(extent, &m_data) == -1) {
+ return -EIO;
+ }
+ }
+ nb_sectors -= n;
+ sector_num += n;
+ buf += n * 512;
+
+ /* update CID on the first write every time the virtual disk is
+ * opened */
+ if (!s->cid_updated) {
+ vmdk_write_cid(bs, time(NULL));
+ s->cid_updated = true;
+ }
+ }
+ return 0;
+}
+
+
+static int vmdk_create_extent(const char *filename, int64_t filesize, bool flat)
+{
+ int ret, i;
+ int fd = 0;
+ VMDK4Header header;
+ uint32_t tmp, magic, grains, gd_size, gt_size, gt_count;
+
+ fd = open(
+ filename,
+ O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_LARGEFILE,
+ 0644);
+ if (fd < 0) {
+ return -errno;
+ }
+ if (flat) {
+ ret = ftruncate(fd, filesize);
+ if (ret < 0) {
+ ret = -errno;
+ }
+ goto exit;
+ }
+ magic = cpu_to_be32(VMDK4_MAGIC);
+ memset(&header, 0, sizeof(header));
+ header.version = 1;
+ header.flags = 3; /* ?? */
+ header.capacity = filesize / 512;
+ header.granularity = 128;
+ header.num_gtes_per_gte = 512;
+
+ grains = (filesize / 512 + header.granularity - 1) / header.granularity;
+ gt_size = ((header.num_gtes_per_gte * sizeof(uint32_t)) + 511) >> 9;
+ gt_count =
+ (grains + header.num_gtes_per_gte - 1) / header.num_gtes_per_gte;
+ gd_size = (gt_count * sizeof(uint32_t) + 511) >> 9;
+
+ header.desc_offset = 1;
+ header.desc_size = 20;
+ header.rgd_offset = header.desc_offset + header.desc_size;
+ header.gd_offset = header.rgd_offset + gd_size + (gt_size * gt_count);
+ header.grain_offset =
+ ((header.gd_offset + gd_size + (gt_size * gt_count) +
+ header.granularity - 1) / header.granularity) *
+ header.granularity;
+ /* swap endianness for all header fields */
+ header.version = cpu_to_le32(header.version);
+ header.flags = cpu_to_le32(header.flags);
+ header.capacity = cpu_to_le64(header.capacity);
+ header.granularity = cpu_to_le64(header.granularity);
+ header.num_gtes_per_gte = cpu_to_le32(header.num_gtes_per_gte);
+ header.desc_offset = cpu_to_le64(header.desc_offset);
+ header.desc_size = cpu_to_le64(header.desc_size);
+ header.rgd_offset = cpu_to_le64(header.rgd_offset);
+ header.gd_offset = cpu_to_le64(header.gd_offset);
+ header.grain_offset = cpu_to_le64(header.grain_offset);
+
+ header.check_bytes[0] = 0xa;
+ header.check_bytes[1] = 0x20;
+ header.check_bytes[2] = 0xd;
+ header.check_bytes[3] = 0xa;
+
+ /* write all the data */
+ ret = qemu_write_full(fd, &magic, sizeof(magic));
+ if (ret != sizeof(magic)) {
+ ret = -errno;
+ goto exit;
+ }
+ ret = qemu_write_full(fd, &header, sizeof(header));
+ if (ret != sizeof(header)) {
+ ret = -errno;
+ goto exit;
+ }
+
+ ret = ftruncate(fd, le64_to_cpu(header.grain_offset) << 9);
+ if (ret < 0) {
+ ret = -errno;
+ goto exit;
+ }
+
+ /* write grain directory */
+ lseek(fd, le64_to_cpu(header.rgd_offset) << 9, SEEK_SET);
+ for (i = 0, tmp = le64_to_cpu(header.rgd_offset) + gd_size;
+ i < gt_count; i++, tmp += gt_size) {
+ ret = qemu_write_full(fd, &tmp, sizeof(tmp));
+ if (ret != sizeof(tmp)) {
+ ret = -errno;
+ goto exit;
+ }
+ }
+
+ /* write backup grain directory */
+ lseek(fd, le64_to_cpu(header.gd_offset) << 9, SEEK_SET);
+ for (i = 0, tmp = le64_to_cpu(header.gd_offset) + gd_size;
+ i < gt_count; i++, tmp += gt_size) {
+ ret = qemu_write_full(fd, &tmp, sizeof(tmp));
+ if (ret != sizeof(tmp)) {
+ ret = -errno;
+ goto exit;
+ }
+ }
+
+ ret = 0;
+ exit:
+ close(fd);
+ return ret;
+}
+
+static int filename_decompose(const char *filename, char *path, char *prefix,
+ char *postfix, size_t buf_len)
+{
+ const char *p, *q;
+
+ if (filename == NULL || !strlen(filename)) {
+ fprintf(stderr, "Vmdk: no filename provided.\n");
+ return -1;
+ }
+ p = strrchr(filename, '/');
+ if (p == NULL) {
+ p = strrchr(filename, '\\');
+ }
+ if (p == NULL) {
+ p = strrchr(filename, ':');
+ }
+ if (p != NULL) {
+ p++;
+ if (p - filename >= buf_len) {
+ return -1;
+ }
+ pstrcpy(path, p - filename + 1, filename);
+ } else {
+ p = filename;
+ path[0] = '\0';
+ }
+ q = strrchr(p, '.');
+ if (q == NULL) {
+ pstrcpy(prefix, buf_len, p);
+ postfix[0] = '\0';
+ } else {
+ if (q - p >= buf_len) {
+ return -1;
+ }
+ pstrcpy(prefix, q - p + 1, p);
+ pstrcpy(postfix, buf_len, q);
+ }
+ return 0;
+}
+
+static int relative_path(char *dest, int dest_size,
+ const char *base, const char *target)
+{
+ int i = 0;
+ int n = 0;
+ const char *p, *q;
+#ifdef _WIN32
+ const char *sep = "\\";
+#else
+ const char *sep = "/";
+#endif
+
+ if (!(dest && base && target)) {
+ return -1;
+ }
+ if (path_is_absolute(target)) {
+ dest[dest_size - 1] = '\0';
+ strncpy(dest, target, dest_size - 1);
+ return 0;
+ }
+ while (base[i] == target[i]) {
+ i++;
+ }
+ p = &base[i];
+ q = &target[i];
+ while (*p) {
+ if (*p == *sep) {
+ n++;
+ }
+ p++;
+ }
+ dest[0] = '\0';
+ for (; n; n--) {
+ pstrcat(dest, dest_size, "..");
+ pstrcat(dest, dest_size, sep);
+ }
+ pstrcat(dest, dest_size, q);
+ return 0;
+}
+
+static int vmdk_create(const char *filename, QEMUOptionParameter *options)
+{
+ int fd, idx = 0;
+ char desc[BUF_SIZE];
+ int64_t total_size = 0, filesize;
+ const char *backing_file = NULL;
+ const char *fmt = NULL;
+ int flags = 0;
+ int ret = 0;
+ bool flat, split;
+ char ext_desc_lines[BUF_SIZE] = "";
+ char path[PATH_MAX], prefix[PATH_MAX], postfix[PATH_MAX];
+ const int64_t split_size = 0x80000000; /* VMDK has constant split size */
+ const char *desc_extent_line;
+ char parent_desc_line[BUF_SIZE] = "";
+ uint32_t parent_cid = 0xffffffff;
+ const char desc_template[] =
+ "# Disk DescriptorFile\n"
+ "version=1\n"
+ "CID=%x\n"
+ "parentCID=%x\n"
+ "createType=\"%s\"\n"
+ "%s"
+ "\n"
+ "# Extent description\n"
+ "%s"
+ "\n"
+ "# The Disk Data Base\n"
+ "#DDB\n"
+ "\n"
+ "ddb.virtualHWVersion = \"%d\"\n"
+ "ddb.geometry.cylinders = \"%" PRId64 "\"\n"
+ "ddb.geometry.heads = \"16\"\n"
+ "ddb.geometry.sectors = \"63\"\n"
+ "ddb.adapterType = \"ide\"\n";
+
+ if (filename_decompose(filename, path, prefix, postfix, PATH_MAX)) {
+ return -EINVAL;
+ }
+ /* Read out options */
+ while (options && options->name) {
+ if (!strcmp(options->name, BLOCK_OPT_SIZE)) {
+ total_size = options->value.n;
+ } else if (!strcmp(options->name, BLOCK_OPT_BACKING_FILE)) {
+ backing_file = options->value.s;
+ } else if (!strcmp(options->name, BLOCK_OPT_COMPAT6)) {
+ flags |= options->value.n ? BLOCK_FLAG_COMPAT6 : 0;
+ } else if (!strcmp(options->name, BLOCK_OPT_SUBFMT)) {
+ fmt = options->value.s;
+ }
+ options++;
+ }
+ if (!fmt) {
+ /* Default format to monolithicSparse */
+ fmt = "monolithicSparse";
+ } else if (strcmp(fmt, "monolithicFlat") &&
+ strcmp(fmt, "monolithicSparse") &&
+ strcmp(fmt, "twoGbMaxExtentSparse") &&
+ strcmp(fmt, "twoGbMaxExtentFlat")) {
+ fprintf(stderr, "VMDK: Unknown subformat: %s\n", fmt);
+ return -EINVAL;
+ }
+ split = !(strcmp(fmt, "twoGbMaxExtentFlat") &&
+ strcmp(fmt, "twoGbMaxExtentSparse"));
+ flat = !(strcmp(fmt, "monolithicFlat") &&
+ strcmp(fmt, "twoGbMaxExtentFlat"));
+ if (flat) {
+ desc_extent_line = "RW %lld FLAT \"%s\" 0\n";
+ } else {
+ desc_extent_line = "RW %lld SPARSE \"%s\"\n";
+ }
+ if (flat && backing_file) {
+ /* not supporting backing file for flat image */
+ return -ENOTSUP;
+ }
+ if (backing_file) {
+ char parent_filename[PATH_MAX];
+ BlockDriverState *bs = bdrv_new("");
+ ret = bdrv_open(bs, backing_file, 0, NULL);
+ if (ret != 0) {
+ bdrv_delete(bs);
+ return ret;
+ }
+ if (strcmp(bs->drv->format_name, "vmdk")) {
+ bdrv_delete(bs);
+ return -EINVAL;
+ }
+ filesize = bdrv_getlength(bs);
+ parent_cid = vmdk_read_cid(bs, 0);
+ bdrv_delete(bs);
+ relative_path(parent_filename, sizeof(parent_filename),
+ filename, backing_file);
+ snprintf(parent_desc_line, sizeof(parent_desc_line),
+ "parentFileNameHint=\"%s\"", parent_filename);
+ }
+
+ /* Create extents */
+ filesize = total_size;
+ while (filesize > 0) {
+ char desc_line[BUF_SIZE];
+ char ext_filename[PATH_MAX];
+ char desc_filename[PATH_MAX];
+ int64_t size = filesize;
+
+ if (split && size > split_size) {
+ size = split_size;
+ }
+ if (split) {
+ snprintf(desc_filename, sizeof(desc_filename), "%s-%c%03d%s",
+ prefix, flat ? 'f' : 's', ++idx, postfix);
+ } else if (flat) {
+ snprintf(desc_filename, sizeof(desc_filename), "%s-flat%s",
+ prefix, postfix);
+ } else {
+ snprintf(desc_filename, sizeof(desc_filename), "%s%s",
+ prefix, postfix);
+ }
+ snprintf(ext_filename, sizeof(ext_filename), "%s%s",
+ path, desc_filename);
+
+ if (vmdk_create_extent(ext_filename, size, flat)) {
+ return -EINVAL;
+ }
+ filesize -= size;
+
+ /* Format description line */
+ snprintf(desc_line, sizeof(desc_line),
+ desc_extent_line, size / 512, desc_filename);
+ pstrcat(ext_desc_lines, sizeof(ext_desc_lines), desc_line);
+ }
+ /* generate descriptor file */
+ snprintf(desc, sizeof(desc), desc_template,
+ (unsigned int)time(NULL),
+ parent_cid,
+ fmt,
+ parent_desc_line,
+ ext_desc_lines,
+ (flags & BLOCK_FLAG_COMPAT6 ? 6 : 4),
+ total_size / (int64_t)(63 * 16 * 512));
+ if (split || flat) {
+ fd = open(
+ filename,
+ O_WRONLY | O_CREAT | O_TRUNC | O_BINARY | O_LARGEFILE,
+ 0644);
+ } else {
+ fd = open(
+ filename,
+ O_WRONLY | O_BINARY | O_LARGEFILE,
+ 0644);
+ }
+ if (fd < 0) {
+ return -errno;
+ }
+ /* the descriptor offset = 0x200 */
+ if (!split && !flat && 0x200 != lseek(fd, 0x200, SEEK_SET)) {
+ ret = -errno;
+ goto exit;
+ }
+ ret = qemu_write_full(fd, desc, strlen(desc));
+ if (ret != strlen(desc)) {
+ ret = -errno;
+ goto exit;
+ }
+ ret = 0;
+exit:
+ close(fd);
+ return ret;
+}
+
+static void vmdk_close(BlockDriverState *bs)
+{
+ vmdk_free_extents(bs);
+}
+
+static int vmdk_flush(BlockDriverState *bs)
+{
+ int i, ret, err;
+ BDRVVmdkState *s = bs->opaque;
+
+ ret = bdrv_flush(bs->file);
+ for (i = 0; i < s->num_extents; i++) {
+ err = bdrv_flush(s->extents[i].file);
+ if (err < 0) {
+ ret = err;
+ }
+ }
+ return ret;
+}
+
+static int64_t vmdk_get_allocated_file_size(BlockDriverState *bs)
+{
+ int i;
+ int64_t ret = 0;
+ int64_t r;
+ BDRVVmdkState *s = bs->opaque;
+
+ ret = bdrv_get_allocated_file_size(bs->file);
+ if (ret < 0) {
+ return ret;
+ }
+ for (i = 0; i < s->num_extents; i++) {
+ if (s->extents[i].file == bs->file) {
+ continue;
+ }
+ r = bdrv_get_allocated_file_size(s->extents[i].file);
+ if (r < 0) {
+ return r;
+ }
+ ret += r;
+ }
+ return ret;
+}
+
+static QEMUOptionParameter vmdk_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ {
+ .name = BLOCK_OPT_BACKING_FILE,
+ .type = OPT_STRING,
+ .help = "File name of a base image"
+ },
+ {
+ .name = BLOCK_OPT_COMPAT6,
+ .type = OPT_FLAG,
+ .help = "VMDK version 6 image"
+ },
+ {
+ .name = BLOCK_OPT_SUBFMT,
+ .type = OPT_STRING,
+ .help =
+ "VMDK flat extent format, can be one of "
+ "{monolithicSparse (default) | monolithicFlat | twoGbMaxExtentSparse | twoGbMaxExtentFlat} "
+ },
+ { NULL }
+};
+
+static BlockDriver bdrv_vmdk = {
+ .format_name = "vmdk",
+ .instance_size = sizeof(BDRVVmdkState),
+ .bdrv_probe = vmdk_probe,
+ .bdrv_open = vmdk_open,
+ .bdrv_read = vmdk_read,
+ .bdrv_write = vmdk_write,
+ .bdrv_close = vmdk_close,
+ .bdrv_create = vmdk_create,
+ .bdrv_flush = vmdk_flush,
+ .bdrv_is_allocated = vmdk_is_allocated,
+ .bdrv_get_allocated_file_size = vmdk_get_allocated_file_size,
+
+ .create_options = vmdk_create_options,
+};
+
+static void bdrv_vmdk_init(void)
+{
+ bdrv_register(&bdrv_vmdk);
+}
+
+block_init(bdrv_vmdk_init);
diff --git a/qemu-0.15.x/block/vpc.c b/qemu-0.15.x/block/vpc.c
new file mode 100644
index 0000000..56865da
--- /dev/null
+++ b/qemu-0.15.x/block/vpc.c
@@ -0,0 +1,650 @@
+/*
+ * Block driver for Connectix / Microsoft Virtual PC images
+ *
+ * Copyright (c) 2005 Alex Beregszaszi
+ * Copyright (c) 2009 Kevin Wolf <kwolf(a)suse.de>
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+
+/**************************************************************/
+
+#define HEADER_SIZE 512
+
+//#define CACHE
+
+enum vhd_type {
+ VHD_FIXED = 2,
+ VHD_DYNAMIC = 3,
+ VHD_DIFFERENCING = 4,
+};
+
+// Seconds since Jan 1, 2000 0:00:00 (UTC)
+#define VHD_TIMESTAMP_BASE 946684800
+
+// always big-endian
+struct vhd_footer {
+ char creator[8]; // "conectix"
+ uint32_t features;
+ uint32_t version;
+
+ // Offset of next header structure, 0xFFFFFFFF if none
+ uint64_t data_offset;
+
+ // Seconds since Jan 1, 2000 0:00:00 (UTC)
+ uint32_t timestamp;
+
+ char creator_app[4]; // "vpc "
+ uint16_t major;
+ uint16_t minor;
+ char creator_os[4]; // "Wi2k"
+
+ uint64_t orig_size;
+ uint64_t size;
+
+ uint16_t cyls;
+ uint8_t heads;
+ uint8_t secs_per_cyl;
+
+ uint32_t type;
+
+ // Checksum of the Hard Disk Footer ("one's complement of the sum of all
+ // the bytes in the footer without the checksum field")
+ uint32_t checksum;
+
+ // UUID used to identify a parent hard disk (backing file)
+ uint8_t uuid[16];
+
+ uint8_t in_saved_state;
+};
+
+struct vhd_dyndisk_header {
+ char magic[8]; // "cxsparse"
+
+ // Offset of next header structure, 0xFFFFFFFF if none
+ uint64_t data_offset;
+
+ // Offset of the Block Allocation Table (BAT)
+ uint64_t table_offset;
+
+ uint32_t version;
+ uint32_t max_table_entries; // 32bit/entry
+
+ // 2 MB by default, must be a power of two
+ uint32_t block_size;
+
+ uint32_t checksum;
+ uint8_t parent_uuid[16];
+ uint32_t parent_timestamp;
+ uint32_t reserved;
+
+ // Backing file name (in UTF-16)
+ uint8_t parent_name[512];
+
+ struct {
+ uint32_t platform;
+ uint32_t data_space;
+ uint32_t data_length;
+ uint32_t reserved;
+ uint64_t data_offset;
+ } parent_locator[8];
+};
+
+typedef struct BDRVVPCState {
+ uint8_t footer_buf[HEADER_SIZE];
+ uint64_t free_data_block_offset;
+ int max_table_entries;
+ uint32_t *pagetable;
+ uint64_t bat_offset;
+ uint64_t last_bitmap_offset;
+
+ uint32_t block_size;
+ uint32_t bitmap_size;
+
+#ifdef CACHE
+ uint8_t *pageentry_u8;
+ uint32_t *pageentry_u32;
+ uint16_t *pageentry_u16;
+
+ uint64_t last_bitmap;
+#endif
+} BDRVVPCState;
+
+static uint32_t vpc_checksum(uint8_t* buf, size_t size)
+{
+ uint32_t res = 0;
+ int i;
+
+ for (i = 0; i < size; i++)
+ res += buf[i];
+
+ return ~res;
+}
+
+
+static int vpc_probe(const uint8_t *buf, int buf_size, const char *filename)
+{
+ if (buf_size >= 8 && !strncmp((char *)buf, "conectix", 8))
+ return 100;
+ return 0;
+}
+
+static int vpc_open(BlockDriverState *bs, int flags)
+{
+ BDRVVPCState *s = bs->opaque;
+ int i;
+ struct vhd_footer* footer;
+ struct vhd_dyndisk_header* dyndisk_header;
+ uint8_t buf[HEADER_SIZE];
+ uint32_t checksum;
+
+ if (bdrv_pread(bs->file, 0, s->footer_buf, HEADER_SIZE) != HEADER_SIZE)
+ goto fail;
+
+ footer = (struct vhd_footer*) s->footer_buf;
+ if (strncmp(footer->creator, "conectix", 8))
+ goto fail;
+
+ checksum = be32_to_cpu(footer->checksum);
+ footer->checksum = 0;
+ if (vpc_checksum(s->footer_buf, HEADER_SIZE) != checksum)
+ fprintf(stderr, "block-vpc: The header checksum of '%s' is "
+ "incorrect.\n", bs->filename);
+
+ // The visible size of a image in Virtual PC depends on the geometry
+ // rather than on the size stored in the footer (the size in the footer
+ // is too large usually)
+ bs->total_sectors = (int64_t)
+ be16_to_cpu(footer->cyls) * footer->heads * footer->secs_per_cyl;
+
+ if (bdrv_pread(bs->file, be64_to_cpu(footer->data_offset), buf, HEADER_SIZE)
+ != HEADER_SIZE)
+ goto fail;
+
+ dyndisk_header = (struct vhd_dyndisk_header*) buf;
+
+ if (strncmp(dyndisk_header->magic, "cxsparse", 8))
+ goto fail;
+
+
+ s->block_size = be32_to_cpu(dyndisk_header->block_size);
+ s->bitmap_size = ((s->block_size / (8 * 512)) + 511) & ~511;
+
+ s->max_table_entries = be32_to_cpu(dyndisk_header->max_table_entries);
+ s->pagetable = qemu_malloc(s->max_table_entries * 4);
+
+ s->bat_offset = be64_to_cpu(dyndisk_header->table_offset);
+ if (bdrv_pread(bs->file, s->bat_offset, s->pagetable,
+ s->max_table_entries * 4) != s->max_table_entries * 4)
+ goto fail;
+
+ s->free_data_block_offset =
+ (s->bat_offset + (s->max_table_entries * 4) + 511) & ~511;
+
+ for (i = 0; i < s->max_table_entries; i++) {
+ be32_to_cpus(&s->pagetable[i]);
+ if (s->pagetable[i] != 0xFFFFFFFF) {
+ int64_t next = (512 * (int64_t) s->pagetable[i]) +
+ s->bitmap_size + s->block_size;
+
+ if (next> s->free_data_block_offset)
+ s->free_data_block_offset = next;
+ }
+ }
+
+ s->last_bitmap_offset = (int64_t) -1;
+
+#ifdef CACHE
+ s->pageentry_u8 = qemu_malloc(512);
+ s->pageentry_u32 = s->pageentry_u8;
+ s->pageentry_u16 = s->pageentry_u8;
+ s->last_pagetable = -1;
+#endif
+
+ return 0;
+ fail:
+ return -1;
+}
+
+/*
+ * Returns the absolute byte offset of the given sector in the image file.
+ * If the sector is not allocated, -1 is returned instead.
+ *
+ * The parameter write must be 1 if the offset will be used for a write
+ * operation (the block bitmaps is updated then), 0 otherwise.
+ */
+static inline int64_t get_sector_offset(BlockDriverState *bs,
+ int64_t sector_num, int write)
+{
+ BDRVVPCState *s = bs->opaque;
+ uint64_t offset = sector_num * 512;
+ uint64_t bitmap_offset, block_offset;
+ uint32_t pagetable_index, pageentry_index;
+
+ pagetable_index = offset / s->block_size;
+ pageentry_index = (offset % s->block_size) / 512;
+
+ if (pagetable_index >= s->max_table_entries || s->pagetable[pagetable_index] == 0xffffffff)
+ return -1; // not allocated
+
+ bitmap_offset = 512 * (uint64_t) s->pagetable[pagetable_index];
+ block_offset = bitmap_offset + s->bitmap_size + (512 * pageentry_index);
+
+ // We must ensure that we don't write to any sectors which are marked as
+ // unused in the bitmap. We get away with setting all bits in the block
+ // bitmap each time we write to a new block. This might cause Virtual PC to
+ // miss sparse read optimization, but it's not a problem in terms of
+ // correctness.
+ if (write && (s->last_bitmap_offset != bitmap_offset)) {
+ uint8_t bitmap[s->bitmap_size];
+
+ s->last_bitmap_offset = bitmap_offset;
+ memset(bitmap, 0xff, s->bitmap_size);
+ bdrv_pwrite_sync(bs->file, bitmap_offset, bitmap, s->bitmap_size);
+ }
+
+// printf("sector: %" PRIx64 ", index: %x, offset: %x, bioff: %" PRIx64 ", bloff: %" PRIx64 "\n",
+// sector_num, pagetable_index, pageentry_index,
+// bitmap_offset, block_offset);
+
+// disabled by reason
+#if 0
+#ifdef CACHE
+ if (bitmap_offset != s->last_bitmap)
+ {
+ lseek(s->fd, bitmap_offset, SEEK_SET);
+
+ s->last_bitmap = bitmap_offset;
+
+ // Scary! Bitmap is stored as big endian 32bit entries,
+ // while we used to look it up byte by byte
+ read(s->fd, s->pageentry_u8, 512);
+ for (i = 0; i < 128; i++)
+ be32_to_cpus(&s->pageentry_u32[i]);
+ }
+
+ if ((s->pageentry_u8[pageentry_index / 8] >> (pageentry_index % 8)) & 1)
+ return -1;
+#else
+ lseek(s->fd, bitmap_offset + (pageentry_index / 8), SEEK_SET);
+
+ read(s->fd, &bitmap_entry, 1);
+
+ if ((bitmap_entry >> (pageentry_index % 8)) & 1)
+ return -1; // not allocated
+#endif
+#endif
+
+ return block_offset;
+}
+
+/*
+ * Writes the footer to the end of the image file. This is needed when the
+ * file grows as it overwrites the old footer
+ *
+ * Returns 0 on success and < 0 on error
+ */
+static int rewrite_footer(BlockDriverState* bs)
+{
+ int ret;
+ BDRVVPCState *s = bs->opaque;
+ int64_t offset = s->free_data_block_offset;
+
+ ret = bdrv_pwrite_sync(bs->file, offset, s->footer_buf, HEADER_SIZE);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+}
+
+/*
+ * Allocates a new block. This involves writing a new footer and updating
+ * the Block Allocation Table to use the space at the old end of the image
+ * file (overwriting the old footer)
+ *
+ * Returns the sectors' offset in the image file on success and < 0 on error
+ */
+static int64_t alloc_block(BlockDriverState* bs, int64_t sector_num)
+{
+ BDRVVPCState *s = bs->opaque;
+ int64_t bat_offset;
+ uint32_t index, bat_value;
+ int ret;
+ uint8_t bitmap[s->bitmap_size];
+
+ // Check if sector_num is valid
+ if ((sector_num < 0) || (sector_num > bs->total_sectors))
+ return -1;
+
+ // Write entry into in-memory BAT
+ index = (sector_num * 512) / s->block_size;
+ if (s->pagetable[index] != 0xFFFFFFFF)
+ return -1;
+
+ s->pagetable[index] = s->free_data_block_offset / 512;
+
+ // Initialize the block's bitmap
+ memset(bitmap, 0xff, s->bitmap_size);
+ bdrv_pwrite_sync(bs->file, s->free_data_block_offset, bitmap,
+ s->bitmap_size);
+
+ // Write new footer (the old one will be overwritten)
+ s->free_data_block_offset += s->block_size + s->bitmap_size;
+ ret = rewrite_footer(bs);
+ if (ret < 0)
+ goto fail;
+
+ // Write BAT entry to disk
+ bat_offset = s->bat_offset + (4 * index);
+ bat_value = be32_to_cpu(s->pagetable[index]);
+ ret = bdrv_pwrite_sync(bs->file, bat_offset, &bat_value, 4);
+ if (ret < 0)
+ goto fail;
+
+ return get_sector_offset(bs, sector_num, 0);
+
+fail:
+ s->free_data_block_offset -= (s->block_size + s->bitmap_size);
+ return -1;
+}
+
+static int vpc_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVVPCState *s = bs->opaque;
+ int ret;
+ int64_t offset;
+ int64_t sectors, sectors_per_block;
+
+ while (nb_sectors > 0) {
+ offset = get_sector_offset(bs, sector_num, 0);
+
+ sectors_per_block = s->block_size >> BDRV_SECTOR_BITS;
+ sectors = sectors_per_block - (sector_num % sectors_per_block);
+ if (sectors > nb_sectors) {
+ sectors = nb_sectors;
+ }
+
+ if (offset == -1) {
+ memset(buf, 0, sectors * BDRV_SECTOR_SIZE);
+ } else {
+ ret = bdrv_pread(bs->file, offset, buf,
+ sectors * BDRV_SECTOR_SIZE);
+ if (ret != sectors * BDRV_SECTOR_SIZE) {
+ return -1;
+ }
+ }
+
+ nb_sectors -= sectors;
+ sector_num += sectors;
+ buf += sectors * BDRV_SECTOR_SIZE;
+ }
+ return 0;
+}
+
+static int vpc_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BDRVVPCState *s = bs->opaque;
+ int64_t offset;
+ int64_t sectors, sectors_per_block;
+ int ret;
+
+ while (nb_sectors > 0) {
+ offset = get_sector_offset(bs, sector_num, 1);
+
+ sectors_per_block = s->block_size >> BDRV_SECTOR_BITS;
+ sectors = sectors_per_block - (sector_num % sectors_per_block);
+ if (sectors > nb_sectors) {
+ sectors = nb_sectors;
+ }
+
+ if (offset == -1) {
+ offset = alloc_block(bs, sector_num);
+ if (offset < 0)
+ return -1;
+ }
+
+ ret = bdrv_pwrite(bs->file, offset, buf, sectors * BDRV_SECTOR_SIZE);
+ if (ret != sectors * BDRV_SECTOR_SIZE) {
+ return -1;
+ }
+
+ nb_sectors -= sectors;
+ sector_num += sectors;
+ buf += sectors * BDRV_SECTOR_SIZE;
+ }
+
+ return 0;
+}
+
+static int vpc_flush(BlockDriverState *bs)
+{
+ return bdrv_flush(bs->file);
+}
+
+/*
+ * Calculates the number of cylinders, heads and sectors per cylinder
+ * based on a given number of sectors. This is the algorithm described
+ * in the VHD specification.
+ *
+ * Note that the geometry doesn't always exactly match total_sectors but
+ * may round it down.
+ *
+ * Returns 0 on success, -EFBIG if the size is larger than 127 GB
+ */
+static int calculate_geometry(int64_t total_sectors, uint16_t* cyls,
+ uint8_t* heads, uint8_t* secs_per_cyl)
+{
+ uint32_t cyls_times_heads;
+
+ if (total_sectors > 65535 * 16 * 255)
+ return -EFBIG;
+
+ if (total_sectors > 65535 * 16 * 63) {
+ *secs_per_cyl = 255;
+ *heads = 16;
+ cyls_times_heads = total_sectors / *secs_per_cyl;
+ } else {
+ *secs_per_cyl = 17;
+ cyls_times_heads = total_sectors / *secs_per_cyl;
+ *heads = (cyls_times_heads + 1023) / 1024;
+
+ if (*heads < 4)
+ *heads = 4;
+
+ if (cyls_times_heads >= (*heads * 1024) || *heads > 16) {
+ *secs_per_cyl = 31;
+ *heads = 16;
+ cyls_times_heads = total_sectors / *secs_per_cyl;
+ }
+
+ if (cyls_times_heads >= (*heads * 1024)) {
+ *secs_per_cyl = 63;
+ *heads = 16;
+ cyls_times_heads = total_sectors / *secs_per_cyl;
+ }
+ }
+
+ *cyls = cyls_times_heads / *heads;
+
+ return 0;
+}
+
+static int vpc_create(const char *filename, QEMUOptionParameter *options)
+{
+ uint8_t buf[1024];
+ struct vhd_footer* footer = (struct vhd_footer*) buf;
+ struct vhd_dyndisk_header* dyndisk_header =
+ (struct vhd_dyndisk_header*) buf;
+ int fd, i;
+ uint16_t cyls = 0;
+ uint8_t heads = 0;
+ uint8_t secs_per_cyl = 0;
+ size_t block_size, num_bat_entries;
+ int64_t total_sectors = 0;
+ int ret = -EIO;
+
+ // Read out options
+ total_sectors = get_option_parameter(options, BLOCK_OPT_SIZE)->value.n /
+ BDRV_SECTOR_SIZE;
+
+ // Create the file
+ fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644);
+ if (fd < 0)
+ return -EIO;
+
+ /* Calculate matching total_size and geometry. Increase the number of
+ sectors requested until we get enough (or fail). */
+ for (i = 0; total_sectors > (int64_t)cyls * heads * secs_per_cyl; i++) {
+ if (calculate_geometry(total_sectors + i,
+ &cyls, &heads, &secs_per_cyl)) {
+ ret = -EFBIG;
+ goto fail;
+ }
+ }
+ total_sectors = (int64_t) cyls * heads * secs_per_cyl;
+
+ // Prepare the Hard Disk Footer
+ memset(buf, 0, 1024);
+
+ memcpy(footer->creator, "conectix", 8);
+ // TODO Check if "qemu" creator_app is ok for VPC
+ memcpy(footer->creator_app, "qemu", 4);
+ memcpy(footer->creator_os, "Wi2k", 4);
+
+ footer->features = be32_to_cpu(0x02);
+ footer->version = be32_to_cpu(0x00010000);
+ footer->data_offset = be64_to_cpu(HEADER_SIZE);
+ footer->timestamp = be32_to_cpu(time(NULL) - VHD_TIMESTAMP_BASE);
+
+ // Version of Virtual PC 2007
+ footer->major = be16_to_cpu(0x0005);
+ footer->minor =be16_to_cpu(0x0003);
+
+ footer->orig_size = be64_to_cpu(total_sectors * 512);
+ footer->size = be64_to_cpu(total_sectors * 512);
+
+ footer->cyls = be16_to_cpu(cyls);
+ footer->heads = heads;
+ footer->secs_per_cyl = secs_per_cyl;
+
+ footer->type = be32_to_cpu(VHD_DYNAMIC);
+
+ // TODO uuid is missing
+
+ footer->checksum = be32_to_cpu(vpc_checksum(buf, HEADER_SIZE));
+
+ // Write the footer (twice: at the beginning and at the end)
+ block_size = 0x200000;
+ num_bat_entries = (total_sectors + block_size / 512) / (block_size / 512);
+
+ if (write(fd, buf, HEADER_SIZE) != HEADER_SIZE) {
+ goto fail;
+ }
+
+ if (lseek(fd, 1536 + ((num_bat_entries * 4 + 511) & ~511), SEEK_SET) < 0) {
+ goto fail;
+ }
+ if (write(fd, buf, HEADER_SIZE) != HEADER_SIZE) {
+ goto fail;
+ }
+
+ // Write the initial BAT
+ if (lseek(fd, 3 * 512, SEEK_SET) < 0) {
+ goto fail;
+ }
+
+ memset(buf, 0xFF, 512);
+ for (i = 0; i < (num_bat_entries * 4 + 511) / 512; i++) {
+ if (write(fd, buf, 512) != 512) {
+ goto fail;
+ }
+ }
+
+
+ // Prepare the Dynamic Disk Header
+ memset(buf, 0, 1024);
+
+ memcpy(dyndisk_header->magic, "cxsparse", 8);
+
+ dyndisk_header->data_offset = be64_to_cpu(0xFFFFFFFF);
+ dyndisk_header->table_offset = be64_to_cpu(3 * 512);
+ dyndisk_header->version = be32_to_cpu(0x00010000);
+ dyndisk_header->block_size = be32_to_cpu(block_size);
+ dyndisk_header->max_table_entries = be32_to_cpu(num_bat_entries);
+
+ dyndisk_header->checksum = be32_to_cpu(vpc_checksum(buf, 1024));
+
+ // Write the header
+ if (lseek(fd, 512, SEEK_SET) < 0) {
+ goto fail;
+ }
+
+ if (write(fd, buf, 1024) != 1024) {
+ goto fail;
+ }
+ ret = 0;
+
+ fail:
+ close(fd);
+ return ret;
+}
+
+static void vpc_close(BlockDriverState *bs)
+{
+ BDRVVPCState *s = bs->opaque;
+ qemu_free(s->pagetable);
+#ifdef CACHE
+ qemu_free(s->pageentry_u8);
+#endif
+}
+
+static QEMUOptionParameter vpc_create_options[] = {
+ {
+ .name = BLOCK_OPT_SIZE,
+ .type = OPT_SIZE,
+ .help = "Virtual disk size"
+ },
+ { NULL }
+};
+
+static BlockDriver bdrv_vpc = {
+ .format_name = "vpc",
+ .instance_size = sizeof(BDRVVPCState),
+ .bdrv_probe = vpc_probe,
+ .bdrv_open = vpc_open,
+ .bdrv_read = vpc_read,
+ .bdrv_write = vpc_write,
+ .bdrv_flush = vpc_flush,
+ .bdrv_close = vpc_close,
+ .bdrv_create = vpc_create,
+
+ .create_options = vpc_create_options,
+};
+
+static void bdrv_vpc_init(void)
+{
+ bdrv_register(&bdrv_vpc);
+}
+
+block_init(bdrv_vpc_init);
diff --git a/qemu-0.15.x/block/vvfat.c b/qemu-0.15.x/block/vvfat.c
new file mode 100644
index 0000000..fe568fe
--- /dev/null
+++ b/qemu-0.15.x/block/vvfat.c
@@ -0,0 +1,2888 @@
+/* vim:set shiftwidth=4 ts=8: */
+/*
+ * QEMU Block driver for virtual VFAT (shadows a local directory)
+ *
+ * Copyright (c) 2004,2005 Johannes E. Schindelin
+ *
+ * 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.
+ */
+#include <sys/stat.h>
+#include <dirent.h>
+#include "qemu-common.h"
+#include "block_int.h"
+#include "module.h"
+
+#ifndef S_IWGRP
+#define S_IWGRP 0
+#endif
+#ifndef S_IWOTH
+#define S_IWOTH 0
+#endif
+
+/* TODO: add ":bootsector=blabla.img:" */
+/* LATER TODO: add automatic boot sector generation from
+ BOOTEASY.ASM and Ranish Partition Manager
+ Note that DOS assumes the system files to be the first files in the
+ file system (test if the boot sector still relies on that fact)! */
+/* MAYBE TODO: write block-visofs.c */
+/* TODO: call try_commit() only after a timeout */
+
+/* #define DEBUG */
+
+#ifdef DEBUG
+
+#define DLOG(a) a
+
+#undef stderr
+#define stderr STDERR
+FILE* stderr = NULL;
+
+static void checkpoint(void);
+
+#ifdef __MINGW32__
+void nonono(const char* file, int line, const char* msg) {
+ fprintf(stderr, "Nonono! %s:%d %s\n", file, line, msg);
+ exit(-5);
+}
+#undef assert
+#define assert(a) do {if (!(a)) nonono(__FILE__, __LINE__, #a);}while(0)
+#endif
+
+#else
+
+#define DLOG(a)
+
+#endif
+
+/* dynamic array functions */
+typedef struct array_t {
+ char* pointer;
+ unsigned int size,next,item_size;
+} array_t;
+
+static inline void array_init(array_t* array,unsigned int item_size)
+{
+ array->pointer = NULL;
+ array->size=0;
+ array->next=0;
+ array->item_size=item_size;
+}
+
+static inline void array_free(array_t* array)
+{
+ if(array->pointer)
+ free(array->pointer);
+ array->size=array->next=0;
+}
+
+/* does not automatically grow */
+static inline void* array_get(array_t* array,unsigned int index) {
+ assert(index < array->next);
+ return array->pointer + index * array->item_size;
+}
+
+static inline int array_ensure_allocated(array_t* array, int index)
+{
+ if((index + 1) * array->item_size > array->size) {
+ int new_size = (index + 32) * array->item_size;
+ array->pointer = qemu_realloc(array->pointer, new_size);
+ if (!array->pointer)
+ return -1;
+ array->size = new_size;
+ array->next = index + 1;
+ }
+
+ return 0;
+}
+
+static inline void* array_get_next(array_t* array) {
+ unsigned int next = array->next;
+ void* result;
+
+ if (array_ensure_allocated(array, next) < 0)
+ return NULL;
+
+ array->next = next + 1;
+ result = array_get(array, next);
+
+ return result;
+}
+
+static inline void* array_insert(array_t* array,unsigned int index,unsigned int count) {
+ if((array->next+count)*array->item_size>array->size) {
+ int increment=count*array->item_size;
+ array->pointer=qemu_realloc(array->pointer,array->size+increment);
+ if(!array->pointer)
+ return NULL;
+ array->size+=increment;
+ }
+ memmove(array->pointer+(index+count)*array->item_size,
+ array->pointer+index*array->item_size,
+ (array->next-index)*array->item_size);
+ array->next+=count;
+ return array->pointer+index*array->item_size;
+}
+
+/* this performs a "roll", so that the element which was at index_from becomes
+ * index_to, but the order of all other elements is preserved. */
+static inline int array_roll(array_t* array,int index_to,int index_from,int count)
+{
+ char* buf;
+ char* from;
+ char* to;
+ int is;
+
+ if(!array ||
+ index_to<0 || index_to>=array->next ||
+ index_from<0 || index_from>=array->next)
+ return -1;
+
+ if(index_to==index_from)
+ return 0;
+
+ is=array->item_size;
+ from=array->pointer+index_from*is;
+ to=array->pointer+index_to*is;
+ buf=qemu_malloc(is*count);
+ memcpy(buf,from,is*count);
+
+ if(index_to<index_from)
+ memmove(to+is*count,to,from-to);
+ else
+ memmove(from,from+is*count,to-from);
+
+ memcpy(to,buf,is*count);
+
+ free(buf);
+
+ return 0;
+}
+
+static inline int array_remove_slice(array_t* array,int index, int count)
+{
+ assert(index >=0);
+ assert(count > 0);
+ assert(index + count <= array->next);
+ if(array_roll(array,array->next-1,index,count))
+ return -1;
+ array->next -= count;
+ return 0;
+}
+
+static int array_remove(array_t* array,int index)
+{
+ return array_remove_slice(array, index, 1);
+}
+
+/* return the index for a given member */
+static int array_index(array_t* array, void* pointer)
+{
+ size_t offset = (char*)pointer - array->pointer;
+ assert((offset % array->item_size) == 0);
+ assert(offset/array->item_size < array->next);
+ return offset/array->item_size;
+}
+
+/* These structures are used to fake a disk and the VFAT filesystem.
+ * For this reason we need to use __attribute__((packed)). */
+
+typedef struct bootsector_t {
+ uint8_t jump[3];
+ uint8_t name[8];
+ uint16_t sector_size;
+ uint8_t sectors_per_cluster;
+ uint16_t reserved_sectors;
+ uint8_t number_of_fats;
+ uint16_t root_entries;
+ uint16_t total_sectors16;
+ uint8_t media_type;
+ uint16_t sectors_per_fat;
+ uint16_t sectors_per_track;
+ uint16_t number_of_heads;
+ uint32_t hidden_sectors;
+ uint32_t total_sectors;
+ union {
+ struct {
+ uint8_t drive_number;
+ uint8_t current_head;
+ uint8_t signature;
+ uint32_t id;
+ uint8_t volume_label[11];
+ } __attribute__((packed)) fat16;
+ struct {
+ uint32_t sectors_per_fat;
+ uint16_t flags;
+ uint8_t major,minor;
+ uint32_t first_cluster_of_root_directory;
+ uint16_t info_sector;
+ uint16_t backup_boot_sector;
+ uint16_t ignored;
+ } __attribute__((packed)) fat32;
+ } u;
+ uint8_t fat_type[8];
+ uint8_t ignored[0x1c0];
+ uint8_t magic[2];
+} __attribute__((packed)) bootsector_t;
+
+typedef struct {
+ uint8_t head;
+ uint8_t sector;
+ uint8_t cylinder;
+} mbr_chs_t;
+
+typedef struct partition_t {
+ uint8_t attributes; /* 0x80 = bootable */
+ mbr_chs_t start_CHS;
+ uint8_t fs_type; /* 0x1 = FAT12, 0x6 = FAT16, 0xe = FAT16_LBA, 0xb = FAT32, 0xc = FAT32_LBA */
+ mbr_chs_t end_CHS;
+ uint32_t start_sector_long;
+ uint32_t length_sector_long;
+} __attribute__((packed)) partition_t;
+
+typedef struct mbr_t {
+ uint8_t ignored[0x1b8];
+ uint32_t nt_id;
+ uint8_t ignored2[2];
+ partition_t partition[4];
+ uint8_t magic[2];
+} __attribute__((packed)) mbr_t;
+
+typedef struct direntry_t {
+ uint8_t name[8];
+ uint8_t extension[3];
+ uint8_t attributes;
+ uint8_t reserved[2];
+ uint16_t ctime;
+ uint16_t cdate;
+ uint16_t adate;
+ uint16_t begin_hi;
+ uint16_t mtime;
+ uint16_t mdate;
+ uint16_t begin;
+ uint32_t size;
+} __attribute__((packed)) direntry_t;
+
+/* this structure are used to transparently access the files */
+
+typedef struct mapping_t {
+ /* begin is the first cluster, end is the last+1 */
+ uint32_t begin,end;
+ /* as s->directory is growable, no pointer may be used here */
+ unsigned int dir_index;
+ /* the clusters of a file may be in any order; this points to the first */
+ int first_mapping_index;
+ union {
+ /* offset is
+ * - the offset in the file (in clusters) for a file, or
+ * - the next cluster of the directory for a directory, and
+ * - the address of the buffer for a faked entry
+ */
+ struct {
+ uint32_t offset;
+ } file;
+ struct {
+ int parent_mapping_index;
+ int first_dir_index;
+ } dir;
+ } info;
+ /* path contains the full path, i.e. it always starts with s->path */
+ char* path;
+
+ enum { MODE_UNDEFINED = 0, MODE_NORMAL = 1, MODE_MODIFIED = 2,
+ MODE_DIRECTORY = 4, MODE_FAKED = 8,
+ MODE_DELETED = 16, MODE_RENAMED = 32 } mode;
+ int read_only;
+} mapping_t;
+
+#ifdef DEBUG
+static void print_direntry(const struct direntry_t*);
+static void print_mapping(const struct mapping_t* mapping);
+#endif
+
+/* here begins the real VVFAT driver */
+
+typedef struct BDRVVVFATState {
+ BlockDriverState* bs; /* pointer to parent */
+ unsigned int first_sectors_number; /* 1 for a single partition, 0x40 for a disk with partition table */
+ unsigned char first_sectors[0x40*0x200];
+
+ int fat_type; /* 16 or 32 */
+ array_t fat,directory,mapping;
+
+ unsigned int cluster_size;
+ unsigned int sectors_per_cluster;
+ unsigned int sectors_per_fat;
+ unsigned int sectors_of_root_directory;
+ uint32_t last_cluster_of_root_directory;
+ unsigned int faked_sectors; /* how many sectors are faked before file data */
+ uint32_t sector_count; /* total number of sectors of the partition */
+ uint32_t cluster_count; /* total number of clusters of this partition */
+ uint32_t max_fat_value;
+
+ int current_fd;
+ mapping_t* current_mapping;
+ unsigned char* cluster; /* points to current cluster */
+ unsigned char* cluster_buffer; /* points to a buffer to hold temp data */
+ unsigned int current_cluster;
+
+ /* write support */
+ BlockDriverState* write_target;
+ char* qcow_filename;
+ BlockDriverState* qcow;
+ void* fat2;
+ char* used_clusters;
+ array_t commits;
+ const char* path;
+ int downcase_short_names;
+} BDRVVVFATState;
+
+/* take the sector position spos and convert it to Cylinder/Head/Sector position
+ * if the position is outside the specified geometry, fill maximum value for CHS
+ * and return 1 to signal overflow.
+ */
+static int sector2CHS(BlockDriverState* bs, mbr_chs_t * chs, int spos){
+ int head,sector;
+ sector = spos % (bs->secs); spos/= bs->secs;
+ head = spos % (bs->heads); spos/= bs->heads;
+ if(spos >= bs->cyls){
+ /* Overflow,
+ it happens if 32bit sector positions are used, while CHS is only 24bit.
+ Windows/Dos is said to take 1023/255/63 as nonrepresentable CHS */
+ chs->head = 0xFF;
+ chs->sector = 0xFF;
+ chs->cylinder = 0xFF;
+ return 1;
+ }
+ chs->head = (uint8_t)head;
+ chs->sector = (uint8_t)( (sector+1) | ((spos>>8)<<6) );
+ chs->cylinder = (uint8_t)spos;
+ return 0;
+}
+
+static void init_mbr(BDRVVVFATState* s)
+{
+ /* TODO: if the files mbr.img and bootsect.img exist, use them */
+ mbr_t* real_mbr=(mbr_t*)s->first_sectors;
+ partition_t* partition = &(real_mbr->partition[0]);
+ int lba;
+
+ memset(s->first_sectors,0,512);
+
+ /* Win NT Disk Signature */
+ real_mbr->nt_id= cpu_to_le32(0xbe1afdfa);
+
+ partition->attributes=0x80; /* bootable */
+
+ /* LBA is used when partition is outside the CHS geometry */
+ lba = sector2CHS(s->bs, &partition->start_CHS, s->first_sectors_number-1);
+ lba|= sector2CHS(s->bs, &partition->end_CHS, s->sector_count);
+
+ /*LBA partitions are identified only by start/length_sector_long not by CHS*/
+ partition->start_sector_long =cpu_to_le32(s->first_sectors_number-1);
+ partition->length_sector_long=cpu_to_le32(s->sector_count - s->first_sectors_number+1);
+
+ /* FAT12/FAT16/FAT32 */
+ /* DOS uses different types when partition is LBA,
+ probably to prevent older versions from using CHS on them */
+ partition->fs_type= s->fat_type==12 ? 0x1:
+ s->fat_type==16 ? (lba?0xe:0x06):
+ /*fat_tyoe==32*/ (lba?0xc:0x0b);
+
+ real_mbr->magic[0]=0x55; real_mbr->magic[1]=0xaa;
+}
+
+/* direntry functions */
+
+/* dest is assumed to hold 258 bytes, and pads with 0xffff up to next multiple of 26 */
+static inline int short2long_name(char* dest,const char* src)
+{
+ int i;
+ int len;
+ for(i=0;i<129 && src[i];i++) {
+ dest[2*i]=src[i];
+ dest[2*i+1]=0;
+ }
+ len=2*i;
+ dest[2*i]=dest[2*i+1]=0;
+ for(i=2*i+2;(i%26);i++)
+ dest[i]=0xff;
+ return len;
+}
+
+static inline direntry_t* create_long_filename(BDRVVVFATState* s,const char* filename)
+{
+ char buffer[258];
+ int length=short2long_name(buffer,filename),
+ number_of_entries=(length+25)/26,i;
+ direntry_t* entry;
+
+ for(i=0;i<number_of_entries;i++) {
+ entry=array_get_next(&(s->directory));
+ entry->attributes=0xf;
+ entry->reserved[0]=0;
+ entry->begin=0;
+ entry->name[0]=(number_of_entries-i)|(i==0?0x40:0);
+ }
+ for(i=0;i<26*number_of_entries;i++) {
+ int offset=(i%26);
+ if(offset<10) offset=1+offset;
+ else if(offset<22) offset=14+offset-10;
+ else offset=28+offset-22;
+ entry=array_get(&(s->directory),s->directory.next-1-(i/26));
+ entry->name[offset]=buffer[i];
+ }
+ return array_get(&(s->directory),s->directory.next-number_of_entries);
+}
+
+static char is_free(const direntry_t* direntry)
+{
+ return direntry->name[0]==0xe5 || direntry->name[0]==0x00;
+}
+
+static char is_volume_label(const direntry_t* direntry)
+{
+ return direntry->attributes == 0x28;
+}
+
+static char is_long_name(const direntry_t* direntry)
+{
+ return direntry->attributes == 0xf;
+}
+
+static char is_short_name(const direntry_t* direntry)
+{
+ return !is_volume_label(direntry) && !is_long_name(direntry)
+ && !is_free(direntry);
+}
+
+static char is_directory(const direntry_t* direntry)
+{
+ return direntry->attributes & 0x10 && direntry->name[0] != 0xe5;
+}
+
+static inline char is_dot(const direntry_t* direntry)
+{
+ return is_short_name(direntry) && direntry->name[0] == '.';
+}
+
+static char is_file(const direntry_t* direntry)
+{
+ return is_short_name(direntry) && !is_directory(direntry);
+}
+
+static inline uint32_t begin_of_direntry(const direntry_t* direntry)
+{
+ return le16_to_cpu(direntry->begin)|(le16_to_cpu(direntry->begin_hi)<<16);
+}
+
+static inline uint32_t filesize_of_direntry(const direntry_t* direntry)
+{
+ return le32_to_cpu(direntry->size);
+}
+
+static void set_begin_of_direntry(direntry_t* direntry, uint32_t begin)
+{
+ direntry->begin = cpu_to_le16(begin & 0xffff);
+ direntry->begin_hi = cpu_to_le16((begin >> 16) & 0xffff);
+}
+
+/* fat functions */
+
+static inline uint8_t fat_chksum(const direntry_t* entry)
+{
+ uint8_t chksum=0;
+ int i;
+
+ for(i=0;i<11;i++) {
+ unsigned char c;
+
+ c = (i < 8) ? entry->name[i] : entry->extension[i-8];
+ chksum=(((chksum&0xfe)>>1)|((chksum&0x01)?0x80:0)) + c;
+ }
+
+ return chksum;
+}
+
+/* if return_time==0, this returns the fat_date, else the fat_time */
+static uint16_t fat_datetime(time_t time,int return_time) {
+ struct tm* t;
+#ifdef _WIN32
+ t=localtime(&time); /* this is not thread safe */
+#else
+ struct tm t1;
+ t = &t1;
+ localtime_r(&time,t);
+#endif
+ if(return_time)
+ return cpu_to_le16((t->tm_sec/2)|(t->tm_min<<5)|(t->tm_hour<<11));
+ return cpu_to_le16((t->tm_mday)|((t->tm_mon+1)<<5)|((t->tm_year-80)<<9));
+}
+
+static inline void fat_set(BDRVVVFATState* s,unsigned int cluster,uint32_t value)
+{
+ if(s->fat_type==32) {
+ uint32_t* entry=array_get(&(s->fat),cluster);
+ *entry=cpu_to_le32(value);
+ } else if(s->fat_type==16) {
+ uint16_t* entry=array_get(&(s->fat),cluster);
+ *entry=cpu_to_le16(value&0xffff);
+ } else {
+ int offset = (cluster*3/2);
+ unsigned char* p = array_get(&(s->fat), offset);
+ switch (cluster&1) {
+ case 0:
+ p[0] = value&0xff;
+ p[1] = (p[1]&0xf0) | ((value>>8)&0xf);
+ break;
+ case 1:
+ p[0] = (p[0]&0xf) | ((value&0xf)<<4);
+ p[1] = (value>>4);
+ break;
+ }
+ }
+}
+
+static inline uint32_t fat_get(BDRVVVFATState* s,unsigned int cluster)
+{
+ if(s->fat_type==32) {
+ uint32_t* entry=array_get(&(s->fat),cluster);
+ return le32_to_cpu(*entry);
+ } else if(s->fat_type==16) {
+ uint16_t* entry=array_get(&(s->fat),cluster);
+ return le16_to_cpu(*entry);
+ } else {
+ const uint8_t* x=(uint8_t*)(s->fat.pointer)+cluster*3/2;
+ return ((x[0]|(x[1]<<8))>>(cluster&1?4:0))&0x0fff;
+ }
+}
+
+static inline int fat_eof(BDRVVVFATState* s,uint32_t fat_entry)
+{
+ if(fat_entry>s->max_fat_value-8)
+ return -1;
+ return 0;
+}
+
+static inline void init_fat(BDRVVVFATState* s)
+{
+ if (s->fat_type == 12) {
+ array_init(&(s->fat),1);
+ array_ensure_allocated(&(s->fat),
+ s->sectors_per_fat * 0x200 * 3 / 2 - 1);
+ } else {
+ array_init(&(s->fat),(s->fat_type==32?4:2));
+ array_ensure_allocated(&(s->fat),
+ s->sectors_per_fat * 0x200 / s->fat.item_size - 1);
+ }
+ memset(s->fat.pointer,0,s->fat.size);
+
+ switch(s->fat_type) {
+ case 12: s->max_fat_value=0xfff; break;
+ case 16: s->max_fat_value=0xffff; break;
+ case 32: s->max_fat_value=0x0fffffff; break;
+ default: s->max_fat_value=0; /* error... */
+ }
+
+}
+
+/* TODO: in create_short_filename, 0xe5->0x05 is not yet handled! */
+/* TODO: in parse_short_filename, 0x05->0xe5 is not yet handled! */
+static inline direntry_t* create_short_and_long_name(BDRVVVFATState* s,
+ unsigned int directory_start, const char* filename, int is_dot)
+{
+ int i,j,long_index=s->directory.next;
+ direntry_t* entry = NULL;
+ direntry_t* entry_long = NULL;
+
+ if(is_dot) {
+ entry=array_get_next(&(s->directory));
+ memset(entry->name,0x20,11);
+ memcpy(entry->name,filename,strlen(filename));
+ return entry;
+ }
+
+ entry_long=create_long_filename(s,filename);
+
+ i = strlen(filename);
+ for(j = i - 1; j>0 && filename[j]!='.';j--);
+ if (j > 0)
+ i = (j > 8 ? 8 : j);
+ else if (i > 8)
+ i = 8;
+
+ entry=array_get_next(&(s->directory));
+ memset(entry->name,0x20,11);
+ memcpy(entry->name, filename, i);
+
+ if(j > 0)
+ for (i = 0; i < 3 && filename[j+1+i]; i++)
+ entry->extension[i] = filename[j+1+i];
+
+ /* upcase & remove unwanted characters */
+ for(i=10;i>=0;i--) {
+ if(i==10 || i==7) for(;i>0 && entry->name[i]==' ';i--);
+ if(entry->name[i]<=' ' || entry->name[i]>0x7f
+ || strchr(".*?<>|\":/\\[];,+='",entry->name[i]))
+ entry->name[i]='_';
+ else if(entry->name[i]>='a' && entry->name[i]<='z')
+ entry->name[i]+='A'-'a';
+ }
+
+ /* mangle duplicates */
+ while(1) {
+ direntry_t* entry1=array_get(&(s->directory),directory_start);
+ int j;
+
+ for(;entry1<entry;entry1++)
+ if(!is_long_name(entry1) && !memcmp(entry1->name,entry->name,11))
+ break; /* found dupe */
+ if(entry1==entry) /* no dupe found */
+ break;
+
+ /* use all 8 characters of name */
+ if(entry->name[7]==' ') {
+ int j;
+ for(j=6;j>0 && entry->name[j]==' ';j--)
+ entry->name[j]='~';
+ }
+
+ /* increment number */
+ for(j=7;j>0 && entry->name[j]=='9';j--)
+ entry->name[j]='0';
+ if(j>0) {
+ if(entry->name[j]<'0' || entry->name[j]>'9')
+ entry->name[j]='0';
+ else
+ entry->name[j]++;
+ }
+ }
+
+ /* calculate checksum; propagate to long name */
+ if(entry_long) {
+ uint8_t chksum=fat_chksum(entry);
+
+ /* calculate anew, because realloc could have taken place */
+ entry_long=array_get(&(s->directory),long_index);
+ while(entry_long<entry && is_long_name(entry_long)) {
+ entry_long->reserved[1]=chksum;
+ entry_long++;
+ }
+ }
+
+ return entry;
+}
+
+/*
+ * Read a directory. (the index of the corresponding mapping must be passed).
+ */
+static int read_directory(BDRVVVFATState* s, int mapping_index)
+{
+ mapping_t* mapping = array_get(&(s->mapping), mapping_index);
+ direntry_t* direntry;
+ const char* dirname = mapping->path;
+ int first_cluster = mapping->begin;
+ int parent_index = mapping->info.dir.parent_mapping_index;
+ mapping_t* parent_mapping = (mapping_t*)
+ (parent_index >= 0 ? array_get(&(s->mapping), parent_index) : NULL);
+ int first_cluster_of_parent = parent_mapping ? parent_mapping->begin : -1;
+
+ DIR* dir=opendir(dirname);
+ struct dirent* entry;
+ int i;
+
+ assert(mapping->mode & MODE_DIRECTORY);
+
+ if(!dir) {
+ mapping->end = mapping->begin;
+ return -1;
+ }
+
+ i = mapping->info.dir.first_dir_index =
+ first_cluster == 0 ? 0 : s->directory.next;
+
+ /* actually read the directory, and allocate the mappings */
+ while((entry=readdir(dir))) {
+ unsigned int length=strlen(dirname)+2+strlen(entry->d_name);
+ char* buffer;
+ direntry_t* direntry;
+ struct stat st;
+ int is_dot=!strcmp(entry->d_name,".");
+ int is_dotdot=!strcmp(entry->d_name,"..");
+
+ if(first_cluster == 0 && (is_dotdot || is_dot))
+ continue;
+
+ buffer=(char*)qemu_malloc(length);
+ snprintf(buffer,length,"%s/%s",dirname,entry->d_name);
+
+ if(stat(buffer,&st)<0) {
+ free(buffer);
+ continue;
+ }
+
+ /* create directory entry for this file */
+ direntry=create_short_and_long_name(s, i, entry->d_name,
+ is_dot || is_dotdot);
+ direntry->attributes=(S_ISDIR(st.st_mode)?0x10:0x20);
+ direntry->reserved[0]=direntry->reserved[1]=0;
+ direntry->ctime=fat_datetime(st.st_ctime,1);
+ direntry->cdate=fat_datetime(st.st_ctime,0);
+ direntry->adate=fat_datetime(st.st_atime,0);
+ direntry->begin_hi=0;
+ direntry->mtime=fat_datetime(st.st_mtime,1);
+ direntry->mdate=fat_datetime(st.st_mtime,0);
+ if(is_dotdot)
+ set_begin_of_direntry(direntry, first_cluster_of_parent);
+ else if(is_dot)
+ set_begin_of_direntry(direntry, first_cluster);
+ else
+ direntry->begin=0; /* do that later */
+ if (st.st_size > 0x7fffffff) {
+ fprintf(stderr, "File %s is larger than 2GB\n", buffer);
+ free(buffer);
+ closedir(dir);
+ return -2;
+ }
+ direntry->size=cpu_to_le32(S_ISDIR(st.st_mode)?0:st.st_size);
+
+ /* create mapping for this file */
+ if(!is_dot && !is_dotdot && (S_ISDIR(st.st_mode) || st.st_size)) {
+ s->current_mapping=(mapping_t*)array_get_next(&(s->mapping));
+ s->current_mapping->begin=0;
+ s->current_mapping->end=st.st_size;
+ /*
+ * we get the direntry of the most recent direntry, which
+ * contains the short name and all the relevant information.
+ */
+ s->current_mapping->dir_index=s->directory.next-1;
+ s->current_mapping->first_mapping_index = -1;
+ if (S_ISDIR(st.st_mode)) {
+ s->current_mapping->mode = MODE_DIRECTORY;
+ s->current_mapping->info.dir.parent_mapping_index =
+ mapping_index;
+ } else {
+ s->current_mapping->mode = MODE_UNDEFINED;
+ s->current_mapping->info.file.offset = 0;
+ }
+ s->current_mapping->path=buffer;
+ s->current_mapping->read_only =
+ (st.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)) == 0;
+ }
+ }
+ closedir(dir);
+
+ /* fill with zeroes up to the end of the cluster */
+ while(s->directory.next%(0x10*s->sectors_per_cluster)) {
+ direntry_t* direntry=array_get_next(&(s->directory));
+ memset(direntry,0,sizeof(direntry_t));
+ }
+
+/* TODO: if there are more entries, bootsector has to be adjusted! */
+#define ROOT_ENTRIES (0x02 * 0x10 * s->sectors_per_cluster)
+ if (mapping_index == 0 && s->directory.next < ROOT_ENTRIES) {
+ /* root directory */
+ int cur = s->directory.next;
+ array_ensure_allocated(&(s->directory), ROOT_ENTRIES - 1);
+ memset(array_get(&(s->directory), cur), 0,
+ (ROOT_ENTRIES - cur) * sizeof(direntry_t));
+ }
+
+ /* reget the mapping, since s->mapping was possibly realloc()ed */
+ mapping = (mapping_t*)array_get(&(s->mapping), mapping_index);
+ first_cluster += (s->directory.next - mapping->info.dir.first_dir_index)
+ * 0x20 / s->cluster_size;
+ mapping->end = first_cluster;
+
+ direntry = (direntry_t*)array_get(&(s->directory), mapping->dir_index);
+ set_begin_of_direntry(direntry, mapping->begin);
+
+ return 0;
+}
+
+static inline uint32_t sector2cluster(BDRVVVFATState* s,off_t sector_num)
+{
+ return (sector_num-s->faked_sectors)/s->sectors_per_cluster;
+}
+
+static inline off_t cluster2sector(BDRVVVFATState* s, uint32_t cluster_num)
+{
+ return s->faked_sectors + s->sectors_per_cluster * cluster_num;
+}
+
+static inline uint32_t sector_offset_in_cluster(BDRVVVFATState* s,off_t sector_num)
+{
+ return (sector_num-s->first_sectors_number-2*s->sectors_per_fat)%s->sectors_per_cluster;
+}
+
+#ifdef DBG
+static direntry_t* get_direntry_for_mapping(BDRVVVFATState* s,mapping_t* mapping)
+{
+ if(mapping->mode==MODE_UNDEFINED)
+ return 0;
+ return (direntry_t*)(s->directory.pointer+sizeof(direntry_t)*mapping->dir_index);
+}
+#endif
+
+static int init_directories(BDRVVVFATState* s,
+ const char* dirname)
+{
+ bootsector_t* bootsector;
+ mapping_t* mapping;
+ unsigned int i;
+ unsigned int cluster;
+
+ memset(&(s->first_sectors[0]),0,0x40*0x200);
+
+ s->cluster_size=s->sectors_per_cluster*0x200;
+ s->cluster_buffer=qemu_malloc(s->cluster_size);
+
+ /*
+ * The formula: sc = spf+1+spf*spc*(512*8/fat_type),
+ * where sc is sector_count,
+ * spf is sectors_per_fat,
+ * spc is sectors_per_clusters, and
+ * fat_type = 12, 16 or 32.
+ */
+ i = 1+s->sectors_per_cluster*0x200*8/s->fat_type;
+ s->sectors_per_fat=(s->sector_count+i)/i; /* round up */
+
+ array_init(&(s->mapping),sizeof(mapping_t));
+ array_init(&(s->directory),sizeof(direntry_t));
+
+ /* add volume label */
+ {
+ direntry_t* entry=array_get_next(&(s->directory));
+ entry->attributes=0x28; /* archive | volume label */
+ memcpy(entry->name,"QEMU VVF",8);
+ memcpy(entry->extension,"AT ",3);
+ }
+
+ /* Now build FAT, and write back information into directory */
+ init_fat(s);
+
+ s->faked_sectors=s->first_sectors_number+s->sectors_per_fat*2;
+ s->cluster_count=sector2cluster(s, s->sector_count);
+
+ mapping = array_get_next(&(s->mapping));
+ mapping->begin = 0;
+ mapping->dir_index = 0;
+ mapping->info.dir.parent_mapping_index = -1;
+ mapping->first_mapping_index = -1;
+ mapping->path = qemu_strdup(dirname);
+ i = strlen(mapping->path);
+ if (i > 0 && mapping->path[i - 1] == '/')
+ mapping->path[i - 1] = '\0';
+ mapping->mode = MODE_DIRECTORY;
+ mapping->read_only = 0;
+ s->path = mapping->path;
+
+ for (i = 0, cluster = 0; i < s->mapping.next; i++) {
+ /* MS-DOS expects the FAT to be 0 for the root directory
+ * (except for the media byte). */
+ /* LATER TODO: still true for FAT32? */
+ int fix_fat = (i != 0);
+ mapping = array_get(&(s->mapping), i);
+
+ if (mapping->mode & MODE_DIRECTORY) {
+ mapping->begin = cluster;
+ if(read_directory(s, i)) {
+ fprintf(stderr, "Could not read directory %s\n",
+ mapping->path);
+ return -1;
+ }
+ mapping = array_get(&(s->mapping), i);
+ } else {
+ assert(mapping->mode == MODE_UNDEFINED);
+ mapping->mode=MODE_NORMAL;
+ mapping->begin = cluster;
+ if (mapping->end > 0) {
+ direntry_t* direntry = array_get(&(s->directory),
+ mapping->dir_index);
+
+ mapping->end = cluster + 1 + (mapping->end-1)/s->cluster_size;
+ set_begin_of_direntry(direntry, mapping->begin);
+ } else {
+ mapping->end = cluster + 1;
+ fix_fat = 0;
+ }
+ }
+
+ assert(mapping->begin < mapping->end);
+
+ /* next free cluster */
+ cluster = mapping->end;
+
+ if(cluster > s->cluster_count) {
+ fprintf(stderr,"Directory does not fit in FAT%d (capacity %s)\n",
+ s->fat_type,
+ s->fat_type == 12 ? s->sector_count == 2880 ? "1.44 MB"
+ : "2.88 MB"
+ : "504MB");
+ return -EINVAL;
+ }
+
+ /* fix fat for entry */
+ if (fix_fat) {
+ int j;
+ for(j = mapping->begin; j < mapping->end - 1; j++)
+ fat_set(s, j, j+1);
+ fat_set(s, mapping->end - 1, s->max_fat_value);
+ }
+ }
+
+ mapping = array_get(&(s->mapping), 0);
+ s->sectors_of_root_directory = mapping->end * s->sectors_per_cluster;
+ s->last_cluster_of_root_directory = mapping->end;
+
+ /* the FAT signature */
+ fat_set(s,0,s->max_fat_value);
+ fat_set(s,1,s->max_fat_value);
+
+ s->current_mapping = NULL;
+
+ bootsector=(bootsector_t*)(s->first_sectors+(s->first_sectors_number-1)*0x200);
+ bootsector->jump[0]=0xeb;
+ bootsector->jump[1]=0x3e;
+ bootsector->jump[2]=0x90;
+ memcpy(bootsector->name,"QEMU ",8);
+ bootsector->sector_size=cpu_to_le16(0x200);
+ bootsector->sectors_per_cluster=s->sectors_per_cluster;
+ bootsector->reserved_sectors=cpu_to_le16(1);
+ bootsector->number_of_fats=0x2; /* number of FATs */
+ bootsector->root_entries=cpu_to_le16(s->sectors_of_root_directory*0x10);
+ bootsector->total_sectors16=s->sector_count>0xffff?0:cpu_to_le16(s->sector_count);
+ bootsector->media_type=(s->fat_type!=12?0xf8:s->sector_count==5760?0xf9:0xf8); /* media descriptor */
+ s->fat.pointer[0] = bootsector->media_type;
+ bootsector->sectors_per_fat=cpu_to_le16(s->sectors_per_fat);
+ bootsector->sectors_per_track=cpu_to_le16(s->bs->secs);
+ bootsector->number_of_heads=cpu_to_le16(s->bs->heads);
+ bootsector->hidden_sectors=cpu_to_le32(s->first_sectors_number==1?0:0x3f);
+ bootsector->total_sectors=cpu_to_le32(s->sector_count>0xffff?s->sector_count:0);
+
+ /* LATER TODO: if FAT32, this is wrong */
+ bootsector->u.fat16.drive_number=s->fat_type==12?0:0x80; /* assume this is hda (TODO) */
+ bootsector->u.fat16.current_head=0;
+ bootsector->u.fat16.signature=0x29;
+ bootsector->u.fat16.id=cpu_to_le32(0xfabe1afd);
+
+ memcpy(bootsector->u.fat16.volume_label,"QEMU VVFAT ",11);
+ memcpy(bootsector->fat_type,(s->fat_type==12?"FAT12 ":s->fat_type==16?"FAT16 ":"FAT32 "),8);
+ bootsector->magic[0]=0x55; bootsector->magic[1]=0xaa;
+
+ return 0;
+}
+
+#ifdef DEBUG
+static BDRVVVFATState *vvv = NULL;
+#endif
+
+static int enable_write_target(BDRVVVFATState *s);
+static int is_consistent(BDRVVVFATState *s);
+
+static int vvfat_open(BlockDriverState *bs, const char* dirname, int flags)
+{
+ BDRVVVFATState *s = bs->opaque;
+ int floppy = 0;
+ int i;
+
+#ifdef DEBUG
+ vvv = s;
+#endif
+
+DLOG(if (stderr == NULL) {
+ stderr = fopen("vvfat.log", "a");
+ setbuf(stderr, NULL);
+})
+
+ s->bs = bs;
+
+ s->fat_type=16;
+ /* LATER TODO: if FAT32, adjust */
+ s->sectors_per_cluster=0x10;
+ /* 504MB disk*/
+ bs->cyls=1024; bs->heads=16; bs->secs=63;
+
+ s->current_cluster=0xffffffff;
+
+ s->first_sectors_number=0x40;
+ /* read only is the default for safety */
+ bs->read_only = 1;
+ s->qcow = s->write_target = NULL;
+ s->qcow_filename = NULL;
+ s->fat2 = NULL;
+ s->downcase_short_names = 1;
+
+ if (!strstart(dirname, "fat:", NULL))
+ return -1;
+
+ if (strstr(dirname, ":floppy:")) {
+ floppy = 1;
+ s->fat_type = 12;
+ s->first_sectors_number = 1;
+ s->sectors_per_cluster=2;
+ bs->cyls = 80; bs->heads = 2; bs->secs = 36;
+ }
+
+ s->sector_count=bs->cyls*bs->heads*bs->secs;
+
+ if (strstr(dirname, ":32:")) {
+ fprintf(stderr, "Big fat greek warning: FAT32 has not been tested. You are welcome to do so!\n");
+ s->fat_type = 32;
+ } else if (strstr(dirname, ":16:")) {
+ s->fat_type = 16;
+ } else if (strstr(dirname, ":12:")) {
+ s->fat_type = 12;
+ s->sector_count=2880;
+ }
+
+ if (strstr(dirname, ":rw:")) {
+ if (enable_write_target(s))
+ return -1;
+ bs->read_only = 0;
+ }
+
+ i = strrchr(dirname, ':') - dirname;
+ assert(i >= 3);
+ if (dirname[i-2] == ':' && qemu_isalpha(dirname[i-1]))
+ /* workaround for DOS drive names */
+ dirname += i-1;
+ else
+ dirname += i+1;
+
+ bs->total_sectors=bs->cyls*bs->heads*bs->secs;
+
+ if(init_directories(s, dirname))
+ return -1;
+
+ s->sector_count = s->faked_sectors + s->sectors_per_cluster*s->cluster_count;
+
+ if(s->first_sectors_number==0x40)
+ init_mbr(s);
+
+ /* for some reason or other, MS-DOS does not like to know about CHS... */
+ if (floppy)
+ bs->heads = bs->cyls = bs->secs = 0;
+
+ // assert(is_consistent(s));
+ return 0;
+}
+
+static inline void vvfat_close_current_file(BDRVVVFATState *s)
+{
+ if(s->current_mapping) {
+ s->current_mapping = NULL;
+ if (s->current_fd) {
+ close(s->current_fd);
+ s->current_fd = 0;
+ }
+ }
+ s->current_cluster = -1;
+}
+
+/* mappings between index1 and index2-1 are supposed to be ordered
+ * return value is the index of the last mapping for which end>cluster_num
+ */
+static inline int find_mapping_for_cluster_aux(BDRVVVFATState* s,int cluster_num,int index1,int index2)
+{
+ while(1) {
+ int index3;
+ mapping_t* mapping;
+ index3=(index1+index2)/2;
+ mapping=array_get(&(s->mapping),index3);
+ assert(mapping->begin < mapping->end);
+ if(mapping->begin>=cluster_num) {
+ assert(index2!=index3 || index2==0);
+ if(index2==index3)
+ return index1;
+ index2=index3;
+ } else {
+ if(index1==index3)
+ return mapping->end<=cluster_num ? index2 : index1;
+ index1=index3;
+ }
+ assert(index1<=index2);
+ DLOG(mapping=array_get(&(s->mapping),index1);
+ assert(mapping->begin<=cluster_num);
+ assert(index2 >= s->mapping.next ||
+ ((mapping = array_get(&(s->mapping),index2)) &&
+ mapping->end>cluster_num)));
+ }
+}
+
+static inline mapping_t* find_mapping_for_cluster(BDRVVVFATState* s,int cluster_num)
+{
+ int index=find_mapping_for_cluster_aux(s,cluster_num,0,s->mapping.next);
+ mapping_t* mapping;
+ if(index>=s->mapping.next)
+ return NULL;
+ mapping=array_get(&(s->mapping),index);
+ if(mapping->begin>cluster_num)
+ return NULL;
+ assert(mapping->begin<=cluster_num && mapping->end>cluster_num);
+ return mapping;
+}
+
+/*
+ * This function simply compares path == mapping->path. Since the mappings
+ * are sorted by cluster, this is expensive: O(n).
+ */
+static inline mapping_t* find_mapping_for_path(BDRVVVFATState* s,
+ const char* path)
+{
+ int i;
+
+ for (i = 0; i < s->mapping.next; i++) {
+ mapping_t* mapping = array_get(&(s->mapping), i);
+ if (mapping->first_mapping_index < 0 &&
+ !strcmp(path, mapping->path))
+ return mapping;
+ }
+
+ return NULL;
+}
+
+static int open_file(BDRVVVFATState* s,mapping_t* mapping)
+{
+ if(!mapping)
+ return -1;
+ if(!s->current_mapping ||
+ strcmp(s->current_mapping->path,mapping->path)) {
+ /* open file */
+ int fd = open(mapping->path, O_RDONLY | O_BINARY | O_LARGEFILE);
+ if(fd<0)
+ return -1;
+ vvfat_close_current_file(s);
+ s->current_fd = fd;
+ s->current_mapping = mapping;
+ }
+ return 0;
+}
+
+static inline int read_cluster(BDRVVVFATState *s,int cluster_num)
+{
+ if(s->current_cluster != cluster_num) {
+ int result=0;
+ off_t offset;
+ assert(!s->current_mapping || s->current_fd || (s->current_mapping->mode & MODE_DIRECTORY));
+ if(!s->current_mapping
+ || s->current_mapping->begin>cluster_num
+ || s->current_mapping->end<=cluster_num) {
+ /* binary search of mappings for file */
+ mapping_t* mapping=find_mapping_for_cluster(s,cluster_num);
+
+ assert(!mapping || (cluster_num>=mapping->begin && cluster_num<mapping->end));
+
+ if (mapping && mapping->mode & MODE_DIRECTORY) {
+ vvfat_close_current_file(s);
+ s->current_mapping = mapping;
+read_cluster_directory:
+ offset = s->cluster_size*(cluster_num-s->current_mapping->begin);
+ s->cluster = (unsigned char*)s->directory.pointer+offset
+ + 0x20*s->current_mapping->info.dir.first_dir_index;
+ assert(((s->cluster-(unsigned char*)s->directory.pointer)%s->cluster_size)==0);
+ assert((char*)s->cluster+s->cluster_size <= s->directory.pointer+s->directory.next*s->directory.item_size);
+ s->current_cluster = cluster_num;
+ return 0;
+ }
+
+ if(open_file(s,mapping))
+ return -2;
+ } else if (s->current_mapping->mode & MODE_DIRECTORY)
+ goto read_cluster_directory;
+
+ assert(s->current_fd);
+
+ offset=s->cluster_size*(cluster_num-s->current_mapping->begin)+s->current_mapping->info.file.offset;
+ if(lseek(s->current_fd, offset, SEEK_SET)!=offset)
+ return -3;
+ s->cluster=s->cluster_buffer;
+ result=read(s->current_fd,s->cluster,s->cluster_size);
+ if(result<0) {
+ s->current_cluster = -1;
+ return -1;
+ }
+ s->current_cluster = cluster_num;
+ }
+ return 0;
+}
+
+#ifdef DEBUG
+static void hexdump(const void* address, uint32_t len)
+{
+ const unsigned char* p = address;
+ int i, j;
+
+ for (i = 0; i < len; i += 16) {
+ for (j = 0; j < 16 && i + j < len; j++)
+ fprintf(stderr, "%02x ", p[i + j]);
+ for (; j < 16; j++)
+ fprintf(stderr, " ");
+ fprintf(stderr, " ");
+ for (j = 0; j < 16 && i + j < len; j++)
+ fprintf(stderr, "%c", (p[i + j] < ' ' || p[i + j] > 0x7f) ? '.' : p[i + j]);
+ fprintf(stderr, "\n");
+ }
+}
+
+static void print_direntry(const direntry_t* direntry)
+{
+ int j = 0;
+ char buffer[1024];
+
+ fprintf(stderr, "direntry %p: ", direntry);
+ if(!direntry)
+ return;
+ if(is_long_name(direntry)) {
+ unsigned char* c=(unsigned char*)direntry;
+ int i;
+ for(i=1;i<11 && c[i] && c[i]!=0xff;i+=2)
+#define ADD_CHAR(c) {buffer[j] = (c); if (buffer[j] < ' ') buffer[j] = 0xb0; j++;}
+ ADD_CHAR(c[i]);
+ for(i=14;i<26 && c[i] && c[i]!=0xff;i+=2)
+ ADD_CHAR(c[i]);
+ for(i=28;i<32 && c[i] && c[i]!=0xff;i+=2)
+ ADD_CHAR(c[i]);
+ buffer[j] = 0;
+ fprintf(stderr, "%s\n", buffer);
+ } else {
+ int i;
+ for(i=0;i<11;i++)
+ ADD_CHAR(direntry->name[i]);
+ buffer[j] = 0;
+ fprintf(stderr,"%s attributes=0x%02x begin=%d size=%d\n",
+ buffer,
+ direntry->attributes,
+ begin_of_direntry(direntry),le32_to_cpu(direntry->size));
+ }
+}
+
+static void print_mapping(const mapping_t* mapping)
+{
+ fprintf(stderr, "mapping (%p): begin, end = %d, %d, dir_index = %d, "
+ "first_mapping_index = %d, name = %s, mode = 0x%x, " ,
+ mapping, mapping->begin, mapping->end, mapping->dir_index,
+ mapping->first_mapping_index, mapping->path, mapping->mode);
+
+ if (mapping->mode & MODE_DIRECTORY)
+ fprintf(stderr, "parent_mapping_index = %d, first_dir_index = %d\n", mapping->info.dir.parent_mapping_index, mapping->info.dir.first_dir_index);
+ else
+ fprintf(stderr, "offset = %d\n", mapping->info.file.offset);
+}
+#endif
+
+static int vvfat_read(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors)
+{
+ BDRVVVFATState *s = bs->opaque;
+ int i;
+
+ for(i=0;i<nb_sectors;i++,sector_num++) {
+ if (sector_num >= s->sector_count)
+ return -1;
+ if (s->qcow) {
+ int n;
+ if (s->qcow->drv->bdrv_is_allocated(s->qcow,
+ sector_num, nb_sectors-i, &n)) {
+DLOG(fprintf(stderr, "sectors %d+%d allocated\n", (int)sector_num, n));
+ if (s->qcow->drv->bdrv_read(s->qcow, sector_num, buf+i*0x200, n))
+ return -1;
+ i += n - 1;
+ sector_num += n - 1;
+ continue;
+ }
+DLOG(fprintf(stderr, "sector %d not allocated\n", (int)sector_num));
+ }
+ if(sector_num<s->faked_sectors) {
+ if(sector_num<s->first_sectors_number)
+ memcpy(buf+i*0x200,&(s->first_sectors[sector_num*0x200]),0x200);
+ else if(sector_num-s->first_sectors_number<s->sectors_per_fat)
+ memcpy(buf+i*0x200,&(s->fat.pointer[(sector_num-s->first_sectors_number)*0x200]),0x200);
+ else if(sector_num-s->first_sectors_number-s->sectors_per_fat<s->sectors_per_fat)
+ memcpy(buf+i*0x200,&(s->fat.pointer[(sector_num-s->first_sectors_number-s->sectors_per_fat)*0x200]),0x200);
+ } else {
+ uint32_t sector=sector_num-s->faked_sectors,
+ sector_offset_in_cluster=(sector%s->sectors_per_cluster),
+ cluster_num=sector/s->sectors_per_cluster;
+ if(read_cluster(s, cluster_num) != 0) {
+ /* LATER TODO: strict: return -1; */
+ memset(buf+i*0x200,0,0x200);
+ continue;
+ }
+ memcpy(buf+i*0x200,s->cluster+sector_offset_in_cluster*0x200,0x200);
+ }
+ }
+ return 0;
+}
+
+/* LATER TODO: statify all functions */
+
+/*
+ * Idea of the write support (use snapshot):
+ *
+ * 1. check if all data is consistent, recording renames, modifications,
+ * new files and directories (in s->commits).
+ *
+ * 2. if the data is not consistent, stop committing
+ *
+ * 3. handle renames, and create new files and directories (do not yet
+ * write their contents)
+ *
+ * 4. walk the directories, fixing the mapping and direntries, and marking
+ * the handled mappings as not deleted
+ *
+ * 5. commit the contents of the files
+ *
+ * 6. handle deleted files and directories
+ *
+ */
+
+typedef struct commit_t {
+ char* path;
+ union {
+ struct { uint32_t cluster; } rename;
+ struct { int dir_index; uint32_t modified_offset; } writeout;
+ struct { uint32_t first_cluster; } new_file;
+ struct { uint32_t cluster; } mkdir;
+ } param;
+ /* DELETEs and RMDIRs are handled differently: see handle_deletes() */
+ enum {
+ ACTION_RENAME, ACTION_WRITEOUT, ACTION_NEW_FILE, ACTION_MKDIR
+ } action;
+} commit_t;
+
+static void clear_commits(BDRVVVFATState* s)
+{
+ int i;
+DLOG(fprintf(stderr, "clear_commits (%d commits)\n", s->commits.next));
+ for (i = 0; i < s->commits.next; i++) {
+ commit_t* commit = array_get(&(s->commits), i);
+ assert(commit->path || commit->action == ACTION_WRITEOUT);
+ if (commit->action != ACTION_WRITEOUT) {
+ assert(commit->path);
+ free(commit->path);
+ } else
+ assert(commit->path == NULL);
+ }
+ s->commits.next = 0;
+}
+
+static void schedule_rename(BDRVVVFATState* s,
+ uint32_t cluster, char* new_path)
+{
+ commit_t* commit = array_get_next(&(s->commits));
+ commit->path = new_path;
+ commit->param.rename.cluster = cluster;
+ commit->action = ACTION_RENAME;
+}
+
+static void schedule_writeout(BDRVVVFATState* s,
+ int dir_index, uint32_t modified_offset)
+{
+ commit_t* commit = array_get_next(&(s->commits));
+ commit->path = NULL;
+ commit->param.writeout.dir_index = dir_index;
+ commit->param.writeout.modified_offset = modified_offset;
+ commit->action = ACTION_WRITEOUT;
+}
+
+static void schedule_new_file(BDRVVVFATState* s,
+ char* path, uint32_t first_cluster)
+{
+ commit_t* commit = array_get_next(&(s->commits));
+ commit->path = path;
+ commit->param.new_file.first_cluster = first_cluster;
+ commit->action = ACTION_NEW_FILE;
+}
+
+static void schedule_mkdir(BDRVVVFATState* s, uint32_t cluster, char* path)
+{
+ commit_t* commit = array_get_next(&(s->commits));
+ commit->path = path;
+ commit->param.mkdir.cluster = cluster;
+ commit->action = ACTION_MKDIR;
+}
+
+typedef struct {
+ /*
+ * Since the sequence number is at most 0x3f, and the filename
+ * length is at most 13 times the sequence number, the maximal
+ * filename length is 0x3f * 13 bytes.
+ */
+ unsigned char name[0x3f * 13 + 1];
+ int checksum, len;
+ int sequence_number;
+} long_file_name;
+
+static void lfn_init(long_file_name* lfn)
+{
+ lfn->sequence_number = lfn->len = 0;
+ lfn->checksum = 0x100;
+}
+
+/* return 0 if parsed successfully, > 0 if no long name, < 0 if error */
+static int parse_long_name(long_file_name* lfn,
+ const direntry_t* direntry)
+{
+ int i, j, offset;
+ const unsigned char* pointer = (const unsigned char*)direntry;
+
+ if (!is_long_name(direntry))
+ return 1;
+
+ if (pointer[0] & 0x40) {
+ lfn->sequence_number = pointer[0] & 0x3f;
+ lfn->checksum = pointer[13];
+ lfn->name[0] = 0;
+ lfn->name[lfn->sequence_number * 13] = 0;
+ } else if ((pointer[0] & 0x3f) != --lfn->sequence_number)
+ return -1;
+ else if (pointer[13] != lfn->checksum)
+ return -2;
+ else if (pointer[12] || pointer[26] || pointer[27])
+ return -3;
+
+ offset = 13 * (lfn->sequence_number - 1);
+ for (i = 0, j = 1; i < 13; i++, j+=2) {
+ if (j == 11)
+ j = 14;
+ else if (j == 26)
+ j = 28;
+
+ if (pointer[j+1] == 0)
+ lfn->name[offset + i] = pointer[j];
+ else if (pointer[j+1] != 0xff || (pointer[0] & 0x40) == 0)
+ return -4;
+ else
+ lfn->name[offset + i] = 0;
+ }
+
+ if (pointer[0] & 0x40)
+ lfn->len = offset + strlen((char*)lfn->name + offset);
+
+ return 0;
+}
+
+/* returns 0 if successful, >0 if no short_name, and <0 on error */
+static int parse_short_name(BDRVVVFATState* s,
+ long_file_name* lfn, direntry_t* direntry)
+{
+ int i, j;
+
+ if (!is_short_name(direntry))
+ return 1;
+
+ for (j = 7; j >= 0 && direntry->name[j] == ' '; j--);
+ for (i = 0; i <= j; i++) {
+ if (direntry->name[i] <= ' ' || direntry->name[i] > 0x7f)
+ return -1;
+ else if (s->downcase_short_names)
+ lfn->name[i] = qemu_tolower(direntry->name[i]);
+ else
+ lfn->name[i] = direntry->name[i];
+ }
+
+ for (j = 2; j >= 0 && direntry->extension[j] == ' '; j--);
+ if (j >= 0) {
+ lfn->name[i++] = '.';
+ lfn->name[i + j + 1] = '\0';
+ for (;j >= 0; j--) {
+ if (direntry->extension[j] <= ' ' || direntry->extension[j] > 0x7f)
+ return -2;
+ else if (s->downcase_short_names)
+ lfn->name[i + j] = qemu_tolower(direntry->extension[j]);
+ else
+ lfn->name[i + j] = direntry->extension[j];
+ }
+ } else
+ lfn->name[i + j + 1] = '\0';
+
+ lfn->len = strlen((char*)lfn->name);
+
+ return 0;
+}
+
+static inline uint32_t modified_fat_get(BDRVVVFATState* s,
+ unsigned int cluster)
+{
+ if (cluster < s->last_cluster_of_root_directory) {
+ if (cluster + 1 == s->last_cluster_of_root_directory)
+ return s->max_fat_value;
+ else
+ return cluster + 1;
+ }
+
+ if (s->fat_type==32) {
+ uint32_t* entry=((uint32_t*)s->fat2)+cluster;
+ return le32_to_cpu(*entry);
+ } else if (s->fat_type==16) {
+ uint16_t* entry=((uint16_t*)s->fat2)+cluster;
+ return le16_to_cpu(*entry);
+ } else {
+ const uint8_t* x=s->fat2+cluster*3/2;
+ return ((x[0]|(x[1]<<8))>>(cluster&1?4:0))&0x0fff;
+ }
+}
+
+static inline int cluster_was_modified(BDRVVVFATState* s, uint32_t cluster_num)
+{
+ int was_modified = 0;
+ int i, dummy;
+
+ if (s->qcow == NULL)
+ return 0;
+
+ for (i = 0; !was_modified && i < s->sectors_per_cluster; i++)
+ was_modified = s->qcow->drv->bdrv_is_allocated(s->qcow,
+ cluster2sector(s, cluster_num) + i, 1, &dummy);
+
+ return was_modified;
+}
+
+static const char* get_basename(const char* path)
+{
+ char* basename = strrchr(path, '/');
+ if (basename == NULL)
+ return path;
+ else
+ return basename + 1; /* strip '/' */
+}
+
+/*
+ * The array s->used_clusters holds the states of the clusters. If it is
+ * part of a file, it has bit 2 set, in case of a directory, bit 1. If it
+ * was modified, bit 3 is set.
+ * If any cluster is allocated, but not part of a file or directory, this
+ * driver refuses to commit.
+ */
+typedef enum {
+ USED_DIRECTORY = 1, USED_FILE = 2, USED_ANY = 3, USED_ALLOCATED = 4
+} used_t;
+
+/*
+ * get_cluster_count_for_direntry() not only determines how many clusters
+ * are occupied by direntry, but also if it was renamed or modified.
+ *
+ * A file is thought to be renamed *only* if there already was a file with
+ * exactly the same first cluster, but a different name.
+ *
+ * Further, the files/directories handled by this function are
+ * assumed to be *not* deleted (and *only* those).
+ */
+static uint32_t get_cluster_count_for_direntry(BDRVVVFATState* s,
+ direntry_t* direntry, const char* path)
+{
+ /*
+ * This is a little bit tricky:
+ * IF the guest OS just inserts a cluster into the file chain,
+ * and leaves the rest alone, (i.e. the original file had clusters
+ * 15 -> 16, but now has 15 -> 32 -> 16), then the following happens:
+ *
+ * - do_commit will write the cluster into the file at the given
+ * offset, but
+ *
+ * - the cluster which is overwritten should be moved to a later
+ * position in the file.
+ *
+ * I am not aware that any OS does something as braindead, but this
+ * situation could happen anyway when not committing for a long time.
+ * Just to be sure that this does not bite us, detect it, and copy the
+ * contents of the clusters to-be-overwritten into the qcow.
+ */
+ int copy_it = 0;
+ int was_modified = 0;
+ int32_t ret = 0;
+
+ uint32_t cluster_num = begin_of_direntry(direntry);
+ uint32_t offset = 0;
+ int first_mapping_index = -1;
+ mapping_t* mapping = NULL;
+ const char* basename2 = NULL;
+
+ vvfat_close_current_file(s);
+
+ /* the root directory */
+ if (cluster_num == 0)
+ return 0;
+
+ /* write support */
+ if (s->qcow) {
+ basename2 = get_basename(path);
+
+ mapping = find_mapping_for_cluster(s, cluster_num);
+
+ if (mapping) {
+ const char* basename;
+
+ assert(mapping->mode & MODE_DELETED);
+ mapping->mode &= ~MODE_DELETED;
+
+ basename = get_basename(mapping->path);
+
+ assert(mapping->mode & MODE_NORMAL);
+
+ /* rename */
+ if (strcmp(basename, basename2))
+ schedule_rename(s, cluster_num, qemu_strdup(path));
+ } else if (is_file(direntry))
+ /* new file */
+ schedule_new_file(s, qemu_strdup(path), cluster_num);
+ else {
+ abort();
+ return 0;
+ }
+ }
+
+ while(1) {
+ if (s->qcow) {
+ if (!copy_it && cluster_was_modified(s, cluster_num)) {
+ if (mapping == NULL ||
+ mapping->begin > cluster_num ||
+ mapping->end <= cluster_num)
+ mapping = find_mapping_for_cluster(s, cluster_num);
+
+
+ if (mapping &&
+ (mapping->mode & MODE_DIRECTORY) == 0) {
+
+ /* was modified in qcow */
+ if (offset != mapping->info.file.offset + s->cluster_size
+ * (cluster_num - mapping->begin)) {
+ /* offset of this cluster in file chain has changed */
+ abort();
+ copy_it = 1;
+ } else if (offset == 0) {
+ const char* basename = get_basename(mapping->path);
+
+ if (strcmp(basename, basename2))
+ copy_it = 1;
+ first_mapping_index = array_index(&(s->mapping), mapping);
+ }
+
+ if (mapping->first_mapping_index != first_mapping_index
+ && mapping->info.file.offset > 0) {
+ abort();
+ copy_it = 1;
+ }
+
+ /* need to write out? */
+ if (!was_modified && is_file(direntry)) {
+ was_modified = 1;
+ schedule_writeout(s, mapping->dir_index, offset);
+ }
+ }
+ }
+
+ if (copy_it) {
+ int i, dummy;
+ /*
+ * This is horribly inefficient, but that is okay, since
+ * it is rarely executed, if at all.
+ */
+ int64_t offset = cluster2sector(s, cluster_num);
+
+ vvfat_close_current_file(s);
+ for (i = 0; i < s->sectors_per_cluster; i++)
+ if (!s->qcow->drv->bdrv_is_allocated(s->qcow,
+ offset + i, 1, &dummy)) {
+ if (vvfat_read(s->bs,
+ offset, s->cluster_buffer, 1))
+ return -1;
+ if (s->qcow->drv->bdrv_write(s->qcow,
+ offset, s->cluster_buffer, 1))
+ return -2;
+ }
+ }
+ }
+
+ ret++;
+ if (s->used_clusters[cluster_num] & USED_ANY)
+ return 0;
+ s->used_clusters[cluster_num] = USED_FILE;
+
+ cluster_num = modified_fat_get(s, cluster_num);
+
+ if (fat_eof(s, cluster_num))
+ return ret;
+ else if (cluster_num < 2 || cluster_num > s->max_fat_value - 16)
+ return -1;
+
+ offset += s->cluster_size;
+ }
+}
+
+/*
+ * This function looks at the modified data (qcow).
+ * It returns 0 upon inconsistency or error, and the number of clusters
+ * used by the directory, its subdirectories and their files.
+ */
+static int check_directory_consistency(BDRVVVFATState *s,
+ int cluster_num, const char* path)
+{
+ int ret = 0;
+ unsigned char* cluster = qemu_malloc(s->cluster_size);
+ direntry_t* direntries = (direntry_t*)cluster;
+ mapping_t* mapping = find_mapping_for_cluster(s, cluster_num);
+
+ long_file_name lfn;
+ int path_len = strlen(path);
+ char path2[PATH_MAX];
+
+ assert(path_len < PATH_MAX); /* len was tested before! */
+ pstrcpy(path2, sizeof(path2), path);
+ path2[path_len] = '/';
+ path2[path_len + 1] = '\0';
+
+ if (mapping) {
+ const char* basename = get_basename(mapping->path);
+ const char* basename2 = get_basename(path);
+
+ assert(mapping->mode & MODE_DIRECTORY);
+
+ assert(mapping->mode & MODE_DELETED);
+ mapping->mode &= ~MODE_DELETED;
+
+ if (strcmp(basename, basename2))
+ schedule_rename(s, cluster_num, qemu_strdup(path));
+ } else
+ /* new directory */
+ schedule_mkdir(s, cluster_num, qemu_strdup(path));
+
+ lfn_init(&lfn);
+ do {
+ int i;
+ int subret = 0;
+
+ ret++;
+
+ if (s->used_clusters[cluster_num] & USED_ANY) {
+ fprintf(stderr, "cluster %d used more than once\n", (int)cluster_num);
+ return 0;
+ }
+ s->used_clusters[cluster_num] = USED_DIRECTORY;
+
+DLOG(fprintf(stderr, "read cluster %d (sector %d)\n", (int)cluster_num, (int)cluster2sector(s, cluster_num)));
+ subret = vvfat_read(s->bs, cluster2sector(s, cluster_num), cluster,
+ s->sectors_per_cluster);
+ if (subret) {
+ fprintf(stderr, "Error fetching direntries\n");
+ fail:
+ free(cluster);
+ return 0;
+ }
+
+ for (i = 0; i < 0x10 * s->sectors_per_cluster; i++) {
+ int cluster_count = 0;
+
+DLOG(fprintf(stderr, "check direntry %d: \n", i); print_direntry(direntries + i));
+ if (is_volume_label(direntries + i) || is_dot(direntries + i) ||
+ is_free(direntries + i))
+ continue;
+
+ subret = parse_long_name(&lfn, direntries + i);
+ if (subret < 0) {
+ fprintf(stderr, "Error in long name\n");
+ goto fail;
+ }
+ if (subret == 0 || is_free(direntries + i))
+ continue;
+
+ if (fat_chksum(direntries+i) != lfn.checksum) {
+ subret = parse_short_name(s, &lfn, direntries + i);
+ if (subret < 0) {
+ fprintf(stderr, "Error in short name (%d)\n", subret);
+ goto fail;
+ }
+ if (subret > 0 || !strcmp((char*)lfn.name, ".")
+ || !strcmp((char*)lfn.name, ".."))
+ continue;
+ }
+ lfn.checksum = 0x100; /* cannot use long name twice */
+
+ if (path_len + 1 + lfn.len >= PATH_MAX) {
+ fprintf(stderr, "Name too long: %s/%s\n", path, lfn.name);
+ goto fail;
+ }
+ pstrcpy(path2 + path_len + 1, sizeof(path2) - path_len - 1,
+ (char*)lfn.name);
+
+ if (is_directory(direntries + i)) {
+ if (begin_of_direntry(direntries + i) == 0) {
+ DLOG(fprintf(stderr, "invalid begin for directory: %s\n", path2); print_direntry(direntries + i));
+ goto fail;
+ }
+ cluster_count = check_directory_consistency(s,
+ begin_of_direntry(direntries + i), path2);
+ if (cluster_count == 0) {
+ DLOG(fprintf(stderr, "problem in directory %s:\n", path2); print_direntry(direntries + i));
+ goto fail;
+ }
+ } else if (is_file(direntries + i)) {
+ /* check file size with FAT */
+ cluster_count = get_cluster_count_for_direntry(s, direntries + i, path2);
+ if (cluster_count !=
+ (le32_to_cpu(direntries[i].size) + s->cluster_size
+ - 1) / s->cluster_size) {
+ DLOG(fprintf(stderr, "Cluster count mismatch\n"));
+ goto fail;
+ }
+ } else
+ abort(); /* cluster_count = 0; */
+
+ ret += cluster_count;
+ }
+
+ cluster_num = modified_fat_get(s, cluster_num);
+ } while(!fat_eof(s, cluster_num));
+
+ free(cluster);
+ return ret;
+}
+
+/* returns 1 on success */
+static int is_consistent(BDRVVVFATState* s)
+{
+ int i, check;
+ int used_clusters_count = 0;
+
+DLOG(checkpoint());
+ /*
+ * - get modified FAT
+ * - compare the two FATs (TODO)
+ * - get buffer for marking used clusters
+ * - recurse direntries from root (using bs->bdrv_read to make
+ * sure to get the new data)
+ * - check that the FAT agrees with the size
+ * - count the number of clusters occupied by this directory and
+ * its files
+ * - check that the cumulative used cluster count agrees with the
+ * FAT
+ * - if all is fine, return number of used clusters
+ */
+ if (s->fat2 == NULL) {
+ int size = 0x200 * s->sectors_per_fat;
+ s->fat2 = qemu_malloc(size);
+ memcpy(s->fat2, s->fat.pointer, size);
+ }
+ check = vvfat_read(s->bs,
+ s->first_sectors_number, s->fat2, s->sectors_per_fat);
+ if (check) {
+ fprintf(stderr, "Could not copy fat\n");
+ return 0;
+ }
+ assert (s->used_clusters);
+ for (i = 0; i < sector2cluster(s, s->sector_count); i++)
+ s->used_clusters[i] &= ~USED_ANY;
+
+ clear_commits(s);
+
+ /* mark every mapped file/directory as deleted.
+ * (check_directory_consistency() will unmark those still present). */
+ if (s->qcow)
+ for (i = 0; i < s->mapping.next; i++) {
+ mapping_t* mapping = array_get(&(s->mapping), i);
+ if (mapping->first_mapping_index < 0)
+ mapping->mode |= MODE_DELETED;
+ }
+
+ used_clusters_count = check_directory_consistency(s, 0, s->path);
+ if (used_clusters_count <= 0) {
+ DLOG(fprintf(stderr, "problem in directory\n"));
+ return 0;
+ }
+
+ check = s->last_cluster_of_root_directory;
+ for (i = check; i < sector2cluster(s, s->sector_count); i++) {
+ if (modified_fat_get(s, i)) {
+ if(!s->used_clusters[i]) {
+ DLOG(fprintf(stderr, "FAT was modified (%d), but cluster is not used?\n", i));
+ return 0;
+ }
+ check++;
+ }
+
+ if (s->used_clusters[i] == USED_ALLOCATED) {
+ /* allocated, but not used... */
+ DLOG(fprintf(stderr, "unused, modified cluster: %d\n", i));
+ return 0;
+ }
+ }
+
+ if (check != used_clusters_count)
+ return 0;
+
+ return used_clusters_count;
+}
+
+static inline void adjust_mapping_indices(BDRVVVFATState* s,
+ int offset, int adjust)
+{
+ int i;
+
+ for (i = 0; i < s->mapping.next; i++) {
+ mapping_t* mapping = array_get(&(s->mapping), i);
+
+#define ADJUST_MAPPING_INDEX(name) \
+ if (mapping->name >= offset) \
+ mapping->name += adjust
+
+ ADJUST_MAPPING_INDEX(first_mapping_index);
+ if (mapping->mode & MODE_DIRECTORY)
+ ADJUST_MAPPING_INDEX(info.dir.parent_mapping_index);
+ }
+}
+
+/* insert or update mapping */
+static mapping_t* insert_mapping(BDRVVVFATState* s,
+ uint32_t begin, uint32_t end)
+{
+ /*
+ * - find mapping where mapping->begin >= begin,
+ * - if mapping->begin > begin: insert
+ * - adjust all references to mappings!
+ * - else: adjust
+ * - replace name
+ */
+ int index = find_mapping_for_cluster_aux(s, begin, 0, s->mapping.next);
+ mapping_t* mapping = NULL;
+ mapping_t* first_mapping = array_get(&(s->mapping), 0);
+
+ if (index < s->mapping.next && (mapping = array_get(&(s->mapping), index))
+ && mapping->begin < begin) {
+ mapping->end = begin;
+ index++;
+ mapping = array_get(&(s->mapping), index);
+ }
+ if (index >= s->mapping.next || mapping->begin > begin) {
+ mapping = array_insert(&(s->mapping), index, 1);
+ mapping->path = NULL;
+ adjust_mapping_indices(s, index, +1);
+ }
+
+ mapping->begin = begin;
+ mapping->end = end;
+
+DLOG(mapping_t* next_mapping;
+assert(index + 1 >= s->mapping.next ||
+((next_mapping = array_get(&(s->mapping), index + 1)) &&
+ next_mapping->begin >= end)));
+
+ if (s->current_mapping && first_mapping != (mapping_t*)s->mapping.pointer)
+ s->current_mapping = array_get(&(s->mapping),
+ s->current_mapping - first_mapping);
+
+ return mapping;
+}
+
+static int remove_mapping(BDRVVVFATState* s, int mapping_index)
+{
+ mapping_t* mapping = array_get(&(s->mapping), mapping_index);
+ mapping_t* first_mapping = array_get(&(s->mapping), 0);
+
+ /* free mapping */
+ if (mapping->first_mapping_index < 0)
+ free(mapping->path);
+
+ /* remove from s->mapping */
+ array_remove(&(s->mapping), mapping_index);
+
+ /* adjust all references to mappings */
+ adjust_mapping_indices(s, mapping_index, -1);
+
+ if (s->current_mapping && first_mapping != (mapping_t*)s->mapping.pointer)
+ s->current_mapping = array_get(&(s->mapping),
+ s->current_mapping - first_mapping);
+
+ return 0;
+}
+
+static void adjust_dirindices(BDRVVVFATState* s, int offset, int adjust)
+{
+ int i;
+ for (i = 0; i < s->mapping.next; i++) {
+ mapping_t* mapping = array_get(&(s->mapping), i);
+ if (mapping->dir_index >= offset)
+ mapping->dir_index += adjust;
+ if ((mapping->mode & MODE_DIRECTORY) &&
+ mapping->info.dir.first_dir_index >= offset)
+ mapping->info.dir.first_dir_index += adjust;
+ }
+}
+
+static direntry_t* insert_direntries(BDRVVVFATState* s,
+ int dir_index, int count)
+{
+ /*
+ * make room in s->directory,
+ * adjust_dirindices
+ */
+ direntry_t* result = array_insert(&(s->directory), dir_index, count);
+ if (result == NULL)
+ return NULL;
+ adjust_dirindices(s, dir_index, count);
+ return result;
+}
+
+static int remove_direntries(BDRVVVFATState* s, int dir_index, int count)
+{
+ int ret = array_remove_slice(&(s->directory), dir_index, count);
+ if (ret)
+ return ret;
+ adjust_dirindices(s, dir_index, -count);
+ return 0;
+}
+
+/*
+ * Adapt the mappings of the cluster chain starting at first cluster
+ * (i.e. if a file starts at first_cluster, the chain is followed according
+ * to the modified fat, and the corresponding entries in s->mapping are
+ * adjusted)
+ */
+static int commit_mappings(BDRVVVFATState* s,
+ uint32_t first_cluster, int dir_index)
+{
+ mapping_t* mapping = find_mapping_for_cluster(s, first_cluster);
+ direntry_t* direntry = array_get(&(s->directory), dir_index);
+ uint32_t cluster = first_cluster;
+
+ vvfat_close_current_file(s);
+
+ assert(mapping);
+ assert(mapping->begin == first_cluster);
+ mapping->first_mapping_index = -1;
+ mapping->dir_index = dir_index;
+ mapping->mode = (dir_index <= 0 || is_directory(direntry)) ?
+ MODE_DIRECTORY : MODE_NORMAL;
+
+ while (!fat_eof(s, cluster)) {
+ uint32_t c, c1;
+
+ for (c = cluster, c1 = modified_fat_get(s, c); c + 1 == c1;
+ c = c1, c1 = modified_fat_get(s, c1));
+
+ c++;
+ if (c > mapping->end) {
+ int index = array_index(&(s->mapping), mapping);
+ int i, max_i = s->mapping.next - index;
+ for (i = 1; i < max_i && mapping[i].begin < c; i++);
+ while (--i > 0)
+ remove_mapping(s, index + 1);
+ }
+ assert(mapping == array_get(&(s->mapping), s->mapping.next - 1)
+ || mapping[1].begin >= c);
+ mapping->end = c;
+
+ if (!fat_eof(s, c1)) {
+ int i = find_mapping_for_cluster_aux(s, c1, 0, s->mapping.next);
+ mapping_t* next_mapping = i >= s->mapping.next ? NULL :
+ array_get(&(s->mapping), i);
+
+ if (next_mapping == NULL || next_mapping->begin > c1) {
+ int i1 = array_index(&(s->mapping), mapping);
+
+ next_mapping = insert_mapping(s, c1, c1+1);
+
+ if (c1 < c)
+ i1++;
+ mapping = array_get(&(s->mapping), i1);
+ }
+
+ next_mapping->dir_index = mapping->dir_index;
+ next_mapping->first_mapping_index =
+ mapping->first_mapping_index < 0 ?
+ array_index(&(s->mapping), mapping) :
+ mapping->first_mapping_index;
+ next_mapping->path = mapping->path;
+ next_mapping->mode = mapping->mode;
+ next_mapping->read_only = mapping->read_only;
+ if (mapping->mode & MODE_DIRECTORY) {
+ next_mapping->info.dir.parent_mapping_index =
+ mapping->info.dir.parent_mapping_index;
+ next_mapping->info.dir.first_dir_index =
+ mapping->info.dir.first_dir_index +
+ 0x10 * s->sectors_per_cluster *
+ (mapping->end - mapping->begin);
+ } else
+ next_mapping->info.file.offset = mapping->info.file.offset +
+ mapping->end - mapping->begin;
+
+ mapping = next_mapping;
+ }
+
+ cluster = c1;
+ }
+
+ return 0;
+}
+
+static int commit_direntries(BDRVVVFATState* s,
+ int dir_index, int parent_mapping_index)
+{
+ direntry_t* direntry = array_get(&(s->directory), dir_index);
+ uint32_t first_cluster = dir_index == 0 ? 0 : begin_of_direntry(direntry);
+ mapping_t* mapping = find_mapping_for_cluster(s, first_cluster);
+
+ int factor = 0x10 * s->sectors_per_cluster;
+ int old_cluster_count, new_cluster_count;
+ int current_dir_index = mapping->info.dir.first_dir_index;
+ int first_dir_index = current_dir_index;
+ int ret, i;
+ uint32_t c;
+
+DLOG(fprintf(stderr, "commit_direntries for %s, parent_mapping_index %d\n", mapping->path, parent_mapping_index));
+
+ assert(direntry);
+ assert(mapping);
+ assert(mapping->begin == first_cluster);
+ assert(mapping->info.dir.first_dir_index < s->directory.next);
+ assert(mapping->mode & MODE_DIRECTORY);
+ assert(dir_index == 0 || is_directory(direntry));
+
+ mapping->info.dir.parent_mapping_index = parent_mapping_index;
+
+ if (first_cluster == 0) {
+ old_cluster_count = new_cluster_count =
+ s->last_cluster_of_root_directory;
+ } else {
+ for (old_cluster_count = 0, c = first_cluster; !fat_eof(s, c);
+ c = fat_get(s, c))
+ old_cluster_count++;
+
+ for (new_cluster_count = 0, c = first_cluster; !fat_eof(s, c);
+ c = modified_fat_get(s, c))
+ new_cluster_count++;
+ }
+
+ if (new_cluster_count > old_cluster_count) {
+ if (insert_direntries(s,
+ current_dir_index + factor * old_cluster_count,
+ factor * (new_cluster_count - old_cluster_count)) == NULL)
+ return -1;
+ } else if (new_cluster_count < old_cluster_count)
+ remove_direntries(s,
+ current_dir_index + factor * new_cluster_count,
+ factor * (old_cluster_count - new_cluster_count));
+
+ for (c = first_cluster; !fat_eof(s, c); c = modified_fat_get(s, c)) {
+ void* direntry = array_get(&(s->directory), current_dir_index);
+ int ret = vvfat_read(s->bs, cluster2sector(s, c), direntry,
+ s->sectors_per_cluster);
+ if (ret)
+ return ret;
+ assert(!strncmp(s->directory.pointer, "QEMU", 4));
+ current_dir_index += factor;
+ }
+
+ ret = commit_mappings(s, first_cluster, dir_index);
+ if (ret)
+ return ret;
+
+ /* recurse */
+ for (i = 0; i < factor * new_cluster_count; i++) {
+ direntry = array_get(&(s->directory), first_dir_index + i);
+ if (is_directory(direntry) && !is_dot(direntry)) {
+ mapping = find_mapping_for_cluster(s, first_cluster);
+ assert(mapping->mode & MODE_DIRECTORY);
+ ret = commit_direntries(s, first_dir_index + i,
+ array_index(&(s->mapping), mapping));
+ if (ret)
+ return ret;
+ }
+ }
+
+ return 0;
+}
+
+/* commit one file (adjust contents, adjust mapping),
+ return first_mapping_index */
+static int commit_one_file(BDRVVVFATState* s,
+ int dir_index, uint32_t offset)
+{
+ direntry_t* direntry = array_get(&(s->directory), dir_index);
+ uint32_t c = begin_of_direntry(direntry);
+ uint32_t first_cluster = c;
+ mapping_t* mapping = find_mapping_for_cluster(s, c);
+ uint32_t size = filesize_of_direntry(direntry);
+ char* cluster = qemu_malloc(s->cluster_size);
+ uint32_t i;
+ int fd = 0;
+
+ assert(offset < size);
+ assert((offset % s->cluster_size) == 0);
+
+ for (i = s->cluster_size; i < offset; i += s->cluster_size)
+ c = modified_fat_get(s, c);
+
+ fd = open(mapping->path, O_RDWR | O_CREAT | O_BINARY, 0666);
+ if (fd < 0) {
+ fprintf(stderr, "Could not open %s... (%s, %d)\n", mapping->path,
+ strerror(errno), errno);
+ return fd;
+ }
+ if (offset > 0)
+ if (lseek(fd, offset, SEEK_SET) != offset)
+ return -3;
+
+ while (offset < size) {
+ uint32_t c1;
+ int rest_size = (size - offset > s->cluster_size ?
+ s->cluster_size : size - offset);
+ int ret;
+
+ c1 = modified_fat_get(s, c);
+
+ assert((size - offset == 0 && fat_eof(s, c)) ||
+ (size > offset && c >=2 && !fat_eof(s, c)));
+
+ ret = vvfat_read(s->bs, cluster2sector(s, c),
+ (uint8_t*)cluster, (rest_size + 0x1ff) / 0x200);
+
+ if (ret < 0)
+ return ret;
+
+ if (write(fd, cluster, rest_size) < 0)
+ return -2;
+
+ offset += rest_size;
+ c = c1;
+ }
+
+ if (ftruncate(fd, size)) {
+ perror("ftruncate()");
+ close(fd);
+ return -4;
+ }
+ close(fd);
+
+ return commit_mappings(s, first_cluster, dir_index);
+}
+
+#ifdef DEBUG
+/* test, if all mappings point to valid direntries */
+static void check1(BDRVVVFATState* s)
+{
+ int i;
+ for (i = 0; i < s->mapping.next; i++) {
+ mapping_t* mapping = array_get(&(s->mapping), i);
+ if (mapping->mode & MODE_DELETED) {
+ fprintf(stderr, "deleted\n");
+ continue;
+ }
+ assert(mapping->dir_index < s->directory.next);
+ direntry_t* direntry = array_get(&(s->directory), mapping->dir_index);
+ assert(mapping->begin == begin_of_direntry(direntry) || mapping->first_mapping_index >= 0);
+ if (mapping->mode & MODE_DIRECTORY) {
+ assert(mapping->info.dir.first_dir_index + 0x10 * s->sectors_per_cluster * (mapping->end - mapping->begin) <= s->directory.next);
+ assert((mapping->info.dir.first_dir_index % (0x10 * s->sectors_per_cluster)) == 0);
+ }
+ }
+}
+
+/* test, if all direntries have mappings */
+static void check2(BDRVVVFATState* s)
+{
+ int i;
+ int first_mapping = -1;
+
+ for (i = 0; i < s->directory.next; i++) {
+ direntry_t* direntry = array_get(&(s->directory), i);
+
+ if (is_short_name(direntry) && begin_of_direntry(direntry)) {
+ mapping_t* mapping = find_mapping_for_cluster(s, begin_of_direntry(direntry));
+ assert(mapping);
+ assert(mapping->dir_index == i || is_dot(direntry));
+ assert(mapping->begin == begin_of_direntry(direntry) || is_dot(direntry));
+ }
+
+ if ((i % (0x10 * s->sectors_per_cluster)) == 0) {
+ /* cluster start */
+ int j, count = 0;
+
+ for (j = 0; j < s->mapping.next; j++) {
+ mapping_t* mapping = array_get(&(s->mapping), j);
+ if (mapping->mode & MODE_DELETED)
+ continue;
+ if (mapping->mode & MODE_DIRECTORY) {
+ if (mapping->info.dir.first_dir_index <= i && mapping->info.dir.first_dir_index + 0x10 * s->sectors_per_cluster > i) {
+ assert(++count == 1);
+ if (mapping->first_mapping_index == -1)
+ first_mapping = array_index(&(s->mapping), mapping);
+ else
+ assert(first_mapping == mapping->first_mapping_index);
+ if (mapping->info.dir.parent_mapping_index < 0)
+ assert(j == 0);
+ else {
+ mapping_t* parent = array_get(&(s->mapping), mapping->info.dir.parent_mapping_index);
+ assert(parent->mode & MODE_DIRECTORY);
+ assert(parent->info.dir.first_dir_index < mapping->info.dir.first_dir_index);
+ }
+ }
+ }
+ }
+ if (count == 0)
+ first_mapping = -1;
+ }
+ }
+}
+#endif
+
+static int handle_renames_and_mkdirs(BDRVVVFATState* s)
+{
+ int i;
+
+#ifdef DEBUG
+ fprintf(stderr, "handle_renames\n");
+ for (i = 0; i < s->commits.next; i++) {
+ commit_t* commit = array_get(&(s->commits), i);
+ fprintf(stderr, "%d, %s (%d, %d)\n", i, commit->path ? commit->path : "(null)", commit->param.rename.cluster, commit->action);
+ }
+#endif
+
+ for (i = 0; i < s->commits.next;) {
+ commit_t* commit = array_get(&(s->commits), i);
+ if (commit->action == ACTION_RENAME) {
+ mapping_t* mapping = find_mapping_for_cluster(s,
+ commit->param.rename.cluster);
+ char* old_path = mapping->path;
+
+ assert(commit->path);
+ mapping->path = commit->path;
+ if (rename(old_path, mapping->path))
+ return -2;
+
+ if (mapping->mode & MODE_DIRECTORY) {
+ int l1 = strlen(mapping->path);
+ int l2 = strlen(old_path);
+ int diff = l1 - l2;
+ direntry_t* direntry = array_get(&(s->directory),
+ mapping->info.dir.first_dir_index);
+ uint32_t c = mapping->begin;
+ int i = 0;
+
+ /* recurse */
+ while (!fat_eof(s, c)) {
+ do {
+ direntry_t* d = direntry + i;
+
+ if (is_file(d) || (is_directory(d) && !is_dot(d))) {
+ mapping_t* m = find_mapping_for_cluster(s,
+ begin_of_direntry(d));
+ int l = strlen(m->path);
+ char* new_path = qemu_malloc(l + diff + 1);
+
+ assert(!strncmp(m->path, mapping->path, l2));
+
+ pstrcpy(new_path, l + diff + 1, mapping->path);
+ pstrcpy(new_path + l1, l + diff + 1 - l1,
+ m->path + l2);
+
+ schedule_rename(s, m->begin, new_path);
+ }
+ i++;
+ } while((i % (0x10 * s->sectors_per_cluster)) != 0);
+ c = fat_get(s, c);
+ }
+ }
+
+ free(old_path);
+ array_remove(&(s->commits), i);
+ continue;
+ } else if (commit->action == ACTION_MKDIR) {
+ mapping_t* mapping;
+ int j, parent_path_len;
+
+#ifdef __MINGW32__
+ if (mkdir(commit->path))
+ return -5;
+#else
+ if (mkdir(commit->path, 0755))
+ return -5;
+#endif
+
+ mapping = insert_mapping(s, commit->param.mkdir.cluster,
+ commit->param.mkdir.cluster + 1);
+ if (mapping == NULL)
+ return -6;
+
+ mapping->mode = MODE_DIRECTORY;
+ mapping->read_only = 0;
+ mapping->path = commit->path;
+ j = s->directory.next;
+ assert(j);
+ insert_direntries(s, s->directory.next,
+ 0x10 * s->sectors_per_cluster);
+ mapping->info.dir.first_dir_index = j;
+
+ parent_path_len = strlen(commit->path)
+ - strlen(get_basename(commit->path)) - 1;
+ for (j = 0; j < s->mapping.next; j++) {
+ mapping_t* m = array_get(&(s->mapping), j);
+ if (m->first_mapping_index < 0 && m != mapping &&
+ !strncmp(m->path, mapping->path, parent_path_len) &&
+ strlen(m->path) == parent_path_len)
+ break;
+ }
+ assert(j < s->mapping.next);
+ mapping->info.dir.parent_mapping_index = j;
+
+ array_remove(&(s->commits), i);
+ continue;
+ }
+
+ i++;
+ }
+ return 0;
+}
+
+/*
+ * TODO: make sure that the short name is not matching *another* file
+ */
+static int handle_commits(BDRVVVFATState* s)
+{
+ int i, fail = 0;
+
+ vvfat_close_current_file(s);
+
+ for (i = 0; !fail && i < s->commits.next; i++) {
+ commit_t* commit = array_get(&(s->commits), i);
+ switch(commit->action) {
+ case ACTION_RENAME: case ACTION_MKDIR:
+ abort();
+ fail = -2;
+ break;
+ case ACTION_WRITEOUT: {
+#ifndef NDEBUG
+ /* these variables are only used by assert() below */
+ direntry_t* entry = array_get(&(s->directory),
+ commit->param.writeout.dir_index);
+ uint32_t begin = begin_of_direntry(entry);
+ mapping_t* mapping = find_mapping_for_cluster(s, begin);
+#endif
+
+ assert(mapping);
+ assert(mapping->begin == begin);
+ assert(commit->path == NULL);
+
+ if (commit_one_file(s, commit->param.writeout.dir_index,
+ commit->param.writeout.modified_offset))
+ fail = -3;
+
+ break;
+ }
+ case ACTION_NEW_FILE: {
+ int begin = commit->param.new_file.first_cluster;
+ mapping_t* mapping = find_mapping_for_cluster(s, begin);
+ direntry_t* entry;
+ int i;
+
+ /* find direntry */
+ for (i = 0; i < s->directory.next; i++) {
+ entry = array_get(&(s->directory), i);
+ if (is_file(entry) && begin_of_direntry(entry) == begin)
+ break;
+ }
+
+ if (i >= s->directory.next) {
+ fail = -6;
+ continue;
+ }
+
+ /* make sure there exists an initial mapping */
+ if (mapping && mapping->begin != begin) {
+ mapping->end = begin;
+ mapping = NULL;
+ }
+ if (mapping == NULL) {
+ mapping = insert_mapping(s, begin, begin+1);
+ }
+ /* most members will be fixed in commit_mappings() */
+ assert(commit->path);
+ mapping->path = commit->path;
+ mapping->read_only = 0;
+ mapping->mode = MODE_NORMAL;
+ mapping->info.file.offset = 0;
+
+ if (commit_one_file(s, i, 0))
+ fail = -7;
+
+ break;
+ }
+ default:
+ abort();
+ }
+ }
+ if (i > 0 && array_remove_slice(&(s->commits), 0, i))
+ return -1;
+ return fail;
+}
+
+static int handle_deletes(BDRVVVFATState* s)
+{
+ int i, deferred = 1, deleted = 1;
+
+ /* delete files corresponding to mappings marked as deleted */
+ /* handle DELETEs and unused mappings (modified_fat_get(s, mapping->begin) == 0) */
+ while (deferred && deleted) {
+ deferred = 0;
+ deleted = 0;
+
+ for (i = 1; i < s->mapping.next; i++) {
+ mapping_t* mapping = array_get(&(s->mapping), i);
+ if (mapping->mode & MODE_DELETED) {
+ direntry_t* entry = array_get(&(s->directory),
+ mapping->dir_index);
+
+ if (is_free(entry)) {
+ /* remove file/directory */
+ if (mapping->mode & MODE_DIRECTORY) {
+ int j, next_dir_index = s->directory.next,
+ first_dir_index = mapping->info.dir.first_dir_index;
+
+ if (rmdir(mapping->path) < 0) {
+ if (errno == ENOTEMPTY) {
+ deferred++;
+ continue;
+ } else
+ return -5;
+ }
+
+ for (j = 1; j < s->mapping.next; j++) {
+ mapping_t* m = array_get(&(s->mapping), j);
+ if (m->mode & MODE_DIRECTORY &&
+ m->info.dir.first_dir_index >
+ first_dir_index &&
+ m->info.dir.first_dir_index <
+ next_dir_index)
+ next_dir_index =
+ m->info.dir.first_dir_index;
+ }
+ remove_direntries(s, first_dir_index,
+ next_dir_index - first_dir_index);
+
+ deleted++;
+ }
+ } else {
+ if (unlink(mapping->path))
+ return -4;
+ deleted++;
+ }
+ DLOG(fprintf(stderr, "DELETE (%d)\n", i); print_mapping(mapping); print_direntry(entry));
+ remove_mapping(s, i);
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * synchronize mapping with new state:
+ *
+ * - copy FAT (with bdrv_read)
+ * - mark all filenames corresponding to mappings as deleted
+ * - recurse direntries from root (using bs->bdrv_read)
+ * - delete files corresponding to mappings marked as deleted
+ */
+static int do_commit(BDRVVVFATState* s)
+{
+ int ret = 0;
+
+ /* the real meat are the commits. Nothing to do? Move along! */
+ if (s->commits.next == 0)
+ return 0;
+
+ vvfat_close_current_file(s);
+
+ ret = handle_renames_and_mkdirs(s);
+ if (ret) {
+ fprintf(stderr, "Error handling renames (%d)\n", ret);
+ abort();
+ return ret;
+ }
+
+ /* copy FAT (with bdrv_read) */
+ memcpy(s->fat.pointer, s->fat2, 0x200 * s->sectors_per_fat);
+
+ /* recurse direntries from root (using bs->bdrv_read) */
+ ret = commit_direntries(s, 0, -1);
+ if (ret) {
+ fprintf(stderr, "Fatal: error while committing (%d)\n", ret);
+ abort();
+ return ret;
+ }
+
+ ret = handle_commits(s);
+ if (ret) {
+ fprintf(stderr, "Error handling commits (%d)\n", ret);
+ abort();
+ return ret;
+ }
+
+ ret = handle_deletes(s);
+ if (ret) {
+ fprintf(stderr, "Error deleting\n");
+ abort();
+ return ret;
+ }
+
+ s->qcow->drv->bdrv_make_empty(s->qcow);
+
+ memset(s->used_clusters, 0, sector2cluster(s, s->sector_count));
+
+DLOG(checkpoint());
+ return 0;
+}
+
+static int try_commit(BDRVVVFATState* s)
+{
+ vvfat_close_current_file(s);
+DLOG(checkpoint());
+ if(!is_consistent(s))
+ return -1;
+ return do_commit(s);
+}
+
+static int vvfat_write(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors)
+{
+ BDRVVVFATState *s = bs->opaque;
+ int i, ret;
+
+DLOG(checkpoint());
+
+ /* Check if we're operating in read-only mode */
+ if (s->qcow == NULL) {
+ return -EACCES;
+ }
+
+ vvfat_close_current_file(s);
+
+ /*
+ * Some sanity checks:
+ * - do not allow writing to the boot sector
+ * - do not allow to write non-ASCII filenames
+ */
+
+ if (sector_num < s->first_sectors_number)
+ return -1;
+
+ for (i = sector2cluster(s, sector_num);
+ i <= sector2cluster(s, sector_num + nb_sectors - 1);) {
+ mapping_t* mapping = find_mapping_for_cluster(s, i);
+ if (mapping) {
+ if (mapping->read_only) {
+ fprintf(stderr, "Tried to write to write-protected file %s\n",
+ mapping->path);
+ return -1;
+ }
+
+ if (mapping->mode & MODE_DIRECTORY) {
+ int begin = cluster2sector(s, i);
+ int end = begin + s->sectors_per_cluster, k;
+ int dir_index;
+ const direntry_t* direntries;
+ long_file_name lfn;
+
+ lfn_init(&lfn);
+
+ if (begin < sector_num)
+ begin = sector_num;
+ if (end > sector_num + nb_sectors)
+ end = sector_num + nb_sectors;
+ dir_index = mapping->dir_index +
+ 0x10 * (begin - mapping->begin * s->sectors_per_cluster);
+ direntries = (direntry_t*)(buf + 0x200 * (begin - sector_num));
+
+ for (k = 0; k < (end - begin) * 0x10; k++) {
+ /* do not allow non-ASCII filenames */
+ if (parse_long_name(&lfn, direntries + k) < 0) {
+ fprintf(stderr, "Warning: non-ASCII filename\n");
+ return -1;
+ }
+ /* no access to the direntry of a read-only file */
+ else if (is_short_name(direntries+k) &&
+ (direntries[k].attributes & 1)) {
+ if (memcmp(direntries + k,
+ array_get(&(s->directory), dir_index + k),
+ sizeof(direntry_t))) {
+ fprintf(stderr, "Warning: tried to write to write-protected file\n");
+ return -1;
+ }
+ }
+ }
+ }
+ i = mapping->end;
+ } else
+ i++;
+ }
+
+ /*
+ * Use qcow backend. Commit later.
+ */
+DLOG(fprintf(stderr, "Write to qcow backend: %d + %d\n", (int)sector_num, nb_sectors));
+ ret = s->qcow->drv->bdrv_write(s->qcow, sector_num, buf, nb_sectors);
+ if (ret < 0) {
+ fprintf(stderr, "Error writing to qcow backend\n");
+ return ret;
+ }
+
+ for (i = sector2cluster(s, sector_num);
+ i <= sector2cluster(s, sector_num + nb_sectors - 1); i++)
+ if (i >= 0)
+ s->used_clusters[i] |= USED_ALLOCATED;
+
+DLOG(checkpoint());
+ /* TODO: add timeout */
+ try_commit(s);
+
+DLOG(checkpoint());
+ return 0;
+}
+
+static int vvfat_is_allocated(BlockDriverState *bs,
+ int64_t sector_num, int nb_sectors, int* n)
+{
+ BDRVVVFATState* s = bs->opaque;
+ *n = s->sector_count - sector_num;
+ if (*n > nb_sectors)
+ *n = nb_sectors;
+ else if (*n < 0)
+ return 0;
+ return 1;
+}
+
+static int write_target_commit(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t* buffer, int nb_sectors) {
+ BDRVVVFATState* s = *((BDRVVVFATState**) bs->opaque);
+ return try_commit(s);
+}
+
+static void write_target_close(BlockDriverState *bs) {
+ BDRVVVFATState* s = *((BDRVVVFATState**) bs->opaque);
+ bdrv_delete(s->qcow);
+ free(s->qcow_filename);
+}
+
+static BlockDriver vvfat_write_target = {
+ .format_name = "vvfat_write_target",
+ .bdrv_write = write_target_commit,
+ .bdrv_close = write_target_close,
+};
+
+static int enable_write_target(BDRVVVFATState *s)
+{
+ BlockDriver *bdrv_qcow;
+ QEMUOptionParameter *options;
+ int ret;
+ int size = sector2cluster(s, s->sector_count);
+ s->used_clusters = calloc(size, 1);
+
+ array_init(&(s->commits), sizeof(commit_t));
+
+ s->qcow_filename = qemu_malloc(1024);
+ get_tmp_filename(s->qcow_filename, 1024);
+
+ bdrv_qcow = bdrv_find_format("qcow");
+ options = parse_option_parameters("", bdrv_qcow->create_options, NULL);
+ set_option_parameter_int(options, BLOCK_OPT_SIZE, s->sector_count * 512);
+ set_option_parameter(options, BLOCK_OPT_BACKING_FILE, "fat:");
+
+ if (bdrv_create(bdrv_qcow, s->qcow_filename, options) < 0)
+ return -1;
+
+ s->qcow = bdrv_new("");
+ if (s->qcow == NULL) {
+ return -1;
+ }
+
+ ret = bdrv_open(s->qcow, s->qcow_filename,
+ BDRV_O_RDWR | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH, bdrv_qcow);
+ if (ret < 0) {
+ return ret;
+ }
+
+#ifndef _WIN32
+ unlink(s->qcow_filename);
+#endif
+
+ s->bs->backing_hd = calloc(sizeof(BlockDriverState), 1);
+ s->bs->backing_hd->drv = &vvfat_write_target;
+ s->bs->backing_hd->opaque = qemu_malloc(sizeof(void*));
+ *(void**)s->bs->backing_hd->opaque = s;
+
+ return 0;
+}
+
+static void vvfat_close(BlockDriverState *bs)
+{
+ BDRVVVFATState *s = bs->opaque;
+
+ vvfat_close_current_file(s);
+ array_free(&(s->fat));
+ array_free(&(s->directory));
+ array_free(&(s->mapping));
+ if(s->cluster_buffer)
+ free(s->cluster_buffer);
+}
+
+static BlockDriver bdrv_vvfat = {
+ .format_name = "vvfat",
+ .instance_size = sizeof(BDRVVVFATState),
+ .bdrv_file_open = vvfat_open,
+ .bdrv_read = vvfat_read,
+ .bdrv_write = vvfat_write,
+ .bdrv_close = vvfat_close,
+ .bdrv_is_allocated = vvfat_is_allocated,
+ .protocol_name = "fat",
+};
+
+static void bdrv_vvfat_init(void)
+{
+ bdrv_register(&bdrv_vvfat);
+}
+
+block_init(bdrv_vvfat_init);
+
+#ifdef DEBUG
+static void checkpoint(void) {
+ assert(((mapping_t*)array_get(&(vvv->mapping), 0))->end == 2);
+ check1(vvv);
+ check2(vvv);
+ assert(!vvv->current_mapping || vvv->current_fd || (vvv->current_mapping->mode & MODE_DIRECTORY));
+#if 0
+ if (((direntry_t*)vvv->directory.pointer)[1].attributes != 0xf)
+ fprintf(stderr, "Nonono!\n");
+ mapping_t* mapping;
+ direntry_t* direntry;
+ assert(vvv->mapping.size >= vvv->mapping.item_size * vvv->mapping.next);
+ assert(vvv->directory.size >= vvv->directory.item_size * vvv->directory.next);
+ if (vvv->mapping.next<47)
+ return;
+ assert((mapping = array_get(&(vvv->mapping), 47)));
+ assert(mapping->dir_index < vvv->directory.next);
+ direntry = array_get(&(vvv->directory), mapping->dir_index);
+ assert(!memcmp(direntry->name, "USB H ", 11) || direntry->name[0]==0);
+#endif
+ return;
+ /* avoid compiler warnings: */
+ hexdump(NULL, 100);
+ remove_mapping(vvv, 0);
+ print_mapping(NULL);
+ print_direntry(NULL);
+}
+#endif
diff --git a/qemu-0.15.x/block_int.h b/qemu-0.15.x/block_int.h
new file mode 100644
index 0000000..efb6803
--- /dev/null
+++ b/qemu-0.15.x/block_int.h
@@ -0,0 +1,266 @@
+/*
+ * QEMU System Emulator block driver
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * 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.
+ */
+#ifndef BLOCK_INT_H
+#define BLOCK_INT_H
+
+#include "block.h"
+#include "qemu-option.h"
+#include "qemu-queue.h"
+
+#define BLOCK_FLAG_ENCRYPT 1
+#define BLOCK_FLAG_COMPAT6 4
+
+#define BLOCK_OPT_SIZE "size"
+#define BLOCK_OPT_ENCRYPT "encryption"
+#define BLOCK_OPT_COMPAT6 "compat6"
+#define BLOCK_OPT_BACKING_FILE "backing_file"
+#define BLOCK_OPT_BACKING_FMT "backing_fmt"
+#define BLOCK_OPT_CLUSTER_SIZE "cluster_size"
+#define BLOCK_OPT_TABLE_SIZE "table_size"
+#define BLOCK_OPT_PREALLOC "preallocation"
+#define BLOCK_OPT_SUBFMT "subformat"
+
+typedef struct AIOPool {
+ void (*cancel)(BlockDriverAIOCB *acb);
+ int aiocb_size;
+ BlockDriverAIOCB *free_aiocb;
+} AIOPool;
+
+struct BlockDriver {
+ const char *format_name;
+ int instance_size;
+ int (*bdrv_probe)(const uint8_t *buf, int buf_size, const char *filename);
+ int (*bdrv_probe_device)(const char *filename);
+ int (*bdrv_open)(BlockDriverState *bs, int flags);
+ int (*bdrv_file_open)(BlockDriverState *bs, const char *filename, int flags);
+ int (*bdrv_read)(BlockDriverState *bs, int64_t sector_num,
+ uint8_t *buf, int nb_sectors);
+ int (*bdrv_write)(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors);
+ void (*bdrv_close)(BlockDriverState *bs);
+ int (*bdrv_create)(const char *filename, QEMUOptionParameter *options);
+ int (*bdrv_flush)(BlockDriverState *bs);
+ int (*bdrv_is_allocated)(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors, int *pnum);
+ int (*bdrv_set_key)(BlockDriverState *bs, const char *key);
+ int (*bdrv_make_empty)(BlockDriverState *bs);
+ /* aio */
+ BlockDriverAIOCB *(*bdrv_aio_readv)(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque);
+ BlockDriverAIOCB *(*bdrv_aio_writev)(BlockDriverState *bs,
+ int64_t sector_num, QEMUIOVector *qiov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque);
+ BlockDriverAIOCB *(*bdrv_aio_flush)(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque);
+ int (*bdrv_discard)(BlockDriverState *bs, int64_t sector_num,
+ int nb_sectors);
+
+ int (*bdrv_aio_multiwrite)(BlockDriverState *bs, BlockRequest *reqs,
+ int num_reqs);
+ int (*bdrv_merge_requests)(BlockDriverState *bs, BlockRequest* a,
+ BlockRequest *b);
+
+
+ const char *protocol_name;
+ int (*bdrv_truncate)(BlockDriverState *bs, int64_t offset);
+ int64_t (*bdrv_getlength)(BlockDriverState *bs);
+ int64_t (*bdrv_get_allocated_file_size)(BlockDriverState *bs);
+ int (*bdrv_write_compressed)(BlockDriverState *bs, int64_t sector_num,
+ const uint8_t *buf, int nb_sectors);
+
+ int (*bdrv_snapshot_create)(BlockDriverState *bs,
+ QEMUSnapshotInfo *sn_info);
+ int (*bdrv_snapshot_goto)(BlockDriverState *bs,
+ const char *snapshot_id);
+ int (*bdrv_snapshot_delete)(BlockDriverState *bs, const char *snapshot_id);
+ int (*bdrv_snapshot_list)(BlockDriverState *bs,
+ QEMUSnapshotInfo **psn_info);
+ int (*bdrv_snapshot_load_tmp)(BlockDriverState *bs,
+ const char *snapshot_name);
+ int (*bdrv_get_info)(BlockDriverState *bs, BlockDriverInfo *bdi);
+
+ int (*bdrv_save_vmstate)(BlockDriverState *bs, const uint8_t *buf,
+ int64_t pos, int size);
+ int (*bdrv_load_vmstate)(BlockDriverState *bs, uint8_t *buf,
+ int64_t pos, int size);
+
+ int (*bdrv_change_backing_file)(BlockDriverState *bs,
+ const char *backing_file, const char *backing_fmt);
+
+ /* removable device specific */
+ int (*bdrv_is_inserted)(BlockDriverState *bs);
+ int (*bdrv_media_changed)(BlockDriverState *bs);
+ int (*bdrv_eject)(BlockDriverState *bs, int eject_flag);
+ int (*bdrv_set_locked)(BlockDriverState *bs, int locked);
+
+ /* to control generic scsi devices */
+ int (*bdrv_ioctl)(BlockDriverState *bs, unsigned long int req, void *buf);
+ BlockDriverAIOCB *(*bdrv_aio_ioctl)(BlockDriverState *bs,
+ unsigned long int req, void *buf,
+ BlockDriverCompletionFunc *cb, void *opaque);
+
+ /* List of options for creating images, terminated by name == NULL */
+ QEMUOptionParameter *create_options;
+
+
+ /*
+ * Returns 0 for completed check, -errno for internal errors.
+ * The check results are stored in result.
+ */
+ int (*bdrv_check)(BlockDriverState* bs, BdrvCheckResult *result);
+
+ void (*bdrv_debug_event)(BlockDriverState *bs, BlkDebugEvent event);
+
+ /*
+ * Returns 1 if newly created images are guaranteed to contain only
+ * zeros, 0 otherwise.
+ */
+ int (*bdrv_has_zero_init)(BlockDriverState *bs);
+
+ QLIST_ENTRY(BlockDriver) list;
+};
+
+struct BlockDriverState {
+ int64_t total_sectors; /* if we are reading a disk image, give its
+ size in sectors */
+ int read_only; /* if true, the media is read only */
+ int keep_read_only; /* if true, the media was requested to stay read only */
+ int open_flags; /* flags used to open the file, re-used for re-open */
+ int removable; /* if true, the media can be removed */
+ int locked; /* if true, the media cannot temporarily be ejected */
+ int tray_open; /* if true, the virtual tray is open */
+ int encrypted; /* if true, the media is encrypted */
+ int valid_key; /* if true, a valid encryption key has been set */
+ int sg; /* if true, the device is a /dev/sg* */
+ /* event callback when inserting/removing */
+ void (*change_cb)(void *opaque, int reason);
+ void *change_opaque;
+
+ BlockDriver *drv; /* NULL means no media */
+ void *opaque;
+
+ DeviceState *peer;
+
+ char filename[1024];
+ char backing_file[1024]; /* if non zero, the image is a diff of
+ this file image */
+ char backing_format[16]; /* if non-zero and backing_file exists */
+ int is_temporary;
+ int media_changed;
+
+ BlockDriverState *backing_hd;
+ BlockDriverState *file;
+
+ /* async read/write emulation */
+
+ void *sync_aiocb;
+
+ /* I/O stats (display with "info blockstats"). */
+ uint64_t rd_bytes;
+ uint64_t wr_bytes;
+ uint64_t rd_ops;
+ uint64_t wr_ops;
+ uint64_t wr_highest_sector;
+
+ /* Whether the disk can expand beyond total_sectors */
+ int growable;
+
+ /* the memory alignment required for the buffers handled by this driver */
+ int buffer_alignment;
+
+ /* do we need to tell the quest if we have a volatile write cache? */
+ int enable_write_cache;
+
+ /* NOTE: the following infos are only hints for real hardware
+ drivers. They are not used by the block driver */
+ int cyls, heads, secs, translation;
+ BlockErrorAction on_read_error, on_write_error;
+ char device_name[32];
+ unsigned long *dirty_bitmap;
+ int64_t dirty_count;
+ int in_use; /* users other than guest access, eg. block migration */
+ QTAILQ_ENTRY(BlockDriverState) list;
+ void *private;
+};
+
+#define CHANGE_MEDIA 0x01
+#define CHANGE_SIZE 0x02
+
+struct BlockDriverAIOCB {
+ AIOPool *pool;
+ BlockDriverState *bs;
+ BlockDriverCompletionFunc *cb;
+ void *opaque;
+ BlockDriverAIOCB *next;
+};
+
+void get_tmp_filename(char *filename, int size);
+
+void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque);
+void qemu_aio_release(void *p);
+
+void *qemu_blockalign(BlockDriverState *bs, size_t size);
+
+#ifdef _WIN32
+int is_windows_drive(const char *filename);
+#endif
+
+typedef struct BlockConf {
+ BlockDriverState *bs;
+ uint16_t physical_block_size;
+ uint16_t logical_block_size;
+ uint16_t min_io_size;
+ uint32_t opt_io_size;
+ int32_t bootindex;
+ uint32_t discard_granularity;
+} BlockConf;
+
+static inline unsigned int get_physical_block_exp(BlockConf *conf)
+{
+ unsigned int exp = 0, size;
+
+ for (size = conf->physical_block_size;
+ size > conf->logical_block_size;
+ size >>= 1) {
+ exp++;
+ }
+
+ return exp;
+}
+
+#define DEFINE_BLOCK_PROPERTIES(_state, _conf) \
+ DEFINE_PROP_DRIVE("drive", _state, _conf.bs), \
+ DEFINE_PROP_UINT16("logical_block_size", _state, \
+ _conf.logical_block_size, 512), \
+ DEFINE_PROP_UINT16("physical_block_size", _state, \
+ _conf.physical_block_size, 512), \
+ DEFINE_PROP_UINT16("min_io_size", _state, _conf.min_io_size, 0), \
+ DEFINE_PROP_UINT32("opt_io_size", _state, _conf.opt_io_size, 0), \
+ DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1), \
+ DEFINE_PROP_UINT32("discard_granularity", _state, \
+ _conf.discard_granularity, 0)
+
+#endif /* BLOCK_INT_H */
diff --git a/qemu-0.15.x/blockdev.c b/qemu-0.15.x/blockdev.c
new file mode 100644
index 0000000..0b8d3a4
--- /dev/null
+++ b/qemu-0.15.x/blockdev.c
@@ -0,0 +1,795 @@
+/*
+ * QEMU host block devices
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * later. See the COPYING file in the top-level directory.
+ */
+
+#include "block.h"
+#include "blockdev.h"
+#include "monitor.h"
+#include "qerror.h"
+#include "qemu-option.h"
+#include "qemu-config.h"
+#include "sysemu.h"
+#include "hw/qdev.h"
+#include "block_int.h"
+
+static QTAILQ_HEAD(drivelist, DriveInfo) drives = QTAILQ_HEAD_INITIALIZER(drives);
+
+static const char *const if_name[IF_COUNT] = {
+ [IF_NONE] = "none",
+ [IF_IDE] = "ide",
+ [IF_SCSI] = "scsi",
+ [IF_FLOPPY] = "floppy",
+ [IF_PFLASH] = "pflash",
+ [IF_MTD] = "mtd",
+ [IF_SD] = "sd",
+ [IF_VIRTIO] = "virtio",
+ [IF_XEN] = "xen",
+};
+
+static const int if_max_devs[IF_COUNT] = {
+ /*
+ * Do not change these numbers! They govern how drive option
+ * index maps to unit and bus. That mapping is ABI.
+ *
+ * All controllers used to imlement if=T drives need to support
+ * if_max_devs[T] units, for any T with if_max_devs[T] != 0.
+ * Otherwise, some index values map to "impossible" bus, unit
+ * values.
+ *
+ * For instance, if you change [IF_SCSI] to 255, -drive
+ * if=scsi,index=12 no longer means bus=1,unit=5, but
+ * bus=0,unit=12. With an lsi53c895a controller (7 units max),
+ * the drive can't be set up. Regression.
+ */
+ [IF_IDE] = 2,
+ [IF_SCSI] = 7,
+};
+
+/*
+ * We automatically delete the drive when a device using it gets
+ * unplugged. Questionable feature, but we can't just drop it.
+ * Device models call blockdev_mark_auto_del() to schedule the
+ * automatic deletion, and generic qdev code calls blockdev_auto_del()
+ * when deletion is actually safe.
+ */
+void blockdev_mark_auto_del(BlockDriverState *bs)
+{
+ DriveInfo *dinfo = drive_get_by_blockdev(bs);
+
+ if (dinfo) {
+ dinfo->auto_del = 1;
+ }
+}
+
+void blockdev_auto_del(BlockDriverState *bs)
+{
+ DriveInfo *dinfo = drive_get_by_blockdev(bs);
+
+ if (dinfo && dinfo->auto_del) {
+ drive_put_ref(dinfo);
+ }
+}
+
+static int drive_index_to_bus_id(BlockInterfaceType type, int index)
+{
+ int max_devs = if_max_devs[type];
+ return max_devs ? index / max_devs : 0;
+}
+
+static int drive_index_to_unit_id(BlockInterfaceType type, int index)
+{
+ int max_devs = if_max_devs[type];
+ return max_devs ? index % max_devs : index;
+}
+
+QemuOpts *drive_def(const char *optstr)
+{
+ return qemu_opts_parse(qemu_find_opts("drive"), optstr, 0);
+}
+
+QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
+ const char *optstr)
+{
+ QemuOpts *opts;
+ char buf[32];
+
+ opts = drive_def(optstr);
+ if (!opts) {
+ return NULL;
+ }
+ if (type != IF_DEFAULT) {
+ qemu_opt_set(opts, "if", if_name[type]);
+ }
+ if (index >= 0) {
+ snprintf(buf, sizeof(buf), "%d", index);
+ qemu_opt_set(opts, "index", buf);
+ }
+ if (file)
+ qemu_opt_set(opts, "file", file);
+ return opts;
+}
+
+DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit)
+{
+ DriveInfo *dinfo;
+
+ /* seek interface, bus and unit */
+
+ QTAILQ_FOREACH(dinfo, &drives, next) {
+ if (dinfo->type == type &&
+ dinfo->bus == bus &&
+ dinfo->unit == unit)
+ return dinfo;
+ }
+
+ return NULL;
+}
+
+DriveInfo *drive_get_by_index(BlockInterfaceType type, int index)
+{
+ return drive_get(type,
+ drive_index_to_bus_id(type, index),
+ drive_index_to_unit_id(type, index));
+}
+
+int drive_get_max_bus(BlockInterfaceType type)
+{
+ int max_bus;
+ DriveInfo *dinfo;
+
+ max_bus = -1;
+ QTAILQ_FOREACH(dinfo, &drives, next) {
+ if(dinfo->type == type &&
+ dinfo->bus > max_bus)
+ max_bus = dinfo->bus;
+ }
+ return max_bus;
+}
+
+/* Get a block device. This should only be used for single-drive devices
+ (e.g. SD/Floppy/MTD). Multi-disk devices (scsi/ide) should use the
+ appropriate bus. */
+DriveInfo *drive_get_next(BlockInterfaceType type)
+{
+ static int next_block_unit[IF_COUNT];
+
+ return drive_get(type, 0, next_block_unit[type]++);
+}
+
+DriveInfo *drive_get_by_blockdev(BlockDriverState *bs)
+{
+ DriveInfo *dinfo;
+
+ QTAILQ_FOREACH(dinfo, &drives, next) {
+ if (dinfo->bdrv == bs) {
+ return dinfo;
+ }
+ }
+ return NULL;
+}
+
+static void bdrv_format_print(void *opaque, const char *name)
+{
+ error_printf(" %s", name);
+}
+
+static void drive_uninit(DriveInfo *dinfo)
+{
+ qemu_opts_del(dinfo->opts);
+ bdrv_delete(dinfo->bdrv);
+ qemu_free(dinfo->id);
+ QTAILQ_REMOVE(&drives, dinfo, next);
+ qemu_free(dinfo);
+}
+
+void drive_put_ref(DriveInfo *dinfo)
+{
+ assert(dinfo->refcount);
+ if (--dinfo->refcount == 0) {
+ drive_uninit(dinfo);
+ }
+}
+
+void drive_get_ref(DriveInfo *dinfo)
+{
+ dinfo->refcount++;
+}
+
+static int parse_block_error_action(const char *buf, int is_read)
+{
+ if (!strcmp(buf, "ignore")) {
+ return BLOCK_ERR_IGNORE;
+ } else if (!is_read && !strcmp(buf, "enospc")) {
+ return BLOCK_ERR_STOP_ENOSPC;
+ } else if (!strcmp(buf, "stop")) {
+ return BLOCK_ERR_STOP_ANY;
+ } else if (!strcmp(buf, "report")) {
+ return BLOCK_ERR_REPORT;
+ } else {
+ error_report("'%s' invalid %s error action",
+ buf, is_read ? "read" : "write");
+ return -1;
+ }
+}
+
+DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
+{
+ const char *buf;
+ const char *file = NULL;
+ char devname[128];
+ const char *serial;
+ const char *mediastr = "";
+ BlockInterfaceType type;
+ enum { MEDIA_DISK, MEDIA_CDROM } media;
+ int bus_id, unit_id;
+ int cyls, heads, secs, translation;
+ BlockDriver *drv = NULL;
+ int max_devs;
+ int index;
+ int ro = 0;
+ int bdrv_flags = 0;
+ int on_read_error, on_write_error;
+ const char *devaddr;
+ DriveInfo *dinfo;
+ int snapshot = 0;
+ int ret;
+
+ translation = BIOS_ATA_TRANSLATION_AUTO;
+ media = MEDIA_DISK;
+
+ /* extract parameters */
+ bus_id = qemu_opt_get_number(opts, "bus", 0);
+ unit_id = qemu_opt_get_number(opts, "unit", -1);
+ index = qemu_opt_get_number(opts, "index", -1);
+
+ cyls = qemu_opt_get_number(opts, "cyls", 0);
+ heads = qemu_opt_get_number(opts, "heads", 0);
+ secs = qemu_opt_get_number(opts, "secs", 0);
+
+ snapshot = qemu_opt_get_bool(opts, "snapshot", 0);
+ ro = qemu_opt_get_bool(opts, "readonly", 0);
+
+ file = qemu_opt_get(opts, "file");
+ serial = qemu_opt_get(opts, "serial");
+
+ if ((buf = qemu_opt_get(opts, "if")) != NULL) {
+ pstrcpy(devname, sizeof(devname), buf);
+ for (type = 0; type < IF_COUNT && strcmp(buf, if_name[type]); type++)
+ ;
+ if (type == IF_COUNT) {
+ error_report("unsupported bus type '%s'", buf);
+ return NULL;
+ }
+ } else {
+ type = default_to_scsi ? IF_SCSI : IF_IDE;
+ pstrcpy(devname, sizeof(devname), if_name[type]);
+ }
+
+ max_devs = if_max_devs[type];
+
+ if (cyls || heads || secs) {
+ if (cyls < 1 || (type == IF_IDE && cyls > 16383)) {
+ error_report("invalid physical cyls number");
+ return NULL;
+ }
+ if (heads < 1 || (type == IF_IDE && heads > 16)) {
+ error_report("invalid physical heads number");
+ return NULL;
+ }
+ if (secs < 1 || (type == IF_IDE && secs > 63)) {
+ error_report("invalid physical secs number");
+ return NULL;
+ }
+ }
+
+ if ((buf = qemu_opt_get(opts, "trans")) != NULL) {
+ if (!cyls) {
+ error_report("'%s' trans must be used with cyls, heads and secs",
+ buf);
+ return NULL;
+ }
+ if (!strcmp(buf, "none"))
+ translation = BIOS_ATA_TRANSLATION_NONE;
+ else if (!strcmp(buf, "lba"))
+ translation = BIOS_ATA_TRANSLATION_LBA;
+ else if (!strcmp(buf, "auto"))
+ translation = BIOS_ATA_TRANSLATION_AUTO;
+ else {
+ error_report("'%s' invalid translation type", buf);
+ return NULL;
+ }
+ }
+
+ if ((buf = qemu_opt_get(opts, "media")) != NULL) {
+ if (!strcmp(buf, "disk")) {
+ media = MEDIA_DISK;
+ } else if (!strcmp(buf, "cdrom")) {
+ if (cyls || secs || heads) {
+ error_report("CHS can't be set with media=%s", buf);
+ return NULL;
+ }
+ media = MEDIA_CDROM;
+ } else {
+ error_report("'%s' invalid media", buf);
+ return NULL;
+ }
+ }
+
+ if ((buf = qemu_opt_get(opts, "cache")) != NULL) {
+ if (!strcmp(buf, "off") || !strcmp(buf, "none")) {
+ bdrv_flags |= BDRV_O_NOCACHE | BDRV_O_CACHE_WB;
+ } else if (!strcmp(buf, "writeback")) {
+ bdrv_flags |= BDRV_O_CACHE_WB;
+ } else if (!strcmp(buf, "unsafe")) {
+ bdrv_flags |= BDRV_O_CACHE_WB;
+ bdrv_flags |= BDRV_O_NO_FLUSH;
+ } else if (!strcmp(buf, "writethrough")) {
+ /* this is the default */
+ } else {
+ error_report("invalid cache option");
+ return NULL;
+ }
+ }
+
+#ifdef CONFIG_LINUX_AIO
+ if ((buf = qemu_opt_get(opts, "aio")) != NULL) {
+ if (!strcmp(buf, "native")) {
+ bdrv_flags |= BDRV_O_NATIVE_AIO;
+ } else if (!strcmp(buf, "threads")) {
+ /* this is the default */
+ } else {
+ error_report("invalid aio option");
+ return NULL;
+ }
+ }
+#endif
+
+ if ((buf = qemu_opt_get(opts, "format")) != NULL) {
+ if (strcmp(buf, "?") == 0) {
+ error_printf("Supported formats:");
+ bdrv_iterate_format(bdrv_format_print, NULL);
+ error_printf("\n");
+ return NULL;
+ }
+ drv = bdrv_find_whitelisted_format(buf);
+ if (!drv) {
+ error_report("'%s' invalid format", buf);
+ return NULL;
+ }
+ }
+
+ on_write_error = BLOCK_ERR_STOP_ENOSPC;
+ if ((buf = qemu_opt_get(opts, "werror")) != NULL) {
+ if (type != IF_IDE && type != IF_SCSI && type != IF_VIRTIO && type != IF_NONE) {
+ error_report("werror is not supported by this bus type");
+ return NULL;
+ }
+
+ on_write_error = parse_block_error_action(buf, 0);
+ if (on_write_error < 0) {
+ return NULL;
+ }
+ }
+
+ on_read_error = BLOCK_ERR_REPORT;
+ if ((buf = qemu_opt_get(opts, "rerror")) != NULL) {
+ if (type != IF_IDE && type != IF_VIRTIO && type != IF_SCSI && type != IF_NONE) {
+ error_report("rerror is not supported by this bus type");
+ return NULL;
+ }
+
+ on_read_error = parse_block_error_action(buf, 1);
+ if (on_read_error < 0) {
+ return NULL;
+ }
+ }
+
+ if ((devaddr = qemu_opt_get(opts, "addr")) != NULL) {
+ if (type != IF_VIRTIO) {
+ error_report("addr is not supported by this bus type");
+ return NULL;
+ }
+ }
+
+ /* compute bus and unit according index */
+
+ if (index != -1) {
+ if (bus_id != 0 || unit_id != -1) {
+ error_report("index cannot be used with bus and unit");
+ return NULL;
+ }
+ bus_id = drive_index_to_bus_id(type, index);
+ unit_id = drive_index_to_unit_id(type, index);
+ }
+
+ /* if user doesn't specify a unit_id,
+ * try to find the first free
+ */
+
+ if (unit_id == -1) {
+ unit_id = 0;
+ while (drive_get(type, bus_id, unit_id) != NULL) {
+ unit_id++;
+ if (max_devs && unit_id >= max_devs) {
+ unit_id -= max_devs;
+ bus_id++;
+ }
+ }
+ }
+
+ /* check unit id */
+
+ if (max_devs && unit_id >= max_devs) {
+ error_report("unit %d too big (max is %d)",
+ unit_id, max_devs - 1);
+ return NULL;
+ }
+
+ /*
+ * catch multiple definitions
+ */
+
+ if (drive_get(type, bus_id, unit_id) != NULL) {
+ error_report("drive with bus=%d, unit=%d (index=%d) exists",
+ bus_id, unit_id, index);
+ return NULL;
+ }
+
+ /* init */
+
+ dinfo = qemu_mallocz(sizeof(*dinfo));
+ if ((buf = qemu_opts_id(opts)) != NULL) {
+ dinfo->id = qemu_strdup(buf);
+ } else {
+ /* no id supplied -> create one */
+ dinfo->id = qemu_mallocz(32);
+ if (type == IF_IDE || type == IF_SCSI)
+ mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
+ if (max_devs)
+ snprintf(dinfo->id, 32, "%s%i%s%i",
+ devname, bus_id, mediastr, unit_id);
+ else
+ snprintf(dinfo->id, 32, "%s%s%i",
+ devname, mediastr, unit_id);
+ }
+ dinfo->bdrv = bdrv_new(dinfo->id);
+ dinfo->devaddr = devaddr;
+ dinfo->type = type;
+ dinfo->bus = bus_id;
+ dinfo->unit = unit_id;
+ dinfo->opts = opts;
+ dinfo->refcount = 1;
+ if (serial)
+ strncpy(dinfo->serial, serial, sizeof(dinfo->serial) - 1);
+ QTAILQ_INSERT_TAIL(&drives, dinfo, next);
+
+ bdrv_set_on_error(dinfo->bdrv, on_read_error, on_write_error);
+
+ switch(type) {
+ case IF_IDE:
+ case IF_SCSI:
+ case IF_XEN:
+ case IF_NONE:
+ switch(media) {
+ case MEDIA_DISK:
+ if (cyls != 0) {
+ bdrv_set_geometry_hint(dinfo->bdrv, cyls, heads, secs);
+ bdrv_set_translation_hint(dinfo->bdrv, translation);
+ }
+ break;
+ case MEDIA_CDROM:
+ bdrv_set_removable(dinfo->bdrv, 1);
+ dinfo->media_cd = 1;
+ break;
+ }
+ break;
+ case IF_SD:
+ /* FIXME: This isn't really a floppy, but it's a reasonable
+ approximation. */
+ case IF_FLOPPY:
+ bdrv_set_removable(dinfo->bdrv, 1);
+ break;
+ case IF_PFLASH:
+ case IF_MTD:
+ break;
+ case IF_VIRTIO:
+ /* add virtio block device */
+ opts = qemu_opts_create(qemu_find_opts("device"), NULL, 0);
+ qemu_opt_set(opts, "driver", "virtio-blk");
+ qemu_opt_set(opts, "drive", dinfo->id);
+ if (devaddr)
+ qemu_opt_set(opts, "addr", devaddr);
+ break;
+ default:
+ abort();
+ }
+ if (!file || !*file) {
+ return dinfo;
+ }
+ if (snapshot) {
+ /* always use cache=unsafe with snapshot */
+ bdrv_flags &= ~BDRV_O_CACHE_MASK;
+ bdrv_flags |= (BDRV_O_SNAPSHOT|BDRV_O_CACHE_WB|BDRV_O_NO_FLUSH);
+ }
+
+ if (media == MEDIA_CDROM) {
+ /* CDROM is fine for any interface, don't check. */
+ ro = 1;
+ } else if (ro == 1) {
+ if (type != IF_SCSI && type != IF_VIRTIO && type != IF_FLOPPY && type != IF_NONE) {
+ error_report("readonly not supported by this bus type");
+ goto err;
+ }
+ }
+
+ bdrv_flags |= ro ? 0 : BDRV_O_RDWR;
+
+ ret = bdrv_open(dinfo->bdrv, file, bdrv_flags, drv);
+ if (ret < 0) {
+ error_report("could not open disk image %s: %s",
+ file, strerror(-ret));
+ goto err;
+ }
+
+ if (bdrv_key_required(dinfo->bdrv))
+ autostart = 0;
+ return dinfo;
+
+err:
+ bdrv_delete(dinfo->bdrv);
+ qemu_free(dinfo->id);
+ QTAILQ_REMOVE(&drives, dinfo, next);
+ qemu_free(dinfo);
+ return NULL;
+}
+
+void do_commit(Monitor *mon, const QDict *qdict)
+{
+ const char *device = qdict_get_str(qdict, "device");
+ BlockDriverState *bs;
+
+ if (!strcmp(device, "all")) {
+ bdrv_commit_all();
+ } else {
+ bs = bdrv_find(device);
+ if (!bs) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, device);
+ return;
+ }
+ bdrv_commit(bs);
+ }
+}
+
+int do_snapshot_blkdev(Monitor *mon, const QDict *qdict, QObject **ret_data)
+{
+ const char *device = qdict_get_str(qdict, "device");
+ const char *filename = qdict_get_try_str(qdict, "snapshot-file");
+ const char *format = qdict_get_try_str(qdict, "format");
+ BlockDriverState *bs;
+ BlockDriver *drv, *old_drv, *proto_drv;
+ int ret = 0;
+ int flags;
+ char old_filename[1024];
+
+ if (!filename) {
+ qerror_report(QERR_MISSING_PARAMETER, "snapshot-file");
+ ret = -1;
+ goto out;
+ }
+
+ bs = bdrv_find(device);
+ if (!bs) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, device);
+ ret = -1;
+ goto out;
+ }
+
+ pstrcpy(old_filename, sizeof(old_filename), bs->filename);
+
+ old_drv = bs->drv;
+ flags = bs->open_flags;
+
+ if (!format) {
+ format = "qcow2";
+ }
+
+ drv = bdrv_find_format(format);
+ if (!drv) {
+ qerror_report(QERR_INVALID_BLOCK_FORMAT, format);
+ ret = -1;
+ goto out;
+ }
+
+ proto_drv = bdrv_find_protocol(filename);
+ if (!proto_drv) {
+ qerror_report(QERR_INVALID_BLOCK_FORMAT, format);
+ ret = -1;
+ goto out;
+ }
+
+ ret = bdrv_img_create(filename, format, bs->filename,
+ bs->drv->format_name, NULL, -1, flags);
+ if (ret) {
+ goto out;
+ }
+
+ qemu_aio_flush();
+ bdrv_flush(bs);
+
+ bdrv_close(bs);
+ ret = bdrv_open(bs, filename, flags, drv);
+ /*
+ * If reopening the image file we just created fails, fall back
+ * and try to re-open the original image. If that fails too, we
+ * are in serious trouble.
+ */
+ if (ret != 0) {
+ ret = bdrv_open(bs, old_filename, flags, old_drv);
+ if (ret != 0) {
+ qerror_report(QERR_OPEN_FILE_FAILED, old_filename);
+ } else {
+ qerror_report(QERR_OPEN_FILE_FAILED, filename);
+ }
+ }
+out:
+ if (ret) {
+ ret = -1;
+ }
+
+ return ret;
+}
+
+static int eject_device(Monitor *mon, BlockDriverState *bs, int force)
+{
+ if (!force) {
+ if (!bdrv_is_removable(bs)) {
+ qerror_report(QERR_DEVICE_NOT_REMOVABLE,
+ bdrv_get_device_name(bs));
+ return -1;
+ }
+ if (bdrv_is_locked(bs)) {
+ qerror_report(QERR_DEVICE_LOCKED, bdrv_get_device_name(bs));
+ return -1;
+ }
+ }
+ bdrv_close(bs);
+ return 0;
+}
+
+int do_eject(Monitor *mon, const QDict *qdict, QObject **ret_data)
+{
+ BlockDriverState *bs;
+ int force = qdict_get_try_bool(qdict, "force", 0);
+ const char *filename = qdict_get_str(qdict, "device");
+
+ bs = bdrv_find(filename);
+ if (!bs) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, filename);
+ return -1;
+ }
+ return eject_device(mon, bs, force);
+}
+
+int do_block_set_passwd(Monitor *mon, const QDict *qdict,
+ QObject **ret_data)
+{
+ BlockDriverState *bs;
+ int err;
+
+ bs = bdrv_find(qdict_get_str(qdict, "device"));
+ if (!bs) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, qdict_get_str(qdict, "device"));
+ return -1;
+ }
+
+ err = bdrv_set_key(bs, qdict_get_str(qdict, "password"));
+ if (err == -EINVAL) {
+ qerror_report(QERR_DEVICE_NOT_ENCRYPTED, bdrv_get_device_name(bs));
+ return -1;
+ } else if (err < 0) {
+ qerror_report(QERR_INVALID_PASSWORD);
+ return -1;
+ }
+
+ return 0;
+}
+
+int do_change_block(Monitor *mon, const char *device,
+ const char *filename, const char *fmt)
+{
+ BlockDriverState *bs;
+ BlockDriver *drv = NULL;
+ int bdrv_flags;
+
+ bs = bdrv_find(device);
+ if (!bs) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, device);
+ return -1;
+ }
+ if (fmt) {
+ drv = bdrv_find_whitelisted_format(fmt);
+ if (!drv) {
+ qerror_report(QERR_INVALID_BLOCK_FORMAT, fmt);
+ return -1;
+ }
+ }
+ if (eject_device(mon, bs, 0) < 0) {
+ return -1;
+ }
+ bdrv_flags = bdrv_is_read_only(bs) ? 0 : BDRV_O_RDWR;
+ bdrv_flags |= bdrv_is_snapshot(bs) ? BDRV_O_SNAPSHOT : 0;
+ if (bdrv_open(bs, filename, bdrv_flags, drv) < 0) {
+ qerror_report(QERR_OPEN_FILE_FAILED, filename);
+ return -1;
+ }
+ return monitor_read_bdrv_key_start(mon, bs, NULL, NULL);
+}
+
+int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data)
+{
+ const char *id = qdict_get_str(qdict, "id");
+ BlockDriverState *bs;
+
+ bs = bdrv_find(id);
+ if (!bs) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, id);
+ return -1;
+ }
+ if (bdrv_in_use(bs)) {
+ qerror_report(QERR_DEVICE_IN_USE, id);
+ return -1;
+ }
+
+ /* quiesce block driver; prevent further io */
+ qemu_aio_flush();
+ bdrv_flush(bs);
+ bdrv_close(bs);
+
+ /* if we have a device associated with this BlockDriverState (bs->peer)
+ * then we need to make the drive anonymous until the device
+ * can be removed. If this is a drive with no device backing
+ * then we can just get rid of the block driver state right here.
+ */
+ if (bs->peer) {
+ bdrv_make_anon(bs);
+ } else {
+ drive_uninit(drive_get_by_blockdev(bs));
+ }
+
+ return 0;
+}
+
+/*
+ * XXX: replace the QERR_UNDEFINED_ERROR errors with real values once the
+ * existing QERR_ macro mess is cleaned up. A good example for better
+ * error reports can be found in the qemu-img resize code.
+ */
+int do_block_resize(Monitor *mon, const QDict *qdict, QObject **ret_data)
+{
+ const char *device = qdict_get_str(qdict, "device");
+ int64_t size = qdict_get_int(qdict, "size");
+ BlockDriverState *bs;
+
+ bs = bdrv_find(device);
+ if (!bs) {
+ qerror_report(QERR_DEVICE_NOT_FOUND, device);
+ return -1;
+ }
+
+ if (size < 0) {
+ qerror_report(QERR_UNDEFINED_ERROR);
+ return -1;
+ }
+
+ if (bdrv_truncate(bs, size)) {
+ qerror_report(QERR_UNDEFINED_ERROR);
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/qemu-0.15.x/blockdev.h b/qemu-0.15.x/blockdev.h
new file mode 100644
index 0000000..3587786
--- /dev/null
+++ b/qemu-0.15.x/blockdev.h
@@ -0,0 +1,69 @@
+/*
+ * QEMU host block devices
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * later. See the COPYING file in the top-level directory.
+ */
+
+#ifndef BLOCKDEV_H
+#define BLOCKDEV_H
+
+#include "block.h"
+#include "qemu-queue.h"
+
+void blockdev_mark_auto_del(BlockDriverState *bs);
+void blockdev_auto_del(BlockDriverState *bs);
+
+#define BLOCK_SERIAL_STRLEN 20
+
+typedef enum {
+ IF_DEFAULT = -1, /* for use with drive_add() only */
+ IF_NONE,
+ IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN,
+ IF_COUNT
+} BlockInterfaceType;
+
+struct DriveInfo {
+ BlockDriverState *bdrv;
+ char *id;
+ const char *devaddr;
+ BlockInterfaceType type;
+ int bus;
+ int unit;
+ int auto_del; /* see blockdev_mark_auto_del() */
+ int media_cd;
+ QemuOpts *opts;
+ char serial[BLOCK_SERIAL_STRLEN + 1];
+ QTAILQ_ENTRY(DriveInfo) next;
+ int refcount;
+};
+
+DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit);
+DriveInfo *drive_get_by_index(BlockInterfaceType type, int index);
+int drive_get_max_bus(BlockInterfaceType type);
+DriveInfo *drive_get_next(BlockInterfaceType type);
+void drive_get_ref(DriveInfo *dinfo);
+void drive_put_ref(DriveInfo *dinfo);
+DriveInfo *drive_get_by_blockdev(BlockDriverState *bs);
+
+QemuOpts *drive_def(const char *optstr);
+QemuOpts *drive_add(BlockInterfaceType type, int index, const char *file,
+ const char *optstr);
+DriveInfo *drive_init(QemuOpts *arg, int default_to_scsi);
+
+/* device-hotplug */
+
+DriveInfo *add_init_drive(const char *opts);
+
+void do_commit(Monitor *mon, const QDict *qdict);
+int do_eject(Monitor *mon, const QDict *qdict, QObject **ret_data);
+int do_block_set_passwd(Monitor *mon, const QDict *qdict, QObject **ret_data);
+int do_change_block(Monitor *mon, const char *device,
+ const char *filename, const char *fmt);
+int do_drive_del(Monitor *mon, const QDict *qdict, QObject **ret_data);
+int do_snapshot_blkdev(Monitor *mon, const QDict *qdict, QObject **ret_data);
+int do_block_resize(Monitor *mon, const QDict *qdict, QObject **ret_data);
+
+#endif
diff --git a/qemu-0.15.x/bsd-user/bsd-mman.h b/qemu-0.15.x/bsd-user/bsd-mman.h
new file mode 100644
index 0000000..910e8c1
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/bsd-mman.h
@@ -0,0 +1,121 @@
+/*-
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)mman.h 8.2 (Berkeley) 1/9/95
+ * $FreeBSD: src/sys/sys/mman.h,v 1.42 2008/03/28 04:29:27 ps Exp $
+ */
+
+#define TARGET_FREEBSD_MAP_RESERVED0080 0x0080 /* previously misimplemented MAP_INHERIT */
+#define TARGET_FREEBSD_MAP_RESERVED0100 0x0100 /* previously unimplemented MAP_NOEXTEND */
+#define TARGET_FREEBSD_MAP_STACK 0x0400 /* region grows down, like a stack */
+#define TARGET_FREEBSD_MAP_NOSYNC 0x0800 /* page to but do not sync underlying file */
+
+#define TARGET_FREEBSD_MAP_FLAGMASK 0x1ff7
+
+/* $NetBSD: mman.h,v 1.42 2008/11/18 22:13:49 ad Exp $ */
+
+/*-
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)mman.h 8.2 (Berkeley) 1/9/95
+ */
+#define TARGET_NETBSD_MAP_INHERIT 0x0080 /* region is retained after exec */
+#define TARGET_NETBSD_MAP_TRYFIXED 0x0400 /* attempt hint address, even within break */
+#define TARGET_NETBSD_MAP_WIRED 0x0800 /* mlock() mapping when it is established */
+
+#define TARGET_NETBSD_MAP_STACK 0x2000 /* allocated from memory, swap space (stack) */
+
+#define TARGET_NETBSD_MAP_FLAGMASK 0x3ff7
+
+/* $OpenBSD: mman.h,v 1.18 2003/07/21 22:52:19 tedu Exp $ */
+/* $NetBSD: mman.h,v 1.11 1995/03/26 20:24:23 jtc Exp $ */
+
+/*-
+ * Copyright (c) 1982, 1986, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)mman.h 8.1 (Berkeley) 6/2/93
+ */
+
+#define TARGET_OPENBSD_MAP_INHERIT 0x0080 /* region is retained after exec */
+#define TARGET_OPENBSD_MAP_NOEXTEND 0x0100 /* for MAP_FILE, don't change file size */
+#define TARGET_OPENBSD_MAP_TRYFIXED 0x0400 /* attempt hint address, even within heap */
+
+#define TARGET_OPENBSD_MAP_FLAGMASK 0x17f7
+
+// XXX
+#define TARGET_BSD_MAP_FLAGMASK 0x3ff7
diff --git a/qemu-0.15.x/bsd-user/bsdload.c b/qemu-0.15.x/bsd-user/bsdload.c
new file mode 100644
index 0000000..6d9bb6f
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/bsdload.c
@@ -0,0 +1,202 @@
+/* Code for loading BSD executables. Mostly linux kernel code. */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "qemu.h"
+
+#define TARGET_NGROUPS 32
+
+/* ??? This should really be somewhere else. */
+abi_long memcpy_to_target(abi_ulong dest, const void *src,
+ unsigned long len)
+{
+ void *host_ptr;
+
+ host_ptr = lock_user(VERIFY_WRITE, dest, len, 0);
+ if (!host_ptr)
+ return -TARGET_EFAULT;
+ memcpy(host_ptr, src, len);
+ unlock_user(host_ptr, dest, 1);
+ return 0;
+}
+
+static int in_group_p(gid_t g)
+{
+ /* return TRUE if we're in the specified group, FALSE otherwise */
+ int ngroup;
+ int i;
+ gid_t grouplist[TARGET_NGROUPS];
+
+ ngroup = getgroups(TARGET_NGROUPS, grouplist);
+ for(i = 0; i < ngroup; i++) {
+ if(grouplist[i] == g) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static int count(char ** vec)
+{
+ int i;
+
+ for(i = 0; *vec; i++) {
+ vec++;
+ }
+
+ return(i);
+}
+
+static int prepare_binprm(struct linux_binprm *bprm)
+{
+ struct stat st;
+ int mode;
+ int retval, id_change;
+
+ if(fstat(bprm->fd, &st) < 0) {
+ return(-errno);
+ }
+
+ mode = st.st_mode;
+ if(!S_ISREG(mode)) { /* Must be regular file */
+ return(-EACCES);
+ }
+ if(!(mode & 0111)) { /* Must have at least one execute bit set */
+ return(-EACCES);
+ }
+
+ bprm->e_uid = geteuid();
+ bprm->e_gid = getegid();
+ id_change = 0;
+
+ /* Set-uid? */
+ if(mode & S_ISUID) {
+ bprm->e_uid = st.st_uid;
+ if(bprm->e_uid != geteuid()) {
+ id_change = 1;
+ }
+ }
+
+ /* Set-gid? */
+ /*
+ * If setgid is set but no group execute bit then this
+ * is a candidate for mandatory locking, not a setgid
+ * executable.
+ */
+ if ((mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
+ bprm->e_gid = st.st_gid;
+ if (!in_group_p(bprm->e_gid)) {
+ id_change = 1;
+ }
+ }
+
+ memset(bprm->buf, 0, sizeof(bprm->buf));
+ retval = lseek(bprm->fd, 0L, SEEK_SET);
+ if(retval >= 0) {
+ retval = read(bprm->fd, bprm->buf, 128);
+ }
+ if(retval < 0) {
+ perror("prepare_binprm");
+ exit(-1);
+ /* return(-errno); */
+ }
+ else {
+ return(retval);
+ }
+}
+
+/* Construct the envp and argv tables on the target stack. */
+abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp,
+ abi_ulong stringp, int push_ptr)
+{
+ int n = sizeof(abi_ulong);
+ abi_ulong envp;
+ abi_ulong argv;
+
+ sp -= (envc + 1) * n;
+ envp = sp;
+ sp -= (argc + 1) * n;
+ argv = sp;
+ if (push_ptr) {
+ /* FIXME - handle put_user() failures */
+ sp -= n;
+ put_user_ual(envp, sp);
+ sp -= n;
+ put_user_ual(argv, sp);
+ }
+ sp -= n;
+ /* FIXME - handle put_user() failures */
+ put_user_ual(argc, sp);
+
+ while (argc-- > 0) {
+ /* FIXME - handle put_user() failures */
+ put_user_ual(stringp, argv);
+ argv += n;
+ stringp += target_strlen(stringp) + 1;
+ }
+ /* FIXME - handle put_user() failures */
+ put_user_ual(0, argv);
+ while (envc-- > 0) {
+ /* FIXME - handle put_user() failures */
+ put_user_ual(stringp, envp);
+ envp += n;
+ stringp += target_strlen(stringp) + 1;
+ }
+ /* FIXME - handle put_user() failures */
+ put_user_ual(0, envp);
+
+ return sp;
+}
+
+int loader_exec(const char * filename, char ** argv, char ** envp,
+ struct target_pt_regs * regs, struct image_info *infop)
+{
+ struct linux_binprm bprm;
+ int retval;
+ int i;
+
+ bprm.p = TARGET_PAGE_SIZE*MAX_ARG_PAGES-sizeof(unsigned int);
+ for (i=0 ; i<MAX_ARG_PAGES ; i++) /* clear page-table */
+ bprm.page[i] = NULL;
+ retval = open(filename, O_RDONLY);
+ if (retval < 0)
+ return retval;
+ bprm.fd = retval;
+ bprm.filename = (char *)filename;
+ bprm.argc = count(argv);
+ bprm.argv = argv;
+ bprm.envc = count(envp);
+ bprm.envp = envp;
+
+ retval = prepare_binprm(&bprm);
+
+ if(retval>=0) {
+ if (bprm.buf[0] == 0x7f
+ && bprm.buf[1] == 'E'
+ && bprm.buf[2] == 'L'
+ && bprm.buf[3] == 'F') {
+ retval = load_elf_binary(&bprm,regs,infop);
+ } else {
+ fprintf(stderr, "Unknown binary format\n");
+ return -1;
+ }
+ }
+
+ if(retval>=0) {
+ /* success. Initialize important registers */
+ do_init_thread(regs, infop);
+ return retval;
+ }
+
+ /* Something went wrong, return the inode and free the argument pages*/
+ for (i=0 ; i<MAX_ARG_PAGES ; i++) {
+ free(bprm.page[i]);
+ }
+ return(retval);
+}
diff --git a/qemu-0.15.x/bsd-user/elfload.c b/qemu-0.15.x/bsd-user/elfload.c
new file mode 100644
index 0000000..1ef1f97
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/elfload.c
@@ -0,0 +1,1577 @@
+/* This is the Linux kernel elf-loading code, ported into user space */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "qemu.h"
+#include "disas.h"
+
+#ifdef _ARCH_PPC64
+#undef ARCH_DLINFO
+#undef ELF_PLATFORM
+#undef ELF_HWCAP
+#undef ELF_CLASS
+#undef ELF_DATA
+#undef ELF_ARCH
+#endif
+
+/* from personality.h */
+
+/*
+ * Flags for bug emulation.
+ *
+ * These occupy the top three bytes.
+ */
+enum {
+ ADDR_NO_RANDOMIZE = 0x0040000, /* disable randomization of VA space */
+ FDPIC_FUNCPTRS = 0x0080000, /* userspace function ptrs point to descriptors
+ * (signal handling)
+ */
+ MMAP_PAGE_ZERO = 0x0100000,
+ ADDR_COMPAT_LAYOUT = 0x0200000,
+ READ_IMPLIES_EXEC = 0x0400000,
+ ADDR_LIMIT_32BIT = 0x0800000,
+ SHORT_INODE = 0x1000000,
+ WHOLE_SECONDS = 0x2000000,
+ STICKY_TIMEOUTS = 0x4000000,
+ ADDR_LIMIT_3GB = 0x8000000,
+};
+
+/*
+ * Personality types.
+ *
+ * These go in the low byte. Avoid using the top bit, it will
+ * conflict with error returns.
+ */
+enum {
+ PER_LINUX = 0x0000,
+ PER_LINUX_32BIT = 0x0000 | ADDR_LIMIT_32BIT,
+ PER_LINUX_FDPIC = 0x0000 | FDPIC_FUNCPTRS,
+ PER_SVR4 = 0x0001 | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
+ PER_SVR3 = 0x0002 | STICKY_TIMEOUTS | SHORT_INODE,
+ PER_SCOSVR3 = 0x0003 | STICKY_TIMEOUTS |
+ WHOLE_SECONDS | SHORT_INODE,
+ PER_OSR5 = 0x0003 | STICKY_TIMEOUTS | WHOLE_SECONDS,
+ PER_WYSEV386 = 0x0004 | STICKY_TIMEOUTS | SHORT_INODE,
+ PER_ISCR4 = 0x0005 | STICKY_TIMEOUTS,
+ PER_BSD = 0x0006,
+ PER_SUNOS = 0x0006 | STICKY_TIMEOUTS,
+ PER_XENIX = 0x0007 | STICKY_TIMEOUTS | SHORT_INODE,
+ PER_LINUX32 = 0x0008,
+ PER_LINUX32_3GB = 0x0008 | ADDR_LIMIT_3GB,
+ PER_IRIX32 = 0x0009 | STICKY_TIMEOUTS,/* IRIX5 32-bit */
+ PER_IRIXN32 = 0x000a | STICKY_TIMEOUTS,/* IRIX6 new 32-bit */
+ PER_IRIX64 = 0x000b | STICKY_TIMEOUTS,/* IRIX6 64-bit */
+ PER_RISCOS = 0x000c,
+ PER_SOLARIS = 0x000d | STICKY_TIMEOUTS,
+ PER_UW7 = 0x000e | STICKY_TIMEOUTS | MMAP_PAGE_ZERO,
+ PER_OSF4 = 0x000f, /* OSF/1 v4 */
+ PER_HPUX = 0x0010,
+ PER_MASK = 0x00ff,
+};
+
+/*
+ * Return the base personality without flags.
+ */
+#define personality(pers) (pers & PER_MASK)
+
+/* this flag is uneffective under linux too, should be deleted */
+#ifndef MAP_DENYWRITE
+#define MAP_DENYWRITE 0
+#endif
+
+/* should probably go in elf.h */
+#ifndef ELIBBAD
+#define ELIBBAD 80
+#endif
+
+#ifdef TARGET_I386
+
+#define ELF_PLATFORM get_elf_platform()
+
+static const char *get_elf_platform(void)
+{
+ static char elf_platform[] = "i386";
+ int family = (thread_env->cpuid_version >> 8) & 0xff;
+ if (family > 6)
+ family = 6;
+ if (family >= 3)
+ elf_platform[1] = '0' + family;
+ return elf_platform;
+}
+
+#define ELF_HWCAP get_elf_hwcap()
+
+static uint32_t get_elf_hwcap(void)
+{
+ return thread_env->cpuid_features;
+}
+
+#ifdef TARGET_X86_64
+#define ELF_START_MMAP 0x2aaaaab000ULL
+#define elf_check_arch(x) ( ((x) == ELF_ARCH) )
+
+#define ELF_CLASS ELFCLASS64
+#define ELF_DATA ELFDATA2LSB
+#define ELF_ARCH EM_X86_64
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ regs->rax = 0;
+ regs->rsp = infop->start_stack;
+ regs->rip = infop->entry;
+ if (bsd_type == target_freebsd) {
+ regs->rdi = infop->start_stack;
+ }
+}
+
+#else
+
+#define ELF_START_MMAP 0x80000000
+
+/*
+ * This is used to ensure we don't load something for the wrong architecture.
+ */
+#define elf_check_arch(x) ( ((x) == EM_386) || ((x) == EM_486) )
+
+/*
+ * These are used to set parameters in the core dumps.
+ */
+#define ELF_CLASS ELFCLASS32
+#define ELF_DATA ELFDATA2LSB
+#define ELF_ARCH EM_386
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ regs->esp = infop->start_stack;
+ regs->eip = infop->entry;
+
+ /* SVR4/i386 ABI (pages 3-31, 3-32) says that when the program
+ starts %edx contains a pointer to a function which might be
+ registered using `atexit'. This provides a mean for the
+ dynamic linker to call DT_FINI functions for shared libraries
+ that have been loaded before the code runs.
+
+ A value of 0 tells we have no such handler. */
+ regs->edx = 0;
+}
+#endif
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 4096
+
+#endif
+
+#ifdef TARGET_ARM
+
+#define ELF_START_MMAP 0x80000000
+
+#define elf_check_arch(x) ( (x) == EM_ARM )
+
+#define ELF_CLASS ELFCLASS32
+#ifdef TARGET_WORDS_BIGENDIAN
+#define ELF_DATA ELFDATA2MSB
+#else
+#define ELF_DATA ELFDATA2LSB
+#endif
+#define ELF_ARCH EM_ARM
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ abi_long stack = infop->start_stack;
+ memset(regs, 0, sizeof(*regs));
+ regs->ARM_cpsr = 0x10;
+ if (infop->entry & 1)
+ regs->ARM_cpsr |= CPSR_T;
+ regs->ARM_pc = infop->entry & 0xfffffffe;
+ regs->ARM_sp = infop->start_stack;
+ /* FIXME - what to for failure of get_user()? */
+ get_user_ual(regs->ARM_r2, stack + 8); /* envp */
+ get_user_ual(regs->ARM_r1, stack + 4); /* envp */
+ /* XXX: it seems that r0 is zeroed after ! */
+ regs->ARM_r0 = 0;
+ /* For uClinux PIC binaries. */
+ /* XXX: Linux does this only on ARM with no MMU (do we care ?) */
+ regs->ARM_r10 = infop->start_data;
+}
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 4096
+
+enum
+{
+ ARM_HWCAP_ARM_SWP = 1 << 0,
+ ARM_HWCAP_ARM_HALF = 1 << 1,
+ ARM_HWCAP_ARM_THUMB = 1 << 2,
+ ARM_HWCAP_ARM_26BIT = 1 << 3,
+ ARM_HWCAP_ARM_FAST_MULT = 1 << 4,
+ ARM_HWCAP_ARM_FPA = 1 << 5,
+ ARM_HWCAP_ARM_VFP = 1 << 6,
+ ARM_HWCAP_ARM_EDSP = 1 << 7,
+};
+
+#define ELF_HWCAP (ARM_HWCAP_ARM_SWP | ARM_HWCAP_ARM_HALF \
+ | ARM_HWCAP_ARM_THUMB | ARM_HWCAP_ARM_FAST_MULT \
+ | ARM_HWCAP_ARM_FPA | ARM_HWCAP_ARM_VFP)
+
+#endif
+
+#ifdef TARGET_SPARC
+#ifdef TARGET_SPARC64
+
+#define ELF_START_MMAP 0x80000000
+
+#ifndef TARGET_ABI32
+#define elf_check_arch(x) ( (x) == EM_SPARCV9 || (x) == EM_SPARC32PLUS )
+#else
+#define elf_check_arch(x) ( (x) == EM_SPARC32PLUS || (x) == EM_SPARC )
+#endif
+
+#define ELF_CLASS ELFCLASS64
+#define ELF_DATA ELFDATA2MSB
+#define ELF_ARCH EM_SPARCV9
+
+#define STACK_BIAS 2047
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+#ifndef TARGET_ABI32
+ regs->tstate = 0;
+#endif
+ regs->pc = infop->entry;
+ regs->npc = regs->pc + 4;
+ regs->y = 0;
+#ifdef TARGET_ABI32
+ regs->u_regs[14] = infop->start_stack - 16 * 4;
+#else
+ if (personality(infop->personality) == PER_LINUX32)
+ regs->u_regs[14] = infop->start_stack - 16 * 4;
+ else {
+ regs->u_regs[14] = infop->start_stack - 16 * 8 - STACK_BIAS;
+ if (bsd_type == target_freebsd) {
+ regs->u_regs[8] = infop->start_stack;
+ regs->u_regs[11] = infop->start_stack;
+ }
+ }
+#endif
+}
+
+#else
+#define ELF_START_MMAP 0x80000000
+
+#define elf_check_arch(x) ( (x) == EM_SPARC )
+
+#define ELF_CLASS ELFCLASS32
+#define ELF_DATA ELFDATA2MSB
+#define ELF_ARCH EM_SPARC
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ regs->psr = 0;
+ regs->pc = infop->entry;
+ regs->npc = regs->pc + 4;
+ regs->y = 0;
+ regs->u_regs[14] = infop->start_stack - 16 * 4;
+}
+
+#endif
+#endif
+
+#ifdef TARGET_PPC
+
+#define ELF_START_MMAP 0x80000000
+
+#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
+
+#define elf_check_arch(x) ( (x) == EM_PPC64 )
+
+#define ELF_CLASS ELFCLASS64
+
+#else
+
+#define elf_check_arch(x) ( (x) == EM_PPC )
+
+#define ELF_CLASS ELFCLASS32
+
+#endif
+
+#ifdef TARGET_WORDS_BIGENDIAN
+#define ELF_DATA ELFDATA2MSB
+#else
+#define ELF_DATA ELFDATA2LSB
+#endif
+#define ELF_ARCH EM_PPC
+
+/*
+ * We need to put in some extra aux table entries to tell glibc what
+ * the cache block size is, so it can use the dcbz instruction safely.
+ */
+#define AT_DCACHEBSIZE 19
+#define AT_ICACHEBSIZE 20
+#define AT_UCACHEBSIZE 21
+/* A special ignored type value for PPC, for glibc compatibility. */
+#define AT_IGNOREPPC 22
+/*
+ * The requirements here are:
+ * - keep the final alignment of sp (sp & 0xf)
+ * - make sure the 32-bit value at the first 16 byte aligned position of
+ * AUXV is greater than 16 for glibc compatibility.
+ * AT_IGNOREPPC is used for that.
+ * - for compatibility with glibc ARCH_DLINFO must always be defined on PPC,
+ * even if DLINFO_ARCH_ITEMS goes to zero or is undefined.
+ */
+#define DLINFO_ARCH_ITEMS 5
+#define ARCH_DLINFO \
+do { \
+ NEW_AUX_ENT(AT_DCACHEBSIZE, 0x20); \
+ NEW_AUX_ENT(AT_ICACHEBSIZE, 0x20); \
+ NEW_AUX_ENT(AT_UCACHEBSIZE, 0); \
+ /* \
+ * Now handle glibc compatibility. \
+ */ \
+ NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \
+ NEW_AUX_ENT(AT_IGNOREPPC, AT_IGNOREPPC); \
+ } while (0)
+
+static inline void init_thread(struct target_pt_regs *_regs, struct image_info *infop)
+{
+ abi_ulong pos = infop->start_stack;
+ abi_ulong tmp;
+#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
+ abi_ulong entry, toc;
+#endif
+
+ _regs->gpr[1] = infop->start_stack;
+#if defined(TARGET_PPC64) && !defined(TARGET_ABI32)
+ entry = ldq_raw(infop->entry) + infop->load_addr;
+ toc = ldq_raw(infop->entry + 8) + infop->load_addr;
+ _regs->gpr[2] = toc;
+ infop->entry = entry;
+#endif
+ _regs->nip = infop->entry;
+ /* Note that isn't exactly what regular kernel does
+ * but this is what the ABI wants and is needed to allow
+ * execution of PPC BSD programs.
+ */
+ /* FIXME - what to for failure of get_user()? */
+ get_user_ual(_regs->gpr[3], pos);
+ pos += sizeof(abi_ulong);
+ _regs->gpr[4] = pos;
+ for (tmp = 1; tmp != 0; pos += sizeof(abi_ulong))
+ tmp = ldl(pos);
+ _regs->gpr[5] = pos;
+}
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 4096
+
+#endif
+
+#ifdef TARGET_MIPS
+
+#define ELF_START_MMAP 0x80000000
+
+#define elf_check_arch(x) ( (x) == EM_MIPS )
+
+#ifdef TARGET_MIPS64
+#define ELF_CLASS ELFCLASS64
+#else
+#define ELF_CLASS ELFCLASS32
+#endif
+#ifdef TARGET_WORDS_BIGENDIAN
+#define ELF_DATA ELFDATA2MSB
+#else
+#define ELF_DATA ELFDATA2LSB
+#endif
+#define ELF_ARCH EM_MIPS
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ regs->cp0_status = 2 << CP0St_KSU;
+ regs->cp0_epc = infop->entry;
+ regs->regs[29] = infop->start_stack;
+}
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 4096
+
+#endif /* TARGET_MIPS */
+
+#ifdef TARGET_SH4
+
+#define ELF_START_MMAP 0x80000000
+
+#define elf_check_arch(x) ( (x) == EM_SH )
+
+#define ELF_CLASS ELFCLASS32
+#define ELF_DATA ELFDATA2LSB
+#define ELF_ARCH EM_SH
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ /* Check other registers XXXXX */
+ regs->pc = infop->entry;
+ regs->regs[15] = infop->start_stack;
+}
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 4096
+
+#endif
+
+#ifdef TARGET_CRIS
+
+#define ELF_START_MMAP 0x80000000
+
+#define elf_check_arch(x) ( (x) == EM_CRIS )
+
+#define ELF_CLASS ELFCLASS32
+#define ELF_DATA ELFDATA2LSB
+#define ELF_ARCH EM_CRIS
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ regs->erp = infop->entry;
+}
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 8192
+
+#endif
+
+#ifdef TARGET_M68K
+
+#define ELF_START_MMAP 0x80000000
+
+#define elf_check_arch(x) ( (x) == EM_68K )
+
+#define ELF_CLASS ELFCLASS32
+#define ELF_DATA ELFDATA2MSB
+#define ELF_ARCH EM_68K
+
+/* ??? Does this need to do anything?
+#define ELF_PLAT_INIT(_r) */
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ regs->usp = infop->start_stack;
+ regs->sr = 0;
+ regs->pc = infop->entry;
+}
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 8192
+
+#endif
+
+#ifdef TARGET_ALPHA
+
+#define ELF_START_MMAP (0x30000000000ULL)
+
+#define elf_check_arch(x) ( (x) == ELF_ARCH )
+
+#define ELF_CLASS ELFCLASS64
+#define ELF_DATA ELFDATA2MSB
+#define ELF_ARCH EM_ALPHA
+
+static inline void init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ regs->pc = infop->entry;
+ regs->ps = 8;
+ regs->usp = infop->start_stack;
+ regs->unique = infop->start_data; /* ? */
+ printf("Set unique value to " TARGET_FMT_lx " (" TARGET_FMT_lx ")\n",
+ regs->unique, infop->start_data);
+}
+
+#define USE_ELF_CORE_DUMP
+#define ELF_EXEC_PAGESIZE 8192
+
+#endif /* TARGET_ALPHA */
+
+#ifndef ELF_PLATFORM
+#define ELF_PLATFORM (NULL)
+#endif
+
+#ifndef ELF_HWCAP
+#define ELF_HWCAP 0
+#endif
+
+#ifdef TARGET_ABI32
+#undef ELF_CLASS
+#define ELF_CLASS ELFCLASS32
+#undef bswaptls
+#define bswaptls(ptr) bswap32s(ptr)
+#endif
+
+#include "elf.h"
+
+struct exec
+{
+ unsigned int a_info; /* Use macros N_MAGIC, etc for access */
+ unsigned int a_text; /* length of text, in bytes */
+ unsigned int a_data; /* length of data, in bytes */
+ unsigned int a_bss; /* length of uninitialized data area, in bytes */
+ unsigned int a_syms; /* length of symbol table data in file, in bytes */
+ unsigned int a_entry; /* start address */
+ unsigned int a_trsize; /* length of relocation info for text, in bytes */
+ unsigned int a_drsize; /* length of relocation info for data, in bytes */
+};
+
+
+#define N_MAGIC(exec) ((exec).a_info & 0xffff)
+#define OMAGIC 0407
+#define NMAGIC 0410
+#define ZMAGIC 0413
+#define QMAGIC 0314
+
+/* max code+data+bss space allocated to elf interpreter */
+#define INTERP_MAP_SIZE (32 * 1024 * 1024)
+
+/* max code+data+bss+brk space allocated to ET_DYN executables */
+#define ET_DYN_MAP_SIZE (128 * 1024 * 1024)
+
+/* Necessary parameters */
+#define TARGET_ELF_EXEC_PAGESIZE TARGET_PAGE_SIZE
+#define TARGET_ELF_PAGESTART(_v) ((_v) & ~(unsigned long)(TARGET_ELF_EXEC_PAGESIZE-1))
+#define TARGET_ELF_PAGEOFFSET(_v) ((_v) & (TARGET_ELF_EXEC_PAGESIZE-1))
+
+#define INTERPRETER_NONE 0
+#define INTERPRETER_AOUT 1
+#define INTERPRETER_ELF 2
+
+#define DLINFO_ITEMS 12
+
+static inline void memcpy_fromfs(void * to, const void * from, unsigned long n)
+{
+ memcpy(to, from, n);
+}
+
+static int load_aout_interp(void * exptr, int interp_fd);
+
+#ifdef BSWAP_NEEDED
+static void bswap_ehdr(struct elfhdr *ehdr)
+{
+ bswap16s(&ehdr->e_type); /* Object file type */
+ bswap16s(&ehdr->e_machine); /* Architecture */
+ bswap32s(&ehdr->e_version); /* Object file version */
+ bswaptls(&ehdr->e_entry); /* Entry point virtual address */
+ bswaptls(&ehdr->e_phoff); /* Program header table file offset */
+ bswaptls(&ehdr->e_shoff); /* Section header table file offset */
+ bswap32s(&ehdr->e_flags); /* Processor-specific flags */
+ bswap16s(&ehdr->e_ehsize); /* ELF header size in bytes */
+ bswap16s(&ehdr->e_phentsize); /* Program header table entry size */
+ bswap16s(&ehdr->e_phnum); /* Program header table entry count */
+ bswap16s(&ehdr->e_shentsize); /* Section header table entry size */
+ bswap16s(&ehdr->e_shnum); /* Section header table entry count */
+ bswap16s(&ehdr->e_shstrndx); /* Section header string table index */
+}
+
+static void bswap_phdr(struct elf_phdr *phdr)
+{
+ bswap32s(&phdr->p_type); /* Segment type */
+ bswaptls(&phdr->p_offset); /* Segment file offset */
+ bswaptls(&phdr->p_vaddr); /* Segment virtual address */
+ bswaptls(&phdr->p_paddr); /* Segment physical address */
+ bswaptls(&phdr->p_filesz); /* Segment size in file */
+ bswaptls(&phdr->p_memsz); /* Segment size in memory */
+ bswap32s(&phdr->p_flags); /* Segment flags */
+ bswaptls(&phdr->p_align); /* Segment alignment */
+}
+
+static void bswap_shdr(struct elf_shdr *shdr)
+{
+ bswap32s(&shdr->sh_name);
+ bswap32s(&shdr->sh_type);
+ bswaptls(&shdr->sh_flags);
+ bswaptls(&shdr->sh_addr);
+ bswaptls(&shdr->sh_offset);
+ bswaptls(&shdr->sh_size);
+ bswap32s(&shdr->sh_link);
+ bswap32s(&shdr->sh_info);
+ bswaptls(&shdr->sh_addralign);
+ bswaptls(&shdr->sh_entsize);
+}
+
+static void bswap_sym(struct elf_sym *sym)
+{
+ bswap32s(&sym->st_name);
+ bswaptls(&sym->st_value);
+ bswaptls(&sym->st_size);
+ bswap16s(&sym->st_shndx);
+}
+#endif
+
+/*
+ * 'copy_elf_strings()' copies argument/envelope strings from user
+ * memory to free pages in kernel mem. These are in a format ready
+ * to be put directly into the top of new user memory.
+ *
+ */
+static abi_ulong copy_elf_strings(int argc,char ** argv, void **page,
+ abi_ulong p)
+{
+ char *tmp, *tmp1, *pag = NULL;
+ int len, offset = 0;
+
+ if (!p) {
+ return 0; /* bullet-proofing */
+ }
+ while (argc-- > 0) {
+ tmp = argv[argc];
+ if (!tmp) {
+ fprintf(stderr, "VFS: argc is wrong");
+ exit(-1);
+ }
+ tmp1 = tmp;
+ while (*tmp++);
+ len = tmp - tmp1;
+ if (p < len) { /* this shouldn't happen - 128kB */
+ return 0;
+ }
+ while (len) {
+ --p; --tmp; --len;
+ if (--offset < 0) {
+ offset = p % TARGET_PAGE_SIZE;
+ pag = (char *)page[p/TARGET_PAGE_SIZE];
+ if (!pag) {
+ pag = (char *)malloc(TARGET_PAGE_SIZE);
+ memset(pag, 0, TARGET_PAGE_SIZE);
+ page[p/TARGET_PAGE_SIZE] = pag;
+ if (!pag)
+ return 0;
+ }
+ }
+ if (len == 0 || offset == 0) {
+ *(pag + offset) = *tmp;
+ }
+ else {
+ int bytes_to_copy = (len > offset) ? offset : len;
+ tmp -= bytes_to_copy;
+ p -= bytes_to_copy;
+ offset -= bytes_to_copy;
+ len -= bytes_to_copy;
+ memcpy_fromfs(pag + offset, tmp, bytes_to_copy + 1);
+ }
+ }
+ }
+ return p;
+}
+
+static abi_ulong setup_arg_pages(abi_ulong p, struct linux_binprm *bprm,
+ struct image_info *info)
+{
+ abi_ulong stack_base, size, error;
+ int i;
+
+ /* Create enough stack to hold everything. If we don't use
+ * it for args, we'll use it for something else...
+ */
+ size = x86_stack_size;
+ if (size < MAX_ARG_PAGES*TARGET_PAGE_SIZE)
+ size = MAX_ARG_PAGES*TARGET_PAGE_SIZE;
+ error = target_mmap(0,
+ size + qemu_host_page_size,
+ PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANON,
+ -1, 0);
+ if (error == -1) {
+ perror("stk mmap");
+ exit(-1);
+ }
+ /* we reserve one extra page at the top of the stack as guard */
+ target_mprotect(error + size, qemu_host_page_size, PROT_NONE);
+
+ stack_base = error + size - MAX_ARG_PAGES*TARGET_PAGE_SIZE;
+ p += stack_base;
+
+ for (i = 0 ; i < MAX_ARG_PAGES ; i++) {
+ if (bprm->page[i]) {
+ info->rss++;
+ /* FIXME - check return value of memcpy_to_target() for failure */
+ memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
+ free(bprm->page[i]);
+ }
+ stack_base += TARGET_PAGE_SIZE;
+ }
+ return p;
+}
+
+static void set_brk(abi_ulong start, abi_ulong end)
+{
+ /* page-align the start and end addresses... */
+ start = HOST_PAGE_ALIGN(start);
+ end = HOST_PAGE_ALIGN(end);
+ if (end <= start)
+ return;
+ if(target_mmap(start, end - start,
+ PROT_READ | PROT_WRITE | PROT_EXEC,
+ MAP_FIXED | MAP_PRIVATE | MAP_ANON, -1, 0) == -1) {
+ perror("cannot mmap brk");
+ exit(-1);
+ }
+}
+
+
+/* We need to explicitly zero any fractional pages after the data
+ section (i.e. bss). This would contain the junk from the file that
+ should not be in memory. */
+static void padzero(abi_ulong elf_bss, abi_ulong last_bss)
+{
+ abi_ulong nbyte;
+
+ if (elf_bss >= last_bss)
+ return;
+
+ /* XXX: this is really a hack : if the real host page size is
+ smaller than the target page size, some pages after the end
+ of the file may not be mapped. A better fix would be to
+ patch target_mmap(), but it is more complicated as the file
+ size must be known */
+ if (qemu_real_host_page_size < qemu_host_page_size) {
+ abi_ulong end_addr, end_addr1;
+ end_addr1 = (elf_bss + qemu_real_host_page_size - 1) &
+ ~(qemu_real_host_page_size - 1);
+ end_addr = HOST_PAGE_ALIGN(elf_bss);
+ if (end_addr1 < end_addr) {
+ mmap((void *)g2h(end_addr1), end_addr - end_addr1,
+ PROT_READ|PROT_WRITE|PROT_EXEC,
+ MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);
+ }
+ }
+
+ nbyte = elf_bss & (qemu_host_page_size-1);
+ if (nbyte) {
+ nbyte = qemu_host_page_size - nbyte;
+ do {
+ /* FIXME - what to do if put_user() fails? */
+ put_user_u8(0, elf_bss);
+ elf_bss++;
+ } while (--nbyte);
+ }
+}
+
+
+static abi_ulong create_elf_tables(abi_ulong p, int argc, int envc,
+ struct elfhdr * exec,
+ abi_ulong load_addr,
+ abi_ulong load_bias,
+ abi_ulong interp_load_addr, int ibcs,
+ struct image_info *info)
+{
+ abi_ulong sp;
+ int size;
+ abi_ulong u_platform;
+ const char *k_platform;
+ const int n = sizeof(elf_addr_t);
+
+ sp = p;
+ u_platform = 0;
+ k_platform = ELF_PLATFORM;
+ if (k_platform) {
+ size_t len = strlen(k_platform) + 1;
+ sp -= (len + n - 1) & ~(n - 1);
+ u_platform = sp;
+ /* FIXME - check return value of memcpy_to_target() for failure */
+ memcpy_to_target(sp, k_platform, len);
+ }
+ /*
+ * Force 16 byte _final_ alignment here for generality.
+ */
+ sp = sp &~ (abi_ulong)15;
+ size = (DLINFO_ITEMS + 1) * 2;
+ if (k_platform)
+ size += 2;
+#ifdef DLINFO_ARCH_ITEMS
+ size += DLINFO_ARCH_ITEMS * 2;
+#endif
+ size += envc + argc + 2;
+ size += (!ibcs ? 3 : 1); /* argc itself */
+ size *= n;
+ if (size & 15)
+ sp -= 16 - (size & 15);
+
+ /* This is correct because Linux defines
+ * elf_addr_t as Elf32_Off / Elf64_Off
+ */
+#define NEW_AUX_ENT(id, val) do { \
+ sp -= n; put_user_ual(val, sp); \
+ sp -= n; put_user_ual(id, sp); \
+ } while(0)
+
+ NEW_AUX_ENT (AT_NULL, 0);
+
+ /* There must be exactly DLINFO_ITEMS entries here. */
+ NEW_AUX_ENT(AT_PHDR, (abi_ulong)(load_addr + exec->e_phoff));
+ NEW_AUX_ENT(AT_PHENT, (abi_ulong)(sizeof (struct elf_phdr)));
+ NEW_AUX_ENT(AT_PHNUM, (abi_ulong)(exec->e_phnum));
+ NEW_AUX_ENT(AT_PAGESZ, (abi_ulong)(TARGET_PAGE_SIZE));
+ NEW_AUX_ENT(AT_BASE, (abi_ulong)(interp_load_addr));
+ NEW_AUX_ENT(AT_FLAGS, (abi_ulong)0);
+ NEW_AUX_ENT(AT_ENTRY, load_bias + exec->e_entry);
+ NEW_AUX_ENT(AT_UID, (abi_ulong) getuid());
+ NEW_AUX_ENT(AT_EUID, (abi_ulong) geteuid());
+ NEW_AUX_ENT(AT_GID, (abi_ulong) getgid());
+ NEW_AUX_ENT(AT_EGID, (abi_ulong) getegid());
+ NEW_AUX_ENT(AT_HWCAP, (abi_ulong) ELF_HWCAP);
+ NEW_AUX_ENT(AT_CLKTCK, (abi_ulong) sysconf(_SC_CLK_TCK));
+ if (k_platform)
+ NEW_AUX_ENT(AT_PLATFORM, u_platform);
+#ifdef ARCH_DLINFO
+ /*
+ * ARCH_DLINFO must come last so platform specific code can enforce
+ * special alignment requirements on the AUXV if necessary (eg. PPC).
+ */
+ ARCH_DLINFO;
+#endif
+#undef NEW_AUX_ENT
+
+ sp = loader_build_argptr(envc, argc, sp, p, !ibcs);
+ return sp;
+}
+
+
+static abi_ulong load_elf_interp(struct elfhdr * interp_elf_ex,
+ int interpreter_fd,
+ abi_ulong *interp_load_addr)
+{
+ struct elf_phdr *elf_phdata = NULL;
+ struct elf_phdr *eppnt;
+ abi_ulong load_addr = 0;
+ int load_addr_set = 0;
+ int retval;
+ abi_ulong last_bss, elf_bss;
+ abi_ulong error;
+ int i;
+
+ elf_bss = 0;
+ last_bss = 0;
+ error = 0;
+
+#ifdef BSWAP_NEEDED
+ bswap_ehdr(interp_elf_ex);
+#endif
+ /* First of all, some simple consistency checks */
+ if ((interp_elf_ex->e_type != ET_EXEC &&
+ interp_elf_ex->e_type != ET_DYN) ||
+ !elf_check_arch(interp_elf_ex->e_machine)) {
+ return ~((abi_ulong)0UL);
+ }
+
+
+ /* Now read in all of the header information */
+
+ if (sizeof(struct elf_phdr) * interp_elf_ex->e_phnum > TARGET_PAGE_SIZE)
+ return ~(abi_ulong)0UL;
+
+ elf_phdata = (struct elf_phdr *)
+ malloc(sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
+
+ if (!elf_phdata)
+ return ~((abi_ulong)0UL);
+
+ /*
+ * If the size of this structure has changed, then punt, since
+ * we will be doing the wrong thing.
+ */
+ if (interp_elf_ex->e_phentsize != sizeof(struct elf_phdr)) {
+ free(elf_phdata);
+ return ~((abi_ulong)0UL);
+ }
+
+ retval = lseek(interpreter_fd, interp_elf_ex->e_phoff, SEEK_SET);
+ if(retval >= 0) {
+ retval = read(interpreter_fd,
+ (char *) elf_phdata,
+ sizeof(struct elf_phdr) * interp_elf_ex->e_phnum);
+ }
+ if (retval < 0) {
+ perror("load_elf_interp");
+ exit(-1);
+ free (elf_phdata);
+ return retval;
+ }
+#ifdef BSWAP_NEEDED
+ eppnt = elf_phdata;
+ for (i=0; i<interp_elf_ex->e_phnum; i++, eppnt++) {
+ bswap_phdr(eppnt);
+ }
+#endif
+
+ if (interp_elf_ex->e_type == ET_DYN) {
+ /* in order to avoid hardcoding the interpreter load
+ address in qemu, we allocate a big enough memory zone */
+ error = target_mmap(0, INTERP_MAP_SIZE,
+ PROT_NONE, MAP_PRIVATE | MAP_ANON,
+ -1, 0);
+ if (error == -1) {
+ perror("mmap");
+ exit(-1);
+ }
+ load_addr = error;
+ load_addr_set = 1;
+ }
+
+ eppnt = elf_phdata;
+ for(i=0; i<interp_elf_ex->e_phnum; i++, eppnt++)
+ if (eppnt->p_type == PT_LOAD) {
+ int elf_type = MAP_PRIVATE | MAP_DENYWRITE;
+ int elf_prot = 0;
+ abi_ulong vaddr = 0;
+ abi_ulong k;
+
+ if (eppnt->p_flags & PF_R) elf_prot = PROT_READ;
+ if (eppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
+ if (eppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
+ if (interp_elf_ex->e_type == ET_EXEC || load_addr_set) {
+ elf_type |= MAP_FIXED;
+ vaddr = eppnt->p_vaddr;
+ }
+ error = target_mmap(load_addr+TARGET_ELF_PAGESTART(vaddr),
+ eppnt->p_filesz + TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr),
+ elf_prot,
+ elf_type,
+ interpreter_fd,
+ eppnt->p_offset - TARGET_ELF_PAGEOFFSET(eppnt->p_vaddr));
+
+ if (error == -1) {
+ /* Real error */
+ close(interpreter_fd);
+ free(elf_phdata);
+ return ~((abi_ulong)0UL);
+ }
+
+ if (!load_addr_set && interp_elf_ex->e_type == ET_DYN) {
+ load_addr = error;
+ load_addr_set = 1;
+ }
+
+ /*
+ * Find the end of the file mapping for this phdr, and keep
+ * track of the largest address we see for this.
+ */
+ k = load_addr + eppnt->p_vaddr + eppnt->p_filesz;
+ if (k > elf_bss) elf_bss = k;
+
+ /*
+ * Do the same thing for the memory mapping - between
+ * elf_bss and last_bss is the bss section.
+ */
+ k = load_addr + eppnt->p_memsz + eppnt->p_vaddr;
+ if (k > last_bss) last_bss = k;
+ }
+
+ /* Now use mmap to map the library into memory. */
+
+ close(interpreter_fd);
+
+ /*
+ * Now fill out the bss section. First pad the last page up
+ * to the page boundary, and then perform a mmap to make sure
+ * that there are zeromapped pages up to and including the last
+ * bss page.
+ */
+ padzero(elf_bss, last_bss);
+ elf_bss = TARGET_ELF_PAGESTART(elf_bss + qemu_host_page_size - 1); /* What we have mapped so far */
+
+ /* Map the last of the bss segment */
+ if (last_bss > elf_bss) {
+ target_mmap(elf_bss, last_bss-elf_bss,
+ PROT_READ|PROT_WRITE|PROT_EXEC,
+ MAP_FIXED|MAP_PRIVATE|MAP_ANON, -1, 0);
+ }
+ free(elf_phdata);
+
+ *interp_load_addr = load_addr;
+ return ((abi_ulong) interp_elf_ex->e_entry) + load_addr;
+}
+
+static int symfind(const void *s0, const void *s1)
+{
+ struct elf_sym *key = (struct elf_sym *)s0;
+ struct elf_sym *sym = (struct elf_sym *)s1;
+ int result = 0;
+ if (key->st_value < sym->st_value) {
+ result = -1;
+ } else if (key->st_value > sym->st_value + sym->st_size) {
+ result = 1;
+ }
+ return result;
+}
+
+static const char *lookup_symbolxx(struct syminfo *s, target_ulong orig_addr)
+{
+#if ELF_CLASS == ELFCLASS32
+ struct elf_sym *syms = s->disas_symtab.elf32;
+#else
+ struct elf_sym *syms = s->disas_symtab.elf64;
+#endif
+
+ // binary search
+ struct elf_sym key;
+ struct elf_sym *sym;
+
+ key.st_value = orig_addr;
+
+ sym = bsearch(&key, syms, s->disas_num_syms, sizeof(*syms), symfind);
+ if (sym != NULL) {
+ return s->disas_strtab + sym->st_name;
+ }
+
+ return "";
+}
+
+/* FIXME: This should use elf_ops.h */
+static int symcmp(const void *s0, const void *s1)
+{
+ struct elf_sym *sym0 = (struct elf_sym *)s0;
+ struct elf_sym *sym1 = (struct elf_sym *)s1;
+ return (sym0->st_value < sym1->st_value)
+ ? -1
+ : ((sym0->st_value > sym1->st_value) ? 1 : 0);
+}
+
+/* Best attempt to load symbols from this ELF object. */
+static void load_symbols(struct elfhdr *hdr, int fd)
+{
+ unsigned int i, nsyms;
+ struct elf_shdr sechdr, symtab, strtab;
+ char *strings;
+ struct syminfo *s;
+ struct elf_sym *syms, *new_syms;
+
+ lseek(fd, hdr->e_shoff, SEEK_SET);
+ for (i = 0; i < hdr->e_shnum; i++) {
+ if (read(fd, &sechdr, sizeof(sechdr)) != sizeof(sechdr))
+ return;
+#ifdef BSWAP_NEEDED
+ bswap_shdr(&sechdr);
+#endif
+ if (sechdr.sh_type == SHT_SYMTAB) {
+ symtab = sechdr;
+ lseek(fd, hdr->e_shoff
+ + sizeof(sechdr) * sechdr.sh_link, SEEK_SET);
+ if (read(fd, &strtab, sizeof(strtab))
+ != sizeof(strtab))
+ return;
+#ifdef BSWAP_NEEDED
+ bswap_shdr(&strtab);
+#endif
+ goto found;
+ }
+ }
+ return; /* Shouldn't happen... */
+
+ found:
+ /* Now know where the strtab and symtab are. Snarf them. */
+ s = malloc(sizeof(*s));
+ syms = malloc(symtab.sh_size);
+ if (!syms) {
+ free(s);
+ return;
+ }
+ s->disas_strtab = strings = malloc(strtab.sh_size);
+ if (!s->disas_strtab) {
+ free(s);
+ free(syms);
+ return;
+ }
+
+ lseek(fd, symtab.sh_offset, SEEK_SET);
+ if (read(fd, syms, symtab.sh_size) != symtab.sh_size) {
+ free(s);
+ free(syms);
+ free(strings);
+ return;
+ }
+
+ nsyms = symtab.sh_size / sizeof(struct elf_sym);
+
+ i = 0;
+ while (i < nsyms) {
+#ifdef BSWAP_NEEDED
+ bswap_sym(syms + i);
+#endif
+ // Throw away entries which we do not need.
+ if (syms[i].st_shndx == SHN_UNDEF ||
+ syms[i].st_shndx >= SHN_LORESERVE ||
+ ELF_ST_TYPE(syms[i].st_info) != STT_FUNC) {
+ nsyms--;
+ if (i < nsyms) {
+ syms[i] = syms[nsyms];
+ }
+ continue;
+ }
+#if defined(TARGET_ARM) || defined (TARGET_MIPS)
+ /* The bottom address bit marks a Thumb or MIPS16 symbol. */
+ syms[i].st_value &= ~(target_ulong)1;
+#endif
+ i++;
+ }
+
+ /* Attempt to free the storage associated with the local symbols
+ that we threw away. Whether or not this has any effect on the
+ memory allocation depends on the malloc implementation and how
+ many symbols we managed to discard. */
+ new_syms = realloc(syms, nsyms * sizeof(*syms));
+ if (new_syms == NULL) {
+ free(s);
+ free(syms);
+ free(strings);
+ return;
+ }
+ syms = new_syms;
+
+ qsort(syms, nsyms, sizeof(*syms), symcmp);
+
+ lseek(fd, strtab.sh_offset, SEEK_SET);
+ if (read(fd, strings, strtab.sh_size) != strtab.sh_size) {
+ free(s);
+ free(syms);
+ free(strings);
+ return;
+ }
+ s->disas_num_syms = nsyms;
+#if ELF_CLASS == ELFCLASS32
+ s->disas_symtab.elf32 = syms;
+ s->lookup_symbol = (lookup_symbol_t)lookup_symbolxx;
+#else
+ s->disas_symtab.elf64 = syms;
+ s->lookup_symbol = (lookup_symbol_t)lookup_symbolxx;
+#endif
+ s->next = syminfos;
+ syminfos = s;
+}
+
+int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
+ struct image_info * info)
+{
+ struct elfhdr elf_ex;
+ struct elfhdr interp_elf_ex;
+ struct exec interp_ex;
+ int interpreter_fd = -1; /* avoid warning */
+ abi_ulong load_addr, load_bias;
+ int load_addr_set = 0;
+ unsigned int interpreter_type = INTERPRETER_NONE;
+ unsigned char ibcs2_interpreter;
+ int i;
+ abi_ulong mapped_addr;
+ struct elf_phdr * elf_ppnt;
+ struct elf_phdr *elf_phdata;
+ abi_ulong elf_bss, k, elf_brk;
+ int retval;
+ char * elf_interpreter;
+ abi_ulong elf_entry, interp_load_addr = 0;
+ int status;
+ abi_ulong start_code, end_code, start_data, end_data;
+ abi_ulong reloc_func_desc = 0;
+ abi_ulong elf_stack;
+ char passed_fileno[6];
+
+ ibcs2_interpreter = 0;
+ status = 0;
+ load_addr = 0;
+ load_bias = 0;
+ elf_ex = *((struct elfhdr *) bprm->buf); /* exec-header */
+#ifdef BSWAP_NEEDED
+ bswap_ehdr(&elf_ex);
+#endif
+
+ /* First of all, some simple consistency checks */
+ if ((elf_ex.e_type != ET_EXEC && elf_ex.e_type != ET_DYN) ||
+ (! elf_check_arch(elf_ex.e_machine))) {
+ return -ENOEXEC;
+ }
+
+ bprm->p = copy_elf_strings(1, &bprm->filename, bprm->page, bprm->p);
+ bprm->p = copy_elf_strings(bprm->envc,bprm->envp,bprm->page,bprm->p);
+ bprm->p = copy_elf_strings(bprm->argc,bprm->argv,bprm->page,bprm->p);
+ if (!bprm->p) {
+ retval = -E2BIG;
+ }
+
+ /* Now read in all of the header information */
+ elf_phdata = (struct elf_phdr *)malloc(elf_ex.e_phentsize*elf_ex.e_phnum);
+ if (elf_phdata == NULL) {
+ return -ENOMEM;
+ }
+
+ retval = lseek(bprm->fd, elf_ex.e_phoff, SEEK_SET);
+ if(retval > 0) {
+ retval = read(bprm->fd, (char *) elf_phdata,
+ elf_ex.e_phentsize * elf_ex.e_phnum);
+ }
+
+ if (retval < 0) {
+ perror("load_elf_binary");
+ exit(-1);
+ free (elf_phdata);
+ return -errno;
+ }
+
+#ifdef BSWAP_NEEDED
+ elf_ppnt = elf_phdata;
+ for (i=0; i<elf_ex.e_phnum; i++, elf_ppnt++) {
+ bswap_phdr(elf_ppnt);
+ }
+#endif
+ elf_ppnt = elf_phdata;
+
+ elf_bss = 0;
+ elf_brk = 0;
+
+
+ elf_stack = ~((abi_ulong)0UL);
+ elf_interpreter = NULL;
+ start_code = ~((abi_ulong)0UL);
+ end_code = 0;
+ start_data = 0;
+ end_data = 0;
+ interp_ex.a_info = 0;
+
+ for(i=0;i < elf_ex.e_phnum; i++) {
+ if (elf_ppnt->p_type == PT_INTERP) {
+ if ( elf_interpreter != NULL )
+ {
+ free (elf_phdata);
+ free(elf_interpreter);
+ close(bprm->fd);
+ return -EINVAL;
+ }
+
+ /* This is the program interpreter used for
+ * shared libraries - for now assume that this
+ * is an a.out format binary
+ */
+
+ elf_interpreter = (char *)malloc(elf_ppnt->p_filesz);
+
+ if (elf_interpreter == NULL) {
+ free (elf_phdata);
+ close(bprm->fd);
+ return -ENOMEM;
+ }
+
+ retval = lseek(bprm->fd, elf_ppnt->p_offset, SEEK_SET);
+ if(retval >= 0) {
+ retval = read(bprm->fd, elf_interpreter, elf_ppnt->p_filesz);
+ }
+ if(retval < 0) {
+ perror("load_elf_binary2");
+ exit(-1);
+ }
+
+ /* If the program interpreter is one of these two,
+ then assume an iBCS2 image. Otherwise assume
+ a native linux image. */
+
+ /* JRP - Need to add X86 lib dir stuff here... */
+
+ if (strcmp(elf_interpreter,"/usr/lib/libc.so.1") == 0 ||
+ strcmp(elf_interpreter,"/usr/lib/ld.so.1") == 0) {
+ ibcs2_interpreter = 1;
+ }
+
+#if 0
+ printf("Using ELF interpreter %s\n", path(elf_interpreter));
+#endif
+ if (retval >= 0) {
+ retval = open(path(elf_interpreter), O_RDONLY);
+ if(retval >= 0) {
+ interpreter_fd = retval;
+ }
+ else {
+ perror(elf_interpreter);
+ exit(-1);
+ /* retval = -errno; */
+ }
+ }
+
+ if (retval >= 0) {
+ retval = lseek(interpreter_fd, 0, SEEK_SET);
+ if(retval >= 0) {
+ retval = read(interpreter_fd,bprm->buf,128);
+ }
+ }
+ if (retval >= 0) {
+ interp_ex = *((struct exec *) bprm->buf); /* aout exec-header */
+ interp_elf_ex = *((struct elfhdr *) bprm->buf); /* elf exec-header */
+ }
+ if (retval < 0) {
+ perror("load_elf_binary3");
+ exit(-1);
+ free (elf_phdata);
+ free(elf_interpreter);
+ close(bprm->fd);
+ return retval;
+ }
+ }
+ elf_ppnt++;
+ }
+
+ /* Some simple consistency checks for the interpreter */
+ if (elf_interpreter){
+ interpreter_type = INTERPRETER_ELF | INTERPRETER_AOUT;
+
+ /* Now figure out which format our binary is */
+ if ((N_MAGIC(interp_ex) != OMAGIC) && (N_MAGIC(interp_ex) != ZMAGIC) &&
+ (N_MAGIC(interp_ex) != QMAGIC)) {
+ interpreter_type = INTERPRETER_ELF;
+ }
+
+ if (interp_elf_ex.e_ident[0] != 0x7f ||
+ strncmp((char *)&interp_elf_ex.e_ident[1], "ELF",3) != 0) {
+ interpreter_type &= ~INTERPRETER_ELF;
+ }
+
+ if (!interpreter_type) {
+ free(elf_interpreter);
+ free(elf_phdata);
+ close(bprm->fd);
+ return -ELIBBAD;
+ }
+ }
+
+ /* OK, we are done with that, now set up the arg stuff,
+ and then start this sucker up */
+
+ {
+ char * passed_p;
+
+ if (interpreter_type == INTERPRETER_AOUT) {
+ snprintf(passed_fileno, sizeof(passed_fileno), "%d", bprm->fd);
+ passed_p = passed_fileno;
+
+ if (elf_interpreter) {
+ bprm->p = copy_elf_strings(1,&passed_p,bprm->page,bprm->p);
+ bprm->argc++;
+ }
+ }
+ if (!bprm->p) {
+ if (elf_interpreter) {
+ free(elf_interpreter);
+ }
+ free (elf_phdata);
+ close(bprm->fd);
+ return -E2BIG;
+ }
+ }
+
+ /* OK, This is the point of no return */
+ info->end_data = 0;
+ info->end_code = 0;
+ info->start_mmap = (abi_ulong)ELF_START_MMAP;
+ info->mmap = 0;
+ elf_entry = (abi_ulong) elf_ex.e_entry;
+
+#if defined(CONFIG_USE_GUEST_BASE)
+ /*
+ * In case where user has not explicitly set the guest_base, we
+ * probe here that should we set it automatically.
+ */
+ if (!have_guest_base) {
+ /*
+ * Go through ELF program header table and find out whether
+ * any of the segments drop below our current mmap_min_addr and
+ * in that case set guest_base to corresponding address.
+ */
+ for (i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum;
+ i++, elf_ppnt++) {
+ if (elf_ppnt->p_type != PT_LOAD)
+ continue;
+ if (HOST_PAGE_ALIGN(elf_ppnt->p_vaddr) < mmap_min_addr) {
+ guest_base = HOST_PAGE_ALIGN(mmap_min_addr);
+ break;
+ }
+ }
+ }
+#endif /* CONFIG_USE_GUEST_BASE */
+
+ /* Do this so that we can load the interpreter, if need be. We will
+ change some of these later */
+ info->rss = 0;
+ bprm->p = setup_arg_pages(bprm->p, bprm, info);
+ info->start_stack = bprm->p;
+
+ /* Now we do a little grungy work by mmaping the ELF image into
+ * the correct location in memory. At this point, we assume that
+ * the image should be loaded at fixed address, not at a variable
+ * address.
+ */
+
+ for(i = 0, elf_ppnt = elf_phdata; i < elf_ex.e_phnum; i++, elf_ppnt++) {
+ int elf_prot = 0;
+ int elf_flags = 0;
+ abi_ulong error;
+
+ if (elf_ppnt->p_type != PT_LOAD)
+ continue;
+
+ if (elf_ppnt->p_flags & PF_R) elf_prot |= PROT_READ;
+ if (elf_ppnt->p_flags & PF_W) elf_prot |= PROT_WRITE;
+ if (elf_ppnt->p_flags & PF_X) elf_prot |= PROT_EXEC;
+ elf_flags = MAP_PRIVATE | MAP_DENYWRITE;
+ if (elf_ex.e_type == ET_EXEC || load_addr_set) {
+ elf_flags |= MAP_FIXED;
+ } else if (elf_ex.e_type == ET_DYN) {
+ /* Try and get dynamic programs out of the way of the default mmap
+ base, as well as whatever program they might try to exec. This
+ is because the brk will follow the loader, and is not movable. */
+ /* NOTE: for qemu, we do a big mmap to get enough space
+ without hardcoding any address */
+ error = target_mmap(0, ET_DYN_MAP_SIZE,
+ PROT_NONE, MAP_PRIVATE | MAP_ANON,
+ -1, 0);
+ if (error == -1) {
+ perror("mmap");
+ exit(-1);
+ }
+ load_bias = TARGET_ELF_PAGESTART(error - elf_ppnt->p_vaddr);
+ }
+
+ error = target_mmap(TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr),
+ (elf_ppnt->p_filesz +
+ TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)),
+ elf_prot,
+ (MAP_FIXED | MAP_PRIVATE | MAP_DENYWRITE),
+ bprm->fd,
+ (elf_ppnt->p_offset -
+ TARGET_ELF_PAGEOFFSET(elf_ppnt->p_vaddr)));
+ if (error == -1) {
+ perror("mmap");
+ exit(-1);
+ }
+
+#ifdef LOW_ELF_STACK
+ if (TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr) < elf_stack)
+ elf_stack = TARGET_ELF_PAGESTART(elf_ppnt->p_vaddr);
+#endif
+
+ if (!load_addr_set) {
+ load_addr_set = 1;
+ load_addr = elf_ppnt->p_vaddr - elf_ppnt->p_offset;
+ if (elf_ex.e_type == ET_DYN) {
+ load_bias += error -
+ TARGET_ELF_PAGESTART(load_bias + elf_ppnt->p_vaddr);
+ load_addr += load_bias;
+ reloc_func_desc = load_bias;
+ }
+ }
+ k = elf_ppnt->p_vaddr;
+ if (k < start_code)
+ start_code = k;
+ if (start_data < k)
+ start_data = k;
+ k = elf_ppnt->p_vaddr + elf_ppnt->p_filesz;
+ if (k > elf_bss)
+ elf_bss = k;
+ if ((elf_ppnt->p_flags & PF_X) && end_code < k)
+ end_code = k;
+ if (end_data < k)
+ end_data = k;
+ k = elf_ppnt->p_vaddr + elf_ppnt->p_memsz;
+ if (k > elf_brk) elf_brk = k;
+ }
+
+ elf_entry += load_bias;
+ elf_bss += load_bias;
+ elf_brk += load_bias;
+ start_code += load_bias;
+ end_code += load_bias;
+ start_data += load_bias;
+ end_data += load_bias;
+
+ if (elf_interpreter) {
+ if (interpreter_type & 1) {
+ elf_entry = load_aout_interp(&interp_ex, interpreter_fd);
+ }
+ else if (interpreter_type & 2) {
+ elf_entry = load_elf_interp(&interp_elf_ex, interpreter_fd,
+ &interp_load_addr);
+ }
+ reloc_func_desc = interp_load_addr;
+
+ close(interpreter_fd);
+ free(elf_interpreter);
+
+ if (elf_entry == ~((abi_ulong)0UL)) {
+ printf("Unable to load interpreter\n");
+ free(elf_phdata);
+ exit(-1);
+ return 0;
+ }
+ }
+
+ free(elf_phdata);
+
+ if (qemu_log_enabled())
+ load_symbols(&elf_ex, bprm->fd);
+
+ if (interpreter_type != INTERPRETER_AOUT) close(bprm->fd);
+ info->personality = (ibcs2_interpreter ? PER_SVR4 : PER_LINUX);
+
+#ifdef LOW_ELF_STACK
+ info->start_stack = bprm->p = elf_stack - 4;
+#endif
+ bprm->p = create_elf_tables(bprm->p,
+ bprm->argc,
+ bprm->envc,
+ &elf_ex,
+ load_addr, load_bias,
+ interp_load_addr,
+ (interpreter_type == INTERPRETER_AOUT ? 0 : 1),
+ info);
+ info->load_addr = reloc_func_desc;
+ info->start_brk = info->brk = elf_brk;
+ info->end_code = end_code;
+ info->start_code = start_code;
+ info->start_data = start_data;
+ info->end_data = end_data;
+ info->start_stack = bprm->p;
+
+ /* Calling set_brk effectively mmaps the pages that we need for the bss and break
+ sections */
+ set_brk(elf_bss, elf_brk);
+
+ padzero(elf_bss, elf_brk);
+
+#if 0
+ printf("(start_brk) %x\n" , info->start_brk);
+ printf("(end_code) %x\n" , info->end_code);
+ printf("(start_code) %x\n" , info->start_code);
+ printf("(end_data) %x\n" , info->end_data);
+ printf("(start_stack) %x\n" , info->start_stack);
+ printf("(brk) %x\n" , info->brk);
+#endif
+
+ if ( info->personality == PER_SVR4 )
+ {
+ /* Why this, you ask??? Well SVr4 maps page 0 as read-only,
+ and some applications "depend" upon this behavior.
+ Since we do not have the power to recompile these, we
+ emulate the SVr4 behavior. Sigh. */
+ mapped_addr = target_mmap(0, qemu_host_page_size, PROT_READ | PROT_EXEC,
+ MAP_FIXED | MAP_PRIVATE, -1, 0);
+ }
+
+ info->entry = elf_entry;
+
+ return 0;
+}
+
+static int load_aout_interp(void * exptr, int interp_fd)
+{
+ printf("a.out interpreter not yet supported\n");
+ return(0);
+}
+
+void do_init_thread(struct target_pt_regs *regs, struct image_info *infop)
+{
+ init_thread(regs, infop);
+}
diff --git a/qemu-0.15.x/bsd-user/errno_defs.h b/qemu-0.15.x/bsd-user/errno_defs.h
new file mode 100644
index 0000000..1efa502
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/errno_defs.h
@@ -0,0 +1,149 @@
+/* $OpenBSD: errno.h,v 1.20 2007/09/03 14:37:52 millert Exp $ */
+/* $NetBSD: errno.h,v 1.10 1996/01/20 01:33:53 jtc Exp $ */
+
+/*
+ * Copyright (c) 1982, 1986, 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ * (c) UNIX System Laboratories, Inc.
+ * All or some portions of this file are derived from material licensed
+ * to the University of California by American Telephone and Telegraph
+ * Co. or Unix System Laboratories, Inc. and are reproduced herein with
+ * the permission of UNIX System Laboratories, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)errno.h 8.5 (Berkeley) 1/21/94
+ */
+
+#define TARGET_EPERM 1 /* Operation not permitted */
+#define TARGET_ENOENT 2 /* No such file or directory */
+#define TARGET_ESRCH 3 /* No such process */
+#define TARGET_EINTR 4 /* Interrupted system call */
+#define TARGET_EIO 5 /* Input/output error */
+#define TARGET_ENXIO 6 /* Device not configured */
+#define TARGET_E2BIG 7 /* Argument list too long */
+#define TARGET_ENOEXEC 8 /* Exec format error */
+#define TARGET_EBADF 9 /* Bad file descriptor */
+#define TARGET_ECHILD 10 /* No child processes */
+#define TARGET_EDEADLK 11 /* Resource deadlock avoided */
+ /* 11 was EAGAIN */
+#define TARGET_ENOMEM 12 /* Cannot allocate memory */
+#define TARGET_EACCES 13 /* Permission denied */
+#define TARGET_EFAULT 14 /* Bad address */
+#define TARGET_ENOTBLK 15 /* Block device required */
+#define TARGET_EBUSY 16 /* Device busy */
+#define TARGET_EEXIST 17 /* File exists */
+#define TARGET_EXDEV 18 /* Cross-device link */
+#define TARGET_ENODEV 19 /* Operation not supported by device */
+#define TARGET_ENOTDIR 20 /* Not a directory */
+#define TARGET_EISDIR 21 /* Is a directory */
+#define TARGET_EINVAL 22 /* Invalid argument */
+#define TARGET_ENFILE 23 /* Too many open files in system */
+#define TARGET_EMFILE 24 /* Too many open files */
+#define TARGET_ENOTTY 25 /* Inappropriate ioctl for device */
+#define TARGET_ETXTBSY 26 /* Text file busy */
+#define TARGET_EFBIG 27 /* File too large */
+#define TARGET_ENOSPC 28 /* No space left on device */
+#define TARGET_ESPIPE 29 /* Illegal seek */
+#define TARGET_EROFS 30 /* Read-only file system */
+#define TARGET_EMLINK 31 /* Too many links */
+#define TARGET_EPIPE 32 /* Broken pipe */
+
+/* math software */
+#define TARGET_EDOM 33 /* Numerical argument out of domain */
+#define TARGET_ERANGE 34 /* Result too large */
+
+/* non-blocking and interrupt i/o */
+#define TARGET_EAGAIN 35 /* Resource temporarily unavailable */
+#define TARGET_EWOULDBLOCK EAGAIN /* Operation would block */
+#define TARGET_EINPROGRESS 36 /* Operation now in progress */
+#define TARGET_EALREADY 37 /* Operation already in progress */
+
+/* ipc/network software -- argument errors */
+#define TARGET_ENOTSOCK 38 /* Socket operation on non-socket */
+#define TARGET_EDESTADDRREQ 39 /* Destination address required */
+#define TARGET_EMSGSIZE 40 /* Message too long */
+#define TARGET_EPROTOTYPE 41 /* Protocol wrong type for socket */
+#define TARGET_ENOPROTOOPT 42 /* Protocol not available */
+#define TARGET_EPROTONOSUPPORT 43 /* Protocol not supported */
+#define TARGET_ESOCKTNOSUPPORT 44 /* Socket type not supported */
+#define TARGET_EOPNOTSUPP 45 /* Operation not supported */
+#define TARGET_EPFNOSUPPORT 46 /* Protocol family not supported */
+#define TARGET_EAFNOSUPPORT 47 /* Address family not supported by protocol family */
+#define TARGET_EADDRINUSE 48 /* Address already in use */
+#define TARGET_EADDRNOTAVAIL 49 /* Can't assign requested address */
+
+/* ipc/network software -- operational errors */
+#define TARGET_ENETDOWN 50 /* Network is down */
+#define TARGET_ENETUNREACH 51 /* Network is unreachable */
+#define TARGET_ENETRESET 52 /* Network dropped connection on reset */
+#define TARGET_ECONNABORTED 53 /* Software caused connection abort */
+#define TARGET_ECONNRESET 54 /* Connection reset by peer */
+#define TARGET_ENOBUFS 55 /* No buffer space available */
+#define TARGET_EISCONN 56 /* Socket is already connected */
+#define TARGET_ENOTCONN 57 /* Socket is not connected */
+#define TARGET_ESHUTDOWN 58 /* Can't send after socket shutdown */
+#define TARGET_ETOOMANYREFS 59 /* Too many references: can't splice */
+#define TARGET_ETIMEDOUT 60 /* Operation timed out */
+#define TARGET_ECONNREFUSED 61 /* Connection refused */
+
+#define TARGET_ELOOP 62 /* Too many levels of symbolic links */
+#define TARGET_ENAMETOOLONG 63 /* File name too long */
+
+/* should be rearranged */
+#define TARGET_EHOSTDOWN 64 /* Host is down */
+#define TARGET_EHOSTUNREACH 65 /* No route to host */
+#define TARGET_ENOTEMPTY 66 /* Directory not empty */
+
+/* quotas & mush */
+#define TARGET_EPROCLIM 67 /* Too many processes */
+#define TARGET_EUSERS 68 /* Too many users */
+#define TARGET_EDQUOT 69 /* Disk quota exceeded */
+
+/* Network File System */
+#define TARGET_ESTALE 70 /* Stale NFS file handle */
+#define TARGET_EREMOTE 71 /* Too many levels of remote in path */
+#define TARGET_EBADRPC 72 /* RPC struct is bad */
+#define TARGET_ERPCMISMATCH 73 /* RPC version wrong */
+#define TARGET_EPROGUNAVAIL 74 /* RPC prog. not avail */
+#define TARGET_EPROGMISMATCH 75 /* Program version wrong */
+#define TARGET_EPROCUNAVAIL 76 /* Bad procedure for program */
+
+#define TARGET_ENOLCK 77 /* No locks available */
+#define TARGET_ENOSYS 78 /* Function not implemented */
+
+#define TARGET_EFTYPE 79 /* Inappropriate file type or format */
+#define TARGET_EAUTH 80 /* Authentication error */
+#define TARGET_ENEEDAUTH 81 /* Need authenticator */
+#define TARGET_EIPSEC 82 /* IPsec processing failure */
+#define TARGET_ENOATTR 83 /* Attribute not found */
+#define TARGET_EILSEQ 84 /* Illegal byte sequence */
+#define TARGET_ENOMEDIUM 85 /* No medium found */
+#define TARGET_EMEDIUMTYPE 86 /* Wrong Medium Type */
+#define TARGET_EOVERFLOW 87 /* Conversion overflow */
+#define TARGET_ECANCELED 88 /* Operation canceled */
+#define TARGET_EIDRM 89 /* Identifier removed */
+#define TARGET_ENOMSG 90 /* No message of desired type */
+#define TARGET_ELAST 90 /* Must be equal largest errno */
diff --git a/qemu-0.15.x/bsd-user/freebsd/strace.list b/qemu-0.15.x/bsd-user/freebsd/strace.list
new file mode 100644
index 0000000..1edf412
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/freebsd/strace.list
@@ -0,0 +1,171 @@
+{ TARGET_FREEBSD_NR___getcwd, "__getcwd", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR___semctl, "__semctl", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR___syscall, "__syscall", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR___sysctl, "__sysctl", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_accept, "accept", "%s(%d,%#x,%#x)", NULL, NULL },
+{ TARGET_FREEBSD_NR_access, "access", "%s(\"%s\",%#o)", NULL, NULL },
+{ TARGET_FREEBSD_NR_acct, "acct", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_adjtime, "adjtime", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_bind, "bind", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_break, "break", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_chdir, "chdir", "%s(\"%s\")", NULL, NULL },
+{ TARGET_FREEBSD_NR_chflags, "chflags", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_chmod, "chmod", "%s(\"%s\",%#o)", NULL, NULL },
+{ TARGET_FREEBSD_NR_chown, "chown", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_chroot, "chroot", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_clock_getres, "clock_getres", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_clock_gettime, "clock_gettime", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_clock_settime, "clock_settime", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_close, "close", "%s(%d)", NULL, NULL },
+{ TARGET_FREEBSD_NR_connect, "connect", "%s(%d,%#x,%d)", NULL, NULL },
+{ TARGET_FREEBSD_NR_dup, "dup", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_dup2, "dup2", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_execve, "execve", NULL, print_execve, NULL },
+{ TARGET_FREEBSD_NR_exit, "exit", "%s(%d)\n", NULL, NULL },
+{ TARGET_FREEBSD_NR_fchdir, "fchdir", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_fchflags, "fchflags", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_fchmod, "fchmod", "%s(%d,%#o)", NULL, NULL },
+{ TARGET_FREEBSD_NR_fchown, "fchown", "%s(\"%s\",%d,%d)", NULL, NULL },
+{ TARGET_FREEBSD_NR_fcntl, "fcntl", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_fhopen, "fhopen", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_fhstat, "fhstat", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_fhstatfs, "fhstatfs", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_flock, "flock", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_fork, "fork", "%s()", NULL, NULL },
+{ TARGET_FREEBSD_NR_fpathconf, "fpathconf", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_fstat, "fstat", "%s(%d,%p)", NULL, NULL },
+{ TARGET_FREEBSD_NR_fstatfs, "fstatfs", "%s(%d,%p)", NULL, NULL },
+{ TARGET_FREEBSD_NR_fsync, "fsync", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_ftruncate, "ftruncate", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_futimes, "futimes", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getdirentries, "getdirentries", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_freebsd6_mmap, "freebsd6_mmap", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getegid, "getegid", "%s()", NULL, NULL },
+{ TARGET_FREEBSD_NR_geteuid, "geteuid", "%s()", NULL, NULL },
+{ TARGET_FREEBSD_NR_getfh, "getfh", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getfsstat, "getfsstat", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getgid, "getgid", "%s()", NULL, NULL },
+{ TARGET_FREEBSD_NR_getgroups, "getgroups", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getitimer, "getitimer", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getlogin, "getlogin", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getpeername, "getpeername", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getpgid, "getpgid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getpgrp, "getpgrp", "%s()", NULL, NULL },
+{ TARGET_FREEBSD_NR_getpid, "getpid", "%s()", NULL, NULL },
+{ TARGET_FREEBSD_NR_getppid, "getppid", "%s()", NULL, NULL },
+{ TARGET_FREEBSD_NR_getpriority, "getpriority", "%s(%#x,%#x)", NULL, NULL },
+{ TARGET_FREEBSD_NR_getresgid, "getresgid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getresuid, "getresuid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getrlimit, "getrlimit", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getrusage, "getrusage", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getsid, "getsid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getsockname, "getsockname", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getsockopt, "getsockopt", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_gettimeofday, "gettimeofday", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_getuid, "getuid", "%s()", NULL, NULL },
+{ TARGET_FREEBSD_NR_ioctl, "ioctl", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_issetugid, "issetugid", "%s()", NULL, NULL },
+{ TARGET_FREEBSD_NR_kevent, "kevent", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_kill, "kill", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_kqueue, "kqueue", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_ktrace, "ktrace", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_lchown, "lchown", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_link, "link", "%s(\"%s\",\"%s\")", NULL, NULL },
+{ TARGET_FREEBSD_NR_listen, "listen", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_lseek, "lseek", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_lstat, "lstat", "%s(\"%s\",%p)", NULL, NULL },
+{ TARGET_FREEBSD_NR_madvise, "madvise", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_mincore, "mincore", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_minherit, "minherit", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_mkdir, "mkdir", "%s(\"%s\",%#o)", NULL, NULL },
+{ TARGET_FREEBSD_NR_mkfifo, "mkfifo", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_mknod, "mknod", "%s(\"%s\",%#o,%#x)", NULL, NULL },
+{ TARGET_FREEBSD_NR_mlock, "mlock", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_mlockall, "mlockall", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_mmap, "mmap", NULL, NULL, print_syscall_ret_addr },
+{ TARGET_FREEBSD_NR_mount, "mount", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_mprotect, "mprotect", "%s(%#x,%#x,%d)", NULL, NULL },
+{ TARGET_FREEBSD_NR_msgctl, "msgctl", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_msgget, "msgget", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_msgrcv, "msgrcv", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_msgsnd, "msgsnd", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_msync, "msync", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_munlock, "munlock", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_munlockall, "munlockall", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_munmap, "munmap", "%s(%p,%d)", NULL, NULL },
+{ TARGET_FREEBSD_NR_nanosleep, "nanosleep", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_nfssvc, "nfssvc", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_open, "open", "%s(\"%s\",%#x,%#o)", NULL, NULL },
+{ TARGET_FREEBSD_NR_pathconf, "pathconf", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_pipe, "pipe", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_poll, "poll", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_pread, "pread", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_preadv, "preadv", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_profil, "profil", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_ptrace, "ptrace", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_pwrite, "pwrite", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_pwritev, "pwritev", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_quotactl, "quotactl", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_read, "read", "%s(%d,%#x,%d)", NULL, NULL },
+{ TARGET_FREEBSD_NR_readlink, "readlink", "%s(\"%s\",%p,%d)", NULL, NULL },
+{ TARGET_FREEBSD_NR_readv, "readv", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_reboot, "reboot", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_recvfrom, "recvfrom", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_recvmsg, "recvmsg", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_rename, "rename", "%s(\"%s\",\"%s\")", NULL, NULL },
+{ TARGET_FREEBSD_NR_revoke, "revoke", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_rfork, "rfork", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_rmdir, "rmdir", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sbrk, "sbrk", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sched_yield, "sched_yield", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_select, "select", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_semget, "semget", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_semop, "semop", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sendmsg, "sendmsg", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sendto, "sendto", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setegid, "setegid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_seteuid, "seteuid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setgid, "setgid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setgroups, "setgroups", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setitimer, "setitimer", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setlogin, "setlogin", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setpgid, "setpgid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setpriority, "setpriority", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setregid, "setregid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setresgid, "setresgid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setresuid, "setresuid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setreuid, "setreuid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setrlimit, "setrlimit", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setsid, "setsid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setsockopt, "setsockopt", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_settimeofday, "settimeofday", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_setuid, "setuid", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_shmat, "shmat", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_shmctl, "shmctl", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_shmdt, "shmdt", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_shmget, "shmget", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_shutdown, "shutdown", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sigaction, "sigaction", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sigaltstack, "sigaltstack", "%s(%p,%p)", NULL, NULL },
+{ TARGET_FREEBSD_NR_sigpending, "sigpending", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sigprocmask, "sigprocmask", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sigreturn, "sigreturn", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sigsuspend, "sigsuspend", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_socket, "socket", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_socketpair, "socketpair", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sstk, "sstk", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_stat, "stat", "%s(\"%s\",%p)", NULL, NULL },
+{ TARGET_FREEBSD_NR_statfs, "statfs", "%s(\"%s\",%p)", NULL, NULL },
+{ TARGET_FREEBSD_NR_symlink, "symlink", "%s(\"%s\",\"%s\")", NULL, NULL },
+{ TARGET_FREEBSD_NR_sync, "sync", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_sysarch, "sysarch", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_syscall, "syscall", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_truncate, "truncate", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_umask, "umask", "%s(%#o)", NULL, NULL },
+{ TARGET_FREEBSD_NR_unlink, "unlink", "%s(\"%s\")", NULL, NULL },
+{ TARGET_FREEBSD_NR_unmount, "unmount", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_utimes, "utimes", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_vfork, "vfork", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_wait4, "wait4", NULL, NULL, NULL },
+{ TARGET_FREEBSD_NR_write, "write", "%s(%d,%#x,%d)", NULL, NULL },
+{ TARGET_FREEBSD_NR_writev, "writev", "%s(%d,%p,%#x)", NULL, NULL },
diff --git a/qemu-0.15.x/bsd-user/freebsd/syscall_nr.h b/qemu-0.15.x/bsd-user/freebsd/syscall_nr.h
new file mode 100644
index 0000000..36336ab
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/freebsd/syscall_nr.h
@@ -0,0 +1,373 @@
+/*
+ * System call numbers.
+ *
+ * $FreeBSD: src/sys/sys/syscall.h,v 1.224 2008/08/24 21:23:08 rwatson Exp $
+ * created from FreeBSD: head/sys/kern/syscalls.master 182123 2008-08-24 21:20:35Z rwatson
+ */
+
+#define TARGET_FREEBSD_NR_syscall 0
+#define TARGET_FREEBSD_NR_exit 1
+#define TARGET_FREEBSD_NR_fork 2
+#define TARGET_FREEBSD_NR_read 3
+#define TARGET_FREEBSD_NR_write 4
+#define TARGET_FREEBSD_NR_open 5
+#define TARGET_FREEBSD_NR_close 6
+#define TARGET_FREEBSD_NR_wait4 7
+#define TARGET_FREEBSD_NR_link 9
+#define TARGET_FREEBSD_NR_unlink 10
+#define TARGET_FREEBSD_NR_chdir 12
+#define TARGET_FREEBSD_NR_fchdir 13
+#define TARGET_FREEBSD_NR_mknod 14
+#define TARGET_FREEBSD_NR_chmod 15
+#define TARGET_FREEBSD_NR_chown 16
+#define TARGET_FREEBSD_NR_break 17
+#define TARGET_FREEBSD_NR_freebsd4_getfsstat 18
+#define TARGET_FREEBSD_NR_getpid 20
+#define TARGET_FREEBSD_NR_mount 21
+#define TARGET_FREEBSD_NR_unmount 22
+#define TARGET_FREEBSD_NR_setuid 23
+#define TARGET_FREEBSD_NR_getuid 24
+#define TARGET_FREEBSD_NR_geteuid 25
+#define TARGET_FREEBSD_NR_ptrace 26
+#define TARGET_FREEBSD_NR_recvmsg 27
+#define TARGET_FREEBSD_NR_sendmsg 28
+#define TARGET_FREEBSD_NR_recvfrom 29
+#define TARGET_FREEBSD_NR_accept 30
+#define TARGET_FREEBSD_NR_getpeername 31
+#define TARGET_FREEBSD_NR_getsockname 32
+#define TARGET_FREEBSD_NR_access 33
+#define TARGET_FREEBSD_NR_chflags 34
+#define TARGET_FREEBSD_NR_fchflags 35
+#define TARGET_FREEBSD_NR_sync 36
+#define TARGET_FREEBSD_NR_kill 37
+#define TARGET_FREEBSD_NR_getppid 39
+#define TARGET_FREEBSD_NR_dup 41
+#define TARGET_FREEBSD_NR_pipe 42
+#define TARGET_FREEBSD_NR_getegid 43
+#define TARGET_FREEBSD_NR_profil 44
+#define TARGET_FREEBSD_NR_ktrace 45
+#define TARGET_FREEBSD_NR_getgid 47
+#define TARGET_FREEBSD_NR_getlogin 49
+#define TARGET_FREEBSD_NR_setlogin 50
+#define TARGET_FREEBSD_NR_acct 51
+#define TARGET_FREEBSD_NR_sigaltstack 53
+#define TARGET_FREEBSD_NR_ioctl 54
+#define TARGET_FREEBSD_NR_reboot 55
+#define TARGET_FREEBSD_NR_revoke 56
+#define TARGET_FREEBSD_NR_symlink 57
+#define TARGET_FREEBSD_NR_readlink 58
+#define TARGET_FREEBSD_NR_execve 59
+#define TARGET_FREEBSD_NR_umask 60
+#define TARGET_FREEBSD_NR_chroot 61
+#define TARGET_FREEBSD_NR_msync 65
+#define TARGET_FREEBSD_NR_vfork 66
+#define TARGET_FREEBSD_NR_sbrk 69
+#define TARGET_FREEBSD_NR_sstk 70
+#define TARGET_FREEBSD_NR_vadvise 72
+#define TARGET_FREEBSD_NR_munmap 73
+#define TARGET_FREEBSD_NR_mprotect 74
+#define TARGET_FREEBSD_NR_madvise 75
+#define TARGET_FREEBSD_NR_mincore 78
+#define TARGET_FREEBSD_NR_getgroups 79
+#define TARGET_FREEBSD_NR_setgroups 80
+#define TARGET_FREEBSD_NR_getpgrp 81
+#define TARGET_FREEBSD_NR_setpgid 82
+#define TARGET_FREEBSD_NR_setitimer 83
+#define TARGET_FREEBSD_NR_swapon 85
+#define TARGET_FREEBSD_NR_getitimer 86
+#define TARGET_FREEBSD_NR_getdtablesize 89
+#define TARGET_FREEBSD_NR_dup2 90
+#define TARGET_FREEBSD_NR_fcntl 92
+#define TARGET_FREEBSD_NR_select 93
+#define TARGET_FREEBSD_NR_fsync 95
+#define TARGET_FREEBSD_NR_setpriority 96
+#define TARGET_FREEBSD_NR_socket 97
+#define TARGET_FREEBSD_NR_connect 98
+#define TARGET_FREEBSD_NR_getpriority 100
+#define TARGET_FREEBSD_NR_bind 104
+#define TARGET_FREEBSD_NR_setsockopt 105
+#define TARGET_FREEBSD_NR_listen 106
+#define TARGET_FREEBSD_NR_gettimeofday 116
+#define TARGET_FREEBSD_NR_getrusage 117
+#define TARGET_FREEBSD_NR_getsockopt 118
+#define TARGET_FREEBSD_NR_readv 120
+#define TARGET_FREEBSD_NR_writev 121
+#define TARGET_FREEBSD_NR_settimeofday 122
+#define TARGET_FREEBSD_NR_fchown 123
+#define TARGET_FREEBSD_NR_fchmod 124
+#define TARGET_FREEBSD_NR_setreuid 126
+#define TARGET_FREEBSD_NR_setregid 127
+#define TARGET_FREEBSD_NR_rename 128
+#define TARGET_FREEBSD_NR_flock 131
+#define TARGET_FREEBSD_NR_mkfifo 132
+#define TARGET_FREEBSD_NR_sendto 133
+#define TARGET_FREEBSD_NR_shutdown 134
+#define TARGET_FREEBSD_NR_socketpair 135
+#define TARGET_FREEBSD_NR_mkdir 136
+#define TARGET_FREEBSD_NR_rmdir 137
+#define TARGET_FREEBSD_NR_utimes 138
+#define TARGET_FREEBSD_NR_adjtime 140
+#define TARGET_FREEBSD_NR_setsid 147
+#define TARGET_FREEBSD_NR_quotactl 148
+#define TARGET_FREEBSD_NR_nlm_syscall 154
+#define TARGET_FREEBSD_NR_nfssvc 155
+#define TARGET_FREEBSD_NR_freebsd4_statfs 157
+#define TARGET_FREEBSD_NR_freebsd4_fstatfs 158
+#define TARGET_FREEBSD_NR_lgetfh 160
+#define TARGET_FREEBSD_NR_getfh 161
+#define TARGET_FREEBSD_NR_getdomainname 162
+#define TARGET_FREEBSD_NR_setdomainname 163
+#define TARGET_FREEBSD_NR_uname 164
+#define TARGET_FREEBSD_NR_sysarch 165
+#define TARGET_FREEBSD_NR_rtprio 166
+#define TARGET_FREEBSD_NR_semsys 169
+#define TARGET_FREEBSD_NR_msgsys 170
+#define TARGET_FREEBSD_NR_shmsys 171
+#define TARGET_FREEBSD_NR_freebsd6_pread 173
+#define TARGET_FREEBSD_NR_freebsd6_pwrite 174
+#define TARGET_FREEBSD_NR_setfib 175
+#define TARGET_FREEBSD_NR_ntp_adjtime 176
+#define TARGET_FREEBSD_NR_setgid 181
+#define TARGET_FREEBSD_NR_setegid 182
+#define TARGET_FREEBSD_NR_seteuid 183
+#define TARGET_FREEBSD_NR_stat 188
+#define TARGET_FREEBSD_NR_fstat 189
+#define TARGET_FREEBSD_NR_lstat 190
+#define TARGET_FREEBSD_NR_pathconf 191
+#define TARGET_FREEBSD_NR_fpathconf 192
+#define TARGET_FREEBSD_NR_getrlimit 194
+#define TARGET_FREEBSD_NR_setrlimit 195
+#define TARGET_FREEBSD_NR_getdirentries 196
+#define TARGET_FREEBSD_NR_freebsd6_mmap 197
+#define TARGET_FREEBSD_NR___syscall 198
+#define TARGET_FREEBSD_NR_freebsd6_lseek 199
+#define TARGET_FREEBSD_NR_freebsd6_truncate 200
+#define TARGET_FREEBSD_NR_freebsd6_ftruncate 201
+#define TARGET_FREEBSD_NR___sysctl 202
+#define TARGET_FREEBSD_NR_mlock 203
+#define TARGET_FREEBSD_NR_munlock 204
+#define TARGET_FREEBSD_NR_undelete 205
+#define TARGET_FREEBSD_NR_futimes 206
+#define TARGET_FREEBSD_NR_getpgid 207
+#define TARGET_FREEBSD_NR_poll 209
+#define TARGET_FREEBSD_NR___semctl 220
+#define TARGET_FREEBSD_NR_semget 221
+#define TARGET_FREEBSD_NR_semop 222
+#define TARGET_FREEBSD_NR_msgctl 224
+#define TARGET_FREEBSD_NR_msgget 225
+#define TARGET_FREEBSD_NR_msgsnd 226
+#define TARGET_FREEBSD_NR_msgrcv 227
+#define TARGET_FREEBSD_NR_shmat 228
+#define TARGET_FREEBSD_NR_shmctl 229
+#define TARGET_FREEBSD_NR_shmdt 230
+#define TARGET_FREEBSD_NR_shmget 231
+#define TARGET_FREEBSD_NR_clock_gettime 232
+#define TARGET_FREEBSD_NR_clock_settime 233
+#define TARGET_FREEBSD_NR_clock_getres 234
+#define TARGET_FREEBSD_NR_ktimer_create 235
+#define TARGET_FREEBSD_NR_ktimer_delete 236
+#define TARGET_FREEBSD_NR_ktimer_settime 237
+#define TARGET_FREEBSD_NR_ktimer_gettime 238
+#define TARGET_FREEBSD_NR_ktimer_getoverrun 239
+#define TARGET_FREEBSD_NR_nanosleep 240
+#define TARGET_FREEBSD_NR_ntp_gettime 248
+#define TARGET_FREEBSD_NR_minherit 250
+#define TARGET_FREEBSD_NR_rfork 251
+#define TARGET_FREEBSD_NR_openbsd_poll 252
+#define TARGET_FREEBSD_NR_issetugid 253
+#define TARGET_FREEBSD_NR_lchown 254
+#define TARGET_FREEBSD_NR_aio_read 255
+#define TARGET_FREEBSD_NR_aio_write 256
+#define TARGET_FREEBSD_NR_lio_listio 257
+#define TARGET_FREEBSD_NR_getdents 272
+#define TARGET_FREEBSD_NR_lchmod 274
+#define TARGET_FREEBSD_NR_netbsd_lchown 275
+#define TARGET_FREEBSD_NR_lutimes 276
+#define TARGET_FREEBSD_NR_netbsd_msync 277
+#define TARGET_FREEBSD_NR_nstat 278
+#define TARGET_FREEBSD_NR_nfstat 279
+#define TARGET_FREEBSD_NR_nlstat 280
+#define TARGET_FREEBSD_NR_preadv 289
+#define TARGET_FREEBSD_NR_pwritev 290
+#define TARGET_FREEBSD_NR_freebsd4_fhstatfs 297
+#define TARGET_FREEBSD_NR_fhopen 298
+#define TARGET_FREEBSD_NR_fhstat 299
+#define TARGET_FREEBSD_NR_modnext 300
+#define TARGET_FREEBSD_NR_modstat 301
+#define TARGET_FREEBSD_NR_modfnext 302
+#define TARGET_FREEBSD_NR_modfind 303
+#define TARGET_FREEBSD_NR_kldload 304
+#define TARGET_FREEBSD_NR_kldunload 305
+#define TARGET_FREEBSD_NR_kldfind 306
+#define TARGET_FREEBSD_NR_kldnext 307
+#define TARGET_FREEBSD_NR_kldstat 308
+#define TARGET_FREEBSD_NR_kldfirstmod 309
+#define TARGET_FREEBSD_NR_getsid 310
+#define TARGET_FREEBSD_NR_setresuid 311
+#define TARGET_FREEBSD_NR_setresgid 312
+#define TARGET_FREEBSD_NR_aio_return 314
+#define TARGET_FREEBSD_NR_aio_suspend 315
+#define TARGET_FREEBSD_NR_aio_cancel 316
+#define TARGET_FREEBSD_NR_aio_error 317
+#define TARGET_FREEBSD_NR_oaio_read 318
+#define TARGET_FREEBSD_NR_oaio_write 319
+#define TARGET_FREEBSD_NR_olio_listio 320
+#define TARGET_FREEBSD_NR_yield 321
+#define TARGET_FREEBSD_NR_mlockall 324
+#define TARGET_FREEBSD_NR_munlockall 325
+#define TARGET_FREEBSD_NR___getcwd 326
+#define TARGET_FREEBSD_NR_sched_setparam 327
+#define TARGET_FREEBSD_NR_sched_getparam 328
+#define TARGET_FREEBSD_NR_sched_setscheduler 329
+#define TARGET_FREEBSD_NR_sched_getscheduler 330
+#define TARGET_FREEBSD_NR_sched_yield 331
+#define TARGET_FREEBSD_NR_sched_get_priority_max 332
+#define TARGET_FREEBSD_NR_sched_get_priority_min 333
+#define TARGET_FREEBSD_NR_sched_rr_get_interval 334
+#define TARGET_FREEBSD_NR_utrace 335
+#define TARGET_FREEBSD_NR_freebsd4_sendfile 336
+#define TARGET_FREEBSD_NR_kldsym 337
+#define TARGET_FREEBSD_NR_jail 338
+#define TARGET_FREEBSD_NR_sigprocmask 340
+#define TARGET_FREEBSD_NR_sigsuspend 341
+#define TARGET_FREEBSD_NR_freebsd4_sigaction 342
+#define TARGET_FREEBSD_NR_sigpending 343
+#define TARGET_FREEBSD_NR_freebsd4_sigreturn 344
+#define TARGET_FREEBSD_NR_sigtimedwait 345
+#define TARGET_FREEBSD_NR_sigwaitinfo 346
+#define TARGET_FREEBSD_NR___acl_get_file 347
+#define TARGET_FREEBSD_NR___acl_set_file 348
+#define TARGET_FREEBSD_NR___acl_get_fd 349
+#define TARGET_FREEBSD_NR___acl_set_fd 350
+#define TARGET_FREEBSD_NR___acl_delete_file 351
+#define TARGET_FREEBSD_NR___acl_delete_fd 352
+#define TARGET_FREEBSD_NR___acl_aclcheck_file 353
+#define TARGET_FREEBSD_NR___acl_aclcheck_fd 354
+#define TARGET_FREEBSD_NR_extattrctl 355
+#define TARGET_FREEBSD_NR_extattr_set_file 356
+#define TARGET_FREEBSD_NR_extattr_get_file 357
+#define TARGET_FREEBSD_NR_extattr_delete_file 358
+#define TARGET_FREEBSD_NR_aio_waitcomplete 359
+#define TARGET_FREEBSD_NR_getresuid 360
+#define TARGET_FREEBSD_NR_getresgid 361
+#define TARGET_FREEBSD_NR_kqueue 362
+#define TARGET_FREEBSD_NR_kevent 363
+#define TARGET_FREEBSD_NR_extattr_set_fd 371
+#define TARGET_FREEBSD_NR_extattr_get_fd 372
+#define TARGET_FREEBSD_NR_extattr_delete_fd 373
+#define TARGET_FREEBSD_NR___setugid 374
+#define TARGET_FREEBSD_NR_nfsclnt 375
+#define TARGET_FREEBSD_NR_eaccess 376
+#define TARGET_FREEBSD_NR_nmount 378
+#define TARGET_FREEBSD_NR___mac_get_proc 384
+#define TARGET_FREEBSD_NR___mac_set_proc 385
+#define TARGET_FREEBSD_NR___mac_get_fd 386
+#define TARGET_FREEBSD_NR___mac_get_file 387
+#define TARGET_FREEBSD_NR___mac_set_fd 388
+#define TARGET_FREEBSD_NR___mac_set_file 389
+#define TARGET_FREEBSD_NR_kenv 390
+#define TARGET_FREEBSD_NR_lchflags 391
+#define TARGET_FREEBSD_NR_uuidgen 392
+#define TARGET_FREEBSD_NR_sendfile 393
+#define TARGET_FREEBSD_NR_mac_syscall 394
+#define TARGET_FREEBSD_NR_getfsstat 395
+#define TARGET_FREEBSD_NR_statfs 396
+#define TARGET_FREEBSD_NR_fstatfs 397
+#define TARGET_FREEBSD_NR_fhstatfs 398
+#define TARGET_FREEBSD_NR_ksem_close 400
+#define TARGET_FREEBSD_NR_ksem_post 401
+#define TARGET_FREEBSD_NR_ksem_wait 402
+#define TARGET_FREEBSD_NR_ksem_trywait 403
+#define TARGET_FREEBSD_NR_ksem_init 404
+#define TARGET_FREEBSD_NR_ksem_open 405
+#define TARGET_FREEBSD_NR_ksem_unlink 406
+#define TARGET_FREEBSD_NR_ksem_getvalue 407
+#define TARGET_FREEBSD_NR_ksem_destroy 408
+#define TARGET_FREEBSD_NR___mac_get_pid 409
+#define TARGET_FREEBSD_NR___mac_get_link 410
+#define TARGET_FREEBSD_NR___mac_set_link 411
+#define TARGET_FREEBSD_NR_extattr_set_link 412
+#define TARGET_FREEBSD_NR_extattr_get_link 413
+#define TARGET_FREEBSD_NR_extattr_delete_link 414
+#define TARGET_FREEBSD_NR___mac_execve 415
+#define TARGET_FREEBSD_NR_sigaction 416
+#define TARGET_FREEBSD_NR_sigreturn 417
+#define TARGET_FREEBSD_NR_getcontext 421
+#define TARGET_FREEBSD_NR_setcontext 422
+#define TARGET_FREEBSD_NR_swapcontext 423
+#define TARGET_FREEBSD_NR_swapoff 424
+#define TARGET_FREEBSD_NR___acl_get_link 425
+#define TARGET_FREEBSD_NR___acl_set_link 426
+#define TARGET_FREEBSD_NR___acl_delete_link 427
+#define TARGET_FREEBSD_NR___acl_aclcheck_link 428
+#define TARGET_FREEBSD_NR_sigwait 429
+#define TARGET_FREEBSD_NR_thr_create 430
+#define TARGET_FREEBSD_NR_thr_exit 431
+#define TARGET_FREEBSD_NR_thr_self 432
+#define TARGET_FREEBSD_NR_thr_kill 433
+#define TARGET_FREEBSD_NR__umtx_lock 434
+#define TARGET_FREEBSD_NR__umtx_unlock 435
+#define TARGET_FREEBSD_NR_jail_attach 436
+#define TARGET_FREEBSD_NR_extattr_list_fd 437
+#define TARGET_FREEBSD_NR_extattr_list_file 438
+#define TARGET_FREEBSD_NR_extattr_list_link 439
+#define TARGET_FREEBSD_NR_ksem_timedwait 441
+#define TARGET_FREEBSD_NR_thr_suspend 442
+#define TARGET_FREEBSD_NR_thr_wake 443
+#define TARGET_FREEBSD_NR_kldunloadf 444
+#define TARGET_FREEBSD_NR_audit 445
+#define TARGET_FREEBSD_NR_auditon 446
+#define TARGET_FREEBSD_NR_getauid 447
+#define TARGET_FREEBSD_NR_setauid 448
+#define TARGET_FREEBSD_NR_getaudit 449
+#define TARGET_FREEBSD_NR_setaudit 450
+#define TARGET_FREEBSD_NR_getaudit_addr 451
+#define TARGET_FREEBSD_NR_setaudit_addr 452
+#define TARGET_FREEBSD_NR_auditctl 453
+#define TARGET_FREEBSD_NR__umtx_op 454
+#define TARGET_FREEBSD_NR_thr_new 455
+#define TARGET_FREEBSD_NR_sigqueue 456
+#define TARGET_FREEBSD_NR_kmq_open 457
+#define TARGET_FREEBSD_NR_kmq_setattr 458
+#define TARGET_FREEBSD_NR_kmq_timedreceive 459
+#define TARGET_FREEBSD_NR_kmq_timedsend 460
+#define TARGET_FREEBSD_NR_kmq_notify 461
+#define TARGET_FREEBSD_NR_kmq_unlink 462
+#define TARGET_FREEBSD_NR_abort2 463
+#define TARGET_FREEBSD_NR_thr_set_name 464
+#define TARGET_FREEBSD_NR_aio_fsync 465
+#define TARGET_FREEBSD_NR_rtprio_thread 466
+#define TARGET_FREEBSD_NR_sctp_peeloff 471
+#define TARGET_FREEBSD_NR_sctp_generic_sendmsg 472
+#define TARGET_FREEBSD_NR_sctp_generic_sendmsg_iov 473
+#define TARGET_FREEBSD_NR_sctp_generic_recvmsg 474
+#define TARGET_FREEBSD_NR_pread 475
+#define TARGET_FREEBSD_NR_pwrite 476
+#define TARGET_FREEBSD_NR_mmap 477
+#define TARGET_FREEBSD_NR_lseek 478
+#define TARGET_FREEBSD_NR_truncate 479
+#define TARGET_FREEBSD_NR_ftruncate 480
+#define TARGET_FREEBSD_NR_thr_kill2 481
+#define TARGET_FREEBSD_NR_shm_open 482
+#define TARGET_FREEBSD_NR_shm_unlink 483
+#define TARGET_FREEBSD_NR_cpuset 484
+#define TARGET_FREEBSD_NR_cpuset_setid 485
+#define TARGET_FREEBSD_NR_cpuset_getid 486
+#define TARGET_FREEBSD_NR_cpuset_getaffinity 487
+#define TARGET_FREEBSD_NR_cpuset_setaffinity 488
+#define TARGET_FREEBSD_NR_faccessat 489
+#define TARGET_FREEBSD_NR_fchmodat 490
+#define TARGET_FREEBSD_NR_fchownat 491
+#define TARGET_FREEBSD_NR_fexecve 492
+#define TARGET_FREEBSD_NR_fstatat 493
+#define TARGET_FREEBSD_NR_futimesat 494
+#define TARGET_FREEBSD_NR_linkat 495
+#define TARGET_FREEBSD_NR_mkdirat 496
+#define TARGET_FREEBSD_NR_mkfifoat 497
+#define TARGET_FREEBSD_NR_mknodat 498
+#define TARGET_FREEBSD_NR_openat 499
+#define TARGET_FREEBSD_NR_readlinkat 500
+#define TARGET_FREEBSD_NR_renameat 501
+#define TARGET_FREEBSD_NR_symlinkat 502
+#define TARGET_FREEBSD_NR_unlinkat 503
+#define TARGET_FREEBSD_NR_posix_openpt 504
diff --git a/qemu-0.15.x/bsd-user/i386/syscall.h b/qemu-0.15.x/bsd-user/i386/syscall.h
new file mode 100644
index 0000000..9b34c61
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/i386/syscall.h
@@ -0,0 +1,161 @@
+/* default linux values for the selectors */
+#define __USER_CS (0x23)
+#define __USER_DS (0x2B)
+
+struct target_pt_regs {
+ long ebx;
+ long ecx;
+ long edx;
+ long esi;
+ long edi;
+ long ebp;
+ long eax;
+ int xds;
+ int xes;
+ long orig_eax;
+ long eip;
+ int xcs;
+ long eflags;
+ long esp;
+ int xss;
+};
+
+/* ioctls */
+
+#define TARGET_LDT_ENTRIES 8192
+#define TARGET_LDT_ENTRY_SIZE 8
+
+#define TARGET_GDT_ENTRIES 9
+#define TARGET_GDT_ENTRY_TLS_ENTRIES 3
+#define TARGET_GDT_ENTRY_TLS_MIN 6
+#define TARGET_GDT_ENTRY_TLS_MAX (TARGET_GDT_ENTRY_TLS_MIN + TARGET_GDT_ENTRY_TLS_ENTRIES - 1)
+
+struct target_modify_ldt_ldt_s {
+ unsigned int entry_number;
+ abi_ulong base_addr;
+ unsigned int limit;
+ unsigned int flags;
+};
+
+/* vm86 defines */
+
+#define TARGET_BIOSSEG 0x0f000
+
+#define TARGET_CPU_086 0
+#define TARGET_CPU_186 1
+#define TARGET_CPU_286 2
+#define TARGET_CPU_386 3
+#define TARGET_CPU_486 4
+#define TARGET_CPU_586 5
+
+#define TARGET_VM86_SIGNAL 0 /* return due to signal */
+#define TARGET_VM86_UNKNOWN 1 /* unhandled GP fault - IO-instruction or similar */
+#define TARGET_VM86_INTx 2 /* int3/int x instruction (ARG = x) */
+#define TARGET_VM86_STI 3 /* sti/popf/iret instruction enabled virtual interrupts */
+
+/*
+ * Additional return values when invoking new vm86()
+ */
+#define TARGET_VM86_PICRETURN 4 /* return due to pending PIC request */
+#define TARGET_VM86_TRAP 6 /* return due to DOS-debugger request */
+
+/*
+ * function codes when invoking new vm86()
+ */
+#define TARGET_VM86_PLUS_INSTALL_CHECK 0
+#define TARGET_VM86_ENTER 1
+#define TARGET_VM86_ENTER_NO_BYPASS 2
+#define TARGET_VM86_REQUEST_IRQ 3
+#define TARGET_VM86_FREE_IRQ 4
+#define TARGET_VM86_GET_IRQ_BITS 5
+#define TARGET_VM86_GET_AND_RESET_IRQ 6
+
+/*
+ * This is the stack-layout seen by the user space program when we have
+ * done a translation of "SAVE_ALL" from vm86 mode. The real kernel layout
+ * is 'kernel_vm86_regs' (see below).
+ */
+
+struct target_vm86_regs {
+/*
+ * normal regs, with special meaning for the segment descriptors..
+ */
+ abi_long ebx;
+ abi_long ecx;
+ abi_long edx;
+ abi_long esi;
+ abi_long edi;
+ abi_long ebp;
+ abi_long eax;
+ abi_long __null_ds;
+ abi_long __null_es;
+ abi_long __null_fs;
+ abi_long __null_gs;
+ abi_long orig_eax;
+ abi_long eip;
+ unsigned short cs, __csh;
+ abi_long eflags;
+ abi_long esp;
+ unsigned short ss, __ssh;
+/*
+ * these are specific to v86 mode:
+ */
+ unsigned short es, __esh;
+ unsigned short ds, __dsh;
+ unsigned short fs, __fsh;
+ unsigned short gs, __gsh;
+};
+
+struct target_revectored_struct {
+ abi_ulong __map[8]; /* 256 bits */
+};
+
+struct target_vm86_struct {
+ struct target_vm86_regs regs;
+ abi_ulong flags;
+ abi_ulong screen_bitmap;
+ abi_ulong cpu_type;
+ struct target_revectored_struct int_revectored;
+ struct target_revectored_struct int21_revectored;
+};
+
+/*
+ * flags masks
+ */
+#define TARGET_VM86_SCREEN_BITMAP 0x0001
+
+struct target_vm86plus_info_struct {
+ abi_ulong flags;
+#define TARGET_force_return_for_pic (1 << 0)
+#define TARGET_vm86dbg_active (1 << 1) /* for debugger */
+#define TARGET_vm86dbg_TFpendig (1 << 2) /* for debugger */
+#define TARGET_is_vm86pus (1 << 31) /* for vm86 internal use */
+ unsigned char vm86dbg_intxxtab[32]; /* for debugger */
+};
+
+struct target_vm86plus_struct {
+ struct target_vm86_regs regs;
+ abi_ulong flags;
+ abi_ulong screen_bitmap;
+ abi_ulong cpu_type;
+ struct target_revectored_struct int_revectored;
+ struct target_revectored_struct int21_revectored;
+ struct target_vm86plus_info_struct vm86plus;
+};
+
+/* FreeBSD sysarch(2) */
+#define TARGET_FREEBSD_I386_GET_LDT 0
+#define TARGET_FREEBSD_I386_SET_LDT 1
+ /* I386_IOPL */
+#define TARGET_FREEBSD_I386_GET_IOPERM 3
+#define TARGET_FREEBSD_I386_SET_IOPERM 4
+ /* xxxxx */
+#define TARGET_FREEBSD_I386_VM86 6
+#define TARGET_FREEBSD_I386_GET_FSBASE 7
+#define TARGET_FREEBSD_I386_SET_FSBASE 8
+#define TARGET_FREEBSD_I386_GET_GSBASE 9
+#define TARGET_FREEBSD_I386_SET_GSBASE 10
+
+
+#define UNAME_MACHINE "i386"
+
diff --git a/qemu-0.15.x/bsd-user/i386/target_signal.h b/qemu-0.15.x/bsd-user/i386/target_signal.h
new file mode 100644
index 0000000..2ef36d1
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/i386/target_signal.h
@@ -0,0 +1,20 @@
+#ifndef TARGET_SIGNAL_H
+#define TARGET_SIGNAL_H
+
+#include "cpu.h"
+
+/* this struct defines a stack used during syscall handling */
+
+typedef struct target_sigaltstack {
+ abi_ulong ss_sp;
+ abi_long ss_flags;
+ abi_ulong ss_size;
+} target_stack_t;
+
+
+static inline abi_ulong get_sp_from_cpustate(CPUX86State *state)
+{
+ return state->regs[R_ESP];
+}
+
+#endif /* TARGET_SIGNAL_H */
diff --git a/qemu-0.15.x/bsd-user/main.c b/qemu-0.15.x/bsd-user/main.c
new file mode 100644
index 0000000..a63b877
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/main.c
@@ -0,0 +1,1143 @@
+/*
+ * qemu user main
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <machine/trap.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+
+#include "qemu.h"
+#include "qemu-common.h"
+/* For tb_lock */
+#include "cpu.h"
+#include "tcg.h"
+#include "qemu-timer.h"
+#include "envlist.h"
+
+#define DEBUG_LOGFILE "/tmp/qemu.log"
+
+int singlestep;
+#if defined(CONFIG_USE_GUEST_BASE)
+unsigned long mmap_min_addr;
+unsigned long guest_base;
+int have_guest_base;
+#endif
+
+static const char *interp_prefix = CONFIG_QEMU_INTERP_PREFIX;
+const char *qemu_uname_release = CONFIG_UNAME_RELEASE;
+extern char **environ;
+enum BSDType bsd_type;
+
+/* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
+ we allocate a bigger stack. Need a better solution, for example
+ by remapping the process stack directly at the right place */
+unsigned long x86_stack_size = 512 * 1024;
+
+void gemu_log(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+#if defined(TARGET_I386)
+int cpu_get_pic_interrupt(CPUState *env)
+{
+ return -1;
+}
+#endif
+
+/* These are no-ops because we are not threadsafe. */
+static inline void cpu_exec_start(CPUState *env)
+{
+}
+
+static inline void cpu_exec_end(CPUState *env)
+{
+}
+
+static inline void start_exclusive(void)
+{
+}
+
+static inline void end_exclusive(void)
+{
+}
+
+void fork_start(void)
+{
+}
+
+void fork_end(int child)
+{
+ if (child) {
+ gdbserver_fork(thread_env);
+ }
+}
+
+void cpu_list_lock(void)
+{
+}
+
+void cpu_list_unlock(void)
+{
+}
+
+#ifdef TARGET_I386
+/***********************************************************/
+/* CPUX86 core interface */
+
+void cpu_smm_update(CPUState *env)
+{
+}
+
+uint64_t cpu_get_tsc(CPUX86State *env)
+{
+ return cpu_get_real_ticks();
+}
+
+static void write_dt(void *ptr, unsigned long addr, unsigned long limit,
+ int flags)
+{
+ unsigned int e1, e2;
+ uint32_t *p;
+ e1 = (addr << 16) | (limit & 0xffff);
+ e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000);
+ e2 |= flags;
+ p = ptr;
+ p[0] = tswap32(e1);
+ p[1] = tswap32(e2);
+}
+
+static uint64_t *idt_table;
+#ifdef TARGET_X86_64
+static void set_gate64(void *ptr, unsigned int type, unsigned int dpl,
+ uint64_t addr, unsigned int sel)
+{
+ uint32_t *p, e1, e2;
+ e1 = (addr & 0xffff) | (sel << 16);
+ e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
+ p = ptr;
+ p[0] = tswap32(e1);
+ p[1] = tswap32(e2);
+ p[2] = tswap32(addr >> 32);
+ p[3] = 0;
+}
+/* only dpl matters as we do only user space emulation */
+static void set_idt(int n, unsigned int dpl)
+{
+ set_gate64(idt_table + n * 2, 0, dpl, 0, 0);
+}
+#else
+static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
+ uint32_t addr, unsigned int sel)
+{
+ uint32_t *p, e1, e2;
+ e1 = (addr & 0xffff) | (sel << 16);
+ e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
+ p = ptr;
+ p[0] = tswap32(e1);
+ p[1] = tswap32(e2);
+}
+
+/* only dpl matters as we do only user space emulation */
+static void set_idt(int n, unsigned int dpl)
+{
+ set_gate(idt_table + n, 0, dpl, 0, 0);
+}
+#endif
+
+void cpu_loop(CPUX86State *env)
+{
+ int trapnr;
+ abi_ulong pc;
+ //target_siginfo_t info;
+
+ for(;;) {
+ trapnr = cpu_x86_exec(env);
+ switch(trapnr) {
+ case 0x80:
+ /* syscall from int $0x80 */
+ if (bsd_type == target_freebsd) {
+ abi_ulong params = (abi_ulong) env->regs[R_ESP] +
+ sizeof(int32_t);
+ int32_t syscall_nr = env->regs[R_EAX];
+ int32_t arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8;
+
+ if (syscall_nr == TARGET_FREEBSD_NR_syscall) {
+ get_user_s32(syscall_nr, params);
+ params += sizeof(int32_t);
+ } else if (syscall_nr == TARGET_FREEBSD_NR___syscall) {
+ get_user_s32(syscall_nr, params);
+ params += sizeof(int64_t);
+ }
+ get_user_s32(arg1, params);
+ params += sizeof(int32_t);
+ get_user_s32(arg2, params);
+ params += sizeof(int32_t);
+ get_user_s32(arg3, params);
+ params += sizeof(int32_t);
+ get_user_s32(arg4, params);
+ params += sizeof(int32_t);
+ get_user_s32(arg5, params);
+ params += sizeof(int32_t);
+ get_user_s32(arg6, params);
+ params += sizeof(int32_t);
+ get_user_s32(arg7, params);
+ params += sizeof(int32_t);
+ get_user_s32(arg8, params);
+ env->regs[R_EAX] = do_freebsd_syscall(env,
+ syscall_nr,
+ arg1,
+ arg2,
+ arg3,
+ arg4,
+ arg5,
+ arg6,
+ arg7,
+ arg8);
+ } else { //if (bsd_type == target_openbsd)
+ env->regs[R_EAX] = do_openbsd_syscall(env,
+ env->regs[R_EAX],
+ env->regs[R_EBX],
+ env->regs[R_ECX],
+ env->regs[R_EDX],
+ env->regs[R_ESI],
+ env->regs[R_EDI],
+ env->regs[R_EBP]);
+ }
+ if (((abi_ulong)env->regs[R_EAX]) >= (abi_ulong)(-515)) {
+ env->regs[R_EAX] = -env->regs[R_EAX];
+ env->eflags |= CC_C;
+ } else {
+ env->eflags &= ~CC_C;
+ }
+ break;
+#ifndef TARGET_ABI32
+ case EXCP_SYSCALL:
+ /* syscall from syscall instruction */
+ if (bsd_type == target_freebsd)
+ env->regs[R_EAX] = do_freebsd_syscall(env,
+ env->regs[R_EAX],
+ env->regs[R_EDI],
+ env->regs[R_ESI],
+ env->regs[R_EDX],
+ env->regs[R_ECX],
+ env->regs[8],
+ env->regs[9], 0, 0);
+ else { //if (bsd_type == target_openbsd)
+ env->regs[R_EAX] = do_openbsd_syscall(env,
+ env->regs[R_EAX],
+ env->regs[R_EDI],
+ env->regs[R_ESI],
+ env->regs[R_EDX],
+ env->regs[10],
+ env->regs[8],
+ env->regs[9]);
+ }
+ env->eip = env->exception_next_eip;
+ if (((abi_ulong)env->regs[R_EAX]) >= (abi_ulong)(-515)) {
+ env->regs[R_EAX] = -env->regs[R_EAX];
+ env->eflags |= CC_C;
+ } else {
+ env->eflags &= ~CC_C;
+ }
+ break;
+#endif
+#if 0
+ case EXCP0B_NOSEG:
+ case EXCP0C_STACK:
+ info.si_signo = SIGBUS;
+ info.si_errno = 0;
+ info.si_code = TARGET_SI_KERNEL;
+ info._sifields._sigfault._addr = 0;
+ queue_signal(env, info.si_signo, &info);
+ break;
+ case EXCP0D_GPF:
+ /* XXX: potential problem if ABI32 */
+#ifndef TARGET_X86_64
+ if (env->eflags & VM_MASK) {
+ handle_vm86_fault(env);
+ } else
+#endif
+ {
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ info.si_code = TARGET_SI_KERNEL;
+ info._sifields._sigfault._addr = 0;
+ queue_signal(env, info.si_signo, &info);
+ }
+ break;
+ case EXCP0E_PAGE:
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ if (!(env->error_code & 1))
+ info.si_code = TARGET_SEGV_MAPERR;
+ else
+ info.si_code = TARGET_SEGV_ACCERR;
+ info._sifields._sigfault._addr = env->cr[2];
+ queue_signal(env, info.si_signo, &info);
+ break;
+ case EXCP00_DIVZ:
+#ifndef TARGET_X86_64
+ if (env->eflags & VM_MASK) {
+ handle_vm86_trap(env, trapnr);
+ } else
+#endif
+ {
+ /* division by zero */
+ info.si_signo = SIGFPE;
+ info.si_errno = 0;
+ info.si_code = TARGET_FPE_INTDIV;
+ info._sifields._sigfault._addr = env->eip;
+ queue_signal(env, info.si_signo, &info);
+ }
+ break;
+ case EXCP01_DB:
+ case EXCP03_INT3:
+#ifndef TARGET_X86_64
+ if (env->eflags & VM_MASK) {
+ handle_vm86_trap(env, trapnr);
+ } else
+#endif
+ {
+ info.si_signo = SIGTRAP;
+ info.si_errno = 0;
+ if (trapnr == EXCP01_DB) {
+ info.si_code = TARGET_TRAP_BRKPT;
+ info._sifields._sigfault._addr = env->eip;
+ } else {
+ info.si_code = TARGET_SI_KERNEL;
+ info._sifields._sigfault._addr = 0;
+ }
+ queue_signal(env, info.si_signo, &info);
+ }
+ break;
+ case EXCP04_INTO:
+ case EXCP05_BOUND:
+#ifndef TARGET_X86_64
+ if (env->eflags & VM_MASK) {
+ handle_vm86_trap(env, trapnr);
+ } else
+#endif
+ {
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ info.si_code = TARGET_SI_KERNEL;
+ info._sifields._sigfault._addr = 0;
+ queue_signal(env, info.si_signo, &info);
+ }
+ break;
+ case EXCP06_ILLOP:
+ info.si_signo = SIGILL;
+ info.si_errno = 0;
+ info.si_code = TARGET_ILL_ILLOPN;
+ info._sifields._sigfault._addr = env->eip;
+ queue_signal(env, info.si_signo, &info);
+ break;
+#endif
+ case EXCP_INTERRUPT:
+ /* just indicate that signals should be handled asap */
+ break;
+#if 0
+ case EXCP_DEBUG:
+ {
+ int sig;
+
+ sig = gdb_handlesig (env, TARGET_SIGTRAP);
+ if (sig)
+ {
+ info.si_signo = sig;
+ info.si_errno = 0;
+ info.si_code = TARGET_TRAP_BRKPT;
+ queue_signal(env, info.si_signo, &info);
+ }
+ }
+ break;
+#endif
+ default:
+ pc = env->segs[R_CS].base + env->eip;
+ fprintf(stderr, "qemu: 0x%08lx: unhandled CPU exception 0x%x - aborting\n",
+ (long)pc, trapnr);
+ abort();
+ }
+ process_pending_signals(env);
+ }
+}
+#endif
+
+#ifdef TARGET_SPARC
+#define SPARC64_STACK_BIAS 2047
+
+//#define DEBUG_WIN
+/* WARNING: dealing with register windows _is_ complicated. More info
+ can be found at http://www.sics.se/~psm/sparcstack.html */
+static inline int get_reg_index(CPUSPARCState *env, int cwp, int index)
+{
+ index = (index + cwp * 16) % (16 * env->nwindows);
+ /* wrap handling : if cwp is on the last window, then we use the
+ registers 'after' the end */
+ if (index < 8 && env->cwp == env->nwindows - 1)
+ index += 16 * env->nwindows;
+ return index;
+}
+
+/* save the register window 'cwp1' */
+static inline void save_window_offset(CPUSPARCState *env, int cwp1)
+{
+ unsigned int i;
+ abi_ulong sp_ptr;
+
+ sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)];
+#ifdef TARGET_SPARC64
+ if (sp_ptr & 3)
+ sp_ptr += SPARC64_STACK_BIAS;
+#endif
+#if defined(DEBUG_WIN)
+ printf("win_overflow: sp_ptr=0x" TARGET_ABI_FMT_lx " save_cwp=%d\n",
+ sp_ptr, cwp1);
+#endif
+ for(i = 0; i < 16; i++) {
+ /* FIXME - what to do if put_user() fails? */
+ put_user_ual(env->regbase[get_reg_index(env, cwp1, 8 + i)], sp_ptr);
+ sp_ptr += sizeof(abi_ulong);
+ }
+}
+
+static void save_window(CPUSPARCState *env)
+{
+#ifndef TARGET_SPARC64
+ unsigned int new_wim;
+ new_wim = ((env->wim >> 1) | (env->wim << (env->nwindows - 1))) &
+ ((1LL << env->nwindows) - 1);
+ save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2));
+ env->wim = new_wim;
+#else
+ save_window_offset(env, cpu_cwp_dec(env, env->cwp - 2));
+ env->cansave++;
+ env->canrestore--;
+#endif
+}
+
+static void restore_window(CPUSPARCState *env)
+{
+#ifndef TARGET_SPARC64
+ unsigned int new_wim;
+#endif
+ unsigned int i, cwp1;
+ abi_ulong sp_ptr;
+
+#ifndef TARGET_SPARC64
+ new_wim = ((env->wim << 1) | (env->wim >> (env->nwindows - 1))) &
+ ((1LL << env->nwindows) - 1);
+#endif
+
+ /* restore the invalid window */
+ cwp1 = cpu_cwp_inc(env, env->cwp + 1);
+ sp_ptr = env->regbase[get_reg_index(env, cwp1, 6)];
+#ifdef TARGET_SPARC64
+ if (sp_ptr & 3)
+ sp_ptr += SPARC64_STACK_BIAS;
+#endif
+#if defined(DEBUG_WIN)
+ printf("win_underflow: sp_ptr=0x" TARGET_ABI_FMT_lx " load_cwp=%d\n",
+ sp_ptr, cwp1);
+#endif
+ for(i = 0; i < 16; i++) {
+ /* FIXME - what to do if get_user() fails? */
+ get_user_ual(env->regbase[get_reg_index(env, cwp1, 8 + i)], sp_ptr);
+ sp_ptr += sizeof(abi_ulong);
+ }
+#ifdef TARGET_SPARC64
+ env->canrestore++;
+ if (env->cleanwin < env->nwindows - 1)
+ env->cleanwin++;
+ env->cansave--;
+#else
+ env->wim = new_wim;
+#endif
+}
+
+static void flush_windows(CPUSPARCState *env)
+{
+ int offset, cwp1;
+
+ offset = 1;
+ for(;;) {
+ /* if restore would invoke restore_window(), then we can stop */
+ cwp1 = cpu_cwp_inc(env, env->cwp + offset);
+#ifndef TARGET_SPARC64
+ if (env->wim & (1 << cwp1))
+ break;
+#else
+ if (env->canrestore == 0)
+ break;
+ env->cansave++;
+ env->canrestore--;
+#endif
+ save_window_offset(env, cwp1);
+ offset++;
+ }
+ cwp1 = cpu_cwp_inc(env, env->cwp + 1);
+#ifndef TARGET_SPARC64
+ /* set wim so that restore will reload the registers */
+ env->wim = 1 << cwp1;
+#endif
+#if defined(DEBUG_WIN)
+ printf("flush_windows: nb=%d\n", offset - 1);
+#endif
+}
+
+void cpu_loop(CPUSPARCState *env)
+{
+ int trapnr, ret, syscall_nr;
+ //target_siginfo_t info;
+
+ while (1) {
+ trapnr = cpu_sparc_exec (env);
+
+ switch (trapnr) {
+#ifndef TARGET_SPARC64
+ case 0x80:
+#else
+ /* FreeBSD uses 0x141 for syscalls too */
+ case 0x141:
+ if (bsd_type != target_freebsd)
+ goto badtrap;
+ case 0x100:
+#endif
+ syscall_nr = env->gregs[1];
+ if (bsd_type == target_freebsd)
+ ret = do_freebsd_syscall(env, syscall_nr,
+ env->regwptr[0], env->regwptr[1],
+ env->regwptr[2], env->regwptr[3],
+ env->regwptr[4], env->regwptr[5], 0, 0);
+ else if (bsd_type == target_netbsd)
+ ret = do_netbsd_syscall(env, syscall_nr,
+ env->regwptr[0], env->regwptr[1],
+ env->regwptr[2], env->regwptr[3],
+ env->regwptr[4], env->regwptr[5]);
+ else { //if (bsd_type == target_openbsd)
+#if defined(TARGET_SPARC64)
+ syscall_nr &= ~(TARGET_OPENBSD_SYSCALL_G7RFLAG |
+ TARGET_OPENBSD_SYSCALL_G2RFLAG);
+#endif
+ ret = do_openbsd_syscall(env, syscall_nr,
+ env->regwptr[0], env->regwptr[1],
+ env->regwptr[2], env->regwptr[3],
+ env->regwptr[4], env->regwptr[5]);
+ }
+ if ((unsigned int)ret >= (unsigned int)(-515)) {
+ ret = -ret;
+#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
+ env->xcc |= PSR_CARRY;
+#else
+ env->psr |= PSR_CARRY;
+#endif
+ } else {
+#if defined(TARGET_SPARC64) && !defined(TARGET_ABI32)
+ env->xcc &= ~PSR_CARRY;
+#else
+ env->psr &= ~PSR_CARRY;
+#endif
+ }
+ env->regwptr[0] = ret;
+ /* next instruction */
+#if defined(TARGET_SPARC64)
+ if (bsd_type == target_openbsd &&
+ env->gregs[1] & TARGET_OPENBSD_SYSCALL_G2RFLAG) {
+ env->pc = env->gregs[2];
+ env->npc = env->pc + 4;
+ } else if (bsd_type == target_openbsd &&
+ env->gregs[1] & TARGET_OPENBSD_SYSCALL_G7RFLAG) {
+ env->pc = env->gregs[7];
+ env->npc = env->pc + 4;
+ } else {
+ env->pc = env->npc;
+ env->npc = env->npc + 4;
+ }
+#else
+ env->pc = env->npc;
+ env->npc = env->npc + 4;
+#endif
+ break;
+ case 0x83: /* flush windows */
+#ifdef TARGET_ABI32
+ case 0x103:
+#endif
+ flush_windows(env);
+ /* next instruction */
+ env->pc = env->npc;
+ env->npc = env->npc + 4;
+ break;
+#ifndef TARGET_SPARC64
+ case TT_WIN_OVF: /* window overflow */
+ save_window(env);
+ break;
+ case TT_WIN_UNF: /* window underflow */
+ restore_window(env);
+ break;
+ case TT_TFAULT:
+ case TT_DFAULT:
+#if 0
+ {
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ /* XXX: check env->error_code */
+ info.si_code = TARGET_SEGV_MAPERR;
+ info._sifields._sigfault._addr = env->mmuregs[4];
+ queue_signal(env, info.si_signo, &info);
+ }
+#endif
+ break;
+#else
+ case TT_SPILL: /* window overflow */
+ save_window(env);
+ break;
+ case TT_FILL: /* window underflow */
+ restore_window(env);
+ break;
+ case TT_TFAULT:
+ case TT_DFAULT:
+#if 0
+ {
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ /* XXX: check env->error_code */
+ info.si_code = TARGET_SEGV_MAPERR;
+ if (trapnr == TT_DFAULT)
+ info._sifields._sigfault._addr = env->dmmuregs[4];
+ else
+ info._sifields._sigfault._addr = env->tsptr->tpc;
+ //queue_signal(env, info.si_signo, &info);
+ }
+#endif
+ break;
+#endif
+ case EXCP_INTERRUPT:
+ /* just indicate that signals should be handled asap */
+ break;
+ case EXCP_DEBUG:
+ {
+ int sig;
+
+ sig = gdb_handlesig (env, TARGET_SIGTRAP);
+#if 0
+ if (sig)
+ {
+ info.si_signo = sig;
+ info.si_errno = 0;
+ info.si_code = TARGET_TRAP_BRKPT;
+ //queue_signal(env, info.si_signo, &info);
+ }
+#endif
+ }
+ break;
+ default:
+#ifdef TARGET_SPARC64
+ badtrap:
+#endif
+ printf ("Unhandled trap: 0x%x\n", trapnr);
+ cpu_dump_state(env, stderr, fprintf, 0);
+ exit (1);
+ }
+ process_pending_signals (env);
+ }
+}
+
+#endif
+
+static void usage(void)
+{
+ printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2008 Fabrice Bellard\n"
+ "usage: qemu-" TARGET_ARCH " [options] program [arguments...]\n"
+ "BSD CPU emulator (compiled for %s emulation)\n"
+ "\n"
+ "Standard options:\n"
+ "-h print this help\n"
+ "-g port wait gdb connection to port\n"
+ "-L path set the elf interpreter prefix (default=%s)\n"
+ "-s size set the stack size in bytes (default=%ld)\n"
+ "-cpu model select CPU (-cpu ? for list)\n"
+ "-drop-ld-preload drop LD_PRELOAD for target process\n"
+ "-E var=value sets/modifies targets environment variable(s)\n"
+ "-U var unsets targets environment variable(s)\n"
+#if defined(CONFIG_USE_GUEST_BASE)
+ "-B address set guest_base address to address\n"
+#endif
+ "-bsd type select emulated BSD type FreeBSD/NetBSD/OpenBSD (default)\n"
+ "\n"
+ "Debug options:\n"
+ "-d options activate log (default logfile=%s)\n"
+ "-D logfile override default logfile location\n"
+ "-p pagesize set the host page size to 'pagesize'\n"
+ "-singlestep always run in singlestep mode\n"
+ "-strace log system calls\n"
+ "\n"
+ "Environment variables:\n"
+ "QEMU_STRACE Print system calls and arguments similar to the\n"
+ " 'strace' program. Enable by setting to any value.\n"
+ "You can use -E and -U options to set/unset environment variables\n"
+ "for target process. It is possible to provide several variables\n"
+ "by repeating the option. For example:\n"
+ " -E var1=val2 -E var2=val2 -U LD_PRELOAD -U LD_DEBUG\n"
+ "Note that if you provide several changes to single variable\n"
+ "last change will stay in effect.\n"
+ ,
+ TARGET_ARCH,
+ interp_prefix,
+ x86_stack_size,
+ DEBUG_LOGFILE);
+ exit(1);
+}
+
+THREAD CPUState *thread_env;
+
+/* Assumes contents are already zeroed. */
+void init_task_state(TaskState *ts)
+{
+ int i;
+
+ ts->used = 1;
+ ts->first_free = ts->sigqueue_table;
+ for (i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++) {
+ ts->sigqueue_table[i].next = &ts->sigqueue_table[i + 1];
+ }
+ ts->sigqueue_table[i].next = NULL;
+}
+
+int main(int argc, char **argv)
+{
+ const char *filename;
+ const char *cpu_model;
+ const char *log_file = DEBUG_LOGFILE;
+ const char *log_mask = NULL;
+ struct target_pt_regs regs1, *regs = ®s1;
+ struct image_info info1, *info = &info1;
+ TaskState ts1, *ts = &ts1;
+ CPUState *env;
+ int optind;
+ const char *r;
+ int gdbstub_port = 0;
+ char **target_environ, **wrk;
+ envlist_t *envlist = NULL;
+ bsd_type = target_openbsd;
+
+ if (argc <= 1)
+ usage();
+
+ if ((envlist = envlist_create()) == NULL) {
+ (void) fprintf(stderr, "Unable to allocate envlist\n");
+ exit(1);
+ }
+
+ /* add current environment into the list */
+ for (wrk = environ; *wrk != NULL; wrk++) {
+ (void) envlist_setenv(envlist, *wrk);
+ }
+
+ cpu_model = NULL;
+#if defined(cpudef_setup)
+ cpudef_setup(); /* parse cpu definitions in target config file (TBD) */
+#endif
+
+ optind = 1;
+ for(;;) {
+ if (optind >= argc)
+ break;
+ r = argv[optind];
+ if (r[0] != '-')
+ break;
+ optind++;
+ r++;
+ if (!strcmp(r, "-")) {
+ break;
+ } else if (!strcmp(r, "d")) {
+ if (optind >= argc) {
+ break;
+ }
+ log_mask = argv[optind++];
+ } else if (!strcmp(r, "D")) {
+ if (optind >= argc) {
+ break;
+ }
+ log_file = argv[optind++];
+ } else if (!strcmp(r, "E")) {
+ r = argv[optind++];
+ if (envlist_setenv(envlist, r) != 0)
+ usage();
+ } else if (!strcmp(r, "ignore-environment")) {
+ envlist_free(envlist);
+ if ((envlist = envlist_create()) == NULL) {
+ (void) fprintf(stderr, "Unable to allocate envlist\n");
+ exit(1);
+ }
+ } else if (!strcmp(r, "U")) {
+ r = argv[optind++];
+ if (envlist_unsetenv(envlist, r) != 0)
+ usage();
+ } else if (!strcmp(r, "s")) {
+ r = argv[optind++];
+ x86_stack_size = strtol(r, (char **)&r, 0);
+ if (x86_stack_size <= 0)
+ usage();
+ if (*r == 'M')
+ x86_stack_size *= 1024 * 1024;
+ else if (*r == 'k' || *r == 'K')
+ x86_stack_size *= 1024;
+ } else if (!strcmp(r, "L")) {
+ interp_prefix = argv[optind++];
+ } else if (!strcmp(r, "p")) {
+ qemu_host_page_size = atoi(argv[optind++]);
+ if (qemu_host_page_size == 0 ||
+ (qemu_host_page_size & (qemu_host_page_size - 1)) != 0) {
+ fprintf(stderr, "page size must be a power of two\n");
+ exit(1);
+ }
+ } else if (!strcmp(r, "g")) {
+ gdbstub_port = atoi(argv[optind++]);
+ } else if (!strcmp(r, "r")) {
+ qemu_uname_release = argv[optind++];
+ } else if (!strcmp(r, "cpu")) {
+ cpu_model = argv[optind++];
+ if (strcmp(cpu_model, "?") == 0) {
+/* XXX: implement xxx_cpu_list for targets that still miss it */
+#if defined(cpu_list)
+ cpu_list(stdout, &fprintf);
+#endif
+ exit(1);
+ }
+#if defined(CONFIG_USE_GUEST_BASE)
+ } else if (!strcmp(r, "B")) {
+ guest_base = strtol(argv[optind++], NULL, 0);
+ have_guest_base = 1;
+#endif
+ } else if (!strcmp(r, "drop-ld-preload")) {
+ (void) envlist_unsetenv(envlist, "LD_PRELOAD");
+ } else if (!strcmp(r, "bsd")) {
+ if (!strcasecmp(argv[optind], "freebsd")) {
+ bsd_type = target_freebsd;
+ } else if (!strcasecmp(argv[optind], "netbsd")) {
+ bsd_type = target_netbsd;
+ } else if (!strcasecmp(argv[optind], "openbsd")) {
+ bsd_type = target_openbsd;
+ } else {
+ usage();
+ }
+ optind++;
+ } else if (!strcmp(r, "singlestep")) {
+ singlestep = 1;
+ } else if (!strcmp(r, "strace")) {
+ do_strace = 1;
+ } else
+ {
+ usage();
+ }
+ }
+
+ /* init debug */
+ cpu_set_log_filename(log_file);
+ if (log_mask) {
+ int mask;
+ const CPULogItem *item;
+
+ mask = cpu_str_to_log_mask(log_mask);
+ if (!mask) {
+ printf("Log items (comma separated):\n");
+ for (item = cpu_log_items; item->mask != 0; item++) {
+ printf("%-10s %s\n", item->name, item->help);
+ }
+ exit(1);
+ }
+ cpu_set_log(mask);
+ }
+
+ if (optind >= argc) {
+ usage();
+ }
+ filename = argv[optind];
+
+ /* Zero out regs */
+ memset(regs, 0, sizeof(struct target_pt_regs));
+
+ /* Zero out image_info */
+ memset(info, 0, sizeof(struct image_info));
+
+ /* Scan interp_prefix dir for replacement files. */
+ init_paths(interp_prefix);
+
+ if (cpu_model == NULL) {
+#if defined(TARGET_I386)
+#ifdef TARGET_X86_64
+ cpu_model = "qemu64";
+#else
+ cpu_model = "qemu32";
+#endif
+#elif defined(TARGET_SPARC)
+#ifdef TARGET_SPARC64
+ cpu_model = "TI UltraSparc II";
+#else
+ cpu_model = "Fujitsu MB86904";
+#endif
+#else
+ cpu_model = "any";
+#endif
+ }
+ cpu_exec_init_all(0);
+ /* NOTE: we need to init the CPU at this stage to get
+ qemu_host_page_size */
+ env = cpu_init(cpu_model);
+ if (!env) {
+ fprintf(stderr, "Unable to find CPU definition\n");
+ exit(1);
+ }
+#if defined(TARGET_I386) || defined(TARGET_SPARC) || defined(TARGET_PPC)
+ cpu_reset(env);
+#endif
+ thread_env = env;
+
+ if (getenv("QEMU_STRACE")) {
+ do_strace = 1;
+ }
+
+ target_environ = envlist_to_environ(envlist, NULL);
+ envlist_free(envlist);
+
+#if defined(CONFIG_USE_GUEST_BASE)
+ /*
+ * Now that page sizes are configured in cpu_init() we can do
+ * proper page alignment for guest_base.
+ */
+ guest_base = HOST_PAGE_ALIGN(guest_base);
+
+ /*
+ * Read in mmap_min_addr kernel parameter. This value is used
+ * When loading the ELF image to determine whether guest_base
+ * is needed.
+ *
+ * When user has explicitly set the quest base, we skip this
+ * test.
+ */
+ if (!have_guest_base) {
+ FILE *fp;
+
+ if ((fp = fopen("/proc/sys/vm/mmap_min_addr", "r")) != NULL) {
+ unsigned long tmp;
+ if (fscanf(fp, "%lu", &tmp) == 1) {
+ mmap_min_addr = tmp;
+ qemu_log("host mmap_min_addr=0x%lx\n", mmap_min_addr);
+ }
+ fclose(fp);
+ }
+ }
+#endif /* CONFIG_USE_GUEST_BASE */
+
+ if (loader_exec(filename, argv+optind, target_environ, regs, info) != 0) {
+ printf("Error loading %s\n", filename);
+ _exit(1);
+ }
+
+ for (wrk = target_environ; *wrk; wrk++) {
+ free(*wrk);
+ }
+
+ free(target_environ);
+
+ if (qemu_log_enabled()) {
+#if defined(CONFIG_USE_GUEST_BASE)
+ qemu_log("guest_base 0x%lx\n", guest_base);
+#endif
+ log_page_dump();
+
+ qemu_log("start_brk 0x" TARGET_ABI_FMT_lx "\n", info->start_brk);
+ qemu_log("end_code 0x" TARGET_ABI_FMT_lx "\n", info->end_code);
+ qemu_log("start_code 0x" TARGET_ABI_FMT_lx "\n",
+ info->start_code);
+ qemu_log("start_data 0x" TARGET_ABI_FMT_lx "\n",
+ info->start_data);
+ qemu_log("end_data 0x" TARGET_ABI_FMT_lx "\n", info->end_data);
+ qemu_log("start_stack 0x" TARGET_ABI_FMT_lx "\n",
+ info->start_stack);
+ qemu_log("brk 0x" TARGET_ABI_FMT_lx "\n", info->brk);
+ qemu_log("entry 0x" TARGET_ABI_FMT_lx "\n", info->entry);
+ }
+
+ target_set_brk(info->brk);
+ syscall_init();
+ signal_init();
+
+#if defined(CONFIG_USE_GUEST_BASE)
+ /* Now that we've loaded the binary, GUEST_BASE is fixed. Delay
+ generating the prologue until now so that the prologue can take
+ the real value of GUEST_BASE into account. */
+ tcg_prologue_init(&tcg_ctx);
+#endif
+
+ /* build Task State */
+ memset(ts, 0, sizeof(TaskState));
+ init_task_state(ts);
+ ts->info = info;
+ env->opaque = ts;
+
+#if defined(TARGET_I386)
+ cpu_x86_set_cpl(env, 3);
+
+ env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
+ env->hflags |= HF_PE_MASK;
+ if (env->cpuid_features & CPUID_SSE) {
+ env->cr[4] |= CR4_OSFXSR_MASK;
+ env->hflags |= HF_OSFXSR_MASK;
+ }
+#ifndef TARGET_ABI32
+ /* enable 64 bit mode if possible */
+ if (!(env->cpuid_ext2_features & CPUID_EXT2_LM)) {
+ fprintf(stderr, "The selected x86 CPU does not support 64 bit mode\n");
+ exit(1);
+ }
+ env->cr[4] |= CR4_PAE_MASK;
+ env->efer |= MSR_EFER_LMA | MSR_EFER_LME;
+ env->hflags |= HF_LMA_MASK;
+#endif
+
+ /* flags setup : we activate the IRQs by default as in user mode */
+ env->eflags |= IF_MASK;
+
+ /* linux register setup */
+#ifndef TARGET_ABI32
+ env->regs[R_EAX] = regs->rax;
+ env->regs[R_EBX] = regs->rbx;
+ env->regs[R_ECX] = regs->rcx;
+ env->regs[R_EDX] = regs->rdx;
+ env->regs[R_ESI] = regs->rsi;
+ env->regs[R_EDI] = regs->rdi;
+ env->regs[R_EBP] = regs->rbp;
+ env->regs[R_ESP] = regs->rsp;
+ env->eip = regs->rip;
+#else
+ env->regs[R_EAX] = regs->eax;
+ env->regs[R_EBX] = regs->ebx;
+ env->regs[R_ECX] = regs->ecx;
+ env->regs[R_EDX] = regs->edx;
+ env->regs[R_ESI] = regs->esi;
+ env->regs[R_EDI] = regs->edi;
+ env->regs[R_EBP] = regs->ebp;
+ env->regs[R_ESP] = regs->esp;
+ env->eip = regs->eip;
+#endif
+
+ /* linux interrupt setup */
+#ifndef TARGET_ABI32
+ env->idt.limit = 511;
+#else
+ env->idt.limit = 255;
+#endif
+ env->idt.base = target_mmap(0, sizeof(uint64_t) * (env->idt.limit + 1),
+ PROT_READ|PROT_WRITE,
+ MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
+ idt_table = g2h(env->idt.base);
+ set_idt(0, 0);
+ set_idt(1, 0);
+ set_idt(2, 0);
+ set_idt(3, 3);
+ set_idt(4, 3);
+ set_idt(5, 0);
+ set_idt(6, 0);
+ set_idt(7, 0);
+ set_idt(8, 0);
+ set_idt(9, 0);
+ set_idt(10, 0);
+ set_idt(11, 0);
+ set_idt(12, 0);
+ set_idt(13, 0);
+ set_idt(14, 0);
+ set_idt(15, 0);
+ set_idt(16, 0);
+ set_idt(17, 0);
+ set_idt(18, 0);
+ set_idt(19, 0);
+ set_idt(0x80, 3);
+
+ /* linux segment setup */
+ {
+ uint64_t *gdt_table;
+ env->gdt.base = target_mmap(0, sizeof(uint64_t) * TARGET_GDT_ENTRIES,
+ PROT_READ|PROT_WRITE,
+ MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
+ env->gdt.limit = sizeof(uint64_t) * TARGET_GDT_ENTRIES - 1;
+ gdt_table = g2h(env->gdt.base);
+#ifdef TARGET_ABI32
+ write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
+ DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+ (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
+#else
+ /* 64 bit code segment */
+ write_dt(&gdt_table[__USER_CS >> 3], 0, 0xfffff,
+ DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+ DESC_L_MASK |
+ (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
+#endif
+ write_dt(&gdt_table[__USER_DS >> 3], 0, 0xfffff,
+ DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+ (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
+ }
+
+ cpu_x86_load_seg(env, R_CS, __USER_CS);
+ cpu_x86_load_seg(env, R_SS, __USER_DS);
+#ifdef TARGET_ABI32
+ cpu_x86_load_seg(env, R_DS, __USER_DS);
+ cpu_x86_load_seg(env, R_ES, __USER_DS);
+ cpu_x86_load_seg(env, R_FS, __USER_DS);
+ cpu_x86_load_seg(env, R_GS, __USER_DS);
+ /* This hack makes Wine work... */
+ env->segs[R_FS].selector = 0;
+#else
+ cpu_x86_load_seg(env, R_DS, 0);
+ cpu_x86_load_seg(env, R_ES, 0);
+ cpu_x86_load_seg(env, R_FS, 0);
+ cpu_x86_load_seg(env, R_GS, 0);
+#endif
+#elif defined(TARGET_SPARC)
+ {
+ int i;
+ env->pc = regs->pc;
+ env->npc = regs->npc;
+ env->y = regs->y;
+ for(i = 0; i < 8; i++)
+ env->gregs[i] = regs->u_regs[i];
+ for(i = 0; i < 8; i++)
+ env->regwptr[i] = regs->u_regs[i + 8];
+ }
+#else
+#error unsupported target CPU
+#endif
+
+ if (gdbstub_port) {
+ gdbserver_start (gdbstub_port);
+ gdb_handlesig(env, 0);
+ }
+ cpu_loop(env);
+ /* never exits */
+ return 0;
+}
diff --git a/qemu-0.15.x/bsd-user/mmap.c b/qemu-0.15.x/bsd-user/mmap.c
new file mode 100644
index 0000000..207c774
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/mmap.c
@@ -0,0 +1,559 @@
+/*
+ * mmap support for qemu
+ *
+ * Copyright (c) 2003 - 2008 Fabrice Bellard
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/mman.h>
+
+#include "qemu.h"
+#include "qemu-common.h"
+#include "bsd-mman.h"
+
+//#define DEBUG_MMAP
+
+#if defined(CONFIG_USE_NPTL)
+pthread_mutex_t mmap_mutex;
+static int __thread mmap_lock_count;
+
+void mmap_lock(void)
+{
+ if (mmap_lock_count++ == 0) {
+ pthread_mutex_lock(&mmap_mutex);
+ }
+}
+
+void mmap_unlock(void)
+{
+ if (--mmap_lock_count == 0) {
+ pthread_mutex_unlock(&mmap_mutex);
+ }
+}
+
+/* Grab lock to make sure things are in a consistent state after fork(). */
+void mmap_fork_start(void)
+{
+ if (mmap_lock_count)
+ abort();
+ pthread_mutex_lock(&mmap_mutex);
+}
+
+void mmap_fork_end(int child)
+{
+ if (child)
+ pthread_mutex_init(&mmap_mutex, NULL);
+ else
+ pthread_mutex_unlock(&mmap_mutex);
+}
+#else
+/* We aren't threadsafe to start with, so no need to worry about locking. */
+void mmap_lock(void)
+{
+}
+
+void mmap_unlock(void)
+{
+}
+#endif
+
+void *qemu_vmalloc(size_t size)
+{
+ void *p;
+ mmap_lock();
+ /* Use map and mark the pages as used. */
+ p = mmap(NULL, size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANON, -1, 0);
+
+ if (h2g_valid(p)) {
+ /* Allocated region overlaps guest address space.
+ This may recurse. */
+ abi_ulong addr = h2g(p);
+ page_set_flags(addr & TARGET_PAGE_MASK, TARGET_PAGE_ALIGN(addr + size),
+ PAGE_RESERVED);
+ }
+
+ mmap_unlock();
+ return p;
+}
+
+void *qemu_malloc(size_t size)
+{
+ char * p;
+ size += 16;
+ p = qemu_vmalloc(size);
+ *(size_t *)p = size;
+ return p + 16;
+}
+
+/* We use map, which is always zero initialized. */
+void * qemu_mallocz(size_t size)
+{
+ return qemu_malloc(size);
+}
+
+void qemu_free(void *ptr)
+{
+ /* FIXME: We should unmark the reserved pages here. However this gets
+ complicated when one target page spans multiple host pages, so we
+ don't bother. */
+ size_t *p;
+ p = (size_t *)((char *)ptr - 16);
+ munmap(p, *p);
+}
+
+void *qemu_realloc(void *ptr, size_t size)
+{
+ size_t old_size, copy;
+ void *new_ptr;
+
+ if (!ptr)
+ return qemu_malloc(size);
+ old_size = *(size_t *)((char *)ptr - 16);
+ copy = old_size < size ? old_size : size;
+ new_ptr = qemu_malloc(size);
+ memcpy(new_ptr, ptr, copy);
+ qemu_free(ptr);
+ return new_ptr;
+}
+
+/* NOTE: all the constants are the HOST ones, but addresses are target. */
+int target_mprotect(abi_ulong start, abi_ulong len, int prot)
+{
+ abi_ulong end, host_start, host_end, addr;
+ int prot1, ret;
+
+#ifdef DEBUG_MMAP
+ printf("mprotect: start=0x" TARGET_FMT_lx
+ " len=0x" TARGET_FMT_lx " prot=%c%c%c\n", start, len,
+ prot & PROT_READ ? 'r' : '-',
+ prot & PROT_WRITE ? 'w' : '-',
+ prot & PROT_EXEC ? 'x' : '-');
+#endif
+
+ if ((start & ~TARGET_PAGE_MASK) != 0)
+ return -EINVAL;
+ len = TARGET_PAGE_ALIGN(len);
+ end = start + len;
+ if (end < start)
+ return -EINVAL;
+ prot &= PROT_READ | PROT_WRITE | PROT_EXEC;
+ if (len == 0)
+ return 0;
+
+ mmap_lock();
+ host_start = start & qemu_host_page_mask;
+ host_end = HOST_PAGE_ALIGN(end);
+ if (start > host_start) {
+ /* handle host page containing start */
+ prot1 = prot;
+ for(addr = host_start; addr < start; addr += TARGET_PAGE_SIZE) {
+ prot1 |= page_get_flags(addr);
+ }
+ if (host_end == host_start + qemu_host_page_size) {
+ for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {
+ prot1 |= page_get_flags(addr);
+ }
+ end = host_end;
+ }
+ ret = mprotect(g2h(host_start), qemu_host_page_size, prot1 & PAGE_BITS);
+ if (ret != 0)
+ goto error;
+ host_start += qemu_host_page_size;
+ }
+ if (end < host_end) {
+ prot1 = prot;
+ for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {
+ prot1 |= page_get_flags(addr);
+ }
+ ret = mprotect(g2h(host_end - qemu_host_page_size), qemu_host_page_size,
+ prot1 & PAGE_BITS);
+ if (ret != 0)
+ goto error;
+ host_end -= qemu_host_page_size;
+ }
+
+ /* handle the pages in the middle */
+ if (host_start < host_end) {
+ ret = mprotect(g2h(host_start), host_end - host_start, prot);
+ if (ret != 0)
+ goto error;
+ }
+ page_set_flags(start, start + len, prot | PAGE_VALID);
+ mmap_unlock();
+ return 0;
+error:
+ mmap_unlock();
+ return ret;
+}
+
+/* map an incomplete host page */
+static int mmap_frag(abi_ulong real_start,
+ abi_ulong start, abi_ulong end,
+ int prot, int flags, int fd, abi_ulong offset)
+{
+ abi_ulong real_end, addr;
+ void *host_start;
+ int prot1, prot_new;
+
+ real_end = real_start + qemu_host_page_size;
+ host_start = g2h(real_start);
+
+ /* get the protection of the target pages outside the mapping */
+ prot1 = 0;
+ for(addr = real_start; addr < real_end; addr++) {
+ if (addr < start || addr >= end)
+ prot1 |= page_get_flags(addr);
+ }
+
+ if (prot1 == 0) {
+ /* no page was there, so we allocate one */
+ void *p = mmap(host_start, qemu_host_page_size, prot,
+ flags | MAP_ANON, -1, 0);
+ if (p == MAP_FAILED)
+ return -1;
+ prot1 = prot;
+ }
+ prot1 &= PAGE_BITS;
+
+ prot_new = prot | prot1;
+ if (!(flags & MAP_ANON)) {
+ /* msync() won't work here, so we return an error if write is
+ possible while it is a shared mapping */
+ if ((flags & TARGET_BSD_MAP_FLAGMASK) == MAP_SHARED &&
+ (prot & PROT_WRITE))
+ return -1;
+
+ /* adjust protection to be able to read */
+ if (!(prot1 & PROT_WRITE))
+ mprotect(host_start, qemu_host_page_size, prot1 | PROT_WRITE);
+
+ /* read the corresponding file data */
+ pread(fd, g2h(start), end - start, offset);
+
+ /* put final protection */
+ if (prot_new != (prot1 | PROT_WRITE))
+ mprotect(host_start, qemu_host_page_size, prot_new);
+ } else {
+ /* just update the protection */
+ if (prot_new != prot1) {
+ mprotect(host_start, qemu_host_page_size, prot_new);
+ }
+ }
+ return 0;
+}
+
+#if defined(__CYGWIN__)
+/* Cygwin doesn't have a whole lot of address space. */
+static abi_ulong mmap_next_start = 0x18000000;
+#else
+static abi_ulong mmap_next_start = 0x40000000;
+#endif
+
+unsigned long last_brk;
+
+/* find a free memory area of size 'size'. The search starts at
+ 'start'. If 'start' == 0, then a default start address is used.
+ Return -1 if error.
+*/
+/* page_init() marks pages used by the host as reserved to be sure not
+ to use them. */
+static abi_ulong mmap_find_vma(abi_ulong start, abi_ulong size)
+{
+ abi_ulong addr, addr1, addr_start;
+ int prot;
+ unsigned long new_brk;
+
+ new_brk = (unsigned long)sbrk(0);
+ if (last_brk && last_brk < new_brk && last_brk == (target_ulong)last_brk) {
+ /* This is a hack to catch the host allocating memory with brk().
+ If it uses mmap then we loose.
+ FIXME: We really want to avoid the host allocating memory in
+ the first place, and maybe leave some slack to avoid switching
+ to mmap. */
+ page_set_flags(last_brk & TARGET_PAGE_MASK,
+ TARGET_PAGE_ALIGN(new_brk),
+ PAGE_RESERVED);
+ }
+ last_brk = new_brk;
+
+ size = HOST_PAGE_ALIGN(size);
+ start = start & qemu_host_page_mask;
+ addr = start;
+ if (addr == 0)
+ addr = mmap_next_start;
+ addr_start = addr;
+ for(;;) {
+ prot = 0;
+ for(addr1 = addr; addr1 < (addr + size); addr1 += TARGET_PAGE_SIZE) {
+ prot |= page_get_flags(addr1);
+ }
+ if (prot == 0)
+ break;
+ addr += qemu_host_page_size;
+ /* we found nothing */
+ if (addr == addr_start)
+ return (abi_ulong)-1;
+ }
+ if (start == 0)
+ mmap_next_start = addr + size;
+ return addr;
+}
+
+/* NOTE: all the constants are the HOST ones */
+abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
+ int flags, int fd, abi_ulong offset)
+{
+ abi_ulong ret, end, real_start, real_end, retaddr, host_offset, host_len;
+ unsigned long host_start;
+
+ mmap_lock();
+#ifdef DEBUG_MMAP
+ {
+ printf("mmap: start=0x" TARGET_FMT_lx
+ " len=0x" TARGET_FMT_lx " prot=%c%c%c flags=",
+ start, len,
+ prot & PROT_READ ? 'r' : '-',
+ prot & PROT_WRITE ? 'w' : '-',
+ prot & PROT_EXEC ? 'x' : '-');
+ if (flags & MAP_FIXED)
+ printf("MAP_FIXED ");
+ if (flags & MAP_ANON)
+ printf("MAP_ANON ");
+ switch(flags & TARGET_BSD_MAP_FLAGMASK) {
+ case MAP_PRIVATE:
+ printf("MAP_PRIVATE ");
+ break;
+ case MAP_SHARED:
+ printf("MAP_SHARED ");
+ break;
+ default:
+ printf("[MAP_FLAGMASK=0x%x] ", flags & TARGET_BSD_MAP_FLAGMASK);
+ break;
+ }
+ printf("fd=%d offset=" TARGET_FMT_lx "\n", fd, offset);
+ }
+#endif
+
+ if (offset & ~TARGET_PAGE_MASK) {
+ errno = EINVAL;
+ goto fail;
+ }
+
+ len = TARGET_PAGE_ALIGN(len);
+ if (len == 0)
+ goto the_end;
+ real_start = start & qemu_host_page_mask;
+
+ if (!(flags & MAP_FIXED)) {
+ abi_ulong mmap_start;
+ void *p;
+ host_offset = offset & qemu_host_page_mask;
+ host_len = len + offset - host_offset;
+ host_len = HOST_PAGE_ALIGN(host_len);
+ mmap_start = mmap_find_vma(real_start, host_len);
+ if (mmap_start == (abi_ulong)-1) {
+ errno = ENOMEM;
+ goto fail;
+ }
+ /* Note: we prefer to control the mapping address. It is
+ especially important if qemu_host_page_size >
+ qemu_real_host_page_size */
+ p = mmap(g2h(mmap_start),
+ host_len, prot, flags | MAP_FIXED, fd, host_offset);
+ if (p == MAP_FAILED)
+ goto fail;
+ /* update start so that it points to the file position at 'offset' */
+ host_start = (unsigned long)p;
+ if (!(flags & MAP_ANON))
+ host_start += offset - host_offset;
+ start = h2g(host_start);
+ } else {
+ int flg;
+ target_ulong addr;
+
+ if (start & ~TARGET_PAGE_MASK) {
+ errno = EINVAL;
+ goto fail;
+ }
+ end = start + len;
+ real_end = HOST_PAGE_ALIGN(end);
+
+ for(addr = real_start; addr < real_end; addr += TARGET_PAGE_SIZE) {
+ flg = page_get_flags(addr);
+ if (flg & PAGE_RESERVED) {
+ errno = ENXIO;
+ goto fail;
+ }
+ }
+
+ /* worst case: we cannot map the file because the offset is not
+ aligned, so we read it */
+ if (!(flags & MAP_ANON) &&
+ (offset & ~qemu_host_page_mask) != (start & ~qemu_host_page_mask)) {
+ /* msync() won't work here, so we return an error if write is
+ possible while it is a shared mapping */
+ if ((flags & TARGET_BSD_MAP_FLAGMASK) == MAP_SHARED &&
+ (prot & PROT_WRITE)) {
+ errno = EINVAL;
+ goto fail;
+ }
+ retaddr = target_mmap(start, len, prot | PROT_WRITE,
+ MAP_FIXED | MAP_PRIVATE | MAP_ANON,
+ -1, 0);
+ if (retaddr == -1)
+ goto fail;
+ pread(fd, g2h(start), len, offset);
+ if (!(prot & PROT_WRITE)) {
+ ret = target_mprotect(start, len, prot);
+ if (ret != 0) {
+ start = ret;
+ goto the_end;
+ }
+ }
+ goto the_end;
+ }
+
+ /* handle the start of the mapping */
+ if (start > real_start) {
+ if (real_end == real_start + qemu_host_page_size) {
+ /* one single host page */
+ ret = mmap_frag(real_start, start, end,
+ prot, flags, fd, offset);
+ if (ret == -1)
+ goto fail;
+ goto the_end1;
+ }
+ ret = mmap_frag(real_start, start, real_start + qemu_host_page_size,
+ prot, flags, fd, offset);
+ if (ret == -1)
+ goto fail;
+ real_start += qemu_host_page_size;
+ }
+ /* handle the end of the mapping */
+ if (end < real_end) {
+ ret = mmap_frag(real_end - qemu_host_page_size,
+ real_end - qemu_host_page_size, real_end,
+ prot, flags, fd,
+ offset + real_end - qemu_host_page_size - start);
+ if (ret == -1)
+ goto fail;
+ real_end -= qemu_host_page_size;
+ }
+
+ /* map the middle (easier) */
+ if (real_start < real_end) {
+ void *p;
+ unsigned long offset1;
+ if (flags & MAP_ANON)
+ offset1 = 0;
+ else
+ offset1 = offset + real_start - start;
+ p = mmap(g2h(real_start), real_end - real_start,
+ prot, flags, fd, offset1);
+ if (p == MAP_FAILED)
+ goto fail;
+ }
+ }
+ the_end1:
+ page_set_flags(start, start + len, prot | PAGE_VALID);
+ the_end:
+#ifdef DEBUG_MMAP
+ printf("ret=0x" TARGET_FMT_lx "\n", start);
+ page_dump(stdout);
+ printf("\n");
+#endif
+ mmap_unlock();
+ return start;
+fail:
+ mmap_unlock();
+ return -1;
+}
+
+int target_munmap(abi_ulong start, abi_ulong len)
+{
+ abi_ulong end, real_start, real_end, addr;
+ int prot, ret;
+
+#ifdef DEBUG_MMAP
+ printf("munmap: start=0x%lx len=0x%lx\n", start, len);
+#endif
+ if (start & ~TARGET_PAGE_MASK)
+ return -EINVAL;
+ len = TARGET_PAGE_ALIGN(len);
+ if (len == 0)
+ return -EINVAL;
+ mmap_lock();
+ end = start + len;
+ real_start = start & qemu_host_page_mask;
+ real_end = HOST_PAGE_ALIGN(end);
+
+ if (start > real_start) {
+ /* handle host page containing start */
+ prot = 0;
+ for(addr = real_start; addr < start; addr += TARGET_PAGE_SIZE) {
+ prot |= page_get_flags(addr);
+ }
+ if (real_end == real_start + qemu_host_page_size) {
+ for(addr = end; addr < real_end; addr += TARGET_PAGE_SIZE) {
+ prot |= page_get_flags(addr);
+ }
+ end = real_end;
+ }
+ if (prot != 0)
+ real_start += qemu_host_page_size;
+ }
+ if (end < real_end) {
+ prot = 0;
+ for(addr = end; addr < real_end; addr += TARGET_PAGE_SIZE) {
+ prot |= page_get_flags(addr);
+ }
+ if (prot != 0)
+ real_end -= qemu_host_page_size;
+ }
+
+ ret = 0;
+ /* unmap what we can */
+ if (real_start < real_end) {
+ ret = munmap(g2h(real_start), real_end - real_start);
+ }
+
+ if (ret == 0)
+ page_set_flags(start, start + len, 0);
+ mmap_unlock();
+ return ret;
+}
+
+int target_msync(abi_ulong start, abi_ulong len, int flags)
+{
+ abi_ulong end;
+
+ if (start & ~TARGET_PAGE_MASK)
+ return -EINVAL;
+ len = TARGET_PAGE_ALIGN(len);
+ end = start + len;
+ if (end < start)
+ return -EINVAL;
+ if (end == start)
+ return 0;
+
+ start &= qemu_host_page_mask;
+ return msync(g2h(start), end - start, flags);
+}
diff --git a/qemu-0.15.x/bsd-user/netbsd/strace.list b/qemu-0.15.x/bsd-user/netbsd/strace.list
new file mode 100644
index 0000000..5609d70
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/netbsd/strace.list
@@ -0,0 +1,145 @@
+{ TARGET_NETBSD_NR___getcwd, "__getcwd", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR___syscall, "__syscall", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR___sysctl, "__sysctl", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_accept, "accept", "%s(%d,%#x,%#x)", NULL, NULL },
+{ TARGET_NETBSD_NR_access, "access", "%s(\"%s\",%#o)", NULL, NULL },
+{ TARGET_NETBSD_NR_acct, "acct", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_adjtime, "adjtime", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_bind, "bind", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_break, "break", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_chdir, "chdir", "%s(\"%s\")", NULL, NULL },
+{ TARGET_NETBSD_NR_chflags, "chflags", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_chmod, "chmod", "%s(\"%s\",%#o)", NULL, NULL },
+{ TARGET_NETBSD_NR_chown, "chown", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_chroot, "chroot", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_clock_getres, "clock_getres", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_clock_gettime, "clock_gettime", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_clock_settime, "clock_settime", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_close, "close", "%s(%d)", NULL, NULL },
+{ TARGET_NETBSD_NR_connect, "connect", "%s(%d,%#x,%d)", NULL, NULL },
+{ TARGET_NETBSD_NR_dup, "dup", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_dup2, "dup2", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_execve, "execve", NULL, print_execve, NULL },
+{ TARGET_NETBSD_NR_exit, "exit", "%s(%d)\n", NULL, NULL },
+{ TARGET_NETBSD_NR_fchdir, "fchdir", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_fchflags, "fchflags", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_fchmod, "fchmod", "%s(%d,%#o)", NULL, NULL },
+{ TARGET_NETBSD_NR_fchown, "fchown", "%s(\"%s\",%d,%d)", NULL, NULL },
+{ TARGET_NETBSD_NR_fcntl, "fcntl", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_flock, "flock", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_fork, "fork", "%s()", NULL, NULL },
+{ TARGET_NETBSD_NR_fpathconf, "fpathconf", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_fsync, "fsync", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_ftruncate, "ftruncate", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_futimes, "futimes", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getegid, "getegid", "%s()", NULL, NULL },
+{ TARGET_NETBSD_NR_geteuid, "geteuid", "%s()", NULL, NULL },
+{ TARGET_NETBSD_NR_getgid, "getgid", "%s()", NULL, NULL },
+{ TARGET_NETBSD_NR_getgroups, "getgroups", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getitimer, "getitimer", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getpeername, "getpeername", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getpgid, "getpgid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getpgrp, "getpgrp", "%s()", NULL, NULL },
+{ TARGET_NETBSD_NR_getpid, "getpid", "%s()", NULL, NULL },
+{ TARGET_NETBSD_NR_getppid, "getppid", "%s()", NULL, NULL },
+{ TARGET_NETBSD_NR_getpriority, "getpriority", "%s(%#x,%#x)", NULL, NULL },
+{ TARGET_NETBSD_NR_getrlimit, "getrlimit", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getrusage, "getrusage", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getsid, "getsid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getsockname, "getsockname", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getsockopt, "getsockopt", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_gettimeofday, "gettimeofday", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_getuid, "getuid", "%s()", NULL, NULL },
+{ TARGET_NETBSD_NR_ioctl, "ioctl", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_issetugid, "issetugid", "%s()", NULL, NULL },
+{ TARGET_NETBSD_NR_kevent, "kevent", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_kill, "kill", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_kqueue, "kqueue", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_ktrace, "ktrace", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_lchown, "lchown", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_lfs_bmapv, "lfs_bmapv", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_lfs_markv, "lfs_markv", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_lfs_segclean, "lfs_segclean", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_lfs_segwait, "lfs_segwait", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_link, "link", "%s(\"%s\",\"%s\")", NULL, NULL },
+{ TARGET_NETBSD_NR_listen, "listen", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_lseek, "lseek", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_madvise, "madvise", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_mincore, "mincore", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_minherit, "minherit", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_mkdir, "mkdir", "%s(\"%s\",%#o)", NULL, NULL },
+{ TARGET_NETBSD_NR_mkfifo, "mkfifo", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_mknod, "mknod", "%s(\"%s\",%#o,%#x)", NULL, NULL },
+{ TARGET_NETBSD_NR_mlock, "mlock", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_mlockall, "mlockall", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_mmap, "mmap", NULL, NULL, print_syscall_ret_addr },
+{ TARGET_NETBSD_NR_mprotect, "mprotect", "%s(%#x,%#x,%d)", NULL, NULL },
+{ TARGET_NETBSD_NR_msgget, "msgget", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_msgrcv, "msgrcv", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_msgsnd, "msgsnd", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_munlock, "munlock", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_munlockall, "munlockall", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_munmap, "munmap", "%s(%p,%d)", NULL, NULL },
+{ TARGET_NETBSD_NR_nanosleep, "nanosleep", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_nfssvc, "nfssvc", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_open, "open", "%s(\"%s\",%#x,%#o)", NULL, NULL },
+{ TARGET_NETBSD_NR_pathconf, "pathconf", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_pipe, "pipe", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_poll, "poll", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_pread, "pread", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_preadv, "preadv", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_profil, "profil", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_ptrace, "ptrace", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_pwrite, "pwrite", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_pwritev, "pwritev", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_quotactl, "quotactl", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_read, "read", "%s(%d,%#x,%d)", NULL, NULL },
+{ TARGET_NETBSD_NR_readlink, "readlink", "%s(\"%s\",%p,%d)", NULL, NULL },
+{ TARGET_NETBSD_NR_readv, "readv", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_reboot, "reboot", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_recvfrom, "recvfrom", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_recvmsg, "recvmsg", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_rename, "rename", "%s(\"%s\",\"%s\")", NULL, NULL },
+{ TARGET_NETBSD_NR_revoke, "revoke", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_rmdir, "rmdir", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_sbrk, "sbrk", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_sched_yield, "sched_yield", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_select, "select", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_semget, "semget", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_semop, "semop", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_sendmsg, "sendmsg", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_sendto, "sendto", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setegid, "setegid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_seteuid, "seteuid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setgid, "setgid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setgroups, "setgroups", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setitimer, "setitimer", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setpgid, "setpgid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setpriority, "setpriority", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setregid, "setregid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setreuid, "setreuid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setrlimit, "setrlimit", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setsid, "setsid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setsockopt, "setsockopt", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_settimeofday, "settimeofday", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_setuid, "setuid", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_shmat, "shmat", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_shmdt, "shmdt", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_shmget, "shmget", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_shutdown, "shutdown", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_socketpair, "socketpair", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_sstk, "sstk", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_swapctl, "swapctl", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_symlink, "symlink", "%s(\"%s\",\"%s\")", NULL, NULL },
+{ TARGET_NETBSD_NR_sync, "sync", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_sysarch, "sysarch", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_syscall, "syscall", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_truncate, "truncate", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_umask, "umask", "%s(%#o)", NULL, NULL },
+{ TARGET_NETBSD_NR_unlink, "unlink", "%s(\"%s\")", NULL, NULL },
+{ TARGET_NETBSD_NR_unmount, "unmount", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_utimes, "utimes", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_vfork, "vfork", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_wait4, "wait4", NULL, NULL, NULL },
+{ TARGET_NETBSD_NR_write, "write", "%s(%d,%#x,%d)", NULL, NULL },
+{ TARGET_NETBSD_NR_writev, "writev", "%s(%d,%p,%#x)", NULL, NULL },
diff --git a/qemu-0.15.x/bsd-user/netbsd/syscall_nr.h b/qemu-0.15.x/bsd-user/netbsd/syscall_nr.h
new file mode 100644
index 0000000..2e9ab53
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/netbsd/syscall_nr.h
@@ -0,0 +1,373 @@
+/* $NetBSD: syscall.h,v 1.215 2008/06/17 16:07:57 tsutsui Exp $ */
+
+/*
+ * System call numbers.
+ *
+ * created from NetBSD: syscalls.master,v 1.204 2008/06/17 16:05:23 tsutsui Exp
+ */
+
+#define TARGET_NETBSD_NR_syscall 0
+#define TARGET_NETBSD_NR_exit 1
+#define TARGET_NETBSD_NR_fork 2
+#define TARGET_NETBSD_NR_read 3
+#define TARGET_NETBSD_NR_write 4
+#define TARGET_NETBSD_NR_open 5
+#define TARGET_NETBSD_NR_close 6
+#define TARGET_NETBSD_NR_wait4 7
+#define TARGET_NETBSD_NR_compat_43_ocreat 8
+#define TARGET_NETBSD_NR_link 9
+#define TARGET_NETBSD_NR_unlink 10
+#define TARGET_NETBSD_NR_chdir 12
+#define TARGET_NETBSD_NR_fchdir 13
+#define TARGET_NETBSD_NR_mknod 14
+#define TARGET_NETBSD_NR_chmod 15
+#define TARGET_NETBSD_NR_chown 16
+#define TARGET_NETBSD_NR_break 17
+#define TARGET_NETBSD_NR_compat_20_getfsstat 18
+#define TARGET_NETBSD_NR_compat_43_olseek 19
+#define TARGET_NETBSD_NR_getpid 20
+#define TARGET_NETBSD_NR_getpid 20
+#define TARGET_NETBSD_NR_compat_40_mount 21
+#define TARGET_NETBSD_NR_unmount 22
+#define TARGET_NETBSD_NR_setuid 23
+#define TARGET_NETBSD_NR_getuid 24
+#define TARGET_NETBSD_NR_getuid 24
+#define TARGET_NETBSD_NR_geteuid 25
+#define TARGET_NETBSD_NR_ptrace 26
+#define TARGET_NETBSD_NR_recvmsg 27
+#define TARGET_NETBSD_NR_sendmsg 28
+#define TARGET_NETBSD_NR_recvfrom 29
+#define TARGET_NETBSD_NR_accept 30
+#define TARGET_NETBSD_NR_getpeername 31
+#define TARGET_NETBSD_NR_getsockname 32
+#define TARGET_NETBSD_NR_access 33
+#define TARGET_NETBSD_NR_chflags 34
+#define TARGET_NETBSD_NR_fchflags 35
+#define TARGET_NETBSD_NR_sync 36
+#define TARGET_NETBSD_NR_kill 37
+#define TARGET_NETBSD_NR_compat_43_stat43 38
+#define TARGET_NETBSD_NR_getppid 39
+#define TARGET_NETBSD_NR_compat_43_lstat43 40
+#define TARGET_NETBSD_NR_dup 41
+#define TARGET_NETBSD_NR_pipe 42
+#define TARGET_NETBSD_NR_getegid 43
+#define TARGET_NETBSD_NR_profil 44
+#define TARGET_NETBSD_NR_ktrace 45
+#define TARGET_NETBSD_NR_compat_13_sigaction13 46
+#define TARGET_NETBSD_NR_getgid 47
+#define TARGET_NETBSD_NR_getgid 47
+#define TARGET_NETBSD_NR_compat_13_sigprocmask13 48
+#define TARGET_NETBSD_NR___getlogin 49
+#define TARGET_NETBSD_NR___setlogin 50
+#define TARGET_NETBSD_NR_acct 51
+#define TARGET_NETBSD_NR_compat_13_sigpending13 52
+#define TARGET_NETBSD_NR_compat_13_sigaltstack13 53
+#define TARGET_NETBSD_NR_ioctl 54
+#define TARGET_NETBSD_NR_compat_12_oreboot 55
+#define TARGET_NETBSD_NR_revoke 56
+#define TARGET_NETBSD_NR_symlink 57
+#define TARGET_NETBSD_NR_readlink 58
+#define TARGET_NETBSD_NR_execve 59
+#define TARGET_NETBSD_NR_umask 60
+#define TARGET_NETBSD_NR_chroot 61
+#define TARGET_NETBSD_NR_compat_43_fstat43 62
+#define TARGET_NETBSD_NR_compat_43_ogetkerninfo 63
+#define TARGET_NETBSD_NR_compat_43_ogetpagesize 64
+#define TARGET_NETBSD_NR_compat_12_msync 65
+#define TARGET_NETBSD_NR_vfork 66
+#define TARGET_NETBSD_NR_sbrk 69
+#define TARGET_NETBSD_NR_sstk 70
+#define TARGET_NETBSD_NR_compat_43_ommap 71
+#define TARGET_NETBSD_NR_vadvise 72
+#define TARGET_NETBSD_NR_munmap 73
+#define TARGET_NETBSD_NR_mprotect 74
+#define TARGET_NETBSD_NR_madvise 75
+#define TARGET_NETBSD_NR_mincore 78
+#define TARGET_NETBSD_NR_getgroups 79
+#define TARGET_NETBSD_NR_setgroups 80
+#define TARGET_NETBSD_NR_getpgrp 81
+#define TARGET_NETBSD_NR_setpgid 82
+#define TARGET_NETBSD_NR_setitimer 83
+#define TARGET_NETBSD_NR_compat_43_owait 84
+#define TARGET_NETBSD_NR_compat_12_oswapon 85
+#define TARGET_NETBSD_NR_getitimer 86
+#define TARGET_NETBSD_NR_compat_43_ogethostname 87
+#define TARGET_NETBSD_NR_compat_43_osethostname 88
+#define TARGET_NETBSD_NR_compat_43_ogetdtablesize 89
+#define TARGET_NETBSD_NR_dup2 90
+#define TARGET_NETBSD_NR_fcntl 92
+#define TARGET_NETBSD_NR_select 93
+#define TARGET_NETBSD_NR_fsync 95
+#define TARGET_NETBSD_NR_setpriority 96
+#define TARGET_NETBSD_NR_compat_30_socket 97
+#define TARGET_NETBSD_NR_connect 98
+#define TARGET_NETBSD_NR_compat_43_oaccept 99
+#define TARGET_NETBSD_NR_getpriority 100
+#define TARGET_NETBSD_NR_compat_43_osend 101
+#define TARGET_NETBSD_NR_compat_43_orecv 102
+#define TARGET_NETBSD_NR_compat_13_sigreturn13 103
+#define TARGET_NETBSD_NR_bind 104
+#define TARGET_NETBSD_NR_setsockopt 105
+#define TARGET_NETBSD_NR_listen 106
+#define TARGET_NETBSD_NR_compat_43_osigvec 108
+#define TARGET_NETBSD_NR_compat_43_osigblock 109
+#define TARGET_NETBSD_NR_compat_43_osigsetmask 110
+#define TARGET_NETBSD_NR_compat_13_sigsuspend13 111
+#define TARGET_NETBSD_NR_compat_43_osigstack 112
+#define TARGET_NETBSD_NR_compat_43_orecvmsg 113
+#define TARGET_NETBSD_NR_compat_43_osendmsg 114
+#define TARGET_NETBSD_NR_gettimeofday 116
+#define TARGET_NETBSD_NR_getrusage 117
+#define TARGET_NETBSD_NR_getsockopt 118
+#define TARGET_NETBSD_NR_readv 120
+#define TARGET_NETBSD_NR_writev 121
+#define TARGET_NETBSD_NR_settimeofday 122
+#define TARGET_NETBSD_NR_fchown 123
+#define TARGET_NETBSD_NR_fchmod 124
+#define TARGET_NETBSD_NR_compat_43_orecvfrom 125
+#define TARGET_NETBSD_NR_setreuid 126
+#define TARGET_NETBSD_NR_setregid 127
+#define TARGET_NETBSD_NR_rename 128
+#define TARGET_NETBSD_NR_compat_43_otruncate 129
+#define TARGET_NETBSD_NR_compat_43_oftruncate 130
+#define TARGET_NETBSD_NR_flock 131
+#define TARGET_NETBSD_NR_mkfifo 132
+#define TARGET_NETBSD_NR_sendto 133
+#define TARGET_NETBSD_NR_shutdown 134
+#define TARGET_NETBSD_NR_socketpair 135
+#define TARGET_NETBSD_NR_mkdir 136
+#define TARGET_NETBSD_NR_rmdir 137
+#define TARGET_NETBSD_NR_utimes 138
+#define TARGET_NETBSD_NR_adjtime 140
+#define TARGET_NETBSD_NR_compat_43_ogetpeername 141
+#define TARGET_NETBSD_NR_compat_43_ogethostid 142
+#define TARGET_NETBSD_NR_compat_43_osethostid 143
+#define TARGET_NETBSD_NR_compat_43_ogetrlimit 144
+#define TARGET_NETBSD_NR_compat_43_osetrlimit 145
+#define TARGET_NETBSD_NR_compat_43_okillpg 146
+#define TARGET_NETBSD_NR_setsid 147
+#define TARGET_NETBSD_NR_quotactl 148
+#define TARGET_NETBSD_NR_compat_43_oquota 149
+#define TARGET_NETBSD_NR_compat_43_ogetsockname 150
+#define TARGET_NETBSD_NR_nfssvc 155
+#define TARGET_NETBSD_NR_compat_43_ogetdirentries 156
+#define TARGET_NETBSD_NR_compat_20_statfs 157
+#define TARGET_NETBSD_NR_compat_20_fstatfs 158
+#define TARGET_NETBSD_NR_compat_30_getfh 161
+#define TARGET_NETBSD_NR_compat_09_ogetdomainname 162
+#define TARGET_NETBSD_NR_compat_09_osetdomainname 163
+#define TARGET_NETBSD_NR_compat_09_ouname 164
+#define TARGET_NETBSD_NR_sysarch 165
+#define TARGET_NETBSD_NR_compat_10_osemsys 169
+#define TARGET_NETBSD_NR_compat_10_omsgsys 170
+#define TARGET_NETBSD_NR_compat_10_oshmsys 171
+#define TARGET_NETBSD_NR_pread 173
+#define TARGET_NETBSD_NR_pwrite 174
+#define TARGET_NETBSD_NR_compat_30_ntp_gettime 175
+#define TARGET_NETBSD_NR_ntp_adjtime 176
+#define TARGET_NETBSD_NR_setgid 181
+#define TARGET_NETBSD_NR_setegid 182
+#define TARGET_NETBSD_NR_seteuid 183
+#define TARGET_NETBSD_NR_lfs_bmapv 184
+#define TARGET_NETBSD_NR_lfs_markv 185
+#define TARGET_NETBSD_NR_lfs_segclean 186
+#define TARGET_NETBSD_NR_lfs_segwait 187
+#define TARGET_NETBSD_NR_compat_12_stat12 188
+#define TARGET_NETBSD_NR_compat_12_fstat12 189
+#define TARGET_NETBSD_NR_compat_12_lstat12 190
+#define TARGET_NETBSD_NR_pathconf 191
+#define TARGET_NETBSD_NR_fpathconf 192
+#define TARGET_NETBSD_NR_getrlimit 194
+#define TARGET_NETBSD_NR_setrlimit 195
+#define TARGET_NETBSD_NR_compat_12_getdirentries 196
+#define TARGET_NETBSD_NR_mmap 197
+#define TARGET_NETBSD_NR___syscall 198
+#define TARGET_NETBSD_NR_lseek 199
+#define TARGET_NETBSD_NR_truncate 200
+#define TARGET_NETBSD_NR_ftruncate 201
+#define TARGET_NETBSD_NR___sysctl 202
+#define TARGET_NETBSD_NR_mlock 203
+#define TARGET_NETBSD_NR_munlock 204
+#define TARGET_NETBSD_NR_undelete 205
+#define TARGET_NETBSD_NR_futimes 206
+#define TARGET_NETBSD_NR_getpgid 207
+#define TARGET_NETBSD_NR_reboot 208
+#define TARGET_NETBSD_NR_poll 209
+#define TARGET_NETBSD_NR_compat_14___semctl 220
+#define TARGET_NETBSD_NR_semget 221
+#define TARGET_NETBSD_NR_semop 222
+#define TARGET_NETBSD_NR_semconfig 223
+#define TARGET_NETBSD_NR_compat_14_msgctl 224
+#define TARGET_NETBSD_NR_msgget 225
+#define TARGET_NETBSD_NR_msgsnd 226
+#define TARGET_NETBSD_NR_msgrcv 227
+#define TARGET_NETBSD_NR_shmat 228
+#define TARGET_NETBSD_NR_compat_14_shmctl 229
+#define TARGET_NETBSD_NR_shmdt 230
+#define TARGET_NETBSD_NR_shmget 231
+#define TARGET_NETBSD_NR_clock_gettime 232
+#define TARGET_NETBSD_NR_clock_settime 233
+#define TARGET_NETBSD_NR_clock_getres 234
+#define TARGET_NETBSD_NR_timer_create 235
+#define TARGET_NETBSD_NR_timer_delete 236
+#define TARGET_NETBSD_NR_timer_settime 237
+#define TARGET_NETBSD_NR_timer_gettime 238
+#define TARGET_NETBSD_NR_timer_getoverrun 239
+#define TARGET_NETBSD_NR_nanosleep 240
+#define TARGET_NETBSD_NR_fdatasync 241
+#define TARGET_NETBSD_NR_mlockall 242
+#define TARGET_NETBSD_NR_munlockall 243
+#define TARGET_NETBSD_NR___sigtimedwait 244
+#define TARGET_NETBSD_NR_modctl 246
+#define TARGET_NETBSD_NR__ksem_init 247
+#define TARGET_NETBSD_NR__ksem_open 248
+#define TARGET_NETBSD_NR__ksem_unlink 249
+#define TARGET_NETBSD_NR__ksem_close 250
+#define TARGET_NETBSD_NR__ksem_post 251
+#define TARGET_NETBSD_NR__ksem_wait 252
+#define TARGET_NETBSD_NR__ksem_trywait 253
+#define TARGET_NETBSD_NR__ksem_getvalue 254
+#define TARGET_NETBSD_NR__ksem_destroy 255
+#define TARGET_NETBSD_NR_mq_open 257
+#define TARGET_NETBSD_NR_mq_close 258
+#define TARGET_NETBSD_NR_mq_unlink 259
+#define TARGET_NETBSD_NR_mq_getattr 260
+#define TARGET_NETBSD_NR_mq_setattr 261
+#define TARGET_NETBSD_NR_mq_notify 262
+#define TARGET_NETBSD_NR_mq_send 263
+#define TARGET_NETBSD_NR_mq_receive 264
+#define TARGET_NETBSD_NR_mq_timedsend 265
+#define TARGET_NETBSD_NR_mq_timedreceive 266
+#define TARGET_NETBSD_NR___posix_rename 270
+#define TARGET_NETBSD_NR_swapctl 271
+#define TARGET_NETBSD_NR_compat_30_getdents 272
+#define TARGET_NETBSD_NR_minherit 273
+#define TARGET_NETBSD_NR_lchmod 274
+#define TARGET_NETBSD_NR_lchown 275
+#define TARGET_NETBSD_NR_lutimes 276
+#define TARGET_NETBSD_NR___msync13 277
+#define TARGET_NETBSD_NR_compat_30___stat13 278
+#define TARGET_NETBSD_NR_compat_30___fstat13 279
+#define TARGET_NETBSD_NR_compat_30___lstat13 280
+#define TARGET_NETBSD_NR___sigaltstack14 281
+#define TARGET_NETBSD_NR___vfork14 282
+#define TARGET_NETBSD_NR___posix_chown 283
+#define TARGET_NETBSD_NR___posix_fchown 284
+#define TARGET_NETBSD_NR___posix_lchown 285
+#define TARGET_NETBSD_NR_getsid 286
+#define TARGET_NETBSD_NR___clone 287
+#define TARGET_NETBSD_NR_fktrace 288
+#define TARGET_NETBSD_NR_preadv 289
+#define TARGET_NETBSD_NR_pwritev 290
+#define TARGET_NETBSD_NR_compat_16___sigaction14 291
+#define TARGET_NETBSD_NR___sigpending14 292
+#define TARGET_NETBSD_NR___sigprocmask14 293
+#define TARGET_NETBSD_NR___sigsuspend14 294
+#define TARGET_NETBSD_NR_compat_16___sigreturn14 295
+#define TARGET_NETBSD_NR___getcwd 296
+#define TARGET_NETBSD_NR_fchroot 297
+#define TARGET_NETBSD_NR_compat_30_fhopen 298
+#define TARGET_NETBSD_NR_compat_30_fhstat 299
+#define TARGET_NETBSD_NR_compat_20_fhstatfs 300
+#define TARGET_NETBSD_NR_____semctl13 301
+#define TARGET_NETBSD_NR___msgctl13 302
+#define TARGET_NETBSD_NR___shmctl13 303
+#define TARGET_NETBSD_NR_lchflags 304
+#define TARGET_NETBSD_NR_issetugid 305
+#define TARGET_NETBSD_NR_utrace 306
+#define TARGET_NETBSD_NR_getcontext 307
+#define TARGET_NETBSD_NR_setcontext 308
+#define TARGET_NETBSD_NR__lwp_create 309
+#define TARGET_NETBSD_NR__lwp_exit 310
+#define TARGET_NETBSD_NR__lwp_self 311
+#define TARGET_NETBSD_NR__lwp_wait 312
+#define TARGET_NETBSD_NR__lwp_suspend 313
+#define TARGET_NETBSD_NR__lwp_continue 314
+#define TARGET_NETBSD_NR__lwp_wakeup 315
+#define TARGET_NETBSD_NR__lwp_getprivate 316
+#define TARGET_NETBSD_NR__lwp_setprivate 317
+#define TARGET_NETBSD_NR__lwp_kill 318
+#define TARGET_NETBSD_NR__lwp_detach 319
+#define TARGET_NETBSD_NR__lwp_park 320
+#define TARGET_NETBSD_NR__lwp_unpark 321
+#define TARGET_NETBSD_NR__lwp_unpark_all 322
+#define TARGET_NETBSD_NR__lwp_setname 323
+#define TARGET_NETBSD_NR__lwp_getname 324
+#define TARGET_NETBSD_NR__lwp_ctl 325
+#define TARGET_NETBSD_NR_sa_register 330
+#define TARGET_NETBSD_NR_sa_stacks 331
+#define TARGET_NETBSD_NR_sa_enable 332
+#define TARGET_NETBSD_NR_sa_setconcurrency 333
+#define TARGET_NETBSD_NR_sa_yield 334
+#define TARGET_NETBSD_NR_sa_preempt 335
+#define TARGET_NETBSD_NR_sa_unblockyield 336
+#define TARGET_NETBSD_NR___sigaction_sigtramp 340
+#define TARGET_NETBSD_NR_pmc_get_info 341
+#define TARGET_NETBSD_NR_pmc_control 342
+#define TARGET_NETBSD_NR_rasctl 343
+#define TARGET_NETBSD_NR_kqueue 344
+#define TARGET_NETBSD_NR_kevent 345
+#define TARGET_NETBSD_NR__sched_setparam 346
+#define TARGET_NETBSD_NR__sched_getparam 347
+#define TARGET_NETBSD_NR__sched_setaffinity 348
+#define TARGET_NETBSD_NR__sched_getaffinity 349
+#define TARGET_NETBSD_NR_sched_yield 350
+#define TARGET_NETBSD_NR_fsync_range 354
+#define TARGET_NETBSD_NR_uuidgen 355
+#define TARGET_NETBSD_NR_getvfsstat 356
+#define TARGET_NETBSD_NR_statvfs1 357
+#define TARGET_NETBSD_NR_fstatvfs1 358
+#define TARGET_NETBSD_NR_compat_30_fhstatvfs1 359
+#define TARGET_NETBSD_NR_extattrctl 360
+#define TARGET_NETBSD_NR_extattr_set_file 361
+#define TARGET_NETBSD_NR_extattr_get_file 362
+#define TARGET_NETBSD_NR_extattr_delete_file 363
+#define TARGET_NETBSD_NR_extattr_set_fd 364
+#define TARGET_NETBSD_NR_extattr_get_fd 365
+#define TARGET_NETBSD_NR_extattr_delete_fd 366
+#define TARGET_NETBSD_NR_extattr_set_link 367
+#define TARGET_NETBSD_NR_extattr_get_link 368
+#define TARGET_NETBSD_NR_extattr_delete_link 369
+#define TARGET_NETBSD_NR_extattr_list_fd 370
+#define TARGET_NETBSD_NR_extattr_list_file 371
+#define TARGET_NETBSD_NR_extattr_list_link 372
+#define TARGET_NETBSD_NR_pselect 373
+#define TARGET_NETBSD_NR_pollts 374
+#define TARGET_NETBSD_NR_setxattr 375
+#define TARGET_NETBSD_NR_lsetxattr 376
+#define TARGET_NETBSD_NR_fsetxattr 377
+#define TARGET_NETBSD_NR_getxattr 378
+#define TARGET_NETBSD_NR_lgetxattr 379
+#define TARGET_NETBSD_NR_fgetxattr 380
+#define TARGET_NETBSD_NR_listxattr 381
+#define TARGET_NETBSD_NR_llistxattr 382
+#define TARGET_NETBSD_NR_flistxattr 383
+#define TARGET_NETBSD_NR_removexattr 384
+#define TARGET_NETBSD_NR_lremovexattr 385
+#define TARGET_NETBSD_NR_fremovexattr 386
+#define TARGET_NETBSD_NR___stat30 387
+#define TARGET_NETBSD_NR___fstat30 388
+#define TARGET_NETBSD_NR___lstat30 389
+#define TARGET_NETBSD_NR___getdents30 390
+#define TARGET_NETBSD_NR_compat_30___fhstat30 392
+#define TARGET_NETBSD_NR___ntp_gettime30 393
+#define TARGET_NETBSD_NR___socket30 394
+#define TARGET_NETBSD_NR___getfh30 395
+#define TARGET_NETBSD_NR___fhopen40 396
+#define TARGET_NETBSD_NR___fhstatvfs140 397
+#define TARGET_NETBSD_NR___fhstat40 398
+#define TARGET_NETBSD_NR_aio_cancel 399
+#define TARGET_NETBSD_NR_aio_error 400
+#define TARGET_NETBSD_NR_aio_fsync 401
+#define TARGET_NETBSD_NR_aio_read 402
+#define TARGET_NETBSD_NR_aio_return 403
+#define TARGET_NETBSD_NR_aio_suspend 404
+#define TARGET_NETBSD_NR_aio_write 405
+#define TARGET_NETBSD_NR_lio_listio 406
+#define TARGET_NETBSD_NR___mount50 410
+#define TARGET_NETBSD_NR_mremap 411
+#define TARGET_NETBSD_NR_pset_create 412
+#define TARGET_NETBSD_NR_pset_destroy 413
+#define TARGET_NETBSD_NR_pset_assign 414
+#define TARGET_NETBSD_NR__pset_bind 415
+#define TARGET_NETBSD_NR___posix_fadvise50 416
diff --git a/qemu-0.15.x/bsd-user/openbsd/strace.list b/qemu-0.15.x/bsd-user/openbsd/strace.list
new file mode 100644
index 0000000..1f0a331
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/openbsd/strace.list
@@ -0,0 +1,187 @@
+{ TARGET_OPENBSD_NR___getcwd, "__getcwd", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR___semctl, "__semctl", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR___syscall, "__syscall", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR___sysctl, "__sysctl", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_accept, "accept", "%s(%d,%#x,%#x)", NULL, NULL },
+{ TARGET_OPENBSD_NR_access, "access", "%s(\"%s\",%#o)", NULL, NULL },
+{ TARGET_OPENBSD_NR_acct, "acct", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_adjfreq, "adjfreq", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_adjtime, "adjtime", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_bind, "bind", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_break, "break", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_chdir, "chdir", "%s(\"%s\")", NULL, NULL },
+{ TARGET_OPENBSD_NR_chflags, "chflags", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_chmod, "chmod", "%s(\"%s\",%#o)", NULL, NULL },
+{ TARGET_OPENBSD_NR_chown, "chown", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_chroot, "chroot", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_clock_getres, "clock_getres", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_clock_gettime, "clock_gettime", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_clock_settime, "clock_settime", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_close, "close", "%s(%d)", NULL, NULL },
+{ TARGET_OPENBSD_NR_closefrom, "closefrom", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_connect, "connect", "%s(%d,%#x,%d)", NULL, NULL },
+{ TARGET_OPENBSD_NR_dup, "dup", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_dup2, "dup2", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_execve, "execve", NULL, print_execve, NULL },
+{ TARGET_OPENBSD_NR_exit, "exit", "%s(%d)\n", NULL, NULL },
+{ TARGET_OPENBSD_NR_fchdir, "fchdir", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_fchflags, "fchflags", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_fchmod, "fchmod", "%s(%d,%#o)", NULL, NULL },
+{ TARGET_OPENBSD_NR_fchown, "fchown", "%s(\"%s\",%d,%d)", NULL, NULL },
+{ TARGET_OPENBSD_NR_fcntl, "fcntl", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_fhopen, "fhopen", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_fhstat, "fhstat", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_fhstatfs, "fhstatfs", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_flock, "flock", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_fork, "fork", "%s()", NULL, NULL },
+{ TARGET_OPENBSD_NR_fpathconf, "fpathconf", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_fstat, "fstat", "%s(%d,%p)", NULL, NULL },
+{ TARGET_OPENBSD_NR_fstatfs, "fstatfs", "%s(%d,%p)", NULL, NULL },
+{ TARGET_OPENBSD_NR_fsync, "fsync", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_ftruncate, "ftruncate", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_futimes, "futimes", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getdirentries, "getdirentries", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getegid, "getegid", "%s()", NULL, NULL },
+{ TARGET_OPENBSD_NR_geteuid, "geteuid", "%s()", NULL, NULL },
+{ TARGET_OPENBSD_NR_getfh, "getfh", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getfsstat, "getfsstat", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getgid, "getgid", "%s()", NULL, NULL },
+{ TARGET_OPENBSD_NR_getgroups, "getgroups", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getitimer, "getitimer", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getlogin, "getlogin", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getpeereid, "getpeereid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getpeername, "getpeername", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getpgid, "getpgid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getpgrp, "getpgrp", "%s()", NULL, NULL },
+{ TARGET_OPENBSD_NR_getpid, "getpid", "%s()", NULL, NULL },
+{ TARGET_OPENBSD_NR_getppid, "getppid", "%s()", NULL, NULL },
+{ TARGET_OPENBSD_NR_getpriority, "getpriority", "%s(%#x,%#x)", NULL, NULL },
+{ TARGET_OPENBSD_NR_getresgid, "getresgid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getresuid, "getresuid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getrlimit, "getrlimit", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getrusage, "getrusage", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getsid, "getsid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getsockname, "getsockname", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getsockopt, "getsockopt", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getthrid, "getthrid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_gettimeofday, "gettimeofday", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_getuid, "getuid", "%s()", NULL, NULL },
+{ TARGET_OPENBSD_NR_ioctl, "ioctl", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_issetugid, "issetugid", "%s()", NULL, NULL },
+{ TARGET_OPENBSD_NR_kevent, "kevent", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_kill, "kill", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_kqueue, "kqueue", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_ktrace, "ktrace", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_lchown, "lchown", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_lfs_bmapv, "lfs_bmapv", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_lfs_markv, "lfs_markv", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_lfs_segclean, "lfs_segclean", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_lfs_segwait, "lfs_segwait", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_link, "link", "%s(\"%s\",\"%s\")", NULL, NULL },
+{ TARGET_OPENBSD_NR_listen, "listen", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_lseek, "lseek", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_lstat, "lstat", "%s(\"%s\",%p)", NULL, NULL },
+{ TARGET_OPENBSD_NR_madvise, "madvise", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_mincore, "mincore", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_minherit, "minherit", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_mkdir, "mkdir", "%s(\"%s\",%#o)", NULL, NULL },
+{ TARGET_OPENBSD_NR_mkfifo, "mkfifo", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_mknod, "mknod", "%s(\"%s\",%#o,%#x)", NULL, NULL },
+{ TARGET_OPENBSD_NR_mlock, "mlock", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_mlockall, "mlockall", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_mmap, "mmap", NULL, NULL, print_syscall_ret_addr },
+{ TARGET_OPENBSD_NR_mount, "mount", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_mprotect, "mprotect", "%s(%#x,%#x,%d)", NULL, NULL },
+{ TARGET_OPENBSD_NR_mquery, "mquery", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_msgctl, "msgctl", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_msgget, "msgget", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_msgrcv, "msgrcv", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_msgsnd, "msgsnd", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_msync, "msync", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_munlock, "munlock", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_munlockall, "munlockall", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_munmap, "munmap", "%s(%p,%d)", NULL, NULL },
+{ TARGET_OPENBSD_NR_nanosleep, "nanosleep", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_nfssvc, "nfssvc", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_open, "open", "%s(\"%s\",%#x,%#o)", NULL, NULL },
+{ TARGET_OPENBSD_NR_opipe, "opipe", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_osigaltstack, "osigaltstack", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_pathconf, "pathconf", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_pipe, "pipe", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_poll, "poll", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_pread, "pread", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_preadv, "preadv", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_profil, "profil", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_ptrace, "ptrace", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_pwrite, "pwrite", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_pwritev, "pwritev", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_quotactl, "quotactl", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_read, "read", "%s(%d,%#x,%d)", NULL, NULL },
+{ TARGET_OPENBSD_NR_readlink, "readlink", "%s(\"%s\",%p,%d)", NULL, NULL },
+{ TARGET_OPENBSD_NR_readv, "readv", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_reboot, "reboot", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_recvfrom, "recvfrom", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_recvmsg, "recvmsg", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_rename, "rename", "%s(\"%s\",\"%s\")", NULL, NULL },
+{ TARGET_OPENBSD_NR_revoke, "revoke", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_rfork, "rfork", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_rmdir, "rmdir", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sbrk, "sbrk", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sched_yield, "sched_yield", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_select, "select", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_semget, "semget", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_semop, "semop", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sendmsg, "sendmsg", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sendto, "sendto", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setegid, "setegid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_seteuid, "seteuid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setgid, "setgid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setgroups, "setgroups", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setitimer, "setitimer", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setlogin, "setlogin", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setpgid, "setpgid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setpriority, "setpriority", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setregid, "setregid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setresgid, "setresgid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setresuid, "setresuid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setreuid, "setreuid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setrlimit, "setrlimit", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setsid, "setsid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setsockopt, "setsockopt", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_settimeofday, "settimeofday", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_setuid, "setuid", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_shmat, "shmat", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_shmctl, "shmctl", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_shmdt, "shmdt", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_shmget, "shmget", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_shutdown, "shutdown", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sigaction, "sigaction", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sigaltstack, "sigaltstack", "%s(%p,%p)", NULL, NULL },
+{ TARGET_OPENBSD_NR_sigpending, "sigpending", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sigprocmask, "sigprocmask", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sigreturn, "sigreturn", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sigsuspend, "sigsuspend", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_socket, "socket", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_socketpair, "socketpair", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sstk, "sstk", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_stat, "stat", "%s(\"%s\",%p)", NULL, NULL },
+{ TARGET_OPENBSD_NR_statfs, "statfs", "%s(\"%s\",%p)", NULL, NULL },
+{ TARGET_OPENBSD_NR_swapctl, "swapctl", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_symlink, "symlink", "%s(\"%s\",\"%s\")", NULL, NULL },
+{ TARGET_OPENBSD_NR_sync, "sync", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_sysarch, "sysarch", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_syscall, "syscall", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_threxit, "threxit", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_thrsigdivert, "thrsigdivert", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_thrsleep, "thrsleep", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_thrwakeup, "thrwakeup", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_truncate, "truncate", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_umask, "umask", "%s(%#o)", NULL, NULL },
+{ TARGET_OPENBSD_NR_unlink, "unlink", "%s(\"%s\")", NULL, NULL },
+{ TARGET_OPENBSD_NR_unmount, "unmount", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_utimes, "utimes", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_vfork, "vfork", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_wait4, "wait4", NULL, NULL, NULL },
+{ TARGET_OPENBSD_NR_write, "write", "%s(%d,%#x,%d)", NULL, NULL },
+{ TARGET_OPENBSD_NR_writev, "writev", "%s(%d,%p,%#x)", NULL, NULL },
+{ TARGET_OPENBSD_NR_xfspioctl, "xfspioctl", NULL, NULL, NULL },
diff --git a/qemu-0.15.x/bsd-user/openbsd/syscall_nr.h b/qemu-0.15.x/bsd-user/openbsd/syscall_nr.h
new file mode 100644
index 0000000..dececfd
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/openbsd/syscall_nr.h
@@ -0,0 +1,225 @@
+/* $OpenBSD: syscall.h,v 1.101 2008/03/16 19:43:41 otto Exp $ */
+
+/*
+ * System call numbers.
+ *
+ * created from; OpenBSD: syscalls.master,v 1.90 2008/03/16 19:42:57 otto Exp
+ */
+
+#define TARGET_OPENBSD_NR_syscall 0
+#define TARGET_OPENBSD_NR_exit 1
+#define TARGET_OPENBSD_NR_fork 2
+#define TARGET_OPENBSD_NR_read 3
+#define TARGET_OPENBSD_NR_write 4
+#define TARGET_OPENBSD_NR_open 5
+#define TARGET_OPENBSD_NR_close 6
+#define TARGET_OPENBSD_NR_wait4 7
+#define TARGET_OPENBSD_NR_link 9
+#define TARGET_OPENBSD_NR_unlink 10
+#define TARGET_OPENBSD_NR_chdir 12
+#define TARGET_OPENBSD_NR_fchdir 13
+#define TARGET_OPENBSD_NR_mknod 14
+#define TARGET_OPENBSD_NR_chmod 15
+#define TARGET_OPENBSD_NR_chown 16
+#define TARGET_OPENBSD_NR_break 17
+#define TARGET_OPENBSD_NR_getpid 20
+#define TARGET_OPENBSD_NR_mount 21
+#define TARGET_OPENBSD_NR_unmount 22
+#define TARGET_OPENBSD_NR_setuid 23
+#define TARGET_OPENBSD_NR_getuid 24
+#define TARGET_OPENBSD_NR_geteuid 25
+#define TARGET_OPENBSD_NR_ptrace 26
+#define TARGET_OPENBSD_NR_recvmsg 27
+#define TARGET_OPENBSD_NR_sendmsg 28
+#define TARGET_OPENBSD_NR_recvfrom 29
+#define TARGET_OPENBSD_NR_accept 30
+#define TARGET_OPENBSD_NR_getpeername 31
+#define TARGET_OPENBSD_NR_getsockname 32
+#define TARGET_OPENBSD_NR_access 33
+#define TARGET_OPENBSD_NR_chflags 34
+#define TARGET_OPENBSD_NR_fchflags 35
+#define TARGET_OPENBSD_NR_sync 36
+#define TARGET_OPENBSD_NR_kill 37
+#define TARGET_OPENBSD_NR_getppid 39
+#define TARGET_OPENBSD_NR_dup 41
+#define TARGET_OPENBSD_NR_opipe 42
+#define TARGET_OPENBSD_NR_getegid 43
+#define TARGET_OPENBSD_NR_profil 44
+#define TARGET_OPENBSD_NR_ktrace 45
+#define TARGET_OPENBSD_NR_sigaction 46
+#define TARGET_OPENBSD_NR_getgid 47
+#define TARGET_OPENBSD_NR_sigprocmask 48
+#define TARGET_OPENBSD_NR_getlogin 49
+#define TARGET_OPENBSD_NR_setlogin 50
+#define TARGET_OPENBSD_NR_acct 51
+#define TARGET_OPENBSD_NR_sigpending 52
+#define TARGET_OPENBSD_NR_osigaltstack 53
+#define TARGET_OPENBSD_NR_ioctl 54
+#define TARGET_OPENBSD_NR_reboot 55
+#define TARGET_OPENBSD_NR_revoke 56
+#define TARGET_OPENBSD_NR_symlink 57
+#define TARGET_OPENBSD_NR_readlink 58
+#define TARGET_OPENBSD_NR_execve 59
+#define TARGET_OPENBSD_NR_umask 60
+#define TARGET_OPENBSD_NR_chroot 61
+#define TARGET_OPENBSD_NR_vfork 66
+#define TARGET_OPENBSD_NR_sbrk 69
+#define TARGET_OPENBSD_NR_sstk 70
+#define TARGET_OPENBSD_NR_munmap 73
+#define TARGET_OPENBSD_NR_mprotect 74
+#define TARGET_OPENBSD_NR_madvise 75
+#define TARGET_OPENBSD_NR_mincore 78
+#define TARGET_OPENBSD_NR_getgroups 79
+#define TARGET_OPENBSD_NR_setgroups 80
+#define TARGET_OPENBSD_NR_getpgrp 81
+#define TARGET_OPENBSD_NR_setpgid 82
+#define TARGET_OPENBSD_NR_setitimer 83
+#define TARGET_OPENBSD_NR_getitimer 86
+#define TARGET_OPENBSD_NR_dup2 90
+#define TARGET_OPENBSD_NR_fcntl 92
+#define TARGET_OPENBSD_NR_select 93
+#define TARGET_OPENBSD_NR_fsync 95
+#define TARGET_OPENBSD_NR_setpriority 96
+#define TARGET_OPENBSD_NR_socket 97
+#define TARGET_OPENBSD_NR_connect 98
+#define TARGET_OPENBSD_NR_getpriority 100
+#define TARGET_OPENBSD_NR_sigreturn 103
+#define TARGET_OPENBSD_NR_bind 104
+#define TARGET_OPENBSD_NR_setsockopt 105
+#define TARGET_OPENBSD_NR_listen 106
+#define TARGET_OPENBSD_NR_sigsuspend 111
+#define TARGET_OPENBSD_NR_gettimeofday 116
+#define TARGET_OPENBSD_NR_getrusage 117
+#define TARGET_OPENBSD_NR_getsockopt 118
+#define TARGET_OPENBSD_NR_readv 120
+#define TARGET_OPENBSD_NR_writev 121
+#define TARGET_OPENBSD_NR_settimeofday 122
+#define TARGET_OPENBSD_NR_fchown 123
+#define TARGET_OPENBSD_NR_fchmod 124
+#define TARGET_OPENBSD_NR_setreuid 126
+#define TARGET_OPENBSD_NR_setregid 127
+#define TARGET_OPENBSD_NR_rename 128
+#define TARGET_OPENBSD_NR_flock 131
+#define TARGET_OPENBSD_NR_mkfifo 132
+#define TARGET_OPENBSD_NR_sendto 133
+#define TARGET_OPENBSD_NR_shutdown 134
+#define TARGET_OPENBSD_NR_socketpair 135
+#define TARGET_OPENBSD_NR_mkdir 136
+#define TARGET_OPENBSD_NR_rmdir 137
+#define TARGET_OPENBSD_NR_utimes 138
+#define TARGET_OPENBSD_NR_adjtime 140
+#define TARGET_OPENBSD_NR_setsid 147
+#define TARGET_OPENBSD_NR_quotactl 148
+#define TARGET_OPENBSD_NR_nfssvc 155
+#define TARGET_OPENBSD_NR_getfh 161
+#define TARGET_OPENBSD_NR_sysarch 165
+#define TARGET_OPENBSD_NR_pread 173
+#define TARGET_OPENBSD_NR_pwrite 174
+#define TARGET_OPENBSD_NR_setgid 181
+#define TARGET_OPENBSD_NR_setegid 182
+#define TARGET_OPENBSD_NR_seteuid 183
+#define TARGET_OPENBSD_NR_lfs_bmapv 184
+#define TARGET_OPENBSD_NR_lfs_markv 185
+#define TARGET_OPENBSD_NR_lfs_segclean 186
+#define TARGET_OPENBSD_NR_lfs_segwait 187
+#define TARGET_OPENBSD_NR_pathconf 191
+#define TARGET_OPENBSD_NR_fpathconf 192
+#define TARGET_OPENBSD_NR_swapctl 193
+#define TARGET_OPENBSD_NR_getrlimit 194
+#define TARGET_OPENBSD_NR_setrlimit 195
+#define TARGET_OPENBSD_NR_getdirentries 196
+#define TARGET_OPENBSD_NR_mmap 197
+#define TARGET_OPENBSD_NR___syscall 198
+#define TARGET_OPENBSD_NR_lseek 199
+#define TARGET_OPENBSD_NR_truncate 200
+#define TARGET_OPENBSD_NR_ftruncate 201
+#define TARGET_OPENBSD_NR___sysctl 202
+#define TARGET_OPENBSD_NR_mlock 203
+#define TARGET_OPENBSD_NR_munlock 204
+#define TARGET_OPENBSD_NR_futimes 206
+#define TARGET_OPENBSD_NR_getpgid 207
+#define TARGET_OPENBSD_NR_xfspioctl 208
+#define TARGET_OPENBSD_NR_semget 221
+#define TARGET_OPENBSD_NR_msgget 225
+#define TARGET_OPENBSD_NR_msgsnd 226
+#define TARGET_OPENBSD_NR_msgrcv 227
+#define TARGET_OPENBSD_NR_shmat 228
+#define TARGET_OPENBSD_NR_shmdt 230
+#define TARGET_OPENBSD_NR_clock_gettime 232
+#define TARGET_OPENBSD_NR_clock_settime 233
+#define TARGET_OPENBSD_NR_clock_getres 234
+#define TARGET_OPENBSD_NR_nanosleep 240
+#define TARGET_OPENBSD_NR_minherit 250
+#define TARGET_OPENBSD_NR_rfork 251
+#define TARGET_OPENBSD_NR_poll 252
+#define TARGET_OPENBSD_NR_issetugid 253
+#define TARGET_OPENBSD_NR_lchown 254
+#define TARGET_OPENBSD_NR_getsid 255
+#define TARGET_OPENBSD_NR_msync 256
+#define TARGET_OPENBSD_NR_pipe 263
+#define TARGET_OPENBSD_NR_fhopen 264
+#define TARGET_OPENBSD_NR_preadv 267
+#define TARGET_OPENBSD_NR_pwritev 268
+#define TARGET_OPENBSD_NR_kqueue 269
+#define TARGET_OPENBSD_NR_kevent 270
+#define TARGET_OPENBSD_NR_mlockall 271
+#define TARGET_OPENBSD_NR_munlockall 272
+#define TARGET_OPENBSD_NR_getpeereid 273
+#define TARGET_OPENBSD_NR_getresuid 281
+#define TARGET_OPENBSD_NR_setresuid 282
+#define TARGET_OPENBSD_NR_getresgid 283
+#define TARGET_OPENBSD_NR_setresgid 284
+#define TARGET_OPENBSD_NR_mquery 286
+#define TARGET_OPENBSD_NR_closefrom 287
+#define TARGET_OPENBSD_NR_sigaltstack 288
+#define TARGET_OPENBSD_NR_shmget 289
+#define TARGET_OPENBSD_NR_semop 290
+#define TARGET_OPENBSD_NR_stat 291
+#define TARGET_OPENBSD_NR_fstat 292
+#define TARGET_OPENBSD_NR_lstat 293
+#define TARGET_OPENBSD_NR_fhstat 294
+#define TARGET_OPENBSD_NR___semctl 295
+#define TARGET_OPENBSD_NR_shmctl 296
+#define TARGET_OPENBSD_NR_msgctl 297
+#define TARGET_OPENBSD_NR_sched_yield 298
+#define TARGET_OPENBSD_NR_getthrid 299
+#define TARGET_OPENBSD_NR_thrsleep 300
+#define TARGET_OPENBSD_NR_thrwakeup 301
+#define TARGET_OPENBSD_NR_threxit 302
+#define TARGET_OPENBSD_NR_thrsigdivert 303
+#define TARGET_OPENBSD_NR___getcwd 304
+#define TARGET_OPENBSD_NR_adjfreq 305
+#define TARGET_OPENBSD_NR_getfsstat 306
+#define TARGET_OPENBSD_NR_statfs 307
+#define TARGET_OPENBSD_NR_fstatfs 308
+#define TARGET_OPENBSD_NR_fhstatfs 309
+
+/* syscall flags from machine/trap.h */
+
+/* $OpenBSD: trap.h,v 1.4 2008/07/04 22:04:37 kettenis Exp $ */
+/* $NetBSD: trap.h,v 1.4 1999/06/07 05:28:04 eeh Exp $ */
+
+/*
+ * Copyright (c) 1996-1999 Eduardo Horvath
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+#define TARGET_OPENBSD_SYSCALL_G2RFLAG 0x400 /* on success, return to %g2 rather than npc */
+#define TARGET_OPENBSD_SYSCALL_G7RFLAG 0x800 /* use %g7 as above (deprecated) */
diff --git a/qemu-0.15.x/bsd-user/qemu-types.h b/qemu-0.15.x/bsd-user/qemu-types.h
new file mode 100644
index 0000000..1adda9f
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/qemu-types.h
@@ -0,0 +1,24 @@
+#ifndef QEMU_TYPES_H
+#define QEMU_TYPES_H
+#include "cpu.h"
+
+#ifdef TARGET_ABI32
+typedef uint32_t abi_ulong;
+typedef int32_t abi_long;
+#define TARGET_ABI_FMT_lx "%08x"
+#define TARGET_ABI_FMT_ld "%d"
+#define TARGET_ABI_FMT_lu "%u"
+#define TARGET_ABI_BITS 32
+#else
+typedef target_ulong abi_ulong;
+typedef target_long abi_long;
+#define TARGET_ABI_FMT_lx TARGET_FMT_lx
+#define TARGET_ABI_FMT_ld TARGET_FMT_ld
+#define TARGET_ABI_FMT_lu TARGET_FMT_lu
+#define TARGET_ABI_BITS TARGET_LONG_BITS
+/* for consistency, define ABI32 too */
+#if TARGET_ABI_BITS == 32
+#define TARGET_ABI32 1
+#endif
+#endif
+#endif
diff --git a/qemu-0.15.x/bsd-user/qemu.h b/qemu-0.15.x/bsd-user/qemu.h
new file mode 100644
index 0000000..1ba2d08
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/qemu.h
@@ -0,0 +1,394 @@
+#ifndef QEMU_H
+#define QEMU_H
+
+#include <signal.h>
+#include <string.h>
+
+#include "cpu.h"
+
+#undef DEBUG_REMAP
+#ifdef DEBUG_REMAP
+#include <stdlib.h>
+#endif /* DEBUG_REMAP */
+
+#include "qemu-types.h"
+
+enum BSDType {
+ target_freebsd,
+ target_netbsd,
+ target_openbsd,
+};
+extern enum BSDType bsd_type;
+
+#include "syscall_defs.h"
+#include "syscall.h"
+#include "target_signal.h"
+#include "gdbstub.h"
+
+#if defined(CONFIG_USE_NPTL)
+#define THREAD __thread
+#else
+#define THREAD
+#endif
+
+/* This struct is used to hold certain information about the image.
+ * Basically, it replicates in user space what would be certain
+ * task_struct fields in the kernel
+ */
+struct image_info {
+ abi_ulong load_addr;
+ abi_ulong start_code;
+ abi_ulong end_code;
+ abi_ulong start_data;
+ abi_ulong end_data;
+ abi_ulong start_brk;
+ abi_ulong brk;
+ abi_ulong start_mmap;
+ abi_ulong mmap;
+ abi_ulong rss;
+ abi_ulong start_stack;
+ abi_ulong entry;
+ abi_ulong code_offset;
+ abi_ulong data_offset;
+ int personality;
+};
+
+#define MAX_SIGQUEUE_SIZE 1024
+
+struct sigqueue {
+ struct sigqueue *next;
+ //target_siginfo_t info;
+};
+
+struct emulated_sigtable {
+ int pending; /* true if signal is pending */
+ struct sigqueue *first;
+ struct sigqueue info; /* in order to always have memory for the
+ first signal, we put it here */
+};
+
+/* NOTE: we force a big alignment so that the stack stored after is
+ aligned too */
+typedef struct TaskState {
+ struct TaskState *next;
+ int used; /* non zero if used */
+ struct image_info *info;
+
+ struct emulated_sigtable sigtab[TARGET_NSIG];
+ struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */
+ struct sigqueue *first_free; /* first free siginfo queue entry */
+ int signal_pending; /* non zero if a signal may be pending */
+
+ uint8_t stack[0];
+} __attribute__((aligned(16))) TaskState;
+
+void init_task_state(TaskState *ts);
+extern const char *qemu_uname_release;
+#if defined(CONFIG_USE_GUEST_BASE)
+extern unsigned long mmap_min_addr;
+#endif
+
+/* ??? See if we can avoid exposing so much of the loader internals. */
+/*
+ * MAX_ARG_PAGES defines the number of pages allocated for arguments
+ * and envelope for the new program. 32 should suffice, this gives
+ * a maximum env+arg of 128kB w/4KB pages!
+ */
+#define MAX_ARG_PAGES 32
+
+/*
+ * This structure is used to hold the arguments that are
+ * used when loading binaries.
+ */
+struct linux_binprm {
+ char buf[128];
+ void *page[MAX_ARG_PAGES];
+ abi_ulong p;
+ int fd;
+ int e_uid, e_gid;
+ int argc, envc;
+ char **argv;
+ char **envp;
+ char * filename; /* Name of binary */
+};
+
+void do_init_thread(struct target_pt_regs *regs, struct image_info *infop);
+abi_ulong loader_build_argptr(int envc, int argc, abi_ulong sp,
+ abi_ulong stringp, int push_ptr);
+int loader_exec(const char * filename, char ** argv, char ** envp,
+ struct target_pt_regs * regs, struct image_info *infop);
+
+int load_elf_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
+ struct image_info * info);
+int load_flt_binary(struct linux_binprm * bprm, struct target_pt_regs * regs,
+ struct image_info * info);
+
+abi_long memcpy_to_target(abi_ulong dest, const void *src,
+ unsigned long len);
+void target_set_brk(abi_ulong new_brk);
+abi_long do_brk(abi_ulong new_brk);
+void syscall_init(void);
+abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1,
+ abi_long arg2, abi_long arg3, abi_long arg4,
+ abi_long arg5, abi_long arg6, abi_long arg7,
+ abi_long arg8);
+abi_long do_netbsd_syscall(void *cpu_env, int num, abi_long arg1,
+ abi_long arg2, abi_long arg3, abi_long arg4,
+ abi_long arg5, abi_long arg6);
+abi_long do_openbsd_syscall(void *cpu_env, int num, abi_long arg1,
+ abi_long arg2, abi_long arg3, abi_long arg4,
+ abi_long arg5, abi_long arg6);
+void gemu_log(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
+extern THREAD CPUState *thread_env;
+void cpu_loop(CPUState *env);
+char *target_strerror(int err);
+int get_osversion(void);
+void fork_start(void);
+void fork_end(int child);
+
+#include "qemu-log.h"
+
+/* strace.c */
+void
+print_freebsd_syscall(int num,
+ abi_long arg1, abi_long arg2, abi_long arg3,
+ abi_long arg4, abi_long arg5, abi_long arg6);
+void print_freebsd_syscall_ret(int num, abi_long ret);
+void
+print_netbsd_syscall(int num,
+ abi_long arg1, abi_long arg2, abi_long arg3,
+ abi_long arg4, abi_long arg5, abi_long arg6);
+void print_netbsd_syscall_ret(int num, abi_long ret);
+void
+print_openbsd_syscall(int num,
+ abi_long arg1, abi_long arg2, abi_long arg3,
+ abi_long arg4, abi_long arg5, abi_long arg6);
+void print_openbsd_syscall_ret(int num, abi_long ret);
+extern int do_strace;
+
+/* signal.c */
+void process_pending_signals(CPUState *cpu_env);
+void signal_init(void);
+//int queue_signal(CPUState *env, int sig, target_siginfo_t *info);
+//void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
+//void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
+long do_sigreturn(CPUState *env);
+long do_rt_sigreturn(CPUState *env);
+abi_long do_sigaltstack(abi_ulong uss_addr, abi_ulong uoss_addr, abi_ulong sp);
+
+/* mmap.c */
+int target_mprotect(abi_ulong start, abi_ulong len, int prot);
+abi_long target_mmap(abi_ulong start, abi_ulong len, int prot,
+ int flags, int fd, abi_ulong offset);
+int target_munmap(abi_ulong start, abi_ulong len);
+abi_long target_mremap(abi_ulong old_addr, abi_ulong old_size,
+ abi_ulong new_size, unsigned long flags,
+ abi_ulong new_addr);
+int target_msync(abi_ulong start, abi_ulong len, int flags);
+extern unsigned long last_brk;
+void mmap_lock(void);
+void mmap_unlock(void);
+void cpu_list_lock(void);
+void cpu_list_unlock(void);
+#if defined(CONFIG_USE_NPTL)
+void mmap_fork_start(void);
+void mmap_fork_end(int child);
+#endif
+
+/* main.c */
+extern unsigned long x86_stack_size;
+
+/* user access */
+
+#define VERIFY_READ 0
+#define VERIFY_WRITE 1 /* implies read access */
+
+static inline int access_ok(int type, abi_ulong addr, abi_ulong size)
+{
+ return page_check_range((target_ulong)addr, size,
+ (type == VERIFY_READ) ? PAGE_READ : (PAGE_READ | PAGE_WRITE)) == 0;
+}
+
+/* NOTE __get_user and __put_user use host pointers and don't check access. */
+/* These are usually used to access struct data members once the
+ * struct has been locked - usually with lock_user_struct().
+ */
+#define __put_user(x, hptr)\
+({\
+ int size = sizeof(*hptr);\
+ switch(size) {\
+ case 1:\
+ *(uint8_t *)(hptr) = (uint8_t)(typeof(*hptr))(x);\
+ break;\
+ case 2:\
+ *(uint16_t *)(hptr) = tswap16((typeof(*hptr))(x));\
+ break;\
+ case 4:\
+ *(uint32_t *)(hptr) = tswap32((typeof(*hptr))(x));\
+ break;\
+ case 8:\
+ *(uint64_t *)(hptr) = tswap64((typeof(*hptr))(x));\
+ break;\
+ default:\
+ abort();\
+ }\
+ 0;\
+})
+
+#define __get_user(x, hptr) \
+({\
+ int size = sizeof(*hptr);\
+ switch(size) {\
+ case 1:\
+ x = (typeof(*hptr))*(uint8_t *)(hptr);\
+ break;\
+ case 2:\
+ x = (typeof(*hptr))tswap16(*(uint16_t *)(hptr));\
+ break;\
+ case 4:\
+ x = (typeof(*hptr))tswap32(*(uint32_t *)(hptr));\
+ break;\
+ case 8:\
+ x = (typeof(*hptr))tswap64(*(uint64_t *)(hptr));\
+ break;\
+ default:\
+ /* avoid warning */\
+ x = 0;\
+ abort();\
+ }\
+ 0;\
+})
+
+/* put_user()/get_user() take a guest address and check access */
+/* These are usually used to access an atomic data type, such as an int,
+ * that has been passed by address. These internally perform locking
+ * and unlocking on the data type.
+ */
+#define put_user(x, gaddr, target_type) \
+({ \
+ abi_ulong __gaddr = (gaddr); \
+ target_type *__hptr; \
+ abi_long __ret; \
+ if ((__hptr = lock_user(VERIFY_WRITE, __gaddr, sizeof(target_type), 0))) { \
+ __ret = __put_user((x), __hptr); \
+ unlock_user(__hptr, __gaddr, sizeof(target_type)); \
+ } else \
+ __ret = -TARGET_EFAULT; \
+ __ret; \
+})
+
+#define get_user(x, gaddr, target_type) \
+({ \
+ abi_ulong __gaddr = (gaddr); \
+ target_type *__hptr; \
+ abi_long __ret; \
+ if ((__hptr = lock_user(VERIFY_READ, __gaddr, sizeof(target_type), 1))) { \
+ __ret = __get_user((x), __hptr); \
+ unlock_user(__hptr, __gaddr, 0); \
+ } else { \
+ /* avoid warning */ \
+ (x) = 0; \
+ __ret = -TARGET_EFAULT; \
+ } \
+ __ret; \
+})
+
+#define put_user_ual(x, gaddr) put_user((x), (gaddr), abi_ulong)
+#define put_user_sal(x, gaddr) put_user((x), (gaddr), abi_long)
+#define put_user_u64(x, gaddr) put_user((x), (gaddr), uint64_t)
+#define put_user_s64(x, gaddr) put_user((x), (gaddr), int64_t)
+#define put_user_u32(x, gaddr) put_user((x), (gaddr), uint32_t)
+#define put_user_s32(x, gaddr) put_user((x), (gaddr), int32_t)
+#define put_user_u16(x, gaddr) put_user((x), (gaddr), uint16_t)
+#define put_user_s16(x, gaddr) put_user((x), (gaddr), int16_t)
+#define put_user_u8(x, gaddr) put_user((x), (gaddr), uint8_t)
+#define put_user_s8(x, gaddr) put_user((x), (gaddr), int8_t)
+
+#define get_user_ual(x, gaddr) get_user((x), (gaddr), abi_ulong)
+#define get_user_sal(x, gaddr) get_user((x), (gaddr), abi_long)
+#define get_user_u64(x, gaddr) get_user((x), (gaddr), uint64_t)
+#define get_user_s64(x, gaddr) get_user((x), (gaddr), int64_t)
+#define get_user_u32(x, gaddr) get_user((x), (gaddr), uint32_t)
+#define get_user_s32(x, gaddr) get_user((x), (gaddr), int32_t)
+#define get_user_u16(x, gaddr) get_user((x), (gaddr), uint16_t)
+#define get_user_s16(x, gaddr) get_user((x), (gaddr), int16_t)
+#define get_user_u8(x, gaddr) get_user((x), (gaddr), uint8_t)
+#define get_user_s8(x, gaddr) get_user((x), (gaddr), int8_t)
+
+/* copy_from_user() and copy_to_user() are usually used to copy data
+ * buffers between the target and host. These internally perform
+ * locking/unlocking of the memory.
+ */
+abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len);
+abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len);
+
+/* Functions for accessing guest memory. The tget and tput functions
+ read/write single values, byteswapping as necessary. The lock_user
+ gets a pointer to a contiguous area of guest memory, but does not perform
+ and byteswapping. lock_user may return either a pointer to the guest
+ memory, or a temporary buffer. */
+
+/* Lock an area of guest memory into the host. If copy is true then the
+ host area will have the same contents as the guest. */
+static inline void *lock_user(int type, abi_ulong guest_addr, long len, int copy)
+{
+ if (!access_ok(type, guest_addr, len))
+ return NULL;
+#ifdef DEBUG_REMAP
+ {
+ void *addr;
+ addr = malloc(len);
+ if (copy)
+ memcpy(addr, g2h(guest_addr), len);
+ else
+ memset(addr, 0, len);
+ return addr;
+ }
+#else
+ return g2h(guest_addr);
+#endif
+}
+
+/* Unlock an area of guest memory. The first LEN bytes must be
+ flushed back to guest memory. host_ptr = NULL is explicitly
+ allowed and does nothing. */
+static inline void unlock_user(void *host_ptr, abi_ulong guest_addr,
+ long len)
+{
+
+#ifdef DEBUG_REMAP
+ if (!host_ptr)
+ return;
+ if (host_ptr == g2h(guest_addr))
+ return;
+ if (len > 0)
+ memcpy(g2h(guest_addr), host_ptr, len);
+ free(host_ptr);
+#endif
+}
+
+/* Return the length of a string in target memory or -TARGET_EFAULT if
+ access error. */
+abi_long target_strlen(abi_ulong gaddr);
+
+/* Like lock_user but for null terminated strings. */
+static inline void *lock_user_string(abi_ulong guest_addr)
+{
+ abi_long len;
+ len = target_strlen(guest_addr);
+ if (len < 0)
+ return NULL;
+ return lock_user(VERIFY_READ, guest_addr, (long)(len + 1), 1);
+}
+
+/* Helper macros for locking/ulocking a target struct. */
+#define lock_user_struct(type, host_ptr, guest_addr, copy) \
+ (host_ptr = lock_user(type, guest_addr, sizeof(*host_ptr), copy))
+#define unlock_user_struct(host_ptr, guest_addr, copy) \
+ unlock_user(host_ptr, guest_addr, (copy) ? sizeof(*host_ptr) : 0)
+
+#if defined(CONFIG_USE_NPTL)
+#include <pthread.h>
+#endif
+
+#endif /* QEMU_H */
diff --git a/qemu-0.15.x/bsd-user/signal.c b/qemu-0.15.x/bsd-user/signal.c
new file mode 100644
index 0000000..40313c8
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/signal.c
@@ -0,0 +1,38 @@
+/*
+ * Emulation of BSD signals
+ *
+ * Copyright (c) 2003 - 2008 Fabrice Bellard
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <signal.h>
+#include <errno.h>
+
+#include "qemu.h"
+#include "target_signal.h"
+
+//#define DEBUG_SIGNAL
+
+void signal_init(void)
+{
+}
+
+void process_pending_signals(CPUState *cpu_env)
+{
+}
diff --git a/qemu-0.15.x/bsd-user/sparc/syscall.h b/qemu-0.15.x/bsd-user/sparc/syscall.h
new file mode 100644
index 0000000..5a9bb7e
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/sparc/syscall.h
@@ -0,0 +1,9 @@
+struct target_pt_regs {
+ abi_ulong psr;
+ abi_ulong pc;
+ abi_ulong npc;
+ abi_ulong y;
+ abi_ulong u_regs[16];
+};
+
+#define UNAME_MACHINE "sun4"
diff --git a/qemu-0.15.x/bsd-user/sparc/target_signal.h b/qemu-0.15.x/bsd-user/sparc/target_signal.h
new file mode 100644
index 0000000..5b2abba
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/sparc/target_signal.h
@@ -0,0 +1,27 @@
+#ifndef TARGET_SIGNAL_H
+#define TARGET_SIGNAL_H
+
+#include "cpu.h"
+
+/* this struct defines a stack used during syscall handling */
+
+typedef struct target_sigaltstack {
+ abi_ulong ss_sp;
+ abi_long ss_flags;
+ abi_ulong ss_size;
+} target_stack_t;
+
+
+#ifndef UREG_I6
+#define UREG_I6 6
+#endif
+#ifndef UREG_FP
+#define UREG_FP UREG_I6
+#endif
+
+static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state)
+{
+ return state->regwptr[UREG_FP];
+}
+
+#endif /* TARGET_SIGNAL_H */
diff --git a/qemu-0.15.x/bsd-user/sparc64/syscall.h b/qemu-0.15.x/bsd-user/sparc64/syscall.h
new file mode 100644
index 0000000..81a816d
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/sparc64/syscall.h
@@ -0,0 +1,10 @@
+struct target_pt_regs {
+ abi_ulong u_regs[16];
+ abi_ulong tstate;
+ abi_ulong pc;
+ abi_ulong npc;
+ abi_ulong y;
+ abi_ulong fprs;
+};
+
+#define UNAME_MACHINE "sun4u"
diff --git a/qemu-0.15.x/bsd-user/sparc64/target_signal.h b/qemu-0.15.x/bsd-user/sparc64/target_signal.h
new file mode 100644
index 0000000..5b2abba
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/sparc64/target_signal.h
@@ -0,0 +1,27 @@
+#ifndef TARGET_SIGNAL_H
+#define TARGET_SIGNAL_H
+
+#include "cpu.h"
+
+/* this struct defines a stack used during syscall handling */
+
+typedef struct target_sigaltstack {
+ abi_ulong ss_sp;
+ abi_long ss_flags;
+ abi_ulong ss_size;
+} target_stack_t;
+
+
+#ifndef UREG_I6
+#define UREG_I6 6
+#endif
+#ifndef UREG_FP
+#define UREG_FP UREG_I6
+#endif
+
+static inline abi_ulong get_sp_from_cpustate(CPUSPARCState *state)
+{
+ return state->regwptr[UREG_FP];
+}
+
+#endif /* TARGET_SIGNAL_H */
diff --git a/qemu-0.15.x/bsd-user/strace.c b/qemu-0.15.x/bsd-user/strace.c
new file mode 100644
index 0000000..d73bbca
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/strace.c
@@ -0,0 +1,191 @@
+#include <stdio.h>
+#include <errno.h>
+#include <sys/select.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/syscall.h>
+#include "qemu.h"
+
+int do_strace=0;
+
+struct syscallname {
+ int nr;
+ const char *name;
+ const char *format;
+ void (*call)(const struct syscallname *,
+ abi_long, abi_long, abi_long,
+ abi_long, abi_long, abi_long);
+ void (*result)(const struct syscallname *, abi_long);
+};
+
+/*
+ * Utility functions
+ */
+
+static void
+print_execve(const struct syscallname *name,
+ abi_long arg1, abi_long arg2, abi_long arg3,
+ abi_long arg4, abi_long arg5, abi_long arg6)
+{
+ abi_ulong arg_ptr_addr;
+ char *s;
+
+ if (!(s = lock_user_string(arg1)))
+ return;
+ gemu_log("%s(\"%s\",{", name->name, s);
+ unlock_user(s, arg1, 0);
+
+ for (arg_ptr_addr = arg2; ; arg_ptr_addr += sizeof(abi_ulong)) {
+ abi_ulong *arg_ptr, arg_addr;
+
+ arg_ptr = lock_user(VERIFY_READ, arg_ptr_addr, sizeof(abi_ulong), 1);
+ if (!arg_ptr)
+ return;
+ arg_addr = tswapl(*arg_ptr);
+ unlock_user(arg_ptr, arg_ptr_addr, 0);
+ if (!arg_addr)
+ break;
+ if ((s = lock_user_string(arg_addr))) {
+ gemu_log("\"%s\",", s);
+ unlock_user(s, arg_addr, 0);
+ }
+ }
+
+ gemu_log("NULL})");
+}
+
+/*
+ * Variants for the return value output function
+ */
+
+static void
+print_syscall_ret_addr(const struct syscallname *name, abi_long ret)
+{
+if( ret == -1 ) {
+ gemu_log(" = -1 errno=%d (%s)\n", errno, strerror(errno));
+ } else {
+ gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret);
+ }
+}
+
+#if 0 /* currently unused */
+static void
+print_syscall_ret_raw(struct syscallname *name, abi_long ret)
+{
+ gemu_log(" = 0x" TARGET_ABI_FMT_lx "\n", ret);
+}
+#endif
+
+/*
+ * An array of all of the syscalls we know about
+ */
+
+static const struct syscallname freebsd_scnames[] = {
+#include "freebsd/strace.list"
+};
+static const struct syscallname netbsd_scnames[] = {
+#include "netbsd/strace.list"
+};
+static const struct syscallname openbsd_scnames[] = {
+#include "openbsd/strace.list"
+};
+
+static void
+print_syscall(int num, const struct syscallname *scnames, unsigned int nscnames,
+ abi_long arg1, abi_long arg2, abi_long arg3,
+ abi_long arg4, abi_long arg5, abi_long arg6)
+{
+ unsigned int i;
+ const char *format="%s(" TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ","
+ TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld "," TARGET_ABI_FMT_ld ","
+ TARGET_ABI_FMT_ld ")";
+
+ gemu_log("%d ", getpid() );
+
+ for (i = 0; i < nscnames; i++)
+ if (scnames[i].nr == num) {
+ if (scnames[i].call != NULL) {
+ scnames[i].call(&scnames[i], arg1, arg2, arg3, arg4, arg5,
+ arg6);
+ } else {
+ /* XXX: this format system is broken because it uses
+ host types and host pointers for strings */
+ if (scnames[i].format != NULL)
+ format = scnames[i].format;
+ gemu_log(format, scnames[i].name, arg1, arg2, arg3, arg4,
+ arg5, arg6);
+ }
+ return;
+ }
+ gemu_log("Unknown syscall %d\n", num);
+}
+
+static void
+print_syscall_ret(int num, abi_long ret, const struct syscallname *scnames,
+ unsigned int nscnames)
+{
+ unsigned int i;
+
+ for (i = 0; i < nscnames; i++)
+ if (scnames[i].nr == num) {
+ if (scnames[i].result != NULL) {
+ scnames[i].result(&scnames[i], ret);
+ } else {
+ if( ret < 0 ) {
+ gemu_log(" = -1 errno=" TARGET_ABI_FMT_ld " (%s)\n", -ret,
+ strerror(-ret));
+ } else {
+ gemu_log(" = " TARGET_ABI_FMT_ld "\n", ret);
+ }
+ }
+ break;
+ }
+}
+
+/*
+ * The public interface to this module.
+ */
+void
+print_freebsd_syscall(int num,
+ abi_long arg1, abi_long arg2, abi_long arg3,
+ abi_long arg4, abi_long arg5, abi_long arg6)
+{
+ print_syscall(num, freebsd_scnames, ARRAY_SIZE(freebsd_scnames),
+ arg1, arg2, arg3, arg4, arg5, arg6);
+}
+
+void
+print_freebsd_syscall_ret(int num, abi_long ret)
+{
+ print_syscall_ret(num, ret, freebsd_scnames, ARRAY_SIZE(freebsd_scnames));
+}
+
+void
+print_netbsd_syscall(int num,
+ abi_long arg1, abi_long arg2, abi_long arg3,
+ abi_long arg4, abi_long arg5, abi_long arg6)
+{
+ print_syscall(num, netbsd_scnames, ARRAY_SIZE(netbsd_scnames),
+ arg1, arg2, arg3, arg4, arg5, arg6);
+}
+
+void
+print_netbsd_syscall_ret(int num, abi_long ret)
+{
+ print_syscall_ret(num, ret, netbsd_scnames, ARRAY_SIZE(netbsd_scnames));
+}
+
+void
+print_openbsd_syscall(int num,
+ abi_long arg1, abi_long arg2, abi_long arg3,
+ abi_long arg4, abi_long arg5, abi_long arg6)
+{
+ print_syscall(num, openbsd_scnames, ARRAY_SIZE(openbsd_scnames),
+ arg1, arg2, arg3, arg4, arg5, arg6);
+}
+
+void
+print_openbsd_syscall_ret(int num, abi_long ret)
+{
+ print_syscall_ret(num, ret, openbsd_scnames, ARRAY_SIZE(openbsd_scnames));
+}
diff --git a/qemu-0.15.x/bsd-user/syscall.c b/qemu-0.15.x/bsd-user/syscall.c
new file mode 100644
index 0000000..d4d039a
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/syscall.c
@@ -0,0 +1,559 @@
+/*
+ * BSD syscalls
+ *
+ * Copyright (c) 2003 - 2008 Fabrice Bellard
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#include <limits.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/syscall.h>
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <utime.h>
+
+#include "qemu.h"
+#include "qemu-common.h"
+
+//#define DEBUG
+
+static abi_ulong target_brk;
+static abi_ulong target_original_brk;
+
+static inline abi_long get_errno(abi_long ret)
+{
+ if (ret == -1)
+ /* XXX need to translate host -> target errnos here */
+ return -(errno);
+ else
+ return ret;
+}
+
+#define target_to_host_bitmask(x, tbl) (x)
+
+static inline int is_error(abi_long ret)
+{
+ return (abi_ulong)ret >= (abi_ulong)(-4096);
+}
+
+void target_set_brk(abi_ulong new_brk)
+{
+ target_original_brk = target_brk = HOST_PAGE_ALIGN(new_brk);
+}
+
+/* do_obreak() must return target errnos. */
+static abi_long do_obreak(abi_ulong new_brk)
+{
+ abi_ulong brk_page;
+ abi_long mapped_addr;
+ int new_alloc_size;
+
+ if (!new_brk)
+ return 0;
+ if (new_brk < target_original_brk)
+ return -TARGET_EINVAL;
+
+ brk_page = HOST_PAGE_ALIGN(target_brk);
+
+ /* If the new brk is less than this, set it and we're done... */
+ if (new_brk < brk_page) {
+ target_brk = new_brk;
+ return 0;
+ }
+
+ /* We need to allocate more memory after the brk... */
+ new_alloc_size = HOST_PAGE_ALIGN(new_brk - brk_page + 1);
+ mapped_addr = get_errno(target_mmap(brk_page, new_alloc_size,
+ PROT_READ|PROT_WRITE,
+ MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0));
+
+ if (!is_error(mapped_addr))
+ target_brk = new_brk;
+ else
+ return mapped_addr;
+
+ return 0;
+}
+
+#if defined(TARGET_I386)
+static abi_long do_freebsd_sysarch(CPUX86State *env, int op, abi_ulong parms)
+{
+ abi_long ret = 0;
+ abi_ulong val;
+ int idx;
+
+ switch(op) {
+#ifdef TARGET_ABI32
+ case TARGET_FREEBSD_I386_SET_GSBASE:
+ case TARGET_FREEBSD_I386_SET_FSBASE:
+ if (op == TARGET_FREEBSD_I386_SET_GSBASE)
+#else
+ case TARGET_FREEBSD_AMD64_SET_GSBASE:
+ case TARGET_FREEBSD_AMD64_SET_FSBASE:
+ if (op == TARGET_FREEBSD_AMD64_SET_GSBASE)
+#endif
+ idx = R_GS;
+ else
+ idx = R_FS;
+ if (get_user(val, parms, abi_ulong))
+ return -TARGET_EFAULT;
+ cpu_x86_load_seg(env, idx, 0);
+ env->segs[idx].base = val;
+ break;
+#ifdef TARGET_ABI32
+ case TARGET_FREEBSD_I386_GET_GSBASE:
+ case TARGET_FREEBSD_I386_GET_FSBASE:
+ if (op == TARGET_FREEBSD_I386_GET_GSBASE)
+#else
+ case TARGET_FREEBSD_AMD64_GET_GSBASE:
+ case TARGET_FREEBSD_AMD64_GET_FSBASE:
+ if (op == TARGET_FREEBSD_AMD64_GET_GSBASE)
+#endif
+ idx = R_GS;
+ else
+ idx = R_FS;
+ val = env->segs[idx].base;
+ if (put_user(val, parms, abi_ulong))
+ return -TARGET_EFAULT;
+ break;
+ /* XXX handle the others... */
+ default:
+ ret = -TARGET_EINVAL;
+ break;
+ }
+ return ret;
+}
+#endif
+
+#ifdef TARGET_SPARC
+static abi_long do_freebsd_sysarch(void *env, int op, abi_ulong parms)
+{
+ /* XXX handle
+ * TARGET_FREEBSD_SPARC_UTRAP_INSTALL,
+ * TARGET_FREEBSD_SPARC_SIGTRAMP_INSTALL
+ */
+ return -TARGET_EINVAL;
+}
+#endif
+
+#ifdef __FreeBSD__
+/*
+ * XXX this uses the undocumented oidfmt interface to find the kind of
+ * a requested sysctl, see /sys/kern/kern_sysctl.c:sysctl_sysctl_oidfmt()
+ * (this is mostly copied from src/sbin/sysctl/sysctl.c)
+ */
+static int
+oidfmt(int *oid, int len, char *fmt, uint32_t *kind)
+{
+ int qoid[CTL_MAXNAME+2];
+ uint8_t buf[BUFSIZ];
+ int i;
+ size_t j;
+
+ qoid[0] = 0;
+ qoid[1] = 4;
+ memcpy(qoid + 2, oid, len * sizeof(int));
+
+ j = sizeof(buf);
+ i = sysctl(qoid, len + 2, buf, &j, 0, 0);
+ if (i)
+ return i;
+
+ if (kind)
+ *kind = *(uint32_t *)buf;
+
+ if (fmt)
+ strcpy(fmt, (char *)(buf + sizeof(uint32_t)));
+ return (0);
+}
+
+/*
+ * try and convert sysctl return data for the target.
+ * XXX doesn't handle CTLTYPE_OPAQUE and CTLTYPE_STRUCT.
+ */
+static int sysctl_oldcvt(void *holdp, size_t holdlen, uint32_t kind)
+{
+ switch (kind & CTLTYPE) {
+ case CTLTYPE_INT:
+ case CTLTYPE_UINT:
+ *(uint32_t *)holdp = tswap32(*(uint32_t *)holdp);
+ break;
+#ifdef TARGET_ABI32
+ case CTLTYPE_LONG:
+ case CTLTYPE_ULONG:
+ *(uint32_t *)holdp = tswap32(*(long *)holdp);
+ break;
+#else
+ case CTLTYPE_LONG:
+ *(uint64_t *)holdp = tswap64(*(long *)holdp);
+ case CTLTYPE_ULONG:
+ *(uint64_t *)holdp = tswap64(*(unsigned long *)holdp);
+ break;
+#endif
+ case CTLTYPE_QUAD:
+ *(uint64_t *)holdp = tswap64(*(uint64_t *)holdp);
+ break;
+ case CTLTYPE_STRING:
+ break;
+ default:
+ /* XXX unhandled */
+ return -1;
+ }
+ return 0;
+}
+
+/* XXX this needs to be emulated on non-FreeBSD hosts... */
+static abi_long do_freebsd_sysctl(abi_ulong namep, int32_t namelen, abi_ulong oldp,
+ abi_ulong oldlenp, abi_ulong newp, abi_ulong newlen)
+{
+ abi_long ret;
+ void *hnamep, *holdp, *hnewp = NULL;
+ size_t holdlen;
+ abi_ulong oldlen = 0;
+ int32_t *snamep = qemu_malloc(sizeof(int32_t) * namelen), *p, *q, i;
+ uint32_t kind = 0;
+
+ if (oldlenp)
+ get_user_ual(oldlen, oldlenp);
+ if (!(hnamep = lock_user(VERIFY_READ, namep, namelen, 1)))
+ return -TARGET_EFAULT;
+ if (newp && !(hnewp = lock_user(VERIFY_READ, newp, newlen, 1)))
+ return -TARGET_EFAULT;
+ if (!(holdp = lock_user(VERIFY_WRITE, oldp, oldlen, 0)))
+ return -TARGET_EFAULT;
+ holdlen = oldlen;
+ for (p = hnamep, q = snamep, i = 0; i < namelen; p++, i++)
+ *q++ = tswap32(*p);
+ oidfmt(snamep, namelen, NULL, &kind);
+ /* XXX swap hnewp */
+ ret = get_errno(sysctl(snamep, namelen, holdp, &holdlen, hnewp, newlen));
+ if (!ret)
+ sysctl_oldcvt(holdp, holdlen, kind);
+ put_user_ual(holdlen, oldlenp);
+ unlock_user(hnamep, namep, 0);
+ unlock_user(holdp, oldp, holdlen);
+ if (hnewp)
+ unlock_user(hnewp, newp, 0);
+ qemu_free(snamep);
+ return ret;
+}
+#endif
+
+/* FIXME
+ * lock_iovec()/unlock_iovec() have a return code of 0 for success where
+ * other lock functions have a return code of 0 for failure.
+ */
+static abi_long lock_iovec(int type, struct iovec *vec, abi_ulong target_addr,
+ int count, int copy)
+{
+ struct target_iovec *target_vec;
+ abi_ulong base;
+ int i;
+
+ target_vec = lock_user(VERIFY_READ, target_addr, count * sizeof(struct target_iovec), 1);
+ if (!target_vec)
+ return -TARGET_EFAULT;
+ for(i = 0;i < count; i++) {
+ base = tswapl(target_vec[i].iov_base);
+ vec[i].iov_len = tswapl(target_vec[i].iov_len);
+ if (vec[i].iov_len != 0) {
+ vec[i].iov_base = lock_user(type, base, vec[i].iov_len, copy);
+ /* Don't check lock_user return value. We must call writev even
+ if a element has invalid base address. */
+ } else {
+ /* zero length pointer is ignored */
+ vec[i].iov_base = NULL;
+ }
+ }
+ unlock_user (target_vec, target_addr, 0);
+ return 0;
+}
+
+static abi_long unlock_iovec(struct iovec *vec, abi_ulong target_addr,
+ int count, int copy)
+{
+ struct target_iovec *target_vec;
+ abi_ulong base;
+ int i;
+
+ target_vec = lock_user(VERIFY_READ, target_addr, count * sizeof(struct target_iovec), 1);
+ if (!target_vec)
+ return -TARGET_EFAULT;
+ for(i = 0;i < count; i++) {
+ if (target_vec[i].iov_base) {
+ base = tswapl(target_vec[i].iov_base);
+ unlock_user(vec[i].iov_base, base, copy ? vec[i].iov_len : 0);
+ }
+ }
+ unlock_user (target_vec, target_addr, 0);
+
+ return 0;
+}
+
+/* do_syscall() should always have a single exit point at the end so
+ that actions, such as logging of syscall results, can be performed.
+ All errnos that do_syscall() returns must be -TARGET_<errcode>. */
+abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1,
+ abi_long arg2, abi_long arg3, abi_long arg4,
+ abi_long arg5, abi_long arg6, abi_long arg7,
+ abi_long arg8)
+{
+ abi_long ret;
+ void *p;
+
+#ifdef DEBUG
+ gemu_log("freebsd syscall %d\n", num);
+#endif
+ if(do_strace)
+ print_freebsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
+
+ switch(num) {
+ case TARGET_FREEBSD_NR_exit:
+#ifdef TARGET_GPROF
+ _mcleanup();
+#endif
+ gdb_exit(cpu_env, arg1);
+ /* XXX: should free thread stack and CPU env */
+ _exit(arg1);
+ ret = 0; /* avoid warning */
+ break;
+ case TARGET_FREEBSD_NR_read:
+ if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
+ goto efault;
+ ret = get_errno(read(arg1, p, arg3));
+ unlock_user(p, arg2, ret);
+ break;
+ case TARGET_FREEBSD_NR_write:
+ if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
+ goto efault;
+ ret = get_errno(write(arg1, p, arg3));
+ unlock_user(p, arg2, 0);
+ break;
+ case TARGET_FREEBSD_NR_writev:
+ {
+ int count = arg3;
+ struct iovec *vec;
+
+ vec = alloca(count * sizeof(struct iovec));
+ if (lock_iovec(VERIFY_READ, vec, arg2, count, 1) < 0)
+ goto efault;
+ ret = get_errno(writev(arg1, vec, count));
+ unlock_iovec(vec, arg2, count, 0);
+ }
+ break;
+ case TARGET_FREEBSD_NR_open:
+ if (!(p = lock_user_string(arg1)))
+ goto efault;
+ ret = get_errno(open(path(p),
+ target_to_host_bitmask(arg2, fcntl_flags_tbl),
+ arg3));
+ unlock_user(p, arg1, 0);
+ break;
+ case TARGET_FREEBSD_NR_mmap:
+ ret = get_errno(target_mmap(arg1, arg2, arg3,
+ target_to_host_bitmask(arg4, mmap_flags_tbl),
+ arg5,
+ arg6));
+ break;
+ case TARGET_FREEBSD_NR_mprotect:
+ ret = get_errno(target_mprotect(arg1, arg2, arg3));
+ break;
+ case TARGET_FREEBSD_NR_break:
+ ret = do_obreak(arg1);
+ break;
+#ifdef __FreeBSD__
+ case TARGET_FREEBSD_NR___sysctl:
+ ret = do_freebsd_sysctl(arg1, arg2, arg3, arg4, arg5, arg6);
+ break;
+#endif
+ case TARGET_FREEBSD_NR_sysarch:
+ ret = do_freebsd_sysarch(cpu_env, arg1, arg2);
+ break;
+ case TARGET_FREEBSD_NR_syscall:
+ case TARGET_FREEBSD_NR___syscall:
+ ret = do_freebsd_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,arg7,arg8,0);
+ break;
+ default:
+ ret = get_errno(syscall(num, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8));
+ break;
+ }
+ fail:
+#ifdef DEBUG
+ gemu_log(" = %ld\n", ret);
+#endif
+ if (do_strace)
+ print_freebsd_syscall_ret(num, ret);
+ return ret;
+ efault:
+ ret = -TARGET_EFAULT;
+ goto fail;
+}
+
+abi_long do_netbsd_syscall(void *cpu_env, int num, abi_long arg1,
+ abi_long arg2, abi_long arg3, abi_long arg4,
+ abi_long arg5, abi_long arg6)
+{
+ abi_long ret;
+ void *p;
+
+#ifdef DEBUG
+ gemu_log("netbsd syscall %d\n", num);
+#endif
+ if(do_strace)
+ print_netbsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
+
+ switch(num) {
+ case TARGET_NETBSD_NR_exit:
+#ifdef TARGET_GPROF
+ _mcleanup();
+#endif
+ gdb_exit(cpu_env, arg1);
+ /* XXX: should free thread stack and CPU env */
+ _exit(arg1);
+ ret = 0; /* avoid warning */
+ break;
+ case TARGET_NETBSD_NR_read:
+ if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
+ goto efault;
+ ret = get_errno(read(arg1, p, arg3));
+ unlock_user(p, arg2, ret);
+ break;
+ case TARGET_NETBSD_NR_write:
+ if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
+ goto efault;
+ ret = get_errno(write(arg1, p, arg3));
+ unlock_user(p, arg2, 0);
+ break;
+ case TARGET_NETBSD_NR_open:
+ if (!(p = lock_user_string(arg1)))
+ goto efault;
+ ret = get_errno(open(path(p),
+ target_to_host_bitmask(arg2, fcntl_flags_tbl),
+ arg3));
+ unlock_user(p, arg1, 0);
+ break;
+ case TARGET_NETBSD_NR_mmap:
+ ret = get_errno(target_mmap(arg1, arg2, arg3,
+ target_to_host_bitmask(arg4, mmap_flags_tbl),
+ arg5,
+ arg6));
+ break;
+ case TARGET_NETBSD_NR_mprotect:
+ ret = get_errno(target_mprotect(arg1, arg2, arg3));
+ break;
+ case TARGET_NETBSD_NR_syscall:
+ case TARGET_NETBSD_NR___syscall:
+ ret = do_netbsd_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,0);
+ break;
+ default:
+ ret = syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
+ break;
+ }
+ fail:
+#ifdef DEBUG
+ gemu_log(" = %ld\n", ret);
+#endif
+ if (do_strace)
+ print_netbsd_syscall_ret(num, ret);
+ return ret;
+ efault:
+ ret = -TARGET_EFAULT;
+ goto fail;
+}
+
+abi_long do_openbsd_syscall(void *cpu_env, int num, abi_long arg1,
+ abi_long arg2, abi_long arg3, abi_long arg4,
+ abi_long arg5, abi_long arg6)
+{
+ abi_long ret;
+ void *p;
+
+#ifdef DEBUG
+ gemu_log("openbsd syscall %d\n", num);
+#endif
+ if(do_strace)
+ print_openbsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
+
+ switch(num) {
+ case TARGET_OPENBSD_NR_exit:
+#ifdef TARGET_GPROF
+ _mcleanup();
+#endif
+ gdb_exit(cpu_env, arg1);
+ /* XXX: should free thread stack and CPU env */
+ _exit(arg1);
+ ret = 0; /* avoid warning */
+ break;
+ case TARGET_OPENBSD_NR_read:
+ if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
+ goto efault;
+ ret = get_errno(read(arg1, p, arg3));
+ unlock_user(p, arg2, ret);
+ break;
+ case TARGET_OPENBSD_NR_write:
+ if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
+ goto efault;
+ ret = get_errno(write(arg1, p, arg3));
+ unlock_user(p, arg2, 0);
+ break;
+ case TARGET_OPENBSD_NR_open:
+ if (!(p = lock_user_string(arg1)))
+ goto efault;
+ ret = get_errno(open(path(p),
+ target_to_host_bitmask(arg2, fcntl_flags_tbl),
+ arg3));
+ unlock_user(p, arg1, 0);
+ break;
+ case TARGET_OPENBSD_NR_mmap:
+ ret = get_errno(target_mmap(arg1, arg2, arg3,
+ target_to_host_bitmask(arg4, mmap_flags_tbl),
+ arg5,
+ arg6));
+ break;
+ case TARGET_OPENBSD_NR_mprotect:
+ ret = get_errno(target_mprotect(arg1, arg2, arg3));
+ break;
+ case TARGET_OPENBSD_NR_syscall:
+ case TARGET_OPENBSD_NR___syscall:
+ ret = do_openbsd_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,0);
+ break;
+ default:
+ ret = syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
+ break;
+ }
+ fail:
+#ifdef DEBUG
+ gemu_log(" = %ld\n", ret);
+#endif
+ if (do_strace)
+ print_openbsd_syscall_ret(num, ret);
+ return ret;
+ efault:
+ ret = -TARGET_EFAULT;
+ goto fail;
+}
+
+void syscall_init(void)
+{
+}
diff --git a/qemu-0.15.x/bsd-user/syscall_defs.h b/qemu-0.15.x/bsd-user/syscall_defs.h
new file mode 100644
index 0000000..207ddee
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/syscall_defs.h
@@ -0,0 +1,114 @@
+/* $OpenBSD: signal.h,v 1.19 2006/01/08 14:20:16 millert Exp $ */
+/* $NetBSD: signal.h,v 1.21 1996/02/09 18:25:32 christos Exp $ */
+
+/*
+ * Copyright (c) 1982, 1986, 1989, 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ * (c) UNIX System Laboratories, Inc.
+ * All or some portions of this file are derived from material licensed
+ * to the University of California by American Telephone and Telegraph
+ * Co. or Unix System Laboratories, Inc. and are reproduced herein with
+ * the permission of UNIX System Laboratories, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)signal.h 8.2 (Berkeley) 1/21/94
+ */
+
+#define TARGET_NSIG 32 /* counting 0; could be 33 (mask is 1-32) */
+
+#define TARGET_SIGHUP 1 /* hangup */
+#define TARGET_SIGINT 2 /* interrupt */
+#define TARGET_SIGQUIT 3 /* quit */
+#define TARGET_SIGILL 4 /* illegal instruction (not reset when caught) */
+#define TARGET_SIGTRAP 5 /* trace trap (not reset when caught) */
+#define TARGET_SIGABRT 6 /* abort() */
+#define TARGET_SIGIOT SIGABRT /* compatibility */
+#define TARGET_SIGEMT 7 /* EMT instruction */
+#define TARGET_SIGFPE 8 /* floating point exception */
+#define TARGET_SIGKILL 9 /* kill (cannot be caught or ignored) */
+#define TARGET_SIGBUS 10 /* bus error */
+#define TARGET_SIGSEGV 11 /* segmentation violation */
+#define TARGET_SIGSYS 12 /* bad argument to system call */
+#define TARGET_SIGPIPE 13 /* write on a pipe with no one to read it */
+#define TARGET_SIGALRM 14 /* alarm clock */
+#define TARGET_SIGTERM 15 /* software termination signal from kill */
+#define TARGET_SIGURG 16 /* urgent condition on IO channel */
+#define TARGET_SIGSTOP 17 /* sendable stop signal not from tty */
+#define TARGET_SIGTSTP 18 /* stop signal from tty */
+#define TARGET_SIGCONT 19 /* continue a stopped process */
+#define TARGET_SIGCHLD 20 /* to parent on child stop or exit */
+#define TARGET_SIGTTIN 21 /* to readers pgrp upon background tty read */
+#define TARGET_SIGTTOU 22 /* like TTIN for output if (tp->t_local<OSTOP) */
+#define TARGET_SIGIO 23 /* input/output possible signal */
+#define TARGET_SIGXCPU 24 /* exceeded CPU time limit */
+#define TARGET_SIGXFSZ 25 /* exceeded file size limit */
+#define TARGET_SIGVTALRM 26 /* virtual time alarm */
+#define TARGET_SIGPROF 27 /* profiling time alarm */
+#define TARGET_SIGWINCH 28 /* window size changes */
+#define TARGET_SIGINFO 29 /* information request */
+#define TARGET_SIGUSR1 30 /* user defined signal 1 */
+#define TARGET_SIGUSR2 31 /* user defined signal 2 */
+
+/*
+ * Language spec says we must list exactly one parameter, even though we
+ * actually supply three. Ugh!
+ */
+#define TARGET_SIG_DFL (void (*)(int))0
+#define TARGET_SIG_IGN (void (*)(int))1
+#define TARGET_SIG_ERR (void (*)(int))-1
+
+#define TARGET_SA_ONSTACK 0x0001 /* take signal on signal stack */
+#define TARGET_SA_RESTART 0x0002 /* restart system on signal return */
+#define TARGET_SA_RESETHAND 0x0004 /* reset to SIG_DFL when taking signal */
+#define TARGET_SA_NODEFER 0x0010 /* don't mask the signal we're delivering */
+#define TARGET_SA_NOCLDWAIT 0x0020 /* don't create zombies (assign to pid 1) */
+#define TARGET_SA_USERTRAMP 0x0100 /* do not bounce off kernel's sigtramp */
+#define TARGET_SA_NOCLDSTOP 0x0008 /* do not generate SIGCHLD on child stop */
+#define TARGET_SA_SIGINFO 0x0040 /* generate siginfo_t */
+
+/*
+ * Flags for sigprocmask:
+ */
+#define TARGET_SIG_BLOCK 1 /* block specified signal set */
+#define TARGET_SIG_UNBLOCK 2 /* unblock specified signal set */
+#define TARGET_SIG_SETMASK 3 /* set specified signal set */
+
+#define TARGET_BADSIG SIG_ERR
+
+#define TARGET_SS_ONSTACK 0x0001 /* take signals on alternate stack */
+#define TARGET_SS_DISABLE 0x0004 /* disable taking signals on alternate stack */
+
+#include "errno_defs.h"
+
+#include "freebsd/syscall_nr.h"
+#include "netbsd/syscall_nr.h"
+#include "openbsd/syscall_nr.h"
+
+struct target_iovec {
+ abi_long iov_base; /* Starting address */
+ abi_long iov_len; /* Number of bytes */
+};
+
diff --git a/qemu-0.15.x/bsd-user/uaccess.c b/qemu-0.15.x/bsd-user/uaccess.c
new file mode 100644
index 0000000..677f19c
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/uaccess.c
@@ -0,0 +1,65 @@
+/* User memory access */
+#include <stdio.h>
+#include <string.h>
+
+#include "qemu.h"
+
+/* copy_from_user() and copy_to_user() are usually used to copy data
+ * buffers between the target and host. These internally perform
+ * locking/unlocking of the memory.
+ */
+abi_long copy_from_user(void *hptr, abi_ulong gaddr, size_t len)
+{
+ abi_long ret = 0;
+ void *ghptr;
+
+ if ((ghptr = lock_user(VERIFY_READ, gaddr, len, 1))) {
+ memcpy(hptr, ghptr, len);
+ unlock_user(ghptr, gaddr, 0);
+ } else
+ ret = -TARGET_EFAULT;
+
+ return ret;
+}
+
+
+abi_long copy_to_user(abi_ulong gaddr, void *hptr, size_t len)
+{
+ abi_long ret = 0;
+ void *ghptr;
+
+ if ((ghptr = lock_user(VERIFY_WRITE, gaddr, len, 0))) {
+ memcpy(ghptr, hptr, len);
+ unlock_user(ghptr, gaddr, len);
+ } else
+ ret = -TARGET_EFAULT;
+
+ return ret;
+}
+
+/* Return the length of a string in target memory or -TARGET_EFAULT if
+ access error */
+abi_long target_strlen(abi_ulong guest_addr1)
+{
+ uint8_t *ptr;
+ abi_ulong guest_addr;
+ int max_len, len;
+
+ guest_addr = guest_addr1;
+ for(;;) {
+ max_len = TARGET_PAGE_SIZE - (guest_addr & ~TARGET_PAGE_MASK);
+ ptr = lock_user(VERIFY_READ, guest_addr, max_len, 1);
+ if (!ptr)
+ return -TARGET_EFAULT;
+ len = qemu_strnlen((char *)ptr, max_len);
+ unlock_user(ptr, guest_addr, 0);
+ guest_addr += len;
+ /* we don't allow wrapping or integer overflow */
+ if (guest_addr == 0 ||
+ (guest_addr - guest_addr1) > 0x7fffffff)
+ return -TARGET_EFAULT;
+ if (len != max_len)
+ break;
+ }
+ return guest_addr - guest_addr1;
+}
diff --git a/qemu-0.15.x/bsd-user/x86_64/syscall.h b/qemu-0.15.x/bsd-user/x86_64/syscall.h
new file mode 100644
index 0000000..5f71b7c
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/x86_64/syscall.h
@@ -0,0 +1,116 @@
+#define __USER_CS (0x33)
+#define __USER_DS (0x2B)
+
+struct target_pt_regs {
+ abi_ulong r15;
+ abi_ulong r14;
+ abi_ulong r13;
+ abi_ulong r12;
+ abi_ulong rbp;
+ abi_ulong rbx;
+/* arguments: non interrupts/non tracing syscalls only save upto here*/
+ abi_ulong r11;
+ abi_ulong r10;
+ abi_ulong r9;
+ abi_ulong r8;
+ abi_ulong rax;
+ abi_ulong rcx;
+ abi_ulong rdx;
+ abi_ulong rsi;
+ abi_ulong rdi;
+ abi_ulong orig_rax;
+/* end of arguments */
+/* cpu exception frame or undefined */
+ abi_ulong rip;
+ abi_ulong cs;
+ abi_ulong eflags;
+ abi_ulong rsp;
+ abi_ulong ss;
+/* top of stack page */
+};
+
+/* Maximum number of LDT entries supported. */
+#define TARGET_LDT_ENTRIES 8192
+/* The size of each LDT entry. */
+#define TARGET_LDT_ENTRY_SIZE 8
+
+#define TARGET_GDT_ENTRIES 16
+#define TARGET_GDT_ENTRY_TLS_ENTRIES 3
+#define TARGET_GDT_ENTRY_TLS_MIN 12
+#define TARGET_GDT_ENTRY_TLS_MAX 14
+
+#if 0 // Redefine this
+struct target_modify_ldt_ldt_s {
+ unsigned int entry_number;
+ abi_ulong base_addr;
+ unsigned int limit;
+ unsigned int seg_32bit:1;
+ unsigned int contents:2;
+ unsigned int read_exec_only:1;
+ unsigned int limit_in_pages:1;
+ unsigned int seg_not_present:1;
+ unsigned int useable:1;
+ unsigned int lm:1;
+};
+#else
+struct target_modify_ldt_ldt_s {
+ unsigned int entry_number;
+ abi_ulong base_addr;
+ unsigned int limit;
+ unsigned int flags;
+};
+#endif
+
+struct target_ipc64_perm
+{
+ int key;
+ uint32_t uid;
+ uint32_t gid;
+ uint32_t cuid;
+ uint32_t cgid;
+ unsigned short mode;
+ unsigned short __pad1;
+ unsigned short seq;
+ unsigned short __pad2;
+ abi_ulong __unused1;
+ abi_ulong __unused2;
+};
+
+struct target_msqid64_ds {
+ struct target_ipc64_perm msg_perm;
+ unsigned int msg_stime; /* last msgsnd time */
+ unsigned int msg_rtime; /* last msgrcv time */
+ unsigned int msg_ctime; /* last change time */
+ abi_ulong msg_cbytes; /* current number of bytes on queue */
+ abi_ulong msg_qnum; /* number of messages in queue */
+ abi_ulong msg_qbytes; /* max number of bytes on queue */
+ unsigned int msg_lspid; /* pid of last msgsnd */
+ unsigned int msg_lrpid; /* last receive pid */
+ abi_ulong __unused4;
+ abi_ulong __unused5;
+};
+
+/* FreeBSD sysarch(2) */
+#define TARGET_FREEBSD_I386_GET_LDT 0
+#define TARGET_FREEBSD_I386_SET_LDT 1
+ /* I386_IOPL */
+#define TARGET_FREEBSD_I386_GET_IOPERM 3
+#define TARGET_FREEBSD_I386_SET_IOPERM 4
+ /* xxxxx */
+#define TARGET_FREEBSD_I386_GET_FSBASE 7
+#define TARGET_FREEBSD_I386_SET_FSBASE 8
+#define TARGET_FREEBSD_I386_GET_GSBASE 9
+#define TARGET_FREEBSD_I386_SET_GSBASE 10
+
+#define TARGET_FREEBSD_AMD64_GET_FSBASE 128
+#define TARGET_FREEBSD_AMD64_SET_FSBASE 129
+#define TARGET_FREEBSD_AMD64_GET_GSBASE 130
+#define TARGET_FREEBSD_AMD64_SET_GSBASE 131
+
+
+#define UNAME_MACHINE "x86_64"
+
+#define TARGET_ARCH_SET_GS 0x1001
+#define TARGET_ARCH_SET_FS 0x1002
+#define TARGET_ARCH_GET_FS 0x1003
+#define TARGET_ARCH_GET_GS 0x1004
diff --git a/qemu-0.15.x/bsd-user/x86_64/target_signal.h b/qemu-0.15.x/bsd-user/x86_64/target_signal.h
new file mode 100644
index 0000000..659cd40
--- /dev/null
+++ b/qemu-0.15.x/bsd-user/x86_64/target_signal.h
@@ -0,0 +1,19 @@
+#ifndef TARGET_SIGNAL_H
+#define TARGET_SIGNAL_H
+
+#include "cpu.h"
+
+/* this struct defines a stack used during syscall handling */
+
+typedef struct target_sigaltstack {
+ abi_ulong ss_sp;
+ abi_long ss_flags;
+ abi_ulong ss_size;
+} target_stack_t;
+
+static inline abi_ulong get_sp_from_cpustate(CPUX86State *state)
+{
+ return state->regs[R_ESP];
+}
+
+#endif /* TARGET_SIGNAL_H */
diff --git a/qemu-0.15.x/bswap.h b/qemu-0.15.x/bswap.h
new file mode 100644
index 0000000..82a7951
--- /dev/null
+++ b/qemu-0.15.x/bswap.h
@@ -0,0 +1,240 @@
+#ifndef BSWAP_H
+#define BSWAP_H
+
+#include "config-host.h"
+
+#include <inttypes.h>
+
+#ifdef CONFIG_MACHINE_BSWAP_H
+#include <sys/endian.h>
+#include <sys/types.h>
+#include <machine/bswap.h>
+#else
+
+#ifdef CONFIG_BYTESWAP_H
+#include <byteswap.h>
+#else
+
+#define bswap_16(x) \
+({ \
+ uint16_t __x = (x); \
+ ((uint16_t)( \
+ (((uint16_t)(__x) & (uint16_t)0x00ffU) << 8) | \
+ (((uint16_t)(__x) & (uint16_t)0xff00U) >> 8) )); \
+})
+
+#define bswap_32(x) \
+({ \
+ uint32_t __x = (x); \
+ ((uint32_t)( \
+ (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \
+ (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \
+ (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \
+ (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \
+})
+
+#define bswap_64(x) \
+({ \
+ uint64_t __x = (x); \
+ ((uint64_t)( \
+ (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000000000ffULL) << 56) | \
+ (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000000000ff00ULL) << 40) | \
+ (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000000000ff0000ULL) << 24) | \
+ (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00000000ff000000ULL) << 8) | \
+ (uint64_t)(((uint64_t)(__x) & (uint64_t)0x000000ff00000000ULL) >> 8) | \
+ (uint64_t)(((uint64_t)(__x) & (uint64_t)0x0000ff0000000000ULL) >> 24) | \
+ (uint64_t)(((uint64_t)(__x) & (uint64_t)0x00ff000000000000ULL) >> 40) | \
+ (uint64_t)(((uint64_t)(__x) & (uint64_t)0xff00000000000000ULL) >> 56) )); \
+})
+
+#endif /* !CONFIG_BYTESWAP_H */
+
+static inline uint16_t bswap16(uint16_t x)
+{
+ return bswap_16(x);
+}
+
+static inline uint32_t bswap32(uint32_t x)
+{
+ return bswap_32(x);
+}
+
+static inline uint64_t bswap64(uint64_t x)
+{
+ return bswap_64(x);
+}
+
+#endif /* ! CONFIG_MACHINE_BSWAP_H */
+
+static inline void bswap16s(uint16_t *s)
+{
+ *s = bswap16(*s);
+}
+
+static inline void bswap32s(uint32_t *s)
+{
+ *s = bswap32(*s);
+}
+
+static inline void bswap64s(uint64_t *s)
+{
+ *s = bswap64(*s);
+}
+
+#if defined(HOST_WORDS_BIGENDIAN)
+#define be_bswap(v, size) (v)
+#define le_bswap(v, size) bswap ## size(v)
+#define be_bswaps(v, size)
+#define le_bswaps(p, size) *p = bswap ## size(*p);
+#else
+#define le_bswap(v, size) (v)
+#define be_bswap(v, size) bswap ## size(v)
+#define le_bswaps(v, size)
+#define be_bswaps(p, size) *p = bswap ## size(*p);
+#endif
+
+#define CPU_CONVERT(endian, size, type)\
+static inline type endian ## size ## _to_cpu(type v)\
+{\
+ return endian ## _bswap(v, size);\
+}\
+\
+static inline type cpu_to_ ## endian ## size(type v)\
+{\
+ return endian ## _bswap(v, size);\
+}\
+\
+static inline void endian ## size ## _to_cpus(type *p)\
+{\
+ endian ## _bswaps(p, size)\
+}\
+\
+static inline void cpu_to_ ## endian ## size ## s(type *p)\
+{\
+ endian ## _bswaps(p, size)\
+}\
+\
+static inline type endian ## size ## _to_cpup(const type *p)\
+{\
+ return endian ## size ## _to_cpu(*p);\
+}\
+\
+static inline void cpu_to_ ## endian ## size ## w(type *p, type v)\
+{\
+ *p = cpu_to_ ## endian ## size(v);\
+}
+
+CPU_CONVERT(be, 16, uint16_t)
+CPU_CONVERT(be, 32, uint32_t)
+CPU_CONVERT(be, 64, uint64_t)
+
+CPU_CONVERT(le, 16, uint16_t)
+CPU_CONVERT(le, 32, uint32_t)
+CPU_CONVERT(le, 64, uint64_t)
+
+/* unaligned versions (optimized for frequent unaligned accesses)*/
+
+#if defined(__i386__) || defined(_ARCH_PPC)
+
+#define cpu_to_le16wu(p, v) cpu_to_le16w(p, v)
+#define cpu_to_le32wu(p, v) cpu_to_le32w(p, v)
+#define le16_to_cpupu(p) le16_to_cpup(p)
+#define le32_to_cpupu(p) le32_to_cpup(p)
+#define be32_to_cpupu(p) be32_to_cpup(p)
+
+#define cpu_to_be16wu(p, v) cpu_to_be16w(p, v)
+#define cpu_to_be32wu(p, v) cpu_to_be32w(p, v)
+#define cpu_to_be64wu(p, v) cpu_to_be64w(p, v)
+
+#else
+
+static inline void cpu_to_le16wu(uint16_t *p, uint16_t v)
+{
+ uint8_t *p1 = (uint8_t *)p;
+
+ p1[0] = v & 0xff;
+ p1[1] = v >> 8;
+}
+
+static inline void cpu_to_le32wu(uint32_t *p, uint32_t v)
+{
+ uint8_t *p1 = (uint8_t *)p;
+
+ p1[0] = v & 0xff;
+ p1[1] = v >> 8;
+ p1[2] = v >> 16;
+ p1[3] = v >> 24;
+}
+
+static inline uint16_t le16_to_cpupu(const uint16_t *p)
+{
+ const uint8_t *p1 = (const uint8_t *)p;
+ return p1[0] | (p1[1] << 8);
+}
+
+static inline uint32_t le32_to_cpupu(const uint32_t *p)
+{
+ const uint8_t *p1 = (const uint8_t *)p;
+ return p1[0] | (p1[1] << 8) | (p1[2] << 16) | (p1[3] << 24);
+}
+
+static inline uint32_t be32_to_cpupu(const uint32_t *p)
+{
+ const uint8_t *p1 = (const uint8_t *)p;
+ return p1[3] | (p1[2] << 8) | (p1[1] << 16) | (p1[0] << 24);
+}
+
+static inline void cpu_to_be16wu(uint16_t *p, uint16_t v)
+{
+ uint8_t *p1 = (uint8_t *)p;
+
+ p1[0] = v >> 8;
+ p1[1] = v & 0xff;
+}
+
+static inline void cpu_to_be32wu(uint32_t *p, uint32_t v)
+{
+ uint8_t *p1 = (uint8_t *)p;
+
+ p1[0] = v >> 24;
+ p1[1] = v >> 16;
+ p1[2] = v >> 8;
+ p1[3] = v & 0xff;
+}
+
+static inline void cpu_to_be64wu(uint64_t *p, uint64_t v)
+{
+ uint8_t *p1 = (uint8_t *)p;
+
+ p1[0] = v >> 56;
+ p1[1] = v >> 48;
+ p1[2] = v >> 40;
+ p1[3] = v >> 32;
+ p1[4] = v >> 24;
+ p1[5] = v >> 16;
+ p1[6] = v >> 8;
+ p1[7] = v & 0xff;
+}
+
+#endif
+
+#ifdef HOST_WORDS_BIGENDIAN
+#define cpu_to_32wu cpu_to_be32wu
+#define leul_to_cpu(v) glue(glue(le,HOST_LONG_BITS),_to_cpu)(v)
+#else
+#define cpu_to_32wu cpu_to_le32wu
+#define leul_to_cpu(v) (v)
+#endif
+
+#undef le_bswap
+#undef be_bswap
+#undef le_bswaps
+#undef be_bswaps
+
+/* len must be one of 1, 2, 4 */
+static inline uint32_t qemu_bswap_len(uint32_t value, int len)
+{
+ return bswap32(value) >> (32 - 8 * len);
+}
+
+#endif /* BSWAP_H */
diff --git a/qemu-0.15.x/bt-host.c b/qemu-0.15.x/bt-host.c
new file mode 100644
index 0000000..095254d
--- /dev/null
+++ b/qemu-0.15.x/bt-host.c
@@ -0,0 +1,198 @@
+/*
+ * Wrap a host Bluetooth HCI socket in a struct HCIInfo.
+ *
+ * Copyright (C) 2008 Andrzej Zaborowski <balrog(a)zabor.org>
+ *
+ * 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 or
+ * (at your option) version 3 of the License.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "qemu-common.h"
+#include "qemu-char.h"
+#include "net.h"
+#include "bt-host.h"
+
+#ifndef _WIN32
+# include <errno.h>
+# include <sys/ioctl.h>
+# include <sys/uio.h>
+# ifdef CONFIG_BLUEZ
+# include <bluetooth/bluetooth.h>
+# include <bluetooth/hci.h>
+# include <bluetooth/hci_lib.h>
+# else
+# include "hw/bt.h"
+# define HCI_MAX_FRAME_SIZE 1028
+# endif
+
+struct bt_host_hci_s {
+ struct HCIInfo hci;
+ int fd;
+
+ uint8_t hdr[HCI_MAX_FRAME_SIZE];
+ int len;
+};
+
+static void bt_host_send(struct HCIInfo *hci,
+ int type, const uint8_t *data, int len)
+{
+ struct bt_host_hci_s *s = (struct bt_host_hci_s *) hci;
+ uint8_t pkt = type;
+ struct iovec iv[2];
+
+ iv[0].iov_base = (void *)&pkt;
+ iv[0].iov_len = 1;
+ iv[1].iov_base = (void *) data;
+ iv[1].iov_len = len;
+
+ while (writev(s->fd, iv, 2) < 0) {
+ if (errno != EAGAIN && errno != EINTR) {
+ fprintf(stderr, "qemu: error %i writing bluetooth packet.\n",
+ errno);
+ return;
+ }
+ }
+}
+
+static void bt_host_cmd(struct HCIInfo *hci, const uint8_t *data, int len)
+{
+ bt_host_send(hci, HCI_COMMAND_PKT, data, len);
+}
+
+static void bt_host_acl(struct HCIInfo *hci, const uint8_t *data, int len)
+{
+ bt_host_send(hci, HCI_ACLDATA_PKT, data, len);
+}
+
+static void bt_host_sco(struct HCIInfo *hci, const uint8_t *data, int len)
+{
+ bt_host_send(hci, HCI_SCODATA_PKT, data, len);
+}
+
+static void bt_host_read(void *opaque)
+{
+ struct bt_host_hci_s *s = (struct bt_host_hci_s *) opaque;
+ uint8_t *pkt;
+ int pktlen;
+
+ /* Seems that we can't read only the header first and then the amount
+ * of data indicated in the header because Linux will discard everything
+ * that's not been read in one go. */
+ s->len = read(s->fd, s->hdr, sizeof(s->hdr));
+
+ if (s->len < 0) {
+ fprintf(stderr, "qemu: error %i reading HCI frame\n", errno);
+ return;
+ }
+
+ pkt = s->hdr;
+ while (s->len --)
+ switch (*pkt ++) {
+ case HCI_EVENT_PKT:
+ if (s->len < 2)
+ goto bad_pkt;
+
+ pktlen = MIN(pkt[1] + 2, s->len);
+ s->hci.evt_recv(s->hci.opaque, pkt, pktlen);
+ s->len -= pktlen;
+ pkt += pktlen;
+
+ /* TODO: if this is an Inquiry Result event, it's also
+ * interpreted by Linux kernel before we received it, possibly
+ * we should clean the kernel Inquiry cache through
+ * ioctl(s->fd, HCI_INQUIRY, ...). */
+ break;
+
+ case HCI_ACLDATA_PKT:
+ if (s->len < 4)
+ goto bad_pkt;
+
+ pktlen = MIN(((pkt[3] << 8) | pkt[2]) + 4, s->len);
+ s->hci.acl_recv(s->hci.opaque, pkt, pktlen);
+ s->len -= pktlen;
+ pkt += pktlen;
+ break;
+
+ case HCI_SCODATA_PKT:
+ if (s->len < 3)
+ goto bad_pkt;
+
+ pktlen = MIN(pkt[2] + 3, s->len);
+ s->len -= pktlen;
+ pkt += pktlen;
+
+ default:
+ bad_pkt:
+ fprintf(stderr, "qemu: bad HCI packet type %02x\n", pkt[-1]);
+ }
+}
+
+static int bt_host_bdaddr_set(struct HCIInfo *hci, const uint8_t *bd_addr)
+{
+ return -ENOTSUP;
+}
+
+struct HCIInfo *bt_host_hci(const char *id)
+{
+ struct bt_host_hci_s *s;
+ int fd = -1;
+# ifdef CONFIG_BLUEZ
+ int dev_id = hci_devid(id);
+ struct hci_filter flt;
+
+ if (dev_id < 0) {
+ fprintf(stderr, "qemu: `%s' not available\n", id);
+ return 0;
+ }
+
+ fd = hci_open_dev(dev_id);
+
+ /* XXX: can we ensure nobody else has the device opened? */
+# endif
+
+ if (fd < 0) {
+ fprintf(stderr, "qemu: Can't open `%s': %s (%i)\n",
+ id, strerror(errno), errno);
+ return NULL;
+ }
+
+# ifdef CONFIG_BLUEZ
+ hci_filter_clear(&flt);
+ hci_filter_all_ptypes(&flt);
+ hci_filter_all_events(&flt);
+
+ if (setsockopt(fd, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) {
+ fprintf(stderr, "qemu: Can't set HCI filter on socket (%i)\n", errno);
+ return 0;
+ }
+# endif
+
+ s = qemu_mallocz(sizeof(struct bt_host_hci_s));
+ s->fd = fd;
+ s->hci.cmd_send = bt_host_cmd;
+ s->hci.sco_send = bt_host_sco;
+ s->hci.acl_send = bt_host_acl;
+ s->hci.bdaddr_set = bt_host_bdaddr_set;
+
+ qemu_set_fd_handler(s->fd, bt_host_read, NULL, s);
+
+ return &s->hci;
+}
+#else
+struct HCIInfo *bt_host_hci(const char *id)
+{
+ fprintf(stderr, "qemu: bluetooth passthrough not supported (yet)\n");
+
+ return 0;
+}
+#endif
diff --git a/qemu-0.15.x/bt-host.h b/qemu-0.15.x/bt-host.h
new file mode 100644
index 0000000..f1eff65
--- /dev/null
+++ b/qemu-0.15.x/bt-host.h
@@ -0,0 +1,9 @@
+#ifndef BT_HOST_H
+#define BT_HOST_H
+
+struct HCIInfo;
+
+/* bt-host.c */
+struct HCIInfo *bt_host_hci(const char *id);
+
+#endif
diff --git a/qemu-0.15.x/bt-vhci.c b/qemu-0.15.x/bt-vhci.c
new file mode 100644
index 0000000..3c57720
--- /dev/null
+++ b/qemu-0.15.x/bt-vhci.c
@@ -0,0 +1,167 @@
+/*
+ * Support for host VHCIs inside qemu scatternets.
+ *
+ * Copyright (C) 2008 Andrzej Zaborowski <balrog(a)zabor.org>
+ *
+ * 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 or
+ * (at your option) version 3 of the License.
+ *
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "qemu-common.h"
+#include "qemu-char.h"
+#include "net.h"
+#include "hw/bt.h"
+
+#define VHCI_DEV "/dev/vhci"
+#define VHCI_UDEV "/dev/hci_vhci"
+
+struct bt_vhci_s {
+ int fd;
+ struct HCIInfo *info;
+
+ uint8_t hdr[4096];
+ int len;
+};
+
+static void vhci_read(void *opaque)
+{
+ struct bt_vhci_s *s = (struct bt_vhci_s *) opaque;
+ uint8_t *pkt;
+ int pktlen;
+
+ /* Seems that we can't read only the header first and then the amount
+ * of data indicated in the header because Linux will discard everything
+ * that's not been read in one go. */
+ s->len = read(s->fd, s->hdr, sizeof(s->hdr));
+
+ if (s->len < 0) {
+ fprintf(stderr, "qemu: error %i reading the PDU\n", errno);
+ return;
+ }
+
+ pkt = s->hdr;
+ while (s->len --)
+ switch (*pkt ++) {
+ case HCI_COMMAND_PKT:
+ if (s->len < 3)
+ goto bad_pkt;
+
+ pktlen = MIN(pkt[2] + 3, s->len);
+ s->info->cmd_send(s->info, pkt, pktlen);
+ s->len -= pktlen;
+ pkt += pktlen;
+ break;
+
+ case HCI_ACLDATA_PKT:
+ if (s->len < 4)
+ goto bad_pkt;
+
+ pktlen = MIN(((pkt[3] << 8) | pkt[2]) + 4, s->len);
+ s->info->acl_send(s->info, pkt, pktlen);
+ s->len -= pktlen;
+ pkt += pktlen;
+ break;
+
+ case HCI_SCODATA_PKT:
+ if (s->len < 3)
+ goto bad_pkt;
+
+ pktlen = MIN(pkt[2] + 3, s->len);
+ s->info->sco_send(s->info, pkt, pktlen);
+ s->len -= pktlen;
+ pkt += pktlen;
+ break;
+
+ default:
+ bad_pkt:
+ fprintf(stderr, "qemu: bad HCI packet type %02x\n", pkt[-1]);
+ }
+}
+
+static void vhci_host_send(void *opaque,
+ int type, const uint8_t *data, int len)
+{
+ struct bt_vhci_s *s = (struct bt_vhci_s *) opaque;
+#if 0
+ uint8_t pkt = type;
+ struct iovec iv[2];
+
+ iv[0].iov_base = &pkt;
+ iv[0].iov_len = 1;
+ iv[1].iov_base = (void *) data;
+ iv[1].iov_len = len;
+
+ while (writev(s->fd, iv, 2) < 0)
+ if (errno != EAGAIN && errno != EINTR) {
+ fprintf(stderr, "qemu: error %i writing bluetooth packet.\n",
+ errno);
+ return;
+ }
+#else
+ /* Apparently VHCI wants us to write everything in one chunk :-( */
+ static uint8_t buf[4096];
+
+ buf[0] = type;
+ memcpy(buf + 1, data, len);
+
+ while (write(s->fd, buf, len + 1) < 0)
+ if (errno != EAGAIN && errno != EINTR) {
+ fprintf(stderr, "qemu: error %i writing bluetooth packet.\n",
+ errno);
+ return;
+ }
+#endif
+}
+
+static void vhci_out_hci_packet_event(void *opaque,
+ const uint8_t *data, int len)
+{
+ vhci_host_send(opaque, HCI_EVENT_PKT, data, len);
+}
+
+static void vhci_out_hci_packet_acl(void *opaque,
+ const uint8_t *data, int len)
+{
+ vhci_host_send(opaque, HCI_ACLDATA_PKT, data, len);
+}
+
+void bt_vhci_init(struct HCIInfo *info)
+{
+ struct bt_vhci_s *s;
+ int err[2];
+ int fd;
+
+ fd = open(VHCI_DEV, O_RDWR);
+ err[0] = errno;
+ if (fd < 0) {
+ fd = open(VHCI_UDEV, O_RDWR);
+ err[1] = errno;
+ }
+
+ if (fd < 0) {
+ fprintf(stderr, "qemu: Can't open `%s': %s (%i)\n",
+ VHCI_DEV, strerror(err[0]), err[0]);
+ fprintf(stderr, "qemu: Can't open `%s': %s (%i)\n",
+ VHCI_UDEV, strerror(err[1]), err[1]);
+ exit(-1);
+ }
+
+ s = qemu_mallocz(sizeof(struct bt_vhci_s));
+ s->fd = fd;
+ s->info = info ?: qemu_next_hci();
+ s->info->opaque = s;
+ s->info->evt_recv = vhci_out_hci_packet_event;
+ s->info->acl_recv = vhci_out_hci_packet_acl;
+
+ qemu_set_fd_handler(s->fd, vhci_read, NULL, s);
+}
diff --git a/qemu-0.15.x/buffered_file.c b/qemu-0.15.x/buffered_file.c
new file mode 100644
index 0000000..41b42c3
--- /dev/null
+++ b/qemu-0.15.x/buffered_file.c
@@ -0,0 +1,281 @@
+/*
+ * QEMU buffered QEMUFile
+ *
+ * Copyright IBM, Corp. 2008
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-common.h"
+#include "hw/hw.h"
+#include "qemu-timer.h"
+#include "qemu-char.h"
+#include "buffered_file.h"
+
+//#define DEBUG_BUFFERED_FILE
+
+typedef struct QEMUFileBuffered
+{
+ BufferedPutFunc *put_buffer;
+ BufferedPutReadyFunc *put_ready;
+ BufferedWaitForUnfreezeFunc *wait_for_unfreeze;
+ BufferedCloseFunc *close;
+ void *opaque;
+ QEMUFile *file;
+ int has_error;
+ int freeze_output;
+ size_t bytes_xfer;
+ size_t xfer_limit;
+ uint8_t *buffer;
+ size_t buffer_size;
+ size_t buffer_capacity;
+ QEMUTimer *timer;
+} QEMUFileBuffered;
+
+#ifdef DEBUG_BUFFERED_FILE
+#define DPRINTF(fmt, ...) \
+ do { printf("buffered-file: " fmt, ## __VA_ARGS__); } while (0)
+#else
+#define DPRINTF(fmt, ...) \
+ do { } while (0)
+#endif
+
+static void buffered_append(QEMUFileBuffered *s,
+ const uint8_t *buf, size_t size)
+{
+ if (size > (s->buffer_capacity - s->buffer_size)) {
+ void *tmp;
+
+ DPRINTF("increasing buffer capacity from %zu by %zu\n",
+ s->buffer_capacity, size + 1024);
+
+ s->buffer_capacity += size + 1024;
+
+ tmp = qemu_realloc(s->buffer, s->buffer_capacity);
+ if (tmp == NULL) {
+ fprintf(stderr, "qemu file buffer expansion failed\n");
+ exit(1);
+ }
+
+ s->buffer = tmp;
+ }
+
+ memcpy(s->buffer + s->buffer_size, buf, size);
+ s->buffer_size += size;
+}
+
+static void buffered_flush(QEMUFileBuffered *s)
+{
+ size_t offset = 0;
+
+ if (s->has_error) {
+ DPRINTF("flush when error, bailing\n");
+ return;
+ }
+
+ DPRINTF("flushing %zu byte(s) of data\n", s->buffer_size);
+
+ while (offset < s->buffer_size) {
+ ssize_t ret;
+
+ ret = s->put_buffer(s->opaque, s->buffer + offset,
+ s->buffer_size - offset);
+ if (ret == -EAGAIN) {
+ DPRINTF("backend not ready, freezing\n");
+ s->freeze_output = 1;
+ break;
+ }
+
+ if (ret <= 0) {
+ DPRINTF("error flushing data, %zd\n", ret);
+ s->has_error = 1;
+ break;
+ } else {
+ DPRINTF("flushed %zd byte(s)\n", ret);
+ offset += ret;
+ }
+ }
+
+ DPRINTF("flushed %zu of %zu byte(s)\n", offset, s->buffer_size);
+ memmove(s->buffer, s->buffer + offset, s->buffer_size - offset);
+ s->buffer_size -= offset;
+}
+
+static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size)
+{
+ QEMUFileBuffered *s = opaque;
+ int offset = 0;
+ ssize_t ret;
+
+ DPRINTF("putting %d bytes at %" PRId64 "\n", size, pos);
+
+ if (s->has_error) {
+ DPRINTF("flush when error, bailing\n");
+ return -EINVAL;
+ }
+
+ DPRINTF("unfreezing output\n");
+ s->freeze_output = 0;
+
+ buffered_flush(s);
+
+ while (!s->freeze_output && offset < size) {
+ if (s->bytes_xfer > s->xfer_limit) {
+ DPRINTF("transfer limit exceeded when putting\n");
+ break;
+ }
+
+ ret = s->put_buffer(s->opaque, buf + offset, size - offset);
+ if (ret == -EAGAIN) {
+ DPRINTF("backend not ready, freezing\n");
+ s->freeze_output = 1;
+ break;
+ }
+
+ if (ret <= 0) {
+ DPRINTF("error putting\n");
+ s->has_error = 1;
+ offset = -EINVAL;
+ break;
+ }
+
+ DPRINTF("put %zd byte(s)\n", ret);
+ offset += ret;
+ s->bytes_xfer += ret;
+ }
+
+ if (offset >= 0) {
+ DPRINTF("buffering %d bytes\n", size - offset);
+ buffered_append(s, buf + offset, size - offset);
+ offset = size;
+ }
+
+ if (pos == 0 && size == 0) {
+ DPRINTF("file is ready\n");
+ if (s->bytes_xfer <= s->xfer_limit) {
+ DPRINTF("notifying client\n");
+ s->put_ready(s->opaque);
+ }
+ }
+
+ return offset;
+}
+
+static int buffered_close(void *opaque)
+{
+ QEMUFileBuffered *s = opaque;
+ int ret;
+
+ DPRINTF("closing\n");
+
+ while (!s->has_error && s->buffer_size) {
+ buffered_flush(s);
+ if (s->freeze_output)
+ s->wait_for_unfreeze(s);
+ }
+
+ ret = s->close(s->opaque);
+
+ qemu_del_timer(s->timer);
+ qemu_free_timer(s->timer);
+ qemu_free(s->buffer);
+ qemu_free(s);
+
+ return ret;
+}
+
+static int buffered_rate_limit(void *opaque)
+{
+ QEMUFileBuffered *s = opaque;
+
+ if (s->has_error)
+ return 0;
+
+ if (s->freeze_output)
+ return 1;
+
+ if (s->bytes_xfer > s->xfer_limit)
+ return 1;
+
+ return 0;
+}
+
+static int64_t buffered_set_rate_limit(void *opaque, int64_t new_rate)
+{
+ QEMUFileBuffered *s = opaque;
+ if (s->has_error)
+ goto out;
+
+ if (new_rate > SIZE_MAX) {
+ new_rate = SIZE_MAX;
+ }
+
+ s->xfer_limit = new_rate / 10;
+
+out:
+ return s->xfer_limit;
+}
+
+static int64_t buffered_get_rate_limit(void *opaque)
+{
+ QEMUFileBuffered *s = opaque;
+
+ return s->xfer_limit;
+}
+
+static void buffered_rate_tick(void *opaque)
+{
+ QEMUFileBuffered *s = opaque;
+
+ if (s->has_error) {
+ buffered_close(s);
+ return;
+ }
+
+ qemu_mod_timer(s->timer, qemu_get_clock_ms(rt_clock) + 100);
+
+ if (s->freeze_output)
+ return;
+
+ s->bytes_xfer = 0;
+
+ buffered_flush(s);
+
+ /* Add some checks around this */
+ s->put_ready(s->opaque);
+}
+
+QEMUFile *qemu_fopen_ops_buffered(void *opaque,
+ size_t bytes_per_sec,
+ BufferedPutFunc *put_buffer,
+ BufferedPutReadyFunc *put_ready,
+ BufferedWaitForUnfreezeFunc *wait_for_unfreeze,
+ BufferedCloseFunc *close)
+{
+ QEMUFileBuffered *s;
+
+ s = qemu_mallocz(sizeof(*s));
+
+ s->opaque = opaque;
+ s->xfer_limit = bytes_per_sec / 10;
+ s->put_buffer = put_buffer;
+ s->put_ready = put_ready;
+ s->wait_for_unfreeze = wait_for_unfreeze;
+ s->close = close;
+
+ s->file = qemu_fopen_ops(s, buffered_put_buffer, NULL,
+ buffered_close, buffered_rate_limit,
+ buffered_set_rate_limit,
+ buffered_get_rate_limit);
+
+ s->timer = qemu_new_timer_ms(rt_clock, buffered_rate_tick, s);
+
+ qemu_mod_timer(s->timer, qemu_get_clock_ms(rt_clock) + 100);
+
+ return s->file;
+}
diff --git a/qemu-0.15.x/buffered_file.h b/qemu-0.15.x/buffered_file.h
new file mode 100644
index 0000000..98d358b
--- /dev/null
+++ b/qemu-0.15.x/buffered_file.h
@@ -0,0 +1,30 @@
+/*
+ * QEMU buffered QEMUFile
+ *
+ * Copyright IBM, Corp. 2008
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_BUFFERED_FILE_H
+#define QEMU_BUFFERED_FILE_H
+
+#include "hw/hw.h"
+
+typedef ssize_t (BufferedPutFunc)(void *opaque, const void *data, size_t size);
+typedef void (BufferedPutReadyFunc)(void *opaque);
+typedef void (BufferedWaitForUnfreezeFunc)(void *opaque);
+typedef int (BufferedCloseFunc)(void *opaque);
+
+QEMUFile *qemu_fopen_ops_buffered(void *opaque, size_t xfer_limit,
+ BufferedPutFunc *put_buffer,
+ BufferedPutReadyFunc *put_ready,
+ BufferedWaitForUnfreezeFunc *wait_for_unfreeze,
+ BufferedCloseFunc *close);
+
+#endif
diff --git a/qemu-0.15.x/cache-utils.c b/qemu-0.15.x/cache-utils.c
new file mode 100644
index 0000000..2db5af2
--- /dev/null
+++ b/qemu-0.15.x/cache-utils.c
@@ -0,0 +1,97 @@
+#include "cache-utils.h"
+
+#if defined(_ARCH_PPC)
+struct qemu_cache_conf qemu_cache_conf = {
+ .dcache_bsize = 16,
+ .icache_bsize = 16
+};
+
+#if defined _AIX
+#include <sys/systemcfg.h>
+
+static void ppc_init_cacheline_sizes(void)
+{
+ qemu_cache_conf.icache_bsize = _system_configuration.icache_line;
+ qemu_cache_conf.dcache_bsize = _system_configuration.dcache_line;
+}
+
+#elif defined __linux__
+
+#define QEMU_AT_NULL 0
+#define QEMU_AT_DCACHEBSIZE 19
+#define QEMU_AT_ICACHEBSIZE 20
+
+static void ppc_init_cacheline_sizes(char **envp)
+{
+ unsigned long *auxv;
+
+ while (*envp++);
+
+ for (auxv = (unsigned long *) envp; *auxv != QEMU_AT_NULL; auxv += 2) {
+ switch (*auxv) {
+ case QEMU_AT_DCACHEBSIZE: qemu_cache_conf.dcache_bsize = auxv[1]; break;
+ case QEMU_AT_ICACHEBSIZE: qemu_cache_conf.icache_bsize = auxv[1]; break;
+ default: break;
+ }
+ }
+}
+
+#elif defined __APPLE__
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+static void ppc_init_cacheline_sizes(void)
+{
+ size_t len;
+ unsigned cacheline;
+ int name[2] = { CTL_HW, HW_CACHELINE };
+
+ len = sizeof(cacheline);
+ if (sysctl(name, 2, &cacheline, &len, NULL, 0)) {
+ perror("sysctl CTL_HW HW_CACHELINE failed");
+ } else {
+ qemu_cache_conf.dcache_bsize = cacheline;
+ qemu_cache_conf.icache_bsize = cacheline;
+ }
+}
+#endif
+
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+
+static void ppc_init_cacheline_sizes(void)
+{
+ size_t len = 4;
+ unsigned cacheline;
+
+ if (sysctlbyname ("machdep.cacheline_size", &cacheline, &len, NULL, 0)) {
+ fprintf(stderr, "sysctlbyname machdep.cacheline_size failed: %s\n",
+ strerror(errno));
+ exit(1);
+ }
+
+ qemu_cache_conf.dcache_bsize = cacheline;
+ qemu_cache_conf.icache_bsize = cacheline;
+}
+#endif
+
+#ifdef __linux__
+void qemu_cache_utils_init(char **envp)
+{
+ ppc_init_cacheline_sizes(envp);
+}
+#else
+void qemu_cache_utils_init(char **envp)
+{
+ (void) envp;
+ ppc_init_cacheline_sizes();
+}
+#endif
+
+#endif /* _ARCH_PPC */
diff --git a/qemu-0.15.x/cache-utils.h b/qemu-0.15.x/cache-utils.h
new file mode 100644
index 0000000..0b65907
--- /dev/null
+++ b/qemu-0.15.x/cache-utils.h
@@ -0,0 +1,41 @@
+#ifndef QEMU_CACHE_UTILS_H
+#define QEMU_CACHE_UTILS_H
+
+#if defined(_ARCH_PPC)
+struct qemu_cache_conf {
+ unsigned long dcache_bsize;
+ unsigned long icache_bsize;
+};
+
+extern struct qemu_cache_conf qemu_cache_conf;
+
+void qemu_cache_utils_init(char **envp);
+
+/* mildly adjusted code from tcg-dyngen.c */
+static inline void flush_icache_range(unsigned long start, unsigned long stop)
+{
+ unsigned long p, start1, stop1;
+ unsigned long dsize = qemu_cache_conf.dcache_bsize;
+ unsigned long isize = qemu_cache_conf.icache_bsize;
+
+ start1 = start & ~(dsize - 1);
+ stop1 = (stop + dsize - 1) & ~(dsize - 1);
+ for (p = start1; p < stop1; p += dsize) {
+ asm volatile ("dcbst 0,%0" : : "r"(p) : "memory");
+ }
+ asm volatile ("sync" : : : "memory");
+
+ start &= start & ~(isize - 1);
+ stop1 = (stop + isize - 1) & ~(isize - 1);
+ for (p = start1; p < stop1; p += isize) {
+ asm volatile ("icbi 0,%0" : : "r"(p) : "memory");
+ }
+ asm volatile ("sync" : : : "memory");
+ asm volatile ("isync" : : : "memory");
+}
+
+#else
+#define qemu_cache_utils_init(envp) do { (void) (envp); } while (0)
+#endif
+
+#endif /* QEMU_CACHE_UTILS_H */
diff --git a/qemu-0.15.x/check-qdict.c b/qemu-0.15.x/check-qdict.c
new file mode 100644
index 0000000..ecc7fd7
--- /dev/null
+++ b/qemu-0.15.x/check-qdict.c
@@ -0,0 +1,402 @@
+/*
+ * QDict unit-tests.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * Authors:
+ * Luiz Capitulino <lcapitulino(a)redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ */
+#include <check.h>
+
+#include "qint.h"
+#include "qdict.h"
+#include "qstring.h"
+#include "qemu-common.h"
+
+/*
+ * Public Interface test-cases
+ *
+ * (with some violations to access 'private' data)
+ */
+
+START_TEST(qdict_new_test)
+{
+ QDict *qdict;
+
+ qdict = qdict_new();
+ fail_unless(qdict != NULL);
+ fail_unless(qdict_size(qdict) == 0);
+ fail_unless(qdict->base.refcnt == 1);
+ fail_unless(qobject_type(QOBJECT(qdict)) == QTYPE_QDICT);
+
+ // destroy doesn't exit yet
+ free(qdict);
+}
+END_TEST
+
+START_TEST(qdict_put_obj_test)
+{
+ QInt *qi;
+ QDict *qdict;
+ QDictEntry *ent;
+ const int num = 42;
+
+ qdict = qdict_new();
+
+ // key "" will have tdb hash 12345
+ qdict_put_obj(qdict, "", QOBJECT(qint_from_int(num)));
+
+ fail_unless(qdict_size(qdict) == 1);
+ ent = QLIST_FIRST(&qdict->table[12345 % QDICT_BUCKET_MAX]);
+ qi = qobject_to_qint(ent->value);
+ fail_unless(qint_get_int(qi) == num);
+
+ // destroy doesn't exit yet
+ QDECREF(qi);
+ qemu_free(ent->key);
+ qemu_free(ent);
+ qemu_free(qdict);
+}
+END_TEST
+
+START_TEST(qdict_destroy_simple_test)
+{
+ QDict *qdict;
+
+ qdict = qdict_new();
+ qdict_put_obj(qdict, "num", QOBJECT(qint_from_int(0)));
+ qdict_put_obj(qdict, "str", QOBJECT(qstring_from_str("foo")));
+
+ QDECREF(qdict);
+}
+END_TEST
+
+static QDict *tests_dict = NULL;
+
+static void qdict_setup(void)
+{
+ tests_dict = qdict_new();
+ fail_unless(tests_dict != NULL);
+}
+
+static void qdict_teardown(void)
+{
+ QDECREF(tests_dict);
+ tests_dict = NULL;
+}
+
+START_TEST(qdict_get_test)
+{
+ QInt *qi;
+ QObject *obj;
+ const int value = -42;
+ const char *key = "test";
+
+ qdict_put(tests_dict, key, qint_from_int(value));
+
+ obj = qdict_get(tests_dict, key);
+ fail_unless(obj != NULL);
+
+ qi = qobject_to_qint(obj);
+ fail_unless(qint_get_int(qi) == value);
+}
+END_TEST
+
+START_TEST(qdict_get_int_test)
+{
+ int ret;
+ const int value = 100;
+ const char *key = "int";
+
+ qdict_put(tests_dict, key, qint_from_int(value));
+
+ ret = qdict_get_int(tests_dict, key);
+ fail_unless(ret == value);
+}
+END_TEST
+
+START_TEST(qdict_get_try_int_test)
+{
+ int ret;
+ const int value = 100;
+ const char *key = "int";
+
+ qdict_put(tests_dict, key, qint_from_int(value));
+
+ ret = qdict_get_try_int(tests_dict, key, 0);
+ fail_unless(ret == value);
+}
+END_TEST
+
+START_TEST(qdict_get_str_test)
+{
+ const char *p;
+ const char *key = "key";
+ const char *str = "string";
+
+ qdict_put(tests_dict, key, qstring_from_str(str));
+
+ p = qdict_get_str(tests_dict, key);
+ fail_unless(p != NULL);
+ fail_unless(strcmp(p, str) == 0);
+}
+END_TEST
+
+START_TEST(qdict_get_try_str_test)
+{
+ const char *p;
+ const char *key = "key";
+ const char *str = "string";
+
+ qdict_put(tests_dict, key, qstring_from_str(str));
+
+ p = qdict_get_try_str(tests_dict, key);
+ fail_unless(p != NULL);
+ fail_unless(strcmp(p, str) == 0);
+}
+END_TEST
+
+START_TEST(qdict_haskey_not_test)
+{
+ fail_unless(qdict_haskey(tests_dict, "test") == 0);
+}
+END_TEST
+
+START_TEST(qdict_haskey_test)
+{
+ const char *key = "test";
+
+ qdict_put(tests_dict, key, qint_from_int(0));
+ fail_unless(qdict_haskey(tests_dict, key) == 1);
+}
+END_TEST
+
+START_TEST(qdict_del_test)
+{
+ const char *key = "key test";
+
+ qdict_put(tests_dict, key, qstring_from_str("foo"));
+ fail_unless(qdict_size(tests_dict) == 1);
+
+ qdict_del(tests_dict, key);
+
+ fail_unless(qdict_size(tests_dict) == 0);
+ fail_unless(qdict_haskey(tests_dict, key) == 0);
+}
+END_TEST
+
+START_TEST(qobject_to_qdict_test)
+{
+ fail_unless(qobject_to_qdict(QOBJECT(tests_dict)) == tests_dict);
+}
+END_TEST
+
+START_TEST(qdict_iterapi_test)
+{
+ int count;
+ const QDictEntry *ent;
+
+ fail_unless(qdict_first(tests_dict) == NULL);
+
+ qdict_put(tests_dict, "key1", qint_from_int(1));
+ qdict_put(tests_dict, "key2", qint_from_int(2));
+ qdict_put(tests_dict, "key3", qint_from_int(3));
+
+ count = 0;
+ for (ent = qdict_first(tests_dict); ent; ent = qdict_next(tests_dict, ent)){
+ fail_unless(qdict_haskey(tests_dict, qdict_entry_key(ent)) == 1);
+ count++;
+ }
+
+ fail_unless(count == qdict_size(tests_dict));
+
+ /* Do it again to test restarting */
+ count = 0;
+ for (ent = qdict_first(tests_dict); ent; ent = qdict_next(tests_dict, ent)){
+ fail_unless(qdict_haskey(tests_dict, qdict_entry_key(ent)) == 1);
+ count++;
+ }
+
+ fail_unless(count == qdict_size(tests_dict));
+}
+END_TEST
+
+/*
+ * Errors test-cases
+ */
+
+START_TEST(qdict_put_exists_test)
+{
+ int value;
+ const char *key = "exists";
+
+ qdict_put(tests_dict, key, qint_from_int(1));
+ qdict_put(tests_dict, key, qint_from_int(2));
+
+ value = qdict_get_int(tests_dict, key);
+ fail_unless(value == 2);
+
+ fail_unless(qdict_size(tests_dict) == 1);
+}
+END_TEST
+
+START_TEST(qdict_get_not_exists_test)
+{
+ fail_unless(qdict_get(tests_dict, "foo") == NULL);
+}
+END_TEST
+
+/*
+ * Stress test-case
+ *
+ * This is a lot big for a unit-test, but there is no other place
+ * to have it.
+ */
+
+static void remove_dots(char *string)
+{
+ char *p = strchr(string, ':');
+ if (p)
+ *p = '\0';
+}
+
+static QString *read_line(FILE *file, char *key)
+{
+ char value[128];
+
+ if (fscanf(file, "%127s%127s", key, value) == EOF) {
+ return NULL;
+ }
+ remove_dots(key);
+ return qstring_from_str(value);
+}
+
+#define reset_file(file) fseek(file, 0L, SEEK_SET)
+
+START_TEST(qdict_stress_test)
+{
+ size_t lines;
+ char key[128];
+ FILE *test_file;
+ QDict *qdict;
+ QString *value;
+ const char *test_file_path = "qdict-test-data.txt";
+
+ test_file = fopen(test_file_path, "r");
+ fail_unless(test_file != NULL);
+
+ // Create the dict
+ qdict = qdict_new();
+ fail_unless(qdict != NULL);
+
+ // Add everything from the test file
+ for (lines = 0;; lines++) {
+ value = read_line(test_file, key);
+ if (!value)
+ break;
+
+ qdict_put(qdict, key, value);
+ }
+ fail_unless(qdict_size(qdict) == lines);
+
+ // Check if everything is really in there
+ reset_file(test_file);
+ for (;;) {
+ const char *str1, *str2;
+
+ value = read_line(test_file, key);
+ if (!value)
+ break;
+
+ str1 = qstring_get_str(value);
+
+ str2 = qdict_get_str(qdict, key);
+ fail_unless(str2 != NULL);
+
+ fail_unless(strcmp(str1, str2) == 0);
+
+ QDECREF(value);
+ }
+
+ // Delete everything
+ reset_file(test_file);
+ for (;;) {
+ value = read_line(test_file, key);
+ if (!value)
+ break;
+
+ qdict_del(qdict, key);
+ QDECREF(value);
+
+ fail_unless(qdict_haskey(qdict, key) == 0);
+ }
+ fclose(test_file);
+
+ fail_unless(qdict_size(qdict) == 0);
+ QDECREF(qdict);
+}
+END_TEST
+
+static Suite *qdict_suite(void)
+{
+ Suite *s;
+ TCase *qdict_public_tcase;
+ TCase *qdict_public2_tcase;
+ TCase *qdict_stress_tcase;
+ TCase *qdict_errors_tcase;
+
+ s = suite_create("QDict test-suite");
+
+ qdict_public_tcase = tcase_create("Public Interface");
+ suite_add_tcase(s, qdict_public_tcase);
+ tcase_add_test(qdict_public_tcase, qdict_new_test);
+ tcase_add_test(qdict_public_tcase, qdict_put_obj_test);
+ tcase_add_test(qdict_public_tcase, qdict_destroy_simple_test);
+
+ /* Continue, but now with fixtures */
+ qdict_public2_tcase = tcase_create("Public Interface (2)");
+ suite_add_tcase(s, qdict_public2_tcase);
+ tcase_add_checked_fixture(qdict_public2_tcase, qdict_setup, qdict_teardown);
+ tcase_add_test(qdict_public2_tcase, qdict_get_test);
+ tcase_add_test(qdict_public2_tcase, qdict_get_int_test);
+ tcase_add_test(qdict_public2_tcase, qdict_get_try_int_test);
+ tcase_add_test(qdict_public2_tcase, qdict_get_str_test);
+ tcase_add_test(qdict_public2_tcase, qdict_get_try_str_test);
+ tcase_add_test(qdict_public2_tcase, qdict_haskey_not_test);
+ tcase_add_test(qdict_public2_tcase, qdict_haskey_test);
+ tcase_add_test(qdict_public2_tcase, qdict_del_test);
+ tcase_add_test(qdict_public2_tcase, qobject_to_qdict_test);
+ tcase_add_test(qdict_public2_tcase, qdict_iterapi_test);
+
+ qdict_errors_tcase = tcase_create("Errors");
+ suite_add_tcase(s, qdict_errors_tcase);
+ tcase_add_checked_fixture(qdict_errors_tcase, qdict_setup, qdict_teardown);
+ tcase_add_test(qdict_errors_tcase, qdict_put_exists_test);
+ tcase_add_test(qdict_errors_tcase, qdict_get_not_exists_test);
+
+ /* The Big one */
+ qdict_stress_tcase = tcase_create("Stress Test");
+ suite_add_tcase(s, qdict_stress_tcase);
+ tcase_add_test(qdict_stress_tcase, qdict_stress_test);
+
+ return s;
+}
+
+int main(void)
+{
+ int nf;
+ Suite *s;
+ SRunner *sr;
+
+ s = qdict_suite();
+ sr = srunner_create(s);
+
+ srunner_run_all(sr, CK_NORMAL);
+ nf = srunner_ntests_failed(sr);
+ srunner_free(sr);
+
+ return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/qemu-0.15.x/check-qfloat.c b/qemu-0.15.x/check-qfloat.c
new file mode 100644
index 0000000..b71d983
--- /dev/null
+++ b/qemu-0.15.x/check-qfloat.c
@@ -0,0 +1,76 @@
+/*
+ * QFloat unit-tests.
+ *
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+#include <check.h>
+
+#include "qfloat.h"
+#include "qemu-common.h"
+
+/*
+ * Public Interface test-cases
+ *
+ * (with some violations to access 'private' data)
+ */
+
+START_TEST(qfloat_from_double_test)
+{
+ QFloat *qf;
+ const double value = -42.23423;
+
+ qf = qfloat_from_double(value);
+ fail_unless(qf != NULL);
+ fail_unless(qf->value == value);
+ fail_unless(qf->base.refcnt == 1);
+ fail_unless(qobject_type(QOBJECT(qf)) == QTYPE_QFLOAT);
+
+ // destroy doesn't exit yet
+ qemu_free(qf);
+}
+END_TEST
+
+START_TEST(qfloat_destroy_test)
+{
+ QFloat *qf = qfloat_from_double(0.0);
+ QDECREF(qf);
+}
+END_TEST
+
+static Suite *qfloat_suite(void)
+{
+ Suite *s;
+ TCase *qfloat_public_tcase;
+
+ s = suite_create("QFloat test-suite");
+
+ qfloat_public_tcase = tcase_create("Public Interface");
+ suite_add_tcase(s, qfloat_public_tcase);
+ tcase_add_test(qfloat_public_tcase, qfloat_from_double_test);
+ tcase_add_test(qfloat_public_tcase, qfloat_destroy_test);
+
+ return s;
+}
+
+int main(void)
+{
+ int nf;
+ Suite *s;
+ SRunner *sr;
+
+ s = qfloat_suite();
+ sr = srunner_create(s);
+
+ srunner_run_all(sr, CK_NORMAL);
+ nf = srunner_ntests_failed(sr);
+ srunner_free(sr);
+
+ return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/qemu-0.15.x/check-qint.c b/qemu-0.15.x/check-qint.c
new file mode 100644
index 0000000..f3b0316
--- /dev/null
+++ b/qemu-0.15.x/check-qint.c
@@ -0,0 +1,113 @@
+/*
+ * QInt unit-tests.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * Authors:
+ * Luiz Capitulino <lcapitulino(a)redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ */
+#include <check.h>
+
+#include "qint.h"
+#include "qemu-common.h"
+
+/*
+ * Public Interface test-cases
+ *
+ * (with some violations to access 'private' data)
+ */
+
+START_TEST(qint_from_int_test)
+{
+ QInt *qi;
+ const int value = -42;
+
+ qi = qint_from_int(value);
+ fail_unless(qi != NULL);
+ fail_unless(qi->value == value);
+ fail_unless(qi->base.refcnt == 1);
+ fail_unless(qobject_type(QOBJECT(qi)) == QTYPE_QINT);
+
+ // destroy doesn't exit yet
+ qemu_free(qi);
+}
+END_TEST
+
+START_TEST(qint_destroy_test)
+{
+ QInt *qi = qint_from_int(0);
+ QDECREF(qi);
+}
+END_TEST
+
+START_TEST(qint_from_int64_test)
+{
+ QInt *qi;
+ const int64_t value = 0x1234567890abcdefLL;
+
+ qi = qint_from_int(value);
+ fail_unless((int64_t) qi->value == value);
+
+ QDECREF(qi);
+}
+END_TEST
+
+START_TEST(qint_get_int_test)
+{
+ QInt *qi;
+ const int value = 123456;
+
+ qi = qint_from_int(value);
+ fail_unless(qint_get_int(qi) == value);
+
+ QDECREF(qi);
+}
+END_TEST
+
+START_TEST(qobject_to_qint_test)
+{
+ QInt *qi;
+
+ qi = qint_from_int(0);
+ fail_unless(qobject_to_qint(QOBJECT(qi)) == qi);
+
+ QDECREF(qi);
+}
+END_TEST
+
+static Suite *qint_suite(void)
+{
+ Suite *s;
+ TCase *qint_public_tcase;
+
+ s = suite_create("QInt test-suite");
+
+ qint_public_tcase = tcase_create("Public Interface");
+ suite_add_tcase(s, qint_public_tcase);
+ tcase_add_test(qint_public_tcase, qint_from_int_test);
+ tcase_add_test(qint_public_tcase, qint_destroy_test);
+ tcase_add_test(qint_public_tcase, qint_from_int64_test);
+ tcase_add_test(qint_public_tcase, qint_get_int_test);
+ tcase_add_test(qint_public_tcase, qobject_to_qint_test);
+
+ return s;
+}
+
+int main(void)
+{
+ int nf;
+ Suite *s;
+ SRunner *sr;
+
+ s = qint_suite();
+ sr = srunner_create(s);
+
+ srunner_run_all(sr, CK_NORMAL);
+ nf = srunner_ntests_failed(sr);
+ srunner_free(sr);
+
+ return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/qemu-0.15.x/check-qjson.c b/qemu-0.15.x/check-qjson.c
new file mode 100644
index 0000000..36d4ac2
--- /dev/null
+++ b/qemu-0.15.x/check-qjson.c
@@ -0,0 +1,795 @@
+/*
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ *
+ */
+#include <check.h>
+
+#include "qstring.h"
+#include "qint.h"
+#include "qdict.h"
+#include "qlist.h"
+#include "qfloat.h"
+#include "qbool.h"
+#include "qjson.h"
+
+#include "qemu-common.h"
+
+START_TEST(escaped_string)
+{
+ int i;
+ struct {
+ const char *encoded;
+ const char *decoded;
+ int skip;
+ } test_cases[] = {
+ { "\"\\b\"", "\b" },
+ { "\"\\f\"", "\f" },
+ { "\"\\n\"", "\n" },
+ { "\"\\r\"", "\r" },
+ { "\"\\t\"", "\t" },
+ { "\"/\"", "/" },
+ { "\"\\/\"", "/", .skip = 1 },
+ { "\"\\\\\"", "\\" },
+ { "\"\\\"\"", "\"" },
+ { "\"hello world \\\"embedded string\\\"\"",
+ "hello world \"embedded string\"" },
+ { "\"hello world\\nwith new line\"", "hello world\nwith new line" },
+ { "\"single byte utf-8 \\u0020\"", "single byte utf-8 ", .skip = 1 },
+ { "\"double byte utf-8 \\u00A2\"", "double byte utf-8 \xc2\xa2" },
+ { "\"triple byte utf-8 \\u20AC\"", "triple byte utf-8 \xe2\x82\xac" },
+ {}
+ };
+
+ for (i = 0; test_cases[i].encoded; i++) {
+ QObject *obj;
+ QString *str;
+
+ obj = qobject_from_json(test_cases[i].encoded);
+
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QSTRING);
+
+ str = qobject_to_qstring(obj);
+ fail_unless(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0,
+ "%s != %s\n", qstring_get_str(str), test_cases[i].decoded);
+
+ if (test_cases[i].skip == 0) {
+ str = qobject_to_json(obj);
+ fail_unless(strcmp(qstring_get_str(str),test_cases[i].encoded) == 0,
+ "%s != %s\n", qstring_get_str(str),
+ test_cases[i].encoded);
+
+ qobject_decref(obj);
+ }
+
+ QDECREF(str);
+ }
+}
+END_TEST
+
+START_TEST(simple_string)
+{
+ int i;
+ struct {
+ const char *encoded;
+ const char *decoded;
+ } test_cases[] = {
+ { "\"hello world\"", "hello world" },
+ { "\"the quick brown fox jumped over the fence\"",
+ "the quick brown fox jumped over the fence" },
+ {}
+ };
+
+ for (i = 0; test_cases[i].encoded; i++) {
+ QObject *obj;
+ QString *str;
+
+ obj = qobject_from_json(test_cases[i].encoded);
+
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QSTRING);
+
+ str = qobject_to_qstring(obj);
+ fail_unless(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
+
+ str = qobject_to_json(obj);
+ fail_unless(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
+
+ qobject_decref(obj);
+
+ QDECREF(str);
+ }
+}
+END_TEST
+
+START_TEST(single_quote_string)
+{
+ int i;
+ struct {
+ const char *encoded;
+ const char *decoded;
+ } test_cases[] = {
+ { "'hello world'", "hello world" },
+ { "'the quick brown fox \\' jumped over the fence'",
+ "the quick brown fox ' jumped over the fence" },
+ {}
+ };
+
+ for (i = 0; test_cases[i].encoded; i++) {
+ QObject *obj;
+ QString *str;
+
+ obj = qobject_from_json(test_cases[i].encoded);
+
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QSTRING);
+
+ str = qobject_to_qstring(obj);
+ fail_unless(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
+
+ QDECREF(str);
+ }
+}
+END_TEST
+
+START_TEST(vararg_string)
+{
+ int i;
+ struct {
+ const char *decoded;
+ } test_cases[] = {
+ { "hello world" },
+ { "the quick brown fox jumped over the fence" },
+ {}
+ };
+
+ for (i = 0; test_cases[i].decoded; i++) {
+ QObject *obj;
+ QString *str;
+
+ obj = qobject_from_jsonf("%s", test_cases[i].decoded);
+
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QSTRING);
+
+ str = qobject_to_qstring(obj);
+ fail_unless(strcmp(qstring_get_str(str), test_cases[i].decoded) == 0);
+
+ QDECREF(str);
+ }
+}
+END_TEST
+
+START_TEST(simple_number)
+{
+ int i;
+ struct {
+ const char *encoded;
+ int64_t decoded;
+ int skip;
+ } test_cases[] = {
+ { "0", 0 },
+ { "1234", 1234 },
+ { "1", 1 },
+ { "-32", -32 },
+ { "-0", 0, .skip = 1 },
+ { },
+ };
+
+ for (i = 0; test_cases[i].encoded; i++) {
+ QObject *obj;
+ QInt *qint;
+
+ obj = qobject_from_json(test_cases[i].encoded);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QINT);
+
+ qint = qobject_to_qint(obj);
+ fail_unless(qint_get_int(qint) == test_cases[i].decoded);
+ if (test_cases[i].skip == 0) {
+ QString *str;
+
+ str = qobject_to_json(obj);
+ fail_unless(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
+ QDECREF(str);
+ }
+
+ QDECREF(qint);
+ }
+}
+END_TEST
+
+START_TEST(float_number)
+{
+ int i;
+ struct {
+ const char *encoded;
+ double decoded;
+ int skip;
+ } test_cases[] = {
+ { "32.43", 32.43 },
+ { "0.222", 0.222 },
+ { "-32.12313", -32.12313 },
+ { "-32.20e-10", -32.20e-10, .skip = 1 },
+ { },
+ };
+
+ for (i = 0; test_cases[i].encoded; i++) {
+ QObject *obj;
+ QFloat *qfloat;
+
+ obj = qobject_from_json(test_cases[i].encoded);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QFLOAT);
+
+ qfloat = qobject_to_qfloat(obj);
+ fail_unless(qfloat_get_double(qfloat) == test_cases[i].decoded);
+
+ if (test_cases[i].skip == 0) {
+ QString *str;
+
+ str = qobject_to_json(obj);
+ fail_unless(strcmp(qstring_get_str(str), test_cases[i].encoded) == 0);
+ QDECREF(str);
+ }
+
+ QDECREF(qfloat);
+ }
+}
+END_TEST
+
+START_TEST(vararg_number)
+{
+ QObject *obj;
+ QInt *qint;
+ QFloat *qfloat;
+ int value = 0x2342;
+ int64_t value64 = 0x2342342343LL;
+ double valuef = 2.323423423;
+
+ obj = qobject_from_jsonf("%d", value);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QINT);
+
+ qint = qobject_to_qint(obj);
+ fail_unless(qint_get_int(qint) == value);
+
+ QDECREF(qint);
+
+ obj = qobject_from_jsonf("%" PRId64, value64);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QINT);
+
+ qint = qobject_to_qint(obj);
+ fail_unless(qint_get_int(qint) == value64);
+
+ QDECREF(qint);
+
+ obj = qobject_from_jsonf("%f", valuef);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QFLOAT);
+
+ qfloat = qobject_to_qfloat(obj);
+ fail_unless(qfloat_get_double(qfloat) == valuef);
+
+ QDECREF(qfloat);
+}
+END_TEST
+
+START_TEST(keyword_literal)
+{
+ QObject *obj;
+ QBool *qbool;
+ QString *str;
+
+ obj = qobject_from_json("true");
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QBOOL);
+
+ qbool = qobject_to_qbool(obj);
+ fail_unless(qbool_get_int(qbool) != 0);
+
+ str = qobject_to_json(obj);
+ fail_unless(strcmp(qstring_get_str(str), "true") == 0);
+ QDECREF(str);
+
+ QDECREF(qbool);
+
+ obj = qobject_from_json("false");
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QBOOL);
+
+ qbool = qobject_to_qbool(obj);
+ fail_unless(qbool_get_int(qbool) == 0);
+
+ str = qobject_to_json(obj);
+ fail_unless(strcmp(qstring_get_str(str), "false") == 0);
+ QDECREF(str);
+
+ QDECREF(qbool);
+
+ obj = qobject_from_jsonf("%i", false);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QBOOL);
+
+ qbool = qobject_to_qbool(obj);
+ fail_unless(qbool_get_int(qbool) == 0);
+
+ QDECREF(qbool);
+
+ obj = qobject_from_jsonf("%i", true);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QBOOL);
+
+ qbool = qobject_to_qbool(obj);
+ fail_unless(qbool_get_int(qbool) != 0);
+
+ QDECREF(qbool);
+}
+END_TEST
+
+typedef struct LiteralQDictEntry LiteralQDictEntry;
+typedef struct LiteralQObject LiteralQObject;
+
+struct LiteralQObject
+{
+ int type;
+ union {
+ int64_t qint;
+ const char *qstr;
+ LiteralQDictEntry *qdict;
+ LiteralQObject *qlist;
+ } value;
+};
+
+struct LiteralQDictEntry
+{
+ const char *key;
+ LiteralQObject value;
+};
+
+#define QLIT_QINT(val) (LiteralQObject){.type = QTYPE_QINT, .value.qint = (val)}
+#define QLIT_QSTR(val) (LiteralQObject){.type = QTYPE_QSTRING, .value.qstr = (val)}
+#define QLIT_QDICT(val) (LiteralQObject){.type = QTYPE_QDICT, .value.qdict = (val)}
+#define QLIT_QLIST(val) (LiteralQObject){.type = QTYPE_QLIST, .value.qlist = (val)}
+
+typedef struct QListCompareHelper
+{
+ int index;
+ LiteralQObject *objs;
+ int result;
+} QListCompareHelper;
+
+static int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs);
+
+static void compare_helper(QObject *obj, void *opaque)
+{
+ QListCompareHelper *helper = opaque;
+
+ if (helper->result == 0) {
+ return;
+ }
+
+ if (helper->objs[helper->index].type == QTYPE_NONE) {
+ helper->result = 0;
+ return;
+ }
+
+ helper->result = compare_litqobj_to_qobj(&helper->objs[helper->index++], obj);
+}
+
+static int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs)
+{
+ if (lhs->type != qobject_type(rhs)) {
+ return 0;
+ }
+
+ switch (lhs->type) {
+ case QTYPE_QINT:
+ return lhs->value.qint == qint_get_int(qobject_to_qint(rhs));
+ case QTYPE_QSTRING:
+ return (strcmp(lhs->value.qstr, qstring_get_str(qobject_to_qstring(rhs))) == 0);
+ case QTYPE_QDICT: {
+ int i;
+
+ for (i = 0; lhs->value.qdict[i].key; i++) {
+ QObject *obj = qdict_get(qobject_to_qdict(rhs), lhs->value.qdict[i].key);
+
+ if (!compare_litqobj_to_qobj(&lhs->value.qdict[i].value, obj)) {
+ return 0;
+ }
+ }
+
+ return 1;
+ }
+ case QTYPE_QLIST: {
+ QListCompareHelper helper;
+
+ helper.index = 0;
+ helper.objs = lhs->value.qlist;
+ helper.result = 1;
+
+ qlist_iter(qobject_to_qlist(rhs), compare_helper, &helper);
+
+ return helper.result;
+ }
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+START_TEST(simple_dict)
+{
+ int i;
+ struct {
+ const char *encoded;
+ LiteralQObject decoded;
+ } test_cases[] = {
+ {
+ .encoded = "{\"foo\": 42, \"bar\": \"hello world\"}",
+ .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
+ { "foo", QLIT_QINT(42) },
+ { "bar", QLIT_QSTR("hello world") },
+ { }
+ })),
+ }, {
+ .encoded = "{}",
+ .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
+ { }
+ })),
+ }, {
+ .encoded = "{\"foo\": 43}",
+ .decoded = QLIT_QDICT(((LiteralQDictEntry[]){
+ { "foo", QLIT_QINT(43) },
+ { }
+ })),
+ },
+ { }
+ };
+
+ for (i = 0; test_cases[i].encoded; i++) {
+ QObject *obj;
+ QString *str;
+
+ obj = qobject_from_json(test_cases[i].encoded);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QDICT);
+
+ fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
+
+ str = qobject_to_json(obj);
+ qobject_decref(obj);
+
+ obj = qobject_from_json(qstring_get_str(str));
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QDICT);
+
+ fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
+ qobject_decref(obj);
+ QDECREF(str);
+ }
+}
+END_TEST
+
+START_TEST(simple_list)
+{
+ int i;
+ struct {
+ const char *encoded;
+ LiteralQObject decoded;
+ } test_cases[] = {
+ {
+ .encoded = "[43,42]",
+ .decoded = QLIT_QLIST(((LiteralQObject[]){
+ QLIT_QINT(43),
+ QLIT_QINT(42),
+ { }
+ })),
+ },
+ {
+ .encoded = "[43]",
+ .decoded = QLIT_QLIST(((LiteralQObject[]){
+ QLIT_QINT(43),
+ { }
+ })),
+ },
+ {
+ .encoded = "[]",
+ .decoded = QLIT_QLIST(((LiteralQObject[]){
+ { }
+ })),
+ },
+ {
+ .encoded = "[{}]",
+ .decoded = QLIT_QLIST(((LiteralQObject[]){
+ QLIT_QDICT(((LiteralQDictEntry[]){
+ {},
+ })),
+ {},
+ })),
+ },
+ { }
+ };
+
+ for (i = 0; test_cases[i].encoded; i++) {
+ QObject *obj;
+ QString *str;
+
+ obj = qobject_from_json(test_cases[i].encoded);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QLIST);
+
+ fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
+
+ str = qobject_to_json(obj);
+ qobject_decref(obj);
+
+ obj = qobject_from_json(qstring_get_str(str));
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QLIST);
+
+ fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
+ qobject_decref(obj);
+ QDECREF(str);
+ }
+}
+END_TEST
+
+START_TEST(simple_whitespace)
+{
+ int i;
+ struct {
+ const char *encoded;
+ LiteralQObject decoded;
+ } test_cases[] = {
+ {
+ .encoded = " [ 43 , 42 ]",
+ .decoded = QLIT_QLIST(((LiteralQObject[]){
+ QLIT_QINT(43),
+ QLIT_QINT(42),
+ { }
+ })),
+ },
+ {
+ .encoded = " [ 43 , { 'h' : 'b' }, [ ], 42 ]",
+ .decoded = QLIT_QLIST(((LiteralQObject[]){
+ QLIT_QINT(43),
+ QLIT_QDICT(((LiteralQDictEntry[]){
+ { "h", QLIT_QSTR("b") },
+ { }})),
+ QLIT_QLIST(((LiteralQObject[]){
+ { }})),
+ QLIT_QINT(42),
+ { }
+ })),
+ },
+ {
+ .encoded = " [ 43 , { 'h' : 'b' , 'a' : 32 }, [ ], 42 ]",
+ .decoded = QLIT_QLIST(((LiteralQObject[]){
+ QLIT_QINT(43),
+ QLIT_QDICT(((LiteralQDictEntry[]){
+ { "h", QLIT_QSTR("b") },
+ { "a", QLIT_QINT(32) },
+ { }})),
+ QLIT_QLIST(((LiteralQObject[]){
+ { }})),
+ QLIT_QINT(42),
+ { }
+ })),
+ },
+ { }
+ };
+
+ for (i = 0; test_cases[i].encoded; i++) {
+ QObject *obj;
+ QString *str;
+
+ obj = qobject_from_json(test_cases[i].encoded);
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QLIST);
+
+ fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
+
+ str = qobject_to_json(obj);
+ qobject_decref(obj);
+
+ obj = qobject_from_json(qstring_get_str(str));
+ fail_unless(obj != NULL);
+ fail_unless(qobject_type(obj) == QTYPE_QLIST);
+
+ fail_unless(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1);
+
+ qobject_decref(obj);
+ QDECREF(str);
+ }
+}
+END_TEST
+
+START_TEST(simple_varargs)
+{
+ QObject *embedded_obj;
+ QObject *obj;
+ LiteralQObject decoded = QLIT_QLIST(((LiteralQObject[]){
+ QLIT_QINT(1),
+ QLIT_QINT(2),
+ QLIT_QLIST(((LiteralQObject[]){
+ QLIT_QINT(32),
+ QLIT_QINT(42),
+ {}})),
+ {}}));
+
+ embedded_obj = qobject_from_json("[32, 42]");
+ fail_unless(embedded_obj != NULL);
+
+ obj = qobject_from_jsonf("[%d, 2, %p]", 1, embedded_obj);
+ fail_unless(obj != NULL);
+
+ fail_unless(compare_litqobj_to_qobj(&decoded, obj) == 1);
+
+ qobject_decref(obj);
+}
+END_TEST
+
+START_TEST(empty_input)
+{
+ const char *empty = "";
+
+ QObject *obj = qobject_from_json(empty);
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+START_TEST(unterminated_string)
+{
+ QObject *obj = qobject_from_json("\"abc");
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+START_TEST(unterminated_sq_string)
+{
+ QObject *obj = qobject_from_json("'abc");
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+START_TEST(unterminated_escape)
+{
+ QObject *obj = qobject_from_json("\"abc\\\"");
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+START_TEST(unterminated_array)
+{
+ QObject *obj = qobject_from_json("[32");
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+START_TEST(unterminated_array_comma)
+{
+ QObject *obj = qobject_from_json("[32,");
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+START_TEST(invalid_array_comma)
+{
+ QObject *obj = qobject_from_json("[32,}");
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+START_TEST(unterminated_dict)
+{
+ QObject *obj = qobject_from_json("{'abc':32");
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+START_TEST(unterminated_dict_comma)
+{
+ QObject *obj = qobject_from_json("{'abc':32,");
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+#if 0
+START_TEST(invalid_dict_comma)
+{
+ QObject *obj = qobject_from_json("{'abc':32,}");
+ fail_unless(obj == NULL);
+}
+END_TEST
+
+START_TEST(unterminated_literal)
+{
+ QObject *obj = qobject_from_json("nul");
+ fail_unless(obj == NULL);
+}
+END_TEST
+#endif
+
+static Suite *qjson_suite(void)
+{
+ Suite *suite;
+ TCase *string_literals, *number_literals, *keyword_literals;
+ TCase *dicts, *lists, *whitespace, *varargs, *errors;
+
+ string_literals = tcase_create("String Literals");
+ tcase_add_test(string_literals, simple_string);
+ tcase_add_test(string_literals, escaped_string);
+ tcase_add_test(string_literals, single_quote_string);
+ tcase_add_test(string_literals, vararg_string);
+
+ number_literals = tcase_create("Number Literals");
+ tcase_add_test(number_literals, simple_number);
+ tcase_add_test(number_literals, float_number);
+ tcase_add_test(number_literals, vararg_number);
+
+ keyword_literals = tcase_create("Keywords");
+ tcase_add_test(keyword_literals, keyword_literal);
+ dicts = tcase_create("Objects");
+ tcase_add_test(dicts, simple_dict);
+ lists = tcase_create("Lists");
+ tcase_add_test(lists, simple_list);
+
+ whitespace = tcase_create("Whitespace");
+ tcase_add_test(whitespace, simple_whitespace);
+
+ varargs = tcase_create("Varargs");
+ tcase_add_test(varargs, simple_varargs);
+
+ errors = tcase_create("Invalid JSON");
+ tcase_add_test(errors, empty_input);
+ tcase_add_test(errors, unterminated_string);
+ tcase_add_test(errors, unterminated_escape);
+ tcase_add_test(errors, unterminated_sq_string);
+ tcase_add_test(errors, unterminated_array);
+ tcase_add_test(errors, unterminated_array_comma);
+ tcase_add_test(errors, invalid_array_comma);
+ tcase_add_test(errors, unterminated_dict);
+ tcase_add_test(errors, unterminated_dict_comma);
+#if 0
+ /* FIXME: this print parse error messages on stderr. */
+ tcase_add_test(errors, invalid_dict_comma);
+ tcase_add_test(errors, unterminated_literal);
+#endif
+
+ suite = suite_create("QJSON test-suite");
+ suite_add_tcase(suite, string_literals);
+ suite_add_tcase(suite, number_literals);
+ suite_add_tcase(suite, keyword_literals);
+ suite_add_tcase(suite, dicts);
+ suite_add_tcase(suite, lists);
+ suite_add_tcase(suite, whitespace);
+ suite_add_tcase(suite, varargs);
+ suite_add_tcase(suite, errors);
+
+ return suite;
+}
+
+int main(void)
+{
+ int nf;
+ Suite *s;
+ SRunner *sr;
+
+ s = qjson_suite();
+ sr = srunner_create(s);
+
+ srunner_run_all(sr, CK_NORMAL);
+ nf = srunner_ntests_failed(sr);
+ srunner_free(sr);
+
+ return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/qemu-0.15.x/check-qlist.c b/qemu-0.15.x/check-qlist.c
new file mode 100644
index 0000000..58984cb
--- /dev/null
+++ b/qemu-0.15.x/check-qlist.c
@@ -0,0 +1,153 @@
+/*
+ * QList unit-tests.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * Authors:
+ * Luiz Capitulino <lcapitulino(a)redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ */
+#include <check.h>
+
+#include "qint.h"
+#include "qlist.h"
+
+/*
+ * Public Interface test-cases
+ *
+ * (with some violations to access 'private' data)
+ */
+
+START_TEST(qlist_new_test)
+{
+ QList *qlist;
+
+ qlist = qlist_new();
+ fail_unless(qlist != NULL);
+ fail_unless(qlist->base.refcnt == 1);
+ fail_unless(qobject_type(QOBJECT(qlist)) == QTYPE_QLIST);
+
+ // destroy doesn't exist yet
+ qemu_free(qlist);
+}
+END_TEST
+
+START_TEST(qlist_append_test)
+{
+ QInt *qi;
+ QList *qlist;
+ QListEntry *entry;
+
+ qi = qint_from_int(42);
+
+ qlist = qlist_new();
+ qlist_append(qlist, qi);
+
+ entry = QTAILQ_FIRST(&qlist->head);
+ fail_unless(entry != NULL);
+ fail_unless(entry->value == QOBJECT(qi));
+
+ // destroy doesn't exist yet
+ QDECREF(qi);
+ qemu_free(entry);
+ qemu_free(qlist);
+}
+END_TEST
+
+START_TEST(qobject_to_qlist_test)
+{
+ QList *qlist;
+
+ qlist = qlist_new();
+
+ fail_unless(qobject_to_qlist(QOBJECT(qlist)) == qlist);
+
+ // destroy doesn't exist yet
+ qemu_free(qlist);
+}
+END_TEST
+
+START_TEST(qlist_destroy_test)
+{
+ int i;
+ QList *qlist;
+
+ qlist = qlist_new();
+
+ for (i = 0; i < 42; i++)
+ qlist_append(qlist, qint_from_int(i));
+
+ QDECREF(qlist);
+}
+END_TEST
+
+static int iter_called;
+static const int iter_max = 42;
+
+static void iter_func(QObject *obj, void *opaque)
+{
+ QInt *qi;
+
+ fail_unless(opaque == NULL);
+
+ qi = qobject_to_qint(obj);
+ fail_unless(qi != NULL);
+ fail_unless((qint_get_int(qi) >= 0) && (qint_get_int(qi) <= iter_max));
+
+ iter_called++;
+}
+
+START_TEST(qlist_iter_test)
+{
+ int i;
+ QList *qlist;
+
+ qlist = qlist_new();
+
+ for (i = 0; i < iter_max; i++)
+ qlist_append(qlist, qint_from_int(i));
+
+ iter_called = 0;
+ qlist_iter(qlist, iter_func, NULL);
+
+ fail_unless(iter_called == iter_max);
+
+ QDECREF(qlist);
+}
+END_TEST
+
+static Suite *QList_suite(void)
+{
+ Suite *s;
+ TCase *qlist_public_tcase;
+
+ s = suite_create("QList suite");
+
+ qlist_public_tcase = tcase_create("Public Interface");
+ suite_add_tcase(s, qlist_public_tcase);
+ tcase_add_test(qlist_public_tcase, qlist_new_test);
+ tcase_add_test(qlist_public_tcase, qlist_append_test);
+ tcase_add_test(qlist_public_tcase, qobject_to_qlist_test);
+ tcase_add_test(qlist_public_tcase, qlist_destroy_test);
+ tcase_add_test(qlist_public_tcase, qlist_iter_test);
+
+ return s;
+}
+
+int main(void)
+{
+ int nf;
+ Suite *s;
+ SRunner *sr;
+
+ s = QList_suite();
+ sr = srunner_create(s);
+
+ srunner_run_all(sr, CK_NORMAL);
+ nf = srunner_ntests_failed(sr);
+ srunner_free(sr);
+
+ return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/qemu-0.15.x/check-qstring.c b/qemu-0.15.x/check-qstring.c
new file mode 100644
index 0000000..c9bafc2
--- /dev/null
+++ b/qemu-0.15.x/check-qstring.c
@@ -0,0 +1,134 @@
+/*
+ * QString unit-tests.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * Authors:
+ * Luiz Capitulino <lcapitulino(a)redhat.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
+ * See the COPYING.LIB file in the top-level directory.
+ */
+#include <check.h>
+
+#include "qstring.h"
+#include "qemu-common.h"
+
+/*
+ * Public Interface test-cases
+ *
+ * (with some violations to access 'private' data)
+ */
+
+START_TEST(qstring_from_str_test)
+{
+ QString *qstring;
+ const char *str = "QEMU";
+
+ qstring = qstring_from_str(str);
+ fail_unless(qstring != NULL);
+ fail_unless(qstring->base.refcnt == 1);
+ fail_unless(strcmp(str, qstring->string) == 0);
+ fail_unless(qobject_type(QOBJECT(qstring)) == QTYPE_QSTRING);
+
+ // destroy doesn't exit yet
+ qemu_free(qstring->string);
+ qemu_free(qstring);
+}
+END_TEST
+
+START_TEST(qstring_destroy_test)
+{
+ QString *qstring = qstring_from_str("destroy test");
+ QDECREF(qstring);
+}
+END_TEST
+
+START_TEST(qstring_get_str_test)
+{
+ QString *qstring;
+ const char *ret_str;
+ const char *str = "QEMU/KVM";
+
+ qstring = qstring_from_str(str);
+ ret_str = qstring_get_str(qstring);
+ fail_unless(strcmp(ret_str, str) == 0);
+
+ QDECREF(qstring);
+}
+END_TEST
+
+START_TEST(qstring_append_chr_test)
+{
+ int i;
+ QString *qstring;
+ const char *str = "qstring append char unit-test";
+
+ qstring = qstring_new();
+
+ for (i = 0; str[i]; i++)
+ qstring_append_chr(qstring, str[i]);
+
+ fail_unless(strcmp(str, qstring_get_str(qstring)) == 0);
+ QDECREF(qstring);
+}
+END_TEST
+
+START_TEST(qstring_from_substr_test)
+{
+ QString *qs;
+
+ qs = qstring_from_substr("virtualization", 3, 9);
+ fail_unless(qs != NULL);
+ fail_unless(strcmp(qstring_get_str(qs), "tualiza") == 0);
+
+ QDECREF(qs);
+}
+END_TEST
+
+
+START_TEST(qobject_to_qstring_test)
+{
+ QString *qstring;
+
+ qstring = qstring_from_str("foo");
+ fail_unless(qobject_to_qstring(QOBJECT(qstring)) == qstring);
+
+ QDECREF(qstring);
+}
+END_TEST
+
+static Suite *qstring_suite(void)
+{
+ Suite *s;
+ TCase *qstring_public_tcase;
+
+ s = suite_create("QString test-suite");
+
+ qstring_public_tcase = tcase_create("Public Interface");
+ suite_add_tcase(s, qstring_public_tcase);
+ tcase_add_test(qstring_public_tcase, qstring_from_str_test);
+ tcase_add_test(qstring_public_tcase, qstring_destroy_test);
+ tcase_add_test(qstring_public_tcase, qstring_get_str_test);
+ tcase_add_test(qstring_public_tcase, qstring_append_chr_test);
+ tcase_add_test(qstring_public_tcase, qstring_from_substr_test);
+ tcase_add_test(qstring_public_tcase, qobject_to_qstring_test);
+
+ return s;
+}
+
+int main(void)
+{
+ int nf;
+ Suite *s;
+ SRunner *sr;
+
+ s = qstring_suite();
+ sr = srunner_create(s);
+
+ srunner_run_all(sr, CK_NORMAL);
+ nf = srunner_ntests_failed(sr);
+ srunner_free(sr);
+
+ return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/qemu-0.15.x/cmd.c b/qemu-0.15.x/cmd.c
new file mode 100644
index 0000000..ecca167
--- /dev/null
+++ b/qemu-0.15.x/cmd.c
@@ -0,0 +1,610 @@
+/*
+ * Copyright (c) 2003-2005 Silicon Graphics, Inc.
+ * All Rights Reserved.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it would 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <sys/time.h>
+#include <getopt.h>
+
+#include "cmd.h"
+#include "qemu-aio.h"
+
+#define _(x) x /* not gettext support yet */
+
+/* from libxcmd/command.c */
+
+cmdinfo_t *cmdtab;
+int ncmds;
+
+static argsfunc_t args_func;
+static checkfunc_t check_func;
+static int ncmdline;
+static char **cmdline;
+
+static int
+compare(const void *a, const void *b)
+{
+ return strcmp(((const cmdinfo_t *)a)->name,
+ ((const cmdinfo_t *)b)->name);
+}
+
+void
+add_command(
+ const cmdinfo_t *ci)
+{
+ cmdtab = realloc((void *)cmdtab, ++ncmds * sizeof(*cmdtab));
+ cmdtab[ncmds - 1] = *ci;
+ qsort(cmdtab, ncmds, sizeof(*cmdtab), compare);
+}
+
+static int
+check_command(
+ const cmdinfo_t *ci)
+{
+ if (check_func)
+ return check_func(ci);
+ return 1;
+}
+
+void
+add_check_command(
+ checkfunc_t cf)
+{
+ check_func = cf;
+}
+
+int
+command_usage(
+ const cmdinfo_t *ci)
+{
+ printf("%s %s -- %s\n", ci->name, ci->args, ci->oneline);
+ return 0;
+}
+
+int
+command(
+ const cmdinfo_t *ct,
+ int argc,
+ char **argv)
+{
+ char *cmd = argv[0];
+
+ if (!check_command(ct))
+ return 0;
+
+ if (argc-1 < ct->argmin || (ct->argmax != -1 && argc-1 > ct->argmax)) {
+ if (ct->argmax == -1)
+ fprintf(stderr,
+ _("bad argument count %d to %s, expected at least %d arguments\n"),
+ argc-1, cmd, ct->argmin);
+ else if (ct->argmin == ct->argmax)
+ fprintf(stderr,
+ _("bad argument count %d to %s, expected %d arguments\n"),
+ argc-1, cmd, ct->argmin);
+ else
+ fprintf(stderr,
+ _("bad argument count %d to %s, expected between %d and %d arguments\n"),
+ argc-1, cmd, ct->argmin, ct->argmax);
+ return 0;
+ }
+ optind = 0;
+ return ct->cfunc(argc, argv);
+}
+
+const cmdinfo_t *
+find_command(
+ const char *cmd)
+{
+ cmdinfo_t *ct;
+
+ for (ct = cmdtab; ct < &cmdtab[ncmds]; ct++) {
+ if (strcmp(ct->name, cmd) == 0 ||
+ (ct->altname && strcmp(ct->altname, cmd) == 0))
+ return (const cmdinfo_t *)ct;
+ }
+ return NULL;
+}
+
+void
+add_user_command(char *optarg)
+{
+ ncmdline++;
+ cmdline = realloc(cmdline, sizeof(char*) * (ncmdline));
+ if (!cmdline) {
+ perror("realloc");
+ exit(1);
+ }
+ cmdline[ncmdline-1] = optarg;
+}
+
+static int
+args_command(
+ int index)
+{
+ if (args_func)
+ return args_func(index);
+ return 0;
+}
+
+void
+add_args_command(
+ argsfunc_t af)
+{
+ args_func = af;
+}
+
+static void prep_fetchline(void *opaque)
+{
+ int *fetchable = opaque;
+
+ qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL);
+ *fetchable= 1;
+}
+
+static char *get_prompt(void);
+
+void
+command_loop(void)
+{
+ int c, i, j = 0, done = 0, fetchable = 0, prompted = 0;
+ char *input;
+ char **v;
+ const cmdinfo_t *ct;
+
+ for (i = 0; !done && i < ncmdline; i++) {
+ input = strdup(cmdline[i]);
+ if (!input) {
+ fprintf(stderr,
+ _("cannot strdup command '%s': %s\n"),
+ cmdline[i], strerror(errno));
+ exit(1);
+ }
+ v = breakline(input, &c);
+ if (c) {
+ ct = find_command(v[0]);
+ if (ct) {
+ if (ct->flags & CMD_FLAG_GLOBAL)
+ done = command(ct, c, v);
+ else {
+ j = 0;
+ while (!done && (j = args_command(j)))
+ done = command(ct, c, v);
+ }
+ } else
+ fprintf(stderr, _("command \"%s\" not found\n"),
+ v[0]);
+ }
+ doneline(input, v);
+ }
+ if (cmdline) {
+ free(cmdline);
+ return;
+ }
+
+ while (!done) {
+ if (!prompted) {
+ printf("%s", get_prompt());
+ fflush(stdout);
+ qemu_aio_set_fd_handler(STDIN_FILENO, prep_fetchline, NULL, NULL,
+ NULL, &fetchable);
+ prompted = 1;
+ }
+
+ qemu_aio_wait();
+
+ if (!fetchable) {
+ continue;
+ }
+ if ((input = fetchline()) == NULL)
+ break;
+ v = breakline(input, &c);
+ if (c) {
+ ct = find_command(v[0]);
+ if (ct)
+ done = command(ct, c, v);
+ else
+ fprintf(stderr, _("command \"%s\" not found\n"),
+ v[0]);
+ }
+ doneline(input, v);
+
+ prompted = 0;
+ fetchable = 0;
+ }
+ qemu_aio_set_fd_handler(STDIN_FILENO, NULL, NULL, NULL, NULL, NULL);
+}
+
+/* from libxcmd/input.c */
+
+#if defined(ENABLE_READLINE)
+# include <readline/history.h>
+# include <readline/readline.h>
+#elif defined(ENABLE_EDITLINE)
+# include <histedit.h>
+#endif
+
+static char *
+get_prompt(void)
+{
+ static char prompt[FILENAME_MAX + 2 /*"> "*/ + 1 /*"\0"*/ ];
+
+ if (!prompt[0])
+ snprintf(prompt, sizeof(prompt), "%s> ", progname);
+ return prompt;
+}
+
+#if defined(ENABLE_READLINE)
+char *
+fetchline(void)
+{
+ char *line;
+
+ line = readline(get_prompt());
+ if (line && *line)
+ add_history(line);
+ return line;
+}
+#elif defined(ENABLE_EDITLINE)
+static char *el_get_prompt(EditLine *e) { return get_prompt(); }
+char *
+fetchline(void)
+{
+ static EditLine *el;
+ static History *hist;
+ HistEvent hevent;
+ char *line;
+ int count;
+
+ if (!el) {
+ hist = history_init();
+ history(hist, &hevent, H_SETSIZE, 100);
+ el = el_init(progname, stdin, stdout, stderr);
+ el_source(el, NULL);
+ el_set(el, EL_SIGNAL, 1);
+ el_set(el, EL_PROMPT, el_get_prompt);
+ el_set(el, EL_HIST, history, (const char *)hist);
+ }
+ line = strdup(el_gets(el, &count));
+ if (line) {
+ if (count > 0)
+ line[count-1] = '\0';
+ if (*line)
+ history(hist, &hevent, H_ENTER, line);
+ }
+ return line;
+}
+#else
+# define MAXREADLINESZ 1024
+char *
+fetchline(void)
+{
+ char *p, *line = malloc(MAXREADLINESZ);
+
+ if (!line)
+ return NULL;
+ if (!fgets(line, MAXREADLINESZ, stdin)) {
+ free(line);
+ return NULL;
+ }
+ p = line + strlen(line);
+ if (p != line && p[-1] == '\n')
+ p[-1] = '\0';
+ return line;
+}
+#endif
+
+static char *qemu_strsep(char **input, const char *delim)
+{
+ char *result = *input;
+ if (result != NULL) {
+ char *p;
+
+ for (p = result; *p != '\0'; p++) {
+ if (strchr(delim, *p)) {
+ break;
+ }
+ }
+ if (*p == '\0') {
+ *input = NULL;
+ } else {
+ *p = '\0';
+ *input = p + 1;
+ }
+ }
+ return result;
+}
+
+char **
+breakline(
+ char *input,
+ int *count)
+{
+ int c = 0;
+ char *p;
+ char **rval = calloc(sizeof(char *), 1);
+
+ while (rval && (p = qemu_strsep(&input, " ")) != NULL) {
+ if (!*p)
+ continue;
+ c++;
+ rval = realloc(rval, sizeof(*rval) * (c + 1));
+ if (!rval) {
+ c = 0;
+ break;
+ }
+ rval[c - 1] = p;
+ rval[c] = NULL;
+ }
+ *count = c;
+ return rval;
+}
+
+void
+doneline(
+ char *input,
+ char **vec)
+{
+ free(input);
+ free(vec);
+}
+
+#define EXABYTES(x) ((long long)(x) << 60)
+#define PETABYTES(x) ((long long)(x) << 50)
+#define TERABYTES(x) ((long long)(x) << 40)
+#define GIGABYTES(x) ((long long)(x) << 30)
+#define MEGABYTES(x) ((long long)(x) << 20)
+#define KILOBYTES(x) ((long long)(x) << 10)
+
+long long
+cvtnum(
+ char *s)
+{
+ long long i;
+ char *sp;
+ int c;
+
+ i = strtoll(s, &sp, 0);
+ if (i == 0 && sp == s)
+ return -1LL;
+ if (*sp == '\0')
+ return i;
+
+ if (sp[1] != '\0')
+ return -1LL;
+
+ c = tolower(*sp);
+ switch (c) {
+ default:
+ return i;
+ case 'k':
+ return KILOBYTES(i);
+ case 'm':
+ return MEGABYTES(i);
+ case 'g':
+ return GIGABYTES(i);
+ case 't':
+ return TERABYTES(i);
+ case 'p':
+ return PETABYTES(i);
+ case 'e':
+ return EXABYTES(i);
+ }
+ return -1LL;
+}
+
+#define TO_EXABYTES(x) ((x) / EXABYTES(1))
+#define TO_PETABYTES(x) ((x) / PETABYTES(1))
+#define TO_TERABYTES(x) ((x) / TERABYTES(1))
+#define TO_GIGABYTES(x) ((x) / GIGABYTES(1))
+#define TO_MEGABYTES(x) ((x) / MEGABYTES(1))
+#define TO_KILOBYTES(x) ((x) / KILOBYTES(1))
+
+void
+cvtstr(
+ double value,
+ char *str,
+ size_t size)
+{
+ const char *fmt;
+ int precise;
+
+ precise = ((double)value * 1000 == (double)(int)value * 1000);
+
+ if (value >= EXABYTES(1)) {
+ fmt = precise ? "%.f EiB" : "%.3f EiB";
+ snprintf(str, size, fmt, TO_EXABYTES(value));
+ } else if (value >= PETABYTES(1)) {
+ fmt = precise ? "%.f PiB" : "%.3f PiB";
+ snprintf(str, size, fmt, TO_PETABYTES(value));
+ } else if (value >= TERABYTES(1)) {
+ fmt = precise ? "%.f TiB" : "%.3f TiB";
+ snprintf(str, size, fmt, TO_TERABYTES(value));
+ } else if (value >= GIGABYTES(1)) {
+ fmt = precise ? "%.f GiB" : "%.3f GiB";
+ snprintf(str, size, fmt, TO_GIGABYTES(value));
+ } else if (value >= MEGABYTES(1)) {
+ fmt = precise ? "%.f MiB" : "%.3f MiB";
+ snprintf(str, size, fmt, TO_MEGABYTES(value));
+ } else if (value >= KILOBYTES(1)) {
+ fmt = precise ? "%.f KiB" : "%.3f KiB";
+ snprintf(str, size, fmt, TO_KILOBYTES(value));
+ } else {
+ snprintf(str, size, "%f bytes", value);
+ }
+}
+
+struct timeval
+tsub(struct timeval t1, struct timeval t2)
+{
+ t1.tv_usec -= t2.tv_usec;
+ if (t1.tv_usec < 0) {
+ t1.tv_usec += 1000000;
+ t1.tv_sec--;
+ }
+ t1.tv_sec -= t2.tv_sec;
+ return t1;
+}
+
+double
+tdiv(double value, struct timeval tv)
+{
+ return value / ((double)tv.tv_sec + ((double)tv.tv_usec / 1000000.0));
+}
+
+#define HOURS(sec) ((sec) / (60 * 60))
+#define MINUTES(sec) (((sec) % (60 * 60)) / 60)
+#define SECONDS(sec) ((sec) % 60)
+
+void
+timestr(
+ struct timeval *tv,
+ char *ts,
+ size_t size,
+ int format)
+{
+ double usec = (double)tv->tv_usec / 1000000.0;
+
+ if (format & TERSE_FIXED_TIME) {
+ if (!HOURS(tv->tv_sec)) {
+ snprintf(ts, size, "%u:%02u.%02u",
+ (unsigned int) MINUTES(tv->tv_sec),
+ (unsigned int) SECONDS(tv->tv_sec),
+ (unsigned int) (usec * 100));
+ return;
+ }
+ format |= VERBOSE_FIXED_TIME; /* fallback if hours needed */
+ }
+
+ if ((format & VERBOSE_FIXED_TIME) || tv->tv_sec) {
+ snprintf(ts, size, "%u:%02u:%02u.%02u",
+ (unsigned int) HOURS(tv->tv_sec),
+ (unsigned int) MINUTES(tv->tv_sec),
+ (unsigned int) SECONDS(tv->tv_sec),
+ (unsigned int) (usec * 100));
+ } else {
+ snprintf(ts, size, "0.%04u sec", (unsigned int) (usec * 10000));
+ }
+}
+
+
+/* from libxcmd/quit.c */
+
+static cmdinfo_t quit_cmd;
+
+/* ARGSUSED */
+static int
+quit_f(
+ int argc,
+ char **argv)
+{
+ return 1;
+}
+
+void
+quit_init(void)
+{
+ quit_cmd.name = _("quit");
+ quit_cmd.altname = _("q");
+ quit_cmd.cfunc = quit_f;
+ quit_cmd.argmin = -1;
+ quit_cmd.argmax = -1;
+ quit_cmd.flags = CMD_FLAG_GLOBAL;
+ quit_cmd.oneline = _("exit the program");
+
+ add_command(&quit_cmd);
+}
+
+/* from libxcmd/help.c */
+
+static cmdinfo_t help_cmd;
+static void help_onecmd(const char *cmd, const cmdinfo_t *ct);
+static void help_oneline(const char *cmd, const cmdinfo_t *ct);
+
+static void
+help_all(void)
+{
+ const cmdinfo_t *ct;
+
+ for (ct = cmdtab; ct < &cmdtab[ncmds]; ct++)
+ help_oneline(ct->name, ct);
+ printf(_("\nUse 'help commandname' for extended help.\n"));
+}
+
+static int
+help_f(
+ int argc,
+ char **argv)
+{
+ const cmdinfo_t *ct;
+
+ if (argc == 1) {
+ help_all();
+ return 0;
+ }
+ ct = find_command(argv[1]);
+ if (ct == NULL) {
+ printf(_("command %s not found\n"), argv[1]);
+ return 0;
+ }
+ help_onecmd(argv[1], ct);
+ return 0;
+}
+
+static void
+help_onecmd(
+ const char *cmd,
+ const cmdinfo_t *ct)
+{
+ help_oneline(cmd, ct);
+ if (ct->help)
+ ct->help();
+}
+
+static void
+help_oneline(
+ const char *cmd,
+ const cmdinfo_t *ct)
+{
+ if (cmd)
+ printf("%s ", cmd);
+ else {
+ printf("%s ", ct->name);
+ if (ct->altname)
+ printf("(or %s) ", ct->altname);
+ }
+ if (ct->args)
+ printf("%s ", ct->args);
+ printf("-- %s\n", ct->oneline);
+}
+
+void
+help_init(void)
+{
+ help_cmd.name = _("help");
+ help_cmd.altname = _("?");
+ help_cmd.cfunc = help_f;
+ help_cmd.argmin = 0;
+ help_cmd.argmax = 1;
+ help_cmd.flags = CMD_FLAG_GLOBAL;
+ help_cmd.args = _("[command]");
+ help_cmd.oneline = _("help for one or all commands");
+
+ add_command(&help_cmd);
+}
diff --git a/qemu-0.15.x/cmd.h b/qemu-0.15.x/cmd.h
new file mode 100644
index 0000000..b763b19
--- /dev/null
+++ b/qemu-0.15.x/cmd.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2000-2005 Silicon Graphics, Inc.
+ * All Rights Reserved.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it would 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 <http://www.gnu.org/licenses/>.
+ */
+#ifndef __COMMAND_H__
+#define __COMMAND_H__
+
+#define CMD_FLAG_GLOBAL ((int)0x80000000) /* don't iterate "args" */
+
+typedef int (*cfunc_t)(int argc, char **argv);
+typedef void (*helpfunc_t)(void);
+
+typedef struct cmdinfo {
+ const char *name;
+ const char *altname;
+ cfunc_t cfunc;
+ int argmin;
+ int argmax;
+ int canpush;
+ int flags;
+ const char *args;
+ const char *oneline;
+ helpfunc_t help;
+} cmdinfo_t;
+
+extern cmdinfo_t *cmdtab;
+extern int ncmds;
+
+void help_init(void);
+void quit_init(void);
+
+typedef int (*argsfunc_t)(int index);
+typedef int (*checkfunc_t)(const cmdinfo_t *ci);
+
+void add_command(const cmdinfo_t *ci);
+void add_user_command(char *optarg);
+void add_args_command(argsfunc_t af);
+void add_check_command(checkfunc_t cf);
+
+const cmdinfo_t *find_command(const char *cmd);
+
+void command_loop(void);
+int command_usage(const cmdinfo_t *ci);
+int command(const cmdinfo_t *ci, int argc, char **argv);
+
+/* from input.h */
+char **breakline(char *input, int *count);
+void doneline(char *input, char **vec);
+char *fetchline(void);
+
+long long cvtnum(char *s);
+void cvtstr(double value, char *str, size_t sz);
+
+struct timeval tsub(struct timeval t1, struct timeval t2);
+double tdiv(double value, struct timeval tv);
+
+enum {
+ DEFAULT_TIME = 0x0,
+ TERSE_FIXED_TIME = 0x1,
+ VERBOSE_FIXED_TIME = 0x2
+};
+
+void timestr(struct timeval *tv, char *str, size_t sz, int flags);
+
+extern char *progname;
+
+#endif /* __COMMAND_H__ */
diff --git a/qemu-0.15.x/compatfd.c b/qemu-0.15.x/compatfd.c
new file mode 100644
index 0000000..31654c6
--- /dev/null
+++ b/qemu-0.15.x/compatfd.c
@@ -0,0 +1,128 @@
+/*
+ * signalfd/eventfd compatibility
+ *
+ * Copyright IBM, Corp. 2008
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-common.h"
+#include "compatfd.h"
+
+#include <sys/syscall.h>
+#include <pthread.h>
+
+struct sigfd_compat_info
+{
+ sigset_t mask;
+ int fd;
+};
+
+static void *sigwait_compat(void *opaque)
+{
+ struct sigfd_compat_info *info = opaque;
+ sigset_t all;
+
+ sigfillset(&all);
+ pthread_sigmask(SIG_BLOCK, &all, NULL);
+
+ while (1) {
+ int sig;
+ int err;
+
+ err = sigwait(&info->mask, &sig);
+ if (err != 0) {
+ if (errno == EINTR) {
+ continue;
+ } else {
+ return NULL;
+ }
+ } else {
+ struct qemu_signalfd_siginfo buffer;
+ size_t offset = 0;
+
+ memset(&buffer, 0, sizeof(buffer));
+ buffer.ssi_signo = sig;
+
+ while (offset < sizeof(buffer)) {
+ ssize_t len;
+
+ len = write(info->fd, (char *)&buffer + offset,
+ sizeof(buffer) - offset);
+ if (len == -1 && errno == EINTR)
+ continue;
+
+ if (len <= 0) {
+ return NULL;
+ }
+
+ offset += len;
+ }
+ }
+ }
+}
+
+static int qemu_signalfd_compat(const sigset_t *mask)
+{
+ pthread_attr_t attr;
+ pthread_t tid;
+ struct sigfd_compat_info *info;
+ int fds[2];
+
+ info = malloc(sizeof(*info));
+ if (info == NULL) {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ if (pipe(fds) == -1) {
+ free(info);
+ return -1;
+ }
+
+ qemu_set_cloexec(fds[0]);
+ qemu_set_cloexec(fds[1]);
+
+ memcpy(&info->mask, mask, sizeof(*mask));
+ info->fd = fds[1];
+
+ pthread_attr_init(&attr);
+ pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
+
+ pthread_create(&tid, &attr, sigwait_compat, info);
+
+ pthread_attr_destroy(&attr);
+
+ return fds[0];
+}
+
+int qemu_signalfd(const sigset_t *mask)
+{
+#if defined(CONFIG_SIGNALFD)
+ int ret;
+
+ ret = syscall(SYS_signalfd, -1, mask, _NSIG / 8);
+ if (ret != -1) {
+ qemu_set_cloexec(ret);
+ return ret;
+ }
+#endif
+
+ return qemu_signalfd_compat(mask);
+}
+
+bool qemu_signalfd_available(void)
+{
+#ifdef CONFIG_SIGNALFD
+ errno = 0;
+ syscall(SYS_signalfd, -1, NULL, _NSIG / 8);
+ return errno != ENOSYS;
+#else
+ return false;
+#endif
+}
diff --git a/qemu-0.15.x/compatfd.h b/qemu-0.15.x/compatfd.h
new file mode 100644
index 0000000..6b04877
--- /dev/null
+++ b/qemu-0.15.x/compatfd.h
@@ -0,0 +1,44 @@
+/*
+ * signalfd/eventfd compatibility
+ *
+ * Copyright IBM, Corp. 2008
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_COMPATFD_H
+#define QEMU_COMPATFD_H
+
+#include <signal.h>
+
+struct qemu_signalfd_siginfo {
+ uint32_t ssi_signo; /* Signal number */
+ int32_t ssi_errno; /* Error number (unused) */
+ int32_t ssi_code; /* Signal code */
+ uint32_t ssi_pid; /* PID of sender */
+ uint32_t ssi_uid; /* Real UID of sender */
+ int32_t ssi_fd; /* File descriptor (SIGIO) */
+ uint32_t ssi_tid; /* Kernel timer ID (POSIX timers) */
+ uint32_t ssi_band; /* Band event (SIGIO) */
+ uint32_t ssi_overrun; /* POSIX timer overrun count */
+ uint32_t ssi_trapno; /* Trap number that caused signal */
+ int32_t ssi_status; /* Exit status or signal (SIGCHLD) */
+ int32_t ssi_int; /* Integer sent by sigqueue(2) */
+ uint64_t ssi_ptr; /* Pointer sent by sigqueue(2) */
+ uint64_t ssi_utime; /* User CPU time consumed (SIGCHLD) */
+ uint64_t ssi_stime; /* System CPU time consumed (SIGCHLD) */
+ uint64_t ssi_addr; /* Address that generated signal
+ (for hardware-generated signals) */
+ uint8_t pad[48]; /* Pad size to 128 bytes (allow for
+ additional fields in the future) */
+};
+
+int qemu_signalfd(const sigset_t *mask);
+bool qemu_signalfd_available(void);
+
+#endif
diff --git a/qemu-0.15.x/compiler.h b/qemu-0.15.x/compiler.h
new file mode 100644
index 0000000..9af5dc6
--- /dev/null
+++ b/qemu-0.15.x/compiler.h
@@ -0,0 +1,34 @@
+/* public domain */
+
+#ifndef COMPILER_H
+#define COMPILER_H
+
+#include "config-host.h"
+
+#define QEMU_NORETURN __attribute__ ((__noreturn__))
+#ifdef CONFIG_GCC_ATTRIBUTE_WARN_UNUSED_RESULT
+#define QEMU_WARN_UNUSED_RESULT __attribute__((warn_unused_result))
+#else
+#define QEMU_WARN_UNUSED_RESULT
+#endif
+
+#define QEMU_BUILD_BUG_ON(x) \
+ typedef char qemu_build_bug_on__##__LINE__[(x)?-1:1];
+
+#if defined __GNUC__
+# if (__GNUC__ < 4) || \
+ defined(__GNUC_MINOR__) && (__GNUC__ == 4) && (__GNUC_MINOR__ < 4)
+ /* gcc versions before 4.4.x don't support gnu_printf, so use printf. */
+# define GCC_ATTR __attribute__((__unused__, format(printf, 1, 2)))
+# define GCC_FMT_ATTR(n, m) __attribute__((format(printf, n, m)))
+# else
+ /* Use gnu_printf when supported (qemu uses standard format strings). */
+# define GCC_ATTR __attribute__((__unused__, format(gnu_printf, 1, 2)))
+# define GCC_FMT_ATTR(n, m) __attribute__((format(gnu_printf, n, m)))
+# endif
+#else
+#define GCC_ATTR /**/
+#define GCC_FMT_ATTR(n, m)
+#endif
+
+#endif /* COMPILER_H */
diff --git a/qemu-0.15.x/config.h b/qemu-0.15.x/config.h
new file mode 100644
index 0000000..e20f786
--- /dev/null
+++ b/qemu-0.15.x/config.h
@@ -0,0 +1,2 @@
+#include "config-host.h"
+#include "config-target.h"
diff --git a/qemu-0.15.x/configure b/qemu-0.15.x/configure
new file mode 100755
index 0000000..29d6212
--- /dev/null
+++ b/qemu-0.15.x/configure
@@ -0,0 +1,3637 @@
+#!/bin/sh
+#
+# qemu configure script (c) 2003 Fabrice Bellard
+#
+# set temporary file name
+if test ! -z "$TMPDIR" ; then
+ TMPDIR1="${TMPDIR}"
+elif test ! -z "$TEMPDIR" ; then
+ TMPDIR1="${TEMPDIR}"
+else
+ TMPDIR1="/tmp"
+fi
+
+TMPC="${TMPDIR1}/qemu-conf-${RANDOM}-$$-${RANDOM}.c"
+TMPO="${TMPDIR1}/qemu-conf-${RANDOM}-$$-${RANDOM}.o"
+TMPE="${TMPDIR1}/qemu-conf-${RANDOM}-$$-${RANDOM}.exe"
+
+# NB: do not call "exit" in the trap handler; this is buggy with some shells;
+# see <1285349658-3122-1-git-send-email-loic.minier(a)linaro.org>
+trap "rm -f $TMPC $TMPO $TMPE" EXIT INT QUIT TERM
+rm -f config.log
+
+compile_object() {
+ echo $cc $QEMU_CFLAGS -c -o $TMPO $TMPC >> config.log
+ $cc $QEMU_CFLAGS -c -o $TMPO $TMPC >> config.log 2>&1
+}
+
+compile_prog() {
+ local_cflags="$1"
+ local_ldflags="$2"
+ echo $cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags >> config.log
+ $cc $QEMU_CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags >> config.log 2>&1
+}
+
+# symbolically link $1 to $2. Portable version of "ln -sf".
+symlink() {
+ rm -f $2
+ ln -s $1 $2
+}
+
+# check whether a command is available to this shell (may be either an
+# executable or a builtin)
+has() {
+ type "$1" >/dev/null 2>&1
+}
+
+# search for an executable in PATH
+path_of() {
+ local_command="$1"
+ local_ifs="$IFS"
+ local_dir=""
+
+ # pathname has a dir component?
+ if [ "${local_command#*/}" != "$local_command" ]; then
+ if [ -x "$local_command" ] && [ ! -d "$local_command" ]; then
+ echo "$local_command"
+ return 0
+ fi
+ fi
+ if [ -z "$local_command" ]; then
+ return 1
+ fi
+
+ IFS=:
+ for local_dir in $PATH; do
+ if [ -x "$local_dir/$local_command" ] && [ ! -d "$local_dir/$local_command" ]; then
+ echo "$local_dir/$local_command"
+ IFS="${local_ifs:-$(printf ' \t\n')}"
+ return 0
+ fi
+ done
+ # not found
+ IFS="${local_ifs:-$(printf ' \t\n')}"
+ return 1
+}
+
+# default parameters
+source_path=`dirname "$0"`
+cpu=""
+interp_prefix="/usr/gnemul/qemu-%M"
+static="no"
+sparc_cpu=""
+cross_prefix=""
+audio_drv_list=""
+audio_card_list="ac97 es1370 sb16 hda"
+audio_possible_cards="ac97 es1370 sb16 cs4231a adlib gus hda"
+block_drv_whitelist=""
+host_cc="gcc"
+helper_cflags=""
+libs_softmmu=""
+libs_tools=""
+audio_pt_int=""
+audio_win_int=""
+cc_i386=i386-pc-linux-gnu-gcc
+
+target_list=""
+
+# Default value for a variable defining feature "foo".
+# * foo="no" feature will only be used if --enable-foo arg is given
+# * foo="" feature will be searched for, and if found, will be used
+# unless --disable-foo is given
+# * foo="yes" this value will only be set by --enable-foo flag.
+# feature will searched for,
+# if not found, configure exits with error
+#
+# Always add --enable-foo and --disable-foo command line args.
+# Distributions want to ensure that several features are compiled in, and it
+# is impossible without a --enable-foo that exits if a feature is not found.
+
+bluez=""
+brlapi=""
+curl=""
+curses=""
+docs=""
+fdt=""
+kvm=""
+nptl=""
+sdl=""
+vnc="yes"
+sparse="no"
+uuid=""
+vde=""
+vnc_tls=""
+vnc_sasl=""
+vnc_jpeg=""
+vnc_png=""
+vnc_thread="no"
+xen=""
+xen_ctrl_version=""
+linux_aio=""
+attr=""
+vhost_net=""
+xfs=""
+
+gprof="no"
+debug_tcg="no"
+debug_mon="no"
+debug="no"
+strip_opt="yes"
+bigendian="no"
+mingw32="no"
+EXESUF=""
+prefix="/usr/local"
+mandir="\${prefix}/share/man"
+datadir="\${prefix}/share/qemu"
+docdir="\${prefix}/share/doc/qemu"
+bindir="\${prefix}/bin"
+libdir="\${prefix}/lib"
+sysconfdir="\${prefix}/etc"
+confsuffix="/qemu"
+slirp="yes"
+fmod_lib=""
+fmod_inc=""
+oss_lib=""
+bsd="no"
+linux="no"
+solaris="no"
+profiler="no"
+cocoa="no"
+softmmu="yes"
+linux_user="no"
+darwin_user="no"
+bsd_user="no"
+guest_base=""
+uname_release=""
+io_thread="no"
+mixemu="no"
+aix="no"
+blobs="yes"
+pkgversion=""
+check_utests="no"
+user_pie="no"
+zero_malloc=""
+trace_backend="nop"
+trace_file="trace"
+spice=""
+rbd=""
+smartcard=""
+smartcard_nss=""
+usb_redir=""
+opengl=""
+guest_agent="yes"
+
+# parse CC options first
+for opt do
+ optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
+ case "$opt" in
+ --cross-prefix=*) cross_prefix="$optarg"
+ ;;
+ --cc=*) CC="$optarg"
+ ;;
+ --source-path=*) source_path="$optarg"
+ ;;
+ --cpu=*) cpu="$optarg"
+ ;;
+ --extra-cflags=*) QEMU_CFLAGS="$optarg $QEMU_CFLAGS"
+ ;;
+ --extra-ldflags=*) LDFLAGS="$optarg $LDFLAGS"
+ ;;
+ --sparc_cpu=*)
+ sparc_cpu="$optarg"
+ case $sparc_cpu in
+ v7|v8|v8plus|v8plusa)
+ cpu="sparc"
+ ;;
+ v9)
+ cpu="sparc64"
+ ;;
+ *)
+ echo "undefined SPARC architecture. Exiting";
+ exit 1
+ ;;
+ esac
+ ;;
+ esac
+done
+# OS specific
+# Using uname is really, really broken. Once we have the right set of checks
+# we can eliminate it's usage altogether
+
+cc="${cross_prefix}${CC-gcc}"
+ar="${cross_prefix}${AR-ar}"
+objcopy="${cross_prefix}${OBJCOPY-objcopy}"
+ld="${cross_prefix}${LD-ld}"
+strip="${cross_prefix}${STRIP-strip}"
+windres="${cross_prefix}${WINDRES-windres}"
+pkg_config="${cross_prefix}${PKG_CONFIG-pkg-config}"
+sdl_config="${cross_prefix}${SDL_CONFIG-sdl-config}"
+
+# default flags for all hosts
+QEMU_CFLAGS="-fno-strict-aliasing $QEMU_CFLAGS"
+CFLAGS="-g $CFLAGS"
+QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS"
+QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS"
+QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS"
+QEMU_CFLAGS="-D_FORTIFY_SOURCE=2 $QEMU_CFLAGS"
+QEMU_INCLUDES="-I. -I\$(SRC_PATH)"
+LDFLAGS="-g $LDFLAGS"
+
+# make source path absolute
+source_path=`cd "$source_path"; pwd`
+
+check_define() {
+cat > $TMPC <<EOF
+#if !defined($1)
+#error Not defined
+#endif
+int main(void) { return 0; }
+EOF
+ compile_object
+}
+
+if test ! -z "$cpu" ; then
+ # command line argument
+ :
+elif check_define __i386__ ; then
+ cpu="i386"
+elif check_define __x86_64__ ; then
+ cpu="x86_64"
+elif check_define __sparc__ ; then
+ # We can't check for 64 bit (when gcc is biarch) or V8PLUSA
+ # They must be specified using --sparc_cpu
+ if check_define __arch64__ ; then
+ cpu="sparc64"
+ else
+ cpu="sparc"
+ fi
+elif check_define _ARCH_PPC ; then
+ if check_define _ARCH_PPC64 ; then
+ cpu="ppc64"
+ else
+ cpu="ppc"
+ fi
+elif check_define __mips__ ; then
+ cpu="mips"
+elif check_define __ia64__ ; then
+ cpu="ia64"
+elif check_define __s390__ ; then
+ if check_define __s390x__ ; then
+ cpu="s390x"
+ else
+ cpu="s390"
+ fi
+else
+ cpu=`uname -m`
+fi
+
+case "$cpu" in
+ alpha|cris|ia64|lm32|m68k|microblaze|ppc|ppc64|sparc64|unicore32)
+ cpu="$cpu"
+ ;;
+ i386|i486|i586|i686|i86pc|BePC)
+ cpu="i386"
+ ;;
+ x86_64|amd64)
+ cpu="x86_64"
+ ;;
+ armv*b)
+ cpu="armv4b"
+ ;;
+ armv*l)
+ cpu="armv4l"
+ ;;
+ parisc|parisc64)
+ cpu="hppa"
+ ;;
+ mips*)
+ cpu="mips"
+ ;;
+ s390)
+ cpu="s390"
+ ;;
+ s390x)
+ cpu="s390x"
+ ;;
+ sparc|sun4[cdmuv])
+ cpu="sparc"
+ ;;
+ *)
+ echo "Unsupported CPU = $cpu"
+ exit 1
+ ;;
+esac
+
+# OS specific
+if check_define __linux__ ; then
+ targetos="Linux"
+elif check_define _WIN32 ; then
+ targetos='MINGW32'
+elif check_define __OpenBSD__ ; then
+ targetos='OpenBSD'
+elif check_define __sun__ ; then
+ targetos='SunOS'
+elif check_define __HAIKU__ ; then
+ targetos='Haiku'
+else
+ targetos=`uname -s`
+fi
+
+case $targetos in
+CYGWIN*)
+ mingw32="yes"
+ QEMU_CFLAGS="-mno-cygwin $QEMU_CFLAGS"
+ audio_possible_drivers="winwave sdl"
+ audio_drv_list="winwave"
+;;
+MINGW32*)
+ mingw32="yes"
+ audio_possible_drivers="winwave dsound sdl fmod"
+ audio_drv_list="winwave"
+;;
+GNU/kFreeBSD)
+ bsd="yes"
+ audio_drv_list="oss"
+ audio_possible_drivers="oss sdl esd pa"
+;;
+FreeBSD)
+ bsd="yes"
+ make="${MAKE-gmake}"
+ audio_drv_list="oss"
+ audio_possible_drivers="oss sdl esd pa"
+ # needed for kinfo_getvmmap(3) in libutil.h
+ LIBS="-lutil $LIBS"
+;;
+DragonFly)
+ bsd="yes"
+ make="${MAKE-gmake}"
+ audio_drv_list="oss"
+ audio_possible_drivers="oss sdl esd pa"
+;;
+NetBSD)
+ bsd="yes"
+ make="${MAKE-gmake}"
+ audio_drv_list="oss"
+ audio_possible_drivers="oss sdl esd"
+ oss_lib="-lossaudio"
+;;
+OpenBSD)
+ bsd="yes"
+ make="${MAKE-gmake}"
+ audio_drv_list="oss"
+ audio_possible_drivers="oss sdl esd"
+ oss_lib="-lossaudio"
+;;
+Darwin)
+ bsd="yes"
+ darwin="yes"
+ # on Leopard most of the system is 32-bit, so we have to ask the kernel it if we can
+ # run 64-bit userspace code
+ if [ "$cpu" = "i386" ] ; then
+ is_x86_64=`sysctl -n hw.optional.x86_64`
+ [ "$is_x86_64" = "1" ] && cpu=x86_64
+ fi
+ if [ "$cpu" = "x86_64" ] ; then
+ QEMU_CFLAGS="-arch x86_64 $QEMU_CFLAGS"
+ LDFLAGS="-arch x86_64 $LDFLAGS"
+ else
+ QEMU_CFLAGS="-mdynamic-no-pic $QEMU_CFLAGS"
+ fi
+ darwin_user="yes"
+ cocoa="yes"
+ audio_drv_list="coreaudio"
+ audio_possible_drivers="coreaudio sdl fmod"
+ LDFLAGS="-framework CoreFoundation -framework IOKit $LDFLAGS"
+ libs_softmmu="-F/System/Library/Frameworks -framework Cocoa -framework IOKit $libs_softmmu"
+;;
+SunOS)
+ solaris="yes"
+ make="${MAKE-gmake}"
+ install="${INSTALL-ginstall}"
+ ld="gld"
+ smbd="${SMBD-/usr/sfw/sbin/smbd}"
+ needs_libsunmath="no"
+ solarisrev=`uname -r | cut -f2 -d.`
+ # have to select again, because `uname -m` returns i86pc
+ # even on an x86_64 box.
+ solariscpu=`isainfo -k`
+ if test "${solariscpu}" = "amd64" ; then
+ cpu="x86_64"
+ fi
+ if [ "$cpu" = "i386" -o "$cpu" = "x86_64" ] ; then
+ if test "$solarisrev" -le 9 ; then
+ if test -f /opt/SUNWspro/prod/lib/libsunmath.so.1; then
+ needs_libsunmath="yes"
+ QEMU_CFLAGS="-I/opt/SUNWspro/prod/include/cc $QEMU_CFLAGS"
+ LDFLAGS="-L/opt/SUNWspro/prod/lib -R/opt/SUNWspro/prod/lib $LDFLAGS"
+ LIBS="-lsunmath $LIBS"
+ else
+ echo "QEMU will not link correctly on Solaris 8/X86 or 9/x86 without"
+ echo "libsunmath from the Sun Studio compilers tools, due to a lack of"
+ echo "C99 math features in libm.so in Solaris 8/x86 and Solaris 9/x86"
+ echo "Studio 11 can be downloaded from www.sun.com."
+ exit 1
+ fi
+ fi
+ fi
+ if test -f /usr/include/sys/soundcard.h ; then
+ audio_drv_list="oss"
+ fi
+ audio_possible_drivers="oss sdl"
+# needed for CMSG_ macros in sys/socket.h
+ QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
+# needed for TIOCWIN* defines in termios.h
+ QEMU_CFLAGS="-D__EXTENSIONS__ $QEMU_CFLAGS"
+ QEMU_CFLAGS="-std=gnu99 $QEMU_CFLAGS"
+ LIBS="-lsocket -lnsl -lresolv $LIBS"
+;;
+AIX)
+ aix="yes"
+ make="${MAKE-gmake}"
+;;
+Haiku)
+ haiku="yes"
+ QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS $QEMU_CFLAGS"
+ LIBS="-lposix_error_mapper -lnetwork $LIBS"
+;;
+*)
+ audio_drv_list="oss"
+ audio_possible_drivers="oss alsa sdl esd pa"
+ linux="yes"
+ linux_user="yes"
+ usb="linux"
+ kvm="yes"
+ vhost_net="yes"
+ if [ "$cpu" = "i386" -o "$cpu" = "x86_64" ] ; then
+ audio_possible_drivers="$audio_possible_drivers fmod"
+ fi
+;;
+esac
+
+if [ "$bsd" = "yes" ] ; then
+ if [ "$darwin" != "yes" ] ; then
+ usb="bsd"
+ fi
+ bsd_user="yes"
+fi
+
+: ${make=${MAKE-make}}
+: ${install=${INSTALL-install}}
+: ${python=${PYTHON-python}}
+: ${smbd=${SMBD-/usr/sbin/smbd}}
+
+if test "$mingw32" = "yes" ; then
+ EXESUF=".exe"
+ QEMU_CFLAGS="-DWIN32_LEAN_AND_MEAN -DWINVER=0x501 $QEMU_CFLAGS"
+ # enable C99/POSIX format strings (needs mingw32-runtime 3.15 or later)
+ QEMU_CFLAGS="-D__USE_MINGW_ANSI_STDIO=1 $QEMU_CFLAGS"
+ LIBS="-lwinmm -lws2_32 -liberty -liphlpapi $LIBS"
+ prefix="c:/Program Files/Qemu"
+ mandir="\${prefix}"
+ datadir="\${prefix}"
+ docdir="\${prefix}"
+ bindir="\${prefix}"
+ sysconfdir="\${prefix}"
+ confsuffix=""
+fi
+
+werror=""
+
+for opt do
+ optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
+ case "$opt" in
+ --help|-h) show_help=yes
+ ;;
+ --version|-V) exec cat $source_path/VERSION
+ ;;
+ --prefix=*) prefix="$optarg"
+ ;;
+ --interp-prefix=*) interp_prefix="$optarg"
+ ;;
+ --source-path=*)
+ ;;
+ --cross-prefix=*)
+ ;;
+ --cc=*)
+ ;;
+ --host-cc=*) host_cc="$optarg"
+ ;;
+ --make=*) make="$optarg"
+ ;;
+ --install=*) install="$optarg"
+ ;;
+ --python=*) python="$optarg"
+ ;;
+ --smbd=*) smbd="$optarg"
+ ;;
+ --extra-cflags=*)
+ ;;
+ --extra-ldflags=*)
+ ;;
+ --cpu=*)
+ ;;
+ --target-list=*) target_list="$optarg"
+ ;;
+ --enable-trace-backend=*) trace_backend="$optarg"
+ ;;
+ --with-trace-file=*) trace_file="$optarg"
+ ;;
+ --enable-gprof) gprof="yes"
+ ;;
+ --static)
+ static="yes"
+ LDFLAGS="-static $LDFLAGS"
+ ;;
+ --mandir=*) mandir="$optarg"
+ ;;
+ --bindir=*) bindir="$optarg"
+ ;;
+ --libdir=*) libdir="$optarg"
+ ;;
+ --datadir=*) datadir="$optarg"
+ ;;
+ --docdir=*) docdir="$optarg"
+ ;;
+ --sysconfdir=*) sysconfdir="$optarg"
+ ;;
+ --disable-sdl) sdl="no"
+ ;;
+ --enable-sdl) sdl="yes"
+ ;;
+ --disable-vnc) vnc="no"
+ ;;
+ --enable-vnc) vnc="yes"
+ ;;
+ --fmod-lib=*) fmod_lib="$optarg"
+ ;;
+ --fmod-inc=*) fmod_inc="$optarg"
+ ;;
+ --oss-lib=*) oss_lib="$optarg"
+ ;;
+ --audio-card-list=*) audio_card_list=`echo "$optarg" | sed -e 's/,/ /g'`
+ ;;
+ --audio-drv-list=*) audio_drv_list="$optarg"
+ ;;
+ --block-drv-whitelist=*) block_drv_whitelist=`echo "$optarg" | sed -e 's/,/ /g'`
+ ;;
+ --enable-debug-tcg) debug_tcg="yes"
+ ;;
+ --disable-debug-tcg) debug_tcg="no"
+ ;;
+ --enable-debug-mon) debug_mon="yes"
+ ;;
+ --disable-debug-mon) debug_mon="no"
+ ;;
+ --enable-debug)
+ # Enable debugging options that aren't excessively noisy
+ debug_tcg="yes"
+ debug_mon="yes"
+ debug="yes"
+ strip_opt="no"
+ ;;
+ --enable-sparse) sparse="yes"
+ ;;
+ --disable-sparse) sparse="no"
+ ;;
+ --disable-strip) strip_opt="no"
+ ;;
+ --disable-vnc-tls) vnc_tls="no"
+ ;;
+ --enable-vnc-tls) vnc_tls="yes"
+ ;;
+ --disable-vnc-sasl) vnc_sasl="no"
+ ;;
+ --enable-vnc-sasl) vnc_sasl="yes"
+ ;;
+ --disable-vnc-jpeg) vnc_jpeg="no"
+ ;;
+ --enable-vnc-jpeg) vnc_jpeg="yes"
+ ;;
+ --disable-vnc-png) vnc_png="no"
+ ;;
+ --enable-vnc-png) vnc_png="yes"
+ ;;
+ --disable-vnc-thread) vnc_thread="no"
+ ;;
+ --enable-vnc-thread) vnc_thread="yes"
+ ;;
+ --disable-slirp) slirp="no"
+ ;;
+ --disable-uuid) uuid="no"
+ ;;
+ --enable-uuid) uuid="yes"
+ ;;
+ --disable-vde) vde="no"
+ ;;
+ --enable-vde) vde="yes"
+ ;;
+ --disable-xen) xen="no"
+ ;;
+ --enable-xen) xen="yes"
+ ;;
+ --disable-brlapi) brlapi="no"
+ ;;
+ --enable-brlapi) brlapi="yes"
+ ;;
+ --disable-bluez) bluez="no"
+ ;;
+ --enable-bluez) bluez="yes"
+ ;;
+ --disable-kvm) kvm="no"
+ ;;
+ --enable-kvm) kvm="yes"
+ ;;
+ --disable-spice) spice="no"
+ ;;
+ --enable-spice) spice="yes"
+ ;;
+ --enable-profiler) profiler="yes"
+ ;;
+ --enable-cocoa)
+ cocoa="yes" ;
+ sdl="no" ;
+ audio_drv_list="coreaudio `echo $audio_drv_list | sed s,coreaudio,,g`"
+ ;;
+ --disable-system) softmmu="no"
+ ;;
+ --enable-system) softmmu="yes"
+ ;;
+ --disable-user)
+ linux_user="no" ;
+ bsd_user="no" ;
+ darwin_user="no"
+ ;;
+ --enable-user) ;;
+ --disable-linux-user) linux_user="no"
+ ;;
+ --enable-linux-user) linux_user="yes"
+ ;;
+ --disable-darwin-user) darwin_user="no"
+ ;;
+ --enable-darwin-user) darwin_user="yes"
+ ;;
+ --disable-bsd-user) bsd_user="no"
+ ;;
+ --enable-bsd-user) bsd_user="yes"
+ ;;
+ --enable-guest-base) guest_base="yes"
+ ;;
+ --disable-guest-base) guest_base="no"
+ ;;
+ --enable-user-pie) user_pie="yes"
+ ;;
+ --disable-user-pie) user_pie="no"
+ ;;
+ --enable-uname-release=*) uname_release="$optarg"
+ ;;
+ --sparc_cpu=*)
+ ;;
+ --enable-werror) werror="yes"
+ ;;
+ --disable-werror) werror="no"
+ ;;
+ --disable-curses) curses="no"
+ ;;
+ --enable-curses) curses="yes"
+ ;;
+ --disable-curl) curl="no"
+ ;;
+ --enable-curl) curl="yes"
+ ;;
+ --disable-fdt) fdt="no"
+ ;;
+ --enable-fdt) fdt="yes"
+ ;;
+ --disable-check-utests) check_utests="no"
+ ;;
+ --enable-check-utests) check_utests="yes"
+ ;;
+ --disable-nptl) nptl="no"
+ ;;
+ --enable-nptl) nptl="yes"
+ ;;
+ --enable-mixemu) mixemu="yes"
+ ;;
+ --disable-linux-aio) linux_aio="no"
+ ;;
+ --enable-linux-aio) linux_aio="yes"
+ ;;
+ --disable-attr) attr="no"
+ ;;
+ --enable-attr) attr="yes"
+ ;;
+ --enable-io-thread) io_thread="yes"
+ ;;
+ --disable-blobs) blobs="no"
+ ;;
+ --with-pkgversion=*) pkgversion=" ($optarg)"
+ ;;
+ --disable-docs) docs="no"
+ ;;
+ --enable-docs) docs="yes"
+ ;;
+ --disable-vhost-net) vhost_net="no"
+ ;;
+ --enable-vhost-net) vhost_net="yes"
+ ;;
+ --disable-opengl) opengl="no"
+ ;;
+ --enable-opengl) opengl="yes"
+ ;;
+ --*dir)
+ ;;
+ --disable-rbd) rbd="no"
+ ;;
+ --enable-rbd) rbd="yes"
+ ;;
+ --disable-smartcard) smartcard="no"
+ ;;
+ --enable-smartcard) smartcard="yes"
+ ;;
+ --disable-smartcard-nss) smartcard_nss="no"
+ ;;
+ --enable-smartcard-nss) smartcard_nss="yes"
+ ;;
+ --disable-usb-redir) usb_redir="no"
+ ;;
+ --enable-usb-redir) usb_redir="yes"
+ ;;
+ --enable-guest-agent) guest_agent="yes"
+ ;;
+ --disable-guest-agent) guest_agent="no"
+ ;;
+ *) echo "ERROR: unknown option $opt"; show_help="yes"
+ ;;
+ esac
+done
+
+#
+# If cpu ~= sparc and sparc_cpu hasn't been defined, plug in the right
+# QEMU_CFLAGS/LDFLAGS (assume sparc_v8plus for 32-bit and sparc_v9 for 64-bit)
+#
+host_guest_base="no"
+case "$cpu" in
+ sparc) case $sparc_cpu in
+ v7|v8)
+ QEMU_CFLAGS="-mcpu=${sparc_cpu} -D__sparc_${sparc_cpu}__ $QEMU_CFLAGS"
+ ;;
+ v8plus|v8plusa)
+ QEMU_CFLAGS="-mcpu=ultrasparc -D__sparc_${sparc_cpu}__ $QEMU_CFLAGS"
+ ;;
+ *) # sparc_cpu not defined in the command line
+ QEMU_CFLAGS="-mcpu=ultrasparc -D__sparc_v8plus__ $QEMU_CFLAGS"
+ esac
+ LDFLAGS="-m32 $LDFLAGS"
+ QEMU_CFLAGS="-m32 -ffixed-g2 -ffixed-g3 $QEMU_CFLAGS"
+ if test "$solaris" = "no" ; then
+ QEMU_CFLAGS="-ffixed-g1 -ffixed-g6 $QEMU_CFLAGS"
+ helper_cflags="-ffixed-i0"
+ fi
+ ;;
+ sparc64)
+ QEMU_CFLAGS="-m64 -mcpu=ultrasparc -D__sparc_v9__ $QEMU_CFLAGS"
+ LDFLAGS="-m64 $LDFLAGS"
+ QEMU_CFLAGS="-ffixed-g5 -ffixed-g6 -ffixed-g7 $QEMU_CFLAGS"
+ if test "$solaris" != "no" ; then
+ QEMU_CFLAGS="-ffixed-g1 $QEMU_CFLAGS"
+ fi
+ ;;
+ s390)
+ QEMU_CFLAGS="-m31 -march=z990 $QEMU_CFLAGS"
+ LDFLAGS="-m31 $LDFLAGS"
+ host_guest_base="yes"
+ ;;
+ s390x)
+ QEMU_CFLAGS="-m64 -march=z990 $QEMU_CFLAGS"
+ LDFLAGS="-m64 $LDFLAGS"
+ host_guest_base="yes"
+ ;;
+ i386)
+ QEMU_CFLAGS="-m32 $QEMU_CFLAGS"
+ LDFLAGS="-m32 $LDFLAGS"
+ cc_i386='$(CC) -m32'
+ helper_cflags="-fomit-frame-pointer"
+ host_guest_base="yes"
+ ;;
+ x86_64)
+ QEMU_CFLAGS="-m64 $QEMU_CFLAGS"
+ LDFLAGS="-m64 $LDFLAGS"
+ cc_i386='$(CC) -m32'
+ host_guest_base="yes"
+ ;;
+ arm*)
+ host_guest_base="yes"
+ ;;
+ ppc*)
+ host_guest_base="yes"
+ ;;
+ mips*)
+ host_guest_base="yes"
+ ;;
+ ia64*)
+ host_guest_base="yes"
+ ;;
+ hppa*)
+ host_guest_base="yes"
+ ;;
+ unicore32*)
+ host_guest_base="yes"
+ ;;
+esac
+
+[ -z "$guest_base" ] && guest_base="$host_guest_base"
+
+
+default_target_list=""
+
+# these targets are portable
+if [ "$softmmu" = "yes" ] ; then
+ default_target_list="\
+i386-softmmu \
+x86_64-softmmu \
+arm-softmmu \
+cris-softmmu \
+lm32-softmmu \
+m68k-softmmu \
+microblaze-softmmu \
+microblazeel-softmmu \
+mips-softmmu \
+mipsel-softmmu \
+mips64-softmmu \
+mips64el-softmmu \
+ppc-softmmu \
+ppcemb-softmmu \
+ppc64-softmmu \
+sh4-softmmu \
+sh4eb-softmmu \
+sparc-softmmu \
+sparc64-softmmu \
+s390x-softmmu \
+"
+fi
+# the following are Linux specific
+if [ "$linux_user" = "yes" ] ; then
+ default_target_list="${default_target_list}\
+i386-linux-user \
+x86_64-linux-user \
+alpha-linux-user \
+arm-linux-user \
+armeb-linux-user \
+cris-linux-user \
+m68k-linux-user \
+microblaze-linux-user \
+microblazeel-linux-user \
+mips-linux-user \
+mipsel-linux-user \
+ppc-linux-user \
+ppc64-linux-user \
+ppc64abi32-linux-user \
+sh4-linux-user \
+sh4eb-linux-user \
+sparc-linux-user \
+sparc64-linux-user \
+sparc32plus-linux-user \
+unicore32-linux-user \
+s390x-linux-user \
+"
+fi
+# the following are Darwin specific
+if [ "$darwin_user" = "yes" ] ; then
+ default_target_list="$default_target_list i386-darwin-user ppc-darwin-user "
+fi
+# the following are BSD specific
+if [ "$bsd_user" = "yes" ] ; then
+ default_target_list="${default_target_list}\
+i386-bsd-user \
+x86_64-bsd-user \
+sparc-bsd-user \
+sparc64-bsd-user \
+"
+fi
+
+if test x"$show_help" = x"yes" ; then
+cat << EOF
+
+Usage: configure [options]
+Options: [defaults in brackets after descriptions]
+
+EOF
+echo "Standard options:"
+echo " --help print this message"
+echo " --prefix=PREFIX install in PREFIX [$prefix]"
+echo " --interp-prefix=PREFIX where to find shared libraries, etc."
+echo " use %M for cpu name [$interp_prefix]"
+echo " --target-list=LIST set target list (default: build everything)"
+echo "Available targets: $default_target_list" | \
+ fold -s -w 53 | sed -e 's/^/ /'
+echo ""
+echo "Advanced options (experts only):"
+echo " --source-path=PATH path of source code [$source_path]"
+echo " --cross-prefix=PREFIX use PREFIX for compile tools [$cross_prefix]"
+echo " --cc=CC use C compiler CC [$cc]"
+echo " --host-cc=CC use C compiler CC [$host_cc] for code run at"
+echo " build time"
+echo " --extra-cflags=CFLAGS append extra C compiler flags QEMU_CFLAGS"
+echo " --extra-ldflags=LDFLAGS append extra linker flags LDFLAGS"
+echo " --make=MAKE use specified make [$make]"
+echo " --install=INSTALL use specified install [$install]"
+echo " --python=PYTHON use specified python [$python]"
+echo " --smbd=SMBD use specified smbd [$smbd]"
+echo " --static enable static build [$static]"
+echo " --mandir=PATH install man pages in PATH"
+echo " --datadir=PATH install firmware in PATH"
+echo " --docdir=PATH install documentation in PATH"
+echo " --bindir=PATH install binaries in PATH"
+echo " --sysconfdir=PATH install config in PATH/qemu"
+echo " --enable-debug-tcg enable TCG debugging"
+echo " --disable-debug-tcg disable TCG debugging (default)"
+echo " --enable-debug enable common debug build options"
+echo " --enable-sparse enable sparse checker"
+echo " --disable-sparse disable sparse checker (default)"
+echo " --disable-strip disable stripping binaries"
+echo " --disable-werror disable compilation abort on warning"
+echo " --disable-sdl disable SDL"
+echo " --enable-sdl enable SDL"
+echo " --disable-vnc disable VNC"
+echo " --enable-vnc enable VNC"
+echo " --enable-cocoa enable COCOA (Mac OS X only)"
+echo " --audio-drv-list=LIST set audio drivers list:"
+echo " Available drivers: $audio_possible_drivers"
+echo " --audio-card-list=LIST set list of emulated audio cards [$audio_card_list]"
+echo " Available cards: $audio_possible_cards"
+echo " --block-drv-whitelist=L set block driver whitelist"
+echo " (affects only QEMU, not qemu-img)"
+echo " --enable-mixemu enable mixer emulation"
+echo " --disable-xen disable xen backend driver support"
+echo " --enable-xen enable xen backend driver support"
+echo " --disable-brlapi disable BrlAPI"
+echo " --enable-brlapi enable BrlAPI"
+echo " --disable-vnc-tls disable TLS encryption for VNC server"
+echo " --enable-vnc-tls enable TLS encryption for VNC server"
+echo " --disable-vnc-sasl disable SASL encryption for VNC server"
+echo " --enable-vnc-sasl enable SASL encryption for VNC server"
+echo " --disable-vnc-jpeg disable JPEG lossy compression for VNC server"
+echo " --enable-vnc-jpeg enable JPEG lossy compression for VNC server"
+echo " --disable-vnc-png disable PNG compression for VNC server (default)"
+echo " --enable-vnc-png enable PNG compression for VNC server"
+echo " --disable-vnc-thread disable threaded VNC server"
+echo " --enable-vnc-thread enable threaded VNC server"
+echo " --disable-curses disable curses output"
+echo " --enable-curses enable curses output"
+echo " --disable-curl disable curl connectivity"
+echo " --enable-curl enable curl connectivity"
+echo " --disable-fdt disable fdt device tree"
+echo " --enable-fdt enable fdt device tree"
+echo " --disable-check-utests disable check unit-tests"
+echo " --enable-check-utests enable check unit-tests"
+echo " --disable-bluez disable bluez stack connectivity"
+echo " --enable-bluez enable bluez stack connectivity"
+echo " --disable-slirp disable SLIRP userspace network connectivity"
+echo " --disable-kvm disable KVM acceleration support"
+echo " --enable-kvm enable KVM acceleration support"
+echo " --disable-nptl disable usermode NPTL support"
+echo " --enable-nptl enable usermode NPTL support"
+echo " --enable-system enable all system emulation targets"
+echo " --disable-system disable all system emulation targets"
+echo " --enable-user enable supported user emulation targets"
+echo " --disable-user disable all user emulation targets"
+echo " --enable-linux-user enable all linux usermode emulation targets"
+echo " --disable-linux-user disable all linux usermode emulation targets"
+echo " --enable-darwin-user enable all darwin usermode emulation targets"
+echo " --disable-darwin-user disable all darwin usermode emulation targets"
+echo " --enable-bsd-user enable all BSD usermode emulation targets"
+echo " --disable-bsd-user disable all BSD usermode emulation targets"
+echo " --enable-guest-base enable GUEST_BASE support for usermode"
+echo " emulation targets"
+echo " --disable-guest-base disable GUEST_BASE support"
+echo " --enable-user-pie build usermode emulation targets as PIE"
+echo " --disable-user-pie do not build usermode emulation targets as PIE"
+echo " --fmod-lib path to FMOD library"
+echo " --fmod-inc path to FMOD includes"
+echo " --oss-lib path to OSS library"
+echo " --enable-uname-release=R Return R for uname -r in usermode emulation"
+echo " --sparc_cpu=V Build qemu for Sparc architecture v7, v8, v8plus, v8plusa, v9"
+echo " --disable-uuid disable uuid support"
+echo " --enable-uuid enable uuid support"
+echo " --disable-vde disable support for vde network"
+echo " --enable-vde enable support for vde network"
+echo " --disable-linux-aio disable Linux AIO support"
+echo " --enable-linux-aio enable Linux AIO support"
+echo " --disable-attr disables attr and xattr support"
+echo " --enable-attr enable attr and xattr support"
+echo " --enable-io-thread enable IO thread"
+echo " --disable-blobs disable installing provided firmware blobs"
+echo " --enable-docs enable documentation build"
+echo " --disable-docs disable documentation build"
+echo " --disable-vhost-net disable vhost-net acceleration support"
+echo " --enable-vhost-net enable vhost-net acceleration support"
+echo " --enable-trace-backend=B Set trace backend"
+echo " Available backends:" $("$source_path"/scripts/tracetool --list-backends)
+echo " --with-trace-file=NAME Full PATH,NAME of file to store traces"
+echo " Default:trace-<pid>"
+echo " --disable-spice disable spice"
+echo " --enable-spice enable spice"
+echo " --enable-rbd enable building the rados block device (rbd)"
+echo " --disable-smartcard disable smartcard support"
+echo " --enable-smartcard enable smartcard support"
+echo " --disable-smartcard-nss disable smartcard nss support"
+echo " --enable-smartcard-nss enable smartcard nss support"
+echo " --disable-usb-redir disable usb network redirection support"
+echo " --enable-usb-redir enable usb network redirection support"
+echo " --disable-guest-agent disable building of the QEMU Guest Agent"
+echo " --enable-guest-agent enable building of the QEMU Guest Agent"
+echo ""
+echo "NOTE: The object files are built at the place where configure is launched"
+exit 1
+fi
+
+# check that the C compiler works.
+cat > $TMPC <<EOF
+int main(void) {}
+EOF
+
+if compile_object ; then
+ : C compiler works ok
+else
+ echo "ERROR: \"$cc\" either does not exist or does not work"
+ exit 1
+fi
+
+gcc_flags="-Wold-style-declaration -Wold-style-definition -Wtype-limits"
+gcc_flags="-Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers $gcc_flags"
+gcc_flags="-Wmissing-include-dirs -Wempty-body -Wnested-externs $gcc_flags"
+gcc_flags="-fstack-protector-all -Wendif-labels $gcc_flags"
+cat > $TMPC << EOF
+int main(void) { return 0; }
+EOF
+for flag in $gcc_flags; do
+ if compile_prog "-Werror $QEMU_CFLAGS" "-Werror $flag" ; then
+ QEMU_CFLAGS="$QEMU_CFLAGS $flag"
+ fi
+done
+
+#
+# Solaris specific configure tool chain decisions
+#
+if test "$solaris" = "yes" ; then
+ if has $install; then
+ :
+ else
+ echo "Solaris install program not found. Use --install=/usr/ucb/install or"
+ echo "install fileutils from www.blastwave.org using pkg-get -i fileutils"
+ echo "to get ginstall which is used by default (which lives in /opt/csw/bin)"
+ exit 1
+ fi
+ if test "`path_of $install`" = "/usr/sbin/install" ; then
+ echo "Error: Solaris /usr/sbin/install is not an appropriate install program."
+ echo "try ginstall from the GNU fileutils available from www.blastwave.org"
+ echo "using pkg-get -i fileutils, or use --install=/usr/ucb/install"
+ exit 1
+ fi
+ if has ar; then
+ :
+ else
+ echo "Error: No path includes ar"
+ if test -f /usr/ccs/bin/ar ; then
+ echo "Add /usr/ccs/bin to your path and rerun configure"
+ fi
+ exit 1
+ fi
+fi
+
+if test "$guest_agent" != "no" ; then
+ if has $python; then
+ :
+ else
+ echo "Python not found. Use --python=/path/to/python"
+ exit 1
+ fi
+fi
+
+if test -z "$target_list" ; then
+ target_list="$default_target_list"
+else
+ target_list=`echo "$target_list" | sed -e 's/,/ /g'`
+fi
+if test -z "$target_list" ; then
+ echo "No targets enabled"
+ exit 1
+fi
+# see if system emulation was really requested
+case " $target_list " in
+ *"-softmmu "*) softmmu=yes
+ ;;
+ *) softmmu=no
+ ;;
+esac
+
+feature_not_found() {
+ feature=$1
+
+ echo "ERROR"
+ echo "ERROR: User requested feature $feature"
+ echo "ERROR: configure was not able to find it"
+ echo "ERROR"
+ exit 1;
+}
+
+if test -z "$cross_prefix" ; then
+
+# ---
+# big/little endian test
+cat > $TMPC << EOF
+#include <inttypes.h>
+int main(int argc, char ** argv){
+ volatile uint32_t i=0x01234567;
+ return (*((uint8_t*)(&i))) == 0x67;
+}
+EOF
+
+if compile_prog "" "" ; then
+$TMPE && bigendian="yes"
+else
+echo big/little test failed
+fi
+
+else
+
+# if cross compiling, cannot launch a program, so make a static guess
+case "$cpu" in
+ armv4b|hppa|m68k|mips|mips64|ppc|ppc64|s390|s390x|sparc|sparc64)
+ bigendian=yes
+ ;;
+esac
+
+fi
+
+# host long bits test, actually a pointer size test
+cat > $TMPC << EOF
+int sizeof_pointer_is_8[sizeof(void *) == 8 ? 1 : -1];
+EOF
+if compile_object; then
+hostlongbits=64
+else
+hostlongbits=32
+fi
+
+
+##########################################
+# NPTL probe
+
+if test "$nptl" != "no" ; then
+ cat > $TMPC <<EOF
+#include <sched.h>
+#include <linux/futex.h>
+void foo()
+{
+#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
+#error bork
+#endif
+}
+EOF
+
+ if compile_object ; then
+ nptl=yes
+ else
+ if test "$nptl" = "yes" ; then
+ feature_not_found "nptl"
+ fi
+ nptl=no
+ fi
+fi
+
+##########################################
+# zlib check
+
+cat > $TMPC << EOF
+#include <zlib.h>
+int main(void) { zlibVersion(); return 0; }
+EOF
+if compile_prog "" "-lz" ; then
+ :
+else
+ echo
+ echo "Error: zlib check failed"
+ echo "Make sure to have the zlib libs and headers installed."
+ echo
+ exit 1
+fi
+
+##########################################
+# xen probe
+
+if test "$xen" != "no" ; then
+ xen_libs="-lxenstore -lxenctrl -lxenguest"
+
+ # Xen unstable
+ cat > $TMPC <<EOF
+#include <xenctrl.h>
+#include <xs.h>
+#include <stdint.h>
+#include <xen/hvm/hvm_info_table.h>
+#if !defined(HVM_MAX_VCPUS)
+# error HVM_MAX_VCPUS not defined
+#endif
+int main(void) {
+ xc_interface *xc;
+ xs_daemon_open();
+ xc = xc_interface_open(0, 0, 0);
+ xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
+ xc_gnttab_open(NULL, 0);
+ xc_domain_add_to_physmap(0, 0, XENMAPSPACE_gmfn, 0, 0);
+ return 0;
+}
+EOF
+ if compile_prog "" "$xen_libs" ; then
+ xen_ctrl_version=410
+ xen=yes
+
+ # Xen 4.0.0
+ elif (
+ cat > $TMPC <<EOF
+#include <xenctrl.h>
+#include <xs.h>
+#include <stdint.h>
+#include <xen/hvm/hvm_info_table.h>
+#if !defined(HVM_MAX_VCPUS)
+# error HVM_MAX_VCPUS not defined
+#endif
+int main(void) {
+ struct xen_add_to_physmap xatp = {
+ .domid = 0, .space = XENMAPSPACE_gmfn, .idx = 0, .gpfn = 0,
+ };
+ xs_daemon_open();
+ xc_interface_open();
+ xc_gnttab_open();
+ xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
+ xc_memory_op(0, XENMEM_add_to_physmap, &xatp);
+ return 0;
+}
+EOF
+ compile_prog "" "$xen_libs"
+ ) ; then
+ xen_ctrl_version=400
+ xen=yes
+
+ # Xen 3.4.0
+ elif (
+ cat > $TMPC <<EOF
+#include <xenctrl.h>
+#include <xs.h>
+int main(void) {
+ struct xen_add_to_physmap xatp = {
+ .domid = 0, .space = XENMAPSPACE_gmfn, .idx = 0, .gpfn = 0,
+ };
+ xs_daemon_open();
+ xc_interface_open();
+ xc_gnttab_open();
+ xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
+ xc_memory_op(0, XENMEM_add_to_physmap, &xatp);
+ return 0;
+}
+EOF
+ compile_prog "" "$xen_libs"
+ ) ; then
+ xen_ctrl_version=340
+ xen=yes
+
+ # Xen 3.3.0
+ elif (
+ cat > $TMPC <<EOF
+#include <xenctrl.h>
+#include <xs.h>
+int main(void) {
+ xs_daemon_open();
+ xc_interface_open();
+ xc_gnttab_open();
+ xc_hvm_set_mem_type(0, 0, HVMMEM_ram_ro, 0, 0);
+ return 0;
+}
+EOF
+ compile_prog "" "$xen_libs"
+ ) ; then
+ xen_ctrl_version=330
+ xen=yes
+
+ # Xen not found or unsupported
+ else
+ if test "$xen" = "yes" ; then
+ feature_not_found "xen"
+ fi
+ xen=no
+ fi
+
+ if test "$xen" = yes; then
+ libs_softmmu="$xen_libs $libs_softmmu"
+ fi
+fi
+
+##########################################
+# pkg-config probe
+
+if ! has $pkg_config; then
+ echo warning: proceeding without "$pkg_config" >&2
+ pkg_config=/bin/false
+fi
+
+##########################################
+# libtool probe
+
+if ! has libtool; then
+ libtool=
+else
+ libtool=libtool
+fi
+
+##########################################
+# Sparse probe
+if test "$sparse" != "no" ; then
+ if has cgcc; then
+ sparse=yes
+ else
+ if test "$sparse" = "yes" ; then
+ feature_not_found "sparse"
+ fi
+ sparse=no
+ fi
+fi
+
+##########################################
+# SDL probe
+
+# Look for sdl configuration program (pkg-config or sdl-config). Try
+# sdl-config even without cross prefix, and favour pkg-config over sdl-config.
+if test "`basename $sdl_config`" != sdl-config && ! has ${sdl_config}; then
+ sdl_config=sdl-config
+fi
+
+if $pkg_config sdl --modversion >/dev/null 2>&1; then
+ sdlconfig="$pkg_config sdl"
+ _sdlversion=`$sdlconfig --modversion 2>/dev/null | sed 's/[^0-9]//g'`
+elif has ${sdl_config}; then
+ sdlconfig="$sdl_config"
+ _sdlversion=`$sdlconfig --version | sed 's/[^0-9]//g'`
+else
+ if test "$sdl" = "yes" ; then
+ feature_not_found "sdl"
+ fi
+ sdl=no
+fi
+if test -n "$cross_prefix" && test "$(basename "$sdlconfig")" = sdl-config; then
+ echo warning: using "\"$sdlconfig\"" to detect cross-compiled sdl >&2
+fi
+
+sdl_too_old=no
+if test "$sdl" != "no" ; then
+ cat > $TMPC << EOF
+#include <SDL.h>
+#undef main /* We don't want SDL to override our main() */
+int main( void ) { return SDL_Init (SDL_INIT_VIDEO); }
+EOF
+ sdl_cflags=`$sdlconfig --cflags 2> /dev/null`
+ if test "$static" = "yes" ; then
+ sdl_libs=`$sdlconfig --static-libs 2>/dev/null`
+ else
+ sdl_libs=`$sdlconfig --libs 2> /dev/null`
+ fi
+ if compile_prog "$sdl_cflags" "$sdl_libs" ; then
+ if test "$_sdlversion" -lt 121 ; then
+ sdl_too_old=yes
+ else
+ if test "$cocoa" = "no" ; then
+ sdl=yes
+ fi
+ fi
+
+ # static link with sdl ? (note: sdl.pc's --static --libs is broken)
+ if test "$sdl" = "yes" -a "$static" = "yes" ; then
+ if test $? = 0 && echo $sdl_libs | grep -- -laa > /dev/null; then
+ sdl_libs="$sdl_libs `aalib-config --static-libs 2>/dev/null`"
+ sdl_cflags="$sdl_cflags `aalib-config --cflags 2>/dev/null`"
+ fi
+ if compile_prog "$sdl_cflags" "$sdl_libs" ; then
+ :
+ else
+ sdl=no
+ fi
+ fi # static link
+ else # sdl not found
+ if test "$sdl" = "yes" ; then
+ feature_not_found "sdl"
+ fi
+ sdl=no
+ fi # sdl compile test
+fi
+
+if test "$sdl" = "yes" ; then
+ cat > $TMPC <<EOF
+#include <SDL.h>
+#if defined(SDL_VIDEO_DRIVER_X11)
+#include <X11/XKBlib.h>
+#else
+#error No x11 support
+#endif
+int main(void) { return 0; }
+EOF
+ if compile_prog "$sdl_cflags" "$sdl_libs" ; then
+ sdl_libs="$sdl_libs -lX11"
+ fi
+ if test "$mingw32" = "yes" ; then
+ sdl_libs="`echo $sdl_libs | sed s/-mwindows//g` -mconsole"
+ fi
+ libs_softmmu="$sdl_libs $libs_softmmu"
+fi
+
+##########################################
+# VNC TLS detection
+if test "$vnc" = "yes" -a "$vnc_tls" != "no" ; then
+ cat > $TMPC <<EOF
+#include <gnutls/gnutls.h>
+int main(void) { gnutls_session_t s; gnutls_init(&s, GNUTLS_SERVER); return 0; }
+EOF
+ vnc_tls_cflags=`$pkg_config --cflags gnutls 2> /dev/null`
+ vnc_tls_libs=`$pkg_config --libs gnutls 2> /dev/null`
+ if compile_prog "$vnc_tls_cflags" "$vnc_tls_libs" ; then
+ vnc_tls=yes
+ libs_softmmu="$vnc_tls_libs $libs_softmmu"
+ else
+ if test "$vnc_tls" = "yes" ; then
+ feature_not_found "vnc-tls"
+ fi
+ vnc_tls=no
+ fi
+fi
+
+##########################################
+# VNC SASL detection
+if test "$vnc" = "yes" -a "$vnc_sasl" != "no" ; then
+ cat > $TMPC <<EOF
+#include <sasl/sasl.h>
+#include <stdio.h>
+int main(void) { sasl_server_init(NULL, "qemu"); return 0; }
+EOF
+ # Assuming Cyrus-SASL installed in /usr prefix
+ vnc_sasl_cflags=""
+ vnc_sasl_libs="-lsasl2"
+ if compile_prog "$vnc_sasl_cflags" "$vnc_sasl_libs" ; then
+ vnc_sasl=yes
+ libs_softmmu="$vnc_sasl_libs $libs_softmmu"
+ else
+ if test "$vnc_sasl" = "yes" ; then
+ feature_not_found "vnc-sasl"
+ fi
+ vnc_sasl=no
+ fi
+fi
+
+##########################################
+# VNC JPEG detection
+if test "$vnc" = "yes" -a "$vnc_jpeg" != "no" ; then
+cat > $TMPC <<EOF
+#include <stdio.h>
+#include <jpeglib.h>
+int main(void) { struct jpeg_compress_struct s; jpeg_create_compress(&s); return 0; }
+EOF
+ vnc_jpeg_cflags=""
+ vnc_jpeg_libs="-ljpeg"
+ if compile_prog "$vnc_jpeg_cflags" "$vnc_jpeg_libs" ; then
+ vnc_jpeg=yes
+ libs_softmmu="$vnc_jpeg_libs $libs_softmmu"
+ else
+ if test "$vnc_jpeg" = "yes" ; then
+ feature_not_found "vnc-jpeg"
+ fi
+ vnc_jpeg=no
+ fi
+fi
+
+##########################################
+# VNC PNG detection
+if test "$vnc" = "yes" -a "$vnc_png" != "no" ; then
+cat > $TMPC <<EOF
+//#include <stdio.h>
+#include <png.h>
+#include <stddef.h>
+int main(void) {
+ png_structp png_ptr;
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ return 0;
+}
+EOF
+ if $pkg_config libpng --modversion >/dev/null 2>&1; then
+ vnc_png_cflags=`$pkg_config libpng --cflags 2> /dev/null`
+ vnc_png_libs=`$pkg_config libpng --libs 2> /dev/null`
+ else
+ vnc_png_cflags=""
+ vnc_png_libs="-lpng"
+ fi
+ if compile_prog "$vnc_png_cflags" "$vnc_png_libs" ; then
+ vnc_png=yes
+ libs_softmmu="$vnc_png_libs $libs_softmmu"
+ QEMU_CFLAGS="$QEMU_CFLAGS $vnc_png_cflags"
+ else
+ if test "$vnc_png" = "yes" ; then
+ feature_not_found "vnc-png"
+ fi
+ vnc_png=no
+ fi
+fi
+
+##########################################
+# fnmatch() probe, used for ACL routines
+fnmatch="no"
+cat > $TMPC << EOF
+#include <fnmatch.h>
+int main(void)
+{
+ fnmatch("foo", "foo", 0);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ fnmatch="yes"
+fi
+
+##########################################
+# uuid_generate() probe, used for vdi block driver
+if test "$uuid" != "no" ; then
+ uuid_libs="-luuid"
+ cat > $TMPC << EOF
+#include <uuid/uuid.h>
+int main(void)
+{
+ uuid_t my_uuid;
+ uuid_generate(my_uuid);
+ return 0;
+}
+EOF
+ if compile_prog "" "$uuid_libs" ; then
+ uuid="yes"
+ libs_softmmu="$uuid_libs $libs_softmmu"
+ libs_tools="$uuid_libs $libs_tools"
+ else
+ if test "$uuid" = "yes" ; then
+ feature_not_found "uuid"
+ fi
+ uuid=no
+ fi
+fi
+
+##########################################
+# xfsctl() probe, used for raw-posix
+if test "$xfs" != "no" ; then
+ cat > $TMPC << EOF
+#include <xfs/xfs.h>
+int main(void)
+{
+ xfsctl(NULL, 0, 0, NULL);
+ return 0;
+}
+EOF
+ if compile_prog "" "" ; then
+ xfs="yes"
+ else
+ if test "$xfs" = "yes" ; then
+ feature_not_found "xfs"
+ fi
+ xfs=no
+ fi
+fi
+
+##########################################
+# vde libraries probe
+if test "$vde" != "no" ; then
+ vde_libs="-lvdeplug"
+ cat > $TMPC << EOF
+#include <libvdeplug.h>
+int main(void)
+{
+ struct vde_open_args a = {0, 0, 0};
+ vde_open("", "", &a);
+ return 0;
+}
+EOF
+ if compile_prog "" "$vde_libs" ; then
+ vde=yes
+ libs_softmmu="$vde_libs $libs_softmmu"
+ libs_tools="$vde_libs $libs_tools"
+ else
+ if test "$vde" = "yes" ; then
+ feature_not_found "vde"
+ fi
+ vde=no
+ fi
+fi
+
+##########################################
+# Sound support libraries probe
+
+audio_drv_probe()
+{
+ drv=$1
+ hdr=$2
+ lib=$3
+ exp=$4
+ cfl=$5
+ cat > $TMPC << EOF
+#include <$hdr>
+int main(void) { $exp }
+EOF
+ if compile_prog "$cfl" "$lib" ; then
+ :
+ else
+ echo
+ echo "Error: $drv check failed"
+ echo "Make sure to have the $drv libs and headers installed."
+ echo
+ exit 1
+ fi
+}
+
+audio_drv_list=`echo "$audio_drv_list" | sed -e 's/,/ /g'`
+for drv in $audio_drv_list; do
+ case $drv in
+ alsa)
+ audio_drv_probe $drv alsa/asoundlib.h -lasound \
+ "snd_pcm_t **handle; return snd_pcm_close(*handle);"
+ libs_softmmu="-lasound $libs_softmmu"
+ ;;
+
+ fmod)
+ if test -z $fmod_lib || test -z $fmod_inc; then
+ echo
+ echo "Error: You must specify path to FMOD library and headers"
+ echo "Example: --fmod-inc=/path/include/fmod --fmod-lib=/path/lib/libfmod-3.74.so"
+ echo
+ exit 1
+ fi
+ audio_drv_probe $drv fmod.h $fmod_lib "return FSOUND_GetVersion();" "-I $fmod_inc"
+ libs_softmmu="$fmod_lib $libs_softmmu"
+ ;;
+
+ esd)
+ audio_drv_probe $drv esd.h -lesd 'return esd_play_stream(0, 0, "", 0);'
+ libs_softmmu="-lesd $libs_softmmu"
+ audio_pt_int="yes"
+ ;;
+
+ pa)
+ audio_drv_probe $drv pulse/simple.h "-lpulse-simple -lpulse" \
+ "pa_simple *s = 0; pa_simple_free(s); return 0;"
+ libs_softmmu="-lpulse -lpulse-simple $libs_softmmu"
+ audio_pt_int="yes"
+ ;;
+
+ coreaudio)
+ libs_softmmu="-framework CoreAudio $libs_softmmu"
+ ;;
+
+ dsound)
+ libs_softmmu="-lole32 -ldxguid $libs_softmmu"
+ audio_win_int="yes"
+ ;;
+
+ oss)
+ libs_softmmu="$oss_lib $libs_softmmu"
+ ;;
+
+ sdl|wav)
+ # XXX: Probes for CoreAudio, DirectSound, SDL(?)
+ ;;
+
+ winwave)
+ libs_softmmu="-lwinmm $libs_softmmu"
+ audio_win_int="yes"
+ ;;
+
+ *)
+ echo "$audio_possible_drivers" | grep -q "\<$drv\>" || {
+ echo
+ echo "Error: Unknown driver '$drv' selected"
+ echo "Possible drivers are: $audio_possible_drivers"
+ echo
+ exit 1
+ }
+ ;;
+ esac
+done
+
+##########################################
+# BrlAPI probe
+
+if test "$brlapi" != "no" ; then
+ brlapi_libs="-lbrlapi"
+ cat > $TMPC << EOF
+#include <brlapi.h>
+#include <stddef.h>
+int main( void ) { return brlapi__openConnection (NULL, NULL, NULL); }
+EOF
+ if compile_prog "" "$brlapi_libs" ; then
+ brlapi=yes
+ libs_softmmu="$brlapi_libs $libs_softmmu"
+ else
+ if test "$brlapi" = "yes" ; then
+ feature_not_found "brlapi"
+ fi
+ brlapi=no
+ fi
+fi
+
+##########################################
+# curses probe
+if test "$mingw32" = "yes" ; then
+ curses_list="-lpdcurses"
+else
+ curses_list="-lncurses -lcurses"
+fi
+
+if test "$curses" != "no" ; then
+ curses_found=no
+ cat > $TMPC << EOF
+#include <curses.h>
+#ifdef __OpenBSD__
+#define resize_term resizeterm
+#endif
+int main(void) { resize_term(0, 0); return curses_version(); }
+EOF
+ for curses_lib in $curses_list; do
+ if compile_prog "" "$curses_lib" ; then
+ curses_found=yes
+ libs_softmmu="$curses_lib $libs_softmmu"
+ break
+ fi
+ done
+ if test "$curses_found" = "yes" ; then
+ curses=yes
+ else
+ if test "$curses" = "yes" ; then
+ feature_not_found "curses"
+ fi
+ curses=no
+ fi
+fi
+
+##########################################
+# curl probe
+
+if $pkg_config libcurl --modversion >/dev/null 2>&1; then
+ curlconfig="$pkg_config libcurl"
+else
+ curlconfig=curl-config
+fi
+
+if test "$curl" != "no" ; then
+ cat > $TMPC << EOF
+#include <curl/curl.h>
+int main(void) { curl_easy_init(); curl_multi_setopt(0, 0, 0); return 0; }
+EOF
+ curl_cflags=`$curlconfig --cflags 2>/dev/null`
+ curl_libs=`$curlconfig --libs 2>/dev/null`
+ if compile_prog "$curl_cflags" "$curl_libs" ; then
+ curl=yes
+ libs_tools="$curl_libs $libs_tools"
+ libs_softmmu="$curl_libs $libs_softmmu"
+ else
+ if test "$curl" = "yes" ; then
+ feature_not_found "curl"
+ fi
+ curl=no
+ fi
+fi # test "$curl"
+
+##########################################
+# check framework probe
+
+if test "$check_utests" != "no" ; then
+ cat > $TMPC << EOF
+#include <check.h>
+int main(void) { suite_create("qemu test"); return 0; }
+EOF
+ check_libs=`$pkg_config --libs check`
+ if compile_prog "" $check_libs ; then
+ check_utests=yes
+ libs_tools="$check_libs $libs_tools"
+ else
+ if test "$check_utests" = "yes" ; then
+ feature_not_found "check"
+ fi
+ check_utests=no
+ fi
+fi # test "$check_utests"
+
+##########################################
+# bluez support probe
+if test "$bluez" != "no" ; then
+ cat > $TMPC << EOF
+#include <bluetooth/bluetooth.h>
+int main(void) { return bt_error(0); }
+EOF
+ bluez_cflags=`$pkg_config --cflags bluez 2> /dev/null`
+ bluez_libs=`$pkg_config --libs bluez 2> /dev/null`
+ if compile_prog "$bluez_cflags" "$bluez_libs" ; then
+ bluez=yes
+ libs_softmmu="$bluez_libs $libs_softmmu"
+ else
+ if test "$bluez" = "yes" ; then
+ feature_not_found "bluez"
+ fi
+ bluez="no"
+ fi
+fi
+
+##########################################
+# glib support probe
+if test "$guest_agent" != "no" ; then
+ if $pkg_config --modversion glib-2.0 > /dev/null 2>&1 ; then
+ glib_cflags=`$pkg_config --cflags glib-2.0 2>/dev/null`
+ glib_libs=`$pkg_config --libs glib-2.0 2>/dev/null`
+ libs_softmmu="$glib_libs $libs_softmmu"
+ libs_tools="$glib_libs $libs_tools"
+ else
+ echo "glib-2.0 required to compile QEMU"
+ exit 1
+ fi
+fi
+
+##########################################
+# pthread probe
+PTHREADLIBS_LIST="-pthread -lpthread -lpthreadGC2"
+
+pthread=no
+cat > $TMPC << EOF
+#include <pthread.h>
+int main(void) { pthread_create(0,0,0,0); return 0; }
+EOF
+if compile_prog "" "" ; then
+ pthread=yes
+else
+ for pthread_lib in $PTHREADLIBS_LIST; do
+ if compile_prog "" "$pthread_lib" ; then
+ pthread=yes
+ LIBS="$pthread_lib $LIBS"
+ break
+ fi
+ done
+fi
+
+if test "$mingw32" != yes -a "$pthread" = no; then
+ echo
+ echo "Error: pthread check failed"
+ echo "Make sure to have the pthread libs and headers installed."
+ echo
+ exit 1
+fi
+
+##########################################
+# rbd probe
+if test "$rbd" != "no" ; then
+ cat > $TMPC <<EOF
+#include <stdio.h>
+#include <rbd/librbd.h>
+int main(void) {
+ rados_t cluster;
+ rados_create(&cluster, NULL);
+ return 0;
+}
+EOF
+ rbd_libs="-lrbd -lrados"
+ if compile_prog "" "$rbd_libs" ; then
+ rbd=yes
+ libs_tools="$rbd_libs $libs_tools"
+ libs_softmmu="$rbd_libs $libs_softmmu"
+ else
+ if test "$rbd" = "yes" ; then
+ feature_not_found "rados block device"
+ fi
+ rbd=no
+ fi
+fi
+
+##########################################
+# linux-aio probe
+
+if test "$linux_aio" != "no" ; then
+ cat > $TMPC <<EOF
+#include <libaio.h>
+#include <sys/eventfd.h>
+#include <stddef.h>
+int main(void) { io_setup(0, NULL); io_set_eventfd(NULL, 0); eventfd(0, 0); return 0; }
+EOF
+ if compile_prog "" "-laio" ; then
+ linux_aio=yes
+ libs_softmmu="$libs_softmmu -laio"
+ libs_tools="$libs_tools -laio"
+ else
+ if test "$linux_aio" = "yes" ; then
+ feature_not_found "linux AIO"
+ fi
+ linux_aio=no
+ fi
+fi
+
+##########################################
+# attr probe
+
+if test "$attr" != "no" ; then
+ cat > $TMPC <<EOF
+#include <stdio.h>
+#include <sys/types.h>
+#include <attr/xattr.h>
+int main(void) { getxattr(NULL, NULL, NULL, 0); setxattr(NULL, NULL, NULL, 0, 0); return 0; }
+EOF
+ if compile_prog "" "-lattr" ; then
+ attr=yes
+ LIBS="-lattr $LIBS"
+ else
+ if test "$attr" = "yes" ; then
+ feature_not_found "ATTR"
+ fi
+ attr=no
+ fi
+fi
+
+##########################################
+# iovec probe
+cat > $TMPC <<EOF
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
+int main(void) { struct iovec iov; return 0; }
+EOF
+iovec=no
+if compile_prog "" "" ; then
+ iovec=yes
+fi
+
+##########################################
+# preadv probe
+cat > $TMPC <<EOF
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
+int main(void) { preadv; }
+EOF
+preadv=no
+if compile_prog "" "" ; then
+ preadv=yes
+fi
+
+##########################################
+# fdt probe
+if test "$fdt" != "no" ; then
+ fdt_libs="-lfdt"
+ cat > $TMPC << EOF
+int main(void) { return 0; }
+EOF
+ if compile_prog "" "$fdt_libs" ; then
+ fdt=yes
+ else
+ if test "$fdt" = "yes" ; then
+ feature_not_found "fdt"
+ fi
+ fdt_libs=
+ fdt=no
+ fi
+fi
+
+##########################################
+# opengl probe, used by milkymist-tmu2
+if test "$opengl" != "no" ; then
+ opengl_libs="-lGL"
+ cat > $TMPC << EOF
+#include <X11/Xlib.h>
+#include <GL/gl.h>
+#include <GL/glx.h>
+int main(void) { GL_VERSION; return 0; }
+EOF
+ if compile_prog "" "-lGL" ; then
+ opengl=yes
+ else
+ if test "$opengl" = "yes" ; then
+ feature_not_found "opengl"
+ fi
+ opengl_libs=
+ opengl=no
+ fi
+fi
+
+#
+# Check for xxxat() functions when we are building linux-user
+# emulator. This is done because older glibc versions don't
+# have syscall stubs for these implemented.
+#
+atfile=no
+cat > $TMPC << EOF
+#define _ATFILE_SOURCE
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int
+main(void)
+{
+ /* try to unlink nonexisting file */
+ return (unlinkat(AT_FDCWD, "nonexistent_file", 0));
+}
+EOF
+if compile_prog "" "" ; then
+ atfile=yes
+fi
+
+# Check for inotify functions when we are building linux-user
+# emulator. This is done because older glibc versions don't
+# have syscall stubs for these implemented. In that case we
+# don't provide them even if kernel supports them.
+#
+inotify=no
+cat > $TMPC << EOF
+#include <sys/inotify.h>
+
+int
+main(void)
+{
+ /* try to start inotify */
+ return inotify_init();
+}
+EOF
+if compile_prog "" "" ; then
+ inotify=yes
+fi
+
+inotify1=no
+cat > $TMPC << EOF
+#include <sys/inotify.h>
+
+int
+main(void)
+{
+ /* try to start inotify */
+ return inotify_init1(0);
+}
+EOF
+if compile_prog "" "" ; then
+ inotify1=yes
+fi
+
+# check if utimensat and futimens are supported
+utimens=no
+cat > $TMPC << EOF
+#define _ATFILE_SOURCE
+#include <stddef.h>
+#include <fcntl.h>
+
+int main(void)
+{
+ utimensat(AT_FDCWD, "foo", NULL, 0);
+ futimens(0, NULL);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ utimens=yes
+fi
+
+# check if pipe2 is there
+pipe2=no
+cat > $TMPC << EOF
+#include <unistd.h>
+#include <fcntl.h>
+
+int main(void)
+{
+ int pipefd[2];
+ pipe2(pipefd, O_CLOEXEC);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ pipe2=yes
+fi
+
+# check if accept4 is there
+accept4=no
+cat > $TMPC << EOF
+#include <sys/socket.h>
+#include <stddef.h>
+
+int main(void)
+{
+ accept4(0, NULL, NULL, SOCK_CLOEXEC);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ accept4=yes
+fi
+
+# check if tee/splice is there. vmsplice was added same time.
+splice=no
+cat > $TMPC << EOF
+#include <unistd.h>
+#include <fcntl.h>
+#include <limits.h>
+
+int main(void)
+{
+ int len, fd;
+ len = tee(STDIN_FILENO, STDOUT_FILENO, INT_MAX, SPLICE_F_NONBLOCK);
+ splice(STDIN_FILENO, NULL, fd, NULL, len, SPLICE_F_MOVE);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ splice=yes
+fi
+
+##########################################
+# signalfd probe
+signalfd="no"
+cat > $TMPC << EOF
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <signal.h>
+int main(void) { return syscall(SYS_signalfd, -1, NULL, _NSIG / 8); }
+EOF
+
+if compile_prog "" "" ; then
+ signalfd=yes
+elif test "$kvm" = "yes" -a "$io_thread" != "yes"; then
+ echo
+ echo "ERROR: Host kernel lacks signalfd() support,"
+ echo "but KVM depends on it when the IO thread is disabled."
+ echo
+ exit 1
+fi
+
+# check if eventfd is supported
+eventfd=no
+cat > $TMPC << EOF
+#include <sys/eventfd.h>
+
+int main(void)
+{
+ int efd = eventfd(0, 0);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ eventfd=yes
+fi
+
+# check for fallocate
+fallocate=no
+cat > $TMPC << EOF
+#include <fcntl.h>
+
+int main(void)
+{
+ fallocate(0, 0, 0, 0);
+ return 0;
+}
+EOF
+if compile_prog "$ARCH_CFLAGS" "" ; then
+ fallocate=yes
+fi
+
+# check for sync_file_range
+sync_file_range=no
+cat > $TMPC << EOF
+#include <fcntl.h>
+
+int main(void)
+{
+ sync_file_range(0, 0, 0, 0);
+ return 0;
+}
+EOF
+if compile_prog "$ARCH_CFLAGS" "" ; then
+ sync_file_range=yes
+fi
+
+# check for linux/fiemap.h and FS_IOC_FIEMAP
+fiemap=no
+cat > $TMPC << EOF
+#include <sys/ioctl.h>
+#include <linux/fs.h>
+#include <linux/fiemap.h>
+
+int main(void)
+{
+ ioctl(0, FS_IOC_FIEMAP, 0);
+ return 0;
+}
+EOF
+if compile_prog "$ARCH_CFLAGS" "" ; then
+ fiemap=yes
+fi
+
+# check for dup3
+dup3=no
+cat > $TMPC << EOF
+#include <unistd.h>
+
+int main(void)
+{
+ dup3(0, 0, 0);
+ return 0;
+}
+EOF
+if compile_prog "" "" ; then
+ dup3=yes
+fi
+
+# check for epoll support
+epoll=no
+cat > $TMPC << EOF
+#include <sys/epoll.h>
+
+int main(void)
+{
+ epoll_create(0);
+ return 0;
+}
+EOF
+if compile_prog "$ARCH_CFLAGS" "" ; then
+ epoll=yes
+fi
+
+# epoll_create1 and epoll_pwait are later additions
+# so we must check separately for their presence
+epoll_create1=no
+cat > $TMPC << EOF
+#include <sys/epoll.h>
+
+int main(void)
+{
+ /* Note that we use epoll_create1 as a value, not as
+ * a function being called. This is necessary so that on
+ * old SPARC glibc versions where the function was present in
+ * the library but not declared in the header file we will
+ * fail the configure check. (Otherwise we will get a compiler
+ * warning but not an error, and will proceed to fail the
+ * qemu compile where we compile with -Werror.)
+ */
+ epoll_create1;
+ return 0;
+}
+EOF
+if compile_prog "$ARCH_CFLAGS" "" ; then
+ epoll_create1=yes
+fi
+
+epoll_pwait=no
+cat > $TMPC << EOF
+#include <sys/epoll.h>
+
+int main(void)
+{
+ epoll_pwait(0, 0, 0, 0, 0);
+ return 0;
+}
+EOF
+if compile_prog "$ARCH_CFLAGS" "" ; then
+ epoll_pwait=yes
+fi
+
+# Check if tools are available to build documentation.
+if test "$docs" != "no" ; then
+ if has makeinfo && has pod2man; then
+ docs=yes
+ else
+ if test "$docs" = "yes" ; then
+ feature_not_found "docs"
+ fi
+ docs=no
+ fi
+fi
+
+# Search for bswap_32 function
+byteswap_h=no
+cat > $TMPC << EOF
+#include <byteswap.h>
+int main(void) { return bswap_32(0); }
+EOF
+if compile_prog "" "" ; then
+ byteswap_h=yes
+fi
+
+# Search for bswap_32 function
+bswap_h=no
+cat > $TMPC << EOF
+#include <sys/endian.h>
+#include <sys/types.h>
+#include <machine/bswap.h>
+int main(void) { return bswap32(0); }
+EOF
+if compile_prog "" "" ; then
+ bswap_h=yes
+fi
+
+##########################################
+# Do we need librt
+cat > $TMPC <<EOF
+#include <signal.h>
+#include <time.h>
+int main(void) { clockid_t id; return clock_gettime(id, NULL); }
+EOF
+
+if compile_prog "" "" ; then
+ :
+elif compile_prog "" "-lrt" ; then
+ LIBS="-lrt $LIBS"
+fi
+
+if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
+ "$aix" != "yes" -a "$haiku" != "yes" ; then
+ libs_softmmu="-lutil $libs_softmmu"
+fi
+
+##########################################
+# check if the compiler defines offsetof
+
+need_offsetof=yes
+cat > $TMPC << EOF
+#include <stddef.h>
+int main(void) { struct s { int f; }; return offsetof(struct s, f); }
+EOF
+if compile_prog "" "" ; then
+ need_offsetof=no
+fi
+
+##########################################
+# check if the compiler understands attribute warn_unused_result
+#
+# This could be smarter, but gcc -Werror does not error out even when warning
+# about attribute warn_unused_result
+
+gcc_attribute_warn_unused_result=no
+cat > $TMPC << EOF
+#if defined(__GNUC__) && (__GNUC__ < 4) && defined(__GNUC_MINOR__) && (__GNUC__ < 4)
+#error gcc 3.3 or older
+#endif
+int main(void) { return 0;}
+EOF
+if compile_prog "" ""; then
+ gcc_attribute_warn_unused_result=yes
+fi
+
+# spice probe
+if test "$spice" != "no" ; then
+ cat > $TMPC << EOF
+#include <spice.h>
+int main(void) { spice_server_new(); return 0; }
+EOF
+ spice_cflags=$($pkg_config --cflags spice-protocol spice-server 2>/dev/null)
+ spice_libs=$($pkg_config --libs spice-protocol spice-server 2>/dev/null)
+ if $pkg_config --atleast-version=0.6.0 spice-server >/dev/null 2>&1 && \
+ compile_prog "$spice_cflags" "$spice_libs" ; then
+ spice="yes"
+ libs_softmmu="$libs_softmmu $spice_libs"
+ QEMU_CFLAGS="$QEMU_CFLAGS $spice_cflags"
+ else
+ if test "$spice" = "yes" ; then
+ feature_not_found "spice"
+ fi
+ spice="no"
+ fi
+fi
+
+# check for libcacard for smartcard support
+if test "$smartcard" != "no" ; then
+ smartcard="yes"
+ smartcard_cflags=""
+ # TODO - what's the minimal nss version we support?
+ if test "$smartcard_nss" != "no"; then
+ if $pkg_config --atleast-version=3.12.8 nss >/dev/null 2>&1 ; then
+ smartcard_nss="yes"
+ smartcard_cflags="-I\$(SRC_PATH)/libcacard"
+ libcacard_libs=$($pkg_config --libs nss 2>/dev/null)
+ libcacard_cflags=$($pkg_config --cflags nss 2>/dev/null)
+ QEMU_CFLAGS="$QEMU_CFLAGS $smartcard_cflags $libcacard_cflags"
+ LIBS="$libcacard_libs $LIBS"
+ else
+ if test "$smartcard_nss" = "yes"; then
+ feature_not_found "nss"
+ fi
+ smartcard_nss="no"
+ fi
+ fi
+fi
+if test "$smartcard" = "no" ; then
+ smartcard_nss="no"
+fi
+
+# check for usbredirparser for usb network redirection support
+if test "$usb_redir" != "no" ; then
+ if $pkg_config libusbredirparser >/dev/null 2>&1 ; then
+ usb_redir="yes"
+ usb_redir_cflags=$($pkg_config --cflags libusbredirparser 2>/dev/null)
+ usb_redir_libs=$($pkg_config --libs libusbredirparser 2>/dev/null)
+ QEMU_CFLAGS="$QEMU_CFLAGS $usb_redir_cflags"
+ LIBS="$LIBS $usb_redir_libs"
+ else
+ if test "$usb_redir" = "yes"; then
+ feature_not_found "usb-redir"
+ fi
+ usb_redir="no"
+ fi
+fi
+
+##########################################
+
+##########################################
+# check if we have fdatasync
+
+fdatasync=no
+cat > $TMPC << EOF
+#include <unistd.h>
+int main(void) {
+#if defined(_POSIX_SYNCHRONIZED_IO) && _POSIX_SYNCHRONIZED_IO > 0
+return fdatasync(0);
+#else
+#abort Not supported
+#endif
+}
+EOF
+if compile_prog "" "" ; then
+ fdatasync=yes
+fi
+
+##########################################
+# check if we have madvise
+
+madvise=no
+cat > $TMPC << EOF
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <stddef.h>
+int main(void) { return madvise(NULL, 0, MADV_DONTNEED); }
+EOF
+if compile_prog "" "" ; then
+ madvise=yes
+fi
+
+##########################################
+# check if we have posix_madvise
+
+posix_madvise=no
+cat > $TMPC << EOF
+#include <sys/mman.h>
+#include <stddef.h>
+int main(void) { return posix_madvise(NULL, 0, POSIX_MADV_DONTNEED); }
+EOF
+if compile_prog "" "" ; then
+ posix_madvise=yes
+fi
+
+##########################################
+# check if trace backend exists
+
+sh "$source_path/scripts/tracetool" "--$trace_backend" --check-backend > /dev/null 2> /dev/null
+if test "$?" -ne 0 ; then
+ echo
+ echo "Error: invalid trace backend"
+ echo "Please choose a supported trace backend."
+ echo
+ exit 1
+fi
+
+##########################################
+# For 'ust' backend, test if ust headers are present
+if test "$trace_backend" = "ust"; then
+ cat > $TMPC << EOF
+#include <ust/tracepoint.h>
+#include <ust/marker.h>
+int main(void) { return 0; }
+EOF
+ if compile_prog "" "" ; then
+ LIBS="-lust $LIBS"
+ else
+ echo
+ echo "Error: Trace backend 'ust' missing libust header files"
+ echo
+ exit 1
+ fi
+fi
+
+##########################################
+# For 'dtrace' backend, test if 'dtrace' command is present
+if test "$trace_backend" = "dtrace"; then
+ if ! has 'dtrace' ; then
+ echo
+ echo "Error: dtrace command is not found in PATH $PATH"
+ echo
+ exit 1
+ fi
+ trace_backend_stap="no"
+ if has 'stap' ; then
+ trace_backend_stap="yes"
+ fi
+fi
+
+##########################################
+# __sync_fetch_and_and requires at least -march=i486. Many toolchains
+# use i686 as default anyway, but for those that don't, an explicit
+# specification is necessary
+if test $vhost_net = "yes" && test $cpu = "i386"; then
+ cat > $TMPC << EOF
+int sfaa(unsigned *ptr)
+{
+ return __sync_fetch_and_and(ptr, 0);
+}
+
+int main(int argc, char **argv)
+{
+ int val = 42;
+ sfaa(&val);
+ return val;
+}
+EOF
+ if ! compile_prog "" "" ; then
+ CFLAGS+="-march=i486"
+ fi
+fi
+
+##########################################
+# End of CC checks
+# After here, no more $cc or $ld runs
+
+if test "$debug" = "no" ; then
+ CFLAGS="-O2 $CFLAGS"
+fi
+
+# Consult white-list to determine whether to enable werror
+# by default. Only enable by default for git builds
+z_version=`cut -f3 -d. $source_path/VERSION`
+
+if test -z "$werror" ; then
+ if test "$z_version" = "50" -a \
+ "$linux" = "yes" ; then
+ werror="yes"
+ else
+ werror="no"
+ fi
+fi
+
+# Disable zero malloc errors for official releases unless explicitly told to
+# enable/disable
+if test -z "$zero_malloc" ; then
+ if test "$z_version" = "50" ; then
+ zero_malloc="no"
+ else
+ zero_malloc="yes"
+ fi
+fi
+
+if test "$werror" = "yes" ; then
+ QEMU_CFLAGS="-Werror $QEMU_CFLAGS"
+fi
+
+if test "$solaris" = "no" ; then
+ if $ld --version 2>/dev/null | grep "GNU ld" >/dev/null 2>/dev/null ; then
+ LDFLAGS="-Wl,--warn-common $LDFLAGS"
+ fi
+fi
+
+# Use ASLR, no-SEH and DEP if available
+if test "$mingw32" = "yes" ; then
+ for flag in --dynamicbase --no-seh --nxcompat; do
+ if $ld --help 2>/dev/null | grep ".$flag" >/dev/null 2>/dev/null ; then
+ LDFLAGS="-Wl,$flag $LDFLAGS"
+ fi
+ done
+fi
+
+confdir=$sysconfdir$confsuffix
+
+tools=
+if test "$softmmu" = yes ; then
+ tools="qemu-img\$(EXESUF) qemu-io\$(EXESUF) $tools"
+ if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" ] ; then
+ tools="qemu-nbd\$(EXESUF) $tools"
+ if [ "$guest_agent" = "yes" ]; then
+ tools="qemu-ga\$(EXESUF) $tools"
+ fi
+ if [ "$check_utests" = "yes" ]; then
+ tools="check-qint check-qstring check-qdict check-qlist $tools"
+ tools="check-qfloat check-qjson $tools"
+ fi
+ fi
+fi
+
+# Mac OS X ships with a broken assembler
+roms=
+if test \( "$cpu" = "i386" -o "$cpu" = "x86_64" \) -a \
+ "$targetos" != "Darwin" -a "$targetos" != "SunOS" -a \
+ "$softmmu" = yes ; then
+ roms="optionrom"
+fi
+if test "$cpu" = "ppc64" -a "$targetos" != "Darwin" ; then
+ roms="$roms spapr-rtas"
+fi
+
+echo "Install prefix $prefix"
+echo "BIOS directory `eval echo $datadir`"
+echo "binary directory `eval echo $bindir`"
+echo "library directory `eval echo $libdir`"
+echo "config directory `eval echo $sysconfdir`"
+if test "$mingw32" = "no" ; then
+echo "Manual directory `eval echo $mandir`"
+echo "ELF interp prefix $interp_prefix"
+fi
+echo "Source path $source_path"
+echo "C compiler $cc"
+echo "Host C compiler $host_cc"
+echo "CFLAGS $CFLAGS"
+echo "QEMU_CFLAGS $QEMU_CFLAGS"
+echo "LDFLAGS $LDFLAGS"
+echo "make $make"
+echo "install $install"
+echo "python $python"
+if test "$slirp" = "yes" ; then
+ echo "smbd $smbd"
+fi
+echo "host CPU $cpu"
+echo "host big endian $bigendian"
+echo "target list $target_list"
+echo "tcg debug enabled $debug_tcg"
+echo "Mon debug enabled $debug_mon"
+echo "gprof enabled $gprof"
+echo "sparse enabled $sparse"
+echo "strip binaries $strip_opt"
+echo "profiler $profiler"
+echo "static build $static"
+echo "-Werror enabled $werror"
+if test "$darwin" = "yes" ; then
+ echo "Cocoa support $cocoa"
+fi
+echo "SDL support $sdl"
+echo "curses support $curses"
+echo "curl support $curl"
+echo "check support $check_utests"
+echo "mingw32 support $mingw32"
+echo "Audio drivers $audio_drv_list"
+echo "Extra audio cards $audio_card_list"
+echo "Block whitelist $block_drv_whitelist"
+echo "Mixer emulation $mixemu"
+echo "VNC support $vnc"
+if test "$vnc" = "yes" ; then
+ echo "VNC TLS support $vnc_tls"
+ echo "VNC SASL support $vnc_sasl"
+ echo "VNC JPEG support $vnc_jpeg"
+ echo "VNC PNG support $vnc_png"
+ echo "VNC thread $vnc_thread"
+fi
+if test -n "$sparc_cpu"; then
+ echo "Target Sparc Arch $sparc_cpu"
+fi
+echo "xen support $xen"
+echo "brlapi support $brlapi"
+echo "bluez support $bluez"
+echo "Documentation $docs"
+[ ! -z "$uname_release" ] && \
+echo "uname -r $uname_release"
+echo "NPTL support $nptl"
+echo "GUEST_BASE $guest_base"
+echo "PIE user targets $user_pie"
+echo "vde support $vde"
+echo "IO thread $io_thread"
+echo "Linux AIO support $linux_aio"
+echo "ATTR/XATTR support $attr"
+echo "Install blobs $blobs"
+echo "KVM support $kvm"
+echo "fdt support $fdt"
+echo "preadv support $preadv"
+echo "fdatasync $fdatasync"
+echo "madvise $madvise"
+echo "posix_madvise $posix_madvise"
+echo "uuid support $uuid"
+echo "vhost-net support $vhost_net"
+echo "Trace backend $trace_backend"
+echo "Trace output file $trace_file-<pid>"
+echo "spice support $spice"
+echo "rbd support $rbd"
+echo "xfsctl support $xfs"
+echo "nss used $smartcard_nss"
+echo "usb net redir $usb_redir"
+echo "OpenGL support $opengl"
+echo "build guest agent $guest_agent"
+
+if test $sdl_too_old = "yes"; then
+echo "-> Your SDL version is too old - please upgrade to have SDL support"
+fi
+
+config_host_mak="config-host.mak"
+config_host_ld="config-host.ld"
+
+echo "# Automatically generated by configure - do not modify" > $config_host_mak
+printf "# Configured with:" >> $config_host_mak
+printf " '%s'" "$0" "$@" >> $config_host_mak
+echo >> $config_host_mak
+
+echo all: >> $config_host_mak
+echo "prefix=$prefix" >> $config_host_mak
+echo "bindir=$bindir" >> $config_host_mak
+echo "libdir=$libdir" >> $config_host_mak
+echo "mandir=$mandir" >> $config_host_mak
+echo "datadir=$datadir" >> $config_host_mak
+echo "sysconfdir=$sysconfdir" >> $config_host_mak
+echo "docdir=$docdir" >> $config_host_mak
+echo "confdir=$confdir" >> $config_host_mak
+
+case "$cpu" in
+ i386|x86_64|alpha|cris|hppa|ia64|lm32|m68k|microblaze|mips|mips64|ppc|ppc64|s390|s390x|sparc|sparc64|unicore32)
+ ARCH=$cpu
+ ;;
+ armv4b|armv4l)
+ ARCH=arm
+ ;;
+esac
+echo "ARCH=$ARCH" >> $config_host_mak
+if test "$debug_tcg" = "yes" ; then
+ echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
+fi
+if test "$debug_mon" = "yes" ; then
+ echo "CONFIG_DEBUG_MONITOR=y" >> $config_host_mak
+fi
+if test "$debug" = "yes" ; then
+ echo "CONFIG_DEBUG_EXEC=y" >> $config_host_mak
+fi
+if test "$strip_opt" = "yes" ; then
+ echo "STRIP=${strip}" >> $config_host_mak
+fi
+if test "$bigendian" = "yes" ; then
+ echo "HOST_WORDS_BIGENDIAN=y" >> $config_host_mak
+fi
+echo "HOST_LONG_BITS=$hostlongbits" >> $config_host_mak
+if test "$mingw32" = "yes" ; then
+ echo "CONFIG_WIN32=y" >> $config_host_mak
+ rc_version=`cat $source_path/VERSION`
+ version_major=${rc_version%%.*}
+ rc_version=${rc_version#*.}
+ version_minor=${rc_version%%.*}
+ rc_version=${rc_version#*.}
+ version_subminor=${rc_version%%.*}
+ version_micro=0
+ echo "CONFIG_FILEVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
+ echo "CONFIG_PRODUCTVERSION=$version_major,$version_minor,$version_subminor,$version_micro" >> $config_host_mak
+else
+ echo "CONFIG_POSIX=y" >> $config_host_mak
+fi
+
+if test "$linux" = "yes" ; then
+ echo "CONFIG_LINUX=y" >> $config_host_mak
+fi
+
+if test "$darwin" = "yes" ; then
+ echo "CONFIG_DARWIN=y" >> $config_host_mak
+fi
+
+if test "$aix" = "yes" ; then
+ echo "CONFIG_AIX=y" >> $config_host_mak
+fi
+
+if test "$solaris" = "yes" ; then
+ echo "CONFIG_SOLARIS=y" >> $config_host_mak
+ echo "CONFIG_SOLARIS_VERSION=$solarisrev" >> $config_host_mak
+ if test "$needs_libsunmath" = "yes" ; then
+ echo "CONFIG_NEEDS_LIBSUNMATH=y" >> $config_host_mak
+ fi
+fi
+if test "$haiku" = "yes" ; then
+ echo "CONFIG_HAIKU=y" >> $config_host_mak
+fi
+if test "$static" = "yes" ; then
+ echo "CONFIG_STATIC=y" >> $config_host_mak
+fi
+if test $profiler = "yes" ; then
+ echo "CONFIG_PROFILER=y" >> $config_host_mak
+fi
+if test "$slirp" = "yes" ; then
+ echo "CONFIG_SLIRP=y" >> $config_host_mak
+ echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
+ QEMU_INCLUDES="-I\$(SRC_PATH)/slirp $QEMU_INCLUDES"
+fi
+if test "$vde" = "yes" ; then
+ echo "CONFIG_VDE=y" >> $config_host_mak
+fi
+for card in $audio_card_list; do
+ def=CONFIG_`echo $card | tr '[:lower:]' '[:upper:]'`
+ echo "$def=y" >> $config_host_mak
+done
+echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak
+for drv in $audio_drv_list; do
+ def=CONFIG_`echo $drv | tr '[:lower:]' '[:upper:]'`
+ echo "$def=y" >> $config_host_mak
+ if test "$drv" = "fmod"; then
+ echo "FMOD_CFLAGS=-I$fmod_inc" >> $config_host_mak
+ fi
+done
+if test "$audio_pt_int" = "yes" ; then
+ echo "CONFIG_AUDIO_PT_INT=y" >> $config_host_mak
+fi
+if test "$audio_win_int" = "yes" ; then
+ echo "CONFIG_AUDIO_WIN_INT=y" >> $config_host_mak
+fi
+echo "CONFIG_BDRV_WHITELIST=$block_drv_whitelist" >> $config_host_mak
+if test "$mixemu" = "yes" ; then
+ echo "CONFIG_MIXEMU=y" >> $config_host_mak
+fi
+if test "$vnc" = "yes" ; then
+ echo "CONFIG_VNC=y" >> $config_host_mak
+fi
+if test "$vnc_tls" = "yes" ; then
+ echo "CONFIG_VNC_TLS=y" >> $config_host_mak
+ echo "VNC_TLS_CFLAGS=$vnc_tls_cflags" >> $config_host_mak
+fi
+if test "$vnc_sasl" = "yes" ; then
+ echo "CONFIG_VNC_SASL=y" >> $config_host_mak
+ echo "VNC_SASL_CFLAGS=$vnc_sasl_cflags" >> $config_host_mak
+fi
+if test "$vnc_jpeg" = "yes" ; then
+ echo "CONFIG_VNC_JPEG=y" >> $config_host_mak
+ echo "VNC_JPEG_CFLAGS=$vnc_jpeg_cflags" >> $config_host_mak
+fi
+if test "$vnc_png" = "yes" ; then
+ echo "CONFIG_VNC_PNG=y" >> $config_host_mak
+ echo "VNC_PNG_CFLAGS=$vnc_png_cflags" >> $config_host_mak
+fi
+if test "$vnc_thread" = "yes" ; then
+ echo "CONFIG_VNC_THREAD=y" >> $config_host_mak
+fi
+if test "$fnmatch" = "yes" ; then
+ echo "CONFIG_FNMATCH=y" >> $config_host_mak
+fi
+if test "$uuid" = "yes" ; then
+ echo "CONFIG_UUID=y" >> $config_host_mak
+fi
+if test "$xfs" = "yes" ; then
+ echo "CONFIG_XFS=y" >> $config_host_mak
+fi
+qemu_version=`head $source_path/VERSION`
+echo "VERSION=$qemu_version" >>$config_host_mak
+echo "PKGVERSION=$pkgversion" >>$config_host_mak
+echo "SRC_PATH=$source_path" >> $config_host_mak
+echo "TARGET_DIRS=$target_list" >> $config_host_mak
+if [ "$docs" = "yes" ] ; then
+ echo "BUILD_DOCS=yes" >> $config_host_mak
+fi
+if test "$sdl" = "yes" ; then
+ echo "CONFIG_SDL=y" >> $config_host_mak
+ echo "SDL_CFLAGS=$sdl_cflags" >> $config_host_mak
+fi
+if test "$cocoa" = "yes" ; then
+ echo "CONFIG_COCOA=y" >> $config_host_mak
+fi
+if test "$curses" = "yes" ; then
+ echo "CONFIG_CURSES=y" >> $config_host_mak
+fi
+if test "$atfile" = "yes" ; then
+ echo "CONFIG_ATFILE=y" >> $config_host_mak
+fi
+if test "$utimens" = "yes" ; then
+ echo "CONFIG_UTIMENSAT=y" >> $config_host_mak
+fi
+if test "$pipe2" = "yes" ; then
+ echo "CONFIG_PIPE2=y" >> $config_host_mak
+fi
+if test "$accept4" = "yes" ; then
+ echo "CONFIG_ACCEPT4=y" >> $config_host_mak
+fi
+if test "$splice" = "yes" ; then
+ echo "CONFIG_SPLICE=y" >> $config_host_mak
+fi
+if test "$eventfd" = "yes" ; then
+ echo "CONFIG_EVENTFD=y" >> $config_host_mak
+fi
+if test "$fallocate" = "yes" ; then
+ echo "CONFIG_FALLOCATE=y" >> $config_host_mak
+fi
+if test "$sync_file_range" = "yes" ; then
+ echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
+fi
+if test "$fiemap" = "yes" ; then
+ echo "CONFIG_FIEMAP=y" >> $config_host_mak
+fi
+if test "$dup3" = "yes" ; then
+ echo "CONFIG_DUP3=y" >> $config_host_mak
+fi
+if test "$epoll" = "yes" ; then
+ echo "CONFIG_EPOLL=y" >> $config_host_mak
+fi
+if test "$epoll_create1" = "yes" ; then
+ echo "CONFIG_EPOLL_CREATE1=y" >> $config_host_mak
+fi
+if test "$epoll_pwait" = "yes" ; then
+ echo "CONFIG_EPOLL_PWAIT=y" >> $config_host_mak
+fi
+if test "$inotify" = "yes" ; then
+ echo "CONFIG_INOTIFY=y" >> $config_host_mak
+fi
+if test "$inotify1" = "yes" ; then
+ echo "CONFIG_INOTIFY1=y" >> $config_host_mak
+fi
+if test "$byteswap_h" = "yes" ; then
+ echo "CONFIG_BYTESWAP_H=y" >> $config_host_mak
+fi
+if test "$bswap_h" = "yes" ; then
+ echo "CONFIG_MACHINE_BSWAP_H=y" >> $config_host_mak
+fi
+if test "$curl" = "yes" ; then
+ echo "CONFIG_CURL=y" >> $config_host_mak
+ echo "CURL_CFLAGS=$curl_cflags" >> $config_host_mak
+fi
+if test "$brlapi" = "yes" ; then
+ echo "CONFIG_BRLAPI=y" >> $config_host_mak
+fi
+if test "$bluez" = "yes" ; then
+ echo "CONFIG_BLUEZ=y" >> $config_host_mak
+ echo "BLUEZ_CFLAGS=$bluez_cflags" >> $config_host_mak
+fi
+echo "GLIB_CFLAGS=$glib_cflags" >> $config_host_mak
+if test "$xen" = "yes" ; then
+ echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak
+ echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> $config_host_mak
+fi
+if test "$io_thread" = "yes" ; then
+ echo "CONFIG_IOTHREAD=y" >> $config_host_mak
+fi
+if test "$linux_aio" = "yes" ; then
+ echo "CONFIG_LINUX_AIO=y" >> $config_host_mak
+fi
+if test "$attr" = "yes" ; then
+ echo "CONFIG_ATTR=y" >> $config_host_mak
+fi
+if test "$linux" = "yes" ; then
+ if test "$attr" = "yes" ; then
+ echo "CONFIG_VIRTFS=y" >> $config_host_mak
+ fi
+fi
+if test "$blobs" = "yes" ; then
+ echo "INSTALL_BLOBS=yes" >> $config_host_mak
+fi
+if test "$iovec" = "yes" ; then
+ echo "CONFIG_IOVEC=y" >> $config_host_mak
+fi
+if test "$preadv" = "yes" ; then
+ echo "CONFIG_PREADV=y" >> $config_host_mak
+fi
+if test "$fdt" = "yes" ; then
+ echo "CONFIG_FDT=y" >> $config_host_mak
+fi
+if test "$signalfd" = "yes" ; then
+ echo "CONFIG_SIGNALFD=y" >> $config_host_mak
+fi
+if test "$need_offsetof" = "yes" ; then
+ echo "CONFIG_NEED_OFFSETOF=y" >> $config_host_mak
+fi
+if test "$gcc_attribute_warn_unused_result" = "yes" ; then
+ echo "CONFIG_GCC_ATTRIBUTE_WARN_UNUSED_RESULT=y" >> $config_host_mak
+fi
+if test "$fdatasync" = "yes" ; then
+ echo "CONFIG_FDATASYNC=y" >> $config_host_mak
+fi
+if test "$madvise" = "yes" ; then
+ echo "CONFIG_MADVISE=y" >> $config_host_mak
+fi
+if test "$posix_madvise" = "yes" ; then
+ echo "CONFIG_POSIX_MADVISE=y" >> $config_host_mak
+fi
+
+if test "$spice" = "yes" ; then
+ echo "CONFIG_SPICE=y" >> $config_host_mak
+fi
+
+if test "$smartcard" = "yes" ; then
+ echo "CONFIG_SMARTCARD=y" >> $config_host_mak
+fi
+
+if test "$smartcard_nss" = "yes" ; then
+ echo "CONFIG_SMARTCARD_NSS=y" >> $config_host_mak
+fi
+
+if test "$usb_redir" = "yes" ; then
+ echo "CONFIG_USB_REDIR=y" >> $config_host_mak
+fi
+
+if test "$opengl" = "yes" ; then
+ echo "CONFIG_OPENGL=y" >> $config_host_mak
+fi
+
+# XXX: suppress that
+if [ "$bsd" = "yes" ] ; then
+ echo "CONFIG_BSD=y" >> $config_host_mak
+fi
+
+echo "CONFIG_UNAME_RELEASE=\"$uname_release\"" >> $config_host_mak
+
+if test "$zero_malloc" = "yes" ; then
+ echo "CONFIG_ZERO_MALLOC=y" >> $config_host_mak
+fi
+if test "$rbd" = "yes" ; then
+ echo "CONFIG_RBD=y" >> $config_host_mak
+fi
+
+# USB host support
+case "$usb" in
+linux)
+ echo "HOST_USB=linux" >> $config_host_mak
+;;
+bsd)
+ echo "HOST_USB=bsd" >> $config_host_mak
+;;
+*)
+ echo "HOST_USB=stub" >> $config_host_mak
+;;
+esac
+
+echo "TRACE_BACKEND=$trace_backend" >> $config_host_mak
+if test "$trace_backend" = "simple"; then
+ echo "CONFIG_SIMPLE_TRACE=y" >> $config_host_mak
+fi
+# Set the appropriate trace file.
+if test "$trace_backend" = "simple"; then
+ trace_file="\"$trace_file-\" FMT_pid"
+fi
+if test "$trace_backend" = "dtrace" -a "$trace_backend_stap" = "yes" ; then
+ echo "CONFIG_SYSTEMTAP_TRACE=y" >> $config_host_mak
+fi
+echo "CONFIG_TRACE_FILE=$trace_file" >> $config_host_mak
+
+echo "TOOLS=$tools" >> $config_host_mak
+echo "ROMS=$roms" >> $config_host_mak
+echo "MAKE=$make" >> $config_host_mak
+echo "INSTALL=$install" >> $config_host_mak
+echo "INSTALL_DIR=$install -d -m 0755" >> $config_host_mak
+echo "INSTALL_DATA=$install -c -m 0644" >> $config_host_mak
+echo "INSTALL_PROG=$install -c -m 0755" >> $config_host_mak
+echo "PYTHON=$python" >> $config_host_mak
+echo "CC=$cc" >> $config_host_mak
+echo "CC_I386=$cc_i386" >> $config_host_mak
+echo "HOST_CC=$host_cc" >> $config_host_mak
+echo "AR=$ar" >> $config_host_mak
+echo "OBJCOPY=$objcopy" >> $config_host_mak
+echo "LD=$ld" >> $config_host_mak
+echo "WINDRES=$windres" >> $config_host_mak
+echo "LIBTOOL=$libtool" >> $config_host_mak
+echo "CFLAGS=$CFLAGS" >> $config_host_mak
+echo "QEMU_CFLAGS=$QEMU_CFLAGS" >> $config_host_mak
+echo "QEMU_INCLUDES=$QEMU_INCLUDES" >> $config_host_mak
+if test "$sparse" = "yes" ; then
+ echo "CC := REAL_CC=\"\$(CC)\" cgcc" >> $config_host_mak
+ echo "HOST_CC := REAL_CC=\"\$(HOST_CC)\" cgcc" >> $config_host_mak
+ echo "QEMU_CFLAGS += -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-non-pointer-null" >> $config_host_mak
+fi
+echo "HELPER_CFLAGS=$helper_cflags" >> $config_host_mak
+echo "LDFLAGS=$LDFLAGS" >> $config_host_mak
+echo "ARLIBS_BEGIN=$arlibs_begin" >> $config_host_mak
+echo "ARLIBS_END=$arlibs_end" >> $config_host_mak
+echo "LIBS+=$LIBS" >> $config_host_mak
+echo "LIBS_TOOLS+=$libs_tools" >> $config_host_mak
+echo "EXESUF=$EXESUF" >> $config_host_mak
+
+# generate list of library paths for linker script
+
+$ld --verbose -v 2> /dev/null | grep SEARCH_DIR > ${config_host_ld}
+
+if test -f ${config_host_ld}~ ; then
+ if cmp -s $config_host_ld ${config_host_ld}~ ; then
+ mv ${config_host_ld}~ $config_host_ld
+ else
+ rm ${config_host_ld}~
+ fi
+fi
+
+for d in libdis libdis-user; do
+ mkdir -p $d
+ symlink $source_path/Makefile.dis $d/Makefile
+ echo > $d/config.mak
+done
+if test "$static" = "no" -a "$user_pie" = "yes" ; then
+ echo "QEMU_CFLAGS+=-fpie" > libdis-user/config.mak
+fi
+
+for target in $target_list; do
+target_dir="$target"
+config_target_mak=$target_dir/config-target.mak
+target_arch2=`echo $target | cut -d '-' -f 1`
+target_bigendian="no"
+
+case "$target_arch2" in
+ armeb|lm32|m68k|microblaze|mips|mipsn32|mips64|ppc|ppcemb|ppc64|ppc64abi32|s390x|sh4eb|sparc|sparc64|sparc32plus)
+ target_bigendian=yes
+ ;;
+esac
+target_softmmu="no"
+target_user_only="no"
+target_linux_user="no"
+target_darwin_user="no"
+target_bsd_user="no"
+case "$target" in
+ ${target_arch2}-softmmu)
+ target_softmmu="yes"
+ ;;
+ ${target_arch2}-linux-user)
+ if test "$linux" != "yes" ; then
+ echo "ERROR: Target '$target' is only available on a Linux host"
+ exit 1
+ fi
+ target_user_only="yes"
+ target_linux_user="yes"
+ ;;
+ ${target_arch2}-darwin-user)
+ if test "$darwin" != "yes" ; then
+ echo "ERROR: Target '$target' is only available on a Darwin host"
+ exit 1
+ fi
+ target_user_only="yes"
+ target_darwin_user="yes"
+ ;;
+ ${target_arch2}-bsd-user)
+ if test "$bsd" != "yes" ; then
+ echo "ERROR: Target '$target' is only available on a BSD host"
+ exit 1
+ fi
+ target_user_only="yes"
+ target_bsd_user="yes"
+ ;;
+ *)
+ echo "ERROR: Target '$target' not recognised"
+ exit 1
+ ;;
+esac
+
+mkdir -p $target_dir
+mkdir -p $target_dir/fpu
+mkdir -p $target_dir/tcg
+mkdir -p $target_dir/ide
+mkdir -p $target_dir/9pfs
+if test "$target" = "arm-linux-user" -o "$target" = "armeb-linux-user" -o "$target" = "arm-bsd-user" -o "$target" = "armeb-bsd-user" ; then
+ mkdir -p $target_dir/nwfpe
+fi
+symlink $source_path/Makefile.target $target_dir/Makefile
+
+
+echo "# Automatically generated by configure - do not modify" > $config_target_mak
+
+bflt="no"
+target_nptl="no"
+interp_prefix1=`echo "$interp_prefix" | sed "s/%M/$target_arch2/g"`
+echo "CONFIG_QEMU_INTERP_PREFIX=\"$interp_prefix1\"" >> $config_target_mak
+gdb_xml_files=""
+target_short_alignment=2
+target_int_alignment=4
+target_long_alignment=4
+target_llong_alignment=8
+target_libs_softmmu=
+
+TARGET_ARCH="$target_arch2"
+TARGET_BASE_ARCH=""
+TARGET_ABI_DIR=""
+
+case "$target_arch2" in
+ i386)
+ target_phys_bits=64
+ ;;
+ x86_64)
+ TARGET_BASE_ARCH=i386
+ target_phys_bits=64
+ target_long_alignment=8
+ ;;
+ alpha)
+ target_phys_bits=64
+ target_long_alignment=8
+ target_nptl="yes"
+ ;;
+ arm|armeb)
+ TARGET_ARCH=arm
+ bflt="yes"
+ target_nptl="yes"
+ gdb_xml_files="arm-core.xml arm-vfp.xml arm-vfp3.xml arm-neon.xml"
+ target_phys_bits=32
+ target_llong_alignment=4
+ ;;
+ cris)
+ target_nptl="yes"
+ target_phys_bits=32
+ ;;
+ lm32)
+ target_phys_bits=32
+ target_libs_softmmu="$opengl_libs"
+ ;;
+ m68k)
+ bflt="yes"
+ gdb_xml_files="cf-core.xml cf-fp.xml"
+ target_phys_bits=32
+ target_int_alignment=2
+ target_long_alignment=2
+ target_llong_alignment=2
+ ;;
+ microblaze|microblazeel)
+ TARGET_ARCH=microblaze
+ bflt="yes"
+ target_nptl="yes"
+ target_phys_bits=32
+ target_libs_softmmu="$fdt_libs"
+ ;;
+ mips|mipsel)
+ TARGET_ARCH=mips
+ echo "TARGET_ABI_MIPSO32=y" >> $config_target_mak
+ target_nptl="yes"
+ target_phys_bits=64
+ ;;
+ mipsn32|mipsn32el)
+ TARGET_ARCH=mipsn32
+ TARGET_BASE_ARCH=mips
+ echo "TARGET_ABI_MIPSN32=y" >> $config_target_mak
+ target_phys_bits=64
+ ;;
+ mips64|mips64el)
+ TARGET_ARCH=mips64
+ TARGET_BASE_ARCH=mips
+ echo "TARGET_ABI_MIPSN64=y" >> $config_target_mak
+ target_phys_bits=64
+ target_long_alignment=8
+ ;;
+ ppc)
+ gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
+ target_phys_bits=32
+ target_nptl="yes"
+ target_libs_softmmu="$fdt_libs"
+ ;;
+ ppcemb)
+ TARGET_BASE_ARCH=ppc
+ TARGET_ABI_DIR=ppc
+ gdb_xml_files="power-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
+ target_phys_bits=64
+ target_nptl="yes"
+ target_libs_softmmu="$fdt_libs"
+ ;;
+ ppc64)
+ TARGET_BASE_ARCH=ppc
+ TARGET_ABI_DIR=ppc
+ gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
+ target_phys_bits=64
+ target_long_alignment=8
+ target_libs_softmmu="$fdt_libs"
+ ;;
+ ppc64abi32)
+ TARGET_ARCH=ppc64
+ TARGET_BASE_ARCH=ppc
+ TARGET_ABI_DIR=ppc
+ echo "TARGET_ABI32=y" >> $config_target_mak
+ gdb_xml_files="power64-core.xml power-fpu.xml power-altivec.xml power-spe.xml"
+ target_phys_bits=64
+ target_libs_softmmu="$fdt_libs"
+ ;;
+ sh4|sh4eb)
+ TARGET_ARCH=sh4
+ bflt="yes"
+ target_nptl="yes"
+ target_phys_bits=32
+ ;;
+ sparc)
+ target_phys_bits=64
+ ;;
+ sparc64)
+ TARGET_BASE_ARCH=sparc
+ target_phys_bits=64
+ target_long_alignment=8
+ ;;
+ sparc32plus)
+ TARGET_ARCH=sparc64
+ TARGET_BASE_ARCH=sparc
+ TARGET_ABI_DIR=sparc
+ echo "TARGET_ABI32=y" >> $config_target_mak
+ target_phys_bits=64
+ ;;
+ s390x)
+ target_nptl="yes"
+ target_phys_bits=64
+ target_long_alignment=8
+ ;;
+ unicore32)
+ target_phys_bits=32
+ ;;
+ *)
+ echo "Unsupported target CPU"
+ exit 1
+ ;;
+esac
+echo "TARGET_SHORT_ALIGNMENT=$target_short_alignment" >> $config_target_mak
+echo "TARGET_INT_ALIGNMENT=$target_int_alignment" >> $config_target_mak
+echo "TARGET_LONG_ALIGNMENT=$target_long_alignment" >> $config_target_mak
+echo "TARGET_LLONG_ALIGNMENT=$target_llong_alignment" >> $config_target_mak
+echo "TARGET_ARCH=$TARGET_ARCH" >> $config_target_mak
+target_arch_name="`echo $TARGET_ARCH | tr '[:lower:]' '[:upper:]'`"
+echo "TARGET_$target_arch_name=y" >> $config_target_mak
+echo "TARGET_ARCH2=$target_arch2" >> $config_target_mak
+# TARGET_BASE_ARCH needs to be defined after TARGET_ARCH
+if [ "$TARGET_BASE_ARCH" = "" ]; then
+ TARGET_BASE_ARCH=$TARGET_ARCH
+fi
+echo "TARGET_BASE_ARCH=$TARGET_BASE_ARCH" >> $config_target_mak
+if [ "$TARGET_ABI_DIR" = "" ]; then
+ TARGET_ABI_DIR=$TARGET_ARCH
+fi
+echo "TARGET_ABI_DIR=$TARGET_ABI_DIR" >> $config_target_mak
+case "$target_arch2" in
+ i386|x86_64)
+ if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then
+ target_phys_bits=64
+ echo "CONFIG_XEN=y" >> $config_target_mak
+ if test "$cpu" = "i386" -o "$cpu" = "x86_64"; then
+ echo "CONFIG_XEN_MAPCACHE=y" >> $config_target_mak
+ fi
+ fi
+esac
+case "$target_arch2" in
+ i386|x86_64|ppcemb|ppc|ppc64|s390x)
+ # Make sure the target and host cpus are compatible
+ if test "$kvm" = "yes" -a "$target_softmmu" = "yes" -a \
+ \( "$target_arch2" = "$cpu" -o \
+ \( "$target_arch2" = "ppcemb" -a "$cpu" = "ppc" \) -o \
+ \( "$target_arch2" = "ppc64" -a "$cpu" = "ppc" \) -o \
+ \( "$target_arch2" = "ppc" -a "$cpu" = "ppc64" \) -o \
+ \( "$target_arch2" = "ppcemb" -a "$cpu" = "ppc64" \) -o \
+ \( "$target_arch2" = "x86_64" -a "$cpu" = "i386" \) -o \
+ \( "$target_arch2" = "i386" -a "$cpu" = "x86_64" \) \) ; then
+ echo "CONFIG_KVM=y" >> $config_target_mak
+ if test $vhost_net = "yes" ; then
+ echo "CONFIG_VHOST_NET=y" >> $config_target_mak
+ fi
+ fi
+esac
+if test "$target_bigendian" = "yes" ; then
+ echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
+fi
+if test "$target_softmmu" = "yes" ; then
+ echo "TARGET_PHYS_ADDR_BITS=$target_phys_bits" >> $config_target_mak
+ echo "CONFIG_SOFTMMU=y" >> $config_target_mak
+ echo "LIBS+=$libs_softmmu $target_libs_softmmu" >> $config_target_mak
+ echo "HWDIR=../libhw$target_phys_bits" >> $config_target_mak
+ echo "subdir-$target: subdir-libhw$target_phys_bits" >> $config_host_mak
+fi
+if test "$target_user_only" = "yes" ; then
+ echo "CONFIG_USER_ONLY=y" >> $config_target_mak
+fi
+if test "$target_linux_user" = "yes" ; then
+ echo "CONFIG_LINUX_USER=y" >> $config_target_mak
+fi
+if test "$target_darwin_user" = "yes" ; then
+ echo "CONFIG_DARWIN_USER=y" >> $config_target_mak
+fi
+if test "$smartcard_nss" = "yes" ; then
+ echo "subdir-$target: subdir-libcacard" >> $config_host_mak
+ echo "libcacard_libs=$libcacard_libs" >> $config_host_mak
+ echo "libcacard_cflags=$libcacard_cflags" >> $config_host_mak
+fi
+list=""
+if test ! -z "$gdb_xml_files" ; then
+ for x in $gdb_xml_files; do
+ list="$list $source_path/gdb-xml/$x"
+ done
+ echo "TARGET_XML_FILES=$list" >> $config_target_mak
+fi
+
+if test "$target_user_only" = "yes" -a "$bflt" = "yes"; then
+ echo "TARGET_HAS_BFLT=y" >> $config_target_mak
+fi
+if test "$target_user_only" = "yes" \
+ -a "$nptl" = "yes" -a "$target_nptl" = "yes"; then
+ echo "CONFIG_USE_NPTL=y" >> $config_target_mak
+fi
+if test "$target_user_only" = "yes" -a "$guest_base" = "yes"; then
+ echo "CONFIG_USE_GUEST_BASE=y" >> $config_target_mak
+fi
+if test "$target_bsd_user" = "yes" ; then
+ echo "CONFIG_BSD_USER=y" >> $config_target_mak
+fi
+
+# generate QEMU_CFLAGS/LDFLAGS for targets
+
+cflags=""
+includes=""
+ldflags=""
+
+if test "$ARCH" = "sparc64" ; then
+ includes="-I\$(SRC_PATH)/tcg/sparc $includes"
+elif test "$ARCH" = "s390x" ; then
+ includes="-I\$(SRC_PATH)/tcg/s390 $includes"
+elif test "$ARCH" = "x86_64" ; then
+ includes="-I\$(SRC_PATH)/tcg/i386 $includes"
+else
+ includes="-I\$(SRC_PATH)/tcg/\$(ARCH) $includes"
+fi
+includes="-I\$(SRC_PATH)/tcg $includes"
+includes="-I\$(SRC_PATH)/fpu $includes"
+
+if test "$target_user_only" = "yes" ; then
+ libdis_config_mak=libdis-user/config.mak
+else
+ libdis_config_mak=libdis/config.mak
+fi
+
+for i in $ARCH $TARGET_BASE_ARCH ; do
+ case "$i" in
+ alpha)
+ echo "CONFIG_ALPHA_DIS=y" >> $config_target_mak
+ echo "CONFIG_ALPHA_DIS=y" >> $libdis_config_mak
+ ;;
+ arm)
+ echo "CONFIG_ARM_DIS=y" >> $config_target_mak
+ echo "CONFIG_ARM_DIS=y" >> $libdis_config_mak
+ ;;
+ cris)
+ echo "CONFIG_CRIS_DIS=y" >> $config_target_mak
+ echo "CONFIG_CRIS_DIS=y" >> $libdis_config_mak
+ ;;
+ hppa)
+ echo "CONFIG_HPPA_DIS=y" >> $config_target_mak
+ echo "CONFIG_HPPA_DIS=y" >> $libdis_config_mak
+ ;;
+ i386|x86_64)
+ echo "CONFIG_I386_DIS=y" >> $config_target_mak
+ echo "CONFIG_I386_DIS=y" >> $libdis_config_mak
+ ;;
+ ia64*)
+ echo "CONFIG_IA64_DIS=y" >> $config_target_mak
+ echo "CONFIG_IA64_DIS=y" >> $libdis_config_mak
+ ;;
+ m68k)
+ echo "CONFIG_M68K_DIS=y" >> $config_target_mak
+ echo "CONFIG_M68K_DIS=y" >> $libdis_config_mak
+ ;;
+ microblaze*)
+ echo "CONFIG_MICROBLAZE_DIS=y" >> $config_target_mak
+ echo "CONFIG_MICROBLAZE_DIS=y" >> $libdis_config_mak
+ ;;
+ mips*)
+ echo "CONFIG_MIPS_DIS=y" >> $config_target_mak
+ echo "CONFIG_MIPS_DIS=y" >> $libdis_config_mak
+ ;;
+ ppc*)
+ echo "CONFIG_PPC_DIS=y" >> $config_target_mak
+ echo "CONFIG_PPC_DIS=y" >> $libdis_config_mak
+ ;;
+ s390*)
+ echo "CONFIG_S390_DIS=y" >> $config_target_mak
+ echo "CONFIG_S390_DIS=y" >> $libdis_config_mak
+ ;;
+ sh4)
+ echo "CONFIG_SH4_DIS=y" >> $config_target_mak
+ echo "CONFIG_SH4_DIS=y" >> $libdis_config_mak
+ ;;
+ sparc*)
+ echo "CONFIG_SPARC_DIS=y" >> $config_target_mak
+ echo "CONFIG_SPARC_DIS=y" >> $libdis_config_mak
+ ;;
+ esac
+done
+
+case "$ARCH" in
+alpha)
+ # Ensure there's only a single GP
+ cflags="-msmall-data $cflags"
+;;
+esac
+
+if test "$target_softmmu" = "yes" ; then
+ case "$TARGET_BASE_ARCH" in
+ arm)
+ cflags="-DHAS_AUDIO $cflags"
+ ;;
+ lm32)
+ cflags="-DHAS_AUDIO $cflags"
+ ;;
+ i386|mips|ppc)
+ cflags="-DHAS_AUDIO -DHAS_AUDIO_CHOICE $cflags"
+ ;;
+ esac
+fi
+
+if test "$target_user_only" = "yes" -a "$static" = "no" -a \
+ "$user_pie" = "yes" ; then
+ cflags="-fpie $cflags"
+ ldflags="-pie $ldflags"
+fi
+
+if test "$target_softmmu" = "yes" -a \( \
+ "$TARGET_ARCH" = "microblaze" -o \
+ "$TARGET_ARCH" = "cris" \) ; then
+ echo "CONFIG_NEED_MMU=y" >> $config_target_mak
+fi
+
+if test "$gprof" = "yes" ; then
+ echo "TARGET_GPROF=yes" >> $config_target_mak
+ if test "$target_linux_user" = "yes" ; then
+ cflags="-p $cflags"
+ ldflags="-p $ldflags"
+ fi
+ if test "$target_softmmu" = "yes" ; then
+ ldflags="-p $ldflags"
+ echo "GPROF_CFLAGS=-p" >> $config_target_mak
+ fi
+fi
+
+linker_script="-Wl,-T../config-host.ld -Wl,-T,\$(SRC_PATH)/\$(ARCH).ld"
+if test "$target_linux_user" = "yes" -o "$target_bsd_user" = "yes" ; then
+ case "$ARCH" in
+ sparc)
+ # -static is used to avoid g1/g3 usage by the dynamic linker
+ ldflags="$linker_script -static $ldflags"
+ ;;
+ alpha | s390x)
+ # The default placement of the application is fine.
+ ;;
+ *)
+ ldflags="$linker_script $ldflags"
+ ;;
+ esac
+fi
+
+# use included Linux headers
+if test "$linux" = "yes" ; then
+ includes="-I\$(SRC_PATH)/linux-headers $includes"
+ mkdir -p linux-headers
+ case "$cpu" in
+ i386|x86_64)
+ symlink $source_path/linux-headers/asm-x86 linux-headers/asm
+ ;;
+ ppcemb|ppc|ppc64)
+ symlink $source_path/linux-headers/asm-powerpc linux-headers/asm
+ ;;
+ s390x)
+ symlink $source_path/linux-headers/asm-s390 linux-headers/asm
+ ;;
+ esac
+fi
+
+echo "LDFLAGS+=$ldflags" >> $config_target_mak
+echo "QEMU_CFLAGS+=$cflags" >> $config_target_mak
+echo "QEMU_INCLUDES+=$includes" >> $config_target_mak
+
+done # for target in $targets
+
+# build tree in object directory in case the source is not in the current directory
+DIRS="tests tests/cris slirp audio block net pc-bios/optionrom"
+DIRS="$DIRS pc-bios/spapr-rtas"
+DIRS="$DIRS roms/seabios roms/vgabios"
+DIRS="$DIRS fsdev ui"
+DIRS="$DIRS qapi"
+DIRS="$DIRS qga"
+FILES="Makefile tests/Makefile qdict-test-data.txt"
+FILES="$FILES tests/cris/Makefile tests/cris/.gdbinit"
+FILES="$FILES pc-bios/optionrom/Makefile pc-bios/keymaps"
+FILES="$FILES pc-bios/spapr-rtas/Makefile"
+FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
+for bios_file in $source_path/pc-bios/*.bin $source_path/pc-bios/*.rom $source_path/pc-bios/*.dtb $source_path/pc-bios/openbios-*; do
+ FILES="$FILES pc-bios/`basename $bios_file`"
+done
+mkdir -p $DIRS
+for f in $FILES ; do
+ if [ -e "$source_path/$f" ] && ! [ -e "$f" ]; then
+ symlink "$source_path/$f" "$f"
+ fi
+done
+
+# temporary config to build submodules
+for rom in seabios vgabios ; do
+ config_mak=roms/$rom/config.mak
+ echo "# Automatically generated by configure - do not modify" > $config_mak
+ echo "SRC_PATH=$source_path/roms/$rom" >> $config_mak
+ echo "CC=$cc" >> $config_mak
+ echo "BCC=bcc" >> $config_mak
+ echo "CPP=${cross_prefix}cpp" >> $config_mak
+ echo "OBJCOPY=objcopy" >> $config_mak
+ echo "IASL=iasl" >> $config_mak
+ echo "LD=$ld" >> $config_mak
+done
+
+for hwlib in 32 64; do
+ d=libhw$hwlib
+ mkdir -p $d
+ mkdir -p $d/ide
+ symlink $source_path/Makefile.hw $d/Makefile
+ mkdir -p $d/9pfs
+ echo "QEMU_CFLAGS+=-DTARGET_PHYS_ADDR_BITS=$hwlib" > $d/config.mak
+done
+
+if [ "$source_path" != `pwd` ]; then
+ # out of tree build
+ mkdir -p libcacard
+ rm -f libcacard/Makefile
+ symlink "$source_path/libcacard/Makefile" libcacard/Makefile
+fi
+
+d=libuser
+mkdir -p $d
+symlink $source_path/Makefile.user $d/Makefile
+if test "$static" = "no" -a "$user_pie" = "yes" ; then
+ echo "QEMU_CFLAGS+=-fpie" > $d/config.mak
+fi
+
+if test "$docs" = "yes" ; then
+ mkdir -p QMP
+fi
diff --git a/qemu-0.15.x/console.c b/qemu-0.15.x/console.c
new file mode 100644
index 0000000..242086c
--- /dev/null
+++ b/qemu-0.15.x/console.c
@@ -0,0 +1,1718 @@
+/*
+ * QEMU graphical console
+ *
+ * Copyright (c) 2004 Fabrice Bellard
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "console.h"
+#include "qemu-timer.h"
+
+//#define DEBUG_CONSOLE
+#define DEFAULT_BACKSCROLL 512
+#define MAX_CONSOLES 12
+
+#define QEMU_RGBA(r, g, b, a) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b))
+#define QEMU_RGB(r, g, b) QEMU_RGBA(r, g, b, 0xff)
+
+typedef struct TextAttributes {
+ uint8_t fgcol:4;
+ uint8_t bgcol:4;
+ uint8_t bold:1;
+ uint8_t uline:1;
+ uint8_t blink:1;
+ uint8_t invers:1;
+ uint8_t unvisible:1;
+} TextAttributes;
+
+typedef struct TextCell {
+ uint8_t ch;
+ TextAttributes t_attrib;
+} TextCell;
+
+#define MAX_ESC_PARAMS 3
+
+enum TTYState {
+ TTY_STATE_NORM,
+ TTY_STATE_ESC,
+ TTY_STATE_CSI,
+};
+
+typedef struct QEMUFIFO {
+ uint8_t *buf;
+ int buf_size;
+ int count, wptr, rptr;
+} QEMUFIFO;
+
+static int qemu_fifo_write(QEMUFIFO *f, const uint8_t *buf, int len1)
+{
+ int l, len;
+
+ l = f->buf_size - f->count;
+ if (len1 > l)
+ len1 = l;
+ len = len1;
+ while (len > 0) {
+ l = f->buf_size - f->wptr;
+ if (l > len)
+ l = len;
+ memcpy(f->buf + f->wptr, buf, l);
+ f->wptr += l;
+ if (f->wptr >= f->buf_size)
+ f->wptr = 0;
+ buf += l;
+ len -= l;
+ }
+ f->count += len1;
+ return len1;
+}
+
+static int qemu_fifo_read(QEMUFIFO *f, uint8_t *buf, int len1)
+{
+ int l, len;
+
+ if (len1 > f->count)
+ len1 = f->count;
+ len = len1;
+ while (len > 0) {
+ l = f->buf_size - f->rptr;
+ if (l > len)
+ l = len;
+ memcpy(buf, f->buf + f->rptr, l);
+ f->rptr += l;
+ if (f->rptr >= f->buf_size)
+ f->rptr = 0;
+ buf += l;
+ len -= l;
+ }
+ f->count -= len1;
+ return len1;
+}
+
+typedef enum {
+ GRAPHIC_CONSOLE,
+ TEXT_CONSOLE,
+ TEXT_CONSOLE_FIXED_SIZE
+} console_type_t;
+
+/* ??? This is mis-named.
+ It is used for both text and graphical consoles. */
+struct TextConsole {
+ console_type_t console_type;
+ DisplayState *ds;
+ /* Graphic console state. */
+ vga_hw_update_ptr hw_update;
+ vga_hw_invalidate_ptr hw_invalidate;
+ vga_hw_screen_dump_ptr hw_screen_dump;
+ vga_hw_text_update_ptr hw_text_update;
+ void *hw;
+
+ int g_width, g_height;
+ int width;
+ int height;
+ int total_height;
+ int backscroll_height;
+ int x, y;
+ int x_saved, y_saved;
+ int y_displayed;
+ int y_base;
+ TextAttributes t_attrib_default; /* default text attributes */
+ TextAttributes t_attrib; /* currently active text attributes */
+ TextCell *cells;
+ int text_x[2], text_y[2], cursor_invalidate;
+ int echo;
+
+ int update_x0;
+ int update_y0;
+ int update_x1;
+ int update_y1;
+
+ enum TTYState state;
+ int esc_params[MAX_ESC_PARAMS];
+ int nb_esc_params;
+
+ CharDriverState *chr;
+ /* fifo for key pressed */
+ QEMUFIFO out_fifo;
+ uint8_t out_fifo_buf[16];
+ QEMUTimer *kbd_timer;
+};
+
+static DisplayState *display_state;
+static TextConsole *active_console;
+static TextConsole *consoles[MAX_CONSOLES];
+static int nb_consoles = 0;
+
+void vga_hw_update(void)
+{
+ if (active_console && active_console->hw_update)
+ active_console->hw_update(active_console->hw);
+}
+
+void vga_hw_invalidate(void)
+{
+ if (active_console && active_console->hw_invalidate)
+ active_console->hw_invalidate(active_console->hw);
+}
+
+void vga_hw_screen_dump(const char *filename)
+{
+ TextConsole *previous_active_console;
+
+ previous_active_console = active_console;
+ active_console = consoles[0];
+ /* There is currently no way of specifying which screen we want to dump,
+ so always dump the first one. */
+ if (consoles[0] && consoles[0]->hw_screen_dump)
+ consoles[0]->hw_screen_dump(consoles[0]->hw, filename);
+ active_console = previous_active_console;
+}
+
+void vga_hw_text_update(console_ch_t *chardata)
+{
+ if (active_console && active_console->hw_text_update)
+ active_console->hw_text_update(active_console->hw, chardata);
+}
+
+/* convert a RGBA color to a color index usable in graphic primitives */
+static unsigned int vga_get_color(DisplayState *ds, unsigned int rgba)
+{
+ unsigned int r, g, b, color;
+
+ switch(ds_get_bits_per_pixel(ds)) {
+#if 0
+ case 8:
+ r = (rgba >> 16) & 0xff;
+ g = (rgba >> 8) & 0xff;
+ b = (rgba) & 0xff;
+ color = (rgb_to_index[r] * 6 * 6) +
+ (rgb_to_index[g] * 6) +
+ (rgb_to_index[b]);
+ break;
+#endif
+ case 15:
+ r = (rgba >> 16) & 0xff;
+ g = (rgba >> 8) & 0xff;
+ b = (rgba) & 0xff;
+ color = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3);
+ break;
+ case 16:
+ r = (rgba >> 16) & 0xff;
+ g = (rgba >> 8) & 0xff;
+ b = (rgba) & 0xff;
+ color = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3);
+ break;
+ case 32:
+ default:
+ color = rgba;
+ break;
+ }
+ return color;
+}
+
+static void vga_fill_rect (DisplayState *ds,
+ int posx, int posy, int width, int height, uint32_t color)
+{
+ uint8_t *d, *d1;
+ int x, y, bpp;
+
+ bpp = (ds_get_bits_per_pixel(ds) + 7) >> 3;
+ d1 = ds_get_data(ds) +
+ ds_get_linesize(ds) * posy + bpp * posx;
+ for (y = 0; y < height; y++) {
+ d = d1;
+ switch(bpp) {
+ case 1:
+ for (x = 0; x < width; x++) {
+ *((uint8_t *)d) = color;
+ d++;
+ }
+ break;
+ case 2:
+ for (x = 0; x < width; x++) {
+ *((uint16_t *)d) = color;
+ d += 2;
+ }
+ break;
+ case 4:
+ for (x = 0; x < width; x++) {
+ *((uint32_t *)d) = color;
+ d += 4;
+ }
+ break;
+ }
+ d1 += ds_get_linesize(ds);
+ }
+}
+
+/* copy from (xs, ys) to (xd, yd) a rectangle of size (w, h) */
+static void vga_bitblt(DisplayState *ds, int xs, int ys, int xd, int yd, int w, int h)
+{
+ const uint8_t *s;
+ uint8_t *d;
+ int wb, y, bpp;
+
+ bpp = (ds_get_bits_per_pixel(ds) + 7) >> 3;
+ wb = w * bpp;
+ if (yd <= ys) {
+ s = ds_get_data(ds) +
+ ds_get_linesize(ds) * ys + bpp * xs;
+ d = ds_get_data(ds) +
+ ds_get_linesize(ds) * yd + bpp * xd;
+ for (y = 0; y < h; y++) {
+ memmove(d, s, wb);
+ d += ds_get_linesize(ds);
+ s += ds_get_linesize(ds);
+ }
+ } else {
+ s = ds_get_data(ds) +
+ ds_get_linesize(ds) * (ys + h - 1) + bpp * xs;
+ d = ds_get_data(ds) +
+ ds_get_linesize(ds) * (yd + h - 1) + bpp * xd;
+ for (y = 0; y < h; y++) {
+ memmove(d, s, wb);
+ d -= ds_get_linesize(ds);
+ s -= ds_get_linesize(ds);
+ }
+ }
+}
+
+/***********************************************************/
+/* basic char display */
+
+#define FONT_HEIGHT 16
+#define FONT_WIDTH 8
+
+#include "vgafont.h"
+
+#define cbswap_32(__x) \
+((uint32_t)( \
+ (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \
+ (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \
+ (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \
+ (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) ))
+
+#ifdef HOST_WORDS_BIGENDIAN
+#define PAT(x) x
+#else
+#define PAT(x) cbswap_32(x)
+#endif
+
+static const uint32_t dmask16[16] = {
+ PAT(0x00000000),
+ PAT(0x000000ff),
+ PAT(0x0000ff00),
+ PAT(0x0000ffff),
+ PAT(0x00ff0000),
+ PAT(0x00ff00ff),
+ PAT(0x00ffff00),
+ PAT(0x00ffffff),
+ PAT(0xff000000),
+ PAT(0xff0000ff),
+ PAT(0xff00ff00),
+ PAT(0xff00ffff),
+ PAT(0xffff0000),
+ PAT(0xffff00ff),
+ PAT(0xffffff00),
+ PAT(0xffffffff),
+};
+
+static const uint32_t dmask4[4] = {
+ PAT(0x00000000),
+ PAT(0x0000ffff),
+ PAT(0xffff0000),
+ PAT(0xffffffff),
+};
+
+static uint32_t color_table[2][8];
+
+enum color_names {
+ COLOR_BLACK = 0,
+ COLOR_RED = 1,
+ COLOR_GREEN = 2,
+ COLOR_YELLOW = 3,
+ COLOR_BLUE = 4,
+ COLOR_MAGENTA = 5,
+ COLOR_CYAN = 6,
+ COLOR_WHITE = 7
+};
+
+static const uint32_t color_table_rgb[2][8] = {
+ { /* dark */
+ QEMU_RGB(0x00, 0x00, 0x00), /* black */
+ QEMU_RGB(0xaa, 0x00, 0x00), /* red */
+ QEMU_RGB(0x00, 0xaa, 0x00), /* green */
+ QEMU_RGB(0xaa, 0xaa, 0x00), /* yellow */
+ QEMU_RGB(0x00, 0x00, 0xaa), /* blue */
+ QEMU_RGB(0xaa, 0x00, 0xaa), /* magenta */
+ QEMU_RGB(0x00, 0xaa, 0xaa), /* cyan */
+ QEMU_RGB(0xaa, 0xaa, 0xaa), /* white */
+ },
+ { /* bright */
+ QEMU_RGB(0x00, 0x00, 0x00), /* black */
+ QEMU_RGB(0xff, 0x00, 0x00), /* red */
+ QEMU_RGB(0x00, 0xff, 0x00), /* green */
+ QEMU_RGB(0xff, 0xff, 0x00), /* yellow */
+ QEMU_RGB(0x00, 0x00, 0xff), /* blue */
+ QEMU_RGB(0xff, 0x00, 0xff), /* magenta */
+ QEMU_RGB(0x00, 0xff, 0xff), /* cyan */
+ QEMU_RGB(0xff, 0xff, 0xff), /* white */
+ }
+};
+
+static inline unsigned int col_expand(DisplayState *ds, unsigned int col)
+{
+ switch(ds_get_bits_per_pixel(ds)) {
+ case 8:
+ col |= col << 8;
+ col |= col << 16;
+ break;
+ case 15:
+ case 16:
+ col |= col << 16;
+ break;
+ default:
+ break;
+ }
+
+ return col;
+}
+#ifdef DEBUG_CONSOLE
+static void console_print_text_attributes(TextAttributes *t_attrib, char ch)
+{
+ if (t_attrib->bold) {
+ printf("b");
+ } else {
+ printf(" ");
+ }
+ if (t_attrib->uline) {
+ printf("u");
+ } else {
+ printf(" ");
+ }
+ if (t_attrib->blink) {
+ printf("l");
+ } else {
+ printf(" ");
+ }
+ if (t_attrib->invers) {
+ printf("i");
+ } else {
+ printf(" ");
+ }
+ if (t_attrib->unvisible) {
+ printf("n");
+ } else {
+ printf(" ");
+ }
+
+ printf(" fg: %d bg: %d ch:'%2X' '%c'\n", t_attrib->fgcol, t_attrib->bgcol, ch, ch);
+}
+#endif
+
+static void vga_putcharxy(DisplayState *ds, int x, int y, int ch,
+ TextAttributes *t_attrib)
+{
+ uint8_t *d;
+ const uint8_t *font_ptr;
+ unsigned int font_data, linesize, xorcol, bpp;
+ int i;
+ unsigned int fgcol, bgcol;
+
+#ifdef DEBUG_CONSOLE
+ printf("x: %2i y: %2i", x, y);
+ console_print_text_attributes(t_attrib, ch);
+#endif
+
+ if (t_attrib->invers) {
+ bgcol = color_table[t_attrib->bold][t_attrib->fgcol];
+ fgcol = color_table[t_attrib->bold][t_attrib->bgcol];
+ } else {
+ fgcol = color_table[t_attrib->bold][t_attrib->fgcol];
+ bgcol = color_table[t_attrib->bold][t_attrib->bgcol];
+ }
+
+ bpp = (ds_get_bits_per_pixel(ds) + 7) >> 3;
+ d = ds_get_data(ds) +
+ ds_get_linesize(ds) * y * FONT_HEIGHT + bpp * x * FONT_WIDTH;
+ linesize = ds_get_linesize(ds);
+ font_ptr = vgafont16 + FONT_HEIGHT * ch;
+ xorcol = bgcol ^ fgcol;
+ switch(ds_get_bits_per_pixel(ds)) {
+ case 8:
+ for(i = 0; i < FONT_HEIGHT; i++) {
+ font_data = *font_ptr++;
+ if (t_attrib->uline
+ && ((i == FONT_HEIGHT - 2) || (i == FONT_HEIGHT - 3))) {
+ font_data = 0xFFFF;
+ }
+ ((uint32_t *)d)[0] = (dmask16[(font_data >> 4)] & xorcol) ^ bgcol;
+ ((uint32_t *)d)[1] = (dmask16[(font_data >> 0) & 0xf] & xorcol) ^ bgcol;
+ d += linesize;
+ }
+ break;
+ case 16:
+ case 15:
+ for(i = 0; i < FONT_HEIGHT; i++) {
+ font_data = *font_ptr++;
+ if (t_attrib->uline
+ && ((i == FONT_HEIGHT - 2) || (i == FONT_HEIGHT - 3))) {
+ font_data = 0xFFFF;
+ }
+ ((uint32_t *)d)[0] = (dmask4[(font_data >> 6)] & xorcol) ^ bgcol;
+ ((uint32_t *)d)[1] = (dmask4[(font_data >> 4) & 3] & xorcol) ^ bgcol;
+ ((uint32_t *)d)[2] = (dmask4[(font_data >> 2) & 3] & xorcol) ^ bgcol;
+ ((uint32_t *)d)[3] = (dmask4[(font_data >> 0) & 3] & xorcol) ^ bgcol;
+ d += linesize;
+ }
+ break;
+ case 32:
+ for(i = 0; i < FONT_HEIGHT; i++) {
+ font_data = *font_ptr++;
+ if (t_attrib->uline && ((i == FONT_HEIGHT - 2) || (i == FONT_HEIGHT - 3))) {
+ font_data = 0xFFFF;
+ }
+ ((uint32_t *)d)[0] = (-((font_data >> 7)) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[1] = (-((font_data >> 6) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[2] = (-((font_data >> 5) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[3] = (-((font_data >> 4) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[4] = (-((font_data >> 3) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[5] = (-((font_data >> 2) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[6] = (-((font_data >> 1) & 1) & xorcol) ^ bgcol;
+ ((uint32_t *)d)[7] = (-((font_data >> 0) & 1) & xorcol) ^ bgcol;
+ d += linesize;
+ }
+ break;
+ }
+}
+
+static void text_console_resize(TextConsole *s)
+{
+ TextCell *cells, *c, *c1;
+ int w1, x, y, last_width;
+
+ last_width = s->width;
+ s->width = s->g_width / FONT_WIDTH;
+ s->height = s->g_height / FONT_HEIGHT;
+
+ w1 = last_width;
+ if (s->width < w1)
+ w1 = s->width;
+
+ cells = qemu_malloc(s->width * s->total_height * sizeof(TextCell));
+ for(y = 0; y < s->total_height; y++) {
+ c = &cells[y * s->width];
+ if (w1 > 0) {
+ c1 = &s->cells[y * last_width];
+ for(x = 0; x < w1; x++) {
+ *c++ = *c1++;
+ }
+ }
+ for(x = w1; x < s->width; x++) {
+ c->ch = ' ';
+ c->t_attrib = s->t_attrib_default;
+ c++;
+ }
+ }
+ qemu_free(s->cells);
+ s->cells = cells;
+}
+
+static inline void text_update_xy(TextConsole *s, int x, int y)
+{
+ s->text_x[0] = MIN(s->text_x[0], x);
+ s->text_x[1] = MAX(s->text_x[1], x);
+ s->text_y[0] = MIN(s->text_y[0], y);
+ s->text_y[1] = MAX(s->text_y[1], y);
+}
+
+static void invalidate_xy(TextConsole *s, int x, int y)
+{
+ if (s->update_x0 > x * FONT_WIDTH)
+ s->update_x0 = x * FONT_WIDTH;
+ if (s->update_y0 > y * FONT_HEIGHT)
+ s->update_y0 = y * FONT_HEIGHT;
+ if (s->update_x1 < (x + 1) * FONT_WIDTH)
+ s->update_x1 = (x + 1) * FONT_WIDTH;
+ if (s->update_y1 < (y + 1) * FONT_HEIGHT)
+ s->update_y1 = (y + 1) * FONT_HEIGHT;
+}
+
+static void update_xy(TextConsole *s, int x, int y)
+{
+ TextCell *c;
+ int y1, y2;
+
+ if (s == active_console) {
+ if (!ds_get_bits_per_pixel(s->ds)) {
+ text_update_xy(s, x, y);
+ return;
+ }
+
+ y1 = (s->y_base + y) % s->total_height;
+ y2 = y1 - s->y_displayed;
+ if (y2 < 0)
+ y2 += s->total_height;
+ if (y2 < s->height) {
+ c = &s->cells[y1 * s->width + x];
+ vga_putcharxy(s->ds, x, y2, c->ch,
+ &(c->t_attrib));
+ invalidate_xy(s, x, y2);
+ }
+ }
+}
+
+static void console_show_cursor(TextConsole *s, int show)
+{
+ TextCell *c;
+ int y, y1;
+
+ if (s == active_console) {
+ int x = s->x;
+
+ if (!ds_get_bits_per_pixel(s->ds)) {
+ s->cursor_invalidate = 1;
+ return;
+ }
+
+ if (x >= s->width) {
+ x = s->width - 1;
+ }
+ y1 = (s->y_base + s->y) % s->total_height;
+ y = y1 - s->y_displayed;
+ if (y < 0)
+ y += s->total_height;
+ if (y < s->height) {
+ c = &s->cells[y1 * s->width + x];
+ if (show) {
+ TextAttributes t_attrib = s->t_attrib_default;
+ t_attrib.invers = !(t_attrib.invers); /* invert fg and bg */
+ vga_putcharxy(s->ds, x, y, c->ch, &t_attrib);
+ } else {
+ vga_putcharxy(s->ds, x, y, c->ch, &(c->t_attrib));
+ }
+ invalidate_xy(s, x, y);
+ }
+ }
+}
+
+static void console_refresh(TextConsole *s)
+{
+ TextCell *c;
+ int x, y, y1;
+
+ if (s != active_console)
+ return;
+ if (!ds_get_bits_per_pixel(s->ds)) {
+ s->text_x[0] = 0;
+ s->text_y[0] = 0;
+ s->text_x[1] = s->width - 1;
+ s->text_y[1] = s->height - 1;
+ s->cursor_invalidate = 1;
+ return;
+ }
+
+ vga_fill_rect(s->ds, 0, 0, ds_get_width(s->ds), ds_get_height(s->ds),
+ color_table[0][COLOR_BLACK]);
+ y1 = s->y_displayed;
+ for(y = 0; y < s->height; y++) {
+ c = s->cells + y1 * s->width;
+ for(x = 0; x < s->width; x++) {
+ vga_putcharxy(s->ds, x, y, c->ch,
+ &(c->t_attrib));
+ c++;
+ }
+ if (++y1 == s->total_height)
+ y1 = 0;
+ }
+ console_show_cursor(s, 1);
+ dpy_update(s->ds, 0, 0, ds_get_width(s->ds), ds_get_height(s->ds));
+}
+
+static void console_scroll(int ydelta)
+{
+ TextConsole *s;
+ int i, y1;
+
+ s = active_console;
+ if (!s || (s->console_type == GRAPHIC_CONSOLE))
+ return;
+
+ if (ydelta > 0) {
+ for(i = 0; i < ydelta; i++) {
+ if (s->y_displayed == s->y_base)
+ break;
+ if (++s->y_displayed == s->total_height)
+ s->y_displayed = 0;
+ }
+ } else {
+ ydelta = -ydelta;
+ i = s->backscroll_height;
+ if (i > s->total_height - s->height)
+ i = s->total_height - s->height;
+ y1 = s->y_base - i;
+ if (y1 < 0)
+ y1 += s->total_height;
+ for(i = 0; i < ydelta; i++) {
+ if (s->y_displayed == y1)
+ break;
+ if (--s->y_displayed < 0)
+ s->y_displayed = s->total_height - 1;
+ }
+ }
+ console_refresh(s);
+}
+
+static void console_put_lf(TextConsole *s)
+{
+ TextCell *c;
+ int x, y1;
+
+ s->y++;
+ if (s->y >= s->height) {
+ s->y = s->height - 1;
+
+ if (s->y_displayed == s->y_base) {
+ if (++s->y_displayed == s->total_height)
+ s->y_displayed = 0;
+ }
+ if (++s->y_base == s->total_height)
+ s->y_base = 0;
+ if (s->backscroll_height < s->total_height)
+ s->backscroll_height++;
+ y1 = (s->y_base + s->height - 1) % s->total_height;
+ c = &s->cells[y1 * s->width];
+ for(x = 0; x < s->width; x++) {
+ c->ch = ' ';
+ c->t_attrib = s->t_attrib_default;
+ c++;
+ }
+ if (s == active_console && s->y_displayed == s->y_base) {
+ if (!ds_get_bits_per_pixel(s->ds)) {
+ s->text_x[0] = 0;
+ s->text_y[0] = 0;
+ s->text_x[1] = s->width - 1;
+ s->text_y[1] = s->height - 1;
+ return;
+ }
+
+ vga_bitblt(s->ds, 0, FONT_HEIGHT, 0, 0,
+ s->width * FONT_WIDTH,
+ (s->height - 1) * FONT_HEIGHT);
+ vga_fill_rect(s->ds, 0, (s->height - 1) * FONT_HEIGHT,
+ s->width * FONT_WIDTH, FONT_HEIGHT,
+ color_table[0][s->t_attrib_default.bgcol]);
+ s->update_x0 = 0;
+ s->update_y0 = 0;
+ s->update_x1 = s->width * FONT_WIDTH;
+ s->update_y1 = s->height * FONT_HEIGHT;
+ }
+ }
+}
+
+/* Set console attributes depending on the current escape codes.
+ * NOTE: I know this code is not very efficient (checking every color for it
+ * self) but it is more readable and better maintainable.
+ */
+static void console_handle_escape(TextConsole *s)
+{
+ int i;
+
+ for (i=0; i<s->nb_esc_params; i++) {
+ switch (s->esc_params[i]) {
+ case 0: /* reset all console attributes to default */
+ s->t_attrib = s->t_attrib_default;
+ break;
+ case 1:
+ s->t_attrib.bold = 1;
+ break;
+ case 4:
+ s->t_attrib.uline = 1;
+ break;
+ case 5:
+ s->t_attrib.blink = 1;
+ break;
+ case 7:
+ s->t_attrib.invers = 1;
+ break;
+ case 8:
+ s->t_attrib.unvisible = 1;
+ break;
+ case 22:
+ s->t_attrib.bold = 0;
+ break;
+ case 24:
+ s->t_attrib.uline = 0;
+ break;
+ case 25:
+ s->t_attrib.blink = 0;
+ break;
+ case 27:
+ s->t_attrib.invers = 0;
+ break;
+ case 28:
+ s->t_attrib.unvisible = 0;
+ break;
+ /* set foreground color */
+ case 30:
+ s->t_attrib.fgcol=COLOR_BLACK;
+ break;
+ case 31:
+ s->t_attrib.fgcol=COLOR_RED;
+ break;
+ case 32:
+ s->t_attrib.fgcol=COLOR_GREEN;
+ break;
+ case 33:
+ s->t_attrib.fgcol=COLOR_YELLOW;
+ break;
+ case 34:
+ s->t_attrib.fgcol=COLOR_BLUE;
+ break;
+ case 35:
+ s->t_attrib.fgcol=COLOR_MAGENTA;
+ break;
+ case 36:
+ s->t_attrib.fgcol=COLOR_CYAN;
+ break;
+ case 37:
+ s->t_attrib.fgcol=COLOR_WHITE;
+ break;
+ /* set background color */
+ case 40:
+ s->t_attrib.bgcol=COLOR_BLACK;
+ break;
+ case 41:
+ s->t_attrib.bgcol=COLOR_RED;
+ break;
+ case 42:
+ s->t_attrib.bgcol=COLOR_GREEN;
+ break;
+ case 43:
+ s->t_attrib.bgcol=COLOR_YELLOW;
+ break;
+ case 44:
+ s->t_attrib.bgcol=COLOR_BLUE;
+ break;
+ case 45:
+ s->t_attrib.bgcol=COLOR_MAGENTA;
+ break;
+ case 46:
+ s->t_attrib.bgcol=COLOR_CYAN;
+ break;
+ case 47:
+ s->t_attrib.bgcol=COLOR_WHITE;
+ break;
+ }
+ }
+}
+
+static void console_clear_xy(TextConsole *s, int x, int y)
+{
+ int y1 = (s->y_base + y) % s->total_height;
+ TextCell *c = &s->cells[y1 * s->width + x];
+ c->ch = ' ';
+ c->t_attrib = s->t_attrib_default;
+ update_xy(s, x, y);
+}
+
+static void console_putchar(TextConsole *s, int ch)
+{
+ TextCell *c;
+ int y1, i;
+ int x, y;
+
+ switch(s->state) {
+ case TTY_STATE_NORM:
+ switch(ch) {
+ case '\r': /* carriage return */
+ s->x = 0;
+ break;
+ case '\n': /* newline */
+ console_put_lf(s);
+ break;
+ case '\b': /* backspace */
+ if (s->x > 0)
+ s->x--;
+ break;
+ case '\t': /* tabspace */
+ if (s->x + (8 - (s->x % 8)) > s->width) {
+ s->x = 0;
+ console_put_lf(s);
+ } else {
+ s->x = s->x + (8 - (s->x % 8));
+ }
+ break;
+ case '\a': /* alert aka. bell */
+ /* TODO: has to be implemented */
+ break;
+ case 14:
+ /* SI (shift in), character set 0 (ignored) */
+ break;
+ case 15:
+ /* SO (shift out), character set 1 (ignored) */
+ break;
+ case 27: /* esc (introducing an escape sequence) */
+ s->state = TTY_STATE_ESC;
+ break;
+ default:
+ if (s->x >= s->width) {
+ /* line wrap */
+ s->x = 0;
+ console_put_lf(s);
+ }
+ y1 = (s->y_base + s->y) % s->total_height;
+ c = &s->cells[y1 * s->width + s->x];
+ c->ch = ch;
+ c->t_attrib = s->t_attrib;
+ update_xy(s, s->x, s->y);
+ s->x++;
+ break;
+ }
+ break;
+ case TTY_STATE_ESC: /* check if it is a terminal escape sequence */
+ if (ch == '[') {
+ for(i=0;i<MAX_ESC_PARAMS;i++)
+ s->esc_params[i] = 0;
+ s->nb_esc_params = 0;
+ s->state = TTY_STATE_CSI;
+ } else {
+ s->state = TTY_STATE_NORM;
+ }
+ break;
+ case TTY_STATE_CSI: /* handle escape sequence parameters */
+ if (ch >= '0' && ch <= '9') {
+ if (s->nb_esc_params < MAX_ESC_PARAMS) {
+ s->esc_params[s->nb_esc_params] =
+ s->esc_params[s->nb_esc_params] * 10 + ch - '0';
+ }
+ } else {
+ s->nb_esc_params++;
+ if (ch == ';')
+ break;
+#ifdef DEBUG_CONSOLE
+ fprintf(stderr, "escape sequence CSI%d;%d%c, %d parameters\n",
+ s->esc_params[0], s->esc_params[1], ch, s->nb_esc_params);
+#endif
+ s->state = TTY_STATE_NORM;
+ switch(ch) {
+ case 'A':
+ /* move cursor up */
+ if (s->esc_params[0] == 0) {
+ s->esc_params[0] = 1;
+ }
+ s->y -= s->esc_params[0];
+ if (s->y < 0) {
+ s->y = 0;
+ }
+ break;
+ case 'B':
+ /* move cursor down */
+ if (s->esc_params[0] == 0) {
+ s->esc_params[0] = 1;
+ }
+ s->y += s->esc_params[0];
+ if (s->y >= s->height) {
+ s->y = s->height - 1;
+ }
+ break;
+ case 'C':
+ /* move cursor right */
+ if (s->esc_params[0] == 0) {
+ s->esc_params[0] = 1;
+ }
+ s->x += s->esc_params[0];
+ if (s->x >= s->width) {
+ s->x = s->width - 1;
+ }
+ break;
+ case 'D':
+ /* move cursor left */
+ if (s->esc_params[0] == 0) {
+ s->esc_params[0] = 1;
+ }
+ s->x -= s->esc_params[0];
+ if (s->x < 0) {
+ s->x = 0;
+ }
+ break;
+ case 'G':
+ /* move cursor to column */
+ s->x = s->esc_params[0] - 1;
+ if (s->x < 0) {
+ s->x = 0;
+ }
+ break;
+ case 'f':
+ case 'H':
+ /* move cursor to row, column */
+ s->x = s->esc_params[1] - 1;
+ if (s->x < 0) {
+ s->x = 0;
+ }
+ s->y = s->esc_params[0] - 1;
+ if (s->y < 0) {
+ s->y = 0;
+ }
+ break;
+ case 'J':
+ switch (s->esc_params[0]) {
+ case 0:
+ /* clear to end of screen */
+ for (y = s->y; y < s->height; y++) {
+ for (x = 0; x < s->width; x++) {
+ if (y == s->y && x < s->x) {
+ continue;
+ }
+ console_clear_xy(s, x, y);
+ }
+ }
+ break;
+ case 1:
+ /* clear from beginning of screen */
+ for (y = 0; y <= s->y; y++) {
+ for (x = 0; x < s->width; x++) {
+ if (y == s->y && x > s->x) {
+ break;
+ }
+ console_clear_xy(s, x, y);
+ }
+ }
+ break;
+ case 2:
+ /* clear entire screen */
+ for (y = 0; y <= s->height; y++) {
+ for (x = 0; x < s->width; x++) {
+ console_clear_xy(s, x, y);
+ }
+ }
+ break;
+ }
+ case 'K':
+ switch (s->esc_params[0]) {
+ case 0:
+ /* clear to eol */
+ for(x = s->x; x < s->width; x++) {
+ console_clear_xy(s, x, s->y);
+ }
+ break;
+ case 1:
+ /* clear from beginning of line */
+ for (x = 0; x <= s->x; x++) {
+ console_clear_xy(s, x, s->y);
+ }
+ break;
+ case 2:
+ /* clear entire line */
+ for(x = 0; x < s->width; x++) {
+ console_clear_xy(s, x, s->y);
+ }
+ break;
+ }
+ break;
+ case 'm':
+ console_handle_escape(s);
+ break;
+ case 'n':
+ /* report cursor position */
+ /* TODO: send ESC[row;colR */
+ break;
+ case 's':
+ /* save cursor position */
+ s->x_saved = s->x;
+ s->y_saved = s->y;
+ break;
+ case 'u':
+ /* restore cursor position */
+ s->x = s->x_saved;
+ s->y = s->y_saved;
+ break;
+ default:
+#ifdef DEBUG_CONSOLE
+ fprintf(stderr, "unhandled escape character '%c'\n", ch);
+#endif
+ break;
+ }
+ break;
+ }
+ }
+}
+
+void console_select(unsigned int index)
+{
+ TextConsole *s;
+
+ if (index >= MAX_CONSOLES)
+ return;
+ if (active_console) {
+ active_console->g_width = ds_get_width(active_console->ds);
+ active_console->g_height = ds_get_height(active_console->ds);
+ }
+ s = consoles[index];
+ if (s) {
+ DisplayState *ds = s->ds;
+ active_console = s;
+ if (ds_get_bits_per_pixel(s->ds)) {
+ ds->surface = qemu_resize_displaysurface(ds, s->g_width, s->g_height);
+ } else {
+ s->ds->surface->width = s->width;
+ s->ds->surface->height = s->height;
+ }
+ dpy_resize(s->ds);
+ vga_hw_invalidate();
+ }
+}
+
+static int console_puts(CharDriverState *chr, const uint8_t *buf, int len)
+{
+ TextConsole *s = chr->opaque;
+ int i;
+
+ s->update_x0 = s->width * FONT_WIDTH;
+ s->update_y0 = s->height * FONT_HEIGHT;
+ s->update_x1 = 0;
+ s->update_y1 = 0;
+ console_show_cursor(s, 0);
+ for(i = 0; i < len; i++) {
+ console_putchar(s, buf[i]);
+ }
+ console_show_cursor(s, 1);
+ if (ds_get_bits_per_pixel(s->ds) && s->update_x0 < s->update_x1) {
+ dpy_update(s->ds, s->update_x0, s->update_y0,
+ s->update_x1 - s->update_x0,
+ s->update_y1 - s->update_y0);
+ }
+ return len;
+}
+
+static void console_send_event(CharDriverState *chr, int event)
+{
+ TextConsole *s = chr->opaque;
+ int i;
+
+ if (event == CHR_EVENT_FOCUS) {
+ for(i = 0; i < nb_consoles; i++) {
+ if (consoles[i] == s) {
+ console_select(i);
+ break;
+ }
+ }
+ }
+}
+
+static void kbd_send_chars(void *opaque)
+{
+ TextConsole *s = opaque;
+ int len;
+ uint8_t buf[16];
+
+ len = qemu_chr_can_read(s->chr);
+ if (len > s->out_fifo.count)
+ len = s->out_fifo.count;
+ if (len > 0) {
+ if (len > sizeof(buf))
+ len = sizeof(buf);
+ qemu_fifo_read(&s->out_fifo, buf, len);
+ qemu_chr_read(s->chr, buf, len);
+ }
+ /* characters are pending: we send them a bit later (XXX:
+ horrible, should change char device API) */
+ if (s->out_fifo.count > 0) {
+ qemu_mod_timer(s->kbd_timer, qemu_get_clock_ms(rt_clock) + 1);
+ }
+}
+
+/* called when an ascii key is pressed */
+void kbd_put_keysym(int keysym)
+{
+ TextConsole *s;
+ uint8_t buf[16], *q;
+ int c;
+
+ s = active_console;
+ if (!s || (s->console_type == GRAPHIC_CONSOLE))
+ return;
+
+ switch(keysym) {
+ case QEMU_KEY_CTRL_UP:
+ console_scroll(-1);
+ break;
+ case QEMU_KEY_CTRL_DOWN:
+ console_scroll(1);
+ break;
+ case QEMU_KEY_CTRL_PAGEUP:
+ console_scroll(-10);
+ break;
+ case QEMU_KEY_CTRL_PAGEDOWN:
+ console_scroll(10);
+ break;
+ default:
+ /* convert the QEMU keysym to VT100 key string */
+ q = buf;
+ if (keysym >= 0xe100 && keysym <= 0xe11f) {
+ *q++ = '\033';
+ *q++ = '[';
+ c = keysym - 0xe100;
+ if (c >= 10)
+ *q++ = '0' + (c / 10);
+ *q++ = '0' + (c % 10);
+ *q++ = '~';
+ } else if (keysym >= 0xe120 && keysym <= 0xe17f) {
+ *q++ = '\033';
+ *q++ = '[';
+ *q++ = keysym & 0xff;
+ } else if (s->echo && (keysym == '\r' || keysym == '\n')) {
+ console_puts(s->chr, (const uint8_t *) "\r", 1);
+ *q++ = '\n';
+ } else {
+ *q++ = keysym;
+ }
+ if (s->echo) {
+ console_puts(s->chr, buf, q - buf);
+ }
+ if (s->chr->chr_read) {
+ qemu_fifo_write(&s->out_fifo, buf, q - buf);
+ kbd_send_chars(s);
+ }
+ break;
+ }
+}
+
+static void text_console_invalidate(void *opaque)
+{
+ TextConsole *s = (TextConsole *) opaque;
+ if (!ds_get_bits_per_pixel(s->ds) && s->console_type == TEXT_CONSOLE) {
+ s->g_width = ds_get_width(s->ds);
+ s->g_height = ds_get_height(s->ds);
+ text_console_resize(s);
+ }
+ console_refresh(s);
+}
+
+static void text_console_update(void *opaque, console_ch_t *chardata)
+{
+ TextConsole *s = (TextConsole *) opaque;
+ int i, j, src;
+
+ if (s->text_x[0] <= s->text_x[1]) {
+ src = (s->y_base + s->text_y[0]) * s->width;
+ chardata += s->text_y[0] * s->width;
+ for (i = s->text_y[0]; i <= s->text_y[1]; i ++)
+ for (j = 0; j < s->width; j ++, src ++)
+ console_write_ch(chardata ++, s->cells[src].ch |
+ (s->cells[src].t_attrib.fgcol << 12) |
+ (s->cells[src].t_attrib.bgcol << 8) |
+ (s->cells[src].t_attrib.bold << 21));
+ dpy_update(s->ds, s->text_x[0], s->text_y[0],
+ s->text_x[1] - s->text_x[0], i - s->text_y[0]);
+ s->text_x[0] = s->width;
+ s->text_y[0] = s->height;
+ s->text_x[1] = 0;
+ s->text_y[1] = 0;
+ }
+ if (s->cursor_invalidate) {
+ dpy_cursor(s->ds, s->x, s->y);
+ s->cursor_invalidate = 0;
+ }
+}
+
+static TextConsole *get_graphic_console(DisplayState *ds)
+{
+ int i;
+ TextConsole *s;
+ for (i = 0; i < nb_consoles; i++) {
+ s = consoles[i];
+ if (s->console_type == GRAPHIC_CONSOLE && s->ds == ds)
+ return s;
+ }
+ return NULL;
+}
+
+static TextConsole *new_console(DisplayState *ds, console_type_t console_type)
+{
+ TextConsole *s;
+ int i;
+
+ if (nb_consoles >= MAX_CONSOLES)
+ return NULL;
+ s = qemu_mallocz(sizeof(TextConsole));
+ if (!active_console || ((active_console->console_type != GRAPHIC_CONSOLE) &&
+ (console_type == GRAPHIC_CONSOLE))) {
+ active_console = s;
+ }
+ s->ds = ds;
+ s->console_type = console_type;
+ if (console_type != GRAPHIC_CONSOLE) {
+ consoles[nb_consoles++] = s;
+ } else {
+ /* HACK: Put graphical consoles before text consoles. */
+ for (i = nb_consoles; i > 0; i--) {
+ if (consoles[i - 1]->console_type == GRAPHIC_CONSOLE)
+ break;
+ consoles[i] = consoles[i - 1];
+ }
+ consoles[i] = s;
+ nb_consoles++;
+ }
+ return s;
+}
+
+static DisplaySurface* defaultallocator_create_displaysurface(int width, int height)
+{
+ DisplaySurface *surface = (DisplaySurface*) qemu_mallocz(sizeof(DisplaySurface));
+
+ int linesize = width * 4;
+ qemu_alloc_display(surface, width, height, linesize,
+ qemu_default_pixelformat(32), 0);
+ return surface;
+}
+
+static DisplaySurface* defaultallocator_resize_displaysurface(DisplaySurface *surface,
+ int width, int height)
+{
+ int linesize = width * 4;
+ qemu_alloc_display(surface, width, height, linesize,
+ qemu_default_pixelformat(32), 0);
+ return surface;
+}
+
+void qemu_alloc_display(DisplaySurface *surface, int width, int height,
+ int linesize, PixelFormat pf, int newflags)
+{
+ void *data;
+ surface->width = width;
+ surface->height = height;
+ surface->linesize = linesize;
+ surface->pf = pf;
+ if (surface->flags & QEMU_ALLOCATED_FLAG) {
+ data = qemu_realloc(surface->data,
+ surface->linesize * surface->height);
+ } else {
+ data = qemu_malloc(surface->linesize * surface->height);
+ }
+ surface->data = (uint8_t *)data;
+ surface->flags = newflags | QEMU_ALLOCATED_FLAG;
+#ifdef HOST_WORDS_BIGENDIAN
+ surface->flags |= QEMU_BIG_ENDIAN_FLAG;
+#endif
+}
+
+DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
+ int linesize, uint8_t *data)
+{
+ DisplaySurface *surface = (DisplaySurface*) qemu_mallocz(sizeof(DisplaySurface));
+
+ surface->width = width;
+ surface->height = height;
+ surface->linesize = linesize;
+ surface->pf = qemu_default_pixelformat(bpp);
+#ifdef HOST_WORDS_BIGENDIAN
+ surface->flags = QEMU_BIG_ENDIAN_FLAG;
+#endif
+ surface->data = data;
+
+ return surface;
+}
+
+static void defaultallocator_free_displaysurface(DisplaySurface *surface)
+{
+ if (surface == NULL)
+ return;
+ if (surface->flags & QEMU_ALLOCATED_FLAG)
+ qemu_free(surface->data);
+ qemu_free(surface);
+}
+
+static struct DisplayAllocator default_allocator = {
+ defaultallocator_create_displaysurface,
+ defaultallocator_resize_displaysurface,
+ defaultallocator_free_displaysurface
+};
+
+static void dumb_display_init(void)
+{
+ DisplayState *ds = qemu_mallocz(sizeof(DisplayState));
+ int width = 640;
+ int height = 480;
+
+ ds->allocator = &default_allocator;
+ if (is_fixedsize_console()) {
+ width = active_console->g_width;
+ height = active_console->g_height;
+ }
+ ds->surface = qemu_create_displaysurface(ds, width, height);
+ register_displaystate(ds);
+}
+
+/***********************************************************/
+/* register display */
+
+void register_displaystate(DisplayState *ds)
+{
+ DisplayState **s;
+ s = &display_state;
+ while (*s != NULL)
+ s = &(*s)->next;
+ ds->next = NULL;
+ *s = ds;
+}
+
+DisplayState *get_displaystate(void)
+{
+ if (!display_state) {
+ dumb_display_init ();
+ }
+ return display_state;
+}
+
+DisplayAllocator *register_displayallocator(DisplayState *ds, DisplayAllocator *da)
+{
+ if(ds->allocator == &default_allocator) {
+ DisplaySurface *surf;
+ surf = da->create_displaysurface(ds_get_width(ds), ds_get_height(ds));
+ defaultallocator_free_displaysurface(ds->surface);
+ ds->surface = surf;
+ ds->allocator = da;
+ }
+ return ds->allocator;
+}
+
+DisplayState *graphic_console_init(vga_hw_update_ptr update,
+ vga_hw_invalidate_ptr invalidate,
+ vga_hw_screen_dump_ptr screen_dump,
+ vga_hw_text_update_ptr text_update,
+ void *opaque)
+{
+ TextConsole *s;
+ DisplayState *ds;
+
+ ds = (DisplayState *) qemu_mallocz(sizeof(DisplayState));
+ ds->allocator = &default_allocator;
+ ds->surface = qemu_create_displaysurface(ds, 640, 480);
+
+ s = new_console(ds, GRAPHIC_CONSOLE);
+ if (s == NULL) {
+ qemu_free_displaysurface(ds);
+ qemu_free(ds);
+ return NULL;
+ }
+ s->hw_update = update;
+ s->hw_invalidate = invalidate;
+ s->hw_screen_dump = screen_dump;
+ s->hw_text_update = text_update;
+ s->hw = opaque;
+
+ register_displaystate(ds);
+ return ds;
+}
+
+int is_graphic_console(void)
+{
+ return active_console && active_console->console_type == GRAPHIC_CONSOLE;
+}
+
+int is_fixedsize_console(void)
+{
+ return active_console && active_console->console_type != TEXT_CONSOLE;
+}
+
+void console_color_init(DisplayState *ds)
+{
+ int i, j;
+ for (j = 0; j < 2; j++) {
+ for (i = 0; i < 8; i++) {
+ color_table[j][i] = col_expand(ds,
+ vga_get_color(ds, color_table_rgb[j][i]));
+ }
+ }
+}
+
+static int n_text_consoles;
+static CharDriverState *text_consoles[128];
+
+static void text_console_set_echo(CharDriverState *chr, bool echo)
+{
+ TextConsole *s = chr->opaque;
+
+ s->echo = echo;
+}
+
+static void text_console_do_init(CharDriverState *chr, DisplayState *ds)
+{
+ TextConsole *s;
+ static int color_inited;
+
+ s = chr->opaque;
+
+ chr->chr_write = console_puts;
+ chr->chr_send_event = console_send_event;
+
+ s->out_fifo.buf = s->out_fifo_buf;
+ s->out_fifo.buf_size = sizeof(s->out_fifo_buf);
+ s->kbd_timer = qemu_new_timer_ms(rt_clock, kbd_send_chars, s);
+ s->ds = ds;
+
+ if (!color_inited) {
+ color_inited = 1;
+ console_color_init(s->ds);
+ }
+ s->y_displayed = 0;
+ s->y_base = 0;
+ s->total_height = DEFAULT_BACKSCROLL;
+ s->x = 0;
+ s->y = 0;
+ if (s->console_type == TEXT_CONSOLE) {
+ s->g_width = ds_get_width(s->ds);
+ s->g_height = ds_get_height(s->ds);
+ }
+
+ s->hw_invalidate = text_console_invalidate;
+ s->hw_text_update = text_console_update;
+ s->hw = s;
+
+ /* Set text attribute defaults */
+ s->t_attrib_default.bold = 0;
+ s->t_attrib_default.uline = 0;
+ s->t_attrib_default.blink = 0;
+ s->t_attrib_default.invers = 0;
+ s->t_attrib_default.unvisible = 0;
+ s->t_attrib_default.fgcol = COLOR_WHITE;
+ s->t_attrib_default.bgcol = COLOR_BLACK;
+ /* set current text attributes to default */
+ s->t_attrib = s->t_attrib_default;
+ text_console_resize(s);
+
+ if (chr->label) {
+ char msg[128];
+ int len;
+
+ s->t_attrib.bgcol = COLOR_BLUE;
+ len = snprintf(msg, sizeof(msg), "%s console\r\n", chr->label);
+ console_puts(chr, (uint8_t*)msg, len);
+ s->t_attrib = s->t_attrib_default;
+ }
+
+ qemu_chr_generic_open(chr);
+ if (chr->init)
+ chr->init(chr);
+}
+
+int text_console_init(QemuOpts *opts, CharDriverState **_chr)
+{
+ CharDriverState *chr;
+ TextConsole *s;
+ unsigned width;
+ unsigned height;
+
+ chr = qemu_mallocz(sizeof(CharDriverState));
+
+ if (n_text_consoles == 128) {
+ fprintf(stderr, "Too many text consoles\n");
+ exit(1);
+ }
+ text_consoles[n_text_consoles] = chr;
+ n_text_consoles++;
+
+ width = qemu_opt_get_number(opts, "width", 0);
+ if (width == 0)
+ width = qemu_opt_get_number(opts, "cols", 0) * FONT_WIDTH;
+
+ height = qemu_opt_get_number(opts, "height", 0);
+ if (height == 0)
+ height = qemu_opt_get_number(opts, "rows", 0) * FONT_HEIGHT;
+
+ if (width == 0 || height == 0) {
+ s = new_console(NULL, TEXT_CONSOLE);
+ } else {
+ s = new_console(NULL, TEXT_CONSOLE_FIXED_SIZE);
+ }
+
+ if (!s) {
+ free(chr);
+ return -EBUSY;
+ }
+
+ s->chr = chr;
+ s->g_width = width;
+ s->g_height = height;
+ chr->opaque = s;
+ chr->chr_set_echo = text_console_set_echo;
+
+ *_chr = chr;
+ return 0;
+}
+
+void text_consoles_set_display(DisplayState *ds)
+{
+ int i;
+
+ for (i = 0; i < n_text_consoles; i++) {
+ text_console_do_init(text_consoles[i], ds);
+ }
+
+ n_text_consoles = 0;
+}
+
+void qemu_console_resize(DisplayState *ds, int width, int height)
+{
+ TextConsole *s = get_graphic_console(ds);
+ if (!s) return;
+
+ s->g_width = width;
+ s->g_height = height;
+ if (is_graphic_console()) {
+ ds->surface = qemu_resize_displaysurface(ds, width, height);
+ dpy_resize(ds);
+ }
+}
+
+void qemu_console_copy(DisplayState *ds, int src_x, int src_y,
+ int dst_x, int dst_y, int w, int h)
+{
+ if (is_graphic_console()) {
+ dpy_copy(ds, src_x, src_y, dst_x, dst_y, w, h);
+ }
+}
+
+PixelFormat qemu_different_endianness_pixelformat(int bpp)
+{
+ PixelFormat pf;
+
+ memset(&pf, 0x00, sizeof(PixelFormat));
+
+ pf.bits_per_pixel = bpp;
+ pf.bytes_per_pixel = bpp / 8;
+ pf.depth = bpp == 32 ? 24 : bpp;
+
+ switch (bpp) {
+ case 24:
+ pf.rmask = 0x000000FF;
+ pf.gmask = 0x0000FF00;
+ pf.bmask = 0x00FF0000;
+ pf.rmax = 255;
+ pf.gmax = 255;
+ pf.bmax = 255;
+ pf.rshift = 0;
+ pf.gshift = 8;
+ pf.bshift = 16;
+ pf.rbits = 8;
+ pf.gbits = 8;
+ pf.bbits = 8;
+ break;
+ case 32:
+ pf.rmask = 0x0000FF00;
+ pf.gmask = 0x00FF0000;
+ pf.bmask = 0xFF000000;
+ pf.amask = 0x00000000;
+ pf.amax = 255;
+ pf.rmax = 255;
+ pf.gmax = 255;
+ pf.bmax = 255;
+ pf.ashift = 0;
+ pf.rshift = 8;
+ pf.gshift = 16;
+ pf.bshift = 24;
+ pf.rbits = 8;
+ pf.gbits = 8;
+ pf.bbits = 8;
+ pf.abits = 8;
+ break;
+ default:
+ break;
+ }
+ return pf;
+}
+
+PixelFormat qemu_default_pixelformat(int bpp)
+{
+ PixelFormat pf;
+
+ memset(&pf, 0x00, sizeof(PixelFormat));
+
+ pf.bits_per_pixel = bpp;
+ pf.bytes_per_pixel = bpp / 8;
+ pf.depth = bpp == 32 ? 24 : bpp;
+
+ switch (bpp) {
+ case 15:
+ pf.bits_per_pixel = 16;
+ pf.bytes_per_pixel = 2;
+ pf.rmask = 0x00007c00;
+ pf.gmask = 0x000003E0;
+ pf.bmask = 0x0000001F;
+ pf.rmax = 31;
+ pf.gmax = 31;
+ pf.bmax = 31;
+ pf.rshift = 10;
+ pf.gshift = 5;
+ pf.bshift = 0;
+ pf.rbits = 5;
+ pf.gbits = 5;
+ pf.bbits = 5;
+ break;
+ case 16:
+ pf.rmask = 0x0000F800;
+ pf.gmask = 0x000007E0;
+ pf.bmask = 0x0000001F;
+ pf.rmax = 31;
+ pf.gmax = 63;
+ pf.bmax = 31;
+ pf.rshift = 11;
+ pf.gshift = 5;
+ pf.bshift = 0;
+ pf.rbits = 5;
+ pf.gbits = 6;
+ pf.bbits = 5;
+ break;
+ case 24:
+ pf.rmask = 0x00FF0000;
+ pf.gmask = 0x0000FF00;
+ pf.bmask = 0x000000FF;
+ pf.rmax = 255;
+ pf.gmax = 255;
+ pf.bmax = 255;
+ pf.rshift = 16;
+ pf.gshift = 8;
+ pf.bshift = 0;
+ pf.rbits = 8;
+ pf.gbits = 8;
+ pf.bbits = 8;
+ case 32:
+ pf.rmask = 0x00FF0000;
+ pf.gmask = 0x0000FF00;
+ pf.bmask = 0x000000FF;
+ pf.amax = 255;
+ pf.rmax = 255;
+ pf.gmax = 255;
+ pf.bmax = 255;
+ pf.ashift = 24;
+ pf.rshift = 16;
+ pf.gshift = 8;
+ pf.bshift = 0;
+ pf.rbits = 8;
+ pf.gbits = 8;
+ pf.bbits = 8;
+ pf.abits = 8;
+ break;
+ default:
+ break;
+ }
+ return pf;
+}
diff --git a/qemu-0.15.x/console.h b/qemu-0.15.x/console.h
new file mode 100644
index 0000000..67d1373
--- /dev/null
+++ b/qemu-0.15.x/console.h
@@ -0,0 +1,406 @@
+#ifndef CONSOLE_H
+#define CONSOLE_H
+
+#include "qemu-char.h"
+#include "qdict.h"
+#include "notify.h"
+#include "qerror.h"
+#include "monitor.h"
+
+/* keyboard/mouse support */
+
+#define MOUSE_EVENT_LBUTTON 0x01
+#define MOUSE_EVENT_RBUTTON 0x02
+#define MOUSE_EVENT_MBUTTON 0x04
+
+/* identical to the ps/2 keyboard bits */
+#define QEMU_SCROLL_LOCK_LED (1 << 0)
+#define QEMU_NUM_LOCK_LED (1 << 1)
+#define QEMU_CAPS_LOCK_LED (1 << 2)
+
+/* in ms */
+#define GUI_REFRESH_INTERVAL 30
+
+typedef void QEMUPutKBDEvent(void *opaque, int keycode);
+typedef void QEMUPutLEDEvent(void *opaque, int ledstate);
+typedef void QEMUPutMouseEvent(void *opaque, int dx, int dy, int dz, int buttons_state);
+
+typedef struct QEMUPutMouseEntry {
+ QEMUPutMouseEvent *qemu_put_mouse_event;
+ void *qemu_put_mouse_event_opaque;
+ int qemu_put_mouse_event_absolute;
+ char *qemu_put_mouse_event_name;
+
+ int index;
+
+ /* used internally by qemu for handling mice */
+ QTAILQ_ENTRY(QEMUPutMouseEntry) node;
+} QEMUPutMouseEntry;
+
+typedef struct QEMUPutLEDEntry {
+ QEMUPutLEDEvent *put_led;
+ void *opaque;
+ QTAILQ_ENTRY(QEMUPutLEDEntry) next;
+} QEMUPutLEDEntry;
+
+void qemu_add_kbd_event_handler(QEMUPutKBDEvent *func, void *opaque);
+void qemu_remove_kbd_event_handler(void);
+QEMUPutMouseEntry *qemu_add_mouse_event_handler(QEMUPutMouseEvent *func,
+ void *opaque, int absolute,
+ const char *name);
+void qemu_remove_mouse_event_handler(QEMUPutMouseEntry *entry);
+void qemu_activate_mouse_event_handler(QEMUPutMouseEntry *entry);
+
+QEMUPutLEDEntry *qemu_add_led_event_handler(QEMUPutLEDEvent *func, void *opaque);
+void qemu_remove_led_event_handler(QEMUPutLEDEntry *entry);
+
+void kbd_put_keycode(int keycode);
+void kbd_put_ledstate(int ledstate);
+void kbd_mouse_event(int dx, int dy, int dz, int buttons_state);
+
+/* Does the current mouse generate absolute events */
+int kbd_mouse_is_absolute(void);
+void qemu_add_mouse_mode_change_notifier(Notifier *notify);
+void qemu_remove_mouse_mode_change_notifier(Notifier *notify);
+
+/* Of all the mice, is there one that generates absolute events */
+int kbd_mouse_has_absolute(void);
+
+struct MouseTransformInfo {
+ /* Touchscreen resolution */
+ int x;
+ int y;
+ /* Calibration values as used/generated by tslib */
+ int a[7];
+};
+
+void do_info_mice_print(Monitor *mon, const QObject *data);
+void do_info_mice(Monitor *mon, QObject **ret_data);
+void do_mouse_set(Monitor *mon, const QDict *qdict);
+
+/* keysym is a unicode code except for special keys (see QEMU_KEY_xxx
+ constants) */
+#define QEMU_KEY_ESC1(c) ((c) | 0xe100)
+#define QEMU_KEY_BACKSPACE 0x007f
+#define QEMU_KEY_UP QEMU_KEY_ESC1('A')
+#define QEMU_KEY_DOWN QEMU_KEY_ESC1('B')
+#define QEMU_KEY_RIGHT QEMU_KEY_ESC1('C')
+#define QEMU_KEY_LEFT QEMU_KEY_ESC1('D')
+#define QEMU_KEY_HOME QEMU_KEY_ESC1(1)
+#define QEMU_KEY_END QEMU_KEY_ESC1(4)
+#define QEMU_KEY_PAGEUP QEMU_KEY_ESC1(5)
+#define QEMU_KEY_PAGEDOWN QEMU_KEY_ESC1(6)
+#define QEMU_KEY_DELETE QEMU_KEY_ESC1(3)
+
+#define QEMU_KEY_CTRL_UP 0xe400
+#define QEMU_KEY_CTRL_DOWN 0xe401
+#define QEMU_KEY_CTRL_LEFT 0xe402
+#define QEMU_KEY_CTRL_RIGHT 0xe403
+#define QEMU_KEY_CTRL_HOME 0xe404
+#define QEMU_KEY_CTRL_END 0xe405
+#define QEMU_KEY_CTRL_PAGEUP 0xe406
+#define QEMU_KEY_CTRL_PAGEDOWN 0xe407
+
+void kbd_put_keysym(int keysym);
+
+/* consoles */
+
+#define QEMU_BIG_ENDIAN_FLAG 0x01
+#define QEMU_ALLOCATED_FLAG 0x02
+#define QEMU_REALPIXELS_FLAG 0x04
+
+struct PixelFormat {
+ uint8_t bits_per_pixel;
+ uint8_t bytes_per_pixel;
+ uint8_t depth; /* color depth in bits */
+ uint32_t rmask, gmask, bmask, amask;
+ uint8_t rshift, gshift, bshift, ashift;
+ uint8_t rmax, gmax, bmax, amax;
+ uint8_t rbits, gbits, bbits, abits;
+};
+
+struct DisplaySurface {
+ uint8_t flags;
+ int width;
+ int height;
+ int linesize; /* bytes per line */
+ uint8_t *data;
+
+ struct PixelFormat pf;
+};
+
+/* cursor data format is 32bit RGBA */
+typedef struct QEMUCursor {
+ int width, height;
+ int hot_x, hot_y;
+ int refcount;
+ uint32_t data[];
+} QEMUCursor;
+
+QEMUCursor *cursor_alloc(int width, int height);
+void cursor_get(QEMUCursor *c);
+void cursor_put(QEMUCursor *c);
+QEMUCursor *cursor_builtin_hidden(void);
+QEMUCursor *cursor_builtin_left_ptr(void);
+void cursor_print_ascii_art(QEMUCursor *c, const char *prefix);
+int cursor_get_mono_bpl(QEMUCursor *c);
+void cursor_set_mono(QEMUCursor *c,
+ uint32_t foreground, uint32_t background, uint8_t *image,
+ int transparent, uint8_t *mask);
+void cursor_get_mono_image(QEMUCursor *c, int foreground, uint8_t *mask);
+void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask);
+
+struct DisplayChangeListener {
+ int idle;
+ uint64_t gui_timer_interval;
+
+ void (*dpy_update)(struct DisplayState *s, int x, int y, int w, int h);
+ void (*dpy_resize)(struct DisplayState *s);
+ void (*dpy_setdata)(struct DisplayState *s);
+ void (*dpy_refresh)(struct DisplayState *s);
+ void (*dpy_copy)(struct DisplayState *s, int src_x, int src_y,
+ int dst_x, int dst_y, int w, int h);
+ void (*dpy_fill)(struct DisplayState *s, int x, int y,
+ int w, int h, uint32_t c);
+ void (*dpy_text_cursor)(struct DisplayState *s, int x, int y);
+
+ struct DisplayChangeListener *next;
+};
+
+struct DisplayAllocator {
+ DisplaySurface* (*create_displaysurface)(int width, int height);
+ DisplaySurface* (*resize_displaysurface)(DisplaySurface *surface, int width, int height);
+ void (*free_displaysurface)(DisplaySurface *surface);
+};
+
+struct DisplayState {
+ struct DisplaySurface *surface;
+ void *opaque;
+ struct QEMUTimer *gui_timer;
+
+ struct DisplayAllocator* allocator;
+ struct DisplayChangeListener* listeners;
+
+ void (*mouse_set)(int x, int y, int on);
+ void (*cursor_define)(QEMUCursor *cursor);
+
+ struct DisplayState *next;
+};
+
+void register_displaystate(DisplayState *ds);
+DisplayState *get_displaystate(void);
+DisplaySurface* qemu_create_displaysurface_from(int width, int height, int bpp,
+ int linesize, uint8_t *data);
+void qemu_alloc_display(DisplaySurface *surface, int width, int height,
+ int linesize, PixelFormat pf, int newflags);
+PixelFormat qemu_different_endianness_pixelformat(int bpp);
+PixelFormat qemu_default_pixelformat(int bpp);
+
+DisplayAllocator *register_displayallocator(DisplayState *ds, DisplayAllocator *da);
+
+static inline DisplaySurface* qemu_create_displaysurface(DisplayState *ds, int width, int height)
+{
+ return ds->allocator->create_displaysurface(width, height);
+}
+
+static inline DisplaySurface* qemu_resize_displaysurface(DisplayState *ds, int width, int height)
+{
+ return ds->allocator->resize_displaysurface(ds->surface, width, height);
+}
+
+static inline void qemu_free_displaysurface(DisplayState *ds)
+{
+ ds->allocator->free_displaysurface(ds->surface);
+}
+
+static inline int is_surface_bgr(DisplaySurface *surface)
+{
+ if (surface->pf.bits_per_pixel == 32 && surface->pf.rshift == 0)
+ return 1;
+ else
+ return 0;
+}
+
+static inline int is_buffer_shared(DisplaySurface *surface)
+{
+ return (!(surface->flags & QEMU_ALLOCATED_FLAG) &&
+ !(surface->flags & QEMU_REALPIXELS_FLAG));
+}
+
+static inline void register_displaychangelistener(DisplayState *ds, DisplayChangeListener *dcl)
+{
+ dcl->next = ds->listeners;
+ ds->listeners = dcl;
+}
+
+static inline void dpy_update(DisplayState *s, int x, int y, int w, int h)
+{
+ struct DisplayChangeListener *dcl = s->listeners;
+ while (dcl != NULL) {
+ dcl->dpy_update(s, x, y, w, h);
+ dcl = dcl->next;
+ }
+}
+
+static inline void dpy_resize(DisplayState *s)
+{
+ struct DisplayChangeListener *dcl = s->listeners;
+ while (dcl != NULL) {
+ dcl->dpy_resize(s);
+ dcl = dcl->next;
+ }
+}
+
+static inline void dpy_setdata(DisplayState *s)
+{
+ struct DisplayChangeListener *dcl = s->listeners;
+ while (dcl != NULL) {
+ if (dcl->dpy_setdata) dcl->dpy_setdata(s);
+ dcl = dcl->next;
+ }
+}
+
+static inline void dpy_refresh(DisplayState *s)
+{
+ struct DisplayChangeListener *dcl = s->listeners;
+ while (dcl != NULL) {
+ if (dcl->dpy_refresh) dcl->dpy_refresh(s);
+ dcl = dcl->next;
+ }
+}
+
+static inline void dpy_copy(struct DisplayState *s, int src_x, int src_y,
+ int dst_x, int dst_y, int w, int h) {
+ struct DisplayChangeListener *dcl = s->listeners;
+ while (dcl != NULL) {
+ if (dcl->dpy_copy)
+ dcl->dpy_copy(s, src_x, src_y, dst_x, dst_y, w, h);
+ else /* TODO */
+ dcl->dpy_update(s, dst_x, dst_y, w, h);
+ dcl = dcl->next;
+ }
+}
+
+static inline void dpy_fill(struct DisplayState *s, int x, int y,
+ int w, int h, uint32_t c) {
+ struct DisplayChangeListener *dcl = s->listeners;
+ while (dcl != NULL) {
+ if (dcl->dpy_fill) dcl->dpy_fill(s, x, y, w, h, c);
+ dcl = dcl->next;
+ }
+}
+
+static inline void dpy_cursor(struct DisplayState *s, int x, int y) {
+ struct DisplayChangeListener *dcl = s->listeners;
+ while (dcl != NULL) {
+ if (dcl->dpy_text_cursor) dcl->dpy_text_cursor(s, x, y);
+ dcl = dcl->next;
+ }
+}
+
+static inline int ds_get_linesize(DisplayState *ds)
+{
+ return ds->surface->linesize;
+}
+
+static inline uint8_t* ds_get_data(DisplayState *ds)
+{
+ return ds->surface->data;
+}
+
+static inline int ds_get_width(DisplayState *ds)
+{
+ return ds->surface->width;
+}
+
+static inline int ds_get_height(DisplayState *ds)
+{
+ return ds->surface->height;
+}
+
+static inline int ds_get_bits_per_pixel(DisplayState *ds)
+{
+ return ds->surface->pf.bits_per_pixel;
+}
+
+static inline int ds_get_bytes_per_pixel(DisplayState *ds)
+{
+ return ds->surface->pf.bytes_per_pixel;
+}
+
+typedef unsigned long console_ch_t;
+static inline void console_write_ch(console_ch_t *dest, uint32_t ch)
+{
+ if (!(ch & 0xff))
+ ch |= ' ';
+ *dest = ch;
+}
+
+typedef void (*vga_hw_update_ptr)(void *);
+typedef void (*vga_hw_invalidate_ptr)(void *);
+typedef void (*vga_hw_screen_dump_ptr)(void *, const char *);
+typedef void (*vga_hw_text_update_ptr)(void *, console_ch_t *);
+
+DisplayState *graphic_console_init(vga_hw_update_ptr update,
+ vga_hw_invalidate_ptr invalidate,
+ vga_hw_screen_dump_ptr screen_dump,
+ vga_hw_text_update_ptr text_update,
+ void *opaque);
+
+void vga_hw_update(void);
+void vga_hw_invalidate(void);
+void vga_hw_screen_dump(const char *filename);
+void vga_hw_text_update(console_ch_t *chardata);
+
+int is_graphic_console(void);
+int is_fixedsize_console(void);
+int text_console_init(QemuOpts *opts, CharDriverState **_chr);
+void text_consoles_set_display(DisplayState *ds);
+void console_select(unsigned int index);
+void console_color_init(DisplayState *ds);
+void qemu_console_resize(DisplayState *ds, int width, int height);
+void qemu_console_copy(DisplayState *ds, int src_x, int src_y,
+ int dst_x, int dst_y, int w, int h);
+
+/* sdl.c */
+void sdl_display_init(DisplayState *ds, int full_screen, int no_frame);
+
+/* cocoa.m */
+void cocoa_display_init(DisplayState *ds, int full_screen);
+
+/* vnc.c */
+void vnc_display_init(DisplayState *ds);
+void vnc_display_close(DisplayState *ds);
+int vnc_display_open(DisplayState *ds, const char *display);
+void vnc_display_add_client(DisplayState *ds, int csock, int skipauth);
+int vnc_display_disable_login(DisplayState *ds);
+char *vnc_display_local_addr(DisplayState *ds);
+#ifdef CONFIG_VNC
+int vnc_display_password(DisplayState *ds, const char *password);
+int vnc_display_pw_expire(DisplayState *ds, time_t expires);
+void do_info_vnc_print(Monitor *mon, const QObject *data);
+void do_info_vnc(Monitor *mon, QObject **ret_data);
+#else
+static inline int vnc_display_password(DisplayState *ds, const char *password)
+{
+ qerror_report(QERR_FEATURE_DISABLED, "vnc");
+ return -ENODEV;
+}
+static inline int vnc_display_pw_expire(DisplayState *ds, time_t expires)
+{
+ qerror_report(QERR_FEATURE_DISABLED, "vnc");
+ return -ENODEV;
+};
+static inline void do_info_vnc(Monitor *mon, QObject **ret_data)
+{
+};
+static inline void do_info_vnc_print(Monitor *mon, const QObject *data)
+{
+ monitor_printf(mon, "VNC support disabled\n");
+};
+#endif
+
+/* curses.c */
+void curses_display_init(DisplayState *ds, int full_screen);
+
+#endif
diff --git a/qemu-0.15.x/cpu-all.h b/qemu-0.15.x/cpu-all.h
new file mode 100644
index 0000000..e839100
--- /dev/null
+++ b/qemu-0.15.x/cpu-all.h
@@ -0,0 +1,1030 @@
+/*
+ * defines common to all virtual CPUs
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef CPU_ALL_H
+#define CPU_ALL_H
+
+#include "qemu-common.h"
+#include "cpu-common.h"
+
+/* some important defines:
+ *
+ * WORDS_ALIGNED : if defined, the host cpu can only make word aligned
+ * memory accesses.
+ *
+ * HOST_WORDS_BIGENDIAN : if defined, the host cpu is big endian and
+ * otherwise little endian.
+ *
+ * (TARGET_WORDS_ALIGNED : same for target cpu (not supported yet))
+ *
+ * TARGET_WORDS_BIGENDIAN : same for target cpu
+ */
+
+#include "softfloat.h"
+
+#if defined(HOST_WORDS_BIGENDIAN) != defined(TARGET_WORDS_BIGENDIAN)
+#define BSWAP_NEEDED
+#endif
+
+#ifdef BSWAP_NEEDED
+
+static inline uint16_t tswap16(uint16_t s)
+{
+ return bswap16(s);
+}
+
+static inline uint32_t tswap32(uint32_t s)
+{
+ return bswap32(s);
+}
+
+static inline uint64_t tswap64(uint64_t s)
+{
+ return bswap64(s);
+}
+
+static inline void tswap16s(uint16_t *s)
+{
+ *s = bswap16(*s);
+}
+
+static inline void tswap32s(uint32_t *s)
+{
+ *s = bswap32(*s);
+}
+
+static inline void tswap64s(uint64_t *s)
+{
+ *s = bswap64(*s);
+}
+
+#else
+
+static inline uint16_t tswap16(uint16_t s)
+{
+ return s;
+}
+
+static inline uint32_t tswap32(uint32_t s)
+{
+ return s;
+}
+
+static inline uint64_t tswap64(uint64_t s)
+{
+ return s;
+}
+
+static inline void tswap16s(uint16_t *s)
+{
+}
+
+static inline void tswap32s(uint32_t *s)
+{
+}
+
+static inline void tswap64s(uint64_t *s)
+{
+}
+
+#endif
+
+#if TARGET_LONG_SIZE == 4
+#define tswapl(s) tswap32(s)
+#define tswapls(s) tswap32s((uint32_t *)(s))
+#define bswaptls(s) bswap32s(s)
+#else
+#define tswapl(s) tswap64(s)
+#define tswapls(s) tswap64s((uint64_t *)(s))
+#define bswaptls(s) bswap64s(s)
+#endif
+
+typedef union {
+ float32 f;
+ uint32_t l;
+} CPU_FloatU;
+
+/* NOTE: arm FPA is horrible as double 32 bit words are stored in big
+ endian ! */
+typedef union {
+ float64 d;
+#if defined(HOST_WORDS_BIGENDIAN)
+ struct {
+ uint32_t upper;
+ uint32_t lower;
+ } l;
+#else
+ struct {
+ uint32_t lower;
+ uint32_t upper;
+ } l;
+#endif
+ uint64_t ll;
+} CPU_DoubleU;
+
+typedef union {
+ floatx80 d;
+ struct {
+ uint64_t lower;
+ uint16_t upper;
+ } l;
+} CPU_LDoubleU;
+
+typedef union {
+ float128 q;
+#if defined(HOST_WORDS_BIGENDIAN)
+ struct {
+ uint32_t upmost;
+ uint32_t upper;
+ uint32_t lower;
+ uint32_t lowest;
+ } l;
+ struct {
+ uint64_t upper;
+ uint64_t lower;
+ } ll;
+#else
+ struct {
+ uint32_t lowest;
+ uint32_t lower;
+ uint32_t upper;
+ uint32_t upmost;
+ } l;
+ struct {
+ uint64_t lower;
+ uint64_t upper;
+ } ll;
+#endif
+} CPU_QuadU;
+
+/* CPU memory access without any memory or io remapping */
+
+/*
+ * the generic syntax for the memory accesses is:
+ *
+ * load: ld{type}{sign}{size}{endian}_{access_type}(ptr)
+ *
+ * store: st{type}{size}{endian}_{access_type}(ptr, val)
+ *
+ * type is:
+ * (empty): integer access
+ * f : float access
+ *
+ * sign is:
+ * (empty): for floats or 32 bit size
+ * u : unsigned
+ * s : signed
+ *
+ * size is:
+ * b: 8 bits
+ * w: 16 bits
+ * l: 32 bits
+ * q: 64 bits
+ *
+ * endian is:
+ * (empty): target cpu endianness or 8 bit access
+ * r : reversed target cpu endianness (not implemented yet)
+ * be : big endian (not implemented yet)
+ * le : little endian (not implemented yet)
+ *
+ * access_type is:
+ * raw : host memory access
+ * user : user mode access using soft MMU
+ * kernel : kernel mode access using soft MMU
+ */
+static inline int ldub_p(const void *ptr)
+{
+ return *(uint8_t *)ptr;
+}
+
+static inline int ldsb_p(const void *ptr)
+{
+ return *(int8_t *)ptr;
+}
+
+static inline void stb_p(void *ptr, int v)
+{
+ *(uint8_t *)ptr = v;
+}
+
+/* NOTE: on arm, putting 2 in /proc/sys/debug/alignment so that the
+ kernel handles unaligned load/stores may give better results, but
+ it is a system wide setting : bad */
+#if defined(HOST_WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)
+
+/* conservative code for little endian unaligned accesses */
+static inline int lduw_le_p(const void *ptr)
+{
+#ifdef _ARCH_PPC
+ int val;
+ __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr));
+ return val;
+#else
+ const uint8_t *p = ptr;
+ return p[0] | (p[1] << 8);
+#endif
+}
+
+static inline int ldsw_le_p(const void *ptr)
+{
+#ifdef _ARCH_PPC
+ int val;
+ __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr));
+ return (int16_t)val;
+#else
+ const uint8_t *p = ptr;
+ return (int16_t)(p[0] | (p[1] << 8));
+#endif
+}
+
+static inline int ldl_le_p(const void *ptr)
+{
+#ifdef _ARCH_PPC
+ int val;
+ __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (ptr));
+ return val;
+#else
+ const uint8_t *p = ptr;
+ return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
+#endif
+}
+
+static inline uint64_t ldq_le_p(const void *ptr)
+{
+ const uint8_t *p = ptr;
+ uint32_t v1, v2;
+ v1 = ldl_le_p(p);
+ v2 = ldl_le_p(p + 4);
+ return v1 | ((uint64_t)v2 << 32);
+}
+
+static inline void stw_le_p(void *ptr, int v)
+{
+#ifdef _ARCH_PPC
+ __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr));
+#else
+ uint8_t *p = ptr;
+ p[0] = v;
+ p[1] = v >> 8;
+#endif
+}
+
+static inline void stl_le_p(void *ptr, int v)
+{
+#ifdef _ARCH_PPC
+ __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr));
+#else
+ uint8_t *p = ptr;
+ p[0] = v;
+ p[1] = v >> 8;
+ p[2] = v >> 16;
+ p[3] = v >> 24;
+#endif
+}
+
+static inline void stq_le_p(void *ptr, uint64_t v)
+{
+ uint8_t *p = ptr;
+ stl_le_p(p, (uint32_t)v);
+ stl_le_p(p + 4, v >> 32);
+}
+
+/* float access */
+
+static inline float32 ldfl_le_p(const void *ptr)
+{
+ union {
+ float32 f;
+ uint32_t i;
+ } u;
+ u.i = ldl_le_p(ptr);
+ return u.f;
+}
+
+static inline void stfl_le_p(void *ptr, float32 v)
+{
+ union {
+ float32 f;
+ uint32_t i;
+ } u;
+ u.f = v;
+ stl_le_p(ptr, u.i);
+}
+
+static inline float64 ldfq_le_p(const void *ptr)
+{
+ CPU_DoubleU u;
+ u.l.lower = ldl_le_p(ptr);
+ u.l.upper = ldl_le_p(ptr + 4);
+ return u.d;
+}
+
+static inline void stfq_le_p(void *ptr, float64 v)
+{
+ CPU_DoubleU u;
+ u.d = v;
+ stl_le_p(ptr, u.l.lower);
+ stl_le_p(ptr + 4, u.l.upper);
+}
+
+#else
+
+static inline int lduw_le_p(const void *ptr)
+{
+ return *(uint16_t *)ptr;
+}
+
+static inline int ldsw_le_p(const void *ptr)
+{
+ return *(int16_t *)ptr;
+}
+
+static inline int ldl_le_p(const void *ptr)
+{
+ return *(uint32_t *)ptr;
+}
+
+static inline uint64_t ldq_le_p(const void *ptr)
+{
+ return *(uint64_t *)ptr;
+}
+
+static inline void stw_le_p(void *ptr, int v)
+{
+ *(uint16_t *)ptr = v;
+}
+
+static inline void stl_le_p(void *ptr, int v)
+{
+ *(uint32_t *)ptr = v;
+}
+
+static inline void stq_le_p(void *ptr, uint64_t v)
+{
+ *(uint64_t *)ptr = v;
+}
+
+/* float access */
+
+static inline float32 ldfl_le_p(const void *ptr)
+{
+ return *(float32 *)ptr;
+}
+
+static inline float64 ldfq_le_p(const void *ptr)
+{
+ return *(float64 *)ptr;
+}
+
+static inline void stfl_le_p(void *ptr, float32 v)
+{
+ *(float32 *)ptr = v;
+}
+
+static inline void stfq_le_p(void *ptr, float64 v)
+{
+ *(float64 *)ptr = v;
+}
+#endif
+
+#if !defined(HOST_WORDS_BIGENDIAN) || defined(WORDS_ALIGNED)
+
+static inline int lduw_be_p(const void *ptr)
+{
+#if defined(__i386__)
+ int val;
+ asm volatile ("movzwl %1, %0\n"
+ "xchgb %b0, %h0\n"
+ : "=q" (val)
+ : "m" (*(uint16_t *)ptr));
+ return val;
+#else
+ const uint8_t *b = ptr;
+ return ((b[0] << 8) | b[1]);
+#endif
+}
+
+static inline int ldsw_be_p(const void *ptr)
+{
+#if defined(__i386__)
+ int val;
+ asm volatile ("movzwl %1, %0\n"
+ "xchgb %b0, %h0\n"
+ : "=q" (val)
+ : "m" (*(uint16_t *)ptr));
+ return (int16_t)val;
+#else
+ const uint8_t *b = ptr;
+ return (int16_t)((b[0] << 8) | b[1]);
+#endif
+}
+
+static inline int ldl_be_p(const void *ptr)
+{
+#if defined(__i386__) || defined(__x86_64__)
+ int val;
+ asm volatile ("movl %1, %0\n"
+ "bswap %0\n"
+ : "=r" (val)
+ : "m" (*(uint32_t *)ptr));
+ return val;
+#else
+ const uint8_t *b = ptr;
+ return (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3];
+#endif
+}
+
+static inline uint64_t ldq_be_p(const void *ptr)
+{
+ uint32_t a,b;
+ a = ldl_be_p(ptr);
+ b = ldl_be_p((uint8_t *)ptr + 4);
+ return (((uint64_t)a<<32)|b);
+}
+
+static inline void stw_be_p(void *ptr, int v)
+{
+#if defined(__i386__)
+ asm volatile ("xchgb %b0, %h0\n"
+ "movw %w0, %1\n"
+ : "=q" (v)
+ : "m" (*(uint16_t *)ptr), "0" (v));
+#else
+ uint8_t *d = (uint8_t *) ptr;
+ d[0] = v >> 8;
+ d[1] = v;
+#endif
+}
+
+static inline void stl_be_p(void *ptr, int v)
+{
+#if defined(__i386__) || defined(__x86_64__)
+ asm volatile ("bswap %0\n"
+ "movl %0, %1\n"
+ : "=r" (v)
+ : "m" (*(uint32_t *)ptr), "0" (v));
+#else
+ uint8_t *d = (uint8_t *) ptr;
+ d[0] = v >> 24;
+ d[1] = v >> 16;
+ d[2] = v >> 8;
+ d[3] = v;
+#endif
+}
+
+static inline void stq_be_p(void *ptr, uint64_t v)
+{
+ stl_be_p(ptr, v >> 32);
+ stl_be_p((uint8_t *)ptr + 4, v);
+}
+
+/* float access */
+
+static inline float32 ldfl_be_p(const void *ptr)
+{
+ union {
+ float32 f;
+ uint32_t i;
+ } u;
+ u.i = ldl_be_p(ptr);
+ return u.f;
+}
+
+static inline void stfl_be_p(void *ptr, float32 v)
+{
+ union {
+ float32 f;
+ uint32_t i;
+ } u;
+ u.f = v;
+ stl_be_p(ptr, u.i);
+}
+
+static inline float64 ldfq_be_p(const void *ptr)
+{
+ CPU_DoubleU u;
+ u.l.upper = ldl_be_p(ptr);
+ u.l.lower = ldl_be_p((uint8_t *)ptr + 4);
+ return u.d;
+}
+
+static inline void stfq_be_p(void *ptr, float64 v)
+{
+ CPU_DoubleU u;
+ u.d = v;
+ stl_be_p(ptr, u.l.upper);
+ stl_be_p((uint8_t *)ptr + 4, u.l.lower);
+}
+
+#else
+
+static inline int lduw_be_p(const void *ptr)
+{
+ return *(uint16_t *)ptr;
+}
+
+static inline int ldsw_be_p(const void *ptr)
+{
+ return *(int16_t *)ptr;
+}
+
+static inline int ldl_be_p(const void *ptr)
+{
+ return *(uint32_t *)ptr;
+}
+
+static inline uint64_t ldq_be_p(const void *ptr)
+{
+ return *(uint64_t *)ptr;
+}
+
+static inline void stw_be_p(void *ptr, int v)
+{
+ *(uint16_t *)ptr = v;
+}
+
+static inline void stl_be_p(void *ptr, int v)
+{
+ *(uint32_t *)ptr = v;
+}
+
+static inline void stq_be_p(void *ptr, uint64_t v)
+{
+ *(uint64_t *)ptr = v;
+}
+
+/* float access */
+
+static inline float32 ldfl_be_p(const void *ptr)
+{
+ return *(float32 *)ptr;
+}
+
+static inline float64 ldfq_be_p(const void *ptr)
+{
+ return *(float64 *)ptr;
+}
+
+static inline void stfl_be_p(void *ptr, float32 v)
+{
+ *(float32 *)ptr = v;
+}
+
+static inline void stfq_be_p(void *ptr, float64 v)
+{
+ *(float64 *)ptr = v;
+}
+
+#endif
+
+/* target CPU memory access functions */
+#if defined(TARGET_WORDS_BIGENDIAN)
+#define lduw_p(p) lduw_be_p(p)
+#define ldsw_p(p) ldsw_be_p(p)
+#define ldl_p(p) ldl_be_p(p)
+#define ldq_p(p) ldq_be_p(p)
+#define ldfl_p(p) ldfl_be_p(p)
+#define ldfq_p(p) ldfq_be_p(p)
+#define stw_p(p, v) stw_be_p(p, v)
+#define stl_p(p, v) stl_be_p(p, v)
+#define stq_p(p, v) stq_be_p(p, v)
+#define stfl_p(p, v) stfl_be_p(p, v)
+#define stfq_p(p, v) stfq_be_p(p, v)
+#else
+#define lduw_p(p) lduw_le_p(p)
+#define ldsw_p(p) ldsw_le_p(p)
+#define ldl_p(p) ldl_le_p(p)
+#define ldq_p(p) ldq_le_p(p)
+#define ldfl_p(p) ldfl_le_p(p)
+#define ldfq_p(p) ldfq_le_p(p)
+#define stw_p(p, v) stw_le_p(p, v)
+#define stl_p(p, v) stl_le_p(p, v)
+#define stq_p(p, v) stq_le_p(p, v)
+#define stfl_p(p, v) stfl_le_p(p, v)
+#define stfq_p(p, v) stfq_le_p(p, v)
+#endif
+
+/* MMU memory access macros */
+
+#if defined(CONFIG_USER_ONLY)
+#include <assert.h>
+#include "qemu-types.h"
+
+/* On some host systems the guest address space is reserved on the host.
+ * This allows the guest address space to be offset to a convenient location.
+ */
+#if defined(CONFIG_USE_GUEST_BASE)
+extern unsigned long guest_base;
+extern int have_guest_base;
+extern unsigned long reserved_va;
+#define GUEST_BASE guest_base
+#define RESERVED_VA reserved_va
+#else
+#define GUEST_BASE 0ul
+#define RESERVED_VA 0ul
+#endif
+
+/* All direct uses of g2h and h2g need to go away for usermode softmmu. */
+#define g2h(x) ((void *)((unsigned long)(x) + GUEST_BASE))
+
+#if HOST_LONG_BITS <= TARGET_VIRT_ADDR_SPACE_BITS
+#define h2g_valid(x) 1
+#else
+#define h2g_valid(x) ({ \
+ unsigned long __guest = (unsigned long)(x) - GUEST_BASE; \
+ __guest < (1ul << TARGET_VIRT_ADDR_SPACE_BITS); \
+})
+#endif
+
+#define h2g(x) ({ \
+ unsigned long __ret = (unsigned long)(x) - GUEST_BASE; \
+ /* Check if given address fits target address space */ \
+ assert(h2g_valid(x)); \
+ (abi_ulong)__ret; \
+})
+
+#define saddr(x) g2h(x)
+#define laddr(x) g2h(x)
+
+#else /* !CONFIG_USER_ONLY */
+/* NOTE: we use double casts if pointers and target_ulong have
+ different sizes */
+#define saddr(x) (uint8_t *)(long)(x)
+#define laddr(x) (uint8_t *)(long)(x)
+#endif
+
+#define ldub_raw(p) ldub_p(laddr((p)))
+#define ldsb_raw(p) ldsb_p(laddr((p)))
+#define lduw_raw(p) lduw_p(laddr((p)))
+#define ldsw_raw(p) ldsw_p(laddr((p)))
+#define ldl_raw(p) ldl_p(laddr((p)))
+#define ldq_raw(p) ldq_p(laddr((p)))
+#define ldfl_raw(p) ldfl_p(laddr((p)))
+#define ldfq_raw(p) ldfq_p(laddr((p)))
+#define stb_raw(p, v) stb_p(saddr((p)), v)
+#define stw_raw(p, v) stw_p(saddr((p)), v)
+#define stl_raw(p, v) stl_p(saddr((p)), v)
+#define stq_raw(p, v) stq_p(saddr((p)), v)
+#define stfl_raw(p, v) stfl_p(saddr((p)), v)
+#define stfq_raw(p, v) stfq_p(saddr((p)), v)
+
+
+#if defined(CONFIG_USER_ONLY)
+
+/* if user mode, no other memory access functions */
+#define ldub(p) ldub_raw(p)
+#define ldsb(p) ldsb_raw(p)
+#define lduw(p) lduw_raw(p)
+#define ldsw(p) ldsw_raw(p)
+#define ldl(p) ldl_raw(p)
+#define ldq(p) ldq_raw(p)
+#define ldfl(p) ldfl_raw(p)
+#define ldfq(p) ldfq_raw(p)
+#define stb(p, v) stb_raw(p, v)
+#define stw(p, v) stw_raw(p, v)
+#define stl(p, v) stl_raw(p, v)
+#define stq(p, v) stq_raw(p, v)
+#define stfl(p, v) stfl_raw(p, v)
+#define stfq(p, v) stfq_raw(p, v)
+
+#define ldub_code(p) ldub_raw(p)
+#define ldsb_code(p) ldsb_raw(p)
+#define lduw_code(p) lduw_raw(p)
+#define ldsw_code(p) ldsw_raw(p)
+#define ldl_code(p) ldl_raw(p)
+#define ldq_code(p) ldq_raw(p)
+
+#define ldub_kernel(p) ldub_raw(p)
+#define ldsb_kernel(p) ldsb_raw(p)
+#define lduw_kernel(p) lduw_raw(p)
+#define ldsw_kernel(p) ldsw_raw(p)
+#define ldl_kernel(p) ldl_raw(p)
+#define ldq_kernel(p) ldq_raw(p)
+#define ldfl_kernel(p) ldfl_raw(p)
+#define ldfq_kernel(p) ldfq_raw(p)
+#define stb_kernel(p, v) stb_raw(p, v)
+#define stw_kernel(p, v) stw_raw(p, v)
+#define stl_kernel(p, v) stl_raw(p, v)
+#define stq_kernel(p, v) stq_raw(p, v)
+#define stfl_kernel(p, v) stfl_raw(p, v)
+#define stfq_kernel(p, vt) stfq_raw(p, v)
+
+#endif /* defined(CONFIG_USER_ONLY) */
+
+/* page related stuff */
+
+#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
+#define TARGET_PAGE_MASK ~(TARGET_PAGE_SIZE - 1)
+#define TARGET_PAGE_ALIGN(addr) (((addr) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK)
+
+/* ??? These should be the larger of unsigned long and target_ulong. */
+extern unsigned long qemu_real_host_page_size;
+extern unsigned long qemu_host_page_bits;
+extern unsigned long qemu_host_page_size;
+extern unsigned long qemu_host_page_mask;
+
+#define HOST_PAGE_ALIGN(addr) (((addr) + qemu_host_page_size - 1) & qemu_host_page_mask)
+
+/* same as PROT_xxx */
+#define PAGE_READ 0x0001
+#define PAGE_WRITE 0x0002
+#define PAGE_EXEC 0x0004
+#define PAGE_BITS (PAGE_READ | PAGE_WRITE | PAGE_EXEC)
+#define PAGE_VALID 0x0008
+/* original state of the write flag (used when tracking self-modifying
+ code */
+#define PAGE_WRITE_ORG 0x0010
+#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
+/* FIXME: Code that sets/uses this is broken and needs to go away. */
+#define PAGE_RESERVED 0x0020
+#endif
+
+#if defined(CONFIG_USER_ONLY)
+void page_dump(FILE *f);
+
+typedef int (*walk_memory_regions_fn)(void *, abi_ulong,
+ abi_ulong, unsigned long);
+int walk_memory_regions(void *, walk_memory_regions_fn);
+
+int page_get_flags(target_ulong address);
+void page_set_flags(target_ulong start, target_ulong end, int flags);
+int page_check_range(target_ulong start, target_ulong len, int flags);
+#endif
+
+CPUState *cpu_copy(CPUState *env);
+CPUState *qemu_get_cpu(int cpu);
+
+#define CPU_DUMP_CODE 0x00010000
+
+void cpu_dump_state(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
+ int flags);
+void cpu_dump_statistics(CPUState *env, FILE *f, fprintf_function cpu_fprintf,
+ int flags);
+
+void QEMU_NORETURN cpu_abort(CPUState *env, const char *fmt, ...)
+ GCC_FMT_ATTR(2, 3);
+extern CPUState *first_cpu;
+extern CPUState *cpu_single_env;
+
+/* Flags for use in ENV->INTERRUPT_PENDING.
+
+ The numbers assigned here are non-sequential in order to preserve
+ binary compatibility with the vmstate dump. Bit 0 (0x0001) was
+ previously used for CPU_INTERRUPT_EXIT, and is cleared when loading
+ the vmstate dump. */
+
+/* External hardware interrupt pending. This is typically used for
+ interrupts from devices. */
+#define CPU_INTERRUPT_HARD 0x0002
+
+/* Exit the current TB. This is typically used when some system-level device
+ makes some change to the memory mapping. E.g. the a20 line change. */
+#define CPU_INTERRUPT_EXITTB 0x0004
+
+/* Halt the CPU. */
+#define CPU_INTERRUPT_HALT 0x0020
+
+/* Debug event pending. */
+#define CPU_INTERRUPT_DEBUG 0x0080
+
+/* Several target-specific external hardware interrupts. Each target/cpu.h
+ should define proper names based on these defines. */
+#define CPU_INTERRUPT_TGT_EXT_0 0x0008
+#define CPU_INTERRUPT_TGT_EXT_1 0x0010
+#define CPU_INTERRUPT_TGT_EXT_2 0x0040
+#define CPU_INTERRUPT_TGT_EXT_3 0x0200
+#define CPU_INTERRUPT_TGT_EXT_4 0x1000
+
+/* Several target-specific internal interrupts. These differ from the
+ preceeding target-specific interrupts in that they are intended to
+ originate from within the cpu itself, typically in response to some
+ instruction being executed. These, therefore, are not masked while
+ single-stepping within the debugger. */
+#define CPU_INTERRUPT_TGT_INT_0 0x0100
+#define CPU_INTERRUPT_TGT_INT_1 0x0400
+#define CPU_INTERRUPT_TGT_INT_2 0x0800
+
+/* First unused bit: 0x2000. */
+
+/* The set of all bits that should be masked when single-stepping. */
+#define CPU_INTERRUPT_SSTEP_MASK \
+ (CPU_INTERRUPT_HARD \
+ | CPU_INTERRUPT_TGT_EXT_0 \
+ | CPU_INTERRUPT_TGT_EXT_1 \
+ | CPU_INTERRUPT_TGT_EXT_2 \
+ | CPU_INTERRUPT_TGT_EXT_3 \
+ | CPU_INTERRUPT_TGT_EXT_4)
+
+#ifndef CONFIG_USER_ONLY
+typedef void (*CPUInterruptHandler)(CPUState *, int);
+
+extern CPUInterruptHandler cpu_interrupt_handler;
+
+static inline void cpu_interrupt(CPUState *s, int mask)
+{
+ cpu_interrupt_handler(s, mask);
+}
+#else /* USER_ONLY */
+void cpu_interrupt(CPUState *env, int mask);
+#endif /* USER_ONLY */
+
+void cpu_reset_interrupt(CPUState *env, int mask);
+
+void cpu_exit(CPUState *s);
+
+bool qemu_cpu_has_work(CPUState *env);
+
+/* Breakpoint/watchpoint flags */
+#define BP_MEM_READ 0x01
+#define BP_MEM_WRITE 0x02
+#define BP_MEM_ACCESS (BP_MEM_READ | BP_MEM_WRITE)
+#define BP_STOP_BEFORE_ACCESS 0x04
+#define BP_WATCHPOINT_HIT 0x08
+#define BP_GDB 0x10
+#define BP_CPU 0x20
+
+int cpu_breakpoint_insert(CPUState *env, target_ulong pc, int flags,
+ CPUBreakpoint **breakpoint);
+int cpu_breakpoint_remove(CPUState *env, target_ulong pc, int flags);
+void cpu_breakpoint_remove_by_ref(CPUState *env, CPUBreakpoint *breakpoint);
+void cpu_breakpoint_remove_all(CPUState *env, int mask);
+int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
+ int flags, CPUWatchpoint **watchpoint);
+int cpu_watchpoint_remove(CPUState *env, target_ulong addr,
+ target_ulong len, int flags);
+void cpu_watchpoint_remove_by_ref(CPUState *env, CPUWatchpoint *watchpoint);
+void cpu_watchpoint_remove_all(CPUState *env, int mask);
+
+#define SSTEP_ENABLE 0x1 /* Enable simulated HW single stepping */
+#define SSTEP_NOIRQ 0x2 /* Do not use IRQ while single stepping */
+#define SSTEP_NOTIMER 0x4 /* Do not Timers while single stepping */
+
+void cpu_single_step(CPUState *env, int enabled);
+void cpu_reset(CPUState *s);
+int cpu_is_stopped(CPUState *env);
+void run_on_cpu(CPUState *env, void (*func)(void *data), void *data);
+
+#define CPU_LOG_TB_OUT_ASM (1 << 0)
+#define CPU_LOG_TB_IN_ASM (1 << 1)
+#define CPU_LOG_TB_OP (1 << 2)
+#define CPU_LOG_TB_OP_OPT (1 << 3)
+#define CPU_LOG_INT (1 << 4)
+#define CPU_LOG_EXEC (1 << 5)
+#define CPU_LOG_PCALL (1 << 6)
+#define CPU_LOG_IOPORT (1 << 7)
+#define CPU_LOG_TB_CPU (1 << 8)
+#define CPU_LOG_RESET (1 << 9)
+
+/* define log items */
+typedef struct CPULogItem {
+ int mask;
+ const char *name;
+ const char *help;
+} CPULogItem;
+
+extern const CPULogItem cpu_log_items[];
+
+void cpu_set_log(int log_flags);
+void cpu_set_log_filename(const char *filename);
+int cpu_str_to_log_mask(const char *str);
+
+#if !defined(CONFIG_USER_ONLY)
+
+/* Return the physical page corresponding to a virtual one. Use it
+ only for debugging because no protection checks are done. Return -1
+ if no page found. */
+target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr);
+
+/* memory API */
+
+extern int phys_ram_fd;
+extern ram_addr_t ram_size;
+
+/* RAM is pre-allocated and passed into qemu_ram_alloc_from_ptr */
+#define RAM_PREALLOC_MASK (1 << 0)
+
+typedef struct RAMBlock {
+ uint8_t *host;
+ ram_addr_t offset;
+ ram_addr_t length;
+ uint32_t flags;
+ char idstr[256];
+ QLIST_ENTRY(RAMBlock) next;
+#if defined(__linux__) && !defined(TARGET_S390X)
+ int fd;
+#endif
+} RAMBlock;
+
+typedef struct RAMList {
+ uint8_t *phys_dirty;
+ QLIST_HEAD(ram, RAMBlock) blocks;
+} RAMList;
+extern RAMList ram_list;
+
+extern const char *mem_path;
+extern int mem_prealloc;
+
+/* physical memory access */
+
+/* MMIO pages are identified by a combination of an IO device index and
+ 3 flags. The ROMD code stores the page ram offset in iotlb entry,
+ so only a limited number of ids are avaiable. */
+
+#define IO_MEM_NB_ENTRIES (1 << (TARGET_PAGE_BITS - IO_MEM_SHIFT))
+
+/* Flags stored in the low bits of the TLB virtual address. These are
+ defined so that fast path ram access is all zeros. */
+/* Zero if TLB entry is valid. */
+#define TLB_INVALID_MASK (1 << 3)
+/* Set if TLB entry references a clean RAM page. The iotlb entry will
+ contain the page physical address. */
+#define TLB_NOTDIRTY (1 << 4)
+/* Set if TLB entry is an IO callback. */
+#define TLB_MMIO (1 << 5)
+
+#define VGA_DIRTY_FLAG 0x01
+#define CODE_DIRTY_FLAG 0x02
+#define MIGRATION_DIRTY_FLAG 0x08
+
+/* read dirty bit (return 0 or 1) */
+static inline int cpu_physical_memory_is_dirty(ram_addr_t addr)
+{
+ return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] == 0xff;
+}
+
+static inline int cpu_physical_memory_get_dirty_flags(ram_addr_t addr)
+{
+ return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS];
+}
+
+static inline int cpu_physical_memory_get_dirty(ram_addr_t addr,
+ int dirty_flags)
+{
+ return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] & dirty_flags;
+}
+
+static inline void cpu_physical_memory_set_dirty(ram_addr_t addr)
+{
+ ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] = 0xff;
+}
+
+static inline int cpu_physical_memory_set_dirty_flags(ram_addr_t addr,
+ int dirty_flags)
+{
+ return ram_list.phys_dirty[addr >> TARGET_PAGE_BITS] |= dirty_flags;
+}
+
+static inline void cpu_physical_memory_mask_dirty_range(ram_addr_t start,
+ int length,
+ int dirty_flags)
+{
+ int i, mask, len;
+ uint8_t *p;
+
+ len = length >> TARGET_PAGE_BITS;
+ mask = ~dirty_flags;
+ p = ram_list.phys_dirty + (start >> TARGET_PAGE_BITS);
+ for (i = 0; i < len; i++) {
+ p[i] &= mask;
+ }
+}
+
+void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
+ int dirty_flags);
+void cpu_tlb_update_dirty(CPUState *env);
+
+int cpu_physical_memory_set_dirty_tracking(int enable);
+
+int cpu_physical_memory_get_dirty_tracking(void);
+
+int cpu_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
+ target_phys_addr_t end_addr);
+
+int cpu_physical_log_start(target_phys_addr_t start_addr,
+ ram_addr_t size);
+
+int cpu_physical_log_stop(target_phys_addr_t start_addr,
+ ram_addr_t size);
+
+void dump_exec_info(FILE *f, fprintf_function cpu_fprintf);
+#endif /* !CONFIG_USER_ONLY */
+
+int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
+ uint8_t *buf, int len, int is_write);
+
+#endif /* CPU_ALL_H */
diff --git a/qemu-0.15.x/cpu-common.h b/qemu-0.15.x/cpu-common.h
new file mode 100644
index 0000000..44b04b3
--- /dev/null
+++ b/qemu-0.15.x/cpu-common.h
@@ -0,0 +1,178 @@
+#ifndef CPU_COMMON_H
+#define CPU_COMMON_H 1
+
+/* CPU interfaces that are target indpendent. */
+
+#if defined(__arm__) || defined(__sparc__) || defined(__mips__) || defined(__hppa__) || defined(__ia64__)
+#define WORDS_ALIGNED
+#endif
+
+#ifdef TARGET_PHYS_ADDR_BITS
+#include "targphys.h"
+#endif
+
+#ifndef NEED_CPU_H
+#include "poison.h"
+#endif
+
+#include "bswap.h"
+#include "qemu-queue.h"
+
+#if !defined(CONFIG_USER_ONLY)
+
+enum device_endian {
+ DEVICE_NATIVE_ENDIAN,
+ DEVICE_BIG_ENDIAN,
+ DEVICE_LITTLE_ENDIAN,
+};
+
+/* address in the RAM (different from a physical address) */
+typedef unsigned long ram_addr_t;
+
+/* memory API */
+
+typedef void CPUWriteMemoryFunc(void *opaque, target_phys_addr_t addr, uint32_t value);
+typedef uint32_t CPUReadMemoryFunc(void *opaque, target_phys_addr_t addr);
+
+void cpu_register_physical_memory_log(target_phys_addr_t start_addr,
+ ram_addr_t size,
+ ram_addr_t phys_offset,
+ ram_addr_t region_offset,
+ bool log_dirty);
+
+static inline void cpu_register_physical_memory_offset(target_phys_addr_t start_addr,
+ ram_addr_t size,
+ ram_addr_t phys_offset,
+ ram_addr_t region_offset)
+{
+ cpu_register_physical_memory_log(start_addr, size, phys_offset,
+ region_offset, false);
+}
+
+static inline void cpu_register_physical_memory(target_phys_addr_t start_addr,
+ ram_addr_t size,
+ ram_addr_t phys_offset)
+{
+ cpu_register_physical_memory_offset(start_addr, size, phys_offset, 0);
+}
+
+ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr);
+ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name,
+ ram_addr_t size, void *host);
+ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size);
+void qemu_ram_free(ram_addr_t addr);
+void qemu_ram_free_from_ptr(ram_addr_t addr);
+void qemu_ram_remap(ram_addr_t addr, ram_addr_t length);
+/* This should only be used for ram local to a device. */
+void *qemu_get_ram_ptr(ram_addr_t addr);
+void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size);
+/* Same but slower, to use for migration, where the order of
+ * RAMBlocks must not change. */
+void *qemu_safe_ram_ptr(ram_addr_t addr);
+void qemu_put_ram_ptr(void *addr);
+/* This should not be used by devices. */
+int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr);
+ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr);
+
+int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
+ CPUWriteMemoryFunc * const *mem_write,
+ void *opaque, enum device_endian endian);
+void cpu_unregister_io_memory(int table_address);
+
+void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
+ int len, int is_write);
+static inline void cpu_physical_memory_read(target_phys_addr_t addr,
+ void *buf, int len)
+{
+ cpu_physical_memory_rw(addr, buf, len, 0);
+}
+static inline void cpu_physical_memory_write(target_phys_addr_t addr,
+ const void *buf, int len)
+{
+ cpu_physical_memory_rw(addr, (void *)buf, len, 1);
+}
+void *cpu_physical_memory_map(target_phys_addr_t addr,
+ target_phys_addr_t *plen,
+ int is_write);
+void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
+ int is_write, target_phys_addr_t access_len);
+void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque));
+void cpu_unregister_map_client(void *cookie);
+
+struct CPUPhysMemoryClient;
+typedef struct CPUPhysMemoryClient CPUPhysMemoryClient;
+struct CPUPhysMemoryClient {
+ void (*set_memory)(struct CPUPhysMemoryClient *client,
+ target_phys_addr_t start_addr,
+ ram_addr_t size,
+ ram_addr_t phys_offset,
+ bool log_dirty);
+ int (*sync_dirty_bitmap)(struct CPUPhysMemoryClient *client,
+ target_phys_addr_t start_addr,
+ target_phys_addr_t end_addr);
+ int (*migration_log)(struct CPUPhysMemoryClient *client,
+ int enable);
+ int (*log_start)(struct CPUPhysMemoryClient *client,
+ target_phys_addr_t phys_addr, ram_addr_t size);
+ int (*log_stop)(struct CPUPhysMemoryClient *client,
+ target_phys_addr_t phys_addr, ram_addr_t size);
+ QLIST_ENTRY(CPUPhysMemoryClient) list;
+};
+
+void cpu_register_phys_memory_client(CPUPhysMemoryClient *);
+void cpu_unregister_phys_memory_client(CPUPhysMemoryClient *);
+
+/* Coalesced MMIO regions are areas where write operations can be reordered.
+ * This usually implies that write operations are side-effect free. This allows
+ * batching which can make a major impact on performance when using
+ * virtualization.
+ */
+void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
+
+void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
+
+void qemu_flush_coalesced_mmio_buffer(void);
+
+uint32_t ldub_phys(target_phys_addr_t addr);
+uint32_t lduw_le_phys(target_phys_addr_t addr);
+uint32_t lduw_be_phys(target_phys_addr_t addr);
+uint32_t ldl_le_phys(target_phys_addr_t addr);
+uint32_t ldl_be_phys(target_phys_addr_t addr);
+uint64_t ldq_le_phys(target_phys_addr_t addr);
+uint64_t ldq_be_phys(target_phys_addr_t addr);
+void stb_phys(target_phys_addr_t addr, uint32_t val);
+void stw_le_phys(target_phys_addr_t addr, uint32_t val);
+void stw_be_phys(target_phys_addr_t addr, uint32_t val);
+void stl_le_phys(target_phys_addr_t addr, uint32_t val);
+void stl_be_phys(target_phys_addr_t addr, uint32_t val);
+void stq_le_phys(target_phys_addr_t addr, uint64_t val);
+void stq_be_phys(target_phys_addr_t addr, uint64_t val);
+
+#ifdef NEED_CPU_H
+uint32_t lduw_phys(target_phys_addr_t addr);
+uint32_t ldl_phys(target_phys_addr_t addr);
+uint64_t ldq_phys(target_phys_addr_t addr);
+void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val);
+void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val);
+void stw_phys(target_phys_addr_t addr, uint32_t val);
+void stl_phys(target_phys_addr_t addr, uint32_t val);
+void stq_phys(target_phys_addr_t addr, uint64_t val);
+#endif
+
+void cpu_physical_memory_write_rom(target_phys_addr_t addr,
+ const uint8_t *buf, int len);
+
+#define IO_MEM_SHIFT 3
+
+#define IO_MEM_RAM (0 << IO_MEM_SHIFT) /* hardcoded offset */
+#define IO_MEM_ROM (1 << IO_MEM_SHIFT) /* hardcoded offset */
+#define IO_MEM_UNASSIGNED (2 << IO_MEM_SHIFT)
+#define IO_MEM_NOTDIRTY (3 << IO_MEM_SHIFT)
+
+/* Acts like a ROM when read and like a device when written. */
+#define IO_MEM_ROMD (1)
+#define IO_MEM_SUBPAGE (2)
+
+#endif
+
+#endif /* !CPU_COMMON_H */
diff --git a/qemu-0.15.x/cpu-defs.h b/qemu-0.15.x/cpu-defs.h
new file mode 100644
index 0000000..db48a7a
--- /dev/null
+++ b/qemu-0.15.x/cpu-defs.h
@@ -0,0 +1,223 @@
+/*
+ * common defines for all CPUs
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef CPU_DEFS_H
+#define CPU_DEFS_H
+
+#ifndef NEED_CPU_H
+#error cpu.h included from common code
+#endif
+
+#include "config.h"
+#include <setjmp.h>
+#include <inttypes.h>
+#include <signal.h>
+#include "osdep.h"
+#include "qemu-queue.h"
+#include "targphys.h"
+
+#ifndef TARGET_LONG_BITS
+#error TARGET_LONG_BITS must be defined before including this header
+#endif
+
+#define TARGET_LONG_SIZE (TARGET_LONG_BITS / 8)
+
+typedef int16_t target_short __attribute__ ((aligned(TARGET_SHORT_ALIGNMENT)));
+typedef uint16_t target_ushort __attribute__((aligned(TARGET_SHORT_ALIGNMENT)));
+typedef int32_t target_int __attribute__((aligned(TARGET_INT_ALIGNMENT)));
+typedef uint32_t target_uint __attribute__((aligned(TARGET_INT_ALIGNMENT)));
+typedef int64_t target_llong __attribute__((aligned(TARGET_LLONG_ALIGNMENT)));
+typedef uint64_t target_ullong __attribute__((aligned(TARGET_LLONG_ALIGNMENT)));
+/* target_ulong is the type of a virtual address */
+#if TARGET_LONG_SIZE == 4
+typedef int32_t target_long __attribute__((aligned(TARGET_LONG_ALIGNMENT)));
+typedef uint32_t target_ulong __attribute__((aligned(TARGET_LONG_ALIGNMENT)));
+#define TARGET_FMT_lx "%08x"
+#define TARGET_FMT_ld "%d"
+#define TARGET_FMT_lu "%u"
+#elif TARGET_LONG_SIZE == 8
+typedef int64_t target_long __attribute__((aligned(TARGET_LONG_ALIGNMENT)));
+typedef uint64_t target_ulong __attribute__((aligned(TARGET_LONG_ALIGNMENT)));
+#define TARGET_FMT_lx "%016" PRIx64
+#define TARGET_FMT_ld "%" PRId64
+#define TARGET_FMT_lu "%" PRIu64
+#else
+#error TARGET_LONG_SIZE undefined
+#endif
+
+#define HOST_LONG_SIZE (HOST_LONG_BITS / 8)
+
+#define EXCP_INTERRUPT 0x10000 /* async interruption */
+#define EXCP_HLT 0x10001 /* hlt instruction reached */
+#define EXCP_DEBUG 0x10002 /* cpu stopped after a breakpoint or singlestep */
+#define EXCP_HALTED 0x10003 /* cpu is halted (waiting for external event) */
+
+#define TB_JMP_CACHE_BITS 12
+#define TB_JMP_CACHE_SIZE (1 << TB_JMP_CACHE_BITS)
+
+/* Only the bottom TB_JMP_PAGE_BITS of the jump cache hash bits vary for
+ addresses on the same page. The top bits are the same. This allows
+ TLB invalidation to quickly clear a subset of the hash table. */
+#define TB_JMP_PAGE_BITS (TB_JMP_CACHE_BITS / 2)
+#define TB_JMP_PAGE_SIZE (1 << TB_JMP_PAGE_BITS)
+#define TB_JMP_ADDR_MASK (TB_JMP_PAGE_SIZE - 1)
+#define TB_JMP_PAGE_MASK (TB_JMP_CACHE_SIZE - TB_JMP_PAGE_SIZE)
+
+#if !defined(CONFIG_USER_ONLY)
+#define CPU_TLB_BITS 8
+#define CPU_TLB_SIZE (1 << CPU_TLB_BITS)
+
+#if HOST_LONG_BITS == 32 && TARGET_LONG_BITS == 32
+#define CPU_TLB_ENTRY_BITS 4
+#else
+#define CPU_TLB_ENTRY_BITS 5
+#endif
+
+typedef struct CPUTLBEntry {
+ /* bit TARGET_LONG_BITS to TARGET_PAGE_BITS : virtual address
+ bit TARGET_PAGE_BITS-1..4 : Nonzero for accesses that should not
+ go directly to ram.
+ bit 3 : indicates that the entry is invalid
+ bit 2..0 : zero
+ */
+ target_ulong addr_read;
+ target_ulong addr_write;
+ target_ulong addr_code;
+ /* Addend to virtual address to get host address. IO accesses
+ use the corresponding iotlb value. */
+ unsigned long addend;
+ /* padding to get a power of two size */
+ uint8_t dummy[(1 << CPU_TLB_ENTRY_BITS) -
+ (sizeof(target_ulong) * 3 +
+ ((-sizeof(target_ulong) * 3) & (sizeof(unsigned long) - 1)) +
+ sizeof(unsigned long))];
+} CPUTLBEntry;
+
+extern int CPUTLBEntry_wrong_size[sizeof(CPUTLBEntry) == (1 << CPU_TLB_ENTRY_BITS) ? 1 : -1];
+
+#define CPU_COMMON_TLB \
+ /* The meaning of the MMU modes is defined in the target code. */ \
+ CPUTLBEntry tlb_table[NB_MMU_MODES][CPU_TLB_SIZE]; \
+ target_phys_addr_t iotlb[NB_MMU_MODES][CPU_TLB_SIZE]; \
+ target_ulong tlb_flush_addr; \
+ target_ulong tlb_flush_mask;
+
+#else
+
+#define CPU_COMMON_TLB
+
+#endif
+
+
+#ifdef HOST_WORDS_BIGENDIAN
+typedef struct icount_decr_u16 {
+ uint16_t high;
+ uint16_t low;
+} icount_decr_u16;
+#else
+typedef struct icount_decr_u16 {
+ uint16_t low;
+ uint16_t high;
+} icount_decr_u16;
+#endif
+
+struct kvm_run;
+struct KVMState;
+struct qemu_work_item;
+
+typedef struct CPUBreakpoint {
+ target_ulong pc;
+ int flags; /* BP_* */
+ QTAILQ_ENTRY(CPUBreakpoint) entry;
+} CPUBreakpoint;
+
+typedef struct CPUWatchpoint {
+ target_ulong vaddr;
+ target_ulong len_mask;
+ int flags; /* BP_* */
+ QTAILQ_ENTRY(CPUWatchpoint) entry;
+} CPUWatchpoint;
+
+#define CPU_TEMP_BUF_NLONGS 128
+#define CPU_COMMON \
+ struct TranslationBlock *current_tb; /* currently executing TB */ \
+ /* soft mmu support */ \
+ /* in order to avoid passing too many arguments to the MMIO \
+ helpers, we store some rarely used information in the CPU \
+ context) */ \
+ unsigned long mem_io_pc; /* host pc at which the memory was \
+ accessed */ \
+ target_ulong mem_io_vaddr; /* target virtual addr at which the \
+ memory was accessed */ \
+ uint32_t halted; /* Nonzero if the CPU is in suspend state */ \
+ uint32_t interrupt_request; \
+ volatile sig_atomic_t exit_request; \
+ CPU_COMMON_TLB \
+ struct TranslationBlock *tb_jmp_cache[TB_JMP_CACHE_SIZE]; \
+ /* buffer for temporaries in the code generator */ \
+ long temp_buf[CPU_TEMP_BUF_NLONGS]; \
+ \
+ int64_t icount_extra; /* Instructions until next timer event. */ \
+ /* Number of cycles left, with interrupt flag in high bit. \
+ This allows a single read-compare-cbranch-write sequence to test \
+ for both decrementer underflow and exceptions. */ \
+ union { \
+ uint32_t u32; \
+ icount_decr_u16 u16; \
+ } icount_decr; \
+ uint32_t can_do_io; /* nonzero if memory mapped IO is safe. */ \
+ \
+ /* from this point: preserved by CPU reset */ \
+ /* ice debug support */ \
+ QTAILQ_HEAD(breakpoints_head, CPUBreakpoint) breakpoints; \
+ int singlestep_enabled; \
+ \
+ QTAILQ_HEAD(watchpoints_head, CPUWatchpoint) watchpoints; \
+ CPUWatchpoint *watchpoint_hit; \
+ \
+ struct GDBRegisterState *gdb_regs; \
+ \
+ /* Core interrupt code */ \
+ jmp_buf jmp_env; \
+ int exception_index; \
+ \
+ CPUState *next_cpu; /* next CPU sharing TB cache */ \
+ int cpu_index; /* CPU index (informative) */ \
+ uint32_t host_tid; /* host thread ID */ \
+ int numa_node; /* NUMA node this cpu is belonging to */ \
+ int nr_cores; /* number of cores within this CPU package */ \
+ int nr_threads;/* number of threads within this CPU */ \
+ int running; /* Nonzero if cpu is currently running(usermode). */ \
+ int thread_id; \
+ /* user data */ \
+ void *opaque; \
+ \
+ uint32_t created; \
+ uint32_t stop; /* Stop request */ \
+ uint32_t stopped; /* Artificially stopped */ \
+ struct QemuThread *thread; \
+ struct QemuCond *halt_cond; \
+ int thread_kicked; \
+ struct qemu_work_item *queued_work_first, *queued_work_last; \
+ const char *cpu_model_str; \
+ struct KVMState *kvm_state; \
+ struct kvm_run *kvm_run; \
+ int kvm_fd; \
+ int kvm_vcpu_dirty;
+
+#endif
diff --git a/qemu-0.15.x/cpu-exec.c b/qemu-0.15.x/cpu-exec.c
new file mode 100644
index 0000000..de0d716
--- /dev/null
+++ b/qemu-0.15.x/cpu-exec.c
@@ -0,0 +1,627 @@
+/*
+ * i386 emulator main execution loop
+ *
+ * Copyright (c) 2003-2005 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include "config.h"
+#include "cpu.h"
+#include "disas.h"
+#include "tcg.h"
+#include "qemu-barrier.h"
+
+int tb_invalidated_flag;
+
+//#define CONFIG_DEBUG_EXEC
+
+bool qemu_cpu_has_work(CPUState *env)
+{
+ return cpu_has_work(env);
+}
+
+void cpu_loop_exit(CPUState *env)
+{
+ env->current_tb = NULL;
+ longjmp(env->jmp_env, 1);
+}
+
+/* exit the current TB from a signal handler. The host registers are
+ restored in a state compatible with the CPU emulator
+ */
+#if defined(CONFIG_SOFTMMU)
+void cpu_resume_from_signal(CPUState *env, void *puc)
+{
+ /* XXX: restore cpu registers saved in host registers */
+
+ env->exception_index = -1;
+ longjmp(env->jmp_env, 1);
+}
+#endif
+
+/* Execute the code without caching the generated code. An interpreter
+ could be used if available. */
+static void cpu_exec_nocache(CPUState *env, int max_cycles,
+ TranslationBlock *orig_tb)
+{
+ unsigned long next_tb;
+ TranslationBlock *tb;
+
+ /* Should never happen.
+ We only end up here when an existing TB is too long. */
+ if (max_cycles > CF_COUNT_MASK)
+ max_cycles = CF_COUNT_MASK;
+
+ tb = tb_gen_code(env, orig_tb->pc, orig_tb->cs_base, orig_tb->flags,
+ max_cycles);
+ env->current_tb = tb;
+ /* execute the generated code */
+ next_tb = tcg_qemu_tb_exec(env, tb->tc_ptr);
+ env->current_tb = NULL;
+
+ if ((next_tb & 3) == 2) {
+ /* Restore PC. This may happen if async event occurs before
+ the TB starts executing. */
+ cpu_pc_from_tb(env, tb);
+ }
+ tb_phys_invalidate(tb, -1);
+ tb_free(tb);
+}
+
+static TranslationBlock *tb_find_slow(CPUState *env,
+ target_ulong pc,
+ target_ulong cs_base,
+ uint64_t flags)
+{
+ TranslationBlock *tb, **ptb1;
+ unsigned int h;
+ tb_page_addr_t phys_pc, phys_page1, phys_page2;
+ target_ulong virt_page2;
+
+ tb_invalidated_flag = 0;
+
+ /* find translated block using physical mappings */
+ phys_pc = get_page_addr_code(env, pc);
+ phys_page1 = phys_pc & TARGET_PAGE_MASK;
+ phys_page2 = -1;
+ h = tb_phys_hash_func(phys_pc);
+ ptb1 = &tb_phys_hash[h];
+ for(;;) {
+ tb = *ptb1;
+ if (!tb)
+ goto not_found;
+ if (tb->pc == pc &&
+ tb->page_addr[0] == phys_page1 &&
+ tb->cs_base == cs_base &&
+ tb->flags == flags) {
+ /* check next page if needed */
+ if (tb->page_addr[1] != -1) {
+ virt_page2 = (pc & TARGET_PAGE_MASK) +
+ TARGET_PAGE_SIZE;
+ phys_page2 = get_page_addr_code(env, virt_page2);
+ if (tb->page_addr[1] == phys_page2)
+ goto found;
+ } else {
+ goto found;
+ }
+ }
+ ptb1 = &tb->phys_hash_next;
+ }
+ not_found:
+ /* if no translated code available, then translate it now */
+ tb = tb_gen_code(env, pc, cs_base, flags, 0);
+
+ found:
+ /* Move the last found TB to the head of the list */
+ if (likely(*ptb1)) {
+ *ptb1 = tb->phys_hash_next;
+ tb->phys_hash_next = tb_phys_hash[h];
+ tb_phys_hash[h] = tb;
+ }
+ /* we add the TB in the virtual pc hash table */
+ env->tb_jmp_cache[tb_jmp_cache_hash_func(pc)] = tb;
+ return tb;
+}
+
+static inline TranslationBlock *tb_find_fast(CPUState *env)
+{
+ TranslationBlock *tb;
+ target_ulong cs_base, pc;
+ int flags;
+
+ /* we record a subset of the CPU state. It will
+ always be the same before a given translated block
+ is executed. */
+ cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
+ tb = env->tb_jmp_cache[tb_jmp_cache_hash_func(pc)];
+ if (unlikely(!tb || tb->pc != pc || tb->cs_base != cs_base ||
+ tb->flags != flags)) {
+ tb = tb_find_slow(env, pc, cs_base, flags);
+ }
+ return tb;
+}
+
+static CPUDebugExcpHandler *debug_excp_handler;
+
+CPUDebugExcpHandler *cpu_set_debug_excp_handler(CPUDebugExcpHandler *handler)
+{
+ CPUDebugExcpHandler *old_handler = debug_excp_handler;
+
+ debug_excp_handler = handler;
+ return old_handler;
+}
+
+static void cpu_handle_debug_exception(CPUState *env)
+{
+ CPUWatchpoint *wp;
+
+ if (!env->watchpoint_hit) {
+ QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
+ wp->flags &= ~BP_WATCHPOINT_HIT;
+ }
+ }
+ if (debug_excp_handler) {
+ debug_excp_handler(env);
+ }
+}
+
+/* main execution loop */
+
+volatile sig_atomic_t exit_request;
+
+int cpu_exec(CPUState *env)
+{
+ int ret, interrupt_request;
+ TranslationBlock *tb;
+ uint8_t *tc_ptr;
+ unsigned long next_tb;
+
+ if (env->halted) {
+ if (!cpu_has_work(env)) {
+ return EXCP_HALTED;
+ }
+
+ env->halted = 0;
+ }
+
+ cpu_single_env = env;
+
+ if (unlikely(exit_request)) {
+ env->exit_request = 1;
+ }
+
+#if defined(TARGET_I386)
+ /* put eflags in CPU temporary format */
+ CC_SRC = env->eflags & (CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
+ DF = 1 - (2 * ((env->eflags >> 10) & 1));
+ CC_OP = CC_OP_EFLAGS;
+ env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
+#elif defined(TARGET_SPARC)
+#elif defined(TARGET_M68K)
+ env->cc_op = CC_OP_FLAGS;
+ env->cc_dest = env->sr & 0xf;
+ env->cc_x = (env->sr >> 4) & 1;
+#elif defined(TARGET_ALPHA)
+#elif defined(TARGET_ARM)
+#elif defined(TARGET_UNICORE32)
+#elif defined(TARGET_PPC)
+#elif defined(TARGET_LM32)
+#elif defined(TARGET_MICROBLAZE)
+#elif defined(TARGET_MIPS)
+#elif defined(TARGET_SH4)
+#elif defined(TARGET_CRIS)
+#elif defined(TARGET_S390X)
+ /* XXXXX */
+#else
+#error unsupported target CPU
+#endif
+ env->exception_index = -1;
+
+ /* prepare setjmp context for exception handling */
+ for(;;) {
+ if (setjmp(env->jmp_env) == 0) {
+ /* if an exception is pending, we execute it here */
+ if (env->exception_index >= 0) {
+ if (env->exception_index >= EXCP_INTERRUPT) {
+ /* exit request from the cpu execution loop */
+ ret = env->exception_index;
+ if (ret == EXCP_DEBUG) {
+ cpu_handle_debug_exception(env);
+ }
+ break;
+ } else {
+#if defined(CONFIG_USER_ONLY)
+ /* if user mode only, we simulate a fake exception
+ which will be handled outside the cpu execution
+ loop */
+#if defined(TARGET_I386)
+ do_interrupt(env);
+#endif
+ ret = env->exception_index;
+ break;
+#else
+ do_interrupt(env);
+ env->exception_index = -1;
+#endif
+ }
+ }
+
+ next_tb = 0; /* force lookup of first TB */
+ for(;;) {
+ interrupt_request = env->interrupt_request;
+ if (unlikely(interrupt_request)) {
+ if (unlikely(env->singlestep_enabled & SSTEP_NOIRQ)) {
+ /* Mask out external interrupts for this step. */
+ interrupt_request &= ~CPU_INTERRUPT_SSTEP_MASK;
+ }
+ if (interrupt_request & CPU_INTERRUPT_DEBUG) {
+ env->interrupt_request &= ~CPU_INTERRUPT_DEBUG;
+ env->exception_index = EXCP_DEBUG;
+ cpu_loop_exit(env);
+ }
+#if defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_MIPS) || \
+ defined(TARGET_PPC) || defined(TARGET_ALPHA) || defined(TARGET_CRIS) || \
+ defined(TARGET_MICROBLAZE) || defined(TARGET_LM32) || defined(TARGET_UNICORE32)
+ if (interrupt_request & CPU_INTERRUPT_HALT) {
+ env->interrupt_request &= ~CPU_INTERRUPT_HALT;
+ env->halted = 1;
+ env->exception_index = EXCP_HLT;
+ cpu_loop_exit(env);
+ }
+#endif
+#if defined(TARGET_I386)
+ if (interrupt_request & CPU_INTERRUPT_INIT) {
+ svm_check_intercept(env, SVM_EXIT_INIT);
+ do_cpu_init(env);
+ env->exception_index = EXCP_HALTED;
+ cpu_loop_exit(env);
+ } else if (interrupt_request & CPU_INTERRUPT_SIPI) {
+ do_cpu_sipi(env);
+ } else if (env->hflags2 & HF2_GIF_MASK) {
+ if ((interrupt_request & CPU_INTERRUPT_SMI) &&
+ !(env->hflags & HF_SMM_MASK)) {
+ svm_check_intercept(env, SVM_EXIT_SMI);
+ env->interrupt_request &= ~CPU_INTERRUPT_SMI;
+ do_smm_enter(env);
+ next_tb = 0;
+ } else if ((interrupt_request & CPU_INTERRUPT_NMI) &&
+ !(env->hflags2 & HF2_NMI_MASK)) {
+ env->interrupt_request &= ~CPU_INTERRUPT_NMI;
+ env->hflags2 |= HF2_NMI_MASK;
+ do_interrupt_x86_hardirq(env, EXCP02_NMI, 1);
+ next_tb = 0;
+ } else if (interrupt_request & CPU_INTERRUPT_MCE) {
+ env->interrupt_request &= ~CPU_INTERRUPT_MCE;
+ do_interrupt_x86_hardirq(env, EXCP12_MCHK, 0);
+ next_tb = 0;
+ } else if ((interrupt_request & CPU_INTERRUPT_HARD) &&
+ (((env->hflags2 & HF2_VINTR_MASK) &&
+ (env->hflags2 & HF2_HIF_MASK)) ||
+ (!(env->hflags2 & HF2_VINTR_MASK) &&
+ (env->eflags & IF_MASK &&
+ !(env->hflags & HF_INHIBIT_IRQ_MASK))))) {
+ int intno;
+ svm_check_intercept(env, SVM_EXIT_INTR);
+ env->interrupt_request &= ~(CPU_INTERRUPT_HARD | CPU_INTERRUPT_VIRQ);
+ intno = cpu_get_pic_interrupt(env);
+ qemu_log_mask(CPU_LOG_TB_IN_ASM, "Servicing hardware INT=0x%02x\n", intno);
+ do_interrupt_x86_hardirq(env, intno, 1);
+ /* ensure that no TB jump will be modified as
+ the program flow was changed */
+ next_tb = 0;
+#if !defined(CONFIG_USER_ONLY)
+ } else if ((interrupt_request & CPU_INTERRUPT_VIRQ) &&
+ (env->eflags & IF_MASK) &&
+ !(env->hflags & HF_INHIBIT_IRQ_MASK)) {
+ int intno;
+ /* FIXME: this should respect TPR */
+ svm_check_intercept(env, SVM_EXIT_VINTR);
+ intno = ldl_phys(env->vm_vmcb + offsetof(struct vmcb, control.int_vector));
+ qemu_log_mask(CPU_LOG_TB_IN_ASM, "Servicing virtual hardware INT=0x%02x\n", intno);
+ do_interrupt_x86_hardirq(env, intno, 1);
+ env->interrupt_request &= ~CPU_INTERRUPT_VIRQ;
+ next_tb = 0;
+#endif
+ }
+ }
+#elif defined(TARGET_PPC)
+#if 0
+ if ((interrupt_request & CPU_INTERRUPT_RESET)) {
+ cpu_reset(env);
+ }
+#endif
+ if (interrupt_request & CPU_INTERRUPT_HARD) {
+ ppc_hw_interrupt(env);
+ if (env->pending_interrupts == 0)
+ env->interrupt_request &= ~CPU_INTERRUPT_HARD;
+ next_tb = 0;
+ }
+#elif defined(TARGET_LM32)
+ if ((interrupt_request & CPU_INTERRUPT_HARD)
+ && (env->ie & IE_IE)) {
+ env->exception_index = EXCP_IRQ;
+ do_interrupt(env);
+ next_tb = 0;
+ }
+#elif defined(TARGET_MICROBLAZE)
+ if ((interrupt_request & CPU_INTERRUPT_HARD)
+ && (env->sregs[SR_MSR] & MSR_IE)
+ && !(env->sregs[SR_MSR] & (MSR_EIP | MSR_BIP))
+ && !(env->iflags & (D_FLAG | IMM_FLAG))) {
+ env->exception_index = EXCP_IRQ;
+ do_interrupt(env);
+ next_tb = 0;
+ }
+#elif defined(TARGET_MIPS)
+ if ((interrupt_request & CPU_INTERRUPT_HARD) &&
+ cpu_mips_hw_interrupts_pending(env)) {
+ /* Raise it */
+ env->exception_index = EXCP_EXT_INTERRUPT;
+ env->error_code = 0;
+ do_interrupt(env);
+ next_tb = 0;
+ }
+#elif defined(TARGET_SPARC)
+ if (interrupt_request & CPU_INTERRUPT_HARD) {
+ if (cpu_interrupts_enabled(env) &&
+ env->interrupt_index > 0) {
+ int pil = env->interrupt_index & 0xf;
+ int type = env->interrupt_index & 0xf0;
+
+ if (((type == TT_EXTINT) &&
+ cpu_pil_allowed(env, pil)) ||
+ type != TT_EXTINT) {
+ env->exception_index = env->interrupt_index;
+ do_interrupt(env);
+ next_tb = 0;
+ }
+ }
+ }
+#elif defined(TARGET_ARM)
+ if (interrupt_request & CPU_INTERRUPT_FIQ
+ && !(env->uncached_cpsr & CPSR_F)) {
+ env->exception_index = EXCP_FIQ;
+ do_interrupt(env);
+ next_tb = 0;
+ }
+ /* ARMv7-M interrupt return works by loading a magic value
+ into the PC. On real hardware the load causes the
+ return to occur. The qemu implementation performs the
+ jump normally, then does the exception return when the
+ CPU tries to execute code at the magic address.
+ This will cause the magic PC value to be pushed to
+ the stack if an interrupt occurred at the wrong time.
+ We avoid this by disabling interrupts when
+ pc contains a magic address. */
+ if (interrupt_request & CPU_INTERRUPT_HARD
+ && ((IS_M(env) && env->regs[15] < 0xfffffff0)
+ || !(env->uncached_cpsr & CPSR_I))) {
+ env->exception_index = EXCP_IRQ;
+ do_interrupt(env);
+ next_tb = 0;
+ }
+#elif defined(TARGET_UNICORE32)
+ if (interrupt_request & CPU_INTERRUPT_HARD
+ && !(env->uncached_asr & ASR_I)) {
+ do_interrupt(env);
+ next_tb = 0;
+ }
+#elif defined(TARGET_SH4)
+ if (interrupt_request & CPU_INTERRUPT_HARD) {
+ do_interrupt(env);
+ next_tb = 0;
+ }
+#elif defined(TARGET_ALPHA)
+ {
+ int idx = -1;
+ /* ??? This hard-codes the OSF/1 interrupt levels. */
+ switch (env->pal_mode ? 7 : env->ps & PS_INT_MASK) {
+ case 0 ... 3:
+ if (interrupt_request & CPU_INTERRUPT_HARD) {
+ idx = EXCP_DEV_INTERRUPT;
+ }
+ /* FALLTHRU */
+ case 4:
+ if (interrupt_request & CPU_INTERRUPT_TIMER) {
+ idx = EXCP_CLK_INTERRUPT;
+ }
+ /* FALLTHRU */
+ case 5:
+ if (interrupt_request & CPU_INTERRUPT_SMP) {
+ idx = EXCP_SMP_INTERRUPT;
+ }
+ /* FALLTHRU */
+ case 6:
+ if (interrupt_request & CPU_INTERRUPT_MCHK) {
+ idx = EXCP_MCHK;
+ }
+ }
+ if (idx >= 0) {
+ env->exception_index = idx;
+ env->error_code = 0;
+ do_interrupt(env);
+ next_tb = 0;
+ }
+ }
+#elif defined(TARGET_CRIS)
+ if (interrupt_request & CPU_INTERRUPT_HARD
+ && (env->pregs[PR_CCS] & I_FLAG)
+ && !env->locked_irq) {
+ env->exception_index = EXCP_IRQ;
+ do_interrupt(env);
+ next_tb = 0;
+ }
+ if (interrupt_request & CPU_INTERRUPT_NMI
+ && (env->pregs[PR_CCS] & M_FLAG)) {
+ env->exception_index = EXCP_NMI;
+ do_interrupt(env);
+ next_tb = 0;
+ }
+#elif defined(TARGET_M68K)
+ if (interrupt_request & CPU_INTERRUPT_HARD
+ && ((env->sr & SR_I) >> SR_I_SHIFT)
+ < env->pending_level) {
+ /* Real hardware gets the interrupt vector via an
+ IACK cycle at this point. Current emulated
+ hardware doesn't rely on this, so we
+ provide/save the vector when the interrupt is
+ first signalled. */
+ env->exception_index = env->pending_vector;
+ do_interrupt_m68k_hardirq(env);
+ next_tb = 0;
+ }
+#elif defined(TARGET_S390X) && !defined(CONFIG_USER_ONLY)
+ if ((interrupt_request & CPU_INTERRUPT_HARD) &&
+ (env->psw.mask & PSW_MASK_EXT)) {
+ do_interrupt(env);
+ next_tb = 0;
+ }
+#endif
+ /* Don't use the cached interrupt_request value,
+ do_interrupt may have updated the EXITTB flag. */
+ if (env->interrupt_request & CPU_INTERRUPT_EXITTB) {
+ env->interrupt_request &= ~CPU_INTERRUPT_EXITTB;
+ /* ensure that no TB jump will be modified as
+ the program flow was changed */
+ next_tb = 0;
+ }
+ }
+ if (unlikely(env->exit_request)) {
+ env->exit_request = 0;
+ env->exception_index = EXCP_INTERRUPT;
+ cpu_loop_exit(env);
+ }
+#if defined(DEBUG_DISAS) || defined(CONFIG_DEBUG_EXEC)
+ if (qemu_loglevel_mask(CPU_LOG_TB_CPU)) {
+ /* restore flags in standard format */
+#if defined(TARGET_I386)
+ env->eflags = env->eflags | cpu_cc_compute_all(env, CC_OP)
+ | (DF & DF_MASK);
+ log_cpu_state(env, X86_DUMP_CCOP);
+ env->eflags &= ~(DF_MASK | CC_O | CC_S | CC_Z | CC_A | CC_P | CC_C);
+#elif defined(TARGET_M68K)
+ cpu_m68k_flush_flags(env, env->cc_op);
+ env->cc_op = CC_OP_FLAGS;
+ env->sr = (env->sr & 0xffe0)
+ | env->cc_dest | (env->cc_x << 4);
+ log_cpu_state(env, 0);
+#else
+ log_cpu_state(env, 0);
+#endif
+ }
+#endif /* DEBUG_DISAS || CONFIG_DEBUG_EXEC */
+ spin_lock(&tb_lock);
+ tb = tb_find_fast(env);
+ /* Note: we do it here to avoid a gcc bug on Mac OS X when
+ doing it in tb_find_slow */
+ if (tb_invalidated_flag) {
+ /* as some TB could have been invalidated because
+ of memory exceptions while generating the code, we
+ must recompute the hash index here */
+ next_tb = 0;
+ tb_invalidated_flag = 0;
+ }
+#ifdef CONFIG_DEBUG_EXEC
+ qemu_log_mask(CPU_LOG_EXEC, "Trace 0x%08lx [" TARGET_FMT_lx "] %s\n",
+ (long)tb->tc_ptr, tb->pc,
+ lookup_symbol(tb->pc));
+#endif
+ /* see if we can patch the calling TB. When the TB
+ spans two pages, we cannot safely do a direct
+ jump. */
+ if (next_tb != 0 && tb->page_addr[1] == -1) {
+ tb_add_jump((TranslationBlock *)(next_tb & ~3), next_tb & 3, tb);
+ }
+ spin_unlock(&tb_lock);
+
+ /* cpu_interrupt might be called while translating the
+ TB, but before it is linked into a potentially
+ infinite loop and becomes env->current_tb. Avoid
+ starting execution if there is a pending interrupt. */
+ env->current_tb = tb;
+ barrier();
+ if (likely(!env->exit_request)) {
+ tc_ptr = tb->tc_ptr;
+ /* execute the generated code */
+ next_tb = tcg_qemu_tb_exec(env, tc_ptr);
+ if ((next_tb & 3) == 2) {
+ /* Instruction counter expired. */
+ int insns_left;
+ tb = (TranslationBlock *)(long)(next_tb & ~3);
+ /* Restore PC. */
+ cpu_pc_from_tb(env, tb);
+ insns_left = env->icount_decr.u32;
+ if (env->icount_extra && insns_left >= 0) {
+ /* Refill decrementer and continue execution. */
+ env->icount_extra += insns_left;
+ if (env->icount_extra > 0xffff) {
+ insns_left = 0xffff;
+ } else {
+ insns_left = env->icount_extra;
+ }
+ env->icount_extra -= insns_left;
+ env->icount_decr.u16.low = insns_left;
+ } else {
+ if (insns_left > 0) {
+ /* Execute remaining instructions. */
+ cpu_exec_nocache(env, insns_left, tb);
+ }
+ env->exception_index = EXCP_INTERRUPT;
+ next_tb = 0;
+ cpu_loop_exit(env);
+ }
+ }
+ }
+ env->current_tb = NULL;
+ /* reset soft MMU for next block (it can currently
+ only be set by a memory fault) */
+ } /* for(;;) */
+ } else {
+ /* Reload env after longjmp - the compiler may have smashed all
+ * local variables as longjmp is marked 'noreturn'. */
+ env = cpu_single_env;
+ }
+ } /* for(;;) */
+
+
+#if defined(TARGET_I386)
+ /* restore flags in standard format */
+ env->eflags = env->eflags | cpu_cc_compute_all(env, CC_OP)
+ | (DF & DF_MASK);
+#elif defined(TARGET_ARM)
+ /* XXX: Save/restore host fpu exception state?. */
+#elif defined(TARGET_UNICORE32)
+#elif defined(TARGET_SPARC)
+#elif defined(TARGET_PPC)
+#elif defined(TARGET_LM32)
+#elif defined(TARGET_M68K)
+ cpu_m68k_flush_flags(env, env->cc_op);
+ env->cc_op = CC_OP_FLAGS;
+ env->sr = (env->sr & 0xffe0)
+ | env->cc_dest | (env->cc_x << 4);
+#elif defined(TARGET_MICROBLAZE)
+#elif defined(TARGET_MIPS)
+#elif defined(TARGET_SH4)
+#elif defined(TARGET_ALPHA)
+#elif defined(TARGET_CRIS)
+#elif defined(TARGET_S390X)
+ /* XXXXX */
+#else
+#error unsupported target CPU
+#endif
+
+ /* fail safe : never use cpu_single_env outside cpu_exec() */
+ cpu_single_env = NULL;
+ return ret;
+}
diff --git a/qemu-0.15.x/cpus.c b/qemu-0.15.x/cpus.c
new file mode 100644
index 0000000..6bf4e3f
--- /dev/null
+++ b/qemu-0.15.x/cpus.c
@@ -0,0 +1,1178 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * 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.
+ */
+
+/* Needed early for CONFIG_BSD etc. */
+#include "config-host.h"
+
+#include "monitor.h"
+#include "sysemu.h"
+#include "gdbstub.h"
+#include "dma.h"
+#include "kvm.h"
+
+#include "qemu-thread.h"
+#include "cpus.h"
+
+#ifndef _WIN32
+#include "compatfd.h"
+#endif
+
+#ifdef SIGRTMIN
+#define SIG_IPI (SIGRTMIN+4)
+#else
+#define SIG_IPI SIGUSR1
+#endif
+
+#ifdef CONFIG_LINUX
+
+#include <sys/prctl.h>
+
+#ifndef PR_MCE_KILL
+#define PR_MCE_KILL 33
+#endif
+
+#ifndef PR_MCE_KILL_SET
+#define PR_MCE_KILL_SET 1
+#endif
+
+#ifndef PR_MCE_KILL_EARLY
+#define PR_MCE_KILL_EARLY 1
+#endif
+
+#endif /* CONFIG_LINUX */
+
+static CPUState *next_cpu;
+
+/***********************************************************/
+void hw_error(const char *fmt, ...)
+{
+ va_list ap;
+ CPUState *env;
+
+ va_start(ap, fmt);
+ fprintf(stderr, "qemu: hardware error: ");
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, "\n");
+ for(env = first_cpu; env != NULL; env = env->next_cpu) {
+ fprintf(stderr, "CPU #%d:\n", env->cpu_index);
+#ifdef TARGET_I386
+ cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU);
+#else
+ cpu_dump_state(env, stderr, fprintf, 0);
+#endif
+ }
+ va_end(ap);
+ abort();
+}
+
+void cpu_synchronize_all_states(void)
+{
+ CPUState *cpu;
+
+ for (cpu = first_cpu; cpu; cpu = cpu->next_cpu) {
+ cpu_synchronize_state(cpu);
+ }
+}
+
+void cpu_synchronize_all_post_reset(void)
+{
+ CPUState *cpu;
+
+ for (cpu = first_cpu; cpu; cpu = cpu->next_cpu) {
+ cpu_synchronize_post_reset(cpu);
+ }
+}
+
+void cpu_synchronize_all_post_init(void)
+{
+ CPUState *cpu;
+
+ for (cpu = first_cpu; cpu; cpu = cpu->next_cpu) {
+ cpu_synchronize_post_init(cpu);
+ }
+}
+
+int cpu_is_stopped(CPUState *env)
+{
+ return !vm_running || env->stopped;
+}
+
+static void do_vm_stop(int reason)
+{
+ if (vm_running) {
+ cpu_disable_ticks();
+ vm_running = 0;
+ pause_all_vcpus();
+ vm_state_notify(0, reason);
+ qemu_aio_flush();
+ bdrv_flush_all();
+ monitor_protocol_event(QEVENT_STOP, NULL);
+ }
+}
+
+static int cpu_can_run(CPUState *env)
+{
+ if (env->stop) {
+ return 0;
+ }
+ if (env->stopped || !vm_running) {
+ return 0;
+ }
+ return 1;
+}
+
+static bool cpu_thread_is_idle(CPUState *env)
+{
+ if (env->stop || env->queued_work_first) {
+ return false;
+ }
+ if (env->stopped || !vm_running) {
+ return true;
+ }
+ if (!env->halted || qemu_cpu_has_work(env) ||
+ (kvm_enabled() && kvm_irqchip_in_kernel())) {
+ return false;
+ }
+ return true;
+}
+
+bool all_cpu_threads_idle(void)
+{
+ CPUState *env;
+
+ for (env = first_cpu; env != NULL; env = env->next_cpu) {
+ if (!cpu_thread_is_idle(env)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+static void cpu_handle_guest_debug(CPUState *env)
+{
+ gdb_set_stop_cpu(env);
+ qemu_system_debug_request();
+#ifdef CONFIG_IOTHREAD
+ env->stopped = 1;
+#endif
+}
+
+#ifdef CONFIG_IOTHREAD
+static void cpu_signal(int sig)
+{
+ if (cpu_single_env) {
+ cpu_exit(cpu_single_env);
+ }
+ exit_request = 1;
+}
+#endif
+
+#ifdef CONFIG_LINUX
+static void sigbus_reraise(void)
+{
+ sigset_t set;
+ struct sigaction action;
+
+ memset(&action, 0, sizeof(action));
+ action.sa_handler = SIG_DFL;
+ if (!sigaction(SIGBUS, &action, NULL)) {
+ raise(SIGBUS);
+ sigemptyset(&set);
+ sigaddset(&set, SIGBUS);
+ sigprocmask(SIG_UNBLOCK, &set, NULL);
+ }
+ perror("Failed to re-raise SIGBUS!\n");
+ abort();
+}
+
+static void sigbus_handler(int n, struct qemu_signalfd_siginfo *siginfo,
+ void *ctx)
+{
+ if (kvm_on_sigbus(siginfo->ssi_code,
+ (void *)(intptr_t)siginfo->ssi_addr)) {
+ sigbus_reraise();
+ }
+}
+
+static void qemu_init_sigbus(void)
+{
+ struct sigaction action;
+
+ memset(&action, 0, sizeof(action));
+ action.sa_flags = SA_SIGINFO;
+ action.sa_sigaction = (void (*)(int, siginfo_t*, void*))sigbus_handler;
+ sigaction(SIGBUS, &action, NULL);
+
+ prctl(PR_MCE_KILL, PR_MCE_KILL_SET, PR_MCE_KILL_EARLY, 0, 0);
+}
+
+static void qemu_kvm_eat_signals(CPUState *env)
+{
+ struct timespec ts = { 0, 0 };
+ siginfo_t siginfo;
+ sigset_t waitset;
+ sigset_t chkset;
+ int r;
+
+ sigemptyset(&waitset);
+ sigaddset(&waitset, SIG_IPI);
+ sigaddset(&waitset, SIGBUS);
+
+ do {
+ r = sigtimedwait(&waitset, &siginfo, &ts);
+ if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
+ perror("sigtimedwait");
+ exit(1);
+ }
+
+ switch (r) {
+ case SIGBUS:
+ if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
+ sigbus_reraise();
+ }
+ break;
+ default:
+ break;
+ }
+
+ r = sigpending(&chkset);
+ if (r == -1) {
+ perror("sigpending");
+ exit(1);
+ }
+ } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
+
+#ifndef CONFIG_IOTHREAD
+ if (sigismember(&chkset, SIGIO) || sigismember(&chkset, SIGALRM)) {
+ qemu_notify_event();
+ }
+#endif
+}
+
+#else /* !CONFIG_LINUX */
+
+static void qemu_init_sigbus(void)
+{
+}
+
+static void qemu_kvm_eat_signals(CPUState *env)
+{
+}
+#endif /* !CONFIG_LINUX */
+
+#ifndef _WIN32
+static int io_thread_fd = -1;
+
+static void qemu_event_increment(void)
+{
+ /* Write 8 bytes to be compatible with eventfd. */
+ static const uint64_t val = 1;
+ ssize_t ret;
+
+ if (io_thread_fd == -1) {
+ return;
+ }
+ do {
+ ret = write(io_thread_fd, &val, sizeof(val));
+ } while (ret < 0 && errno == EINTR);
+
+ /* EAGAIN is fine, a read must be pending. */
+ if (ret < 0 && errno != EAGAIN) {
+ fprintf(stderr, "qemu_event_increment: write() failed: %s\n",
+ strerror(errno));
+ exit (1);
+ }
+}
+
+static void qemu_event_read(void *opaque)
+{
+ int fd = (intptr_t)opaque;
+ ssize_t len;
+ char buffer[512];
+
+ /* Drain the notify pipe. For eventfd, only 8 bytes will be read. */
+ do {
+ len = read(fd, buffer, sizeof(buffer));
+ } while ((len == -1 && errno == EINTR) || len == sizeof(buffer));
+}
+
+static int qemu_event_init(void)
+{
+ int err;
+ int fds[2];
+
+ err = qemu_eventfd(fds);
+ if (err == -1) {
+ return -errno;
+ }
+ err = fcntl_setfl(fds[0], O_NONBLOCK);
+ if (err < 0) {
+ goto fail;
+ }
+ err = fcntl_setfl(fds[1], O_NONBLOCK);
+ if (err < 0) {
+ goto fail;
+ }
+ qemu_set_fd_handler2(fds[0], NULL, qemu_event_read, NULL,
+ (void *)(intptr_t)fds[0]);
+
+ io_thread_fd = fds[1];
+ return 0;
+
+fail:
+ close(fds[0]);
+ close(fds[1]);
+ return err;
+}
+
+static void dummy_signal(int sig)
+{
+}
+
+/* If we have signalfd, we mask out the signals we want to handle and then
+ * use signalfd to listen for them. We rely on whatever the current signal
+ * handler is to dispatch the signals when we receive them.
+ */
+static void sigfd_handler(void *opaque)
+{
+ int fd = (intptr_t)opaque;
+ struct qemu_signalfd_siginfo info;
+ struct sigaction action;
+ ssize_t len;
+
+ while (1) {
+ do {
+ len = read(fd, &info, sizeof(info));
+ } while (len == -1 && errno == EINTR);
+
+ if (len == -1 && errno == EAGAIN) {
+ break;
+ }
+
+ if (len != sizeof(info)) {
+ printf("read from sigfd returned %zd: %m\n", len);
+ return;
+ }
+
+ sigaction(info.ssi_signo, NULL, &action);
+ if ((action.sa_flags & SA_SIGINFO) && action.sa_sigaction) {
+ action.sa_sigaction(info.ssi_signo,
+ (siginfo_t *)&info, NULL);
+ } else if (action.sa_handler) {
+ action.sa_handler(info.ssi_signo);
+ }
+ }
+}
+
+static int qemu_signal_init(void)
+{
+ int sigfd;
+ sigset_t set;
+
+#ifdef CONFIG_IOTHREAD
+ /* SIGUSR2 used by posix-aio-compat.c */
+ sigemptyset(&set);
+ sigaddset(&set, SIGUSR2);
+ pthread_sigmask(SIG_UNBLOCK, &set, NULL);
+
+ /*
+ * SIG_IPI must be blocked in the main thread and must not be caught
+ * by sigwait() in the signal thread. Otherwise, the cpu thread will
+ * not catch it reliably.
+ */
+ sigemptyset(&set);
+ sigaddset(&set, SIG_IPI);
+ pthread_sigmask(SIG_BLOCK, &set, NULL);
+
+ sigemptyset(&set);
+ sigaddset(&set, SIGIO);
+ sigaddset(&set, SIGALRM);
+ sigaddset(&set, SIGBUS);
+#else
+ sigemptyset(&set);
+ sigaddset(&set, SIGBUS);
+ if (kvm_enabled()) {
+ /*
+ * We need to process timer signals synchronously to avoid a race
+ * between exit_request check and KVM vcpu entry.
+ */
+ sigaddset(&set, SIGIO);
+ sigaddset(&set, SIGALRM);
+ }
+#endif
+ pthread_sigmask(SIG_BLOCK, &set, NULL);
+
+ sigfd = qemu_signalfd(&set);
+ if (sigfd == -1) {
+ fprintf(stderr, "failed to create signalfd\n");
+ return -errno;
+ }
+
+ fcntl_setfl(sigfd, O_NONBLOCK);
+
+ qemu_set_fd_handler2(sigfd, NULL, sigfd_handler, NULL,
+ (void *)(intptr_t)sigfd);
+
+ return 0;
+}
+
+static void qemu_kvm_init_cpu_signals(CPUState *env)
+{
+ int r;
+ sigset_t set;
+ struct sigaction sigact;
+
+ memset(&sigact, 0, sizeof(sigact));
+ sigact.sa_handler = dummy_signal;
+ sigaction(SIG_IPI, &sigact, NULL);
+
+#ifdef CONFIG_IOTHREAD
+ pthread_sigmask(SIG_BLOCK, NULL, &set);
+ sigdelset(&set, SIG_IPI);
+ sigdelset(&set, SIGBUS);
+ r = kvm_set_signal_mask(env, &set);
+ if (r) {
+ fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r));
+ exit(1);
+ }
+#else
+ sigemptyset(&set);
+ sigaddset(&set, SIG_IPI);
+ sigaddset(&set, SIGIO);
+ sigaddset(&set, SIGALRM);
+ pthread_sigmask(SIG_BLOCK, &set, NULL);
+
+ pthread_sigmask(SIG_BLOCK, NULL, &set);
+ sigdelset(&set, SIGIO);
+ sigdelset(&set, SIGALRM);
+#endif
+ sigdelset(&set, SIG_IPI);
+ sigdelset(&set, SIGBUS);
+ r = kvm_set_signal_mask(env, &set);
+ if (r) {
+ fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r));
+ exit(1);
+ }
+}
+
+static void qemu_tcg_init_cpu_signals(void)
+{
+#ifdef CONFIG_IOTHREAD
+ sigset_t set;
+ struct sigaction sigact;
+
+ memset(&sigact, 0, sizeof(sigact));
+ sigact.sa_handler = cpu_signal;
+ sigaction(SIG_IPI, &sigact, NULL);
+
+ sigemptyset(&set);
+ sigaddset(&set, SIG_IPI);
+ pthread_sigmask(SIG_UNBLOCK, &set, NULL);
+#endif
+}
+
+#else /* _WIN32 */
+
+HANDLE qemu_event_handle;
+
+static void dummy_event_handler(void *opaque)
+{
+}
+
+static int qemu_event_init(void)
+{
+ qemu_event_handle = CreateEvent(NULL, FALSE, FALSE, NULL);
+ if (!qemu_event_handle) {
+ fprintf(stderr, "Failed CreateEvent: %ld\n", GetLastError());
+ return -1;
+ }
+ qemu_add_wait_object(qemu_event_handle, dummy_event_handler, NULL);
+ return 0;
+}
+
+static void qemu_event_increment(void)
+{
+ if (!SetEvent(qemu_event_handle)) {
+ fprintf(stderr, "qemu_event_increment: SetEvent failed: %ld\n",
+ GetLastError());
+ exit (1);
+ }
+}
+
+static int qemu_signal_init(void)
+{
+ return 0;
+}
+
+static void qemu_kvm_init_cpu_signals(CPUState *env)
+{
+ abort();
+}
+
+static void qemu_tcg_init_cpu_signals(void)
+{
+}
+#endif /* _WIN32 */
+
+#ifndef CONFIG_IOTHREAD
+int qemu_init_main_loop(void)
+{
+ int ret;
+
+ ret = qemu_signal_init();
+ if (ret) {
+ return ret;
+ }
+
+ qemu_init_sigbus();
+
+ return qemu_event_init();
+}
+
+void qemu_main_loop_start(void)
+{
+}
+
+void qemu_init_vcpu(void *_env)
+{
+ CPUState *env = _env;
+ int r;
+
+ env->nr_cores = smp_cores;
+ env->nr_threads = smp_threads;
+
+ if (kvm_enabled()) {
+ r = kvm_init_vcpu(env);
+ if (r < 0) {
+ fprintf(stderr, "kvm_init_vcpu failed: %s\n", strerror(-r));
+ exit(1);
+ }
+ qemu_kvm_init_cpu_signals(env);
+ } else {
+ qemu_tcg_init_cpu_signals();
+ }
+}
+
+int qemu_cpu_is_self(void *env)
+{
+ return 1;
+}
+
+void run_on_cpu(CPUState *env, void (*func)(void *data), void *data)
+{
+ func(data);
+}
+
+void resume_all_vcpus(void)
+{
+}
+
+void pause_all_vcpus(void)
+{
+}
+
+void qemu_cpu_kick(void *env)
+{
+}
+
+void qemu_cpu_kick_self(void)
+{
+#ifndef _WIN32
+ assert(cpu_single_env);
+
+ raise(SIG_IPI);
+#else
+ abort();
+#endif
+}
+
+void qemu_notify_event(void)
+{
+ CPUState *env = cpu_single_env;
+
+ qemu_event_increment ();
+ if (env) {
+ cpu_exit(env);
+ }
+ if (next_cpu && env != next_cpu) {
+ cpu_exit(next_cpu);
+ }
+ exit_request = 1;
+}
+
+void qemu_mutex_lock_iothread(void) {}
+void qemu_mutex_unlock_iothread(void) {}
+
+void cpu_stop_current(void)
+{
+}
+
+void vm_stop(int reason)
+{
+ do_vm_stop(reason);
+}
+
+#else /* CONFIG_IOTHREAD */
+
+QemuMutex qemu_global_mutex;
+static QemuCond qemu_io_proceeded_cond;
+static bool iothread_requesting_mutex;
+
+static QemuThread io_thread;
+
+static QemuThread *tcg_cpu_thread;
+static QemuCond *tcg_halt_cond;
+
+static int qemu_system_ready;
+/* cpu creation */
+static QemuCond qemu_cpu_cond;
+/* system init */
+static QemuCond qemu_system_cond;
+static QemuCond qemu_pause_cond;
+static QemuCond qemu_work_cond;
+
+int qemu_init_main_loop(void)
+{
+ int ret;
+
+ qemu_init_sigbus();
+
+ ret = qemu_signal_init();
+ if (ret) {
+ return ret;
+ }
+
+ /* Note eventfd must be drained before signalfd handlers run */
+ ret = qemu_event_init();
+ if (ret) {
+ return ret;
+ }
+
+ qemu_cond_init(&qemu_cpu_cond);
+ qemu_cond_init(&qemu_system_cond);
+ qemu_cond_init(&qemu_pause_cond);
+ qemu_cond_init(&qemu_work_cond);
+ qemu_cond_init(&qemu_io_proceeded_cond);
+ qemu_mutex_init(&qemu_global_mutex);
+ qemu_mutex_lock(&qemu_global_mutex);
+
+ qemu_thread_get_self(&io_thread);
+
+ return 0;
+}
+
+void qemu_main_loop_start(void)
+{
+ qemu_system_ready = 1;
+ qemu_cond_broadcast(&qemu_system_cond);
+}
+
+void run_on_cpu(CPUState *env, void (*func)(void *data), void *data)
+{
+ struct qemu_work_item wi;
+
+ if (qemu_cpu_is_self(env)) {
+ func(data);
+ return;
+ }
+
+ wi.func = func;
+ wi.data = data;
+ if (!env->queued_work_first) {
+ env->queued_work_first = &wi;
+ } else {
+ env->queued_work_last->next = &wi;
+ }
+ env->queued_work_last = &wi;
+ wi.next = NULL;
+ wi.done = false;
+
+ qemu_cpu_kick(env);
+ while (!wi.done) {
+ CPUState *self_env = cpu_single_env;
+
+ qemu_cond_wait(&qemu_work_cond, &qemu_global_mutex);
+ cpu_single_env = self_env;
+ }
+}
+
+static void flush_queued_work(CPUState *env)
+{
+ struct qemu_work_item *wi;
+
+ if (!env->queued_work_first) {
+ return;
+ }
+
+ while ((wi = env->queued_work_first)) {
+ env->queued_work_first = wi->next;
+ wi->func(wi->data);
+ wi->done = true;
+ }
+ env->queued_work_last = NULL;
+ qemu_cond_broadcast(&qemu_work_cond);
+}
+
+static void qemu_wait_io_event_common(CPUState *env)
+{
+ if (env->stop) {
+ env->stop = 0;
+ env->stopped = 1;
+ qemu_cond_signal(&qemu_pause_cond);
+ }
+ flush_queued_work(env);
+ env->thread_kicked = false;
+}
+
+static void qemu_tcg_wait_io_event(void)
+{
+ CPUState *env;
+
+ while (all_cpu_threads_idle()) {
+ /* Start accounting real time to the virtual clock if the CPUs
+ are idle. */
+ qemu_clock_warp(vm_clock);
+ qemu_cond_wait(tcg_halt_cond, &qemu_global_mutex);
+ }
+
+ while (iothread_requesting_mutex) {
+ qemu_cond_wait(&qemu_io_proceeded_cond, &qemu_global_mutex);
+ }
+
+ for (env = first_cpu; env != NULL; env = env->next_cpu) {
+ qemu_wait_io_event_common(env);
+ }
+}
+
+static void qemu_kvm_wait_io_event(CPUState *env)
+{
+ while (cpu_thread_is_idle(env)) {
+ qemu_cond_wait(env->halt_cond, &qemu_global_mutex);
+ }
+
+ qemu_kvm_eat_signals(env);
+ qemu_wait_io_event_common(env);
+}
+
+static void *qemu_kvm_cpu_thread_fn(void *arg)
+{
+ CPUState *env = arg;
+ int r;
+
+ qemu_mutex_lock(&qemu_global_mutex);
+ qemu_thread_get_self(env->thread);
+ env->thread_id = qemu_get_thread_id();
+
+ r = kvm_init_vcpu(env);
+ if (r < 0) {
+ fprintf(stderr, "kvm_init_vcpu failed: %s\n", strerror(-r));
+ exit(1);
+ }
+
+ qemu_kvm_init_cpu_signals(env);
+
+ /* signal CPU creation */
+ env->created = 1;
+ qemu_cond_signal(&qemu_cpu_cond);
+
+ /* and wait for machine initialization */
+ while (!qemu_system_ready) {
+ qemu_cond_wait(&qemu_system_cond, &qemu_global_mutex);
+ }
+
+ while (1) {
+ if (cpu_can_run(env)) {
+ r = kvm_cpu_exec(env);
+ if (r == EXCP_DEBUG) {
+ cpu_handle_guest_debug(env);
+ }
+ }
+ qemu_kvm_wait_io_event(env);
+ }
+
+ return NULL;
+}
+
+static void *qemu_tcg_cpu_thread_fn(void *arg)
+{
+ CPUState *env = arg;
+
+ qemu_tcg_init_cpu_signals();
+ qemu_thread_get_self(env->thread);
+
+ /* signal CPU creation */
+ qemu_mutex_lock(&qemu_global_mutex);
+ for (env = first_cpu; env != NULL; env = env->next_cpu) {
+ env->thread_id = qemu_get_thread_id();
+ env->created = 1;
+ }
+ qemu_cond_signal(&qemu_cpu_cond);
+
+ /* and wait for machine initialization */
+ while (!qemu_system_ready) {
+ qemu_cond_wait(&qemu_system_cond, &qemu_global_mutex);
+ }
+
+ while (1) {
+ cpu_exec_all();
+ if (use_icount && qemu_next_icount_deadline() <= 0) {
+ qemu_notify_event();
+ }
+ qemu_tcg_wait_io_event();
+ }
+
+ return NULL;
+}
+
+static void qemu_cpu_kick_thread(CPUState *env)
+{
+#ifndef _WIN32
+ int err;
+
+ err = pthread_kill(env->thread->thread, SIG_IPI);
+ if (err) {
+ fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
+ exit(1);
+ }
+#else /* _WIN32 */
+ if (!qemu_cpu_is_self(env)) {
+ SuspendThread(env->thread->thread);
+ cpu_signal(0);
+ ResumeThread(env->thread->thread);
+ }
+#endif
+}
+
+void qemu_cpu_kick(void *_env)
+{
+ CPUState *env = _env;
+
+ qemu_cond_broadcast(env->halt_cond);
+ if (!env->thread_kicked) {
+ qemu_cpu_kick_thread(env);
+ env->thread_kicked = true;
+ }
+}
+
+void qemu_cpu_kick_self(void)
+{
+#ifndef _WIN32
+ assert(cpu_single_env);
+
+ if (!cpu_single_env->thread_kicked) {
+ qemu_cpu_kick_thread(cpu_single_env);
+ cpu_single_env->thread_kicked = true;
+ }
+#else
+ abort();
+#endif
+}
+
+int qemu_cpu_is_self(void *_env)
+{
+ CPUState *env = _env;
+
+ return qemu_thread_is_self(env->thread);
+}
+
+void qemu_mutex_lock_iothread(void)
+{
+ if (kvm_enabled()) {
+ qemu_mutex_lock(&qemu_global_mutex);
+ } else {
+ iothread_requesting_mutex = true;
+ if (qemu_mutex_trylock(&qemu_global_mutex)) {
+ qemu_cpu_kick_thread(first_cpu);
+ qemu_mutex_lock(&qemu_global_mutex);
+ }
+ iothread_requesting_mutex = false;
+ qemu_cond_broadcast(&qemu_io_proceeded_cond);
+ }
+}
+
+void qemu_mutex_unlock_iothread(void)
+{
+ qemu_mutex_unlock(&qemu_global_mutex);
+}
+
+static int all_vcpus_paused(void)
+{
+ CPUState *penv = first_cpu;
+
+ while (penv) {
+ if (!penv->stopped) {
+ return 0;
+ }
+ penv = (CPUState *)penv->next_cpu;
+ }
+
+ return 1;
+}
+
+void pause_all_vcpus(void)
+{
+ CPUState *penv = first_cpu;
+
+ while (penv) {
+ penv->stop = 1;
+ qemu_cpu_kick(penv);
+ penv = (CPUState *)penv->next_cpu;
+ }
+
+ while (!all_vcpus_paused()) {
+ qemu_cond_wait(&qemu_pause_cond, &qemu_global_mutex);
+ penv = first_cpu;
+ while (penv) {
+ qemu_cpu_kick(penv);
+ penv = (CPUState *)penv->next_cpu;
+ }
+ }
+}
+
+void resume_all_vcpus(void)
+{
+ CPUState *penv = first_cpu;
+
+ while (penv) {
+ penv->stop = 0;
+ penv->stopped = 0;
+ qemu_cpu_kick(penv);
+ penv = (CPUState *)penv->next_cpu;
+ }
+}
+
+static void qemu_tcg_init_vcpu(void *_env)
+{
+ CPUState *env = _env;
+
+ /* share a single thread for all cpus with TCG */
+ if (!tcg_cpu_thread) {
+ env->thread = qemu_mallocz(sizeof(QemuThread));
+ env->halt_cond = qemu_mallocz(sizeof(QemuCond));
+ qemu_cond_init(env->halt_cond);
+ qemu_thread_create(env->thread, qemu_tcg_cpu_thread_fn, env);
+ while (env->created == 0) {
+ qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
+ }
+ tcg_cpu_thread = env->thread;
+ tcg_halt_cond = env->halt_cond;
+ } else {
+ env->thread = tcg_cpu_thread;
+ env->halt_cond = tcg_halt_cond;
+ }
+}
+
+static void qemu_kvm_start_vcpu(CPUState *env)
+{
+ env->thread = qemu_mallocz(sizeof(QemuThread));
+ env->halt_cond = qemu_mallocz(sizeof(QemuCond));
+ qemu_cond_init(env->halt_cond);
+ qemu_thread_create(env->thread, qemu_kvm_cpu_thread_fn, env);
+ while (env->created == 0) {
+ qemu_cond_wait(&qemu_cpu_cond, &qemu_global_mutex);
+ }
+}
+
+void qemu_init_vcpu(void *_env)
+{
+ CPUState *env = _env;
+
+ env->nr_cores = smp_cores;
+ env->nr_threads = smp_threads;
+ if (kvm_enabled()) {
+ qemu_kvm_start_vcpu(env);
+ } else {
+ qemu_tcg_init_vcpu(env);
+ }
+}
+
+void qemu_notify_event(void)
+{
+ qemu_event_increment();
+}
+
+void cpu_stop_current(void)
+{
+ if (cpu_single_env) {
+ cpu_single_env->stop = 0;
+ cpu_single_env->stopped = 1;
+ cpu_exit(cpu_single_env);
+ qemu_cond_signal(&qemu_pause_cond);
+ }
+}
+
+void vm_stop(int reason)
+{
+ if (!qemu_thread_is_self(&io_thread)) {
+ qemu_system_vmstop_request(reason);
+ /*
+ * FIXME: should not return to device code in case
+ * vm_stop() has been requested.
+ */
+ cpu_stop_current();
+ return;
+ }
+ do_vm_stop(reason);
+}
+
+#endif
+
+static int tcg_cpu_exec(CPUState *env)
+{
+ int ret;
+#ifdef CONFIG_PROFILER
+ int64_t ti;
+#endif
+
+#ifdef CONFIG_PROFILER
+ ti = profile_getclock();
+#endif
+ if (use_icount) {
+ int64_t count;
+ int decr;
+ qemu_icount -= (env->icount_decr.u16.low + env->icount_extra);
+ env->icount_decr.u16.low = 0;
+ env->icount_extra = 0;
+ count = qemu_icount_round(qemu_next_icount_deadline());
+ qemu_icount += count;
+ decr = (count > 0xffff) ? 0xffff : count;
+ count -= decr;
+ env->icount_decr.u16.low = decr;
+ env->icount_extra = count;
+ }
+ ret = cpu_exec(env);
+#ifdef CONFIG_PROFILER
+ qemu_time += profile_getclock() - ti;
+#endif
+ if (use_icount) {
+ /* Fold pending instructions back into the
+ instruction counter, and clear the interrupt flag. */
+ qemu_icount -= (env->icount_decr.u16.low
+ + env->icount_extra);
+ env->icount_decr.u32 = 0;
+ env->icount_extra = 0;
+ }
+ return ret;
+}
+
+bool cpu_exec_all(void)
+{
+ int r;
+
+ /* Account partial waits to the vm_clock. */
+ qemu_clock_warp(vm_clock);
+
+ if (next_cpu == NULL) {
+ next_cpu = first_cpu;
+ }
+ for (; next_cpu != NULL && !exit_request; next_cpu = next_cpu->next_cpu) {
+ CPUState *env = next_cpu;
+
+ qemu_clock_enable(vm_clock,
+ (env->singlestep_enabled & SSTEP_NOTIMER) == 0);
+
+#ifndef CONFIG_IOTHREAD
+ if (qemu_alarm_pending()) {
+ break;
+ }
+#endif
+ if (cpu_can_run(env)) {
+ if (kvm_enabled()) {
+ r = kvm_cpu_exec(env);
+ qemu_kvm_eat_signals(env);
+ } else {
+ r = tcg_cpu_exec(env);
+ }
+ if (r == EXCP_DEBUG) {
+ cpu_handle_guest_debug(env);
+ break;
+ }
+ } else if (env->stop || env->stopped) {
+ break;
+ }
+ }
+ exit_request = 0;
+ return !all_cpu_threads_idle();
+}
+
+void set_numa_modes(void)
+{
+ CPUState *env;
+ int i;
+
+ for (env = first_cpu; env != NULL; env = env->next_cpu) {
+ for (i = 0; i < nb_numa_nodes; i++) {
+ if (node_cpumask[i] & (1 << env->cpu_index)) {
+ env->numa_node = i;
+ }
+ }
+ }
+}
+
+void set_cpu_log(const char *optarg)
+{
+ int mask;
+ const CPULogItem *item;
+
+ mask = cpu_str_to_log_mask(optarg);
+ if (!mask) {
+ printf("Log items (comma separated):\n");
+ for (item = cpu_log_items; item->mask != 0; item++) {
+ printf("%-10s %s\n", item->name, item->help);
+ }
+ exit(1);
+ }
+ cpu_set_log(mask);
+}
+
+void set_cpu_log_filename(const char *optarg)
+{
+ cpu_set_log_filename(optarg);
+}
+
+/* Return the virtual CPU time, based on the instruction counter. */
+int64_t cpu_get_icount(void)
+{
+ int64_t icount;
+ CPUState *env = cpu_single_env;;
+
+ icount = qemu_icount;
+ if (env) {
+ if (!can_do_io(env)) {
+ fprintf(stderr, "Bad clock read\n");
+ }
+ icount -= (env->icount_decr.u16.low + env->icount_extra);
+ }
+ return qemu_icount_bias + (icount << icount_time_shift);
+}
+
+void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg)
+{
+ /* XXX: implement xxx_cpu_list for targets that still miss it */
+#if defined(cpu_list_id)
+ cpu_list_id(f, cpu_fprintf, optarg);
+#elif defined(cpu_list)
+ cpu_list(f, cpu_fprintf); /* deprecated */
+#endif
+}
diff --git a/qemu-0.15.x/cpus.h b/qemu-0.15.x/cpus.h
new file mode 100644
index 0000000..f42b54e
--- /dev/null
+++ b/qemu-0.15.x/cpus.h
@@ -0,0 +1,25 @@
+#ifndef QEMU_CPUS_H
+#define QEMU_CPUS_H
+
+/* cpus.c */
+int qemu_init_main_loop(void);
+void qemu_main_loop_start(void);
+void resume_all_vcpus(void);
+void pause_all_vcpus(void);
+void cpu_stop_current(void);
+
+void cpu_synchronize_all_states(void);
+void cpu_synchronize_all_post_reset(void);
+void cpu_synchronize_all_post_init(void);
+
+/* vl.c */
+extern int smp_cores;
+extern int smp_threads;
+void vm_state_notify(int running, int reason);
+bool cpu_exec_all(void);
+void set_numa_modes(void);
+void set_cpu_log(const char *optarg);
+void set_cpu_log_filename(const char *optarg);
+void list_cpus(FILE *f, fprintf_function cpu_fprintf, const char *optarg);
+
+#endif
diff --git a/qemu-0.15.x/cris-dis.c b/qemu-0.15.x/cris-dis.c
new file mode 100644
index 0000000..5fa67d9
--- /dev/null
+++ b/qemu-0.15.x/cris-dis.c
@@ -0,0 +1,2893 @@
+/* Disassembler code for CRIS.
+ Copyright 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
+ Contributed by Axis Communications AB, Lund, Sweden.
+ Written by Hans-Peter Nilsson.
+
+ This file is part of the GNU binutils and GDB, the GNU debugger.
+
+ 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, 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 <http://www.gnu.org/licenses/>. */
+
+#include "qemu-common.h"
+#include "dis-asm.h"
+//#include "sysdep.h"
+#include "target-cris/opcode-cris.h"
+//#include "libiberty.h"
+
+#define CONST_STRNEQ(STR1,STR2) (strncmp ((STR1), (STR2), sizeof (STR2) - 1) == 0)
+
+/* cris-opc.c -- Table of opcodes for the CRIS processor.
+ Copyright 2000, 2001, 2004 Free Software Foundation, Inc.
+ Contributed by Axis Communications AB, Lund, Sweden.
+ Originally written for GAS 1.38.1 by Mikael Asker.
+ Reorganized by Hans-Peter Nilsson.
+
+This file is part of GAS, GDB and the GNU binutils.
+
+GAS, GDB, and GNU binutils 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, or (at your
+option) any later version.
+
+GAS, GDB, and GNU binutils are distributed in the hope that they 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 <http://www.gnu.org/licenses/>. */
+
+#ifndef NULL
+#define NULL (0)
+#endif
+
+/* This table isn't used for CRISv32 and the size of immediate operands. */
+const struct cris_spec_reg
+cris_spec_regs[] =
+{
+ {"bz", 0, 1, cris_ver_v32p, NULL},
+ {"p0", 0, 1, 0, NULL},
+ {"vr", 1, 1, 0, NULL},
+ {"p1", 1, 1, 0, NULL},
+ {"pid", 2, 1, cris_ver_v32p, NULL},
+ {"p2", 2, 1, cris_ver_v32p, NULL},
+ {"p2", 2, 1, cris_ver_warning, NULL},
+ {"srs", 3, 1, cris_ver_v32p, NULL},
+ {"p3", 3, 1, cris_ver_v32p, NULL},
+ {"p3", 3, 1, cris_ver_warning, NULL},
+ {"wz", 4, 2, cris_ver_v32p, NULL},
+ {"p4", 4, 2, 0, NULL},
+ {"ccr", 5, 2, cris_ver_v0_10, NULL},
+ {"exs", 5, 4, cris_ver_v32p, NULL},
+ {"p5", 5, 2, cris_ver_v0_10, NULL},
+ {"p5", 5, 4, cris_ver_v32p, NULL},
+ {"dcr0",6, 2, cris_ver_v0_3, NULL},
+ {"eda", 6, 4, cris_ver_v32p, NULL},
+ {"p6", 6, 2, cris_ver_v0_3, NULL},
+ {"p6", 6, 4, cris_ver_v32p, NULL},
+ {"dcr1/mof", 7, 4, cris_ver_v10p,
+ "Register `dcr1/mof' with ambiguous size specified. Guessing 4 bytes"},
+ {"dcr1/mof", 7, 2, cris_ver_v0_3,
+ "Register `dcr1/mof' with ambiguous size specified. Guessing 2 bytes"},
+ {"mof", 7, 4, cris_ver_v10p, NULL},
+ {"dcr1",7, 2, cris_ver_v0_3, NULL},
+ {"p7", 7, 4, cris_ver_v10p, NULL},
+ {"p7", 7, 2, cris_ver_v0_3, NULL},
+ {"dz", 8, 4, cris_ver_v32p, NULL},
+ {"p8", 8, 4, 0, NULL},
+ {"ibr", 9, 4, cris_ver_v0_10, NULL},
+ {"ebp", 9, 4, cris_ver_v32p, NULL},
+ {"p9", 9, 4, 0, NULL},
+ {"irp", 10, 4, cris_ver_v0_10, NULL},
+ {"erp", 10, 4, cris_ver_v32p, NULL},
+ {"p10", 10, 4, 0, NULL},
+ {"srp", 11, 4, 0, NULL},
+ {"p11", 11, 4, 0, NULL},
+ /* For disassembly use only. Accept at assembly with a warning. */
+ {"bar/dtp0", 12, 4, cris_ver_warning,
+ "Ambiguous register `bar/dtp0' specified"},
+ {"nrp", 12, 4, cris_ver_v32p, NULL},
+ {"bar", 12, 4, cris_ver_v8_10, NULL},
+ {"dtp0",12, 4, cris_ver_v0_3, NULL},
+ {"p12", 12, 4, 0, NULL},
+ /* For disassembly use only. Accept at assembly with a warning. */
+ {"dccr/dtp1",13, 4, cris_ver_warning,
+ "Ambiguous register `dccr/dtp1' specified"},
+ {"ccs", 13, 4, cris_ver_v32p, NULL},
+ {"dccr",13, 4, cris_ver_v8_10, NULL},
+ {"dtp1",13, 4, cris_ver_v0_3, NULL},
+ {"p13", 13, 4, 0, NULL},
+ {"brp", 14, 4, cris_ver_v3_10, NULL},
+ {"usp", 14, 4, cris_ver_v32p, NULL},
+ {"p14", 14, 4, cris_ver_v3p, NULL},
+ {"usp", 15, 4, cris_ver_v10, NULL},
+ {"spc", 15, 4, cris_ver_v32p, NULL},
+ {"p15", 15, 4, cris_ver_v10p, NULL},
+ {NULL, 0, 0, cris_ver_version_all, NULL}
+};
+
+/* Add version specifiers to this table when necessary.
+ The (now) regular coding of register names suggests a simpler
+ implementation. */
+const struct cris_support_reg cris_support_regs[] =
+{
+ {"s0", 0},
+ {"s1", 1},
+ {"s2", 2},
+ {"s3", 3},
+ {"s4", 4},
+ {"s5", 5},
+ {"s6", 6},
+ {"s7", 7},
+ {"s8", 8},
+ {"s9", 9},
+ {"s10", 10},
+ {"s11", 11},
+ {"s12", 12},
+ {"s13", 13},
+ {"s14", 14},
+ {"s15", 15},
+ {NULL, 0}
+};
+
+/* All CRIS opcodes are 16 bits.
+
+ - The match component is a mask saying which bits must match a
+ particular opcode in order for an instruction to be an instance
+ of that opcode.
+
+ - The args component is a string containing characters symbolically
+ matching the operands of an instruction. Used for both assembly
+ and disassembly.
+
+ Operand-matching characters:
+ [ ] , space
+ Verbatim.
+ A The string "ACR" (case-insensitive).
+ B Not really an operand. It causes a "BDAP -size,SP" prefix to be
+ output for the PUSH alias-instructions and recognizes a push-
+ prefix at disassembly. This letter isn't recognized for v32.
+ Must be followed by a R or P letter.
+ ! Non-match pattern, will not match if there's a prefix insn.
+ b Non-matching operand, used for branches with 16-bit
+ displacement. Only recognized by the disassembler.
+ c 5-bit unsigned immediate in bits <4:0>.
+ C 4-bit unsigned immediate in bits <3:0>.
+ d At assembly, optionally (as in put other cases before this one)
+ ".d" or ".D" at the start of the operands, followed by one space
+ character. At disassembly, nothing.
+ D General register in bits <15:12> and <3:0>.
+ f List of flags in bits <15:12> and <3:0>.
+ i 6-bit signed immediate in bits <5:0>.
+ I 6-bit unsigned immediate in bits <5:0>.
+ M Size modifier (B, W or D) for CLEAR instructions.
+ m Size modifier (B, W or D) in bits <5:4>
+ N A 32-bit dword, like in the difference between s and y.
+ This has no effect on bits in the opcode. Can also be expressed
+ as "[pc+]" in input.
+ n As N, but PC-relative (to the start of the instruction).
+ o [-128..127] word offset in bits <7:1> and <0>. Used by 8-bit
+ branch instructions.
+ O [-128..127] offset in bits <7:0>. Also matches a comma and a
+ general register after the expression, in bits <15:12>. Used
+ only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode).
+ P Special register in bits <15:12>.
+ p Indicates that the insn is a prefix insn. Must be first
+ character.
+ Q As O, but don't relax; force an 8-bit offset.
+ R General register in bits <15:12>.
+ r General register in bits <3:0>.
+ S Source operand in bit <10> and a prefix; a 3-operand prefix
+ without side-effect.
+ s Source operand in bits <10> and <3:0>, optionally with a
+ side-effect prefix, except [pc] (the name, not R15 as in ACR)
+ isn't allowed for v32 and higher.
+ T Support register in bits <15:12>.
+ u 4-bit (PC-relative) unsigned immediate word offset in bits <3:0>.
+ U Relaxes to either u or n, instruction is assumed LAPCQ or LAPC.
+ Not recognized at disassembly.
+ x Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
+ y Like 's' but do not allow an integer at assembly.
+ Y The difference s-y; only an integer is allowed.
+ z Size modifier (B or W) in bit <4>. */
+
+
+/* Please note the order of the opcodes in this table is significant.
+ The assembler requires that all instances of the same mnemonic must
+ be consecutive. If they aren't, the assembler might not recognize
+ them, or may indicate an internal error.
+
+ The disassembler should not normally care about the order of the
+ opcodes, but will prefer an earlier alternative if the "match-score"
+ (see cris-dis.c) is computed as equal.
+
+ It should not be significant for proper execution that this table is
+ in alphabetical order, but please follow that convention for an easy
+ overview. */
+
+const struct cris_opcode
+cris_opcodes[] =
+{
+ {"abs", 0x06B0, 0x0940, "r,R", 0, SIZE_NONE, 0,
+ cris_abs_op},
+
+ {"add", 0x0600, 0x09c0, "m r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"add", 0x0A00, 0x01c0, "m S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"add", 0x0a00, 0x05c0, "m S,R,r", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_three_operand_add_sub_cmp_and_or_op},
+
+ {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD,
+ cris_ver_v32p,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"addc", 0x0570, 0x0A80, "r,R", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"addc", 0x09A0, 0x0250, "s,R", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"addi", 0x0540, 0x0A80, "x,r,A", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_addi_op},
+
+ {"addi", 0x0500, 0x0Ac0, "x,r", 0, SIZE_NONE, 0,
+ cris_addi_op},
+
+ /* This collates after "addo", but we want to disassemble as "addoq",
+ not "addo". */
+ {"addoq", 0x0100, 0x0E00, "Q,A", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"addo", 0x0940, 0x0280, "m s,R,A", 0, SIZE_FIELD_SIGNED,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ /* This must be located after the insn above, lest we misinterpret
+ "addo.b -1,r0,acr" as "addo .b-1,r0,acr". FIXME: Sounds like a
+ parser bug. */
+ {"addo", 0x0100, 0x0E00, "O,A", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"addq", 0x0200, 0x0Dc0, "I,R", 0, SIZE_NONE, 0,
+ cris_quick_mode_add_sub_op},
+
+ {"adds", 0x0420, 0x0Bc0, "z r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
+ {"adds", 0x0820, 0x03c0, "z s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"adds", 0x0820, 0x03c0, "z S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"adds", 0x0820, 0x07c0, "z S,R,r", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_three_operand_add_sub_cmp_and_or_op},
+
+ {"addu", 0x0400, 0x0be0, "z r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
+ {"addu", 0x0800, 0x03e0, "z s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"addu", 0x0800, 0x03e0, "z S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"addu", 0x0800, 0x07e0, "z S,R,r", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_three_operand_add_sub_cmp_and_or_op},
+
+ {"and", 0x0700, 0x08C0, "m r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"and", 0x0B00, 0x00C0, "m s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"and", 0x0B00, 0x00C0, "m S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"and", 0x0B00, 0x04C0, "m S,R,r", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_three_operand_add_sub_cmp_and_or_op},
+
+ {"andq", 0x0300, 0x0CC0, "i,R", 0, SIZE_NONE, 0,
+ cris_quick_mode_and_cmp_move_or_op},
+
+ {"asr", 0x0780, 0x0840, "m r,R", 0, SIZE_NONE, 0,
+ cris_asr_op},
+
+ {"asrq", 0x03a0, 0x0c40, "c,R", 0, SIZE_NONE, 0,
+ cris_asrq_op},
+
+ {"ax", 0x15B0, 0xEA4F, "", 0, SIZE_NONE, 0,
+ cris_ax_ei_setf_op},
+
+ /* FIXME: Should use branch #defines. */
+ {"b", 0x0dff, 0x0200, "b", 1, SIZE_NONE, 0,
+ cris_sixteen_bit_offset_branch_op},
+
+ {"ba",
+ BA_QUICK_OPCODE,
+ 0x0F00+(0xF-CC_A)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ /* Needs to come after the usual "ba o", which might be relaxed to
+ this one. */
+ {"ba", BA_DWORD_OPCODE,
+ 0xffff & (~BA_DWORD_OPCODE), "n", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_none_reg_mode_jump_op},
+
+ {"bas", 0x0EBF, 0x0140, "n,P", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_none_reg_mode_jump_op},
+
+ {"basc", 0x0EFF, 0x0100, "n,P", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_none_reg_mode_jump_op},
+
+ {"bcc",
+ BRANCH_QUICK_OPCODE+CC_CC*0x1000,
+ 0x0f00+(0xF-CC_CC)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bcs",
+ BRANCH_QUICK_OPCODE+CC_CS*0x1000,
+ 0x0f00+(0xF-CC_CS)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bdap",
+ BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS, "pm s,R", 0, SIZE_FIELD_SIGNED,
+ cris_ver_v0_10,
+ cris_bdap_prefix},
+
+ {"bdap",
+ BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS, "pO", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_quick_mode_bdap_prefix},
+
+ {"beq",
+ BRANCH_QUICK_OPCODE+CC_EQ*0x1000,
+ 0x0f00+(0xF-CC_EQ)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ /* This is deliberately put before "bext" to trump it, even though not
+ in alphabetical order, since we don't do excluding version checks
+ for v0..v10. */
+ {"bwf",
+ BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
+ 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
+ cris_ver_v10,
+ cris_eight_bit_offset_branch_op},
+
+ {"bext",
+ BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
+ 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
+ cris_ver_v0_3,
+ cris_eight_bit_offset_branch_op},
+
+ {"bge",
+ BRANCH_QUICK_OPCODE+CC_GE*0x1000,
+ 0x0f00+(0xF-CC_GE)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bgt",
+ BRANCH_QUICK_OPCODE+CC_GT*0x1000,
+ 0x0f00+(0xF-CC_GT)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bhi",
+ BRANCH_QUICK_OPCODE+CC_HI*0x1000,
+ 0x0f00+(0xF-CC_HI)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bhs",
+ BRANCH_QUICK_OPCODE+CC_HS*0x1000,
+ 0x0f00+(0xF-CC_HS)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"biap", BIAP_OPCODE, BIAP_Z_BITS, "pm r,R", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_biap_prefix},
+
+ {"ble",
+ BRANCH_QUICK_OPCODE+CC_LE*0x1000,
+ 0x0f00+(0xF-CC_LE)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"blo",
+ BRANCH_QUICK_OPCODE+CC_LO*0x1000,
+ 0x0f00+(0xF-CC_LO)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bls",
+ BRANCH_QUICK_OPCODE+CC_LS*0x1000,
+ 0x0f00+(0xF-CC_LS)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"blt",
+ BRANCH_QUICK_OPCODE+CC_LT*0x1000,
+ 0x0f00+(0xF-CC_LT)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bmi",
+ BRANCH_QUICK_OPCODE+CC_MI*0x1000,
+ 0x0f00+(0xF-CC_MI)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bmod", 0x0ab0, 0x0140, "s,R", 0, SIZE_FIX_32,
+ cris_ver_sim_v0_10,
+ cris_not_implemented_op},
+
+ {"bmod", 0x0ab0, 0x0140, "S,D", 0, SIZE_NONE,
+ cris_ver_sim_v0_10,
+ cris_not_implemented_op},
+
+ {"bmod", 0x0ab0, 0x0540, "S,R,r", 0, SIZE_NONE,
+ cris_ver_sim_v0_10,
+ cris_not_implemented_op},
+
+ {"bne",
+ BRANCH_QUICK_OPCODE+CC_NE*0x1000,
+ 0x0f00+(0xF-CC_NE)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bound", 0x05c0, 0x0A00, "m r,R", 0, SIZE_NONE, 0,
+ cris_two_operand_bound_op},
+ /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
+ {"bound", 0x09c0, 0x0200, "m s,R", 0, SIZE_FIELD,
+ cris_ver_v0_10,
+ cris_two_operand_bound_op},
+ /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
+ {"bound", 0x0dcf, 0x0200, "m Y,R", 0, SIZE_FIELD, 0,
+ cris_two_operand_bound_op},
+ {"bound", 0x09c0, 0x0200, "m S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_two_operand_bound_op},
+ {"bound", 0x09c0, 0x0600, "m S,R,r", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_three_operand_bound_op},
+
+ {"bpl",
+ BRANCH_QUICK_OPCODE+CC_PL*0x1000,
+ 0x0f00+(0xF-CC_PL)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"break", 0xe930, 0x16c0, "C", 0, SIZE_NONE,
+ cris_ver_v3p,
+ cris_break_op},
+
+ {"bsb",
+ BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
+ 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
+ cris_ver_v32p,
+ cris_eight_bit_offset_branch_op},
+
+ {"bsr", 0xBEBF, 0x4140, "n", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_none_reg_mode_jump_op},
+
+ {"bsrc", 0xBEFF, 0x4100, "n", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_none_reg_mode_jump_op},
+
+ {"bstore", 0x0af0, 0x0100, "s,R", 0, SIZE_FIX_32,
+ cris_ver_warning,
+ cris_not_implemented_op},
+
+ {"bstore", 0x0af0, 0x0100, "S,D", 0, SIZE_NONE,
+ cris_ver_warning,
+ cris_not_implemented_op},
+
+ {"bstore", 0x0af0, 0x0500, "S,R,r", 0, SIZE_NONE,
+ cris_ver_warning,
+ cris_not_implemented_op},
+
+ {"btst", 0x04F0, 0x0B00, "r,R", 0, SIZE_NONE, 0,
+ cris_btst_nop_op},
+ {"btstq", 0x0380, 0x0C60, "c,R", 0, SIZE_NONE, 0,
+ cris_btst_nop_op},
+
+ {"bvc",
+ BRANCH_QUICK_OPCODE+CC_VC*0x1000,
+ 0x0f00+(0xF-CC_VC)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"bvs",
+ BRANCH_QUICK_OPCODE+CC_VS*0x1000,
+ 0x0f00+(0xF-CC_VS)*0x1000, "o", 1, SIZE_NONE, 0,
+ cris_eight_bit_offset_branch_op},
+
+ {"clear", 0x0670, 0x3980, "M r", 0, SIZE_NONE, 0,
+ cris_reg_mode_clear_op},
+
+ {"clear", 0x0A70, 0x3180, "M y", 0, SIZE_NONE, 0,
+ cris_none_reg_mode_clear_test_op},
+
+ {"clear", 0x0A70, 0x3180, "M S", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_clear_test_op},
+
+ {"clearf", 0x05F0, 0x0A00, "f", 0, SIZE_NONE, 0,
+ cris_clearf_di_op},
+
+ {"cmp", 0x06C0, 0x0900, "m r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"cmp", 0x0Ac0, 0x0100, "m s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"cmp", 0x0Ac0, 0x0100, "m S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"cmpq", 0x02C0, 0x0D00, "i,R", 0, SIZE_NONE, 0,
+ cris_quick_mode_and_cmp_move_or_op},
+
+ /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
+ {"cmps", 0x08e0, 0x0300, "z s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"cmps", 0x08e0, 0x0300, "z S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
+ {"cmpu", 0x08c0, 0x0320, "z s,R" , 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"cmpu", 0x08c0, 0x0320, "z S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"di", 0x25F0, 0xDA0F, "", 0, SIZE_NONE, 0,
+ cris_clearf_di_op},
+
+ {"dip", DIP_OPCODE, DIP_Z_BITS, "ps", 0, SIZE_FIX_32,
+ cris_ver_v0_10,
+ cris_dip_prefix},
+
+ {"div", 0x0980, 0x0640, "m R,r", 0, SIZE_FIELD, 0,
+ cris_not_implemented_op},
+
+ {"dstep", 0x06f0, 0x0900, "r,R", 0, SIZE_NONE, 0,
+ cris_dstep_logshift_mstep_neg_not_op},
+
+ {"ei", 0x25B0, 0xDA4F, "", 0, SIZE_NONE, 0,
+ cris_ax_ei_setf_op},
+
+ {"fidxd", 0x0ab0, 0xf540, "[r]", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"fidxi", 0x0d30, 0xF2C0, "[r]", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"ftagd", 0x1AB0, 0xE540, "[r]", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"ftagi", 0x1D30, 0xE2C0, "[r]", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"halt", 0xF930, 0x06CF, "", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"jas", 0x09B0, 0x0640, "r,P", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_reg_mode_jump_op},
+
+ {"jas", 0x0DBF, 0x0240, "N,P", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_reg_mode_jump_op},
+
+ {"jasc", 0x0B30, 0x04C0, "r,P", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_reg_mode_jump_op},
+
+ {"jasc", 0x0F3F, 0x00C0, "N,P", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_reg_mode_jump_op},
+
+ {"jbrc", 0x69b0, 0x9640, "r", 0, SIZE_NONE,
+ cris_ver_v8_10,
+ cris_reg_mode_jump_op},
+
+ {"jbrc", 0x6930, 0x92c0, "s", 0, SIZE_FIX_32,
+ cris_ver_v8_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jbrc", 0x6930, 0x92c0, "S", 0, SIZE_NONE,
+ cris_ver_v8_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jir", 0xA9b0, 0x5640, "r", 0, SIZE_NONE,
+ cris_ver_v8_10,
+ cris_reg_mode_jump_op},
+
+ {"jir", 0xA930, 0x52c0, "s", 0, SIZE_FIX_32,
+ cris_ver_v8_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jir", 0xA930, 0x52c0, "S", 0, SIZE_NONE,
+ cris_ver_v8_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jirc", 0x29b0, 0xd640, "r", 0, SIZE_NONE,
+ cris_ver_v8_10,
+ cris_reg_mode_jump_op},
+
+ {"jirc", 0x2930, 0xd2c0, "s", 0, SIZE_FIX_32,
+ cris_ver_v8_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jirc", 0x2930, 0xd2c0, "S", 0, SIZE_NONE,
+ cris_ver_v8_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jsr", 0xB9b0, 0x4640, "r", 0, SIZE_NONE, 0,
+ cris_reg_mode_jump_op},
+
+ {"jsr", 0xB930, 0x42c0, "s", 0, SIZE_FIX_32,
+ cris_ver_v0_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jsr", 0xBDBF, 0x4240, "N", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_none_reg_mode_jump_op},
+
+ {"jsr", 0xB930, 0x42c0, "S", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jsrc", 0x39b0, 0xc640, "r", 0, SIZE_NONE,
+ cris_ver_v8_10,
+ cris_reg_mode_jump_op},
+
+ {"jsrc", 0x3930, 0xc2c0, "s", 0, SIZE_FIX_32,
+ cris_ver_v8_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jsrc", 0x3930, 0xc2c0, "S", 0, SIZE_NONE,
+ cris_ver_v8_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jsrc", 0xBB30, 0x44C0, "r", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_reg_mode_jump_op},
+
+ {"jsrc", 0xBF3F, 0x40C0, "N", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_reg_mode_jump_op},
+
+ {"jump", 0x09b0, 0xF640, "r", 0, SIZE_NONE, 0,
+ cris_reg_mode_jump_op},
+
+ {"jump",
+ JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "s", 0, SIZE_FIX_32,
+ cris_ver_v0_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jump",
+ JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "S", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_jump_op},
+
+ {"jump", 0x09F0, 0x060F, "P", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_none_reg_mode_jump_op},
+
+ {"jump",
+ JUMP_PC_INCR_OPCODE_V32,
+ (0xffff & ~JUMP_PC_INCR_OPCODE_V32), "N", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_none_reg_mode_jump_op},
+
+ {"jmpu", 0x8930, 0x72c0, "s", 0, SIZE_FIX_32,
+ cris_ver_v10,
+ cris_none_reg_mode_jump_op},
+
+ {"jmpu", 0x8930, 0x72c0, "S", 0, SIZE_NONE,
+ cris_ver_v10,
+ cris_none_reg_mode_jump_op},
+
+ {"lapc", 0x0970, 0x0680, "U,R", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"lapc", 0x0D7F, 0x0280, "dn,R", 0, SIZE_FIX_32,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"lapcq", 0x0970, 0x0680, "u,R", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_addi_op},
+
+ {"lsl", 0x04C0, 0x0B00, "m r,R", 0, SIZE_NONE, 0,
+ cris_dstep_logshift_mstep_neg_not_op},
+
+ {"lslq", 0x03c0, 0x0C20, "c,R", 0, SIZE_NONE, 0,
+ cris_dstep_logshift_mstep_neg_not_op},
+
+ {"lsr", 0x07C0, 0x0800, "m r,R", 0, SIZE_NONE, 0,
+ cris_dstep_logshift_mstep_neg_not_op},
+
+ {"lsrq", 0x03e0, 0x0C00, "c,R", 0, SIZE_NONE, 0,
+ cris_dstep_logshift_mstep_neg_not_op},
+
+ {"lz", 0x0730, 0x08C0, "r,R", 0, SIZE_NONE,
+ cris_ver_v3p,
+ cris_not_implemented_op},
+
+ {"mcp", 0x07f0, 0x0800, "P,r", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"move", 0x0640, 0x0980, "m r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"move", 0x0A40, 0x0180, "m s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"move", 0x0A40, 0x0180, "m S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"move", 0x0630, 0x09c0, "r,P", 0, SIZE_NONE, 0,
+ cris_move_to_preg_op},
+
+ {"move", 0x0670, 0x0980, "P,r", 0, SIZE_NONE, 0,
+ cris_reg_mode_move_from_preg_op},
+
+ {"move", 0x0BC0, 0x0000, "m R,y", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"move", 0x0BC0, 0x0000, "m D,S", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"move",
+ MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS,
+ "s,P", 0, SIZE_SPEC_REG, 0,
+ cris_move_to_preg_op},
+
+ {"move", 0x0A30, 0x01c0, "S,P", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_move_to_preg_op},
+
+ {"move", 0x0A70, 0x0180, "P,y", 0, SIZE_SPEC_REG, 0,
+ cris_none_reg_mode_move_from_preg_op},
+
+ {"move", 0x0A70, 0x0180, "P,S", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_move_from_preg_op},
+
+ {"move", 0x0B70, 0x0480, "r,T", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"move", 0x0F70, 0x0080, "T,r", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"movem", 0x0BF0, 0x0000, "R,y", 0, SIZE_FIX_32, 0,
+ cris_move_reg_to_mem_movem_op},
+
+ {"movem", 0x0BF0, 0x0000, "D,S", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_move_reg_to_mem_movem_op},
+
+ {"movem", 0x0BB0, 0x0040, "s,R", 0, SIZE_FIX_32, 0,
+ cris_move_mem_to_reg_movem_op},
+
+ {"movem", 0x0BB0, 0x0040, "S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_move_mem_to_reg_movem_op},
+
+ {"moveq", 0x0240, 0x0D80, "i,R", 0, SIZE_NONE, 0,
+ cris_quick_mode_and_cmp_move_or_op},
+
+ {"movs", 0x0460, 0x0B80, "z r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
+ {"movs", 0x0860, 0x0380, "z s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"movs", 0x0860, 0x0380, "z S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"movu", 0x0440, 0x0Ba0, "z r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
+ {"movu", 0x0840, 0x03a0, "z s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"movu", 0x0840, 0x03a0, "z S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"mstep", 0x07f0, 0x0800, "r,R", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_dstep_logshift_mstep_neg_not_op},
+
+ {"muls", 0x0d00, 0x02c0, "m r,R", 0, SIZE_NONE,
+ cris_ver_v10p,
+ cris_muls_op},
+
+ {"mulu", 0x0900, 0x06c0, "m r,R", 0, SIZE_NONE,
+ cris_ver_v10p,
+ cris_mulu_op},
+
+ {"neg", 0x0580, 0x0A40, "m r,R", 0, SIZE_NONE, 0,
+ cris_dstep_logshift_mstep_neg_not_op},
+
+ {"nop", NOP_OPCODE, NOP_Z_BITS, "", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_btst_nop_op},
+
+ {"nop", NOP_OPCODE_V32, NOP_Z_BITS_V32, "", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_btst_nop_op},
+
+ {"not", 0x8770, 0x7880, "r", 0, SIZE_NONE, 0,
+ cris_dstep_logshift_mstep_neg_not_op},
+
+ {"or", 0x0740, 0x0880, "m r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"or", 0x0B40, 0x0080, "m s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"or", 0x0B40, 0x0080, "m S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"or", 0x0B40, 0x0480, "m S,R,r", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_three_operand_add_sub_cmp_and_or_op},
+
+ {"orq", 0x0340, 0x0C80, "i,R", 0, SIZE_NONE, 0,
+ cris_quick_mode_and_cmp_move_or_op},
+
+ {"pop", 0x0E6E, 0x0191, "!R", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"pop", 0x0e3e, 0x01c1, "!P", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_move_from_preg_op},
+
+ {"push", 0x0FEE, 0x0011, "BR", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"push", 0x0E7E, 0x0181, "BP", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_move_to_preg_op},
+
+ {"rbf", 0x3b30, 0xc0c0, "y", 0, SIZE_NONE,
+ cris_ver_v10,
+ cris_not_implemented_op},
+
+ {"rbf", 0x3b30, 0xc0c0, "S", 0, SIZE_NONE,
+ cris_ver_v10,
+ cris_not_implemented_op},
+
+ {"rfe", 0x2930, 0xD6CF, "", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"rfg", 0x4930, 0xB6CF, "", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"rfn", 0x5930, 0xA6CF, "", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ {"ret", 0xB67F, 0x4980, "", 1, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_reg_mode_move_from_preg_op},
+
+ {"ret", 0xB9F0, 0x460F, "", 1, SIZE_NONE,
+ cris_ver_v32p,
+ cris_reg_mode_move_from_preg_op},
+
+ {"retb", 0xe67f, 0x1980, "", 1, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_reg_mode_move_from_preg_op},
+
+ {"rete", 0xA9F0, 0x560F, "", 1, SIZE_NONE,
+ cris_ver_v32p,
+ cris_reg_mode_move_from_preg_op},
+
+ {"reti", 0xA67F, 0x5980, "", 1, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_reg_mode_move_from_preg_op},
+
+ {"retn", 0xC9F0, 0x360F, "", 1, SIZE_NONE,
+ cris_ver_v32p,
+ cris_reg_mode_move_from_preg_op},
+
+ {"sbfs", 0x3b70, 0xc080, "y", 0, SIZE_NONE,
+ cris_ver_v10,
+ cris_not_implemented_op},
+
+ {"sbfs", 0x3b70, 0xc080, "S", 0, SIZE_NONE,
+ cris_ver_v10,
+ cris_not_implemented_op},
+
+ {"sa",
+ 0x0530+CC_A*0x1000,
+ 0x0AC0+(0xf-CC_A)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"ssb",
+ 0x0530+CC_EXT*0x1000,
+ 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_scc_op},
+
+ {"scc",
+ 0x0530+CC_CC*0x1000,
+ 0x0AC0+(0xf-CC_CC)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"scs",
+ 0x0530+CC_CS*0x1000,
+ 0x0AC0+(0xf-CC_CS)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"seq",
+ 0x0530+CC_EQ*0x1000,
+ 0x0AC0+(0xf-CC_EQ)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"setf", 0x05b0, 0x0A40, "f", 0, SIZE_NONE, 0,
+ cris_ax_ei_setf_op},
+
+ {"sfe", 0x3930, 0xC6CF, "", 0, SIZE_NONE,
+ cris_ver_v32p,
+ cris_not_implemented_op},
+
+ /* Need to have "swf" in front of "sext" so it is the one displayed in
+ disassembly. */
+ {"swf",
+ 0x0530+CC_EXT*0x1000,
+ 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
+ cris_ver_v10,
+ cris_scc_op},
+
+ {"sext",
+ 0x0530+CC_EXT*0x1000,
+ 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
+ cris_ver_v0_3,
+ cris_scc_op},
+
+ {"sge",
+ 0x0530+CC_GE*0x1000,
+ 0x0AC0+(0xf-CC_GE)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"sgt",
+ 0x0530+CC_GT*0x1000,
+ 0x0AC0+(0xf-CC_GT)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"shi",
+ 0x0530+CC_HI*0x1000,
+ 0x0AC0+(0xf-CC_HI)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"shs",
+ 0x0530+CC_HS*0x1000,
+ 0x0AC0+(0xf-CC_HS)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"sle",
+ 0x0530+CC_LE*0x1000,
+ 0x0AC0+(0xf-CC_LE)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"slo",
+ 0x0530+CC_LO*0x1000,
+ 0x0AC0+(0xf-CC_LO)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"sls",
+ 0x0530+CC_LS*0x1000,
+ 0x0AC0+(0xf-CC_LS)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"slt",
+ 0x0530+CC_LT*0x1000,
+ 0x0AC0+(0xf-CC_LT)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"smi",
+ 0x0530+CC_MI*0x1000,
+ 0x0AC0+(0xf-CC_MI)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"sne",
+ 0x0530+CC_NE*0x1000,
+ 0x0AC0+(0xf-CC_NE)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"spl",
+ 0x0530+CC_PL*0x1000,
+ 0x0AC0+(0xf-CC_PL)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"sub", 0x0680, 0x0940, "m r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"sub", 0x0a80, 0x0140, "m s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"sub", 0x0a80, 0x0140, "m S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"sub", 0x0a80, 0x0540, "m S,R,r", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_three_operand_add_sub_cmp_and_or_op},
+
+ {"subq", 0x0280, 0x0d40, "I,R", 0, SIZE_NONE, 0,
+ cris_quick_mode_add_sub_op},
+
+ {"subs", 0x04a0, 0x0b40, "z r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
+ {"subs", 0x08a0, 0x0340, "z s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"subs", 0x08a0, 0x0340, "z S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"subs", 0x08a0, 0x0740, "z S,R,r", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_three_operand_add_sub_cmp_and_or_op},
+
+ {"subu", 0x0480, 0x0b60, "z r,R", 0, SIZE_NONE, 0,
+ cris_reg_mode_add_sub_cmp_and_or_move_op},
+
+ /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
+ {"subu", 0x0880, 0x0360, "z s,R", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"subu", 0x0880, 0x0360, "z S,D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_add_sub_cmp_and_or_move_op},
+
+ {"subu", 0x0880, 0x0760, "z S,R,r", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_three_operand_add_sub_cmp_and_or_op},
+
+ {"svc",
+ 0x0530+CC_VC*0x1000,
+ 0x0AC0+(0xf-CC_VC)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ {"svs",
+ 0x0530+CC_VS*0x1000,
+ 0x0AC0+(0xf-CC_VS)*0x1000, "r", 0, SIZE_NONE, 0,
+ cris_scc_op},
+
+ /* The insn "swapn" is the same as "not" and will be disassembled as
+ such, but the swap* family of mnmonics are generally v8-and-higher
+ only, so count it in. */
+ {"swapn", 0x8770, 0x7880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapw", 0x4770, 0xb880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapnw", 0xc770, 0x3880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapb", 0x2770, 0xd880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapnb", 0xA770, 0x5880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapwb", 0x6770, 0x9880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapnwb", 0xE770, 0x1880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapr", 0x1770, 0xe880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapnr", 0x9770, 0x6880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapwr", 0x5770, 0xa880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapnwr", 0xd770, 0x2880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapbr", 0x3770, 0xc880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapnbr", 0xb770, 0x4880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapwbr", 0x7770, 0x8880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"swapnwbr", 0xf770, 0x0880, "r", 0, SIZE_NONE,
+ cris_ver_v8p,
+ cris_not_implemented_op},
+
+ {"test", 0x0640, 0x0980, "m D", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_reg_mode_test_op},
+
+ {"test", 0x0b80, 0xf040, "m y", 0, SIZE_FIELD, 0,
+ cris_none_reg_mode_clear_test_op},
+
+ {"test", 0x0b80, 0xf040, "m S", 0, SIZE_NONE,
+ cris_ver_v0_10,
+ cris_none_reg_mode_clear_test_op},
+
+ {"xor", 0x07B0, 0x0840, "r,R", 0, SIZE_NONE, 0,
+ cris_xor_op},
+
+ {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
+};
+
+/* Condition-names, indexed by the CC_* numbers as found in cris.h. */
+const char * const
+cris_cc_strings[] =
+{
+ "hs",
+ "lo",
+ "ne",
+ "eq",
+ "vc",
+ "vs",
+ "pl",
+ "mi",
+ "ls",
+ "hi",
+ "ge",
+ "lt",
+ "gt",
+ "le",
+ "a",
+ /* This is a placeholder. In v0, this would be "ext". In v32, this
+ is "sb". See cris_conds15. */
+ "wf"
+};
+
+/* Different names and semantics for condition 1111 (0xf). */
+const struct cris_cond15 cris_cond15s[] =
+{
+ /* FIXME: In what version did condition "ext" disappear? */
+ {"ext", cris_ver_v0_3},
+ {"wf", cris_ver_v10},
+ {"sb", cris_ver_v32p},
+ {NULL, 0}
+};
+
+
+/*
+ * Local variables:
+ * eval: (c-set-style "gnu")
+ * indent-tabs-mode: t
+ * End:
+ */
+
+
+/* No instruction will be disassembled longer than this. In theory, and
+ in silicon, address prefixes can be cascaded. In practice, cascading
+ is not used by GCC, and not supported by the assembler. */
+#ifndef MAX_BYTES_PER_CRIS_INSN
+#define MAX_BYTES_PER_CRIS_INSN 8
+#endif
+
+/* Whether or not to decode prefixes, folding it into the following
+ instruction. FIXME: Make this optional later. */
+#ifndef PARSE_PREFIX
+#define PARSE_PREFIX 1
+#endif
+
+/* Sometimes we prefix all registers with this character. */
+#define REGISTER_PREFIX_CHAR '$'
+
+/* Whether or not to trace the following sequence:
+ sub* X,r%d
+ bound* Y,r%d
+ adds.w [pc+r%d.w],pc
+
+ This is the assembly form of a switch-statement in C.
+ The "sub is optional. If there is none, then X will be zero.
+ X is the value of the first case,
+ Y is the number of cases (including default).
+
+ This results in case offsets printed on the form:
+ case N: -> case_address
+ where N is an estimation on the corresponding 'case' operand in C,
+ and case_address is where execution of that case continues after the
+ sequence presented above.
+
+ The old style of output was to print the offsets as instructions,
+ which made it hard to follow "case"-constructs in the disassembly,
+ and caused a lot of annoying warnings about undefined instructions.
+
+ FIXME: Make this optional later. */
+#ifndef TRACE_CASE
+#define TRACE_CASE (disdata->trace_case)
+#endif
+
+enum cris_disass_family
+ { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
+
+/* Stored in the disasm_info->private_data member. */
+struct cris_disasm_data
+{
+ /* Whether to print something less confusing if we find something
+ matching a switch-construct. */
+ bfd_boolean trace_case;
+
+ /* Whether this code is flagged as crisv32. FIXME: Should be an enum
+ that includes "compatible". */
+ enum cris_disass_family distype;
+};
+
+/* Value of first element in switch. */
+static long case_offset = 0;
+
+/* How many more case-offsets to print. */
+static long case_offset_counter = 0;
+
+/* Number of case offsets. */
+static long no_of_case_offsets = 0;
+
+/* Candidate for next case_offset. */
+static long last_immediate = 0;
+
+static int cris_constraint
+ (const char *, unsigned, unsigned, struct cris_disasm_data *);
+
+/* Parse disassembler options and store state in info. FIXME: For the
+ time being, we abuse static variables. */
+
+static bfd_boolean
+cris_parse_disassembler_options (disassemble_info *info,
+ enum cris_disass_family distype)
+{
+ struct cris_disasm_data *disdata;
+
+ info->private_data = calloc (1, sizeof (struct cris_disasm_data));
+ disdata = (struct cris_disasm_data *) info->private_data;
+ if (disdata == NULL)
+ return false;
+
+ /* Default true. */
+ disdata->trace_case
+ = (info->disassembler_options == NULL
+ || (strcmp (info->disassembler_options, "nocase") != 0));
+
+ disdata->distype = distype;
+ return true;
+}
+
+static const struct cris_spec_reg *
+spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
+{
+ int i;
+
+ for (i = 0; cris_spec_regs[i].name != NULL; i++)
+ {
+ if (cris_spec_regs[i].number == sreg)
+ {
+ if (distype == cris_dis_v32)
+ switch (cris_spec_regs[i].applicable_version)
+ {
+ case cris_ver_warning:
+ case cris_ver_version_all:
+ case cris_ver_v3p:
+ case cris_ver_v8p:
+ case cris_ver_v10p:
+ case cris_ver_v32p:
+ /* No ambiguous sizes or register names with CRISv32. */
+ if (cris_spec_regs[i].warning == NULL)
+ return &cris_spec_regs[i];
+ default:
+ ;
+ }
+ else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
+ return &cris_spec_regs[i];
+ }
+ }
+
+ return NULL;
+}
+
+/* Return the number of bits in the argument. */
+
+static int
+number_of_bits (unsigned int val)
+{
+ int bits;
+
+ for (bits = 0; val != 0; val &= val - 1)
+ bits++;
+
+ return bits;
+}
+
+/* Get an entry in the opcode-table. */
+
+static const struct cris_opcode *
+get_opcode_entry (unsigned int insn,
+ unsigned int prefix_insn,
+ struct cris_disasm_data *disdata)
+{
+ /* For non-prefixed insns, we keep a table of pointers, indexed by the
+ insn code. Each entry is initialized when found to be NULL. */
+ static const struct cris_opcode **opc_table = NULL;
+
+ const struct cris_opcode *max_matchedp = NULL;
+ const struct cris_opcode **prefix_opc_table = NULL;
+
+ /* We hold a table for each prefix that need to be handled differently. */
+ static const struct cris_opcode **dip_prefixes = NULL;
+ static const struct cris_opcode **bdapq_m1_prefixes = NULL;
+ static const struct cris_opcode **bdapq_m2_prefixes = NULL;
+ static const struct cris_opcode **bdapq_m4_prefixes = NULL;
+ static const struct cris_opcode **rest_prefixes = NULL;
+
+ /* Allocate and clear the opcode-table. */
+ if (opc_table == NULL)
+ {
+ opc_table = qemu_malloc (65536 * sizeof (opc_table[0]));
+
+ memset (opc_table, 0, 65536 * sizeof (const struct cris_opcode *));
+
+ dip_prefixes
+ = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
+
+ memset (dip_prefixes, 0, 65536 * sizeof (dip_prefixes[0]));
+
+ bdapq_m1_prefixes
+ = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
+
+ memset (bdapq_m1_prefixes, 0, 65536 * sizeof (bdapq_m1_prefixes[0]));
+
+ bdapq_m2_prefixes
+ = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
+
+ memset (bdapq_m2_prefixes, 0, 65536 * sizeof (bdapq_m2_prefixes[0]));
+
+ bdapq_m4_prefixes
+ = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
+
+ memset (bdapq_m4_prefixes, 0, 65536 * sizeof (bdapq_m4_prefixes[0]));
+
+ rest_prefixes
+ = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
+
+ memset (rest_prefixes, 0, 65536 * sizeof (rest_prefixes[0]));
+ }
+
+ /* Get the right table if this is a prefix.
+ This code is connected to cris_constraints in that it knows what
+ prefixes play a role in recognition of patterns; the necessary
+ state is reflected by which table is used. If constraints
+ involving match or non-match of prefix insns are changed, then this
+ probably needs changing too. */
+ if (prefix_insn != NO_CRIS_PREFIX)
+ {
+ const struct cris_opcode *popcodep
+ = (opc_table[prefix_insn] != NULL
+ ? opc_table[prefix_insn]
+ : get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata));
+
+ if (popcodep == NULL)
+ return NULL;
+
+ if (popcodep->match == BDAP_QUICK_OPCODE)
+ {
+ /* Since some offsets are recognized with "push" macros, we
+ have to have different tables for them. */
+ int offset = (prefix_insn & 255);
+
+ if (offset > 127)
+ offset -= 256;
+
+ switch (offset)
+ {
+ case -4:
+ prefix_opc_table = bdapq_m4_prefixes;
+ break;
+
+ case -2:
+ prefix_opc_table = bdapq_m2_prefixes;
+ break;
+
+ case -1:
+ prefix_opc_table = bdapq_m1_prefixes;
+ break;
+
+ default:
+ prefix_opc_table = rest_prefixes;
+ break;
+ }
+ }
+ else if (popcodep->match == DIP_OPCODE)
+ /* We don't allow postincrement when the prefix is DIP, so use a
+ different table for DIP. */
+ prefix_opc_table = dip_prefixes;
+ else
+ prefix_opc_table = rest_prefixes;
+ }
+
+ if (prefix_insn != NO_CRIS_PREFIX
+ && prefix_opc_table[insn] != NULL)
+ max_matchedp = prefix_opc_table[insn];
+ else if (prefix_insn == NO_CRIS_PREFIX && opc_table[insn] != NULL)
+ max_matchedp = opc_table[insn];
+ else
+ {
+ const struct cris_opcode *opcodep;
+ int max_level_of_match = -1;
+
+ for (opcodep = cris_opcodes;
+ opcodep->name != NULL;
+ opcodep++)
+ {
+ int level_of_match;
+
+ if (disdata->distype == cris_dis_v32)
+ {
+ switch (opcodep->applicable_version)
+ {
+ case cris_ver_version_all:
+ break;
+
+ case cris_ver_v0_3:
+ case cris_ver_v0_10:
+ case cris_ver_v3_10:
+ case cris_ver_sim_v0_10:
+ case cris_ver_v8_10:
+ case cris_ver_v10:
+ case cris_ver_warning:
+ continue;
+
+ case cris_ver_v3p:
+ case cris_ver_v8p:
+ case cris_ver_v10p:
+ case cris_ver_v32p:
+ break;
+
+ case cris_ver_v8:
+ abort ();
+ default:
+ abort ();
+ }
+ }
+ else
+ {
+ switch (opcodep->applicable_version)
+ {
+ case cris_ver_version_all:
+ case cris_ver_v0_3:
+ case cris_ver_v3p:
+ case cris_ver_v0_10:
+ case cris_ver_v8p:
+ case cris_ver_v8_10:
+ case cris_ver_v10:
+ case cris_ver_sim_v0_10:
+ case cris_ver_v10p:
+ case cris_ver_warning:
+ break;
+
+ case cris_ver_v32p:
+ continue;
+
+ case cris_ver_v8:
+ abort ();
+ default:
+ abort ();
+ }
+ }
+
+ /* We give a double lead for bits matching the template in
+ cris_opcodes. Not even, because then "move p8,r10" would
+ be given 2 bits lead over "clear.d r10". When there's a
+ tie, the first entry in the table wins. This is
+ deliberate, to avoid a more complicated recognition
+ formula. */
+ if ((opcodep->match & insn) == opcodep->match
+ && (opcodep->lose & insn) == 0
+ && ((level_of_match
+ = cris_constraint (opcodep->args,
+ insn,
+ prefix_insn,
+ disdata))
+ >= 0)
+ && ((level_of_match
+ += 2 * number_of_bits (opcodep->match
+ | opcodep->lose))
+ > max_level_of_match))
+ {
+ max_matchedp = opcodep;
+ max_level_of_match = level_of_match;
+
+ /* If there was a full match, never mind looking
+ further. */
+ if (level_of_match >= 2 * 16)
+ break;
+ }
+ }
+ /* Fill in the new entry.
+
+ If there are changes to the opcode-table involving prefixes, and
+ disassembly then does not work correctly, try removing the
+ else-clause below that fills in the prefix-table. If that
+ helps, you need to change the prefix_opc_table setting above, or
+ something related. */
+ if (prefix_insn == NO_CRIS_PREFIX)
+ opc_table[insn] = max_matchedp;
+ else
+ prefix_opc_table[insn] = max_matchedp;
+ }
+
+ return max_matchedp;
+}
+
+/* Return -1 if the constraints of a bitwise-matched instruction say
+ that there is no match. Otherwise return a nonnegative number
+ indicating the confidence in the match (higher is better). */
+
+static int
+cris_constraint (const char *cs,
+ unsigned int insn,
+ unsigned int prefix_insn,
+ struct cris_disasm_data *disdata)
+{
+ int retval = 0;
+ int tmp;
+ int prefix_ok = 0;
+ const char *s;
+
+ for (s = cs; *s; s++)
+ switch (*s)
+ {
+ case '!':
+ /* Do not recognize "pop" if there's a prefix and then only for
+ v0..v10. */
+ if (prefix_insn != NO_CRIS_PREFIX
+ || disdata->distype != cris_dis_v0_v10)
+ return -1;
+ break;
+
+ case 'U':
+ /* Not recognized at disassembly. */
+ return -1;
+
+ case 'M':
+ /* Size modifier for "clear", i.e. special register 0, 4 or 8.
+ Check that it is one of them. Only special register 12 could
+ be mismatched, but checking for matches is more logical than
+ checking for mismatches when there are only a few cases. */
+ tmp = ((insn >> 12) & 0xf);
+ if (tmp != 0 && tmp != 4 && tmp != 8)
+ return -1;
+ break;
+
+ case 'm':
+ if ((insn & 0x30) == 0x30)
+ return -1;
+ break;
+
+ case 'S':
+ /* A prefix operand without side-effect. */
+ if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
+ {
+ prefix_ok = 1;
+ break;
+ }
+ else
+ return -1;
+
+ case 's':
+ case 'y':
+ case 'Y':
+ /* If this is a prefixed insn with postincrement (side-effect),
+ the prefix must not be DIP. */
+ if (prefix_insn != NO_CRIS_PREFIX)
+ {
+ if (insn & 0x400)
+ {
+ const struct cris_opcode *prefix_opcodep
+ = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
+
+ if (prefix_opcodep->match == DIP_OPCODE)
+ return -1;
+ }
+
+ prefix_ok = 1;
+ }
+ break;
+
+ case 'B':
+ /* If we don't fall through, then the prefix is ok. */
+ prefix_ok = 1;
+
+ /* A "push" prefix. Check for valid "push" size.
+ In case of special register, it may be != 4. */
+ if (prefix_insn != NO_CRIS_PREFIX)
+ {
+ /* Match the prefix insn to BDAPQ. */
+ const struct cris_opcode *prefix_opcodep
+ = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
+
+ if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
+ {
+ int pushsize = (prefix_insn & 255);
+
+ if (pushsize > 127)
+ pushsize -= 256;
+
+ if (s[1] == 'P')
+ {
+ unsigned int spec_reg = (insn >> 12) & 15;
+ const struct cris_spec_reg *sregp
+ = spec_reg_info (spec_reg, disdata->distype);
+
+ /* For a special-register, the "prefix size" must
+ match the size of the register. */
+ if (sregp && sregp->reg_size == (unsigned int) -pushsize)
+ break;
+ }
+ else if (s[1] == 'R')
+ {
+ if ((insn & 0x30) == 0x20 && pushsize == -4)
+ break;
+ }
+ /* FIXME: Should abort here; next constraint letter
+ *must* be 'P' or 'R'. */
+ }
+ }
+ return -1;
+
+ case 'D':
+ retval = (((insn >> 12) & 15) == (insn & 15));
+ if (!retval)
+ return -1;
+ else
+ retval += 4;
+ break;
+
+ case 'P':
+ {
+ const struct cris_spec_reg *sregp
+ = spec_reg_info ((insn >> 12) & 15, disdata->distype);
+
+ /* Since we match four bits, we will give a value of 4-1 = 3
+ in a match. If there is a corresponding exact match of a
+ special register in another pattern, it will get a value of
+ 4, which will be higher. This should be correct in that an
+ exact pattern would match better than a general pattern.
+
+ Note that there is a reason for not returning zero; the
+ pattern for "clear" is partly matched in the bit-pattern
+ (the two lower bits must be zero), while the bit-pattern
+ for a move from a special register is matched in the
+ register constraint. */
+
+ if (sregp != NULL)
+ {
+ retval += 3;
+ break;
+ }
+ else
+ return -1;
+ }
+ }
+
+ if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
+ return -1;
+
+ return retval;
+}
+
+/* Format number as hex with a leading "0x" into outbuffer. */
+
+static char *
+format_hex (unsigned long number,
+ char *outbuffer,
+ struct cris_disasm_data *disdata)
+{
+ /* Truncate negative numbers on >32-bit hosts. */
+ number &= 0xffffffff;
+
+ sprintf (outbuffer, "0x%lx", number);
+
+ /* Save this value for the "case" support. */
+ if (TRACE_CASE)
+ last_immediate = number;
+
+ return outbuffer + strlen (outbuffer);
+}
+
+/* Format number as decimal into outbuffer. Parameter signedp says
+ whether the number should be formatted as signed (!= 0) or
+ unsigned (== 0). */
+
+static char *
+format_dec (long number, char *outbuffer, int signedp)
+{
+ last_immediate = number;
+ sprintf (outbuffer, signedp ? "%ld" : "%lu", number);
+
+ return outbuffer + strlen (outbuffer);
+}
+
+/* Format the name of the general register regno into outbuffer. */
+
+static char *
+format_reg (struct cris_disasm_data *disdata,
+ int regno,
+ char *outbuffer_start,
+ bfd_boolean with_reg_prefix)
+{
+ char *outbuffer = outbuffer_start;
+
+ if (with_reg_prefix)
+ *outbuffer++ = REGISTER_PREFIX_CHAR;
+
+ switch (regno)
+ {
+ case 15:
+ /* For v32, there is no context in which we output PC. */
+ if (disdata->distype == cris_dis_v32)
+ strcpy (outbuffer, "acr");
+ else
+ strcpy (outbuffer, "pc");
+ break;
+
+ case 14:
+ strcpy (outbuffer, "sp");
+ break;
+
+ default:
+ sprintf (outbuffer, "r%d", regno);
+ break;
+ }
+
+ return outbuffer_start + strlen (outbuffer_start);
+}
+
+/* Format the name of a support register into outbuffer. */
+
+static char *
+format_sup_reg (unsigned int regno,
+ char *outbuffer_start,
+ bfd_boolean with_reg_prefix)
+{
+ char *outbuffer = outbuffer_start;
+ int i;
+
+ if (with_reg_prefix)
+ *outbuffer++ = REGISTER_PREFIX_CHAR;
+
+ for (i = 0; cris_support_regs[i].name != NULL; i++)
+ if (cris_support_regs[i].number == regno)
+ {
+ sprintf (outbuffer, "%s", cris_support_regs[i].name);
+ return outbuffer_start + strlen (outbuffer_start);
+ }
+
+ /* There's supposed to be register names covering all numbers, though
+ some may be generic names. */
+ sprintf (outbuffer, "format_sup_reg-BUG");
+ return outbuffer_start + strlen (outbuffer_start);
+}
+
+/* Return the length of an instruction. */
+
+static unsigned
+bytes_to_skip (unsigned int insn,
+ const struct cris_opcode *matchedp,
+ enum cris_disass_family distype,
+ const struct cris_opcode *prefix_matchedp)
+{
+ /* Each insn is a word plus "immediate" operands. */
+ unsigned to_skip = 2;
+ const char *template = matchedp->args;
+ const char *s;
+
+ for (s = template; *s; s++)
+ if ((*s == 's' || *s == 'N' || *s == 'Y')
+ && (insn & 0x400) && (insn & 15) == 15
+ && prefix_matchedp == NULL)
+ {
+ /* Immediate via [pc+], so we have to check the size of the
+ operand. */
+ int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
+
+ if (matchedp->imm_oprnd_size == SIZE_FIX_32)
+ to_skip += 4;
+ else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
+ {
+ const struct cris_spec_reg *sregp
+ = spec_reg_info ((insn >> 12) & 15, distype);
+
+ /* FIXME: Improve error handling; should have been caught
+ earlier. */
+ if (sregp == NULL)
+ return 2;
+
+ /* PC is incremented by two, not one, for a byte. Except on
+ CRISv32, where constants are always DWORD-size for
+ special registers. */
+ to_skip +=
+ distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
+ }
+ else
+ to_skip += (mode_size + 1) & ~1;
+ }
+ else if (*s == 'n')
+ to_skip += 4;
+ else if (*s == 'b')
+ to_skip += 2;
+
+ return to_skip;
+}
+
+/* Print condition code flags. */
+
+static char *
+print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
+{
+ /* Use the v8 (Etrax 100) flag definitions for disassembly.
+ The differences with v0 (Etrax 1..4) vs. Svinto are:
+ v0 'd' <=> v8 'm'
+ v0 'e' <=> v8 'b'.
+ FIXME: Emit v0..v3 flag names somehow. */
+ static const char v8_fnames[] = "cvznxibm";
+ static const char v32_fnames[] = "cvznxiup";
+ const char *fnames
+ = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
+
+ unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
+ int i;
+
+ for (i = 0; i < 8; i++)
+ if (flagbits & (1 << i))
+ *cp++ = fnames[i];
+
+ return cp;
+}
+
+/* Print out an insn with its operands, and update the info->insn_type
+ fields. The prefix_opcodep and the rest hold a prefix insn that is
+ supposed to be output as an address mode. */
+
+static void
+print_with_operands (const struct cris_opcode *opcodep,
+ unsigned int insn,
+ unsigned char *buffer,
+ bfd_vma addr,
+ disassemble_info *info,
+ /* If a prefix insn was before this insn (and is supposed
+ to be output as an address), here is a description of
+ it. */
+ const struct cris_opcode *prefix_opcodep,
+ unsigned int prefix_insn,
+ unsigned char *prefix_buffer,
+ bfd_boolean with_reg_prefix)
+{
+ /* Get a buffer of somewhat reasonable size where we store
+ intermediate parts of the insn. */
+ char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
+ char *tp = temp;
+ static const char mode_char[] = "bwd?";
+ const char *s;
+ const char *cs;
+ struct cris_disasm_data *disdata
+ = (struct cris_disasm_data *) info->private_data;
+
+ /* Print out the name first thing we do. */
+ (*info->fprintf_func) (info->stream, "%s", opcodep->name);
+
+ cs = opcodep->args;
+ s = cs;
+
+ /* Ignore any prefix indicator. */
+ if (*s == 'p')
+ s++;
+
+ if (*s == 'm' || *s == 'M' || *s == 'z')
+ {
+ *tp++ = '.';
+
+ /* Get the size-letter. */
+ *tp++ = *s == 'M'
+ ? (insn & 0x8000 ? 'd'
+ : insn & 0x4000 ? 'w' : 'b')
+ : mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
+
+ /* Ignore the size and the space character that follows. */
+ s += 2;
+ }
+
+ /* Add a space if this isn't a long-branch, because for those will add
+ the condition part of the name later. */
+ if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256))
+ *tp++ = ' ';
+
+ /* Fill in the insn-type if deducible from the name (and there's no
+ better way). */
+ if (opcodep->name[0] == 'j')
+ {
+ if (CONST_STRNEQ (opcodep->name, "jsr"))
+ /* It's "jsr" or "jsrc". */
+ info->insn_type = dis_jsr;
+ else
+ /* Any other jump-type insn is considered a branch. */
+ info->insn_type = dis_branch;
+ }
+
+ /* We might know some more fields right now. */
+ info->branch_delay_insns = opcodep->delayed;
+
+ /* Handle operands. */
+ for (; *s; s++)
+ {
+ switch (*s)
+ {
+ case 'T':
+ tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
+ break;
+
+ case 'A':
+ if (with_reg_prefix)
+ *tp++ = REGISTER_PREFIX_CHAR;
+ *tp++ = 'a';
+ *tp++ = 'c';
+ *tp++ = 'r';
+ break;
+
+ case '[':
+ case ']':
+ case ',':
+ *tp++ = *s;
+ break;
+
+ case '!':
+ /* Ignore at this point; used at earlier stages to avoid
+ recognition if there's a prefix at something that in other
+ ways looks like a "pop". */
+ break;
+
+ case 'd':
+ /* Ignore. This is an optional ".d " on the large one of
+ relaxable insns. */
+ break;
+
+ case 'B':
+ /* This was the prefix that made this a "push". We've already
+ handled it by recognizing it, so signal that the prefix is
+ handled by setting it to NULL. */
+ prefix_opcodep = NULL;
+ break;
+
+ case 'D':
+ case 'r':
+ tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
+ break;
+
+ case 'R':
+ tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
+ break;
+
+ case 'n':
+ {
+ /* Like N but pc-relative to the start of the insn. */
+ unsigned long number
+ = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
+ + buffer[5] * 0x1000000 + addr);
+
+ /* Finish off and output previous formatted bytes. */
+ *tp = 0;
+ if (temp[0])
+ (*info->fprintf_func) (info->stream, "%s", temp);
+ tp = temp;
+
+ (*info->print_address_func) ((bfd_vma) number, info);
+ }
+ break;
+
+ case 'u':
+ {
+ /* Like n but the offset is bits <3:0> in the instruction. */
+ unsigned long number = (buffer[0] & 0xf) * 2 + addr;
+
+ /* Finish off and output previous formatted bytes. */
+ *tp = 0;
+ if (temp[0])
+ (*info->fprintf_func) (info->stream, "%s", temp);
+ tp = temp;
+
+ (*info->print_address_func) ((bfd_vma) number, info);
+ }
+ break;
+
+ case 'N':
+ case 'y':
+ case 'Y':
+ case 'S':
+ case 's':
+ /* Any "normal" memory operand. */
+ if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
+ {
+ /* We're looking at [pc+], i.e. we need to output an immediate
+ number, where the size can depend on different things. */
+ long number;
+ int signedp
+ = ((*cs == 'z' && (insn & 0x20))
+ || opcodep->match == BDAP_QUICK_OPCODE);
+ int nbytes;
+
+ if (opcodep->imm_oprnd_size == SIZE_FIX_32)
+ nbytes = 4;
+ else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
+ {
+ const struct cris_spec_reg *sregp
+ = spec_reg_info ((insn >> 12) & 15, disdata->distype);
+
+ /* A NULL return should have been as a non-match earlier,
+ so catch it as an internal error in the error-case
+ below. */
+ if (sregp == NULL)
+ /* Whatever non-valid size. */
+ nbytes = 42;
+ else
+ /* PC is always incremented by a multiple of two.
+ For CRISv32, immediates are always 4 bytes for
+ special registers. */
+ nbytes = disdata->distype == cris_dis_v32
+ ? 4 : (sregp->reg_size + 1) & ~1;
+ }
+ else
+ {
+ int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
+
+ if (mode_size == 1)
+ nbytes = 2;
+ else
+ nbytes = mode_size;
+ }
+
+ switch (nbytes)
+ {
+ case 1:
+ number = buffer[2];
+ if (signedp && number > 127)
+ number -= 256;
+ break;
+
+ case 2:
+ number = buffer[2] + buffer[3] * 256;
+ if (signedp && number > 32767)
+ number -= 65536;
+ break;
+
+ case 4:
+ number
+ = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
+ + buffer[5] * 0x1000000;
+ break;
+
+ default:
+ strcpy (tp, "bug");
+ tp += 3;
+ number = 42;
+ }
+
+ if ((*cs == 'z' && (insn & 0x20))
+ || (opcodep->match == BDAP_QUICK_OPCODE
+ && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
+ tp = format_dec (number, tp, signedp);
+ else
+ {
+ unsigned int highbyte = (number >> 24) & 0xff;
+
+ /* Either output this as an address or as a number. If it's
+ a dword with the same high-byte as the address of the
+ insn, assume it's an address, and also if it's a non-zero
+ non-0xff high-byte. If this is a jsr or a jump, then
+ it's definitely an address. */
+ if (nbytes == 4
+ && (highbyte == ((addr >> 24) & 0xff)
+ || (highbyte != 0 && highbyte != 0xff)
+ || info->insn_type == dis_branch
+ || info->insn_type == dis_jsr))
+ {
+ /* Finish off and output previous formatted bytes. */
+ *tp = 0;
+ tp = temp;
+ if (temp[0])
+ (*info->fprintf_func) (info->stream, "%s", temp);
+
+ (*info->print_address_func) ((bfd_vma) number, info);
+
+ info->target = number;
+ }
+ else
+ tp = format_hex (number, tp, disdata);
+ }
+ }
+ else
+ {
+ /* Not an immediate number. Then this is a (possibly
+ prefixed) memory operand. */
+ if (info->insn_type != dis_nonbranch)
+ {
+ int mode_size
+ = 1 << ((insn >> 4)
+ & (opcodep->args[0] == 'z' ? 1 : 3));
+ int size;
+ info->insn_type = dis_dref;
+ info->flags |= CRIS_DIS_FLAG_MEMREF;
+
+ if (opcodep->imm_oprnd_size == SIZE_FIX_32)
+ size = 4;
+ else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
+ {
+ const struct cris_spec_reg *sregp
+ = spec_reg_info ((insn >> 12) & 15, disdata->distype);
+
+ /* FIXME: Improve error handling; should have been caught
+ earlier. */
+ if (sregp == NULL)
+ size = 4;
+ else
+ size = sregp->reg_size;
+ }
+ else
+ size = mode_size;
+
+ info->data_size = size;
+ }
+
+ *tp++ = '[';
+
+ if (prefix_opcodep
+ /* We don't match dip with a postincremented field
+ as a side-effect address mode. */
+ && ((insn & 0x400) == 0
+ || prefix_opcodep->match != DIP_OPCODE))
+ {
+ if (insn & 0x400)
+ {
+ tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
+ *tp++ = '=';
+ }
+
+
+ /* We mainly ignore the prefix format string when the
+ address-mode syntax is output. */
+ switch (prefix_opcodep->match)
+ {
+ case DIP_OPCODE:
+ /* It's [r], [r+] or [pc+]. */
+ if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
+ {
+ /* It's [pc+]. This cannot possibly be anything
+ but an address. */
+ unsigned long number
+ = prefix_buffer[2] + prefix_buffer[3] * 256
+ + prefix_buffer[4] * 65536
+ + prefix_buffer[5] * 0x1000000;
+
+ info->target = (bfd_vma) number;
+
+ /* Finish off and output previous formatted
+ data. */
+ *tp = 0;
+ tp = temp;
+ if (temp[0])
+ (*info->fprintf_func) (info->stream, "%s", temp);
+
+ (*info->print_address_func) ((bfd_vma) number, info);
+ }
+ else
+ {
+ /* For a memref in an address, we use target2.
+ In this case, target is zero. */
+ info->flags
+ |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
+ | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
+
+ info->target2 = prefix_insn & 15;
+
+ *tp++ = '[';
+ tp = format_reg (disdata, prefix_insn & 15, tp,
+ with_reg_prefix);
+ if (prefix_insn & 0x400)
+ *tp++ = '+';
+ *tp++ = ']';
+ }
+ break;
+
+ case BDAP_QUICK_OPCODE:
+ {
+ int number;
+
+ number = prefix_buffer[0];
+ if (number > 127)
+ number -= 256;
+
+ /* Output "reg+num" or, if num < 0, "reg-num". */
+ tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
+ with_reg_prefix);
+ if (number >= 0)
+ *tp++ = '+';
+ tp = format_dec (number, tp, 1);
+
+ info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
+ info->target = (prefix_insn >> 12) & 15;
+ info->target2 = (bfd_vma) number;
+ break;
+ }
+
+ case BIAP_OPCODE:
+ /* Output "r+R.m". */
+ tp = format_reg (disdata, prefix_insn & 15, tp,
+ with_reg_prefix);
+ *tp++ = '+';
+ tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
+ with_reg_prefix);
+ *tp++ = '.';
+ *tp++ = mode_char[(prefix_insn >> 4) & 3];
+
+ info->flags
+ |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
+ | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
+
+ | ((prefix_insn & 0x8000)
+ ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
+ : ((prefix_insn & 0x8000)
+ ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
+
+ /* Is it the casejump? It's a "adds.w [pc+r%d.w],pc". */
+ if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
+ /* Then start interpreting data as offsets. */
+ case_offset_counter = no_of_case_offsets;
+ break;
+
+ case BDAP_INDIR_OPCODE:
+ /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
+ "r-s". */
+ tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
+ with_reg_prefix);
+
+ if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
+ {
+ long number;
+ unsigned int nbytes;
+
+ /* It's a value. Get its size. */
+ int mode_size = 1 << ((prefix_insn >> 4) & 3);
+
+ if (mode_size == 1)
+ nbytes = 2;
+ else
+ nbytes = mode_size;
+
+ switch (nbytes)
+ {
+ case 1:
+ number = prefix_buffer[2];
+ if (number > 127)
+ number -= 256;
+ break;
+
+ case 2:
+ number = prefix_buffer[2] + prefix_buffer[3] * 256;
+ if (number > 32767)
+ number -= 65536;
+ break;
+
+ case 4:
+ number
+ = prefix_buffer[2] + prefix_buffer[3] * 256
+ + prefix_buffer[4] * 65536
+ + prefix_buffer[5] * 0x1000000;
+ break;
+
+ default:
+ strcpy (tp, "bug");
+ tp += 3;
+ number = 42;
+ }
+
+ info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
+ info->target2 = (bfd_vma) number;
+
+ /* If the size is dword, then assume it's an
+ address. */
+ if (nbytes == 4)
+ {
+ /* Finish off and output previous formatted
+ bytes. */
+ *tp++ = '+';
+ *tp = 0;
+ tp = temp;
+ (*info->fprintf_func) (info->stream, "%s", temp);
+
+ (*info->print_address_func) ((bfd_vma) number, info);
+ }
+ else
+ {
+ if (number >= 0)
+ *tp++ = '+';
+ tp = format_dec (number, tp, 1);
+ }
+ }
+ else
+ {
+ /* Output "r+[R].m" or "r+[R+].m". */
+ *tp++ = '+';
+ *tp++ = '[';
+ tp = format_reg (disdata, prefix_insn & 15, tp,
+ with_reg_prefix);
+ if (prefix_insn & 0x400)
+ *tp++ = '+';
+ *tp++ = ']';
+ *tp++ = '.';
+ *tp++ = mode_char[(prefix_insn >> 4) & 3];
+
+ info->flags
+ |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
+ | CRIS_DIS_FLAG_MEM_TARGET2_MEM
+ | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
+
+ | (((prefix_insn >> 4) == 2)
+ ? 0
+ : (((prefix_insn >> 4) & 3) == 1
+ ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
+ : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
+ }
+ break;
+
+ default:
+ (*info->fprintf_func) (info->stream, "?prefix-bug");
+ }
+
+ /* To mark that the prefix is used, reset it. */
+ prefix_opcodep = NULL;
+ }
+ else
+ {
+ tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
+
+ info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
+ info->target = insn & 15;
+
+ if (insn & 0x400)
+ *tp++ = '+';
+ }
+ *tp++ = ']';
+ }
+ break;
+
+ case 'x':
+ tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
+ *tp++ = '.';
+ *tp++ = mode_char[(insn >> 4) & 3];
+ break;
+
+ case 'I':
+ tp = format_dec (insn & 63, tp, 0);
+ break;
+
+ case 'b':
+ {
+ int where = buffer[2] + buffer[3] * 256;
+
+ if (where > 32767)
+ where -= 65536;
+
+ where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
+
+ if (insn == BA_PC_INCR_OPCODE)
+ info->insn_type = dis_branch;
+ else
+ info->insn_type = dis_condbranch;
+
+ info->target = (bfd_vma) where;
+
+ *tp = 0;
+ tp = temp;
+ (*info->fprintf_func) (info->stream, "%s%s ",
+ temp, cris_cc_strings[insn >> 12]);
+
+ (*info->print_address_func) ((bfd_vma) where, info);
+ }
+ break;
+
+ case 'c':
+ tp = format_dec (insn & 31, tp, 0);
+ break;
+
+ case 'C':
+ tp = format_dec (insn & 15, tp, 0);
+ break;
+
+ case 'o':
+ {
+ long offset = insn & 0xfe;
+ bfd_vma target;
+
+ if (insn & 1)
+ offset |= ~0xff;
+
+ if (opcodep->match == BA_QUICK_OPCODE)
+ info->insn_type = dis_branch;
+ else
+ info->insn_type = dis_condbranch;
+
+ target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
+ info->target = target;
+ *tp = 0;
+ tp = temp;
+ (*info->fprintf_func) (info->stream, "%s", temp);
+ (*info->print_address_func) (target, info);
+ }
+ break;
+
+ case 'Q':
+ case 'O':
+ {
+ long number = buffer[0];
+
+ if (number > 127)
+ number = number - 256;
+
+ tp = format_dec (number, tp, 1);
+ *tp++ = ',';
+ tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
+ }
+ break;
+
+ case 'f':
+ tp = print_flags (disdata, insn, tp);
+ break;
+
+ case 'i':
+ tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
+ break;
+
+ case 'P':
+ {
+ const struct cris_spec_reg *sregp
+ = spec_reg_info ((insn >> 12) & 15, disdata->distype);
+
+ if (sregp->name == NULL)
+ /* Should have been caught as a non-match eariler. */
+ *tp++ = '?';
+ else
+ {
+ if (with_reg_prefix)
+ *tp++ = REGISTER_PREFIX_CHAR;
+ strcpy (tp, sregp->name);
+ tp += strlen (tp);
+ }
+ }
+ break;
+
+ default:
+ strcpy (tp, "???");
+ tp += 3;
+ }
+ }
+
+ *tp = 0;
+
+ if (prefix_opcodep)
+ (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
+ prefix_opcodep->name, prefix_opcodep->args);
+
+ (*info->fprintf_func) (info->stream, "%s", temp);
+
+ /* Get info for matching case-tables, if we don't have any active.
+ We assume that the last constant seen is used; either in the insn
+ itself or in a "move.d const,rN, sub.d rN,rM"-like sequence. */
+ if (TRACE_CASE && case_offset_counter == 0)
+ {
+ if (CONST_STRNEQ (opcodep->name, "sub"))
+ case_offset = last_immediate;
+
+ /* It could also be an "add", if there are negative case-values. */
+ else if (CONST_STRNEQ (opcodep->name, "add"))
+ /* The first case is the negated operand to the add. */
+ case_offset = -last_immediate;
+
+ /* A bound insn will tell us the number of cases. */
+ else if (CONST_STRNEQ (opcodep->name, "bound"))
+ no_of_case_offsets = last_immediate + 1;
+
+ /* A jump or jsr or branch breaks the chain of insns for a
+ case-table, so assume default first-case again. */
+ else if (info->insn_type == dis_jsr
+ || info->insn_type == dis_branch
+ || info->insn_type == dis_condbranch)
+ case_offset = 0;
+ }
+}
+
+
+/* Print the CRIS instruction at address memaddr on stream. Returns
+ length of the instruction, in bytes. Prefix register names with `$' if
+ WITH_REG_PREFIX. */
+
+static int
+print_insn_cris_generic (bfd_vma memaddr,
+ disassemble_info *info,
+ bfd_boolean with_reg_prefix)
+{
+ int nbytes;
+ unsigned int insn;
+ const struct cris_opcode *matchedp;
+ int advance = 0;
+ struct cris_disasm_data *disdata
+ = (struct cris_disasm_data *) info->private_data;
+
+ /* No instruction will be disassembled as longer than this number of
+ bytes; stacked prefixes will not be expanded. */
+ unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
+ unsigned char *bufp;
+ int status = 0;
+ bfd_vma addr;
+
+ /* There will be an "out of range" error after the last instruction.
+ Reading pairs of bytes in decreasing number, we hope that we will get
+ at least the amount that we will consume.
+
+ If we can't get any data, or we do not get enough data, we print
+ the error message. */
+
+ nbytes = info->buffer_length;
+ if (nbytes > MAX_BYTES_PER_CRIS_INSN)
+ nbytes = MAX_BYTES_PER_CRIS_INSN;
+ status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);
+
+ /* If we did not get all we asked for, then clear the rest.
+ Hopefully this makes a reproducible result in case of errors. */
+ if (nbytes != MAX_BYTES_PER_CRIS_INSN)
+ memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
+
+ addr = memaddr;
+ bufp = buffer;
+
+ /* Set some defaults for the insn info. */
+ info->insn_info_valid = 1;
+ info->branch_delay_insns = 0;
+ info->data_size = 0;
+ info->insn_type = dis_nonbranch;
+ info->flags = 0;
+ info->target = 0;
+ info->target2 = 0;
+
+ /* If we got any data, disassemble it. */
+ if (nbytes != 0)
+ {
+ matchedp = NULL;
+
+ insn = bufp[0] + bufp[1] * 256;
+
+ /* If we're in a case-table, don't disassemble the offsets. */
+ if (TRACE_CASE && case_offset_counter != 0)
+ {
+ info->insn_type = dis_noninsn;
+ advance += 2;
+
+ /* If to print data as offsets, then shortcut here. */
+ (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
+ case_offset + no_of_case_offsets
+ - case_offset_counter,
+ case_offset_counter == 1 ? "/default" :
+ "");
+
+ (*info->print_address_func) ((bfd_vma)
+ ((short) (insn)
+ + (long) (addr
+ - (no_of_case_offsets
+ - case_offset_counter)
+ * 2)), info);
+ case_offset_counter--;
+
+ /* The default case start (without a "sub" or "add") must be
+ zero. */
+ if (case_offset_counter == 0)
+ case_offset = 0;
+ }
+ else if (insn == 0)
+ {
+ /* We're often called to disassemble zeroes. While this is a
+ valid "bcc .+2" insn, it is also useless enough and enough
+ of a nuiscance that we will just output "bcc .+2" for it
+ and signal it as a noninsn. */
+ (*info->fprintf_func) (info->stream,
+ disdata->distype == cris_dis_v32
+ ? "bcc ." : "bcc .+2");
+ info->insn_type = dis_noninsn;
+ advance += 2;
+ }
+ else
+ {
+ const struct cris_opcode *prefix_opcodep = NULL;
+ unsigned char *prefix_buffer = bufp;
+ unsigned int prefix_insn = insn;
+ int prefix_size = 0;
+
+ matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
+
+ /* Check if we're supposed to write out prefixes as address
+ modes and if this was a prefix. */
+ if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
+ {
+ /* If it's a prefix, put it into the prefix vars and get the
+ main insn. */
+ prefix_size = bytes_to_skip (prefix_insn, matchedp,
+ disdata->distype, NULL);
+ prefix_opcodep = matchedp;
+
+ insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
+ matchedp = get_opcode_entry (insn, prefix_insn, disdata);
+
+ if (matchedp != NULL)
+ {
+ addr += prefix_size;
+ bufp += prefix_size;
+ advance += prefix_size;
+ }
+ else
+ {
+ /* The "main" insn wasn't valid, at least not when
+ prefixed. Put back things enough to output the
+ prefix insn only, as a normal insn. */
+ matchedp = prefix_opcodep;
+ insn = prefix_insn;
+ prefix_opcodep = NULL;
+ }
+ }
+
+ if (matchedp == NULL)
+ {
+ (*info->fprintf_func) (info->stream, "??0x%x", insn);
+ advance += 2;
+
+ info->insn_type = dis_noninsn;
+ }
+ else
+ {
+ advance
+ += bytes_to_skip (insn, matchedp, disdata->distype,
+ prefix_opcodep);
+
+ /* The info_type and assorted fields will be set according
+ to the operands. */
+ print_with_operands (matchedp, insn, bufp, addr, info,
+ prefix_opcodep, prefix_insn,
+ prefix_buffer, with_reg_prefix);
+ }
+ }
+ }
+ else
+ info->insn_type = dis_noninsn;
+
+ /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
+ status when reading that much, and the insn decoding indicated a
+ length exceeding what we read, there is an error. */
+ if (status != 0 && (nbytes == 0 || advance > nbytes))
+ {
+ (*info->memory_error_func) (status, memaddr, info);
+ return -1;
+ }
+
+ /* Max supported insn size with one folded prefix insn. */
+ info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
+
+ /* I would like to set this to a fixed value larger than the actual
+ number of bytes to print in order to avoid spaces between bytes,
+ but objdump.c (2.9.1) does not like that, so we print 16-bit
+ chunks, which is the next choice. */
+ info->bytes_per_chunk = 2;
+
+ /* Printing bytes in order of increasing addresses makes sense,
+ especially on a little-endian target.
+ This is completely the opposite of what you think; setting this to
+ BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
+ we want. */
+ info->display_endian = BFD_ENDIAN_BIG;
+
+ return advance;
+}
+
+/* Disassemble, prefixing register names with `$'. CRIS v0..v10. */
+static int
+print_insn_cris_with_register_prefix (bfd_vma vma,
+ disassemble_info *info)
+{
+ if (info->private_data == NULL
+ && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
+ return -1;
+ return print_insn_cris_generic (vma, info, true);
+}
+/* Disassemble, prefixing register names with `$'. CRIS v32. */
+
+static int
+print_insn_crisv32_with_register_prefix (bfd_vma vma,
+ disassemble_info *info)
+{
+ if (info->private_data == NULL
+ && !cris_parse_disassembler_options (info, cris_dis_v32))
+ return -1;
+ return print_insn_cris_generic (vma, info, true);
+}
+
+#if 0
+/* Disassemble, prefixing register names with `$'.
+ Common v10 and v32 subset. */
+
+static int
+print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
+ disassemble_info *info)
+{
+ if (info->private_data == NULL
+ && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
+ return -1;
+ return print_insn_cris_generic (vma, info, true);
+}
+
+/* Disassemble, no prefixes on register names. CRIS v0..v10. */
+
+static int
+print_insn_cris_without_register_prefix (bfd_vma vma,
+ disassemble_info *info)
+{
+ if (info->private_data == NULL
+ && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
+ return -1;
+ return print_insn_cris_generic (vma, info, false);
+}
+
+/* Disassemble, no prefixes on register names. CRIS v32. */
+
+static int
+print_insn_crisv32_without_register_prefix (bfd_vma vma,
+ disassemble_info *info)
+{
+ if (info->private_data == NULL
+ && !cris_parse_disassembler_options (info, cris_dis_v32))
+ return -1;
+ return print_insn_cris_generic (vma, info, false);
+}
+
+/* Disassemble, no prefixes on register names.
+ Common v10 and v32 subset. */
+
+static int
+print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
+ disassemble_info *info)
+{
+ if (info->private_data == NULL
+ && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
+ return -1;
+ return print_insn_cris_generic (vma, info, false);
+}
+#endif
+
+int
+print_insn_crisv10 (bfd_vma vma,
+ disassemble_info *info)
+{
+ return print_insn_cris_with_register_prefix(vma, info);
+}
+
+int
+print_insn_crisv32 (bfd_vma vma,
+ disassemble_info *info)
+{
+ return print_insn_crisv32_with_register_prefix(vma, info);
+}
+
+/* Return a disassembler-function that prints registers with a `$' prefix,
+ or one that prints registers without a prefix.
+ FIXME: We should improve the solution to avoid the multitude of
+ functions seen above. */
+#if 0
+disassembler_ftype
+cris_get_disassembler (bfd *abfd)
+{
+ /* If there's no bfd in sight, we return what is valid as input in all
+ contexts if fed back to the assembler: disassembly *with* register
+ prefix. Unfortunately this will be totally wrong for v32. */
+ if (abfd == NULL)
+ return print_insn_cris_with_register_prefix;
+
+ if (bfd_get_symbol_leading_char (abfd) == 0)
+ {
+ if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
+ return print_insn_crisv32_with_register_prefix;
+ if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
+ return print_insn_crisv10_v32_with_register_prefix;
+
+ /* We default to v10. This may be specifically specified in the
+ bfd mach, but is also the default setting. */
+ return print_insn_cris_with_register_prefix;
+ }
+
+ if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
+ return print_insn_crisv32_without_register_prefix;
+ if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
+ return print_insn_crisv10_v32_without_register_prefix;
+ return print_insn_cris_without_register_prefix;
+}
+#endif
+/* Local variables:
+ eval: (c-set-style "gnu")
+ indent-tabs-mode: t
+ End: */
diff --git a/qemu-0.15.x/cursor.c b/qemu-0.15.x/cursor.c
new file mode 100644
index 0000000..dfb9eef
--- /dev/null
+++ b/qemu-0.15.x/cursor.c
@@ -0,0 +1,210 @@
+#include "qemu-common.h"
+#include "console.h"
+
+#include "cursor_hidden.xpm"
+#include "cursor_left_ptr.xpm"
+
+/* for creating built-in cursors */
+static QEMUCursor *cursor_parse_xpm(const char *xpm[])
+{
+ QEMUCursor *c;
+ uint32_t ctab[128];
+ unsigned int width, height, colors, chars;
+ unsigned int line = 0, i, r, g, b, x, y, pixel;
+ char name[16];
+ uint8_t idx;
+
+ /* parse header line: width, height, #colors, #chars */
+ if (sscanf(xpm[line], "%d %d %d %d", &width, &height, &colors, &chars) != 4) {
+ fprintf(stderr, "%s: header parse error: \"%s\"\n",
+ __FUNCTION__, xpm[line]);
+ return NULL;
+ }
+ if (chars != 1) {
+ fprintf(stderr, "%s: chars != 1 not supported\n", __FUNCTION__);
+ return NULL;
+ }
+ line++;
+
+ /* parse color table */
+ for (i = 0; i < colors; i++, line++) {
+ if (sscanf(xpm[line], "%c c %15s", &idx, name) == 2) {
+ if (sscanf(name, "#%02x%02x%02x", &r, &g, &b) == 3) {
+ ctab[idx] = (0xff << 24) | (b << 16) | (g << 8) | r;
+ continue;
+ }
+ if (strcmp(name, "None") == 0) {
+ ctab[idx] = 0x00000000;
+ continue;
+ }
+ }
+ fprintf(stderr, "%s: color parse error: \"%s\"\n",
+ __FUNCTION__, xpm[line]);
+ return NULL;
+ }
+
+ /* parse pixel data */
+ c = cursor_alloc(width, height);
+ for (pixel = 0, y = 0; y < height; y++, line++) {
+ for (x = 0; x < height; x++, pixel++) {
+ idx = xpm[line][x];
+ c->data[pixel] = ctab[idx];
+ }
+ }
+ return c;
+}
+
+/* nice for debugging */
+void cursor_print_ascii_art(QEMUCursor *c, const char *prefix)
+{
+ uint32_t *data = c->data;
+ int x,y;
+
+ for (y = 0; y < c->height; y++) {
+ fprintf(stderr, "%s: %2d: |", prefix, y);
+ for (x = 0; x < c->width; x++, data++) {
+ if ((*data & 0xff000000) != 0xff000000) {
+ fprintf(stderr, " "); /* transparent */
+ } else if ((*data & 0x00ffffff) == 0x00ffffff) {
+ fprintf(stderr, "."); /* white */
+ } else if ((*data & 0x00ffffff) == 0x00000000) {
+ fprintf(stderr, "X"); /* black */
+ } else {
+ fprintf(stderr, "o"); /* other */
+ }
+ }
+ fprintf(stderr, "|\n");
+ }
+}
+
+QEMUCursor *cursor_builtin_hidden(void)
+{
+ QEMUCursor *c;
+
+ c = cursor_parse_xpm(cursor_hidden_xpm);
+ return c;
+}
+
+QEMUCursor *cursor_builtin_left_ptr(void)
+{
+ QEMUCursor *c;
+
+ c = cursor_parse_xpm(cursor_left_ptr_xpm);
+ return c;
+}
+
+QEMUCursor *cursor_alloc(int width, int height)
+{
+ QEMUCursor *c;
+ int datasize = width * height * sizeof(uint32_t);
+
+ c = qemu_mallocz(sizeof(QEMUCursor) + datasize);
+ c->width = width;
+ c->height = height;
+ c->refcount = 1;
+ return c;
+}
+
+void cursor_get(QEMUCursor *c)
+{
+ c->refcount++;
+}
+
+void cursor_put(QEMUCursor *c)
+{
+ if (c == NULL)
+ return;
+ c->refcount--;
+ if (c->refcount)
+ return;
+ qemu_free(c);
+}
+
+int cursor_get_mono_bpl(QEMUCursor *c)
+{
+ return (c->width + 7) / 8;
+}
+
+void cursor_set_mono(QEMUCursor *c,
+ uint32_t foreground, uint32_t background, uint8_t *image,
+ int transparent, uint8_t *mask)
+{
+ uint32_t *data = c->data;
+ uint8_t bit;
+ int x,y,bpl;
+
+ bpl = cursor_get_mono_bpl(c);
+ for (y = 0; y < c->height; y++) {
+ bit = 0x80;
+ for (x = 0; x < c->width; x++, data++) {
+ if (transparent && mask[x/8] & bit) {
+ *data = 0x00000000;
+ } else if (!transparent && !(mask[x/8] & bit)) {
+ *data = 0x00000000;
+ } else if (image[x/8] & bit) {
+ *data = 0xff000000 | foreground;
+ } else {
+ *data = 0xff000000 | background;
+ }
+ bit >>= 1;
+ if (bit == 0) {
+ bit = 0x80;
+ }
+ }
+ mask += bpl;
+ image += bpl;
+ }
+}
+
+void cursor_get_mono_image(QEMUCursor *c, int foreground, uint8_t *image)
+{
+ uint32_t *data = c->data;
+ uint8_t bit;
+ int x,y,bpl;
+
+ bpl = cursor_get_mono_bpl(c);
+ memset(image, 0, bpl * c->height);
+ for (y = 0; y < c->height; y++) {
+ bit = 0x80;
+ for (x = 0; x < c->width; x++, data++) {
+ if (((*data & 0xff000000) == 0xff000000) &&
+ ((*data & 0x00ffffff) == foreground)) {
+ image[x/8] |= bit;
+ }
+ bit >>= 1;
+ if (bit == 0) {
+ bit = 0x80;
+ }
+ }
+ image += bpl;
+ }
+}
+
+void cursor_get_mono_mask(QEMUCursor *c, int transparent, uint8_t *mask)
+{
+ uint32_t *data = c->data;
+ uint8_t bit;
+ int x,y,bpl;
+
+ bpl = cursor_get_mono_bpl(c);
+ memset(mask, 0, bpl * c->height);
+ for (y = 0; y < c->height; y++) {
+ bit = 0x80;
+ for (x = 0; x < c->width; x++, data++) {
+ if ((*data & 0xff000000) != 0xff000000) {
+ if (transparent != 0) {
+ mask[x/8] |= bit;
+ }
+ } else {
+ if (transparent == 0) {
+ mask[x/8] |= bit;
+ }
+ }
+ bit >>= 1;
+ if (bit == 0) {
+ bit = 0x80;
+ }
+ }
+ mask += bpl;
+ }
+}
diff --git a/qemu-0.15.x/cursor_hidden.xpm b/qemu-0.15.x/cursor_hidden.xpm
new file mode 100644
index 0000000..354e7a9
--- /dev/null
+++ b/qemu-0.15.x/cursor_hidden.xpm
@@ -0,0 +1,37 @@
+/* XPM */
+static const char *cursor_hidden_xpm[] = {
+ "32 32 1 1",
+ " c None",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+};
diff --git a/qemu-0.15.x/cursor_left_ptr.xpm b/qemu-0.15.x/cursor_left_ptr.xpm
new file mode 100644
index 0000000..6c9ada9
--- /dev/null
+++ b/qemu-0.15.x/cursor_left_ptr.xpm
@@ -0,0 +1,39 @@
+/* XPM */
+static const char *cursor_left_ptr_xpm[] = {
+ "32 32 3 1",
+ "X c #000000",
+ ". c #ffffff",
+ " c None",
+ "X ",
+ "XX ",
+ "X.X ",
+ "X..X ",
+ "X...X ",
+ "X....X ",
+ "X.....X ",
+ "X......X ",
+ "X.......X ",
+ "X........X ",
+ "X.....XXXXX ",
+ "X..X..X ",
+ "X.X X..X ",
+ "XX X..X ",
+ "X X..X ",
+ " X..X ",
+ " X..X ",
+ " X..X ",
+ " XX ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+ " ",
+};
diff --git a/qemu-0.15.x/cutils.c b/qemu-0.15.x/cutils.c
new file mode 100644
index 0000000..f9a7e36
--- /dev/null
+++ b/qemu-0.15.x/cutils.c
@@ -0,0 +1,411 @@
+/*
+ * Simple C functions to supplement the C library
+ *
+ * Copyright (c) 2006 Fabrice Bellard
+ *
+ * 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.
+ */
+#include "qemu-common.h"
+#include "host-utils.h"
+#include <math.h>
+
+void pstrcpy(char *buf, int buf_size, const char *str)
+{
+ int c;
+ char *q = buf;
+
+ if (buf_size <= 0)
+ return;
+
+ for(;;) {
+ c = *str++;
+ if (c == 0 || q >= buf + buf_size - 1)
+ break;
+ *q++ = c;
+ }
+ *q = '\0';
+}
+
+/* strcat and truncate. */
+char *pstrcat(char *buf, int buf_size, const char *s)
+{
+ int len;
+ len = strlen(buf);
+ if (len < buf_size)
+ pstrcpy(buf + len, buf_size - len, s);
+ return buf;
+}
+
+int strstart(const char *str, const char *val, const char **ptr)
+{
+ const char *p, *q;
+ p = str;
+ q = val;
+ while (*q != '\0') {
+ if (*p != *q)
+ return 0;
+ p++;
+ q++;
+ }
+ if (ptr)
+ *ptr = p;
+ return 1;
+}
+
+int stristart(const char *str, const char *val, const char **ptr)
+{
+ const char *p, *q;
+ p = str;
+ q = val;
+ while (*q != '\0') {
+ if (qemu_toupper(*p) != qemu_toupper(*q))
+ return 0;
+ p++;
+ q++;
+ }
+ if (ptr)
+ *ptr = p;
+ return 1;
+}
+
+/* XXX: use host strnlen if available ? */
+int qemu_strnlen(const char *s, int max_len)
+{
+ int i;
+
+ for(i = 0; i < max_len; i++) {
+ if (s[i] == '\0') {
+ break;
+ }
+ }
+ return i;
+}
+
+time_t mktimegm(struct tm *tm)
+{
+ time_t t;
+ int y = tm->tm_year + 1900, m = tm->tm_mon + 1, d = tm->tm_mday;
+ if (m < 3) {
+ m += 12;
+ y--;
+ }
+ t = 86400 * (d + (153 * m - 457) / 5 + 365 * y + y / 4 - y / 100 +
+ y / 400 - 719469);
+ t += 3600 * tm->tm_hour + 60 * tm->tm_min + tm->tm_sec;
+ return t;
+}
+
+int qemu_fls(int i)
+{
+ return 32 - clz32(i);
+}
+
+/*
+ * Make sure data goes on disk, but if possible do not bother to
+ * write out the inode just for timestamp updates.
+ *
+ * Unfortunately even in 2009 many operating systems do not support
+ * fdatasync and have to fall back to fsync.
+ */
+int qemu_fdatasync(int fd)
+{
+#ifdef CONFIG_FDATASYNC
+ return fdatasync(fd);
+#else
+ return fsync(fd);
+#endif
+}
+
+/* io vectors */
+
+void qemu_iovec_init(QEMUIOVector *qiov, int alloc_hint)
+{
+ qiov->iov = qemu_malloc(alloc_hint * sizeof(struct iovec));
+ qiov->niov = 0;
+ qiov->nalloc = alloc_hint;
+ qiov->size = 0;
+}
+
+void qemu_iovec_init_external(QEMUIOVector *qiov, struct iovec *iov, int niov)
+{
+ int i;
+
+ qiov->iov = iov;
+ qiov->niov = niov;
+ qiov->nalloc = -1;
+ qiov->size = 0;
+ for (i = 0; i < niov; i++)
+ qiov->size += iov[i].iov_len;
+}
+
+void qemu_iovec_add(QEMUIOVector *qiov, void *base, size_t len)
+{
+ assert(qiov->nalloc != -1);
+
+ if (qiov->niov == qiov->nalloc) {
+ qiov->nalloc = 2 * qiov->nalloc + 1;
+ qiov->iov = qemu_realloc(qiov->iov, qiov->nalloc * sizeof(struct iovec));
+ }
+ qiov->iov[qiov->niov].iov_base = base;
+ qiov->iov[qiov->niov].iov_len = len;
+ qiov->size += len;
+ ++qiov->niov;
+}
+
+/*
+ * Copies iovecs from src to the end of dst. It starts copying after skipping
+ * the given number of bytes in src and copies until src is completely copied
+ * or the total size of the copied iovec reaches size.The size of the last
+ * copied iovec is changed in order to fit the specified total size if it isn't
+ * a perfect fit already.
+ */
+void qemu_iovec_copy(QEMUIOVector *dst, QEMUIOVector *src, uint64_t skip,
+ size_t size)
+{
+ int i;
+ size_t done;
+ void *iov_base;
+ uint64_t iov_len;
+
+ assert(dst->nalloc != -1);
+
+ done = 0;
+ for (i = 0; (i < src->niov) && (done != size); i++) {
+ if (skip >= src->iov[i].iov_len) {
+ /* Skip the whole iov */
+ skip -= src->iov[i].iov_len;
+ continue;
+ } else {
+ /* Skip only part (or nothing) of the iov */
+ iov_base = (uint8_t*) src->iov[i].iov_base + skip;
+ iov_len = src->iov[i].iov_len - skip;
+ skip = 0;
+ }
+
+ if (done + iov_len > size) {
+ qemu_iovec_add(dst, iov_base, size - done);
+ break;
+ } else {
+ qemu_iovec_add(dst, iov_base, iov_len);
+ }
+ done += iov_len;
+ }
+}
+
+void qemu_iovec_concat(QEMUIOVector *dst, QEMUIOVector *src, size_t size)
+{
+ qemu_iovec_copy(dst, src, 0, size);
+}
+
+void qemu_iovec_destroy(QEMUIOVector *qiov)
+{
+ assert(qiov->nalloc != -1);
+
+ qemu_free(qiov->iov);
+}
+
+void qemu_iovec_reset(QEMUIOVector *qiov)
+{
+ assert(qiov->nalloc != -1);
+
+ qiov->niov = 0;
+ qiov->size = 0;
+}
+
+void qemu_iovec_to_buffer(QEMUIOVector *qiov, void *buf)
+{
+ uint8_t *p = (uint8_t *)buf;
+ int i;
+
+ for (i = 0; i < qiov->niov; ++i) {
+ memcpy(p, qiov->iov[i].iov_base, qiov->iov[i].iov_len);
+ p += qiov->iov[i].iov_len;
+ }
+}
+
+void qemu_iovec_from_buffer(QEMUIOVector *qiov, const void *buf, size_t count)
+{
+ const uint8_t *p = (const uint8_t *)buf;
+ size_t copy;
+ int i;
+
+ for (i = 0; i < qiov->niov && count; ++i) {
+ copy = count;
+ if (copy > qiov->iov[i].iov_len)
+ copy = qiov->iov[i].iov_len;
+ memcpy(qiov->iov[i].iov_base, p, copy);
+ p += copy;
+ count -= copy;
+ }
+}
+
+void qemu_iovec_memset(QEMUIOVector *qiov, int c, size_t count)
+{
+ size_t n;
+ int i;
+
+ for (i = 0; i < qiov->niov && count; ++i) {
+ n = MIN(count, qiov->iov[i].iov_len);
+ memset(qiov->iov[i].iov_base, c, n);
+ count -= n;
+ }
+}
+
+void qemu_iovec_memset_skip(QEMUIOVector *qiov, int c, size_t count,
+ size_t skip)
+{
+ int i;
+ size_t done;
+ void *iov_base;
+ uint64_t iov_len;
+
+ done = 0;
+ for (i = 0; (i < qiov->niov) && (done != count); i++) {
+ if (skip >= qiov->iov[i].iov_len) {
+ /* Skip the whole iov */
+ skip -= qiov->iov[i].iov_len;
+ continue;
+ } else {
+ /* Skip only part (or nothing) of the iov */
+ iov_base = (uint8_t*) qiov->iov[i].iov_base + skip;
+ iov_len = qiov->iov[i].iov_len - skip;
+ skip = 0;
+ }
+
+ if (done + iov_len > count) {
+ memset(iov_base, c, count - done);
+ break;
+ } else {
+ memset(iov_base, c, iov_len);
+ }
+ done += iov_len;
+ }
+}
+
+#ifndef _WIN32
+/* Sets a specific flag */
+int fcntl_setfl(int fd, int flag)
+{
+ int flags;
+
+ flags = fcntl(fd, F_GETFL);
+ if (flags == -1)
+ return -errno;
+
+ if (fcntl(fd, F_SETFL, flags | flag) == -1)
+ return -errno;
+
+ return 0;
+}
+#endif
+
+/*
+ * Convert string to bytes, allowing either B/b for bytes, K/k for KB,
+ * M/m for MB, G/g for GB or T/t for TB. Default without any postfix
+ * is MB. End pointer will be returned in *end, if not NULL. A valid
+ * value must be terminated by whitespace, ',' or '\0'. Return -1 on
+ * error.
+ */
+int64_t strtosz_suffix(const char *nptr, char **end, const char default_suffix)
+{
+ int64_t retval = -1;
+ char *endptr;
+ unsigned char c, d;
+ int mul_required = 0;
+ double val, mul, integral, fraction;
+
+ errno = 0;
+ val = strtod(nptr, &endptr);
+ if (isnan(val) || endptr == nptr || errno != 0) {
+ goto fail;
+ }
+ fraction = modf(val, &integral);
+ if (fraction != 0) {
+ mul_required = 1;
+ }
+ /*
+ * Any whitespace character is fine for terminating the number,
+ * in addition we accept ',' to handle strings where the size is
+ * part of a multi token argument.
+ */
+ c = *endptr;
+ d = c;
+ if (qemu_isspace(c) || c == '\0' || c == ',') {
+ c = 0;
+ if (default_suffix) {
+ d = default_suffix;
+ } else {
+ d = c;
+ }
+ }
+ switch (qemu_toupper(d)) {
+ case STRTOSZ_DEFSUFFIX_B:
+ mul = 1;
+ if (mul_required) {
+ goto fail;
+ }
+ break;
+ case STRTOSZ_DEFSUFFIX_KB:
+ mul = 1 << 10;
+ break;
+ case 0:
+ if (mul_required) {
+ goto fail;
+ }
+ case STRTOSZ_DEFSUFFIX_MB:
+ mul = 1ULL << 20;
+ break;
+ case STRTOSZ_DEFSUFFIX_GB:
+ mul = 1ULL << 30;
+ break;
+ case STRTOSZ_DEFSUFFIX_TB:
+ mul = 1ULL << 40;
+ break;
+ default:
+ goto fail;
+ }
+ /*
+ * If not terminated by whitespace, ',', or \0, increment endptr
+ * to point to next character, then check that we are terminated
+ * by an appropriate separating character, ie. whitespace, ',', or
+ * \0. If not, we are seeing trailing garbage, thus fail.
+ */
+ if (c != 0) {
+ endptr++;
+ if (!qemu_isspace(*endptr) && *endptr != ',' && *endptr != 0) {
+ goto fail;
+ }
+ }
+ if ((val * mul >= INT64_MAX) || val < 0) {
+ goto fail;
+ }
+ retval = val * mul;
+
+fail:
+ if (end) {
+ *end = endptr;
+ }
+
+ return retval;
+}
+
+int64_t strtosz(const char *nptr, char **end)
+{
+ return strtosz_suffix(nptr, end, STRTOSZ_DEFSUFFIX_MB);
+}
diff --git a/qemu-0.15.x/darwin-user/commpage.c b/qemu-0.15.x/darwin-user/commpage.c
new file mode 100644
index 0000000..cc29bdd
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/commpage.c
@@ -0,0 +1,357 @@
+ /*
+ * Commpage syscalls
+ *
+ * Copyright (c) 2006 Pierre d'Herbemont
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <mach/message.h>
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+#include <sys/time.h>
+#include <sys/mman.h>
+#include <libkern/OSAtomic.h>
+
+#include "qemu.h"
+
+//#define DEBUG_COMMPAGE
+
+#ifdef DEBUG_COMMPAGE
+# define DPRINTF(...) do { qemu_log(__VA_ARGS__); printf(__VA_ARGS__); } while(0)
+#else
+# define DPRINTF(...) do { qemu_log(__VA_ARGS__); } while(0)
+#endif
+
+/********************************************************************
+ * Commpage definitions
+ */
+#ifdef TARGET_I386
+/* Reserve space for the commpage see xnu/osfmk/i386/cpu_capabilities.h */
+# define COMMPAGE_START (-16 * 4096) /* base address is -20 * 4096 */
+# define COMMPAGE_SIZE (0x1240) /* _COMM_PAGE_AREA_LENGTH is 19 * 4096 */
+#elif defined(TARGET_PPC)
+/* Reserve space for the commpage see xnu/osfmk/ppc/cpu_capabilities.h */
+# define COMMPAGE_START (-8*4096)
+# define COMMPAGE_SIZE (2*4096) /* its _COMM_PAGE_AREA_USED but _COMM_PAGE_AREA_LENGTH is 7*4096 */
+#endif
+
+void do_compare_and_swap32(void *cpu_env, int num);
+void do_compare_and_swap64(void *cpu_env, int num);
+void do_add_atomic_word32(void *cpu_env, int num);
+void do_cgettimeofday(void *cpu_env, int num, uint32_t arg1);
+void do_nanotime(void *cpu_env, int num);
+
+void unimpl_commpage(void *cpu_env, int num);
+
+typedef void (*commpage_8args_function_t)(uint32_t arg1, uint32_t arg2, uint32_t arg3,
+ uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7,
+ uint32_t arg8);
+typedef void (*commpage_indirect_function_t)(void *cpu_env, int num, uint32_t arg1,
+ uint32_t arg2, uint32_t arg3, uint32_t arg4, uint32_t arg5,
+ uint32_t arg6, uint32_t arg7, uint32_t arg8);
+
+#define HAS_PTR 0x10
+#define NO_PTR 0x20
+#define CALL_DIRECT 0x1
+#define CALL_INDIRECT 0x2
+
+#define COMMPAGE_ENTRY(name, nargs, offset, func, options) \
+ { #name, offset, nargs, options, (commpage_8args_function_t)func }
+
+struct commpage_entry {
+ char * name;
+ int offset;
+ int nargs;
+ char options;
+ commpage_8args_function_t function;
+};
+
+static inline int commpage_code_num(struct commpage_entry *entry)
+{
+ if((entry->options & HAS_PTR))
+ return entry->offset + 4;
+ else
+ return entry->offset;
+}
+
+static inline int commpage_is_indirect(struct commpage_entry *entry)
+{
+ return !(entry->options & CALL_DIRECT);
+}
+
+/********************************************************************
+ * Commpage entry
+ */
+static struct commpage_entry commpage_entries[] =
+{
+ COMMPAGE_ENTRY(compare_and_swap32, 0, 0x080, do_compare_and_swap32, CALL_INDIRECT | HAS_PTR),
+ COMMPAGE_ENTRY(compare_and_swap64, 0, 0x0c0, do_compare_and_swap64, CALL_INDIRECT | HAS_PTR),
+ COMMPAGE_ENTRY(enqueue, 0, 0x100, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(dequeue, 0, 0x140, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(memory_barrier, 0, 0x180, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(add_atomic_word32, 0, 0x1a0, do_add_atomic_word32, CALL_INDIRECT | HAS_PTR),
+ COMMPAGE_ENTRY(add_atomic_word64, 0, 0x1c0, unimpl_commpage, CALL_INDIRECT | HAS_PTR),
+
+ COMMPAGE_ENTRY(mach_absolute_time, 0, 0x200, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(spinlock_try, 1, 0x220, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(spinlock_lock, 1, 0x260, OSSpinLockLock, CALL_DIRECT),
+ COMMPAGE_ENTRY(spinlock_unlock, 1, 0x2a0, OSSpinLockUnlock, CALL_DIRECT),
+ COMMPAGE_ENTRY(pthread_getspecific, 0, 0x2c0, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(gettimeofday, 1, 0x2e0, do_cgettimeofday, CALL_INDIRECT),
+ COMMPAGE_ENTRY(sys_dcache_flush, 0, 0x4e0, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(sys_icache_invalidate, 0, 0x520, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(pthread_self, 0, 0x580, unimpl_commpage, CALL_INDIRECT),
+
+ COMMPAGE_ENTRY(relinquish, 0, 0x5c0, unimpl_commpage, CALL_INDIRECT),
+
+#ifdef TARGET_I386
+ COMMPAGE_ENTRY(bts, 0, 0x5e0, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(btc, 0, 0x5f0, unimpl_commpage, CALL_INDIRECT),
+#endif
+
+ COMMPAGE_ENTRY(bzero, 2, 0x600, bzero, CALL_DIRECT),
+ COMMPAGE_ENTRY(bcopy, 3, 0x780, bcopy, CALL_DIRECT),
+ COMMPAGE_ENTRY(memcpy, 3, 0x7a0, memcpy, CALL_DIRECT),
+
+#ifdef TARGET_I386
+ COMMPAGE_ENTRY(old_nanotime, 0, 0xf80, do_nanotime, CALL_INDIRECT),
+ COMMPAGE_ENTRY(memset_pattern, 0, 0xf80, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(long_copy, 0, 0x1200, unimpl_commpage, CALL_INDIRECT),
+
+ COMMPAGE_ENTRY(sysintegrity, 0, 0x1600, unimpl_commpage, CALL_INDIRECT),
+
+ COMMPAGE_ENTRY(nanotime, 0, 0x1700, do_nanotime, CALL_INDIRECT),
+#elif TARGET_PPC
+ COMMPAGE_ENTRY(compare_and_swap32b, 0, 0xf80, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(compare_and_swap64b, 0, 0xfc0, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(memset_pattern, 0, 0x1000, unimpl_commpage, CALL_INDIRECT),
+ COMMPAGE_ENTRY(bigcopy, 0, 0x1140, unimpl_commpage, CALL_INDIRECT),
+#endif
+};
+
+
+/********************************************************************
+ * Commpage backdoor
+ */
+static inline void print_commpage_entry(struct commpage_entry entry)
+{
+ printf("@0x%x %s\n", entry.offset, entry.name);
+}
+
+static inline void install_commpage_backdoor_for_entry(struct commpage_entry entry)
+{
+#ifdef TARGET_I386
+ char * commpage = (char*)(COMMPAGE_START+entry.offset);
+ int c = 0;
+ if(entry.options & HAS_PTR)
+ {
+ commpage[c++] = (COMMPAGE_START+entry.offset+4) & 0xff;
+ commpage[c++] = ((COMMPAGE_START+entry.offset+4) >> 8) & 0xff;
+ commpage[c++] = ((COMMPAGE_START+entry.offset+4) >> 16) & 0xff;
+ commpage[c++] = ((COMMPAGE_START+entry.offset+4) >> 24) & 0xff;
+ }
+ commpage[c++] = 0xcd;
+ commpage[c++] = 0x79; /* int 0x79 */
+ commpage[c++] = 0xc3; /* ret */
+#else
+ qerror("can't install the commpage on this arch\n");
+#endif
+}
+
+/********************************************************************
+ * Commpage initialization
+ */
+void commpage_init(void)
+{
+#if (defined(__i386__) ^ defined(TARGET_I386)) || (defined(_ARCH_PPC) ^ defined(TARGET_PPC))
+ int i;
+ void * commpage = (void *)target_mmap( COMMPAGE_START, COMMPAGE_SIZE,
+ PROT_WRITE | PROT_READ, MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+ if((int)commpage != COMMPAGE_START)
+ qerror("can't allocate the commpage\n");
+
+ bzero(commpage, COMMPAGE_SIZE);
+
+ /* XXX: commpage data not handled */
+
+ for(i = 0; i < ARRAY_SIZE(commpage_entries); i++)
+ install_commpage_backdoor_for_entry(commpage_entries[i]);
+#else
+ /* simply map our pages so they can be executed
+ XXX: we don't really want to do that since in the ppc on ppc situation we may
+ not able to run commpages host optimized instructions (like G5's on a G5),
+ hence this is sometimes a broken fix. */
+ page_set_flags(COMMPAGE_START, COMMPAGE_START+COMMPAGE_SIZE, PROT_EXEC | PROT_READ | PAGE_VALID);
+#endif
+}
+
+/********************************************************************
+ * Commpage implementation
+ */
+void do_compare_and_swap32(void *cpu_env, int num)
+{
+#ifdef TARGET_I386
+ uint32_t old = ((CPUX86State*)cpu_env)->regs[R_EAX];
+ uint32_t *value = (uint32_t*)((CPUX86State*)cpu_env)->regs[R_ECX];
+ DPRINTF("commpage: compare_and_swap32(%x,new,%p)\n", old, value);
+
+ if(old == tswap32(*value))
+ {
+ uint32_t new = ((CPUX86State*)cpu_env)->regs[R_EDX];
+ *value = tswap32(new);
+ /* set zf flag */
+ ((CPUX86State*)cpu_env)->eflags |= 0x40;
+ }
+ else
+ {
+ ((CPUX86State*)cpu_env)->regs[R_EAX] = tswap32(*value);
+ /* unset zf flag */
+ ((CPUX86State*)cpu_env)->eflags &= ~0x40;
+ }
+#else
+ qerror("do_compare_and_swap32 unimplemented");
+#endif
+}
+
+void do_compare_and_swap64(void *cpu_env, int num)
+{
+#ifdef TARGET_I386
+ /* OSAtomicCompareAndSwap64 is not available on non 64 bits ppc, here is a raw implementation */
+ uint64_t old, new, swapped_val;
+ uint64_t *value = (uint64_t*)((CPUX86State*)cpu_env)->regs[R_ESI];
+ old = (uint64_t)((uint64_t)((CPUX86State*)cpu_env)->regs[R_EDX]) << 32 | (uint64_t)((CPUX86State*)cpu_env)->regs[R_EAX];
+
+ DPRINTF("commpage: compare_and_swap64(%" PRIx64 ",new,%p)\n", old, value);
+ swapped_val = tswap64(*value);
+
+ if(old == swapped_val)
+ {
+ new = (uint64_t)((uint64_t)((CPUX86State*)cpu_env)->regs[R_ECX]) << 32 | (uint64_t)((CPUX86State*)cpu_env)->regs[R_EBX];
+ *value = tswap64(new);
+ /* set zf flag */
+ ((CPUX86State*)cpu_env)->eflags |= 0x40;
+ }
+ else
+ {
+ ((CPUX86State*)cpu_env)->regs[R_EAX] = (uint32_t)(swapped_val);
+ ((CPUX86State*)cpu_env)->regs[R_EDX] = (uint32_t)(swapped_val >> 32);
+ /* unset zf flag */
+ ((CPUX86State*)cpu_env)->eflags &= ~0x40;
+ }
+#else
+ qerror("do_compare_and_swap64 unimplemented");
+#endif
+}
+
+void do_add_atomic_word32(void *cpu_env, int num)
+{
+#ifdef TARGET_I386
+ uint32_t amt = ((CPUX86State*)cpu_env)->regs[R_EAX];
+ uint32_t *value = (uint32_t*)((CPUX86State*)cpu_env)->regs[R_EDX];
+ uint32_t swapped_value = tswap32(*value);
+
+ DPRINTF("commpage: add_atomic_word32(%x,%p)\n", amt, value);
+
+ /* old value in EAX */
+ ((CPUX86State*)cpu_env)->regs[R_EAX] = swapped_value;
+ *value = tswap32(swapped_value + amt);
+#else
+ qerror("do_add_atomic_word32 unimplemented");
+#endif
+}
+
+void do_cgettimeofday(void *cpu_env, int num, uint32_t arg1)
+{
+#ifdef TARGET_I386
+ extern int __commpage_gettimeofday(struct timeval *);
+ DPRINTF("commpage: gettimeofday(0x%x)\n", arg1);
+ struct timeval *time = (struct timeval *)arg1;
+ int ret = __commpage_gettimeofday(time);
+ tswap32s((uint32_t*)&time->tv_sec);
+ tswap32s((uint32_t*)&time->tv_usec);
+ ((CPUX86State*)cpu_env)->regs[R_EAX] = ret; /* Success */
+#else
+ qerror("do_gettimeofday unimplemented");
+#endif
+}
+
+void do_nanotime(void *cpu_env, int num)
+{
+#ifdef TARGET_I386
+ uint64_t t = mach_absolute_time();
+ ((CPUX86State*)cpu_env)->regs[R_EAX] = (int)(t & 0xffffffff);
+ ((CPUX86State*)cpu_env)->regs[R_EDX] = (int)((t >> 32) & 0xffffffff);
+#else
+ qerror("do_nanotime unimplemented");
+#endif
+}
+
+void unimpl_commpage(void *cpu_env, int num)
+{
+ qerror("qemu: commpage function 0x%x not implemented\n", num);
+}
+
+/********************************************************************
+ * do_commpage - called by the main cpu loop
+ */
+void
+do_commpage(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3,
+ uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7,
+ uint32_t arg8)
+{
+ int i, found = 0;
+
+ arg1 = tswap32(arg1);
+ arg2 = tswap32(arg2);
+ arg3 = tswap32(arg3);
+ arg4 = tswap32(arg4);
+ arg5 = tswap32(arg5);
+ arg6 = tswap32(arg6);
+ arg7 = tswap32(arg7);
+ arg8 = tswap32(arg8);
+
+ num = num-COMMPAGE_START-2;
+
+ for(i = 0; i < ARRAY_SIZE(commpage_entries); i++) {
+ if( num == commpage_code_num(&commpage_entries[i]) )
+ {
+ DPRINTF("commpage: %s %s\n", commpage_entries[i].name, commpage_is_indirect(&commpage_entries[i]) ? "[indirect]" : "[direct]");
+ found = 1;
+ if(commpage_is_indirect(&commpage_entries[i]))
+ {
+ commpage_indirect_function_t function = (commpage_indirect_function_t)commpage_entries[i].function;
+ function(cpu_env, num, arg1, arg2, arg3,
+ arg4, arg5, arg6, arg7, arg8);
+ }
+ else
+ {
+ commpage_entries[i].function(arg1, arg2, arg3,
+ arg4, arg5, arg6, arg7, arg8);
+ }
+ break;
+ }
+ }
+
+ if(!found)
+ {
+ gemu_log("qemu: commpage function 0x%x not defined\n", num);
+ gdb_handlesig (cpu_env, SIGTRAP);
+ exit(-1);
+ }
+}
diff --git a/qemu-0.15.x/darwin-user/ioctls.h b/qemu-0.15.x/darwin-user/ioctls.h
new file mode 100644
index 0000000..dc73af2
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/ioctls.h
@@ -0,0 +1,4 @@
+ /* emulated ioctl list */
+
+ IOCTL(TIOCGETA, IOC_R, MK_PTR(MK_STRUCT(STRUCT_termios)))
+ IOCTL(TIOCSETA, IOC_W, MK_PTR(MK_STRUCT(STRUCT_termios)))
diff --git a/qemu-0.15.x/darwin-user/ioctls_types.h b/qemu-0.15.x/darwin-user/ioctls_types.h
new file mode 100644
index 0000000..014561a
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/ioctls_types.h
@@ -0,0 +1 @@
+STRUCT(termios, TYPE_INT, TYPE_INT, TYPE_INT, TYPE_INT, MK_ARRAY(TYPE_CHAR, 20), TYPE_INT, TYPE_INT)
diff --git a/qemu-0.15.x/darwin-user/machload.c b/qemu-0.15.x/darwin-user/machload.c
new file mode 100644
index 0000000..3bc3b65
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/machload.c
@@ -0,0 +1,902 @@
+/*
+ * Mach-O object file loading
+ *
+ * Copyright (c) 2006 Pierre d'Herbemont
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "qemu.h"
+#include "disas.h"
+
+#include <mach-o/loader.h>
+#include <mach-o/fat.h>
+#include <mach-o/nlist.h>
+#include <mach-o/reloc.h>
+#include <mach-o/ppc/reloc.h>
+
+//#define DEBUG_MACHLOAD
+
+#ifdef DEBUG_MACHLOAD
+# define DPRINTF(...) do { qemu_log(__VA_ARGS__); printf(__VA_ARGS__); } while(0)
+#else
+# define DPRINTF(...) do { qemu_log(__VA_ARGS__); } while(0)
+#endif
+
+# define check_mach_header(x) (x.magic == MH_CIGAM)
+
+extern const char *interp_prefix;
+
+/* we don't have a good implementation for this */
+#define DONT_USE_DYLD_SHARED_MAP
+
+/* Pass extra arg to DYLD for debug */
+//#define ACTIVATE_DYLD_TRACE
+
+//#define OVERRIDE_DYLINKER
+
+#ifdef OVERRIDE_DYLINKER
+# ifdef TARGET_I386
+# define DYLINKER_NAME "/Users/steg/qemu/tests/i386-darwin-env/usr/lib/dyld"
+# else
+# define DYLINKER_NAME "/usr/lib/dyld"
+# endif
+#endif
+
+/* XXX: in an include */
+struct nlist_extended
+{
+ union {
+ char *n_name;
+ long n_strx;
+ } n_un;
+ unsigned char n_type;
+ unsigned char n_sect;
+ short st_desc;
+ unsigned long st_value;
+ unsigned long st_size;
+};
+
+/* Print symbols in gdb */
+void *macho_text_sect = 0;
+int macho_offset = 0;
+
+int load_object(const char *filename, struct target_pt_regs * regs, void ** mh);
+
+#ifdef TARGET_I386
+typedef struct mach_i386_thread_state {
+ unsigned int eax;
+ unsigned int ebx;
+ unsigned int ecx;
+ unsigned int edx;
+ unsigned int edi;
+ unsigned int esi;
+ unsigned int ebp;
+ unsigned int esp;
+ unsigned int ss;
+ unsigned int eflags;
+ unsigned int eip;
+ unsigned int cs;
+ unsigned int ds;
+ unsigned int es;
+ unsigned int fs;
+ unsigned int gs;
+} mach_i386_thread_state_t;
+
+void bswap_i386_thread_state(struct mach_i386_thread_state *ts)
+{
+ bswap32s((uint32_t*)&ts->eax);
+ bswap32s((uint32_t*)&ts->ebx);
+ bswap32s((uint32_t*)&ts->ecx);
+ bswap32s((uint32_t*)&ts->edx);
+ bswap32s((uint32_t*)&ts->edi);
+ bswap32s((uint32_t*)&ts->esi);
+ bswap32s((uint32_t*)&ts->ebp);
+ bswap32s((uint32_t*)&ts->esp);
+ bswap32s((uint32_t*)&ts->ss);
+ bswap32s((uint32_t*)&ts->eflags);
+ bswap32s((uint32_t*)&ts->eip);
+ bswap32s((uint32_t*)&ts->cs);
+ bswap32s((uint32_t*)&ts->ds);
+ bswap32s((uint32_t*)&ts->es);
+ bswap32s((uint32_t*)&ts->fs);
+ bswap32s((uint32_t*)&ts->gs);
+}
+#define target_thread_state mach_i386_thread_state
+#define TARGET_CPU_TYPE CPU_TYPE_I386
+#define TARGET_CPU_NAME "i386"
+#endif
+
+#ifdef TARGET_PPC
+struct mach_ppc_thread_state {
+ unsigned int srr0; /* Instruction address register (PC) */
+ unsigned int srr1; /* Machine state register (supervisor) */
+ unsigned int r0;
+ unsigned int r1;
+ unsigned int r2;
+ unsigned int r3;
+ unsigned int r4;
+ unsigned int r5;
+ unsigned int r6;
+ unsigned int r7;
+ unsigned int r8;
+ unsigned int r9;
+ unsigned int r10;
+ unsigned int r11;
+ unsigned int r12;
+ unsigned int r13;
+ unsigned int r14;
+ unsigned int r15;
+ unsigned int r16;
+ unsigned int r17;
+ unsigned int r18;
+ unsigned int r19;
+ unsigned int r20;
+ unsigned int r21;
+ unsigned int r22;
+ unsigned int r23;
+ unsigned int r24;
+ unsigned int r25;
+ unsigned int r26;
+ unsigned int r27;
+ unsigned int r28;
+ unsigned int r29;
+ unsigned int r30;
+ unsigned int r31;
+
+ unsigned int cr; /* Condition register */
+ unsigned int xer; /* User's integer exception register */
+ unsigned int lr; /* Link register */
+ unsigned int ctr; /* Count register */
+ unsigned int mq; /* MQ register (601 only) */
+
+ unsigned int vrsave; /* Vector Save Register */
+};
+
+void bswap_ppc_thread_state(struct mach_ppc_thread_state *ts)
+{
+ bswap32s((uint32_t*)&ts->srr0);
+ bswap32s((uint32_t*)&ts->srr1);
+ bswap32s((uint32_t*)&ts->r0);
+ bswap32s((uint32_t*)&ts->r1);
+ bswap32s((uint32_t*)&ts->r2);
+ bswap32s((uint32_t*)&ts->r3);
+ bswap32s((uint32_t*)&ts->r4);
+ bswap32s((uint32_t*)&ts->r5);
+ bswap32s((uint32_t*)&ts->r6);
+ bswap32s((uint32_t*)&ts->r7);
+ bswap32s((uint32_t*)&ts->r8);
+ bswap32s((uint32_t*)&ts->r9);
+ bswap32s((uint32_t*)&ts->r10);
+ bswap32s((uint32_t*)&ts->r11);
+ bswap32s((uint32_t*)&ts->r12);
+ bswap32s((uint32_t*)&ts->r13);
+ bswap32s((uint32_t*)&ts->r14);
+ bswap32s((uint32_t*)&ts->r15);
+ bswap32s((uint32_t*)&ts->r16);
+ bswap32s((uint32_t*)&ts->r17);
+ bswap32s((uint32_t*)&ts->r18);
+ bswap32s((uint32_t*)&ts->r19);
+ bswap32s((uint32_t*)&ts->r20);
+ bswap32s((uint32_t*)&ts->r21);
+ bswap32s((uint32_t*)&ts->r22);
+ bswap32s((uint32_t*)&ts->r23);
+ bswap32s((uint32_t*)&ts->r24);
+ bswap32s((uint32_t*)&ts->r25);
+ bswap32s((uint32_t*)&ts->r26);
+ bswap32s((uint32_t*)&ts->r27);
+ bswap32s((uint32_t*)&ts->r28);
+ bswap32s((uint32_t*)&ts->r29);
+ bswap32s((uint32_t*)&ts->r30);
+ bswap32s((uint32_t*)&ts->r31);
+
+ bswap32s((uint32_t*)&ts->cr);
+ bswap32s((uint32_t*)&ts->xer);
+ bswap32s((uint32_t*)&ts->lr);
+ bswap32s((uint32_t*)&ts->ctr);
+ bswap32s((uint32_t*)&ts->mq);
+
+ bswap32s((uint32_t*)&ts->vrsave);
+}
+
+#define target_thread_state mach_ppc_thread_state
+#define TARGET_CPU_TYPE CPU_TYPE_POWERPC
+#define TARGET_CPU_NAME "PowerPC"
+#endif
+
+struct target_thread_command {
+ unsigned long cmd; /* LC_THREAD or LC_UNIXTHREAD */
+ unsigned long cmdsize; /* total size of this command */
+ unsigned long flavor; /* flavor of thread state */
+ unsigned long count; /* count of longs in thread state */
+ struct target_thread_state state; /* thread state for this flavor */
+};
+
+void bswap_tc(struct target_thread_command *tc)
+{
+ bswap32s((uint32_t*)(&tc->flavor));
+ bswap32s((uint32_t*)&tc->count);
+#if defined(TARGET_I386)
+ bswap_i386_thread_state(&tc->state);
+#elif defined(TARGET_PPC)
+ bswap_ppc_thread_state(&tc->state);
+#else
+# error unknown TARGET_CPU_TYPE
+#endif
+}
+
+void bswap_mh(struct mach_header *mh)
+{
+ bswap32s((uint32_t*)(&mh->magic));
+ bswap32s((uint32_t*)&mh->cputype);
+ bswap32s((uint32_t*)&mh->cpusubtype);
+ bswap32s((uint32_t*)&mh->filetype);
+ bswap32s((uint32_t*)&mh->ncmds);
+ bswap32s((uint32_t*)&mh->sizeofcmds);
+ bswap32s((uint32_t*)&mh->flags);
+}
+
+void bswap_lc(struct load_command *lc)
+{
+ bswap32s((uint32_t*)&lc->cmd);
+ bswap32s((uint32_t*)&lc->cmdsize);
+}
+
+
+void bswap_fh(struct fat_header *fh)
+{
+ bswap32s((uint32_t*)&fh->magic);
+ bswap32s((uint32_t*)&fh->nfat_arch);
+}
+
+void bswap_fa(struct fat_arch *fa)
+{
+ bswap32s((uint32_t*)&fa->cputype);
+ bswap32s((uint32_t*)&fa->cpusubtype);
+ bswap32s((uint32_t*)&fa->offset);
+ bswap32s((uint32_t*)&fa->size);
+ bswap32s((uint32_t*)&fa->align);
+}
+
+void bswap_segcmd(struct segment_command *sc)
+{
+ bswap32s((uint32_t*)&sc->vmaddr);
+ bswap32s((uint32_t*)&sc->vmsize);
+ bswap32s((uint32_t*)&sc->fileoff);
+ bswap32s((uint32_t*)&sc->filesize);
+ bswap32s((uint32_t*)&sc->maxprot);
+ bswap32s((uint32_t*)&sc->initprot);
+ bswap32s((uint32_t*)&sc->nsects);
+ bswap32s((uint32_t*)&sc->flags);
+}
+
+void bswap_symtabcmd(struct symtab_command *stc)
+{
+ bswap32s((uint32_t*)&stc->cmd);
+ bswap32s((uint32_t*)&stc->cmdsize);
+ bswap32s((uint32_t*)&stc->symoff);
+ bswap32s((uint32_t*)&stc->nsyms);
+ bswap32s((uint32_t*)&stc->stroff);
+ bswap32s((uint32_t*)&stc->strsize);
+}
+
+void bswap_sym(struct nlist *n)
+{
+ bswap32s((uint32_t*)&n->n_un.n_strx);
+ bswap16s((uint16_t*)&n->n_desc);
+ bswap32s((uint32_t*)&n->n_value);
+}
+
+int load_thread(struct mach_header *mh, struct target_thread_command *tc, struct target_pt_regs * regs, int fd, int mh_pos, int need_bswap)
+{
+ int entry;
+ if(need_bswap)
+ bswap_tc(tc);
+#if defined(TARGET_I386)
+ entry = tc->state.eip;
+ DPRINTF(" eax 0x%.8x\n ebx 0x%.8x\n ecx 0x%.8x\n edx 0x%.8x\n edi 0x%.8x\n esi 0x%.8x\n ebp 0x%.8x\n esp 0x%.8x\n ss 0x%.8x\n eflags 0x%.8x\n eip 0x%.8x\n cs 0x%.8x\n ds 0x%.8x\n es 0x%.8x\n fs 0x%.8x\n gs 0x%.8x\n",
+ tc->state.eax, tc->state.ebx, tc->state.ecx, tc->state.edx, tc->state.edi, tc->state.esi, tc->state.ebp,
+ tc->state.esp, tc->state.ss, tc->state.eflags, tc->state.eip, tc->state.cs, tc->state.ds, tc->state.es,
+ tc->state.fs, tc->state.gs );
+#define reg_copy(reg) regs->reg = tc->state.reg
+ if(regs)
+ {
+ reg_copy(eax);
+ reg_copy(ebx);
+ reg_copy(ecx);
+ reg_copy(edx);
+
+ reg_copy(edi);
+ reg_copy(esi);
+
+ reg_copy(ebp);
+ reg_copy(esp);
+
+ reg_copy(eflags);
+ reg_copy(eip);
+ /*
+ reg_copy(ss);
+ reg_copy(cs);
+ reg_copy(ds);
+ reg_copy(es);
+ reg_copy(fs);
+ reg_copy(gs);*/
+ }
+#undef reg_copy
+#elif defined(TARGET_PPC)
+ entry = tc->state.srr0;
+#endif
+ DPRINTF("load_thread: entry 0x%x\n", entry);
+ return entry;
+}
+
+int load_dylinker(struct mach_header *mh, struct dylinker_command *dc, int fd, int mh_pos, int need_bswap)
+{
+ int size;
+ char * dylinker_name;
+ size = dc->cmdsize - sizeof(struct dylinker_command);
+
+ if(need_bswap)
+ dylinker_name = (char*)(bswap_32(dc->name.offset)+(int)dc);
+ else
+ dylinker_name = (char*)((dc->name.offset)+(int)dc);
+
+#ifdef OVERRIDE_DYLINKER
+ dylinker_name = DYLINKER_NAME;
+#else
+ if(asprintf(&dylinker_name, "%s%s", interp_prefix, dylinker_name) == -1)
+ qerror("can't allocate the new dylinker name\n");
+#endif
+
+ DPRINTF("dylinker_name %s\n", dylinker_name);
+ return load_object(dylinker_name, NULL, NULL);
+}
+
+int load_segment(struct mach_header *mh, struct segment_command *sc, int fd, int mh_pos, int need_bswap, int fixed, int slide)
+{
+ unsigned long addr = sc->vmaddr;
+ unsigned long size = sc->filesize;
+ unsigned long error = 0;
+
+ if(need_bswap)
+ bswap_segcmd(sc);
+
+ if(sc->vmaddr == 0)
+ {
+ DPRINTF("load_segment: sc->vmaddr == 0 returning\n");
+ return -1;
+ }
+
+ if (strcmp(sc->segname, "__PAGEZERO") == 0)
+ {
+ DPRINTF("load_segment: __PAGEZERO returning\n");
+ return -1;
+ }
+
+ /* Right now mmap memory */
+ /* XXX: should check to see that the space is free, because MAP_FIXED is dangerous */
+ DPRINTF("load_segment: mmaping %s to 0x%x-(0x%x|0x%x) + 0x%x\n", sc->segname, sc->vmaddr, sc->filesize, sc->vmsize, slide);
+
+ if(sc->filesize > 0)
+ {
+ int opt = 0;
+
+ if(fixed)
+ opt |= MAP_FIXED;
+
+ DPRINTF("sc->vmaddr 0x%x slide 0x%x add 0x%x\n", slide, sc->vmaddr, sc->vmaddr+slide);
+
+ addr = target_mmap(sc->vmaddr+slide, sc->filesize, sc->initprot, opt, fd, mh_pos + sc->fileoff);
+
+ if(addr==-1)
+ qerror("load_segment: can't mmap at 0x%x\n", sc->vmaddr+slide);
+
+ error = addr-sc->vmaddr;
+ }
+ else
+ {
+ addr = sc->vmaddr+slide;
+ error = slide;
+ }
+
+ if(sc->vmsize > sc->filesize)
+ {
+ addr += sc->filesize;
+ size = sc->vmsize-sc->filesize;
+ addr = target_mmap(addr, size, sc->initprot, MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+ if(addr==-1)
+ qerror("load_segment: can't mmap at 0x%x\n", sc->vmaddr+slide);
+ }
+
+ return error;
+}
+
+void *load_data(int fd, long offset, unsigned int size)
+{
+ char *data;
+
+ data = malloc(size);
+ if (!data)
+ return NULL;
+ lseek(fd, offset, SEEK_SET);
+ if (read(fd, data, size) != size) {
+ free(data);
+ return NULL;
+ }
+ return data;
+}
+
+/* load a mach-o object file */
+int load_object(const char *filename, struct target_pt_regs * regs, void ** mh)
+{
+ int need_bswap = 0;
+ int entry_point = 0;
+ int dyld_entry_point = 0;
+ int slide, mmapfixed;
+ int fd;
+ struct load_command *lcmds, *lc;
+ int is_fat = 0;
+ unsigned int i, magic;
+ int mach_hdr_pos = 0;
+ struct mach_header mach_hdr;
+
+ /* for symbol lookup whith -d flag. */
+ struct symtab_command * symtabcmd = 0;
+ struct nlist_extended *symtab, *sym;
+ struct nlist *symtab_std, *syment;
+ char *strtab;
+
+ fd = open(filename, O_RDONLY);
+ if (fd < 0)
+ qerror("can't open file '%s'", filename);
+
+ /* Read magic header. */
+ if (read(fd, &magic, sizeof (magic)) != sizeof (magic))
+ qerror("unable to read Magic of '%s'", filename);
+
+ /* Check Mach identification. */
+ if(magic == MH_MAGIC)
+ {
+ is_fat = 0;
+ need_bswap = 0;
+ } else if (magic == MH_CIGAM)
+ {
+ is_fat = 0;
+ need_bswap = 1;
+ } else if (magic == FAT_MAGIC)
+ {
+ is_fat = 1;
+ need_bswap = 0;
+ } else if (magic == FAT_CIGAM)
+ {
+ is_fat = 1;
+ need_bswap = 1;
+ }
+ else
+ qerror("Not a Mach-O file.", filename);
+
+ DPRINTF("loading %s %s...\n", filename, is_fat ? "[FAT]": "[REGULAR]");
+ if(is_fat)
+ {
+ int found = 0;
+ struct fat_header fh;
+ struct fat_arch *fa;
+
+ lseek(fd, 0, SEEK_SET);
+
+ /* Read Fat header. */
+ if (read(fd, &fh, sizeof (fh)) != sizeof (fh))
+ qerror("unable to read file header");
+
+ if(need_bswap)
+ bswap_fh(&fh);
+
+ /* Read Fat Arch. */
+ fa = malloc(sizeof(struct fat_arch)*fh.nfat_arch);
+
+ if (read(fd, fa, sizeof(struct fat_arch)*fh.nfat_arch) != sizeof(struct fat_arch)*fh.nfat_arch)
+ qerror("unable to read file header");
+
+ for( i = 0; i < fh.nfat_arch; i++, fa++)
+ {
+ if(need_bswap)
+ bswap_fa(fa);
+ if(fa->cputype == TARGET_CPU_TYPE)
+ {
+ mach_hdr_pos = fa->offset;
+ lseek(fd, mach_hdr_pos, SEEK_SET);
+
+ /* Read Mach header. */
+
+ if (read(fd, &mach_hdr, sizeof(struct mach_header)) != sizeof (struct mach_header))
+ qerror("unable to read file header");
+
+ if(mach_hdr.magic == MH_MAGIC)
+ need_bswap = 0;
+ else if (mach_hdr.magic == MH_CIGAM)
+ need_bswap = 1;
+ else
+ qerror("Invalid mach header in Fat Mach-O File");
+ found = 1;
+ break;
+ }
+ }
+ if(!found)
+ qerror("%s: No %s CPU found in FAT Header", filename, TARGET_CPU_NAME);
+ }
+ else
+ {
+ lseek(fd, 0, SEEK_SET);
+ /* Read Mach header */
+ if (read(fd, &mach_hdr, sizeof (mach_hdr)) != sizeof (mach_hdr))
+ qerror("%s: unable to read file header", filename);
+ }
+
+ if(need_bswap)
+ bswap_mh(&mach_hdr);
+
+ if ((mach_hdr.cputype) != TARGET_CPU_TYPE)
+ qerror("%s: Unsupported CPU 0x%x (only 0x%x(%s) supported)", filename, mach_hdr.cputype, TARGET_CPU_TYPE, TARGET_CPU_NAME);
+
+
+ switch(mach_hdr.filetype)
+ {
+ case MH_EXECUTE: break;
+ case MH_FVMLIB:
+ case MH_DYLIB:
+ case MH_DYLINKER: break;
+ default:
+ qerror("%s: Unsupported Mach type (0x%x)", filename, mach_hdr.filetype);
+ }
+
+ /* read segment headers */
+ lcmds = malloc(mach_hdr.sizeofcmds);
+
+ if(read(fd, lcmds, mach_hdr.sizeofcmds) != mach_hdr.sizeofcmds)
+ qerror("%s: unable to read load_command", filename);
+ slide = 0;
+ mmapfixed = 0;
+ for(i=0, lc = lcmds; i < (mach_hdr.ncmds) ; i++)
+ {
+
+ if(need_bswap)
+ bswap_lc(lc);
+ switch(lc->cmd)
+ {
+ case LC_SEGMENT:
+ /* The main_exe can't be relocated */
+ if(mach_hdr.filetype == MH_EXECUTE)
+ mmapfixed = 1;
+
+ slide = load_segment(&mach_hdr, (struct segment_command*)lc, fd, mach_hdr_pos, need_bswap, mmapfixed, slide);
+
+ /* other segment must be mapped according to slide exactly, if load_segment did something */
+ if(slide != -1)
+ mmapfixed = 1;
+ else
+ slide = 0; /* load_segment didn't map the segment */
+
+ if(mach_hdr.filetype == MH_EXECUTE && slide != 0)
+ qerror("%s: Warning executable can't be mapped at the right address (offset: 0x%x)\n", filename, slide);
+
+ if(strcmp(((struct segment_command*)(lc))->segname, "__TEXT") == 0)
+ {
+ /* Text section */
+ if(mach_hdr.filetype == MH_EXECUTE)
+ {
+ /* return the mach_header */
+ *mh = (void*)(((struct segment_command*)(lc))->vmaddr + slide);
+ }
+ else
+ {
+ /* it is dyld save the section for gdb, we will be interested in dyld symbol
+ while debuging */
+ macho_text_sect = (void*)(((struct segment_command*)(lc))->vmaddr + slide);
+ macho_offset = slide;
+ }
+ }
+ break;
+ case LC_LOAD_DYLINKER:
+ dyld_entry_point = load_dylinker( &mach_hdr, (struct dylinker_command*)lc, fd, mach_hdr_pos, need_bswap );
+ break;
+ case LC_LOAD_DYLIB:
+ /* dyld will do that for us */
+ break;
+ case LC_THREAD:
+ case LC_UNIXTHREAD:
+ {
+ struct target_pt_regs * _regs;
+ if(mach_hdr.filetype == MH_DYLINKER)
+ _regs = regs;
+ else
+ _regs = 0;
+ entry_point = load_thread( &mach_hdr, (struct target_thread_command*)lc, _regs, fd, mach_hdr_pos, need_bswap );
+ }
+ break;
+ case LC_SYMTAB:
+ /* Save the symtab and strtab */
+ symtabcmd = (struct symtab_command *)lc;
+ break;
+ case LC_ID_DYLINKER:
+ case LC_ID_DYLIB:
+ case LC_UUID:
+ case LC_DYSYMTAB:
+ case LC_TWOLEVEL_HINTS:
+ case LC_PREBIND_CKSUM:
+ case LC_SUB_LIBRARY:
+ break;
+ default: fprintf(stderr, "warning: unkown command 0x%x in '%s'\n", lc->cmd, filename);
+ }
+ lc = (struct load_command*)((int)(lc)+(lc->cmdsize));
+ }
+
+ if(symtabcmd)
+ {
+ if(need_bswap)
+ bswap_symtabcmd(symtabcmd);
+
+ symtab_std = load_data(fd, symtabcmd->symoff+mach_hdr_pos, symtabcmd->nsyms * sizeof(struct nlist));
+ strtab = load_data(fd, symtabcmd->stroff+mach_hdr_pos, symtabcmd->strsize);
+
+ symtab = malloc(sizeof(struct nlist_extended) * symtabcmd->nsyms);
+
+ if(need_bswap)
+ {
+ for(i = 0, syment = symtab_std; i < symtabcmd->nsyms; i++, syment++)
+ bswap_sym(syment);
+ }
+
+ for(i = 0, sym = symtab, syment = symtab_std; i < symtabcmd->nsyms; i++, sym++, syment++)
+ {
+ struct nlist *sym_follow, *sym_next = 0;
+ unsigned int j;
+ memset(sym, 0, sizeof(*sym));
+
+ sym->n_type = syment->n_type;
+ if ( syment->n_type & N_STAB ) /* Debug symbols are skipped */
+ continue;
+
+ memcpy(sym, syment, sizeof(*syment));
+
+ /* Find the following symbol in order to get the current symbol size */
+ for(j = 0, sym_follow = symtab_std; j < symtabcmd->nsyms; j++, sym_follow++) {
+ if ( sym_follow->n_type & N_STAB || !(sym_follow->n_value > sym->st_value))
+ continue;
+ if(!sym_next) {
+ sym_next = sym_follow;
+ continue;
+ }
+ if(!(sym_next->n_value > sym_follow->n_value))
+ continue;
+ sym_next = sym_follow;
+ }
+ if(sym_next)
+ sym->st_size = sym_next->n_value - sym->st_value;
+ else
+ sym->st_size = 10; /* XXX: text_sec_hdr->size + text_sec_hdr->offset - sym->st_value; */
+
+ sym->st_value += slide;
+ }
+
+ free((void*)symtab_std);
+
+ {
+ DPRINTF("saving symtab of %s (%d symbol(s))\n", filename, symtabcmd->nsyms);
+ struct syminfo *s;
+ s = malloc(sizeof(*s));
+ s->disas_symtab = symtab;
+ s->disas_strtab = strtab;
+ s->disas_num_syms = symtabcmd->nsyms;
+ s->next = syminfos;
+ syminfos = s;
+ }
+ }
+ close(fd);
+ if(mach_hdr.filetype == MH_EXECUTE && dyld_entry_point)
+ return dyld_entry_point;
+ else
+ return entry_point+slide;
+}
+
+extern unsigned long stack_size;
+
+unsigned long setup_arg_pages(void * mh, char ** argv, char ** env)
+{
+ unsigned long stack_base, error, size;
+ int i;
+ int * stack;
+ int argc, envc;
+
+ /* Create enough stack to hold everything. If we don't use
+ * it for args, we'll use it for something else...
+ */
+ size = stack_size;
+
+ error = target_mmap(0,
+ size + qemu_host_page_size,
+ PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS,
+ -1, 0);
+ if (error == -1)
+ qerror("stk mmap");
+
+ /* we reserve one extra page at the top of the stack as guard */
+ target_mprotect(error + size, qemu_host_page_size, PROT_NONE);
+
+ stack_base = error + size;
+ stack = (void*)stack_base;
+/*
+ * | STRING AREA |
+ * +-------------+
+ * | 0 |
+* +-------------+
+ * | apple[n] |
+ * +-------------+
+ * :
+ * +-------------+
+ * | apple[0] |
+ * +-------------+
+ * | 0 |
+ * +-------------+
+ * | env[n] |
+ * +-------------+
+ * :
+ * :
+ * +-------------+
+ * | env[0] |
+ * +-------------+
+ * | 0 |
+ * +-------------+
+ * | arg[argc-1] |
+ * +-------------+
+ * :
+ * :
+ * +-------------+
+ * | arg[0] |
+ * +-------------+
+ * | argc |
+ * +-------------+
+ * sp-> | mh | address of where the a.out's file offset 0 is in memory
+ * +-------------+
+*/
+ /* Construct the stack Stack grows down */
+ stack--;
+
+ /* XXX: string should go up there */
+
+ *stack = 0;
+ stack--;
+
+ /* Push the absolute path of our executable */
+ DPRINTF("pushing apple %s (0x%x)\n", (char*)argv[0], (int)argv[0]);
+ stl(stack, (int) argv[0]);
+
+ stack--;
+
+ stl(stack, 0);
+ stack--;
+
+ /* Get envc */
+ for(envc = 0; env[envc]; envc++);
+
+ for(i = envc-1; i >= 0; i--)
+ {
+ DPRINTF("pushing env %s (0x%x)\n", (char*)env[i], (int)env[i]);
+ stl(stack, (int)env[i]);
+ stack--;
+
+ /* XXX: remove that when string will be on top of the stack */
+ page_set_flags((int)env[i], (int)(env[i]+strlen(env[i])), PROT_READ | PAGE_VALID);
+ }
+
+ /* Add on the stack the interp_prefix choosen if so */
+ if(interp_prefix[0])
+ {
+ char *dyld_root;
+ asprintf(&dyld_root, "DYLD_ROOT_PATH=%s", interp_prefix);
+ page_set_flags((int)dyld_root, (int)(dyld_root+strlen(interp_prefix)+1), PROT_READ | PAGE_VALID);
+
+ stl(stack, (int)dyld_root);
+ stack--;
+ }
+
+#ifdef DONT_USE_DYLD_SHARED_MAP
+ {
+ char *shared_map_mode;
+ asprintf(&shared_map_mode, "DYLD_SHARED_REGION=avoid");
+ page_set_flags((int)shared_map_mode, (int)(shared_map_mode+strlen(shared_map_mode)+1), PROT_READ | PAGE_VALID);
+
+ stl(stack, (int)shared_map_mode);
+ stack--;
+ }
+#endif
+
+#ifdef ACTIVATE_DYLD_TRACE
+ char * extra_env_static[] = {"DYLD_DEBUG_TRACE=yes",
+ "DYLD_PREBIND_DEBUG=3", "DYLD_UNKNOW_TRACE=yes",
+ "DYLD_PRINT_INITIALIZERS=yes",
+ "DYLD_PRINT_SEGMENTS=yes", "DYLD_PRINT_REBASINGS=yes", "DYLD_PRINT_BINDINGS=yes", "DYLD_PRINT_INITIALIZERS=yes", "DYLD_PRINT_WARNINGS=yes" };
+
+ char ** extra_env = malloc(sizeof(extra_env_static));
+ bcopy(extra_env_static, extra_env, sizeof(extra_env_static));
+ page_set_flags((int)extra_env, (int)((void*)extra_env+sizeof(extra_env_static)), PROT_READ | PAGE_VALID);
+
+ for(i = 0; i<9; i++)
+ {
+ DPRINTF("pushing (extra) env %s (0x%x)\n", (char*)extra_env[i], (int)extra_env[i]);
+ stl(stack, (int) extra_env[i]);
+ stack--;
+ }
+#endif
+
+ stl(stack, 0);
+ stack--;
+
+ /* Get argc */
+ for(argc = 0; argv[argc]; argc++);
+
+ for(i = argc-1; i >= 0; i--)
+ {
+ DPRINTF("pushing arg %s (0x%x)\n", (char*)argv[i], (int)argv[i]);
+ stl(stack, (int) argv[i]);
+ stack--;
+
+ /* XXX: remove that when string will be on top of the stack */
+ page_set_flags((int)argv[i], (int)(argv[i]+strlen(argv[i])), PROT_READ | PAGE_VALID);
+ }
+
+ DPRINTF("pushing argc %d \n", argc);
+ stl(stack, argc);
+ stack--;
+
+ DPRINTF("pushing mh 0x%x \n", (int)mh);
+ stl(stack, (int) mh);
+
+ /* Stack points on the mh */
+ return (unsigned long)stack;
+}
+
+int mach_exec(const char * filename, char ** argv, char ** envp,
+ struct target_pt_regs * regs)
+{
+ int entrypoint, stack;
+ void * mh; /* the Mach Header that will be used by dyld */
+
+ DPRINTF("mach_exec at 0x%x\n", (int)mach_exec);
+
+ entrypoint = load_object(filename, regs, &mh);
+ stack = setup_arg_pages(mh, argv, envp);
+#if defined(TARGET_I386)
+ regs->eip = entrypoint;
+ regs->esp = stack;
+#elif defined(TARGET_PPC)
+ regs->nip = entrypoint;
+ regs->gpr[1] = stack;
+#endif
+ DPRINTF("mach_exec returns eip set to 0x%x esp 0x%x mh 0x%x\n", entrypoint, stack, (int)mh);
+
+ if(!entrypoint)
+ qerror("%s: no entry point!\n", filename);
+
+ return 0;
+}
diff --git a/qemu-0.15.x/darwin-user/main.c b/qemu-0.15.x/darwin-user/main.c
new file mode 100644
index 0000000..72307ad
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/main.c
@@ -0,0 +1,1026 @@
+/*
+ * qemu user main
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ * Copyright (c) 2006 Pierre d'Herbemont
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include <sys/syscall.h>
+#include <sys/mman.h>
+
+#include "qemu.h"
+
+#define DEBUG_LOGFILE "/tmp/qemu.log"
+
+#ifdef __APPLE__
+#include <crt_externs.h>
+# define environ (*_NSGetEnviron())
+#endif
+
+#include <mach/mach_init.h>
+#include <mach/vm_map.h>
+
+int singlestep;
+
+const char *interp_prefix = "";
+
+asm(".zerofill __STD_PROG_ZONE, __STD_PROG_ZONE, __std_prog_zone, 0x0dfff000");
+
+/* XXX: on x86 MAP_GROWSDOWN only works if ESP <= address + 32, so
+ we allocate a bigger stack. Need a better solution, for example
+ by remapping the process stack directly at the right place */
+unsigned long stack_size = 512 * 1024;
+
+void qerror(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+ exit(1);
+}
+
+void gemu_log(const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start(ap, fmt);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+}
+
+int cpu_get_pic_interrupt(CPUState *env)
+{
+ return -1;
+}
+#ifdef TARGET_PPC
+
+static inline uint64_t cpu_ppc_get_tb (CPUState *env)
+{
+ /* TO FIX */
+ return 0;
+}
+
+uint64_t cpu_ppc_load_tbl (CPUState *env)
+{
+ return cpu_ppc_get_tb(env);
+}
+
+uint32_t cpu_ppc_load_tbu (CPUState *env)
+{
+ return cpu_ppc_get_tb(env) >> 32;
+}
+
+uint64_t cpu_ppc_load_atbl (CPUState *env)
+{
+ return cpu_ppc_get_tb(env);
+}
+
+uint32_t cpu_ppc_load_atbu (CPUState *env)
+{
+ return cpu_ppc_get_tb(env) >> 32;
+}
+
+uint32_t cpu_ppc601_load_rtcu (CPUState *env)
+{
+ cpu_ppc_load_tbu(env);
+}
+
+uint32_t cpu_ppc601_load_rtcl (CPUState *env)
+{
+ return cpu_ppc_load_tbl(env) & 0x3FFFFF80;
+}
+
+/* XXX: to be fixed */
+int ppc_dcr_read (ppc_dcr_t *dcr_env, int dcrn, uint32_t *valp)
+{
+ return -1;
+}
+
+int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, uint32_t val)
+{
+ return -1;
+}
+
+#define EXCP_DUMP(env, fmt, ...) \
+do { \
+ fprintf(stderr, fmt , ## __VA_ARGS__); \
+ cpu_dump_state(env, stderr, fprintf, 0); \
+ qemu_log(fmt, ## __VA_ARGS__); \
+ log_cpu_state(env, 0); \
+} while (0)
+
+void cpu_loop(CPUPPCState *env)
+{
+ int trapnr;
+ uint32_t ret;
+ target_siginfo_t info;
+
+ for(;;) {
+ trapnr = cpu_ppc_exec(env);
+ switch(trapnr) {
+ case POWERPC_EXCP_NONE:
+ /* Just go on */
+ break;
+ case POWERPC_EXCP_CRITICAL: /* Critical input */
+ cpu_abort(env, "Critical interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_MCHECK: /* Machine check exception */
+ cpu_abort(env, "Machine check exception while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_DSI: /* Data storage exception */
+#ifndef DAR
+/* To deal with multiple qemu header version as host for the darwin-user code */
+# define DAR SPR_DAR
+#endif
+ EXCP_DUMP(env, "Invalid data memory access: 0x" TARGET_FMT_lx "\n",
+ env->spr[SPR_DAR]);
+ /* Handle this via the gdb */
+ gdb_handlesig (env, SIGSEGV);
+
+ info.si_addr = (void*)env->nip;
+ queue_signal(info.si_signo, &info);
+ break;
+ case POWERPC_EXCP_ISI: /* Instruction storage exception */
+ EXCP_DUMP(env, "Invalid instruction fetch: 0x\n" TARGET_FMT_lx "\n",
+ env->spr[SPR_DAR]);
+ /* Handle this via the gdb */
+ gdb_handlesig (env, SIGSEGV);
+
+ info.si_addr = (void*)(env->nip - 4);
+ queue_signal(info.si_signo, &info);
+ break;
+ case POWERPC_EXCP_EXTERNAL: /* External input */
+ cpu_abort(env, "External interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_ALIGN: /* Alignment exception */
+ EXCP_DUMP(env, "Unaligned memory access\n");
+ info.si_errno = 0;
+ info.si_code = BUS_ADRALN;
+ info.si_addr = (void*)(env->nip - 4);
+ queue_signal(info.si_signo, &info);
+ break;
+ case POWERPC_EXCP_PROGRAM: /* Program exception */
+ /* XXX: check this */
+ switch (env->error_code & ~0xF) {
+ case POWERPC_EXCP_FP:
+ EXCP_DUMP(env, "Floating point program exception\n");
+ /* Set FX */
+ info.si_signo = SIGFPE;
+ info.si_errno = 0;
+ switch (env->error_code & 0xF) {
+ case POWERPC_EXCP_FP_OX:
+ info.si_code = FPE_FLTOVF;
+ break;
+ case POWERPC_EXCP_FP_UX:
+ info.si_code = FPE_FLTUND;
+ break;
+ case POWERPC_EXCP_FP_ZX:
+ case POWERPC_EXCP_FP_VXZDZ:
+ info.si_code = FPE_FLTDIV;
+ break;
+ case POWERPC_EXCP_FP_XX:
+ info.si_code = FPE_FLTRES;
+ break;
+ case POWERPC_EXCP_FP_VXSOFT:
+ info.si_code = FPE_FLTINV;
+ break;
+ case POWERPC_EXCP_FP_VXSNAN:
+ case POWERPC_EXCP_FP_VXISI:
+ case POWERPC_EXCP_FP_VXIDI:
+ case POWERPC_EXCP_FP_VXIMZ:
+ case POWERPC_EXCP_FP_VXVC:
+ case POWERPC_EXCP_FP_VXSQRT:
+ case POWERPC_EXCP_FP_VXCVI:
+ info.si_code = FPE_FLTSUB;
+ break;
+ default:
+ EXCP_DUMP(env, "Unknown floating point exception (%02x)\n",
+ env->error_code);
+ break;
+ }
+ break;
+ case POWERPC_EXCP_INVAL:
+ EXCP_DUMP(env, "Invalid instruction\n");
+ info.si_signo = SIGILL;
+ info.si_errno = 0;
+ switch (env->error_code & 0xF) {
+ case POWERPC_EXCP_INVAL_INVAL:
+ info.si_code = ILL_ILLOPC;
+ break;
+ case POWERPC_EXCP_INVAL_LSWX:
+ info.si_code = ILL_ILLOPN;
+ break;
+ case POWERPC_EXCP_INVAL_SPR:
+ info.si_code = ILL_PRVREG;
+ break;
+ case POWERPC_EXCP_INVAL_FP:
+ info.si_code = ILL_COPROC;
+ break;
+ default:
+ EXCP_DUMP(env, "Unknown invalid operation (%02x)\n",
+ env->error_code & 0xF);
+ info.si_code = ILL_ILLADR;
+ break;
+ }
+ /* Handle this via the gdb */
+ gdb_handlesig (env, SIGSEGV);
+ break;
+ case POWERPC_EXCP_PRIV:
+ EXCP_DUMP(env, "Privilege violation\n");
+ info.si_signo = SIGILL;
+ info.si_errno = 0;
+ switch (env->error_code & 0xF) {
+ case POWERPC_EXCP_PRIV_OPC:
+ info.si_code = ILL_PRVOPC;
+ break;
+ case POWERPC_EXCP_PRIV_REG:
+ info.si_code = ILL_PRVREG;
+ break;
+ default:
+ EXCP_DUMP(env, "Unknown privilege violation (%02x)\n",
+ env->error_code & 0xF);
+ info.si_code = ILL_PRVOPC;
+ break;
+ }
+ break;
+ case POWERPC_EXCP_TRAP:
+ cpu_abort(env, "Tried to call a TRAP\n");
+ break;
+ default:
+ /* Should not happen ! */
+ cpu_abort(env, "Unknown program exception (%02x)\n",
+ env->error_code);
+ break;
+ }
+ info.si_addr = (void*)(env->nip - 4);
+ queue_signal(info.si_signo, &info);
+ break;
+ case POWERPC_EXCP_FPU: /* Floating-point unavailable exception */
+ EXCP_DUMP(env, "No floating point allowed\n");
+ info.si_signo = SIGILL;
+ info.si_errno = 0;
+ info.si_code = ILL_COPROC;
+ info.si_addr = (void*)(env->nip - 4);
+ queue_signal(info.si_signo, &info);
+ break;
+ case POWERPC_EXCP_SYSCALL: /* System call exception */
+ cpu_abort(env, "Syscall exception while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_APU: /* Auxiliary processor unavailable */
+ EXCP_DUMP(env, "No APU instruction allowed\n");
+ info.si_signo = SIGILL;
+ info.si_errno = 0;
+ info.si_code = ILL_COPROC;
+ info.si_addr = (void*)(env->nip - 4);
+ queue_signal(info.si_signo, &info);
+ break;
+ case POWERPC_EXCP_DECR: /* Decrementer exception */
+ cpu_abort(env, "Decrementer interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_FIT: /* Fixed-interval timer interrupt */
+ cpu_abort(env, "Fix interval timer interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_WDT: /* Watchdog timer interrupt */
+ cpu_abort(env, "Watchdog timer interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_DTLB: /* Data TLB error */
+ cpu_abort(env, "Data TLB exception while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_ITLB: /* Instruction TLB error */
+ cpu_abort(env, "Instruction TLB exception while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_DEBUG: /* Debug interrupt */
+ gdb_handlesig (env, SIGTRAP);
+ break;
+ case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavail. */
+ EXCP_DUMP(env, "No SPE/floating-point instruction allowed\n");
+ info.si_signo = SIGILL;
+ info.si_errno = 0;
+ info.si_code = ILL_COPROC;
+ info.si_addr = (void*)(env->nip - 4);
+ queue_signal(info.si_signo, &info);
+ break;
+ case POWERPC_EXCP_EFPDI: /* Embedded floating-point data IRQ */
+ cpu_abort(env, "Embedded floating-point data IRQ not handled\n");
+ break;
+ case POWERPC_EXCP_EFPRI: /* Embedded floating-point round IRQ */
+ cpu_abort(env, "Embedded floating-point round IRQ not handled\n");
+ break;
+ case POWERPC_EXCP_EPERFM: /* Embedded performance monitor IRQ */
+ cpu_abort(env, "Performance monitor exception not handled\n");
+ break;
+ case POWERPC_EXCP_DOORI: /* Embedded doorbell interrupt */
+ cpu_abort(env, "Doorbell interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_DOORCI: /* Embedded doorbell critical interrupt */
+ cpu_abort(env, "Doorbell critical interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_RESET: /* System reset exception */
+ cpu_abort(env, "Reset interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_DSEG: /* Data segment exception */
+ cpu_abort(env, "Data segment exception while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_ISEG: /* Instruction segment exception */
+ cpu_abort(env, "Instruction segment exception "
+ "while in user mode. Aborting\n");
+ break;
+ case POWERPC_EXCP_HDECR: /* Hypervisor decrementer exception */
+ cpu_abort(env, "Hypervisor decrementer interrupt "
+ "while in user mode. Aborting\n");
+ break;
+ case POWERPC_EXCP_TRACE: /* Trace exception */
+ /* Nothing to do:
+ * we use this exception to emulate step-by-step execution mode.
+ */
+ break;
+ case POWERPC_EXCP_HDSI: /* Hypervisor data storage exception */
+ cpu_abort(env, "Hypervisor data storage exception "
+ "while in user mode. Aborting\n");
+ break;
+ case POWERPC_EXCP_HISI: /* Hypervisor instruction storage excp */
+ cpu_abort(env, "Hypervisor instruction storage exception "
+ "while in user mode. Aborting\n");
+ break;
+ case POWERPC_EXCP_HDSEG: /* Hypervisor data segment exception */
+ cpu_abort(env, "Hypervisor data segment exception "
+ "while in user mode. Aborting\n");
+ break;
+ case POWERPC_EXCP_HISEG: /* Hypervisor instruction segment excp */
+ cpu_abort(env, "Hypervisor instruction segment exception "
+ "while in user mode. Aborting\n");
+ break;
+ case POWERPC_EXCP_VPU: /* Vector unavailable exception */
+ EXCP_DUMP(env, "No Altivec instructions allowed\n");
+ info.si_signo = SIGILL;
+ info.si_errno = 0;
+ info.si_code = ILL_COPROC;
+ info.si_addr = (void*)(env->nip - 4);
+ queue_signal(info.si_signo, &info);
+ break;
+ case POWERPC_EXCP_PIT: /* Programmable interval timer IRQ */
+ cpu_abort(env, "Programable interval timer interrupt "
+ "while in user mode. Aborting\n");
+ break;
+ case POWERPC_EXCP_IO: /* IO error exception */
+ cpu_abort(env, "IO error exception while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_RUNM: /* Run mode exception */
+ cpu_abort(env, "Run mode exception while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_EMUL: /* Emulation trap exception */
+ cpu_abort(env, "Emulation trap exception not handled\n");
+ break;
+ case POWERPC_EXCP_IFTLB: /* Instruction fetch TLB error */
+ cpu_abort(env, "Instruction fetch TLB exception "
+ "while in user-mode. Aborting");
+ break;
+ case POWERPC_EXCP_DLTLB: /* Data load TLB miss */
+ cpu_abort(env, "Data load TLB exception while in user-mode. "
+ "Aborting");
+ break;
+ case POWERPC_EXCP_DSTLB: /* Data store TLB miss */
+ cpu_abort(env, "Data store TLB exception while in user-mode. "
+ "Aborting");
+ break;
+ case POWERPC_EXCP_FPA: /* Floating-point assist exception */
+ cpu_abort(env, "Floating-point assist exception not handled\n");
+ break;
+ case POWERPC_EXCP_IABR: /* Instruction address breakpoint */
+ cpu_abort(env, "Instruction address breakpoint exception "
+ "not handled\n");
+ break;
+ case POWERPC_EXCP_SMI: /* System management interrupt */
+ cpu_abort(env, "System management interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_THERM: /* Thermal interrupt */
+ cpu_abort(env, "Thermal interrupt interrupt while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_PERFM: /* Embedded performance monitor IRQ */
+ cpu_abort(env, "Performance monitor exception not handled\n");
+ break;
+ case POWERPC_EXCP_VPUA: /* Vector assist exception */
+ cpu_abort(env, "Vector assist exception not handled\n");
+ break;
+ case POWERPC_EXCP_SOFTP: /* Soft patch exception */
+ cpu_abort(env, "Soft patch exception not handled\n");
+ break;
+ case POWERPC_EXCP_MAINT: /* Maintenance exception */
+ cpu_abort(env, "Maintenance exception while in user mode. "
+ "Aborting\n");
+ break;
+ case POWERPC_EXCP_STOP: /* stop translation */
+ /* We did invalidate the instruction cache. Go on */
+ break;
+ case POWERPC_EXCP_BRANCH: /* branch instruction: */
+ /* We just stopped because of a branch. Go on */
+ break;
+ case POWERPC_EXCP_SYSCALL_USER:
+ /* system call in user-mode emulation */
+ /* system call */
+ if(((int)env->gpr[0]) <= SYS_MAXSYSCALL && ((int)env->gpr[0])>0)
+ ret = do_unix_syscall(env, env->gpr[0]/*, env->gpr[3], env->gpr[4],
+ env->gpr[5], env->gpr[6], env->gpr[7],
+ env->gpr[8], env->gpr[9], env->gpr[10]*/);
+ else if(((int)env->gpr[0])<0)
+ ret = do_mach_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
+ env->gpr[5], env->gpr[6], env->gpr[7],
+ env->gpr[8], env->gpr[9], env->gpr[10]);
+ else
+ ret = do_thread_syscall(env, env->gpr[0], env->gpr[3], env->gpr[4],
+ env->gpr[5], env->gpr[6], env->gpr[7],
+ env->gpr[8], env->gpr[9], env->gpr[10]);
+
+ /* Unix syscall error signaling */
+ if(((int)env->gpr[0]) <= SYS_MAXSYSCALL && ((int)env->gpr[0])>0)
+ {
+ if( (int)ret < 0 )
+ env->nip += 0;
+ else
+ env->nip += 4;
+ }
+
+ /* Return value */
+ env->gpr[3] = ret;
+ break;
+ case EXCP_INTERRUPT:
+ /* just indicate that signals should be handled asap */
+ break;
+ default:
+ cpu_abort(env, "Unknown exception 0x%d. Aborting\n", trapnr);
+ break;
+ }
+ process_pending_signals(env);
+ }
+}
+#endif
+
+
+#ifdef TARGET_I386
+
+/***********************************************************/
+/* CPUX86 core interface */
+
+uint64_t cpu_get_tsc(CPUX86State *env)
+{
+ return cpu_get_real_ticks();
+}
+
+void
+write_dt(void *ptr, unsigned long addr, unsigned long limit,
+ int flags)
+{
+ unsigned int e1, e2;
+ e1 = (addr << 16) | (limit & 0xffff);
+ e2 = ((addr >> 16) & 0xff) | (addr & 0xff000000) | (limit & 0x000f0000);
+ e2 |= flags;
+ stl((uint8_t *)ptr, e1);
+ stl((uint8_t *)ptr + 4, e2);
+}
+
+static void set_gate(void *ptr, unsigned int type, unsigned int dpl,
+ unsigned long addr, unsigned int sel)
+{
+ unsigned int e1, e2;
+ e1 = (addr & 0xffff) | (sel << 16);
+ e2 = (addr & 0xffff0000) | 0x8000 | (dpl << 13) | (type << 8);
+ stl((uint8_t *)ptr, e1);
+ stl((uint8_t *)ptr + 4, e2);
+}
+
+#define GDT_TABLE_SIZE 14
+#define LDT_TABLE_SIZE 15
+#define IDT_TABLE_SIZE 256
+#define TSS_SIZE 104
+uint64_t gdt_table[GDT_TABLE_SIZE];
+uint64_t ldt_table[LDT_TABLE_SIZE];
+uint64_t idt_table[IDT_TABLE_SIZE];
+uint32_t tss[TSS_SIZE];
+
+/* only dpl matters as we do only user space emulation */
+static void set_idt(int n, unsigned int dpl)
+{
+ set_gate(idt_table + n, 0, dpl, 0, 0);
+}
+
+/* ABI convention: after a syscall if there was an error the CF flag is set */
+static inline void set_error(CPUX86State *env, int ret)
+{
+ if(ret<0)
+ env->eflags = env->eflags | 0x1;
+ else
+ env->eflags &= ~0x1;
+ env->regs[R_EAX] = ret;
+}
+
+void cpu_loop(CPUX86State *env)
+{
+ int trapnr;
+ int ret;
+ uint8_t *pc;
+ target_siginfo_t info;
+
+ for(;;) {
+ trapnr = cpu_x86_exec(env);
+ uint32_t *params = (uint32_t *)env->regs[R_ESP];
+ switch(trapnr) {
+ case 0x79: /* Our commpage hack back door exit is here */
+ do_commpage(env, env->eip, *(params + 1), *(params + 2),
+ *(params + 3), *(params + 4),
+ *(params + 5), *(params + 6),
+ *(params + 7), *(params + 8));
+ break;
+ case 0x81: /* mach syscall */
+ {
+ ret = do_mach_syscall(env, env->regs[R_EAX],
+ *(params + 1), *(params + 2),
+ *(params + 3), *(params + 4),
+ *(params + 5), *(params + 6),
+ *(params + 7), *(params + 8));
+ set_error(env, ret);
+ break;
+ }
+ case 0x90: /* unix backdoor */
+ {
+ /* after sysenter, stack is in R_ECX, new eip in R_EDX (sysexit will flip them back)*/
+ int saved_stack = env->regs[R_ESP];
+ env->regs[R_ESP] = env->regs[R_ECX];
+
+ ret = do_unix_syscall(env, env->regs[R_EAX]);
+
+ env->regs[R_ECX] = env->regs[R_ESP];
+ env->regs[R_ESP] = saved_stack;
+
+ set_error(env, ret);
+ break;
+ }
+ case 0x80: /* unix syscall */
+ {
+ ret = do_unix_syscall(env, env->regs[R_EAX]/*,
+ *(params + 1), *(params + 2),
+ *(params + 3), *(params + 4),
+ *(params + 5), *(params + 6),
+ *(params + 7), *(params + 8)*/);
+ set_error(env, ret);
+ break;
+ }
+ case 0x82: /* thread syscall */
+ {
+ ret = do_thread_syscall(env, env->regs[R_EAX],
+ *(params + 1), *(params + 2),
+ *(params + 3), *(params + 4),
+ *(params + 5), *(params + 6),
+ *(params + 7), *(params + 8));
+ set_error(env, ret);
+ break;
+ }
+ case EXCP0B_NOSEG:
+ case EXCP0C_STACK:
+ info.si_signo = SIGBUS;
+ info.si_errno = 0;
+ info.si_code = BUS_NOOP;
+ info.si_addr = 0;
+ gdb_handlesig (env, SIGBUS);
+ queue_signal(info.si_signo, &info);
+ break;
+ case EXCP0D_GPF:
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ info.si_code = SEGV_NOOP;
+ info.si_addr = 0;
+ gdb_handlesig (env, SIGSEGV);
+ queue_signal(info.si_signo, &info);
+ break;
+ case EXCP0E_PAGE:
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ if (!(env->error_code & 1))
+ info.si_code = SEGV_MAPERR;
+ else
+ info.si_code = SEGV_ACCERR;
+ info.si_addr = (void*)env->cr[2];
+ gdb_handlesig (env, SIGSEGV);
+ queue_signal(info.si_signo, &info);
+ break;
+ case EXCP00_DIVZ:
+ /* division by zero */
+ info.si_signo = SIGFPE;
+ info.si_errno = 0;
+ info.si_code = FPE_INTDIV;
+ info.si_addr = (void*)env->eip;
+ gdb_handlesig (env, SIGFPE);
+ queue_signal(info.si_signo, &info);
+ break;
+ case EXCP01_SSTP:
+ case EXCP03_INT3:
+ info.si_signo = SIGTRAP;
+ info.si_errno = 0;
+ info.si_code = TRAP_BRKPT;
+ info.si_addr = (void*)env->eip;
+ gdb_handlesig (env, SIGTRAP);
+ queue_signal(info.si_signo, &info);
+ break;
+ case EXCP04_INTO:
+ case EXCP05_BOUND:
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ info.si_code = SEGV_NOOP;
+ info.si_addr = 0;
+ gdb_handlesig (env, SIGSEGV);
+ queue_signal(info.si_signo, &info);
+ break;
+ case EXCP06_ILLOP:
+ info.si_signo = SIGILL;
+ info.si_errno = 0;
+ info.si_code = ILL_ILLOPN;
+ info.si_addr = (void*)env->eip;
+ gdb_handlesig (env, SIGILL);
+ queue_signal(info.si_signo, &info);
+ break;
+ case EXCP_INTERRUPT:
+ /* just indicate that signals should be handled asap */
+ break;
+ case EXCP_DEBUG:
+ {
+ int sig;
+
+ sig = gdb_handlesig (env, SIGTRAP);
+ if (sig)
+ {
+ info.si_signo = sig;
+ info.si_errno = 0;
+ info.si_code = TRAP_BRKPT;
+ queue_signal(info.si_signo, &info);
+ }
+ }
+ break;
+ default:
+ pc = (void*)(env->segs[R_CS].base + env->eip);
+ fprintf(stderr, "qemu: 0x%08lx: unhandled CPU exception 0x%x - aborting\n",
+ (long)pc, trapnr);
+ abort();
+ }
+ process_pending_signals(env);
+ }
+}
+#endif
+
+static void usage(void)
+{
+ printf("qemu-" TARGET_ARCH " version " QEMU_VERSION ", Copyright (c) 2003-2004 Fabrice Bellard\n"
+ "usage: qemu-" TARGET_ARCH " [-h] [-d opts] [-L path] [-s size] program [arguments...]\n"
+ "Darwin CPU emulator (compiled for %s emulation)\n"
+ "\n"
+ "-h print this help\n"
+ "-L path set the %s library path (default='%s')\n"
+ "-s size set the stack size in bytes (default=%ld)\n"
+ "\n"
+ "debug options:\n"
+ "-d options activate log (logfile='%s')\n"
+ "-g wait for gdb on port 1234\n"
+ "-p pagesize set the host page size to 'pagesize'\n",
+ "-singlestep always run in singlestep mode\n"
+ TARGET_ARCH,
+ TARGET_ARCH,
+ interp_prefix,
+ stack_size,
+ DEBUG_LOGFILE);
+ exit(1);
+}
+
+/* XXX: currently only used for async signals (see signal.c) */
+CPUState *global_env;
+/* used only if single thread */
+CPUState *cpu_single_env = NULL;
+
+/* used to free thread contexts */
+TaskState *first_task_state;
+
+int main(int argc, char **argv)
+{
+ const char *filename;
+ const char *log_file = DEBUG_LOGFILE;
+ const char *log_mask = NULL;
+ struct target_pt_regs regs1, *regs = ®s1;
+ TaskState ts1, *ts = &ts1;
+ CPUState *env;
+ int optind;
+ short use_gdbstub = 0;
+ const char *r;
+ const char *cpu_model;
+
+ if (argc <= 1)
+ usage();
+
+ optind = 1;
+ for(;;) {
+ if (optind >= argc)
+ break;
+ r = argv[optind];
+ if (r[0] != '-')
+ break;
+ optind++;
+ r++;
+ if (!strcmp(r, "-")) {
+ break;
+ } else if (!strcmp(r, "d")) {
+ if (optind >= argc) {
+ break;
+ }
+ log_mask = argv[optind++];
+ } else if (!strcmp(r, "D")) {
+ if (optind >= argc) {
+ break;
+ }
+ log_file = argv[optind++];
+ } else if (!strcmp(r, "s")) {
+ r = argv[optind++];
+ stack_size = strtol(r, (char **)&r, 0);
+ if (stack_size <= 0)
+ usage();
+ if (*r == 'M')
+ stack_size *= 1024 * 1024;
+ else if (*r == 'k' || *r == 'K')
+ stack_size *= 1024;
+ } else if (!strcmp(r, "L")) {
+ interp_prefix = argv[optind++];
+ } else if (!strcmp(r, "p")) {
+ qemu_host_page_size = atoi(argv[optind++]);
+ if (qemu_host_page_size == 0 ||
+ (qemu_host_page_size & (qemu_host_page_size - 1)) != 0) {
+ fprintf(stderr, "page size must be a power of two\n");
+ exit(1);
+ }
+ } else
+ if (!strcmp(r, "g")) {
+ use_gdbstub = 1;
+ } else if (!strcmp(r, "cpu")) {
+ cpu_model = argv[optind++];
+ if (strcmp(cpu_model, "?") == 0) {
+/* XXX: implement xxx_cpu_list for targets that still miss it */
+#if defined(cpu_list)
+ cpu_list(stdout, &fprintf);
+#endif
+ exit(1);
+ }
+ } else if (!strcmp(r, "singlestep")) {
+ singlestep = 1;
+ } else
+ {
+ usage();
+ }
+ }
+
+ /* init debug */
+ cpu_set_log_filename(log_file);
+ if (log_mask) {
+ int mask;
+ CPULogItem *item;
+
+ mask = cpu_str_to_log_mask(log_mask);
+ if (!mask) {
+ printf("Log items (comma separated):\n");
+ for (item = cpu_log_items; item->mask != 0; item++) {
+ printf("%-10s %s\n", item->name, item->help);
+ }
+ exit(1);
+ }
+ cpu_set_log(mask);
+ }
+
+ if (optind >= argc) {
+ usage();
+ }
+ filename = argv[optind];
+
+ /* Zero out regs */
+ memset(regs, 0, sizeof(struct target_pt_regs));
+
+ if (cpu_model == NULL) {
+#if defined(TARGET_I386)
+#ifdef TARGET_X86_64
+ cpu_model = "qemu64";
+#else
+ cpu_model = "qemu32";
+#endif
+#elif defined(TARGET_PPC)
+#ifdef TARGET_PPC64
+ cpu_model = "970";
+#else
+ cpu_model = "750";
+#endif
+#else
+#error unsupported CPU
+#endif
+ }
+
+ cpu_exec_init_all(0);
+ /* NOTE: we need to init the CPU at this stage to get
+ qemu_host_page_size */
+ env = cpu_init(cpu_model);
+ cpu_reset(env);
+
+ printf("Starting %s with qemu\n----------------\n", filename);
+
+ commpage_init();
+
+ if (mach_exec(filename, argv+optind, environ, regs) != 0) {
+ printf("Error loading %s\n", filename);
+ _exit(1);
+ }
+
+ syscall_init();
+ signal_init();
+ global_env = env;
+
+ /* build Task State */
+ memset(ts, 0, sizeof(TaskState));
+ env->opaque = ts;
+ ts->used = 1;
+
+#if defined(TARGET_I386)
+ cpu_x86_set_cpl(env, 3);
+
+ env->cr[0] = CR0_PG_MASK | CR0_WP_MASK | CR0_PE_MASK;
+ env->hflags |= HF_PE_MASK;
+
+ if (env->cpuid_features & CPUID_SSE) {
+ env->cr[4] |= CR4_OSFXSR_MASK;
+ env->hflags |= HF_OSFXSR_MASK;
+ }
+
+ /* flags setup : we activate the IRQs by default as in user mode */
+ env->eflags |= IF_MASK;
+
+ /* darwin register setup */
+ env->regs[R_EAX] = regs->eax;
+ env->regs[R_EBX] = regs->ebx;
+ env->regs[R_ECX] = regs->ecx;
+ env->regs[R_EDX] = regs->edx;
+ env->regs[R_ESI] = regs->esi;
+ env->regs[R_EDI] = regs->edi;
+ env->regs[R_EBP] = regs->ebp;
+ env->regs[R_ESP] = regs->esp;
+ env->eip = regs->eip;
+
+ /* Darwin LDT setup */
+ /* 2 - User code segment
+ 3 - User data segment
+ 4 - User cthread */
+ bzero(ldt_table, LDT_TABLE_SIZE * sizeof(ldt_table[0]));
+ env->ldt.base = (uint32_t) ldt_table;
+ env->ldt.limit = sizeof(ldt_table) - 1;
+
+ write_dt(ldt_table + 2, 0, 0xfffff,
+ DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+ (3 << DESC_DPL_SHIFT) | (0xa << DESC_TYPE_SHIFT));
+ write_dt(ldt_table + 3, 0, 0xfffff,
+ DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+ (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
+ write_dt(ldt_table + 4, 0, 0xfffff,
+ DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+ (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
+
+ /* Darwin GDT setup.
+ * has changed a lot between old Darwin/x86 (pre-Mac Intel) and Mac OS X/x86,
+ now everything is done via int 0x81(mach) int 0x82 (thread) and sysenter/sysexit(unix) */
+ bzero(gdt_table, sizeof(gdt_table));
+ env->gdt.base = (uint32_t)gdt_table;
+ env->gdt.limit = sizeof(gdt_table) - 1;
+
+ /* Set up a back door to handle sysenter syscalls (unix) */
+ char * syscallbackdoor = malloc(64);
+ page_set_flags((int)syscallbackdoor, (int)syscallbackdoor + 64, PROT_EXEC | PROT_READ | PAGE_VALID);
+
+ int i = 0;
+ syscallbackdoor[i++] = 0xcd;
+ syscallbackdoor[i++] = 0x90; /* int 0x90 */
+ syscallbackdoor[i++] = 0x0F;
+ syscallbackdoor[i++] = 0x35; /* sysexit */
+
+ /* Darwin sysenter/sysexit setup */
+ env->sysenter_cs = 0x1; //XXX
+ env->sysenter_eip = (int)syscallbackdoor;
+ env->sysenter_esp = (int)malloc(64);
+
+ /* Darwin TSS setup
+ This must match up with GDT[4] */
+ env->tr.base = (uint32_t) tss;
+ env->tr.limit = sizeof(tss) - 1;
+ env->tr.flags = DESC_P_MASK | (0x9 << DESC_TYPE_SHIFT);
+ stw(tss + 2, 0x10); // ss0 = 0x10 = GDT[2] = Kernel Data Segment
+
+ /* Darwin interrupt setup */
+ bzero(idt_table, sizeof(idt_table));
+ env->idt.base = (uint32_t) idt_table;
+ env->idt.limit = sizeof(idt_table) - 1;
+ set_idt(0, 0);
+ set_idt(1, 0);
+ set_idt(2, 0);
+ set_idt(3, 3);
+ set_idt(4, 3);
+ set_idt(5, 3);
+ set_idt(6, 0);
+ set_idt(7, 0);
+ set_idt(8, 0);
+ set_idt(9, 0);
+ set_idt(10, 0);
+ set_idt(11, 0);
+ set_idt(12, 0);
+ set_idt(13, 0);
+ set_idt(14, 0);
+ set_idt(15, 0);
+ set_idt(16, 0);
+ set_idt(17, 0);
+ set_idt(18, 0);
+ set_idt(19, 0);
+ /* Syscalls are done via
+ int 0x80 (unix) (rarely used)
+ int 0x81 (mach)
+ int 0x82 (thread)
+ int 0x83 (diag) (not handled here)
+ sysenter/sysexit (unix) -> we redirect that to int 0x90 */
+ set_idt(0x79, 3); /* Commpage hack, here is our backdoor interrupt */
+ set_idt(0x80, 3); /* Unix Syscall */
+ set_idt(0x81, 3); /* Mach Syscalls */
+ set_idt(0x82, 3); /* thread Syscalls */
+
+ set_idt(0x90, 3); /* qemu-darwin-user's Unix syscalls backdoor */
+
+
+ cpu_x86_load_seg(env, R_CS, __USER_CS);
+ cpu_x86_load_seg(env, R_DS, __USER_DS);
+ cpu_x86_load_seg(env, R_ES, __USER_DS);
+ cpu_x86_load_seg(env, R_SS, __USER_DS);
+ cpu_x86_load_seg(env, R_FS, __USER_DS);
+ cpu_x86_load_seg(env, R_GS, __USER_DS);
+
+#elif defined(TARGET_PPC)
+ {
+ int i;
+
+#if defined(TARGET_PPC64)
+#if defined(TARGET_ABI32)
+ env->msr &= ~((target_ulong)1 << MSR_SF);
+#else
+ env->msr |= (target_ulong)1 << MSR_SF;
+#endif
+#endif
+ env->nip = regs->nip;
+ for(i = 0; i < 32; i++) {
+ env->gpr[i] = regs->gpr[i];
+ }
+ }
+#else
+#error unsupported target CPU
+#endif
+
+ if (use_gdbstub) {
+ printf("Waiting for gdb Connection on port 1234...\n");
+ gdbserver_start (1234);
+ gdb_handlesig(env, 0);
+ }
+
+ cpu_loop(env);
+ /* never exits */
+ return 0;
+}
diff --git a/qemu-0.15.x/darwin-user/mmap.c b/qemu-0.15.x/darwin-user/mmap.c
new file mode 100644
index 0000000..d840b28
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/mmap.c
@@ -0,0 +1,409 @@
+/*
+ * mmap support for qemu
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/mman.h>
+
+#include "qemu.h"
+
+//#define DEBUG_MMAP
+
+/* NOTE: all the constants are the HOST ones */
+int target_mprotect(unsigned long start, unsigned long len, int prot)
+{
+ unsigned long end, host_start, host_end, addr;
+ int prot1, ret;
+
+#ifdef DEBUG_MMAP
+ printf("mprotect: start=0x%lx len=0x%lx prot=%c%c%c\n", start, len,
+ prot & PROT_READ ? 'r' : '-',
+ prot & PROT_WRITE ? 'w' : '-',
+ prot & PROT_EXEC ? 'x' : '-');
+#endif
+
+ if ((start & ~TARGET_PAGE_MASK) != 0)
+ return -EINVAL;
+ len = TARGET_PAGE_ALIGN(len);
+ end = start + len;
+ if (end < start)
+ return -EINVAL;
+ if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC))
+ return -EINVAL;
+ if (len == 0)
+ return 0;
+
+ host_start = start & qemu_host_page_mask;
+ host_end = HOST_PAGE_ALIGN(end);
+ if (start > host_start) {
+ /* handle host page containing start */
+ prot1 = prot;
+ for(addr = host_start; addr < start; addr += TARGET_PAGE_SIZE) {
+ prot1 |= page_get_flags(addr);
+ }
+ if (host_end == host_start + qemu_host_page_size) {
+ for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {
+ prot1 |= page_get_flags(addr);
+ }
+ end = host_end;
+ }
+ ret = mprotect((void *)host_start, qemu_host_page_size, prot1 & PAGE_BITS);
+ if (ret != 0)
+ return ret;
+ host_start += qemu_host_page_size;
+ }
+ if (end < host_end) {
+ prot1 = prot;
+ for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {
+ prot1 |= page_get_flags(addr);
+ }
+ ret = mprotect((void *)(host_end - qemu_host_page_size), qemu_host_page_size,
+ prot1 & PAGE_BITS);
+ if (ret != 0)
+ return ret;
+ host_end -= qemu_host_page_size;
+ }
+
+ /* handle the pages in the middle */
+ if (host_start < host_end) {
+ ret = mprotect((void *)host_start, host_end - host_start, prot);
+ if (ret != 0)
+ return ret;
+ }
+ page_set_flags(start, start + len, prot | PAGE_VALID);
+ return 0;
+}
+
+/* map an incomplete host page */
+int mmap_frag(unsigned long host_start,
+ unsigned long start, unsigned long end,
+ int prot, int flags, int fd, unsigned long offset)
+{
+ unsigned long host_end, ret, addr;
+ int prot1, prot_new;
+
+ host_end = host_start + qemu_host_page_size;
+
+ /* get the protection of the target pages outside the mapping */
+ prot1 = 0;
+ for(addr = host_start; addr < host_end; addr++) {
+ if (addr < start || addr >= end)
+ prot1 |= page_get_flags(addr);
+ }
+
+ if (prot1 == 0) {
+ /* no page was there, so we allocate one */
+ ret = (long)mmap((void *)host_start, qemu_host_page_size, prot,
+ flags | MAP_ANONYMOUS, -1, 0);
+ if (ret == -1)
+ return ret;
+ }
+ prot1 &= PAGE_BITS;
+
+ prot_new = prot | prot1;
+ if (!(flags & MAP_ANONYMOUS)) {
+ /* msync() won't work here, so we return an error if write is
+ possible while it is a shared mapping */
+#ifndef __APPLE__
+ if ((flags & MAP_TYPE) == MAP_SHARED &&
+#else
+ if ((flags & MAP_SHARED) &&
+#endif
+ (prot & PROT_WRITE))
+ return -1;
+
+ /* adjust protection to be able to read */
+ if (!(prot1 & PROT_WRITE))
+ mprotect((void *)host_start, qemu_host_page_size, prot1 | PROT_WRITE);
+
+ /* read the corresponding file data */
+ pread(fd, (void *)start, end - start, offset);
+
+ /* put final protection */
+ if (prot_new != (prot1 | PROT_WRITE))
+ mprotect((void *)host_start, qemu_host_page_size, prot_new);
+ } else {
+ /* just update the protection */
+ if (prot_new != prot1) {
+ mprotect((void *)host_start, qemu_host_page_size, prot_new);
+ }
+ }
+ return 0;
+}
+
+/* NOTE: all the constants are the HOST ones */
+long target_mmap(unsigned long start, unsigned long len, int prot,
+ int flags, int fd, unsigned long offset)
+{
+ unsigned long ret, end, host_start, host_end, retaddr, host_offset, host_len;
+#if defined(__alpha__) || defined(__sparc__) || defined(__x86_64__)
+ static unsigned long last_start = 0x40000000;
+#endif
+
+#ifdef DEBUG_MMAP
+ {
+ printf("mmap: start=0x%lx len=0x%lx prot=%c%c%c flags=",
+ start, len,
+ prot & PROT_READ ? 'r' : '-',
+ prot & PROT_WRITE ? 'w' : '-',
+ prot & PROT_EXEC ? 'x' : '-');
+ if (flags & MAP_FIXED)
+ printf("MAP_FIXED ");
+ if (flags & MAP_ANONYMOUS)
+ printf("MAP_ANON ");
+#ifndef MAP_TYPE
+# define MAP_TYPE 0x3
+#endif
+ switch(flags & MAP_TYPE) {
+ case MAP_PRIVATE:
+ printf("MAP_PRIVATE ");
+ break;
+ case MAP_SHARED:
+ printf("MAP_SHARED ");
+ break;
+ default:
+ printf("[MAP_TYPE=0x%x] ", flags & MAP_TYPE);
+ break;
+ }
+ printf("fd=%d offset=%lx\n", fd, offset);
+ }
+#endif
+
+ if (offset & ~TARGET_PAGE_MASK)
+ return -EINVAL;
+
+ len = TARGET_PAGE_ALIGN(len);
+ if (len == 0)
+ return start;
+ host_start = start & qemu_host_page_mask;
+
+ if (!(flags & MAP_FIXED)) {
+#if defined(__alpha__) || defined(__sparc__) || defined(__x86_64__)
+ /* tell the kernel to search at the same place as i386 */
+ if (host_start == 0) {
+ host_start = last_start;
+ last_start += HOST_PAGE_ALIGN(len);
+ }
+#endif
+ if (qemu_host_page_size != qemu_real_host_page_size) {
+ /* NOTE: this code is only for debugging with '-p' option */
+ /* reserve a memory area */
+ host_len = HOST_PAGE_ALIGN(len) + qemu_host_page_size - TARGET_PAGE_SIZE;
+ host_start = (long)mmap((void *)host_start, host_len, PROT_NONE,
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (host_start == -1)
+ return host_start;
+ host_end = host_start + host_len;
+ start = HOST_PAGE_ALIGN(host_start);
+ end = start + HOST_PAGE_ALIGN(len);
+ if (start > host_start)
+ munmap((void *)host_start, start - host_start);
+ if (end < host_end)
+ munmap((void *)end, host_end - end);
+ /* use it as a fixed mapping */
+ flags |= MAP_FIXED;
+ } else {
+ /* if not fixed, no need to do anything */
+ host_offset = offset & qemu_host_page_mask;
+ host_len = len + offset - host_offset;
+ start = (long)mmap((void *)host_start, host_len,
+ prot, flags, fd, host_offset);
+ if (start == -1)
+ return start;
+ /* update start so that it points to the file position at 'offset' */
+ if (!(flags & MAP_ANONYMOUS))
+ start += offset - host_offset;
+ goto the_end1;
+ }
+ }
+
+ if (start & ~TARGET_PAGE_MASK)
+ return -EINVAL;
+ end = start + len;
+ host_end = HOST_PAGE_ALIGN(end);
+
+ /* worst case: we cannot map the file because the offset is not
+ aligned, so we read it */
+ if (!(flags & MAP_ANONYMOUS) &&
+ (offset & ~qemu_host_page_mask) != (start & ~qemu_host_page_mask)) {
+ /* msync() won't work here, so we return an error if write is
+ possible while it is a shared mapping */
+#ifndef __APPLE__
+ if ((flags & MAP_TYPE) == MAP_SHARED &&
+#else
+ if ((flags & MAP_SHARED) &&
+#endif
+ (prot & PROT_WRITE))
+ return -EINVAL;
+ retaddr = target_mmap(start, len, prot | PROT_WRITE,
+ MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
+ -1, 0);
+ if (retaddr == -1)
+ return retaddr;
+ pread(fd, (void *)start, len, offset);
+ if (!(prot & PROT_WRITE)) {
+ ret = target_mprotect(start, len, prot);
+ if (ret != 0)
+ return ret;
+ }
+ goto the_end;
+ }
+
+ /* handle the start of the mapping */
+ if (start > host_start) {
+ if (host_end == host_start + qemu_host_page_size) {
+ /* one single host page */
+ ret = mmap_frag(host_start, start, end,
+ prot, flags, fd, offset);
+ if (ret == -1)
+ return ret;
+ goto the_end1;
+ }
+ ret = mmap_frag(host_start, start, host_start + qemu_host_page_size,
+ prot, flags, fd, offset);
+ if (ret == -1)
+ return ret;
+ host_start += qemu_host_page_size;
+ }
+ /* handle the end of the mapping */
+ if (end < host_end) {
+ ret = mmap_frag(host_end - qemu_host_page_size,
+ host_end - qemu_host_page_size, host_end,
+ prot, flags, fd,
+ offset + host_end - qemu_host_page_size - start);
+ if (ret == -1)
+ return ret;
+ host_end -= qemu_host_page_size;
+ }
+
+ /* map the middle (easier) */
+ if (host_start < host_end) {
+ unsigned long offset1;
+ if (flags & MAP_ANONYMOUS)
+ offset1 = 0;
+ else
+ offset1 = offset + host_start - start;
+ ret = (long)mmap((void *)host_start, host_end - host_start,
+ prot, flags, fd, offset1);
+ if (ret == -1)
+ return ret;
+ }
+ the_end1:
+ page_set_flags(start, start + len, prot | PAGE_VALID);
+ the_end:
+#ifdef DEBUG_MMAP
+ printf("target_mmap: ret=0x%lx\n", (long)start);
+ page_dump(stdout);
+ printf("\n");
+#endif
+ return start;
+}
+
+int target_munmap(unsigned long start, unsigned long len)
+{
+ unsigned long end, host_start, host_end, addr;
+ int prot, ret;
+
+#ifdef DEBUG_MMAP
+ printf("munmap: start=0x%lx len=0x%lx\n", start, len);
+#endif
+ if (start & ~TARGET_PAGE_MASK)
+ return -EINVAL;
+ len = TARGET_PAGE_ALIGN(len);
+ if (len == 0)
+ return -EINVAL;
+ end = start + len;
+ host_start = start & qemu_host_page_mask;
+ host_end = HOST_PAGE_ALIGN(end);
+
+ if (start > host_start) {
+ /* handle host page containing start */
+ prot = 0;
+ for(addr = host_start; addr < start; addr += TARGET_PAGE_SIZE) {
+ prot |= page_get_flags(addr);
+ }
+ if (host_end == host_start + qemu_host_page_size) {
+ for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {
+ prot |= page_get_flags(addr);
+ }
+ end = host_end;
+ }
+ if (prot != 0)
+ host_start += qemu_host_page_size;
+ }
+ if (end < host_end) {
+ prot = 0;
+ for(addr = end; addr < host_end; addr += TARGET_PAGE_SIZE) {
+ prot |= page_get_flags(addr);
+ }
+ if (prot != 0)
+ host_end -= qemu_host_page_size;
+ }
+
+ /* unmap what we can */
+ if (host_start < host_end) {
+ ret = munmap((void *)host_start, host_end - host_start);
+ if (ret != 0)
+ return ret;
+ }
+
+ page_set_flags(start, start + len, 0);
+ return 0;
+}
+
+/* XXX: currently, we only handle MAP_ANONYMOUS and not MAP_FIXED
+ blocks which have been allocated starting on a host page */
+long target_mremap(unsigned long old_addr, unsigned long old_size,
+ unsigned long new_size, unsigned long flags,
+ unsigned long new_addr)
+{
+#ifndef __APPLE__
+ /* XXX: use 5 args syscall */
+ new_addr = (long)mremap((void *)old_addr, old_size, new_size, flags);
+ if (new_addr == -1)
+ return new_addr;
+ prot = page_get_flags(old_addr);
+ page_set_flags(old_addr, old_addr + old_size, 0);
+ page_set_flags(new_addr, new_addr + new_size, prot | PAGE_VALID);
+ return new_addr;
+#else
+ qerror("target_mremap: unsupported\n");
+#endif
+
+}
+
+int target_msync(unsigned long start, unsigned long len, int flags)
+{
+ unsigned long end;
+
+ if (start & ~TARGET_PAGE_MASK)
+ return -EINVAL;
+ len = TARGET_PAGE_ALIGN(len);
+ end = start + len;
+ if (end < start)
+ return -EINVAL;
+ if (end == start)
+ return 0;
+
+ start &= qemu_host_page_mask;
+ return msync((void *)start, end - start, flags);
+}
diff --git a/qemu-0.15.x/darwin-user/qemu.h b/qemu-0.15.x/darwin-user/qemu.h
new file mode 100644
index 0000000..b6d3e6c
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/qemu.h
@@ -0,0 +1,178 @@
+#ifndef GEMU_H
+#define GEMU_H
+
+#include <signal.h>
+#include <string.h>
+
+#include "cpu.h"
+
+#include "thunk.h"
+
+#include "gdbstub.h"
+
+typedef siginfo_t target_siginfo_t;
+#define target_sigaction sigaction
+#ifdef TARGET_I386
+struct target_pt_regs {
+ long ebx;
+ long ecx;
+ long edx;
+ long esi;
+ long edi;
+ long ebp;
+ long eax;
+ int xds;
+ int xes;
+ long orig_eax;
+ long eip;
+ int xcs;
+ long eflags;
+ long esp;
+ int xss;
+};
+struct target_sigcontext {
+ int sc_onstack;
+ int sc_mask;
+ int sc_eax;
+ int sc_ebx;
+ int sc_ecx;
+ int sc_edx;
+ int sc_edi;
+ int sc_esi;
+ int sc_ebp;
+ int sc_esp;
+ int sc_ss;
+ int sc_eflags;
+ int sc_eip;
+ int sc_cs;
+ int sc_ds;
+ int sc_es;
+ int sc_fs;
+ int sc_gs;
+};
+
+#define __USER_CS (0x17)
+#define __USER_DS (0x1F)
+
+#elif defined(TARGET_PPC)
+struct target_pt_regs {
+ unsigned long gpr[32];
+ unsigned long nip;
+ unsigned long msr;
+ unsigned long orig_gpr3; /* Used for restarting system calls */
+ unsigned long ctr;
+ unsigned long link;
+ unsigned long xer;
+ unsigned long ccr;
+ unsigned long mq; /* 601 only (not used at present) */
+ /* Used on APUS to hold IPL value. */
+ unsigned long trap; /* Reason for being here */
+ unsigned long dar; /* Fault registers */
+ unsigned long dsisr;
+ unsigned long result; /* Result of a system call */
+};
+
+struct target_sigcontext {
+ int sc_onstack; /* sigstack state to restore */
+ int sc_mask; /* signal mask to restore */
+ int sc_ir; /* pc */
+ int sc_psw; /* processor status word */
+ int sc_sp; /* stack pointer if sc_regs == NULL */
+ void *sc_regs; /* (kernel private) saved state */
+};
+
+#endif
+
+typedef struct TaskState {
+ struct TaskState *next;
+ int used; /* non zero if used */
+ uint8_t stack[0];
+} __attribute__((aligned(16))) TaskState;
+
+void syscall_init(void);
+long do_mach_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3,
+ uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7, uint32_t arg8);
+long do_thread_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3,
+ uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7, uint32_t arg8);
+long do_unix_syscall(void *cpu_env, int num);
+int do_sigaction(int sig, const struct sigaction *act,
+ struct sigaction *oact);
+int do_sigaltstack(const struct sigaltstack *ss, struct sigaltstack *oss);
+
+void gemu_log(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
+void qerror(const char *fmt, ...) GCC_FMT_ATTR(1, 2);
+
+void write_dt(void *ptr, unsigned long addr, unsigned long limit, int flags);
+
+extern CPUState *global_env;
+void cpu_loop(CPUState *env);
+void init_paths(const char *prefix);
+const char *path(const char *pathname);
+
+#include "qemu-log.h"
+
+/* commpage.c */
+void commpage_init(void);
+void do_commpage(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3,
+ uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7, uint32_t arg8);
+
+/* signal.c */
+void process_pending_signals(void *cpu_env);
+void signal_init(void);
+int queue_signal(int sig, target_siginfo_t *info);
+void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info);
+void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo);
+long do_sigreturn(CPUState *env, int num);
+
+/* machload.c */
+int mach_exec(const char * filename, char ** argv, char ** envp,
+ struct target_pt_regs * regs);
+
+/* mmap.c */
+int target_mprotect(unsigned long start, unsigned long len, int prot);
+long target_mmap(unsigned long start, unsigned long len, int prot,
+ int flags, int fd, unsigned long offset);
+int target_munmap(unsigned long start, unsigned long len);
+long target_mremap(unsigned long old_addr, unsigned long old_size,
+ unsigned long new_size, unsigned long flags,
+ unsigned long new_addr);
+int target_msync(unsigned long start, unsigned long len, int flags);
+
+/* user access */
+
+/* XXX: todo protect every memory access */
+#define lock_user(x,y,z) (void*)(x)
+#define unlock_user(x,y,z)
+
+/* Mac OS X ABI arguments processing */
+#ifdef TARGET_I386
+static inline uint32_t get_int_arg(int *i, CPUX86State *cpu_env)
+{
+ uint32_t *args = (uint32_t*)(cpu_env->regs[R_ESP] + 4 + *i);
+ *i+=4;
+ return tswap32(*args);
+}
+static inline uint64_t get_int64_arg(int *i, CPUX86State *cpu_env)
+{
+ uint64_t *args = (uint64_t*)(cpu_env->regs[R_ESP] + 4 + *i);
+ *i+=8;
+ return tswap64(*args);
+}
+#elif defined(TARGET_PPC)
+static inline uint32_t get_int_arg(int *i, CPUPPCState *cpu_env)
+{
+ /* XXX: won't work when args goes on stack after gpr10 */
+ uint32_t args = (uint32_t)(cpu_env->gpr[3+(*i & 0xff)/4]);
+ *i+=4;
+ return tswap32(args);
+}
+static inline uint64_t get_int64_arg(int *i, CPUPPCState *cpu_env)
+{
+ /* XXX: won't work when args goes on stack after gpr10 */
+ uint64_t args = (uint64_t)(cpu_env->fpr[1+(*i >> 8)/8]);
+ *i+=(8 << 8) + 8;
+ return tswap64(args);
+}
+#endif
+
+#endif
diff --git a/qemu-0.15.x/darwin-user/signal.c b/qemu-0.15.x/darwin-user/signal.c
new file mode 100644
index 0000000..e2adca3
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/signal.c
@@ -0,0 +1,454 @@
+/*
+ * Emulation of Linux signals
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <errno.h>
+#include <sys/ucontext.h>
+
+#ifdef __ia64__
+#undef uc_mcontext
+#undef uc_sigmask
+#undef uc_stack
+#undef uc_link
+#endif
+
+#include "qemu.h"
+#include "qemu-common.h"
+
+#define DEBUG_SIGNAL
+
+#define MAX_SIGQUEUE_SIZE 1024
+
+struct sigqueue {
+ struct sigqueue *next;
+ target_siginfo_t info;
+};
+
+struct emulated_sigaction {
+ struct target_sigaction sa;
+ int pending; /* true if signal is pending */
+ struct sigqueue *first;
+ struct sigqueue info; /* in order to always have memory for the
+ first signal, we put it here */
+};
+
+static struct sigaltstack target_sigaltstack_used = {
+ 0, 0, SA_DISABLE
+};
+
+static struct emulated_sigaction sigact_table[NSIG];
+static struct sigqueue sigqueue_table[MAX_SIGQUEUE_SIZE]; /* siginfo queue */
+static struct sigqueue *first_free; /* first free siginfo queue entry */
+static int signal_pending; /* non zero if a signal may be pending */
+
+static void host_signal_handler(int host_signum, siginfo_t *info,
+ void *puc);
+
+
+static inline int host_to_target_signal(int sig)
+{
+ return sig;
+}
+
+static inline int target_to_host_signal(int sig)
+{
+ return sig;
+}
+
+/* siginfo conversion */
+
+
+
+void host_to_target_siginfo(target_siginfo_t *tinfo, const siginfo_t *info)
+{
+
+}
+
+void target_to_host_siginfo(siginfo_t *info, const target_siginfo_t *tinfo)
+{
+
+}
+
+void signal_init(void)
+{
+ struct sigaction act;
+ int i;
+
+ /* set all host signal handlers. ALL signals are blocked during
+ the handlers to serialize them. */
+ sigfillset(&act.sa_mask);
+ act.sa_flags = SA_SIGINFO;
+ act.sa_sigaction = host_signal_handler;
+ for(i = 1; i < NSIG; i++) {
+ sigaction(i, &act, NULL);
+ }
+
+ memset(sigact_table, 0, sizeof(sigact_table));
+
+ first_free = &sigqueue_table[0];
+ for(i = 0; i < MAX_SIGQUEUE_SIZE - 1; i++)
+ sigqueue_table[i].next = &sigqueue_table[i + 1];
+ sigqueue_table[MAX_SIGQUEUE_SIZE - 1].next = NULL;
+}
+
+/* signal queue handling */
+
+static inline struct sigqueue *alloc_sigqueue(void)
+{
+ struct sigqueue *q = first_free;
+ if (!q)
+ return NULL;
+ first_free = q->next;
+ return q;
+}
+
+static inline void free_sigqueue(struct sigqueue *q)
+{
+ q->next = first_free;
+ first_free = q;
+}
+
+/* abort execution with signal */
+void QEMU_NORETURN force_sig(int sig)
+{
+ int host_sig;
+ host_sig = target_to_host_signal(sig);
+ fprintf(stderr, "qemu: uncaught target signal %d (%s) - exiting\n",
+ sig, strsignal(host_sig));
+ _exit(-host_sig);
+}
+
+/* queue a signal so that it will be send to the virtual CPU as soon
+ as possible */
+int queue_signal(int sig, target_siginfo_t *info)
+{
+ struct emulated_sigaction *k;
+ struct sigqueue *q, **pq;
+ target_ulong handler;
+
+#if defined(DEBUG_SIGNAL)
+ fprintf(stderr, "queue_signal: sig=%d\n",
+ sig);
+#endif
+ k = &sigact_table[sig - 1];
+ handler = (target_ulong)k->sa.sa_handler;
+ if (handler == SIG_DFL) {
+ /* default handler : ignore some signal. The other are fatal */
+ if (sig != SIGCHLD &&
+ sig != SIGURG &&
+ sig != SIGWINCH) {
+ force_sig(sig);
+ } else {
+ return 0; /* indicate ignored */
+ }
+ } else if (handler == host_to_target_signal(SIG_IGN)) {
+ /* ignore signal */
+ return 0;
+ } else if (handler == host_to_target_signal(SIG_ERR)) {
+ force_sig(sig);
+ } else {
+ pq = &k->first;
+ if (!k->pending) {
+ /* first signal */
+ q = &k->info;
+ } else {
+ q = alloc_sigqueue();
+ if (!q)
+ return -EAGAIN;
+ while (*pq != NULL)
+ pq = &(*pq)->next;
+ }
+ *pq = q;
+ q->info = *info;
+ q->next = NULL;
+ k->pending = 1;
+ /* signal that a new signal is pending */
+ signal_pending = 1;
+ return 1; /* indicates that the signal was queued */
+ }
+}
+
+static void host_signal_handler(int host_signum, siginfo_t *info,
+ void *puc)
+{
+ int sig;
+ target_siginfo_t tinfo;
+
+ /* the CPU emulator uses some host signals to detect exceptions,
+ we we forward to it some signals */
+ if (host_signum == SIGSEGV || host_signum == SIGBUS) {
+ if (cpu_signal_handler(host_signum, (void*)info, puc))
+ return;
+ }
+
+ /* get target signal number */
+ sig = host_to_target_signal(host_signum);
+ if (sig < 1 || sig > NSIG)
+ return;
+
+#if defined(DEBUG_SIGNAL)
+ fprintf(stderr, "qemu: got signal %d\n", sig);
+#endif
+ if (queue_signal(sig, &tinfo) == 1) {
+ /* interrupt the virtual CPU as soon as possible */
+ cpu_exit(global_env);
+ }
+}
+
+int do_sigaltstack(const struct sigaltstack *ss, struct sigaltstack *oss)
+{
+ /* XXX: test errors */
+ if(oss)
+ {
+ oss->ss_sp = tswap32(target_sigaltstack_used.ss_sp);
+ oss->ss_size = tswap32(target_sigaltstack_used.ss_size);
+ oss->ss_flags = tswap32(target_sigaltstack_used.ss_flags);
+ }
+ if(ss)
+ {
+ target_sigaltstack_used.ss_sp = tswap32(ss->ss_sp);
+ target_sigaltstack_used.ss_size = tswap32(ss->ss_size);
+ target_sigaltstack_used.ss_flags = tswap32(ss->ss_flags);
+ }
+ return 0;
+}
+
+int do_sigaction(int sig, const struct sigaction *act,
+ struct sigaction *oact)
+{
+ struct emulated_sigaction *k;
+ struct sigaction act1;
+ int host_sig;
+
+ if (sig < 1 || sig > NSIG)
+ return -EINVAL;
+
+ k = &sigact_table[sig - 1];
+#if defined(DEBUG_SIGNAL)
+ fprintf(stderr, "sigaction 1 sig=%d act=0x%08x, oact=0x%08x\n",
+ sig, (int)act, (int)oact);
+#endif
+ if (oact) {
+#if defined(DEBUG_SIGNAL)
+ fprintf(stderr, "sigaction 1 sig=%d act=0x%08x, oact=0x%08x\n",
+ sig, (int)act, (int)oact);
+#endif
+
+ oact->sa_handler = tswapl(k->sa.sa_handler);
+ oact->sa_flags = tswapl(k->sa.sa_flags);
+ oact->sa_mask = tswapl(k->sa.sa_mask);
+ }
+ if (act) {
+#if defined(DEBUG_SIGNAL)
+ fprintf(stderr, "sigaction handler 0x%x flag 0x%x mask 0x%x\n",
+ act->sa_handler, act->sa_flags, act->sa_mask);
+#endif
+
+ k->sa.sa_handler = tswapl(act->sa_handler);
+ k->sa.sa_flags = tswapl(act->sa_flags);
+ k->sa.sa_mask = tswapl(act->sa_mask);
+ /* we update the host signal state */
+ host_sig = target_to_host_signal(sig);
+ if (host_sig != SIGSEGV && host_sig != SIGBUS) {
+#if defined(DEBUG_SIGNAL)
+ fprintf(stderr, "sigaction handler going to call sigaction\n",
+ act->sa_handler, act->sa_flags, act->sa_mask);
+#endif
+
+ sigfillset(&act1.sa_mask);
+ act1.sa_flags = SA_SIGINFO;
+ if (k->sa.sa_flags & SA_RESTART)
+ act1.sa_flags |= SA_RESTART;
+ /* NOTE: it is important to update the host kernel signal
+ ignore state to avoid getting unexpected interrupted
+ syscalls */
+ if (k->sa.sa_handler == SIG_IGN) {
+ act1.sa_sigaction = (void *)SIG_IGN;
+ } else if (k->sa.sa_handler == SIG_DFL) {
+ act1.sa_sigaction = (void *)SIG_DFL;
+ } else {
+ act1.sa_sigaction = host_signal_handler;
+ }
+ sigaction(host_sig, &act1, NULL);
+ }
+ }
+ return 0;
+}
+
+
+#ifdef TARGET_I386
+
+static inline void *
+get_sigframe(struct emulated_sigaction *ka, CPUX86State *env, size_t frame_size)
+{
+ /* XXX Fix that */
+ if(target_sigaltstack_used.ss_flags & SA_DISABLE)
+ {
+ int esp;
+ /* Default to using normal stack */
+ esp = env->regs[R_ESP];
+
+ return (void *)((esp - frame_size) & -8ul);
+ }
+ else
+ {
+ return target_sigaltstack_used.ss_sp;
+ }
+}
+
+static void setup_frame(int sig, struct emulated_sigaction *ka,
+ void *set, CPUState *env)
+{
+ void *frame;
+ int i, err = 0;
+
+ fprintf(stderr, "setup_frame %d\n", sig);
+ frame = get_sigframe(ka, env, sizeof(*frame));
+
+ /* Set up registers for signal handler */
+ env->regs[R_ESP] = (unsigned long) frame;
+ env->eip = (unsigned long) ka->sa.sa_handler;
+
+ env->eflags &= ~TF_MASK;
+
+ return;
+
+give_sigsegv:
+ if (sig == SIGSEGV)
+ ka->sa.sa_handler = SIG_DFL;
+ force_sig(SIGSEGV /* , current */);
+}
+
+long do_sigreturn(CPUState *env, int num)
+{
+ int i = 0;
+ struct target_sigcontext *scp = get_int_arg(&i, env);
+ /* XXX Get current signal number */
+ /* XXX Adjust accordin to sc_onstack, sc_mask */
+ if(tswapl(scp->sc_onstack) & 0x1)
+ target_sigaltstack_used.ss_flags |= ~SA_DISABLE;
+ else
+ target_sigaltstack_used.ss_flags &= SA_DISABLE;
+ int set = tswapl(scp->sc_eax);
+ sigprocmask(SIG_SETMASK, &set, NULL);
+
+ fprintf(stderr, "do_sigreturn: partially implemented %x EAX:%x EBX:%x\n", scp->sc_mask, tswapl(scp->sc_eax), tswapl(scp->sc_ebx));
+ fprintf(stderr, "ECX:%x EDX:%x EDI:%x\n", scp->sc_ecx, tswapl(scp->sc_edx), tswapl(scp->sc_edi));
+ fprintf(stderr, "EIP:%x\n", tswapl(scp->sc_eip));
+
+ env->regs[R_EAX] = tswapl(scp->sc_eax);
+ env->regs[R_EBX] = tswapl(scp->sc_ebx);
+ env->regs[R_ECX] = tswapl(scp->sc_ecx);
+ env->regs[R_EDX] = tswapl(scp->sc_edx);
+ env->regs[R_EDI] = tswapl(scp->sc_edi);
+ env->regs[R_ESI] = tswapl(scp->sc_esi);
+ env->regs[R_EBP] = tswapl(scp->sc_ebp);
+ env->regs[R_ESP] = tswapl(scp->sc_esp);
+ env->segs[R_SS].selector = (void*)tswapl(scp->sc_ss);
+ env->eflags = tswapl(scp->sc_eflags);
+ env->eip = tswapl(scp->sc_eip);
+ env->segs[R_CS].selector = (void*)tswapl(scp->sc_cs);
+ env->segs[R_DS].selector = (void*)tswapl(scp->sc_ds);
+ env->segs[R_ES].selector = (void*)tswapl(scp->sc_es);
+ env->segs[R_FS].selector = (void*)tswapl(scp->sc_fs);
+ env->segs[R_GS].selector = (void*)tswapl(scp->sc_gs);
+
+ /* Again, because our caller's caller will reset EAX */
+ return env->regs[R_EAX];
+}
+
+#else
+
+static void setup_frame(int sig, struct emulated_sigaction *ka,
+ void *set, CPUState *env)
+{
+ fprintf(stderr, "setup_frame: not implemented\n");
+}
+
+long do_sigreturn(CPUState *env, int num)
+{
+ int i = 0;
+ struct target_sigcontext *scp = get_int_arg(&i, env);
+ fprintf(stderr, "do_sigreturn: not implemented\n");
+ return -ENOSYS;
+}
+
+#endif
+
+void process_pending_signals(void *cpu_env)
+{
+ struct emulated_sigaction *k;
+ struct sigqueue *q;
+ target_ulong handler;
+ int sig;
+
+ if (!signal_pending)
+ return;
+
+ k = sigact_table;
+
+ for(sig = 1; sig <= NSIG; sig++) {
+ if (k->pending)
+ goto handle_signal;
+ k++;
+ }
+
+ /* if no signal is pending, just return */
+ signal_pending = 0;
+ return;
+handle_signal:
+ #ifdef DEBUG_SIGNAL
+ fprintf(stderr, "qemu: process signal %d\n", sig);
+ #endif
+ /* dequeue signal */
+ q = k->first;
+ k->first = q->next;
+ if (!k->first)
+ k->pending = 0;
+
+ sig = gdb_handlesig (cpu_env, sig);
+ if (!sig) {
+ fprintf (stderr, "Lost signal\n");
+ abort();
+ }
+
+ handler = k->sa.sa_handler;
+ if (handler == SIG_DFL) {
+ /* default handler : ignore some signal. The other are fatal */
+ if (sig != SIGCHLD &&
+ sig != SIGURG &&
+ sig != SIGWINCH) {
+ force_sig(sig);
+ }
+ } else if (handler == SIG_IGN) {
+ /* ignore sig */
+ } else if (handler == SIG_ERR) {
+ force_sig(sig);
+ } else {
+
+ setup_frame(sig, k, 0, cpu_env);
+ if (k->sa.sa_flags & SA_RESETHAND)
+ k->sa.sa_handler = SIG_DFL;
+ }
+ if (q != &k->info)
+ free_sigqueue(q);
+}
diff --git a/qemu-0.15.x/darwin-user/syscall.c b/qemu-0.15.x/darwin-user/syscall.c
new file mode 100644
index 0000000..f3cc1f8
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/syscall.c
@@ -0,0 +1,1566 @@
+/*
+ * Darwin syscalls
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ * Copyright (c) 2006 Pierre d'Herbemont
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <mach/host_info.h>
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+#include <mach/message.h>
+
+#include <pthread.h>
+#include <dirent.h>
+
+#include <sys/stat.h>
+#include <sys/syscall.h>
+#include <sys/sysctl.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/dirent.h>
+#include <sys/uio.h>
+#include <sys/termios.h>
+#include <sys/ptrace.h>
+#include <net/if.h>
+
+#include <sys/param.h>
+#include <sys/mount.h>
+
+#include <sys/attr.h>
+
+#include <mach/ndr.h>
+#include <mach/mig_errors.h>
+
+#include <sys/xattr.h>
+
+#include "qemu.h"
+
+//#define DEBUG_SYSCALL
+
+#ifdef DEBUG_SYSCALL
+# define DEBUG_FORCE_ENABLE_LOCAL() int __DEBUG_qemu_user_force_enable = 1
+# define DEBUG_BEGIN_ENABLE __DEBUG_qemu_user_force_enable = 1;
+# define DEBUG_END_ENABLE __DEBUG_qemu_user_force_enable = 0;
+
+# define DEBUG_DISABLE_ALL() static int __DEBUG_qemu_user_force_enable = 0
+# define DEBUG_ENABLE_ALL() static int __DEBUG_qemu_user_force_enable = 1
+ DEBUG_ENABLE_ALL();
+
+# define DPRINTF(...) do { qemu_log(__VA_ARGS__); \
+ if(__DEBUG_qemu_user_force_enable) fprintf(stderr, __VA_ARGS__); \
+ } while(0)
+#else
+# define DEBUG_FORCE_ENABLE_LOCAL()
+# define DEBUG_BEGIN_ENABLE
+# define DEBUG_END_ENABLE
+
+# define DPRINTF(...) do { qemu_log(__VA_ARGS__); } while(0)
+#endif
+
+enum {
+ bswap_out = 0,
+ bswap_in = 1
+};
+
+extern const char *interp_prefix;
+
+static inline long get_errno(long ret)
+{
+ if (ret == -1)
+ return -errno;
+ else
+ return ret;
+}
+
+static inline int is_error(long ret)
+{
+ return (unsigned long)ret >= (unsigned long)(-4096);
+}
+
+/* ------------------------------------------------------------
+ Mach syscall handling
+*/
+
+void static inline print_description_msg_header(mach_msg_header_t *hdr)
+{
+ char *name = NULL;
+ int i;
+ struct { int number; char *name; } msg_name[] =
+ {
+ /* see http://fxr.watson.org/fxr/source/compat/mach/mach_namemap.c?v=NETBSD */
+ { 200, "host_info" },
+ { 202, "host_page_size" },
+ { 206, "host_get_clock_service" },
+ { 206, "host_get_clock_service" },
+ { 206, "host_get_clock_service" },
+ { 306, "host_get_clock_service" },
+ { 3204, "mach_port_allocate" },
+ { 3206, "mach_port_deallocate" },
+ { 3404, "mach_ports_lookup" },
+ { 3409, "mach_task_get_special_port" },
+ { 3414, "mach_task_get_exception_ports" },
+ { 3418, "mach_semaphore_create" },
+ { 3504, "mach_semaphore_create" },
+ { 3509, "mach_semaphore_create" },
+ { 3518, "semaphore_create" },
+ { 3616, "thread_policy" },
+ { 3801, "vm_allocate" },
+ { 3802, "vm_deallocate" },
+ { 3802, "vm_deallocate" },
+ { 3803, "vm_protect" },
+ { 3812, "vm_map" },
+ { 4241776, "lu_message_send_id" }, /* lookupd */
+ { 4241876, "lu_message_reply_id" }, /* lookupd */
+ };
+
+ for(i = 0; i < ARRAY_SIZE(msg_name); i++) {
+ if(msg_name[i].number == hdr->msgh_id)
+ {
+ name = msg_name[i].name;
+ break;
+ }
+ }
+ if(!name)
+ DPRINTF("unknown mach msg %d 0x%x\n", hdr->msgh_id, hdr->msgh_id);
+ else
+ DPRINTF("%s\n", name);
+#if 0
+ DPRINTF("Bits: %8x\n", hdr->msgh_bits);
+ DPRINTF("Size: %8x\n", hdr->msgh_size);
+ DPRINTF("Rmte: %8x\n", hdr->msgh_remote_port);
+ DPRINTF("Locl: %8x\n", hdr->msgh_local_port);
+ DPRINTF("Rsrv: %8x\n", hdr->msgh_reserved);
+
+ DPRINTF("Id : %8x\n", hdr->msgh_id);
+
+ NDR_record_t *ndr = (NDR_record_t *)(hdr + 1);
+ DPRINTF("hdr = %p, sizeof(hdr) = %x, NDR = %p\n", hdr, (unsigned int)sizeof(mach_msg_header_t), ndr);
+ DPRINTF("%d %d %d %d %d %d %d %d\n",
+ ndr->mig_vers, ndr->if_vers, ndr->reserved1, ndr->mig_encoding,
+ ndr->int_rep, ndr->char_rep, ndr->float_rep, ndr->reserved2);
+#endif
+}
+
+static inline void print_mach_msg_return(mach_msg_return_t ret)
+{
+ int i, found = 0;
+#define MACH_MSG_RET(msg) { msg, #msg }
+ struct { int code; char *name; } msg_name[] =
+ {
+ /* ref: http://darwinsource.opendarwin.org/10.4.2/xnu-792.2.4/osfmk/man/mach_msg.ht… */
+ /* send message */
+ MACH_MSG_RET(MACH_SEND_MSG_TOO_SMALL),
+ MACH_MSG_RET(MACH_SEND_NO_BUFFER),
+ MACH_MSG_RET(MACH_SEND_INVALID_DATA),
+ MACH_MSG_RET(MACH_SEND_INVALID_HEADER),
+ MACH_MSG_RET(MACH_SEND_INVALID_DEST),
+ MACH_MSG_RET(MACH_SEND_INVALID_NOTIFY),
+ MACH_MSG_RET(MACH_SEND_INVALID_REPLY),
+ MACH_MSG_RET(MACH_SEND_INVALID_TRAILER),
+ MACH_MSG_RET(MACH_SEND_INVALID_MEMORY),
+ MACH_MSG_RET(MACH_SEND_INVALID_RIGHT),
+ MACH_MSG_RET(MACH_SEND_INVALID_TYPE),
+ MACH_MSG_RET(MACH_SEND_INTERRUPTED),
+ MACH_MSG_RET(MACH_SEND_TIMED_OUT),
+
+ MACH_MSG_RET(MACH_RCV_BODY_ERROR),
+ MACH_MSG_RET(MACH_RCV_HEADER_ERROR),
+
+ MACH_MSG_RET(MACH_RCV_IN_SET),
+ MACH_MSG_RET(MACH_RCV_INTERRUPTED),
+
+ MACH_MSG_RET(MACH_RCV_INVALID_DATA),
+ MACH_MSG_RET(MACH_RCV_INVALID_NAME),
+ MACH_MSG_RET(MACH_RCV_INVALID_NOTIFY),
+ MACH_MSG_RET(MACH_RCV_INVALID_TRAILER),
+ MACH_MSG_RET(MACH_RCV_INVALID_TYPE),
+
+ MACH_MSG_RET(MACH_RCV_PORT_CHANGED),
+ MACH_MSG_RET(MACH_RCV_PORT_DIED),
+
+ MACH_MSG_RET(MACH_RCV_SCATTER_SMALL),
+ MACH_MSG_RET(MACH_RCV_TIMED_OUT),
+ MACH_MSG_RET(MACH_RCV_TOO_LARGE)
+ };
+#undef MACH_MSG_RET
+
+ if( ret == MACH_MSG_SUCCESS)
+ DPRINTF("MACH_MSG_SUCCESS\n");
+ else
+ {
+ for( i = 0; i < ARRAY_SIZE(msg_name); i++) {
+ if(msg_name[i].code == ret) {
+ DPRINTF("%s\n", msg_name[i].name);
+ found = 1;
+ break;
+ }
+ }
+ if(!found)
+ qerror("unknow mach message ret code %d\n", ret);
+ }
+}
+
+static inline void swap_mach_msg_header(mach_msg_header_t *hdr)
+{
+ hdr->msgh_bits = tswap32(hdr->msgh_bits);
+ hdr->msgh_size = tswap32(hdr->msgh_size);
+ hdr->msgh_remote_port = tswap32(hdr->msgh_remote_port);
+ hdr->msgh_local_port = tswap32(hdr->msgh_local_port);
+ hdr->msgh_reserved = tswap32(hdr->msgh_reserved);
+ hdr->msgh_id = tswap32(hdr->msgh_id);
+}
+
+struct complex_msg {
+ mach_msg_header_t hdr;
+ mach_msg_body_t body;
+};
+
+static inline void swap_mach_msg_body(struct complex_msg *complex_msg, int bswap)
+{
+ mach_msg_port_descriptor_t *descr = (mach_msg_port_descriptor_t *)(complex_msg+1);
+ int i,j;
+
+ if(bswap == bswap_in)
+ tswap32s(&complex_msg->body.msgh_descriptor_count);
+
+ DPRINTF("body.msgh_descriptor_count %d\n", complex_msg->body.msgh_descriptor_count);
+
+ for(i = 0; i < complex_msg->body.msgh_descriptor_count; i++) {
+ switch(descr->type)
+ {
+ case MACH_MSG_PORT_DESCRIPTOR:
+ tswap32s(&descr->name);
+ descr++;
+ break;
+ case MACH_MSG_OOL_DESCRIPTOR:
+ {
+ mach_msg_ool_descriptor_t *ool = (void *)descr;
+ tswap32s((uint32_t *)&ool->address);
+ tswap32s(&ool->size);
+
+ descr = (mach_msg_port_descriptor_t *)(ool+1);
+ break;
+ }
+ case MACH_MSG_OOL_PORTS_DESCRIPTOR:
+ {
+ mach_msg_ool_ports_descriptor_t *ool_ports = (void *)descr;
+ mach_port_name_t * port_names;
+
+ if(bswap == bswap_in)
+ {
+ tswap32s((uint32_t *)&ool_ports->address);
+ tswap32s(&ool_ports->count);
+ }
+
+ port_names = ool_ports->address;
+
+ for(j = 0; j < ool_ports->count; j++)
+ tswap32s(&port_names[j]);
+
+ if(bswap == bswap_out)
+ {
+ tswap32s((uint32_t *)&ool_ports->address);
+ tswap32s(&ool_ports->count);
+ }
+
+ descr = (mach_msg_port_descriptor_t *)(ool_ports+1);
+ break;
+ }
+ default: qerror("unknow mach msg descriptor type %x\n", descr->type);
+ }
+ }
+ if(bswap == bswap_out)
+ tswap32s(&complex_msg->body.msgh_descriptor_count);
+}
+
+static inline void swap_mach_msg(mach_msg_header_t *hdr, int bswap)
+{
+ if (bswap == bswap_out && hdr->msgh_bits & MACH_MSGH_BITS_COMPLEX)
+ swap_mach_msg_body((struct complex_msg *)hdr, bswap);
+
+ swap_mach_msg_header(hdr);
+
+ if (bswap == bswap_in && hdr->msgh_bits & MACH_MSGH_BITS_COMPLEX)
+ swap_mach_msg_body((struct complex_msg *)hdr, bswap);
+}
+
+static inline uint32_t target_mach_msg_trap(
+ mach_msg_header_t *hdr, uint32_t options, uint32_t send_size,
+ uint32_t rcv_size, uint32_t rcv_name, uint32_t time_out, uint32_t notify)
+{
+ extern int mach_msg_trap(mach_msg_header_t *, mach_msg_option_t,
+ mach_msg_size_t, mach_msg_size_t, mach_port_t,
+ mach_msg_timeout_t, mach_port_t);
+ mach_msg_audit_trailer_t *trailer;
+ mach_msg_id_t msg_id;
+ uint32_t ret = 0;
+ int i;
+
+ swap_mach_msg(hdr, bswap_in);
+
+ msg_id = hdr->msgh_id;
+
+ print_description_msg_header(hdr);
+
+ ret = mach_msg_trap(hdr, options, send_size, rcv_size, rcv_name, time_out, notify);
+
+ print_mach_msg_return(ret);
+
+ if( (options & MACH_RCV_MSG) && (REQUESTED_TRAILER_SIZE(options) > 0) )
+ {
+ /* XXX: the kernel always return the full trailer with MACH_SEND_MSG, so we should
+ probably always bswap it */
+ /* warning: according to Mac OS X Internals (the book) msg_size might be expressed in
+ natural_t units but according to xnu/osfmk/mach/message.h: "The size of
+ the message must be specified in bytes" */
+ trailer = (mach_msg_audit_trailer_t *)((uint8_t *)hdr + hdr->msgh_size);
+ /* XXX: Should probably do that based on the option asked by the sender, but dealing
+ with kernel answer seems more sound */
+ switch(trailer->msgh_trailer_size)
+ {
+ case sizeof(mach_msg_audit_trailer_t):
+ for(i = 0; i < 8; i++)
+ tswap32s(&trailer->msgh_audit.val[i]);
+ /* Fall in mach_msg_security_trailer_t case */
+ case sizeof(mach_msg_security_trailer_t):
+ tswap32s(&trailer->msgh_sender.val[0]);
+ tswap32s(&trailer->msgh_sender.val[1]);
+ /* Fall in mach_msg_seqno_trailer_t case */
+ case sizeof(mach_msg_seqno_trailer_t):
+ tswap32s(&trailer->msgh_seqno);
+ /* Fall in mach_msg_trailer_t case */
+ case sizeof(mach_msg_trailer_t):
+ tswap32s(&trailer->msgh_trailer_type);
+ tswap32s(&trailer->msgh_trailer_size);
+ break;
+ case 0:
+ /* Safer not to byteswap, but probably wrong */
+ break;
+ default:
+ qerror("unknow trailer type given its size %d\n", trailer->msgh_trailer_size);
+ break;
+ }
+ }
+
+ /* Special message handling */
+ switch (msg_id) {
+ case 200: /* host_info */
+ {
+ mig_reply_error_t *err = (mig_reply_error_t *)hdr;
+ struct {
+ uint32_t unknow1;
+ uint32_t max_cpus;
+ uint32_t avail_cpus;
+ uint32_t memory_size;
+ uint32_t cpu_type;
+ uint32_t cpu_subtype;
+ } *data = (void *)(err+1);
+
+ DPRINTF("maxcpu = 0x%x\n", data->max_cpus);
+ DPRINTF("numcpu = 0x%x\n", data->avail_cpus);
+ DPRINTF("memsize = 0x%x\n", data->memory_size);
+
+#if defined(TARGET_I386)
+ data->cpu_type = CPU_TYPE_I386;
+ DPRINTF("cpu_type changed to 0x%x(i386)\n", data->cpu_type);
+ data->cpu_subtype = CPU_SUBTYPE_PENT;
+ DPRINTF("cpu_subtype changed to 0x%x(i386_pent)\n", data->cpu_subtype);
+#elif defined(TARGET_PPC)
+ data->cpu_type = CPU_TYPE_POWERPC;
+ DPRINTF("cpu_type changed to 0x%x(ppc)\n", data->cpu_type);
+ data->cpu_subtype = CPU_SUBTYPE_POWERPC_750;
+ DPRINTF("cpu_subtype changed to 0x%x(ppc_all)\n", data->cpu_subtype);
+#else
+# error target not supported
+#endif
+ break;
+ }
+ case 202: /* host_page_size */
+ {
+ mig_reply_error_t *err = (mig_reply_error_t *)hdr;
+ uint32_t *pagesize = (uint32_t *)(err+1);
+
+ DPRINTF("pagesize = %d\n", *pagesize);
+ break;
+ }
+ default: break;
+ }
+
+ swap_mach_msg(hdr, bswap_out);
+
+ return ret;
+}
+
+long do_mach_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3,
+ uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7,
+ uint32_t arg8)
+{
+ extern uint32_t mach_reply_port(void);
+
+ long ret = 0;
+
+ arg1 = tswap32(arg1);
+ arg2 = tswap32(arg2);
+ arg3 = tswap32(arg3);
+ arg4 = tswap32(arg4);
+ arg5 = tswap32(arg5);
+ arg6 = tswap32(arg6);
+ arg7 = tswap32(arg7);
+ arg8 = tswap32(arg8);
+
+ DPRINTF("mach syscall %d : " , num);
+
+ switch(num) {
+ /* see xnu/osfmk/mach/syscall_sw.h */
+ case -26:
+ DPRINTF("mach_reply_port()\n");
+ ret = mach_reply_port();
+ break;
+ case -27:
+ DPRINTF("mach_thread_self()\n");
+ ret = mach_thread_self();
+ break;
+ case -28:
+ DPRINTF("mach_task_self()\n");
+ ret = mach_task_self();
+ break;
+ case -29:
+ DPRINTF("mach_host_self()\n");
+ ret = mach_host_self();
+ break;
+ case -31:
+ DPRINTF("mach_msg_trap(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n",
+ arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+ ret = target_mach_msg_trap((mach_msg_header_t *)arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+ break;
+/* may need more translation if target arch is different from host */
+#if (defined(TARGET_I386) && defined(__i386__)) || (defined(TARGET_PPC) && defined(__ppc__))
+ case -33:
+ DPRINTF("semaphore_signal_trap(0x%x)\n", arg1);
+ ret = semaphore_signal_trap(arg1);
+ break;
+ case -34:
+ DPRINTF("semaphore_signal_all_trap(0x%x)\n", arg1);
+ ret = semaphore_signal_all_trap(arg1);
+ break;
+ case -35:
+ DPRINTF("semaphore_signal_thread_trap(0x%x)\n", arg1, arg2);
+ ret = semaphore_signal_thread_trap(arg1,arg2);
+ break;
+#endif
+ case -36:
+ DPRINTF("semaphore_wait_trap(0x%x)\n", arg1);
+ extern int semaphore_wait_trap(int); // XXX: is there any header for that?
+ ret = semaphore_wait_trap(arg1);
+ break;
+/* may need more translation if target arch is different from host */
+#if (defined(TARGET_I386) && defined(__i386__)) || (defined(TARGET_PPC) && defined(__ppc__))
+ case -37:
+ DPRINTF("semaphore_wait_signal_trap(0x%x, 0x%x)\n", arg1, arg2);
+ ret = semaphore_wait_signal_trap(arg1,arg2);
+ break;
+#endif
+ case -43:
+ DPRINTF("map_fd(0x%x, 0x%x, 0x%x, 0x%x, 0x%x)\n",
+ arg1, arg2, arg3, arg4, arg5);
+ ret = map_fd(arg1, arg2, (void*)arg3, arg4, arg5);
+ tswap32s((uint32_t*)arg3);
+ break;
+/* may need more translation if target arch is different from host */
+#if (defined(TARGET_I386) && defined(__i386__)) || (defined(TARGET_PPC) && defined(__ppc__))
+ case -61:
+ DPRINTF("syscall_thread_switch(0x%x, 0x%x, 0x%x)\n",
+ arg1, arg2, arg3);
+ ret = syscall_thread_switch(arg1, arg2, arg3); // just a hint to the scheduler; can drop?
+ break;
+#endif
+ case -89:
+ DPRINTF("mach_timebase_info(0x%x)\n", arg1);
+ struct mach_timebase_info info;
+ ret = mach_timebase_info(&info);
+ if(!is_error(ret))
+ {
+ struct mach_timebase_info *outInfo = (void*)arg1;
+ outInfo->numer = tswap32(info.numer);
+ outInfo->denom = tswap32(info.denom);
+ }
+ break;
+ case -90:
+ DPRINTF("mach_wait_until()\n");
+ extern int mach_wait_until(uint64_t); // XXX: is there any header for that?
+ ret = mach_wait_until(((uint64_t)arg2<<32) | (uint64_t)arg1);
+ break;
+ case -91:
+ DPRINTF("mk_timer_create()\n");
+ extern int mk_timer_create(); // XXX: is there any header for that?
+ ret = mk_timer_create();
+ break;
+ case -92:
+ DPRINTF("mk_timer_destroy()\n");
+ extern int mk_timer_destroy(int); // XXX: is there any header for that?
+ ret = mk_timer_destroy(arg1);
+ break;
+ case -93:
+ DPRINTF("mk_timer_create()\n");
+ extern int mk_timer_arm(int, uint64_t); // XXX: is there any header for that?
+ ret = mk_timer_arm(arg1, ((uint64_t)arg3<<32) | (uint64_t)arg2);
+ break;
+ case -94:
+ DPRINTF("mk_timer_cancel()\n");
+ extern int mk_timer_cancel(int, uint64_t *); // XXX: is there any header for that?
+ ret = mk_timer_cancel(arg1, (uint64_t *)arg2);
+ if((!is_error(ret)) && arg2)
+ tswap64s((uint64_t *)arg2);
+ break;
+ default:
+ gemu_log("qemu: Unsupported mach syscall: %d(0x%x)\n", num, num);
+ gdb_handlesig (cpu_env, SIGTRAP);
+ exit(0);
+ break;
+ }
+ return ret;
+}
+
+/* ------------------------------------------------------------
+ thread type syscall handling
+*/
+long do_thread_syscall(void *cpu_env, int num, uint32_t arg1, uint32_t arg2, uint32_t arg3,
+ uint32_t arg4, uint32_t arg5, uint32_t arg6, uint32_t arg7,
+ uint32_t arg8)
+{
+ extern uint32_t cthread_set_self(uint32_t);
+ extern uint32_t processor_facilities_used(void);
+ long ret = 0;
+
+ arg1 = tswap32(arg1);
+ arg2 = tswap32(arg2);
+ arg3 = tswap32(arg3);
+ arg4 = tswap32(arg4);
+ arg5 = tswap32(arg5);
+ arg6 = tswap32(arg6);
+ arg7 = tswap32(arg7);
+ arg8 = tswap32(arg8);
+
+ DPRINTF("thread syscall %d : " , num);
+
+ switch(num) {
+#ifdef TARGET_I386
+ case 0x3:
+#endif
+ case 0x7FF1: /* cthread_set_self */
+ DPRINTF("cthread_set_self(0x%x)\n", (unsigned int)arg1);
+ ret = cthread_set_self(arg1);
+#ifdef TARGET_I386
+ /* we need to update the LDT with the address of the thread */
+ write_dt((void *)(((CPUX86State *) cpu_env)->ldt.base + (4 * sizeof(uint64_t))), arg1, 1,
+ DESC_G_MASK | DESC_B_MASK | DESC_P_MASK | DESC_S_MASK |
+ (3 << DESC_DPL_SHIFT) | (0x2 << DESC_TYPE_SHIFT));
+ /* New i386 convention, %gs should be set to our this LDT entry */
+ cpu_x86_load_seg(cpu_env, R_GS, 0x27);
+ /* Old i386 convention, the kernel returns the selector for the cthread (pre-10.4.8?)*/
+ ret = 0x27;
+#endif
+ break;
+ case 0x7FF2: /* Called the super-fast pthread_self handler by the apple guys */
+ DPRINTF("pthread_self()\n");
+ ret = (uint32_t)pthread_self();
+ break;
+ case 0x7FF3:
+ DPRINTF("processor_facilities_used()\n");
+#ifdef __i386__
+ qerror("processor_facilities_used: not implemented!\n");
+#else
+ ret = (uint32_t)processor_facilities_used();
+#endif
+ break;
+ default:
+ gemu_log("qemu: Unsupported thread syscall: %d(0x%x)\n", num, num);
+ gdb_handlesig (cpu_env, SIGTRAP);
+ exit(0);
+ break;
+ }
+ return ret;
+}
+
+/* ------------------------------------------------------------
+ ioctl handling
+*/
+static inline void byteswap_termios(struct termios *t)
+{
+ tswap32s((uint32_t*)&t->c_iflag);
+ tswap32s((uint32_t*)&t->c_oflag);
+ tswap32s((uint32_t*)&t->c_cflag);
+ tswap32s((uint32_t*)&t->c_lflag);
+ /* 20 (char) bytes then */
+ tswap32s((uint32_t*)&t->c_ispeed);
+ tswap32s((uint32_t*)&t->c_ospeed);
+}
+
+static inline void byteswap_winsize(struct winsize *w)
+{
+ tswap16s(&w->ws_row);
+ tswap16s(&w->ws_col);
+ tswap16s(&w->ws_xpixel);
+ tswap16s(&w->ws_ypixel);
+}
+
+#define STRUCT(name, ...) STRUCT_ ## name,
+#define STRUCT_SPECIAL(name) STRUCT_ ## name,
+enum {
+#include "ioctls_types.h"
+};
+#undef STRUCT
+#undef STRUCT_SPECIAL
+
+#define STRUCT(name, ...) const argtype struct_ ## name ## _def[] = { __VA_ARGS__, TYPE_NULL };
+#define STRUCT_SPECIAL(name)
+#include "ioctls_types.h"
+#undef STRUCT
+#undef STRUCT_SPECIAL
+
+typedef struct IOCTLEntry {
+ unsigned int target_cmd;
+ unsigned int host_cmd;
+ const char *name;
+ int access;
+ const argtype arg_type[5];
+} IOCTLEntry;
+
+#define IOC_R 0x0001
+#define IOC_W 0x0002
+#define IOC_RW (IOC_R | IOC_W)
+
+#define MAX_STRUCT_SIZE 4096
+
+static IOCTLEntry ioctl_entries[] = {
+#define IOCTL(cmd, access, ...) \
+ { cmd, cmd, #cmd, access, { __VA_ARGS__ } },
+#include "ioctls.h"
+ { 0, 0, },
+};
+
+/* ??? Implement proper locking for ioctls. */
+static long do_ioctl(long fd, long cmd, long arg)
+{
+ const IOCTLEntry *ie;
+ const argtype *arg_type;
+ int ret;
+ uint8_t buf_temp[MAX_STRUCT_SIZE];
+ int target_size;
+ void *argptr;
+
+ ie = ioctl_entries;
+ for(;;) {
+ if (ie->target_cmd == 0) {
+ gemu_log("Unsupported ioctl: cmd=0x%04lx\n", cmd);
+ return -ENOSYS;
+ }
+ if (ie->target_cmd == cmd)
+ break;
+ ie++;
+ }
+ arg_type = ie->arg_type;
+#if defined(DEBUG)
+ gemu_log("ioctl: cmd=0x%04lx (%s)\n", cmd, ie->name);
+#endif
+ switch(arg_type[0]) {
+ case TYPE_NULL:
+ /* no argument */
+ ret = get_errno(ioctl(fd, ie->host_cmd));
+ break;
+ case TYPE_PTRVOID:
+ case TYPE_INT:
+ /* int argment */
+ ret = get_errno(ioctl(fd, ie->host_cmd, arg));
+ break;
+ case TYPE_PTR:
+ arg_type++;
+ target_size = thunk_type_size(arg_type, 0);
+ switch(ie->access) {
+ case IOC_R:
+ ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
+ if (!is_error(ret)) {
+ argptr = lock_user(arg, target_size, 0);
+ thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
+ unlock_user(argptr, arg, target_size);
+ }
+ break;
+ case IOC_W:
+ argptr = lock_user(arg, target_size, 1);
+ thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
+ unlock_user(argptr, arg, 0);
+ ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
+ break;
+ default:
+ case IOC_RW:
+ argptr = lock_user(arg, target_size, 1);
+ thunk_convert(buf_temp, argptr, arg_type, THUNK_HOST);
+ unlock_user(argptr, arg, 0);
+ ret = get_errno(ioctl(fd, ie->host_cmd, buf_temp));
+ if (!is_error(ret)) {
+ argptr = lock_user(arg, target_size, 0);
+ thunk_convert(argptr, buf_temp, arg_type, THUNK_TARGET);
+ unlock_user(argptr, arg, target_size);
+ }
+ break;
+ }
+ break;
+ default:
+ gemu_log("Unsupported ioctl type: cmd=0x%04lx type=%d\n", cmd, arg_type[0]);
+ ret = -ENOSYS;
+ break;
+ }
+ return ret;
+}
+
+/* ------------------------------------------------------------
+ Unix syscall handling
+*/
+
+static inline void byteswap_attrlist(struct attrlist *a)
+{
+ tswap16s(&a->bitmapcount);
+ tswap16s(&a->reserved);
+ tswap32s(&a->commonattr);
+ tswap32s(&a->volattr);
+ tswap32s(&a->dirattr);
+ tswap32s(&a->fileattr);
+ tswap32s(&a->forkattr);
+}
+
+struct attrbuf_header {
+ unsigned long length;
+};
+
+static inline void byteswap_attrbuf(struct attrbuf_header *attrbuf, struct attrlist *attrlist)
+{
+ DPRINTF("attrBuf.lenght %lx\n", attrbuf->length);
+}
+
+static inline void byteswap_statfs(struct statfs *s)
+{
+ tswap16s((uint16_t*)&s->f_otype);
+ tswap16s((uint16_t*)&s->f_oflags);
+ tswap32s((uint32_t*)&s->f_bsize);
+ tswap32s((uint32_t*)&s->f_iosize);
+ tswap32s((uint32_t*)&s->f_blocks);
+ tswap32s((uint32_t*)&s->f_bfree);
+ tswap32s((uint32_t*)&s->f_bavail);
+ tswap32s((uint32_t*)&s->f_files);
+ tswap32s((uint32_t*)&s->f_ffree);
+ tswap32s((uint32_t*)&s->f_fsid.val[0]);
+ tswap32s((uint32_t*)&s->f_fsid.val[1]);
+ tswap16s((uint16_t*)&s->f_reserved1);
+ tswap16s((uint16_t*)&s->f_type);
+ tswap32s((uint32_t*)&s->f_flags);
+}
+
+static inline void byteswap_stat(struct stat *s)
+{
+ tswap32s((uint32_t*)&s->st_dev);
+ tswap32s(&s->st_ino);
+ tswap16s(&s->st_mode);
+ tswap16s(&s->st_nlink);
+ tswap32s(&s->st_uid);
+ tswap32s(&s->st_gid);
+ tswap32s((uint32_t*)&s->st_rdev);
+ tswap32s((uint32_t*)&s->st_atimespec.tv_sec);
+ tswap32s((uint32_t*)&s->st_atimespec.tv_nsec);
+ tswap32s((uint32_t*)&s->st_mtimespec.tv_sec);
+ tswap32s((uint32_t*)&s->st_mtimespec.tv_nsec);
+ tswap32s((uint32_t*)&s->st_ctimespec.tv_sec);
+ tswap32s((uint32_t*)&s->st_ctimespec.tv_nsec);
+ tswap64s((uint64_t*)&s->st_size);
+ tswap64s((uint64_t*)&s->st_blocks);
+ tswap32s((uint32_t*)&s->st_blksize);
+ tswap32s(&s->st_flags);
+ tswap32s(&s->st_gen);
+}
+
+static inline void byteswap_dirents(struct dirent *d, int bytes)
+{
+ char *b;
+ for( b = (char*)d; (int)b < (int)d+bytes; )
+ {
+ unsigned short s = ((struct dirent *)b)->d_reclen;
+ tswap32s(&((struct dirent *)b)->d_ino);
+ tswap16s(&((struct dirent *)b)->d_reclen);
+ if(s<=0)
+ break;
+ b += s;
+ }
+}
+
+static inline void byteswap_iovec(struct iovec *v, int n)
+{
+ int i;
+ for(i = 0; i < n; i++)
+ {
+ tswap32s((uint32_t*)&v[i].iov_base);
+ tswap32s((uint32_t*)&v[i].iov_len);
+ }
+}
+
+static inline void byteswap_timeval(struct timeval *t)
+{
+ tswap32s((uint32_t*)&t->tv_sec);
+ tswap32s((uint32_t*)&t->tv_usec);
+}
+
+long do_unix_syscall_indirect(void *cpu_env, int num);
+long do_sync(void);
+long do_exit(uint32_t arg1);
+long do_getlogin(char *out, uint32_t size);
+long do_open(char * arg1, uint32_t arg2, uint32_t arg3);
+long do_getfsstat(struct statfs * arg1, uint32_t arg2, uint32_t arg3);
+long do_sigprocmask(uint32_t arg1, uint32_t * arg2, uint32_t * arg3);
+long do_execve(char* arg1, char ** arg2, char ** arg3);
+long do_getgroups(uint32_t arg1, gid_t * arg2);
+long do_gettimeofday(struct timeval * arg1, void * arg2);
+long do_readv(uint32_t arg1, struct iovec * arg2, uint32_t arg3);
+long do_writev(uint32_t arg1, struct iovec * arg2, uint32_t arg3);
+long do_utimes(char * arg1, struct timeval * arg2);
+long do_futimes(uint32_t arg1, struct timeval * arg2);
+long do_statfs(char * arg1, struct statfs * arg2);
+long do_fstatfs(uint32_t arg1, struct statfs * arg2);
+long do_stat(char * arg1, struct stat * arg2);
+long do_fstat(uint32_t arg1, struct stat * arg2);
+long do_lstat(char * arg1, struct stat * arg2);
+long do_getdirentries(uint32_t arg1, void* arg2, uint32_t arg3, void* arg4);
+long do_lseek(void *cpu_env, int num);
+long do___sysctl(int * name, uint32_t namelen, void * oldp, size_t * oldlenp, void * newp, size_t newlen /* ignored */);
+long do_getattrlist(void * arg1, void * arg2, void * arg3, uint32_t arg4, uint32_t arg5);
+long do_getdirentriesattr(uint32_t arg1, void * arg2, void * arg3, size_t arg4, void * arg5, void * arg6, void* arg7, uint32_t arg8);
+long do_fcntl(int fd, int cmd, int arg);
+
+long no_syscall(void *cpu_env, int num);
+
+long do_pread(uint32_t arg1, void * arg2, size_t arg3, off_t arg4)
+{
+ DPRINTF("0x%x, %p, 0x%lx, 0x%" PRIx64 "\n", arg1, arg2, arg3, arg4);
+ long ret = pread(arg1, arg2, arg3, arg4);
+ return ret;
+}
+
+long do_read(int d, void *buf, size_t nbytes)
+{
+ DPRINTF("0x%x, %p, 0x%lx\n", d, buf, nbytes);
+ long ret = get_errno(read(d, buf, nbytes));
+ if(!is_error(ret))
+ DPRINTF("%x\n", *(uint32_t*)buf);
+ return ret;
+}
+
+long unimpl_unix_syscall(void *cpu_env, int num);
+
+typedef long (*syscall_function_t)(void *cpu_env, int num);
+
+
+/* define a table that will handle the syscall number->function association */
+#define VOID void
+#define INT (uint32_t)get_int_arg(&i, cpu_env)
+#define INT64 (uint64_t)get_int64_arg(&i, cpu_env)
+#define UINT (unsigned int)INT
+#define PTR (void*)INT
+
+#define SIZE INT
+#define OFFSET INT64
+
+#define WRAPPER_CALL_DIRECT_0(function, args) long __qemu_##function(void *cpu_env) { return (long)function(); }
+#define WRAPPER_CALL_DIRECT_1(function, _arg1) long __qemu_##function(void *cpu_env) { int i = 0; typeof(_arg1) arg1 = _arg1; return (long)function(arg1); }
+#define WRAPPER_CALL_DIRECT_2(function, _arg1, _arg2) long __qemu_##function(void *cpu_env) { int i = 0; typeof(_arg1) arg1 = _arg1; typeof(_arg2) arg2 = _arg2; return (long)function(arg1, arg2); }
+#define WRAPPER_CALL_DIRECT_3(function, _arg1, _arg2, _arg3) long __qemu_##function(void *cpu_env) { int i = 0; typeof(_arg1) arg1 = _arg1; typeof(_arg2) arg2 = _arg2; typeof(_arg3) arg3 = _arg3; return (long)function(arg1, arg2, arg3); }
+#define WRAPPER_CALL_DIRECT_4(function, _arg1, _arg2, _arg3, _arg4) long __qemu_##function(void *cpu_env) { int i = 0; typeof(_arg1) arg1 = _arg1; typeof(_arg2) arg2 = _arg2; typeof(_arg3) arg3 = _arg3; typeof(_arg4) arg4 = _arg4; return (long)function(arg1, arg2, arg3, arg4); }
+#define WRAPPER_CALL_DIRECT_5(function, _arg1, _arg2, _arg3, _arg4, _arg5) long __qemu_##function(void *cpu_env) { int i = 0; typeof(_arg1) arg1 = _arg1; typeof(_arg2) arg2 = _arg2; typeof(_arg3) arg3 = _arg3; typeof(_arg4) arg4 = _arg4; typeof(_arg5) arg5 = _arg5; return (long)function(arg1, arg2, arg3, arg4, arg5); }
+#define WRAPPER_CALL_DIRECT_6(function, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6) long __qemu_##function(void *cpu_env) { int i = 0; typeof(_arg1) arg1 = _arg1; typeof(_arg2) arg2 = _arg2; typeof(_arg3) arg3 = _arg3; typeof(_arg4) arg4 = _arg4; typeof(_arg5) arg5 = _arg5; typeof(_arg6) arg6 = _arg6; return (long)function(arg1, arg2, arg3, arg4, arg5, arg6); }
+#define WRAPPER_CALL_DIRECT_7(function, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7) long __qemu_##function(void *cpu_env) { int i = 0; typeof(_arg1) arg1 = _arg1; typeof(_arg2) arg2 = _arg2; typeof(_arg3) arg3 = _arg3; typeof(_arg4) arg4 = _arg4; typeof(_arg5) arg5 = _arg5; typeof(_arg6) arg6 = _arg6; typeof(_arg7) arg7 = _arg7; return (long)function(arg1, arg2, arg3, arg4, arg5, arg6, arg7); }
+#define WRAPPER_CALL_DIRECT_8(function, _arg1, _arg2, _arg3, _arg4, _arg5, _arg6, _arg7, _arg8) long __qemu_##function(void *cpu_env) { int i = 0; typeof(_arg1) arg1 = _arg1; typeof(_arg2) arg2 = _arg2; typeof(_arg3) arg3 = _arg3; typeof(_arg4) arg4 = _arg4; typeof(_arg5) arg5 = _arg5; typeof(_arg6) arg6 = _arg6; typeof(_arg7) arg7 = _arg7; typeof(_arg8) arg8 = _arg8; return (long)function(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8); }
+#define WRAPPER_CALL_DIRECT(function, nargs, ...) WRAPPER_CALL_DIRECT_##nargs(function, __VA_ARGS__)
+#define WRAPPER_CALL_NOERRNO(function, nargs, ...) WRAPPER_CALL_DIRECT(function, nargs, __VA_ARGS__)
+#define WRAPPER_CALL_INDIRECT(function, nargs, ...)
+#define ENTRY(name, number, function, nargs, call_type, ...) WRAPPER_##call_type(function, nargs, __VA_ARGS__)
+
+#include "syscalls.h"
+
+#undef ENTRY
+#undef WRAPPER_CALL_DIRECT
+#undef WRAPPER_CALL_NOERRNO
+#undef WRAPPER_CALL_INDIRECT
+#undef OFFSET
+#undef SIZE
+#undef INT
+#undef PTR
+#undef INT64
+
+#define _ENTRY(name, number, function, nargs, call_type) [number] = {\
+ name, \
+ number, \
+ (syscall_function_t)function, \
+ nargs, \
+ call_type \
+ },
+
+#define ENTRY_CALL_DIRECT(name, number, function, nargs, call_type) _ENTRY(name, number, __qemu_##function, nargs, call_type)
+#define ENTRY_CALL_NOERRNO(name, number, function, nargs, call_type) ENTRY_CALL_DIRECT(name, number, function, nargs, call_type)
+#define ENTRY_CALL_INDIRECT(name, number, function, nargs, call_type) _ENTRY(name, number, function, nargs, call_type)
+#define ENTRY(name, number, function, nargs, call_type, ...) ENTRY_##call_type(name, number, function, nargs, call_type)
+
+#define CALL_DIRECT 1
+#define CALL_INDIRECT 2
+#define CALL_NOERRNO (CALL_DIRECT | 4 /* = 5 */)
+
+struct unix_syscall {
+ char * name;
+ int number;
+ syscall_function_t function;
+ int nargs;
+ int call_type;
+} unix_syscall_table[SYS_MAXSYSCALL] = {
+#include "syscalls.h"
+};
+
+#undef ENTRY
+#undef _ENTRY
+#undef ENTRY_CALL_DIRECT
+#undef ENTRY_CALL_INDIRECT
+#undef ENTRY_CALL_NOERRNO
+
+/* Actual syscalls implementation */
+
+long do_unix_syscall_indirect(void *cpu_env, int num)
+{
+ long ret;
+ int new_num;
+ int i = 0;
+
+ new_num = get_int_arg(&i, cpu_env);
+#ifdef TARGET_I386
+ ((CPUX86State*)cpu_env)->regs[R_ESP] += 4;
+ /* XXX: not necessary */
+ ((CPUX86State*)cpu_env)->regs[R_EAX] = new_num;
+#elif TARGET_PPC
+ {
+ int i;
+ uint32_t **regs = ((CPUPPCState*)cpu_env)->gpr;
+ for(i = 3; i < 11; i++)
+ *regs[i] = *regs[i+1];
+ /* XXX: not necessary */
+ *regs[0] = new_num;
+ }
+#endif
+ ret = do_unix_syscall(cpu_env, new_num);
+#ifdef TARGET_I386
+ ((CPUX86State*)cpu_env)->regs[R_ESP] -= 4;
+ /* XXX: not necessary */
+ ((CPUX86State*)cpu_env)->regs[R_EAX] = num;
+#elif TARGET_PPC
+ {
+ int i;
+ /* XXX: not really needed those regs are volatile across calls */
+ uint32_t **regs = ((CPUPPCState*)cpu_env)->gpr;
+ for(i = 11; i > 3; i--)
+ *regs[i] = *regs[i-1];
+ regs[3] = new_num;
+ *regs[0] = num;
+ }
+#endif
+ return ret;
+}
+
+long do_exit(uint32_t arg1)
+{
+ exit(arg1);
+ /* not reached */
+ return -1;
+}
+
+long do_sync(void)
+{
+ sync();
+ return 0;
+}
+
+long do_getlogin(char *out, uint32_t size)
+{
+ char *login = getlogin();
+ if(!login)
+ return -1;
+ memcpy(out, login, size);
+ return 0;
+}
+long do_open(char * arg1, uint32_t arg2, uint32_t arg3)
+{
+ /* XXX: don't let the %s stay in there */
+ DPRINTF("open(%s, 0x%x, 0x%x)\n", arg1, arg2, arg3);
+ return get_errno(open(arg1, arg2, arg3));
+}
+
+long do_getfsstat(struct statfs * arg1, uint32_t arg2, uint32_t arg3)
+{
+ long ret;
+ DPRINTF("getfsstat(%p, 0x%x, 0x%x)\n", arg1, arg2, arg3);
+ ret = get_errno(getfsstat(arg1, arg2, arg3));
+ if((!is_error(ret)) && arg1)
+ byteswap_statfs(arg1);
+ return ret;
+}
+
+long do_sigprocmask(uint32_t arg1, uint32_t * arg2, uint32_t * arg3)
+{
+ long ret;
+ DPRINTF("sigprocmask(%d, %p, %p)\n", arg1, arg2, arg3);
+ gemu_log("XXX: sigprocmask not tested (%d, %p, %p)\n", arg1, arg2, arg3);
+ if(arg2)
+ tswap32s(arg2);
+ ret = get_errno(sigprocmask(arg1, (void *)arg2, (void *)arg3));
+ if((!is_error(ret)) && arg3)
+ tswap32s(arg3);
+ if(arg2)
+ tswap32s(arg2);
+ return ret;
+}
+
+long do_execve(char* arg1, char ** arg2, char ** arg3)
+{
+ long ret;
+ char **argv = arg2;
+ char **envp = arg3;
+ int argc;
+ int envc;
+
+ /* XXX: don't let the %s stay in here */
+ DPRINTF("execve(%s, %p, %p)\n", arg1, arg2, arg3);
+
+ for(argc = 0; argv[argc]; argc++);
+ for(envc = 0; envp[envc]; envc++);
+
+ argv = (char**)malloc(sizeof(char*)*argc);
+ envp = (char**)malloc(sizeof(char*)*envc);
+
+ for(; argc >= 0; argc--)
+ argv[argc] = (char*)tswap32((uint32_t)(arg2)[argc]);
+
+ for(; envc >= 0; envc--)
+ envp[envc] = (char*)tswap32((uint32_t)(arg3)[envc]);
+
+ ret = get_errno(execve(arg1, argv, envp));
+ free(argv);
+ free(envp);
+ return ret;
+}
+
+long do_getgroups(uint32_t arg1, gid_t * arg2)
+{
+ long ret;
+ int i;
+ DPRINTF("getgroups(0x%x, %p)\n", arg1, arg2);
+ ret = get_errno(getgroups(arg1, arg2));
+ if(ret > 0)
+ for(i = 0; i < arg1; i++)
+ tswap32s(&arg2[i]);
+ return ret;
+}
+
+long do_gettimeofday(struct timeval * arg1, void * arg2)
+{
+ long ret;
+ DPRINTF("gettimeofday(%p, %p)\n",
+ arg1, arg2);
+ ret = get_errno(gettimeofday(arg1, arg2));
+ if(!is_error(ret))
+ {
+ /* timezone no longer used according to the manpage, so don't bother with it */
+ byteswap_timeval(arg1);
+ }
+ return ret;
+}
+
+long do_readv(uint32_t arg1, struct iovec * arg2, uint32_t arg3)
+{
+ long ret;
+ DPRINTF("readv(0x%x, %p, 0x%x)\n", arg1, arg2, arg3);
+ if(arg2)
+ byteswap_iovec(arg2, arg3);
+ ret = get_errno(readv(arg1, arg2, arg3));
+ if((!is_error(ret)) && arg2)
+ byteswap_iovec(arg2, arg3);
+ return ret;
+}
+
+long do_writev(uint32_t arg1, struct iovec * arg2, uint32_t arg3)
+{
+ long ret;
+ DPRINTF("writev(0x%x, %p, 0x%x)\n", arg1, arg2, arg3);
+ if(arg2)
+ byteswap_iovec(arg2, arg3);
+ ret = get_errno(writev(arg1, arg2, arg3));
+ if((!is_error(ret)) && arg2)
+ byteswap_iovec(arg2, arg3);
+ return ret;
+}
+
+long do_utimes(char * arg1, struct timeval * arg2)
+{
+ DPRINTF("utimes(%p, %p)\n", arg1, arg2);
+ if(arg2)
+ {
+ byteswap_timeval(arg2);
+ byteswap_timeval(arg2+1);
+ }
+ return get_errno(utimes(arg1, arg2));
+}
+
+long do_futimes(uint32_t arg1, struct timeval * arg2)
+{
+ DPRINTF("futimes(0x%x, %p)\n", arg1, arg2);
+ if(arg2)
+ {
+ byteswap_timeval(arg2);
+ byteswap_timeval(arg2+1);
+ }
+ return get_errno(futimes(arg1, arg2));
+}
+
+long do_statfs(char * arg1, struct statfs * arg2)
+{
+ long ret;
+ DPRINTF("statfs(%p, %p)\n", arg1, arg2);
+ ret = get_errno(statfs(arg1, arg2));
+ if(!is_error(ret))
+ byteswap_statfs(arg2);
+ return ret;
+}
+
+long do_fstatfs(uint32_t arg1, struct statfs* arg2)
+{
+ long ret;
+ DPRINTF("fstatfs(0x%x, %p)\n",
+ arg1, arg2);
+ ret = get_errno(fstatfs(arg1, arg2));
+ if(!is_error(ret))
+ byteswap_statfs(arg2);
+
+ return ret;
+}
+
+long do_stat(char * arg1, struct stat * arg2)
+{
+ long ret;
+ /* XXX: don't let the %s stay in there */
+ DPRINTF("stat(%s, %p)\n", arg1, arg2);
+ ret = get_errno(stat(arg1, arg2));
+ if(!is_error(ret))
+ byteswap_stat(arg2);
+ return ret;
+}
+
+long do_fstat(uint32_t arg1, struct stat * arg2)
+{
+ long ret;
+ DPRINTF("fstat(0x%x, %p)\n", arg1, arg2);
+ ret = get_errno(fstat(arg1, arg2));
+ if(!is_error(ret))
+ byteswap_stat(arg2);
+ return ret;
+}
+
+long do_lstat(char * arg1, struct stat * arg2)
+{
+ long ret;
+ /* XXX: don't let the %s stay in there */
+ DPRINTF("lstat(%s, %p)\n", (const char *)arg1, arg2);
+ ret = get_errno(lstat(arg1, arg2));
+ if(!is_error(ret))
+ byteswap_stat(arg2);
+ return ret;
+}
+
+long do_getdirentries(uint32_t arg1, void* arg2, uint32_t arg3, void* arg4)
+{
+ long ret;
+ DPRINTF("getdirentries(0x%x, %p, 0x%x, %p)\n", arg1, arg2, arg3, arg4);
+ if(arg4)
+ tswap32s((uint32_t *)arg4);
+ ret = get_errno(getdirentries(arg1, arg2, arg3, arg4));
+ if(arg4)
+ tswap32s((uint32_t *)arg4);
+ if(!is_error(ret))
+ byteswap_dirents(arg2, ret);
+ return ret;
+}
+
+long do_lseek(void *cpu_env, int num)
+{
+ long ret;
+ int i = 0;
+ uint32_t arg1 = get_int_arg(&i, cpu_env);
+ uint64_t offset = get_int64_arg(&i, cpu_env);
+ uint32_t arg3 = get_int_arg(&i, cpu_env);
+ uint64_t r = lseek(arg1, offset, arg3);
+#ifdef TARGET_I386
+ /* lowest word in eax, highest in edx */
+ ret = r & 0xffffffff; /* will be set to eax after do_unix_syscall exit */
+ ((CPUX86State *)cpu_env)->regs[R_EDX] = (uint32_t)((r >> 32) & 0xffffffff) ;
+#elif defined TARGET_PPC
+ ret = r & 0xffffffff; /* will be set to r3 after do_unix_syscall exit */
+ ((CPUPPCState *)cpu_env)->gpr[4] = (uint32_t)((r >> 32) & 0xffffffff) ;
+#else
+ qerror("64 bit ret value on your arch?");
+#endif
+ return get_errno(ret);
+}
+
+void no_swap(void * oldp, int size)
+{
+}
+
+void sysctl_tswap32s(void * oldp, int size)
+{
+ tswap32s(oldp);
+}
+
+void bswap_oid(uint32_t * oldp, int size)
+{
+ int count = size / sizeof(int);
+ int i = 0;
+ do { tswap32s(oldp + i); } while (++i < count);
+}
+
+void sysctl_usrstack(uint32_t * oldp, int size)
+{
+ DPRINTF("sysctl_usrstack: 0x%x\n", *oldp);
+ tswap32s(oldp);
+}
+
+void sysctl_ncpu(uint32_t * ncpu, int size)
+{
+ *ncpu = 0x1;
+ DPRINTF("sysctl_ncpu: 0x%x\n", *ncpu);
+ tswap32s(ncpu);
+}
+
+void sysctl_exec(char * exec, int size)
+{
+ DPRINTF("sysctl_exec: %s\n", exec);
+}
+
+void sysctl_translate(char * exec, int size)
+{
+ DPRINTF("sysctl_translate: %s\n", exec);
+}
+
+struct sysctl_dir {
+ int num;
+ const char * name;
+ void (*swap_func)(void *, int);
+ struct sysctl_dir *childs;
+};
+
+#define ENTRYD(num, name, childs) { num, name, NULL, childs }
+#define ENTRYE(num, name, func) { num, name, (void (*)(void *, int))func, NULL }
+struct sysctl_dir sysctls_unspec[] = {
+ ENTRYE(3, "oip", bswap_oid),
+ { 0, NULL, NULL, NULL }
+};
+
+struct sysctl_dir sysctls_kern[] = {
+ ENTRYE(KERN_TRANSLATE, "translate", sysctl_translate), /* 44 */
+ ENTRYE(KERN_EXEC, "exec", sysctl_exec), /* 45 */
+ ENTRYE(KERN_USRSTACK32, "KERN_USRSTACK32", sysctl_usrstack), /* 35 */
+ ENTRYE(KERN_SHREG_PRIVATIZABLE, "KERN_SHREG_PRIVATIZABLE", sysctl_tswap32s), /* 54 */
+ { 0, NULL, NULL, NULL }
+};
+
+struct sysctl_dir sysctls_hw[] = {
+ ENTRYE(HW_NCPU, "ncpud", sysctl_tswap32s),
+ ENTRYE(104, "104", no_swap),
+ ENTRYE(105, "105", no_swap),
+ { 0, NULL, NULL, NULL }
+};
+
+struct sysctl_dir sysctls[] = {
+ ENTRYD(CTL_UNSPEC, "unspec", sysctls_unspec),
+ ENTRYD(CTL_KERN, "kern", sysctls_kern),
+ ENTRYD(CTL_HW, "hw", sysctls_hw ),
+ { 0, NULL, NULL, NULL }
+};
+
+#undef ENTRYE
+#undef ENTRYD
+
+static inline struct sysctl_dir * get_sysctl_entry_for_mib(int mib, struct sysctl_dir * sysctl_elmt)
+{
+ if(!sysctl_elmt)
+ return NULL;
+ for(; sysctl_elmt->name != NULL ; sysctl_elmt++) {
+ if(sysctl_elmt->num == mib)
+ return sysctl_elmt;
+ }
+ return NULL;
+}
+
+static inline long bswap_syctl(int * mib, int count, void *buf, int size)
+{
+ int i;
+ struct sysctl_dir * sysctl = sysctls;
+ struct sysctl_dir * ret = NULL;
+
+ for(i = 0; i < count; i++) {
+
+ if(!(ret = sysctl = get_sysctl_entry_for_mib(mib[i], sysctl))) {
+ gemu_log("bswap_syctl: can't find mib %d\n", mib[i]);
+ return -ENOTDIR;
+ }
+ if(!(sysctl = sysctl->childs))
+ break;
+ }
+
+ if(ret->childs)
+ qerror("we shouldn't have a directory element\n");
+
+ ret->swap_func(buf, size);
+ return 0;
+}
+
+static inline void print_syctl(int * mib, int count)
+{
+ int i;
+ struct sysctl_dir * sysctl = sysctls;
+ struct sysctl_dir * ret = NULL;
+
+ for(i = 0; i < count; i++) {
+ if(!(ret = sysctl = get_sysctl_entry_for_mib(mib[i], sysctl))){
+ gemu_log("print_syctl: can't find mib %d\n", mib[i]);
+ return;
+ }
+ DPRINTF("%s.", sysctl->name);
+ if(!(sysctl = sysctl->childs))
+ break;
+ }
+ DPRINTF("\n");
+}
+
+long do___sysctl(int * name, uint32_t namelen, void * oldp, size_t * oldlenp, void * newp, size_t newlen /* ignored */)
+{
+ long ret = 0;
+ int i;
+ DPRINTF("sysctl(%p, 0x%x, %p, %p, %p, 0x%lx)\n",
+ name, namelen, oldp, oldlenp, newp, newlen);
+ if(name) {
+ i = 0;
+ do { tswap32s( name + i); } while (++i < namelen);
+ print_syctl(name, namelen);
+ //bswap_syctl(name, namelen, newp, newlen);
+ tswap32s((uint32_t*)oldlenp);
+ }
+
+ if(name) /* Sometimes sysctl is called with no arg1, ignore */
+ ret = get_errno(sysctl(name, namelen, oldp, oldlenp, newp, newlen));
+
+#if defined(TARGET_I386) ^ defined(__i386__) || defined(TARGET_PPC) ^ defined(__ppc__)
+ if (!is_error(ret) && bswap_syctl(name, namelen, oldp, *oldlenp) != 0) {
+ return -ENOTDIR;
+ }
+#endif
+
+ if(name) {
+ //bswap_syctl(name, namelen, newp, newlen);
+ tswap32s((uint32_t*)oldlenp);
+
+ i = 0;
+ do { tswap32s( name + i); } while (++i < namelen);
+ }
+ return ret;
+}
+
+long do_getattrlist(void * arg1, void * arg2, void * arg3, uint32_t arg4, uint32_t arg5)
+{
+ struct attrlist * attrlist = (void *)arg2;
+ long ret;
+
+#if defined(TARGET_I386) ^ defined(__i386__) || defined(TARGET_PPC) ^ defined(__ppc__)
+ gemu_log("SYS_getdirentriesattr unimplemented\n");
+ return -ENOTSUP;
+#endif
+ /* XXX: don't let the %s stay in there */
+ DPRINTF("getattrlist(%s, %p, %p, 0x%x, 0x%x)\n",
+ (char *)arg1, arg2, arg3, arg4, arg5);
+
+ if(arg2) /* XXX: We should handle that in a copy especially
+ if the structure is not writable */
+ byteswap_attrlist(attrlist);
+
+ ret = get_errno(getattrlist((const char* )arg1, attrlist, (void *)arg3, arg4, arg5));
+
+ if(!is_error(ret))
+ {
+ byteswap_attrbuf((void *)arg3, attrlist);
+ byteswap_attrlist(attrlist);
+ }
+ return ret;
+}
+
+long do_getdirentriesattr(uint32_t arg1, void * arg2, void * arg3, size_t arg4, void * arg5, void * arg6, void* arg7, uint32_t arg8)
+{
+ DPRINTF("getdirentriesattr(0x%x, %p, %p, 0x%lx, %p, %p, %p, 0x%x)\n",
+ arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
+#if defined(TARGET_I386) ^ defined(__i386__) || defined(TARGET_PPC) ^ defined(__ppc__)
+ qerror("SYS_getdirentriesattr unimplemented\n");
+#endif
+
+ return get_errno(getdirentriesattr( arg1, (struct attrlist * )arg2, (void *)arg3, arg4,
+ (unsigned long *)arg5, (unsigned long *)arg6,
+ (unsigned long *)arg7, arg8));
+}
+
+static inline void bswap_flock(struct flock *f)
+{
+ tswap64s(&f->l_start);
+ tswap64s(&f->l_len);
+ tswap32s(&f->l_pid);
+ tswap16s(&f->l_type);
+ tswap16s(&f->l_whence);
+}
+
+static inline void bswap_fstore(struct fstore *f)
+{
+ tswap32s(&f->fst_flags);
+ tswap32s(&f->fst_posmode);
+ tswap64s(&f->fst_offset);
+ tswap64s(&f->fst_length);
+ tswap64s(&f->fst_bytesalloc);
+}
+
+static inline void bswap_radvisory(struct radvisory *f)
+{
+ tswap64s(&f->ra_offset);
+ tswap32s(&f->ra_count);
+}
+
+static inline void bswap_fbootstraptransfer(struct fbootstraptransfer *f)
+{
+ tswap64s(&f->fbt_offset);
+ tswap32s((uint32_t*)&f->fbt_length);
+ tswap32s((uint32_t*)&f->fbt_buffer); /* XXX: this is a ptr */
+}
+
+static inline void bswap_log2phys(struct log2phys *f)
+{
+ tswap32s(&f->l2p_flags);
+ tswap64s(&f->l2p_contigbytes);
+ tswap64s(&f->l2p_devoffset);
+}
+
+static inline void bswap_fcntl_arg(int cmd, void * arg)
+{
+ switch(cmd)
+ {
+ case F_DUPFD:
+ case F_GETFD:
+ case F_SETFD:
+ case F_GETFL:
+ case F_SETFL:
+ case F_GETOWN:
+ case F_SETOWN:
+ case F_SETSIZE:
+ case F_RDAHEAD:
+ case F_FULLFSYNC:
+ break;
+ case F_GETLK:
+ case F_SETLK:
+ case F_SETLKW:
+ bswap_flock(arg);
+ break;
+ case F_PREALLOCATE:
+ bswap_fstore(arg);
+ break;
+ case F_RDADVISE:
+ bswap_radvisory(arg);
+ break;
+ case F_READBOOTSTRAP:
+ case F_WRITEBOOTSTRAP:
+ bswap_fbootstraptransfer(arg);
+ break;
+ case F_LOG2PHYS:
+ bswap_log2phys(arg);
+ break;
+ default:
+ gemu_log("unknow cmd in fcntl\n");
+ }
+}
+
+long do_fcntl(int fd, int cmd, int arg)
+{
+ long ret;
+ bswap_fcntl_arg(cmd, (void *)arg);
+ ret = get_errno(fcntl(fd, cmd, arg));
+ if(!is_error(ret))
+ bswap_fcntl_arg(cmd, (void *)arg);
+ return ret;
+}
+
+long no_syscall(void *cpu_env, int num)
+{
+ /* XXX: We should probably fordward it to the host kernel */
+ qerror("no unix syscall %d\n", num);
+ /* not reached */
+ return -1;
+}
+
+long unimpl_unix_syscall(void *cpu_env, int num)
+{
+ if( (num < 0) || (num > SYS_MAXSYSCALL-1) )
+ qerror("unix syscall %d is out of unix syscall bounds (0-%d) " , num, SYS_MAXSYSCALL-1);
+
+ gemu_log("qemu: Unsupported unix syscall %s %d\n", unix_syscall_table[num].name , num);
+ gdb_handlesig (cpu_env, SIGTRAP);
+ exit(-1);
+}
+
+long do_unix_syscall(void *cpu_env, int num)
+{
+ long ret = 0;
+
+ DPRINTF("unix syscall %d: " , num);
+
+ if( (num < 0) || (num > SYS_MAXSYSCALL-1) )
+ qerror("unix syscall %d is out of unix syscall bounds (0-%d) " , num, SYS_MAXSYSCALL-1);
+
+ DPRINTF("%s [%s]", unix_syscall_table[num].name, unix_syscall_table[num].call_type & CALL_DIRECT ? "direct" : "indirect" );
+ ret = unix_syscall_table[num].function(cpu_env, num);
+
+ if(!(unix_syscall_table[num].call_type & CALL_NOERRNO))
+ ret = get_errno(ret);
+
+ DPRINTF("[returned 0x%x(%d)]\n", (int)ret, (int)ret);
+ return ret;
+}
+
+/* ------------------------------------------------------------
+ syscall_init
+*/
+void syscall_init(void)
+{
+ /* Nothing yet */
+}
diff --git a/qemu-0.15.x/darwin-user/syscalls.h b/qemu-0.15.x/darwin-user/syscalls.h
new file mode 100644
index 0000000..34d95da
--- /dev/null
+++ b/qemu-0.15.x/darwin-user/syscalls.h
@@ -0,0 +1,384 @@
+/* generated from xnu/bsd/kern/syscalls.master */
+
+ ENTRY("syscall", SYS_syscall, do_unix_syscall_indirect, 0, CALL_INDIRECT, VOID) /* 0 indirect syscall */
+ ENTRY("exit", SYS_exit, do_exit, 1, CALL_DIRECT, INT) /* 1 */
+ ENTRY("fork", SYS_fork, fork, 0, CALL_NOERRNO, VOID) /* 2 */
+ ENTRY("read", SYS_read, do_read, 3, CALL_DIRECT, INT, PTR, SIZE) /* 3 */
+ ENTRY("write", SYS_write, write, 3, CALL_DIRECT, INT, PTR, SIZE) /* 4 */
+ ENTRY("open", SYS_open, do_open, 3, CALL_DIRECT, PTR, INT, INT) /* 5 */
+ ENTRY("close", SYS_close, close, 1, CALL_DIRECT, INT) /* 6 */
+ ENTRY("wait4", SYS_wait4, wait4, 4, CALL_DIRECT, INT, PTR, INT, PTR) /* 7 */
+ ENTRY("", 8, no_syscall, 0, CALL_INDIRECT, VOID) /* 8 old creat */
+ ENTRY("link", SYS_link, link, 2, CALL_DIRECT, PTR, PTR) /* 9 */
+ ENTRY("unlink", SYS_unlink, unlink, 1, CALL_DIRECT, PTR) /* 10 */
+ ENTRY("", 11, no_syscall, 0, CALL_INDIRECT, VOID) /* 11 old execv */
+ ENTRY("chdir", SYS_chdir, chdir, 1, CALL_DIRECT, PTR) /* 12 */
+ ENTRY("fchdir", SYS_fchdir, fchdir, 1, CALL_DIRECT, INT) /* 13 */
+ ENTRY("mknod", SYS_mknod, mknod, 3, CALL_DIRECT, PTR, INT, INT) /* 14 */
+ ENTRY("chmod", SYS_chmod, chmod, 2, CALL_DIRECT, PTR, INT) /* 15 */
+ ENTRY("chown", SYS_chown, chown, 3, CALL_DIRECT, PTR, INT, INT) /* 16 */
+ ENTRY("obreak", SYS_obreak, no_syscall, 1, CALL_INDIRECT, VOID) /* 17 old break */
+ ENTRY("ogetfsstat", 18, unimpl_unix_syscall, 3, CALL_INDIRECT, PTR, INT, INT) /* 18 */
+ ENTRY("", 19, no_syscall, 0, CALL_INDIRECT, VOID) /* 19 old lseek */
+ ENTRY("getpid", SYS_getpid, getpid, 0, CALL_NOERRNO, VOID) /* 20 */
+ ENTRY("", 21, no_syscall, 0, CALL_INDIRECT, VOID) /* 21 old mount */
+ ENTRY("", 22, no_syscall, 0, CALL_INDIRECT, VOID) /* 22 old umount */
+ ENTRY("setuid", SYS_setuid, setuid, 1, CALL_DIRECT, INT) /* 23 */
+ ENTRY("getuid", SYS_getuid, getuid, 0, CALL_NOERRNO, VOID) /* 24 */
+ ENTRY("geteuid", SYS_geteuid, geteuid, 0, CALL_NOERRNO, VOID) /* 25 */
+ ENTRY("ptrace", SYS_ptrace, ptrace, 4, CALL_DIRECT, INT, INT, PTR, INT) /* 26 */
+ ENTRY("recvmsg", SYS_recvmsg, recvmsg, 3, CALL_DIRECT, INT, PTR, INT) /* 27 */
+ ENTRY("sendmsg", SYS_sendmsg, sendmsg, 3, CALL_DIRECT, INT, PTR, INT) /* 28 */
+ ENTRY("recvfrom", SYS_recvfrom, recvfrom, 6, CALL_DIRECT, INT, PTR, INT, INT, PTR, PTR) /* 29 */
+ ENTRY("accept", SYS_accept, accept, 3, CALL_DIRECT, INT, PTR, PTR) /* 30 */
+ ENTRY("getpeername", SYS_getpeername, getpeername, 3, CALL_DIRECT, INT, PTR, PTR) /* 31 */
+ ENTRY("getsockname", SYS_getsockname, getsockname, 3, CALL_DIRECT, INT, PTR, PTR) /* 32 */
+ ENTRY("access", SYS_access, access, 2, CALL_DIRECT, PTR, INT) /* 33 */
+ ENTRY("chflags", SYS_chflags, chflags, 2, CALL_DIRECT, PTR, INT) /* 34 */
+ ENTRY("fchflags", SYS_fchflags, fchflags, 2, CALL_DIRECT, INT, INT) /* 35 */
+ ENTRY("sync", SYS_sync, do_sync, 0, CALL_INDIRECT, VOID) /* 36 */
+ ENTRY("kill", SYS_kill, kill, 2, CALL_DIRECT, INT, INT) /* 37 */
+ ENTRY("", 38, no_syscall, 0, CALL_INDIRECT, VOID) /* 38 old stat */
+ ENTRY("getppid", SYS_getppid, getppid, 0, CALL_DIRECT, VOID) /* 39 */
+ ENTRY("", 40, no_syscall, 0, CALL_INDIRECT, VOID) /* 40 old lstat */
+ ENTRY("dup", SYS_dup, dup, 1, CALL_DIRECT, INT) /* 41 */
+ ENTRY("pipe", SYS_pipe, pipe, 0, CALL_INDIRECT, PTR) /* 42 */
+ ENTRY("getegid", SYS_getegid, getegid, 0, CALL_NOERRNO, VOID) /* 43 */
+ ENTRY("profil", SYS_profil, profil, 4, CALL_DIRECT, PTR, SIZE, INT, INT) /* 44 */
+ ENTRY("ktrace", SYS_ktrace, no_syscall, 4, CALL_INDIRECT, VOID) /* 45 */
+ ENTRY("sigaction", SYS_sigaction, do_sigaction, 3, CALL_DIRECT, INT, PTR, PTR) /* 46 */
+ ENTRY("getgid", SYS_getgid, getgid, 0, CALL_NOERRNO, VOID) /* 47 */
+ ENTRY("sigprocmask", SYS_sigprocmask, do_sigprocmask, 3, CALL_DIRECT, INT, PTR, PTR) /* 48 */
+ ENTRY("getlogin", SYS_getlogin, do_getlogin, 2, CALL_DIRECT, PTR, UINT) /* 49 XXX */
+ ENTRY("setlogin", SYS_setlogin, setlogin, 1, CALL_DIRECT, PTR) /* 50 */
+ ENTRY("acct", SYS_acct, acct, 1, CALL_DIRECT, PTR) /* 51 */
+ ENTRY("sigpending", SYS_sigpending, sigpending, 1, CALL_DIRECT, PTR) /* 52 */
+ ENTRY("sigaltstack", SYS_sigaltstack, do_sigaltstack, 2, CALL_DIRECT, PTR, PTR) /* 53 */
+ ENTRY("ioctl", SYS_ioctl, do_ioctl, 3, CALL_DIRECT, INT, INT, INT) /* 54 */
+ ENTRY("reboot", SYS_reboot, unimpl_unix_syscall, 2, CALL_INDIRECT, INT, PTR) /* 55 */
+ ENTRY("revoke", SYS_revoke, revoke, 1, CALL_DIRECT, PTR) /* 56 */
+ ENTRY("symlink", SYS_symlink, symlink, 2, CALL_DIRECT, PTR, PTR) /* 57 */
+ ENTRY("readlink", SYS_readlink, readlink, 3, CALL_DIRECT, PTR, PTR, INT) /* 58 */
+ ENTRY("execve", SYS_execve, do_execve, 3, CALL_DIRECT, PTR, PTR, PTR) /* 59 */
+ ENTRY("umask", SYS_umask, umask, 1, CALL_DIRECT, INT) /* 60 */
+ ENTRY("chroot", SYS_chroot, chroot, 1, CALL_DIRECT, PTR) /* 61 */
+ ENTRY("", 62, no_syscall, 0, CALL_INDIRECT, VOID) /* 62 old fstat */
+ ENTRY("", 63, no_syscall, 0, CALL_INDIRECT, VOID) /* 63 used internally , reserved */
+ ENTRY("", 64, no_syscall, 0, CALL_INDIRECT, VOID) /* 64 old getpagesize */
+ ENTRY("msync", SYS_msync, target_msync, 3, CALL_DIRECT, UINT /*PTR*/, SIZE, INT) /* 65 */
+ ENTRY("vfork", SYS_vfork, vfork, 0, CALL_DIRECT, VOID) /* 66 */
+ ENTRY("", 67, no_syscall, 0, CALL_INDIRECT, VOID) /* 67 old vread */
+ ENTRY("", 68, no_syscall, 0, CALL_INDIRECT, VOID) /* 68 old vwrite */
+ ENTRY("sbrk", SYS_sbrk, sbrk, 1, CALL_DIRECT, INT) /* 69 */
+ ENTRY("sstk", SYS_sstk, no_syscall, 1, CALL_INDIRECT, VOID) /* 70 */
+ ENTRY("", 71, no_syscall, 0, CALL_INDIRECT, VOID) /* 71 old mmap */
+ ENTRY("ovadvise", SYS_ovadvise, no_syscall, 0, CALL_INDIRECT, VOID) /* 72 old vadvise */
+ ENTRY("munmap", SYS_munmap, target_munmap, 2, CALL_DIRECT, UINT /* PTR */, SIZE) /* 73 */
+ ENTRY("mprotect", SYS_mprotect, mprotect, 3, CALL_DIRECT, PTR, SIZE, INT) /* 74 */
+ ENTRY("madvise", SYS_madvise, madvise, 3, CALL_DIRECT, PTR, SIZE, INT) /* 75 */
+ ENTRY("", 76, no_syscall, 0, CALL_INDIRECT, VOID) /* 76 old vhangup */
+ ENTRY("", 77, no_syscall, 0, CALL_INDIRECT, VOID) /* 77 old vlimit */
+ ENTRY("mincore", SYS_mincore, mincore, 3, CALL_DIRECT, PTR, SIZE, PTR) /* 78 */
+ ENTRY("getgroups", SYS_getgroups, do_getgroups, 2, CALL_DIRECT, UINT, PTR) /* 79 */
+ ENTRY("setgroups", SYS_setgroups, setgroups, 2, CALL_DIRECT, UINT, PTR) /* 80 */
+ ENTRY("getpgrp", SYS_getpgrp, getpgrp, 0, CALL_DIRECT, VOID) /* 81 */
+ ENTRY("setpgid", SYS_setpgid, setpgid, 2, CALL_DIRECT, INT, INT) /* 82 */
+ ENTRY("setitimer", SYS_setitimer, setitimer, 3, CALL_DIRECT, INT, PTR, PTR) /* 83 */
+ ENTRY("", 84, no_syscall, 0, CALL_INDIRECT, VOID) /* 84 old wait */
+ ENTRY("swapon", SYS_swapon, unimpl_unix_syscall, 0, CALL_INDIRECT, VOID) /* 85 */
+ ENTRY("getitimer", SYS_getitimer, getitimer, 2, CALL_DIRECT, INT, PTR) /* 86 */
+ ENTRY("", 87, no_syscall, 0, CALL_INDIRECT, VOID) /* 87 old gethostname */
+ ENTRY("", 88, no_syscall, 0, CALL_INDIRECT, VOID) /* 88 old sethostname */
+ ENTRY("getdtablesize", SYS_getdtablesize, getdtablesize, 0, CALL_DIRECT, VOID) /* 89 */
+ ENTRY("dup2", SYS_dup2, dup2, 2, CALL_DIRECT, INT, INT) /* 90 */
+ ENTRY("", 91, no_syscall, 0, CALL_INDIRECT, VOID) /* 91 old getdopt */
+ ENTRY("fcntl", SYS_fcntl, do_fcntl, 3, CALL_DIRECT, INT, INT, INT) /* 92 */
+ ENTRY("select", SYS_select, select, 5, CALL_DIRECT, INT, PTR, PTR, PTR, PTR) /* 93 */
+ ENTRY("", 94, no_syscall, 0, CALL_INDIRECT, VOID) /* 94 old setdopt */
+ ENTRY("fsync", SYS_fsync, fsync, 1, CALL_DIRECT, INT) /* 95 */
+ ENTRY("setpriority", SYS_setpriority, setpriority, 3, CALL_DIRECT, INT, INT, INT) /* 96 */
+ ENTRY("socket", SYS_socket, socket, 3, CALL_DIRECT, INT, INT, INT) /* 97 */
+ ENTRY("connect", SYS_connect, connect, 3, CALL_DIRECT, INT, PTR, INT) /* 98 */
+ ENTRY("", 99, no_syscall, 0, CALL_INDIRECT, VOID) /* 99 old accept */
+ ENTRY("getpriority", SYS_getpriority, getpriority, 2, CALL_DIRECT, INT, INT) /* 100 */
+ ENTRY("", 101, no_syscall, 0, CALL_INDIRECT, VOID) /* 101 old send */
+ ENTRY("", 102, no_syscall, 0, CALL_INDIRECT, VOID) /* 102 old recv */
+ ENTRY("", 103, no_syscall, 0, CALL_INDIRECT, VOID) /* 103 old sigreturn */
+ ENTRY("bind", SYS_bind, bind, 3, CALL_DIRECT, INT, PTR, INT) /* 104 */
+ ENTRY("setsockopt", SYS_setsockopt, setsockopt, 5, CALL_DIRECT, INT, INT, INT, PTR, INT) /* 105 */
+ ENTRY("listen", SYS_listen, listen, 2, CALL_DIRECT, INT, INT) /* 106 */
+ ENTRY("", 107, no_syscall, 0, CALL_INDIRECT, VOID) /* 107 old vtimes */
+ ENTRY("", 108, no_syscall, 0, CALL_INDIRECT, VOID) /* 108 old sigvec */
+ ENTRY("", 109, no_syscall, 0, CALL_INDIRECT, VOID) /* 109 old sigblock */
+ ENTRY("", 110, no_syscall, 0, CALL_INDIRECT, VOID) /* 110 old sigsetmask */
+ ENTRY("sigsuspend", SYS_sigsuspend, unimpl_unix_syscall, 1, CALL_INDIRECT, INT) /* 111 */
+ ENTRY("", 112, no_syscall, 0, CALL_INDIRECT, VOID) /* 112 old sigstack */
+ ENTRY("", 113, no_syscall, 0, CALL_INDIRECT, VOID) /* 113 old recvmsg */
+ ENTRY("", 114, no_syscall, 0, CALL_INDIRECT, VOID) /* 114 old sendmsg */
+ ENTRY("", 115, no_syscall, 0, CALL_INDIRECT, VOID) /* 115 old vtrace */
+ ENTRY("gettimeofday", SYS_gettimeofday, do_gettimeofday, 2, CALL_DIRECT, PTR, PTR) /* 116 */
+ ENTRY("getrusage", SYS_getrusage, getrusage, 2, CALL_DIRECT, INT, PTR) /* 117 */
+ ENTRY("getsockopt", SYS_getsockopt, getsockopt, 5, CALL_DIRECT, INT, INT, INT, PTR, PTR) /* 118 */
+ ENTRY("", 119, no_syscall, 0, CALL_INDIRECT, VOID) /* 119 old resuba */
+ ENTRY("readv", SYS_readv, do_readv, 3, CALL_DIRECT, INT, PTR, UINT) /* 120 */
+ ENTRY("writev", SYS_writev, do_writev, 3, CALL_DIRECT, INT, PTR, UINT) /* 121 */
+ ENTRY("settimeofday", SYS_settimeofday, settimeofday, 2, CALL_DIRECT, PTR, PTR) /* 122 */
+ ENTRY("fchown", SYS_fchown, fchown, 3, CALL_DIRECT, INT, INT, INT) /* 123 */
+ ENTRY("fchmod", SYS_fchmod, fchmod, 2, CALL_DIRECT, INT, INT) /* 124 */
+ ENTRY("", 125, no_syscall, 0, CALL_INDIRECT, VOID) /* 125 old recvfrom */
+ ENTRY("", 126, no_syscall, 0, CALL_INDIRECT, VOID) /* 126 old setreuid */
+ ENTRY("", 127, no_syscall, 0, CALL_INDIRECT, VOID) /* 127 old setregid */
+ ENTRY("rename", SYS_rename, rename, 2, CALL_DIRECT, PTR, PTR) /* 128 */
+ ENTRY("", 129, no_syscall, 0, CALL_INDIRECT, VOID) /* 129 old truncate */
+ ENTRY("", 130, no_syscall, 0, CALL_INDIRECT, VOID) /* 130 old ftruncate */
+ ENTRY("flock", SYS_flock, flock, 2, CALL_DIRECT, INT, INT) /* 131 */
+ ENTRY("mkfifo", SYS_mkfifo, mkfifo, 2, CALL_DIRECT, PTR, INT) /* 132 */
+ ENTRY("sendto", SYS_sendto, sendto, 6, CALL_DIRECT, INT, PTR, SIZE, INT, PTR, INT) /* 133 */
+ ENTRY("shutdown", SYS_shutdown, shutdown, 2, CALL_DIRECT, INT, INT) /* 134 */
+ ENTRY("socketpair", SYS_socketpair, socketpair, 4, CALL_DIRECT, INT, INT, INT, PTR) /* 135 */
+ ENTRY("mkdir", SYS_mkdir, mkdir, 2, CALL_DIRECT, PTR, INT) /* 136 */
+ ENTRY("rmdir", SYS_rmdir, rmdir, 1, CALL_DIRECT, PTR) /* 137 */
+ ENTRY("utimes", SYS_utimes, do_utimes, 2, CALL_DIRECT, PTR, PTR) /* 138 */
+ ENTRY("futimes", SYS_futimes, do_futimes, 2, CALL_DIRECT, INT, PTR) /* 139 */
+ ENTRY("adjtime", SYS_adjtime, adjtime, 2, CALL_DIRECT, PTR, PTR) /* 140 */
+ ENTRY("", 141, no_syscall, 0, CALL_INDIRECT, VOID) /* 141 old getpeername */
+ ENTRY("", 142, no_syscall, 0, CALL_INDIRECT, VOID) /* 142 old gethostid */
+ ENTRY("", 143, no_syscall, 0, CALL_INDIRECT, VOID) /* 143 old sethostid */
+ ENTRY("", 144, no_syscall, 0, CALL_INDIRECT, VOID) /* 144 old getrlimit */
+ ENTRY("", 145, no_syscall, 0, CALL_INDIRECT, VOID) /* 145 old setrlimit */
+ ENTRY("", 146, no_syscall, 0, CALL_INDIRECT, VOID) /* 146 old killpg */
+ ENTRY("setsid", SYS_setsid, setsid, 0, CALL_DIRECT, VOID) /* 147 */
+ ENTRY("", 148, no_syscall, 0, CALL_INDIRECT, VOID) /* 148 old setquota */
+ ENTRY("", 149, no_syscall, 0, CALL_INDIRECT, VOID) /* 149 old qquota */
+ ENTRY("", 150, no_syscall, 0, CALL_INDIRECT, VOID) /* 150 old getsockname */
+ ENTRY("getpgid", SYS_getpgid, getpgid, 1, CALL_DIRECT, INT) /* 151 */
+ ENTRY("setprivexec", SYS_setprivexec, no_syscall, 1, CALL_INDIRECT, VOID) /* 152 */
+ ENTRY("pread", SYS_pread, do_pread, 4, CALL_DIRECT, INT, PTR, SIZE, OFFSET) /* 153 */
+ ENTRY("pwrite", SYS_pwrite, pwrite, 4, CALL_DIRECT, INT, PTR, SIZE, OFFSET) /* 154 */
+#ifdef SYS_nfssvc
+ ENTRY("nfssvc", SYS_nfssvc, nfssvc, 2, CALL_DIRECT, INT, PTR) /* 155 */
+#else
+ ENTRY("nfssvc", 155, no_syscall, 2, CALL_INDIRECT, VOID) /* 155 */
+#endif
+ ENTRY("", 155, no_syscall, 0, CALL_INDIRECT, VOID) /* 155 */
+ ENTRY("", 156, no_syscall, 0, CALL_INDIRECT, VOID) /* 156 old getdirentries */
+ ENTRY("statfs", SYS_statfs, do_statfs, 2, CALL_DIRECT, PTR, PTR) /* 157 */
+ ENTRY("fstatfs", SYS_fstatfs, do_fstatfs, 2, CALL_DIRECT, INT, PTR) /* 158 */
+ ENTRY("unmount", SYS_unmount, unmount, 2, CALL_DIRECT, PTR, INT) /* 159 */
+ ENTRY("", 160, no_syscall, 0, CALL_INDIRECT, VOID) /* 160 old async_daemon */
+ ENTRY("", 161, no_syscall, 0, CALL_INDIRECT, VOID) /* 161 */
+ ENTRY("", 162, no_syscall, 0, CALL_INDIRECT, VOID) /* 162 old getdomainname */
+ ENTRY("", 163, no_syscall, 0, CALL_INDIRECT, VOID) /* 163 old setdomainname */
+ ENTRY("", 164, no_syscall, 0, CALL_INDIRECT, VOID) /* 164 */
+ ENTRY("quotactl", SYS_quotactl, no_syscall, 4, CALL_INDIRECT, VOID) /* 165 */
+ ENTRY("", 166, no_syscall, 0, CALL_INDIRECT, VOID) /* 166 old exportfs */
+ ENTRY("mount", SYS_mount, mount, 4, CALL_DIRECT, PTR, PTR, INT, PTR) /* 167 */
+ ENTRY("", 168, no_syscall, 0, CALL_INDIRECT, VOID) /* 168 old ustat */
+ ENTRY("", 169, no_syscall, 0, CALL_INDIRECT, VOID) /* 169 */
+ ENTRY("table", SYS_table, no_syscall, 0, CALL_INDIRECT, VOID) /* 170 old table */
+ ENTRY("", 171, no_syscall, 0, CALL_INDIRECT, VOID) /* 171 old wait3 */
+ ENTRY("", 172, no_syscall, 0, CALL_INDIRECT, VOID) /* 172 old rpause */
+ ENTRY("waitid", SYS_waitid, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 173 */
+ ENTRY("", 174, no_syscall, 0, CALL_INDIRECT, VOID) /* 174 old getdents */
+ ENTRY("", 175, no_syscall, 0, CALL_INDIRECT, VOID) /* 175 old gc_control */
+ ENTRY("add_profil", SYS_add_profil, add_profil, 4, CALL_DIRECT, PTR, SIZE, UINT, UINT) /* 176 */
+ ENTRY("", 177, no_syscall, 0, CALL_INDIRECT, VOID) /* 177 */
+ ENTRY("", 178, no_syscall, 0, CALL_INDIRECT, VOID) /* 178 */
+ ENTRY("", 179, no_syscall, 0, CALL_INDIRECT, VOID) /* 179 */
+ ENTRY("kdebug_trace", SYS_kdebug_trace, no_syscall, 6, CALL_INDIRECT, VOID) /* 180 */
+ ENTRY("setgid", SYS_setgid, setgid, 1, CALL_DIRECT, INT) /* 181 */
+ ENTRY("setegid", SYS_setegid, setegid, 1, CALL_DIRECT, INT) /* 182 */
+ ENTRY("seteuid", SYS_seteuid, seteuid, 1, CALL_DIRECT, INT) /* 183 */
+ ENTRY("sigreturn", SYS_sigreturn, do_sigreturn, 2, CALL_INDIRECT, PTR, INT) /* 184 */
+ ENTRY("chud", SYS_chud, unimpl_unix_syscall, 6, CALL_INDIRECT, VOID) /* 185 */
+ ENTRY("", 186, no_syscall, 0, CALL_INDIRECT, VOID) /* 186 */
+ ENTRY("", 187, no_syscall, 0, CALL_INDIRECT, VOID) /* 187 */
+ ENTRY("stat", SYS_stat, do_stat, 2, CALL_DIRECT, PTR, PTR) /* 188 */
+ ENTRY("fstat", SYS_fstat, do_fstat, 2, CALL_DIRECT, INT, PTR) /* 189 */
+ ENTRY("lstat", SYS_lstat, do_lstat, 2, CALL_DIRECT, PTR, PTR) /* 190 */
+ ENTRY("pathconf", SYS_pathconf, pathconf, 2, CALL_DIRECT, PTR, INT) /* 191 */
+ ENTRY("fpathconf", SYS_fpathconf, fpathconf, 2, CALL_DIRECT, INT, INT) /* 192 */
+ ENTRY("getfsstat", SYS_getfsstat, do_getfsstat, 3, CALL_DIRECT, PTR, INT, INT) /* 193 */
+ ENTRY("", 193, no_syscall, 0, CALL_INDIRECT, VOID) /* 193 */
+ ENTRY("getrlimit", SYS_getrlimit, getrlimit, 2, CALL_DIRECT, UINT, PTR) /* 194 */
+ ENTRY("setrlimit", SYS_setrlimit, setrlimit, 2, CALL_DIRECT, UINT, PTR) /* 195 */
+ ENTRY("getdirentries", SYS_getdirentries, do_getdirentries, 4, CALL_DIRECT, INT, PTR, UINT, PTR) /* 196 */
+ ENTRY("mmap", SYS_mmap, target_mmap, 6, CALL_DIRECT, UINT /*PTR*/, SIZE, INT, INT, INT, OFFSET) /* 197 */
+ ENTRY("", 198, no_syscall, 0, CALL_INDIRECT, VOID) /* 198 __syscall */
+ ENTRY("lseek", SYS_lseek, do_lseek, 3, CALL_INDIRECT, INT, OFFSET, INT) /* 199 */
+ ENTRY("truncate", SYS_truncate, truncate, 2, CALL_DIRECT, PTR, OFFSET) /* 200 */
+ ENTRY("ftruncate", SYS_ftruncate, ftruncate, 2, CALL_DIRECT, INT, OFFSET) /* 201 */
+ ENTRY("__sysctl", SYS___sysctl, do___sysctl, 6, CALL_DIRECT, PTR, INT, PTR, PTR, PTR, SIZE) /* 202 */
+ ENTRY("mlock", SYS_mlock, mlock, 2, CALL_DIRECT, PTR, SIZE) /* 203 */
+ ENTRY("munlock", SYS_munlock, munlock, 2, CALL_DIRECT, PTR, SIZE) /* 204 */
+ ENTRY("undelete", SYS_undelete, undelete, 1, CALL_DIRECT, PTR) /* 205 */
+ ENTRY("ATsocket", SYS_ATsocket, no_syscall, 1, CALL_INDIRECT, VOID) /* 206 */
+ ENTRY("ATgetmsg", SYS_ATgetmsg, no_syscall, 4, CALL_INDIRECT, VOID) /* 207 */
+ ENTRY("ATputmsg", SYS_ATputmsg, no_syscall, 4, CALL_INDIRECT, VOID) /* 208 */
+ ENTRY("ATPsndreq", SYS_ATPsndreq, no_syscall, 4, CALL_INDIRECT, VOID) /* 209 */
+ ENTRY("ATPsndrsp", SYS_ATPsndrsp, no_syscall, 4, CALL_INDIRECT, VOID) /* 210 */
+ ENTRY("ATPgetreq", SYS_ATPgetreq, no_syscall, 3, CALL_INDIRECT, VOID) /* 211 */
+ ENTRY("ATPgetrsp", SYS_ATPgetrsp, no_syscall, 2, CALL_INDIRECT, VOID) /* 212 */
+ ENTRY("", 213, no_syscall, 0, CALL_INDIRECT, VOID) /* 213 Reserved for AppleTalk */
+ ENTRY("kqueue_from_portset_np", SYS_kqueue_from_portset_np, no_syscall, 1, CALL_INDIRECT, VOID) /* 214 */
+ ENTRY("kqueue_portset_np", SYS_kqueue_portset_np, no_syscall, 1, CALL_INDIRECT, VOID) /* 215 */
+ ENTRY("mkcomplex", SYS_mkcomplex, no_syscall, 3, CALL_INDIRECT, VOID) /* 216 soon to be obsolete */
+ ENTRY("statv", SYS_statv, no_syscall, 2, CALL_INDIRECT, VOID) /* 217 soon to be obsolete */
+ ENTRY("lstatv", SYS_lstatv, no_syscall, 2, CALL_INDIRECT, VOID) /* 218 soon to be obsolete */
+ ENTRY("fstatv", SYS_fstatv, no_syscall, 2, CALL_INDIRECT, VOID) /* 219 soon to be obsolete */
+ ENTRY("getattrlist", SYS_getattrlist, do_getattrlist, 5, CALL_DIRECT, PTR, PTR, PTR, SIZE, UINT) /* 220 */
+ ENTRY("setattrlist", SYS_setattrlist, unimpl_unix_syscall, 5, CALL_INDIRECT, VOID) /* 221 */
+ ENTRY("getdirentriesattr", SYS_getdirentriesattr, do_getdirentriesattr, 8, CALL_DIRECT, INT, PTR, PTR, SIZE, PTR, PTR, PTR, UINT) /* 222 */
+ ENTRY("exchangedata", SYS_exchangedata, exchangedata, 3, CALL_DIRECT, PTR, PTR, UINT) /* 223 */
+ ENTRY("checkuseraccess", SYS_checkuseraccess, checkuseraccess, 6, CALL_DIRECT, PTR, INT, PTR, INT, INT, UINT) /* 224 */
+ ENTRY("", 224, no_syscall, 0, CALL_INDIRECT, VOID) /* 224 HFS checkuseraccess check access to a file */
+ ENTRY("searchfs", SYS_searchfs, searchfs, 6, CALL_DIRECT, PTR, PTR, PTR, UINT, UINT, PTR) /* 225 */
+ ENTRY("delete", SYS_delete, no_syscall, 1, CALL_INDIRECT, VOID) /* 226 private delete ( Carbon semantics ) */
+ ENTRY("copyfile", SYS_copyfile, no_syscall, 4, CALL_INDIRECT, VOID) /* 227 */
+ ENTRY("", 228, no_syscall, 0, CALL_INDIRECT, VOID) /* 228 */
+ ENTRY("", 229, no_syscall, 0, CALL_INDIRECT, VOID) /* 229 */
+ ENTRY("poll", SYS_poll, no_syscall, 3, CALL_INDIRECT, VOID) /* 230 */
+ ENTRY("watchevent", SYS_watchevent, no_syscall, 2, CALL_INDIRECT, VOID) /* 231 */
+ ENTRY("waitevent", SYS_waitevent, no_syscall, 2, CALL_INDIRECT, VOID) /* 232 */
+ ENTRY("modwatch", SYS_modwatch, no_syscall, 2, CALL_INDIRECT, VOID) /* 233 */
+ ENTRY("getxattr", SYS_getxattr, no_syscall, 6, CALL_INDIRECT, VOID) /* 234 */
+ ENTRY("fgetxattr", SYS_fgetxattr, no_syscall, 6, CALL_INDIRECT, VOID) /* 235 */
+ ENTRY("setxattr", SYS_setxattr, no_syscall, 6, CALL_INDIRECT, VOID) /* 236 */
+ ENTRY("fsetxattr", SYS_fsetxattr, no_syscall, 6, CALL_INDIRECT, VOID) /* 237 */
+ ENTRY("removexattr", SYS_removexattr, no_syscall, 3, CALL_INDIRECT, VOID) /* 238 */
+ ENTRY("fremovexattr", SYS_fremovexattr, no_syscall, 3, CALL_INDIRECT, VOID) /* 239 */
+ ENTRY("listxattr", SYS_listxattr, listxattr, 4, CALL_INDIRECT, VOID) /* 240 */
+ ENTRY("flistxattr", SYS_flistxattr, no_syscall, 4, CALL_INDIRECT, VOID) /* 241 */
+ ENTRY("fsctl", SYS_fsctl, fsctl, 4, CALL_DIRECT, PTR, UINT, PTR, UINT) /* 242 */
+ ENTRY("initgroups", SYS_initgroups, unimpl_unix_syscall, 3, CALL_INDIRECT, UINT, PTR, INT) /* 243 */
+ ENTRY("", 244, no_syscall, 0, CALL_INDIRECT, VOID) /* 244 */
+ ENTRY("", 245, no_syscall, 0, CALL_INDIRECT, VOID) /* 245 */
+ ENTRY("", 246, no_syscall, 0, CALL_INDIRECT, VOID) /* 246 */
+#ifdef SYS_nfsclnt
+ ENTRY("nfsclnt", SYS_nfsclnt, nfsclnt, 2, CALL_DIRECT, INT, PTR) /* 247 */
+#else
+ ENTRY("nfsclnt", 247, no_syscall, 2, CALL_INDIRECT, VOID) /* 247 */
+#endif
+ ENTRY("", 247, no_syscall, 0, CALL_INDIRECT, VOID) /* 247 */
+ ENTRY("", 248, no_syscall, 0, CALL_INDIRECT, VOID) /* 248 */
+ ENTRY("", 249, no_syscall, 0, CALL_INDIRECT, VOID) /* 249 */
+ ENTRY("minherit", SYS_minherit, minherit, 3, CALL_DIRECT, PTR, INT, INT) /* 250 */
+ ENTRY("semsys", SYS_semsys, unimpl_unix_syscall, 5, CALL_INDIRECT, VOID) /* 251 */
+ ENTRY("msgsys", SYS_msgsys, unimpl_unix_syscall, 5, CALL_INDIRECT, VOID) /* 252 */
+ ENTRY("shmsys", SYS_shmsys, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 253 */
+ ENTRY("semctl", SYS_semctl, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 254 */
+ ENTRY("semget", SYS_semget, unimpl_unix_syscall, 3, CALL_INDIRECT, VOID) /* 255 */
+ ENTRY("semop", SYS_semop, unimpl_unix_syscall, 3, CALL_INDIRECT, VOID) /* 256 */
+ ENTRY("", 257, no_syscall, 0, CALL_INDIRECT, VOID) /* 257 */
+ ENTRY("msgctl", SYS_msgctl, unimpl_unix_syscall, 3, CALL_INDIRECT, VOID) /* 258 */
+ ENTRY("msgget", SYS_msgget, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 259 */
+ ENTRY("msgsnd", SYS_msgsnd, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 260 */
+ ENTRY("msgrcv", SYS_msgrcv, unimpl_unix_syscall, 5, CALL_INDIRECT, VOID) /* 261 */
+ ENTRY("shmat", SYS_shmat, unimpl_unix_syscall, 3, CALL_INDIRECT, VOID) /* 262 */
+ ENTRY("shmctl", SYS_shmctl, unimpl_unix_syscall, 3, CALL_INDIRECT, VOID) /* 263 */
+ ENTRY("shmdt", SYS_shmdt, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 264 */
+ ENTRY("shmget", SYS_shmget, unimpl_unix_syscall, 3, CALL_INDIRECT, VOID) /* 265 */
+ ENTRY("shm_open", SYS_shm_open, shm_open, 3, CALL_DIRECT, PTR, INT, INT) /* 266 */
+ ENTRY("shm_unlink", SYS_shm_unlink, shm_unlink, 1, CALL_DIRECT, PTR) /* 267 */
+ ENTRY("sem_open", SYS_sem_open, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 268 */
+ ENTRY("sem_close", SYS_sem_close, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 269 */
+ ENTRY("sem_unlink", SYS_sem_unlink, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 270 */
+ ENTRY("sem_wait", SYS_sem_wait, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 271 */
+ ENTRY("sem_trywait", SYS_sem_trywait, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 272 */
+ ENTRY("sem_post", SYS_sem_post, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 273 */
+ ENTRY("sem_getvalue", SYS_sem_getvalue, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 274 */
+ ENTRY("sem_init", SYS_sem_init, unimpl_unix_syscall, 3, CALL_INDIRECT, VOID) /* 275 */
+ ENTRY("sem_destroy", SYS_sem_destroy, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 276 */
+ ENTRY("open_extended", SYS_open_extended, unimpl_unix_syscall, 6, CALL_INDIRECT, VOID) /* 277 */
+ ENTRY("umask_extended", SYS_umask_extended, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 278 */
+ ENTRY("stat_extended", SYS_stat_extended, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 279 */
+ ENTRY("lstat_extended", SYS_lstat_extended, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 280 */
+ ENTRY("fstat_extended", SYS_fstat_extended, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 281 */
+ ENTRY("chmod_extended", SYS_chmod_extended, unimpl_unix_syscall, 5, CALL_INDIRECT, VOID) /* 282 */
+ ENTRY("fchmod_extended", SYS_fchmod_extended, unimpl_unix_syscall, 5, CALL_INDIRECT, VOID) /* 283 */
+ ENTRY("access_extended", SYS_access_extended, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 284 */
+ ENTRY("settid", SYS_settid, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 285 */
+ ENTRY("gettid", SYS_gettid, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 286 */
+ ENTRY("setsgroups", SYS_setsgroups, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 287 */
+ ENTRY("getsgroups", SYS_getsgroups, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 288 */
+ ENTRY("setwgroups", SYS_setwgroups, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 289 */
+ ENTRY("getwgroups", SYS_getwgroups, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 290 */
+ ENTRY("mkfifo_extended", SYS_mkfifo_extended, unimpl_unix_syscall, 5, CALL_INDIRECT, VOID) /* 291 */
+ ENTRY("mkdir_extended", SYS_mkdir_extended, unimpl_unix_syscall, 5, CALL_INDIRECT, VOID) /* 292 */
+ ENTRY("identitysvc", SYS_identitysvc, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 293 */
+ ENTRY("", 294, no_syscall, 0, CALL_INDIRECT, VOID) /* 294 */
+ ENTRY("", 295, no_syscall, 0, CALL_INDIRECT, VOID) /* 295 */
+ ENTRY("load_shared_file", SYS_load_shared_file, unimpl_unix_syscall, 7, CALL_INDIRECT, VOID) /* 296 */
+ ENTRY("reset_shared_file", SYS_reset_shared_file, unimpl_unix_syscall, 3, CALL_INDIRECT, VOID) /* 297 */
+ ENTRY("new_system_shared_regions", SYS_new_system_shared_regions, unimpl_unix_syscall, 0, CALL_INDIRECT, VOID) /* 298 */
+ ENTRY("shared_region_map_file_np", SYS_shared_region_map_file_np, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 299 */
+ ENTRY("shared_region_make_private_np", SYS_shared_region_make_private_np, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 300 */
+ ENTRY("", 301, no_syscall, 0, CALL_INDIRECT, VOID) /* 301 */
+ ENTRY("", 302, no_syscall, 0, CALL_INDIRECT, VOID) /* 302 */
+ ENTRY("", 303, no_syscall, 0, CALL_INDIRECT, VOID) /* 303 */
+ ENTRY("", 304, no_syscall, 0, CALL_INDIRECT, VOID) /* 304 */
+ ENTRY("", 305, no_syscall, 0, CALL_INDIRECT, VOID) /* 305 */
+ ENTRY("", 306, no_syscall, 0, CALL_INDIRECT, VOID) /* 306 */
+ ENTRY("", 307, no_syscall, 0, CALL_INDIRECT, VOID) /* 307 */
+ ENTRY("", 308, no_syscall, 0, CALL_INDIRECT, VOID) /* 308 */
+ ENTRY("", 309, no_syscall, 0, CALL_INDIRECT, VOID) /* 309 */
+ ENTRY("getsid", SYS_getsid, getsid, 1, CALL_DIRECT, INT) /* 310 */
+ ENTRY("settid_with_pid", SYS_settid_with_pid, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 311 */
+ ENTRY("", 312, no_syscall, 0, CALL_INDIRECT, VOID) /* 312 */
+ ENTRY("aio_fsync", SYS_aio_fsync, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 313 */
+ ENTRY("aio_return", SYS_aio_return, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 314 */
+ ENTRY("aio_suspend", SYS_aio_suspend, unimpl_unix_syscall, 3, CALL_INDIRECT, VOID) /* 315 */
+ ENTRY("aio_cancel", SYS_aio_cancel, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 316 */
+ ENTRY("aio_error", SYS_aio_error, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 317 */
+ ENTRY("aio_read", SYS_aio_read, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 318 */
+ ENTRY("aio_write", SYS_aio_write, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 319 */
+ ENTRY("lio_listio", SYS_lio_listio, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 320 */
+ ENTRY("", 321, no_syscall, 0, CALL_INDIRECT, VOID) /* 321 */
+ ENTRY("", 322, no_syscall, 0, CALL_INDIRECT, VOID) /* 322 */
+ ENTRY("", 323, no_syscall, 0, CALL_INDIRECT, VOID) /* 323 */
+ ENTRY("mlockall", SYS_mlockall, mlockall, 1, CALL_DIRECT, INT) /* 324 */
+ ENTRY("munlockall", SYS_munlockall, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 325 */
+ ENTRY("", 326, no_syscall, 0, CALL_INDIRECT, VOID) /* 326 */
+ ENTRY("issetugid", SYS_issetugid, issetugid, 0, CALL_DIRECT, VOID) /* 327 */
+ ENTRY("__pthread_kill", SYS___pthread_kill, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 328 */
+ ENTRY("pthread_sigmask", SYS_pthread_sigmask, pthread_sigmask, 3, CALL_DIRECT, INT, PTR, PTR) /* 329 */
+ ENTRY("sigwait", SYS_sigwait, sigwait, 2, CALL_DIRECT, PTR, PTR) /* 330 */
+ ENTRY("__disable_threadsignal", SYS___disable_threadsignal, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 331 */
+ ENTRY("__pthread_markcancel", SYS___pthread_markcancel, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 332 */
+ ENTRY("__pthread_canceled", SYS___pthread_canceled, unimpl_unix_syscall, 1, CALL_INDIRECT, VOID) /* 333 */
+ ENTRY("__semwait_signal", SYS___semwait_signal, unimpl_unix_syscall, 6, CALL_INDIRECT, VOID) /* 334 */
+ ENTRY("utrace", SYS_utrace, unimpl_unix_syscall, 2, CALL_INDIRECT, VOID) /* 335 */
+ ENTRY("proc_info", SYS_proc_info, unimpl_unix_syscall, 6, CALL_INDIRECT, VOID) /* 336 */
+ ENTRY("", 337, no_syscall, 0, CALL_INDIRECT, VOID) /* 337 */
+ ENTRY("", 338, no_syscall, 0, CALL_INDIRECT, VOID) /* 338 */
+ ENTRY("", 339, no_syscall, 0, CALL_INDIRECT, VOID) /* 339 */
+ ENTRY("", 340, no_syscall, 0, CALL_INDIRECT, VOID) /* 340 */
+ ENTRY("", 341, no_syscall, 0, CALL_INDIRECT, VOID) /* 341 */
+ ENTRY("", 342, no_syscall, 0, CALL_INDIRECT, VOID) /* 342 */
+ ENTRY("", 343, no_syscall, 0, CALL_INDIRECT, VOID) /* 343 */
+ ENTRY("", 344, no_syscall, 0, CALL_INDIRECT, VOID) /* 344 */
+ ENTRY("", 345, no_syscall, 0, CALL_INDIRECT, VOID) /* 345 */
+ ENTRY("", 346, no_syscall, 0, CALL_INDIRECT, VOID) /* 346 */
+ ENTRY("", 347, no_syscall, 0, CALL_INDIRECT, VOID) /* 347 */
+ ENTRY("", 348, no_syscall, 0, CALL_INDIRECT, VOID) /* 348 */
+ ENTRY("", 349, no_syscall, 0, CALL_INDIRECT, VOID) /* 349 */
+ ENTRY("audit", SYS_audit, audit, 2, CALL_DIRECT, PTR, INT) /* 350 */
+ ENTRY("auditon", SYS_auditon, auditon, 3, CALL_DIRECT, INT, PTR, INT) /* 351 */
+ ENTRY("", 352, no_syscall, 0, CALL_INDIRECT, VOID) /* 352 */
+ ENTRY("getauid", SYS_getauid, getauid, 1, CALL_DIRECT, PTR) /* 353 */
+ ENTRY("setauid", SYS_setauid, setauid, 1, CALL_DIRECT, PTR) /* 354 */
+ ENTRY("getaudit", SYS_getaudit, getaudit, 1, CALL_DIRECT, PTR) /* 355 */
+ ENTRY("setaudit", SYS_setaudit, setaudit, 1, CALL_DIRECT, PTR) /* 356 */
+ ENTRY("getaudit_addr", SYS_getaudit_addr, getaudit_addr, 2, CALL_DIRECT, PTR, INT) /* 357 */
+ ENTRY("setaudit_addr", SYS_setaudit_addr, setaudit_addr, 2, CALL_DIRECT, PTR, INT) /* 358 */
+ ENTRY("auditctl", SYS_auditctl, auditctl, 1, CALL_DIRECT, PTR) /* 359 */
+ ENTRY("", 360, no_syscall, 0, CALL_INDIRECT, VOID) /* 360 */
+ ENTRY("", 361, no_syscall, 0, CALL_INDIRECT, VOID) /* 361 */
+ ENTRY("kqueue", SYS_kqueue, kqueue, 0, CALL_DIRECT, VOID) /* 362 */
+ ENTRY("kevent", SYS_kevent, kevent, 6, CALL_DIRECT, INT, PTR, INT, PTR, INT, PTR) /* 363 */
+ ENTRY("lchown", SYS_lchown, lchown, 3, CALL_DIRECT, PTR, INT , INT) /* 364 */
+ ENTRY("stack_snapshot", SYS_stack_snapshot, unimpl_unix_syscall, 4, CALL_INDIRECT, VOID) /* 365 */
+ ENTRY("", 366, no_syscall, 0, CALL_INDIRECT, VOID) /* 366 */
+ ENTRY("", 367, no_syscall, 0, CALL_INDIRECT, VOID) /* 367 */
+ ENTRY("", 368, no_syscall, 0, CALL_INDIRECT, VOID) /* 368 */
+ ENTRY("", 369, no_syscall, 0, CALL_INDIRECT, VOID) /* 369 */
diff --git a/qemu-0.15.x/def-helper.h b/qemu-0.15.x/def-helper.h
new file mode 100644
index 0000000..8a822c7
--- /dev/null
+++ b/qemu-0.15.x/def-helper.h
@@ -0,0 +1,240 @@
+/* Helper file for declaring TCG helper functions.
+ Should be included at the start and end of target-foo/helper.h.
+
+ Targets should use DEF_HELPER_N and DEF_HELPER_FLAGS_N to declare helper
+ functions. Names should be specified without the helper_ prefix, and
+ the return and argument types specified. 3 basic types are understood
+ (i32, i64 and ptr). Additional aliases are provided for convenience and
+ to match the types used by the C helper implementation.
+
+ The target helper.h should be included in all files that use/define
+ helper functions. THis will ensure that function prototypes are
+ consistent. In addition it should be included an extra two times for
+ helper.c, defining:
+ GEN_HELPER 1 to produce op generation functions (gen_helper_*)
+ GEN_HELPER 2 to do runtime registration helper functions.
+ */
+
+#ifndef DEF_HELPER_H
+#define DEF_HELPER_H 1
+
+#define HELPER(name) glue(helper_, name)
+
+#define GET_TCGV_i32 GET_TCGV_I32
+#define GET_TCGV_i64 GET_TCGV_I64
+#define GET_TCGV_ptr GET_TCGV_PTR
+
+/* Some types that make sense in C, but not for TCG. */
+#define dh_alias_i32 i32
+#define dh_alias_s32 i32
+#define dh_alias_int i32
+#define dh_alias_i64 i64
+#define dh_alias_s64 i64
+#define dh_alias_f32 i32
+#define dh_alias_f64 i64
+#if TARGET_LONG_BITS == 32
+#define dh_alias_tl i32
+#else
+#define dh_alias_tl i64
+#endif
+#define dh_alias_ptr ptr
+#define dh_alias_void void
+#define dh_alias_env ptr
+#define dh_alias(t) glue(dh_alias_, t)
+
+#define dh_ctype_i32 uint32_t
+#define dh_ctype_s32 int32_t
+#define dh_ctype_int int
+#define dh_ctype_i64 uint64_t
+#define dh_ctype_s64 int64_t
+#define dh_ctype_f32 float32
+#define dh_ctype_f64 float64
+#define dh_ctype_tl target_ulong
+#define dh_ctype_ptr void *
+#define dh_ctype_void void
+#define dh_ctype_env CPUState *
+#define dh_ctype(t) dh_ctype_##t
+
+/* We can't use glue() here because it falls foul of C preprocessor
+ recursive expansion rules. */
+#define dh_retvar_decl0_void void
+#define dh_retvar_decl0_i32 TCGv_i32 retval
+#define dh_retvar_decl0_i64 TCGv_i64 retval
+#define dh_retvar_decl0_ptr TCGv_ptr retval
+#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
+
+#define dh_retvar_decl_void
+#define dh_retvar_decl_i32 TCGv_i32 retval,
+#define dh_retvar_decl_i64 TCGv_i64 retval,
+#define dh_retvar_decl_ptr TCGv_ptr retval,
+#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
+
+#define dh_retvar_void TCG_CALL_DUMMY_ARG
+#define dh_retvar_i32 GET_TCGV_i32(retval)
+#define dh_retvar_i64 GET_TCGV_i64(retval)
+#define dh_retvar_ptr GET_TCGV_ptr(retval)
+#define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
+
+#define dh_is_64bit_void 0
+#define dh_is_64bit_i32 0
+#define dh_is_64bit_i64 1
+#define dh_is_64bit_ptr (TCG_TARGET_REG_BITS == 64)
+#define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t))
+
+#define dh_is_signed_void 0
+#define dh_is_signed_i32 0
+#define dh_is_signed_s32 1
+#define dh_is_signed_i64 0
+#define dh_is_signed_s64 1
+#define dh_is_signed_f32 0
+#define dh_is_signed_f64 0
+#define dh_is_signed_tl 0
+#define dh_is_signed_int 1
+/* ??? This is highly specific to the host cpu. There are even special
+ extension instructions that may be required, e.g. ia64's addp4. But
+ for now we don't support any 64-bit targets with 32-bit pointers. */
+#define dh_is_signed_ptr 0
+#define dh_is_signed_env dh_is_signed_ptr
+#define dh_is_signed(t) dh_is_signed_##t
+
+#define dh_sizemask(t, n) \
+ sizemask |= dh_is_64bit(t) << (n*2); \
+ sizemask |= dh_is_signed(t) << (n*2+1)
+
+#define dh_arg(t, n) \
+ args[n - 1] = glue(GET_TCGV_, dh_alias(t))(glue(arg, n)); \
+ dh_sizemask(t, n)
+
+#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n)
+
+
+#define DEF_HELPER_0(name, ret) \
+ DEF_HELPER_FLAGS_0(name, 0, ret)
+#define DEF_HELPER_1(name, ret, t1) \
+ DEF_HELPER_FLAGS_1(name, 0, ret, t1)
+#define DEF_HELPER_2(name, ret, t1, t2) \
+ DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2)
+#define DEF_HELPER_3(name, ret, t1, t2, t3) \
+ DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3)
+#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \
+ DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4)
+
+#endif /* DEF_HELPER_H */
+
+#ifndef GEN_HELPER
+/* Function prototypes. */
+
+#define DEF_HELPER_FLAGS_0(name, flags, ret) \
+dh_ctype(ret) HELPER(name) (void);
+
+#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
+dh_ctype(ret) HELPER(name) (dh_ctype(t1));
+
+#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
+dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2));
+
+#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
+dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3));
+
+#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
+dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
+ dh_ctype(t4));
+
+#undef GEN_HELPER
+#define GEN_HELPER -1
+
+#elif GEN_HELPER == 1
+/* Gen functions. */
+
+#define DEF_HELPER_FLAGS_0(name, flags, ret) \
+static inline void glue(gen_helper_, name)(dh_retvar_decl0(ret)) \
+{ \
+ int sizemask; \
+ sizemask = dh_is_64bit(ret); \
+ tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 0, NULL); \
+}
+
+#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
+static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1)) \
+{ \
+ TCGArg args[1]; \
+ int sizemask = 0; \
+ dh_sizemask(ret, 0); \
+ dh_arg(t1, 1); \
+ tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 1, args); \
+}
+
+#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
+static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
+ dh_arg_decl(t2, 2)) \
+{ \
+ TCGArg args[2]; \
+ int sizemask = 0; \
+ dh_sizemask(ret, 0); \
+ dh_arg(t1, 1); \
+ dh_arg(t2, 2); \
+ tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 2, args); \
+}
+
+#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
+static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
+ dh_arg_decl(t2, 2), dh_arg_decl(t3, 3)) \
+{ \
+ TCGArg args[3]; \
+ int sizemask = 0; \
+ dh_sizemask(ret, 0); \
+ dh_arg(t1, 1); \
+ dh_arg(t2, 2); \
+ dh_arg(t3, 3); \
+ tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 3, args); \
+}
+
+#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
+static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
+ dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), dh_arg_decl(t4, 4)) \
+{ \
+ TCGArg args[4]; \
+ int sizemask = 0; \
+ dh_sizemask(ret, 0); \
+ dh_arg(t1, 1); \
+ dh_arg(t2, 2); \
+ dh_arg(t3, 3); \
+ dh_arg(t4, 4); \
+ tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 4, args); \
+}
+
+#undef GEN_HELPER
+#define GEN_HELPER -1
+
+#elif GEN_HELPER == 2
+/* Register helpers. */
+
+#define DEF_HELPER_FLAGS_0(name, flags, ret) \
+tcg_register_helper(HELPER(name), #name);
+
+#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
+DEF_HELPER_FLAGS_0(name, flags, ret)
+
+#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
+DEF_HELPER_FLAGS_0(name, flags, ret)
+
+#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
+DEF_HELPER_FLAGS_0(name, flags, ret)
+
+#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
+DEF_HELPER_FLAGS_0(name, flags, ret)
+
+#undef GEN_HELPER
+#define GEN_HELPER -1
+
+#elif GEN_HELPER == -1
+/* Undefine macros. */
+
+#undef DEF_HELPER_FLAGS_0
+#undef DEF_HELPER_FLAGS_1
+#undef DEF_HELPER_FLAGS_2
+#undef DEF_HELPER_FLAGS_3
+#undef DEF_HELPER_FLAGS_4
+#undef GEN_HELPER
+
+#endif
diff --git a/qemu-0.15.x/default-configs/alpha-linux-user.mak b/qemu-0.15.x/default-configs/alpha-linux-user.mak
new file mode 100644
index 0000000..7956e29
--- /dev/null
+++ b/qemu-0.15.x/default-configs/alpha-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for alpha-linux-user
diff --git a/qemu-0.15.x/default-configs/alpha-softmmu.mak b/qemu-0.15.x/default-configs/alpha-softmmu.mak
new file mode 100644
index 0000000..abadcff
--- /dev/null
+++ b/qemu-0.15.x/default-configs/alpha-softmmu.mak
@@ -0,0 +1,9 @@
+# Default configuration for alpha-softmmu
+
+include pci.mak
+CONFIG_SERIAL=y
+CONFIG_I8254=y
+CONFIG_VGA_PCI=y
+CONFIG_IDE_CORE=y
+CONFIG_IDE_QDEV=y
+CONFIG_VMWARE_VGA=y
diff --git a/qemu-0.15.x/default-configs/arm-linux-user.mak b/qemu-0.15.x/default-configs/arm-linux-user.mak
new file mode 100644
index 0000000..46d4aa2
--- /dev/null
+++ b/qemu-0.15.x/default-configs/arm-linux-user.mak
@@ -0,0 +1,3 @@
+# Default configuration for arm-linux-user
+
+CONFIG_GDBSTUB_XML=y
diff --git a/qemu-0.15.x/default-configs/arm-softmmu.mak b/qemu-0.15.x/default-configs/arm-softmmu.mak
new file mode 100644
index 0000000..8d1174f
--- /dev/null
+++ b/qemu-0.15.x/default-configs/arm-softmmu.mak
@@ -0,0 +1,28 @@
+# Default configuration for arm-softmmu
+
+include pci.mak
+CONFIG_GDBSTUB_XML=y
+CONFIG_ISA_MMIO=y
+CONFIG_NAND=y
+CONFIG_ECC=y
+CONFIG_SERIAL=y
+CONFIG_PTIMER=y
+CONFIG_SD=y
+CONFIG_MAX7310=y
+CONFIG_WM8750=y
+CONFIG_TWL92230=y
+CONFIG_TSC2005=y
+CONFIG_LM832X=y
+CONFIG_TMP105=y
+CONFIG_STELLARIS_INPUT=y
+CONFIG_SSD0303=y
+CONFIG_SSD0323=y
+CONFIG_ADS7846=y
+CONFIG_MAX111X=y
+CONFIG_SSI=y
+CONFIG_SSI_SD=y
+CONFIG_LAN9118=y
+CONFIG_SMC91C111=y
+CONFIG_DS1338=y
+CONFIG_PFLASH_CFI01=y
+CONFIG_PFLASH_CFI02=y
diff --git a/qemu-0.15.x/default-configs/armeb-linux-user.mak b/qemu-0.15.x/default-configs/armeb-linux-user.mak
new file mode 100644
index 0000000..41d0cc4
--- /dev/null
+++ b/qemu-0.15.x/default-configs/armeb-linux-user.mak
@@ -0,0 +1,3 @@
+# Default configuration for armeb-linux-user
+
+CONFIG_GDBSTUB_XML=y
diff --git a/qemu-0.15.x/default-configs/cris-linux-user.mak b/qemu-0.15.x/default-configs/cris-linux-user.mak
new file mode 100644
index 0000000..e3aec7b
--- /dev/null
+++ b/qemu-0.15.x/default-configs/cris-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for cris-linux-user
diff --git a/qemu-0.15.x/default-configs/cris-softmmu.mak b/qemu-0.15.x/default-configs/cris-softmmu.mak
new file mode 100644
index 0000000..1a479cd
--- /dev/null
+++ b/qemu-0.15.x/default-configs/cris-softmmu.mak
@@ -0,0 +1,5 @@
+# Default configuration for cris-softmmu
+
+CONFIG_NAND=y
+CONFIG_PTIMER=y
+CONFIG_PFLASH_CFI02=y
diff --git a/qemu-0.15.x/default-configs/i386-bsd-user.mak b/qemu-0.15.x/default-configs/i386-bsd-user.mak
new file mode 100644
index 0000000..af1b31a
--- /dev/null
+++ b/qemu-0.15.x/default-configs/i386-bsd-user.mak
@@ -0,0 +1 @@
+# Default configuration for i386-bsd-user
diff --git a/qemu-0.15.x/default-configs/i386-darwin-user.mak b/qemu-0.15.x/default-configs/i386-darwin-user.mak
new file mode 100644
index 0000000..19afd3d
--- /dev/null
+++ b/qemu-0.15.x/default-configs/i386-darwin-user.mak
@@ -0,0 +1 @@
+# Default configuration for i386-darwin-user
diff --git a/qemu-0.15.x/default-configs/i386-linux-user.mak b/qemu-0.15.x/default-configs/i386-linux-user.mak
new file mode 100644
index 0000000..8657e68
--- /dev/null
+++ b/qemu-0.15.x/default-configs/i386-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for i386-linux-user
diff --git a/qemu-0.15.x/default-configs/i386-softmmu.mak b/qemu-0.15.x/default-configs/i386-softmmu.mak
new file mode 100644
index 0000000..55589fa
--- /dev/null
+++ b/qemu-0.15.x/default-configs/i386-softmmu.mak
@@ -0,0 +1,23 @@
+# Default configuration for i386-softmmu
+
+include pci.mak
+CONFIG_VGA_PCI=y
+CONFIG_VGA_ISA=y
+CONFIG_VMWARE_VGA=y
+CONFIG_VMMOUSE=y
+CONFIG_SERIAL=y
+CONFIG_PARALLEL=y
+CONFIG_I8254=y
+CONFIG_PCSPK=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_ACPI=y
+CONFIG_APM=y
+CONFIG_DMA=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_PIIX=y
+CONFIG_NE2000_ISA=y
+CONFIG_PIIX_PCI=y
+CONFIG_SOUND=y
+CONFIG_HPET=y
+CONFIG_APPLESMC=y
diff --git a/qemu-0.15.x/default-configs/lm32-softmmu.mak b/qemu-0.15.x/default-configs/lm32-softmmu.mak
new file mode 100644
index 0000000..0d19974
--- /dev/null
+++ b/qemu-0.15.x/default-configs/lm32-softmmu.mak
@@ -0,0 +1,6 @@
+# Default configuration for lm32-softmmu
+
+CONFIG_PTIMER=y
+CONFIG_PFLASH_CFI01=y
+CONFIG_PFLASH_CFI02=y
+CONFIG_SD=y
diff --git a/qemu-0.15.x/default-configs/m68k-linux-user.mak b/qemu-0.15.x/default-configs/m68k-linux-user.mak
new file mode 100644
index 0000000..f3487aa
--- /dev/null
+++ b/qemu-0.15.x/default-configs/m68k-linux-user.mak
@@ -0,0 +1,3 @@
+# Default configuration for m68k-linux-user
+
+CONFIG_GDBSTUB_XML=y
diff --git a/qemu-0.15.x/default-configs/m68k-softmmu.mak b/qemu-0.15.x/default-configs/m68k-softmmu.mak
new file mode 100644
index 0000000..3e2ec37
--- /dev/null
+++ b/qemu-0.15.x/default-configs/m68k-softmmu.mak
@@ -0,0 +1,5 @@
+# Default configuration for m68k-softmmu
+
+include pci.mak
+CONFIG_GDBSTUB_XML=y
+CONFIG_PTIMER=y
diff --git a/qemu-0.15.x/default-configs/microblaze-linux-user.mak b/qemu-0.15.x/default-configs/microblaze-linux-user.mak
new file mode 100644
index 0000000..566fdc0
--- /dev/null
+++ b/qemu-0.15.x/default-configs/microblaze-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for microblaze-linux-user
diff --git a/qemu-0.15.x/default-configs/microblaze-softmmu.mak b/qemu-0.15.x/default-configs/microblaze-softmmu.mak
new file mode 100644
index 0000000..613edab
--- /dev/null
+++ b/qemu-0.15.x/default-configs/microblaze-softmmu.mak
@@ -0,0 +1,5 @@
+# Default configuration for microblaze-softmmu
+
+CONFIG_PTIMER=y
+CONFIG_PFLASH_CFI01=y
+CONFIG_SERIAL=y
diff --git a/qemu-0.15.x/default-configs/microblazeel-linux-user.mak b/qemu-0.15.x/default-configs/microblazeel-linux-user.mak
new file mode 100644
index 0000000..378c6dd
--- /dev/null
+++ b/qemu-0.15.x/default-configs/microblazeel-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for microblazeel-linux-user
diff --git a/qemu-0.15.x/default-configs/microblazeel-softmmu.mak b/qemu-0.15.x/default-configs/microblazeel-softmmu.mak
new file mode 100644
index 0000000..4b40fb2
--- /dev/null
+++ b/qemu-0.15.x/default-configs/microblazeel-softmmu.mak
@@ -0,0 +1,5 @@
+# Default configuration for microblazeel-softmmu
+
+CONFIG_PTIMER=y
+CONFIG_PFLASH_CFI01=y
+CONFIG_SERIAL=y
diff --git a/qemu-0.15.x/default-configs/mips-linux-user.mak b/qemu-0.15.x/default-configs/mips-linux-user.mak
new file mode 100644
index 0000000..31df570
--- /dev/null
+++ b/qemu-0.15.x/default-configs/mips-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for mips-linux-user
diff --git a/qemu-0.15.x/default-configs/mips-softmmu.mak b/qemu-0.15.x/default-configs/mips-softmmu.mak
new file mode 100644
index 0000000..f524971
--- /dev/null
+++ b/qemu-0.15.x/default-configs/mips-softmmu.mak
@@ -0,0 +1,28 @@
+# Default configuration for mips-softmmu
+
+include pci.mak
+CONFIG_ISA_MMIO=y
+CONFIG_ESP=y
+CONFIG_VGA_PCI=y
+CONFIG_VGA_ISA=y
+CONFIG_VGA_ISA_MM=y
+CONFIG_VMWARE_VGA=y
+CONFIG_SERIAL=y
+CONFIG_PARALLEL=y
+CONFIG_I8254=y
+CONFIG_PCSPK=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_ACPI=y
+CONFIG_APM=y
+CONFIG_DMA=y
+CONFIG_PIIX4=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_PIIX=y
+CONFIG_NE2000_ISA=y
+CONFIG_SOUND=y
+CONFIG_RC4030=y
+CONFIG_DP8393X=y
+CONFIG_DS1225Y=y
+CONFIG_MIPSNET=y
+CONFIG_PFLASH_CFI01=y
diff --git a/qemu-0.15.x/default-configs/mips64-softmmu.mak b/qemu-0.15.x/default-configs/mips64-softmmu.mak
new file mode 100644
index 0000000..aeab6b2
--- /dev/null
+++ b/qemu-0.15.x/default-configs/mips64-softmmu.mak
@@ -0,0 +1,28 @@
+# Default configuration for mips64-softmmu
+
+include pci.mak
+CONFIG_ISA_MMIO=y
+CONFIG_ESP=y
+CONFIG_VGA_PCI=y
+CONFIG_VGA_ISA=y
+CONFIG_VGA_ISA_MM=y
+CONFIG_VMWARE_VGA=y
+CONFIG_SERIAL=y
+CONFIG_PARALLEL=y
+CONFIG_I8254=y
+CONFIG_PCSPK=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_ACPI=y
+CONFIG_APM=y
+CONFIG_DMA=y
+CONFIG_PIIX4=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_PIIX=y
+CONFIG_NE2000_ISA=y
+CONFIG_SOUND=y
+CONFIG_RC4030=y
+CONFIG_DP8393X=y
+CONFIG_DS1225Y=y
+CONFIG_MIPSNET=y
+CONFIG_PFLASH_CFI01=y
diff --git a/qemu-0.15.x/default-configs/mips64el-softmmu.mak b/qemu-0.15.x/default-configs/mips64el-softmmu.mak
new file mode 100644
index 0000000..8e6511c
--- /dev/null
+++ b/qemu-0.15.x/default-configs/mips64el-softmmu.mak
@@ -0,0 +1,30 @@
+# Default configuration for mips64el-softmmu
+
+include pci.mak
+CONFIG_ISA_MMIO=y
+CONFIG_ESP=y
+CONFIG_VGA_PCI=y
+CONFIG_VGA_ISA=y
+CONFIG_VGA_ISA_MM=y
+CONFIG_VMWARE_VGA=y
+CONFIG_SERIAL=y
+CONFIG_PARALLEL=y
+CONFIG_I8254=y
+CONFIG_PCSPK=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_ACPI=y
+CONFIG_APM=y
+CONFIG_DMA=y
+CONFIG_PIIX4=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_PIIX=y
+CONFIG_IDE_VIA=y
+CONFIG_NE2000_ISA=y
+CONFIG_SOUND=y
+CONFIG_RC4030=y
+CONFIG_DP8393X=y
+CONFIG_DS1225Y=y
+CONFIG_MIPSNET=y
+CONFIG_PFLASH_CFI01=y
+CONFIG_FULONG=y
diff --git a/qemu-0.15.x/default-configs/mipsel-linux-user.mak b/qemu-0.15.x/default-configs/mipsel-linux-user.mak
new file mode 100644
index 0000000..4d0e4af
--- /dev/null
+++ b/qemu-0.15.x/default-configs/mipsel-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for mipsel-linux-user
diff --git a/qemu-0.15.x/default-configs/mipsel-softmmu.mak b/qemu-0.15.x/default-configs/mipsel-softmmu.mak
new file mode 100644
index 0000000..a05ac25
--- /dev/null
+++ b/qemu-0.15.x/default-configs/mipsel-softmmu.mak
@@ -0,0 +1,28 @@
+# Default configuration for mipsel-softmmu
+
+include pci.mak
+CONFIG_ISA_MMIO=y
+CONFIG_ESP=y
+CONFIG_VGA_PCI=y
+CONFIG_VGA_ISA=y
+CONFIG_VGA_ISA_MM=y
+CONFIG_VMWARE_VGA=y
+CONFIG_SERIAL=y
+CONFIG_PARALLEL=y
+CONFIG_I8254=y
+CONFIG_PCSPK=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_ACPI=y
+CONFIG_APM=y
+CONFIG_DMA=y
+CONFIG_PIIX4=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_PIIX=y
+CONFIG_NE2000_ISA=y
+CONFIG_SOUND=y
+CONFIG_RC4030=y
+CONFIG_DP8393X=y
+CONFIG_DS1225Y=y
+CONFIG_MIPSNET=y
+CONFIG_PFLASH_CFI01=y
diff --git a/qemu-0.15.x/default-configs/pci.mak b/qemu-0.15.x/default-configs/pci.mak
new file mode 100644
index 0000000..22bd350
--- /dev/null
+++ b/qemu-0.15.x/default-configs/pci.mak
@@ -0,0 +1,17 @@
+CONFIG_PCI=y
+CONFIG_VIRTIO_PCI=y
+CONFIG_VIRTIO=y
+CONFIG_USB_UHCI=y
+CONFIG_USB_OHCI=y
+CONFIG_USB_EHCI=y
+CONFIG_NE2000_PCI=y
+CONFIG_EEPRO100_PCI=y
+CONFIG_PCNET_PCI=y
+CONFIG_PCNET_COMMON=y
+CONFIG_LSI_SCSI_PCI=y
+CONFIG_RTL8139_PCI=y
+CONFIG_E1000_PCI=y
+CONFIG_IDE_CORE=y
+CONFIG_IDE_QDEV=y
+CONFIG_IDE_PCI=y
+CONFIG_AHCI=y
diff --git a/qemu-0.15.x/default-configs/ppc-darwin-user.mak b/qemu-0.15.x/default-configs/ppc-darwin-user.mak
new file mode 100644
index 0000000..153ed12
--- /dev/null
+++ b/qemu-0.15.x/default-configs/ppc-darwin-user.mak
@@ -0,0 +1,3 @@
+# Default configuration for ppc-darwin-user
+
+CONFIG_GDBSTUB_XML=y
diff --git a/qemu-0.15.x/default-configs/ppc-linux-user.mak b/qemu-0.15.x/default-configs/ppc-linux-user.mak
new file mode 100644
index 0000000..681a945
--- /dev/null
+++ b/qemu-0.15.x/default-configs/ppc-linux-user.mak
@@ -0,0 +1,3 @@
+# Default configuration for ppc-linux-user
+
+CONFIG_GDBSTUB_XML=y
diff --git a/qemu-0.15.x/default-configs/ppc-softmmu.mak b/qemu-0.15.x/default-configs/ppc-softmmu.mak
new file mode 100644
index 0000000..4563742
--- /dev/null
+++ b/qemu-0.15.x/default-configs/ppc-softmmu.mak
@@ -0,0 +1,33 @@
+# Default configuration for ppc-softmmu
+
+include pci.mak
+CONFIG_GDBSTUB_XML=y
+CONFIG_ISA_MMIO=y
+CONFIG_ESCC=y
+CONFIG_M48T59=y
+CONFIG_VGA_PCI=y
+CONFIG_SERIAL=y
+CONFIG_I8254=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_DMA=y
+CONFIG_OPENPIC=y
+CONFIG_PREP_PCI=y
+CONFIG_MACIO=y
+CONFIG_CUDA=y
+CONFIG_ADB=y
+CONFIG_MAC_NVRAM=y
+CONFIG_MAC_DBDMA=y
+CONFIG_HEATHROW_PIC=y
+CONFIG_GRACKLE_PCI=y
+CONFIG_UNIN_PCI=y
+CONFIG_DEC_PCI=y
+CONFIG_PPCE500_PCI=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_CMD646=y
+CONFIG_IDE_MACIO=y
+CONFIG_NE2000_ISA=y
+CONFIG_SOUND=y
+CONFIG_PFLASH_CFI01=y
+CONFIG_PFLASH_CFI02=y
+CONFIG_PTIMER=y
diff --git a/qemu-0.15.x/default-configs/ppc64-linux-user.mak b/qemu-0.15.x/default-configs/ppc64-linux-user.mak
new file mode 100644
index 0000000..089c08f
--- /dev/null
+++ b/qemu-0.15.x/default-configs/ppc64-linux-user.mak
@@ -0,0 +1,3 @@
+# Default configuration for ppc64-linux-user
+
+CONFIG_GDBSTUB_XML=y
diff --git a/qemu-0.15.x/default-configs/ppc64-softmmu.mak b/qemu-0.15.x/default-configs/ppc64-softmmu.mak
new file mode 100644
index 0000000..d5073b3
--- /dev/null
+++ b/qemu-0.15.x/default-configs/ppc64-softmmu.mak
@@ -0,0 +1,33 @@
+# Default configuration for ppc64-softmmu
+
+include pci.mak
+CONFIG_GDBSTUB_XML=y
+CONFIG_ISA_MMIO=y
+CONFIG_ESCC=y
+CONFIG_M48T59=y
+CONFIG_VGA_PCI=y
+CONFIG_SERIAL=y
+CONFIG_I8254=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_DMA=y
+CONFIG_OPENPIC=y
+CONFIG_PREP_PCI=y
+CONFIG_MACIO=y
+CONFIG_CUDA=y
+CONFIG_ADB=y
+CONFIG_MAC_NVRAM=y
+CONFIG_MAC_DBDMA=y
+CONFIG_HEATHROW_PIC=y
+CONFIG_GRACKLE_PCI=y
+CONFIG_UNIN_PCI=y
+CONFIG_DEC_PCI=y
+CONFIG_PPCE500_PCI=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_CMD646=y
+CONFIG_IDE_MACIO=y
+CONFIG_NE2000_ISA=y
+CONFIG_SOUND=y
+CONFIG_PFLASH_CFI01=y
+CONFIG_PFLASH_CFI02=y
+CONFIG_PTIMER=y
diff --git a/qemu-0.15.x/default-configs/ppc64abi32-linux-user.mak b/qemu-0.15.x/default-configs/ppc64abi32-linux-user.mak
new file mode 100644
index 0000000..f038ffd
--- /dev/null
+++ b/qemu-0.15.x/default-configs/ppc64abi32-linux-user.mak
@@ -0,0 +1,3 @@
+# Default configuration for ppc64abi32-linux-user
+
+CONFIG_GDBSTUB_XML=y
diff --git a/qemu-0.15.x/default-configs/ppcemb-softmmu.mak b/qemu-0.15.x/default-configs/ppcemb-softmmu.mak
new file mode 100644
index 0000000..9f0730c
--- /dev/null
+++ b/qemu-0.15.x/default-configs/ppcemb-softmmu.mak
@@ -0,0 +1,33 @@
+# Default configuration for ppcemb-softmmu
+
+include pci.mak
+CONFIG_GDBSTUB_XML=y
+CONFIG_ISA_MMIO=y
+CONFIG_ESCC=y
+CONFIG_M48T59=y
+CONFIG_VGA_PCI=y
+CONFIG_SERIAL=y
+CONFIG_I8254=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_DMA=y
+CONFIG_OPENPIC=y
+CONFIG_PREP_PCI=y
+CONFIG_MACIO=y
+CONFIG_CUDA=y
+CONFIG_ADB=y
+CONFIG_MAC_NVRAM=y
+CONFIG_MAC_DBDMA=y
+CONFIG_HEATHROW_PIC=y
+CONFIG_GRACKLE_PCI=y
+CONFIG_UNIN_PCI=y
+CONFIG_DEC_PCI=y
+CONFIG_PPCE500_PCI=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_CMD646=y
+CONFIG_IDE_MACIO=y
+CONFIG_NE2000_ISA=y
+CONFIG_SOUND=y
+CONFIG_PFLASH_CFI01=y
+CONFIG_PFLASH_CFI02=y
+CONFIG_PTIMER=y
diff --git a/qemu-0.15.x/default-configs/s390x-linux-user.mak b/qemu-0.15.x/default-configs/s390x-linux-user.mak
new file mode 100644
index 0000000..a243c99
--- /dev/null
+++ b/qemu-0.15.x/default-configs/s390x-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for s390x-linux-user
diff --git a/qemu-0.15.x/default-configs/s390x-softmmu.mak b/qemu-0.15.x/default-configs/s390x-softmmu.mak
new file mode 100644
index 0000000..3005729
--- /dev/null
+++ b/qemu-0.15.x/default-configs/s390x-softmmu.mak
@@ -0,0 +1 @@
+CONFIG_VIRTIO=y
diff --git a/qemu-0.15.x/default-configs/sh4-linux-user.mak b/qemu-0.15.x/default-configs/sh4-linux-user.mak
new file mode 100644
index 0000000..a469e19
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sh4-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for sh4-linux-user
diff --git a/qemu-0.15.x/default-configs/sh4-softmmu.mak b/qemu-0.15.x/default-configs/sh4-softmmu.mak
new file mode 100644
index 0000000..5c69acc
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sh4-softmmu.mak
@@ -0,0 +1,7 @@
+# Default configuration for sh4-softmmu
+
+include pci.mak
+CONFIG_SERIAL=y
+CONFIG_PTIMER=y
+CONFIG_PFLASH_CFI02=y
+CONFIG_ISA_MMIO=y
diff --git a/qemu-0.15.x/default-configs/sh4eb-linux-user.mak b/qemu-0.15.x/default-configs/sh4eb-linux-user.mak
new file mode 100644
index 0000000..be08ca1
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sh4eb-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for sh4eb-linux-user
diff --git a/qemu-0.15.x/default-configs/sh4eb-softmmu.mak b/qemu-0.15.x/default-configs/sh4eb-softmmu.mak
new file mode 100644
index 0000000..7cdc122
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sh4eb-softmmu.mak
@@ -0,0 +1,7 @@
+# Default configuration for sh4eb-softmmu
+
+include pci.mak
+CONFIG_SERIAL=y
+CONFIG_PTIMER=y
+CONFIG_PFLASH_CFI02=y
+CONFIG_ISA_MMIO=y
diff --git a/qemu-0.15.x/default-configs/sparc-bsd-user.mak b/qemu-0.15.x/default-configs/sparc-bsd-user.mak
new file mode 100644
index 0000000..21e0950
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sparc-bsd-user.mak
@@ -0,0 +1 @@
+# Default configuration for sparc-bsd-user
diff --git a/qemu-0.15.x/default-configs/sparc-linux-user.mak b/qemu-0.15.x/default-configs/sparc-linux-user.mak
new file mode 100644
index 0000000..9c716d1
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sparc-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for sparc-linux-user
diff --git a/qemu-0.15.x/default-configs/sparc-softmmu.mak b/qemu-0.15.x/default-configs/sparc-softmmu.mak
new file mode 100644
index 0000000..b0310c5
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sparc-softmmu.mak
@@ -0,0 +1,10 @@
+# Default configuration for sparc-softmmu
+
+CONFIG_ECC=y
+CONFIG_ESP=y
+CONFIG_ESCC=y
+CONFIG_M48T59=y
+CONFIG_PTIMER=y
+CONFIG_FDC=y
+CONFIG_EMPTY_SLOT=y
+CONFIG_PCNET_COMMON=y
diff --git a/qemu-0.15.x/default-configs/sparc32plus-linux-user.mak b/qemu-0.15.x/default-configs/sparc32plus-linux-user.mak
new file mode 100644
index 0000000..432e880
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sparc32plus-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for sparc32plus-linux-user
diff --git a/qemu-0.15.x/default-configs/sparc64-bsd-user.mak b/qemu-0.15.x/default-configs/sparc64-bsd-user.mak
new file mode 100644
index 0000000..b8b9eea
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sparc64-bsd-user.mak
@@ -0,0 +1 @@
+# Default configuration for sparc64-bsd-user
diff --git a/qemu-0.15.x/default-configs/sparc64-linux-user.mak b/qemu-0.15.x/default-configs/sparc64-linux-user.mak
new file mode 100644
index 0000000..bf1bdd6
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sparc64-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for sparc64-linux-user
diff --git a/qemu-0.15.x/default-configs/sparc64-softmmu.mak b/qemu-0.15.x/default-configs/sparc64-softmmu.mak
new file mode 100644
index 0000000..d8f17e7
--- /dev/null
+++ b/qemu-0.15.x/default-configs/sparc64-softmmu.mak
@@ -0,0 +1,13 @@
+# Default configuration for sparc64-softmmu
+
+include pci.mak
+CONFIG_ISA_MMIO=y
+CONFIG_M48T59=y
+CONFIG_PTIMER=y
+CONFIG_VGA_PCI=y
+CONFIG_SERIAL=y
+CONFIG_PARALLEL=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_CMD646=y
diff --git a/qemu-0.15.x/default-configs/unicore32-linux-user.mak b/qemu-0.15.x/default-configs/unicore32-linux-user.mak
new file mode 100644
index 0000000..6aafd21
--- /dev/null
+++ b/qemu-0.15.x/default-configs/unicore32-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for unicore32-linux-user
diff --git a/qemu-0.15.x/default-configs/x86_64-bsd-user.mak b/qemu-0.15.x/default-configs/x86_64-bsd-user.mak
new file mode 100644
index 0000000..73e5d34
--- /dev/null
+++ b/qemu-0.15.x/default-configs/x86_64-bsd-user.mak
@@ -0,0 +1 @@
+# Default configuration for x86_64-bsd-user
diff --git a/qemu-0.15.x/default-configs/x86_64-linux-user.mak b/qemu-0.15.x/default-configs/x86_64-linux-user.mak
new file mode 100644
index 0000000..bec1d9e
--- /dev/null
+++ b/qemu-0.15.x/default-configs/x86_64-linux-user.mak
@@ -0,0 +1 @@
+# Default configuration for x86_64-linux-user
diff --git a/qemu-0.15.x/default-configs/x86_64-softmmu.mak b/qemu-0.15.x/default-configs/x86_64-softmmu.mak
new file mode 100644
index 0000000..8895028
--- /dev/null
+++ b/qemu-0.15.x/default-configs/x86_64-softmmu.mak
@@ -0,0 +1,23 @@
+# Default configuration for x86_64-softmmu
+
+include pci.mak
+CONFIG_VGA_PCI=y
+CONFIG_VGA_ISA=y
+CONFIG_VMWARE_VGA=y
+CONFIG_VMMOUSE=y
+CONFIG_SERIAL=y
+CONFIG_PARALLEL=y
+CONFIG_I8254=y
+CONFIG_PCSPK=y
+CONFIG_PCKBD=y
+CONFIG_FDC=y
+CONFIG_ACPI=y
+CONFIG_APM=y
+CONFIG_DMA=y
+CONFIG_IDE_ISA=y
+CONFIG_IDE_PIIX=y
+CONFIG_NE2000_ISA=y
+CONFIG_PIIX_PCI=y
+CONFIG_SOUND=y
+CONFIG_HPET=y
+CONFIG_APPLESMC=y
diff --git a/qemu-0.15.x/device_tree.c b/qemu-0.15.x/device_tree.c
new file mode 100644
index 0000000..f5d5eb1
--- /dev/null
+++ b/qemu-0.15.x/device_tree.c
@@ -0,0 +1,109 @@
+/*
+ * Functions to help device tree manipulation using libfdt.
+ * It also provides functions to read entries from device tree proc
+ * interface.
+ *
+ * Copyright 2008 IBM Corporation.
+ * Authors: Jerone Young <jyoung5(a)us.ibm.com>
+ * Hollis Blanchard <hollisb(a)us.ibm.com>
+ *
+ * This work is licensed under the GNU GPL license version 2 or later.
+ *
+ */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "qemu-common.h"
+#include "device_tree.h"
+#include "hw/loader.h"
+
+#include <libfdt.h>
+
+void *load_device_tree(const char *filename_path, int *sizep)
+{
+ int dt_size;
+ int dt_file_load_size;
+ int ret;
+ void *fdt = NULL;
+
+ *sizep = 0;
+ dt_size = get_image_size(filename_path);
+ if (dt_size < 0) {
+ printf("Unable to get size of device tree file '%s'\n",
+ filename_path);
+ goto fail;
+ }
+
+ /* Expand to 2x size to give enough room for manipulation. */
+ dt_size *= 2;
+ /* First allocate space in qemu for device tree */
+ fdt = qemu_mallocz(dt_size);
+
+ dt_file_load_size = load_image(filename_path, fdt);
+ if (dt_file_load_size < 0) {
+ printf("Unable to open device tree file '%s'\n",
+ filename_path);
+ goto fail;
+ }
+
+ ret = fdt_open_into(fdt, fdt, dt_size);
+ if (ret) {
+ printf("Unable to copy device tree in memory\n");
+ goto fail;
+ }
+
+ /* Check sanity of device tree */
+ if (fdt_check_header(fdt)) {
+ printf ("Device tree file loaded into memory is invalid: %s\n",
+ filename_path);
+ goto fail;
+ }
+ *sizep = dt_size;
+ return fdt;
+
+fail:
+ qemu_free(fdt);
+ return NULL;
+}
+
+int qemu_devtree_setprop(void *fdt, const char *node_path,
+ const char *property, void *val_array, int size)
+{
+ int offset;
+
+ offset = fdt_path_offset(fdt, node_path);
+ if (offset < 0)
+ return offset;
+
+ return fdt_setprop(fdt, offset, property, val_array, size);
+}
+
+int qemu_devtree_setprop_cell(void *fdt, const char *node_path,
+ const char *property, uint32_t val)
+{
+ int offset;
+
+ offset = fdt_path_offset(fdt, node_path);
+ if (offset < 0)
+ return offset;
+
+ return fdt_setprop_cell(fdt, offset, property, val);
+}
+
+int qemu_devtree_setprop_string(void *fdt, const char *node_path,
+ const char *property, const char *string)
+{
+ int offset;
+
+ offset = fdt_path_offset(fdt, node_path);
+ if (offset < 0)
+ return offset;
+
+ return fdt_setprop_string(fdt, offset, property, string);
+}
diff --git a/qemu-0.15.x/device_tree.h b/qemu-0.15.x/device_tree.h
new file mode 100644
index 0000000..cecd98f
--- /dev/null
+++ b/qemu-0.15.x/device_tree.h
@@ -0,0 +1,26 @@
+/*
+ * Header with function prototypes to help device tree manipulation using
+ * libfdt. It also provides functions to read entries from device tree proc
+ * interface.
+ *
+ * Copyright 2008 IBM Corporation.
+ * Authors: Jerone Young <jyoung5(a)us.ibm.com>
+ * Hollis Blanchard <hollisb(a)us.ibm.com>
+ *
+ * This work is licensed under the GNU GPL license version 2 or later.
+ *
+ */
+
+#ifndef __DEVICE_TREE_H__
+#define __DEVICE_TREE_H__
+
+void *load_device_tree(const char *filename_path, int *sizep);
+
+int qemu_devtree_setprop(void *fdt, const char *node_path,
+ const char *property, void *val_array, int size);
+int qemu_devtree_setprop_cell(void *fdt, const char *node_path,
+ const char *property, uint32_t val);
+int qemu_devtree_setprop_string(void *fdt, const char *node_path,
+ const char *property, const char *string);
+
+#endif /* __DEVICE_TREE_H__ */
diff --git a/qemu-0.15.x/dis-asm.h b/qemu-0.15.x/dis-asm.h
new file mode 100644
index 0000000..5b07d7f
--- /dev/null
+++ b/qemu-0.15.x/dis-asm.h
@@ -0,0 +1,479 @@
+/* Interface between the opcode library and its callers.
+ Written by Cygnus Support, 1993.
+
+ The opcode library (libopcodes.a) provides instruction decoders for
+ a large variety of instruction sets, callable with an identical
+ interface, for making instruction-processing programs more independent
+ of the instruction set being processed. */
+
+#ifndef DIS_ASM_H
+#define DIS_ASM_H
+
+#include "qemu-common.h"
+
+typedef void *PTR;
+typedef uint64_t bfd_vma;
+typedef int64_t bfd_signed_vma;
+typedef uint8_t bfd_byte;
+#define sprintf_vma(s,x) sprintf (s, "%0" PRIx64, x)
+#define snprintf_vma(s,ss,x) snprintf (s, ss, "%0" PRIx64, x)
+
+#define BFD64
+
+enum bfd_flavour {
+ bfd_target_unknown_flavour,
+ bfd_target_aout_flavour,
+ bfd_target_coff_flavour,
+ bfd_target_ecoff_flavour,
+ bfd_target_elf_flavour,
+ bfd_target_ieee_flavour,
+ bfd_target_nlm_flavour,
+ bfd_target_oasys_flavour,
+ bfd_target_tekhex_flavour,
+ bfd_target_srec_flavour,
+ bfd_target_ihex_flavour,
+ bfd_target_som_flavour,
+ bfd_target_os9k_flavour,
+ bfd_target_versados_flavour,
+ bfd_target_msdos_flavour,
+ bfd_target_evax_flavour
+};
+
+enum bfd_endian { BFD_ENDIAN_BIG, BFD_ENDIAN_LITTLE, BFD_ENDIAN_UNKNOWN };
+
+enum bfd_architecture
+{
+ bfd_arch_unknown, /* File arch not known */
+ bfd_arch_obscure, /* Arch known, not one of these */
+ bfd_arch_m68k, /* Motorola 68xxx */
+#define bfd_mach_m68000 1
+#define bfd_mach_m68008 2
+#define bfd_mach_m68010 3
+#define bfd_mach_m68020 4
+#define bfd_mach_m68030 5
+#define bfd_mach_m68040 6
+#define bfd_mach_m68060 7
+#define bfd_mach_cpu32 8
+#define bfd_mach_mcf5200 9
+#define bfd_mach_mcf5206e 10
+#define bfd_mach_mcf5307 11
+#define bfd_mach_mcf5407 12
+#define bfd_mach_mcf528x 13
+#define bfd_mach_mcfv4e 14
+#define bfd_mach_mcf521x 15
+#define bfd_mach_mcf5249 16
+#define bfd_mach_mcf547x 17
+#define bfd_mach_mcf548x 18
+ bfd_arch_vax, /* DEC Vax */
+ bfd_arch_i960, /* Intel 960 */
+ /* The order of the following is important.
+ lower number indicates a machine type that
+ only accepts a subset of the instructions
+ available to machines with higher numbers.
+ The exception is the "ca", which is
+ incompatible with all other machines except
+ "core". */
+
+#define bfd_mach_i960_core 1
+#define bfd_mach_i960_ka_sa 2
+#define bfd_mach_i960_kb_sb 3
+#define bfd_mach_i960_mc 4
+#define bfd_mach_i960_xa 5
+#define bfd_mach_i960_ca 6
+#define bfd_mach_i960_jx 7
+#define bfd_mach_i960_hx 8
+
+ bfd_arch_a29k, /* AMD 29000 */
+ bfd_arch_sparc, /* SPARC */
+#define bfd_mach_sparc 1
+/* The difference between v8plus and v9 is that v9 is a true 64 bit env. */
+#define bfd_mach_sparc_sparclet 2
+#define bfd_mach_sparc_sparclite 3
+#define bfd_mach_sparc_v8plus 4
+#define bfd_mach_sparc_v8plusa 5 /* with ultrasparc add'ns. */
+#define bfd_mach_sparc_sparclite_le 6
+#define bfd_mach_sparc_v9 7
+#define bfd_mach_sparc_v9a 8 /* with ultrasparc add'ns. */
+#define bfd_mach_sparc_v8plusb 9 /* with cheetah add'ns. */
+#define bfd_mach_sparc_v9b 10 /* with cheetah add'ns. */
+/* Nonzero if MACH has the v9 instruction set. */
+#define bfd_mach_sparc_v9_p(mach) \
+ ((mach) >= bfd_mach_sparc_v8plus && (mach) <= bfd_mach_sparc_v9b \
+ && (mach) != bfd_mach_sparc_sparclite_le)
+ bfd_arch_mips, /* MIPS Rxxxx */
+#define bfd_mach_mips3000 3000
+#define bfd_mach_mips3900 3900
+#define bfd_mach_mips4000 4000
+#define bfd_mach_mips4010 4010
+#define bfd_mach_mips4100 4100
+#define bfd_mach_mips4300 4300
+#define bfd_mach_mips4400 4400
+#define bfd_mach_mips4600 4600
+#define bfd_mach_mips4650 4650
+#define bfd_mach_mips5000 5000
+#define bfd_mach_mips6000 6000
+#define bfd_mach_mips8000 8000
+#define bfd_mach_mips10000 10000
+#define bfd_mach_mips16 16
+ bfd_arch_i386, /* Intel 386 */
+#define bfd_mach_i386_i386 0
+#define bfd_mach_i386_i8086 1
+#define bfd_mach_i386_i386_intel_syntax 2
+#define bfd_mach_x86_64 3
+#define bfd_mach_x86_64_intel_syntax 4
+ bfd_arch_we32k, /* AT&T WE32xxx */
+ bfd_arch_tahoe, /* CCI/Harris Tahoe */
+ bfd_arch_i860, /* Intel 860 */
+ bfd_arch_romp, /* IBM ROMP PC/RT */
+ bfd_arch_alliant, /* Alliant */
+ bfd_arch_convex, /* Convex */
+ bfd_arch_m88k, /* Motorola 88xxx */
+ bfd_arch_pyramid, /* Pyramid Technology */
+ bfd_arch_h8300, /* Hitachi H8/300 */
+#define bfd_mach_h8300 1
+#define bfd_mach_h8300h 2
+#define bfd_mach_h8300s 3
+ bfd_arch_powerpc, /* PowerPC */
+#define bfd_mach_ppc 0
+#define bfd_mach_ppc64 1
+#define bfd_mach_ppc_403 403
+#define bfd_mach_ppc_403gc 4030
+#define bfd_mach_ppc_e500 500
+#define bfd_mach_ppc_505 505
+#define bfd_mach_ppc_601 601
+#define bfd_mach_ppc_602 602
+#define bfd_mach_ppc_603 603
+#define bfd_mach_ppc_ec603e 6031
+#define bfd_mach_ppc_604 604
+#define bfd_mach_ppc_620 620
+#define bfd_mach_ppc_630 630
+#define bfd_mach_ppc_750 750
+#define bfd_mach_ppc_860 860
+#define bfd_mach_ppc_a35 35
+#define bfd_mach_ppc_rs64ii 642
+#define bfd_mach_ppc_rs64iii 643
+#define bfd_mach_ppc_7400 7400
+ bfd_arch_rs6000, /* IBM RS/6000 */
+ bfd_arch_hppa, /* HP PA RISC */
+#define bfd_mach_hppa10 10
+#define bfd_mach_hppa11 11
+#define bfd_mach_hppa20 20
+#define bfd_mach_hppa20w 25
+ bfd_arch_d10v, /* Mitsubishi D10V */
+ bfd_arch_z8k, /* Zilog Z8000 */
+#define bfd_mach_z8001 1
+#define bfd_mach_z8002 2
+ bfd_arch_h8500, /* Hitachi H8/500 */
+ bfd_arch_sh, /* Hitachi SH */
+#define bfd_mach_sh 1
+#define bfd_mach_sh2 0x20
+#define bfd_mach_sh_dsp 0x2d
+#define bfd_mach_sh2a 0x2a
+#define bfd_mach_sh2a_nofpu 0x2b
+#define bfd_mach_sh2e 0x2e
+#define bfd_mach_sh3 0x30
+#define bfd_mach_sh3_nommu 0x31
+#define bfd_mach_sh3_dsp 0x3d
+#define bfd_mach_sh3e 0x3e
+#define bfd_mach_sh4 0x40
+#define bfd_mach_sh4_nofpu 0x41
+#define bfd_mach_sh4_nommu_nofpu 0x42
+#define bfd_mach_sh4a 0x4a
+#define bfd_mach_sh4a_nofpu 0x4b
+#define bfd_mach_sh4al_dsp 0x4d
+#define bfd_mach_sh5 0x50
+ bfd_arch_alpha, /* Dec Alpha */
+#define bfd_mach_alpha 1
+#define bfd_mach_alpha_ev4 0x10
+#define bfd_mach_alpha_ev5 0x20
+#define bfd_mach_alpha_ev6 0x30
+ bfd_arch_arm, /* Advanced Risc Machines ARM */
+#define bfd_mach_arm_unknown 0
+#define bfd_mach_arm_2 1
+#define bfd_mach_arm_2a 2
+#define bfd_mach_arm_3 3
+#define bfd_mach_arm_3M 4
+#define bfd_mach_arm_4 5
+#define bfd_mach_arm_4T 6
+#define bfd_mach_arm_5 7
+#define bfd_mach_arm_5T 8
+#define bfd_mach_arm_5TE 9
+#define bfd_mach_arm_XScale 10
+#define bfd_mach_arm_ep9312 11
+#define bfd_mach_arm_iWMMXt 12
+#define bfd_mach_arm_iWMMXt2 13
+ bfd_arch_ns32k, /* National Semiconductors ns32000 */
+ bfd_arch_w65, /* WDC 65816 */
+ bfd_arch_tic30, /* Texas Instruments TMS320C30 */
+ bfd_arch_v850, /* NEC V850 */
+#define bfd_mach_v850 0
+ bfd_arch_arc, /* Argonaut RISC Core */
+#define bfd_mach_arc_base 0
+ bfd_arch_m32r, /* Mitsubishi M32R/D */
+#define bfd_mach_m32r 0 /* backwards compatibility */
+ bfd_arch_mn10200, /* Matsushita MN10200 */
+ bfd_arch_mn10300, /* Matsushita MN10300 */
+ bfd_arch_cris, /* Axis CRIS */
+#define bfd_mach_cris_v0_v10 255
+#define bfd_mach_cris_v32 32
+#define bfd_mach_cris_v10_v32 1032
+ bfd_arch_microblaze, /* Xilinx MicroBlaze. */
+ bfd_arch_ia64, /* HP/Intel ia64 */
+#define bfd_mach_ia64_elf64 64
+#define bfd_mach_ia64_elf32 32
+ bfd_arch_last
+ };
+#define bfd_mach_s390_31 31
+#define bfd_mach_s390_64 64
+
+typedef struct symbol_cache_entry
+{
+ const char *name;
+ union
+ {
+ PTR p;
+ bfd_vma i;
+ } udata;
+} asymbol;
+
+enum dis_insn_type {
+ dis_noninsn, /* Not a valid instruction */
+ dis_nonbranch, /* Not a branch instruction */
+ dis_branch, /* Unconditional branch */
+ dis_condbranch, /* Conditional branch */
+ dis_jsr, /* Jump to subroutine */
+ dis_condjsr, /* Conditional jump to subroutine */
+ dis_dref, /* Data reference instruction */
+ dis_dref2 /* Two data references in instruction */
+};
+
+/* This struct is passed into the instruction decoding routine,
+ and is passed back out into each callback. The various fields are used
+ for conveying information from your main routine into your callbacks,
+ for passing information into the instruction decoders (such as the
+ addresses of the callback functions), or for passing information
+ back from the instruction decoders to their callers.
+
+ It must be initialized before it is first passed; this can be done
+ by hand, or using one of the initialization macros below. */
+
+typedef struct disassemble_info {
+ fprintf_function fprintf_func;
+ FILE *stream;
+ PTR application_data;
+
+ /* Target description. We could replace this with a pointer to the bfd,
+ but that would require one. There currently isn't any such requirement
+ so to avoid introducing one we record these explicitly. */
+ /* The bfd_flavour. This can be bfd_target_unknown_flavour. */
+ enum bfd_flavour flavour;
+ /* The bfd_arch value. */
+ enum bfd_architecture arch;
+ /* The bfd_mach value. */
+ unsigned long mach;
+ /* Endianness (for bi-endian cpus). Mono-endian cpus can ignore this. */
+ enum bfd_endian endian;
+
+ /* An array of pointers to symbols either at the location being disassembled
+ or at the start of the function being disassembled. The array is sorted
+ so that the first symbol is intended to be the one used. The others are
+ present for any misc. purposes. This is not set reliably, but if it is
+ not NULL, it is correct. */
+ asymbol **symbols;
+ /* Number of symbols in array. */
+ int num_symbols;
+
+ /* For use by the disassembler.
+ The top 16 bits are reserved for public use (and are documented here).
+ The bottom 16 bits are for the internal use of the disassembler. */
+ unsigned long flags;
+#define INSN_HAS_RELOC 0x80000000
+ PTR private_data;
+
+ /* Function used to get bytes to disassemble. MEMADDR is the
+ address of the stuff to be disassembled, MYADDR is the address to
+ put the bytes in, and LENGTH is the number of bytes to read.
+ INFO is a pointer to this struct.
+ Returns an errno value or 0 for success. */
+ int (*read_memory_func)
+ (bfd_vma memaddr, bfd_byte *myaddr, int length,
+ struct disassemble_info *info);
+
+ /* Function which should be called if we get an error that we can't
+ recover from. STATUS is the errno value from read_memory_func and
+ MEMADDR is the address that we were trying to read. INFO is a
+ pointer to this struct. */
+ void (*memory_error_func)
+ (int status, bfd_vma memaddr, struct disassemble_info *info);
+
+ /* Function called to print ADDR. */
+ void (*print_address_func)
+ (bfd_vma addr, struct disassemble_info *info);
+
+ /* Function called to determine if there is a symbol at the given ADDR.
+ If there is, the function returns 1, otherwise it returns 0.
+ This is used by ports which support an overlay manager where
+ the overlay number is held in the top part of an address. In
+ some circumstances we want to include the overlay number in the
+ address, (normally because there is a symbol associated with
+ that address), but sometimes we want to mask out the overlay bits. */
+ int (* symbol_at_address_func)
+ (bfd_vma addr, struct disassemble_info * info);
+
+ /* These are for buffer_read_memory. */
+ bfd_byte *buffer;
+ bfd_vma buffer_vma;
+ int buffer_length;
+
+ /* This variable may be set by the instruction decoder. It suggests
+ the number of bytes objdump should display on a single line. If
+ the instruction decoder sets this, it should always set it to
+ the same value in order to get reasonable looking output. */
+ int bytes_per_line;
+
+ /* the next two variables control the way objdump displays the raw data */
+ /* For example, if bytes_per_line is 8 and bytes_per_chunk is 4, the */
+ /* output will look like this:
+ 00: 00000000 00000000
+ with the chunks displayed according to "display_endian". */
+ int bytes_per_chunk;
+ enum bfd_endian display_endian;
+
+ /* Results from instruction decoders. Not all decoders yet support
+ this information. This info is set each time an instruction is
+ decoded, and is only valid for the last such instruction.
+
+ To determine whether this decoder supports this information, set
+ insn_info_valid to 0, decode an instruction, then check it. */
+
+ char insn_info_valid; /* Branch info has been set. */
+ char branch_delay_insns; /* How many sequential insn's will run before
+ a branch takes effect. (0 = normal) */
+ char data_size; /* Size of data reference in insn, in bytes */
+ enum dis_insn_type insn_type; /* Type of instruction */
+ bfd_vma target; /* Target address of branch or dref, if known;
+ zero if unknown. */
+ bfd_vma target2; /* Second target address for dref2 */
+
+ /* Command line options specific to the target disassembler. */
+ char * disassembler_options;
+
+} disassemble_info;
+
+
+/* Standard disassemblers. Disassemble one instruction at the given
+ target address. Return number of bytes processed. */
+typedef int (*disassembler_ftype) (bfd_vma, disassemble_info *);
+
+int print_insn_big_mips (bfd_vma, disassemble_info*);
+int print_insn_little_mips (bfd_vma, disassemble_info*);
+int print_insn_i386 (bfd_vma, disassemble_info*);
+int print_insn_m68k (bfd_vma, disassemble_info*);
+int print_insn_z8001 (bfd_vma, disassemble_info*);
+int print_insn_z8002 (bfd_vma, disassemble_info*);
+int print_insn_h8300 (bfd_vma, disassemble_info*);
+int print_insn_h8300h (bfd_vma, disassemble_info*);
+int print_insn_h8300s (bfd_vma, disassemble_info*);
+int print_insn_h8500 (bfd_vma, disassemble_info*);
+int print_insn_alpha (bfd_vma, disassemble_info*);
+disassembler_ftype arc_get_disassembler (int, int);
+int print_insn_arm (bfd_vma, disassemble_info*);
+int print_insn_sparc (bfd_vma, disassemble_info*);
+int print_insn_big_a29k (bfd_vma, disassemble_info*);
+int print_insn_little_a29k (bfd_vma, disassemble_info*);
+int print_insn_i960 (bfd_vma, disassemble_info*);
+int print_insn_sh (bfd_vma, disassemble_info*);
+int print_insn_shl (bfd_vma, disassemble_info*);
+int print_insn_hppa (bfd_vma, disassemble_info*);
+int print_insn_m32r (bfd_vma, disassemble_info*);
+int print_insn_m88k (bfd_vma, disassemble_info*);
+int print_insn_mn10200 (bfd_vma, disassemble_info*);
+int print_insn_mn10300 (bfd_vma, disassemble_info*);
+int print_insn_ns32k (bfd_vma, disassemble_info*);
+int print_insn_big_powerpc (bfd_vma, disassemble_info*);
+int print_insn_little_powerpc (bfd_vma, disassemble_info*);
+int print_insn_rs6000 (bfd_vma, disassemble_info*);
+int print_insn_w65 (bfd_vma, disassemble_info*);
+int print_insn_d10v (bfd_vma, disassemble_info*);
+int print_insn_v850 (bfd_vma, disassemble_info*);
+int print_insn_tic30 (bfd_vma, disassemble_info*);
+int print_insn_ppc (bfd_vma, disassemble_info*);
+int print_insn_s390 (bfd_vma, disassemble_info*);
+int print_insn_crisv32 (bfd_vma, disassemble_info*);
+int print_insn_crisv10 (bfd_vma, disassemble_info*);
+int print_insn_microblaze (bfd_vma, disassemble_info*);
+int print_insn_ia64 (bfd_vma, disassemble_info*);
+
+#if 0
+/* Fetch the disassembler for a given BFD, if that support is available. */
+disassembler_ftype disassembler(bfd *);
+#endif
+
+
+/* This block of definitions is for particular callers who read instructions
+ into a buffer before calling the instruction decoder. */
+
+/* Here is a function which callers may wish to use for read_memory_func.
+ It gets bytes from a buffer. */
+int buffer_read_memory(bfd_vma, bfd_byte *, int, struct disassemble_info *);
+
+/* This function goes with buffer_read_memory.
+ It prints a message using info->fprintf_func and info->stream. */
+void perror_memory(int, bfd_vma, struct disassemble_info *);
+
+
+/* Just print the address in hex. This is included for completeness even
+ though both GDB and objdump provide their own (to print symbolic
+ addresses). */
+void generic_print_address(bfd_vma, struct disassemble_info *);
+
+/* Always true. */
+int generic_symbol_at_address(bfd_vma, struct disassemble_info *);
+
+/* Macro to initialize a disassemble_info struct. This should be called
+ by all applications creating such a struct. */
+#define INIT_DISASSEMBLE_INFO(INFO, STREAM, FPRINTF_FUNC) \
+ (INFO).flavour = bfd_target_unknown_flavour, \
+ (INFO).arch = bfd_arch_unknown, \
+ (INFO).mach = 0, \
+ (INFO).endian = BFD_ENDIAN_UNKNOWN, \
+ INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC)
+
+/* Call this macro to initialize only the internal variables for the
+ disassembler. Architecture dependent things such as byte order, or machine
+ variant are not touched by this macro. This makes things much easier for
+ GDB which must initialize these things separately. */
+
+#define INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) \
+ (INFO).fprintf_func = (FPRINTF_FUNC), \
+ (INFO).stream = (STREAM), \
+ (INFO).symbols = NULL, \
+ (INFO).num_symbols = 0, \
+ (INFO).private_data = NULL, \
+ (INFO).buffer = NULL, \
+ (INFO).buffer_vma = 0, \
+ (INFO).buffer_length = 0, \
+ (INFO).read_memory_func = buffer_read_memory, \
+ (INFO).memory_error_func = perror_memory, \
+ (INFO).print_address_func = generic_print_address, \
+ (INFO).symbol_at_address_func = generic_symbol_at_address, \
+ (INFO).flags = 0, \
+ (INFO).bytes_per_line = 0, \
+ (INFO).bytes_per_chunk = 0, \
+ (INFO).display_endian = BFD_ENDIAN_UNKNOWN, \
+ (INFO).disassembler_options = NULL, \
+ (INFO).insn_info_valid = 0
+
+#define _(x) x
+#define ATTRIBUTE_UNUSED __attribute__((unused))
+
+/* from libbfd */
+
+bfd_vma bfd_getl64 (const bfd_byte *addr);
+bfd_vma bfd_getl32 (const bfd_byte *addr);
+bfd_vma bfd_getb32 (const bfd_byte *addr);
+bfd_vma bfd_getl16 (const bfd_byte *addr);
+bfd_vma bfd_getb16 (const bfd_byte *addr);
+typedef bool bfd_boolean;
+
+#endif /* ! defined (DIS_ASM_H) */
diff --git a/qemu-0.15.x/disas.c b/qemu-0.15.x/disas.c
new file mode 100644
index 0000000..1334b8e
--- /dev/null
+++ b/qemu-0.15.x/disas.c
@@ -0,0 +1,437 @@
+/* General "disassemble this chunk" code. Used for debugging. */
+#include "config.h"
+#include "dis-asm.h"
+#include "elf.h"
+#include <errno.h>
+
+#include "cpu.h"
+#include "disas.h"
+
+/* Filled in by elfload.c. Simplistic, but will do for now. */
+struct syminfo *syminfos = NULL;
+
+/* Get LENGTH bytes from info's buffer, at target address memaddr.
+ Transfer them to myaddr. */
+int
+buffer_read_memory(bfd_vma memaddr, bfd_byte *myaddr, int length,
+ struct disassemble_info *info)
+{
+ if (memaddr < info->buffer_vma
+ || memaddr + length > info->buffer_vma + info->buffer_length)
+ /* Out of bounds. Use EIO because GDB uses it. */
+ return EIO;
+ memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length);
+ return 0;
+}
+
+/* Get LENGTH bytes from info's buffer, at target address memaddr.
+ Transfer them to myaddr. */
+static int
+target_read_memory (bfd_vma memaddr,
+ bfd_byte *myaddr,
+ int length,
+ struct disassemble_info *info)
+{
+ cpu_memory_rw_debug(cpu_single_env, memaddr, myaddr, length, 0);
+ return 0;
+}
+
+/* Print an error message. We can assume that this is in response to
+ an error return from buffer_read_memory. */
+void
+perror_memory (int status, bfd_vma memaddr, struct disassemble_info *info)
+{
+ if (status != EIO)
+ /* Can't happen. */
+ (*info->fprintf_func) (info->stream, "Unknown error %d\n", status);
+ else
+ /* Actually, address between memaddr and memaddr + len was
+ out of bounds. */
+ (*info->fprintf_func) (info->stream,
+ "Address 0x%" PRIx64 " is out of bounds.\n", memaddr);
+}
+
+/* This could be in a separate file, to save miniscule amounts of space
+ in statically linked executables. */
+
+/* Just print the address is hex. This is included for completeness even
+ though both GDB and objdump provide their own (to print symbolic
+ addresses). */
+
+void
+generic_print_address (bfd_vma addr, struct disassemble_info *info)
+{
+ (*info->fprintf_func) (info->stream, "0x%" PRIx64, addr);
+}
+
+/* Just return the given address. */
+
+int
+generic_symbol_at_address (bfd_vma addr, struct disassemble_info *info)
+{
+ return 1;
+}
+
+bfd_vma bfd_getl64 (const bfd_byte *addr)
+{
+ unsigned long long v;
+
+ v = (unsigned long long) addr[0];
+ v |= (unsigned long long) addr[1] << 8;
+ v |= (unsigned long long) addr[2] << 16;
+ v |= (unsigned long long) addr[3] << 24;
+ v |= (unsigned long long) addr[4] << 32;
+ v |= (unsigned long long) addr[5] << 40;
+ v |= (unsigned long long) addr[6] << 48;
+ v |= (unsigned long long) addr[7] << 56;
+ return (bfd_vma) v;
+}
+
+bfd_vma bfd_getl32 (const bfd_byte *addr)
+{
+ unsigned long v;
+
+ v = (unsigned long) addr[0];
+ v |= (unsigned long) addr[1] << 8;
+ v |= (unsigned long) addr[2] << 16;
+ v |= (unsigned long) addr[3] << 24;
+ return (bfd_vma) v;
+}
+
+bfd_vma bfd_getb32 (const bfd_byte *addr)
+{
+ unsigned long v;
+
+ v = (unsigned long) addr[0] << 24;
+ v |= (unsigned long) addr[1] << 16;
+ v |= (unsigned long) addr[2] << 8;
+ v |= (unsigned long) addr[3];
+ return (bfd_vma) v;
+}
+
+bfd_vma bfd_getl16 (const bfd_byte *addr)
+{
+ unsigned long v;
+
+ v = (unsigned long) addr[0];
+ v |= (unsigned long) addr[1] << 8;
+ return (bfd_vma) v;
+}
+
+bfd_vma bfd_getb16 (const bfd_byte *addr)
+{
+ unsigned long v;
+
+ v = (unsigned long) addr[0] << 24;
+ v |= (unsigned long) addr[1] << 16;
+ return (bfd_vma) v;
+}
+
+#ifdef TARGET_ARM
+static int
+print_insn_thumb1(bfd_vma pc, disassemble_info *info)
+{
+ return print_insn_arm(pc | 1, info);
+}
+#endif
+
+/* Disassemble this for me please... (debugging). 'flags' has the following
+ values:
+ i386 - nonzero means 16 bit code
+ arm - nonzero means thumb code
+ ppc - nonzero means little endian
+ other targets - unused
+ */
+void target_disas(FILE *out, target_ulong code, target_ulong size, int flags)
+{
+ target_ulong pc;
+ int count;
+ struct disassemble_info disasm_info;
+ int (*print_insn)(bfd_vma pc, disassemble_info *info);
+
+ INIT_DISASSEMBLE_INFO(disasm_info, out, fprintf);
+
+ disasm_info.read_memory_func = target_read_memory;
+ disasm_info.buffer_vma = code;
+ disasm_info.buffer_length = size;
+
+#ifdef TARGET_WORDS_BIGENDIAN
+ disasm_info.endian = BFD_ENDIAN_BIG;
+#else
+ disasm_info.endian = BFD_ENDIAN_LITTLE;
+#endif
+#if defined(TARGET_I386)
+ if (flags == 2)
+ disasm_info.mach = bfd_mach_x86_64;
+ else if (flags == 1)
+ disasm_info.mach = bfd_mach_i386_i8086;
+ else
+ disasm_info.mach = bfd_mach_i386_i386;
+ print_insn = print_insn_i386;
+#elif defined(TARGET_ARM)
+ if (flags)
+ print_insn = print_insn_thumb1;
+ else
+ print_insn = print_insn_arm;
+#elif defined(TARGET_SPARC)
+ print_insn = print_insn_sparc;
+#ifdef TARGET_SPARC64
+ disasm_info.mach = bfd_mach_sparc_v9b;
+#endif
+#elif defined(TARGET_PPC)
+ if (flags >> 16)
+ disasm_info.endian = BFD_ENDIAN_LITTLE;
+ if (flags & 0xFFFF) {
+ /* If we have a precise definitions of the instructions set, use it */
+ disasm_info.mach = flags & 0xFFFF;
+ } else {
+#ifdef TARGET_PPC64
+ disasm_info.mach = bfd_mach_ppc64;
+#else
+ disasm_info.mach = bfd_mach_ppc;
+#endif
+ }
+ print_insn = print_insn_ppc;
+#elif defined(TARGET_M68K)
+ print_insn = print_insn_m68k;
+#elif defined(TARGET_MIPS)
+#ifdef TARGET_WORDS_BIGENDIAN
+ print_insn = print_insn_big_mips;
+#else
+ print_insn = print_insn_little_mips;
+#endif
+#elif defined(TARGET_SH4)
+ disasm_info.mach = bfd_mach_sh4;
+ print_insn = print_insn_sh;
+#elif defined(TARGET_ALPHA)
+ disasm_info.mach = bfd_mach_alpha_ev6;
+ print_insn = print_insn_alpha;
+#elif defined(TARGET_CRIS)
+ if (flags != 32) {
+ disasm_info.mach = bfd_mach_cris_v0_v10;
+ print_insn = print_insn_crisv10;
+ } else {
+ disasm_info.mach = bfd_mach_cris_v32;
+ print_insn = print_insn_crisv32;
+ }
+#elif defined(TARGET_S390X)
+ disasm_info.mach = bfd_mach_s390_64;
+ print_insn = print_insn_s390;
+#elif defined(TARGET_MICROBLAZE)
+ disasm_info.mach = bfd_arch_microblaze;
+ print_insn = print_insn_microblaze;
+#else
+ fprintf(out, "0x" TARGET_FMT_lx
+ ": Asm output not supported on this arch\n", code);
+ return;
+#endif
+
+ for (pc = code; size > 0; pc += count, size -= count) {
+ fprintf(out, "0x" TARGET_FMT_lx ": ", pc);
+ count = print_insn(pc, &disasm_info);
+#if 0
+ {
+ int i;
+ uint8_t b;
+ fprintf(out, " {");
+ for(i = 0; i < count; i++) {
+ target_read_memory(pc + i, &b, 1, &disasm_info);
+ fprintf(out, " %02x", b);
+ }
+ fprintf(out, " }");
+ }
+#endif
+ fprintf(out, "\n");
+ if (count < 0)
+ break;
+ if (size < count) {
+ fprintf(out,
+ "Disassembler disagrees with translator over instruction "
+ "decoding\n"
+ "Please report this to qemu-devel(a)nongnu.org\n");
+ break;
+ }
+ }
+}
+
+/* Disassemble this for me please... (debugging). */
+void disas(FILE *out, void *code, unsigned long size)
+{
+ unsigned long pc;
+ int count;
+ struct disassemble_info disasm_info;
+ int (*print_insn)(bfd_vma pc, disassemble_info *info);
+
+ INIT_DISASSEMBLE_INFO(disasm_info, out, fprintf);
+
+ disasm_info.buffer = code;
+ disasm_info.buffer_vma = (unsigned long)code;
+ disasm_info.buffer_length = size;
+
+#ifdef HOST_WORDS_BIGENDIAN
+ disasm_info.endian = BFD_ENDIAN_BIG;
+#else
+ disasm_info.endian = BFD_ENDIAN_LITTLE;
+#endif
+#if defined(__i386__)
+ disasm_info.mach = bfd_mach_i386_i386;
+ print_insn = print_insn_i386;
+#elif defined(__x86_64__)
+ disasm_info.mach = bfd_mach_x86_64;
+ print_insn = print_insn_i386;
+#elif defined(_ARCH_PPC)
+ print_insn = print_insn_ppc;
+#elif defined(__alpha__)
+ print_insn = print_insn_alpha;
+#elif defined(__sparc__)
+ print_insn = print_insn_sparc;
+#if defined(__sparc_v8plus__) || defined(__sparc_v8plusa__) || defined(__sparc_v9__)
+ disasm_info.mach = bfd_mach_sparc_v9b;
+#endif
+#elif defined(__arm__)
+ print_insn = print_insn_arm;
+#elif defined(__MIPSEB__)
+ print_insn = print_insn_big_mips;
+#elif defined(__MIPSEL__)
+ print_insn = print_insn_little_mips;
+#elif defined(__m68k__)
+ print_insn = print_insn_m68k;
+#elif defined(__s390__)
+ print_insn = print_insn_s390;
+#elif defined(__hppa__)
+ print_insn = print_insn_hppa;
+#elif defined(__ia64__)
+ print_insn = print_insn_ia64;
+#else
+ fprintf(out, "0x%lx: Asm output not supported on this arch\n",
+ (long) code);
+ return;
+#endif
+ for (pc = (unsigned long)code; size > 0; pc += count, size -= count) {
+ fprintf(out, "0x%08lx: ", pc);
+ count = print_insn(pc, &disasm_info);
+ fprintf(out, "\n");
+ if (count < 0)
+ break;
+ }
+}
+
+/* Look up symbol for debugging purpose. Returns "" if unknown. */
+const char *lookup_symbol(target_ulong orig_addr)
+{
+ const char *symbol = "";
+ struct syminfo *s;
+
+ for (s = syminfos; s; s = s->next) {
+ symbol = s->lookup_symbol(s, orig_addr);
+ if (symbol[0] != '\0') {
+ break;
+ }
+ }
+
+ return symbol;
+}
+
+#if !defined(CONFIG_USER_ONLY)
+
+#include "monitor.h"
+
+static int monitor_disas_is_physical;
+static CPUState *monitor_disas_env;
+
+static int
+monitor_read_memory (bfd_vma memaddr, bfd_byte *myaddr, int length,
+ struct disassemble_info *info)
+{
+ if (monitor_disas_is_physical) {
+ cpu_physical_memory_read(memaddr, myaddr, length);
+ } else {
+ cpu_memory_rw_debug(monitor_disas_env, memaddr,myaddr, length, 0);
+ }
+ return 0;
+}
+
+static int GCC_FMT_ATTR(2, 3)
+monitor_fprintf(FILE *stream, const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ monitor_vprintf((Monitor *)stream, fmt, ap);
+ va_end(ap);
+ return 0;
+}
+
+void monitor_disas(Monitor *mon, CPUState *env,
+ target_ulong pc, int nb_insn, int is_physical, int flags)
+{
+ int count, i;
+ struct disassemble_info disasm_info;
+ int (*print_insn)(bfd_vma pc, disassemble_info *info);
+
+ INIT_DISASSEMBLE_INFO(disasm_info, (FILE *)mon, monitor_fprintf);
+
+ monitor_disas_env = env;
+ monitor_disas_is_physical = is_physical;
+ disasm_info.read_memory_func = monitor_read_memory;
+
+ disasm_info.buffer_vma = pc;
+
+#ifdef TARGET_WORDS_BIGENDIAN
+ disasm_info.endian = BFD_ENDIAN_BIG;
+#else
+ disasm_info.endian = BFD_ENDIAN_LITTLE;
+#endif
+#if defined(TARGET_I386)
+ if (flags == 2)
+ disasm_info.mach = bfd_mach_x86_64;
+ else if (flags == 1)
+ disasm_info.mach = bfd_mach_i386_i8086;
+ else
+ disasm_info.mach = bfd_mach_i386_i386;
+ print_insn = print_insn_i386;
+#elif defined(TARGET_ARM)
+ print_insn = print_insn_arm;
+#elif defined(TARGET_ALPHA)
+ print_insn = print_insn_alpha;
+#elif defined(TARGET_SPARC)
+ print_insn = print_insn_sparc;
+#ifdef TARGET_SPARC64
+ disasm_info.mach = bfd_mach_sparc_v9b;
+#endif
+#elif defined(TARGET_PPC)
+#ifdef TARGET_PPC64
+ disasm_info.mach = bfd_mach_ppc64;
+#else
+ disasm_info.mach = bfd_mach_ppc;
+#endif
+ print_insn = print_insn_ppc;
+#elif defined(TARGET_M68K)
+ print_insn = print_insn_m68k;
+#elif defined(TARGET_MIPS)
+#ifdef TARGET_WORDS_BIGENDIAN
+ print_insn = print_insn_big_mips;
+#else
+ print_insn = print_insn_little_mips;
+#endif
+#elif defined(TARGET_SH4)
+ disasm_info.mach = bfd_mach_sh4;
+ print_insn = print_insn_sh;
+#elif defined(TARGET_S390X)
+ disasm_info.mach = bfd_mach_s390_64;
+ print_insn = print_insn_s390;
+#else
+ monitor_printf(mon, "0x" TARGET_FMT_lx
+ ": Asm output not supported on this arch\n", pc);
+ return;
+#endif
+
+ for(i = 0; i < nb_insn; i++) {
+ monitor_printf(mon, "0x" TARGET_FMT_lx ": ", pc);
+ count = print_insn(pc, &disasm_info);
+ monitor_printf(mon, "\n");
+ if (count < 0)
+ break;
+ pc += count;
+ }
+}
+#endif
diff --git a/qemu-0.15.x/disas.h b/qemu-0.15.x/disas.h
new file mode 100644
index 0000000..f9287f7
--- /dev/null
+++ b/qemu-0.15.x/disas.h
@@ -0,0 +1,42 @@
+#ifndef _QEMU_DISAS_H
+#define _QEMU_DISAS_H
+
+#include "qemu-common.h"
+
+#ifdef NEED_CPU_H
+/* Disassemble this for me please... (debugging). */
+void disas(FILE *out, void *code, unsigned long size);
+void target_disas(FILE *out, target_ulong code, target_ulong size, int flags);
+
+void monitor_disas(Monitor *mon, CPUState *env,
+ target_ulong pc, int nb_insn, int is_physical, int flags);
+
+/* Look up symbol for debugging purpose. Returns "" if unknown. */
+const char *lookup_symbol(target_ulong orig_addr);
+#endif
+
+struct syminfo;
+struct elf32_sym;
+struct elf64_sym;
+
+#if defined(CONFIG_USER_ONLY)
+typedef const char *(*lookup_symbol_t)(struct syminfo *s, target_ulong orig_addr);
+#else
+typedef const char *(*lookup_symbol_t)(struct syminfo *s, target_phys_addr_t orig_addr);
+#endif
+
+struct syminfo {
+ lookup_symbol_t lookup_symbol;
+ unsigned int disas_num_syms;
+ union {
+ struct elf32_sym *elf32;
+ struct elf64_sym *elf64;
+ } disas_symtab;
+ const char *disas_strtab;
+ struct syminfo *next;
+};
+
+/* Filled in by elfload.c. Simplistic, but will do for now. */
+extern struct syminfo *syminfos;
+
+#endif /* _QEMU_DISAS_H */
diff --git a/qemu-0.15.x/dma-helpers.c b/qemu-0.15.x/dma-helpers.c
new file mode 100644
index 0000000..ba7f897
--- /dev/null
+++ b/qemu-0.15.x/dma-helpers.c
@@ -0,0 +1,181 @@
+/*
+ * DMA helper functions
+ *
+ * Copyright (c) 2009 Red Hat
+ *
+ * This work is licensed under the terms of the GNU General Public License
+ * (GNU GPL), version 2 or later.
+ */
+
+#include "dma.h"
+#include "block_int.h"
+
+void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint)
+{
+ qsg->sg = qemu_malloc(alloc_hint * sizeof(ScatterGatherEntry));
+ qsg->nsg = 0;
+ qsg->nalloc = alloc_hint;
+ qsg->size = 0;
+}
+
+void qemu_sglist_add(QEMUSGList *qsg, target_phys_addr_t base,
+ target_phys_addr_t len)
+{
+ if (qsg->nsg == qsg->nalloc) {
+ qsg->nalloc = 2 * qsg->nalloc + 1;
+ qsg->sg = qemu_realloc(qsg->sg, qsg->nalloc * sizeof(ScatterGatherEntry));
+ }
+ qsg->sg[qsg->nsg].base = base;
+ qsg->sg[qsg->nsg].len = len;
+ qsg->size += len;
+ ++qsg->nsg;
+}
+
+void qemu_sglist_destroy(QEMUSGList *qsg)
+{
+ qemu_free(qsg->sg);
+}
+
+typedef struct {
+ BlockDriverAIOCB common;
+ BlockDriverState *bs;
+ BlockDriverAIOCB *acb;
+ QEMUSGList *sg;
+ uint64_t sector_num;
+ int is_write;
+ int sg_cur_index;
+ target_phys_addr_t sg_cur_byte;
+ QEMUIOVector iov;
+ QEMUBH *bh;
+ DMAIOFunc *io_func;
+} DMAAIOCB;
+
+static void dma_bdrv_cb(void *opaque, int ret);
+
+static void reschedule_dma(void *opaque)
+{
+ DMAAIOCB *dbs = (DMAAIOCB *)opaque;
+
+ qemu_bh_delete(dbs->bh);
+ dbs->bh = NULL;
+ dma_bdrv_cb(opaque, 0);
+}
+
+static void continue_after_map_failure(void *opaque)
+{
+ DMAAIOCB *dbs = (DMAAIOCB *)opaque;
+
+ dbs->bh = qemu_bh_new(reschedule_dma, dbs);
+ qemu_bh_schedule(dbs->bh);
+}
+
+static void dma_bdrv_unmap(DMAAIOCB *dbs)
+{
+ int i;
+
+ for (i = 0; i < dbs->iov.niov; ++i) {
+ cpu_physical_memory_unmap(dbs->iov.iov[i].iov_base,
+ dbs->iov.iov[i].iov_len, !dbs->is_write,
+ dbs->iov.iov[i].iov_len);
+ }
+}
+
+static void dma_bdrv_cb(void *opaque, int ret)
+{
+ DMAAIOCB *dbs = (DMAAIOCB *)opaque;
+ target_phys_addr_t cur_addr, cur_len;
+ void *mem;
+
+ dbs->acb = NULL;
+ dbs->sector_num += dbs->iov.size / 512;
+ dma_bdrv_unmap(dbs);
+ qemu_iovec_reset(&dbs->iov);
+
+ if (dbs->sg_cur_index == dbs->sg->nsg || ret < 0) {
+ dbs->common.cb(dbs->common.opaque, ret);
+ qemu_iovec_destroy(&dbs->iov);
+ qemu_aio_release(dbs);
+ return;
+ }
+
+ while (dbs->sg_cur_index < dbs->sg->nsg) {
+ cur_addr = dbs->sg->sg[dbs->sg_cur_index].base + dbs->sg_cur_byte;
+ cur_len = dbs->sg->sg[dbs->sg_cur_index].len - dbs->sg_cur_byte;
+ mem = cpu_physical_memory_map(cur_addr, &cur_len, !dbs->is_write);
+ if (!mem)
+ break;
+ qemu_iovec_add(&dbs->iov, mem, cur_len);
+ dbs->sg_cur_byte += cur_len;
+ if (dbs->sg_cur_byte == dbs->sg->sg[dbs->sg_cur_index].len) {
+ dbs->sg_cur_byte = 0;
+ ++dbs->sg_cur_index;
+ }
+ }
+
+ if (dbs->iov.size == 0) {
+ cpu_register_map_client(dbs, continue_after_map_failure);
+ return;
+ }
+
+ dbs->acb = dbs->io_func(dbs->bs, dbs->sector_num, &dbs->iov,
+ dbs->iov.size / 512, dma_bdrv_cb, dbs);
+ if (!dbs->acb) {
+ dma_bdrv_unmap(dbs);
+ qemu_iovec_destroy(&dbs->iov);
+ return;
+ }
+}
+
+static void dma_aio_cancel(BlockDriverAIOCB *acb)
+{
+ DMAAIOCB *dbs = container_of(acb, DMAAIOCB, common);
+
+ if (dbs->acb) {
+ bdrv_aio_cancel(dbs->acb);
+ }
+}
+
+static AIOPool dma_aio_pool = {
+ .aiocb_size = sizeof(DMAAIOCB),
+ .cancel = dma_aio_cancel,
+};
+
+BlockDriverAIOCB *dma_bdrv_io(
+ BlockDriverState *bs, QEMUSGList *sg, uint64_t sector_num,
+ DMAIOFunc *io_func, BlockDriverCompletionFunc *cb,
+ void *opaque, int is_write)
+{
+ DMAAIOCB *dbs = qemu_aio_get(&dma_aio_pool, bs, cb, opaque);
+
+ dbs->acb = NULL;
+ dbs->bs = bs;
+ dbs->sg = sg;
+ dbs->sector_num = sector_num;
+ dbs->sg_cur_index = 0;
+ dbs->sg_cur_byte = 0;
+ dbs->is_write = is_write;
+ dbs->io_func = io_func;
+ dbs->bh = NULL;
+ qemu_iovec_init(&dbs->iov, sg->nsg);
+ dma_bdrv_cb(dbs, 0);
+ if (!dbs->acb) {
+ qemu_aio_release(dbs);
+ return NULL;
+ }
+ return &dbs->common;
+}
+
+
+BlockDriverAIOCB *dma_bdrv_read(BlockDriverState *bs,
+ QEMUSGList *sg, uint64_t sector,
+ void (*cb)(void *opaque, int ret), void *opaque)
+{
+ return dma_bdrv_io(bs, sg, sector, bdrv_aio_readv, cb, opaque, 0);
+}
+
+BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs,
+ QEMUSGList *sg, uint64_t sector,
+ void (*cb)(void *opaque, int ret), void *opaque)
+{
+ return dma_bdrv_io(bs, sg, sector, bdrv_aio_writev, cb, opaque, 1);
+}
diff --git a/qemu-0.15.x/dma.h b/qemu-0.15.x/dma.h
new file mode 100644
index 0000000..3d8324b
--- /dev/null
+++ b/qemu-0.15.x/dma.h
@@ -0,0 +1,49 @@
+/*
+ * DMA helper functions
+ *
+ * Copyright (c) 2009 Red Hat
+ *
+ * This work is licensed under the terms of the GNU General Public License
+ * (GNU GPL), version 2 or later.
+ */
+
+#ifndef DMA_H
+#define DMA_H
+
+#include <stdio.h>
+//#include "cpu.h"
+#include "hw/hw.h"
+#include "block.h"
+
+typedef struct {
+ target_phys_addr_t base;
+ target_phys_addr_t len;
+} ScatterGatherEntry;
+
+typedef struct {
+ ScatterGatherEntry *sg;
+ int nsg;
+ int nalloc;
+ target_phys_addr_t size;
+} QEMUSGList;
+
+void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint);
+void qemu_sglist_add(QEMUSGList *qsg, target_phys_addr_t base,
+ target_phys_addr_t len);
+void qemu_sglist_destroy(QEMUSGList *qsg);
+
+typedef BlockDriverAIOCB *DMAIOFunc(BlockDriverState *bs, int64_t sector_num,
+ QEMUIOVector *iov, int nb_sectors,
+ BlockDriverCompletionFunc *cb, void *opaque);
+
+BlockDriverAIOCB *dma_bdrv_io(BlockDriverState *bs,
+ QEMUSGList *sg, uint64_t sector_num,
+ DMAIOFunc *io_func, BlockDriverCompletionFunc *cb,
+ void *opaque, int is_write);
+BlockDriverAIOCB *dma_bdrv_read(BlockDriverState *bs,
+ QEMUSGList *sg, uint64_t sector,
+ BlockDriverCompletionFunc *cb, void *opaque);
+BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs,
+ QEMUSGList *sg, uint64_t sector,
+ BlockDriverCompletionFunc *cb, void *opaque);
+#endif
diff --git a/qemu-0.15.x/docs/blkverify.txt b/qemu-0.15.x/docs/blkverify.txt
new file mode 100644
index 0000000..d556dc4
--- /dev/null
+++ b/qemu-0.15.x/docs/blkverify.txt
@@ -0,0 +1,69 @@
+= Block driver correctness testing with blkverify =
+
+== Introduction ==
+
+This document describes how to use the blkverify protocol to test that a block
+driver is operating correctly.
+
+It is difficult to test and debug block drivers against real guests. Often
+processes inside the guest will crash because corrupt sectors were read as part
+of the executable. Other times obscure errors are raised by a program inside
+the guest. These issues are extremely hard to trace back to bugs in the block
+driver.
+
+Blkverify solves this problem by catching data corruption inside QEMU the first
+time bad data is read and reporting the disk sector that is corrupted.
+
+== How it works ==
+
+The blkverify protocol has two child block devices, the "test" device and the
+"raw" device. Read/write operations are mirrored to both devices so their
+state should always be in sync.
+
+The "raw" device is a raw image, a flat file, that has identical starting
+contents to the "test" image. The idea is that the "raw" device will handle
+read/write operations correctly and not corrupt data. It can be used as a
+reference for comparison against the "test" device.
+
+After a mirrored read operation completes, blkverify will compare the data and
+raise an error if it is not identical. This makes it possible to catch the
+first instance where corrupt data is read.
+
+== Example ==
+
+Imagine raw.img has 0xcd repeated throughout its first sector:
+
+ $ ./qemu-io -c 'read -v 0 512' raw.img
+ 00000000: cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
+ 00000010: cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
+ [...]
+ 000001e0: cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
+ 000001f0: cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd ................
+ read 512/512 bytes at offset 0
+ 512.000000 bytes, 1 ops; 0.0000 sec (97.656 MiB/sec and 200000.0000 ops/sec)
+
+And test.img is corrupt, its first sector is zeroed when it shouldn't be:
+
+ $ ./qemu-io -c 'read -v 0 512' test.img
+ 00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+ 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+ [...]
+ 000001e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+ 000001f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+ read 512/512 bytes at offset 0
+ 512.000000 bytes, 1 ops; 0.0000 sec (81.380 MiB/sec and 166666.6667 ops/sec)
+
+This error is caught by blkverify:
+
+ $ ./qemu-io -c 'read 0 512' blkverify:a.img:b.img
+ blkverify: read sector_num=0 nb_sectors=4 contents mismatch in sector 0
+
+A more realistic scenario is verifying the installation of a guest OS:
+
+ $ ./qemu-img create raw.img 16G
+ $ ./qemu-img create -f qcow2 test.qcow2 16G
+ $ x86_64-softmmu/qemu-system-x86_64 -cdrom debian.iso \
+ -drive file=blkverify:raw.img:test.qcow2
+
+If the installation is aborted when blkverify detects corruption, use qemu-io
+to explore the contents of the disk image at the sector in question.
diff --git a/qemu-0.15.x/docs/bootindex.txt b/qemu-0.15.x/docs/bootindex.txt
new file mode 100644
index 0000000..16083b3
--- /dev/null
+++ b/qemu-0.15.x/docs/bootindex.txt
@@ -0,0 +1,43 @@
+= Bootindex propery =
+
+Block and net devices have bootindex property. This property is used to
+determine the order in which firmware will consider devices for booting
+the guest OS. If the bootindex property is not set for a device, it gets
+lowest boot priority. There is no particular order in which devices with
+unset bootindex property will be considered for booting, but they will
+still be bootable.
+
+== Example ==
+
+Lets assume we have QEMU machine with two NICs (virtio, e1000) and two
+disks (IDE, virtio):
+
+qemu -drive file=disk1.img,if=none,id=disk1
+ -device ide-drive,drive=disk1,bootindex=4
+ -drive file=disk2.img,if=none,id=disk2
+ -device virtio-blk-pci,drive=disk2,bootindex=3
+ -netdev type=user,id=net0 -device virtio-net-pci,netdev=net0,bootindex=2
+ -netdev type=user,id=net1 -device e1000,netdev=net1,bootindex=1
+
+Given the command above, firmware should try to boot from the e1000 NIC
+first. If this fails, it should try the virtio NIC next, if this fails
+too, it should try the virtio disk, and then the IDE disk.
+
+== Limitations ==
+
+1. Some firmware has limitations on which devices can be considered for
+booting. For instance, the PC BIOS boot specification allows only one
+disk to be bootable. If boot from disk fails for some reason, the BIOS
+won't retry booting from other disk. It still can try to boot from
+floppy or net, though.
+
+2. Sometimes, firmware cannot map the device path QEMU wants firmware to
+boot from to a boot method. It doesn't happen for devices the firmware
+can natively boot from, but if firmware relies on an option ROM for
+booting, and the same option ROM is used for booting from more then one
+device, the firmware may not be able to ask the option ROM to boot from
+a particular device reliably. For instance with PC BIOS, if a SCSI HBA
+has three bootable devices target1, target3, target5 connected to it,
+the option ROM will have a boot method for each of them, but it is not
+possible to map from boot method back to a specific target. This is a
+shortcoming of PC BIOS boot specification.
diff --git a/qemu-0.15.x/docs/ccid.txt b/qemu-0.15.x/docs/ccid.txt
new file mode 100644
index 0000000..b8e504a
--- /dev/null
+++ b/qemu-0.15.x/docs/ccid.txt
@@ -0,0 +1,135 @@
+Qemu CCID Device Documentation.
+
+Contents
+1. USB CCID device
+2. Building
+3. Using ccid-card-emulated with hardware
+4. Using ccid-card-emulated with certificates
+5. Using ccid-card-passthru with client side hardware
+6. Using ccid-card-passthru with client side certificates
+7. Passthrough protocol scenario
+8. libcacard
+
+1. USB CCID device
+
+The USB CCID device is a USB device implementing the CCID specification, which
+lets one connect smart card readers that implement the same spec. For more
+information see the specification:
+
+ Universal Serial Bus
+ Device Class: Smart Card
+ CCID
+ Specification for
+ Integrated Circuit(s) Cards Interface Devices
+ Revision 1.1
+ April 22rd, 2005
+
+Smartcard are used for authentication, single sign on, decryption in
+public/private schemes and digital signatures. A smartcard reader on the client
+cannot be used on a guest with simple usb passthrough since it will then not be
+available on the client, possibly locking the computer when it is "removed". On
+the other hand this device can let you use the smartcard on both the client and
+the guest machine. It is also possible to have a completely virtual smart card
+reader and smart card (i.e. not backed by a physical device) using this device.
+
+2. Building
+
+The cryptographic functions and access to the physical card is done via NSS.
+
+Installing NSS:
+
+In redhat/fedora:
+ yum install nss-devel
+In ubuntu/debian:
+ apt-get install libnss3-dev
+ (not tested on ubuntu)
+
+Configuring and building:
+ ./configure --enable-smartcard && make
+
+3. Using ccid-card-emulated with hardware
+
+Assuming you have a working smartcard on the host with the current
+user, using NSS, qemu acts as another NSS client using ccid-card-emulated:
+
+ qemu -usb -device usb-ccid -device ccid-card-emualated
+
+4. Using ccid-card-emulated with certificates
+
+You must create the certificates. This is a one time process. We use NSS
+certificates:
+
+ certutil -d /etc/pki/nssdb -x -t "CT,CT,CT" -S -s "CN=cert1" -n cert1
+
+Note: you must have exactly three certificates.
+
+Assuming the current user can access the certificates (use certutil -L to
+verify), you can use the emulated card type with the certificates backend:
+
+ qemu -usb -device usb-ccid -device ccid-card-emulated,backend=certificates,cert1=cert1,cert2=cert2,cert3=cert3
+
+5. Using ccid-card-passthru with client side hardware
+
+on the host specify the ccid-card-passthru device with a suitable chardev:
+
+ qemu -chardev socket,server,host=0.0.0.0,port=2001,id=ccid,nowait -usb -device usb-ccid -device ccid-card-passthru,chardev=ccid
+
+on the client run vscclient, built when you built the libcacard library:
+ libcacard/vscclient <qemu-host> 2001
+
+6. Using ccid-card-passthru with client side certificates
+
+Run qemu as per #5, and run vscclient as follows:
+(Note: vscclient command line interface is in a state of change)
+
+ libcacard/vscclient -e "db=\"/etc/pki/nssdb\" use_hw=no soft=(,Test,CAC,,cert1,cert2,cert3)" <qemu-host> 2001
+
+7. Passthrough protocol scenario
+
+This is a typical interchange of messages when using the passthru card device.
+usb-ccid is a usb device. It defaults to an unattached usb device on startup.
+usb-ccid expects a chardev and expects the protocol defined in
+cac_card/vscard_common.h to be passed over that.
+The usb-ccid device can be in one of three modes:
+ * detached
+ * attached with no card
+ * attached with card
+
+A typical interchange is: (the arrow shows who started each exchange, it can be client
+originated or guest originated)
+
+client event | vscclient | passthru | usb-ccid | guest event
+----------------------------------------------------------------------------------------------
+ | VSC_Init | | |
+ | VSC_ReaderAdd | | attach |
+ | | | | sees new usb device.
+card inserted -> | | | |
+ | VSC_ATR | insert | insert | see new card
+ | | | |
+ | VSC_APDU | VSC_APDU | | <- guest sends APDU
+client<->physical | | | |
+card APDU exchange| | | |
+client response ->| VSC_APDU | VSC_APDU | | receive APDU response
+ ...
+ [APDU<->APDU repeats several times]
+ ...
+card removed -> | | | |
+ | VSC_CardRemove | remove | remove | card removed
+ ...
+ [(card insert, apdu's, card remove) repeat]
+ ...
+kill/quit | | | |
+ vscclient | | | |
+ | VSC_ReaderRemove | | detach |
+ | | | | usb device removed.
+
+
+8. libcacard
+
+ccid-card-passthru and vscclient use libcacard as the card emulator.
+libcacard implements a completely virtual CAC (DoD standard for smart cards)
+compliant card and uses NSS to actually retrive certificates and do any
+encryption using the backend (real reader + card or file backed certificates).
+
+For documentation of cac_card see README in libcacard subdirectory.
+
diff --git a/qemu-0.15.x/docs/ich9-ehci-uhci.cfg b/qemu-0.15.x/docs/ich9-ehci-uhci.cfg
new file mode 100644
index 0000000..a0e9b96
--- /dev/null
+++ b/qemu-0.15.x/docs/ich9-ehci-uhci.cfg
@@ -0,0 +1,37 @@
+###########################################################################
+#
+# You can pass this file directly to qemu using the -readconfig
+# command line switch.
+#
+# This config file creates a EHCI adapter with companion UHCI
+# controllers as multifunction device in PCI slot "1d".
+#
+# Specify "bus=ehci.0" when creating usb devices to hook them up
+# there.
+#
+
+[device "ehci"]
+ driver = "ich9-usb-ehci1"
+ addr = "1d.7"
+ multifunction = "on"
+
+[device "uhci-1"]
+ driver = "ich9-usb-uhci1"
+ addr = "1d.0"
+ multifunction = "on"
+ masterbus = "ehci.0"
+ firstport = "0"
+
+[device "uhci-2"]
+ driver = "ich9-usb-uhci2"
+ addr = "1d.1"
+ multifunction = "on"
+ masterbus = "ehci.0"
+ firstport = "2"
+
+[device "uhci-3"]
+ driver = "ich9-usb-uhci3"
+ addr = "1d.2"
+ multifunction = "on"
+ masterbus = "ehci.0"
+ firstport = "4"
diff --git a/qemu-0.15.x/docs/libcacard.txt b/qemu-0.15.x/docs/libcacard.txt
new file mode 100644
index 0000000..5dee6fa
--- /dev/null
+++ b/qemu-0.15.x/docs/libcacard.txt
@@ -0,0 +1,483 @@
+This file documents the CAC (Common Access Card) library in the libcacard
+subdirectory.
+
+Virtual Smart Card Emulator
+
+This emulator is designed to provide emulation of actual smart cards to a
+virtual card reader running in a guest virtual machine. The emulated smart
+cards can be representations of real smart cards, where the necessary functions
+such as signing, card removal/insertion, etc. are mapped to real, physical
+cards which are shared with the client machine the emulator is running on, or
+the cards could be pure software constructs.
+
+The emulator is structured to allow multiple replacable or additional pieces,
+so it can be easily modified for future requirements. The primary envisioned
+modifications are:
+
+1) The socket connection to the virtual card reader (presumably a CCID reader,
+but other ISO-7816 compatible readers could be used). The code that handles
+this is in vscclient.c.
+
+2) The virtual card low level emulation. This is currently supplied by using
+NSS. This emulation could be replaced by implementations based on other
+security libraries, including but not limitted to openssl+pkcs#11 library,
+raw pkcs#11, Microsoft CAPI, direct opensc calls, etc. The code that handles
+this is in vcard_emul_nss.c.
+
+3) Emulation for new types of cards. The current implementation emulates the
+original DoD CAC standard with separate pki containers. This emulator lives in
+cac.c. More than one card type emulator could be included. Other cards could
+be emulated as well, including PIV, newer versions of CAC, PKCS #15, etc.
+
+--------------------
+Replacing the Socket Based Virtual Reader Interface.
+
+The current implementation contains a replacable module vscclient.c. The
+current vscclient.c implements a sockets interface to the virtual ccid reader
+on the guest. CCID commands that are pertinent to emulation are passed
+across the socket, and their responses are passed back along that same socket.
+The protocol that vscclient uses is defined in vscard_common.h and connects
+to a qemu ccid usb device. Since this socket runs as a client, vscclient.c
+implements a program with a main entry. It also handles argument parsing for
+the emulator.
+
+An application that wants to use the virtual reader can replace vscclient.c
+with it's own implementation that connects to it's own CCID reader. The calls
+that the CCID reader can call are:
+
+ VReaderList * vreader_get_reader_list();
+
+ This function returns a list of virtual readers. These readers may map to
+ physical devices, or simulated devices depending on vcard the back end. Each
+ reader in the list should represent a reader to the virtual machine. Virtual
+ USB address mapping is left to the CCID reader front end. This call can be
+ made any time to get an updated list. The returned list is a copy of the
+ internal list that can be referenced by the caller without locking. This copy
+ must be freed by the caller with vreader_list_delete when it is no longer
+ needed.
+
+ VReaderListEntry *vreader_list_get_first(VReaderList *);
+
+ This function gets the first entry on the reader list. Along with
+ vreader_list_get_next(), vreader_list_get_first() can be used to walk the
+ reader list returned from vreader_get_reader_list(). VReaderListEntries are
+ part of the list themselves and do not need to be freed separately from the
+ list. If there are no entries on the list, it will return NULL.
+
+ VReaderListEntry *vreader_list_get_next(VReaderListEntry *);
+
+ This function gets the next entry in the list. If there are no more entries
+ it will return NULL.
+
+ VReader * vreader_list_get_reader(VReaderListEntry *)
+
+ This function returns the reader stored in the reader List entry. Caller gets
+ a new reference to a reader. The caller must free it's reference when it is
+ finished with vreader_free().
+
+ void vreader_free(VReader *reader);
+
+ This function frees a reference to a reader. Reader's are reference counted
+ and are automatically deleted when the last reference is freed.
+
+ void vreader_list_delete(VReaderList *list);
+
+ This function frees the list, all the elements on the list, and all the
+ reader references held by the list.
+
+ VReaderStatus vreader_power_on(VReader *reader, char *atr, int *len);
+
+ This functions simulates a card power on. Virtual cards do not care about
+ the actual voltage and other physical parameters, but it does care that the
+ card is actually on or off. Cycling the card causes the card to reset. If
+ the caller provides enough space, vreader_power_on will return the ATR of
+ the virtual card. The amount of space provided in atr should be indicated
+ in *len. The function modifies *len to be the actual length of of the
+ returned ATR.
+
+ VReaderStatus vreader_power_off(VReader *reader);
+
+ This function simulates a power off of a virtual card.
+
+ VReaderStatus vreader_xfer_bytes(VReader *reader, unsigne char *send_buf,
+ int send_buf_len,
+ unsigned char *receive_buf,
+ int receive_buf_len);
+
+ This functions send a raw apdu to a card and returns the card's response.
+ The CCID front end should return the response back. Most of the emulation
+ is driven from these APDUs.
+
+ VReaderStatus vreader_card_is_present(VReader *reader);
+
+ This function returns whether or not the reader has a card inserted. The
+ vreader_power_on, vreader_power_off, and vreader_xfer_bytes will return
+ VREADER_NO_CARD.
+
+ const char *vreader_get_name(VReader *reader);
+
+ This function returns the name of the reader. The name comes from the card
+ emulator level and is usually related to the name of the physical reader.
+
+ VReaderID vreader_get_id(VReader *reader);
+
+ This function returns the id of a reader. All readers start out with an id
+ of -1. The application can set the id with vreader_set_id.
+
+ VReaderStatus vreader_get_id(VReader *reader, VReaderID id);
+
+ This function sets the reader id. The application is responsible for making
+ sure that the id is unique for all readers it is actively using.
+
+ VReader *vreader_find_reader_by_id(VReaderID id);
+
+ This function returns the reader which matches the id. If two readers match,
+ only one is returned. The function returns NULL if the id is -1.
+
+ Event *vevent_wait_next_vevent();
+
+ This function blocks waiting for reader and card insertion events. There
+ will be one event for each card insertion, each card removal, each reader
+ insertion and each reader removal. At start up, events are created for all
+ the initial readers found, as well as all the cards that are inserted.
+
+ Event *vevent_get_next_vevent();
+
+ This function returns a pending event if it exists, otherwise it returns
+ NULL. It does not block.
+
+----------------
+Card Type Emulator: Adding a New Virtual Card Type
+
+The ISO 7816 card spec describes 2 types of cards:
+ 1) File system cards, where the smartcard is managed by reading and writing
+data to files in a file system. There is currently only boiler plate
+implemented for file system cards.
+ 2) VM cards, where the card has loadable applets which perform the card
+functions. The current implementation supports VM cards.
+
+In the case of VM cards, the difference between various types of cards is
+really what applets have been installed in that card. This structure is
+mirrored in card type emulators. The 7816 emulator already handles the basic
+ISO 7186 commands. Card type emulators simply need to add the virtual applets
+which emulate the real card applets. Card type emulators have exactly one
+public entry point:
+
+ VCARDStatus xxx_card_init(VCard *card, const char *flags,
+ const unsigned char *cert[],
+ int cert_len[],
+ VCardKey *key[],
+ int cert_count);
+
+ The parameters for this are:
+ card - the virtual card structure which will prepresent this card.
+ flags - option flags that may be specific to this card type.
+ cert - array of binary certificates.
+ cert_len - array of lengths of each of the certificates specified in cert.
+ key - array of opaque key structures representing the private keys on
+ the card.
+ cert_count - number of entries in cert, cert_len, and key arrays.
+
+ Any cert, cert_len, or key with the same index are matching sets. That is
+ cert[0] is cert_len[0] long and has the corresponsing private key of key[0].
+
+The card type emulator is expected to own the VCardKeys, but it should copy
+any raw cert data it wants to save. It can create new applets and add them to
+the card using the following functions:
+
+ VCardApplet *vcard_new_applet(VCardProcessAPDU apdu_func,
+ VCardResetApplet reset_func,
+ const unsigned char *aid,
+ int aid_len);
+
+ This function creates a new applet. Applet structures store the following
+ information:
+ 1) the AID of the applet (set by aid and aid_len).
+ 2) a function to handle APDUs for this applet. (set by apdu_func, more on
+ this below).
+ 3) a function to reset the applet state when the applet is selected.
+ (set by reset_func, more on this below).
+ 3) applet private data, a data pointer used by the card type emulator to
+ store any data or state it needs to complete requests. (set by a
+ separate call).
+ 4) applet private data free, a function used to free the applet private
+ data when the applet itself is destroyed.
+ The created applet can be added to the card with vcard_add_applet below.
+
+ void vcard_set_applet_private(VCardApplet *applet,
+ VCardAppletPrivate *private,
+ VCardAppletPrivateFree private_free);
+ This function sets the private data and the corresponding free function.
+ VCardAppletPrivate is an opaque data structure to the rest of the emulator.
+ The card type emulator can define it any way it wants by defining
+ struct VCardAppletPrivateStruct {};. If there is already a private data
+ structure on the applet, the old one is freed before the new one is set up.
+ passing two NULL clear any existing private data.
+
+ VCardStatus vcard_add_applet(VCard *card, VCardApplet *applet);
+
+ Add an applet onto the list of applets attached to the card. Once an applet
+ has been added, it can be selected by it's aid, and then commands will be
+ routed to it VCardProcessAPDU function. This function adopts the applet the
+ passed int applet. Note: 2 applets with the same AID should not be added to
+ the same card. It's permissible to add more than one applet. Multiple applets
+ may have the same VCardPRocessAPDU entry point.
+
+The certs and keys should be attached to private data associated with one or
+more appropriate applets for that card. Control will come to the card type
+emulators once one of its applets are selected through the VCardProcessAPDU
+function it specified when it created the applet.
+
+The signature of VCardResetApplet is:
+ VCardStatus (*VCardResetApplet) (VCard *card, int channel);
+ This function will reset the any internal applet state that needs to be
+ cleared after a select applet call. It should return VCARD_DONE;
+
+The signature of VCardProcessAPDU is:
+ VCardStatus (*VCardProcessAPDU)(VCard *card, VCardAPDU *apdu,
+ VCardResponse **response);
+ This function examines the APDU and determines whether it should process
+ the apdu directly, reject the apdu as invalid, or pass the apdu on to
+ the basic 7816 emulator for processing.
+ If the 7816 emulator should process the apdu, then the VCardProcessAPDU
+ should return VCARD_NEXT.
+ If there is an error, then VCardProcessAPDU should return an error
+ response using vcard_make_response and the appropriate 7816 error code
+ (see card_7816t.h) or vcard_make_response with a card type specific error
+ code. It should then return VCARD_DONE.
+ If the apdu can be processed correctly, VCardProcessAPDU should do so,
+ set the response value appropriately for that APDU, and return VCARD_DONE.
+ VCardProcessAPDU should always set the response if it returns VCARD_DONE.
+ It should always either return VCARD_DONE or VCARD_NEXT.
+
+Parsing the APDU --
+
+Prior to processing calling the card type emulator's VCardProcessAPDU function, the emulator has already decoded the APDU header and set several fields:
+
+ apdu->a_data - The raw apdu data bytes.
+ apdu->a_len - The len of the raw apdu data.
+ apdu->a_body - The start of any post header parameter data.
+ apdu->a_Lc - The parameter length value.
+ apdu->a_Le - The expected length of any returned data.
+ apdu->a_cla - The raw apdu class.
+ apdu->a_channel - The channel (decoded from the class).
+ apdu->a_secure_messaging_type - The decoded secure messagin type
+ (from class).
+ apdu->a_type - The decode class type.
+ apdu->a_gen_type - the generic class type (7816, PROPRIETARY, RFU, PTS).
+ apdu->a_ins - The instruction byte.
+ apdu->a_p1 - Parameter 1.
+ apdu->a_p2 - Parameter 2.
+
+Creating a Response --
+
+The expected result of any APDU call is a response. The card type emulator must
+set *response with an appropriate VCardResponse value if it returns VCARD_DONE.
+Reponses could be as simple as returning a 2 byte status word response, to as
+complex as returning a block of data along with a 2 byte response. Which is
+returned will depend on the semantics of the APDU. The following functions will
+create card responses.
+
+ VCardResponse *vcard_make_response(VCard7816Status status);
+
+ This is the most basic function to get a response. This function will
+ return a response the consists soley one 2 byte status code. If that status
+ code is defined in card_7816t.h, then this function is guarrenteed to
+ return a response with that status. If a cart type specific status code
+ is passed and vcard_make_response fails to allocate the appropriate memory
+ for that response, then vcard_make_response will return a VCardResponse
+ of VCARD7816_STATUS_EXC_ERROR_MEMORY. In any case, this function is
+ guarrenteed to return a valid VCardResponse.
+
+ VCardResponse *vcard_response_new(unsigned char *buf, int len,
+ VCard7816Status status);
+
+ This function is similar to vcard_make_response except it includes some
+ returned data with the response. It could also fail to allocate enough
+ memory, in which case it will return NULL.
+
+ VCardResponse *vcard_response_new_status_bytes(unsigned char sw1,
+ unsigned char sw2);
+
+ Sometimes in 7816 the response bytes are treated as two separate bytes with
+ split meanings. This function allows you to create a response based on
+ two separate bytes. This function could fail, in which case it will return
+ NULL.
+
+ VCardResponse *vcard_response_new_bytes(unsigned char *buf, int len,
+ unsigned char sw1,
+ unsigned char sw2);
+
+ This function is the same as vcard_response_new except you may specify
+ the status as two separate bytes like vcard_response_new_status_bytes.
+
+
+Implementing functionality ---
+
+The following helper functions access information about the current card
+and applet.
+
+ VCARDAppletPrivate *vcard_get_current_applet_private(VCard *card,
+ int channel);
+
+ This function returns any private data set by the card type emulator on
+ the currently selected applet. The card type emulator keeps track of the
+ current applet state in this data structure. Any certs and keys associated
+ with a particular applet is also stored here.
+
+ int vcard_emul_get_login_count(VCard *card);
+
+ This function returns the the number of remaing login attempts for this
+ card. If the card emulator does not know, or the card does not have a
+ way of giving this information, this function returns -1.
+
+
+ VCard7816Status vcard_emul_login(VCard *card, unsigned char *pin,
+ int pin_len);
+
+ This function logins into the card and return the standard 7816 status
+ word depending on the success or failure of the call.
+
+ void vcard_emul_delete_key(VCardKey *key);
+
+ This function frees the VCardKey passed in to xxxx_card_init. The card
+ type emulator is responsible for freeing this key when it no longer needs
+ it.
+
+ VCard7816Status vcard_emul_rsa_op(VCard *card, VCardKey *key,
+ unsigned char *buffer,
+ int buffer_size);
+
+ This function does a raw rsa op on the buffer with the given key.
+
+The sample card type emulator is found in cac.c. It implements the cac specific
+applets. Only those applets needed by the coolkey pkcs#11 driver on the guest
+have been implemented. To support the full range CAC middleware, a complete CAC
+card according to the CAC specs should be implemented here.
+
+------------------------------
+Virtual Card Emulator
+
+This code accesses both real smart cards and simulated smart cards through
+services provided on the client. The current implementation uses NSS, which
+already knows how to talk to various PKCS #11 modules on the client, and is
+portable to most operating systems. A particular emulator can have only one
+virtual card implementation at a time.
+
+The virtual card emulator consists of a series of virtual card services. In
+addition to the services describe above (services starting with
+vcard_emul_xxxx), the virtual card emulator also provides the following
+functions:
+
+ VCardEmulError vcard_emul_init(cont VCardEmulOptions *options);
+
+ The options structure is built by another function in the virtual card
+ interface where a string of virtual card emulator specific strings are
+ mapped to the options. The actual structure is defined by the virutal card
+ emulator and is used to determine the configuration of soft cards, or to
+ determine which physical cards to present to the guest.
+
+ The vcard_emul_init function will build up sets of readers, create any
+ threads that are needed to watch for changes in the reader state. If readers
+ have cards present in them, they are also initialized.
+
+ Readers are created with the function.
+
+ VReader *vreader_new(VReaderEmul *reader_emul,
+ VReaderEmulFree reader_emul_free);
+
+ The freeFunc is used to free the VReaderEmul * when the reader is
+ destroyed. The VReaderEmul structure is an opaque structure to the
+ rest of the code, but defined by the virtual card emulator, which can
+ use it to store any reader specific state.
+
+ Once the reader has been created, it can be added to the front end with the
+ call:
+
+ VReaderStatus vreader_add_reader(VReader *reader);
+
+ This function will automatically generate the appropriate new reader
+ events and add the reader to the list.
+
+ To create a new card, the virtual card emulator will call a similiar
+ function.
+
+ VCard *vcard_new(VCardEmul *card_emul,
+ VCardEmulFree card_emul_free);
+
+ Like vreader_new, this function takes a virtual card emulator specific
+ structure which it uses to keep track of the card state.
+
+ Once the card is created, it is attached to a card type emulator with the
+ following function:
+
+ VCardStatus vcard_init(VCard *vcard, VCardEmulType type,
+ const char *flags,
+ unsigned char *const *certs,
+ int *cert_len,
+ VCardKey *key[],
+ int cert_count);
+
+ The vcard is the value returned from vcard_new. The type is the
+ card type emulator that this card should presented to the guest as.
+ The flags are card type emulator specific options. The certs,
+ cert_len, and keys are all arrays of length cert_count. These are the
+ the same of the parameters xxxx_card_init() accepts.
+
+ Finally the card is associated with it's reader by the call:
+
+ VReaderStatus vreader_insert_card(VReader *vreader, VCard *vcard);
+
+ This function, like vreader_add_reader, will take care of any event
+ notification for the card insert.
+
+
+ VCardEmulError vcard_emul_force_card_remove(VReader *vreader);
+
+ Force a card that is present to appear to be removed to the guest, even if
+ that card is a physical card and is present.
+
+
+ VCardEmulError vcard_emul_force_card_insert(VReader *reader);
+
+ Force a card that has been removed by vcard_emul_force_card_remove to be
+ reinserted from the point of view of the guest. This will only work if the
+ card is physically present (which is always true fro a soft card).
+
+ void vcard_emul_get_atr(Vcard *card, unsigned char *atr, int *atr_len);
+
+ Return the virtual ATR for the card. By convention this should be the value
+ VCARD_ATR_PREFIX(size) followed by several ascii bytes related to this
+ particular emulator. For instance the NSS emulator returns
+ {VCARD_ATR_PREFIX(3), 'N', 'S', 'S' }. Do ot return more data then *atr_len;
+
+ void vcard_emul_reset(VCard *card, VCardPower power)
+
+ Set the state of 'card' to the current power level and reset its internal
+ state (logout, etc).
+
+-------------------------------------------------------
+List of files and their function:
+README - This file
+card_7816.c - emulate basic 7816 functionality. Parse APDUs.
+card_7816.h - apdu and response services definitions.
+card_7816t.h - 7816 specific structures, types and definitions.
+event.c - event handling code.
+event.h - event handling services definitions.
+eventt.h - event handling structures and types
+vcard.c - handle common virtual card services like creation, destruction, and
+ applet management.
+vcard.h - common virtual card services function definitions.
+vcardt.h - comon virtual card types
+vreader.c - common virtual reader services.
+vreader.h - common virtual reader services definitions.
+vreadert.h - comon virtual reader types.
+vcard_emul_type.c - manage the card type emulators.
+vcard_emul_type.h - definitions for card type emulators.
+cac.c - card type emulator for CAC cards
+vcard_emul.h - virtual card emulator service definitions.
+vcard_emul_nss.c - virtual card emulator implementation for nss.
+vscclient.c - socket connection to guest qemu usb driver.
+vscard_common.h - common header with the guest qemu usb driver.
+mutex.h - header file for machine independent mutexes.
+link_test.c - static test to make sure all the symbols are properly defined.
diff --git a/qemu-0.15.x/docs/migration.txt b/qemu-0.15.x/docs/migration.txt
new file mode 100644
index 0000000..4848c1e
--- /dev/null
+++ b/qemu-0.15.x/docs/migration.txt
@@ -0,0 +1,303 @@
+= Migration =
+
+QEMU has code to load/save the state of the guest that it is running.
+These are two complementary operations. Saving the state just does
+that, saves the state for each device that the guest is running.
+Restoring a guest is just the opposite operation: we need to load the
+state of each device.
+
+For this to work, QEMU has to be launched with the same arguments the
+two times. I.e. it can only restore the state in one guest that has
+the same devices that the one it was saved (this last requirement can
+be relaxed a bit, but for now we can consider that configuration has
+to be exactly the same).
+
+Once that we are able to save/restore a guest, a new functionality is
+requested: migration. This means that QEMU is able to start in one
+machine and being "migrated" to another machine. I.e. being moved to
+another machine.
+
+Next was the "live migration" functionality. This is important
+because some guests run with a lot of state (specially RAM), and it
+can take a while to move all state from one machine to another. Live
+migration allows the guest to continue running while the state is
+transferred. Only while the last part of the state is transferred has
+the guest to be stopped. Typically the time that the guest is
+unresponsive during live migration is the low hundred of milliseconds
+(notice that this depends on a lot of things).
+
+=== Types of migration ===
+
+Now that we have talked about live migration, there are several ways
+to do migration:
+
+- tcp migration: do the migration using tcp sockets
+- unix migration: do the migration using unix sockets
+- exec migration: do the migration using the stdin/stdout through a process.
+- fd migration: do the migration using an file descriptor that is
+ passed to QEMU. QEMU doesn't care how this file descriptor is opened.
+
+All these four migration protocols use the same infrastructure to
+save/restore state devices. This infrastructure is shared with the
+savevm/loadvm functionality.
+
+=== State Live Migration ==
+
+This is used for RAM and block devices. It is not yet ported to vmstate.
+<Fill more information here>
+
+=== What is the common infrastructure ===
+
+QEMU uses a QEMUFile abstraction to be able to do migration. Any type
+of migration that wants to use QEMU infrastructure has to create a
+QEMUFile with:
+
+QEMUFile *qemu_fopen_ops(void *opaque,
+ QEMUFilePutBufferFunc *put_buffer,
+ QEMUFileGetBufferFunc *get_buffer,
+ QEMUFileCloseFunc *close,
+ QEMUFileRateLimit *rate_limit,
+ QEMUFileSetRateLimit *set_rate_limit,
+ QEMUFileGetRateLimit *get_rate_limit);
+
+The functions have the following functionality:
+
+This function writes a chunk of data to a file at the given position.
+The pos argument can be ignored if the file is only used for
+streaming. The handler should try to write all of the data it can.
+
+typedef int (QEMUFilePutBufferFunc)(void *opaque, const uint8_t *buf,
+ int64_t pos, int size);
+
+Read a chunk of data from a file at the given position. The pos argument
+can be ignored if the file is only be used for streaming. The number of
+bytes actually read should be returned.
+
+typedef int (QEMUFileGetBufferFunc)(void *opaque, uint8_t *buf,
+ int64_t pos, int size);
+
+Close a file and return an error code.
+
+typedef int (QEMUFileCloseFunc)(void *opaque);
+
+Called to determine if the file has exceeded its bandwidth allocation. The
+bandwidth capping is a soft limit, not a hard limit.
+
+typedef int (QEMUFileRateLimit)(void *opaque);
+
+Called to change the current bandwidth allocation. This function must return
+the new actual bandwidth. It should be new_rate if everything goes OK, and
+the old rate otherwise.
+
+typedef size_t (QEMUFileSetRateLimit)(void *opaque, size_t new_rate);
+typedef size_t (QEMUFileGetRateLimit)(void *opaque);
+
+You can use any internal state that you need using the opaque void *
+pointer that is passed to all functions.
+
+The rate limiting functions are used to limit the bandwidth used by
+QEMU migration.
+
+The important functions for us are put_buffer()/get_buffer() that
+allow to write/read a buffer into the QEMUFile.
+
+=== How to save the state of one device ==
+
+The state of a device is saved using intermediate buffers. There are
+some helper functions to assist this saving.
+
+There is a new concept that we have to explain here: device state
+version. When we migrate a device, we save/load the state as a series
+of fields. Some times, due to bugs or new functionality, we need to
+change the state to store more/different information. We use the
+version to identify each time that we do a change. Each version is
+associated with a series of fields saved. The save_state always saves
+the state as the newer version. But load_state sometimes is able to
+load state from an older version.
+
+ === Legacy way ===
+
+This way is going to disappear as soon as all current users are ported to VMSTATE.
+
+Each device has to register two functions, one to save the state and
+another to load the state back.
+
+int register_savevm(DeviceState *dev,
+ const char *idstr,
+ int instance_id,
+ int version_id,
+ SaveStateHandler *save_state,
+ LoadStateHandler *load_state,
+ void *opaque);
+
+typedef void SaveStateHandler(QEMUFile *f, void *opaque);
+typedef int LoadStateHandler(QEMUFile *f, void *opaque, int version_id);
+
+The important functions for the device state format are the save_state
+and load_state. Notice that load_state receives a version_id
+parameter to know what state format is receiving. save_state doesn't
+have a version_id parameter because it always uses the latest version.
+
+=== VMState ===
+
+The legacy way of saving/loading state of the device had the problem
+that we have to maintain two functions in sync. If we did one change
+in one of them and not in the other, we would get a failed migration.
+
+VMState changed the way that state is saved/loaded. Instead of using
+a function to save the state and another to load it, it was changed to
+a declarative way of what the state consisted of. Now VMState is able
+to interpret that definition to be able to load/save the state. As
+the state is declared only once, it can't go out of sync in the
+save/load functions.
+
+An example (from hw/pckbd.c)
+
+static const VMStateDescription vmstate_kbd = {
+ .name = "pckbd",
+ .version_id = 3,
+ .minimum_version_id = 3,
+ .minimum_version_id_old = 3,
+ .fields = (VMStateField []) {
+ VMSTATE_UINT8(write_cmd, KBDState),
+ VMSTATE_UINT8(status, KBDState),
+ VMSTATE_UINT8(mode, KBDState),
+ VMSTATE_UINT8(pending, KBDState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
+We are declaring the state with name "pckbd".
+The version_id is 3, and the fields are 4 uint8_t in a KBDState structure.
+We registered this with:
+
+ vmstate_register(NULL, 0, &vmstate_kbd, s);
+
+Note: talk about how vmstate <-> qdev interact, and what the instance ids mean.
+
+You can search for VMSTATE_* macros for lots of types used in QEMU in
+hw/hw.h.
+
+=== More about versions ==
+
+You can see that there are several version fields:
+
+- version_id: the maximum version_id supported by VMState for that device.
+- minimum_version_id: the minimum version_id that VMState is able to understand
+ for that device.
+- minimum_version_id_old: For devices that were not able to port to vmstate, we can
+ assign a function that knows how to read this old state.
+
+So, VMState is able to read versions from minimum_version_id to
+version_id. And the function load_state_old() is able to load state
+from minimum_version_id_old to minimum_version_id. This function is
+deprecated and will be removed when no more users are left.
+
+=== Massaging functions ===
+
+Sometimes, it is not enough to be able to save the state directly
+from one structure, we need to fill the correct values there. One
+example is when we are using kvm. Before saving the cpu state, we
+need to ask kvm to copy to QEMU the state that it is using. And the
+opposite when we are loading the state, we need a way to tell kvm to
+load the state for the cpu that we have just loaded from the QEMUFile.
+
+The functions to do that are inside a vmstate definition, and are called:
+
+- int (*pre_load)(void *opaque);
+
+ This function is called before we load the state of one device.
+
+- int (*post_load)(void *opaque, int version_id);
+
+ This function is called after we load the state of one device.
+
+- void (*pre_save)(void *opaque);
+
+ This function is called before we save the state of one device.
+
+Example: You can look at hpet.c, that uses the three function to
+ massage the state that is transferred.
+
+=== Subsections ===
+
+The use of version_id allows to be able to migrate from older versions
+to newer versions of a device. But not the other way around. This
+makes very complicated to fix bugs in stable branches. If we need to
+add anything to the state to fix a bug, we have to disable migration
+to older versions that don't have that bug-fix (i.e. a new field).
+
+But sometimes, that bug-fix is only needed sometimes, not always. For
+instance, if the device is in the middle of a DMA operation, it is
+using a specific functionality, ....
+
+It is impossible to create a way to make migration from any version to
+any other version to work. But we can do better than only allowing
+migration from older versions no newer ones. For that fields that are
+only needed sometimes, we add the idea of subsections. A subsection
+is "like" a device vmstate, but with a particularity, it has a Boolean
+function that tells if that values are needed to be sent or not. If
+this functions returns false, the subsection is not sent.
+
+On the receiving side, if we found a subsection for a device that we
+don't understand, we just fail the migration. If we understand all
+the subsections, then we load the state with success.
+
+One important note is that the post_load() function is called "after"
+loading all subsections, because a newer subsection could change same
+value that it uses.
+
+Example:
+
+static bool ide_drive_pio_state_needed(void *opaque)
+{
+ IDEState *s = opaque;
+
+ return (s->status & DRQ_STAT) != 0;
+}
+
+const VMStateDescription vmstate_ide_drive_pio_state = {
+ .name = "ide_drive/pio_state",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .pre_save = ide_drive_pio_pre_save,
+ .post_load = ide_drive_pio_post_load,
+ .fields = (VMStateField []) {
+ VMSTATE_INT32(req_nb_sectors, IDEState),
+ VMSTATE_VARRAY_INT32(io_buffer, IDEState, io_buffer_total_len, 1,
+ vmstate_info_uint8, uint8_t),
+ VMSTATE_INT32(cur_io_buffer_offset, IDEState),
+ VMSTATE_INT32(cur_io_buffer_len, IDEState),
+ VMSTATE_UINT8(end_transfer_fn_idx, IDEState),
+ VMSTATE_INT32(elementary_transfer_size, IDEState),
+ VMSTATE_INT32(packet_transfer_size, IDEState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
+const VMStateDescription vmstate_ide_drive = {
+ .name = "ide_drive",
+ .version_id = 3,
+ .minimum_version_id = 0,
+ .minimum_version_id_old = 0,
+ .post_load = ide_drive_post_load,
+ .fields = (VMStateField []) {
+ .... several fields ....
+ VMSTATE_END_OF_LIST()
+ },
+ .subsections = (VMStateSubsection []) {
+ {
+ .vmsd = &vmstate_ide_drive_pio_state,
+ .needed = ide_drive_pio_state_needed,
+ }, {
+ /* empty */
+ }
+ }
+};
+
+Here we have a subsection for the pio state. We only need to
+save/send this state when we are in the middle of a pio operation
+(that is what ide_drive_pio_state_needed() checks). If DRQ_STAT is
+not enabled, the values on that fields are garbage and don't need to
+be sent.
diff --git a/qemu-0.15.x/docs/qapi-code-gen.txt b/qemu-0.15.x/docs/qapi-code-gen.txt
new file mode 100644
index 0000000..b7befb5
--- /dev/null
+++ b/qemu-0.15.x/docs/qapi-code-gen.txt
@@ -0,0 +1,316 @@
+= How to use the QAPI code generator =
+
+* Note: as of this writing, QMP does not use QAPI. Eventually QMP
+commands will be converted to use QAPI internally. The following
+information describes QMP/QAPI as it will exist after the
+conversion.
+
+QAPI is a native C API within QEMU which provides management-level
+functionality to internal/external users. For external
+users/processes, this interface is made available by a JSON-based
+QEMU Monitor protocol that is provided by the QMP server.
+
+To map QMP-defined interfaces to the native C QAPI implementations,
+a JSON-based schema is used to define types and function
+signatures, and a set of scripts is used to generate types/signatures,
+and marshaling/dispatch code. The QEMU Guest Agent also uses these
+scripts, paired with a seperate schema, to generate
+marshaling/dispatch code for the guest agent server running in the
+guest.
+
+This document will describe how the schemas, scripts, and resulting
+code is used.
+
+
+== QMP/Guest agent schema ==
+
+This file defines the types, commands, and events used by QMP. It should
+fully describe the interface used by QMP.
+
+This file is designed to be loosely based on JSON although it's technically
+executable Python. While dictionaries are used, they are parsed as
+OrderedDicts so that ordering is preserved.
+
+There are two basic syntaxes used, type definitions and command definitions.
+
+The first syntax defines a type and is represented by a dictionary. There are
+two kinds of types that are supported: complex user-defined types, and enums.
+
+A complex type is a dictionary containing a single key who's value is a
+dictionary. This corresponds to a struct in C or an Object in JSON. An
+example of a complex type is:
+
+ { 'type': 'MyType',
+ 'data' { 'member1': 'str', 'member2': 'int', '*member3': 'str } }
+
+The use of '*' as a prefix to the name means the member is optional. Optional
+members should always be added to the end of the dictionary to preserve
+backwards compatibility.
+
+An enumeration type is a dictionary containing a single key who's value is a
+list of strings. An example enumeration is:
+
+ { 'enum': 'MyEnum', 'data': [ 'value1', 'value2', 'value3' ] }
+
+Generally speaking, complex types and enums should always use CamelCase for
+the type names.
+
+Commands are defined by using a list containing three members. The first
+member is the command name, the second member is a dictionary containing
+arguments, and the third member is the return type.
+
+An example command is:
+
+ { 'command': 'my-command',
+ 'data': { 'arg1': 'str', '*arg2': 'str' },
+ 'returns': 'str' ]
+
+Command names should be all lower case with words separated by a hyphen.
+
+
+== Code generation ==
+
+Schemas are fed into 3 scripts to generate all the code/files that, paired
+with the core QAPI libraries, comprise everything required to take JSON
+commands read in by a QMP/guest agent server, unmarshal the arguments into
+the underlying C types, call into the corresponding C function, and map the
+response back to a QMP/guest agent response to be returned to the user.
+
+As an example, we'll use the following schema, which describes a single
+complex user-defined type (which will produce a C struct, along with a list
+node structure that can be used to chain together a list of such types in
+case we want to accept/return a list of this type with a command), and a
+command which takes that type as a parameter and returns the same type:
+
+ mdroth@illuin:~/w/qemu2.git$ cat example-schema.json
+ { 'type': 'UserDefOne',
+ 'data': { 'integer': 'int', 'string': 'str' } }
+
+ { 'command': 'my-command',
+ 'data': {'arg1': 'UserDefOne'},
+ 'returns': 'UserDefOne' }
+ mdroth@illuin:~/w/qemu2.git$
+
+=== scripts/qapi-types.py ===
+
+Used to generate the C types defined by a schema. The following files are
+created:
+
+$(prefix)qapi-types.h - C types corresponding to types defined in
+ the schema you pass in
+$(prefix)qapi-types.c - Cleanup functions for the above C types
+
+The $(prefix) is an optional parameter used as a namespace to keep the
+generated code from one schema/code-generation separated from others so code
+can be generated/used from multiple schemas without clobbering previously
+created code.
+
+Example:
+
+ mdroth@illuin:~/w/qemu2.git$ python scripts/qapi-types.py \
+ --output-dir="qapi-generated" --prefix="example-" < example-schema.json
+ mdroth@illuin:~/w/qemu2.git$ cat qapi-generated/example-qapi-types.c
+ /* AUTOMATICALLY GENERATED, DO NOT MODIFY */
+
+ #include "qapi/qapi-dealloc-visitor.h"
+ #include "example-qapi-types.h"
+ #include "example-qapi-visit.h"
+
+ void qapi_free_UserDefOne(UserDefOne * obj)
+ {
+ QapiDeallocVisitor *md;
+ Visitor *v;
+
+ if (!obj) {
+ return;
+ }
+
+ md = qapi_dealloc_visitor_new();
+ v = qapi_dealloc_get_visitor(md);
+ visit_type_UserDefOne(v, &obj, NULL, NULL);
+ qapi_dealloc_visitor_cleanup(md);
+ }
+
+ mdroth@illuin:~/w/qemu2.git$ cat qapi-generated/example-qapi-types.h
+ /* AUTOMATICALLY GENERATED, DO NOT MODIFY */
+ #ifndef QAPI_GENERATED_EXAMPLE_QAPI_TYPES
+ #define QAPI_GENERATED_EXAMPLE_QAPI_TYPES
+
+ #include "qapi/qapi-types-core.h"
+
+ typedef struct UserDefOne UserDefOne;
+
+ typedef struct UserDefOneList
+ {
+ UserDefOne *value;
+ struct UserDefOneList *next;
+ } UserDefOneList;
+
+ struct UserDefOne
+ {
+ int64_t integer;
+ char * string;
+ };
+
+ void qapi_free_UserDefOne(UserDefOne * obj);
+
+ #endif
+
+
+=== scripts/qapi-visit.py ===
+
+Used to generate the visitor functions used to walk through and convert
+a QObject (as provided by QMP) to a native C data structure and
+vice-versa, as well as the visitor function used to dealloc a complex
+schema-defined C type.
+
+The following files are generated:
+
+$(prefix)qapi-visit.c: visitor function for a particular C type, used
+ to automagically convert QObjects into the
+ corresponding C type and vice-versa, as well
+ as for deallocating memory for an existing C
+ type
+
+$(prefix)qapi-visit.h: declarations for previously mentioned visitor
+ functions
+
+Example:
+
+ mdroth@illuin:~/w/qemu2.git$ python scripts/qapi-visit.py \
+ --output-dir="qapi-generated" --prefix="example-" < example-schema.json
+ mdroth@illuin:~/w/qemu2.git$ cat qapi-generated/example-qapi-visit.c
+ /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
+
+ #include "example-qapi-visit.h"
+
+ void visit_type_UserDefOne(Visitor *m, UserDefOne ** obj, const char *name, Error **errp)
+ {
+ visit_start_struct(m, (void **)obj, "UserDefOne", name, sizeof(UserDefOne), errp);
+ visit_type_int(m, (obj && *obj) ? &(*obj)->integer : NULL, "integer", errp);
+ visit_type_str(m, (obj && *obj) ? &(*obj)->string : NULL, "string", errp);
+ visit_end_struct(m, errp);
+ }
+
+ void visit_type_UserDefOneList(Visitor *m, UserDefOneList ** obj, const char *name, Error **errp)
+ {
+ GenericList *i;
+
+ visit_start_list(m, name, errp);
+
+ for (i = visit_next_list(m, (GenericList **)obj, errp); i; i = visit_next_list(m, &i, errp)) {
+ UserDefOneList *native_i = (UserDefOneList *)i;
+ visit_type_UserDefOne(m, &native_i->value, NULL, errp);
+ }
+
+ visit_end_list(m, errp);
+ }
+ mdroth@illuin:~/w/qemu2.git$ cat qapi-generated/example-qapi-visit.h
+ /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
+
+ #ifndef QAPI_GENERATED_EXAMPLE_QAPI_VISIT
+ #define QAPI_GENERATED_EXAMPLE_QAPI_VISIT
+
+ #include "qapi/qapi-visit-core.h"
+ #include "example-qapi-types.h"
+
+ void visit_type_UserDefOne(Visitor *m, UserDefOne ** obj, const char *name, Error **errp);
+ void visit_type_UserDefOneList(Visitor *m, UserDefOneList ** obj, const char *name, Error **errp);
+
+ #endif
+ mdroth@illuin:~/w/qemu2.git$
+
+
+=== scripts/qapi-commands.py ===
+
+Used to generate the marshaling/dispatch functions for the commands defined
+in the schema. The following files are generated:
+
+$(prefix)qmp-marshal.c: command marshal/dispatch functions for each
+ QMP command defined in the schema. Functions
+ generated by qapi-visit.py are used to
+ convert QObjects recieved from the wire into
+ function parameters, and uses the same
+ visitor functions to convert native C return
+ values to QObjects from transmission back
+ over the wire.
+
+$(prefix)qmp-commands.h: Function prototypes for the QMP commands
+ specified in the schema.
+
+Example:
+
+ mdroth@illuin:~/w/qemu2.git$ cat qapi-generated/example-qmp-marshal.c
+ /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
+
+ #include "qemu-objects.h"
+ #include "qapi/qmp-core.h"
+ #include "qapi/qapi-visit-core.h"
+ #include "qapi/qmp-output-visitor.h"
+ #include "qapi/qmp-input-visitor.h"
+ #include "qapi/qapi-dealloc-visitor.h"
+ #include "example-qapi-types.h"
+ #include "example-qapi-visit.h"
+
+ #include "example-qmp-commands.h"
+ static void qmp_marshal_output_my_command(UserDefOne * ret_in, QObject **ret_out, Error **errp)
+ {
+ QapiDeallocVisitor *md = qapi_dealloc_visitor_new();
+ QmpOutputVisitor *mo = qmp_output_visitor_new();
+ Visitor *v;
+
+ v = qmp_output_get_visitor(mo);
+ visit_type_UserDefOne(v, &ret_in, "unused", errp);
+ v = qapi_dealloc_get_visitor(md);
+ visit_type_UserDefOne(v, &ret_in, "unused", errp);
+ qapi_dealloc_visitor_cleanup(md);
+
+
+ *ret_out = qmp_output_get_qobject(mo);
+ }
+
+ static void qmp_marshal_input_my_command(QmpState *qmp__sess, QDict *args, QObject **ret, Error **errp)
+ {
+ UserDefOne * retval = NULL;
+ QmpInputVisitor *mi;
+ QapiDeallocVisitor *md;
+ Visitor *v;
+ UserDefOne * arg1 = NULL;
+
+ mi = qmp_input_visitor_new(QOBJECT(args));
+ v = qmp_input_get_visitor(mi);
+ visit_type_UserDefOne(v, &arg1, "arg1", errp);
+
+ if (error_is_set(errp)) {
+ goto out;
+ }
+ retval = qmp_my_command(arg1, errp);
+ qmp_marshal_output_my_command(retval, ret, errp);
+
+ out:
+ md = qapi_dealloc_visitor_new();
+ v = qapi_dealloc_get_visitor(md);
+ visit_type_UserDefOne(v, &arg1, "arg1", errp);
+ qapi_dealloc_visitor_cleanup(md);
+ return;
+ }
+
+ static void qmp_init_marshal(void)
+ {
+ qmp_register_command("my-command", qmp_marshal_input_my_command);
+ }
+
+ qapi_init(qmp_init_marshal);
+ mdroth@illuin:~/w/qemu2.git$ cat qapi-generated/example-qmp-commands.h
+ /* THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY */
+
+ #ifndef QAPI_GENERATED_EXAMPLE_QMP_COMMANDS
+ #define QAPI_GENERATED_EXAMPLE_QMP_COMMANDS
+
+ #include "example-qapi-types.h"
+ #include "error.h"
+
+ UserDefOne * qmp_my_command(UserDefOne * arg1, Error **errp);
+
+ #endif
+ mdroth@illuin:~/w/qemu2.git$
diff --git a/qemu-0.15.x/docs/qdev-device-use.txt b/qemu-0.15.x/docs/qdev-device-use.txt
new file mode 100644
index 0000000..057c322
--- /dev/null
+++ b/qemu-0.15.x/docs/qdev-device-use.txt
@@ -0,0 +1,416 @@
+= How to convert to -device & friends =
+
+=== Specifying Bus and Address on Bus ===
+
+In qdev, each device has a parent bus. Some devices provide one or
+more buses for children. You can specify a device's parent bus with
+-device parameter bus.
+
+A device typically has a device address on its parent bus. For buses
+where this address can be configured, devices provide a bus-specific
+property. Examples:
+
+ bus property name value format
+ PCI addr %x.%x (dev.fn, .fn optional)
+ I2C address %u
+ SCSI scsi-id %u
+ IDE unit %u
+ HDA cad %u
+ virtio-serial-bus nr %u
+ ccid-bus slot %u
+ USB port %d(.%d)* (port.port...)
+
+Example: device i440FX-pcihost is on the root bus, and provides a PCI
+bus named pci.0. To put a FOO device into its slot 4, use -device
+FOO,bus=/i440FX-pcihost/pci.0,addr=4. The abbreviated form bus=pci.0
+also works as long as the bus name is unique.
+
+=== Block Devices ===
+
+A QEMU block device (drive) has a host and a guest part.
+
+In the general case, the guest device is connected to a controller
+device. For instance, the IDE controller provides two IDE buses, each
+of which can have up to two ide-drive devices, and each ide-drive
+device is a guest part, and is connected to a host part.
+
+Except we sometimes lump controller, bus(es) and drive device(s) all
+together into a single device. For instance, the ISA floppy
+controller is connected to up to two host drives.
+
+The old ways to define block devices define host and guest part
+together. Sometimes, they can even define a controller device in
+addition to the block device.
+
+The new way keeps the parts separate: you create the host part with
+-drive, and guest device(s) with -device.
+
+The various old ways to define drives all boil down to the common form
+
+ -drive if=TYPE,bus=BUS,unit=UNIT,OPTS...
+
+TYPE, BUS and UNIT identify the controller device, which of its buses
+to use, and the drive's address on that bus. Details depend on TYPE.
+
+Instead of bus=BUS,unit=UNIT, you can also say index=IDX.
+
+In the new way, this becomes something like
+
+ -drive if=none,id=DRIVE-ID,HOST-OPTS...
+ -device DEVNAME,drive=DRIVE-ID,DEV-OPTS...
+
+The old OPTS get split into HOST-OPTS and DEV-OPTS as follows:
+
+* file, format, snapshot, cache, aio, readonly, rerror, werror go into
+ HOST-OPTS.
+
+* cyls, head, secs and trans go into HOST-OPTS. Future work: they
+ should go into DEV-OPTS instead.
+
+* serial goes into DEV-OPTS, for devices supporting serial numbers.
+ For other devices, it goes nowhere.
+
+* media is special. In the old way, it selects disk vs. CD-ROM with
+ if=ide, if=scsi and if=xen. The new way uses DEVNAME for that.
+ Additionally, readonly=on goes into HOST-OPTS.
+
+* addr is special, see if=virtio below.
+
+The -device argument differs in detail for each type of drive:
+
+* if=ide
+
+ -device DEVNAME,drive=DRIVE-ID,bus=IDE-BUS,unit=UNIT
+
+ where DEVNAME is either ide-hd or ide-cd, IDE-BUS identifies an IDE
+ bus, normally either ide.0 or ide.1, and UNIT is either 0 or 1.
+
+* if=scsi
+
+ The old way implicitly creates SCSI controllers as needed. The new
+ way makes that explicit:
+
+ -device lsi53c895a,id=ID
+
+ As for all PCI devices, you can add bus=PCI-BUS,addr=DEVFN to
+ control the PCI device address.
+
+ This SCSI controller provides a single SCSI bus, named ID.0. Put a
+ disk on it:
+
+ -device DEVNAME,drive=DRIVE-ID,bus=ID.0,scsi-id=UNIT
+
+ where DEVNAME is either scsi-hd, scsi-cd or scsi-generic.
+
+* if=floppy
+
+ -global isa-fdc.driveA=DRIVE-ID
+ -global isa-fdc.driveB=DRIVE-ID
+
+ This is -global instead of -device, because the floppy controller is
+ created automatically, and we want to configure that one, not create
+ a second one (which isn't possible anyway).
+
+ Without any -global isa-fdc,... you get an empty driveA and no
+ driveB. You can use -nodefaults to suppress the default driveA, see
+ "Default Devices".
+
+* if=virtio
+
+ -device virtio-blk-pci,drive=DRIVE-ID,class=C,vectors=V,ioeventfd=IOEVENTFD
+
+ This lets you control PCI device class and MSI-X vectors.
+
+ IOEVENTFD controls whether or not ioeventfd is used for virtqueue
+ notify. It can be set to on (default) or off.
+
+ As for all PCI devices, you can add bus=PCI-BUS,addr=DEVFN to
+ control the PCI device address. This replaces option addr available
+ with -drive if=virtio.
+
+* if=pflash, if=mtd, if=sd, if=xen are not yet available with -device
+
+For USB devices, the old way is actually different:
+
+ -usbdevice disk:format=FMT:FILENAME
+
+Provides much less control than -drive's OPTS... The new way fixes
+that:
+
+ -device usb-storage,drive=DRIVE-ID,removable=RMB
+
+The removable parameter gives control over the SCSI INQUIRY removable
+(RMB) bit. USB thumbdrives usually set removable=on, while USB hard
+disks set removable=off.
+
+Bug: usb-storage pretends to be a block device, but it's really a SCSI
+controller that can serve only a single device, which it creates
+automatically. The automatic creation guesses what kind of guest part
+to create from the host part, like -drive if=scsi. Host and guest
+part are not cleanly separated.
+
+=== Character Devices ===
+
+A QEMU character device has a host and a guest part.
+
+The old ways to define character devices define host and guest part
+together.
+
+The new way keeps the parts separate: you create the host part with
+-chardev, and the guest device with -device.
+
+The various old ways to define a character device are all of the
+general form
+
+ -FOO FOO-OPTS...,LEGACY-CHARDEV
+
+where FOO-OPTS... is specific to -FOO, and the host part
+LEGACY-CHARDEV is the same everywhere.
+
+In the new way, this becomes
+
+ -chardev HOST-OPTS...,id=CHR-ID
+ -device DEVNAME,chardev=CHR-ID,DEV-OPTS...
+
+The appropriate DEVNAME depends on the machine type. For type "pc":
+
+* -serial becomes -device isa-serial,iobase=IOADDR,irq=IRQ,index=IDX
+
+ This lets you control I/O ports and IRQs.
+
+* -parallel becomes -device isa-parallel,iobase=IOADDR,irq=IRQ,index=IDX
+
+ This lets you control I/O ports and IRQs.
+
+* -usbdevice serial:vendorid=VID,productid=PRID becomes
+ -device usb-serial,vendorid=VID,productid=PRID
+
+* -usbdevice braille doesn't support LEGACY-CHARDEV syntax. It always
+ uses "braille". With -device, this useful default is gone, so you
+ have to use something like
+
+ -device usb-braille,chardev=braille,vendorid=VID,productid=PRID
+ -chardev braille,id=braille
+
+* -virtioconsole becomes
+ -device virtio-serial-pci,class=C,vectors=V,ioeventfd=IOEVENTFD,max_ports=N
+ -device virtconsole,is_console=NUM,nr=NR,name=NAME
+
+LEGACY-CHARDEV translates to -chardev HOST-OPTS... as follows:
+
+* null becomes -chardev null
+
+* pty, msmouse, braille, stdio likewise
+
+* vc:WIDTHxHEIGHT becomes -chardev vc,width=WIDTH,height=HEIGHT
+
+* vc:<COLS>Cx<ROWS>C becomes -chardev vc,cols=<COLS>,rows=<ROWS>
+
+* con: becomes -chardev console
+
+* COM<NUM> becomes -chardev serial,path=<NUM>
+
+* file:FNAME becomes -chardev file,path=FNAME
+
+* pipe:FNAME becomes -chardev pipe,path=FNAME
+
+* tcp:HOST:PORT,OPTS... becomes -chardev socket,host=HOST,port=PORT,OPTS...
+
+* telnet:HOST:PORT,OPTS... becomes
+ -chardev socket,host=HOST,port=PORT,OPTS...,telnet=on
+
+* udp:HOST:PORT@LOCALADDR:LOCALPORT becomes
+ -chardev udp,host=HOST,port=PORT,localaddr=LOCALADDR,localport=LOCALPORT
+
+* unix:FNAME becomes -chardev socket,path=FNAME
+
+* /dev/parportN becomes -chardev parport,file=/dev/parportN
+
+* /dev/ppiN likewise
+
+* Any other /dev/FNAME becomes -chardev tty,path=/dev/FNAME
+
+* mon:LEGACY-CHARDEV is special: it multiplexes the monitor onto the
+ character device defined by LEGACY-CHARDEV. -chardev provides more
+ general multiplexing instead: you can connect up to four users to a
+ single host part. You need to pass mux=on to -chardev to enable
+ switching the input focus.
+
+QEMU uses LEGACY-CHARDEV syntax not just to set up guest devices, but
+also in various other places such as -monitor or -net
+user,guestfwd=... You can use chardev:CHR-ID in place of
+LEGACY-CHARDEV to refer to a host part defined with -chardev.
+
+=== Network Devices ===
+
+Host and guest part of network devices have always been separate.
+
+The old way to define the guest part looks like this:
+
+ -net nic,netdev=NET-ID,macaddr=MACADDR,model=MODEL,name=ID,addr=STR,vectors=V
+
+Except for USB it looks like this:
+
+ -usbdevice net:netdev=NET-ID,macaddr=MACADDR,name=ID
+
+The new way is -device:
+
+ -device DEVNAME,netdev=NET-ID,mac=MACADDR,DEV-OPTS...
+
+DEVNAME equals MODEL, except for virtio you have to name the virtio
+device appropriate for the bus (virtio-net-pci for PCI), and for USB
+you have to use usb-net.
+
+The old name=ID parameter becomes the usual id=ID with -device.
+
+For PCI devices, you can add bus=PCI-BUS,addr=DEVFN to control the PCI
+device address, as usual. The old -net nic provides parameter addr
+for that, which is silently ignored when the NIC is not a PCI device.
+
+For virtio-net-pci, you can control whether or not ioeventfd is used for
+virtqueue notify by setting ioeventfd= to on or off (default).
+
+-net nic accepts vectors=V for all models, but it's silently ignored
+except for virtio-net-pci (model=virtio). With -device, only devices
+that support it accept it.
+
+Not all devices are available with -device at this time. All PCI
+devices and ne2k_isa are.
+
+Some PCI devices aren't available with -net nic, e.g. i82558a.
+
+To connect to a VLAN instead of an ordinary host part, replace
+netdev=NET-ID by vlan=VLAN.
+
+=== Graphics Devices ===
+
+Host and guest part of graphics devices have always been separate.
+
+The old way to define the guest graphics device is -vga VGA. Not all
+machines support all -vga options.
+
+The new way is -device. The mapping from -vga argument to -device
+depends on the machine type. For machine "pc", it's:
+
+ std -device VGA
+ cirrus -device cirrus-vga
+ vmware -device vmware-svga
+ qxl -device qxl-vga
+ none -nodefaults
+ disables more than just VGA, see "Default Devices"
+
+As for all PCI devices, you can add bus=PCI-BUS,addr=DEVFN to control
+the PCI device address.
+
+-device VGA supports properties bios-offset and bios-size, but they
+aren't used with machine type "pc".
+
+For machine "isapc", it's
+
+ std -device isa-vga
+ cirrus not yet available with -device
+ none -nodefaults
+ disables more than just VGA, see "Default Devices"
+
+Bug: the new way doesn't work for machine types "pc" and "isapc",
+because it violates obscure device initialization ordering
+constraints.
+
+=== Audio Devices ===
+
+Host and guest part of audio devices have always been separate.
+
+The old way to define guest audio devices is -soundhw C1,...
+
+The new way is to define each guest audio device separately with
+-device.
+
+Map from -soundhw sound card name to -device:
+
+ ac97 -device AC97
+ cs4231a -device cs4231a,iobase=IOADDR,irq=IRQ,dma=DMA
+ es1370 -device ES1370
+ gus -device gus,iobase=IOADDR,irq=IRQ,dma=DMA,freq=F
+ hda -device intel-hda,msi=MSI -device hda-duplex
+ sb16 -device sb16,iobase=IOADDR,irq=IRQ,dma=DMA,dma16=DMA16,version=V
+ adlib not yet available with -device
+ pcspk not yet available with -device
+
+For PCI devices, you can add bus=PCI-BUS,addr=DEVFN to control the PCI
+device address, as usual.
+
+=== USB Devices ===
+
+The old way to define a virtual USB device is -usbdevice DRIVER:OPTS...
+
+The new way is -device DEVNAME,DEV-OPTS... Details depend on DRIVER:
+
+* ccid -device usb-ccid
+* keyboard -device usb-kbd
+* mouse -device usb-mouse
+* tablet -device usb-tablet
+* wacom-tablet -device usb-wacom-tablet
+* host:... See "Host Device Assignment"
+* disk:... See "Block Devices"
+* serial:... See "Character Devices"
+* braille See "Character Devices"
+* net:... See "Network Devices"
+* bt:... not yet available with -device
+
+=== Watchdog Devices ===
+
+Host and guest part of watchdog devices have always been separate.
+
+The old way to define a guest watchdog device is -watchdog DEVNAME.
+The new way is -device DEVNAME. For PCI devices, you can add
+bus=PCI-BUS,addr=DEVFN to control the PCI device address, as usual.
+
+=== Host Device Assignment ===
+
+QEMU supports assigning host PCI devices (qemu-kvm only at this time)
+and host USB devices.
+
+The old way to assign a host PCI device is
+
+ -pcidevice host=ADDR,dma=none,id=ID
+
+The new way is
+
+ -device pci-assign,host=ADDR,iommu=IOMMU,id=ID
+
+The old dma=none becomes iommu=off with -device.
+
+The old way to assign a host USB device is
+
+ -usbdevice host:auto:BUS.ADDR:VID:PRID
+
+where any of BUS, ADDR, VID, PRID can be the wildcard *.
+
+The new way is
+
+ -device usb-host,hostbus=BUS,hostaddr=ADDR,vendorid=VID,productid=PRID
+
+Omitted options match anything, just like the old way's wildcard.
+
+=== Default Devices ===
+
+QEMU creates a number of devices by default, depending on the machine
+type.
+
+-device DEVNAME... and global DEVNAME... suppress default devices for
+some DEVNAMEs:
+
+ default device suppressing DEVNAMEs
+ CD-ROM ide-cd, ide-drive, scsi-cd
+ isa-fdc's driveA isa-fdc
+ parallel isa-parallel
+ serial isa-serial
+ VGA VGA, cirrus-vga, vmware-svga
+ virtioconsole virtio-serial-pci, virtio-serial-s390, virtio-serial
+
+The default NIC is connected to a default part created along with it.
+It is *not* suppressed by configuring a NIC with -device (you may call
+that a bug). -net and -netdev suppress the default NIC.
+
+-nodefaults suppresses all the default devices mentioned above, plus a
+few other things such as default SD-Card drive and default monitor.
diff --git a/qemu-0.15.x/docs/specs/acpi_pci_hotplug.txt b/qemu-0.15.x/docs/specs/acpi_pci_hotplug.txt
new file mode 100644
index 0000000..f0f74a7
--- /dev/null
+++ b/qemu-0.15.x/docs/specs/acpi_pci_hotplug.txt
@@ -0,0 +1,37 @@
+QEMU<->ACPI BIOS PCI hotplug interface
+--------------------------------------
+
+QEMU supports PCI hotplug via ACPI, for PCI bus 0. This document
+describes the interface between QEMU and the ACPI BIOS.
+
+ACPI GPE block (IO ports 0xafe0-0xafe3, byte access):
+-----------------------------------------
+
+Generic ACPI GPE block. Bit 1 (GPE.1) used to notify PCI hotplug/eject
+event to ACPI BIOS, via SCI interrupt.
+
+PCI slot injection notification pending (IO port 0xae00-0xae03, 4-byte access):
+---------------------------------------------------------------
+Slot injection notification pending. One bit per slot.
+
+Read by ACPI BIOS GPE.1 handler to notify OS of injection
+events.
+
+PCI slot removal notification (IO port 0xae04-0xae07, 4-byte access):
+-----------------------------------------------------
+Slot removal notification pending. One bit per slot.
+
+Read by ACPI BIOS GPE.1 handler to notify OS of removal
+events.
+
+PCI device eject (IO port 0xae08-0xae0b, 4-byte access):
+----------------------------------------
+
+Used by ACPI BIOS _EJ0 method to request device removal. One bit per slot.
+Reads return 0.
+
+PCI removability status (IO port 0xae0c-0xae0f, 4-byte access):
+-----------------------------------------------
+
+Used by ACPI BIOS _RMV method to indicate removability status to OS. One
+bit per slot.
diff --git a/qemu-0.15.x/docs/specs/ivshmem_device_spec.txt b/qemu-0.15.x/docs/specs/ivshmem_device_spec.txt
new file mode 100644
index 0000000..23dd2ba
--- /dev/null
+++ b/qemu-0.15.x/docs/specs/ivshmem_device_spec.txt
@@ -0,0 +1,96 @@
+
+Device Specification for Inter-VM shared memory device
+------------------------------------------------------
+
+The Inter-VM shared memory device is designed to share a region of memory to
+userspace in multiple virtual guests. The memory region does not belong to any
+guest, but is a POSIX memory object on the host. Optionally, the device may
+support sending interrupts to other guests sharing the same memory region.
+
+
+The Inter-VM PCI device
+-----------------------
+
+*BARs*
+
+The device supports three BARs. BAR0 is a 1 Kbyte MMIO region to support
+registers. BAR1 is used for MSI-X when it is enabled in the device. BAR2 is
+used to map the shared memory object from the host. The size of BAR2 is
+specified when the guest is started and must be a power of 2 in size.
+
+*Registers*
+
+The device currently supports 4 registers of 32-bits each. Registers
+are used for synchronization between guests sharing the same memory object when
+interrupts are supported (this requires using the shared memory server).
+
+The server assigns each VM an ID number and sends this ID number to the Qemu
+process when the guest starts.
+
+enum ivshmem_registers {
+ IntrMask = 0,
+ IntrStatus = 4,
+ IVPosition = 8,
+ Doorbell = 12
+};
+
+The first two registers are the interrupt mask and status registers. Mask and
+status are only used with pin-based interrupts. They are unused with MSI
+interrupts.
+
+Status Register: The status register is set to 1 when an interrupt occurs.
+
+Mask Register: The mask register is bitwise ANDed with the interrupt status
+and the result will raise an interrupt if it is non-zero. However, since 1 is
+the only value the status will be set to, it is only the first bit of the mask
+that has any effect. Therefore interrupts can be masked by setting the first
+bit to 0 and unmasked by setting the first bit to 1.
+
+IVPosition Register: The IVPosition register is read-only and reports the
+guest's ID number. The guest IDs are non-negative integers. When using the
+server, since the server is a separate process, the VM ID will only be set when
+the device is ready (shared memory is received from the server and accessible via
+the device). If the device is not ready, the IVPosition will return -1.
+Applications should ensure that they have a valid VM ID before accessing the
+shared memory.
+
+Doorbell Register: To interrupt another guest, a guest must write to the
+Doorbell register. The doorbell register is 32-bits, logically divided into
+two 16-bit fields. The high 16-bits are the guest ID to interrupt and the low
+16-bits are the interrupt vector to trigger. The semantics of the value
+written to the doorbell depends on whether the device is using MSI or a regular
+pin-based interrupt. In short, MSI uses vectors while regular interrupts set the
+status register.
+
+Regular Interrupts
+
+If regular interrupts are used (due to either a guest not supporting MSI or the
+user specifying not to use them on startup) then the value written to the lower
+16-bits of the Doorbell register results is arbitrary and will trigger an
+interrupt in the destination guest.
+
+Message Signalled Interrupts
+
+A ivshmem device may support multiple MSI vectors. If so, the lower 16-bits
+written to the Doorbell register must be between 0 and the maximum number of
+vectors the guest supports. The lower 16 bits written to the doorbell is the
+MSI vector that will be raised in the destination guest. The number of MSI
+vectors is configurable but it is set when the VM is started.
+
+The important thing to remember with MSI is that it is only a signal, no status
+is set (since MSI interrupts are not shared). All information other than the
+interrupt itself should be communicated via the shared memory region. Devices
+supporting multiple MSI vectors can use different vectors to indicate different
+events have occurred. The semantics of interrupt vectors are left to the
+user's discretion.
+
+
+Usage in the Guest
+------------------
+
+The shared memory device is intended to be used with the provided UIO driver.
+Very little configuration is needed. The guest should map BAR0 to access the
+registers (an array of 32-bit ints allows simple writing) and map BAR2 to
+access the shared memory region itself. The size of the shared memory region
+is specified when the guest (or shared memory server) is started. A guest may
+map the whole shared memory region or only part of it.
diff --git a/qemu-0.15.x/docs/specs/qcow2.txt b/qemu-0.15.x/docs/specs/qcow2.txt
new file mode 100644
index 0000000..8fc3cb2
--- /dev/null
+++ b/qemu-0.15.x/docs/specs/qcow2.txt
@@ -0,0 +1,260 @@
+== General ==
+
+A qcow2 image file is organized in units of constant size, which are called
+(host) clusters. A cluster is the unit in which all allocations are done,
+both for actual guest data and for image metadata.
+
+Likewise, the virtual disk as seen by the guest is divided into (guest)
+clusters of the same size.
+
+All numbers in qcow2 are stored in Big Endian byte order.
+
+
+== Header ==
+
+The first cluster of a qcow2 image contains the file header:
+
+ Byte 0 - 3: magic
+ QCOW magic string ("QFI\xfb")
+
+ 4 - 7: version
+ Version number (only valid value is 2)
+
+ 8 - 15: backing_file_offset
+ Offset into the image file at which the backing file name
+ is stored (NB: The string is not null terminated). 0 if the
+ image doesn't have a backing file.
+
+ 16 - 19: backing_file_size
+ Length of the backing file name in bytes. Must not be
+ longer than 1023 bytes. Undefined if the image doesn't have
+ a backing file.
+
+ 20 - 23: cluster_bits
+ Number of bits that are used for addressing an offset
+ within a cluster (1 << cluster_bits is the cluster size).
+ Must not be less than 9 (i.e. 512 byte clusters).
+
+ Note: qemu as of today has an implementation limit of 2 MB
+ as the maximum cluster size and won't be able to open images
+ with larger cluster sizes.
+
+ 24 - 31: size
+ Virtual disk size in bytes
+
+ 32 - 35: crypt_method
+ 0 for no encryption
+ 1 for AES encryption
+
+ 36 - 39: l1_size
+ Number of entries in the active L1 table
+
+ 40 - 47: l1_table_offset
+ Offset into the image file at which the active L1 table
+ starts. Must be aligned to a cluster boundary.
+
+ 48 - 55: refcount_table_offset
+ Offset into the image file at which the refcount table
+ starts. Must be aligned to a cluster boundary.
+
+ 56 - 59: refcount_table_clusters
+ Number of clusters that the refcount table occupies
+
+ 60 - 63: nb_snapshots
+ Number of snapshots contained in the image
+
+ 64 - 71: snapshots_offset
+ Offset into the image file at which the snapshot table
+ starts. Must be aligned to a cluster boundary.
+
+Directly after the image header, optional sections called header extensions can
+be stored. Each extension has a structure like the following:
+
+ Byte 0 - 3: Header extension type:
+ 0x00000000 - End of the header extension area
+ 0xE2792ACA - Backing file format name
+ other - Unknown header extension, can be safely
+ ignored
+
+ 4 - 7: Length of the header extension data
+
+ 8 - n: Header extension data
+
+ n - m: Padding to round up the header extension size to the next
+ multiple of 8.
+
+The remaining space between the end of the header extension area and the end of
+the first cluster can be used for other data. Usually, the backing file name is
+stored there.
+
+
+== Host cluster management ==
+
+qcow2 manages the allocation of host clusters by maintaining a reference count
+for each host cluster. A refcount of 0 means that the cluster is free, 1 means
+that it is used, and >= 2 means that it is used and any write access must
+perform a COW (copy on write) operation.
+
+The refcounts are managed in a two-level table. The first level is called
+refcount table and has a variable size (which is stored in the header). The
+refcount table can cover multiple clusters, however it needs to be contiguous
+in the image file.
+
+It contains pointers to the second level structures which are called refcount
+blocks and are exactly one cluster in size.
+
+Given a offset into the image file, the refcount of its cluster can be obtained
+as follows:
+
+ refcount_block_entries = (cluster_size / sizeof(uint16_t))
+
+ refcount_block_index = (offset / cluster_size) % refcount_table_entries
+ refcount_table_index = (offset / cluster_size) / refcount_table_entries
+
+ refcount_block = load_cluster(refcount_table[refcount_table_index]);
+ return refcount_block[refcount_block_index];
+
+Refcount table entry:
+
+ Bit 0 - 8: Reserved (set to 0)
+
+ 9 - 63: Bits 9-63 of the offset into the image file at which the
+ refcount block starts. Must be aligned to a cluster
+ boundary.
+
+ If this is 0, the corresponding refcount block has not yet
+ been allocated. All refcounts managed by this refcount block
+ are 0.
+
+Refcount block entry:
+
+ Bit 0 - 15: Reference count of the cluster
+
+
+== Cluster mapping ==
+
+Just as for refcounts, qcow2 uses a two-level structure for the mapping of
+guest clusters to host clusters. They are called L1 and L2 table.
+
+The L1 table has a variable size (stored in the header) and may use multiple
+clusters, however it must be contiguous in the image file. L2 tables are
+exactly one cluster in size.
+
+Given a offset into the virtual disk, the offset into the image file can be
+obtained as follows:
+
+ l2_entries = (cluster_size / sizeof(uint64_t))
+
+ l2_index = (offset / cluster_size) % l2_entries
+ l1_index = (offset / cluster_size) / l2_entries
+
+ l2_table = load_cluster(l1_table[l1_index]);
+ cluster_offset = l2_table[l2_index];
+
+ return cluster_offset + (offset % cluster_size)
+
+L1 table entry:
+
+ Bit 0 - 8: Reserved (set to 0)
+
+ 9 - 55: Bits 9-55 of the offset into the image file at which the L2
+ table starts. Must be aligned to a cluster boundary. If the
+ offset is 0, the L2 table and all clusters described by this
+ L2 table are unallocated.
+
+ 56 - 62: Reserved (set to 0)
+
+ 63: 0 for an L2 table that is unused or requires COW, 1 if its
+ refcount is exactly one. This information is only accurate
+ in the active L1 table.
+
+L2 table entry (for normal clusters):
+
+ Bit 0 - 8: Reserved (set to 0)
+
+ 9 - 55: Bits 9-55 of host cluster offset. Must be aligned to a
+ cluster boundary. If the offset is 0, the cluster is
+ unallocated.
+
+ 56 - 61: Reserved (set to 0)
+
+ 62: 0 (this cluster is not compressed)
+
+ 63: 0 for a cluster that is unused or requires COW, 1 if its
+ refcount is exactly one. This information is only accurate
+ in L2 tables that are reachable from the the active L1
+ table.
+
+L2 table entry (for compressed clusters; x = 62 - (cluster_size - 8)):
+
+ Bit 0 - x: Host cluster offset. This is usually _not_ aligned to a
+ cluster boundary!
+
+ x+1 - 61: Compressed size of the images in sectors of 512 bytes
+
+ 62: 1 (this cluster is compressed using zlib)
+
+ 63: 0 for a cluster that is unused or requires COW, 1 if its
+ refcount is exactly one. This information is only accurate
+ in L2 tables that are reachable from the the active L1
+ table.
+
+If a cluster is unallocated, read requests shall read the data from the backing
+file. If there is no backing file or the backing file is smaller than the image,
+they shall read zeros for all parts that are not covered by the backing file.
+
+
+== Snapshots ==
+
+qcow2 supports internal snapshots. Their basic principle of operation is to
+switch the active L1 table, so that a different set of host clusters are
+exposed to the guest.
+
+When creating a snapshot, the L1 table should be copied and the refcount of all
+L2 tables and clusters reachable form this L1 table must be increased, so that
+a write causes a COW and isn't visible in other snapshots.
+
+When loading a snapshot, bit 63 of all entries in the new active L1 table and
+all L2 tables referenced by it must be reconstructed from the refcount table
+as it doesn't need to be accurate in inactive L1 tables.
+
+A directory of all snapshots is stored in the snapshot table, a contiguous area
+in the image file, whose starting offset and length are given by the header
+fields snapshots_offset and nb_snapshots. The entries of the snapshot table
+have variable length, depending on the length of ID, name and extra data.
+
+Snapshot table entry:
+
+ Byte 0 - 7: Offset into the image file at which the L1 table for the
+ snapshot starts. Must be aligned to a cluster boundary.
+
+ 8 - 11: Number of entries in the L1 table of the snapshots
+
+ 12 - 13: Length of the unique ID string describing the snapshot
+
+ 14 - 15: Length of the name of the snapshot
+
+ 16 - 19: Time at which the snapshot was taken in seconds since the
+ Epoch
+
+ 20 - 23: Subsecond part of the time at which the snapshot was taken
+ in nanoseconds
+
+ 24 - 31: Time that the guest was running until the snapshot was
+ taken in nanoseconds
+
+ 32 - 35: Size of the VM state in bytes. 0 if no VM state is saved.
+ If there is VM state, it starts at the first cluster
+ described by first L1 table entry that doesn't describe a
+ regular guest cluster (i.e. VM state is stored like guest
+ disk content, except that it is stored at offsets that are
+ larger than the virtual disk presented to the guest)
+
+ 36 - 39: Size of extra data in the table entry (used for future
+ extensions of the format)
+
+ variable: Extra data for future extensions. Must be ignored.
+
+ variable: Unique ID string for the snapshot (not null terminated)
+
+ variable: Name of the snapshot (not null terminated)
diff --git a/qemu-0.15.x/docs/specs/qed_spec.txt b/qemu-0.15.x/docs/specs/qed_spec.txt
new file mode 100644
index 0000000..7982e05
--- /dev/null
+++ b/qemu-0.15.x/docs/specs/qed_spec.txt
@@ -0,0 +1,138 @@
+=Specification=
+
+The file format looks like this:
+
+ +----------+----------+----------+-----+
+ | cluster0 | cluster1 | cluster2 | ... |
+ +----------+----------+----------+-----+
+
+The first cluster begins with the '''header'''. The header contains information about where regular clusters start; this allows the header to be extensible and store extra information about the image file. A regular cluster may be a '''data cluster''', an '''L2''', or an '''L1 table'''. L1 and L2 tables are composed of one or more contiguous clusters.
+
+Normally the file size will be a multiple of the cluster size. If the file size is not a multiple, extra information after the last cluster may not be preserved if data is written. Legitimate extra information should use space between the header and the first regular cluster.
+
+All fields are little-endian.
+
+==Header==
+ Header {
+ uint32_t magic; /* QED\0 */
+
+ uint32_t cluster_size; /* in bytes */
+ uint32_t table_size; /* for L1 and L2 tables, in clusters */
+ uint32_t header_size; /* in clusters */
+
+ uint64_t features; /* format feature bits */
+ uint64_t compat_features; /* compat feature bits */
+ uint64_t autoclear_features; /* self-resetting feature bits */
+
+ uint64_t l1_table_offset; /* in bytes */
+ uint64_t image_size; /* total logical image size, in bytes */
+
+ /* if (features & QED_F_BACKING_FILE) */
+ uint32_t backing_filename_offset; /* in bytes from start of header */
+ uint32_t backing_filename_size; /* in bytes */
+ }
+
+Field descriptions:
+* ''cluster_size'' must be a power of 2 in range [2^12, 2^26].
+* ''table_size'' must be a power of 2 in range [1, 16].
+* ''header_size'' is the number of clusters used by the header and any additional information stored before regular clusters.
+* ''features'', ''compat_features'', and ''autoclear_features'' are file format extension bitmaps. They work as follows:
+** An image with unknown ''features'' bits enabled must not be opened. File format changes that are not backwards-compatible must use ''features'' bits.
+** An image with unknown ''compat_features'' bits enabled can be opened safely. The unknown features are simply ignored and represent backwards-compatible changes to the file format.
+** An image with unknown ''autoclear_features'' bits enable can be opened safely after clearing the unknown bits. This allows for backwards-compatible changes to the file format which degrade gracefully and can be re-enabled again by a new program later.
+* ''l1_table_offset'' is the offset of the first byte of the L1 table in the image file and must be a multiple of ''cluster_size''.
+* ''image_size'' is the block device size seen by the guest and must be a multiple of 512 bytes.
+* ''backing_filename_offset'' and ''backing_filename_size'' describe a string in (byte offset, byte size) form. It is not NUL-terminated and has no alignment constraints. The string must be stored within the first ''header_size'' clusters. The backing filename may be an absolute path or relative to the image file.
+
+Feature bits:
+* QED_F_BACKING_FILE = 0x01. The image uses a backing file.
+* QED_F_NEED_CHECK = 0x02. The image needs a consistency check before use.
+* QED_F_BACKING_FORMAT_NO_PROBE = 0x04. The backing file is a raw disk image and no file format autodetection should be attempted. This should be used to ensure that raw backing files are never detected as an image format if they happen to contain magic constants.
+
+There are currently no defined ''compat_features'' or ''autoclear_features'' bits.
+
+Fields predicated on a feature bit are only used when that feature is set. The fields always take up header space, regardless of whether or not the feature bit is set.
+
+==Tables==
+
+Tables provide the translation from logical offsets in the block device to cluster offsets in the file.
+
+ #define TABLE_NOFFSETS (table_size * cluster_size / sizeof(uint64_t))
+
+ Table {
+ uint64_t offsets[TABLE_NOFFSETS];
+ }
+
+The tables are organized as follows:
+
+ +----------+
+ | L1 table |
+ +----------+
+ ,------' | '------.
+ +----------+ | +----------+
+ | L2 table | ... | L2 table |
+ +----------+ +----------+
+ ,------' | '------.
+ +----------+ | +----------+
+ | Data | ... | Data |
+ +----------+ +----------+
+
+A table is made up of one or more contiguous clusters. The table_size header field determines table size for an image file. For example, cluster_size=64 KB and table_size=4 results in 256 KB tables.
+
+The logical image size must be less than or equal to the maximum possible size of clusters rooted by the L1 table:
+ header.image_size <= TABLE_NOFFSETS * TABLE_NOFFSETS * header.cluster_size
+
+L1, L2, and data cluster offsets must be aligned to header.cluster_size. The following offsets have special meanings:
+
+===L2 table offsets===
+* 0 - unallocated. The L2 table is not yet allocated.
+
+===Data cluster offsets===
+* 0 - unallocated. The data cluster is not yet allocated.
+* 1 - zero. The data cluster contents are all zeroes and no cluster is allocated.
+
+Future format extensions may wish to store per-offset information. The least significant 12 bits of an offset are reserved for this purpose and must be set to zero. Image files with cluster_size > 2^12 will have more unused bits which should also be zeroed.
+
+===Unallocated L2 tables and data clusters===
+Reads to an unallocated area of the image file access the backing file. If there is no backing file, then zeroes are produced. The backing file may be smaller than the image file and reads of unallocated areas beyond the end of the backing file produce zeroes.
+
+Writes to an unallocated area cause a new data clusters to be allocated, and a new L2 table if that is also unallocated. The new data cluster is populated with data from the backing file (or zeroes if no backing file) and the data being written.
+
+===Zero data clusters===
+Zero data clusters are a space-efficient way of storing zeroed regions of the image.
+
+Reads to a zero data cluster produce zeroes. Note that the difference between an unallocated and a zero data cluster is that zero data clusters stop the reading of contents from the backing file.
+
+Writes to a zero data cluster cause a new data cluster to be allocated. The new data cluster is populated with zeroes and the data being written.
+
+===Logical offset translation===
+Logical offsets are translated into cluster offsets as follows:
+
+ table_bits table_bits cluster_bits
+ <--------> <--------> <--------------->
+ +----------+----------+-----------------+
+ | L1 index | L2 index | byte offset |
+ +----------+----------+-----------------+
+
+ Structure of a logical offset
+
+ offset_mask = ~(cluster_size - 1) # mask for the image file byte offset
+
+ def logical_to_cluster_offset(l1_index, l2_index, byte_offset):
+ l2_offset = l1_table[l1_index]
+ l2_table = load_table(l2_offset)
+ cluster_offset = l2_table[l2_index] & offset_mask
+ return cluster_offset + byte_offset
+
+==Consistency checking==
+
+This section is informational and included to provide background on the use of the QED_F_NEED_CHECK ''features'' bit.
+
+The QED_F_NEED_CHECK bit is used to mark an image as dirty before starting an operation that could leave the image in an inconsistent state if interrupted by a crash or power failure. A dirty image must be checked on open because its metadata may not be consistent.
+
+Consistency check includes the following invariants:
+# Each cluster is referenced once and only once. It is an inconsistency to have a cluster referenced more than once by L1 or L2 tables. A cluster has been leaked if it has no references.
+# Offsets must be within the image file size and must be ''cluster_size'' aligned.
+# Table offsets must at least ''table_size'' * ''cluster_size'' bytes from the end of the image file so that there is space for the entire table.
+
+The consistency check process starts by from ''l1_table_offset'' and scans all L2 tables. After the check completes with no other errors besides leaks, the QED_F_NEED_CHECK bit can be cleared and the image can be accessed.
diff --git a/qemu-0.15.x/docs/tracing.txt b/qemu-0.15.x/docs/tracing.txt
new file mode 100644
index 0000000..c99a0f2
--- /dev/null
+++ b/qemu-0.15.x/docs/tracing.txt
@@ -0,0 +1,211 @@
+= Tracing =
+
+== Introduction ==
+
+This document describes the tracing infrastructure in QEMU and how to use it
+for debugging, profiling, and observing execution.
+
+== Quickstart ==
+
+1. Build with the 'simple' trace backend:
+
+ ./configure --trace-backend=simple
+ make
+
+2. Enable trace events you are interested in:
+
+ $EDITOR trace-events # remove "disable" from events you want
+
+3. Run the virtual machine to produce a trace file:
+
+ qemu ... # your normal QEMU invocation
+
+4. Pretty-print the binary trace file:
+
+ ./simpletrace.py trace-events trace-*
+
+== Trace events ==
+
+There is a set of static trace events declared in the "trace-events" source
+file. Each trace event declaration names the event, its arguments, and the
+format string which can be used for pretty-printing:
+
+ qemu_malloc(size_t size, void *ptr) "size %zu ptr %p"
+ qemu_free(void *ptr) "ptr %p"
+
+The "trace-events" file is processed by the "tracetool" script during build to
+generate code for the trace events. Trace events are invoked directly from
+source code like this:
+
+ #include "trace.h" /* needed for trace event prototype */
+
+ void *qemu_malloc(size_t size)
+ {
+ void *ptr;
+ if (!size && !allow_zero_malloc()) {
+ abort();
+ }
+ ptr = oom_check(malloc(size ? size : 1));
+ trace_qemu_malloc(size, ptr); /* <-- trace event */
+ return ptr;
+ }
+
+=== Declaring trace events ===
+
+The "tracetool" script produces the trace.h header file which is included by
+every source file that uses trace events. Since many source files include
+trace.h, it uses a minimum of types and other header files included to keep the
+namespace clean and compile times and dependencies down.
+
+Trace events should use types as follows:
+
+ * Use stdint.h types for fixed-size types. Most offsets and guest memory
+ addresses are best represented with uint32_t or uint64_t. Use fixed-size
+ types over primitive types whose size may change depending on the host
+ (32-bit versus 64-bit) so trace events don't truncate values or break
+ the build.
+
+ * Use void * for pointers to structs or for arrays. The trace.h header
+ cannot include all user-defined struct declarations and it is therefore
+ necessary to use void * for pointers to structs.
+
+ Pointers (including char *) cannot be dereferenced easily (or at all) in
+ some trace backends. If pointers are used, ensure they are meaningful by
+ themselves and do not assume the data they point to will be traced. Do
+ not pass in string arguments.
+
+ * For everything else, use primitive scalar types (char, int, long) with the
+ appropriate signedness.
+
+Format strings should reflect the types defined in the trace event. Take
+special care to use PRId64 and PRIu64 for int64_t and uint64_t types,
+respectively. This ensures portability between 32- and 64-bit platforms. Note
+that format strings must begin and end with double quotes. When using
+portability macros, ensure they are preceded and followed by double quotes:
+"value %"PRIx64"".
+
+=== Hints for adding new trace events ===
+
+1. Trace state changes in the code. Interesting points in the code usually
+ involve a state change like starting, stopping, allocating, freeing. State
+ changes are good trace events because they can be used to understand the
+ execution of the system.
+
+2. Trace guest operations. Guest I/O accesses like reading device registers
+ are good trace events because they can be used to understand guest
+ interactions.
+
+3. Use correlator fields so the context of an individual line of trace output
+ can be understood. For example, trace the pointer returned by malloc and
+ used as an argument to free. This way mallocs and frees can be matched up.
+ Trace events with no context are not very useful.
+
+4. Name trace events after their function. If there are multiple trace events
+ in one function, append a unique distinguisher at the end of the name.
+
+5. Declare trace events with the "disable" keyword. Some trace events can
+ produce a lot of output and users are typically only interested in a subset
+ of trace events. Marking trace events disabled by default saves the user
+ from having to manually disable noisy trace events.
+
+== Trace backends ==
+
+The "tracetool" script automates tedious trace event code generation and also
+keeps the trace event declarations independent of the trace backend. The trace
+events are not tightly coupled to a specific trace backend, such as LTTng or
+SystemTap. Support for trace backends can be added by extending the "tracetool"
+script.
+
+The trace backend is chosen at configure time and only one trace backend can
+be built into the binary:
+
+ ./configure --trace-backend=simple
+
+For a list of supported trace backends, try ./configure --help or see below.
+
+The following subsections describe the supported trace backends.
+
+=== Nop ===
+
+The "nop" backend generates empty trace event functions so that the compiler
+can optimize out trace events completely. This is the default and imposes no
+performance penalty.
+
+=== Stderr ===
+
+The "stderr" backend sends trace events directly to standard error. This
+effectively turns trace events into debug printfs.
+
+This is the simplest backend and can be used together with existing code that
+uses DPRINTF().
+
+=== Simpletrace ===
+
+The "simple" backend supports common use cases and comes as part of the QEMU
+source tree. It may not be as powerful as platform-specific or third-party
+trace backends but it is portable. This is the recommended trace backend
+unless you have specific needs for more advanced backends.
+
+==== Monitor commands ====
+
+* info trace
+ Display the contents of trace buffer. This command dumps the trace buffer
+ with simple formatting. For full pretty-printing, use the simpletrace.py
+ script on a binary trace file.
+
+ The trace buffer is written into until full. The full trace buffer is
+ flushed and emptied. This means the 'info trace' will display few or no
+ entries if the buffer has just been flushed.
+
+* info trace-events
+ View available trace events and their state. State 1 means enabled, state 0
+ means disabled.
+
+* trace-event NAME on|off
+ Enable/disable a given trace event.
+
+* trace-file on|off|flush|set <path>
+ Enable/disable/flush the trace file or set the trace file name.
+
+==== Enabling/disabling trace events programmatically ====
+
+The st_change_trace_event_state() function can be used to enable or disable trace
+events at runtime inside QEMU:
+
+ #include "trace.h"
+
+ st_change_trace_event_state("virtio_irq", true); /* enable */
+ [...]
+ st_change_trace_event_state("virtio_irq", false); /* disable */
+
+==== Analyzing trace files ====
+
+The "simple" backend produces binary trace files that can be formatted with the
+simpletrace.py script. The script takes the "trace-events" file and the binary
+trace:
+
+ ./simpletrace.py trace-events trace-12345
+
+You must ensure that the same "trace-events" file was used to build QEMU,
+otherwise trace event declarations may have changed and output will not be
+consistent.
+
+=== LTTng Userspace Tracer ===
+
+The "ust" backend uses the LTTng Userspace Tracer library. There are no
+monitor commands built into QEMU, instead UST utilities should be used to list,
+enable/disable, and dump traces.
+
+=== SystemTap ===
+
+The "dtrace" backend uses DTrace sdt probes but has only been tested with
+SystemTap. When SystemTap support is detected a .stp file with wrapper probes
+is generated to make use in scripts more convenient. This step can also be
+performed manually after a build in order to change the binary name in the .stp
+probes:
+
+ scripts/tracetool --dtrace --stap \
+ --binary path/to/qemu-binary \
+ --target-type system \
+ --target-arch x86_64 \
+ <trace-events >qemu.stp
diff --git a/qemu-0.15.x/docs/usb2.txt b/qemu-0.15.x/docs/usb2.txt
new file mode 100644
index 0000000..228aa33
--- /dev/null
+++ b/qemu-0.15.x/docs/usb2.txt
@@ -0,0 +1,146 @@
+
+USB 2.0 Quick Start
+===================
+
+The QEMU EHCI Adapter can be used with and without companion
+controllers. See below for the companion controller mode.
+
+When not running in companion controller mode there are two completely
+separate USB busses: One USB 1.1 bus driven by the UHCI controller and
+one USB 2.0 bus driven by the EHCI controller. Devices must be
+attached to the correct controller manually.
+
+The '-usb' switch will make qemu create the UHCI controller as part of
+the PIIX3 chipset. The USB 1.1 bus will carry the name "usb.0".
+
+You can use the standard -device switch to add a EHCI controller to
+your virtual machine. It is strongly recommended to specify an ID for
+the controller so the USB 2.0 bus gets a individual name, for example
+'-device usb-ehci,id=ehci". This will give you a USB 2.0 bus named
+"ehci.0".
+
+I strongly recomment to also use -device to attach usb devices because
+you can specify the bus they should be attached to this way. Here is
+a complete example:
+
+ qemu -M pc ${otheroptions} \
+ -drive if=none,id=usbstick,file=/path/to/image \
+ -usb \
+ -device usb-ehci,id=ehci \
+ -device usb-tablet,bus=usb.0 \
+ -device usb-storage,bus=ehci.0,drive=usbstick
+
+This attaches a usb tablet to the UHCI adapter and a usb mass storage
+device to the EHCI adapter.
+
+
+Companion controller support
+----------------------------
+
+Companion controller support has been added recently. The operational
+model described above with two completely separate busses still works
+fine. Additionally the UHCI and OHCI controllers got the ability to
+attach to a usb bus created by EHCI as companion controllers. This is
+done by specifying the masterbus and firstport properties. masterbus
+specifies the bus name the controller should attach to. firstport
+specifies the first port the controller should attach to, which is
+needed as usually one ehci controller with six ports has three uhci
+companion controllers with two ports each.
+
+There is a config file in docs which will do all this for you, just
+try ...
+
+ qemu -readconfig docs/ich9-ehci-uhci.cfg
+
+... then use "bus=ehci.0" to assign your usb devices to that bus.
+
+
+More USB tips & tricks
+======================
+
+Recently the usb pass through driver (also known as usb-host) and the
+qemu usb subsystem gained a few capabilities which are available only
+via qdev properties, i,e. when using '-device'.
+
+
+physical port addressing
+------------------------
+
+First you can (for all usb devices) specify the physical port where
+the device will show up in the guest. This can be done using the
+"port" property. UHCI has two root ports (1,2). EHCI has four root
+ports (1-4), the emulated (1.1) USB hub has eight ports.
+
+Plugging a tablet into UHCI port 1 works like this:
+
+ -device usb-tablet,bus=usb.0,port=1
+
+Plugging a hub into UHCI port 2 works like this:
+
+ -device usb-hub,bus=usb.0,port=2
+
+Plugging a virtual usb stick into port 4 of the hub just plugged works
+this way:
+
+ -device usb-storage,bus=usb.0,port=2.4,drive=...
+
+You can do basically the same in the monitor using the device_add
+command. If you want to unplug devices too you should specify some
+unique id which you can use to refer to the device ...
+
+ (qemu) device_add usb-tablet,bus=usb.0,port=1,id=my-tablet
+ (qemu) device_del my-tablet
+
+... when unplugging it with device_del.
+
+
+USB pass through hints
+----------------------
+
+The usb-host driver has a bunch of properties to specify the device
+which should be passed to the guest:
+
+ hostbus=<nr> -- Specifies the bus number the device must be attached
+ to.
+
+ hostaddr=<nr> -- Specifies the device address the device got
+ assigned by the guest os.
+
+ hostport=<str> -- Specifies the physical port the device is attached
+ to.
+
+ vendorid=<hexnr> -- Specifies the vendor ID of the device.
+ productid=<hexnr> -- Specifies the product ID of the device.
+
+In theory you can combine all these properties as you like. In
+practice only a few combinations are useful:
+
+ (1) vendorid+productid -- match for a specific device, pass it to
+ the guest when it shows up somewhere in the host.
+
+ (2) hostbus+hostport -- match for a specific physical port in the
+ host, any device which is plugged in there gets passed to the
+ guest.
+
+ (3) hostbus+hostaddr -- most useful for ad-hoc pass through as the
+ hostaddr isn't stable, the next time you plug in the device it
+ gets a new one ...
+
+Note that USB 1.1 devices are handled by UHCI/OHCI and USB 2.0 by
+EHCI. That means a device plugged into the very same physical port
+may show up on different busses depending on the speed. The port I'm
+using for testing is bus 1 + port 1 for 2.0 devices and bus 3 + port 1
+for 1.1 devices. Passing through any device plugged into that port
+and also assign them to the correct bus can be done this way:
+
+ qemu -M pc ${otheroptions} \
+ -usb \
+ -device usb-ehci,id=ehci \
+ -device usb-host,bus=usb.0,hostbus=3,hostport=1 \
+ -device usb-host,bus=ehci.0,hostbus=1,hostport=1
+
+enjoy,
+ Gerd
+
+--
+Gerd Hoffmann <kraxel(a)redhat.com>
diff --git a/qemu-0.15.x/dyngen-exec.h b/qemu-0.15.x/dyngen-exec.h
new file mode 100644
index 0000000..db00fba
--- /dev/null
+++ b/qemu-0.15.x/dyngen-exec.h
@@ -0,0 +1,84 @@
+/*
+ * dyngen defines for micro operation code
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+#if !defined(__DYNGEN_EXEC_H__)
+#define __DYNGEN_EXEC_H__
+
+#include "qemu-common.h"
+
+#ifdef __OpenBSD__
+#include <sys/types.h>
+#endif
+
+/* XXX: This may be wrong for 64-bit ILP32 hosts. */
+typedef void * host_reg_t;
+
+#if defined(__i386__)
+#define AREG0 "ebp"
+#elif defined(__x86_64__)
+#define AREG0 "r14"
+#elif defined(_ARCH_PPC)
+#define AREG0 "r27"
+#elif defined(__arm__)
+#define AREG0 "r7"
+#elif defined(__hppa__)
+#define AREG0 "r17"
+#elif defined(__mips__)
+#define AREG0 "s0"
+#elif defined(__sparc__)
+#ifdef CONFIG_SOLARIS
+#define AREG0 "g2"
+#else
+#ifdef __sparc_v9__
+#define AREG0 "g5"
+#else
+#define AREG0 "g6"
+#endif
+#endif
+#elif defined(__s390__)
+#define AREG0 "r10"
+#elif defined(__alpha__)
+/* Note $15 is the frame pointer, so anything in op-i386.c that would
+ require a frame pointer, like alloca, would probably loose. */
+#define AREG0 "$15"
+#elif defined(__mc68000)
+#define AREG0 "%a5"
+#elif defined(__ia64__)
+#define AREG0 "r7"
+#else
+#error unsupported CPU
+#endif
+
+#define xglue(x, y) x ## y
+#define glue(x, y) xglue(x, y)
+#define stringify(s) tostring(s)
+#define tostring(s) #s
+
+/* The return address may point to the start of the next instruction.
+ Subtracting one gets us the call instruction itself. */
+#if defined(__s390__) && !defined(__s390x__)
+# define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1))
+#elif defined(__arm__)
+/* Thumb return addresses have the low bit set, so we need to subtract two.
+ This is still safe in ARM mode because instructions are 4 bytes. */
+# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2))
+#else
+# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1))
+#endif
+
+#endif /* !defined(__DYNGEN_EXEC_H__) */
diff --git a/qemu-0.15.x/elf.h b/qemu-0.15.x/elf.h
new file mode 100644
index 0000000..ffcac7e
--- /dev/null
+++ b/qemu-0.15.x/elf.h
@@ -0,0 +1,1262 @@
+#ifndef _QEMU_ELF_H
+#define _QEMU_ELF_H
+
+#include <inttypes.h>
+
+/* 32-bit ELF base types. */
+typedef uint32_t Elf32_Addr;
+typedef uint16_t Elf32_Half;
+typedef uint32_t Elf32_Off;
+typedef int32_t Elf32_Sword;
+typedef uint32_t Elf32_Word;
+
+/* 64-bit ELF base types. */
+typedef uint64_t Elf64_Addr;
+typedef uint16_t Elf64_Half;
+typedef int16_t Elf64_SHalf;
+typedef uint64_t Elf64_Off;
+typedef int32_t Elf64_Sword;
+typedef uint32_t Elf64_Word;
+typedef uint64_t Elf64_Xword;
+typedef int64_t Elf64_Sxword;
+
+/* These constants are for the segment types stored in the image headers */
+#define PT_NULL 0
+#define PT_LOAD 1
+#define PT_DYNAMIC 2
+#define PT_INTERP 3
+#define PT_NOTE 4
+#define PT_SHLIB 5
+#define PT_PHDR 6
+#define PT_LOPROC 0x70000000
+#define PT_HIPROC 0x7fffffff
+#define PT_MIPS_REGINFO 0x70000000
+#define PT_MIPS_OPTIONS 0x70000001
+
+/* Flags in the e_flags field of the header */
+/* MIPS architecture level. */
+#define EF_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
+#define EF_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
+#define EF_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
+#define EF_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
+#define EF_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
+#define EF_MIPS_ARCH_32 0x50000000 /* MIPS32 code. */
+#define EF_MIPS_ARCH_64 0x60000000 /* MIPS64 code. */
+
+/* The ABI of a file. */
+#define EF_MIPS_ABI_O32 0x00001000 /* O32 ABI. */
+#define EF_MIPS_ABI_O64 0x00002000 /* O32 extended for 64 bit. */
+
+#define EF_MIPS_NOREORDER 0x00000001
+#define EF_MIPS_PIC 0x00000002
+#define EF_MIPS_CPIC 0x00000004
+#define EF_MIPS_ABI2 0x00000020
+#define EF_MIPS_OPTIONS_FIRST 0x00000080
+#define EF_MIPS_32BITMODE 0x00000100
+#define EF_MIPS_ABI 0x0000f000
+#define EF_MIPS_ARCH 0xf0000000
+
+/* These constants define the different elf file types */
+#define ET_NONE 0
+#define ET_REL 1
+#define ET_EXEC 2
+#define ET_DYN 3
+#define ET_CORE 4
+#define ET_LOPROC 0xff00
+#define ET_HIPROC 0xffff
+
+/* These constants define the various ELF target machines */
+#define EM_NONE 0
+#define EM_M32 1
+#define EM_SPARC 2
+#define EM_386 3
+#define EM_68K 4
+#define EM_88K 5
+#define EM_486 6 /* Perhaps disused */
+#define EM_860 7
+
+#define EM_MIPS 8 /* MIPS R3000 (officially, big-endian only) */
+
+#define EM_MIPS_RS4_BE 10 /* MIPS R4000 big-endian */
+
+#define EM_PARISC 15 /* HPPA */
+
+#define EM_SPARC32PLUS 18 /* Sun's "v8plus" */
+
+#define EM_PPC 20 /* PowerPC */
+#define EM_PPC64 21 /* PowerPC64 */
+
+#define EM_ARM 40 /* ARM */
+
+#define EM_SH 42 /* SuperH */
+
+#define EM_SPARCV9 43 /* SPARC v9 64-bit */
+
+#define EM_IA_64 50 /* HP/Intel IA-64 */
+
+#define EM_X86_64 62 /* AMD x86-64 */
+
+#define EM_S390 22 /* IBM S/390 */
+
+#define EM_CRIS 76 /* Axis Communications 32-bit embedded processor */
+
+#define EM_V850 87 /* NEC v850 */
+
+#define EM_H8_300H 47 /* Hitachi H8/300H */
+#define EM_H8S 48 /* Hitachi H8S */
+#define EM_LATTICEMICO32 138 /* LatticeMico32 */
+
+#define EM_UNICORE32 110 /* UniCore32 */
+
+/*
+ * This is an interim value that we will use until the committee comes
+ * up with a final number.
+ */
+#define EM_ALPHA 0x9026
+
+/* Bogus old v850 magic number, used by old tools. */
+#define EM_CYGNUS_V850 0x9080
+
+/*
+ * This is the old interim value for S/390 architecture
+ */
+#define EM_S390_OLD 0xA390
+
+#define EM_MICROBLAZE 189
+#define EM_MICROBLAZE_OLD 0xBAAB
+
+/* This is the info that is needed to parse the dynamic section of the file */
+#define DT_NULL 0
+#define DT_NEEDED 1
+#define DT_PLTRELSZ 2
+#define DT_PLTGOT 3
+#define DT_HASH 4
+#define DT_STRTAB 5
+#define DT_SYMTAB 6
+#define DT_RELA 7
+#define DT_RELASZ 8
+#define DT_RELAENT 9
+#define DT_STRSZ 10
+#define DT_SYMENT 11
+#define DT_INIT 12
+#define DT_FINI 13
+#define DT_SONAME 14
+#define DT_RPATH 15
+#define DT_SYMBOLIC 16
+#define DT_REL 17
+#define DT_RELSZ 18
+#define DT_RELENT 19
+#define DT_PLTREL 20
+#define DT_DEBUG 21
+#define DT_TEXTREL 22
+#define DT_JMPREL 23
+#define DT_BINDNOW 24
+#define DT_INIT_ARRAY 25
+#define DT_FINI_ARRAY 26
+#define DT_INIT_ARRAYSZ 27
+#define DT_FINI_ARRAYSZ 28
+#define DT_RUNPATH 29
+#define DT_FLAGS 30
+#define DT_LOOS 0x6000000d
+#define DT_HIOS 0x6ffff000
+#define DT_LOPROC 0x70000000
+#define DT_HIPROC 0x7fffffff
+
+/* DT_ entries which fall between DT_VALRNGLO and DT_VALRNDHI use
+ the d_val field of the Elf*_Dyn structure. I.e. they contain scalars. */
+#define DT_VALRNGLO 0x6ffffd00
+#define DT_VALRNGHI 0x6ffffdff
+
+/* DT_ entries which fall between DT_ADDRRNGLO and DT_ADDRRNGHI use
+ the d_ptr field of the Elf*_Dyn structure. I.e. they contain pointers. */
+#define DT_ADDRRNGLO 0x6ffffe00
+#define DT_ADDRRNGHI 0x6ffffeff
+
+#define DT_VERSYM 0x6ffffff0
+#define DT_RELACOUNT 0x6ffffff9
+#define DT_RELCOUNT 0x6ffffffa
+#define DT_FLAGS_1 0x6ffffffb
+#define DT_VERDEF 0x6ffffffc
+#define DT_VERDEFNUM 0x6ffffffd
+#define DT_VERNEED 0x6ffffffe
+#define DT_VERNEEDNUM 0x6fffffff
+
+#define DT_MIPS_RLD_VERSION 0x70000001
+#define DT_MIPS_TIME_STAMP 0x70000002
+#define DT_MIPS_ICHECKSUM 0x70000003
+#define DT_MIPS_IVERSION 0x70000004
+#define DT_MIPS_FLAGS 0x70000005
+ #define RHF_NONE 0
+ #define RHF_HARDWAY 1
+ #define RHF_NOTPOT 2
+#define DT_MIPS_BASE_ADDRESS 0x70000006
+#define DT_MIPS_CONFLICT 0x70000008
+#define DT_MIPS_LIBLIST 0x70000009
+#define DT_MIPS_LOCAL_GOTNO 0x7000000a
+#define DT_MIPS_CONFLICTNO 0x7000000b
+#define DT_MIPS_LIBLISTNO 0x70000010
+#define DT_MIPS_SYMTABNO 0x70000011
+#define DT_MIPS_UNREFEXTNO 0x70000012
+#define DT_MIPS_GOTSYM 0x70000013
+#define DT_MIPS_HIPAGENO 0x70000014
+#define DT_MIPS_RLD_MAP 0x70000016
+
+/* This info is needed when parsing the symbol table */
+#define STB_LOCAL 0
+#define STB_GLOBAL 1
+#define STB_WEAK 2
+
+#define STT_NOTYPE 0
+#define STT_OBJECT 1
+#define STT_FUNC 2
+#define STT_SECTION 3
+#define STT_FILE 4
+
+#define ELF_ST_BIND(x) ((x) >> 4)
+#define ELF_ST_TYPE(x) (((unsigned int) x) & 0xf)
+#define ELF32_ST_BIND(x) ELF_ST_BIND(x)
+#define ELF32_ST_TYPE(x) ELF_ST_TYPE(x)
+#define ELF64_ST_BIND(x) ELF_ST_BIND(x)
+#define ELF64_ST_TYPE(x) ELF_ST_TYPE(x)
+
+/* Symbolic values for the entries in the auxiliary table
+ put on the initial stack */
+#define AT_NULL 0 /* end of vector */
+#define AT_IGNORE 1 /* entry should be ignored */
+#define AT_EXECFD 2 /* file descriptor of program */
+#define AT_PHDR 3 /* program headers for program */
+#define AT_PHENT 4 /* size of program header entry */
+#define AT_PHNUM 5 /* number of program headers */
+#define AT_PAGESZ 6 /* system page size */
+#define AT_BASE 7 /* base address of interpreter */
+#define AT_FLAGS 8 /* flags */
+#define AT_ENTRY 9 /* entry point of program */
+#define AT_NOTELF 10 /* program is not ELF */
+#define AT_UID 11 /* real uid */
+#define AT_EUID 12 /* effective uid */
+#define AT_GID 13 /* real gid */
+#define AT_EGID 14 /* effective gid */
+#define AT_PLATFORM 15 /* string identifying CPU for optimizations */
+#define AT_HWCAP 16 /* arch dependent hints at CPU capabilities */
+#define AT_CLKTCK 17 /* frequency at which times() increments */
+#define AT_FPUCW 18 /* info about fpu initialization by kernel */
+#define AT_DCACHEBSIZE 19 /* data cache block size */
+#define AT_ICACHEBSIZE 20 /* instruction cache block size */
+#define AT_UCACHEBSIZE 21 /* unified cache block size */
+#define AT_IGNOREPPC 22 /* ppc only; entry should be ignored */
+#define AT_SECURE 23 /* boolean, was exec suid-like? */
+#define AT_BASE_PLATFORM 24 /* string identifying real platforms */
+#define AT_RANDOM 25 /* address of 16 random bytes */
+#define AT_EXECFN 31 /* filename of the executable */
+#define AT_SYSINFO 32 /* address of kernel entry point */
+#define AT_SYSINFO_EHDR 33 /* address of kernel vdso */
+#define AT_L1I_CACHESHAPE 34 /* shapes of the caches: */
+#define AT_L1D_CACHESHAPE 35 /* bits 0-3: cache associativity. */
+#define AT_L2_CACHESHAPE 36 /* bits 4-7: log2 of line size. */
+#define AT_L3_CACHESHAPE 37 /* val&~255: cache size. */
+
+typedef struct dynamic{
+ Elf32_Sword d_tag;
+ union{
+ Elf32_Sword d_val;
+ Elf32_Addr d_ptr;
+ } d_un;
+} Elf32_Dyn;
+
+typedef struct {
+ Elf64_Sxword d_tag; /* entry tag value */
+ union {
+ Elf64_Xword d_val;
+ Elf64_Addr d_ptr;
+ } d_un;
+} Elf64_Dyn;
+
+/* The following are used with relocations */
+#define ELF32_R_SYM(x) ((x) >> 8)
+#define ELF32_R_TYPE(x) ((x) & 0xff)
+
+#define ELF64_R_SYM(i) ((i) >> 32)
+#define ELF64_R_TYPE(i) ((i) & 0xffffffff)
+#define ELF64_R_TYPE_DATA(i) (((ELF64_R_TYPE(i) >> 8) ^ 0x00800000) - 0x00800000)
+
+#define R_386_NONE 0
+#define R_386_32 1
+#define R_386_PC32 2
+#define R_386_GOT32 3
+#define R_386_PLT32 4
+#define R_386_COPY 5
+#define R_386_GLOB_DAT 6
+#define R_386_JMP_SLOT 7
+#define R_386_RELATIVE 8
+#define R_386_GOTOFF 9
+#define R_386_GOTPC 10
+#define R_386_NUM 11
+/* Not a dynamic reloc, so not included in R_386_NUM. Used in TCG. */
+#define R_386_PC8 23
+
+#define R_MIPS_NONE 0
+#define R_MIPS_16 1
+#define R_MIPS_32 2
+#define R_MIPS_REL32 3
+#define R_MIPS_26 4
+#define R_MIPS_HI16 5
+#define R_MIPS_LO16 6
+#define R_MIPS_GPREL16 7
+#define R_MIPS_LITERAL 8
+#define R_MIPS_GOT16 9
+#define R_MIPS_PC16 10
+#define R_MIPS_CALL16 11
+#define R_MIPS_GPREL32 12
+/* The remaining relocs are defined on Irix, although they are not
+ in the MIPS ELF ABI. */
+#define R_MIPS_UNUSED1 13
+#define R_MIPS_UNUSED2 14
+#define R_MIPS_UNUSED3 15
+#define R_MIPS_SHIFT5 16
+#define R_MIPS_SHIFT6 17
+#define R_MIPS_64 18
+#define R_MIPS_GOT_DISP 19
+#define R_MIPS_GOT_PAGE 20
+#define R_MIPS_GOT_OFST 21
+/*
+ * The following two relocation types are specified in the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_GOTHI16 22
+#define R_MIPS_GOTLO16 23
+#define R_MIPS_SUB 24
+#define R_MIPS_INSERT_A 25
+#define R_MIPS_INSERT_B 26
+#define R_MIPS_DELETE 27
+#define R_MIPS_HIGHER 28
+#define R_MIPS_HIGHEST 29
+/*
+ * The following two relocation types are specified in the MIPS ABI
+ * conformance guide version 1.2 but not yet in the psABI.
+ */
+#define R_MIPS_CALLHI16 30
+#define R_MIPS_CALLLO16 31
+/*
+ * This range is reserved for vendor specific relocations.
+ */
+#define R_MIPS_LOVENDOR 100
+#define R_MIPS_HIVENDOR 127
+
+
+/*
+ * Sparc ELF relocation types
+ */
+#define R_SPARC_NONE 0
+#define R_SPARC_8 1
+#define R_SPARC_16 2
+#define R_SPARC_32 3
+#define R_SPARC_DISP8 4
+#define R_SPARC_DISP16 5
+#define R_SPARC_DISP32 6
+#define R_SPARC_WDISP30 7
+#define R_SPARC_WDISP22 8
+#define R_SPARC_HI22 9
+#define R_SPARC_22 10
+#define R_SPARC_13 11
+#define R_SPARC_LO10 12
+#define R_SPARC_GOT10 13
+#define R_SPARC_GOT13 14
+#define R_SPARC_GOT22 15
+#define R_SPARC_PC10 16
+#define R_SPARC_PC22 17
+#define R_SPARC_WPLT30 18
+#define R_SPARC_COPY 19
+#define R_SPARC_GLOB_DAT 20
+#define R_SPARC_JMP_SLOT 21
+#define R_SPARC_RELATIVE 22
+#define R_SPARC_UA32 23
+#define R_SPARC_PLT32 24
+#define R_SPARC_HIPLT22 25
+#define R_SPARC_LOPLT10 26
+#define R_SPARC_PCPLT32 27
+#define R_SPARC_PCPLT22 28
+#define R_SPARC_PCPLT10 29
+#define R_SPARC_10 30
+#define R_SPARC_11 31
+#define R_SPARC_64 32
+#define R_SPARC_OLO10 33
+#define R_SPARC_HH22 34
+#define R_SPARC_HM10 35
+#define R_SPARC_LM22 36
+#define R_SPARC_WDISP16 40
+#define R_SPARC_WDISP19 41
+#define R_SPARC_7 43
+#define R_SPARC_5 44
+#define R_SPARC_6 45
+
+/* Bits present in AT_HWCAP, primarily for Sparc32. */
+
+#define HWCAP_SPARC_FLUSH 1 /* CPU supports flush instruction. */
+#define HWCAP_SPARC_STBAR 2
+#define HWCAP_SPARC_SWAP 4
+#define HWCAP_SPARC_MULDIV 8
+#define HWCAP_SPARC_V9 16
+#define HWCAP_SPARC_ULTRA3 32
+
+/*
+ * 68k ELF relocation types
+ */
+#define R_68K_NONE 0
+#define R_68K_32 1
+#define R_68K_16 2
+#define R_68K_8 3
+#define R_68K_PC32 4
+#define R_68K_PC16 5
+#define R_68K_PC8 6
+#define R_68K_GOT32 7
+#define R_68K_GOT16 8
+#define R_68K_GOT8 9
+#define R_68K_GOT32O 10
+#define R_68K_GOT16O 11
+#define R_68K_GOT8O 12
+#define R_68K_PLT32 13
+#define R_68K_PLT16 14
+#define R_68K_PLT8 15
+#define R_68K_PLT32O 16
+#define R_68K_PLT16O 17
+#define R_68K_PLT8O 18
+#define R_68K_COPY 19
+#define R_68K_GLOB_DAT 20
+#define R_68K_JMP_SLOT 21
+#define R_68K_RELATIVE 22
+
+/*
+ * Alpha ELF relocation types
+ */
+#define R_ALPHA_NONE 0 /* No reloc */
+#define R_ALPHA_REFLONG 1 /* Direct 32 bit */
+#define R_ALPHA_REFQUAD 2 /* Direct 64 bit */
+#define R_ALPHA_GPREL32 3 /* GP relative 32 bit */
+#define R_ALPHA_LITERAL 4 /* GP relative 16 bit w/optimization */
+#define R_ALPHA_LITUSE 5 /* Optimization hint for LITERAL */
+#define R_ALPHA_GPDISP 6 /* Add displacement to GP */
+#define R_ALPHA_BRADDR 7 /* PC+4 relative 23 bit shifted */
+#define R_ALPHA_HINT 8 /* PC+4 relative 16 bit shifted */
+#define R_ALPHA_SREL16 9 /* PC relative 16 bit */
+#define R_ALPHA_SREL32 10 /* PC relative 32 bit */
+#define R_ALPHA_SREL64 11 /* PC relative 64 bit */
+#define R_ALPHA_GPRELHIGH 17 /* GP relative 32 bit, high 16 bits */
+#define R_ALPHA_GPRELLOW 18 /* GP relative 32 bit, low 16 bits */
+#define R_ALPHA_GPREL16 19 /* GP relative 16 bit */
+#define R_ALPHA_COPY 24 /* Copy symbol at runtime */
+#define R_ALPHA_GLOB_DAT 25 /* Create GOT entry */
+#define R_ALPHA_JMP_SLOT 26 /* Create PLT entry */
+#define R_ALPHA_RELATIVE 27 /* Adjust by program base */
+#define R_ALPHA_BRSGP 28
+#define R_ALPHA_TLSGD 29
+#define R_ALPHA_TLS_LDM 30
+#define R_ALPHA_DTPMOD64 31
+#define R_ALPHA_GOTDTPREL 32
+#define R_ALPHA_DTPREL64 33
+#define R_ALPHA_DTPRELHI 34
+#define R_ALPHA_DTPRELLO 35
+#define R_ALPHA_DTPREL16 36
+#define R_ALPHA_GOTTPREL 37
+#define R_ALPHA_TPREL64 38
+#define R_ALPHA_TPRELHI 39
+#define R_ALPHA_TPRELLO 40
+#define R_ALPHA_TPREL16 41
+
+#define SHF_ALPHA_GPREL 0x10000000
+
+
+/* PowerPC relocations defined by the ABIs */
+#define R_PPC_NONE 0
+#define R_PPC_ADDR32 1 /* 32bit absolute address */
+#define R_PPC_ADDR24 2 /* 26bit address, 2 bits ignored. */
+#define R_PPC_ADDR16 3 /* 16bit absolute address */
+#define R_PPC_ADDR16_LO 4 /* lower 16bit of absolute address */
+#define R_PPC_ADDR16_HI 5 /* high 16bit of absolute address */
+#define R_PPC_ADDR16_HA 6 /* adjusted high 16bit */
+#define R_PPC_ADDR14 7 /* 16bit address, 2 bits ignored */
+#define R_PPC_ADDR14_BRTAKEN 8
+#define R_PPC_ADDR14_BRNTAKEN 9
+#define R_PPC_REL24 10 /* PC relative 26 bit */
+#define R_PPC_REL14 11 /* PC relative 16 bit */
+#define R_PPC_REL14_BRTAKEN 12
+#define R_PPC_REL14_BRNTAKEN 13
+#define R_PPC_GOT16 14
+#define R_PPC_GOT16_LO 15
+#define R_PPC_GOT16_HI 16
+#define R_PPC_GOT16_HA 17
+#define R_PPC_PLTREL24 18
+#define R_PPC_COPY 19
+#define R_PPC_GLOB_DAT 20
+#define R_PPC_JMP_SLOT 21
+#define R_PPC_RELATIVE 22
+#define R_PPC_LOCAL24PC 23
+#define R_PPC_UADDR32 24
+#define R_PPC_UADDR16 25
+#define R_PPC_REL32 26
+#define R_PPC_PLT32 27
+#define R_PPC_PLTREL32 28
+#define R_PPC_PLT16_LO 29
+#define R_PPC_PLT16_HI 30
+#define R_PPC_PLT16_HA 31
+#define R_PPC_SDAREL16 32
+#define R_PPC_SECTOFF 33
+#define R_PPC_SECTOFF_LO 34
+#define R_PPC_SECTOFF_HI 35
+#define R_PPC_SECTOFF_HA 36
+/* Keep this the last entry. */
+#ifndef R_PPC_NUM
+#define R_PPC_NUM 37
+#endif
+
+/* ARM specific declarations */
+
+/* Processor specific flags for the ELF header e_flags field. */
+#define EF_ARM_RELEXEC 0x01
+#define EF_ARM_HASENTRY 0x02
+#define EF_ARM_INTERWORK 0x04
+#define EF_ARM_APCS_26 0x08
+#define EF_ARM_APCS_FLOAT 0x10
+#define EF_ARM_PIC 0x20
+#define EF_ALIGN8 0x40 /* 8-bit structure alignment is in use */
+#define EF_NEW_ABI 0x80
+#define EF_OLD_ABI 0x100
+
+/* Additional symbol types for Thumb */
+#define STT_ARM_TFUNC 0xd
+
+/* ARM-specific values for sh_flags */
+#define SHF_ARM_ENTRYSECT 0x10000000 /* Section contains an entry point */
+#define SHF_ARM_COMDEF 0x80000000 /* Section may be multiply defined
+ in the input to a link step */
+
+/* ARM-specific program header flags */
+#define PF_ARM_SB 0x10000000 /* Segment contains the location
+ addressed by the static base */
+
+/* ARM relocs. */
+#define R_ARM_NONE 0 /* No reloc */
+#define R_ARM_PC24 1 /* PC relative 26 bit branch */
+#define R_ARM_ABS32 2 /* Direct 32 bit */
+#define R_ARM_REL32 3 /* PC relative 32 bit */
+#define R_ARM_PC13 4
+#define R_ARM_ABS16 5 /* Direct 16 bit */
+#define R_ARM_ABS12 6 /* Direct 12 bit */
+#define R_ARM_THM_ABS5 7
+#define R_ARM_ABS8 8 /* Direct 8 bit */
+#define R_ARM_SBREL32 9
+#define R_ARM_THM_PC22 10
+#define R_ARM_THM_PC8 11
+#define R_ARM_AMP_VCALL9 12
+#define R_ARM_SWI24 13
+#define R_ARM_THM_SWI8 14
+#define R_ARM_XPC25 15
+#define R_ARM_THM_XPC22 16
+#define R_ARM_COPY 20 /* Copy symbol at runtime */
+#define R_ARM_GLOB_DAT 21 /* Create GOT entry */
+#define R_ARM_JUMP_SLOT 22 /* Create PLT entry */
+#define R_ARM_RELATIVE 23 /* Adjust by program base */
+#define R_ARM_GOTOFF 24 /* 32 bit offset to GOT */
+#define R_ARM_GOTPC 25 /* 32 bit PC relative offset to GOT */
+#define R_ARM_GOT32 26 /* 32 bit GOT entry */
+#define R_ARM_PLT32 27 /* 32 bit PLT address */
+#define R_ARM_CALL 28
+#define R_ARM_JUMP24 29
+#define R_ARM_GNU_VTENTRY 100
+#define R_ARM_GNU_VTINHERIT 101
+#define R_ARM_THM_PC11 102 /* thumb unconditional branch */
+#define R_ARM_THM_PC9 103 /* thumb conditional branch */
+#define R_ARM_RXPC25 249
+#define R_ARM_RSBREL32 250
+#define R_ARM_THM_RPC22 251
+#define R_ARM_RREL32 252
+#define R_ARM_RABS22 253
+#define R_ARM_RPC24 254
+#define R_ARM_RBASE 255
+/* Keep this the last entry. */
+#define R_ARM_NUM 256
+
+/* s390 relocations defined by the ABIs */
+#define R_390_NONE 0 /* No reloc. */
+#define R_390_8 1 /* Direct 8 bit. */
+#define R_390_12 2 /* Direct 12 bit. */
+#define R_390_16 3 /* Direct 16 bit. */
+#define R_390_32 4 /* Direct 32 bit. */
+#define R_390_PC32 5 /* PC relative 32 bit. */
+#define R_390_GOT12 6 /* 12 bit GOT offset. */
+#define R_390_GOT32 7 /* 32 bit GOT offset. */
+#define R_390_PLT32 8 /* 32 bit PC relative PLT address. */
+#define R_390_COPY 9 /* Copy symbol at runtime. */
+#define R_390_GLOB_DAT 10 /* Create GOT entry. */
+#define R_390_JMP_SLOT 11 /* Create PLT entry. */
+#define R_390_RELATIVE 12 /* Adjust by program base. */
+#define R_390_GOTOFF32 13 /* 32 bit offset to GOT. */
+#define R_390_GOTPC 14 /* 32 bit PC rel. offset to GOT. */
+#define R_390_GOT16 15 /* 16 bit GOT offset. */
+#define R_390_PC16 16 /* PC relative 16 bit. */
+#define R_390_PC16DBL 17 /* PC relative 16 bit shifted by 1. */
+#define R_390_PLT16DBL 18 /* 16 bit PC rel. PLT shifted by 1. */
+#define R_390_PC32DBL 19 /* PC relative 32 bit shifted by 1. */
+#define R_390_PLT32DBL 20 /* 32 bit PC rel. PLT shifted by 1. */
+#define R_390_GOTPCDBL 21 /* 32 bit PC rel. GOT shifted by 1. */
+#define R_390_64 22 /* Direct 64 bit. */
+#define R_390_PC64 23 /* PC relative 64 bit. */
+#define R_390_GOT64 24 /* 64 bit GOT offset. */
+#define R_390_PLT64 25 /* 64 bit PC relative PLT address. */
+#define R_390_GOTENT 26 /* 32 bit PC rel. to GOT entry >> 1. */
+#define R_390_GOTOFF16 27 /* 16 bit offset to GOT. */
+#define R_390_GOTOFF64 28 /* 64 bit offset to GOT. */
+#define R_390_GOTPLT12 29 /* 12 bit offset to jump slot. */
+#define R_390_GOTPLT16 30 /* 16 bit offset to jump slot. */
+#define R_390_GOTPLT32 31 /* 32 bit offset to jump slot. */
+#define R_390_GOTPLT64 32 /* 64 bit offset to jump slot. */
+#define R_390_GOTPLTENT 33 /* 32 bit rel. offset to jump slot. */
+#define R_390_PLTOFF16 34 /* 16 bit offset from GOT to PLT. */
+#define R_390_PLTOFF32 35 /* 32 bit offset from GOT to PLT. */
+#define R_390_PLTOFF64 36 /* 16 bit offset from GOT to PLT. */
+#define R_390_TLS_LOAD 37 /* Tag for load insn in TLS code. */
+#define R_390_TLS_GDCALL 38 /* Tag for function call in general
+ dynamic TLS code. */
+#define R_390_TLS_LDCALL 39 /* Tag for function call in local
+ dynamic TLS code. */
+#define R_390_TLS_GD32 40 /* Direct 32 bit for general dynamic
+ thread local data. */
+#define R_390_TLS_GD64 41 /* Direct 64 bit for general dynamic
+ thread local data. */
+#define R_390_TLS_GOTIE12 42 /* 12 bit GOT offset for static TLS
+ block offset. */
+#define R_390_TLS_GOTIE32 43 /* 32 bit GOT offset for static TLS
+ block offset. */
+#define R_390_TLS_GOTIE64 44 /* 64 bit GOT offset for static TLS
+ block offset. */
+#define R_390_TLS_LDM32 45 /* Direct 32 bit for local dynamic
+ thread local data in LD code. */
+#define R_390_TLS_LDM64 46 /* Direct 64 bit for local dynamic
+ thread local data in LD code. */
+#define R_390_TLS_IE32 47 /* 32 bit address of GOT entry for
+ negated static TLS block offset. */
+#define R_390_TLS_IE64 48 /* 64 bit address of GOT entry for
+ negated static TLS block offset. */
+#define R_390_TLS_IEENT 49 /* 32 bit rel. offset to GOT entry for
+ negated static TLS block offset. */
+#define R_390_TLS_LE32 50 /* 32 bit negated offset relative to
+ static TLS block. */
+#define R_390_TLS_LE64 51 /* 64 bit negated offset relative to
+ static TLS block. */
+#define R_390_TLS_LDO32 52 /* 32 bit offset relative to TLS
+ block. */
+#define R_390_TLS_LDO64 53 /* 64 bit offset relative to TLS
+ block. */
+#define R_390_TLS_DTPMOD 54 /* ID of module containing symbol. */
+#define R_390_TLS_DTPOFF 55 /* Offset in TLS block. */
+#define R_390_TLS_TPOFF 56 /* Negate offset in static TLS
+ block. */
+/* Keep this the last entry. */
+#define R_390_NUM 57
+
+/* x86-64 relocation types */
+#define R_X86_64_NONE 0 /* No reloc */
+#define R_X86_64_64 1 /* Direct 64 bit */
+#define R_X86_64_PC32 2 /* PC relative 32 bit signed */
+#define R_X86_64_GOT32 3 /* 32 bit GOT entry */
+#define R_X86_64_PLT32 4 /* 32 bit PLT address */
+#define R_X86_64_COPY 5 /* Copy symbol at runtime */
+#define R_X86_64_GLOB_DAT 6 /* Create GOT entry */
+#define R_X86_64_JUMP_SLOT 7 /* Create PLT entry */
+#define R_X86_64_RELATIVE 8 /* Adjust by program base */
+#define R_X86_64_GOTPCREL 9 /* 32 bit signed pc relative
+ offset to GOT */
+#define R_X86_64_32 10 /* Direct 32 bit zero extended */
+#define R_X86_64_32S 11 /* Direct 32 bit sign extended */
+#define R_X86_64_16 12 /* Direct 16 bit zero extended */
+#define R_X86_64_PC16 13 /* 16 bit sign extended pc relative */
+#define R_X86_64_8 14 /* Direct 8 bit sign extended */
+#define R_X86_64_PC8 15 /* 8 bit sign extended pc relative */
+
+#define R_X86_64_NUM 16
+
+/* Legal values for e_flags field of Elf64_Ehdr. */
+
+#define EF_ALPHA_32BIT 1 /* All addresses are below 2GB */
+
+/* HPPA specific definitions. */
+
+/* Legal values for e_flags field of Elf32_Ehdr. */
+
+#define EF_PARISC_TRAPNIL 0x00010000 /* Trap nil pointer dereference. */
+#define EF_PARISC_EXT 0x00020000 /* Program uses arch. extensions. */
+#define EF_PARISC_LSB 0x00040000 /* Program expects little endian. */
+#define EF_PARISC_WIDE 0x00080000 /* Program expects wide mode. */
+#define EF_PARISC_NO_KABP 0x00100000 /* No kernel assisted branch
+ prediction. */
+#define EF_PARISC_LAZYSWAP 0x00400000 /* Allow lazy swapping. */
+#define EF_PARISC_ARCH 0x0000ffff /* Architecture version. */
+
+/* Defined values for `e_flags & EF_PARISC_ARCH' are: */
+
+#define EFA_PARISC_1_0 0x020b /* PA-RISC 1.0 big-endian. */
+#define EFA_PARISC_1_1 0x0210 /* PA-RISC 1.1 big-endian. */
+#define EFA_PARISC_2_0 0x0214 /* PA-RISC 2.0 big-endian. */
+
+/* Additional section indeces. */
+
+#define SHN_PARISC_ANSI_COMMON 0xff00 /* Section for tenatively declared
+ symbols in ANSI C. */
+#define SHN_PARISC_HUGE_COMMON 0xff01 /* Common blocks in huge model. */
+
+/* Legal values for sh_type field of Elf32_Shdr. */
+
+#define SHT_PARISC_EXT 0x70000000 /* Contains product specific ext. */
+#define SHT_PARISC_UNWIND 0x70000001 /* Unwind information. */
+#define SHT_PARISC_DOC 0x70000002 /* Debug info for optimized code. */
+
+/* Legal values for sh_flags field of Elf32_Shdr. */
+
+#define SHF_PARISC_SHORT 0x20000000 /* Section with short addressing. */
+#define SHF_PARISC_HUGE 0x40000000 /* Section far from gp. */
+#define SHF_PARISC_SBP 0x80000000 /* Static branch prediction code. */
+
+/* Legal values for ST_TYPE subfield of st_info (symbol type). */
+
+#define STT_PARISC_MILLICODE 13 /* Millicode function entry point. */
+
+#define STT_HP_OPAQUE (STT_LOOS + 0x1)
+#define STT_HP_STUB (STT_LOOS + 0x2)
+
+/* HPPA relocs. */
+
+#define R_PARISC_NONE 0 /* No reloc. */
+#define R_PARISC_DIR32 1 /* Direct 32-bit reference. */
+#define R_PARISC_DIR21L 2 /* Left 21 bits of eff. address. */
+#define R_PARISC_DIR17R 3 /* Right 17 bits of eff. address. */
+#define R_PARISC_DIR17F 4 /* 17 bits of eff. address. */
+#define R_PARISC_DIR14R 6 /* Right 14 bits of eff. address. */
+#define R_PARISC_PCREL32 9 /* 32-bit rel. address. */
+#define R_PARISC_PCREL21L 10 /* Left 21 bits of rel. address. */
+#define R_PARISC_PCREL17R 11 /* Right 17 bits of rel. address. */
+#define R_PARISC_PCREL17F 12 /* 17 bits of rel. address. */
+#define R_PARISC_PCREL14R 14 /* Right 14 bits of rel. address. */
+#define R_PARISC_DPREL21L 18 /* Left 21 bits of rel. address. */
+#define R_PARISC_DPREL14R 22 /* Right 14 bits of rel. address. */
+#define R_PARISC_GPREL21L 26 /* GP-relative, left 21 bits. */
+#define R_PARISC_GPREL14R 30 /* GP-relative, right 14 bits. */
+#define R_PARISC_LTOFF21L 34 /* LT-relative, left 21 bits. */
+#define R_PARISC_LTOFF14R 38 /* LT-relative, right 14 bits. */
+#define R_PARISC_SECREL32 41 /* 32 bits section rel. address. */
+#define R_PARISC_SEGBASE 48 /* No relocation, set segment base. */
+#define R_PARISC_SEGREL32 49 /* 32 bits segment rel. address. */
+#define R_PARISC_PLTOFF21L 50 /* PLT rel. address, left 21 bits. */
+#define R_PARISC_PLTOFF14R 54 /* PLT rel. address, right 14 bits. */
+#define R_PARISC_LTOFF_FPTR32 57 /* 32 bits LT-rel. function pointer. */
+#define R_PARISC_LTOFF_FPTR21L 58 /* LT-rel. fct ptr, left 21 bits. */
+#define R_PARISC_LTOFF_FPTR14R 62 /* LT-rel. fct ptr, right 14 bits. */
+#define R_PARISC_FPTR64 64 /* 64 bits function address. */
+#define R_PARISC_PLABEL32 65 /* 32 bits function address. */
+#define R_PARISC_PCREL64 72 /* 64 bits PC-rel. address. */
+#define R_PARISC_PCREL22F 74 /* 22 bits PC-rel. address. */
+#define R_PARISC_PCREL14WR 75 /* PC-rel. address, right 14 bits. */
+#define R_PARISC_PCREL14DR 76 /* PC rel. address, right 14 bits. */
+#define R_PARISC_PCREL16F 77 /* 16 bits PC-rel. address. */
+#define R_PARISC_PCREL16WF 78 /* 16 bits PC-rel. address. */
+#define R_PARISC_PCREL16DF 79 /* 16 bits PC-rel. address. */
+#define R_PARISC_DIR64 80 /* 64 bits of eff. address. */
+#define R_PARISC_DIR14WR 83 /* 14 bits of eff. address. */
+#define R_PARISC_DIR14DR 84 /* 14 bits of eff. address. */
+#define R_PARISC_DIR16F 85 /* 16 bits of eff. address. */
+#define R_PARISC_DIR16WF 86 /* 16 bits of eff. address. */
+#define R_PARISC_DIR16DF 87 /* 16 bits of eff. address. */
+#define R_PARISC_GPREL64 88 /* 64 bits of GP-rel. address. */
+#define R_PARISC_GPREL14WR 91 /* GP-rel. address, right 14 bits. */
+#define R_PARISC_GPREL14DR 92 /* GP-rel. address, right 14 bits. */
+#define R_PARISC_GPREL16F 93 /* 16 bits GP-rel. address. */
+#define R_PARISC_GPREL16WF 94 /* 16 bits GP-rel. address. */
+#define R_PARISC_GPREL16DF 95 /* 16 bits GP-rel. address. */
+#define R_PARISC_LTOFF64 96 /* 64 bits LT-rel. address. */
+#define R_PARISC_LTOFF14WR 99 /* LT-rel. address, right 14 bits. */
+#define R_PARISC_LTOFF14DR 100 /* LT-rel. address, right 14 bits. */
+#define R_PARISC_LTOFF16F 101 /* 16 bits LT-rel. address. */
+#define R_PARISC_LTOFF16WF 102 /* 16 bits LT-rel. address. */
+#define R_PARISC_LTOFF16DF 103 /* 16 bits LT-rel. address. */
+#define R_PARISC_SECREL64 104 /* 64 bits section rel. address. */
+#define R_PARISC_SEGREL64 112 /* 64 bits segment rel. address. */
+#define R_PARISC_PLTOFF14WR 115 /* PLT-rel. address, right 14 bits. */
+#define R_PARISC_PLTOFF14DR 116 /* PLT-rel. address, right 14 bits. */
+#define R_PARISC_PLTOFF16F 117 /* 16 bits LT-rel. address. */
+#define R_PARISC_PLTOFF16WF 118 /* 16 bits PLT-rel. address. */
+#define R_PARISC_PLTOFF16DF 119 /* 16 bits PLT-rel. address. */
+#define R_PARISC_LTOFF_FPTR64 120 /* 64 bits LT-rel. function ptr. */
+#define R_PARISC_LTOFF_FPTR14WR 123 /* LT-rel. fct. ptr., right 14 bits. */
+#define R_PARISC_LTOFF_FPTR14DR 124 /* LT-rel. fct. ptr., right 14 bits. */
+#define R_PARISC_LTOFF_FPTR16F 125 /* 16 bits LT-rel. function ptr. */
+#define R_PARISC_LTOFF_FPTR16WF 126 /* 16 bits LT-rel. function ptr. */
+#define R_PARISC_LTOFF_FPTR16DF 127 /* 16 bits LT-rel. function ptr. */
+#define R_PARISC_LORESERVE 128
+#define R_PARISC_COPY 128 /* Copy relocation. */
+#define R_PARISC_IPLT 129 /* Dynamic reloc, imported PLT */
+#define R_PARISC_EPLT 130 /* Dynamic reloc, exported PLT */
+#define R_PARISC_TPREL32 153 /* 32 bits TP-rel. address. */
+#define R_PARISC_TPREL21L 154 /* TP-rel. address, left 21 bits. */
+#define R_PARISC_TPREL14R 158 /* TP-rel. address, right 14 bits. */
+#define R_PARISC_LTOFF_TP21L 162 /* LT-TP-rel. address, left 21 bits. */
+#define R_PARISC_LTOFF_TP14R 166 /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP14F 167 /* 14 bits LT-TP-rel. address. */
+#define R_PARISC_TPREL64 216 /* 64 bits TP-rel. address. */
+#define R_PARISC_TPREL14WR 219 /* TP-rel. address, right 14 bits. */
+#define R_PARISC_TPREL14DR 220 /* TP-rel. address, right 14 bits. */
+#define R_PARISC_TPREL16F 221 /* 16 bits TP-rel. address. */
+#define R_PARISC_TPREL16WF 222 /* 16 bits TP-rel. address. */
+#define R_PARISC_TPREL16DF 223 /* 16 bits TP-rel. address. */
+#define R_PARISC_LTOFF_TP64 224 /* 64 bits LT-TP-rel. address. */
+#define R_PARISC_LTOFF_TP14WR 227 /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP14DR 228 /* LT-TP-rel. address, right 14 bits.*/
+#define R_PARISC_LTOFF_TP16F 229 /* 16 bits LT-TP-rel. address. */
+#define R_PARISC_LTOFF_TP16WF 230 /* 16 bits LT-TP-rel. address. */
+#define R_PARISC_LTOFF_TP16DF 231 /* 16 bits LT-TP-rel. address. */
+#define R_PARISC_HIRESERVE 255
+
+/* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr. */
+
+#define PT_HP_TLS (PT_LOOS + 0x0)
+#define PT_HP_CORE_NONE (PT_LOOS + 0x1)
+#define PT_HP_CORE_VERSION (PT_LOOS + 0x2)
+#define PT_HP_CORE_KERNEL (PT_LOOS + 0x3)
+#define PT_HP_CORE_COMM (PT_LOOS + 0x4)
+#define PT_HP_CORE_PROC (PT_LOOS + 0x5)
+#define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
+#define PT_HP_CORE_STACK (PT_LOOS + 0x7)
+#define PT_HP_CORE_SHM (PT_LOOS + 0x8)
+#define PT_HP_CORE_MMF (PT_LOOS + 0x9)
+#define PT_HP_PARALLEL (PT_LOOS + 0x10)
+#define PT_HP_FASTBIND (PT_LOOS + 0x11)
+#define PT_HP_OPT_ANNOT (PT_LOOS + 0x12)
+#define PT_HP_HSL_ANNOT (PT_LOOS + 0x13)
+#define PT_HP_STACK (PT_LOOS + 0x14)
+
+#define PT_PARISC_ARCHEXT 0x70000000
+#define PT_PARISC_UNWIND 0x70000001
+
+/* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr. */
+
+#define PF_PARISC_SBP 0x08000000
+
+#define PF_HP_PAGE_SIZE 0x00100000
+#define PF_HP_FAR_SHARED 0x00200000
+#define PF_HP_NEAR_SHARED 0x00400000
+#define PF_HP_CODE 0x01000000
+#define PF_HP_MODIFY 0x02000000
+#define PF_HP_LAZYSWAP 0x04000000
+#define PF_HP_SBP 0x08000000
+
+/* IA-64 specific declarations. */
+
+/* Processor specific flags for the Ehdr e_flags field. */
+#define EF_IA_64_MASKOS 0x0000000f /* os-specific flags */
+#define EF_IA_64_ABI64 0x00000010 /* 64-bit ABI */
+#define EF_IA_64_ARCH 0xff000000 /* arch. version mask */
+
+/* Processor specific values for the Phdr p_type field. */
+#define PT_IA_64_ARCHEXT (PT_LOPROC + 0) /* arch extension bits */
+#define PT_IA_64_UNWIND (PT_LOPROC + 1) /* ia64 unwind bits */
+
+/* Processor specific flags for the Phdr p_flags field. */
+#define PF_IA_64_NORECOV 0x80000000 /* spec insns w/o recovery */
+
+/* Processor specific values for the Shdr sh_type field. */
+#define SHT_IA_64_EXT (SHT_LOPROC + 0) /* extension bits */
+#define SHT_IA_64_UNWIND (SHT_LOPROC + 1) /* unwind bits */
+
+/* Processor specific flags for the Shdr sh_flags field. */
+#define SHF_IA_64_SHORT 0x10000000 /* section near gp */
+#define SHF_IA_64_NORECOV 0x20000000 /* spec insns w/o recovery */
+
+/* Processor specific values for the Dyn d_tag field. */
+#define DT_IA_64_PLT_RESERVE (DT_LOPROC + 0)
+#define DT_IA_64_NUM 1
+
+/* IA-64 relocations. */
+#define R_IA64_NONE 0x00 /* none */
+#define R_IA64_IMM14 0x21 /* symbol + addend, add imm14 */
+#define R_IA64_IMM22 0x22 /* symbol + addend, add imm22 */
+#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */
+#define R_IA64_DIR32MSB 0x24 /* symbol + addend, data4 MSB */
+#define R_IA64_DIR32LSB 0x25 /* symbol + addend, data4 LSB */
+#define R_IA64_DIR64MSB 0x26 /* symbol + addend, data8 MSB */
+#define R_IA64_DIR64LSB 0x27 /* symbol + addend, data8 LSB */
+#define R_IA64_GPREL22 0x2a /* @gprel(sym + add), add imm22 */
+#define R_IA64_GPREL64I 0x2b /* @gprel(sym + add), mov imm64 */
+#define R_IA64_GPREL32MSB 0x2c /* @gprel(sym + add), data4 MSB */
+#define R_IA64_GPREL32LSB 0x2d /* @gprel(sym + add), data4 LSB */
+#define R_IA64_GPREL64MSB 0x2e /* @gprel(sym + add), data8 MSB */
+#define R_IA64_GPREL64LSB 0x2f /* @gprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF22 0x32 /* @ltoff(sym + add), add imm22 */
+#define R_IA64_LTOFF64I 0x33 /* @ltoff(sym + add), mov imm64 */
+#define R_IA64_PLTOFF22 0x3a /* @pltoff(sym + add), add imm22 */
+#define R_IA64_PLTOFF64I 0x3b /* @pltoff(sym + add), mov imm64 */
+#define R_IA64_PLTOFF64MSB 0x3e /* @pltoff(sym + add), data8 MSB */
+#define R_IA64_PLTOFF64LSB 0x3f /* @pltoff(sym + add), data8 LSB */
+#define R_IA64_FPTR64I 0x43 /* @fptr(sym + add), mov imm64 */
+#define R_IA64_FPTR32MSB 0x44 /* @fptr(sym + add), data4 MSB */
+#define R_IA64_FPTR32LSB 0x45 /* @fptr(sym + add), data4 LSB */
+#define R_IA64_FPTR64MSB 0x46 /* @fptr(sym + add), data8 MSB */
+#define R_IA64_FPTR64LSB 0x47 /* @fptr(sym + add), data8 LSB */
+#define R_IA64_PCREL60B 0x48 /* @pcrel(sym + add), brl */
+#define R_IA64_PCREL21B 0x49 /* @pcrel(sym + add), ptb, call */
+#define R_IA64_PCREL21M 0x4a /* @pcrel(sym + add), chk.s */
+#define R_IA64_PCREL21F 0x4b /* @pcrel(sym + add), fchkf */
+#define R_IA64_PCREL32MSB 0x4c /* @pcrel(sym + add), data4 MSB */
+#define R_IA64_PCREL32LSB 0x4d /* @pcrel(sym + add), data4 LSB */
+#define R_IA64_PCREL64MSB 0x4e /* @pcrel(sym + add), data8 MSB */
+#define R_IA64_PCREL64LSB 0x4f /* @pcrel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_FPTR22 0x52 /* @ltoff(@fptr(s+a)), imm22 */
+#define R_IA64_LTOFF_FPTR64I 0x53 /* @ltoff(@fptr(s+a)), imm64 */
+#define R_IA64_LTOFF_FPTR32MSB 0x54 /* @ltoff(@fptr(s+a)), data4 MSB */
+#define R_IA64_LTOFF_FPTR32LSB 0x55 /* @ltoff(@fptr(s+a)), data4 LSB */
+#define R_IA64_LTOFF_FPTR64MSB 0x56 /* @ltoff(@fptr(s+a)), data8 MSB */
+#define R_IA64_LTOFF_FPTR64LSB 0x57 /* @ltoff(@fptr(s+a)), data8 LSB */
+#define R_IA64_SEGREL32MSB 0x5c /* @segrel(sym + add), data4 MSB */
+#define R_IA64_SEGREL32LSB 0x5d /* @segrel(sym + add), data4 LSB */
+#define R_IA64_SEGREL64MSB 0x5e /* @segrel(sym + add), data8 MSB */
+#define R_IA64_SEGREL64LSB 0x5f /* @segrel(sym + add), data8 LSB */
+#define R_IA64_SECREL32MSB 0x64 /* @secrel(sym + add), data4 MSB */
+#define R_IA64_SECREL32LSB 0x65 /* @secrel(sym + add), data4 LSB */
+#define R_IA64_SECREL64MSB 0x66 /* @secrel(sym + add), data8 MSB */
+#define R_IA64_SECREL64LSB 0x67 /* @secrel(sym + add), data8 LSB */
+#define R_IA64_REL32MSB 0x6c /* data 4 + REL */
+#define R_IA64_REL32LSB 0x6d /* data 4 + REL */
+#define R_IA64_REL64MSB 0x6e /* data 8 + REL */
+#define R_IA64_REL64LSB 0x6f /* data 8 + REL */
+#define R_IA64_LTV32MSB 0x74 /* symbol + addend, data4 MSB */
+#define R_IA64_LTV32LSB 0x75 /* symbol + addend, data4 LSB */
+#define R_IA64_LTV64MSB 0x76 /* symbol + addend, data8 MSB */
+#define R_IA64_LTV64LSB 0x77 /* symbol + addend, data8 LSB */
+#define R_IA64_PCREL21BI 0x79 /* @pcrel(sym + add), 21bit inst */
+#define R_IA64_PCREL22 0x7a /* @pcrel(sym + add), 22bit inst */
+#define R_IA64_PCREL64I 0x7b /* @pcrel(sym + add), 64bit inst */
+#define R_IA64_IPLTMSB 0x80 /* dynamic reloc, imported PLT, MSB */
+#define R_IA64_IPLTLSB 0x81 /* dynamic reloc, imported PLT, LSB */
+#define R_IA64_COPY 0x84 /* copy relocation */
+#define R_IA64_SUB 0x85 /* Addend and symbol difference */
+#define R_IA64_LTOFF22X 0x86 /* LTOFF22, relaxable. */
+#define R_IA64_LDXMOV 0x87 /* Use of LTOFF22X. */
+#define R_IA64_TPREL14 0x91 /* @tprel(sym + add), imm14 */
+#define R_IA64_TPREL22 0x92 /* @tprel(sym + add), imm22 */
+#define R_IA64_TPREL64I 0x93 /* @tprel(sym + add), imm64 */
+#define R_IA64_TPREL64MSB 0x96 /* @tprel(sym + add), data8 MSB */
+#define R_IA64_TPREL64LSB 0x97 /* @tprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_TPREL22 0x9a /* @ltoff(@tprel(s+a)), imm2 */
+#define R_IA64_DTPMOD64MSB 0xa6 /* @dtpmod(sym + add), data8 MSB */
+#define R_IA64_DTPMOD64LSB 0xa7 /* @dtpmod(sym + add), data8 LSB */
+#define R_IA64_LTOFF_DTPMOD22 0xaa /* @ltoff(@dtpmod(sym + add)), imm22 */
+#define R_IA64_DTPREL14 0xb1 /* @dtprel(sym + add), imm14 */
+#define R_IA64_DTPREL22 0xb2 /* @dtprel(sym + add), imm22 */
+#define R_IA64_DTPREL64I 0xb3 /* @dtprel(sym + add), imm64 */
+#define R_IA64_DTPREL32MSB 0xb4 /* @dtprel(sym + add), data4 MSB */
+#define R_IA64_DTPREL32LSB 0xb5 /* @dtprel(sym + add), data4 LSB */
+#define R_IA64_DTPREL64MSB 0xb6 /* @dtprel(sym + add), data8 MSB */
+#define R_IA64_DTPREL64LSB 0xb7 /* @dtprel(sym + add), data8 LSB */
+#define R_IA64_LTOFF_DTPREL22 0xba /* @ltoff(@dtprel(s+a)), imm22 */
+
+typedef struct elf32_rel {
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+} Elf32_Rel;
+
+typedef struct elf64_rel {
+ Elf64_Addr r_offset; /* Location at which to apply the action */
+ Elf64_Xword r_info; /* index and type of relocation */
+} Elf64_Rel;
+
+typedef struct elf32_rela{
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
+ Elf32_Sword r_addend;
+} Elf32_Rela;
+
+typedef struct elf64_rela {
+ Elf64_Addr r_offset; /* Location at which to apply the action */
+ Elf64_Xword r_info; /* index and type of relocation */
+ Elf64_Sxword r_addend; /* Constant addend used to compute value */
+} Elf64_Rela;
+
+typedef struct elf32_sym{
+ Elf32_Word st_name;
+ Elf32_Addr st_value;
+ Elf32_Word st_size;
+ unsigned char st_info;
+ unsigned char st_other;
+ Elf32_Half st_shndx;
+} Elf32_Sym;
+
+typedef struct elf64_sym {
+ Elf64_Word st_name; /* Symbol name, index in string tbl */
+ unsigned char st_info; /* Type and binding attributes */
+ unsigned char st_other; /* No defined meaning, 0 */
+ Elf64_Half st_shndx; /* Associated section index */
+ Elf64_Addr st_value; /* Value of the symbol */
+ Elf64_Xword st_size; /* Associated symbol size */
+} Elf64_Sym;
+
+
+#define EI_NIDENT 16
+
+typedef struct elf32_hdr{
+ unsigned char e_ident[EI_NIDENT];
+ Elf32_Half e_type;
+ Elf32_Half e_machine;
+ Elf32_Word e_version;
+ Elf32_Addr e_entry; /* Entry point */
+ Elf32_Off e_phoff;
+ Elf32_Off e_shoff;
+ Elf32_Word e_flags;
+ Elf32_Half e_ehsize;
+ Elf32_Half e_phentsize;
+ Elf32_Half e_phnum;
+ Elf32_Half e_shentsize;
+ Elf32_Half e_shnum;
+ Elf32_Half e_shstrndx;
+} Elf32_Ehdr;
+
+typedef struct elf64_hdr {
+ unsigned char e_ident[16]; /* ELF "magic number" */
+ Elf64_Half e_type;
+ Elf64_Half e_machine;
+ Elf64_Word e_version;
+ Elf64_Addr e_entry; /* Entry point virtual address */
+ Elf64_Off e_phoff; /* Program header table file offset */
+ Elf64_Off e_shoff; /* Section header table file offset */
+ Elf64_Word e_flags;
+ Elf64_Half e_ehsize;
+ Elf64_Half e_phentsize;
+ Elf64_Half e_phnum;
+ Elf64_Half e_shentsize;
+ Elf64_Half e_shnum;
+ Elf64_Half e_shstrndx;
+} Elf64_Ehdr;
+
+/* These constants define the permissions on sections in the program
+ header, p_flags. */
+#define PF_R 0x4
+#define PF_W 0x2
+#define PF_X 0x1
+
+typedef struct elf32_phdr{
+ Elf32_Word p_type;
+ Elf32_Off p_offset;
+ Elf32_Addr p_vaddr;
+ Elf32_Addr p_paddr;
+ Elf32_Word p_filesz;
+ Elf32_Word p_memsz;
+ Elf32_Word p_flags;
+ Elf32_Word p_align;
+} Elf32_Phdr;
+
+typedef struct elf64_phdr {
+ Elf64_Word p_type;
+ Elf64_Word p_flags;
+ Elf64_Off p_offset; /* Segment file offset */
+ Elf64_Addr p_vaddr; /* Segment virtual address */
+ Elf64_Addr p_paddr; /* Segment physical address */
+ Elf64_Xword p_filesz; /* Segment size in file */
+ Elf64_Xword p_memsz; /* Segment size in memory */
+ Elf64_Xword p_align; /* Segment alignment, file & memory */
+} Elf64_Phdr;
+
+/* sh_type */
+#define SHT_NULL 0
+#define SHT_PROGBITS 1
+#define SHT_SYMTAB 2
+#define SHT_STRTAB 3
+#define SHT_RELA 4
+#define SHT_HASH 5
+#define SHT_DYNAMIC 6
+#define SHT_NOTE 7
+#define SHT_NOBITS 8
+#define SHT_REL 9
+#define SHT_SHLIB 10
+#define SHT_DYNSYM 11
+#define SHT_NUM 12
+#define SHT_LOPROC 0x70000000
+#define SHT_HIPROC 0x7fffffff
+#define SHT_LOUSER 0x80000000
+#define SHT_HIUSER 0xffffffff
+#define SHT_MIPS_LIST 0x70000000
+#define SHT_MIPS_CONFLICT 0x70000002
+#define SHT_MIPS_GPTAB 0x70000003
+#define SHT_MIPS_UCODE 0x70000004
+
+/* sh_flags */
+#define SHF_WRITE 0x1
+#define SHF_ALLOC 0x2
+#define SHF_EXECINSTR 0x4
+#define SHF_MASKPROC 0xf0000000
+#define SHF_MIPS_GPREL 0x10000000
+
+/* special section indexes */
+#define SHN_UNDEF 0
+#define SHN_LORESERVE 0xff00
+#define SHN_LOPROC 0xff00
+#define SHN_HIPROC 0xff1f
+#define SHN_ABS 0xfff1
+#define SHN_COMMON 0xfff2
+#define SHN_HIRESERVE 0xffff
+#define SHN_MIPS_ACCOMON 0xff00
+
+typedef struct elf32_shdr {
+ Elf32_Word sh_name;
+ Elf32_Word sh_type;
+ Elf32_Word sh_flags;
+ Elf32_Addr sh_addr;
+ Elf32_Off sh_offset;
+ Elf32_Word sh_size;
+ Elf32_Word sh_link;
+ Elf32_Word sh_info;
+ Elf32_Word sh_addralign;
+ Elf32_Word sh_entsize;
+} Elf32_Shdr;
+
+typedef struct elf64_shdr {
+ Elf64_Word sh_name; /* Section name, index in string tbl */
+ Elf64_Word sh_type; /* Type of section */
+ Elf64_Xword sh_flags; /* Miscellaneous section attributes */
+ Elf64_Addr sh_addr; /* Section virtual addr at execution */
+ Elf64_Off sh_offset; /* Section file offset */
+ Elf64_Xword sh_size; /* Size of section in bytes */
+ Elf64_Word sh_link; /* Index of another section */
+ Elf64_Word sh_info; /* Additional section information */
+ Elf64_Xword sh_addralign; /* Section alignment */
+ Elf64_Xword sh_entsize; /* Entry size if section holds table */
+} Elf64_Shdr;
+
+#define EI_MAG0 0 /* e_ident[] indexes */
+#define EI_MAG1 1
+#define EI_MAG2 2
+#define EI_MAG3 3
+#define EI_CLASS 4
+#define EI_DATA 5
+#define EI_VERSION 6
+#define EI_OSABI 7
+#define EI_PAD 8
+
+#define ELFOSABI_NONE 0 /* UNIX System V ABI */
+#define ELFOSABI_SYSV 0 /* Alias. */
+#define ELFOSABI_HPUX 1 /* HP-UX */
+#define ELFOSABI_NETBSD 2 /* NetBSD. */
+#define ELFOSABI_LINUX 3 /* Linux. */
+#define ELFOSABI_SOLARIS 6 /* Sun Solaris. */
+#define ELFOSABI_AIX 7 /* IBM AIX. */
+#define ELFOSABI_IRIX 8 /* SGI Irix. */
+#define ELFOSABI_FREEBSD 9 /* FreeBSD. */
+#define ELFOSABI_TRU64 10 /* Compaq TRU64 UNIX. */
+#define ELFOSABI_MODESTO 11 /* Novell Modesto. */
+#define ELFOSABI_OPENBSD 12 /* OpenBSD. */
+#define ELFOSABI_ARM 97 /* ARM */
+#define ELFOSABI_STANDALONE 255 /* Standalone (embedded) application */
+
+#define ELFMAG0 0x7f /* EI_MAG */
+#define ELFMAG1 'E'
+#define ELFMAG2 'L'
+#define ELFMAG3 'F'
+#define ELFMAG "\177ELF"
+#define SELFMAG 4
+
+#define ELFCLASSNONE 0 /* EI_CLASS */
+#define ELFCLASS32 1
+#define ELFCLASS64 2
+#define ELFCLASSNUM 3
+
+#define ELFDATANONE 0 /* e_ident[EI_DATA] */
+#define ELFDATA2LSB 1
+#define ELFDATA2MSB 2
+
+#define EV_NONE 0 /* e_version, EI_VERSION */
+#define EV_CURRENT 1
+#define EV_NUM 2
+
+/* Notes used in ET_CORE */
+#define NT_PRSTATUS 1
+#define NT_PRFPREG 2
+#define NT_PRPSINFO 3
+#define NT_TASKSTRUCT 4
+#define NT_AUXV 6
+#define NT_PRXFPREG 0x46e62b7f /* copied from gdb5.1/include/elf/common.h */
+
+
+/* Note header in a PT_NOTE section */
+typedef struct elf32_note {
+ Elf32_Word n_namesz; /* Name size */
+ Elf32_Word n_descsz; /* Content size */
+ Elf32_Word n_type; /* Content type */
+} Elf32_Nhdr;
+
+/* Note header in a PT_NOTE section */
+typedef struct elf64_note {
+ Elf64_Word n_namesz; /* Name size */
+ Elf64_Word n_descsz; /* Content size */
+ Elf64_Word n_type; /* Content type */
+} Elf64_Nhdr;
+
+
+/* This data structure represents a PT_LOAD segment. */
+struct elf32_fdpic_loadseg {
+ /* Core address to which the segment is mapped. */
+ Elf32_Addr addr;
+ /* VMA recorded in the program header. */
+ Elf32_Addr p_vaddr;
+ /* Size of this segment in memory. */
+ Elf32_Word p_memsz;
+};
+struct elf32_fdpic_loadmap {
+ /* Protocol version number, must be zero. */
+ Elf32_Half version;
+ /* Number of segments in this map. */
+ Elf32_Half nsegs;
+ /* The actual memory map. */
+ struct elf32_fdpic_loadseg segs[/*nsegs*/];
+};
+
+#ifdef ELF_CLASS
+#if ELF_CLASS == ELFCLASS32
+
+#define elfhdr elf32_hdr
+#define elf_phdr elf32_phdr
+#define elf_note elf32_note
+#define elf_shdr elf32_shdr
+#define elf_sym elf32_sym
+#define elf_addr_t Elf32_Off
+
+#ifdef ELF_USES_RELOCA
+# define ELF_RELOC Elf32_Rela
+#else
+# define ELF_RELOC Elf32_Rel
+#endif
+
+#else
+
+#define elfhdr elf64_hdr
+#define elf_phdr elf64_phdr
+#define elf_note elf64_note
+#define elf_shdr elf64_shdr
+#define elf_sym elf64_sym
+#define elf_addr_t Elf64_Off
+
+#ifdef ELF_USES_RELOCA
+# define ELF_RELOC Elf64_Rela
+#else
+# define ELF_RELOC Elf64_Rel
+#endif
+
+#endif /* ELF_CLASS */
+
+#ifndef ElfW
+# if ELF_CLASS == ELFCLASS32
+# define ElfW(x) Elf32_ ## x
+# define ELFW(x) ELF32_ ## x
+# else
+# define ElfW(x) Elf64_ ## x
+# define ELFW(x) ELF64_ ## x
+# endif
+#endif
+
+#endif /* ELF_CLASS */
+
+
+#endif /* _QEMU_ELF_H */
diff --git a/qemu-0.15.x/envlist.c b/qemu-0.15.x/envlist.c
new file mode 100644
index 0000000..f2303cd
--- /dev/null
+++ b/qemu-0.15.x/envlist.c
@@ -0,0 +1,246 @@
+#include <assert.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "qemu-queue.h"
+#include "envlist.h"
+
+struct envlist_entry {
+ const char *ev_var; /* actual env value */
+ QLIST_ENTRY(envlist_entry) ev_link;
+};
+
+struct envlist {
+ QLIST_HEAD(, envlist_entry) el_entries; /* actual entries */
+ size_t el_count; /* number of entries */
+};
+
+static int envlist_parse(envlist_t *envlist,
+ const char *env, int (*)(envlist_t *, const char *));
+
+/*
+ * Allocates new envlist and returns pointer to that or
+ * NULL in case of error.
+ */
+envlist_t *
+envlist_create(void)
+{
+ envlist_t *envlist;
+
+ if ((envlist = malloc(sizeof (*envlist))) == NULL)
+ return (NULL);
+
+ QLIST_INIT(&envlist->el_entries);
+ envlist->el_count = 0;
+
+ return (envlist);
+}
+
+/*
+ * Releases given envlist and its entries.
+ */
+void
+envlist_free(envlist_t *envlist)
+{
+ struct envlist_entry *entry;
+
+ assert(envlist != NULL);
+
+ while (envlist->el_entries.lh_first != NULL) {
+ entry = envlist->el_entries.lh_first;
+ QLIST_REMOVE(entry, ev_link);
+
+ free((char *)entry->ev_var);
+ free(entry);
+ }
+ free(envlist);
+}
+
+/*
+ * Parses comma separated list of set/modify environment
+ * variable entries and updates given enlist accordingly.
+ *
+ * For example:
+ * envlist_parse(el, "HOME=foo,SHELL=/bin/sh");
+ *
+ * inserts/sets environment variables HOME and SHELL.
+ *
+ * Returns 0 on success, errno otherwise.
+ */
+int
+envlist_parse_set(envlist_t *envlist, const char *env)
+{
+ return (envlist_parse(envlist, env, &envlist_setenv));
+}
+
+/*
+ * Parses comma separated list of unset environment variable
+ * entries and removes given variables from given envlist.
+ *
+ * Returns 0 on success, errno otherwise.
+ */
+int
+envlist_parse_unset(envlist_t *envlist, const char *env)
+{
+ return (envlist_parse(envlist, env, &envlist_unsetenv));
+}
+
+/*
+ * Parses comma separated list of set, modify or unset entries
+ * and calls given callback for each entry.
+ *
+ * Returns 0 in case of success, errno otherwise.
+ */
+static int
+envlist_parse(envlist_t *envlist, const char *env,
+ int (*callback)(envlist_t *, const char *))
+{
+ char *tmpenv, *envvar;
+ char *envsave = NULL;
+
+ assert(callback != NULL);
+
+ if ((envlist == NULL) || (env == NULL))
+ return (EINVAL);
+
+ /*
+ * We need to make temporary copy of the env string
+ * as strtok_r(3) modifies it while it tokenizes.
+ */
+ if ((tmpenv = strdup(env)) == NULL)
+ return (errno);
+
+ envvar = strtok_r(tmpenv, ",", &envsave);
+ while (envvar != NULL) {
+ if ((*callback)(envlist, envvar) != 0) {
+ free(tmpenv);
+ return (errno);
+ }
+ envvar = strtok_r(NULL, ",", &envsave);
+ }
+
+ free(tmpenv);
+ return (0);
+}
+
+/*
+ * Sets environment value to envlist in similar manner
+ * than putenv(3).
+ *
+ * Returns 0 in success, errno otherwise.
+ */
+int
+envlist_setenv(envlist_t *envlist, const char *env)
+{
+ struct envlist_entry *entry = NULL;
+ const char *eq_sign;
+ size_t envname_len;
+
+ if ((envlist == NULL) || (env == NULL))
+ return (EINVAL);
+
+ /* find out first equals sign in given env */
+ if ((eq_sign = strchr(env, '=')) == NULL)
+ return (EINVAL);
+ envname_len = eq_sign - env + 1;
+
+ /*
+ * If there already exists variable with given name
+ * we remove and release it before allocating a whole
+ * new entry.
+ */
+ for (entry = envlist->el_entries.lh_first; entry != NULL;
+ entry = entry->ev_link.le_next) {
+ if (strncmp(entry->ev_var, env, envname_len) == 0)
+ break;
+ }
+
+ if (entry != NULL) {
+ QLIST_REMOVE(entry, ev_link);
+ free((char *)entry->ev_var);
+ free(entry);
+ } else {
+ envlist->el_count++;
+ }
+
+ if ((entry = malloc(sizeof (*entry))) == NULL)
+ return (errno);
+ if ((entry->ev_var = strdup(env)) == NULL) {
+ free(entry);
+ return (errno);
+ }
+ QLIST_INSERT_HEAD(&envlist->el_entries, entry, ev_link);
+
+ return (0);
+}
+
+/*
+ * Removes given env value from envlist in similar manner
+ * than unsetenv(3). Returns 0 in success, errno otherwise.
+ */
+int
+envlist_unsetenv(envlist_t *envlist, const char *env)
+{
+ struct envlist_entry *entry;
+ size_t envname_len;
+
+ if ((envlist == NULL) || (env == NULL))
+ return (EINVAL);
+
+ /* env is not allowed to contain '=' */
+ if (strchr(env, '=') != NULL)
+ return (EINVAL);
+
+ /*
+ * Find out the requested entry and remove
+ * it from the list.
+ */
+ envname_len = strlen(env);
+ for (entry = envlist->el_entries.lh_first; entry != NULL;
+ entry = entry->ev_link.le_next) {
+ if (strncmp(entry->ev_var, env, envname_len) == 0)
+ break;
+ }
+ if (entry != NULL) {
+ QLIST_REMOVE(entry, ev_link);
+ free((char *)entry->ev_var);
+ free(entry);
+
+ envlist->el_count--;
+ }
+ return (0);
+}
+
+/*
+ * Returns given envlist as array of strings (in same form that
+ * global variable environ is). Caller must free returned memory
+ * by calling free(3) for each element and for the array. Returned
+ * array and given envlist are not related (no common references).
+ *
+ * If caller provides count pointer, number of items in array is
+ * stored there. In case of error, NULL is returned and no memory
+ * is allocated.
+ */
+char **
+envlist_to_environ(const envlist_t *envlist, size_t *count)
+{
+ struct envlist_entry *entry;
+ char **env, **penv;
+
+ penv = env = malloc((envlist->el_count + 1) * sizeof (char *));
+ if (env == NULL)
+ return (NULL);
+
+ for (entry = envlist->el_entries.lh_first; entry != NULL;
+ entry = entry->ev_link.le_next) {
+ *(penv++) = strdup(entry->ev_var);
+ }
+ *penv = NULL; /* NULL terminate the list */
+
+ if (count != NULL)
+ *count = envlist->el_count;
+
+ return (env);
+}
diff --git a/qemu-0.15.x/envlist.h b/qemu-0.15.x/envlist.h
new file mode 100644
index 0000000..b9addcc
--- /dev/null
+++ b/qemu-0.15.x/envlist.h
@@ -0,0 +1,22 @@
+#ifndef ENVLIST_H
+#define ENVLIST_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct envlist envlist_t;
+
+envlist_t *envlist_create(void);
+void envlist_free(envlist_t *);
+int envlist_setenv(envlist_t *, const char *);
+int envlist_unsetenv(envlist_t *, const char *);
+int envlist_parse_set(envlist_t *, const char *);
+int envlist_parse_unset(envlist_t *, const char *);
+char **envlist_to_environ(const envlist_t *, size_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ENVLIST_H */
diff --git a/qemu-0.15.x/error.c b/qemu-0.15.x/error.c
new file mode 100644
index 0000000..74d7398
--- /dev/null
+++ b/qemu-0.15.x/error.c
@@ -0,0 +1,141 @@
+/*
+ * QEMU Error Objects
+ *
+ * Copyright IBM, Corp. 2011
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2. See
+ * the COPYING.LIB file in the top-level directory.
+ */
+
+#include "qemu-common.h"
+#include "error.h"
+#include "error_int.h"
+#include "qemu-objects.h"
+#include "qerror.h"
+
+struct Error
+{
+ QDict *obj;
+ const char *fmt;
+ char *msg;
+};
+
+void error_set(Error **errp, const char *fmt, ...)
+{
+ Error *err;
+ va_list ap;
+
+ if (errp == NULL) {
+ return;
+ }
+
+ err = qemu_mallocz(sizeof(*err));
+
+ va_start(ap, fmt);
+ err->obj = qobject_to_qdict(qobject_from_jsonv(fmt, &ap));
+ va_end(ap);
+ err->fmt = fmt;
+
+ *errp = err;
+}
+
+bool error_is_set(Error **errp)
+{
+ return (errp && *errp);
+}
+
+const char *error_get_pretty(Error *err)
+{
+ if (err->msg == NULL) {
+ QString *str;
+ str = qerror_format(err->fmt, err->obj);
+ err->msg = qemu_strdup(qstring_get_str(str));
+ QDECREF(str);
+ }
+
+ return err->msg;
+}
+
+const char *error_get_field(Error *err, const char *field)
+{
+ if (strcmp(field, "class") == 0) {
+ return qdict_get_str(err->obj, field);
+ } else {
+ QDict *dict = qdict_get_qdict(err->obj, "data");
+ return qdict_get_str(dict, field);
+ }
+}
+
+QDict *error_get_data(Error *err)
+{
+ QDict *data = qdict_get_qdict(err->obj, "data");
+ QINCREF(data);
+ return data;
+}
+
+void error_set_field(Error *err, const char *field, const char *value)
+{
+ QDict *dict = qdict_get_qdict(err->obj, "data");
+ return qdict_put(dict, field, qstring_from_str(value));
+}
+
+void error_free(Error *err)
+{
+ if (err) {
+ QDECREF(err->obj);
+ qemu_free(err->msg);
+ qemu_free(err);
+ }
+}
+
+bool error_is_type(Error *err, const char *fmt)
+{
+ const char *error_class;
+ char *ptr;
+ char *end;
+
+ ptr = strstr(fmt, "'class': '");
+ assert(ptr != NULL);
+ ptr += strlen("'class': '");
+
+ end = strchr(ptr, '\'');
+ assert(end != NULL);
+
+ error_class = error_get_field(err, "class");
+ if (strlen(error_class) != end - ptr) {
+ return false;
+ }
+
+ return strncmp(ptr, error_class, end - ptr) == 0;
+}
+
+void error_propagate(Error **dst_err, Error *local_err)
+{
+ if (dst_err) {
+ *dst_err = local_err;
+ } else if (local_err) {
+ error_free(local_err);
+ }
+}
+
+QObject *error_get_qobject(Error *err)
+{
+ QINCREF(err->obj);
+ return QOBJECT(err->obj);
+}
+
+void error_set_qobject(Error **errp, QObject *obj)
+{
+ Error *err;
+ if (errp == NULL) {
+ return;
+ }
+ err = qemu_mallocz(sizeof(*err));
+ err->obj = qobject_to_qdict(obj);
+ qobject_incref(obj);
+
+ *errp = err;
+}
diff --git a/qemu-0.15.x/error.h b/qemu-0.15.x/error.h
new file mode 100644
index 0000000..6361f40
--- /dev/null
+++ b/qemu-0.15.x/error.h
@@ -0,0 +1,70 @@
+/*
+ * QEMU Error Objects
+ *
+ * Copyright IBM, Corp. 2011
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2. See
+ * the COPYING.LIB file in the top-level directory.
+ */
+#ifndef ERROR_H
+#define ERROR_H
+
+#include "compiler.h"
+#include <stdbool.h>
+
+/**
+ * A class representing internal errors within QEMU. An error has a string
+ * typename and optionally a set of named string parameters.
+ */
+typedef struct Error Error;
+
+/**
+ * Set an indirect pointer to an error given a printf-style format parameter.
+ * Currently, qerror.h defines these error formats. This function is not
+ * meant to be used outside of QEMU.
+ */
+void error_set(Error **err, const char *fmt, ...) GCC_FMT_ATTR(2, 3);
+
+/**
+ * Returns true if an indirect pointer to an error is pointing to a valid
+ * error object.
+ */
+bool error_is_set(Error **err);
+
+/**
+ * Get a human readable representation of an error object.
+ */
+const char *error_get_pretty(Error *err);
+
+/**
+ * Get an individual named error field.
+ */
+const char *error_get_field(Error *err, const char *field);
+
+/**
+ * Get an individual named error field.
+ */
+void error_set_field(Error *err, const char *field, const char *value);
+
+/**
+ * Propagate an error to an indirect pointer to an error. This function will
+ * always transfer ownership of the error reference and handles the case where
+ * dst_err is NULL correctly.
+ */
+void error_propagate(Error **dst_err, Error *local_err);
+
+/**
+ * Free an error object.
+ */
+void error_free(Error *err);
+
+/**
+ * Determine if an error is of a speific type (based on the qerror format).
+ * Non-QEMU users should get the `class' field to identify the error type.
+ */
+bool error_is_type(Error *err, const char *fmt);
+
+#endif
diff --git a/qemu-0.15.x/error_int.h b/qemu-0.15.x/error_int.h
new file mode 100644
index 0000000..5e39424
--- /dev/null
+++ b/qemu-0.15.x/error_int.h
@@ -0,0 +1,29 @@
+/*
+ * QEMU Error Objects
+ *
+ * Copyright IBM, Corp. 2011
+ *
+ * Authors:
+ * Anthony Liguori <aliguori(a)us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU LGPL, version 2. See
+ * the COPYING.LIB file in the top-level directory.
+ */
+#ifndef QEMU_ERROR_INT_H
+#define QEMU_ERROR_INT_H
+
+#include "qemu-common.h"
+#include "qobject.h"
+#include "qdict.h"
+#include "error.h"
+
+/**
+ * Internal QEMU functions for working with Error.
+ *
+ * These are used to convert QErrors to Errors
+ */
+QDict *error_get_data(Error *err);
+QObject *error_get_qobject(Error *err);
+void error_set_qobject(Error **errp, QObject *obj);
+
+#endif
diff --git a/qemu-0.15.x/exec-all.h b/qemu-0.15.x/exec-all.h
new file mode 100644
index 0000000..9b8d62c
--- /dev/null
+++ b/qemu-0.15.x/exec-all.h
@@ -0,0 +1,347 @@
+/*
+ * internal execution defines for qemu
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _EXEC_ALL_H_
+#define _EXEC_ALL_H_
+
+#include "qemu-common.h"
+
+/* allow to see translation results - the slowdown should be negligible, so we leave it */
+#define DEBUG_DISAS
+
+/* Page tracking code uses ram addresses in system mode, and virtual
+ addresses in userspace mode. Define tb_page_addr_t to be an appropriate
+ type. */
+#if defined(CONFIG_USER_ONLY)
+typedef abi_ulong tb_page_addr_t;
+#else
+typedef ram_addr_t tb_page_addr_t;
+#endif
+
+/* is_jmp field values */
+#define DISAS_NEXT 0 /* next instruction can be analyzed */
+#define DISAS_JUMP 1 /* only pc was modified dynamically */
+#define DISAS_UPDATE 2 /* cpu state was modified dynamically */
+#define DISAS_TB_JUMP 3 /* only pc was modified statically */
+
+struct TranslationBlock;
+typedef struct TranslationBlock TranslationBlock;
+
+/* XXX: make safe guess about sizes */
+#define MAX_OP_PER_INSTR 208
+
+#if HOST_LONG_BITS == 32
+#define MAX_OPC_PARAM_PER_ARG 2
+#else
+#define MAX_OPC_PARAM_PER_ARG 1
+#endif
+#define MAX_OPC_PARAM_IARGS 4
+#define MAX_OPC_PARAM_OARGS 1
+#define MAX_OPC_PARAM_ARGS (MAX_OPC_PARAM_IARGS + MAX_OPC_PARAM_OARGS)
+
+/* A Call op needs up to 4 + 2N parameters on 32-bit archs,
+ * and up to 4 + N parameters on 64-bit archs
+ * (N = number of input arguments + output arguments). */
+#define MAX_OPC_PARAM (4 + (MAX_OPC_PARAM_PER_ARG * MAX_OPC_PARAM_ARGS))
+#define OPC_BUF_SIZE 640
+#define OPC_MAX_SIZE (OPC_BUF_SIZE - MAX_OP_PER_INSTR)
+
+/* Maximum size a TCG op can expand to. This is complicated because a
+ single op may require several host instructions and register reloads.
+ For now take a wild guess at 192 bytes, which should allow at least
+ a couple of fixup instructions per argument. */
+#define TCG_MAX_OP_SIZE 192
+
+#define OPPARAM_BUF_SIZE (OPC_BUF_SIZE * MAX_OPC_PARAM)
+
+extern target_ulong gen_opc_pc[OPC_BUF_SIZE];
+extern uint8_t gen_opc_instr_start[OPC_BUF_SIZE];
+extern uint16_t gen_opc_icount[OPC_BUF_SIZE];
+
+#include "qemu-log.h"
+
+void gen_intermediate_code(CPUState *env, struct TranslationBlock *tb);
+void gen_intermediate_code_pc(CPUState *env, struct TranslationBlock *tb);
+void restore_state_to_opc(CPUState *env, struct TranslationBlock *tb,
+ int pc_pos);
+
+void cpu_gen_init(void);
+int cpu_gen_code(CPUState *env, struct TranslationBlock *tb,
+ int *gen_code_size_ptr);
+int cpu_restore_state(struct TranslationBlock *tb,
+ CPUState *env, unsigned long searched_pc);
+void cpu_resume_from_signal(CPUState *env1, void *puc);
+void cpu_io_recompile(CPUState *env, void *retaddr);
+TranslationBlock *tb_gen_code(CPUState *env,
+ target_ulong pc, target_ulong cs_base, int flags,
+ int cflags);
+void cpu_exec_init(CPUState *env);
+void QEMU_NORETURN cpu_loop_exit(CPUState *env1);
+int page_unprotect(target_ulong address, unsigned long pc, void *puc);
+void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
+ int is_cpu_write_access);
+void tlb_flush_page(CPUState *env, target_ulong addr);
+void tlb_flush(CPUState *env, int flush_global);
+#if !defined(CONFIG_USER_ONLY)
+void tlb_set_page(CPUState *env, target_ulong vaddr,
+ target_phys_addr_t paddr, int prot,
+ int mmu_idx, target_ulong size);
+#endif
+
+#define CODE_GEN_ALIGN 16 /* must be >= of the size of a icache line */
+
+#define CODE_GEN_PHYS_HASH_BITS 15
+#define CODE_GEN_PHYS_HASH_SIZE (1 << CODE_GEN_PHYS_HASH_BITS)
+
+#define MIN_CODE_GEN_BUFFER_SIZE (1024 * 1024)
+
+/* estimated block size for TB allocation */
+/* XXX: use a per code average code fragment size and modulate it
+ according to the host CPU */
+#if defined(CONFIG_SOFTMMU)
+#define CODE_GEN_AVG_BLOCK_SIZE 128
+#else
+#define CODE_GEN_AVG_BLOCK_SIZE 64
+#endif
+
+#if defined(_ARCH_PPC) || defined(__x86_64__) || defined(__arm__) || defined(__i386__)
+#define USE_DIRECT_JUMP
+#endif
+
+struct TranslationBlock {
+ target_ulong pc; /* simulated PC corresponding to this block (EIP + CS base) */
+ target_ulong cs_base; /* CS base for this block */
+ uint64_t flags; /* flags defining in which context the code was generated */
+ uint16_t size; /* size of target code for this block (1 <=
+ size <= TARGET_PAGE_SIZE) */
+ uint16_t cflags; /* compile flags */
+#define CF_COUNT_MASK 0x7fff
+#define CF_LAST_IO 0x8000 /* Last insn may be an IO access. */
+
+ uint8_t *tc_ptr; /* pointer to the translated code */
+ /* next matching tb for physical address. */
+ struct TranslationBlock *phys_hash_next;
+ /* first and second physical page containing code. The lower bit
+ of the pointer tells the index in page_next[] */
+ struct TranslationBlock *page_next[2];
+ tb_page_addr_t page_addr[2];
+
+ /* the following data are used to directly call another TB from
+ the code of this one. */
+ uint16_t tb_next_offset[2]; /* offset of original jump target */
+#ifdef USE_DIRECT_JUMP
+ uint16_t tb_jmp_offset[2]; /* offset of jump instruction */
+#else
+ unsigned long tb_next[2]; /* address of jump generated code */
+#endif
+ /* list of TBs jumping to this one. This is a circular list using
+ the two least significant bits of the pointers to tell what is
+ the next pointer: 0 = jmp_next[0], 1 = jmp_next[1], 2 =
+ jmp_first */
+ struct TranslationBlock *jmp_next[2];
+ struct TranslationBlock *jmp_first;
+ uint32_t icount;
+};
+
+static inline unsigned int tb_jmp_cache_hash_page(target_ulong pc)
+{
+ target_ulong tmp;
+ tmp = pc ^ (pc >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS));
+ return (tmp >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)) & TB_JMP_PAGE_MASK;
+}
+
+static inline unsigned int tb_jmp_cache_hash_func(target_ulong pc)
+{
+ target_ulong tmp;
+ tmp = pc ^ (pc >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS));
+ return (((tmp >> (TARGET_PAGE_BITS - TB_JMP_PAGE_BITS)) & TB_JMP_PAGE_MASK)
+ | (tmp & TB_JMP_ADDR_MASK));
+}
+
+static inline unsigned int tb_phys_hash_func(tb_page_addr_t pc)
+{
+ return (pc >> 2) & (CODE_GEN_PHYS_HASH_SIZE - 1);
+}
+
+void tb_free(TranslationBlock *tb);
+void tb_flush(CPUState *env);
+void tb_link_page(TranslationBlock *tb,
+ tb_page_addr_t phys_pc, tb_page_addr_t phys_page2);
+void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr);
+
+extern TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE];
+
+#if defined(USE_DIRECT_JUMP)
+
+#if defined(_ARCH_PPC)
+void ppc_tb_set_jmp_target(unsigned long jmp_addr, unsigned long addr);
+#define tb_set_jmp_target1 ppc_tb_set_jmp_target
+#elif defined(__i386__) || defined(__x86_64__)
+static inline void tb_set_jmp_target1(unsigned long jmp_addr, unsigned long addr)
+{
+ /* patch the branch destination */
+ *(uint32_t *)jmp_addr = addr - (jmp_addr + 4);
+ /* no need to flush icache explicitly */
+}
+#elif defined(__arm__)
+static inline void tb_set_jmp_target1(unsigned long jmp_addr, unsigned long addr)
+{
+#if !QEMU_GNUC_PREREQ(4, 1)
+ register unsigned long _beg __asm ("a1");
+ register unsigned long _end __asm ("a2");
+ register unsigned long _flg __asm ("a3");
+#endif
+
+ /* we could use a ldr pc, [pc, #-4] kind of branch and avoid the flush */
+ *(uint32_t *)jmp_addr =
+ (*(uint32_t *)jmp_addr & ~0xffffff)
+ | (((addr - (jmp_addr + 8)) >> 2) & 0xffffff);
+
+#if QEMU_GNUC_PREREQ(4, 1)
+ __builtin___clear_cache((char *) jmp_addr, (char *) jmp_addr + 4);
+#else
+ /* flush icache */
+ _beg = jmp_addr;
+ _end = jmp_addr + 4;
+ _flg = 0;
+ __asm __volatile__ ("swi 0x9f0002" : : "r" (_beg), "r" (_end), "r" (_flg));
+#endif
+}
+#endif
+
+static inline void tb_set_jmp_target(TranslationBlock *tb,
+ int n, unsigned long addr)
+{
+ unsigned long offset;
+
+ offset = tb->tb_jmp_offset[n];
+ tb_set_jmp_target1((unsigned long)(tb->tc_ptr + offset), addr);
+}
+
+#else
+
+/* set the jump target */
+static inline void tb_set_jmp_target(TranslationBlock *tb,
+ int n, unsigned long addr)
+{
+ tb->tb_next[n] = addr;
+}
+
+#endif
+
+static inline void tb_add_jump(TranslationBlock *tb, int n,
+ TranslationBlock *tb_next)
+{
+ /* NOTE: this test is only needed for thread safety */
+ if (!tb->jmp_next[n]) {
+ /* patch the native jump address */
+ tb_set_jmp_target(tb, n, (unsigned long)tb_next->tc_ptr);
+
+ /* add in TB jmp circular list */
+ tb->jmp_next[n] = tb_next->jmp_first;
+ tb_next->jmp_first = (TranslationBlock *)((long)(tb) | (n));
+ }
+}
+
+TranslationBlock *tb_find_pc(unsigned long pc_ptr);
+
+#include "qemu-lock.h"
+
+extern spinlock_t tb_lock;
+
+extern int tb_invalidated_flag;
+
+#if !defined(CONFIG_USER_ONLY)
+
+extern CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4];
+extern CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4];
+extern void *io_mem_opaque[IO_MEM_NB_ENTRIES];
+
+void tlb_fill(target_ulong addr, int is_write, int mmu_idx,
+ void *retaddr);
+
+#include "softmmu_defs.h"
+
+#define ACCESS_TYPE (NB_MMU_MODES + 1)
+#define MEMSUFFIX _code
+#define env cpu_single_env
+
+#define DATA_SIZE 1
+#include "softmmu_header.h"
+
+#define DATA_SIZE 2
+#include "softmmu_header.h"
+
+#define DATA_SIZE 4
+#include "softmmu_header.h"
+
+#define DATA_SIZE 8
+#include "softmmu_header.h"
+
+#undef ACCESS_TYPE
+#undef MEMSUFFIX
+#undef env
+
+#endif
+
+#if defined(CONFIG_USER_ONLY)
+static inline tb_page_addr_t get_page_addr_code(CPUState *env1, target_ulong addr)
+{
+ return addr;
+}
+#else
+/* NOTE: this function can trigger an exception */
+/* NOTE2: the returned address is not exactly the physical address: it
+ is the offset relative to phys_ram_base */
+static inline tb_page_addr_t get_page_addr_code(CPUState *env1, target_ulong addr)
+{
+ int mmu_idx, page_index, pd;
+ void *p;
+
+ page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+ mmu_idx = cpu_mmu_index(env1);
+ if (unlikely(env1->tlb_table[mmu_idx][page_index].addr_code !=
+ (addr & TARGET_PAGE_MASK))) {
+ ldub_code(addr);
+ }
+ pd = env1->tlb_table[mmu_idx][page_index].addr_code & ~TARGET_PAGE_MASK;
+ if (pd > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
+#if defined(TARGET_ALPHA) || defined(TARGET_MIPS) || defined(TARGET_SPARC)
+ cpu_unassigned_access(env1, addr, 0, 1, 0, 4);
+#else
+ cpu_abort(env1, "Trying to execute code outside RAM or ROM at 0x" TARGET_FMT_lx "\n", addr);
+#endif
+ }
+ p = (void *)(unsigned long)addr
+ + env1->tlb_table[mmu_idx][page_index].addend;
+ return qemu_ram_addr_from_host_nofail(p);
+}
+#endif
+
+typedef void (CPUDebugExcpHandler)(CPUState *env);
+
+CPUDebugExcpHandler *cpu_set_debug_excp_handler(CPUDebugExcpHandler *handler);
+
+/* vl.c */
+extern int singlestep;
+
+/* cpu-exec.c */
+extern volatile sig_atomic_t exit_request;
+
+#endif
diff --git a/qemu-0.15.x/exec.c b/qemu-0.15.x/exec.c
new file mode 100644
index 0000000..2160ded
--- /dev/null
+++ b/qemu-0.15.x/exec.c
@@ -0,0 +1,4748 @@
+/*
+ * virtual page mapping and translated block handling
+ *
+ * Copyright (c) 2003 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+#include "config.h"
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/mman.h>
+#endif
+
+#include "qemu-common.h"
+#include "cpu.h"
+#include "tcg.h"
+#include "hw/hw.h"
+#include "hw/qdev.h"
+#include "osdep.h"
+#include "kvm.h"
+#include "hw/xen.h"
+#include "qemu-timer.h"
+#if defined(CONFIG_USER_ONLY)
+#include <qemu.h>
+#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#include <sys/param.h>
+#if __FreeBSD_version >= 700104
+#define HAVE_KINFO_GETVMMAP
+#define sigqueue sigqueue_freebsd /* avoid redefinition */
+#include <sys/time.h>
+#include <sys/proc.h>
+#include <machine/profile.h>
+#define _KERNEL
+#include <sys/user.h>
+#undef _KERNEL
+#undef sigqueue
+#include <libutil.h>
+#endif
+#endif
+#else /* !CONFIG_USER_ONLY */
+#include "xen-mapcache.h"
+#include "trace.h"
+#endif
+
+//#define DEBUG_TB_INVALIDATE
+//#define DEBUG_FLUSH
+//#define DEBUG_TLB
+//#define DEBUG_UNASSIGNED
+
+/* make various TB consistency checks */
+//#define DEBUG_TB_CHECK
+//#define DEBUG_TLB_CHECK
+
+//#define DEBUG_IOPORT
+//#define DEBUG_SUBPAGE
+
+#if !defined(CONFIG_USER_ONLY)
+/* TB consistency checks only implemented for usermode emulation. */
+#undef DEBUG_TB_CHECK
+#endif
+
+#define SMC_BITMAP_USE_THRESHOLD 10
+
+static TranslationBlock *tbs;
+static int code_gen_max_blocks;
+TranslationBlock *tb_phys_hash[CODE_GEN_PHYS_HASH_SIZE];
+static int nb_tbs;
+/* any access to the tbs or the page table must use this lock */
+spinlock_t tb_lock = SPIN_LOCK_UNLOCKED;
+
+#if defined(__arm__) || defined(__sparc_v9__)
+/* The prologue must be reachable with a direct jump. ARM and Sparc64
+ have limited branch ranges (possibly also PPC) so place it in a
+ section close to code segment. */
+#define code_gen_section \
+ __attribute__((__section__(".gen_code"))) \
+ __attribute__((aligned (32)))
+#elif defined(_WIN32)
+/* Maximum alignment for Win32 is 16. */
+#define code_gen_section \
+ __attribute__((aligned (16)))
+#else
+#define code_gen_section \
+ __attribute__((aligned (32)))
+#endif
+
+uint8_t code_gen_prologue[1024] code_gen_section;
+static uint8_t *code_gen_buffer;
+static unsigned long code_gen_buffer_size;
+/* threshold to flush the translated code buffer */
+static unsigned long code_gen_buffer_max_size;
+static uint8_t *code_gen_ptr;
+
+#if !defined(CONFIG_USER_ONLY)
+int phys_ram_fd;
+static int in_migration;
+
+RAMList ram_list = { .blocks = QLIST_HEAD_INITIALIZER(ram_list) };
+#endif
+
+CPUState *first_cpu;
+/* current CPU in the current thread. It is only valid inside
+ cpu_exec() */
+CPUState *cpu_single_env;
+/* 0 = Do not count executed instructions.
+ 1 = Precise instruction counting.
+ 2 = Adaptive rate instruction counting. */
+int use_icount = 0;
+/* Current instruction counter. While executing translated code this may
+ include some instructions that have not yet been executed. */
+int64_t qemu_icount;
+
+typedef struct PageDesc {
+ /* list of TBs intersecting this ram page */
+ TranslationBlock *first_tb;
+ /* in order to optimize self modifying code, we count the number
+ of lookups we do to a given page to use a bitmap */
+ unsigned int code_write_count;
+ uint8_t *code_bitmap;
+#if defined(CONFIG_USER_ONLY)
+ unsigned long flags;
+#endif
+} PageDesc;
+
+/* In system mode we want L1_MAP to be based on ram offsets,
+ while in user mode we want it to be based on virtual addresses. */
+#if !defined(CONFIG_USER_ONLY)
+#if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS
+# define L1_MAP_ADDR_SPACE_BITS HOST_LONG_BITS
+#else
+# define L1_MAP_ADDR_SPACE_BITS TARGET_PHYS_ADDR_SPACE_BITS
+#endif
+#else
+# define L1_MAP_ADDR_SPACE_BITS TARGET_VIRT_ADDR_SPACE_BITS
+#endif
+
+/* Size of the L2 (and L3, etc) page tables. */
+#define L2_BITS 10
+#define L2_SIZE (1 << L2_BITS)
+
+/* The bits remaining after N lower levels of page tables. */
+#define P_L1_BITS_REM \
+ ((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
+#define V_L1_BITS_REM \
+ ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
+
+/* Size of the L1 page table. Avoid silly small sizes. */
+#if P_L1_BITS_REM < 4
+#define P_L1_BITS (P_L1_BITS_REM + L2_BITS)
+#else
+#define P_L1_BITS P_L1_BITS_REM
+#endif
+
+#if V_L1_BITS_REM < 4
+#define V_L1_BITS (V_L1_BITS_REM + L2_BITS)
+#else
+#define V_L1_BITS V_L1_BITS_REM
+#endif
+
+#define P_L1_SIZE ((target_phys_addr_t)1 << P_L1_BITS)
+#define V_L1_SIZE ((target_ulong)1 << V_L1_BITS)
+
+#define P_L1_SHIFT (TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - P_L1_BITS)
+#define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS)
+
+unsigned long qemu_real_host_page_size;
+unsigned long qemu_host_page_bits;
+unsigned long qemu_host_page_size;
+unsigned long qemu_host_page_mask;
+
+/* This is a multi-level map on the virtual address space.
+ The bottom level has pointers to PageDesc. */
+static void *l1_map[V_L1_SIZE];
+
+#if !defined(CONFIG_USER_ONLY)
+typedef struct PhysPageDesc {
+ /* offset in host memory of the page + io_index in the low bits */
+ ram_addr_t phys_offset;
+ ram_addr_t region_offset;
+} PhysPageDesc;
+
+/* This is a multi-level map on the physical address space.
+ The bottom level has pointers to PhysPageDesc. */
+static void *l1_phys_map[P_L1_SIZE];
+
+static void io_mem_init(void);
+
+/* io memory support */
+CPUWriteMemoryFunc *io_mem_write[IO_MEM_NB_ENTRIES][4];
+CPUReadMemoryFunc *io_mem_read[IO_MEM_NB_ENTRIES][4];
+void *io_mem_opaque[IO_MEM_NB_ENTRIES];
+static char io_mem_used[IO_MEM_NB_ENTRIES];
+static int io_mem_watch;
+#endif
+
+/* log support */
+#ifdef WIN32
+static const char *logfilename = "qemu.log";
+#else
+static const char *logfilename = "/tmp/qemu.log";
+#endif
+FILE *logfile;
+int loglevel;
+static int log_append = 0;
+
+/* statistics */
+#if !defined(CONFIG_USER_ONLY)
+static int tlb_flush_count;
+#endif
+static int tb_flush_count;
+static int tb_phys_invalidate_count;
+
+#ifdef _WIN32
+static void map_exec(void *addr, long size)
+{
+ DWORD old_protect;
+ VirtualProtect(addr, size,
+ PAGE_EXECUTE_READWRITE, &old_protect);
+
+}
+#else
+static void map_exec(void *addr, long size)
+{
+ unsigned long start, end, page_size;
+
+ page_size = getpagesize();
+ start = (unsigned long)addr;
+ start &= ~(page_size - 1);
+
+ end = (unsigned long)addr + size;
+ end += page_size - 1;
+ end &= ~(page_size - 1);
+
+ mprotect((void *)start, end - start,
+ PROT_READ | PROT_WRITE | PROT_EXEC);
+}
+#endif
+
+static void page_init(void)
+{
+ /* NOTE: we can always suppose that qemu_host_page_size >=
+ TARGET_PAGE_SIZE */
+#ifdef _WIN32
+ {
+ SYSTEM_INFO system_info;
+
+ GetSystemInfo(&system_info);
+ qemu_real_host_page_size = system_info.dwPageSize;
+ }
+#else
+ qemu_real_host_page_size = getpagesize();
+#endif
+ if (qemu_host_page_size == 0)
+ qemu_host_page_size = qemu_real_host_page_size;
+ if (qemu_host_page_size < TARGET_PAGE_SIZE)
+ qemu_host_page_size = TARGET_PAGE_SIZE;
+ qemu_host_page_bits = 0;
+ while ((1 << qemu_host_page_bits) < qemu_host_page_size)
+ qemu_host_page_bits++;
+ qemu_host_page_mask = ~(qemu_host_page_size - 1);
+
+#if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
+ {
+#ifdef HAVE_KINFO_GETVMMAP
+ struct kinfo_vmentry *freep;
+ int i, cnt;
+
+ freep = kinfo_getvmmap(getpid(), &cnt);
+ if (freep) {
+ mmap_lock();
+ for (i = 0; i < cnt; i++) {
+ unsigned long startaddr, endaddr;
+
+ startaddr = freep[i].kve_start;
+ endaddr = freep[i].kve_end;
+ if (h2g_valid(startaddr)) {
+ startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
+
+ if (h2g_valid(endaddr)) {
+ endaddr = h2g(endaddr);
+ page_set_flags(startaddr, endaddr, PAGE_RESERVED);
+ } else {
+#if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS
+ endaddr = ~0ul;
+ page_set_flags(startaddr, endaddr, PAGE_RESERVED);
+#endif
+ }
+ }
+ }
+ free(freep);
+ mmap_unlock();
+ }
+#else
+ FILE *f;
+
+ last_brk = (unsigned long)sbrk(0);
+
+ f = fopen("/compat/linux/proc/self/maps", "r");
+ if (f) {
+ mmap_lock();
+
+ do {
+ unsigned long startaddr, endaddr;
+ int n;
+
+ n = fscanf (f, "%lx-%lx %*[^\n]\n", &startaddr, &endaddr);
+
+ if (n == 2 && h2g_valid(startaddr)) {
+ startaddr = h2g(startaddr) & TARGET_PAGE_MASK;
+
+ if (h2g_valid(endaddr)) {
+ endaddr = h2g(endaddr);
+ } else {
+ endaddr = ~0ul;
+ }
+ page_set_flags(startaddr, endaddr, PAGE_RESERVED);
+ }
+ } while (!feof(f));
+
+ fclose(f);
+ mmap_unlock();
+ }
+#endif
+ }
+#endif
+}
+
+static PageDesc *page_find_alloc(tb_page_addr_t index, int alloc)
+{
+ PageDesc *pd;
+ void **lp;
+ int i;
+
+#if defined(CONFIG_USER_ONLY)
+ /* We can't use qemu_malloc because it may recurse into a locked mutex. */
+# define ALLOC(P, SIZE) \
+ do { \
+ P = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, \
+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); \
+ } while (0)
+#else
+# define ALLOC(P, SIZE) \
+ do { P = qemu_mallocz(SIZE); } while (0)
+#endif
+
+ /* Level 1. Always allocated. */
+ lp = l1_map + ((index >> V_L1_SHIFT) & (V_L1_SIZE - 1));
+
+ /* Level 2..N-1. */
+ for (i = V_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
+ void **p = *lp;
+
+ if (p == NULL) {
+ if (!alloc) {
+ return NULL;
+ }
+ ALLOC(p, sizeof(void *) * L2_SIZE);
+ *lp = p;
+ }
+
+ lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1));
+ }
+
+ pd = *lp;
+ if (pd == NULL) {
+ if (!alloc) {
+ return NULL;
+ }
+ ALLOC(pd, sizeof(PageDesc) * L2_SIZE);
+ *lp = pd;
+ }
+
+#undef ALLOC
+
+ return pd + (index & (L2_SIZE - 1));
+}
+
+static inline PageDesc *page_find(tb_page_addr_t index)
+{
+ return page_find_alloc(index, 0);
+}
+
+#if !defined(CONFIG_USER_ONLY)
+static PhysPageDesc *phys_page_find_alloc(target_phys_addr_t index, int alloc)
+{
+ PhysPageDesc *pd;
+ void **lp;
+ int i;
+
+ /* Level 1. Always allocated. */
+ lp = l1_phys_map + ((index >> P_L1_SHIFT) & (P_L1_SIZE - 1));
+
+ /* Level 2..N-1. */
+ for (i = P_L1_SHIFT / L2_BITS - 1; i > 0; i--) {
+ void **p = *lp;
+ if (p == NULL) {
+ if (!alloc) {
+ return NULL;
+ }
+ *lp = p = qemu_mallocz(sizeof(void *) * L2_SIZE);
+ }
+ lp = p + ((index >> (i * L2_BITS)) & (L2_SIZE - 1));
+ }
+
+ pd = *lp;
+ if (pd == NULL) {
+ int i;
+
+ if (!alloc) {
+ return NULL;
+ }
+
+ *lp = pd = qemu_malloc(sizeof(PhysPageDesc) * L2_SIZE);
+
+ for (i = 0; i < L2_SIZE; i++) {
+ pd[i].phys_offset = IO_MEM_UNASSIGNED;
+ pd[i].region_offset = (index + i) << TARGET_PAGE_BITS;
+ }
+ }
+
+ return pd + (index & (L2_SIZE - 1));
+}
+
+static inline PhysPageDesc *phys_page_find(target_phys_addr_t index)
+{
+ return phys_page_find_alloc(index, 0);
+}
+
+static void tlb_protect_code(ram_addr_t ram_addr);
+static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
+ target_ulong vaddr);
+#define mmap_lock() do { } while(0)
+#define mmap_unlock() do { } while(0)
+#endif
+
+#define DEFAULT_CODE_GEN_BUFFER_SIZE (32 * 1024 * 1024)
+
+#if defined(CONFIG_USER_ONLY)
+/* Currently it is not recommended to allocate big chunks of data in
+ user mode. It will change when a dedicated libc will be used */
+#define USE_STATIC_CODE_GEN_BUFFER
+#endif
+
+#ifdef USE_STATIC_CODE_GEN_BUFFER
+static uint8_t static_code_gen_buffer[DEFAULT_CODE_GEN_BUFFER_SIZE]
+ __attribute__((aligned (CODE_GEN_ALIGN)));
+#endif
+
+static void code_gen_alloc(unsigned long tb_size)
+{
+#ifdef USE_STATIC_CODE_GEN_BUFFER
+ code_gen_buffer = static_code_gen_buffer;
+ code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
+ map_exec(code_gen_buffer, code_gen_buffer_size);
+#else
+ code_gen_buffer_size = tb_size;
+ if (code_gen_buffer_size == 0) {
+#if defined(CONFIG_USER_ONLY)
+ /* in user mode, phys_ram_size is not meaningful */
+ code_gen_buffer_size = DEFAULT_CODE_GEN_BUFFER_SIZE;
+#else
+ /* XXX: needs adjustments */
+ code_gen_buffer_size = (unsigned long)(ram_size / 4);
+#endif
+ }
+ if (code_gen_buffer_size < MIN_CODE_GEN_BUFFER_SIZE)
+ code_gen_buffer_size = MIN_CODE_GEN_BUFFER_SIZE;
+ /* The code gen buffer location may have constraints depending on
+ the host cpu and OS */
+#if defined(__linux__)
+ {
+ int flags;
+ void *start = NULL;
+
+ flags = MAP_PRIVATE | MAP_ANONYMOUS;
+#if defined(__x86_64__)
+ flags |= MAP_32BIT;
+ /* Cannot map more than that */
+ if (code_gen_buffer_size > (800 * 1024 * 1024))
+ code_gen_buffer_size = (800 * 1024 * 1024);
+#elif defined(__sparc_v9__)
+ // Map the buffer below 2G, so we can use direct calls and branches
+ flags |= MAP_FIXED;
+ start = (void *) 0x60000000UL;
+ if (code_gen_buffer_size > (512 * 1024 * 1024))
+ code_gen_buffer_size = (512 * 1024 * 1024);
+#elif defined(__arm__)
+ /* Map the buffer below 32M, so we can use direct calls and branches */
+ flags |= MAP_FIXED;
+ start = (void *) 0x01000000UL;
+ if (code_gen_buffer_size > 16 * 1024 * 1024)
+ code_gen_buffer_size = 16 * 1024 * 1024;
+#elif defined(__s390x__)
+ /* Map the buffer so that we can use direct calls and branches. */
+ /* We have a +- 4GB range on the branches; leave some slop. */
+ if (code_gen_buffer_size > (3ul * 1024 * 1024 * 1024)) {
+ code_gen_buffer_size = 3ul * 1024 * 1024 * 1024;
+ }
+ start = (void *)0x90000000UL;
+#endif
+ code_gen_buffer = mmap(start, code_gen_buffer_size,
+ PROT_WRITE | PROT_READ | PROT_EXEC,
+ flags, -1, 0);
+ if (code_gen_buffer == MAP_FAILED) {
+ fprintf(stderr, "Could not allocate dynamic translator buffer\n");
+ exit(1);
+ }
+ }
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
+ || defined(__DragonFly__) || defined(__OpenBSD__)
+ {
+ int flags;
+ void *addr = NULL;
+ flags = MAP_PRIVATE | MAP_ANONYMOUS;
+#if defined(__x86_64__)
+ /* FreeBSD doesn't have MAP_32BIT, use MAP_FIXED and assume
+ * 0x40000000 is free */
+ flags |= MAP_FIXED;
+ addr = (void *)0x40000000;
+ /* Cannot map more than that */
+ if (code_gen_buffer_size > (800 * 1024 * 1024))
+ code_gen_buffer_size = (800 * 1024 * 1024);
+#elif defined(__sparc_v9__)
+ // Map the buffer below 2G, so we can use direct calls and branches
+ flags |= MAP_FIXED;
+ addr = (void *) 0x60000000UL;
+ if (code_gen_buffer_size > (512 * 1024 * 1024)) {
+ code_gen_buffer_size = (512 * 1024 * 1024);
+ }
+#endif
+ code_gen_buffer = mmap(addr, code_gen_buffer_size,
+ PROT_WRITE | PROT_READ | PROT_EXEC,
+ flags, -1, 0);
+ if (code_gen_buffer == MAP_FAILED) {
+ fprintf(stderr, "Could not allocate dynamic translator buffer\n");
+ exit(1);
+ }
+ }
+#else
+ code_gen_buffer = qemu_malloc(code_gen_buffer_size);
+ map_exec(code_gen_buffer, code_gen_buffer_size);
+#endif
+#endif /* !USE_STATIC_CODE_GEN_BUFFER */
+ map_exec(code_gen_prologue, sizeof(code_gen_prologue));
+ code_gen_buffer_max_size = code_gen_buffer_size -
+ (TCG_MAX_OP_SIZE * OPC_BUF_SIZE);
+ code_gen_max_blocks = code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE;
+ tbs = qemu_malloc(code_gen_max_blocks * sizeof(TranslationBlock));
+}
+
+/* Must be called before using the QEMU cpus. 'tb_size' is the size
+ (in bytes) allocated to the translation buffer. Zero means default
+ size. */
+void cpu_exec_init_all(unsigned long tb_size)
+{
+ cpu_gen_init();
+ code_gen_alloc(tb_size);
+ code_gen_ptr = code_gen_buffer;
+ page_init();
+#if !defined(CONFIG_USER_ONLY)
+ io_mem_init();
+#endif
+#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
+ /* There's no guest base to take into account, so go ahead and
+ initialize the prologue now. */
+ tcg_prologue_init(&tcg_ctx);
+#endif
+}
+
+#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
+
+static int cpu_common_post_load(void *opaque, int version_id)
+{
+ CPUState *env = opaque;
+
+ /* 0x01 was CPU_INTERRUPT_EXIT. This line can be removed when the
+ version_id is increased. */
+ env->interrupt_request &= ~0x01;
+ tlb_flush(env, 1);
+
+ return 0;
+}
+
+static const VMStateDescription vmstate_cpu_common = {
+ .name = "cpu_common",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .post_load = cpu_common_post_load,
+ .fields = (VMStateField []) {
+ VMSTATE_UINT32(halted, CPUState),
+ VMSTATE_UINT32(interrupt_request, CPUState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+#endif
+
+CPUState *qemu_get_cpu(int cpu)
+{
+ CPUState *env = first_cpu;
+
+ while (env) {
+ if (env->cpu_index == cpu)
+ break;
+ env = env->next_cpu;
+ }
+
+ return env;
+}
+
+void cpu_exec_init(CPUState *env)
+{
+ CPUState **penv;
+ int cpu_index;
+
+#if defined(CONFIG_USER_ONLY)
+ cpu_list_lock();
+#endif
+ env->next_cpu = NULL;
+ penv = &first_cpu;
+ cpu_index = 0;
+ while (*penv != NULL) {
+ penv = &(*penv)->next_cpu;
+ cpu_index++;
+ }
+ env->cpu_index = cpu_index;
+ env->numa_node = 0;
+ QTAILQ_INIT(&env->breakpoints);
+ QTAILQ_INIT(&env->watchpoints);
+#ifndef CONFIG_USER_ONLY
+ env->thread_id = qemu_get_thread_id();
+#endif
+ *penv = env;
+#if defined(CONFIG_USER_ONLY)
+ cpu_list_unlock();
+#endif
+#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
+ vmstate_register(NULL, cpu_index, &vmstate_cpu_common, env);
+ register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION,
+ cpu_save, cpu_load, env);
+#endif
+}
+
+/* Allocate a new translation block. Flush the translation buffer if
+ too many translation blocks or too much generated code. */
+static TranslationBlock *tb_alloc(target_ulong pc)
+{
+ TranslationBlock *tb;
+
+ if (nb_tbs >= code_gen_max_blocks ||
+ (code_gen_ptr - code_gen_buffer) >= code_gen_buffer_max_size)
+ return NULL;
+ tb = &tbs[nb_tbs++];
+ tb->pc = pc;
+ tb->cflags = 0;
+ return tb;
+}
+
+void tb_free(TranslationBlock *tb)
+{
+ /* In practice this is mostly used for single use temporary TB
+ Ignore the hard cases and just back up if this TB happens to
+ be the last one generated. */
+ if (nb_tbs > 0 && tb == &tbs[nb_tbs - 1]) {
+ code_gen_ptr = tb->tc_ptr;
+ nb_tbs--;
+ }
+}
+
+static inline void invalidate_page_bitmap(PageDesc *p)
+{
+ if (p->code_bitmap) {
+ qemu_free(p->code_bitmap);
+ p->code_bitmap = NULL;
+ }
+ p->code_write_count = 0;
+}
+
+/* Set to NULL all the 'first_tb' fields in all PageDescs. */
+
+static void page_flush_tb_1 (int level, void **lp)
+{
+ int i;
+
+ if (*lp == NULL) {
+ return;
+ }
+ if (level == 0) {
+ PageDesc *pd = *lp;
+ for (i = 0; i < L2_SIZE; ++i) {
+ pd[i].first_tb = NULL;
+ invalidate_page_bitmap(pd + i);
+ }
+ } else {
+ void **pp = *lp;
+ for (i = 0; i < L2_SIZE; ++i) {
+ page_flush_tb_1 (level - 1, pp + i);
+ }
+ }
+}
+
+static void page_flush_tb(void)
+{
+ int i;
+ for (i = 0; i < V_L1_SIZE; i++) {
+ page_flush_tb_1(V_L1_SHIFT / L2_BITS - 1, l1_map + i);
+ }
+}
+
+/* flush all the translation blocks */
+/* XXX: tb_flush is currently not thread safe */
+void tb_flush(CPUState *env1)
+{
+ CPUState *env;
+#if defined(DEBUG_FLUSH)
+ printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n",
+ (unsigned long)(code_gen_ptr - code_gen_buffer),
+ nb_tbs, nb_tbs > 0 ?
+ ((unsigned long)(code_gen_ptr - code_gen_buffer)) / nb_tbs : 0);
+#endif
+ if ((unsigned long)(code_gen_ptr - code_gen_buffer) > code_gen_buffer_size)
+ cpu_abort(env1, "Internal error: code buffer overflow\n");
+
+ nb_tbs = 0;
+
+ for(env = first_cpu; env != NULL; env = env->next_cpu) {
+ memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
+ }
+
+ memset (tb_phys_hash, 0, CODE_GEN_PHYS_HASH_SIZE * sizeof (void *));
+ page_flush_tb();
+
+ code_gen_ptr = code_gen_buffer;
+ /* XXX: flush processor icache at this point if cache flush is
+ expensive */
+ tb_flush_count++;
+}
+
+#ifdef DEBUG_TB_CHECK
+
+static void tb_invalidate_check(target_ulong address)
+{
+ TranslationBlock *tb;
+ int i;
+ address &= TARGET_PAGE_MASK;
+ for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
+ for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
+ if (!(address + TARGET_PAGE_SIZE <= tb->pc ||
+ address >= tb->pc + tb->size)) {
+ printf("ERROR invalidate: address=" TARGET_FMT_lx
+ " PC=%08lx size=%04x\n",
+ address, (long)tb->pc, tb->size);
+ }
+ }
+ }
+}
+
+/* verify that all the pages have correct rights for code */
+static void tb_page_check(void)
+{
+ TranslationBlock *tb;
+ int i, flags1, flags2;
+
+ for(i = 0;i < CODE_GEN_PHYS_HASH_SIZE; i++) {
+ for(tb = tb_phys_hash[i]; tb != NULL; tb = tb->phys_hash_next) {
+ flags1 = page_get_flags(tb->pc);
+ flags2 = page_get_flags(tb->pc + tb->size - 1);
+ if ((flags1 & PAGE_WRITE) || (flags2 & PAGE_WRITE)) {
+ printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n",
+ (long)tb->pc, tb->size, flags1, flags2);
+ }
+ }
+ }
+}
+
+#endif
+
+/* invalidate one TB */
+static inline void tb_remove(TranslationBlock **ptb, TranslationBlock *tb,
+ int next_offset)
+{
+ TranslationBlock *tb1;
+ for(;;) {
+ tb1 = *ptb;
+ if (tb1 == tb) {
+ *ptb = *(TranslationBlock **)((char *)tb1 + next_offset);
+ break;
+ }
+ ptb = (TranslationBlock **)((char *)tb1 + next_offset);
+ }
+}
+
+static inline void tb_page_remove(TranslationBlock **ptb, TranslationBlock *tb)
+{
+ TranslationBlock *tb1;
+ unsigned int n1;
+
+ for(;;) {
+ tb1 = *ptb;
+ n1 = (long)tb1 & 3;
+ tb1 = (TranslationBlock *)((long)tb1 & ~3);
+ if (tb1 == tb) {
+ *ptb = tb1->page_next[n1];
+ break;
+ }
+ ptb = &tb1->page_next[n1];
+ }
+}
+
+static inline void tb_jmp_remove(TranslationBlock *tb, int n)
+{
+ TranslationBlock *tb1, **ptb;
+ unsigned int n1;
+
+ ptb = &tb->jmp_next[n];
+ tb1 = *ptb;
+ if (tb1) {
+ /* find tb(n) in circular list */
+ for(;;) {
+ tb1 = *ptb;
+ n1 = (long)tb1 & 3;
+ tb1 = (TranslationBlock *)((long)tb1 & ~3);
+ if (n1 == n && tb1 == tb)
+ break;
+ if (n1 == 2) {
+ ptb = &tb1->jmp_first;
+ } else {
+ ptb = &tb1->jmp_next[n1];
+ }
+ }
+ /* now we can suppress tb(n) from the list */
+ *ptb = tb->jmp_next[n];
+
+ tb->jmp_next[n] = NULL;
+ }
+}
+
+/* reset the jump entry 'n' of a TB so that it is not chained to
+ another TB */
+static inline void tb_reset_jump(TranslationBlock *tb, int n)
+{
+ tb_set_jmp_target(tb, n, (unsigned long)(tb->tc_ptr + tb->tb_next_offset[n]));
+}
+
+void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr)
+{
+ CPUState *env;
+ PageDesc *p;
+ unsigned int h, n1;
+ tb_page_addr_t phys_pc;
+ TranslationBlock *tb1, *tb2;
+
+ /* remove the TB from the hash list */
+ phys_pc = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
+ h = tb_phys_hash_func(phys_pc);
+ tb_remove(&tb_phys_hash[h], tb,
+ offsetof(TranslationBlock, phys_hash_next));
+
+ /* remove the TB from the page list */
+ if (tb->page_addr[0] != page_addr) {
+ p = page_find(tb->page_addr[0] >> TARGET_PAGE_BITS);
+ tb_page_remove(&p->first_tb, tb);
+ invalidate_page_bitmap(p);
+ }
+ if (tb->page_addr[1] != -1 && tb->page_addr[1] != page_addr) {
+ p = page_find(tb->page_addr[1] >> TARGET_PAGE_BITS);
+ tb_page_remove(&p->first_tb, tb);
+ invalidate_page_bitmap(p);
+ }
+
+ tb_invalidated_flag = 1;
+
+ /* remove the TB from the hash list */
+ h = tb_jmp_cache_hash_func(tb->pc);
+ for(env = first_cpu; env != NULL; env = env->next_cpu) {
+ if (env->tb_jmp_cache[h] == tb)
+ env->tb_jmp_cache[h] = NULL;
+ }
+
+ /* suppress this TB from the two jump lists */
+ tb_jmp_remove(tb, 0);
+ tb_jmp_remove(tb, 1);
+
+ /* suppress any remaining jumps to this TB */
+ tb1 = tb->jmp_first;
+ for(;;) {
+ n1 = (long)tb1 & 3;
+ if (n1 == 2)
+ break;
+ tb1 = (TranslationBlock *)((long)tb1 & ~3);
+ tb2 = tb1->jmp_next[n1];
+ tb_reset_jump(tb1, n1);
+ tb1->jmp_next[n1] = NULL;
+ tb1 = tb2;
+ }
+ tb->jmp_first = (TranslationBlock *)((long)tb | 2); /* fail safe */
+
+ tb_phys_invalidate_count++;
+}
+
+static inline void set_bits(uint8_t *tab, int start, int len)
+{
+ int end, mask, end1;
+
+ end = start + len;
+ tab += start >> 3;
+ mask = 0xff << (start & 7);
+ if ((start & ~7) == (end & ~7)) {
+ if (start < end) {
+ mask &= ~(0xff << (end & 7));
+ *tab |= mask;
+ }
+ } else {
+ *tab++ |= mask;
+ start = (start + 8) & ~7;
+ end1 = end & ~7;
+ while (start < end1) {
+ *tab++ = 0xff;
+ start += 8;
+ }
+ if (start < end) {
+ mask = ~(0xff << (end & 7));
+ *tab |= mask;
+ }
+ }
+}
+
+static void build_page_bitmap(PageDesc *p)
+{
+ int n, tb_start, tb_end;
+ TranslationBlock *tb;
+
+ p->code_bitmap = qemu_mallocz(TARGET_PAGE_SIZE / 8);
+
+ tb = p->first_tb;
+ while (tb != NULL) {
+ n = (long)tb & 3;
+ tb = (TranslationBlock *)((long)tb & ~3);
+ /* NOTE: this is subtle as a TB may span two physical pages */
+ if (n == 0) {
+ /* NOTE: tb_end may be after the end of the page, but
+ it is not a problem */
+ tb_start = tb->pc & ~TARGET_PAGE_MASK;
+ tb_end = tb_start + tb->size;
+ if (tb_end > TARGET_PAGE_SIZE)
+ tb_end = TARGET_PAGE_SIZE;
+ } else {
+ tb_start = 0;
+ tb_end = ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
+ }
+ set_bits(p->code_bitmap, tb_start, tb_end - tb_start);
+ tb = tb->page_next[n];
+ }
+}
+
+TranslationBlock *tb_gen_code(CPUState *env,
+ target_ulong pc, target_ulong cs_base,
+ int flags, int cflags)
+{
+ TranslationBlock *tb;
+ uint8_t *tc_ptr;
+ tb_page_addr_t phys_pc, phys_page2;
+ target_ulong virt_page2;
+ int code_gen_size;
+
+ phys_pc = get_page_addr_code(env, pc);
+ tb = tb_alloc(pc);
+ if (!tb) {
+ /* flush must be done */
+ tb_flush(env);
+ /* cannot fail at this point */
+ tb = tb_alloc(pc);
+ /* Don't forget to invalidate previous TB info. */
+ tb_invalidated_flag = 1;
+ }
+ tc_ptr = code_gen_ptr;
+ tb->tc_ptr = tc_ptr;
+ tb->cs_base = cs_base;
+ tb->flags = flags;
+ tb->cflags = cflags;
+ cpu_gen_code(env, tb, &code_gen_size);
+ code_gen_ptr = (void *)(((unsigned long)code_gen_ptr + code_gen_size + CODE_GEN_ALIGN - 1) & ~(CODE_GEN_ALIGN - 1));
+
+ /* check next page if needed */
+ virt_page2 = (pc + tb->size - 1) & TARGET_PAGE_MASK;
+ phys_page2 = -1;
+ if ((pc & TARGET_PAGE_MASK) != virt_page2) {
+ phys_page2 = get_page_addr_code(env, virt_page2);
+ }
+ tb_link_page(tb, phys_pc, phys_page2);
+ return tb;
+}
+
+/* invalidate all TBs which intersect with the target physical page
+ starting in range [start;end[. NOTE: start and end must refer to
+ the same physical page. 'is_cpu_write_access' should be true if called
+ from a real cpu write access: the virtual CPU will exit the current
+ TB if code is modified inside this TB. */
+void tb_invalidate_phys_page_range(tb_page_addr_t start, tb_page_addr_t end,
+ int is_cpu_write_access)
+{
+ TranslationBlock *tb, *tb_next, *saved_tb;
+ CPUState *env = cpu_single_env;
+ tb_page_addr_t tb_start, tb_end;
+ PageDesc *p;
+ int n;
+#ifdef TARGET_HAS_PRECISE_SMC
+ int current_tb_not_found = is_cpu_write_access;
+ TranslationBlock *current_tb = NULL;
+ int current_tb_modified = 0;
+ target_ulong current_pc = 0;
+ target_ulong current_cs_base = 0;
+ int current_flags = 0;
+#endif /* TARGET_HAS_PRECISE_SMC */
+
+ p = page_find(start >> TARGET_PAGE_BITS);
+ if (!p)
+ return;
+ if (!p->code_bitmap &&
+ ++p->code_write_count >= SMC_BITMAP_USE_THRESHOLD &&
+ is_cpu_write_access) {
+ /* build code bitmap */
+ build_page_bitmap(p);
+ }
+
+ /* we remove all the TBs in the range [start, end[ */
+ /* XXX: see if in some cases it could be faster to invalidate all the code */
+ tb = p->first_tb;
+ while (tb != NULL) {
+ n = (long)tb & 3;
+ tb = (TranslationBlock *)((long)tb & ~3);
+ tb_next = tb->page_next[n];
+ /* NOTE: this is subtle as a TB may span two physical pages */
+ if (n == 0) {
+ /* NOTE: tb_end may be after the end of the page, but
+ it is not a problem */
+ tb_start = tb->page_addr[0] + (tb->pc & ~TARGET_PAGE_MASK);
+ tb_end = tb_start + tb->size;
+ } else {
+ tb_start = tb->page_addr[1];
+ tb_end = tb_start + ((tb->pc + tb->size) & ~TARGET_PAGE_MASK);
+ }
+ if (!(tb_end <= start || tb_start >= end)) {
+#ifdef TARGET_HAS_PRECISE_SMC
+ if (current_tb_not_found) {
+ current_tb_not_found = 0;
+ current_tb = NULL;
+ if (env->mem_io_pc) {
+ /* now we have a real cpu fault */
+ current_tb = tb_find_pc(env->mem_io_pc);
+ }
+ }
+ if (current_tb == tb &&
+ (current_tb->cflags & CF_COUNT_MASK) != 1) {
+ /* If we are modifying the current TB, we must stop
+ its execution. We could be more precise by checking
+ that the modification is after the current PC, but it
+ would require a specialized function to partially
+ restore the CPU state */
+
+ current_tb_modified = 1;
+ cpu_restore_state(current_tb, env, env->mem_io_pc);
+ cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base,
+ ¤t_flags);
+ }
+#endif /* TARGET_HAS_PRECISE_SMC */
+ /* we need to do that to handle the case where a signal
+ occurs while doing tb_phys_invalidate() */
+ saved_tb = NULL;
+ if (env) {
+ saved_tb = env->current_tb;
+ env->current_tb = NULL;
+ }
+ tb_phys_invalidate(tb, -1);
+ if (env) {
+ env->current_tb = saved_tb;
+ if (env->interrupt_request && env->current_tb)
+ cpu_interrupt(env, env->interrupt_request);
+ }
+ }
+ tb = tb_next;
+ }
+#if !defined(CONFIG_USER_ONLY)
+ /* if no code remaining, no need to continue to use slow writes */
+ if (!p->first_tb) {
+ invalidate_page_bitmap(p);
+ if (is_cpu_write_access) {
+ tlb_unprotect_code_phys(env, start, env->mem_io_vaddr);
+ }
+ }
+#endif
+#ifdef TARGET_HAS_PRECISE_SMC
+ if (current_tb_modified) {
+ /* we generate a block containing just the instruction
+ modifying the memory. It will ensure that it cannot modify
+ itself */
+ env->current_tb = NULL;
+ tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
+ cpu_resume_from_signal(env, NULL);
+ }
+#endif
+}
+
+/* len must be <= 8 and start must be a multiple of len */
+static inline void tb_invalidate_phys_page_fast(tb_page_addr_t start, int len)
+{
+ PageDesc *p;
+ int offset, b;
+#if 0
+ if (1) {
+ qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
+ cpu_single_env->mem_io_vaddr, len,
+ cpu_single_env->eip,
+ cpu_single_env->eip + (long)cpu_single_env->segs[R_CS].base);
+ }
+#endif
+ p = page_find(start >> TARGET_PAGE_BITS);
+ if (!p)
+ return;
+ if (p->code_bitmap) {
+ offset = start & ~TARGET_PAGE_MASK;
+ b = p->code_bitmap[offset >> 3] >> (offset & 7);
+ if (b & ((1 << len) - 1))
+ goto do_invalidate;
+ } else {
+ do_invalidate:
+ tb_invalidate_phys_page_range(start, start + len, 1);
+ }
+}
+
+#if !defined(CONFIG_SOFTMMU)
+static void tb_invalidate_phys_page(tb_page_addr_t addr,
+ unsigned long pc, void *puc)
+{
+ TranslationBlock *tb;
+ PageDesc *p;
+ int n;
+#ifdef TARGET_HAS_PRECISE_SMC
+ TranslationBlock *current_tb = NULL;
+ CPUState *env = cpu_single_env;
+ int current_tb_modified = 0;
+ target_ulong current_pc = 0;
+ target_ulong current_cs_base = 0;
+ int current_flags = 0;
+#endif
+
+ addr &= TARGET_PAGE_MASK;
+ p = page_find(addr >> TARGET_PAGE_BITS);
+ if (!p)
+ return;
+ tb = p->first_tb;
+#ifdef TARGET_HAS_PRECISE_SMC
+ if (tb && pc != 0) {
+ current_tb = tb_find_pc(pc);
+ }
+#endif
+ while (tb != NULL) {
+ n = (long)tb & 3;
+ tb = (TranslationBlock *)((long)tb & ~3);
+#ifdef TARGET_HAS_PRECISE_SMC
+ if (current_tb == tb &&
+ (current_tb->cflags & CF_COUNT_MASK) != 1) {
+ /* If we are modifying the current TB, we must stop
+ its execution. We could be more precise by checking
+ that the modification is after the current PC, but it
+ would require a specialized function to partially
+ restore the CPU state */
+
+ current_tb_modified = 1;
+ cpu_restore_state(current_tb, env, pc);
+ cpu_get_tb_cpu_state(env, ¤t_pc, ¤t_cs_base,
+ ¤t_flags);
+ }
+#endif /* TARGET_HAS_PRECISE_SMC */
+ tb_phys_invalidate(tb, addr);
+ tb = tb->page_next[n];
+ }
+ p->first_tb = NULL;
+#ifdef TARGET_HAS_PRECISE_SMC
+ if (current_tb_modified) {
+ /* we generate a block containing just the instruction
+ modifying the memory. It will ensure that it cannot modify
+ itself */
+ env->current_tb = NULL;
+ tb_gen_code(env, current_pc, current_cs_base, current_flags, 1);
+ cpu_resume_from_signal(env, puc);
+ }
+#endif
+}
+#endif
+
+/* add the tb in the target page and protect it if necessary */
+static inline void tb_alloc_page(TranslationBlock *tb,
+ unsigned int n, tb_page_addr_t page_addr)
+{
+ PageDesc *p;
+#ifndef CONFIG_USER_ONLY
+ bool page_already_protected;
+#endif
+
+ tb->page_addr[n] = page_addr;
+ p = page_find_alloc(page_addr >> TARGET_PAGE_BITS, 1);
+ tb->page_next[n] = p->first_tb;
+#ifndef CONFIG_USER_ONLY
+ page_already_protected = p->first_tb != NULL;
+#endif
+ p->first_tb = (TranslationBlock *)((long)tb | n);
+ invalidate_page_bitmap(p);
+
+#if defined(TARGET_HAS_SMC) || 1
+
+#if defined(CONFIG_USER_ONLY)
+ if (p->flags & PAGE_WRITE) {
+ target_ulong addr;
+ PageDesc *p2;
+ int prot;
+
+ /* force the host page as non writable (writes will have a
+ page fault + mprotect overhead) */
+ page_addr &= qemu_host_page_mask;
+ prot = 0;
+ for(addr = page_addr; addr < page_addr + qemu_host_page_size;
+ addr += TARGET_PAGE_SIZE) {
+
+ p2 = page_find (addr >> TARGET_PAGE_BITS);
+ if (!p2)
+ continue;
+ prot |= p2->flags;
+ p2->flags &= ~PAGE_WRITE;
+ }
+ mprotect(g2h(page_addr), qemu_host_page_size,
+ (prot & PAGE_BITS) & ~PAGE_WRITE);
+#ifdef DEBUG_TB_INVALIDATE
+ printf("protecting code page: 0x" TARGET_FMT_lx "\n",
+ page_addr);
+#endif
+ }
+#else
+ /* if some code is already present, then the pages are already
+ protected. So we handle the case where only the first TB is
+ allocated in a physical page */
+ if (!page_already_protected) {
+ tlb_protect_code(page_addr);
+ }
+#endif
+
+#endif /* TARGET_HAS_SMC */
+}
+
+/* add a new TB and link it to the physical page tables. phys_page2 is
+ (-1) to indicate that only one page contains the TB. */
+void tb_link_page(TranslationBlock *tb,
+ tb_page_addr_t phys_pc, tb_page_addr_t phys_page2)
+{
+ unsigned int h;
+ TranslationBlock **ptb;
+
+ /* Grab the mmap lock to stop another thread invalidating this TB
+ before we are done. */
+ mmap_lock();
+ /* add in the physical hash table */
+ h = tb_phys_hash_func(phys_pc);
+ ptb = &tb_phys_hash[h];
+ tb->phys_hash_next = *ptb;
+ *ptb = tb;
+
+ /* add in the page list */
+ tb_alloc_page(tb, 0, phys_pc & TARGET_PAGE_MASK);
+ if (phys_page2 != -1)
+ tb_alloc_page(tb, 1, phys_page2);
+ else
+ tb->page_addr[1] = -1;
+
+ tb->jmp_first = (TranslationBlock *)((long)tb | 2);
+ tb->jmp_next[0] = NULL;
+ tb->jmp_next[1] = NULL;
+
+ /* init original jump addresses */
+ if (tb->tb_next_offset[0] != 0xffff)
+ tb_reset_jump(tb, 0);
+ if (tb->tb_next_offset[1] != 0xffff)
+ tb_reset_jump(tb, 1);
+
+#ifdef DEBUG_TB_CHECK
+ tb_page_check();
+#endif
+ mmap_unlock();
+}
+
+/* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
+ tb[1].tc_ptr. Return NULL if not found */
+TranslationBlock *tb_find_pc(unsigned long tc_ptr)
+{
+ int m_min, m_max, m;
+ unsigned long v;
+ TranslationBlock *tb;
+
+ if (nb_tbs <= 0)
+ return NULL;
+ if (tc_ptr < (unsigned long)code_gen_buffer ||
+ tc_ptr >= (unsigned long)code_gen_ptr)
+ return NULL;
+ /* binary search (cf Knuth) */
+ m_min = 0;
+ m_max = nb_tbs - 1;
+ while (m_min <= m_max) {
+ m = (m_min + m_max) >> 1;
+ tb = &tbs[m];
+ v = (unsigned long)tb->tc_ptr;
+ if (v == tc_ptr)
+ return tb;
+ else if (tc_ptr < v) {
+ m_max = m - 1;
+ } else {
+ m_min = m + 1;
+ }
+ }
+ return &tbs[m_max];
+}
+
+static void tb_reset_jump_recursive(TranslationBlock *tb);
+
+static inline void tb_reset_jump_recursive2(TranslationBlock *tb, int n)
+{
+ TranslationBlock *tb1, *tb_next, **ptb;
+ unsigned int n1;
+
+ tb1 = tb->jmp_next[n];
+ if (tb1 != NULL) {
+ /* find head of list */
+ for(;;) {
+ n1 = (long)tb1 & 3;
+ tb1 = (TranslationBlock *)((long)tb1 & ~3);
+ if (n1 == 2)
+ break;
+ tb1 = tb1->jmp_next[n1];
+ }
+ /* we are now sure now that tb jumps to tb1 */
+ tb_next = tb1;
+
+ /* remove tb from the jmp_first list */
+ ptb = &tb_next->jmp_first;
+ for(;;) {
+ tb1 = *ptb;
+ n1 = (long)tb1 & 3;
+ tb1 = (TranslationBlock *)((long)tb1 & ~3);
+ if (n1 == n && tb1 == tb)
+ break;
+ ptb = &tb1->jmp_next[n1];
+ }
+ *ptb = tb->jmp_next[n];
+ tb->jmp_next[n] = NULL;
+
+ /* suppress the jump to next tb in generated code */
+ tb_reset_jump(tb, n);
+
+ /* suppress jumps in the tb on which we could have jumped */
+ tb_reset_jump_recursive(tb_next);
+ }
+}
+
+static void tb_reset_jump_recursive(TranslationBlock *tb)
+{
+ tb_reset_jump_recursive2(tb, 0);
+ tb_reset_jump_recursive2(tb, 1);
+}
+
+#if defined(TARGET_HAS_ICE)
+#if defined(CONFIG_USER_ONLY)
+static void breakpoint_invalidate(CPUState *env, target_ulong pc)
+{
+ tb_invalidate_phys_page_range(pc, pc + 1, 0);
+}
+#else
+static void breakpoint_invalidate(CPUState *env, target_ulong pc)
+{
+ target_phys_addr_t addr;
+ target_ulong pd;
+ ram_addr_t ram_addr;
+ PhysPageDesc *p;
+
+ addr = cpu_get_phys_page_debug(env, pc);
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+ ram_addr = (pd & TARGET_PAGE_MASK) | (pc & ~TARGET_PAGE_MASK);
+ tb_invalidate_phys_page_range(ram_addr, ram_addr + 1, 0);
+}
+#endif
+#endif /* TARGET_HAS_ICE */
+
+#if defined(CONFIG_USER_ONLY)
+void cpu_watchpoint_remove_all(CPUState *env, int mask)
+
+{
+}
+
+int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
+ int flags, CPUWatchpoint **watchpoint)
+{
+ return -ENOSYS;
+}
+#else
+/* Add a watchpoint. */
+int cpu_watchpoint_insert(CPUState *env, target_ulong addr, target_ulong len,
+ int flags, CPUWatchpoint **watchpoint)
+{
+ target_ulong len_mask = ~(len - 1);
+ CPUWatchpoint *wp;
+
+ /* sanity checks: allow power-of-2 lengths, deny unaligned watchpoints */
+ if ((len != 1 && len != 2 && len != 4 && len != 8) || (addr & ~len_mask)) {
+ fprintf(stderr, "qemu: tried to set invalid watchpoint at "
+ TARGET_FMT_lx ", len=" TARGET_FMT_lu "\n", addr, len);
+ return -EINVAL;
+ }
+ wp = qemu_malloc(sizeof(*wp));
+
+ wp->vaddr = addr;
+ wp->len_mask = len_mask;
+ wp->flags = flags;
+
+ /* keep all GDB-injected watchpoints in front */
+ if (flags & BP_GDB)
+ QTAILQ_INSERT_HEAD(&env->watchpoints, wp, entry);
+ else
+ QTAILQ_INSERT_TAIL(&env->watchpoints, wp, entry);
+
+ tlb_flush_page(env, addr);
+
+ if (watchpoint)
+ *watchpoint = wp;
+ return 0;
+}
+
+/* Remove a specific watchpoint. */
+int cpu_watchpoint_remove(CPUState *env, target_ulong addr, target_ulong len,
+ int flags)
+{
+ target_ulong len_mask = ~(len - 1);
+ CPUWatchpoint *wp;
+
+ QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
+ if (addr == wp->vaddr && len_mask == wp->len_mask
+ && flags == (wp->flags & ~BP_WATCHPOINT_HIT)) {
+ cpu_watchpoint_remove_by_ref(env, wp);
+ return 0;
+ }
+ }
+ return -ENOENT;
+}
+
+/* Remove a specific watchpoint by reference. */
+void cpu_watchpoint_remove_by_ref(CPUState *env, CPUWatchpoint *watchpoint)
+{
+ QTAILQ_REMOVE(&env->watchpoints, watchpoint, entry);
+
+ tlb_flush_page(env, watchpoint->vaddr);
+
+ qemu_free(watchpoint);
+}
+
+/* Remove all matching watchpoints. */
+void cpu_watchpoint_remove_all(CPUState *env, int mask)
+{
+ CPUWatchpoint *wp, *next;
+
+ QTAILQ_FOREACH_SAFE(wp, &env->watchpoints, entry, next) {
+ if (wp->flags & mask)
+ cpu_watchpoint_remove_by_ref(env, wp);
+ }
+}
+#endif
+
+/* Add a breakpoint. */
+int cpu_breakpoint_insert(CPUState *env, target_ulong pc, int flags,
+ CPUBreakpoint **breakpoint)
+{
+#if defined(TARGET_HAS_ICE)
+ CPUBreakpoint *bp;
+
+ bp = qemu_malloc(sizeof(*bp));
+
+ bp->pc = pc;
+ bp->flags = flags;
+
+ /* keep all GDB-injected breakpoints in front */
+ if (flags & BP_GDB)
+ QTAILQ_INSERT_HEAD(&env->breakpoints, bp, entry);
+ else
+ QTAILQ_INSERT_TAIL(&env->breakpoints, bp, entry);
+
+ breakpoint_invalidate(env, pc);
+
+ if (breakpoint)
+ *breakpoint = bp;
+ return 0;
+#else
+ return -ENOSYS;
+#endif
+}
+
+/* Remove a specific breakpoint. */
+int cpu_breakpoint_remove(CPUState *env, target_ulong pc, int flags)
+{
+#if defined(TARGET_HAS_ICE)
+ CPUBreakpoint *bp;
+
+ QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
+ if (bp->pc == pc && bp->flags == flags) {
+ cpu_breakpoint_remove_by_ref(env, bp);
+ return 0;
+ }
+ }
+ return -ENOENT;
+#else
+ return -ENOSYS;
+#endif
+}
+
+/* Remove a specific breakpoint by reference. */
+void cpu_breakpoint_remove_by_ref(CPUState *env, CPUBreakpoint *breakpoint)
+{
+#if defined(TARGET_HAS_ICE)
+ QTAILQ_REMOVE(&env->breakpoints, breakpoint, entry);
+
+ breakpoint_invalidate(env, breakpoint->pc);
+
+ qemu_free(breakpoint);
+#endif
+}
+
+/* Remove all matching breakpoints. */
+void cpu_breakpoint_remove_all(CPUState *env, int mask)
+{
+#if defined(TARGET_HAS_ICE)
+ CPUBreakpoint *bp, *next;
+
+ QTAILQ_FOREACH_SAFE(bp, &env->breakpoints, entry, next) {
+ if (bp->flags & mask)
+ cpu_breakpoint_remove_by_ref(env, bp);
+ }
+#endif
+}
+
+/* enable or disable single step mode. EXCP_DEBUG is returned by the
+ CPU loop after each instruction */
+void cpu_single_step(CPUState *env, int enabled)
+{
+#if defined(TARGET_HAS_ICE)
+ if (env->singlestep_enabled != enabled) {
+ env->singlestep_enabled = enabled;
+ if (kvm_enabled())
+ kvm_update_guest_debug(env, 0);
+ else {
+ /* must flush all the translated code to avoid inconsistencies */
+ /* XXX: only flush what is necessary */
+ tb_flush(env);
+ }
+ }
+#endif
+}
+
+/* enable or disable low levels log */
+void cpu_set_log(int log_flags)
+{
+ loglevel = log_flags;
+ if (loglevel && !logfile) {
+ logfile = fopen(logfilename, log_append ? "a" : "w");
+ if (!logfile) {
+ perror(logfilename);
+ _exit(1);
+ }
+#if !defined(CONFIG_SOFTMMU)
+ /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
+ {
+ static char logfile_buf[4096];
+ setvbuf(logfile, logfile_buf, _IOLBF, sizeof(logfile_buf));
+ }
+#elif !defined(_WIN32)
+ /* Win32 doesn't support line-buffering and requires size >= 2 */
+ setvbuf(logfile, NULL, _IOLBF, 0);
+#endif
+ log_append = 1;
+ }
+ if (!loglevel && logfile) {
+ fclose(logfile);
+ logfile = NULL;
+ }
+}
+
+void cpu_set_log_filename(const char *filename)
+{
+ logfilename = strdup(filename);
+ if (logfile) {
+ fclose(logfile);
+ logfile = NULL;
+ }
+ cpu_set_log(loglevel);
+}
+
+static void cpu_unlink_tb(CPUState *env)
+{
+ /* FIXME: TB unchaining isn't SMP safe. For now just ignore the
+ problem and hope the cpu will stop of its own accord. For userspace
+ emulation this often isn't actually as bad as it sounds. Often
+ signals are used primarily to interrupt blocking syscalls. */
+ TranslationBlock *tb;
+ static spinlock_t interrupt_lock = SPIN_LOCK_UNLOCKED;
+
+ spin_lock(&interrupt_lock);
+ tb = env->current_tb;
+ /* if the cpu is currently executing code, we must unlink it and
+ all the potentially executing TB */
+ if (tb) {
+ env->current_tb = NULL;
+ tb_reset_jump_recursive(tb);
+ }
+ spin_unlock(&interrupt_lock);
+}
+
+#ifndef CONFIG_USER_ONLY
+/* mask must never be zero, except for A20 change call */
+static void tcg_handle_interrupt(CPUState *env, int mask)
+{
+ int old_mask;
+
+ old_mask = env->interrupt_request;
+ env->interrupt_request |= mask;
+
+ /*
+ * If called from iothread context, wake the target cpu in
+ * case its halted.
+ */
+ if (!qemu_cpu_is_self(env)) {
+ qemu_cpu_kick(env);
+ return;
+ }
+
+ if (use_icount) {
+ env->icount_decr.u16.high = 0xffff;
+ if (!can_do_io(env)
+ && (mask & ~old_mask) != 0) {
+ cpu_abort(env, "Raised interrupt while not in I/O function");
+ }
+ } else {
+ cpu_unlink_tb(env);
+ }
+}
+
+CPUInterruptHandler cpu_interrupt_handler = tcg_handle_interrupt;
+
+#else /* CONFIG_USER_ONLY */
+
+void cpu_interrupt(CPUState *env, int mask)
+{
+ env->interrupt_request |= mask;
+ cpu_unlink_tb(env);
+}
+#endif /* CONFIG_USER_ONLY */
+
+void cpu_reset_interrupt(CPUState *env, int mask)
+{
+ env->interrupt_request &= ~mask;
+}
+
+void cpu_exit(CPUState *env)
+{
+ env->exit_request = 1;
+ cpu_unlink_tb(env);
+}
+
+const CPULogItem cpu_log_items[] = {
+ { CPU_LOG_TB_OUT_ASM, "out_asm",
+ "show generated host assembly code for each compiled TB" },
+ { CPU_LOG_TB_IN_ASM, "in_asm",
+ "show target assembly code for each compiled TB" },
+ { CPU_LOG_TB_OP, "op",
+ "show micro ops for each compiled TB" },
+ { CPU_LOG_TB_OP_OPT, "op_opt",
+ "show micro ops "
+#ifdef TARGET_I386
+ "before eflags optimization and "
+#endif
+ "after liveness analysis" },
+ { CPU_LOG_INT, "int",
+ "show interrupts/exceptions in short format" },
+ { CPU_LOG_EXEC, "exec",
+ "show trace before each executed TB (lots of logs)" },
+ { CPU_LOG_TB_CPU, "cpu",
+ "show CPU state before block translation" },
+#ifdef TARGET_I386
+ { CPU_LOG_PCALL, "pcall",
+ "show protected mode far calls/returns/exceptions" },
+ { CPU_LOG_RESET, "cpu_reset",
+ "show CPU state before CPU resets" },
+#endif
+#ifdef DEBUG_IOPORT
+ { CPU_LOG_IOPORT, "ioport",
+ "show all i/o ports accesses" },
+#endif
+ { 0, NULL, NULL },
+};
+
+#ifndef CONFIG_USER_ONLY
+static QLIST_HEAD(memory_client_list, CPUPhysMemoryClient) memory_client_list
+ = QLIST_HEAD_INITIALIZER(memory_client_list);
+
+static void cpu_notify_set_memory(target_phys_addr_t start_addr,
+ ram_addr_t size,
+ ram_addr_t phys_offset,
+ bool log_dirty)
+{
+ CPUPhysMemoryClient *client;
+ QLIST_FOREACH(client, &memory_client_list, list) {
+ client->set_memory(client, start_addr, size, phys_offset, log_dirty);
+ }
+}
+
+static int cpu_notify_sync_dirty_bitmap(target_phys_addr_t start,
+ target_phys_addr_t end)
+{
+ CPUPhysMemoryClient *client;
+ QLIST_FOREACH(client, &memory_client_list, list) {
+ int r = client->sync_dirty_bitmap(client, start, end);
+ if (r < 0)
+ return r;
+ }
+ return 0;
+}
+
+static int cpu_notify_migration_log(int enable)
+{
+ CPUPhysMemoryClient *client;
+ QLIST_FOREACH(client, &memory_client_list, list) {
+ int r = client->migration_log(client, enable);
+ if (r < 0)
+ return r;
+ }
+ return 0;
+}
+
+struct last_map {
+ target_phys_addr_t start_addr;
+ ram_addr_t size;
+ ram_addr_t phys_offset;
+};
+
+/* The l1_phys_map provides the upper P_L1_BITs of the guest physical
+ * address. Each intermediate table provides the next L2_BITs of guest
+ * physical address space. The number of levels vary based on host and
+ * guest configuration, making it efficient to build the final guest
+ * physical address by seeding the L1 offset and shifting and adding in
+ * each L2 offset as we recurse through them. */
+static void phys_page_for_each_1(CPUPhysMemoryClient *client, int level,
+ void **lp, target_phys_addr_t addr,
+ struct last_map *map)
+{
+ int i;
+
+ if (*lp == NULL) {
+ return;
+ }
+ if (level == 0) {
+ PhysPageDesc *pd = *lp;
+ addr <<= L2_BITS + TARGET_PAGE_BITS;
+ for (i = 0; i < L2_SIZE; ++i) {
+ if (pd[i].phys_offset != IO_MEM_UNASSIGNED) {
+ target_phys_addr_t start_addr = addr | i << TARGET_PAGE_BITS;
+
+ if (map->size &&
+ start_addr == map->start_addr + map->size &&
+ pd[i].phys_offset == map->phys_offset + map->size) {
+
+ map->size += TARGET_PAGE_SIZE;
+ continue;
+ } else if (map->size) {
+ client->set_memory(client, map->start_addr,
+ map->size, map->phys_offset, false);
+ }
+
+ map->start_addr = start_addr;
+ map->size = TARGET_PAGE_SIZE;
+ map->phys_offset = pd[i].phys_offset;
+ }
+ }
+ } else {
+ void **pp = *lp;
+ for (i = 0; i < L2_SIZE; ++i) {
+ phys_page_for_each_1(client, level - 1, pp + i,
+ (addr << L2_BITS) | i, map);
+ }
+ }
+}
+
+static void phys_page_for_each(CPUPhysMemoryClient *client)
+{
+ int i;
+ struct last_map map = { };
+
+ for (i = 0; i < P_L1_SIZE; ++i) {
+ phys_page_for_each_1(client, P_L1_SHIFT / L2_BITS - 1,
+ l1_phys_map + i, i, &map);
+ }
+ if (map.size) {
+ client->set_memory(client, map.start_addr, map.size, map.phys_offset,
+ false);
+ }
+}
+
+void cpu_register_phys_memory_client(CPUPhysMemoryClient *client)
+{
+ QLIST_INSERT_HEAD(&memory_client_list, client, list);
+ phys_page_for_each(client);
+}
+
+void cpu_unregister_phys_memory_client(CPUPhysMemoryClient *client)
+{
+ QLIST_REMOVE(client, list);
+}
+#endif
+
+static int cmp1(const char *s1, int n, const char *s2)
+{
+ if (strlen(s2) != n)
+ return 0;
+ return memcmp(s1, s2, n) == 0;
+}
+
+/* takes a comma separated list of log masks. Return 0 if error. */
+int cpu_str_to_log_mask(const char *str)
+{
+ const CPULogItem *item;
+ int mask;
+ const char *p, *p1;
+
+ p = str;
+ mask = 0;
+ for(;;) {
+ p1 = strchr(p, ',');
+ if (!p1)
+ p1 = p + strlen(p);
+ if(cmp1(p,p1-p,"all")) {
+ for(item = cpu_log_items; item->mask != 0; item++) {
+ mask |= item->mask;
+ }
+ } else {
+ for(item = cpu_log_items; item->mask != 0; item++) {
+ if (cmp1(p, p1 - p, item->name))
+ goto found;
+ }
+ return 0;
+ }
+ found:
+ mask |= item->mask;
+ if (*p1 != ',')
+ break;
+ p = p1 + 1;
+ }
+ return mask;
+}
+
+void cpu_abort(CPUState *env, const char *fmt, ...)
+{
+ va_list ap;
+ va_list ap2;
+
+ va_start(ap, fmt);
+ va_copy(ap2, ap);
+ fprintf(stderr, "qemu: fatal: ");
+ vfprintf(stderr, fmt, ap);
+ fprintf(stderr, "\n");
+#ifdef TARGET_I386
+ cpu_dump_state(env, stderr, fprintf, X86_DUMP_FPU | X86_DUMP_CCOP);
+#else
+ cpu_dump_state(env, stderr, fprintf, 0);
+#endif
+ if (qemu_log_enabled()) {
+ qemu_log("qemu: fatal: ");
+ qemu_log_vprintf(fmt, ap2);
+ qemu_log("\n");
+#ifdef TARGET_I386
+ log_cpu_state(env, X86_DUMP_FPU | X86_DUMP_CCOP);
+#else
+ log_cpu_state(env, 0);
+#endif
+ qemu_log_flush();
+ qemu_log_close();
+ }
+ va_end(ap2);
+ va_end(ap);
+#if defined(CONFIG_USER_ONLY)
+ {
+ struct sigaction act;
+ sigfillset(&act.sa_mask);
+ act.sa_handler = SIG_DFL;
+ sigaction(SIGABRT, &act, NULL);
+ }
+#endif
+ abort();
+}
+
+CPUState *cpu_copy(CPUState *env)
+{
+ CPUState *new_env = cpu_init(env->cpu_model_str);
+ CPUState *next_cpu = new_env->next_cpu;
+ int cpu_index = new_env->cpu_index;
+#if defined(TARGET_HAS_ICE)
+ CPUBreakpoint *bp;
+ CPUWatchpoint *wp;
+#endif
+
+ memcpy(new_env, env, sizeof(CPUState));
+
+ /* Preserve chaining and index. */
+ new_env->next_cpu = next_cpu;
+ new_env->cpu_index = cpu_index;
+
+ /* Clone all break/watchpoints.
+ Note: Once we support ptrace with hw-debug register access, make sure
+ BP_CPU break/watchpoints are handled correctly on clone. */
+ QTAILQ_INIT(&env->breakpoints);
+ QTAILQ_INIT(&env->watchpoints);
+#if defined(TARGET_HAS_ICE)
+ QTAILQ_FOREACH(bp, &env->breakpoints, entry) {
+ cpu_breakpoint_insert(new_env, bp->pc, bp->flags, NULL);
+ }
+ QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
+ cpu_watchpoint_insert(new_env, wp->vaddr, (~wp->len_mask) + 1,
+ wp->flags, NULL);
+ }
+#endif
+
+ return new_env;
+}
+
+#if !defined(CONFIG_USER_ONLY)
+
+static inline void tlb_flush_jmp_cache(CPUState *env, target_ulong addr)
+{
+ unsigned int i;
+
+ /* Discard jump cache entries for any tb which might potentially
+ overlap the flushed page. */
+ i = tb_jmp_cache_hash_page(addr - TARGET_PAGE_SIZE);
+ memset (&env->tb_jmp_cache[i], 0,
+ TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
+
+ i = tb_jmp_cache_hash_page(addr);
+ memset (&env->tb_jmp_cache[i], 0,
+ TB_JMP_PAGE_SIZE * sizeof(TranslationBlock *));
+}
+
+static CPUTLBEntry s_cputlb_empty_entry = {
+ .addr_read = -1,
+ .addr_write = -1,
+ .addr_code = -1,
+ .addend = -1,
+};
+
+/* NOTE: if flush_global is true, also flush global entries (not
+ implemented yet) */
+void tlb_flush(CPUState *env, int flush_global)
+{
+ int i;
+
+#if defined(DEBUG_TLB)
+ printf("tlb_flush:\n");
+#endif
+ /* must reset current TB so that interrupts cannot modify the
+ links while we are modifying them */
+ env->current_tb = NULL;
+
+ for(i = 0; i < CPU_TLB_SIZE; i++) {
+ int mmu_idx;
+ for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
+ env->tlb_table[mmu_idx][i] = s_cputlb_empty_entry;
+ }
+ }
+
+ memset (env->tb_jmp_cache, 0, TB_JMP_CACHE_SIZE * sizeof (void *));
+
+ env->tlb_flush_addr = -1;
+ env->tlb_flush_mask = 0;
+ tlb_flush_count++;
+}
+
+static inline void tlb_flush_entry(CPUTLBEntry *tlb_entry, target_ulong addr)
+{
+ if (addr == (tlb_entry->addr_read &
+ (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
+ addr == (tlb_entry->addr_write &
+ (TARGET_PAGE_MASK | TLB_INVALID_MASK)) ||
+ addr == (tlb_entry->addr_code &
+ (TARGET_PAGE_MASK | TLB_INVALID_MASK))) {
+ *tlb_entry = s_cputlb_empty_entry;
+ }
+}
+
+void tlb_flush_page(CPUState *env, target_ulong addr)
+{
+ int i;
+ int mmu_idx;
+
+#if defined(DEBUG_TLB)
+ printf("tlb_flush_page: " TARGET_FMT_lx "\n", addr);
+#endif
+ /* Check if we need to flush due to large pages. */
+ if ((addr & env->tlb_flush_mask) == env->tlb_flush_addr) {
+#if defined(DEBUG_TLB)
+ printf("tlb_flush_page: forced full flush ("
+ TARGET_FMT_lx "/" TARGET_FMT_lx ")\n",
+ env->tlb_flush_addr, env->tlb_flush_mask);
+#endif
+ tlb_flush(env, 1);
+ return;
+ }
+ /* must reset current TB so that interrupts cannot modify the
+ links while we are modifying them */
+ env->current_tb = NULL;
+
+ addr &= TARGET_PAGE_MASK;
+ i = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+ for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
+ tlb_flush_entry(&env->tlb_table[mmu_idx][i], addr);
+
+ tlb_flush_jmp_cache(env, addr);
+}
+
+/* update the TLBs so that writes to code in the virtual page 'addr'
+ can be detected */
+static void tlb_protect_code(ram_addr_t ram_addr)
+{
+ cpu_physical_memory_reset_dirty(ram_addr,
+ ram_addr + TARGET_PAGE_SIZE,
+ CODE_DIRTY_FLAG);
+}
+
+/* update the TLB so that writes in physical page 'phys_addr' are no longer
+ tested for self modifying code */
+static void tlb_unprotect_code_phys(CPUState *env, ram_addr_t ram_addr,
+ target_ulong vaddr)
+{
+ cpu_physical_memory_set_dirty_flags(ram_addr, CODE_DIRTY_FLAG);
+}
+
+static inline void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry,
+ unsigned long start, unsigned long length)
+{
+ unsigned long addr;
+ if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
+ addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend;
+ if ((addr - start) < length) {
+ tlb_entry->addr_write = (tlb_entry->addr_write & TARGET_PAGE_MASK) | TLB_NOTDIRTY;
+ }
+ }
+}
+
+/* Note: start and end must be within the same ram block. */
+void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t end,
+ int dirty_flags)
+{
+ CPUState *env;
+ unsigned long length, start1;
+ int i;
+
+ start &= TARGET_PAGE_MASK;
+ end = TARGET_PAGE_ALIGN(end);
+
+ length = end - start;
+ if (length == 0)
+ return;
+ cpu_physical_memory_mask_dirty_range(start, length, dirty_flags);
+
+ /* we modify the TLB cache so that the dirty bit will be set again
+ when accessing the range */
+ start1 = (unsigned long)qemu_safe_ram_ptr(start);
+ /* Check that we don't span multiple blocks - this breaks the
+ address comparisons below. */
+ if ((unsigned long)qemu_safe_ram_ptr(end - 1) - start1
+ != (end - 1) - start) {
+ abort();
+ }
+
+ for(env = first_cpu; env != NULL; env = env->next_cpu) {
+ int mmu_idx;
+ for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
+ for(i = 0; i < CPU_TLB_SIZE; i++)
+ tlb_reset_dirty_range(&env->tlb_table[mmu_idx][i],
+ start1, length);
+ }
+ }
+}
+
+int cpu_physical_memory_set_dirty_tracking(int enable)
+{
+ int ret = 0;
+ in_migration = enable;
+ ret = cpu_notify_migration_log(!!enable);
+ return ret;
+}
+
+int cpu_physical_memory_get_dirty_tracking(void)
+{
+ return in_migration;
+}
+
+int cpu_physical_sync_dirty_bitmap(target_phys_addr_t start_addr,
+ target_phys_addr_t end_addr)
+{
+ int ret;
+
+ ret = cpu_notify_sync_dirty_bitmap(start_addr, end_addr);
+ return ret;
+}
+
+int cpu_physical_log_start(target_phys_addr_t start_addr,
+ ram_addr_t size)
+{
+ CPUPhysMemoryClient *client;
+ QLIST_FOREACH(client, &memory_client_list, list) {
+ if (client->log_start) {
+ int r = client->log_start(client, start_addr, size);
+ if (r < 0) {
+ return r;
+ }
+ }
+ }
+ return 0;
+}
+
+int cpu_physical_log_stop(target_phys_addr_t start_addr,
+ ram_addr_t size)
+{
+ CPUPhysMemoryClient *client;
+ QLIST_FOREACH(client, &memory_client_list, list) {
+ if (client->log_stop) {
+ int r = client->log_stop(client, start_addr, size);
+ if (r < 0) {
+ return r;
+ }
+ }
+ }
+ return 0;
+}
+
+static inline void tlb_update_dirty(CPUTLBEntry *tlb_entry)
+{
+ ram_addr_t ram_addr;
+ void *p;
+
+ if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) {
+ p = (void *)(unsigned long)((tlb_entry->addr_write & TARGET_PAGE_MASK)
+ + tlb_entry->addend);
+ ram_addr = qemu_ram_addr_from_host_nofail(p);
+ if (!cpu_physical_memory_is_dirty(ram_addr)) {
+ tlb_entry->addr_write |= TLB_NOTDIRTY;
+ }
+ }
+}
+
+/* update the TLB according to the current state of the dirty bits */
+void cpu_tlb_update_dirty(CPUState *env)
+{
+ int i;
+ int mmu_idx;
+ for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++) {
+ for(i = 0; i < CPU_TLB_SIZE; i++)
+ tlb_update_dirty(&env->tlb_table[mmu_idx][i]);
+ }
+}
+
+static inline void tlb_set_dirty1(CPUTLBEntry *tlb_entry, target_ulong vaddr)
+{
+ if (tlb_entry->addr_write == (vaddr | TLB_NOTDIRTY))
+ tlb_entry->addr_write = vaddr;
+}
+
+/* update the TLB corresponding to virtual page vaddr
+ so that it is no longer dirty */
+static inline void tlb_set_dirty(CPUState *env, target_ulong vaddr)
+{
+ int i;
+ int mmu_idx;
+
+ vaddr &= TARGET_PAGE_MASK;
+ i = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+ for (mmu_idx = 0; mmu_idx < NB_MMU_MODES; mmu_idx++)
+ tlb_set_dirty1(&env->tlb_table[mmu_idx][i], vaddr);
+}
+
+/* Our TLB does not support large pages, so remember the area covered by
+ large pages and trigger a full TLB flush if these are invalidated. */
+static void tlb_add_large_page(CPUState *env, target_ulong vaddr,
+ target_ulong size)
+{
+ target_ulong mask = ~(size - 1);
+
+ if (env->tlb_flush_addr == (target_ulong)-1) {
+ env->tlb_flush_addr = vaddr & mask;
+ env->tlb_flush_mask = mask;
+ return;
+ }
+ /* Extend the existing region to include the new page.
+ This is a compromise between unnecessary flushes and the cost
+ of maintaining a full variable size TLB. */
+ mask &= env->tlb_flush_mask;
+ while (((env->tlb_flush_addr ^ vaddr) & mask) != 0) {
+ mask <<= 1;
+ }
+ env->tlb_flush_addr &= mask;
+ env->tlb_flush_mask = mask;
+}
+
+/* Add a new TLB entry. At most one entry for a given virtual address
+ is permitted. Only a single TARGET_PAGE_SIZE region is mapped, the
+ supplied size is only used by tlb_flush_page. */
+void tlb_set_page(CPUState *env, target_ulong vaddr,
+ target_phys_addr_t paddr, int prot,
+ int mmu_idx, target_ulong size)
+{
+ PhysPageDesc *p;
+ unsigned long pd;
+ unsigned int index;
+ target_ulong address;
+ target_ulong code_address;
+ unsigned long addend;
+ CPUTLBEntry *te;
+ CPUWatchpoint *wp;
+ target_phys_addr_t iotlb;
+
+ assert(size >= TARGET_PAGE_SIZE);
+ if (size != TARGET_PAGE_SIZE) {
+ tlb_add_large_page(env, vaddr, size);
+ }
+ p = phys_page_find(paddr >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+#if defined(DEBUG_TLB)
+ printf("tlb_set_page: vaddr=" TARGET_FMT_lx " paddr=0x" TARGET_FMT_plx
+ " prot=%x idx=%d pd=0x%08lx\n",
+ vaddr, paddr, prot, mmu_idx, pd);
+#endif
+
+ address = vaddr;
+ if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
+ /* IO memory case (romd handled later) */
+ address |= TLB_MMIO;
+ }
+ addend = (unsigned long)qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
+ if ((pd & ~TARGET_PAGE_MASK) <= IO_MEM_ROM) {
+ /* Normal RAM. */
+ iotlb = pd & TARGET_PAGE_MASK;
+ if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
+ iotlb |= IO_MEM_NOTDIRTY;
+ else
+ iotlb |= IO_MEM_ROM;
+ } else {
+ /* IO handlers are currently passed a physical address.
+ It would be nice to pass an offset from the base address
+ of that region. This would avoid having to special case RAM,
+ and avoid full address decoding in every device.
+ We can't use the high bits of pd for this because
+ IO_MEM_ROMD uses these as a ram address. */
+ iotlb = (pd & ~TARGET_PAGE_MASK);
+ if (p) {
+ iotlb += p->region_offset;
+ } else {
+ iotlb += paddr;
+ }
+ }
+
+ code_address = address;
+ /* Make accesses to pages with watchpoints go via the
+ watchpoint trap routines. */
+ QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
+ if (vaddr == (wp->vaddr & TARGET_PAGE_MASK)) {
+ /* Avoid trapping reads of pages with a write breakpoint. */
+ if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) {
+ iotlb = io_mem_watch + paddr;
+ address |= TLB_MMIO;
+ break;
+ }
+ }
+ }
+
+ index = (vaddr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
+ env->iotlb[mmu_idx][index] = iotlb - vaddr;
+ te = &env->tlb_table[mmu_idx][index];
+ te->addend = addend - vaddr;
+ if (prot & PAGE_READ) {
+ te->addr_read = address;
+ } else {
+ te->addr_read = -1;
+ }
+
+ if (prot & PAGE_EXEC) {
+ te->addr_code = code_address;
+ } else {
+ te->addr_code = -1;
+ }
+ if (prot & PAGE_WRITE) {
+ if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_ROM ||
+ (pd & IO_MEM_ROMD)) {
+ /* Write access calls the I/O callback. */
+ te->addr_write = address | TLB_MMIO;
+ } else if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM &&
+ !cpu_physical_memory_is_dirty(pd)) {
+ te->addr_write = address | TLB_NOTDIRTY;
+ } else {
+ te->addr_write = address;
+ }
+ } else {
+ te->addr_write = -1;
+ }
+}
+
+#else
+
+void tlb_flush(CPUState *env, int flush_global)
+{
+}
+
+void tlb_flush_page(CPUState *env, target_ulong addr)
+{
+}
+
+/*
+ * Walks guest process memory "regions" one by one
+ * and calls callback function 'fn' for each region.
+ */
+
+struct walk_memory_regions_data
+{
+ walk_memory_regions_fn fn;
+ void *priv;
+ unsigned long start;
+ int prot;
+};
+
+static int walk_memory_regions_end(struct walk_memory_regions_data *data,
+ abi_ulong end, int new_prot)
+{
+ if (data->start != -1ul) {
+ int rc = data->fn(data->priv, data->start, end, data->prot);
+ if (rc != 0) {
+ return rc;
+ }
+ }
+
+ data->start = (new_prot ? end : -1ul);
+ data->prot = new_prot;
+
+ return 0;
+}
+
+static int walk_memory_regions_1(struct walk_memory_regions_data *data,
+ abi_ulong base, int level, void **lp)
+{
+ abi_ulong pa;
+ int i, rc;
+
+ if (*lp == NULL) {
+ return walk_memory_regions_end(data, base, 0);
+ }
+
+ if (level == 0) {
+ PageDesc *pd = *lp;
+ for (i = 0; i < L2_SIZE; ++i) {
+ int prot = pd[i].flags;
+
+ pa = base | (i << TARGET_PAGE_BITS);
+ if (prot != data->prot) {
+ rc = walk_memory_regions_end(data, pa, prot);
+ if (rc != 0) {
+ return rc;
+ }
+ }
+ }
+ } else {
+ void **pp = *lp;
+ for (i = 0; i < L2_SIZE; ++i) {
+ pa = base | ((abi_ulong)i <<
+ (TARGET_PAGE_BITS + L2_BITS * level));
+ rc = walk_memory_regions_1(data, pa, level - 1, pp + i);
+ if (rc != 0) {
+ return rc;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int walk_memory_regions(void *priv, walk_memory_regions_fn fn)
+{
+ struct walk_memory_regions_data data;
+ unsigned long i;
+
+ data.fn = fn;
+ data.priv = priv;
+ data.start = -1ul;
+ data.prot = 0;
+
+ for (i = 0; i < V_L1_SIZE; i++) {
+ int rc = walk_memory_regions_1(&data, (abi_ulong)i << V_L1_SHIFT,
+ V_L1_SHIFT / L2_BITS - 1, l1_map + i);
+ if (rc != 0) {
+ return rc;
+ }
+ }
+
+ return walk_memory_regions_end(&data, 0, 0);
+}
+
+static int dump_region(void *priv, abi_ulong start,
+ abi_ulong end, unsigned long prot)
+{
+ FILE *f = (FILE *)priv;
+
+ (void) fprintf(f, TARGET_ABI_FMT_lx"-"TARGET_ABI_FMT_lx
+ " "TARGET_ABI_FMT_lx" %c%c%c\n",
+ start, end, end - start,
+ ((prot & PAGE_READ) ? 'r' : '-'),
+ ((prot & PAGE_WRITE) ? 'w' : '-'),
+ ((prot & PAGE_EXEC) ? 'x' : '-'));
+
+ return (0);
+}
+
+/* dump memory mappings */
+void page_dump(FILE *f)
+{
+ (void) fprintf(f, "%-8s %-8s %-8s %s\n",
+ "start", "end", "size", "prot");
+ walk_memory_regions(f, dump_region);
+}
+
+int page_get_flags(target_ulong address)
+{
+ PageDesc *p;
+
+ p = page_find(address >> TARGET_PAGE_BITS);
+ if (!p)
+ return 0;
+ return p->flags;
+}
+
+/* Modify the flags of a page and invalidate the code if necessary.
+ The flag PAGE_WRITE_ORG is positioned automatically depending
+ on PAGE_WRITE. The mmap_lock should already be held. */
+void page_set_flags(target_ulong start, target_ulong end, int flags)
+{
+ target_ulong addr, len;
+
+ /* This function should never be called with addresses outside the
+ guest address space. If this assert fires, it probably indicates
+ a missing call to h2g_valid. */
+#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
+ assert(end < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
+#endif
+ assert(start < end);
+
+ start = start & TARGET_PAGE_MASK;
+ end = TARGET_PAGE_ALIGN(end);
+
+ if (flags & PAGE_WRITE) {
+ flags |= PAGE_WRITE_ORG;
+ }
+
+ for (addr = start, len = end - start;
+ len != 0;
+ len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
+ PageDesc *p = page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
+
+ /* If the write protection bit is set, then we invalidate
+ the code inside. */
+ if (!(p->flags & PAGE_WRITE) &&
+ (flags & PAGE_WRITE) &&
+ p->first_tb) {
+ tb_invalidate_phys_page(addr, 0, NULL);
+ }
+ p->flags = flags;
+ }
+}
+
+int page_check_range(target_ulong start, target_ulong len, int flags)
+{
+ PageDesc *p;
+ target_ulong end;
+ target_ulong addr;
+
+ /* This function should never be called with addresses outside the
+ guest address space. If this assert fires, it probably indicates
+ a missing call to h2g_valid. */
+#if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
+ assert(start < ((abi_ulong)1 << L1_MAP_ADDR_SPACE_BITS));
+#endif
+
+ if (len == 0) {
+ return 0;
+ }
+ if (start + len - 1 < start) {
+ /* We've wrapped around. */
+ return -1;
+ }
+
+ end = TARGET_PAGE_ALIGN(start+len); /* must do before we loose bits in the next step */
+ start = start & TARGET_PAGE_MASK;
+
+ for (addr = start, len = end - start;
+ len != 0;
+ len -= TARGET_PAGE_SIZE, addr += TARGET_PAGE_SIZE) {
+ p = page_find(addr >> TARGET_PAGE_BITS);
+ if( !p )
+ return -1;
+ if( !(p->flags & PAGE_VALID) )
+ return -1;
+
+ if ((flags & PAGE_READ) && !(p->flags & PAGE_READ))
+ return -1;
+ if (flags & PAGE_WRITE) {
+ if (!(p->flags & PAGE_WRITE_ORG))
+ return -1;
+ /* unprotect the page if it was put read-only because it
+ contains translated code */
+ if (!(p->flags & PAGE_WRITE)) {
+ if (!page_unprotect(addr, 0, NULL))
+ return -1;
+ }
+ return 0;
+ }
+ }
+ return 0;
+}
+
+/* called from signal handler: invalidate the code and unprotect the
+ page. Return TRUE if the fault was successfully handled. */
+int page_unprotect(target_ulong address, unsigned long pc, void *puc)
+{
+ unsigned int prot;
+ PageDesc *p;
+ target_ulong host_start, host_end, addr;
+
+ /* Technically this isn't safe inside a signal handler. However we
+ know this only ever happens in a synchronous SEGV handler, so in
+ practice it seems to be ok. */
+ mmap_lock();
+
+ p = page_find(address >> TARGET_PAGE_BITS);
+ if (!p) {
+ mmap_unlock();
+ return 0;
+ }
+
+ /* if the page was really writable, then we change its
+ protection back to writable */
+ if ((p->flags & PAGE_WRITE_ORG) && !(p->flags & PAGE_WRITE)) {
+ host_start = address & qemu_host_page_mask;
+ host_end = host_start + qemu_host_page_size;
+
+ prot = 0;
+ for (addr = host_start ; addr < host_end ; addr += TARGET_PAGE_SIZE) {
+ p = page_find(addr >> TARGET_PAGE_BITS);
+ p->flags |= PAGE_WRITE;
+ prot |= p->flags;
+
+ /* and since the content will be modified, we must invalidate
+ the corresponding translated code. */
+ tb_invalidate_phys_page(addr, pc, puc);
+#ifdef DEBUG_TB_CHECK
+ tb_invalidate_check(addr);
+#endif
+ }
+ mprotect((void *)g2h(host_start), qemu_host_page_size,
+ prot & PAGE_BITS);
+
+ mmap_unlock();
+ return 1;
+ }
+ mmap_unlock();
+ return 0;
+}
+
+static inline void tlb_set_dirty(CPUState *env,
+ unsigned long addr, target_ulong vaddr)
+{
+}
+#endif /* defined(CONFIG_USER_ONLY) */
+
+#if !defined(CONFIG_USER_ONLY)
+
+#define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
+typedef struct subpage_t {
+ target_phys_addr_t base;
+ ram_addr_t sub_io_index[TARGET_PAGE_SIZE];
+ ram_addr_t region_offset[TARGET_PAGE_SIZE];
+} subpage_t;
+
+static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
+ ram_addr_t memory, ram_addr_t region_offset);
+static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
+ ram_addr_t orig_memory,
+ ram_addr_t region_offset);
+#define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \
+ need_subpage) \
+ do { \
+ if (addr > start_addr) \
+ start_addr2 = 0; \
+ else { \
+ start_addr2 = start_addr & ~TARGET_PAGE_MASK; \
+ if (start_addr2 > 0) \
+ need_subpage = 1; \
+ } \
+ \
+ if ((start_addr + orig_size) - addr >= TARGET_PAGE_SIZE) \
+ end_addr2 = TARGET_PAGE_SIZE - 1; \
+ else { \
+ end_addr2 = (start_addr + orig_size - 1) & ~TARGET_PAGE_MASK; \
+ if (end_addr2 < TARGET_PAGE_SIZE - 1) \
+ need_subpage = 1; \
+ } \
+ } while (0)
+
+/* register physical memory.
+ For RAM, 'size' must be a multiple of the target page size.
+ If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an
+ io memory page. The address used when calling the IO function is
+ the offset from the start of the region, plus region_offset. Both
+ start_addr and region_offset are rounded down to a page boundary
+ before calculating this offset. This should not be a problem unless
+ the low bits of start_addr and region_offset differ. */
+void cpu_register_physical_memory_log(target_phys_addr_t start_addr,
+ ram_addr_t size,
+ ram_addr_t phys_offset,
+ ram_addr_t region_offset,
+ bool log_dirty)
+{
+ target_phys_addr_t addr, end_addr;
+ PhysPageDesc *p;
+ CPUState *env;
+ ram_addr_t orig_size = size;
+ subpage_t *subpage;
+
+ assert(size);
+ cpu_notify_set_memory(start_addr, size, phys_offset, log_dirty);
+
+ if (phys_offset == IO_MEM_UNASSIGNED) {
+ region_offset = start_addr;
+ }
+ region_offset &= TARGET_PAGE_MASK;
+ size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
+ end_addr = start_addr + (target_phys_addr_t)size;
+
+ addr = start_addr;
+ do {
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (p && p->phys_offset != IO_MEM_UNASSIGNED) {
+ ram_addr_t orig_memory = p->phys_offset;
+ target_phys_addr_t start_addr2, end_addr2;
+ int need_subpage = 0;
+
+ CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2,
+ need_subpage);
+ if (need_subpage) {
+ if (!(orig_memory & IO_MEM_SUBPAGE)) {
+ subpage = subpage_init((addr & TARGET_PAGE_MASK),
+ &p->phys_offset, orig_memory,
+ p->region_offset);
+ } else {
+ subpage = io_mem_opaque[(orig_memory & ~TARGET_PAGE_MASK)
+ >> IO_MEM_SHIFT];
+ }
+ subpage_register(subpage, start_addr2, end_addr2, phys_offset,
+ region_offset);
+ p->region_offset = 0;
+ } else {
+ p->phys_offset = phys_offset;
+ if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
+ (phys_offset & IO_MEM_ROMD))
+ phys_offset += TARGET_PAGE_SIZE;
+ }
+ } else {
+ p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1);
+ p->phys_offset = phys_offset;
+ p->region_offset = region_offset;
+ if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM ||
+ (phys_offset & IO_MEM_ROMD)) {
+ phys_offset += TARGET_PAGE_SIZE;
+ } else {
+ target_phys_addr_t start_addr2, end_addr2;
+ int need_subpage = 0;
+
+ CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr,
+ end_addr2, need_subpage);
+
+ if (need_subpage) {
+ subpage = subpage_init((addr & TARGET_PAGE_MASK),
+ &p->phys_offset, IO_MEM_UNASSIGNED,
+ addr & TARGET_PAGE_MASK);
+ subpage_register(subpage, start_addr2, end_addr2,
+ phys_offset, region_offset);
+ p->region_offset = 0;
+ }
+ }
+ }
+ region_offset += TARGET_PAGE_SIZE;
+ addr += TARGET_PAGE_SIZE;
+ } while (addr != end_addr);
+
+ /* since each CPU stores ram addresses in its TLB cache, we must
+ reset the modified entries */
+ /* XXX: slow ! */
+ for(env = first_cpu; env != NULL; env = env->next_cpu) {
+ tlb_flush(env, 1);
+ }
+}
+
+/* XXX: temporary until new memory mapping API */
+ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr)
+{
+ PhysPageDesc *p;
+
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (!p)
+ return IO_MEM_UNASSIGNED;
+ return p->phys_offset;
+}
+
+void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
+{
+ if (kvm_enabled())
+ kvm_coalesce_mmio_region(addr, size);
+}
+
+void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
+{
+ if (kvm_enabled())
+ kvm_uncoalesce_mmio_region(addr, size);
+}
+
+void qemu_flush_coalesced_mmio_buffer(void)
+{
+ if (kvm_enabled())
+ kvm_flush_coalesced_mmio_buffer();
+}
+
+#if defined(__linux__) && !defined(TARGET_S390X)
+
+#include <sys/vfs.h>
+
+#define HUGETLBFS_MAGIC 0x958458f6
+
+static long gethugepagesize(const char *path)
+{
+ struct statfs fs;
+ int ret;
+
+ do {
+ ret = statfs(path, &fs);
+ } while (ret != 0 && errno == EINTR);
+
+ if (ret != 0) {
+ perror(path);
+ return 0;
+ }
+
+ if (fs.f_type != HUGETLBFS_MAGIC)
+ fprintf(stderr, "Warning: path not on HugeTLBFS: %s\n", path);
+
+ return fs.f_bsize;
+}
+
+static void *file_ram_alloc(RAMBlock *block,
+ ram_addr_t memory,
+ const char *path)
+{
+ char *filename;
+ void *area;
+ int fd;
+#ifdef MAP_POPULATE
+ int flags;
+#endif
+ unsigned long hpagesize;
+
+ hpagesize = gethugepagesize(path);
+ if (!hpagesize) {
+ return NULL;
+ }
+
+ if (memory < hpagesize) {
+ return NULL;
+ }
+
+ if (kvm_enabled() && !kvm_has_sync_mmu()) {
+ fprintf(stderr, "host lacks kvm mmu notifiers, -mem-path unsupported\n");
+ return NULL;
+ }
+
+ if (asprintf(&filename, "%s/qemu_back_mem.XXXXXX", path) == -1) {
+ return NULL;
+ }
+
+ fd = mkstemp(filename);
+ if (fd < 0) {
+ perror("unable to create backing store for hugepages");
+ free(filename);
+ return NULL;
+ }
+ unlink(filename);
+ free(filename);
+
+ memory = (memory+hpagesize-1) & ~(hpagesize-1);
+
+ /*
+ * ftruncate is not supported by hugetlbfs in older
+ * hosts, so don't bother bailing out on errors.
+ * If anything goes wrong with it under other filesystems,
+ * mmap will fail.
+ */
+ if (ftruncate(fd, memory))
+ perror("ftruncate");
+
+#ifdef MAP_POPULATE
+ /* NB: MAP_POPULATE won't exhaustively alloc all phys pages in the case
+ * MAP_PRIVATE is requested. For mem_prealloc we mmap as MAP_SHARED
+ * to sidestep this quirk.
+ */
+ flags = mem_prealloc ? MAP_POPULATE | MAP_SHARED : MAP_PRIVATE;
+ area = mmap(0, memory, PROT_READ | PROT_WRITE, flags, fd, 0);
+#else
+ area = mmap(0, memory, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
+#endif
+ if (area == MAP_FAILED) {
+ perror("file_ram_alloc: can't mmap RAM pages");
+ close(fd);
+ return (NULL);
+ }
+ block->fd = fd;
+ return area;
+}
+#endif
+
+static ram_addr_t find_ram_offset(ram_addr_t size)
+{
+ RAMBlock *block, *next_block;
+ ram_addr_t offset = 0, mingap = ULONG_MAX;
+
+ if (QLIST_EMPTY(&ram_list.blocks))
+ return 0;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ ram_addr_t end, next = ULONG_MAX;
+
+ end = block->offset + block->length;
+
+ QLIST_FOREACH(next_block, &ram_list.blocks, next) {
+ if (next_block->offset >= end) {
+ next = MIN(next, next_block->offset);
+ }
+ }
+ if (next - end >= size && next - end < mingap) {
+ offset = end;
+ mingap = next - end;
+ }
+ }
+ return offset;
+}
+
+static ram_addr_t last_ram_offset(void)
+{
+ RAMBlock *block;
+ ram_addr_t last = 0;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next)
+ last = MAX(last, block->offset + block->length);
+
+ return last;
+}
+
+ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name,
+ ram_addr_t size, void *host)
+{
+ RAMBlock *new_block, *block;
+
+ size = TARGET_PAGE_ALIGN(size);
+ new_block = qemu_mallocz(sizeof(*new_block));
+
+ if (dev && dev->parent_bus && dev->parent_bus->info->get_dev_path) {
+ char *id = dev->parent_bus->info->get_dev_path(dev);
+ if (id) {
+ snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
+ qemu_free(id);
+ }
+ }
+ pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (!strcmp(block->idstr, new_block->idstr)) {
+ fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
+ new_block->idstr);
+ abort();
+ }
+ }
+
+ new_block->offset = find_ram_offset(size);
+ if (host) {
+ new_block->host = host;
+ new_block->flags |= RAM_PREALLOC_MASK;
+ } else {
+ if (mem_path) {
+#if defined (__linux__) && !defined(TARGET_S390X)
+ new_block->host = file_ram_alloc(new_block, size, mem_path);
+ if (!new_block->host) {
+ new_block->host = qemu_vmalloc(size);
+ qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
+ }
+#else
+ fprintf(stderr, "-mem-path option unsupported\n");
+ exit(1);
+#endif
+ } else {
+#if defined(TARGET_S390X) && defined(CONFIG_KVM)
+ /* S390 KVM requires the topmost vma of the RAM to be smaller than
+ an system defined value, which is at least 256GB. Larger systems
+ have larger values. We put the guest between the end of data
+ segment (system break) and this value. We use 32GB as a base to
+ have enough room for the system break to grow. */
+ new_block->host = mmap((void*)0x800000000, size,
+ PROT_EXEC|PROT_READ|PROT_WRITE,
+ MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
+ if (new_block->host == MAP_FAILED) {
+ fprintf(stderr, "Allocating RAM failed\n");
+ abort();
+ }
+#else
+ if (xen_enabled()) {
+ xen_ram_alloc(new_block->offset, size);
+ } else {
+ new_block->host = qemu_vmalloc(size);
+ }
+#endif
+ qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
+ }
+ }
+ new_block->length = size;
+
+ QLIST_INSERT_HEAD(&ram_list.blocks, new_block, next);
+
+ ram_list.phys_dirty = qemu_realloc(ram_list.phys_dirty,
+ last_ram_offset() >> TARGET_PAGE_BITS);
+ memset(ram_list.phys_dirty + (new_block->offset >> TARGET_PAGE_BITS),
+ 0xff, size >> TARGET_PAGE_BITS);
+
+ if (kvm_enabled())
+ kvm_setup_guest_memory(new_block->host, size);
+
+ return new_block->offset;
+}
+
+ram_addr_t qemu_ram_alloc(DeviceState *dev, const char *name, ram_addr_t size)
+{
+ return qemu_ram_alloc_from_ptr(dev, name, size, NULL);
+}
+
+void qemu_ram_free_from_ptr(ram_addr_t addr)
+{
+ RAMBlock *block;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (addr == block->offset) {
+ QLIST_REMOVE(block, next);
+ qemu_free(block);
+ return;
+ }
+ }
+}
+
+void qemu_ram_free(ram_addr_t addr)
+{
+ RAMBlock *block;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (addr == block->offset) {
+ QLIST_REMOVE(block, next);
+ if (block->flags & RAM_PREALLOC_MASK) {
+ ;
+ } else if (mem_path) {
+#if defined (__linux__) && !defined(TARGET_S390X)
+ if (block->fd) {
+ munmap(block->host, block->length);
+ close(block->fd);
+ } else {
+ qemu_vfree(block->host);
+ }
+#else
+ abort();
+#endif
+ } else {
+#if defined(TARGET_S390X) && defined(CONFIG_KVM)
+ munmap(block->host, block->length);
+#else
+ if (xen_enabled()) {
+ xen_invalidate_map_cache_entry(block->host);
+ } else {
+ qemu_vfree(block->host);
+ }
+#endif
+ }
+ qemu_free(block);
+ return;
+ }
+ }
+
+}
+
+#ifndef _WIN32
+void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
+{
+ RAMBlock *block;
+ ram_addr_t offset;
+ int flags;
+ void *area, *vaddr;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ offset = addr - block->offset;
+ if (offset < block->length) {
+ vaddr = block->host + offset;
+ if (block->flags & RAM_PREALLOC_MASK) {
+ ;
+ } else {
+ flags = MAP_FIXED;
+ munmap(vaddr, length);
+ if (mem_path) {
+#if defined(__linux__) && !defined(TARGET_S390X)
+ if (block->fd) {
+#ifdef MAP_POPULATE
+ flags |= mem_prealloc ? MAP_POPULATE | MAP_SHARED :
+ MAP_PRIVATE;
+#else
+ flags |= MAP_PRIVATE;
+#endif
+ area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
+ flags, block->fd, offset);
+ } else {
+ flags |= MAP_PRIVATE | MAP_ANONYMOUS;
+ area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
+ flags, -1, 0);
+ }
+#else
+ abort();
+#endif
+ } else {
+#if defined(TARGET_S390X) && defined(CONFIG_KVM)
+ flags |= MAP_SHARED | MAP_ANONYMOUS;
+ area = mmap(vaddr, length, PROT_EXEC|PROT_READ|PROT_WRITE,
+ flags, -1, 0);
+#else
+ flags |= MAP_PRIVATE | MAP_ANONYMOUS;
+ area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
+ flags, -1, 0);
+#endif
+ }
+ if (area != vaddr) {
+ fprintf(stderr, "Could not remap addr: %lx@%lx\n",
+ length, addr);
+ exit(1);
+ }
+ qemu_madvise(vaddr, length, QEMU_MADV_MERGEABLE);
+ }
+ return;
+ }
+ }
+}
+#endif /* !_WIN32 */
+
+/* Return a host pointer to ram allocated with qemu_ram_alloc.
+ With the exception of the softmmu code in this file, this should
+ only be used for local memory (e.g. video ram) that the device owns,
+ and knows it isn't going to access beyond the end of the block.
+
+ It should not be used for general purpose DMA.
+ Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
+ */
+void *qemu_get_ram_ptr(ram_addr_t addr)
+{
+ RAMBlock *block;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (addr - block->offset < block->length) {
+ /* Move this entry to to start of the list. */
+ if (block != QLIST_FIRST(&ram_list.blocks)) {
+ QLIST_REMOVE(block, next);
+ QLIST_INSERT_HEAD(&ram_list.blocks, block, next);
+ }
+ if (xen_enabled()) {
+ /* We need to check if the requested address is in the RAM
+ * because we don't want to map the entire memory in QEMU.
+ * In that case just map until the end of the page.
+ */
+ if (block->offset == 0) {
+ return xen_map_cache(addr, 0, 0);
+ } else if (block->host == NULL) {
+ block->host =
+ xen_map_cache(block->offset, block->length, 1);
+ }
+ }
+ return block->host + (addr - block->offset);
+ }
+ }
+
+ fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
+ abort();
+
+ return NULL;
+}
+
+/* Return a host pointer to ram allocated with qemu_ram_alloc.
+ * Same as qemu_get_ram_ptr but avoid reordering ramblocks.
+ */
+void *qemu_safe_ram_ptr(ram_addr_t addr)
+{
+ RAMBlock *block;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (addr - block->offset < block->length) {
+ if (xen_enabled()) {
+ /* We need to check if the requested address is in the RAM
+ * because we don't want to map the entire memory in QEMU.
+ * In that case just map until the end of the page.
+ */
+ if (block->offset == 0) {
+ return xen_map_cache(addr, 0, 0);
+ } else if (block->host == NULL) {
+ block->host =
+ xen_map_cache(block->offset, block->length, 1);
+ }
+ }
+ return block->host + (addr - block->offset);
+ }
+ }
+
+ fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
+ abort();
+
+ return NULL;
+}
+
+/* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
+ * but takes a size argument */
+void *qemu_ram_ptr_length(ram_addr_t addr, ram_addr_t *size)
+{
+ if (*size == 0) {
+ return NULL;
+ }
+ if (xen_enabled()) {
+ return xen_map_cache(addr, *size, 1);
+ } else {
+ RAMBlock *block;
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ if (addr - block->offset < block->length) {
+ if (addr - block->offset + *size > block->length)
+ *size = block->length - addr + block->offset;
+ return block->host + (addr - block->offset);
+ }
+ }
+
+ fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
+ abort();
+ }
+}
+
+void qemu_put_ram_ptr(void *addr)
+{
+ trace_qemu_put_ram_ptr(addr);
+}
+
+int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
+{
+ RAMBlock *block;
+ uint8_t *host = ptr;
+
+ if (xen_enabled()) {
+ *ram_addr = xen_ram_addr_from_mapcache(ptr);
+ return 0;
+ }
+
+ QLIST_FOREACH(block, &ram_list.blocks, next) {
+ /* This case append when the block is not mapped. */
+ if (block->host == NULL) {
+ continue;
+ }
+ if (host - block->host < block->length) {
+ *ram_addr = block->offset + (host - block->host);
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+/* Some of the softmmu routines need to translate from a host pointer
+ (typically a TLB entry) back to a ram offset. */
+ram_addr_t qemu_ram_addr_from_host_nofail(void *ptr)
+{
+ ram_addr_t ram_addr;
+
+ if (qemu_ram_addr_from_host(ptr, &ram_addr)) {
+ fprintf(stderr, "Bad ram pointer %p\n", ptr);
+ abort();
+ }
+ return ram_addr;
+}
+
+static uint32_t unassigned_mem_readb(void *opaque, target_phys_addr_t addr)
+{
+#ifdef DEBUG_UNASSIGNED
+ printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
+#endif
+#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
+ cpu_unassigned_access(cpu_single_env, addr, 0, 0, 0, 1);
+#endif
+ return 0;
+}
+
+static uint32_t unassigned_mem_readw(void *opaque, target_phys_addr_t addr)
+{
+#ifdef DEBUG_UNASSIGNED
+ printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
+#endif
+#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
+ cpu_unassigned_access(cpu_single_env, addr, 0, 0, 0, 2);
+#endif
+ return 0;
+}
+
+static uint32_t unassigned_mem_readl(void *opaque, target_phys_addr_t addr)
+{
+#ifdef DEBUG_UNASSIGNED
+ printf("Unassigned mem read " TARGET_FMT_plx "\n", addr);
+#endif
+#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
+ cpu_unassigned_access(cpu_single_env, addr, 0, 0, 0, 4);
+#endif
+ return 0;
+}
+
+static void unassigned_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
+{
+#ifdef DEBUG_UNASSIGNED
+ printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
+#endif
+#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
+ cpu_unassigned_access(cpu_single_env, addr, 1, 0, 0, 1);
+#endif
+}
+
+static void unassigned_mem_writew(void *opaque, target_phys_addr_t addr, uint32_t val)
+{
+#ifdef DEBUG_UNASSIGNED
+ printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
+#endif
+#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
+ cpu_unassigned_access(cpu_single_env, addr, 1, 0, 0, 2);
+#endif
+}
+
+static void unassigned_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
+{
+#ifdef DEBUG_UNASSIGNED
+ printf("Unassigned mem write " TARGET_FMT_plx " = 0x%x\n", addr, val);
+#endif
+#if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
+ cpu_unassigned_access(cpu_single_env, addr, 1, 0, 0, 4);
+#endif
+}
+
+static CPUReadMemoryFunc * const unassigned_mem_read[3] = {
+ unassigned_mem_readb,
+ unassigned_mem_readw,
+ unassigned_mem_readl,
+};
+
+static CPUWriteMemoryFunc * const unassigned_mem_write[3] = {
+ unassigned_mem_writeb,
+ unassigned_mem_writew,
+ unassigned_mem_writel,
+};
+
+static void notdirty_mem_writeb(void *opaque, target_phys_addr_t ram_addr,
+ uint32_t val)
+{
+ int dirty_flags;
+ dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
+ if (!(dirty_flags & CODE_DIRTY_FLAG)) {
+#if !defined(CONFIG_USER_ONLY)
+ tb_invalidate_phys_page_fast(ram_addr, 1);
+ dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
+#endif
+ }
+ stb_p(qemu_get_ram_ptr(ram_addr), val);
+ dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
+ cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
+ /* we remove the notdirty callback only if the code has been
+ flushed */
+ if (dirty_flags == 0xff)
+ tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
+}
+
+static void notdirty_mem_writew(void *opaque, target_phys_addr_t ram_addr,
+ uint32_t val)
+{
+ int dirty_flags;
+ dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
+ if (!(dirty_flags & CODE_DIRTY_FLAG)) {
+#if !defined(CONFIG_USER_ONLY)
+ tb_invalidate_phys_page_fast(ram_addr, 2);
+ dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
+#endif
+ }
+ stw_p(qemu_get_ram_ptr(ram_addr), val);
+ dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
+ cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
+ /* we remove the notdirty callback only if the code has been
+ flushed */
+ if (dirty_flags == 0xff)
+ tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
+}
+
+static void notdirty_mem_writel(void *opaque, target_phys_addr_t ram_addr,
+ uint32_t val)
+{
+ int dirty_flags;
+ dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
+ if (!(dirty_flags & CODE_DIRTY_FLAG)) {
+#if !defined(CONFIG_USER_ONLY)
+ tb_invalidate_phys_page_fast(ram_addr, 4);
+ dirty_flags = cpu_physical_memory_get_dirty_flags(ram_addr);
+#endif
+ }
+ stl_p(qemu_get_ram_ptr(ram_addr), val);
+ dirty_flags |= (0xff & ~CODE_DIRTY_FLAG);
+ cpu_physical_memory_set_dirty_flags(ram_addr, dirty_flags);
+ /* we remove the notdirty callback only if the code has been
+ flushed */
+ if (dirty_flags == 0xff)
+ tlb_set_dirty(cpu_single_env, cpu_single_env->mem_io_vaddr);
+}
+
+static CPUReadMemoryFunc * const error_mem_read[3] = {
+ NULL, /* never used */
+ NULL, /* never used */
+ NULL, /* never used */
+};
+
+static CPUWriteMemoryFunc * const notdirty_mem_write[3] = {
+ notdirty_mem_writeb,
+ notdirty_mem_writew,
+ notdirty_mem_writel,
+};
+
+/* Generate a debug exception if a watchpoint has been hit. */
+static void check_watchpoint(int offset, int len_mask, int flags)
+{
+ CPUState *env = cpu_single_env;
+ target_ulong pc, cs_base;
+ TranslationBlock *tb;
+ target_ulong vaddr;
+ CPUWatchpoint *wp;
+ int cpu_flags;
+
+ if (env->watchpoint_hit) {
+ /* We re-entered the check after replacing the TB. Now raise
+ * the debug interrupt so that is will trigger after the
+ * current instruction. */
+ cpu_interrupt(env, CPU_INTERRUPT_DEBUG);
+ return;
+ }
+ vaddr = (env->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
+ QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
+ if ((vaddr == (wp->vaddr & len_mask) ||
+ (vaddr & wp->len_mask) == wp->vaddr) && (wp->flags & flags)) {
+ wp->flags |= BP_WATCHPOINT_HIT;
+ if (!env->watchpoint_hit) {
+ env->watchpoint_hit = wp;
+ tb = tb_find_pc(env->mem_io_pc);
+ if (!tb) {
+ cpu_abort(env, "check_watchpoint: could not find TB for "
+ "pc=%p", (void *)env->mem_io_pc);
+ }
+ cpu_restore_state(tb, env, env->mem_io_pc);
+ tb_phys_invalidate(tb, -1);
+ if (wp->flags & BP_STOP_BEFORE_ACCESS) {
+ env->exception_index = EXCP_DEBUG;
+ } else {
+ cpu_get_tb_cpu_state(env, &pc, &cs_base, &cpu_flags);
+ tb_gen_code(env, pc, cs_base, cpu_flags, 1);
+ }
+ cpu_resume_from_signal(env, NULL);
+ }
+ } else {
+ wp->flags &= ~BP_WATCHPOINT_HIT;
+ }
+ }
+}
+
+/* Watchpoint access routines. Watchpoints are inserted using TLB tricks,
+ so these check for a hit then pass through to the normal out-of-line
+ phys routines. */
+static uint32_t watch_mem_readb(void *opaque, target_phys_addr_t addr)
+{
+ check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_READ);
+ return ldub_phys(addr);
+}
+
+static uint32_t watch_mem_readw(void *opaque, target_phys_addr_t addr)
+{
+ check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_READ);
+ return lduw_phys(addr);
+}
+
+static uint32_t watch_mem_readl(void *opaque, target_phys_addr_t addr)
+{
+ check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_READ);
+ return ldl_phys(addr);
+}
+
+static void watch_mem_writeb(void *opaque, target_phys_addr_t addr,
+ uint32_t val)
+{
+ check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x0, BP_MEM_WRITE);
+ stb_phys(addr, val);
+}
+
+static void watch_mem_writew(void *opaque, target_phys_addr_t addr,
+ uint32_t val)
+{
+ check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x1, BP_MEM_WRITE);
+ stw_phys(addr, val);
+}
+
+static void watch_mem_writel(void *opaque, target_phys_addr_t addr,
+ uint32_t val)
+{
+ check_watchpoint(addr & ~TARGET_PAGE_MASK, ~0x3, BP_MEM_WRITE);
+ stl_phys(addr, val);
+}
+
+static CPUReadMemoryFunc * const watch_mem_read[3] = {
+ watch_mem_readb,
+ watch_mem_readw,
+ watch_mem_readl,
+};
+
+static CPUWriteMemoryFunc * const watch_mem_write[3] = {
+ watch_mem_writeb,
+ watch_mem_writew,
+ watch_mem_writel,
+};
+
+static inline uint32_t subpage_readlen (subpage_t *mmio,
+ target_phys_addr_t addr,
+ unsigned int len)
+{
+ unsigned int idx = SUBPAGE_IDX(addr);
+#if defined(DEBUG_SUBPAGE)
+ printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d\n", __func__,
+ mmio, len, addr, idx);
+#endif
+
+ addr += mmio->region_offset[idx];
+ idx = mmio->sub_io_index[idx];
+ return io_mem_read[idx][len](io_mem_opaque[idx], addr);
+}
+
+static inline void subpage_writelen (subpage_t *mmio, target_phys_addr_t addr,
+ uint32_t value, unsigned int len)
+{
+ unsigned int idx = SUBPAGE_IDX(addr);
+#if defined(DEBUG_SUBPAGE)
+ printf("%s: subpage %p len %d addr " TARGET_FMT_plx " idx %d value %08x\n",
+ __func__, mmio, len, addr, idx, value);
+#endif
+
+ addr += mmio->region_offset[idx];
+ idx = mmio->sub_io_index[idx];
+ io_mem_write[idx][len](io_mem_opaque[idx], addr, value);
+}
+
+static uint32_t subpage_readb (void *opaque, target_phys_addr_t addr)
+{
+ return subpage_readlen(opaque, addr, 0);
+}
+
+static void subpage_writeb (void *opaque, target_phys_addr_t addr,
+ uint32_t value)
+{
+ subpage_writelen(opaque, addr, value, 0);
+}
+
+static uint32_t subpage_readw (void *opaque, target_phys_addr_t addr)
+{
+ return subpage_readlen(opaque, addr, 1);
+}
+
+static void subpage_writew (void *opaque, target_phys_addr_t addr,
+ uint32_t value)
+{
+ subpage_writelen(opaque, addr, value, 1);
+}
+
+static uint32_t subpage_readl (void *opaque, target_phys_addr_t addr)
+{
+ return subpage_readlen(opaque, addr, 2);
+}
+
+static void subpage_writel (void *opaque, target_phys_addr_t addr,
+ uint32_t value)
+{
+ subpage_writelen(opaque, addr, value, 2);
+}
+
+static CPUReadMemoryFunc * const subpage_read[] = {
+ &subpage_readb,
+ &subpage_readw,
+ &subpage_readl,
+};
+
+static CPUWriteMemoryFunc * const subpage_write[] = {
+ &subpage_writeb,
+ &subpage_writew,
+ &subpage_writel,
+};
+
+static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
+ ram_addr_t memory, ram_addr_t region_offset)
+{
+ int idx, eidx;
+
+ if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
+ return -1;
+ idx = SUBPAGE_IDX(start);
+ eidx = SUBPAGE_IDX(end);
+#if defined(DEBUG_SUBPAGE)
+ printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__,
+ mmio, start, end, idx, eidx, memory);
+#endif
+ if ((memory & ~TARGET_PAGE_MASK) == IO_MEM_RAM)
+ memory = IO_MEM_UNASSIGNED;
+ memory = (memory >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ for (; idx <= eidx; idx++) {
+ mmio->sub_io_index[idx] = memory;
+ mmio->region_offset[idx] = region_offset;
+ }
+
+ return 0;
+}
+
+static subpage_t *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
+ ram_addr_t orig_memory,
+ ram_addr_t region_offset)
+{
+ subpage_t *mmio;
+ int subpage_memory;
+
+ mmio = qemu_mallocz(sizeof(subpage_t));
+
+ mmio->base = base;
+ subpage_memory = cpu_register_io_memory(subpage_read, subpage_write, mmio,
+ DEVICE_NATIVE_ENDIAN);
+#if defined(DEBUG_SUBPAGE)
+ printf("%s: %p base " TARGET_FMT_plx " len %08x %d\n", __func__,
+ mmio, base, TARGET_PAGE_SIZE, subpage_memory);
+#endif
+ *phys = subpage_memory | IO_MEM_SUBPAGE;
+ subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, orig_memory, region_offset);
+
+ return mmio;
+}
+
+static int get_free_io_mem_idx(void)
+{
+ int i;
+
+ for (i = 0; i<IO_MEM_NB_ENTRIES; i++)
+ if (!io_mem_used[i]) {
+ io_mem_used[i] = 1;
+ return i;
+ }
+ fprintf(stderr, "RAN out out io_mem_idx, max %d !\n", IO_MEM_NB_ENTRIES);
+ return -1;
+}
+
+/*
+ * Usually, devices operate in little endian mode. There are devices out
+ * there that operate in big endian too. Each device gets byte swapped
+ * mmio if plugged onto a CPU that does the other endianness.
+ *
+ * CPU Device swap?
+ *
+ * little little no
+ * little big yes
+ * big little yes
+ * big big no
+ */
+
+typedef struct SwapEndianContainer {
+ CPUReadMemoryFunc *read[3];
+ CPUWriteMemoryFunc *write[3];
+ void *opaque;
+} SwapEndianContainer;
+
+static uint32_t swapendian_mem_readb (void *opaque, target_phys_addr_t addr)
+{
+ uint32_t val;
+ SwapEndianContainer *c = opaque;
+ val = c->read[0](c->opaque, addr);
+ return val;
+}
+
+static uint32_t swapendian_mem_readw(void *opaque, target_phys_addr_t addr)
+{
+ uint32_t val;
+ SwapEndianContainer *c = opaque;
+ val = bswap16(c->read[1](c->opaque, addr));
+ return val;
+}
+
+static uint32_t swapendian_mem_readl(void *opaque, target_phys_addr_t addr)
+{
+ uint32_t val;
+ SwapEndianContainer *c = opaque;
+ val = bswap32(c->read[2](c->opaque, addr));
+ return val;
+}
+
+static CPUReadMemoryFunc * const swapendian_readfn[3]={
+ swapendian_mem_readb,
+ swapendian_mem_readw,
+ swapendian_mem_readl
+};
+
+static void swapendian_mem_writeb(void *opaque, target_phys_addr_t addr,
+ uint32_t val)
+{
+ SwapEndianContainer *c = opaque;
+ c->write[0](c->opaque, addr, val);
+}
+
+static void swapendian_mem_writew(void *opaque, target_phys_addr_t addr,
+ uint32_t val)
+{
+ SwapEndianContainer *c = opaque;
+ c->write[1](c->opaque, addr, bswap16(val));
+}
+
+static void swapendian_mem_writel(void *opaque, target_phys_addr_t addr,
+ uint32_t val)
+{
+ SwapEndianContainer *c = opaque;
+ c->write[2](c->opaque, addr, bswap32(val));
+}
+
+static CPUWriteMemoryFunc * const swapendian_writefn[3]={
+ swapendian_mem_writeb,
+ swapendian_mem_writew,
+ swapendian_mem_writel
+};
+
+static void swapendian_init(int io_index)
+{
+ SwapEndianContainer *c = qemu_malloc(sizeof(SwapEndianContainer));
+ int i;
+
+ /* Swap mmio for big endian targets */
+ c->opaque = io_mem_opaque[io_index];
+ for (i = 0; i < 3; i++) {
+ c->read[i] = io_mem_read[io_index][i];
+ c->write[i] = io_mem_write[io_index][i];
+
+ io_mem_read[io_index][i] = swapendian_readfn[i];
+ io_mem_write[io_index][i] = swapendian_writefn[i];
+ }
+ io_mem_opaque[io_index] = c;
+}
+
+static void swapendian_del(int io_index)
+{
+ if (io_mem_read[io_index][0] == swapendian_readfn[0]) {
+ qemu_free(io_mem_opaque[io_index]);
+ }
+}
+
+/* mem_read and mem_write are arrays of functions containing the
+ function to access byte (index 0), word (index 1) and dword (index
+ 2). Functions can be omitted with a NULL function pointer.
+ If io_index is non zero, the corresponding io zone is
+ modified. If it is zero, a new io zone is allocated. The return
+ value can be used with cpu_register_physical_memory(). (-1) is
+ returned if error. */
+static int cpu_register_io_memory_fixed(int io_index,
+ CPUReadMemoryFunc * const *mem_read,
+ CPUWriteMemoryFunc * const *mem_write,
+ void *opaque, enum device_endian endian)
+{
+ int i;
+
+ if (io_index <= 0) {
+ io_index = get_free_io_mem_idx();
+ if (io_index == -1)
+ return io_index;
+ } else {
+ io_index >>= IO_MEM_SHIFT;
+ if (io_index >= IO_MEM_NB_ENTRIES)
+ return -1;
+ }
+
+ for (i = 0; i < 3; ++i) {
+ io_mem_read[io_index][i]
+ = (mem_read[i] ? mem_read[i] : unassigned_mem_read[i]);
+ }
+ for (i = 0; i < 3; ++i) {
+ io_mem_write[io_index][i]
+ = (mem_write[i] ? mem_write[i] : unassigned_mem_write[i]);
+ }
+ io_mem_opaque[io_index] = opaque;
+
+ switch (endian) {
+ case DEVICE_BIG_ENDIAN:
+#ifndef TARGET_WORDS_BIGENDIAN
+ swapendian_init(io_index);
+#endif
+ break;
+ case DEVICE_LITTLE_ENDIAN:
+#ifdef TARGET_WORDS_BIGENDIAN
+ swapendian_init(io_index);
+#endif
+ break;
+ case DEVICE_NATIVE_ENDIAN:
+ default:
+ break;
+ }
+
+ return (io_index << IO_MEM_SHIFT);
+}
+
+int cpu_register_io_memory(CPUReadMemoryFunc * const *mem_read,
+ CPUWriteMemoryFunc * const *mem_write,
+ void *opaque, enum device_endian endian)
+{
+ return cpu_register_io_memory_fixed(0, mem_read, mem_write, opaque, endian);
+}
+
+void cpu_unregister_io_memory(int io_table_address)
+{
+ int i;
+ int io_index = io_table_address >> IO_MEM_SHIFT;
+
+ swapendian_del(io_index);
+
+ for (i=0;i < 3; i++) {
+ io_mem_read[io_index][i] = unassigned_mem_read[i];
+ io_mem_write[io_index][i] = unassigned_mem_write[i];
+ }
+ io_mem_opaque[io_index] = NULL;
+ io_mem_used[io_index] = 0;
+}
+
+static void io_mem_init(void)
+{
+ int i;
+
+ cpu_register_io_memory_fixed(IO_MEM_ROM, error_mem_read,
+ unassigned_mem_write, NULL,
+ DEVICE_NATIVE_ENDIAN);
+ cpu_register_io_memory_fixed(IO_MEM_UNASSIGNED, unassigned_mem_read,
+ unassigned_mem_write, NULL,
+ DEVICE_NATIVE_ENDIAN);
+ cpu_register_io_memory_fixed(IO_MEM_NOTDIRTY, error_mem_read,
+ notdirty_mem_write, NULL,
+ DEVICE_NATIVE_ENDIAN);
+ for (i=0; i<5; i++)
+ io_mem_used[i] = 1;
+
+ io_mem_watch = cpu_register_io_memory(watch_mem_read,
+ watch_mem_write, NULL,
+ DEVICE_NATIVE_ENDIAN);
+}
+
+#endif /* !defined(CONFIG_USER_ONLY) */
+
+/* physical memory access (slow version, mainly for debug) */
+#if defined(CONFIG_USER_ONLY)
+int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
+ uint8_t *buf, int len, int is_write)
+{
+ int l, flags;
+ target_ulong page;
+ void * p;
+
+ while (len > 0) {
+ page = addr & TARGET_PAGE_MASK;
+ l = (page + TARGET_PAGE_SIZE) - addr;
+ if (l > len)
+ l = len;
+ flags = page_get_flags(page);
+ if (!(flags & PAGE_VALID))
+ return -1;
+ if (is_write) {
+ if (!(flags & PAGE_WRITE))
+ return -1;
+ /* XXX: this code should not depend on lock_user */
+ if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
+ return -1;
+ memcpy(p, buf, l);
+ unlock_user(p, addr, l);
+ } else {
+ if (!(flags & PAGE_READ))
+ return -1;
+ /* XXX: this code should not depend on lock_user */
+ if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
+ return -1;
+ memcpy(buf, p, l);
+ unlock_user(p, addr, 0);
+ }
+ len -= l;
+ buf += l;
+ addr += l;
+ }
+ return 0;
+}
+
+#else
+void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
+ int len, int is_write)
+{
+ int l, io_index;
+ uint8_t *ptr;
+ uint32_t val;
+ target_phys_addr_t page;
+ unsigned long pd;
+ PhysPageDesc *p;
+
+ while (len > 0) {
+ page = addr & TARGET_PAGE_MASK;
+ l = (page + TARGET_PAGE_SIZE) - addr;
+ if (l > len)
+ l = len;
+ p = phys_page_find(page >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if (is_write) {
+ if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
+ target_phys_addr_t addr1 = addr;
+ io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ if (p)
+ addr1 = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
+ /* XXX: could force cpu_single_env to NULL to avoid
+ potential bugs */
+ if (l >= 4 && ((addr1 & 3) == 0)) {
+ /* 32 bit write access */
+ val = ldl_p(buf);
+ io_mem_write[io_index][2](io_mem_opaque[io_index], addr1, val);
+ l = 4;
+ } else if (l >= 2 && ((addr1 & 1) == 0)) {
+ /* 16 bit write access */
+ val = lduw_p(buf);
+ io_mem_write[io_index][1](io_mem_opaque[io_index], addr1, val);
+ l = 2;
+ } else {
+ /* 8 bit write access */
+ val = ldub_p(buf);
+ io_mem_write[io_index][0](io_mem_opaque[io_index], addr1, val);
+ l = 1;
+ }
+ } else {
+ unsigned long addr1;
+ addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
+ /* RAM case */
+ ptr = qemu_get_ram_ptr(addr1);
+ memcpy(ptr, buf, l);
+ if (!cpu_physical_memory_is_dirty(addr1)) {
+ /* invalidate code */
+ tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
+ /* set dirty bit */
+ cpu_physical_memory_set_dirty_flags(
+ addr1, (0xff & ~CODE_DIRTY_FLAG));
+ }
+ qemu_put_ram_ptr(ptr);
+ }
+ } else {
+ if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
+ !(pd & IO_MEM_ROMD)) {
+ target_phys_addr_t addr1 = addr;
+ /* I/O case */
+ io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ if (p)
+ addr1 = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
+ if (l >= 4 && ((addr1 & 3) == 0)) {
+ /* 32 bit read access */
+ val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr1);
+ stl_p(buf, val);
+ l = 4;
+ } else if (l >= 2 && ((addr1 & 1) == 0)) {
+ /* 16 bit read access */
+ val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr1);
+ stw_p(buf, val);
+ l = 2;
+ } else {
+ /* 8 bit read access */
+ val = io_mem_read[io_index][0](io_mem_opaque[io_index], addr1);
+ stb_p(buf, val);
+ l = 1;
+ }
+ } else {
+ /* RAM case */
+ ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK);
+ memcpy(buf, ptr + (addr & ~TARGET_PAGE_MASK), l);
+ qemu_put_ram_ptr(ptr);
+ }
+ }
+ len -= l;
+ buf += l;
+ addr += l;
+ }
+}
+
+/* used for ROM loading : can write in RAM and ROM */
+void cpu_physical_memory_write_rom(target_phys_addr_t addr,
+ const uint8_t *buf, int len)
+{
+ int l;
+ uint8_t *ptr;
+ target_phys_addr_t page;
+ unsigned long pd;
+ PhysPageDesc *p;
+
+ while (len > 0) {
+ page = addr & TARGET_PAGE_MASK;
+ l = (page + TARGET_PAGE_SIZE) - addr;
+ if (l > len)
+ l = len;
+ p = phys_page_find(page >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM &&
+ (pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM &&
+ !(pd & IO_MEM_ROMD)) {
+ /* do nothing */
+ } else {
+ unsigned long addr1;
+ addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
+ /* ROM/RAM case */
+ ptr = qemu_get_ram_ptr(addr1);
+ memcpy(ptr, buf, l);
+ qemu_put_ram_ptr(ptr);
+ }
+ len -= l;
+ buf += l;
+ addr += l;
+ }
+}
+
+typedef struct {
+ void *buffer;
+ target_phys_addr_t addr;
+ target_phys_addr_t len;
+} BounceBuffer;
+
+static BounceBuffer bounce;
+
+typedef struct MapClient {
+ void *opaque;
+ void (*callback)(void *opaque);
+ QLIST_ENTRY(MapClient) link;
+} MapClient;
+
+static QLIST_HEAD(map_client_list, MapClient) map_client_list
+ = QLIST_HEAD_INITIALIZER(map_client_list);
+
+void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque))
+{
+ MapClient *client = qemu_malloc(sizeof(*client));
+
+ client->opaque = opaque;
+ client->callback = callback;
+ QLIST_INSERT_HEAD(&map_client_list, client, link);
+ return client;
+}
+
+void cpu_unregister_map_client(void *_client)
+{
+ MapClient *client = (MapClient *)_client;
+
+ QLIST_REMOVE(client, link);
+ qemu_free(client);
+}
+
+static void cpu_notify_map_clients(void)
+{
+ MapClient *client;
+
+ while (!QLIST_EMPTY(&map_client_list)) {
+ client = QLIST_FIRST(&map_client_list);
+ client->callback(client->opaque);
+ cpu_unregister_map_client(client);
+ }
+}
+
+/* Map a physical memory region into a host virtual address.
+ * May map a subset of the requested range, given by and returned in *plen.
+ * May return NULL if resources needed to perform the mapping are exhausted.
+ * Use only for reads OR writes - not for read-modify-write operations.
+ * Use cpu_register_map_client() to know when retrying the map operation is
+ * likely to succeed.
+ */
+void *cpu_physical_memory_map(target_phys_addr_t addr,
+ target_phys_addr_t *plen,
+ int is_write)
+{
+ target_phys_addr_t len = *plen;
+ target_phys_addr_t todo = 0;
+ int l;
+ target_phys_addr_t page;
+ unsigned long pd;
+ PhysPageDesc *p;
+ ram_addr_t raddr = ULONG_MAX;
+ ram_addr_t rlen;
+ void *ret;
+
+ while (len > 0) {
+ page = addr & TARGET_PAGE_MASK;
+ l = (page + TARGET_PAGE_SIZE) - addr;
+ if (l > len)
+ l = len;
+ p = phys_page_find(page >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
+ if (todo || bounce.buffer) {
+ break;
+ }
+ bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, TARGET_PAGE_SIZE);
+ bounce.addr = addr;
+ bounce.len = l;
+ if (!is_write) {
+ cpu_physical_memory_read(addr, bounce.buffer, l);
+ }
+
+ *plen = l;
+ return bounce.buffer;
+ }
+ if (!todo) {
+ raddr = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
+ }
+
+ len -= l;
+ addr += l;
+ todo += l;
+ }
+ rlen = todo;
+ ret = qemu_ram_ptr_length(raddr, &rlen);
+ *plen = rlen;
+ return ret;
+}
+
+/* Unmaps a memory region previously mapped by cpu_physical_memory_map().
+ * Will also mark the memory as dirty if is_write == 1. access_len gives
+ * the amount of memory that was actually read or written by the caller.
+ */
+void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
+ int is_write, target_phys_addr_t access_len)
+{
+ if (buffer != bounce.buffer) {
+ if (is_write) {
+ ram_addr_t addr1 = qemu_ram_addr_from_host_nofail(buffer);
+ while (access_len) {
+ unsigned l;
+ l = TARGET_PAGE_SIZE;
+ if (l > access_len)
+ l = access_len;
+ if (!cpu_physical_memory_is_dirty(addr1)) {
+ /* invalidate code */
+ tb_invalidate_phys_page_range(addr1, addr1 + l, 0);
+ /* set dirty bit */
+ cpu_physical_memory_set_dirty_flags(
+ addr1, (0xff & ~CODE_DIRTY_FLAG));
+ }
+ addr1 += l;
+ access_len -= l;
+ }
+ }
+ if (xen_enabled()) {
+ xen_invalidate_map_cache_entry(buffer);
+ }
+ return;
+ }
+ if (is_write) {
+ cpu_physical_memory_write(bounce.addr, bounce.buffer, access_len);
+ }
+ qemu_vfree(bounce.buffer);
+ bounce.buffer = NULL;
+ cpu_notify_map_clients();
+}
+
+/* warning: addr must be aligned */
+static inline uint32_t ldl_phys_internal(target_phys_addr_t addr,
+ enum device_endian endian)
+{
+ int io_index;
+ uint8_t *ptr;
+ uint32_t val;
+ unsigned long pd;
+ PhysPageDesc *p;
+
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
+ !(pd & IO_MEM_ROMD)) {
+ /* I/O case */
+ io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ if (p)
+ addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
+ val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
+#if defined(TARGET_WORDS_BIGENDIAN)
+ if (endian == DEVICE_LITTLE_ENDIAN) {
+ val = bswap32(val);
+ }
+#else
+ if (endian == DEVICE_BIG_ENDIAN) {
+ val = bswap32(val);
+ }
+#endif
+ } else {
+ /* RAM case */
+ ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
+ (addr & ~TARGET_PAGE_MASK);
+ switch (endian) {
+ case DEVICE_LITTLE_ENDIAN:
+ val = ldl_le_p(ptr);
+ break;
+ case DEVICE_BIG_ENDIAN:
+ val = ldl_be_p(ptr);
+ break;
+ default:
+ val = ldl_p(ptr);
+ break;
+ }
+ }
+ return val;
+}
+
+uint32_t ldl_phys(target_phys_addr_t addr)
+{
+ return ldl_phys_internal(addr, DEVICE_NATIVE_ENDIAN);
+}
+
+uint32_t ldl_le_phys(target_phys_addr_t addr)
+{
+ return ldl_phys_internal(addr, DEVICE_LITTLE_ENDIAN);
+}
+
+uint32_t ldl_be_phys(target_phys_addr_t addr)
+{
+ return ldl_phys_internal(addr, DEVICE_BIG_ENDIAN);
+}
+
+/* warning: addr must be aligned */
+static inline uint64_t ldq_phys_internal(target_phys_addr_t addr,
+ enum device_endian endian)
+{
+ int io_index;
+ uint8_t *ptr;
+ uint64_t val;
+ unsigned long pd;
+ PhysPageDesc *p;
+
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
+ !(pd & IO_MEM_ROMD)) {
+ /* I/O case */
+ io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ if (p)
+ addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
+
+ /* XXX This is broken when device endian != cpu endian.
+ Fix and add "endian" variable check */
+#ifdef TARGET_WORDS_BIGENDIAN
+ val = (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr) << 32;
+ val |= io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4);
+#else
+ val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr);
+ val |= (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4) << 32;
+#endif
+ } else {
+ /* RAM case */
+ ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
+ (addr & ~TARGET_PAGE_MASK);
+ switch (endian) {
+ case DEVICE_LITTLE_ENDIAN:
+ val = ldq_le_p(ptr);
+ break;
+ case DEVICE_BIG_ENDIAN:
+ val = ldq_be_p(ptr);
+ break;
+ default:
+ val = ldq_p(ptr);
+ break;
+ }
+ }
+ return val;
+}
+
+uint64_t ldq_phys(target_phys_addr_t addr)
+{
+ return ldq_phys_internal(addr, DEVICE_NATIVE_ENDIAN);
+}
+
+uint64_t ldq_le_phys(target_phys_addr_t addr)
+{
+ return ldq_phys_internal(addr, DEVICE_LITTLE_ENDIAN);
+}
+
+uint64_t ldq_be_phys(target_phys_addr_t addr)
+{
+ return ldq_phys_internal(addr, DEVICE_BIG_ENDIAN);
+}
+
+/* XXX: optimize */
+uint32_t ldub_phys(target_phys_addr_t addr)
+{
+ uint8_t val;
+ cpu_physical_memory_read(addr, &val, 1);
+ return val;
+}
+
+/* warning: addr must be aligned */
+static inline uint32_t lduw_phys_internal(target_phys_addr_t addr,
+ enum device_endian endian)
+{
+ int io_index;
+ uint8_t *ptr;
+ uint64_t val;
+ unsigned long pd;
+ PhysPageDesc *p;
+
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM &&
+ !(pd & IO_MEM_ROMD)) {
+ /* I/O case */
+ io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ if (p)
+ addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
+ val = io_mem_read[io_index][1](io_mem_opaque[io_index], addr);
+#if defined(TARGET_WORDS_BIGENDIAN)
+ if (endian == DEVICE_LITTLE_ENDIAN) {
+ val = bswap16(val);
+ }
+#else
+ if (endian == DEVICE_BIG_ENDIAN) {
+ val = bswap16(val);
+ }
+#endif
+ } else {
+ /* RAM case */
+ ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
+ (addr & ~TARGET_PAGE_MASK);
+ switch (endian) {
+ case DEVICE_LITTLE_ENDIAN:
+ val = lduw_le_p(ptr);
+ break;
+ case DEVICE_BIG_ENDIAN:
+ val = lduw_be_p(ptr);
+ break;
+ default:
+ val = lduw_p(ptr);
+ break;
+ }
+ }
+ return val;
+}
+
+uint32_t lduw_phys(target_phys_addr_t addr)
+{
+ return lduw_phys_internal(addr, DEVICE_NATIVE_ENDIAN);
+}
+
+uint32_t lduw_le_phys(target_phys_addr_t addr)
+{
+ return lduw_phys_internal(addr, DEVICE_LITTLE_ENDIAN);
+}
+
+uint32_t lduw_be_phys(target_phys_addr_t addr)
+{
+ return lduw_phys_internal(addr, DEVICE_BIG_ENDIAN);
+}
+
+/* warning: addr must be aligned. The ram page is not masked as dirty
+ and the code inside is not invalidated. It is useful if the dirty
+ bits are used to track modified PTEs */
+void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val)
+{
+ int io_index;
+ uint8_t *ptr;
+ unsigned long pd;
+ PhysPageDesc *p;
+
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
+ io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ if (p)
+ addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
+ io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
+ } else {
+ unsigned long addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
+ ptr = qemu_get_ram_ptr(addr1);
+ stl_p(ptr, val);
+
+ if (unlikely(in_migration)) {
+ if (!cpu_physical_memory_is_dirty(addr1)) {
+ /* invalidate code */
+ tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
+ /* set dirty bit */
+ cpu_physical_memory_set_dirty_flags(
+ addr1, (0xff & ~CODE_DIRTY_FLAG));
+ }
+ }
+ }
+}
+
+void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val)
+{
+ int io_index;
+ uint8_t *ptr;
+ unsigned long pd;
+ PhysPageDesc *p;
+
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
+ io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ if (p)
+ addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
+#ifdef TARGET_WORDS_BIGENDIAN
+ io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val >> 32);
+ io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val);
+#else
+ io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
+ io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val >> 32);
+#endif
+ } else {
+ ptr = qemu_get_ram_ptr(pd & TARGET_PAGE_MASK) +
+ (addr & ~TARGET_PAGE_MASK);
+ stq_p(ptr, val);
+ }
+}
+
+/* warning: addr must be aligned */
+static inline void stl_phys_internal(target_phys_addr_t addr, uint32_t val,
+ enum device_endian endian)
+{
+ int io_index;
+ uint8_t *ptr;
+ unsigned long pd;
+ PhysPageDesc *p;
+
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
+ io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ if (p)
+ addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
+#if defined(TARGET_WORDS_BIGENDIAN)
+ if (endian == DEVICE_LITTLE_ENDIAN) {
+ val = bswap32(val);
+ }
+#else
+ if (endian == DEVICE_BIG_ENDIAN) {
+ val = bswap32(val);
+ }
+#endif
+ io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val);
+ } else {
+ unsigned long addr1;
+ addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
+ /* RAM case */
+ ptr = qemu_get_ram_ptr(addr1);
+ switch (endian) {
+ case DEVICE_LITTLE_ENDIAN:
+ stl_le_p(ptr, val);
+ break;
+ case DEVICE_BIG_ENDIAN:
+ stl_be_p(ptr, val);
+ break;
+ default:
+ stl_p(ptr, val);
+ break;
+ }
+ if (!cpu_physical_memory_is_dirty(addr1)) {
+ /* invalidate code */
+ tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
+ /* set dirty bit */
+ cpu_physical_memory_set_dirty_flags(addr1,
+ (0xff & ~CODE_DIRTY_FLAG));
+ }
+ }
+}
+
+void stl_phys(target_phys_addr_t addr, uint32_t val)
+{
+ stl_phys_internal(addr, val, DEVICE_NATIVE_ENDIAN);
+}
+
+void stl_le_phys(target_phys_addr_t addr, uint32_t val)
+{
+ stl_phys_internal(addr, val, DEVICE_LITTLE_ENDIAN);
+}
+
+void stl_be_phys(target_phys_addr_t addr, uint32_t val)
+{
+ stl_phys_internal(addr, val, DEVICE_BIG_ENDIAN);
+}
+
+/* XXX: optimize */
+void stb_phys(target_phys_addr_t addr, uint32_t val)
+{
+ uint8_t v = val;
+ cpu_physical_memory_write(addr, &v, 1);
+}
+
+/* warning: addr must be aligned */
+static inline void stw_phys_internal(target_phys_addr_t addr, uint32_t val,
+ enum device_endian endian)
+{
+ int io_index;
+ uint8_t *ptr;
+ unsigned long pd;
+ PhysPageDesc *p;
+
+ p = phys_page_find(addr >> TARGET_PAGE_BITS);
+ if (!p) {
+ pd = IO_MEM_UNASSIGNED;
+ } else {
+ pd = p->phys_offset;
+ }
+
+ if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) {
+ io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1);
+ if (p)
+ addr = (addr & ~TARGET_PAGE_MASK) + p->region_offset;
+#if defined(TARGET_WORDS_BIGENDIAN)
+ if (endian == DEVICE_LITTLE_ENDIAN) {
+ val = bswap16(val);
+ }
+#else
+ if (endian == DEVICE_BIG_ENDIAN) {
+ val = bswap16(val);
+ }
+#endif
+ io_mem_write[io_index][1](io_mem_opaque[io_index], addr, val);
+ } else {
+ unsigned long addr1;
+ addr1 = (pd & TARGET_PAGE_MASK) + (addr & ~TARGET_PAGE_MASK);
+ /* RAM case */
+ ptr = qemu_get_ram_ptr(addr1);
+ switch (endian) {
+ case DEVICE_LITTLE_ENDIAN:
+ stw_le_p(ptr, val);
+ break;
+ case DEVICE_BIG_ENDIAN:
+ stw_be_p(ptr, val);
+ break;
+ default:
+ stw_p(ptr, val);
+ break;
+ }
+ if (!cpu_physical_memory_is_dirty(addr1)) {
+ /* invalidate code */
+ tb_invalidate_phys_page_range(addr1, addr1 + 2, 0);
+ /* set dirty bit */
+ cpu_physical_memory_set_dirty_flags(addr1,
+ (0xff & ~CODE_DIRTY_FLAG));
+ }
+ }
+}
+
+void stw_phys(target_phys_addr_t addr, uint32_t val)
+{
+ stw_phys_internal(addr, val, DEVICE_NATIVE_ENDIAN);
+}
+
+void stw_le_phys(target_phys_addr_t addr, uint32_t val)
+{
+ stw_phys_internal(addr, val, DEVICE_LITTLE_ENDIAN);
+}
+
+void stw_be_phys(target_phys_addr_t addr, uint32_t val)
+{
+ stw_phys_internal(addr, val, DEVICE_BIG_ENDIAN);
+}
+
+/* XXX: optimize */
+void stq_phys(target_phys_addr_t addr, uint64_t val)
+{
+ val = tswap64(val);
+ cpu_physical_memory_write(addr, &val, 8);
+}
+
+void stq_le_phys(target_phys_addr_t addr, uint64_t val)
+{
+ val = cpu_to_le64(val);
+ cpu_physical_memory_write(addr, &val, 8);
+}
+
+void stq_be_phys(target_phys_addr_t addr, uint64_t val)
+{
+ val = cpu_to_be64(val);
+ cpu_physical_memory_write(addr, &val, 8);
+}
+
+/* virtual memory access for debug (includes writing to ROM) */
+int cpu_memory_rw_debug(CPUState *env, target_ulong addr,
+ uint8_t *buf, int len, int is_write)
+{
+ int l;
+ target_phys_addr_t phys_addr;
+ target_ulong page;
+
+ while (len > 0) {
+ page = addr & TARGET_PAGE_MASK;
+ phys_addr = cpu_get_phys_page_debug(env, page);
+ /* if no physical page mapped, return an error */
+ if (phys_addr == -1)
+ return -1;
+ l = (page + TARGET_PAGE_SIZE) - addr;
+ if (l > len)
+ l = len;
+ phys_addr += (addr & ~TARGET_PAGE_MASK);
+ if (is_write)
+ cpu_physical_memory_write_rom(phys_addr, buf, l);
+ else
+ cpu_physical_memory_rw(phys_addr, buf, l, is_write);
+ len -= l;
+ buf += l;
+ addr += l;
+ }
+ return 0;
+}
+#endif
+
+/* in deterministic execution mode, instructions doing device I/Os
+ must be at the end of the TB */
+void cpu_io_recompile(CPUState *env, void *retaddr)
+{
+ TranslationBlock *tb;
+ uint32_t n, cflags;
+ target_ulong pc, cs_base;
+ uint64_t flags;
+
+ tb = tb_find_pc((unsigned long)retaddr);
+ if (!tb) {
+ cpu_abort(env, "cpu_io_recompile: could not find TB for pc=%p",
+ retaddr);
+ }
+ n = env->icount_decr.u16.low + tb->icount;
+ cpu_restore_state(tb, env, (unsigned long)retaddr);
+ /* Calculate how many instructions had been executed before the fault
+ occurred. */
+ n = n - env->icount_decr.u16.low;
+ /* Generate a new TB ending on the I/O insn. */
+ n++;
+ /* On MIPS and SH, delay slot instructions can only be restarted if
+ they were already the first instruction in the TB. If this is not
+ the first instruction in a TB then re-execute the preceding
+ branch. */
+#if defined(TARGET_MIPS)
+ if ((env->hflags & MIPS_HFLAG_BMASK) != 0 && n > 1) {
+ env->active_tc.PC -= 4;
+ env->icount_decr.u16.low++;
+ env->hflags &= ~MIPS_HFLAG_BMASK;
+ }
+#elif defined(TARGET_SH4)
+ if ((env->flags & ((DELAY_SLOT | DELAY_SLOT_CONDITIONAL))) != 0
+ && n > 1) {
+ env->pc -= 2;
+ env->icount_decr.u16.low++;
+ env->flags &= ~(DELAY_SLOT | DELAY_SLOT_CONDITIONAL);
+ }
+#endif
+ /* This should never happen. */
+ if (n > CF_COUNT_MASK)
+ cpu_abort(env, "TB too big during recompile");
+
+ cflags = n | CF_LAST_IO;
+ pc = tb->pc;
+ cs_base = tb->cs_base;
+ flags = tb->flags;
+ tb_phys_invalidate(tb, -1);
+ /* FIXME: In theory this could raise an exception. In practice
+ we have already translated the block once so it's probably ok. */
+ tb_gen_code(env, pc, cs_base, flags, cflags);
+ /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
+ the first in the TB) then we end up generating a whole new TB and
+ repeating the fault, which is horribly inefficient.
+ Better would be to execute just this insn uncached, or generate a
+ second new TB. */
+ cpu_resume_from_signal(env, NULL);
+}
+
+#if !defined(CONFIG_USER_ONLY)
+
+void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
+{
+ int i, target_code_size, max_target_code_size;
+ int direct_jmp_count, direct_jmp2_count, cross_page;
+ TranslationBlock *tb;
+
+ target_code_size = 0;
+ max_target_code_size = 0;
+ cross_page = 0;
+ direct_jmp_count = 0;
+ direct_jmp2_count = 0;
+ for(i = 0; i < nb_tbs; i++) {
+ tb = &tbs[i];
+ target_code_size += tb->size;
+ if (tb->size > max_target_code_size)
+ max_target_code_size = tb->size;
+ if (tb->page_addr[1] != -1)
+ cross_page++;
+ if (tb->tb_next_offset[0] != 0xffff) {
+ direct_jmp_count++;
+ if (tb->tb_next_offset[1] != 0xffff) {
+ direct_jmp2_count++;
+ }
+ }
+ }
+ /* XXX: avoid using doubles ? */
+ cpu_fprintf(f, "Translation buffer state:\n");
+ cpu_fprintf(f, "gen code size %td/%ld\n",
+ code_gen_ptr - code_gen_buffer, code_gen_buffer_max_size);
+ cpu_fprintf(f, "TB count %d/%d\n",
+ nb_tbs, code_gen_max_blocks);
+ cpu_fprintf(f, "TB avg target size %d max=%d bytes\n",
+ nb_tbs ? target_code_size / nb_tbs : 0,
+ max_target_code_size);
+ cpu_fprintf(f, "TB avg host size %td bytes (expansion ratio: %0.1f)\n",
+ nb_tbs ? (code_gen_ptr - code_gen_buffer) / nb_tbs : 0,
+ target_code_size ? (double) (code_gen_ptr - code_gen_buffer) / target_code_size : 0);
+ cpu_fprintf(f, "cross page TB count %d (%d%%)\n",
+ cross_page,
+ nb_tbs ? (cross_page * 100) / nb_tbs : 0);
+ cpu_fprintf(f, "direct jump count %d (%d%%) (2 jumps=%d %d%%)\n",
+ direct_jmp_count,
+ nb_tbs ? (direct_jmp_count * 100) / nb_tbs : 0,
+ direct_jmp2_count,
+ nb_tbs ? (direct_jmp2_count * 100) / nb_tbs : 0);
+ cpu_fprintf(f, "\nStatistics:\n");
+ cpu_fprintf(f, "TB flush count %d\n", tb_flush_count);
+ cpu_fprintf(f, "TB invalidate count %d\n", tb_phys_invalidate_count);
+ cpu_fprintf(f, "TLB flush count %d\n", tlb_flush_count);
+ tcg_dump_info(f, cpu_fprintf);
+}
+
+#define MMUSUFFIX _cmmu
+#define GETPC() NULL
+#define env cpu_single_env
+#define SOFTMMU_CODE_ACCESS
+
+#define SHIFT 0
+#include "softmmu_template.h"
+
+#define SHIFT 1
+#include "softmmu_template.h"
+
+#define SHIFT 2
+#include "softmmu_template.h"
+
+#define SHIFT 3
+#include "softmmu_template.h"
+
+#undef env
+
+#endif
diff --git a/qemu-0.15.x/fpu/softfloat-macros.h b/qemu-0.15.x/fpu/softfloat-macros.h
new file mode 100644
index 0000000..e82ce23
--- /dev/null
+++ b/qemu-0.15.x/fpu/softfloat-macros.h
@@ -0,0 +1,749 @@
+/*
+ * QEMU float support macros
+ *
+ * Derived from SoftFloat.
+ */
+
+/*============================================================================
+
+This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
+Arithmetic Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal notice) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| This macro tests for minimum version of the GNU C compiler.
+*----------------------------------------------------------------------------*/
+#if defined(__GNUC__) && defined(__GNUC_MINOR__)
+# define SOFTFLOAT_GNUC_PREREQ(maj, min) \
+ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
+#else
+# define SOFTFLOAT_GNUC_PREREQ(maj, min) 0
+#endif
+
+
+/*----------------------------------------------------------------------------
+| Shifts `a' right by the number of bits given in `count'. If any nonzero
+| bits are shifted off, they are ``jammed'' into the least significant bit of
+| the result by setting the least significant bit to 1. The value of `count'
+| can be arbitrarily large; in particular, if `count' is greater than 32, the
+| result will be either 0 or 1, depending on whether `a' is zero or nonzero.
+| The result is stored in the location pointed to by `zPtr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void shift32RightJamming( uint32_t a, int16 count, uint32_t *zPtr )
+{
+ uint32_t z;
+
+ if ( count == 0 ) {
+ z = a;
+ }
+ else if ( count < 32 ) {
+ z = ( a>>count ) | ( ( a<<( ( - count ) & 31 ) ) != 0 );
+ }
+ else {
+ z = ( a != 0 );
+ }
+ *zPtr = z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Shifts `a' right by the number of bits given in `count'. If any nonzero
+| bits are shifted off, they are ``jammed'' into the least significant bit of
+| the result by setting the least significant bit to 1. The value of `count'
+| can be arbitrarily large; in particular, if `count' is greater than 64, the
+| result will be either 0 or 1, depending on whether `a' is zero or nonzero.
+| The result is stored in the location pointed to by `zPtr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void shift64RightJamming( uint64_t a, int16 count, uint64_t *zPtr )
+{
+ uint64_t z;
+
+ if ( count == 0 ) {
+ z = a;
+ }
+ else if ( count < 64 ) {
+ z = ( a>>count ) | ( ( a<<( ( - count ) & 63 ) ) != 0 );
+ }
+ else {
+ z = ( a != 0 );
+ }
+ *zPtr = z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by 64
+| _plus_ the number of bits given in `count'. The shifted result is at most
+| 64 nonzero bits; this is stored at the location pointed to by `z0Ptr'. The
+| bits shifted off form a second 64-bit result as follows: The _last_ bit
+| shifted off is the most-significant bit of the extra result, and the other
+| 63 bits of the extra result are all zero if and only if _all_but_the_last_
+| bits shifted off were all zero. This extra result is stored in the location
+| pointed to by `z1Ptr'. The value of `count' can be arbitrarily large.
+| (This routine makes more sense if `a0' and `a1' are considered to form
+| a fixed-point value with binary point between `a0' and `a1'. This fixed-
+| point value is shifted right by the number of bits given in `count', and
+| the integer part of the result is returned at the location pointed to by
+| `z0Ptr'. The fractional part of the result may be slightly corrupted as
+| described above, and is returned at the location pointed to by `z1Ptr'.)
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ shift64ExtraRightJamming(
+ uint64_t a0, uint64_t a1, int16 count, uint64_t *z0Ptr, uint64_t *z1Ptr )
+{
+ uint64_t z0, z1;
+ int8 negCount = ( - count ) & 63;
+
+ if ( count == 0 ) {
+ z1 = a1;
+ z0 = a0;
+ }
+ else if ( count < 64 ) {
+ z1 = ( a0<<negCount ) | ( a1 != 0 );
+ z0 = a0>>count;
+ }
+ else {
+ if ( count == 64 ) {
+ z1 = a0 | ( a1 != 0 );
+ }
+ else {
+ z1 = ( ( a0 | a1 ) != 0 );
+ }
+ z0 = 0;
+ }
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the
+| number of bits given in `count'. Any bits shifted off are lost. The value
+| of `count' can be arbitrarily large; in particular, if `count' is greater
+| than 128, the result will be 0. The result is broken into two 64-bit pieces
+| which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ shift128Right(
+ uint64_t a0, uint64_t a1, int16 count, uint64_t *z0Ptr, uint64_t *z1Ptr )
+{
+ uint64_t z0, z1;
+ int8 negCount = ( - count ) & 63;
+
+ if ( count == 0 ) {
+ z1 = a1;
+ z0 = a0;
+ }
+ else if ( count < 64 ) {
+ z1 = ( a0<<negCount ) | ( a1>>count );
+ z0 = a0>>count;
+ }
+ else {
+ z1 = ( count < 64 ) ? ( a0>>( count & 63 ) ) : 0;
+ z0 = 0;
+ }
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Shifts the 128-bit value formed by concatenating `a0' and `a1' right by the
+| number of bits given in `count'. If any nonzero bits are shifted off, they
+| are ``jammed'' into the least significant bit of the result by setting the
+| least significant bit to 1. The value of `count' can be arbitrarily large;
+| in particular, if `count' is greater than 128, the result will be either
+| 0 or 1, depending on whether the concatenation of `a0' and `a1' is zero or
+| nonzero. The result is broken into two 64-bit pieces which are stored at
+| the locations pointed to by `z0Ptr' and `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ shift128RightJamming(
+ uint64_t a0, uint64_t a1, int16 count, uint64_t *z0Ptr, uint64_t *z1Ptr )
+{
+ uint64_t z0, z1;
+ int8 negCount = ( - count ) & 63;
+
+ if ( count == 0 ) {
+ z1 = a1;
+ z0 = a0;
+ }
+ else if ( count < 64 ) {
+ z1 = ( a0<<negCount ) | ( a1>>count ) | ( ( a1<<negCount ) != 0 );
+ z0 = a0>>count;
+ }
+ else {
+ if ( count == 64 ) {
+ z1 = a0 | ( a1 != 0 );
+ }
+ else if ( count < 128 ) {
+ z1 = ( a0>>( count & 63 ) ) | ( ( ( a0<<negCount ) | a1 ) != 0 );
+ }
+ else {
+ z1 = ( ( a0 | a1 ) != 0 );
+ }
+ z0 = 0;
+ }
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' right
+| by 64 _plus_ the number of bits given in `count'. The shifted result is
+| at most 128 nonzero bits; these are broken into two 64-bit pieces which are
+| stored at the locations pointed to by `z0Ptr' and `z1Ptr'. The bits shifted
+| off form a third 64-bit result as follows: The _last_ bit shifted off is
+| the most-significant bit of the extra result, and the other 63 bits of the
+| extra result are all zero if and only if _all_but_the_last_ bits shifted off
+| were all zero. This extra result is stored in the location pointed to by
+| `z2Ptr'. The value of `count' can be arbitrarily large.
+| (This routine makes more sense if `a0', `a1', and `a2' are considered
+| to form a fixed-point value with binary point between `a1' and `a2'. This
+| fixed-point value is shifted right by the number of bits given in `count',
+| and the integer part of the result is returned at the locations pointed to
+| by `z0Ptr' and `z1Ptr'. The fractional part of the result may be slightly
+| corrupted as described above, and is returned at the location pointed to by
+| `z2Ptr'.)
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ shift128ExtraRightJamming(
+ uint64_t a0,
+ uint64_t a1,
+ uint64_t a2,
+ int16 count,
+ uint64_t *z0Ptr,
+ uint64_t *z1Ptr,
+ uint64_t *z2Ptr
+ )
+{
+ uint64_t z0, z1, z2;
+ int8 negCount = ( - count ) & 63;
+
+ if ( count == 0 ) {
+ z2 = a2;
+ z1 = a1;
+ z0 = a0;
+ }
+ else {
+ if ( count < 64 ) {
+ z2 = a1<<negCount;
+ z1 = ( a0<<negCount ) | ( a1>>count );
+ z0 = a0>>count;
+ }
+ else {
+ if ( count == 64 ) {
+ z2 = a1;
+ z1 = a0;
+ }
+ else {
+ a2 |= a1;
+ if ( count < 128 ) {
+ z2 = a0<<negCount;
+ z1 = a0>>( count & 63 );
+ }
+ else {
+ z2 = ( count == 128 ) ? a0 : ( a0 != 0 );
+ z1 = 0;
+ }
+ }
+ z0 = 0;
+ }
+ z2 |= ( a2 != 0 );
+ }
+ *z2Ptr = z2;
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Shifts the 128-bit value formed by concatenating `a0' and `a1' left by the
+| number of bits given in `count'. Any bits shifted off are lost. The value
+| of `count' must be less than 64. The result is broken into two 64-bit
+| pieces which are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ shortShift128Left(
+ uint64_t a0, uint64_t a1, int16 count, uint64_t *z0Ptr, uint64_t *z1Ptr )
+{
+
+ *z1Ptr = a1<<count;
+ *z0Ptr =
+ ( count == 0 ) ? a0 : ( a0<<count ) | ( a1>>( ( - count ) & 63 ) );
+
+}
+
+/*----------------------------------------------------------------------------
+| Shifts the 192-bit value formed by concatenating `a0', `a1', and `a2' left
+| by the number of bits given in `count'. Any bits shifted off are lost.
+| The value of `count' must be less than 64. The result is broken into three
+| 64-bit pieces which are stored at the locations pointed to by `z0Ptr',
+| `z1Ptr', and `z2Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ shortShift192Left(
+ uint64_t a0,
+ uint64_t a1,
+ uint64_t a2,
+ int16 count,
+ uint64_t *z0Ptr,
+ uint64_t *z1Ptr,
+ uint64_t *z2Ptr
+ )
+{
+ uint64_t z0, z1, z2;
+ int8 negCount;
+
+ z2 = a2<<count;
+ z1 = a1<<count;
+ z0 = a0<<count;
+ if ( 0 < count ) {
+ negCount = ( ( - count ) & 63 );
+ z1 |= a2>>negCount;
+ z0 |= a1>>negCount;
+ }
+ *z2Ptr = z2;
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Adds the 128-bit value formed by concatenating `a0' and `a1' to the 128-bit
+| value formed by concatenating `b0' and `b1'. Addition is modulo 2^128, so
+| any carry out is lost. The result is broken into two 64-bit pieces which
+| are stored at the locations pointed to by `z0Ptr' and `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ add128(
+ uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1, uint64_t *z0Ptr, uint64_t *z1Ptr )
+{
+ uint64_t z1;
+
+ z1 = a1 + b1;
+ *z1Ptr = z1;
+ *z0Ptr = a0 + b0 + ( z1 < a1 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Adds the 192-bit value formed by concatenating `a0', `a1', and `a2' to the
+| 192-bit value formed by concatenating `b0', `b1', and `b2'. Addition is
+| modulo 2^192, so any carry out is lost. The result is broken into three
+| 64-bit pieces which are stored at the locations pointed to by `z0Ptr',
+| `z1Ptr', and `z2Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ add192(
+ uint64_t a0,
+ uint64_t a1,
+ uint64_t a2,
+ uint64_t b0,
+ uint64_t b1,
+ uint64_t b2,
+ uint64_t *z0Ptr,
+ uint64_t *z1Ptr,
+ uint64_t *z2Ptr
+ )
+{
+ uint64_t z0, z1, z2;
+ int8 carry0, carry1;
+
+ z2 = a2 + b2;
+ carry1 = ( z2 < a2 );
+ z1 = a1 + b1;
+ carry0 = ( z1 < a1 );
+ z0 = a0 + b0;
+ z1 += carry1;
+ z0 += ( z1 < carry1 );
+ z0 += carry0;
+ *z2Ptr = z2;
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Subtracts the 128-bit value formed by concatenating `b0' and `b1' from the
+| 128-bit value formed by concatenating `a0' and `a1'. Subtraction is modulo
+| 2^128, so any borrow out (carry out) is lost. The result is broken into two
+| 64-bit pieces which are stored at the locations pointed to by `z0Ptr' and
+| `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ sub128(
+ uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1, uint64_t *z0Ptr, uint64_t *z1Ptr )
+{
+
+ *z1Ptr = a1 - b1;
+ *z0Ptr = a0 - b0 - ( a1 < b1 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Subtracts the 192-bit value formed by concatenating `b0', `b1', and `b2'
+| from the 192-bit value formed by concatenating `a0', `a1', and `a2'.
+| Subtraction is modulo 2^192, so any borrow out (carry out) is lost. The
+| result is broken into three 64-bit pieces which are stored at the locations
+| pointed to by `z0Ptr', `z1Ptr', and `z2Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ sub192(
+ uint64_t a0,
+ uint64_t a1,
+ uint64_t a2,
+ uint64_t b0,
+ uint64_t b1,
+ uint64_t b2,
+ uint64_t *z0Ptr,
+ uint64_t *z1Ptr,
+ uint64_t *z2Ptr
+ )
+{
+ uint64_t z0, z1, z2;
+ int8 borrow0, borrow1;
+
+ z2 = a2 - b2;
+ borrow1 = ( a2 < b2 );
+ z1 = a1 - b1;
+ borrow0 = ( a1 < b1 );
+ z0 = a0 - b0;
+ z0 -= ( z1 < borrow1 );
+ z1 -= borrow1;
+ z0 -= borrow0;
+ *z2Ptr = z2;
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Multiplies `a' by `b' to obtain a 128-bit product. The product is broken
+| into two 64-bit pieces which are stored at the locations pointed to by
+| `z0Ptr' and `z1Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void mul64To128( uint64_t a, uint64_t b, uint64_t *z0Ptr, uint64_t *z1Ptr )
+{
+ uint32_t aHigh, aLow, bHigh, bLow;
+ uint64_t z0, zMiddleA, zMiddleB, z1;
+
+ aLow = a;
+ aHigh = a>>32;
+ bLow = b;
+ bHigh = b>>32;
+ z1 = ( (uint64_t) aLow ) * bLow;
+ zMiddleA = ( (uint64_t) aLow ) * bHigh;
+ zMiddleB = ( (uint64_t) aHigh ) * bLow;
+ z0 = ( (uint64_t) aHigh ) * bHigh;
+ zMiddleA += zMiddleB;
+ z0 += ( ( (uint64_t) ( zMiddleA < zMiddleB ) )<<32 ) + ( zMiddleA>>32 );
+ zMiddleA <<= 32;
+ z1 += zMiddleA;
+ z0 += ( z1 < zMiddleA );
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Multiplies the 128-bit value formed by concatenating `a0' and `a1' by
+| `b' to obtain a 192-bit product. The product is broken into three 64-bit
+| pieces which are stored at the locations pointed to by `z0Ptr', `z1Ptr', and
+| `z2Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ mul128By64To192(
+ uint64_t a0,
+ uint64_t a1,
+ uint64_t b,
+ uint64_t *z0Ptr,
+ uint64_t *z1Ptr,
+ uint64_t *z2Ptr
+ )
+{
+ uint64_t z0, z1, z2, more1;
+
+ mul64To128( a1, b, &z1, &z2 );
+ mul64To128( a0, b, &z0, &more1 );
+ add128( z0, more1, 0, z1, &z0, &z1 );
+ *z2Ptr = z2;
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Multiplies the 128-bit value formed by concatenating `a0' and `a1' to the
+| 128-bit value formed by concatenating `b0' and `b1' to obtain a 256-bit
+| product. The product is broken into four 64-bit pieces which are stored at
+| the locations pointed to by `z0Ptr', `z1Ptr', `z2Ptr', and `z3Ptr'.
+*----------------------------------------------------------------------------*/
+
+INLINE void
+ mul128To256(
+ uint64_t a0,
+ uint64_t a1,
+ uint64_t b0,
+ uint64_t b1,
+ uint64_t *z0Ptr,
+ uint64_t *z1Ptr,
+ uint64_t *z2Ptr,
+ uint64_t *z3Ptr
+ )
+{
+ uint64_t z0, z1, z2, z3;
+ uint64_t more1, more2;
+
+ mul64To128( a1, b1, &z2, &z3 );
+ mul64To128( a1, b0, &z1, &more2 );
+ add128( z1, more2, 0, z2, &z1, &z2 );
+ mul64To128( a0, b0, &z0, &more1 );
+ add128( z0, more1, 0, z1, &z0, &z1 );
+ mul64To128( a0, b1, &more1, &more2 );
+ add128( more1, more2, 0, z2, &more1, &z2 );
+ add128( z0, z1, 0, more1, &z0, &z1 );
+ *z3Ptr = z3;
+ *z2Ptr = z2;
+ *z1Ptr = z1;
+ *z0Ptr = z0;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns an approximation to the 64-bit integer quotient obtained by dividing
+| `b' into the 128-bit value formed by concatenating `a0' and `a1'. The
+| divisor `b' must be at least 2^63. If q is the exact quotient truncated
+| toward zero, the approximation returned lies between q and q + 2 inclusive.
+| If the exact quotient q is larger than 64 bits, the maximum positive 64-bit
+| unsigned integer is returned.
+*----------------------------------------------------------------------------*/
+
+static uint64_t estimateDiv128To64( uint64_t a0, uint64_t a1, uint64_t b )
+{
+ uint64_t b0, b1;
+ uint64_t rem0, rem1, term0, term1;
+ uint64_t z;
+
+ if ( b <= a0 ) return LIT64( 0xFFFFFFFFFFFFFFFF );
+ b0 = b>>32;
+ z = ( b0<<32 <= a0 ) ? LIT64( 0xFFFFFFFF00000000 ) : ( a0 / b0 )<<32;
+ mul64To128( b, z, &term0, &term1 );
+ sub128( a0, a1, term0, term1, &rem0, &rem1 );
+ while ( ( (int64_t) rem0 ) < 0 ) {
+ z -= LIT64( 0x100000000 );
+ b1 = b<<32;
+ add128( rem0, rem1, b0, b1, &rem0, &rem1 );
+ }
+ rem0 = ( rem0<<32 ) | ( rem1>>32 );
+ z |= ( b0<<32 <= rem0 ) ? 0xFFFFFFFF : rem0 / b0;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns an approximation to the square root of the 32-bit significand given
+| by `a'. Considered as an integer, `a' must be at least 2^31. If bit 0 of
+| `aExp' (the least significant bit) is 1, the integer returned approximates
+| 2^31*sqrt(`a'/2^31), where `a' is considered an integer. If bit 0 of `aExp'
+| is 0, the integer returned approximates 2^31*sqrt(`a'/2^30). In either
+| case, the approximation returned lies strictly within +/-2 of the exact
+| value.
+*----------------------------------------------------------------------------*/
+
+static uint32_t estimateSqrt32( int16 aExp, uint32_t a )
+{
+ static const uint16_t sqrtOddAdjustments[] = {
+ 0x0004, 0x0022, 0x005D, 0x00B1, 0x011D, 0x019F, 0x0236, 0x02E0,
+ 0x039C, 0x0468, 0x0545, 0x0631, 0x072B, 0x0832, 0x0946, 0x0A67
+ };
+ static const uint16_t sqrtEvenAdjustments[] = {
+ 0x0A2D, 0x08AF, 0x075A, 0x0629, 0x051A, 0x0429, 0x0356, 0x029E,
+ 0x0200, 0x0179, 0x0109, 0x00AF, 0x0068, 0x0034, 0x0012, 0x0002
+ };
+ int8 index;
+ uint32_t z;
+
+ index = ( a>>27 ) & 15;
+ if ( aExp & 1 ) {
+ z = 0x4000 + ( a>>17 ) - sqrtOddAdjustments[ (int)index ];
+ z = ( ( a / z )<<14 ) + ( z<<15 );
+ a >>= 1;
+ }
+ else {
+ z = 0x8000 + ( a>>17 ) - sqrtEvenAdjustments[ (int)index ];
+ z = a / z + z;
+ z = ( 0x20000 <= z ) ? 0xFFFF8000 : ( z<<15 );
+ if ( z <= a ) return (uint32_t) ( ( (int32_t) a )>>1 );
+ }
+ return ( (uint32_t) ( ( ( (uint64_t) a )<<31 ) / z ) ) + ( z>>1 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the number of leading 0 bits before the most-significant 1 bit of
+| `a'. If `a' is zero, 32 is returned.
+*----------------------------------------------------------------------------*/
+
+static int8 countLeadingZeros32( uint32_t a )
+{
+#if SOFTFLOAT_GNUC_PREREQ(3, 4)
+ if (a) {
+ return __builtin_clz(a);
+ } else {
+ return 32;
+ }
+#else
+ static const int8 countLeadingZerosHigh[] = {
+ 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ };
+ int8 shiftCount;
+
+ shiftCount = 0;
+ if ( a < 0x10000 ) {
+ shiftCount += 16;
+ a <<= 16;
+ }
+ if ( a < 0x1000000 ) {
+ shiftCount += 8;
+ a <<= 8;
+ }
+ shiftCount += countLeadingZerosHigh[ a>>24 ];
+ return shiftCount;
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns the number of leading 0 bits before the most-significant 1 bit of
+| `a'. If `a' is zero, 64 is returned.
+*----------------------------------------------------------------------------*/
+
+static int8 countLeadingZeros64( uint64_t a )
+{
+#if SOFTFLOAT_GNUC_PREREQ(3, 4)
+ if (a) {
+ return __builtin_clzll(a);
+ } else {
+ return 64;
+ }
+#else
+ int8 shiftCount;
+
+ shiftCount = 0;
+ if ( a < ( (uint64_t) 1 )<<32 ) {
+ shiftCount += 32;
+ }
+ else {
+ a >>= 32;
+ }
+ shiftCount += countLeadingZeros32( a );
+ return shiftCount;
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1'
+| is equal to the 128-bit value formed by concatenating `b0' and `b1'.
+| Otherwise, returns 0.
+*----------------------------------------------------------------------------*/
+
+INLINE flag eq128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 )
+{
+
+ return ( a0 == b0 ) && ( a1 == b1 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less
+| than or equal to the 128-bit value formed by concatenating `b0' and `b1'.
+| Otherwise, returns 0.
+*----------------------------------------------------------------------------*/
+
+INLINE flag le128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 )
+{
+
+ return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 <= b1 ) );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is less
+| than the 128-bit value formed by concatenating `b0' and `b1'. Otherwise,
+| returns 0.
+*----------------------------------------------------------------------------*/
+
+INLINE flag lt128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 )
+{
+
+ return ( a0 < b0 ) || ( ( a0 == b0 ) && ( a1 < b1 ) );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the 128-bit value formed by concatenating `a0' and `a1' is
+| not equal to the 128-bit value formed by concatenating `b0' and `b1'.
+| Otherwise, returns 0.
+*----------------------------------------------------------------------------*/
+
+INLINE flag ne128( uint64_t a0, uint64_t a1, uint64_t b0, uint64_t b1 )
+{
+
+ return ( a0 != b0 ) || ( a1 != b1 );
+
+}
diff --git a/qemu-0.15.x/fpu/softfloat-specialize.h b/qemu-0.15.x/fpu/softfloat-specialize.h
new file mode 100644
index 0000000..c7d35a1
--- /dev/null
+++ b/qemu-0.15.x/fpu/softfloat-specialize.h
@@ -0,0 +1,816 @@
+/*
+ * QEMU float support
+ *
+ * Derived from SoftFloat.
+ */
+
+/*============================================================================
+
+This C source fragment is part of the SoftFloat IEC/IEEE Floating-point
+Arithmetic Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+/*----------------------------------------------------------------------------
+| Raises the exceptions specified by `flags'. Floating-point traps can be
+| defined here if desired. It is currently not possible for such a trap
+| to substitute a result value. If traps are not implemented, this routine
+| should be simply `float_exception_flags |= flags;'.
+*----------------------------------------------------------------------------*/
+
+void float_raise( int8 flags STATUS_PARAM )
+{
+ STATUS(float_exception_flags) |= flags;
+}
+
+/*----------------------------------------------------------------------------
+| Internal canonical NaN format.
+*----------------------------------------------------------------------------*/
+typedef struct {
+ flag sign;
+ uint64_t high, low;
+} commonNaNT;
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the half-precision floating-point value `a' is a quiet
+| NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+int float16_is_quiet_nan(float16 a_)
+{
+ uint16_t a = float16_val(a_);
+#if SNAN_BIT_IS_ONE
+ return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF);
+#else
+ return ((a & ~0x8000) >= 0x7c80);
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the half-precision floating-point value `a' is a signaling
+| NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+int float16_is_signaling_nan(float16 a_)
+{
+ uint16_t a = float16_val(a_);
+#if SNAN_BIT_IS_ONE
+ return ((a & ~0x8000) >= 0x7c80);
+#else
+ return (((a >> 9) & 0x3F) == 0x3E) && (a & 0x1FF);
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns a quiet NaN if the half-precision floating point value `a' is a
+| signaling NaN; otherwise returns `a'.
+*----------------------------------------------------------------------------*/
+float16 float16_maybe_silence_nan(float16 a_)
+{
+ if (float16_is_signaling_nan(a_)) {
+#if SNAN_BIT_IS_ONE
+# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
+ return float16_default_nan;
+# else
+# error Rules for silencing a signaling NaN are target-specific
+# endif
+#else
+ uint16_t a = float16_val(a_);
+ a |= (1 << 9);
+ return make_float16(a);
+#endif
+ }
+ return a_;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the half-precision floating-point NaN
+| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
+| exception is raised.
+*----------------------------------------------------------------------------*/
+
+static commonNaNT float16ToCommonNaN( float16 a STATUS_PARAM )
+{
+ commonNaNT z;
+
+ if ( float16_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR );
+ z.sign = float16_val(a) >> 15;
+ z.low = 0;
+ z.high = ((uint64_t) float16_val(a))<<54;
+ return z;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the canonical NaN `a' to the half-
+| precision floating-point format.
+*----------------------------------------------------------------------------*/
+
+static float16 commonNaNToFloat16(commonNaNT a STATUS_PARAM)
+{
+ uint16_t mantissa = a.high>>54;
+
+ if (STATUS(default_nan_mode)) {
+ return float16_default_nan;
+ }
+
+ if (mantissa) {
+ return make_float16(((((uint16_t) a.sign) << 15)
+ | (0x1F << 10) | mantissa));
+ } else {
+ return float16_default_nan;
+ }
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point value `a' is a quiet
+| NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+int float32_is_quiet_nan( float32 a_ )
+{
+ uint32_t a = float32_val(a_);
+#if SNAN_BIT_IS_ONE
+ return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF );
+#else
+ return ( 0xFF800000 <= (uint32_t) ( a<<1 ) );
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point value `a' is a signaling
+| NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+int float32_is_signaling_nan( float32 a_ )
+{
+ uint32_t a = float32_val(a_);
+#if SNAN_BIT_IS_ONE
+ return ( 0xFF800000 <= (uint32_t) ( a<<1 ) );
+#else
+ return ( ( ( a>>22 ) & 0x1FF ) == 0x1FE ) && ( a & 0x003FFFFF );
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns a quiet NaN if the single-precision floating point value `a' is a
+| signaling NaN; otherwise returns `a'.
+*----------------------------------------------------------------------------*/
+
+float32 float32_maybe_silence_nan( float32 a_ )
+{
+ if (float32_is_signaling_nan(a_)) {
+#if SNAN_BIT_IS_ONE
+# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
+ return float32_default_nan;
+# else
+# error Rules for silencing a signaling NaN are target-specific
+# endif
+#else
+ uint32_t a = float32_val(a_);
+ a |= (1 << 22);
+ return make_float32(a);
+#endif
+ }
+ return a_;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the single-precision floating-point NaN
+| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
+| exception is raised.
+*----------------------------------------------------------------------------*/
+
+static commonNaNT float32ToCommonNaN( float32 a STATUS_PARAM )
+{
+ commonNaNT z;
+
+ if ( float32_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR );
+ z.sign = float32_val(a)>>31;
+ z.low = 0;
+ z.high = ( (uint64_t) float32_val(a) )<<41;
+ return z;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the canonical NaN `a' to the single-
+| precision floating-point format.
+*----------------------------------------------------------------------------*/
+
+static float32 commonNaNToFloat32( commonNaNT a STATUS_PARAM)
+{
+ uint32_t mantissa = a.high>>41;
+
+ if ( STATUS(default_nan_mode) ) {
+ return float32_default_nan;
+ }
+
+ if ( mantissa )
+ return make_float32(
+ ( ( (uint32_t) a.sign )<<31 ) | 0x7F800000 | ( a.high>>41 ) );
+ else
+ return float32_default_nan;
+}
+
+/*----------------------------------------------------------------------------
+| Select which NaN to propagate for a two-input operation.
+| IEEE754 doesn't specify all the details of this, so the
+| algorithm is target-specific.
+| The routine is passed various bits of information about the
+| two NaNs and should return 0 to select NaN a and 1 for NaN b.
+| Note that signalling NaNs are always squashed to quiet NaNs
+| by the caller, by calling floatXX_maybe_silence_nan() before
+| returning them.
+|
+| aIsLargerSignificand is only valid if both a and b are NaNs
+| of some kind, and is true if a has the larger significand,
+| or if both a and b have the same significand but a is
+| positive but b is negative. It is only needed for the x87
+| tie-break rule.
+*----------------------------------------------------------------------------*/
+
+#if defined(TARGET_ARM)
+static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN,
+ flag aIsLargerSignificand)
+{
+ /* ARM mandated NaN propagation rules: take the first of:
+ * 1. A if it is signaling
+ * 2. B if it is signaling
+ * 3. A (quiet)
+ * 4. B (quiet)
+ * A signaling NaN is always quietened before returning it.
+ */
+ if (aIsSNaN) {
+ return 0;
+ } else if (bIsSNaN) {
+ return 1;
+ } else if (aIsQNaN) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+#elif defined(TARGET_MIPS)
+static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN,
+ flag aIsLargerSignificand)
+{
+ /* According to MIPS specifications, if one of the two operands is
+ * a sNaN, a new qNaN has to be generated. This is done in
+ * floatXX_maybe_silence_nan(). For qNaN inputs the specifications
+ * says: "When possible, this QNaN result is one of the operand QNaN
+ * values." In practice it seems that most implementations choose
+ * the first operand if both operands are qNaN. In short this gives
+ * the following rules:
+ * 1. A if it is signaling
+ * 2. B if it is signaling
+ * 3. A (quiet)
+ * 4. B (quiet)
+ * A signaling NaN is always silenced before returning it.
+ */
+ if (aIsSNaN) {
+ return 0;
+ } else if (bIsSNaN) {
+ return 1;
+ } else if (aIsQNaN) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+#elif defined(TARGET_PPC)
+static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN,
+ flag aIsLargerSignificand)
+{
+ /* PowerPC propagation rules:
+ * 1. A if it sNaN or qNaN
+ * 2. B if it sNaN or qNaN
+ * A signaling NaN is always silenced before returning it.
+ */
+ if (aIsSNaN || aIsQNaN) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+#else
+static int pickNaN(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN,
+ flag aIsLargerSignificand)
+{
+ /* This implements x87 NaN propagation rules:
+ * SNaN + QNaN => return the QNaN
+ * two SNaNs => return the one with the larger significand, silenced
+ * two QNaNs => return the one with the larger significand
+ * SNaN and a non-NaN => return the SNaN, silenced
+ * QNaN and a non-NaN => return the QNaN
+ *
+ * If we get down to comparing significands and they are the same,
+ * return the NaN with the positive sign bit (if any).
+ */
+ if (aIsSNaN) {
+ if (bIsSNaN) {
+ return aIsLargerSignificand ? 0 : 1;
+ }
+ return bIsQNaN ? 1 : 0;
+ }
+ else if (aIsQNaN) {
+ if (bIsSNaN || !bIsQNaN)
+ return 0;
+ else {
+ return aIsLargerSignificand ? 0 : 1;
+ }
+ } else {
+ return 1;
+ }
+}
+#endif
+
+/*----------------------------------------------------------------------------
+| Takes two single-precision floating-point values `a' and `b', one of which
+| is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a
+| signaling NaN, the invalid exception is raised.
+*----------------------------------------------------------------------------*/
+
+static float32 propagateFloat32NaN( float32 a, float32 b STATUS_PARAM)
+{
+ flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN;
+ flag aIsLargerSignificand;
+ uint32_t av, bv;
+
+ aIsQuietNaN = float32_is_quiet_nan( a );
+ aIsSignalingNaN = float32_is_signaling_nan( a );
+ bIsQuietNaN = float32_is_quiet_nan( b );
+ bIsSignalingNaN = float32_is_signaling_nan( b );
+ av = float32_val(a);
+ bv = float32_val(b);
+
+ if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
+
+ if ( STATUS(default_nan_mode) )
+ return float32_default_nan;
+
+ if ((uint32_t)(av<<1) < (uint32_t)(bv<<1)) {
+ aIsLargerSignificand = 0;
+ } else if ((uint32_t)(bv<<1) < (uint32_t)(av<<1)) {
+ aIsLargerSignificand = 1;
+ } else {
+ aIsLargerSignificand = (av < bv) ? 1 : 0;
+ }
+
+ if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
+ aIsLargerSignificand)) {
+ return float32_maybe_silence_nan(b);
+ } else {
+ return float32_maybe_silence_nan(a);
+ }
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the double-precision floating-point value `a' is a quiet
+| NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+int float64_is_quiet_nan( float64 a_ )
+{
+ uint64_t a = float64_val(a_);
+#if SNAN_BIT_IS_ONE
+ return
+ ( ( ( a>>51 ) & 0xFFF ) == 0xFFE )
+ && ( a & LIT64( 0x0007FFFFFFFFFFFF ) );
+#else
+ return ( LIT64( 0xFFF0000000000000 ) <= (uint64_t) ( a<<1 ) );
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the double-precision floating-point value `a' is a signaling
+| NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+int float64_is_signaling_nan( float64 a_ )
+{
+ uint64_t a = float64_val(a_);
+#if SNAN_BIT_IS_ONE
+ return ( LIT64( 0xFFF0000000000000 ) <= (uint64_t) ( a<<1 ) );
+#else
+ return
+ ( ( ( a>>51 ) & 0xFFF ) == 0xFFE )
+ && ( a & LIT64( 0x0007FFFFFFFFFFFF ) );
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns a quiet NaN if the double-precision floating point value `a' is a
+| signaling NaN; otherwise returns `a'.
+*----------------------------------------------------------------------------*/
+
+float64 float64_maybe_silence_nan( float64 a_ )
+{
+ if (float64_is_signaling_nan(a_)) {
+#if SNAN_BIT_IS_ONE
+# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
+ return float64_default_nan;
+# else
+# error Rules for silencing a signaling NaN are target-specific
+# endif
+#else
+ uint64_t a = float64_val(a_);
+ a |= LIT64( 0x0008000000000000 );
+ return make_float64(a);
+#endif
+ }
+ return a_;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the double-precision floating-point NaN
+| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
+| exception is raised.
+*----------------------------------------------------------------------------*/
+
+static commonNaNT float64ToCommonNaN( float64 a STATUS_PARAM)
+{
+ commonNaNT z;
+
+ if ( float64_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR);
+ z.sign = float64_val(a)>>63;
+ z.low = 0;
+ z.high = float64_val(a)<<12;
+ return z;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the canonical NaN `a' to the double-
+| precision floating-point format.
+*----------------------------------------------------------------------------*/
+
+static float64 commonNaNToFloat64( commonNaNT a STATUS_PARAM)
+{
+ uint64_t mantissa = a.high>>12;
+
+ if ( STATUS(default_nan_mode) ) {
+ return float64_default_nan;
+ }
+
+ if ( mantissa )
+ return make_float64(
+ ( ( (uint64_t) a.sign )<<63 )
+ | LIT64( 0x7FF0000000000000 )
+ | ( a.high>>12 ));
+ else
+ return float64_default_nan;
+}
+
+/*----------------------------------------------------------------------------
+| Takes two double-precision floating-point values `a' and `b', one of which
+| is a NaN, and returns the appropriate NaN result. If either `a' or `b' is a
+| signaling NaN, the invalid exception is raised.
+*----------------------------------------------------------------------------*/
+
+static float64 propagateFloat64NaN( float64 a, float64 b STATUS_PARAM)
+{
+ flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN;
+ flag aIsLargerSignificand;
+ uint64_t av, bv;
+
+ aIsQuietNaN = float64_is_quiet_nan( a );
+ aIsSignalingNaN = float64_is_signaling_nan( a );
+ bIsQuietNaN = float64_is_quiet_nan( b );
+ bIsSignalingNaN = float64_is_signaling_nan( b );
+ av = float64_val(a);
+ bv = float64_val(b);
+
+ if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
+
+ if ( STATUS(default_nan_mode) )
+ return float64_default_nan;
+
+ if ((uint64_t)(av<<1) < (uint64_t)(bv<<1)) {
+ aIsLargerSignificand = 0;
+ } else if ((uint64_t)(bv<<1) < (uint64_t)(av<<1)) {
+ aIsLargerSignificand = 1;
+ } else {
+ aIsLargerSignificand = (av < bv) ? 1 : 0;
+ }
+
+ if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
+ aIsLargerSignificand)) {
+ return float64_maybe_silence_nan(b);
+ } else {
+ return float64_maybe_silence_nan(a);
+ }
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the extended double-precision floating-point value `a' is a
+| quiet NaN; otherwise returns 0. This slightly differs from the same
+| function for other types as floatx80 has an explicit bit.
+*----------------------------------------------------------------------------*/
+
+int floatx80_is_quiet_nan( floatx80 a )
+{
+#if SNAN_BIT_IS_ONE
+ uint64_t aLow;
+
+ aLow = a.low & ~ LIT64( 0x4000000000000000 );
+ return
+ ( ( a.high & 0x7FFF ) == 0x7FFF )
+ && (uint64_t) ( aLow<<1 )
+ && ( a.low == aLow );
+#else
+ return ( ( a.high & 0x7FFF ) == 0x7FFF )
+ && (LIT64( 0x8000000000000000 ) <= ((uint64_t) ( a.low<<1 )));
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the extended double-precision floating-point value `a' is a
+| signaling NaN; otherwise returns 0. This slightly differs from the same
+| function for other types as floatx80 has an explicit bit.
+*----------------------------------------------------------------------------*/
+
+int floatx80_is_signaling_nan( floatx80 a )
+{
+#if SNAN_BIT_IS_ONE
+ return ( ( a.high & 0x7FFF ) == 0x7FFF )
+ && (LIT64( 0x8000000000000000 ) <= ((uint64_t) ( a.low<<1 )));
+#else
+ uint64_t aLow;
+
+ aLow = a.low & ~ LIT64( 0x4000000000000000 );
+ return
+ ( ( a.high & 0x7FFF ) == 0x7FFF )
+ && (uint64_t) ( aLow<<1 )
+ && ( a.low == aLow );
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns a quiet NaN if the extended double-precision floating point value
+| `a' is a signaling NaN; otherwise returns `a'.
+*----------------------------------------------------------------------------*/
+
+floatx80 floatx80_maybe_silence_nan( floatx80 a )
+{
+ if (floatx80_is_signaling_nan(a)) {
+#if SNAN_BIT_IS_ONE
+# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
+ a.low = floatx80_default_nan_low;
+ a.high = floatx80_default_nan_high;
+# else
+# error Rules for silencing a signaling NaN are target-specific
+# endif
+#else
+ a.low |= LIT64( 0xC000000000000000 );
+ return a;
+#endif
+ }
+ return a;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the extended double-precision floating-
+| point NaN `a' to the canonical NaN format. If `a' is a signaling NaN, the
+| invalid exception is raised.
+*----------------------------------------------------------------------------*/
+
+static commonNaNT floatx80ToCommonNaN( floatx80 a STATUS_PARAM)
+{
+ commonNaNT z;
+
+ if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR);
+ if ( a.low >> 63 ) {
+ z.sign = a.high >> 15;
+ z.low = 0;
+ z.high = a.low << 1;
+ } else {
+ z.sign = floatx80_default_nan_high >> 15;
+ z.low = 0;
+ z.high = floatx80_default_nan_low << 1;
+ }
+ return z;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the canonical NaN `a' to the extended
+| double-precision floating-point format.
+*----------------------------------------------------------------------------*/
+
+static floatx80 commonNaNToFloatx80( commonNaNT a STATUS_PARAM)
+{
+ floatx80 z;
+
+ if ( STATUS(default_nan_mode) ) {
+ z.low = floatx80_default_nan_low;
+ z.high = floatx80_default_nan_high;
+ return z;
+ }
+
+ if (a.high >> 1) {
+ z.low = LIT64( 0x8000000000000000 ) | a.high >> 1;
+ z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF;
+ } else {
+ z.low = floatx80_default_nan_low;
+ z.high = floatx80_default_nan_high;
+ }
+
+ return z;
+}
+
+/*----------------------------------------------------------------------------
+| Takes two extended double-precision floating-point values `a' and `b', one
+| of which is a NaN, and returns the appropriate NaN result. If either `a' or
+| `b' is a signaling NaN, the invalid exception is raised.
+*----------------------------------------------------------------------------*/
+
+static floatx80 propagateFloatx80NaN( floatx80 a, floatx80 b STATUS_PARAM)
+{
+ flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN;
+ flag aIsLargerSignificand;
+
+ aIsQuietNaN = floatx80_is_quiet_nan( a );
+ aIsSignalingNaN = floatx80_is_signaling_nan( a );
+ bIsQuietNaN = floatx80_is_quiet_nan( b );
+ bIsSignalingNaN = floatx80_is_signaling_nan( b );
+
+ if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
+
+ if ( STATUS(default_nan_mode) ) {
+ a.low = floatx80_default_nan_low;
+ a.high = floatx80_default_nan_high;
+ return a;
+ }
+
+ if (a.low < b.low) {
+ aIsLargerSignificand = 0;
+ } else if (b.low < a.low) {
+ aIsLargerSignificand = 1;
+ } else {
+ aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
+ }
+
+ if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
+ aIsLargerSignificand)) {
+ return floatx80_maybe_silence_nan(b);
+ } else {
+ return floatx80_maybe_silence_nan(a);
+ }
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the quadruple-precision floating-point value `a' is a quiet
+| NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+int float128_is_quiet_nan( float128 a )
+{
+#if SNAN_BIT_IS_ONE
+ return
+ ( ( ( a.high>>47 ) & 0xFFFF ) == 0xFFFE )
+ && ( a.low || ( a.high & LIT64( 0x00007FFFFFFFFFFF ) ) );
+#else
+ return
+ ( LIT64( 0xFFFE000000000000 ) <= (uint64_t) ( a.high<<1 ) )
+ && ( a.low || ( a.high & LIT64( 0x0000FFFFFFFFFFFF ) ) );
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the quadruple-precision floating-point value `a' is a
+| signaling NaN; otherwise returns 0.
+*----------------------------------------------------------------------------*/
+
+int float128_is_signaling_nan( float128 a )
+{
+#if SNAN_BIT_IS_ONE
+ return
+ ( LIT64( 0xFFFE000000000000 ) <= (uint64_t) ( a.high<<1 ) )
+ && ( a.low || ( a.high & LIT64( 0x0000FFFFFFFFFFFF ) ) );
+#else
+ return
+ ( ( ( a.high>>47 ) & 0xFFFF ) == 0xFFFE )
+ && ( a.low || ( a.high & LIT64( 0x00007FFFFFFFFFFF ) ) );
+#endif
+}
+
+/*----------------------------------------------------------------------------
+| Returns a quiet NaN if the quadruple-precision floating point value `a' is
+| a signaling NaN; otherwise returns `a'.
+*----------------------------------------------------------------------------*/
+
+float128 float128_maybe_silence_nan( float128 a )
+{
+ if (float128_is_signaling_nan(a)) {
+#if SNAN_BIT_IS_ONE
+# if defined(TARGET_MIPS) || defined(TARGET_SH4) || defined(TARGET_UNICORE32)
+ a.low = float128_default_nan_low;
+ a.high = float128_default_nan_high;
+# else
+# error Rules for silencing a signaling NaN are target-specific
+# endif
+#else
+ a.high |= LIT64( 0x0000800000000000 );
+ return a;
+#endif
+ }
+ return a;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the quadruple-precision floating-point NaN
+| `a' to the canonical NaN format. If `a' is a signaling NaN, the invalid
+| exception is raised.
+*----------------------------------------------------------------------------*/
+
+static commonNaNT float128ToCommonNaN( float128 a STATUS_PARAM)
+{
+ commonNaNT z;
+
+ if ( float128_is_signaling_nan( a ) ) float_raise( float_flag_invalid STATUS_VAR);
+ z.sign = a.high>>63;
+ shortShift128Left( a.high, a.low, 16, &z.high, &z.low );
+ return z;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the canonical NaN `a' to the quadruple-
+| precision floating-point format.
+*----------------------------------------------------------------------------*/
+
+static float128 commonNaNToFloat128( commonNaNT a STATUS_PARAM)
+{
+ float128 z;
+
+ if ( STATUS(default_nan_mode) ) {
+ z.low = float128_default_nan_low;
+ z.high = float128_default_nan_high;
+ return z;
+ }
+
+ shift128Right( a.high, a.low, 16, &z.high, &z.low );
+ z.high |= ( ( (uint64_t) a.sign )<<63 ) | LIT64( 0x7FFF000000000000 );
+ return z;
+}
+
+/*----------------------------------------------------------------------------
+| Takes two quadruple-precision floating-point values `a' and `b', one of
+| which is a NaN, and returns the appropriate NaN result. If either `a' or
+| `b' is a signaling NaN, the invalid exception is raised.
+*----------------------------------------------------------------------------*/
+
+static float128 propagateFloat128NaN( float128 a, float128 b STATUS_PARAM)
+{
+ flag aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN;
+ flag aIsLargerSignificand;
+
+ aIsQuietNaN = float128_is_quiet_nan( a );
+ aIsSignalingNaN = float128_is_signaling_nan( a );
+ bIsQuietNaN = float128_is_quiet_nan( b );
+ bIsSignalingNaN = float128_is_signaling_nan( b );
+
+ if ( aIsSignalingNaN | bIsSignalingNaN ) float_raise( float_flag_invalid STATUS_VAR);
+
+ if ( STATUS(default_nan_mode) ) {
+ a.low = float128_default_nan_low;
+ a.high = float128_default_nan_high;
+ return a;
+ }
+
+ if (lt128(a.high<<1, a.low, b.high<<1, b.low)) {
+ aIsLargerSignificand = 0;
+ } else if (lt128(b.high<<1, b.low, a.high<<1, a.low)) {
+ aIsLargerSignificand = 1;
+ } else {
+ aIsLargerSignificand = (a.high < b.high) ? 1 : 0;
+ }
+
+ if (pickNaN(aIsQuietNaN, aIsSignalingNaN, bIsQuietNaN, bIsSignalingNaN,
+ aIsLargerSignificand)) {
+ return float128_maybe_silence_nan(b);
+ } else {
+ return float128_maybe_silence_nan(a);
+ }
+}
+
diff --git a/qemu-0.15.x/fpu/softfloat.c b/qemu-0.15.x/fpu/softfloat.c
new file mode 100644
index 0000000..7951a0e
--- /dev/null
+++ b/qemu-0.15.x/fpu/softfloat.c
@@ -0,0 +1,6430 @@
+/*
+ * QEMU float support
+ *
+ * Derived from SoftFloat.
+ */
+
+/*============================================================================
+
+This C source file is part of the SoftFloat IEC/IEEE Floating-point Arithmetic
+Package, Release 2b.
+
+Written by John R. Hauser. This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704. Funding was partially provided by the
+National Science Foundation under grant MIP-9311980. The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek. More information
+is available through the Web page `http://www.cs.berkeley.edu/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort has
+been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT TIMES
+RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO PERSONS
+AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ALL LOSSES,
+COSTS, OR OTHER PROBLEMS THEY INCUR DUE TO THE SOFTWARE, AND WHO FURTHERMORE
+EFFECTIVELY INDEMNIFY JOHN HAUSER AND THE INTERNATIONAL COMPUTER SCIENCE
+INSTITUTE (possibly via similar legal warning) AGAINST ALL LOSSES, COSTS, OR
+OTHER PROBLEMS INCURRED BY THEIR CUSTOMERS AND CLIENTS DUE TO THE SOFTWARE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) the source code for the derivative work includes prominent notice that
+the work is derivative, and (2) the source code includes prominent notice with
+these four paragraphs for those parts of this code that are retained.
+
+=============================================================================*/
+
+#include "softfloat.h"
+
+/*----------------------------------------------------------------------------
+| Primitive arithmetic functions, including multi-word arithmetic, and
+| division and square root approximations. (Can be specialized to target if
+| desired.)
+*----------------------------------------------------------------------------*/
+#include "softfloat-macros.h"
+
+/*----------------------------------------------------------------------------
+| Functions and definitions to determine: (1) whether tininess for underflow
+| is detected before or after rounding by default, (2) what (if anything)
+| happens when exceptions are raised, (3) how signaling NaNs are distinguished
+| from quiet NaNs, (4) the default generated quiet NaNs, and (5) how NaNs
+| are propagated from function inputs to output. These details are target-
+| specific.
+*----------------------------------------------------------------------------*/
+#include "softfloat-specialize.h"
+
+void set_float_rounding_mode(int val STATUS_PARAM)
+{
+ STATUS(float_rounding_mode) = val;
+}
+
+void set_float_exception_flags(int val STATUS_PARAM)
+{
+ STATUS(float_exception_flags) = val;
+}
+
+void set_floatx80_rounding_precision(int val STATUS_PARAM)
+{
+ STATUS(floatx80_rounding_precision) = val;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the fraction bits of the half-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE uint32_t extractFloat16Frac(float16 a)
+{
+ return float16_val(a) & 0x3ff;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the exponent bits of the half-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE int16 extractFloat16Exp(float16 a)
+{
+ return (float16_val(a) >> 10) & 0x1f;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the sign bit of the single-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE flag extractFloat16Sign(float16 a)
+{
+ return float16_val(a)>>15;
+}
+
+/*----------------------------------------------------------------------------
+| Takes a 64-bit fixed-point value `absZ' with binary point between bits 6
+| and 7, and returns the properly rounded 32-bit integer corresponding to the
+| input. If `zSign' is 1, the input is negated before being converted to an
+| integer. Bit 63 of `absZ' must be zero. Ordinarily, the fixed-point input
+| is simply rounded to an integer, with the inexact exception raised if the
+| input cannot be represented exactly as an integer. However, if the fixed-
+| point input is too large, the invalid exception is raised and the largest
+| positive or negative integer is returned.
+*----------------------------------------------------------------------------*/
+
+static int32 roundAndPackInt32( flag zSign, uint64_t absZ STATUS_PARAM)
+{
+ int8 roundingMode;
+ flag roundNearestEven;
+ int8 roundIncrement, roundBits;
+ int32 z;
+
+ roundingMode = STATUS(float_rounding_mode);
+ roundNearestEven = ( roundingMode == float_round_nearest_even );
+ roundIncrement = 0x40;
+ if ( ! roundNearestEven ) {
+ if ( roundingMode == float_round_to_zero ) {
+ roundIncrement = 0;
+ }
+ else {
+ roundIncrement = 0x7F;
+ if ( zSign ) {
+ if ( roundingMode == float_round_up ) roundIncrement = 0;
+ }
+ else {
+ if ( roundingMode == float_round_down ) roundIncrement = 0;
+ }
+ }
+ }
+ roundBits = absZ & 0x7F;
+ absZ = ( absZ + roundIncrement )>>7;
+ absZ &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven );
+ z = absZ;
+ if ( zSign ) z = - z;
+ if ( ( absZ>>32 ) || ( z && ( ( z < 0 ) ^ zSign ) ) ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return zSign ? (int32_t) 0x80000000 : 0x7FFFFFFF;
+ }
+ if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes the 128-bit fixed-point value formed by concatenating `absZ0' and
+| `absZ1', with binary point between bits 63 and 64 (between the input words),
+| and returns the properly rounded 64-bit integer corresponding to the input.
+| If `zSign' is 1, the input is negated before being converted to an integer.
+| Ordinarily, the fixed-point input is simply rounded to an integer, with
+| the inexact exception raised if the input cannot be represented exactly as
+| an integer. However, if the fixed-point input is too large, the invalid
+| exception is raised and the largest positive or negative integer is
+| returned.
+*----------------------------------------------------------------------------*/
+
+static int64 roundAndPackInt64( flag zSign, uint64_t absZ0, uint64_t absZ1 STATUS_PARAM)
+{
+ int8 roundingMode;
+ flag roundNearestEven, increment;
+ int64 z;
+
+ roundingMode = STATUS(float_rounding_mode);
+ roundNearestEven = ( roundingMode == float_round_nearest_even );
+ increment = ( (int64_t) absZ1 < 0 );
+ if ( ! roundNearestEven ) {
+ if ( roundingMode == float_round_to_zero ) {
+ increment = 0;
+ }
+ else {
+ if ( zSign ) {
+ increment = ( roundingMode == float_round_down ) && absZ1;
+ }
+ else {
+ increment = ( roundingMode == float_round_up ) && absZ1;
+ }
+ }
+ }
+ if ( increment ) {
+ ++absZ0;
+ if ( absZ0 == 0 ) goto overflow;
+ absZ0 &= ~ ( ( (uint64_t) ( absZ1<<1 ) == 0 ) & roundNearestEven );
+ }
+ z = absZ0;
+ if ( zSign ) z = - z;
+ if ( z && ( ( z < 0 ) ^ zSign ) ) {
+ overflow:
+ float_raise( float_flag_invalid STATUS_VAR);
+ return
+ zSign ? (int64_t) LIT64( 0x8000000000000000 )
+ : LIT64( 0x7FFFFFFFFFFFFFFF );
+ }
+ if ( absZ1 ) STATUS(float_exception_flags) |= float_flag_inexact;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the fraction bits of the single-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE uint32_t extractFloat32Frac( float32 a )
+{
+
+ return float32_val(a) & 0x007FFFFF;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the exponent bits of the single-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE int16 extractFloat32Exp( float32 a )
+{
+
+ return ( float32_val(a)>>23 ) & 0xFF;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the sign bit of the single-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE flag extractFloat32Sign( float32 a )
+{
+
+ return float32_val(a)>>31;
+
+}
+
+/*----------------------------------------------------------------------------
+| If `a' is denormal and we are in flush-to-zero mode then set the
+| input-denormal exception and return zero. Otherwise just return the value.
+*----------------------------------------------------------------------------*/
+static float32 float32_squash_input_denormal(float32 a STATUS_PARAM)
+{
+ if (STATUS(flush_inputs_to_zero)) {
+ if (extractFloat32Exp(a) == 0 && extractFloat32Frac(a) != 0) {
+ float_raise(float_flag_input_denormal STATUS_VAR);
+ return make_float32(float32_val(a) & 0x80000000);
+ }
+ }
+ return a;
+}
+
+/*----------------------------------------------------------------------------
+| Normalizes the subnormal single-precision floating-point value represented
+| by the denormalized significand `aSig'. The normalized exponent and
+| significand are stored at the locations pointed to by `zExpPtr' and
+| `zSigPtr', respectively.
+*----------------------------------------------------------------------------*/
+
+static void
+ normalizeFloat32Subnormal( uint32_t aSig, int16 *zExpPtr, uint32_t *zSigPtr )
+{
+ int8 shiftCount;
+
+ shiftCount = countLeadingZeros32( aSig ) - 8;
+ *zSigPtr = aSig<<shiftCount;
+ *zExpPtr = 1 - shiftCount;
+
+}
+
+/*----------------------------------------------------------------------------
+| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a
+| single-precision floating-point value, returning the result. After being
+| shifted into the proper positions, the three fields are simply added
+| together to form the result. This means that any integer portion of `zSig'
+| will be added into the exponent. Since a properly normalized significand
+| will have an integer portion equal to 1, the `zExp' input should be 1 less
+| than the desired result exponent whenever `zSig' is a complete, normalized
+| significand.
+*----------------------------------------------------------------------------*/
+
+INLINE float32 packFloat32( flag zSign, int16 zExp, uint32_t zSig )
+{
+
+ return make_float32(
+ ( ( (uint32_t) zSign )<<31 ) + ( ( (uint32_t) zExp )<<23 ) + zSig);
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
+| and significand `zSig', and returns the proper single-precision floating-
+| point value corresponding to the abstract input. Ordinarily, the abstract
+| value is simply rounded and packed into the single-precision format, with
+| the inexact exception raised if the abstract input cannot be represented
+| exactly. However, if the abstract value is too large, the overflow and
+| inexact exceptions are raised and an infinity or maximal finite value is
+| returned. If the abstract value is too small, the input value is rounded to
+| a subnormal number, and the underflow and inexact exceptions are raised if
+| the abstract input cannot be represented exactly as a subnormal single-
+| precision floating-point number.
+| The input significand `zSig' has its binary point between bits 30
+| and 29, which is 7 bits to the left of the usual location. This shifted
+| significand must be normalized or smaller. If `zSig' is not normalized,
+| `zExp' must be 0; in that case, the result returned is a subnormal number,
+| and it must not require rounding. In the usual case that `zSig' is
+| normalized, `zExp' must be 1 less than the ``true'' floating-point exponent.
+| The handling of underflow and overflow follows the IEC/IEEE Standard for
+| Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static float32 roundAndPackFloat32( flag zSign, int16 zExp, uint32_t zSig STATUS_PARAM)
+{
+ int8 roundingMode;
+ flag roundNearestEven;
+ int8 roundIncrement, roundBits;
+ flag isTiny;
+
+ roundingMode = STATUS(float_rounding_mode);
+ roundNearestEven = ( roundingMode == float_round_nearest_even );
+ roundIncrement = 0x40;
+ if ( ! roundNearestEven ) {
+ if ( roundingMode == float_round_to_zero ) {
+ roundIncrement = 0;
+ }
+ else {
+ roundIncrement = 0x7F;
+ if ( zSign ) {
+ if ( roundingMode == float_round_up ) roundIncrement = 0;
+ }
+ else {
+ if ( roundingMode == float_round_down ) roundIncrement = 0;
+ }
+ }
+ }
+ roundBits = zSig & 0x7F;
+ if ( 0xFD <= (uint16_t) zExp ) {
+ if ( ( 0xFD < zExp )
+ || ( ( zExp == 0xFD )
+ && ( (int32_t) ( zSig + roundIncrement ) < 0 ) )
+ ) {
+ float_raise( float_flag_overflow | float_flag_inexact STATUS_VAR);
+ return packFloat32( zSign, 0xFF, - ( roundIncrement == 0 ));
+ }
+ if ( zExp < 0 ) {
+ if (STATUS(flush_to_zero)) {
+ float_raise(float_flag_output_denormal STATUS_VAR);
+ return packFloat32(zSign, 0, 0);
+ }
+ isTiny =
+ ( STATUS(float_detect_tininess) == float_tininess_before_rounding )
+ || ( zExp < -1 )
+ || ( zSig + roundIncrement < 0x80000000 );
+ shift32RightJamming( zSig, - zExp, &zSig );
+ zExp = 0;
+ roundBits = zSig & 0x7F;
+ if ( isTiny && roundBits ) float_raise( float_flag_underflow STATUS_VAR);
+ }
+ }
+ if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact;
+ zSig = ( zSig + roundIncrement )>>7;
+ zSig &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven );
+ if ( zSig == 0 ) zExp = 0;
+ return packFloat32( zSign, zExp, zSig );
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
+| and significand `zSig', and returns the proper single-precision floating-
+| point value corresponding to the abstract input. This routine is just like
+| `roundAndPackFloat32' except that `zSig' does not have to be normalized.
+| Bit 31 of `zSig' must be zero, and `zExp' must be 1 less than the ``true''
+| floating-point exponent.
+*----------------------------------------------------------------------------*/
+
+static float32
+ normalizeRoundAndPackFloat32( flag zSign, int16 zExp, uint32_t zSig STATUS_PARAM)
+{
+ int8 shiftCount;
+
+ shiftCount = countLeadingZeros32( zSig ) - 1;
+ return roundAndPackFloat32( zSign, zExp - shiftCount, zSig<<shiftCount STATUS_VAR);
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the fraction bits of the double-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE uint64_t extractFloat64Frac( float64 a )
+{
+
+ return float64_val(a) & LIT64( 0x000FFFFFFFFFFFFF );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the exponent bits of the double-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE int16 extractFloat64Exp( float64 a )
+{
+
+ return ( float64_val(a)>>52 ) & 0x7FF;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the sign bit of the double-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE flag extractFloat64Sign( float64 a )
+{
+
+ return float64_val(a)>>63;
+
+}
+
+/*----------------------------------------------------------------------------
+| If `a' is denormal and we are in flush-to-zero mode then set the
+| input-denormal exception and return zero. Otherwise just return the value.
+*----------------------------------------------------------------------------*/
+static float64 float64_squash_input_denormal(float64 a STATUS_PARAM)
+{
+ if (STATUS(flush_inputs_to_zero)) {
+ if (extractFloat64Exp(a) == 0 && extractFloat64Frac(a) != 0) {
+ float_raise(float_flag_input_denormal STATUS_VAR);
+ return make_float64(float64_val(a) & (1ULL << 63));
+ }
+ }
+ return a;
+}
+
+/*----------------------------------------------------------------------------
+| Normalizes the subnormal double-precision floating-point value represented
+| by the denormalized significand `aSig'. The normalized exponent and
+| significand are stored at the locations pointed to by `zExpPtr' and
+| `zSigPtr', respectively.
+*----------------------------------------------------------------------------*/
+
+static void
+ normalizeFloat64Subnormal( uint64_t aSig, int16 *zExpPtr, uint64_t *zSigPtr )
+{
+ int8 shiftCount;
+
+ shiftCount = countLeadingZeros64( aSig ) - 11;
+ *zSigPtr = aSig<<shiftCount;
+ *zExpPtr = 1 - shiftCount;
+
+}
+
+/*----------------------------------------------------------------------------
+| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a
+| double-precision floating-point value, returning the result. After being
+| shifted into the proper positions, the three fields are simply added
+| together to form the result. This means that any integer portion of `zSig'
+| will be added into the exponent. Since a properly normalized significand
+| will have an integer portion equal to 1, the `zExp' input should be 1 less
+| than the desired result exponent whenever `zSig' is a complete, normalized
+| significand.
+*----------------------------------------------------------------------------*/
+
+INLINE float64 packFloat64( flag zSign, int16 zExp, uint64_t zSig )
+{
+
+ return make_float64(
+ ( ( (uint64_t) zSign )<<63 ) + ( ( (uint64_t) zExp )<<52 ) + zSig);
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
+| and significand `zSig', and returns the proper double-precision floating-
+| point value corresponding to the abstract input. Ordinarily, the abstract
+| value is simply rounded and packed into the double-precision format, with
+| the inexact exception raised if the abstract input cannot be represented
+| exactly. However, if the abstract value is too large, the overflow and
+| inexact exceptions are raised and an infinity or maximal finite value is
+| returned. If the abstract value is too small, the input value is rounded
+| to a subnormal number, and the underflow and inexact exceptions are raised
+| if the abstract input cannot be represented exactly as a subnormal double-
+| precision floating-point number.
+| The input significand `zSig' has its binary point between bits 62
+| and 61, which is 10 bits to the left of the usual location. This shifted
+| significand must be normalized or smaller. If `zSig' is not normalized,
+| `zExp' must be 0; in that case, the result returned is a subnormal number,
+| and it must not require rounding. In the usual case that `zSig' is
+| normalized, `zExp' must be 1 less than the ``true'' floating-point exponent.
+| The handling of underflow and overflow follows the IEC/IEEE Standard for
+| Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static float64 roundAndPackFloat64( flag zSign, int16 zExp, uint64_t zSig STATUS_PARAM)
+{
+ int8 roundingMode;
+ flag roundNearestEven;
+ int16 roundIncrement, roundBits;
+ flag isTiny;
+
+ roundingMode = STATUS(float_rounding_mode);
+ roundNearestEven = ( roundingMode == float_round_nearest_even );
+ roundIncrement = 0x200;
+ if ( ! roundNearestEven ) {
+ if ( roundingMode == float_round_to_zero ) {
+ roundIncrement = 0;
+ }
+ else {
+ roundIncrement = 0x3FF;
+ if ( zSign ) {
+ if ( roundingMode == float_round_up ) roundIncrement = 0;
+ }
+ else {
+ if ( roundingMode == float_round_down ) roundIncrement = 0;
+ }
+ }
+ }
+ roundBits = zSig & 0x3FF;
+ if ( 0x7FD <= (uint16_t) zExp ) {
+ if ( ( 0x7FD < zExp )
+ || ( ( zExp == 0x7FD )
+ && ( (int64_t) ( zSig + roundIncrement ) < 0 ) )
+ ) {
+ float_raise( float_flag_overflow | float_flag_inexact STATUS_VAR);
+ return packFloat64( zSign, 0x7FF, - ( roundIncrement == 0 ));
+ }
+ if ( zExp < 0 ) {
+ if (STATUS(flush_to_zero)) {
+ float_raise(float_flag_output_denormal STATUS_VAR);
+ return packFloat64(zSign, 0, 0);
+ }
+ isTiny =
+ ( STATUS(float_detect_tininess) == float_tininess_before_rounding )
+ || ( zExp < -1 )
+ || ( zSig + roundIncrement < LIT64( 0x8000000000000000 ) );
+ shift64RightJamming( zSig, - zExp, &zSig );
+ zExp = 0;
+ roundBits = zSig & 0x3FF;
+ if ( isTiny && roundBits ) float_raise( float_flag_underflow STATUS_VAR);
+ }
+ }
+ if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact;
+ zSig = ( zSig + roundIncrement )>>10;
+ zSig &= ~ ( ( ( roundBits ^ 0x200 ) == 0 ) & roundNearestEven );
+ if ( zSig == 0 ) zExp = 0;
+ return packFloat64( zSign, zExp, zSig );
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
+| and significand `zSig', and returns the proper double-precision floating-
+| point value corresponding to the abstract input. This routine is just like
+| `roundAndPackFloat64' except that `zSig' does not have to be normalized.
+| Bit 63 of `zSig' must be zero, and `zExp' must be 1 less than the ``true''
+| floating-point exponent.
+*----------------------------------------------------------------------------*/
+
+static float64
+ normalizeRoundAndPackFloat64( flag zSign, int16 zExp, uint64_t zSig STATUS_PARAM)
+{
+ int8 shiftCount;
+
+ shiftCount = countLeadingZeros64( zSig ) - 1;
+ return roundAndPackFloat64( zSign, zExp - shiftCount, zSig<<shiftCount STATUS_VAR);
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the fraction bits of the extended double-precision floating-point
+| value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE uint64_t extractFloatx80Frac( floatx80 a )
+{
+
+ return a.low;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the exponent bits of the extended double-precision floating-point
+| value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE int32 extractFloatx80Exp( floatx80 a )
+{
+
+ return a.high & 0x7FFF;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the sign bit of the extended double-precision floating-point value
+| `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE flag extractFloatx80Sign( floatx80 a )
+{
+
+ return a.high>>15;
+
+}
+
+/*----------------------------------------------------------------------------
+| Normalizes the subnormal extended double-precision floating-point value
+| represented by the denormalized significand `aSig'. The normalized exponent
+| and significand are stored at the locations pointed to by `zExpPtr' and
+| `zSigPtr', respectively.
+*----------------------------------------------------------------------------*/
+
+static void
+ normalizeFloatx80Subnormal( uint64_t aSig, int32 *zExpPtr, uint64_t *zSigPtr )
+{
+ int8 shiftCount;
+
+ shiftCount = countLeadingZeros64( aSig );
+ *zSigPtr = aSig<<shiftCount;
+ *zExpPtr = 1 - shiftCount;
+
+}
+
+/*----------------------------------------------------------------------------
+| Packs the sign `zSign', exponent `zExp', and significand `zSig' into an
+| extended double-precision floating-point value, returning the result.
+*----------------------------------------------------------------------------*/
+
+INLINE floatx80 packFloatx80( flag zSign, int32 zExp, uint64_t zSig )
+{
+ floatx80 z;
+
+ z.low = zSig;
+ z.high = ( ( (uint16_t) zSign )<<15 ) + zExp;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
+| and extended significand formed by the concatenation of `zSig0' and `zSig1',
+| and returns the proper extended double-precision floating-point value
+| corresponding to the abstract input. Ordinarily, the abstract value is
+| rounded and packed into the extended double-precision format, with the
+| inexact exception raised if the abstract input cannot be represented
+| exactly. However, if the abstract value is too large, the overflow and
+| inexact exceptions are raised and an infinity or maximal finite value is
+| returned. If the abstract value is too small, the input value is rounded to
+| a subnormal number, and the underflow and inexact exceptions are raised if
+| the abstract input cannot be represented exactly as a subnormal extended
+| double-precision floating-point number.
+| If `roundingPrecision' is 32 or 64, the result is rounded to the same
+| number of bits as single or double precision, respectively. Otherwise, the
+| result is rounded to the full precision of the extended double-precision
+| format.
+| The input significand must be normalized or smaller. If the input
+| significand is not normalized, `zExp' must be 0; in that case, the result
+| returned is a subnormal number, and it must not require rounding. The
+| handling of underflow and overflow follows the IEC/IEEE Standard for Binary
+| Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static floatx80
+ roundAndPackFloatx80(
+ int8 roundingPrecision, flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1
+ STATUS_PARAM)
+{
+ int8 roundingMode;
+ flag roundNearestEven, increment, isTiny;
+ int64 roundIncrement, roundMask, roundBits;
+
+ roundingMode = STATUS(float_rounding_mode);
+ roundNearestEven = ( roundingMode == float_round_nearest_even );
+ if ( roundingPrecision == 80 ) goto precision80;
+ if ( roundingPrecision == 64 ) {
+ roundIncrement = LIT64( 0x0000000000000400 );
+ roundMask = LIT64( 0x00000000000007FF );
+ }
+ else if ( roundingPrecision == 32 ) {
+ roundIncrement = LIT64( 0x0000008000000000 );
+ roundMask = LIT64( 0x000000FFFFFFFFFF );
+ }
+ else {
+ goto precision80;
+ }
+ zSig0 |= ( zSig1 != 0 );
+ if ( ! roundNearestEven ) {
+ if ( roundingMode == float_round_to_zero ) {
+ roundIncrement = 0;
+ }
+ else {
+ roundIncrement = roundMask;
+ if ( zSign ) {
+ if ( roundingMode == float_round_up ) roundIncrement = 0;
+ }
+ else {
+ if ( roundingMode == float_round_down ) roundIncrement = 0;
+ }
+ }
+ }
+ roundBits = zSig0 & roundMask;
+ if ( 0x7FFD <= (uint32_t) ( zExp - 1 ) ) {
+ if ( ( 0x7FFE < zExp )
+ || ( ( zExp == 0x7FFE ) && ( zSig0 + roundIncrement < zSig0 ) )
+ ) {
+ goto overflow;
+ }
+ if ( zExp <= 0 ) {
+ if (STATUS(flush_to_zero)) {
+ float_raise(float_flag_output_denormal STATUS_VAR);
+ return packFloatx80(zSign, 0, 0);
+ }
+ isTiny =
+ ( STATUS(float_detect_tininess) == float_tininess_before_rounding )
+ || ( zExp < 0 )
+ || ( zSig0 <= zSig0 + roundIncrement );
+ shift64RightJamming( zSig0, 1 - zExp, &zSig0 );
+ zExp = 0;
+ roundBits = zSig0 & roundMask;
+ if ( isTiny && roundBits ) float_raise( float_flag_underflow STATUS_VAR);
+ if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact;
+ zSig0 += roundIncrement;
+ if ( (int64_t) zSig0 < 0 ) zExp = 1;
+ roundIncrement = roundMask + 1;
+ if ( roundNearestEven && ( roundBits<<1 == roundIncrement ) ) {
+ roundMask |= roundIncrement;
+ }
+ zSig0 &= ~ roundMask;
+ return packFloatx80( zSign, zExp, zSig0 );
+ }
+ }
+ if ( roundBits ) STATUS(float_exception_flags) |= float_flag_inexact;
+ zSig0 += roundIncrement;
+ if ( zSig0 < roundIncrement ) {
+ ++zExp;
+ zSig0 = LIT64( 0x8000000000000000 );
+ }
+ roundIncrement = roundMask + 1;
+ if ( roundNearestEven && ( roundBits<<1 == roundIncrement ) ) {
+ roundMask |= roundIncrement;
+ }
+ zSig0 &= ~ roundMask;
+ if ( zSig0 == 0 ) zExp = 0;
+ return packFloatx80( zSign, zExp, zSig0 );
+ precision80:
+ increment = ( (int64_t) zSig1 < 0 );
+ if ( ! roundNearestEven ) {
+ if ( roundingMode == float_round_to_zero ) {
+ increment = 0;
+ }
+ else {
+ if ( zSign ) {
+ increment = ( roundingMode == float_round_down ) && zSig1;
+ }
+ else {
+ increment = ( roundingMode == float_round_up ) && zSig1;
+ }
+ }
+ }
+ if ( 0x7FFD <= (uint32_t) ( zExp - 1 ) ) {
+ if ( ( 0x7FFE < zExp )
+ || ( ( zExp == 0x7FFE )
+ && ( zSig0 == LIT64( 0xFFFFFFFFFFFFFFFF ) )
+ && increment
+ )
+ ) {
+ roundMask = 0;
+ overflow:
+ float_raise( float_flag_overflow | float_flag_inexact STATUS_VAR);
+ if ( ( roundingMode == float_round_to_zero )
+ || ( zSign && ( roundingMode == float_round_up ) )
+ || ( ! zSign && ( roundingMode == float_round_down ) )
+ ) {
+ return packFloatx80( zSign, 0x7FFE, ~ roundMask );
+ }
+ return packFloatx80( zSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
+ }
+ if ( zExp <= 0 ) {
+ isTiny =
+ ( STATUS(float_detect_tininess) == float_tininess_before_rounding )
+ || ( zExp < 0 )
+ || ! increment
+ || ( zSig0 < LIT64( 0xFFFFFFFFFFFFFFFF ) );
+ shift64ExtraRightJamming( zSig0, zSig1, 1 - zExp, &zSig0, &zSig1 );
+ zExp = 0;
+ if ( isTiny && zSig1 ) float_raise( float_flag_underflow STATUS_VAR);
+ if ( zSig1 ) STATUS(float_exception_flags) |= float_flag_inexact;
+ if ( roundNearestEven ) {
+ increment = ( (int64_t) zSig1 < 0 );
+ }
+ else {
+ if ( zSign ) {
+ increment = ( roundingMode == float_round_down ) && zSig1;
+ }
+ else {
+ increment = ( roundingMode == float_round_up ) && zSig1;
+ }
+ }
+ if ( increment ) {
+ ++zSig0;
+ zSig0 &=
+ ~ ( ( (uint64_t) ( zSig1<<1 ) == 0 ) & roundNearestEven );
+ if ( (int64_t) zSig0 < 0 ) zExp = 1;
+ }
+ return packFloatx80( zSign, zExp, zSig0 );
+ }
+ }
+ if ( zSig1 ) STATUS(float_exception_flags) |= float_flag_inexact;
+ if ( increment ) {
+ ++zSig0;
+ if ( zSig0 == 0 ) {
+ ++zExp;
+ zSig0 = LIT64( 0x8000000000000000 );
+ }
+ else {
+ zSig0 &= ~ ( ( (uint64_t) ( zSig1<<1 ) == 0 ) & roundNearestEven );
+ }
+ }
+ else {
+ if ( zSig0 == 0 ) zExp = 0;
+ }
+ return packFloatx80( zSign, zExp, zSig0 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent
+| `zExp', and significand formed by the concatenation of `zSig0' and `zSig1',
+| and returns the proper extended double-precision floating-point value
+| corresponding to the abstract input. This routine is just like
+| `roundAndPackFloatx80' except that the input significand does not have to be
+| normalized.
+*----------------------------------------------------------------------------*/
+
+static floatx80
+ normalizeRoundAndPackFloatx80(
+ int8 roundingPrecision, flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1
+ STATUS_PARAM)
+{
+ int8 shiftCount;
+
+ if ( zSig0 == 0 ) {
+ zSig0 = zSig1;
+ zSig1 = 0;
+ zExp -= 64;
+ }
+ shiftCount = countLeadingZeros64( zSig0 );
+ shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 );
+ zExp -= shiftCount;
+ return
+ roundAndPackFloatx80( roundingPrecision, zSign, zExp, zSig0, zSig1 STATUS_VAR);
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the least-significant 64 fraction bits of the quadruple-precision
+| floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE uint64_t extractFloat128Frac1( float128 a )
+{
+
+ return a.low;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the most-significant 48 fraction bits of the quadruple-precision
+| floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE uint64_t extractFloat128Frac0( float128 a )
+{
+
+ return a.high & LIT64( 0x0000FFFFFFFFFFFF );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the exponent bits of the quadruple-precision floating-point value
+| `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE int32 extractFloat128Exp( float128 a )
+{
+
+ return ( a.high>>48 ) & 0x7FFF;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the sign bit of the quadruple-precision floating-point value `a'.
+*----------------------------------------------------------------------------*/
+
+INLINE flag extractFloat128Sign( float128 a )
+{
+
+ return a.high>>63;
+
+}
+
+/*----------------------------------------------------------------------------
+| Normalizes the subnormal quadruple-precision floating-point value
+| represented by the denormalized significand formed by the concatenation of
+| `aSig0' and `aSig1'. The normalized exponent is stored at the location
+| pointed to by `zExpPtr'. The most significant 49 bits of the normalized
+| significand are stored at the location pointed to by `zSig0Ptr', and the
+| least significant 64 bits of the normalized significand are stored at the
+| location pointed to by `zSig1Ptr'.
+*----------------------------------------------------------------------------*/
+
+static void
+ normalizeFloat128Subnormal(
+ uint64_t aSig0,
+ uint64_t aSig1,
+ int32 *zExpPtr,
+ uint64_t *zSig0Ptr,
+ uint64_t *zSig1Ptr
+ )
+{
+ int8 shiftCount;
+
+ if ( aSig0 == 0 ) {
+ shiftCount = countLeadingZeros64( aSig1 ) - 15;
+ if ( shiftCount < 0 ) {
+ *zSig0Ptr = aSig1>>( - shiftCount );
+ *zSig1Ptr = aSig1<<( shiftCount & 63 );
+ }
+ else {
+ *zSig0Ptr = aSig1<<shiftCount;
+ *zSig1Ptr = 0;
+ }
+ *zExpPtr = - shiftCount - 63;
+ }
+ else {
+ shiftCount = countLeadingZeros64( aSig0 ) - 15;
+ shortShift128Left( aSig0, aSig1, shiftCount, zSig0Ptr, zSig1Ptr );
+ *zExpPtr = 1 - shiftCount;
+ }
+
+}
+
+/*----------------------------------------------------------------------------
+| Packs the sign `zSign', the exponent `zExp', and the significand formed
+| by the concatenation of `zSig0' and `zSig1' into a quadruple-precision
+| floating-point value, returning the result. After being shifted into the
+| proper positions, the three fields `zSign', `zExp', and `zSig0' are simply
+| added together to form the most significant 32 bits of the result. This
+| means that any integer portion of `zSig0' will be added into the exponent.
+| Since a properly normalized significand will have an integer portion equal
+| to 1, the `zExp' input should be 1 less than the desired result exponent
+| whenever `zSig0' and `zSig1' concatenated form a complete, normalized
+| significand.
+*----------------------------------------------------------------------------*/
+
+INLINE float128
+ packFloat128( flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1 )
+{
+ float128 z;
+
+ z.low = zSig1;
+ z.high = ( ( (uint64_t) zSign )<<63 ) + ( ( (uint64_t) zExp )<<48 ) + zSig0;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
+| and extended significand formed by the concatenation of `zSig0', `zSig1',
+| and `zSig2', and returns the proper quadruple-precision floating-point value
+| corresponding to the abstract input. Ordinarily, the abstract value is
+| simply rounded and packed into the quadruple-precision format, with the
+| inexact exception raised if the abstract input cannot be represented
+| exactly. However, if the abstract value is too large, the overflow and
+| inexact exceptions are raised and an infinity or maximal finite value is
+| returned. If the abstract value is too small, the input value is rounded to
+| a subnormal number, and the underflow and inexact exceptions are raised if
+| the abstract input cannot be represented exactly as a subnormal quadruple-
+| precision floating-point number.
+| The input significand must be normalized or smaller. If the input
+| significand is not normalized, `zExp' must be 0; in that case, the result
+| returned is a subnormal number, and it must not require rounding. In the
+| usual case that the input significand is normalized, `zExp' must be 1 less
+| than the ``true'' floating-point exponent. The handling of underflow and
+| overflow follows the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static float128
+ roundAndPackFloat128(
+ flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1, uint64_t zSig2 STATUS_PARAM)
+{
+ int8 roundingMode;
+ flag roundNearestEven, increment, isTiny;
+
+ roundingMode = STATUS(float_rounding_mode);
+ roundNearestEven = ( roundingMode == float_round_nearest_even );
+ increment = ( (int64_t) zSig2 < 0 );
+ if ( ! roundNearestEven ) {
+ if ( roundingMode == float_round_to_zero ) {
+ increment = 0;
+ }
+ else {
+ if ( zSign ) {
+ increment = ( roundingMode == float_round_down ) && zSig2;
+ }
+ else {
+ increment = ( roundingMode == float_round_up ) && zSig2;
+ }
+ }
+ }
+ if ( 0x7FFD <= (uint32_t) zExp ) {
+ if ( ( 0x7FFD < zExp )
+ || ( ( zExp == 0x7FFD )
+ && eq128(
+ LIT64( 0x0001FFFFFFFFFFFF ),
+ LIT64( 0xFFFFFFFFFFFFFFFF ),
+ zSig0,
+ zSig1
+ )
+ && increment
+ )
+ ) {
+ float_raise( float_flag_overflow | float_flag_inexact STATUS_VAR);
+ if ( ( roundingMode == float_round_to_zero )
+ || ( zSign && ( roundingMode == float_round_up ) )
+ || ( ! zSign && ( roundingMode == float_round_down ) )
+ ) {
+ return
+ packFloat128(
+ zSign,
+ 0x7FFE,
+ LIT64( 0x0000FFFFFFFFFFFF ),
+ LIT64( 0xFFFFFFFFFFFFFFFF )
+ );
+ }
+ return packFloat128( zSign, 0x7FFF, 0, 0 );
+ }
+ if ( zExp < 0 ) {
+ if (STATUS(flush_to_zero)) {
+ float_raise(float_flag_output_denormal STATUS_VAR);
+ return packFloat128(zSign, 0, 0, 0);
+ }
+ isTiny =
+ ( STATUS(float_detect_tininess) == float_tininess_before_rounding )
+ || ( zExp < -1 )
+ || ! increment
+ || lt128(
+ zSig0,
+ zSig1,
+ LIT64( 0x0001FFFFFFFFFFFF ),
+ LIT64( 0xFFFFFFFFFFFFFFFF )
+ );
+ shift128ExtraRightJamming(
+ zSig0, zSig1, zSig2, - zExp, &zSig0, &zSig1, &zSig2 );
+ zExp = 0;
+ if ( isTiny && zSig2 ) float_raise( float_flag_underflow STATUS_VAR);
+ if ( roundNearestEven ) {
+ increment = ( (int64_t) zSig2 < 0 );
+ }
+ else {
+ if ( zSign ) {
+ increment = ( roundingMode == float_round_down ) && zSig2;
+ }
+ else {
+ increment = ( roundingMode == float_round_up ) && zSig2;
+ }
+ }
+ }
+ }
+ if ( zSig2 ) STATUS(float_exception_flags) |= float_flag_inexact;
+ if ( increment ) {
+ add128( zSig0, zSig1, 0, 1, &zSig0, &zSig1 );
+ zSig1 &= ~ ( ( zSig2 + zSig2 == 0 ) & roundNearestEven );
+ }
+ else {
+ if ( ( zSig0 | zSig1 ) == 0 ) zExp = 0;
+ }
+ return packFloat128( zSign, zExp, zSig0, zSig1 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Takes an abstract floating-point value having sign `zSign', exponent `zExp',
+| and significand formed by the concatenation of `zSig0' and `zSig1', and
+| returns the proper quadruple-precision floating-point value corresponding
+| to the abstract input. This routine is just like `roundAndPackFloat128'
+| except that the input significand has fewer bits and does not have to be
+| normalized. In all cases, `zExp' must be 1 less than the ``true'' floating-
+| point exponent.
+*----------------------------------------------------------------------------*/
+
+static float128
+ normalizeRoundAndPackFloat128(
+ flag zSign, int32 zExp, uint64_t zSig0, uint64_t zSig1 STATUS_PARAM)
+{
+ int8 shiftCount;
+ uint64_t zSig2;
+
+ if ( zSig0 == 0 ) {
+ zSig0 = zSig1;
+ zSig1 = 0;
+ zExp -= 64;
+ }
+ shiftCount = countLeadingZeros64( zSig0 ) - 15;
+ if ( 0 <= shiftCount ) {
+ zSig2 = 0;
+ shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 );
+ }
+ else {
+ shift128ExtraRightJamming(
+ zSig0, zSig1, 0, - shiftCount, &zSig0, &zSig1, &zSig2 );
+ }
+ zExp -= shiftCount;
+ return roundAndPackFloat128( zSign, zExp, zSig0, zSig1, zSig2 STATUS_VAR);
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the 32-bit two's complement integer `a'
+| to the single-precision floating-point format. The conversion is performed
+| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 int32_to_float32( int32 a STATUS_PARAM )
+{
+ flag zSign;
+
+ if ( a == 0 ) return float32_zero;
+ if ( a == (int32_t) 0x80000000 ) return packFloat32( 1, 0x9E, 0 );
+ zSign = ( a < 0 );
+ return normalizeRoundAndPackFloat32( zSign, 0x9C, zSign ? - a : a STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the 32-bit two's complement integer `a'
+| to the double-precision floating-point format. The conversion is performed
+| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64 int32_to_float64( int32 a STATUS_PARAM )
+{
+ flag zSign;
+ uint32 absA;
+ int8 shiftCount;
+ uint64_t zSig;
+
+ if ( a == 0 ) return float64_zero;
+ zSign = ( a < 0 );
+ absA = zSign ? - a : a;
+ shiftCount = countLeadingZeros32( absA ) + 21;
+ zSig = absA;
+ return packFloat64( zSign, 0x432 - shiftCount, zSig<<shiftCount );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the 32-bit two's complement integer `a'
+| to the extended double-precision floating-point format. The conversion
+| is performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic.
+*----------------------------------------------------------------------------*/
+
+floatx80 int32_to_floatx80( int32 a STATUS_PARAM )
+{
+ flag zSign;
+ uint32 absA;
+ int8 shiftCount;
+ uint64_t zSig;
+
+ if ( a == 0 ) return packFloatx80( 0, 0, 0 );
+ zSign = ( a < 0 );
+ absA = zSign ? - a : a;
+ shiftCount = countLeadingZeros32( absA ) + 32;
+ zSig = absA;
+ return packFloatx80( zSign, 0x403E - shiftCount, zSig<<shiftCount );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the 32-bit two's complement integer `a' to
+| the quadruple-precision floating-point format. The conversion is performed
+| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float128 int32_to_float128( int32 a STATUS_PARAM )
+{
+ flag zSign;
+ uint32 absA;
+ int8 shiftCount;
+ uint64_t zSig0;
+
+ if ( a == 0 ) return packFloat128( 0, 0, 0, 0 );
+ zSign = ( a < 0 );
+ absA = zSign ? - a : a;
+ shiftCount = countLeadingZeros32( absA ) + 17;
+ zSig0 = absA;
+ return packFloat128( zSign, 0x402E - shiftCount, zSig0<<shiftCount, 0 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the 64-bit two's complement integer `a'
+| to the single-precision floating-point format. The conversion is performed
+| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 int64_to_float32( int64 a STATUS_PARAM )
+{
+ flag zSign;
+ uint64 absA;
+ int8 shiftCount;
+
+ if ( a == 0 ) return float32_zero;
+ zSign = ( a < 0 );
+ absA = zSign ? - a : a;
+ shiftCount = countLeadingZeros64( absA ) - 40;
+ if ( 0 <= shiftCount ) {
+ return packFloat32( zSign, 0x95 - shiftCount, absA<<shiftCount );
+ }
+ else {
+ shiftCount += 7;
+ if ( shiftCount < 0 ) {
+ shift64RightJamming( absA, - shiftCount, &absA );
+ }
+ else {
+ absA <<= shiftCount;
+ }
+ return roundAndPackFloat32( zSign, 0x9C - shiftCount, absA STATUS_VAR );
+ }
+
+}
+
+float32 uint64_to_float32( uint64 a STATUS_PARAM )
+{
+ int8 shiftCount;
+
+ if ( a == 0 ) return float32_zero;
+ shiftCount = countLeadingZeros64( a ) - 40;
+ if ( 0 <= shiftCount ) {
+ return packFloat32( 1 > 0, 0x95 - shiftCount, a<<shiftCount );
+ }
+ else {
+ shiftCount += 7;
+ if ( shiftCount < 0 ) {
+ shift64RightJamming( a, - shiftCount, &a );
+ }
+ else {
+ a <<= shiftCount;
+ }
+ return roundAndPackFloat32( 1 > 0, 0x9C - shiftCount, a STATUS_VAR );
+ }
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the 64-bit two's complement integer `a'
+| to the double-precision floating-point format. The conversion is performed
+| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64 int64_to_float64( int64 a STATUS_PARAM )
+{
+ flag zSign;
+
+ if ( a == 0 ) return float64_zero;
+ if ( a == (int64_t) LIT64( 0x8000000000000000 ) ) {
+ return packFloat64( 1, 0x43E, 0 );
+ }
+ zSign = ( a < 0 );
+ return normalizeRoundAndPackFloat64( zSign, 0x43C, zSign ? - a : a STATUS_VAR );
+
+}
+
+float64 uint64_to_float64( uint64 a STATUS_PARAM )
+{
+ if ( a == 0 ) return float64_zero;
+ return normalizeRoundAndPackFloat64( 0, 0x43C, a STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the 64-bit two's complement integer `a'
+| to the extended double-precision floating-point format. The conversion
+| is performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic.
+*----------------------------------------------------------------------------*/
+
+floatx80 int64_to_floatx80( int64 a STATUS_PARAM )
+{
+ flag zSign;
+ uint64 absA;
+ int8 shiftCount;
+
+ if ( a == 0 ) return packFloatx80( 0, 0, 0 );
+ zSign = ( a < 0 );
+ absA = zSign ? - a : a;
+ shiftCount = countLeadingZeros64( absA );
+ return packFloatx80( zSign, 0x403E - shiftCount, absA<<shiftCount );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the 64-bit two's complement integer `a' to
+| the quadruple-precision floating-point format. The conversion is performed
+| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float128 int64_to_float128( int64 a STATUS_PARAM )
+{
+ flag zSign;
+ uint64 absA;
+ int8 shiftCount;
+ int32 zExp;
+ uint64_t zSig0, zSig1;
+
+ if ( a == 0 ) return packFloat128( 0, 0, 0, 0 );
+ zSign = ( a < 0 );
+ absA = zSign ? - a : a;
+ shiftCount = countLeadingZeros64( absA ) + 49;
+ zExp = 0x406E - shiftCount;
+ if ( 64 <= shiftCount ) {
+ zSig1 = 0;
+ zSig0 = absA;
+ shiftCount -= 64;
+ }
+ else {
+ zSig1 = absA;
+ zSig0 = 0;
+ }
+ shortShift128Left( zSig0, zSig1, shiftCount, &zSig0, &zSig1 );
+ return packFloat128( zSign, zExp, zSig0, zSig1 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the single-precision floating-point value
+| `a' to the 32-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic---which means in particular that the conversion is rounded
+| according to the current rounding mode. If `a' is a NaN, the largest
+| positive integer is returned. Otherwise, if the conversion overflows, the
+| largest integer with the same sign as `a' is returned.
+*----------------------------------------------------------------------------*/
+
+int32 float32_to_int32( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint32_t aSig;
+ uint64_t aSig64;
+
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ if ( ( aExp == 0xFF ) && aSig ) aSign = 0;
+ if ( aExp ) aSig |= 0x00800000;
+ shiftCount = 0xAF - aExp;
+ aSig64 = aSig;
+ aSig64 <<= 32;
+ if ( 0 < shiftCount ) shift64RightJamming( aSig64, shiftCount, &aSig64 );
+ return roundAndPackInt32( aSign, aSig64 STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the single-precision floating-point value
+| `a' to the 32-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic, except that the conversion is always rounded toward zero.
+| If `a' is a NaN, the largest positive integer is returned. Otherwise, if
+| the conversion overflows, the largest integer with the same sign as `a' is
+| returned.
+*----------------------------------------------------------------------------*/
+
+int32 float32_to_int32_round_to_zero( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint32_t aSig;
+ int32 z;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ shiftCount = aExp - 0x9E;
+ if ( 0 <= shiftCount ) {
+ if ( float32_val(a) != 0xCF000000 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) return 0x7FFFFFFF;
+ }
+ return (int32_t) 0x80000000;
+ }
+ else if ( aExp <= 0x7E ) {
+ if ( aExp | aSig ) STATUS(float_exception_flags) |= float_flag_inexact;
+ return 0;
+ }
+ aSig = ( aSig | 0x00800000 )<<8;
+ z = aSig>>( - shiftCount );
+ if ( (uint32_t) ( aSig<<( shiftCount & 31 ) ) ) {
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ }
+ if ( aSign ) z = - z;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the single-precision floating-point value
+| `a' to the 16-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic, except that the conversion is always rounded toward zero.
+| If `a' is a NaN, the largest positive integer is returned. Otherwise, if
+| the conversion overflows, the largest integer with the same sign as `a' is
+| returned.
+*----------------------------------------------------------------------------*/
+
+int16 float32_to_int16_round_to_zero( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint32_t aSig;
+ int32 z;
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ shiftCount = aExp - 0x8E;
+ if ( 0 <= shiftCount ) {
+ if ( float32_val(a) != 0xC7000000 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) {
+ return 0x7FFF;
+ }
+ }
+ return (int32_t) 0xffff8000;
+ }
+ else if ( aExp <= 0x7E ) {
+ if ( aExp | aSig ) {
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ }
+ return 0;
+ }
+ shiftCount -= 0x10;
+ aSig = ( aSig | 0x00800000 )<<8;
+ z = aSig>>( - shiftCount );
+ if ( (uint32_t) ( aSig<<( shiftCount & 31 ) ) ) {
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ }
+ if ( aSign ) {
+ z = - z;
+ }
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the single-precision floating-point value
+| `a' to the 64-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic---which means in particular that the conversion is rounded
+| according to the current rounding mode. If `a' is a NaN, the largest
+| positive integer is returned. Otherwise, if the conversion overflows, the
+| largest integer with the same sign as `a' is returned.
+*----------------------------------------------------------------------------*/
+
+int64 float32_to_int64( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint32_t aSig;
+ uint64_t aSig64, aSigExtra;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ shiftCount = 0xBE - aExp;
+ if ( shiftCount < 0 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) {
+ return LIT64( 0x7FFFFFFFFFFFFFFF );
+ }
+ return (int64_t) LIT64( 0x8000000000000000 );
+ }
+ if ( aExp ) aSig |= 0x00800000;
+ aSig64 = aSig;
+ aSig64 <<= 40;
+ shift64ExtraRightJamming( aSig64, 0, shiftCount, &aSig64, &aSigExtra );
+ return roundAndPackInt64( aSign, aSig64, aSigExtra STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the single-precision floating-point value
+| `a' to the 64-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic, except that the conversion is always rounded toward zero. If
+| `a' is a NaN, the largest positive integer is returned. Otherwise, if the
+| conversion overflows, the largest integer with the same sign as `a' is
+| returned.
+*----------------------------------------------------------------------------*/
+
+int64 float32_to_int64_round_to_zero( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint32_t aSig;
+ uint64_t aSig64;
+ int64 z;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ shiftCount = aExp - 0xBE;
+ if ( 0 <= shiftCount ) {
+ if ( float32_val(a) != 0xDF000000 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ if ( ! aSign || ( ( aExp == 0xFF ) && aSig ) ) {
+ return LIT64( 0x7FFFFFFFFFFFFFFF );
+ }
+ }
+ return (int64_t) LIT64( 0x8000000000000000 );
+ }
+ else if ( aExp <= 0x7E ) {
+ if ( aExp | aSig ) STATUS(float_exception_flags) |= float_flag_inexact;
+ return 0;
+ }
+ aSig64 = aSig | 0x00800000;
+ aSig64 <<= 40;
+ z = aSig64>>( - shiftCount );
+ if ( (uint64_t) ( aSig64<<( shiftCount & 63 ) ) ) {
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ }
+ if ( aSign ) z = - z;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the single-precision floating-point value
+| `a' to the double-precision floating-point format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64 float32_to_float64( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp;
+ uint32_t aSig;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ if ( aExp == 0xFF ) {
+ if ( aSig ) return commonNaNToFloat64( float32ToCommonNaN( a STATUS_VAR ) STATUS_VAR );
+ return packFloat64( aSign, 0x7FF, 0 );
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return packFloat64( aSign, 0, 0 );
+ normalizeFloat32Subnormal( aSig, &aExp, &aSig );
+ --aExp;
+ }
+ return packFloat64( aSign, aExp + 0x380, ( (uint64_t) aSig )<<29 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the single-precision floating-point value
+| `a' to the extended double-precision floating-point format. The conversion
+| is performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic.
+*----------------------------------------------------------------------------*/
+
+floatx80 float32_to_floatx80( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp;
+ uint32_t aSig;
+
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ if ( aExp == 0xFF ) {
+ if ( aSig ) return commonNaNToFloatx80( float32ToCommonNaN( a STATUS_VAR ) STATUS_VAR );
+ return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return packFloatx80( aSign, 0, 0 );
+ normalizeFloat32Subnormal( aSig, &aExp, &aSig );
+ }
+ aSig |= 0x00800000;
+ return packFloatx80( aSign, aExp + 0x3F80, ( (uint64_t) aSig )<<40 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the single-precision floating-point value
+| `a' to the double-precision floating-point format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float128 float32_to_float128( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp;
+ uint32_t aSig;
+
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ if ( aExp == 0xFF ) {
+ if ( aSig ) return commonNaNToFloat128( float32ToCommonNaN( a STATUS_VAR ) STATUS_VAR );
+ return packFloat128( aSign, 0x7FFF, 0, 0 );
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return packFloat128( aSign, 0, 0, 0 );
+ normalizeFloat32Subnormal( aSig, &aExp, &aSig );
+ --aExp;
+ }
+ return packFloat128( aSign, aExp + 0x3F80, ( (uint64_t) aSig )<<25, 0 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Rounds the single-precision floating-point value `a' to an integer, and
+| returns the result as a single-precision floating-point value. The
+| operation is performed according to the IEC/IEEE Standard for Binary
+| Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 float32_round_to_int( float32 a STATUS_PARAM)
+{
+ flag aSign;
+ int16 aExp;
+ uint32_t lastBitMask, roundBitsMask;
+ int8 roundingMode;
+ uint32_t z;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+
+ aExp = extractFloat32Exp( a );
+ if ( 0x96 <= aExp ) {
+ if ( ( aExp == 0xFF ) && extractFloat32Frac( a ) ) {
+ return propagateFloat32NaN( a, a STATUS_VAR );
+ }
+ return a;
+ }
+ if ( aExp <= 0x7E ) {
+ if ( (uint32_t) ( float32_val(a)<<1 ) == 0 ) return a;
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ aSign = extractFloat32Sign( a );
+ switch ( STATUS(float_rounding_mode) ) {
+ case float_round_nearest_even:
+ if ( ( aExp == 0x7E ) && extractFloat32Frac( a ) ) {
+ return packFloat32( aSign, 0x7F, 0 );
+ }
+ break;
+ case float_round_down:
+ return make_float32(aSign ? 0xBF800000 : 0);
+ case float_round_up:
+ return make_float32(aSign ? 0x80000000 : 0x3F800000);
+ }
+ return packFloat32( aSign, 0, 0 );
+ }
+ lastBitMask = 1;
+ lastBitMask <<= 0x96 - aExp;
+ roundBitsMask = lastBitMask - 1;
+ z = float32_val(a);
+ roundingMode = STATUS(float_rounding_mode);
+ if ( roundingMode == float_round_nearest_even ) {
+ z += lastBitMask>>1;
+ if ( ( z & roundBitsMask ) == 0 ) z &= ~ lastBitMask;
+ }
+ else if ( roundingMode != float_round_to_zero ) {
+ if ( extractFloat32Sign( make_float32(z) ) ^ ( roundingMode == float_round_up ) ) {
+ z += roundBitsMask;
+ }
+ }
+ z &= ~ roundBitsMask;
+ if ( z != float32_val(a) ) STATUS(float_exception_flags) |= float_flag_inexact;
+ return make_float32(z);
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of adding the absolute values of the single-precision
+| floating-point values `a' and `b'. If `zSign' is 1, the sum is negated
+| before being returned. `zSign' is ignored if the result is a NaN.
+| The addition is performed according to the IEC/IEEE Standard for Binary
+| Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static float32 addFloat32Sigs( float32 a, float32 b, flag zSign STATUS_PARAM)
+{
+ int16 aExp, bExp, zExp;
+ uint32_t aSig, bSig, zSig;
+ int16 expDiff;
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ bSig = extractFloat32Frac( b );
+ bExp = extractFloat32Exp( b );
+ expDiff = aExp - bExp;
+ aSig <<= 6;
+ bSig <<= 6;
+ if ( 0 < expDiff ) {
+ if ( aExp == 0xFF ) {
+ if ( aSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ return a;
+ }
+ if ( bExp == 0 ) {
+ --expDiff;
+ }
+ else {
+ bSig |= 0x20000000;
+ }
+ shift32RightJamming( bSig, expDiff, &bSig );
+ zExp = aExp;
+ }
+ else if ( expDiff < 0 ) {
+ if ( bExp == 0xFF ) {
+ if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ return packFloat32( zSign, 0xFF, 0 );
+ }
+ if ( aExp == 0 ) {
+ ++expDiff;
+ }
+ else {
+ aSig |= 0x20000000;
+ }
+ shift32RightJamming( aSig, - expDiff, &aSig );
+ zExp = bExp;
+ }
+ else {
+ if ( aExp == 0xFF ) {
+ if ( aSig | bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ return a;
+ }
+ if ( aExp == 0 ) {
+ if (STATUS(flush_to_zero)) {
+ if (aSig | bSig) {
+ float_raise(float_flag_output_denormal STATUS_VAR);
+ }
+ return packFloat32(zSign, 0, 0);
+ }
+ return packFloat32( zSign, 0, ( aSig + bSig )>>6 );
+ }
+ zSig = 0x40000000 + aSig + bSig;
+ zExp = aExp;
+ goto roundAndPack;
+ }
+ aSig |= 0x20000000;
+ zSig = ( aSig + bSig )<<1;
+ --zExp;
+ if ( (int32_t) zSig < 0 ) {
+ zSig = aSig + bSig;
+ ++zExp;
+ }
+ roundAndPack:
+ return roundAndPackFloat32( zSign, zExp, zSig STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of subtracting the absolute values of the single-
+| precision floating-point values `a' and `b'. If `zSign' is 1, the
+| difference is negated before being returned. `zSign' is ignored if the
+| result is a NaN. The subtraction is performed according to the IEC/IEEE
+| Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static float32 subFloat32Sigs( float32 a, float32 b, flag zSign STATUS_PARAM)
+{
+ int16 aExp, bExp, zExp;
+ uint32_t aSig, bSig, zSig;
+ int16 expDiff;
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ bSig = extractFloat32Frac( b );
+ bExp = extractFloat32Exp( b );
+ expDiff = aExp - bExp;
+ aSig <<= 7;
+ bSig <<= 7;
+ if ( 0 < expDiff ) goto aExpBigger;
+ if ( expDiff < 0 ) goto bExpBigger;
+ if ( aExp == 0xFF ) {
+ if ( aSig | bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ if ( aExp == 0 ) {
+ aExp = 1;
+ bExp = 1;
+ }
+ if ( bSig < aSig ) goto aBigger;
+ if ( aSig < bSig ) goto bBigger;
+ return packFloat32( STATUS(float_rounding_mode) == float_round_down, 0, 0 );
+ bExpBigger:
+ if ( bExp == 0xFF ) {
+ if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ return packFloat32( zSign ^ 1, 0xFF, 0 );
+ }
+ if ( aExp == 0 ) {
+ ++expDiff;
+ }
+ else {
+ aSig |= 0x40000000;
+ }
+ shift32RightJamming( aSig, - expDiff, &aSig );
+ bSig |= 0x40000000;
+ bBigger:
+ zSig = bSig - aSig;
+ zExp = bExp;
+ zSign ^= 1;
+ goto normalizeRoundAndPack;
+ aExpBigger:
+ if ( aExp == 0xFF ) {
+ if ( aSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ return a;
+ }
+ if ( bExp == 0 ) {
+ --expDiff;
+ }
+ else {
+ bSig |= 0x40000000;
+ }
+ shift32RightJamming( bSig, expDiff, &bSig );
+ aSig |= 0x40000000;
+ aBigger:
+ zSig = aSig - bSig;
+ zExp = aExp;
+ normalizeRoundAndPack:
+ --zExp;
+ return normalizeRoundAndPackFloat32( zSign, zExp, zSig STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of adding the single-precision floating-point values `a'
+| and `b'. The operation is performed according to the IEC/IEEE Standard for
+| Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 float32_add( float32 a, float32 b STATUS_PARAM )
+{
+ flag aSign, bSign;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ aSign = extractFloat32Sign( a );
+ bSign = extractFloat32Sign( b );
+ if ( aSign == bSign ) {
+ return addFloat32Sigs( a, b, aSign STATUS_VAR);
+ }
+ else {
+ return subFloat32Sigs( a, b, aSign STATUS_VAR );
+ }
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of subtracting the single-precision floating-point values
+| `a' and `b'. The operation is performed according to the IEC/IEEE Standard
+| for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 float32_sub( float32 a, float32 b STATUS_PARAM )
+{
+ flag aSign, bSign;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ aSign = extractFloat32Sign( a );
+ bSign = extractFloat32Sign( b );
+ if ( aSign == bSign ) {
+ return subFloat32Sigs( a, b, aSign STATUS_VAR );
+ }
+ else {
+ return addFloat32Sigs( a, b, aSign STATUS_VAR );
+ }
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of multiplying the single-precision floating-point values
+| `a' and `b'. The operation is performed according to the IEC/IEEE Standard
+| for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 float32_mul( float32 a, float32 b STATUS_PARAM )
+{
+ flag aSign, bSign, zSign;
+ int16 aExp, bExp, zExp;
+ uint32_t aSig, bSig;
+ uint64_t zSig64;
+ uint32_t zSig;
+
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ bSig = extractFloat32Frac( b );
+ bExp = extractFloat32Exp( b );
+ bSign = extractFloat32Sign( b );
+ zSign = aSign ^ bSign;
+ if ( aExp == 0xFF ) {
+ if ( aSig || ( ( bExp == 0xFF ) && bSig ) ) {
+ return propagateFloat32NaN( a, b STATUS_VAR );
+ }
+ if ( ( bExp | bSig ) == 0 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ return packFloat32( zSign, 0xFF, 0 );
+ }
+ if ( bExp == 0xFF ) {
+ if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ if ( ( aExp | aSig ) == 0 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ return packFloat32( zSign, 0xFF, 0 );
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return packFloat32( zSign, 0, 0 );
+ normalizeFloat32Subnormal( aSig, &aExp, &aSig );
+ }
+ if ( bExp == 0 ) {
+ if ( bSig == 0 ) return packFloat32( zSign, 0, 0 );
+ normalizeFloat32Subnormal( bSig, &bExp, &bSig );
+ }
+ zExp = aExp + bExp - 0x7F;
+ aSig = ( aSig | 0x00800000 )<<7;
+ bSig = ( bSig | 0x00800000 )<<8;
+ shift64RightJamming( ( (uint64_t) aSig ) * bSig, 32, &zSig64 );
+ zSig = zSig64;
+ if ( 0 <= (int32_t) ( zSig<<1 ) ) {
+ zSig <<= 1;
+ --zExp;
+ }
+ return roundAndPackFloat32( zSign, zExp, zSig STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of dividing the single-precision floating-point value `a'
+| by the corresponding value `b'. The operation is performed according to the
+| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 float32_div( float32 a, float32 b STATUS_PARAM )
+{
+ flag aSign, bSign, zSign;
+ int16 aExp, bExp, zExp;
+ uint32_t aSig, bSig, zSig;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ bSig = extractFloat32Frac( b );
+ bExp = extractFloat32Exp( b );
+ bSign = extractFloat32Sign( b );
+ zSign = aSign ^ bSign;
+ if ( aExp == 0xFF ) {
+ if ( aSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ if ( bExp == 0xFF ) {
+ if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ return packFloat32( zSign, 0xFF, 0 );
+ }
+ if ( bExp == 0xFF ) {
+ if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ return packFloat32( zSign, 0, 0 );
+ }
+ if ( bExp == 0 ) {
+ if ( bSig == 0 ) {
+ if ( ( aExp | aSig ) == 0 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ float_raise( float_flag_divbyzero STATUS_VAR);
+ return packFloat32( zSign, 0xFF, 0 );
+ }
+ normalizeFloat32Subnormal( bSig, &bExp, &bSig );
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return packFloat32( zSign, 0, 0 );
+ normalizeFloat32Subnormal( aSig, &aExp, &aSig );
+ }
+ zExp = aExp - bExp + 0x7D;
+ aSig = ( aSig | 0x00800000 )<<7;
+ bSig = ( bSig | 0x00800000 )<<8;
+ if ( bSig <= ( aSig + aSig ) ) {
+ aSig >>= 1;
+ ++zExp;
+ }
+ zSig = ( ( (uint64_t) aSig )<<32 ) / bSig;
+ if ( ( zSig & 0x3F ) == 0 ) {
+ zSig |= ( (uint64_t) bSig * zSig != ( (uint64_t) aSig )<<32 );
+ }
+ return roundAndPackFloat32( zSign, zExp, zSig STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the remainder of the single-precision floating-point value `a'
+| with respect to the corresponding value `b'. The operation is performed
+| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 float32_rem( float32 a, float32 b STATUS_PARAM )
+{
+ flag aSign, zSign;
+ int16 aExp, bExp, expDiff;
+ uint32_t aSig, bSig;
+ uint32_t q;
+ uint64_t aSig64, bSig64, q64;
+ uint32_t alternateASig;
+ int32_t sigMean;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ bSig = extractFloat32Frac( b );
+ bExp = extractFloat32Exp( b );
+ if ( aExp == 0xFF ) {
+ if ( aSig || ( ( bExp == 0xFF ) && bSig ) ) {
+ return propagateFloat32NaN( a, b STATUS_VAR );
+ }
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ if ( bExp == 0xFF ) {
+ if ( bSig ) return propagateFloat32NaN( a, b STATUS_VAR );
+ return a;
+ }
+ if ( bExp == 0 ) {
+ if ( bSig == 0 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ normalizeFloat32Subnormal( bSig, &bExp, &bSig );
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return a;
+ normalizeFloat32Subnormal( aSig, &aExp, &aSig );
+ }
+ expDiff = aExp - bExp;
+ aSig |= 0x00800000;
+ bSig |= 0x00800000;
+ if ( expDiff < 32 ) {
+ aSig <<= 8;
+ bSig <<= 8;
+ if ( expDiff < 0 ) {
+ if ( expDiff < -1 ) return a;
+ aSig >>= 1;
+ }
+ q = ( bSig <= aSig );
+ if ( q ) aSig -= bSig;
+ if ( 0 < expDiff ) {
+ q = ( ( (uint64_t) aSig )<<32 ) / bSig;
+ q >>= 32 - expDiff;
+ bSig >>= 2;
+ aSig = ( ( aSig>>1 )<<( expDiff - 1 ) ) - bSig * q;
+ }
+ else {
+ aSig >>= 2;
+ bSig >>= 2;
+ }
+ }
+ else {
+ if ( bSig <= aSig ) aSig -= bSig;
+ aSig64 = ( (uint64_t) aSig )<<40;
+ bSig64 = ( (uint64_t) bSig )<<40;
+ expDiff -= 64;
+ while ( 0 < expDiff ) {
+ q64 = estimateDiv128To64( aSig64, 0, bSig64 );
+ q64 = ( 2 < q64 ) ? q64 - 2 : 0;
+ aSig64 = - ( ( bSig * q64 )<<38 );
+ expDiff -= 62;
+ }
+ expDiff += 64;
+ q64 = estimateDiv128To64( aSig64, 0, bSig64 );
+ q64 = ( 2 < q64 ) ? q64 - 2 : 0;
+ q = q64>>( 64 - expDiff );
+ bSig <<= 6;
+ aSig = ( ( aSig64>>33 )<<( expDiff - 1 ) ) - bSig * q;
+ }
+ do {
+ alternateASig = aSig;
+ ++q;
+ aSig -= bSig;
+ } while ( 0 <= (int32_t) aSig );
+ sigMean = aSig + alternateASig;
+ if ( ( sigMean < 0 ) || ( ( sigMean == 0 ) && ( q & 1 ) ) ) {
+ aSig = alternateASig;
+ }
+ zSign = ( (int32_t) aSig < 0 );
+ if ( zSign ) aSig = - aSig;
+ return normalizeRoundAndPackFloat32( aSign ^ zSign, bExp, aSig STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the square root of the single-precision floating-point value `a'.
+| The operation is performed according to the IEC/IEEE Standard for Binary
+| Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 float32_sqrt( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, zExp;
+ uint32_t aSig, zSig;
+ uint64_t rem, term;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ if ( aExp == 0xFF ) {
+ if ( aSig ) return propagateFloat32NaN( a, float32_zero STATUS_VAR );
+ if ( ! aSign ) return a;
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ if ( aSign ) {
+ if ( ( aExp | aSig ) == 0 ) return a;
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return float32_zero;
+ normalizeFloat32Subnormal( aSig, &aExp, &aSig );
+ }
+ zExp = ( ( aExp - 0x7F )>>1 ) + 0x7E;
+ aSig = ( aSig | 0x00800000 )<<8;
+ zSig = estimateSqrt32( aExp, aSig ) + 2;
+ if ( ( zSig & 0x7F ) <= 5 ) {
+ if ( zSig < 2 ) {
+ zSig = 0x7FFFFFFF;
+ goto roundAndPack;
+ }
+ aSig >>= aExp & 1;
+ term = ( (uint64_t) zSig ) * zSig;
+ rem = ( ( (uint64_t) aSig )<<32 ) - term;
+ while ( (int64_t) rem < 0 ) {
+ --zSig;
+ rem += ( ( (uint64_t) zSig )<<1 ) | 1;
+ }
+ zSig |= ( rem != 0 );
+ }
+ shift32RightJamming( zSig, 1, &zSig );
+ roundAndPack:
+ return roundAndPackFloat32( 0, zExp, zSig STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the binary exponential of the single-precision floating-point value
+| `a'. The operation is performed according to the IEC/IEEE Standard for
+| Binary Floating-Point Arithmetic.
+|
+| Uses the following identities:
+|
+| 1. -------------------------------------------------------------------------
+| x x*ln(2)
+| 2 = e
+|
+| 2. -------------------------------------------------------------------------
+| 2 3 4 5 n
+| x x x x x x x
+| e = 1 + --- + --- + --- + --- + --- + ... + --- + ...
+| 1! 2! 3! 4! 5! n!
+*----------------------------------------------------------------------------*/
+
+static const float64 float32_exp2_coefficients[15] =
+{
+ const_float64( 0x3ff0000000000000ll ), /* 1 */
+ const_float64( 0x3fe0000000000000ll ), /* 2 */
+ const_float64( 0x3fc5555555555555ll ), /* 3 */
+ const_float64( 0x3fa5555555555555ll ), /* 4 */
+ const_float64( 0x3f81111111111111ll ), /* 5 */
+ const_float64( 0x3f56c16c16c16c17ll ), /* 6 */
+ const_float64( 0x3f2a01a01a01a01all ), /* 7 */
+ const_float64( 0x3efa01a01a01a01all ), /* 8 */
+ const_float64( 0x3ec71de3a556c734ll ), /* 9 */
+ const_float64( 0x3e927e4fb7789f5cll ), /* 10 */
+ const_float64( 0x3e5ae64567f544e4ll ), /* 11 */
+ const_float64( 0x3e21eed8eff8d898ll ), /* 12 */
+ const_float64( 0x3de6124613a86d09ll ), /* 13 */
+ const_float64( 0x3da93974a8c07c9dll ), /* 14 */
+ const_float64( 0x3d6ae7f3e733b81fll ), /* 15 */
+};
+
+float32 float32_exp2( float32 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp;
+ uint32_t aSig;
+ float64 r, x, xn;
+ int i;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+
+ if ( aExp == 0xFF) {
+ if ( aSig ) return propagateFloat32NaN( a, float32_zero STATUS_VAR );
+ return (aSign) ? float32_zero : a;
+ }
+ if (aExp == 0) {
+ if (aSig == 0) return float32_one;
+ }
+
+ float_raise( float_flag_inexact STATUS_VAR);
+
+ /* ******************************* */
+ /* using float64 for approximation */
+ /* ******************************* */
+ x = float32_to_float64(a STATUS_VAR);
+ x = float64_mul(x, float64_ln2 STATUS_VAR);
+
+ xn = x;
+ r = float64_one;
+ for (i = 0 ; i < 15 ; i++) {
+ float64 f;
+
+ f = float64_mul(xn, float32_exp2_coefficients[i] STATUS_VAR);
+ r = float64_add(r, f STATUS_VAR);
+
+ xn = float64_mul(xn, x STATUS_VAR);
+ }
+
+ return float64_to_float32(r, status);
+}
+
+/*----------------------------------------------------------------------------
+| Returns the binary log of the single-precision floating-point value `a'.
+| The operation is performed according to the IEC/IEEE Standard for Binary
+| Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+float32 float32_log2( float32 a STATUS_PARAM )
+{
+ flag aSign, zSign;
+ int16 aExp;
+ uint32_t aSig, zSig, i;
+
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return packFloat32( 1, 0xFF, 0 );
+ normalizeFloat32Subnormal( aSig, &aExp, &aSig );
+ }
+ if ( aSign ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float32_default_nan;
+ }
+ if ( aExp == 0xFF ) {
+ if ( aSig ) return propagateFloat32NaN( a, float32_zero STATUS_VAR );
+ return a;
+ }
+
+ aExp -= 0x7F;
+ aSig |= 0x00800000;
+ zSign = aExp < 0;
+ zSig = aExp << 23;
+
+ for (i = 1 << 22; i > 0; i >>= 1) {
+ aSig = ( (uint64_t)aSig * aSig ) >> 23;
+ if ( aSig & 0x01000000 ) {
+ aSig >>= 1;
+ zSig |= i;
+ }
+ }
+
+ if ( zSign )
+ zSig = -zSig;
+
+ return normalizeRoundAndPackFloat32( zSign, 0x85, zSig STATUS_VAR );
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point value `a' is equal to
+| the corresponding value `b', and 0 otherwise. The invalid exception is
+| raised if either operand is a NaN. Otherwise, the comparison is performed
+| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+int float32_eq( float32 a, float32 b STATUS_PARAM )
+{
+ uint32_t av, bv;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
+ || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
+ ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return 0;
+ }
+ av = float32_val(a);
+ bv = float32_val(b);
+ return ( av == bv ) || ( (uint32_t) ( ( av | bv )<<1 ) == 0 );
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point value `a' is less than
+| or equal to the corresponding value `b', and 0 otherwise. The invalid
+| exception is raised if either operand is a NaN. The comparison is performed
+| according to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+int float32_le( float32 a, float32 b STATUS_PARAM )
+{
+ flag aSign, bSign;
+ uint32_t av, bv;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
+ || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
+ ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return 0;
+ }
+ aSign = extractFloat32Sign( a );
+ bSign = extractFloat32Sign( b );
+ av = float32_val(a);
+ bv = float32_val(b);
+ if ( aSign != bSign ) return aSign || ( (uint32_t) ( ( av | bv )<<1 ) == 0 );
+ return ( av == bv ) || ( aSign ^ ( av < bv ) );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point value `a' is less than
+| the corresponding value `b', and 0 otherwise. The invalid exception is
+| raised if either operand is a NaN. The comparison is performed according
+| to the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+int float32_lt( float32 a, float32 b STATUS_PARAM )
+{
+ flag aSign, bSign;
+ uint32_t av, bv;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
+ || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
+ ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return 0;
+ }
+ aSign = extractFloat32Sign( a );
+ bSign = extractFloat32Sign( b );
+ av = float32_val(a);
+ bv = float32_val(b);
+ if ( aSign != bSign ) return aSign && ( (uint32_t) ( ( av | bv )<<1 ) != 0 );
+ return ( av != bv ) && ( aSign ^ ( av < bv ) );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point values `a' and `b' cannot
+| be compared, and 0 otherwise. The invalid exception is raised if either
+| operand is a NaN. The comparison is performed according to the IEC/IEEE
+| Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+int float32_unordered( float32 a, float32 b STATUS_PARAM )
+{
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
+ || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
+ ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return 1;
+ }
+ return 0;
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point value `a' is equal to
+| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an
+| exception. The comparison is performed according to the IEC/IEEE Standard
+| for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+int float32_eq_quiet( float32 a, float32 b STATUS_PARAM )
+{
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
+ || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
+ ) {
+ if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ }
+ return 0;
+ }
+ return ( float32_val(a) == float32_val(b) ) ||
+ ( (uint32_t) ( ( float32_val(a) | float32_val(b) )<<1 ) == 0 );
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point value `a' is less than or
+| equal to the corresponding value `b', and 0 otherwise. Quiet NaNs do not
+| cause an exception. Otherwise, the comparison is performed according to the
+| IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+int float32_le_quiet( float32 a, float32 b STATUS_PARAM )
+{
+ flag aSign, bSign;
+ uint32_t av, bv;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
+ || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
+ ) {
+ if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ }
+ return 0;
+ }
+ aSign = extractFloat32Sign( a );
+ bSign = extractFloat32Sign( b );
+ av = float32_val(a);
+ bv = float32_val(b);
+ if ( aSign != bSign ) return aSign || ( (uint32_t) ( ( av | bv )<<1 ) == 0 );
+ return ( av == bv ) || ( aSign ^ ( av < bv ) );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point value `a' is less than
+| the corresponding value `b', and 0 otherwise. Quiet NaNs do not cause an
+| exception. Otherwise, the comparison is performed according to the IEC/IEEE
+| Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+int float32_lt_quiet( float32 a, float32 b STATUS_PARAM )
+{
+ flag aSign, bSign;
+ uint32_t av, bv;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
+ || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
+ ) {
+ if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ }
+ return 0;
+ }
+ aSign = extractFloat32Sign( a );
+ bSign = extractFloat32Sign( b );
+ av = float32_val(a);
+ bv = float32_val(b);
+ if ( aSign != bSign ) return aSign && ( (uint32_t) ( ( av | bv )<<1 ) != 0 );
+ return ( av != bv ) && ( aSign ^ ( av < bv ) );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns 1 if the single-precision floating-point values `a' and `b' cannot
+| be compared, and 0 otherwise. Quiet NaNs do not cause an exception. The
+| comparison is performed according to the IEC/IEEE Standard for Binary
+| Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+int float32_unordered_quiet( float32 a, float32 b STATUS_PARAM )
+{
+ a = float32_squash_input_denormal(a STATUS_VAR);
+ b = float32_squash_input_denormal(b STATUS_VAR);
+
+ if ( ( ( extractFloat32Exp( a ) == 0xFF ) && extractFloat32Frac( a ) )
+ || ( ( extractFloat32Exp( b ) == 0xFF ) && extractFloat32Frac( b ) )
+ ) {
+ if ( float32_is_signaling_nan( a ) || float32_is_signaling_nan( b ) ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ }
+ return 1;
+ }
+ return 0;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the double-precision floating-point value
+| `a' to the 32-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic---which means in particular that the conversion is rounded
+| according to the current rounding mode. If `a' is a NaN, the largest
+| positive integer is returned. Otherwise, if the conversion overflows, the
+| largest integer with the same sign as `a' is returned.
+*----------------------------------------------------------------------------*/
+
+int32 float64_to_int32( float64 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint64_t aSig;
+ a = float64_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ if ( ( aExp == 0x7FF ) && aSig ) aSign = 0;
+ if ( aExp ) aSig |= LIT64( 0x0010000000000000 );
+ shiftCount = 0x42C - aExp;
+ if ( 0 < shiftCount ) shift64RightJamming( aSig, shiftCount, &aSig );
+ return roundAndPackInt32( aSign, aSig STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the double-precision floating-point value
+| `a' to the 32-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic, except that the conversion is always rounded toward zero.
+| If `a' is a NaN, the largest positive integer is returned. Otherwise, if
+| the conversion overflows, the largest integer with the same sign as `a' is
+| returned.
+*----------------------------------------------------------------------------*/
+
+int32 float64_to_int32_round_to_zero( float64 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint64_t aSig, savedASig;
+ int32 z;
+ a = float64_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ if ( 0x41E < aExp ) {
+ if ( ( aExp == 0x7FF ) && aSig ) aSign = 0;
+ goto invalid;
+ }
+ else if ( aExp < 0x3FF ) {
+ if ( aExp || aSig ) STATUS(float_exception_flags) |= float_flag_inexact;
+ return 0;
+ }
+ aSig |= LIT64( 0x0010000000000000 );
+ shiftCount = 0x433 - aExp;
+ savedASig = aSig;
+ aSig >>= shiftCount;
+ z = aSig;
+ if ( aSign ) z = - z;
+ if ( ( z < 0 ) ^ aSign ) {
+ invalid:
+ float_raise( float_flag_invalid STATUS_VAR);
+ return aSign ? (int32_t) 0x80000000 : 0x7FFFFFFF;
+ }
+ if ( ( aSig<<shiftCount ) != savedASig ) {
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ }
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the double-precision floating-point value
+| `a' to the 16-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic, except that the conversion is always rounded toward zero.
+| If `a' is a NaN, the largest positive integer is returned. Otherwise, if
+| the conversion overflows, the largest integer with the same sign as `a' is
+| returned.
+*----------------------------------------------------------------------------*/
+
+int16 float64_to_int16_round_to_zero( float64 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint64_t aSig, savedASig;
+ int32 z;
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ if ( 0x40E < aExp ) {
+ if ( ( aExp == 0x7FF ) && aSig ) {
+ aSign = 0;
+ }
+ goto invalid;
+ }
+ else if ( aExp < 0x3FF ) {
+ if ( aExp || aSig ) {
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ }
+ return 0;
+ }
+ aSig |= LIT64( 0x0010000000000000 );
+ shiftCount = 0x433 - aExp;
+ savedASig = aSig;
+ aSig >>= shiftCount;
+ z = aSig;
+ if ( aSign ) {
+ z = - z;
+ }
+ if ( ( (int16_t)z < 0 ) ^ aSign ) {
+ invalid:
+ float_raise( float_flag_invalid STATUS_VAR);
+ return aSign ? (int32_t) 0xffff8000 : 0x7FFF;
+ }
+ if ( ( aSig<<shiftCount ) != savedASig ) {
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ }
+ return z;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the double-precision floating-point value
+| `a' to the 64-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic---which means in particular that the conversion is rounded
+| according to the current rounding mode. If `a' is a NaN, the largest
+| positive integer is returned. Otherwise, if the conversion overflows, the
+| largest integer with the same sign as `a' is returned.
+*----------------------------------------------------------------------------*/
+
+int64 float64_to_int64( float64 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint64_t aSig, aSigExtra;
+ a = float64_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ if ( aExp ) aSig |= LIT64( 0x0010000000000000 );
+ shiftCount = 0x433 - aExp;
+ if ( shiftCount <= 0 ) {
+ if ( 0x43E < aExp ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ if ( ! aSign
+ || ( ( aExp == 0x7FF )
+ && ( aSig != LIT64( 0x0010000000000000 ) ) )
+ ) {
+ return LIT64( 0x7FFFFFFFFFFFFFFF );
+ }
+ return (int64_t) LIT64( 0x8000000000000000 );
+ }
+ aSigExtra = 0;
+ aSig <<= - shiftCount;
+ }
+ else {
+ shift64ExtraRightJamming( aSig, 0, shiftCount, &aSig, &aSigExtra );
+ }
+ return roundAndPackInt64( aSign, aSig, aSigExtra STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the double-precision floating-point value
+| `a' to the 64-bit two's complement integer format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic, except that the conversion is always rounded toward zero.
+| If `a' is a NaN, the largest positive integer is returned. Otherwise, if
+| the conversion overflows, the largest integer with the same sign as `a' is
+| returned.
+*----------------------------------------------------------------------------*/
+
+int64 float64_to_int64_round_to_zero( float64 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp, shiftCount;
+ uint64_t aSig;
+ int64 z;
+ a = float64_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ if ( aExp ) aSig |= LIT64( 0x0010000000000000 );
+ shiftCount = aExp - 0x433;
+ if ( 0 <= shiftCount ) {
+ if ( 0x43E <= aExp ) {
+ if ( float64_val(a) != LIT64( 0xC3E0000000000000 ) ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ if ( ! aSign
+ || ( ( aExp == 0x7FF )
+ && ( aSig != LIT64( 0x0010000000000000 ) ) )
+ ) {
+ return LIT64( 0x7FFFFFFFFFFFFFFF );
+ }
+ }
+ return (int64_t) LIT64( 0x8000000000000000 );
+ }
+ z = aSig<<shiftCount;
+ }
+ else {
+ if ( aExp < 0x3FE ) {
+ if ( aExp | aSig ) STATUS(float_exception_flags) |= float_flag_inexact;
+ return 0;
+ }
+ z = aSig>>( - shiftCount );
+ if ( (uint64_t) ( aSig<<( shiftCount & 63 ) ) ) {
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ }
+ }
+ if ( aSign ) z = - z;
+ return z;
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the double-precision floating-point value
+| `a' to the single-precision floating-point format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float32 float64_to_float32( float64 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp;
+ uint64_t aSig;
+ uint32_t zSig;
+ a = float64_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ if ( aExp == 0x7FF ) {
+ if ( aSig ) return commonNaNToFloat32( float64ToCommonNaN( a STATUS_VAR ) STATUS_VAR );
+ return packFloat32( aSign, 0xFF, 0 );
+ }
+ shift64RightJamming( aSig, 22, &aSig );
+ zSig = aSig;
+ if ( aExp || zSig ) {
+ zSig |= 0x40000000;
+ aExp -= 0x381;
+ }
+ return roundAndPackFloat32( aSign, aExp, zSig STATUS_VAR );
+
+}
+
+
+/*----------------------------------------------------------------------------
+| Packs the sign `zSign', exponent `zExp', and significand `zSig' into a
+| half-precision floating-point value, returning the result. After being
+| shifted into the proper positions, the three fields are simply added
+| together to form the result. This means that any integer portion of `zSig'
+| will be added into the exponent. Since a properly normalized significand
+| will have an integer portion equal to 1, the `zExp' input should be 1 less
+| than the desired result exponent whenever `zSig' is a complete, normalized
+| significand.
+*----------------------------------------------------------------------------*/
+static float16 packFloat16(flag zSign, int16 zExp, uint16_t zSig)
+{
+ return make_float16(
+ (((uint32_t)zSign) << 15) + (((uint32_t)zExp) << 10) + zSig);
+}
+
+/* Half precision floats come in two formats: standard IEEE and "ARM" format.
+ The latter gains extra exponent range by omitting the NaN/Inf encodings. */
+
+float32 float16_to_float32(float16 a, flag ieee STATUS_PARAM)
+{
+ flag aSign;
+ int16 aExp;
+ uint32_t aSig;
+
+ aSign = extractFloat16Sign(a);
+ aExp = extractFloat16Exp(a);
+ aSig = extractFloat16Frac(a);
+
+ if (aExp == 0x1f && ieee) {
+ if (aSig) {
+ return commonNaNToFloat32(float16ToCommonNaN(a STATUS_VAR) STATUS_VAR);
+ }
+ return packFloat32(aSign, 0xff, aSig << 13);
+ }
+ if (aExp == 0) {
+ int8 shiftCount;
+
+ if (aSig == 0) {
+ return packFloat32(aSign, 0, 0);
+ }
+
+ shiftCount = countLeadingZeros32( aSig ) - 21;
+ aSig = aSig << shiftCount;
+ aExp = -shiftCount;
+ }
+ return packFloat32( aSign, aExp + 0x70, aSig << 13);
+}
+
+float16 float32_to_float16(float32 a, flag ieee STATUS_PARAM)
+{
+ flag aSign;
+ int16 aExp;
+ uint32_t aSig;
+ uint32_t mask;
+ uint32_t increment;
+ int8 roundingMode;
+ a = float32_squash_input_denormal(a STATUS_VAR);
+
+ aSig = extractFloat32Frac( a );
+ aExp = extractFloat32Exp( a );
+ aSign = extractFloat32Sign( a );
+ if ( aExp == 0xFF ) {
+ if (aSig) {
+ /* Input is a NaN */
+ float16 r = commonNaNToFloat16( float32ToCommonNaN( a STATUS_VAR ) STATUS_VAR );
+ if (!ieee) {
+ return packFloat16(aSign, 0, 0);
+ }
+ return r;
+ }
+ /* Infinity */
+ if (!ieee) {
+ float_raise(float_flag_invalid STATUS_VAR);
+ return packFloat16(aSign, 0x1f, 0x3ff);
+ }
+ return packFloat16(aSign, 0x1f, 0);
+ }
+ if (aExp == 0 && aSig == 0) {
+ return packFloat16(aSign, 0, 0);
+ }
+ /* Decimal point between bits 22 and 23. */
+ aSig |= 0x00800000;
+ aExp -= 0x7f;
+ if (aExp < -14) {
+ mask = 0x00ffffff;
+ if (aExp >= -24) {
+ mask >>= 25 + aExp;
+ }
+ } else {
+ mask = 0x00001fff;
+ }
+ if (aSig & mask) {
+ float_raise( float_flag_underflow STATUS_VAR );
+ roundingMode = STATUS(float_rounding_mode);
+ switch (roundingMode) {
+ case float_round_nearest_even:
+ increment = (mask + 1) >> 1;
+ if ((aSig & mask) == increment) {
+ increment = aSig & (increment << 1);
+ }
+ break;
+ case float_round_up:
+ increment = aSign ? 0 : mask;
+ break;
+ case float_round_down:
+ increment = aSign ? mask : 0;
+ break;
+ default: /* round_to_zero */
+ increment = 0;
+ break;
+ }
+ aSig += increment;
+ if (aSig >= 0x01000000) {
+ aSig >>= 1;
+ aExp++;
+ }
+ } else if (aExp < -14
+ && STATUS(float_detect_tininess) == float_tininess_before_rounding) {
+ float_raise( float_flag_underflow STATUS_VAR);
+ }
+
+ if (ieee) {
+ if (aExp > 15) {
+ float_raise( float_flag_overflow | float_flag_inexact STATUS_VAR);
+ return packFloat16(aSign, 0x1f, 0);
+ }
+ } else {
+ if (aExp > 16) {
+ float_raise(float_flag_invalid | float_flag_inexact STATUS_VAR);
+ return packFloat16(aSign, 0x1f, 0x3ff);
+ }
+ }
+ if (aExp < -24) {
+ return packFloat16(aSign, 0, 0);
+ }
+ if (aExp < -14) {
+ aSig >>= -14 - aExp;
+ aExp = -14;
+ }
+ return packFloat16(aSign, aExp + 14, aSig >> 13);
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the double-precision floating-point value
+| `a' to the extended double-precision floating-point format. The conversion
+| is performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic.
+*----------------------------------------------------------------------------*/
+
+floatx80 float64_to_floatx80( float64 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp;
+ uint64_t aSig;
+
+ a = float64_squash_input_denormal(a STATUS_VAR);
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ if ( aExp == 0x7FF ) {
+ if ( aSig ) return commonNaNToFloatx80( float64ToCommonNaN( a STATUS_VAR ) STATUS_VAR );
+ return packFloatx80( aSign, 0x7FFF, LIT64( 0x8000000000000000 ) );
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return packFloatx80( aSign, 0, 0 );
+ normalizeFloat64Subnormal( aSig, &aExp, &aSig );
+ }
+ return
+ packFloatx80(
+ aSign, aExp + 0x3C00, ( aSig | LIT64( 0x0010000000000000 ) )<<11 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of converting the double-precision floating-point value
+| `a' to the quadruple-precision floating-point format. The conversion is
+| performed according to the IEC/IEEE Standard for Binary Floating-Point
+| Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float128 float64_to_float128( float64 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp;
+ uint64_t aSig, zSig0, zSig1;
+
+ a = float64_squash_input_denormal(a STATUS_VAR);
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ if ( aExp == 0x7FF ) {
+ if ( aSig ) return commonNaNToFloat128( float64ToCommonNaN( a STATUS_VAR ) STATUS_VAR );
+ return packFloat128( aSign, 0x7FFF, 0, 0 );
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return packFloat128( aSign, 0, 0, 0 );
+ normalizeFloat64Subnormal( aSig, &aExp, &aSig );
+ --aExp;
+ }
+ shift128Right( aSig, 0, 4, &zSig0, &zSig1 );
+ return packFloat128( aSign, aExp + 0x3C00, zSig0, zSig1 );
+
+}
+
+/*----------------------------------------------------------------------------
+| Rounds the double-precision floating-point value `a' to an integer, and
+| returns the result as a double-precision floating-point value. The
+| operation is performed according to the IEC/IEEE Standard for Binary
+| Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64 float64_round_to_int( float64 a STATUS_PARAM )
+{
+ flag aSign;
+ int16 aExp;
+ uint64_t lastBitMask, roundBitsMask;
+ int8 roundingMode;
+ uint64_t z;
+ a = float64_squash_input_denormal(a STATUS_VAR);
+
+ aExp = extractFloat64Exp( a );
+ if ( 0x433 <= aExp ) {
+ if ( ( aExp == 0x7FF ) && extractFloat64Frac( a ) ) {
+ return propagateFloat64NaN( a, a STATUS_VAR );
+ }
+ return a;
+ }
+ if ( aExp < 0x3FF ) {
+ if ( (uint64_t) ( float64_val(a)<<1 ) == 0 ) return a;
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ aSign = extractFloat64Sign( a );
+ switch ( STATUS(float_rounding_mode) ) {
+ case float_round_nearest_even:
+ if ( ( aExp == 0x3FE ) && extractFloat64Frac( a ) ) {
+ return packFloat64( aSign, 0x3FF, 0 );
+ }
+ break;
+ case float_round_down:
+ return make_float64(aSign ? LIT64( 0xBFF0000000000000 ) : 0);
+ case float_round_up:
+ return make_float64(
+ aSign ? LIT64( 0x8000000000000000 ) : LIT64( 0x3FF0000000000000 ));
+ }
+ return packFloat64( aSign, 0, 0 );
+ }
+ lastBitMask = 1;
+ lastBitMask <<= 0x433 - aExp;
+ roundBitsMask = lastBitMask - 1;
+ z = float64_val(a);
+ roundingMode = STATUS(float_rounding_mode);
+ if ( roundingMode == float_round_nearest_even ) {
+ z += lastBitMask>>1;
+ if ( ( z & roundBitsMask ) == 0 ) z &= ~ lastBitMask;
+ }
+ else if ( roundingMode != float_round_to_zero ) {
+ if ( extractFloat64Sign( make_float64(z) ) ^ ( roundingMode == float_round_up ) ) {
+ z += roundBitsMask;
+ }
+ }
+ z &= ~ roundBitsMask;
+ if ( z != float64_val(a) )
+ STATUS(float_exception_flags) |= float_flag_inexact;
+ return make_float64(z);
+
+}
+
+float64 float64_trunc_to_int( float64 a STATUS_PARAM)
+{
+ int oldmode;
+ float64 res;
+ oldmode = STATUS(float_rounding_mode);
+ STATUS(float_rounding_mode) = float_round_to_zero;
+ res = float64_round_to_int(a STATUS_VAR);
+ STATUS(float_rounding_mode) = oldmode;
+ return res;
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of adding the absolute values of the double-precision
+| floating-point values `a' and `b'. If `zSign' is 1, the sum is negated
+| before being returned. `zSign' is ignored if the result is a NaN.
+| The addition is performed according to the IEC/IEEE Standard for Binary
+| Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static float64 addFloat64Sigs( float64 a, float64 b, flag zSign STATUS_PARAM )
+{
+ int16 aExp, bExp, zExp;
+ uint64_t aSig, bSig, zSig;
+ int16 expDiff;
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ bSig = extractFloat64Frac( b );
+ bExp = extractFloat64Exp( b );
+ expDiff = aExp - bExp;
+ aSig <<= 9;
+ bSig <<= 9;
+ if ( 0 < expDiff ) {
+ if ( aExp == 0x7FF ) {
+ if ( aSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ return a;
+ }
+ if ( bExp == 0 ) {
+ --expDiff;
+ }
+ else {
+ bSig |= LIT64( 0x2000000000000000 );
+ }
+ shift64RightJamming( bSig, expDiff, &bSig );
+ zExp = aExp;
+ }
+ else if ( expDiff < 0 ) {
+ if ( bExp == 0x7FF ) {
+ if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ return packFloat64( zSign, 0x7FF, 0 );
+ }
+ if ( aExp == 0 ) {
+ ++expDiff;
+ }
+ else {
+ aSig |= LIT64( 0x2000000000000000 );
+ }
+ shift64RightJamming( aSig, - expDiff, &aSig );
+ zExp = bExp;
+ }
+ else {
+ if ( aExp == 0x7FF ) {
+ if ( aSig | bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ return a;
+ }
+ if ( aExp == 0 ) {
+ if (STATUS(flush_to_zero)) {
+ if (aSig | bSig) {
+ float_raise(float_flag_output_denormal STATUS_VAR);
+ }
+ return packFloat64(zSign, 0, 0);
+ }
+ return packFloat64( zSign, 0, ( aSig + bSig )>>9 );
+ }
+ zSig = LIT64( 0x4000000000000000 ) + aSig + bSig;
+ zExp = aExp;
+ goto roundAndPack;
+ }
+ aSig |= LIT64( 0x2000000000000000 );
+ zSig = ( aSig + bSig )<<1;
+ --zExp;
+ if ( (int64_t) zSig < 0 ) {
+ zSig = aSig + bSig;
+ ++zExp;
+ }
+ roundAndPack:
+ return roundAndPackFloat64( zSign, zExp, zSig STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of subtracting the absolute values of the double-
+| precision floating-point values `a' and `b'. If `zSign' is 1, the
+| difference is negated before being returned. `zSign' is ignored if the
+| result is a NaN. The subtraction is performed according to the IEC/IEEE
+| Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+static float64 subFloat64Sigs( float64 a, float64 b, flag zSign STATUS_PARAM )
+{
+ int16 aExp, bExp, zExp;
+ uint64_t aSig, bSig, zSig;
+ int16 expDiff;
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ bSig = extractFloat64Frac( b );
+ bExp = extractFloat64Exp( b );
+ expDiff = aExp - bExp;
+ aSig <<= 10;
+ bSig <<= 10;
+ if ( 0 < expDiff ) goto aExpBigger;
+ if ( expDiff < 0 ) goto bExpBigger;
+ if ( aExp == 0x7FF ) {
+ if ( aSig | bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float64_default_nan;
+ }
+ if ( aExp == 0 ) {
+ aExp = 1;
+ bExp = 1;
+ }
+ if ( bSig < aSig ) goto aBigger;
+ if ( aSig < bSig ) goto bBigger;
+ return packFloat64( STATUS(float_rounding_mode) == float_round_down, 0, 0 );
+ bExpBigger:
+ if ( bExp == 0x7FF ) {
+ if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ return packFloat64( zSign ^ 1, 0x7FF, 0 );
+ }
+ if ( aExp == 0 ) {
+ ++expDiff;
+ }
+ else {
+ aSig |= LIT64( 0x4000000000000000 );
+ }
+ shift64RightJamming( aSig, - expDiff, &aSig );
+ bSig |= LIT64( 0x4000000000000000 );
+ bBigger:
+ zSig = bSig - aSig;
+ zExp = bExp;
+ zSign ^= 1;
+ goto normalizeRoundAndPack;
+ aExpBigger:
+ if ( aExp == 0x7FF ) {
+ if ( aSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ return a;
+ }
+ if ( bExp == 0 ) {
+ --expDiff;
+ }
+ else {
+ bSig |= LIT64( 0x4000000000000000 );
+ }
+ shift64RightJamming( bSig, expDiff, &bSig );
+ aSig |= LIT64( 0x4000000000000000 );
+ aBigger:
+ zSig = aSig - bSig;
+ zExp = aExp;
+ normalizeRoundAndPack:
+ --zExp;
+ return normalizeRoundAndPackFloat64( zSign, zExp, zSig STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of adding the double-precision floating-point values `a'
+| and `b'. The operation is performed according to the IEC/IEEE Standard for
+| Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64 float64_add( float64 a, float64 b STATUS_PARAM )
+{
+ flag aSign, bSign;
+ a = float64_squash_input_denormal(a STATUS_VAR);
+ b = float64_squash_input_denormal(b STATUS_VAR);
+
+ aSign = extractFloat64Sign( a );
+ bSign = extractFloat64Sign( b );
+ if ( aSign == bSign ) {
+ return addFloat64Sigs( a, b, aSign STATUS_VAR );
+ }
+ else {
+ return subFloat64Sigs( a, b, aSign STATUS_VAR );
+ }
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of subtracting the double-precision floating-point values
+| `a' and `b'. The operation is performed according to the IEC/IEEE Standard
+| for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64 float64_sub( float64 a, float64 b STATUS_PARAM )
+{
+ flag aSign, bSign;
+ a = float64_squash_input_denormal(a STATUS_VAR);
+ b = float64_squash_input_denormal(b STATUS_VAR);
+
+ aSign = extractFloat64Sign( a );
+ bSign = extractFloat64Sign( b );
+ if ( aSign == bSign ) {
+ return subFloat64Sigs( a, b, aSign STATUS_VAR );
+ }
+ else {
+ return addFloat64Sigs( a, b, aSign STATUS_VAR );
+ }
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of multiplying the double-precision floating-point values
+| `a' and `b'. The operation is performed according to the IEC/IEEE Standard
+| for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64 float64_mul( float64 a, float64 b STATUS_PARAM )
+{
+ flag aSign, bSign, zSign;
+ int16 aExp, bExp, zExp;
+ uint64_t aSig, bSig, zSig0, zSig1;
+
+ a = float64_squash_input_denormal(a STATUS_VAR);
+ b = float64_squash_input_denormal(b STATUS_VAR);
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ bSig = extractFloat64Frac( b );
+ bExp = extractFloat64Exp( b );
+ bSign = extractFloat64Sign( b );
+ zSign = aSign ^ bSign;
+ if ( aExp == 0x7FF ) {
+ if ( aSig || ( ( bExp == 0x7FF ) && bSig ) ) {
+ return propagateFloat64NaN( a, b STATUS_VAR );
+ }
+ if ( ( bExp | bSig ) == 0 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float64_default_nan;
+ }
+ return packFloat64( zSign, 0x7FF, 0 );
+ }
+ if ( bExp == 0x7FF ) {
+ if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ if ( ( aExp | aSig ) == 0 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float64_default_nan;
+ }
+ return packFloat64( zSign, 0x7FF, 0 );
+ }
+ if ( aExp == 0 ) {
+ if ( aSig == 0 ) return packFloat64( zSign, 0, 0 );
+ normalizeFloat64Subnormal( aSig, &aExp, &aSig );
+ }
+ if ( bExp == 0 ) {
+ if ( bSig == 0 ) return packFloat64( zSign, 0, 0 );
+ normalizeFloat64Subnormal( bSig, &bExp, &bSig );
+ }
+ zExp = aExp + bExp - 0x3FF;
+ aSig = ( aSig | LIT64( 0x0010000000000000 ) )<<10;
+ bSig = ( bSig | LIT64( 0x0010000000000000 ) )<<11;
+ mul64To128( aSig, bSig, &zSig0, &zSig1 );
+ zSig0 |= ( zSig1 != 0 );
+ if ( 0 <= (int64_t) ( zSig0<<1 ) ) {
+ zSig0 <<= 1;
+ --zExp;
+ }
+ return roundAndPackFloat64( zSign, zExp, zSig0 STATUS_VAR );
+
+}
+
+/*----------------------------------------------------------------------------
+| Returns the result of dividing the double-precision floating-point value `a'
+| by the corresponding value `b'. The operation is performed according to
+| the IEC/IEEE Standard for Binary Floating-Point Arithmetic.
+*----------------------------------------------------------------------------*/
+
+float64 float64_div( float64 a, float64 b STATUS_PARAM )
+{
+ flag aSign, bSign, zSign;
+ int16 aExp, bExp, zExp;
+ uint64_t aSig, bSig, zSig;
+ uint64_t rem0, rem1;
+ uint64_t term0, term1;
+ a = float64_squash_input_denormal(a STATUS_VAR);
+ b = float64_squash_input_denormal(b STATUS_VAR);
+
+ aSig = extractFloat64Frac( a );
+ aExp = extractFloat64Exp( a );
+ aSign = extractFloat64Sign( a );
+ bSig = extractFloat64Frac( b );
+ bExp = extractFloat64Exp( b );
+ bSign = extractFloat64Sign( b );
+ zSign = aSign ^ bSign;
+ if ( aExp == 0x7FF ) {
+ if ( aSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ if ( bExp == 0x7FF ) {
+ if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float64_default_nan;
+ }
+ return packFloat64( zSign, 0x7FF, 0 );
+ }
+ if ( bExp == 0x7FF ) {
+ if ( bSig ) return propagateFloat64NaN( a, b STATUS_VAR );
+ return packFloat64( zSign, 0, 0 );
+ }
+ if ( bExp == 0 ) {
+ if ( bSig == 0 ) {
+ if ( ( aExp | aSig ) == 0 ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ return float64_default_nan;
+ }
+ float_raise( float_flag_divbyzero STATUS_VAR);
+ return packFloat64( zSign, 0x7FF, 0 );
+ }
+ normalizeFloat64Subnormal( bSig, &am