]> Shamusworld >> Repos - virtualjaguar/commitdiff
Merging qt-experimental into trunk.
authorShamus Hammons <jlhamm@acm.org>
Tue, 5 Jul 2011 23:39:50 +0000 (23:39 +0000)
committerShamus Hammons <jlhamm@acm.org>
Tue, 5 Jul 2011 23:39:50 +0000 (23:39 +0000)
133 files changed:
Makefile
docs/GPLv3 [new file with mode: 0644]
docs/INSTALL
docs/README
docs/TODO
docs/WHATSNEW
docs/gpl.txt [deleted file]
jaguarcore.mak [new file with mode: 0644]
musashi.mak [new file with mode: 0644]
res/alpine-file.png [new file with mode: 0644]
res/cart-blank.png [new file with mode: 0644]
res/controller.png [new file with mode: 0644]
res/generic.png [new file with mode: 0644]
res/homebrew-file.png [new file with mode: 0644]
res/insert.png [new file with mode: 0644]
res/label-blank.png [new file with mode: 0644]
res/ntsc.png [new file with mode: 0644]
res/pal.png [new file with mode: 0644]
res/pause.png [new file with mode: 0644]
res/power.png [new file with mode: 0644]
res/software.png [new file with mode: 0644]
res/unknown-file.png [new file with mode: 0644]
res/upper-left.png [new file with mode: 0644]
res/upper-right.png [new file with mode: 0644]
res/vj-icon.png [new file with mode: 0644]
res/vj_title_small.png [new file with mode: 0644]
res/zoom100.png [new file with mode: 0644]
res/zoom200.png [new file with mode: 0644]
res/zoom300.png [new file with mode: 0644]
src/blitter.cpp
src/blitter.h
src/cdintf.cpp
src/cdrom.cpp
src/cdrom.h
src/crc32.cpp
src/dac.cpp
src/dac.h
src/dsp.cpp
src/dsp.h
src/eeprom.cpp
src/event.cpp
src/file.cpp
src/file.h
src/filedb.cpp [new file with mode: 0644]
src/filedb.h [new file with mode: 0644]
src/gpu.cpp
src/gpu.h
src/gui/about.cpp [new file with mode: 0644]
src/gui/about.h [new file with mode: 0644]
src/gui/app.cpp [new file with mode: 0644]
src/gui/app.h [new file with mode: 0644]
src/gui/button.cpp [deleted file]
src/gui/button.h [deleted file]
src/gui/configdialog.cpp [new file with mode: 0644]
src/gui/configdialog.h [new file with mode: 0644]
src/gui/controllertab.cpp [new file with mode: 0644]
src/gui/controllertab.h [new file with mode: 0644]
src/gui/element.cpp [deleted file]
src/gui/element.h [deleted file]
src/gui/filelist.cpp [deleted file]
src/gui/filelist.h [deleted file]
src/gui/filelistmodel.cpp [new file with mode: 0644]
src/gui/filelistmodel.h [new file with mode: 0644]
src/gui/filepicker.cpp [new file with mode: 0644]
src/gui/filepicker.h [new file with mode: 0644]
src/gui/filethread.cpp [new file with mode: 0644]
src/gui/filethread.h [new file with mode: 0644]
src/gui/font1.h [deleted file]
src/gui/font14pt.h [deleted file]
src/gui/generaltab.cpp [new file with mode: 0644]
src/gui/generaltab.h [new file with mode: 0644]
src/gui/glwidget.cpp [new file with mode: 0644]
src/gui/glwidget.h [new file with mode: 0644]
src/gui/gui.cpp [deleted file]
src/gui/gui.h [deleted file]
src/gui/guielements.h [deleted file]
src/gui/guimisc.cpp [deleted file]
src/gui/guimisc.h [deleted file]
src/gui/image.cpp [deleted file]
src/gui/image.h [deleted file]
src/gui/imagedelegate.cpp [new file with mode: 0644]
src/gui/imagedelegate.h [new file with mode: 0644]
src/gui/listbox.cpp [deleted file]
src/gui/listbox.h [deleted file]
src/gui/mainwin.cpp [new file with mode: 0644]
src/gui/mainwin.h [new file with mode: 0644]
src/gui/menu.cpp [deleted file]
src/gui/menu.h [deleted file]
src/gui/pushbutton.cpp [deleted file]
src/gui/pushbutton.h [deleted file]
src/gui/slideswitch.cpp [deleted file]
src/gui/slideswitch.h [deleted file]
src/gui/text.cpp [deleted file]
src/gui/text.h [deleted file]
src/gui/textedit.cpp [deleted file]
src/gui/textedit.h [deleted file]
src/gui/virtualjaguar.qrc [new file with mode: 0644]
src/gui/vj_title_small.c [deleted file]
src/gui/window.cpp [deleted file]
src/gui/window.h [deleted file]
src/jaguar.cpp
src/jaguar.h
src/jerry.cpp
src/jerry.h
src/joystick.cpp
src/joystick.h
src/log.cpp
src/memory.cpp
src/memory.h
src/mmu.cpp
src/mmu.h
src/objectp.cpp
src/sdlemu_config.cpp [deleted file]
src/sdlemu_config.h [deleted file]
src/sdlemu_opengl.c [deleted file]
src/sdlemu_opengl.h [deleted file]
src/settings.cpp
src/settings.h
src/state.cpp
src/state.h
src/tom.cpp
src/tom.h
src/types.h
src/universalhdr.cpp [new file with mode: 0644]
src/universalhdr.h [new file with mode: 0644]
src/unzip.c
src/video.cpp [deleted file]
src/video.h [deleted file]
src/virtualjaguar.cpp [moved from src/vj.cpp with 96% similarity]
src/wavetable.cpp [new file with mode: 0644]
src/wavetable.h
virtualjaguar.pro [new file with mode: 0644]
vj.cfg [deleted file]

index f29871b2eb9200570aa4f9eead8fb8809627428a..4b6b4ea024bcf1b381258ddf6d575aed8616e49c 100644 (file)
--- a/Makefile
+++ b/Makefile
+# Makefile for Virtual Jaguar
 #
-# Unified Makefile for Virtual Jaguar GCC/SDL Portable Jaguar Emulator
+# by James Hammons
+# (C) 2011 Underground Software
 #
-# by James L. Hammons
-#
-# This software is licensed under the GPL v2 or any later version. Set the
-# file GPL.TXT for details. ;-)
+# Note that we control the version information here--uncomment only one set of
+# echo's from the "prepare" recipe. :-)
 #
 
-# Figure out which system we're compiling for, and set the appropriate variables
+FIND = find
 
+# Gah
 OSTYPE := $(shell uname -a)
 
-ifeq "$(findstring Msys,$(OSTYPE))" "Msys"                     # Win32
-
-SYSTYPE    := __GCCWIN32__
-EXESUFFIX  := .exe
-GLLIB      := -lopengl32
-ICON       := obj/icon.o
-SDLLIBTYPE := --libs
-MSG        := Win32 on MinGW
-
-else ifeq "$(findstring Darwin,$(OSTYPE))" "Darwin"    # Should catch both 'darwin' and 'darwin7.0'
-
-SYSTYPE    := __GCCUNIX__ -D_OSX_
-EXESUFFIX  :=
-GLLIB      :=
-ICON       :=
-SDLLIBTYPE := --static-libs
-MSG        := Mac OS X
-
-else ifeq "$(findstring Linux,$(OSTYPE))" "Linux"              # Linux
-
-SYSTYPE    := __GCCUNIX__
-EXESUFFIX  :=
-GLLIB      := -lGL -lGLU
-ICON       :=
-SDLLIBTYPE := --libs
-MSG        := GNU/Linux
-
-else                                                                                   # ???
-
-$(error OS TYPE UNDETECTED)
-
-endif
-
-# Set vars for libcdio
-ifneq "$(shell pkg-config --silence-errors --libs libcdio)" ""
-HAVECDIO := -DHAVE_LIB_CDIO
-CDIOLIB  := -lcdio
-else
-HAVECDIO :=
-CDIOLIB  :=
+# Should catch both 'darwin' and 'darwin7.0'
+ifeq "$(findstring Darwin,$(OSTYPE))" "Darwin"
+QMAKE_EXTRA := -spec macx-g++
 endif
 
-CC         = gcc
-LD         = gcc
-TARGET     = vj
-
-# Note that we use optimization level 2 instead of 3--3 doesn't seem to gain much over 2
-CFLAGS   = -MMD -Wall -Wno-switch -O2 -D$(SYSTYPE) -ffast-math -fomit-frame-pointer `sdl-config --cflags`
-CPPFLAGS = -MMD -Wall -Wno-switch -Wno-non-virtual-dtor -O2 -D$(SYSTYPE) \
-               $(HAVECDIO) -ffast-math -fomit-frame-pointer `sdl-config --cflags` -g
-#              -fomit-frame-pointer `sdl-config --cflags` -g
-#              -fomit-frame-pointer `sdl-config --cflags` -DLOG_UNMAPPED_MEMORY_ACCESSES
-
-LDFLAGS =
-
-LIBS = -L/usr/local/lib -L/usr/lib `sdl-config $(SDLLIBTYPE)` -lstdc++ -lz $(GLLIB) $(CDIOLIB)
-
-INCS = -I. -I./src -I./src/gui -I/usr/local/include -I/usr/include
-
-OBJS = \
-       obj/m68kcpu.o       \
-       obj/m68kops.o       \
-       obj/m68kopac.o      \
-       obj/m68kopdm.o      \
-       obj/m68kopnz.o      \
-       obj/m68kdasm.o      \
-\
-       obj/button.o        \
-       obj/element.o       \
-       obj/filelist.o      \
-       obj/gui.o           \
-       obj/guimisc.o       \
-       obj/image.o         \
-       obj/listbox.o       \
-       obj/menu.o          \
-       obj/pushbutton.o    \
-       obj/slideswitch.o   \
-       obj/text.o          \
-       obj/textedit.o      \
-       obj/window.o        \
-\
-       obj/blitter.o       \
-       obj/cdrom.o         \
-       obj/cdintf.o        \
-       obj/crc32.o         \
-       obj/dac.o           \
-       obj/dsp.o           \
-       obj/eeprom.o        \
-       obj/event.o         \
-       obj/file.o          \
-       obj/gpu.o           \
-       obj/jagdasm.o       \
-       obj/jaguar.o        \
-       obj/jerry.o         \
-       obj/joystick.o      \
-       obj/log.o           \
-       obj/memory.o        \
-       obj/mmu.o           \
-       obj/objectp.o       \
-       obj/sdlemu_config.o \
-       obj/sdlemu_opengl.o \
-       obj/settings.o      \
-       obj/state.o         \
-       obj/tom.o           \
-       obj/unzip.o         \
-       obj/video.o         \
-       obj/vj.o            \
-       $(ICON)
-
-# Targets for convenience sake, not "real" targets
-.PHONY: clean
-
-all: checkenv message obj $(TARGET)$(EXESUFFIX)
-       @echo
-       @echo -e "\033[01;33m***\033[00;32m Looks like it compiled OK... Give it a whirl!\033[00m"
-       @echo
-
-# Check the compilation environment, barf if not appropriate
-
-checkenv: msg-check-env check-sdl check-zlib check-cdio check-gl ;
-
-#check-sdl: msg-ck-sdl $(if $(strip ),,msg-no-sdl stop-on-error)
-check-sdl: msg-ck-sdl $(if $(shell which sdl-config),,msg-no-sdl stop-on-error)
-       @echo -e "\033[01;37mOK\033[00m"
-
-msg-ck-sdl:
-       @echo -en "   \033[00;32mSDL... \033[00m"
-
-msg-no-sdl:
-       @echo -e "\033[01;37mNOT FOUND\033[00m"
-       @echo
-       @echo -e "\033[01;33mIt seems that you don't have the SDL development libraries installed. If you"
-       @echo -e "have installed them, make sure that the sdl-config file is somewhere in your"
-       @echo -e "path and is executable.\033[00m"
-       @echo
-
-check-zlib: msg-ck-zlib $(if $(shell pkg-config --silence-errors --libs zlib),,msg-no-zlib stop-on-error)
-       @echo -e "\033[01;37mOK\033[00m"
-
-msg-ck-zlib:
-       @echo -en "   \033[00;32mZLIB... \033[00m"
-
-msg-no-zlib:
-       @echo -e "\033[01;37mNOT FOUND\033[00m"
-       @echo
-       @echo -e "\033[01;33mIt seems that you don't have ZLIB installed. If you have installed it, make"
-       @echo -e "sure that the pkg-config file is somewhere in your path and is executable.\033[00m"
-       @echo
 
-#NOTE that this check shouldn't be fatal, we can bounce back from it by excluding CD support
-check-cdio: msg-ck-cdio $(if $(CDIOLIB),msg-cdio,msg-no-cdio) ;
+all: prepare virtualjaguar
+       @echo -e "\033[01;33m***\033[00;32m Success!\033[00m"
 
-msg-ck-cdio:
-       @echo -en "   \033[00;32mLIBCDIO... \033[00m"
+prepare:
+       @echo -e "\033[01;33m***\033[00;32m Preparing to compile Virtual Jaguar...\033[00m"
+#      @echo "#define VJ_RELEASE_VERSION \"v2.0.0\"" > src/version.h
+#      @echo "#define VJ_RELEASE_SUBVERSION \"Final\"" >> src/version.h
+       @echo "#define VJ_RELEASE_VERSION \"SVN `svn info | grep -i revision`\"" > src/version.h
+       @echo "#define VJ_RELEASE_SUBVERSION \"2.0.0 Prerelease\"" >> src/version.h
 
-msg-cdio:
-       @echo -e "\033[01;37mOK\033[00m"
+virtualjaguar: sources libs makefile-qt
+       @echo -e "\033[01;33m***\033[00;32m Making Virtual Jaguar GUI...\033[00m"
+       $(MAKE) -f makefile-qt
 
-msg-no-cdio:
-       @echo -e "\033[01;37mNOT FOUND\033[00m"
-       @echo
-       @echo -e "\033[01;33mIt seems that you don't have LIBCDIO installed. Since this is not fatal,"
-       @echo -e "Virtual Jaguar will be built WITHOUT CD support.\033[00m"
-       @echo
+makefile-qt: virtualjaguar.pro
+       @echo -e "\033[01;33m***\033[00;32m Creating Qt makefile...\033[00m"
+       qmake $(QMAKE_EXTRA) virtualjaguar.pro -o makefile-qt
 
-check-gl: msg-ck-gl
-       @echo -e "*** GL CHECK NOT IMPLEMENTED ***"
+libs: obj/libmusashi.a obj/libjaguarcore.a
+       @echo -e "\033[01;33m***\033[00;32m Libraries successfully made.\033[00m"
 
-msg-ck-gl:
-       @echo -en "   \033[00;32mOpenGL... \033[00m"
+obj/libmusashi.a: musashi.mak
+       @echo -e "\033[01;33m***\033[00;32m Making Musashi...\033[00m"
+       $(MAKE) -f musashi.mak
 
-stop-on-error: ; $(error COMPILATION ENVIRONMENT)
+obj/libjaguarcore.a: jaguarcore.mak
+       @echo -e "\033[01;33m***\033[00;32m Making Virtual Jaguar core...\033[00m"
+       $(MAKE) -f jaguarcore.mak
 
-msg-check-env:
-       @echo
-       @echo -e "\033[01;33m***\033[00;32m Checking compilation environment: \033[00m"
-       @echo
-
-message:
-       @echo
-       @echo -e "\033[01;33m***\033[00;32m Building Virtual Jaguar for $(MSG)...\033[00m"
-       @echo
+sources: src/*.h src/*.cpp src/*.c
 
 clean:
-       @echo -en "\033[01;33m***\033[00;32m Cleaning out the garbage...\033[00m"
-       @rm -rf obj
-       @rm -f ./$(TARGET)$(EXESUFFIX)
-       @echo -e "\033[01;37mdone!\033[00m"
-
-obj:
-       @mkdir obj
-
-# This is only done for Win32 at the moment...
-
-ifneq "" "$(ICON)"
-$(ICON): res/$(TARGET).rc res/$(TARGET).ico
-       @echo -e "\033[01;33m***\033[00;32m Processing icon...\033[00m"
-       @windres -i res/$(TARGET).rc -o $(ICON) --include-dir=./res
-endif
-
-obj/%.o: src/%.c
-       @echo -e "\033[01;33m***\033[00;32m Compiling $<...\033[00m"
-       @$(CC) $(CFLAGS) $(INCS) -c $< -o $@
-
-obj/%.o: src/%.cpp
-       @echo -e "\033[01;33m***\033[00;32m Compiling $<...\033[00m"
-       @$(CC) $(CPPFLAGS) $(INCS) -c $< -o $@
-
-obj/%.o: src/gui/%.cpp
-       @echo -e "\033[01;33m***\033[00;32m Compiling $<...\033[00m"
-       @$(CC) $(CPPFLAGS) $(INCS) -c $< -o $@
-
-$(TARGET)$(EXESUFFIX): $(OBJS)
-       @echo -e "\033[01;33m***\033[00;32m Linking it all together...\033[00m"
-       @$(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
-#      strip --strip-all vj$(EXESUFFIX)
-#      upx -9 vj$(EXESUFFIX)
-
-# Pull in dependencies autogenerated by gcc's -MMD switch
-# The "-" in front is there just in case they haven't been created yet
-
--include obj/*.d
-
-#
-# Musashi specific stuffola
-#
-
-#obj/m68k%.o: obj/m68k%.c obj/m68kops.h
-#      $(CC) $(CFLAGS) -Iobj -c src/m68k%.c -o obj/m68k%.o
-
-#obj/m68k%.o: obj/m68k%.c obj/m68kmake$(EXESUFFIX)
-#      $(CC) $(CFLAGS) -Iobj -c src/m68k%.c -o obj/m68k%.o
-
-#see if you can collapse all this crap into one or two lines...
-#NOTE: The above doesn't work for some reason...
-
-obj/m68kcpu.o: obj/m68kops.h src/m68k.h src/m68kconf.h
-       @echo -e "\033[01;33m***\033[00;32m Compiling m68kcpu.c...\033[00m"
-       @$(CC) $(CFLAGS) -Iobj -c src/m68kcpu.c -o obj/m68kcpu.o
-
-obj/m68kops.o: obj/m68kmake$(EXESUFFIX) obj/m68kops.h obj/m68kops.c src/m68k.h src/m68kconf.h
-       @echo -e "\033[01;33m***\033[00;32m Compiling m68kops.c...\033[00m"
-       @$(CC) $(CFLAGS) -Isrc -c obj/m68kops.c -o obj/m68kops.o
-
-obj/m68kopac.o: obj/m68kmake$(EXESUFFIX) obj/m68kops.h obj/m68kopac.c src/m68k.h src/m68kconf.h
-       @echo -e "\033[01;33m***\033[00;32m Compiling m68kopac.c...\033[00m"
-       @$(CC) $(CFLAGS) -Isrc -c obj/m68kopac.c -o obj/m68kopac.o
-
-obj/m68kopdm.o: obj/m68kmake$(EXESUFFIX) obj/m68kops.h obj/m68kopdm.c src/m68k.h src/m68kconf.h
-       @echo -e "\033[01;33m***\033[00;32m Compiling m68kopdm.c...\033[00m"
-       @$(CC) $(CFLAGS) -Isrc -c obj/m68kopdm.c -o obj/m68kopdm.o
-
-obj/m68kopnz.o: obj/m68kmake$(EXESUFFIX) obj/m68kops.h obj/m68kopnz.c src/m68k.h src/m68kconf.h
-       @echo -e "\033[01;33m***\033[00;32m Compiling m68kopnz.c...\033[00m"
-       @$(CC) $(CFLAGS) -Isrc -c obj/m68kopnz.c -o obj/m68kopnz.o
-
-obj/m68kdasm.o: src/m68kdasm.c src/m68k.h src/m68kconf.h
-       @echo -e "\033[01;33m***\033[00;32m Compiling m68kdasm.c...\033[00m"
-       @$(CC) $(CFLAGS) -Isrc -c src/m68kdasm.c -o obj/m68kdasm.o
-
-obj/m68kops.h: obj/m68kmake$(EXESUFFIX)
-       @obj/m68kmake obj src/m68k_in.c
-
-obj/m68kmake$(EXESUFFIX): src/m68kmake.c src/m68k_in.c
-       @echo -e "\033[01;33m***\033[00;32m Preparing to make the Musashi core...\033[00m"
-       @$(CC) $(WARNINGS) src/m68kmake.c -o obj/m68kmake$(EXESUFFIX)
+       @echo -ne "\033[01;33m***\033[00;32m Cleaning out the garbage...\033[00m"
+       @-rm -rf ./obj
+       @-rm -rf makefile-qt
+       @-rm -rf virtualjaguar
+       @-$(FIND) . -name "*~" -exec rm -f {} \;
+       @echo "done!"
+
+statistics:
+       @echo -n "Lines in source files: "
+       @-$(FIND) ./src -name "*.cpp" | xargs cat | wc -l
+       @echo -n "Lines in header files: "
+       @-$(FIND) ./src -name "*.h" | xargs cat | wc -l
+
+dist:  clean
diff --git a/docs/GPLv3 b/docs/GPLv3
new file mode 100644 (file)
index 0000000..94a9ed0
--- /dev/null
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  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
+them 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 prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  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.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey 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;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU 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 that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  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.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+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.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     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
+state 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 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program 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, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU 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.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
index 94c054cb398dec729e90cb4f118422076069f0d7..6947f494406d1fc1c66c89d904f1fb36dde6a927 100644 (file)
@@ -1,6 +1,6 @@
----------------------------------------------
-Virtual Jaguar v1.1.0 GCC/SDL release INSTALL
----------------------------------------------
+----------------------------------------
+Virtual Jaguar v2.0.0 Qt release INSTALL
+----------------------------------------
 
 
 REQUIREMENTS:
@@ -8,11 +8,12 @@ REQUIREMENTS:
 
 The minimum requirements for compiling Virtual Jaguar from source are:
 
- o  GCC v4.3.x or higher
- o  SDL v1.2.13 or higher
- o  zlib v1.2.3
- o  libcdio v0.80 or higher
+ o  GCC v4.4.x or higher
+ o  SDL v1.2.14 or higher
+ o  zlib v1.2.5
+ o  libcdio v0.82 or higher (optional, for Jaguar CD support)
  o  OpenGL libraries
+ o  Qt 4.7.3 or higher
  o  supported OS (BeOS, Linux, FreeBSD and WIN32 through mingw, MacOS); other
     OSs may work to but you may need to change some items in the Makefile.
 
@@ -34,8 +35,9 @@ Optionally you can manually strip vj[.exe] to downsize the binary. If you have
 upx in your path somewhere, you can uncomment the line in the makefile that
 executes upx so that you'll end up with a somewhat smaller binary.
 
-That's it! You can now start the emulator with ./vj. See the output for more
-details (or stdout.txt on Win32) or consult the README file for more info.
+That's it! You can now start the emulator with ./virtualjaguar. See the output
+for more details (or stdout.txt on Win32) or consult the README file for more
+info.
 
 For even more info, go to http://sdlemu.ngemu.com or send use an e-mail to the
 following e-mail address: sdlemu AT ngemu DOT com.
index f109b8f220cce8e8bbe2d0216dd0ea6581fadfce..30c8477d385658ac094cd9cc19d129b4de9bc84d 100644 (file)
@@ -1,6 +1,6 @@
---------------------------------------------
-Virtual Jaguar v1.1.0 GCC/SDL release README
---------------------------------------------
+-------------------------------------------
+Virtual Jaguar v2.0.0 GCC/Qt release README
+-------------------------------------------
 
 --------------
 - DISCLAIMER -
@@ -21,8 +21,8 @@ ROM images. You may only use the ROM images if you own the cartridges itself.
 The use of Commercial ROMs without owning the original cartridge is illegal in
 most countries and could result in fines and/or legal actions.
 
-This software is released under the GPL v2 or later. For more information I
-direct you to the GPL.TXT. You may hack/change the code anyway you like. You
+This software is released under the GPL v3 or later. For more information I
+direct you to the GPLv3 file. You may hack/change the code anyway you like. You
 may not commercially sell this software. If you make changes, release the
 source code to the public and send the changes you made to the original
 authors.
@@ -78,21 +78,20 @@ There is a fifth type of file that is supported by Virtual Jaguar, the .j64
 file, which is simply a 1, 2, or 4 Meg dump of a Jaguar cartridge ROM which
 loads at $800000 in the Jaguar memory space.
 
------------------------------------
-- What is Virtual Jaguar GCC/SDL? -
------------------------------------
+----------------------------------
+- What is Virtual Jaguar GCC/Qt? -
+----------------------------------
 
 Virtual Jaguar is software dedicated to emulating the Atari Jaguar hardware on
 a standard PC. The software was originally developed by David Raingeard of
 Potato Emulation [http://potato.emu-france.com] and was released under the GPL
 on 25 June 2003.
 
-Virtual Jaguar GCC/SDL is not just a port of the MS Visual C++/SDL sourcecode
+Virtual Jaguar GCC/Qt is not just a port of the MS Visual C++/SDL sourcecode
 but has also been extended and rewritten so that we can enjoy Atari Jaguar
-emulation on every platform that has a GCC compiler and a port of the Simple
-Directmedia Layer library (SDL).
+emulation on every platform that has a GCC compiler and a port of Qt.
 
-Currently Virtual Jaguar GCC/SDL compiles on WIN32 using mingw, and several
+Currently Virtual Jaguar GCC/Qt compiles on WIN32 using mingw, and several
 UN*X based systems (BeOS, Linux, FreeBSD and MacOS). It may run on other
 systems as well but we can not guarantee that.
 
@@ -105,15 +104,15 @@ are particularly welcome! :)
 More information about the incredible SDL libraries can be found at
 http://www.libsdl.org. Thanks Sam--you rock! :)
 
---------------------------------
-- Using Virtual Jaguar GCC/SDL -
---------------------------------
+-------------------------------
+- Using Virtual Jaguar GCC/Qt -
+-------------------------------
 
 After compiling the binary (see INSTALL) you can now run original Atari Jaguar
 games. These games are distributed on cartridges and can therefore cannot be
 used on a PC (we're still waiting for that Jaguar-on-a-PCI-card that you plug
 into your late model PC, complete with cartridge slot and controller connectors
-;-). To use these games on Virtual Jaguar GCC/SDL you need to get ROM images.
+;-). To use these games on Virtual Jaguar GCC/Qt you need to get ROM images.
 Besides the ROM images from commercial games, you may also need to obtain the
 Atari Jaguar boot ROM (and/or CD boot ROM) which you must copy to the BIOS
 directory. For legal issues concerning ROM images please consult the DISCLAIMER
@@ -122,18 +121,25 @@ at the beginning of this file.
 After obtaining the Atari Jaguar boot ROM (and/or CD boot ROM) and several game
 ROMs you can now use Virtual Jaguar using the following command:
 
-./vj [romfile] [-switches]
+./virtualjaguar [romfile] [-switches]
 
 The context of ROMFILE is the filename of the an Atari Jaguar ROM dump (can be
 either compressed or uncompressed). You can also use switches. By just typing
-./vj -? (or ./vj -help) you get an overview of the options you can use. WIN32
-users should look into the stdout.txt in the directory they ran Virtual Jaguar
-for that information.
+./virtualjaguar -? (or ./virtualjaguar -help) you get an overview of the
+options you can use. WIN32 users should look into the stdout.txt in the
+directory they ran Virtual Jaguar for that information. Also, WIN32 users
+should be aware that if their ROM filenames contain any spaces, you will have
+to enclose the ROMFILE in double quotes for Virtual Jaguar to function
+properly.
+
+Note that running Virtual Jaguar this way will cause the emulator to exit
+completely upon pressing the ESC key. If this is not what you want, then omit
+the ROMFILE and it will bring up a nice GUI instead.
 
 If you prefer a nice GUI instead of typing in command lines, you can either
-type ./vj or double click on the Virtual Jaguar executable. If you have a
-directory full of ROM files, you can tell Virtual Jaguar where they are by
-editing the appropriate line in the vj.cfg file (it assumes a ROMs directory
+type ./virtualjaguar or double click on the Virtual Jaguar executable. If you
+have a directory full of ROM files, you can tell Virtual Jaguar where they are
+by editing the appropriate line in the vj.cfg file (it assumes a ROMs directory
 under the directory where VJ lives) so that they show up when you pick the
 "Load" option from the "File" menu.
 
@@ -153,7 +159,7 @@ Atari RIGHT          : RIGHT or joystick RIGHT
 Atari #              : Keypad /
 Atari *              : Keypad *
 
-With ESC you can easily stop Virtual Jaguar GCC/SDL which will get you back to
+With ESC you can easily stop Virtual Jaguar GCC/Qt which will get you back to
 the GUI (pressing ESC again will take you back to the game). To exit VJ, you
 can either select File|Quit or press the "Q" key on your keyboard. If you want
 to change the key layout, simply edit the vj.cfg file and change the keys. :)
@@ -192,3 +198,11 @@ David Raingeard of Potato Emulation who originally developed this emulator and
 released the sources to the public. We couldn't have done it without you!
 
 SDLEMU
+
+
+*** Stuff to add in:
+
+ o  Documentation needs a rewrite, more or less, as the GUI is now front and
+    center. Need to update the docs to reflect this change.
+ o  Document the new "solid" zip file archive mechanism which allows putting
+    artwork into a "ROM".
index aab644db2adea27dd9f1787bbe0910bfbc884a46..04d0a4e30759833b10ed7313c5f8c37e283ecfbb 100644 (file)
--- a/docs/TODO
+++ b/docs/TODO
@@ -10,11 +10,11 @@ Stuff to add/fix for the next release of Virtual Jaguar
 - It would be nice to have the emulator pick up where you last left off, or at
   least give you the option of continuing from your last session. This would
   require save states, 'natch. ;-) [Shamus]
-- Cycle accuracy for GPU/DSP/OP/Blitter. [Shamus]
-- Need to propogate blitter fixes in the A1 <- A2 direction to the A1 -> A2
-  direction and the GPU fixes to various instructions to the DSP. [Shamus]
 - It would be nice to have "save states" for instant save/load capability.
   [Shamus]
+- Cycle accuracy for GPU/DSP/OP/Blitter. [Shamus]
+- Need to propagate blitter fixes in the A1 <- A2 direction to the A1 -> A2
+  direction and the GPU fixes to various instructions to the DSP. [Shamus]
 - Need to fix PAL mode to work with the virtual screen code. [Shamus]
 - There are a few ROMs that use some "quasi-illegal" 68K instructions. Need
   to patch the 68K core to deal with these in a better way than they are
index 64bb4dfc04effcf9de1ffdb296274808886eee99..e77cad095c4dbffed0258f0d85df7499faf22682 100644 (file)
@@ -1,5 +1,15 @@
-Virtual Jaguar v1.1.0 GCC/SDL
------------------------------
+Virtual Jaguar v2.0.0 GCC/Qt
+----------------------------
+
+* Switched GUI to Qt. And there was much rejoicing. ;-) [Shamus]
+* Added detection code to fish out files from inside ZIP archives. What this
+  means is that now you can have other goodies inside of your ROM ZIP like
+  labels, box art, and overlays. See README for details. [Shamus]
+* Various usability improvements, too many to list here. ;-) [Shamus]
+
+
+Virtual Jaguar v1.1.0 GCC/SDL (r299 - Never officially released)
+----------------------------------------------------------------
 
 * Switched OpenGL rendering to 32 BPP. This is not only how a real Jaguar
   renders graphics, but it also gives VJ a nice speed boost. ;-) [Shamus]
diff --git a/docs/gpl.txt b/docs/gpl.txt
deleted file mode 100644 (file)
index 1bcc46f..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                           Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-\f
-                   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.)
-\f
-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.
-\f
-  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.
-\f
-  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
-\f
-           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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <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 Library General
-Public License instead of this License.
-
-
diff --git a/jaguarcore.mak b/jaguarcore.mak
new file mode 100644 (file)
index 0000000..d3cc257
--- /dev/null
@@ -0,0 +1,105 @@
+#
+# Makefile for Virtual Jaguar core library
+#
+# by James L. Hammons
+#
+# This software is licensed under the GPL v3 or any later version. See the
+# file GPLv3 for details. ;-)
+#
+
+# Figure out which system we're compiling for, and set the appropriate variables
+
+OSTYPE := $(shell uname -a)
+
+ifeq "$(findstring Msys,$(OSTYPE))" "Msys"                     # Win32
+
+SYSTYPE    := __GCCWIN32__
+SDLLIBTYPE := --libs
+
+else ifeq "$(findstring Darwin,$(OSTYPE))" "Darwin"    # Should catch both 'darwin' and 'darwin7.0'
+
+SYSTYPE    := __GCCUNIX__ -D_OSX_
+SDLLIBTYPE := --static-libs
+
+else ifeq "$(findstring Linux,$(OSTYPE))" "Linux"              # Linux
+
+SYSTYPE    := __GCCUNIX__
+SDLLIBTYPE := --libs
+
+else                                                                                   # ???
+
+$(error OS TYPE UNDETECTED)
+
+endif
+
+# Set vars for libcdio
+ifneq "$(shell pkg-config --silence-errors --libs libcdio)" ""
+HAVECDIO := -DHAVE_LIB_CDIO
+CDIOLIB  := -lcdio
+else
+HAVECDIO :=
+CDIOLIB  :=
+endif
+
+CC      := gcc
+LD      := gcc
+AR      := ar
+ARFLAGS := -rs
+
+# Note that we use optimization level 2 instead of 3--3 doesn't seem to gain much over 2
+CFLAGS  := -MMD -O2 -ffast-math -fomit-frame-pointer `sdl-config --cflags` -D$(SYSTYPE)
+CXXFLAGS  := -MMD -O2 -ffast-math -fomit-frame-pointer `sdl-config --cflags` -D$(SYSTYPE)
+
+INCS := -I./src
+
+OBJS := \
+       obj/blitter.o      \
+       obj/cdintf.o       \
+       obj/cdrom.o        \
+       obj/crc32.o        \
+       obj/dac.o          \
+       obj/dsp.o          \
+       obj/eeprom.o       \
+       obj/event.o        \
+       obj/file.o         \
+       obj/filedb.o       \
+       obj/gpu.o          \
+       obj/jagdasm.o      \
+       obj/jaguar.o       \
+       obj/jerry.o        \
+       obj/joystick.o     \
+       obj/log.o          \
+       obj/memory.o       \
+       obj/mmu.o          \
+       obj/objectp.o      \
+       obj/settings.o     \
+       obj/state.o        \
+       obj/tom.o          \
+       obj/universalhdr.o \
+       obj/unzip.o        \
+       obj/wavetable.o
+
+# Targets for convenience sake, not "real" targets
+.PHONY: clean
+
+all: obj obj/libjaguarcore.a
+       @echo "Done!"
+
+obj:
+       @mkdir obj
+
+# Library rules (might not be cross-platform compatible)
+obj/libjaguarcore.a: $(OBJS) 
+       @$(AR) $(ARFLAGS) obj/libjaguarcore.a $(OBJS)
+
+# Main source compilation (implicit rules)...
+
+obj/%.o: src/%.c
+       @echo -e "\033[01;33m***\033[00;32m Compiling $<...\033[00m"
+       @$(CC) $(CFLAGS) $(INCS) -c $< -o $@
+
+obj/%.o: src/%.cpp
+       @echo -e "\033[01;33m***\033[00;32m Compiling $<...\033[00m"
+       @$(CC) $(CXXFLAGS) $(INCS) -c $< -o $@
+
+-include obj/*.d
diff --git a/musashi.mak b/musashi.mak
new file mode 100644 (file)
index 0000000..1e0d3eb
--- /dev/null
@@ -0,0 +1,68 @@
+#
+# Makefile for Musashi Portable 68000 Emulator
+#
+# by James L. Hammons
+#
+# This software is licensed under the GPL v3 or any later version. See the
+# file GPLv3 for details. ;-)
+#
+
+CC         := gcc
+LD         := gcc
+AR         := ar
+ARFLAGS    := -rs
+
+# Note that we use optimization level 2 instead of 3--3 doesn't seem to gain much over 2
+CFLAGS   := -MMD -O2 -ffast-math -fomit-frame-pointer
+
+OBJS := \
+       obj/m68kcpu.o  \
+       obj/m68kops.o  \
+       obj/m68kopac.o \
+       obj/m68kopdm.o \
+       obj/m68kopnz.o \
+       obj/m68kdasm.o
+
+# Targets for convenience sake, not "real" targets
+.PHONY: clean
+
+all: obj obj/libmusashi.a
+       @echo "Done!"
+
+obj:
+       @mkdir obj
+
+# Library rules (might not be cross-platform compatible)
+obj/libmusashi.a: $(OBJS) 
+       @$(AR) $(ARFLAGS) obj/libmusashi.a $(OBJS)
+
+# Main source compilation (implicit rules)...
+
+obj/%.o: src/%.c
+       @echo -e "\033[01;33m***\033[00;32m Compiling $<...\033[00m"
+       @$(CC) $(CFLAGS) $(INCS) -c $< -o $@
+
+#
+# Musashi specific stuffola
+#
+
+obj/m68kmake: src/m68kmake.c src/m68k_in.c
+       @echo -e "\033[01;33m***\033[00;32m Preparing to make the Musashi core...\033[00m"
+       @$(CC) $(WARNINGS) src/m68kmake.c -o obj/m68kmake
+
+obj/m68kops.h obj/m68kops.c obj/m68kopac.c obj/m68kopdm.c obj/m68kopnz.c: obj/m68kmake
+       @echo -e "\033[01;33m***\033[00;32m Creating m68kops.h...\033[00m"
+       @obj/m68kmake obj src/m68k_in.c
+
+obj/m68kcpu.o: obj/m68kops.h src/m68k.h src/m68kconf.h
+       @echo -e "\033[01;33m***\033[00;32m Compiling m68kcpu.c...\033[00m"
+       @$(CC) $(CFLAGS) -Iobj -c src/m68kcpu.c -o obj/m68kcpu.o
+
+obj/m68kop%.o: obj/m68kop%.c
+       @echo -e "\033[01;33m***\033[00;32m Compiling $<...\033[00m"
+       @$(CC) $(CFLAGS) -Isrc -c $< -o $@
+
+# Pull in dependencies autogenerated by gcc's -MMD switch
+# The "-" in front is there just in case they haven't been created yet
+
+-include obj/*.d
diff --git a/res/alpine-file.png b/res/alpine-file.png
new file mode 100644 (file)
index 0000000..92350f1
Binary files /dev/null and b/res/alpine-file.png differ
diff --git a/res/cart-blank.png b/res/cart-blank.png
new file mode 100644 (file)
index 0000000..976a23d
Binary files /dev/null and b/res/cart-blank.png differ
diff --git a/res/controller.png b/res/controller.png
new file mode 100644 (file)
index 0000000..fdac71f
Binary files /dev/null and b/res/controller.png differ
diff --git a/res/generic.png b/res/generic.png
new file mode 100644 (file)
index 0000000..2b9c7fd
Binary files /dev/null and b/res/generic.png differ
diff --git a/res/homebrew-file.png b/res/homebrew-file.png
new file mode 100644 (file)
index 0000000..2702059
Binary files /dev/null and b/res/homebrew-file.png differ
diff --git a/res/insert.png b/res/insert.png
new file mode 100644 (file)
index 0000000..7342009
Binary files /dev/null and b/res/insert.png differ
diff --git a/res/label-blank.png b/res/label-blank.png
new file mode 100644 (file)
index 0000000..6ef1128
Binary files /dev/null and b/res/label-blank.png differ
diff --git a/res/ntsc.png b/res/ntsc.png
new file mode 100644 (file)
index 0000000..e13f41e
Binary files /dev/null and b/res/ntsc.png differ
diff --git a/res/pal.png b/res/pal.png
new file mode 100644 (file)
index 0000000..e025a2e
Binary files /dev/null and b/res/pal.png differ
diff --git a/res/pause.png b/res/pause.png
new file mode 100644 (file)
index 0000000..1032cb9
Binary files /dev/null and b/res/pause.png differ
diff --git a/res/power.png b/res/power.png
new file mode 100644 (file)
index 0000000..903b60d
Binary files /dev/null and b/res/power.png differ
diff --git a/res/software.png b/res/software.png
new file mode 100644 (file)
index 0000000..6ce06c5
Binary files /dev/null and b/res/software.png differ
diff --git a/res/unknown-file.png b/res/unknown-file.png
new file mode 100644 (file)
index 0000000..0e13ba2
Binary files /dev/null and b/res/unknown-file.png differ
diff --git a/res/upper-left.png b/res/upper-left.png
new file mode 100644 (file)
index 0000000..d2f5f34
Binary files /dev/null and b/res/upper-left.png differ
diff --git a/res/upper-right.png b/res/upper-right.png
new file mode 100644 (file)
index 0000000..49b68cb
Binary files /dev/null and b/res/upper-right.png differ
diff --git a/res/vj-icon.png b/res/vj-icon.png
new file mode 100644 (file)
index 0000000..fc304e1
Binary files /dev/null and b/res/vj-icon.png differ
diff --git a/res/vj_title_small.png b/res/vj_title_small.png
new file mode 100644 (file)
index 0000000..dd0c8fd
Binary files /dev/null and b/res/vj_title_small.png differ
diff --git a/res/zoom100.png b/res/zoom100.png
new file mode 100644 (file)
index 0000000..1c34227
Binary files /dev/null and b/res/zoom100.png differ
diff --git a/res/zoom200.png b/res/zoom200.png
new file mode 100644 (file)
index 0000000..20821da
Binary files /dev/null and b/res/zoom200.png differ
diff --git a/res/zoom300.png b/res/zoom300.png
new file mode 100644 (file)
index 0000000..3567764
Binary files /dev/null and b/res/zoom300.png differ
index 75d65a432bbd20879aa6db464dec13e4ab2279a6..3d4207d42f8d2c31e093e9eced5fffefebb2c9ac 100644 (file)
@@ -2,6 +2,15 @@
 // Blitter core
 //
 // by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
+//
+
 //
 // I owe a debt of gratitude to Curt Vendel and to John Mathieson--to Curt
 // for supplying the Oberon ASIC nets and to John for making them available
@@ -18,6 +27,7 @@
 #include <string.h>
 #include "jaguar.h"
 #include "log.h"
+//#include "memory.h"
 
 // Various conditional compilation goodies...
 
index 535f7cb77fd5e2d4c9b9ad0ae418ec8b201d0522..5c3febba7229ba758d6d9ae4384d1ad155e821df 100644 (file)
@@ -5,7 +5,8 @@
 #ifndef __BLITTER_H__
 #define __BLITTER_H__
 
-#include "types.h"
+//#include "types.h"
+#include "memory.h"
 
 void BlitterInit(void);
 void BlitterReset(void);
index 066f2cc2588e9cb7772d464e50b86e5721fc1f22..8973c4543068b5fec64bd148afb890848a734c3d 100644 (file)
@@ -2,6 +2,15 @@
 // OS agnostic CDROM interface functions
 //
 // by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
+//
+
 //
 // This now uses the supposedly cross-platform libcdio to do the necessary
 // low-level CD twiddling we need that libsdl can't do currently. Jury is
index a7569ac1eaec9a95ad0293c87188ad2a92fba6c6..c45a8f0306c06c5970a8a52bbd98e4b1daa4e45e 100644 (file)
@@ -4,13 +4,21 @@
 // Originally by David Raingeard
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Extensive rewrites/cleanups/fixes by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
 //
 
 #include "cdrom.h"
 
 #include <string.h>                                                                    // For memset, etc.
-#include "jaguar.h"                                                                    // For GET32/SET32 macros
+//#include "jaguar.h"                                                                  // For GET32/SET32 macros
 #include "m68k.h"
+//#include "memory.h"
 #include "cdintf.h"                                                                    // System agnostic CD interface functions
 #include "log.h"
 #include "dac.h"
index dbedb773e14159653ad98b93637e5856628445ac..963a02aeb54a620ebd5770f4a9574e1ffe80b4e9 100644 (file)
@@ -5,7 +5,8 @@
 #ifndef __CDROM_H__
 #define __CDROM_H__
 
-#include "types.h"
+//#include "types.h"
+#include "memory.h"
 
 void CDROMInit(void);
 void CDROMReset(void);
index 6711aae2fbe132d395a3a6816f3f6d85940d3287..8cb637bc70bb5ea71c6cdc344d67416eb3f19c80 100644 (file)
@@ -4,6 +4,13 @@
 // by David Raingeard
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Cleanups by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
 //
 
 #include "crc32.h"
index 9dc1a2ef28c34bb9b7d32d2fe04b67e53e1f4948..f37dd843ba71093171b399dd204e85b7f0f950e1 100644 (file)
@@ -4,6 +4,13 @@
 // Originally by David Raingeard
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Rewritten by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
 //
 
 // Need to set up defaults that the BIOS sets for the SSI here in DACInit()... !!! FIX !!!
 #include "dac.h"
 
 #include "SDL.h"
-#include "gui.h"
+//#include "gui.h"
 #include "jaguar.h"
 #include "log.h"
 #include "m68k.h"
+//#include "memory.h"
 #include "settings.h"
 
 //#define DEBUG_DAC
@@ -43,7 +51,7 @@
 
 // Global variables
 
-uint16 lrxd, rrxd;                                                                     // I2S ports (into Jaguar)
+//uint16 lrxd, rrxd;                                                                   // I2S ports (into Jaguar)
 
 // Local variables
 
@@ -222,7 +230,8 @@ WriteLog("Tail=%X, Head=%X", ltail, lhead);
        WriteLog("From while: Tail=%X, Head=%X", (LeftFIFOTailPtr + 2) & (BUFFER_SIZE - 1), LeftFIFOHeadPtr);
 //     LogDone();
 //     exit(0);
-       GUICrashGracefully("Stuck in left DAC spinlock!");
+#warning "Reimplement GUICrashGracefully!"
+//     GUICrashGracefully("Stuck in left DAC spinlock!");
        return;
 }
                }//*/
@@ -313,7 +322,8 @@ WriteLog("Tail=%X, Head=%X", rtail, rhead);
        WriteLog("From while: Tail=%X, Head=%X", (RightFIFOTailPtr + 2) & (BUFFER_SIZE - 1), RightFIFOHeadPtr);
 //     LogDone();
 //     exit(0);
-       GUICrashGracefully("Stuck in right DAC spinlock!");
+#warning "Reimplement GUICrashGracefully!"
+//     GUICrashGracefully("Stuck in right DAC spinlock!");
        return;
 }
                }//*/
@@ -351,7 +361,8 @@ WriteLog("Tail=%X, Head=%X", rtail, rhead);
                                                WriteLog("DAC: Failed to initialize SDL sound: %s.\nDesired freq: %u\nShutting down!\n", SDL_GetError(), desired.freq);
 //                                             LogDone();
 //                                             exit(1);
-                                               GUICrashGracefully("Failed to initialize SDL sound!");
+#warning "Reimplement GUICrashGracefully!"
+//                                             GUICrashGracefully("Failed to initialize SDL sound!");
                                                return;
                                        }
                                }
index 914ff6a5d6e1c11ea176d0b46a63a1ac3ee932b9..ac94d06fffef6a4d163b8f1b07b610fcdd3b0ae6 100644 (file)
--- a/src/dac.h
+++ b/src/dac.h
@@ -5,7 +5,8 @@
 #ifndef __DAC_H__
 #define __DAC_H__
 
-#include "types.h"
+//#include "types.h"
+#include "memory.h"
 
 void DACInit(void);
 void DACReset(void);
@@ -20,6 +21,6 @@ uint16 DACReadWord(uint32 offset, uint32 who = UNKNOWN);
 
 // Global variables
 
-extern uint16 lrxd, rrxd;                                                      // I2S ports (into Jaguar)
+//extern uint16 lrxd, rrxd;                                                    // I2S ports (into Jaguar)
 
 #endif // __DAC_H__
index 4a9ba85252f605efecddc31df5aae3a6a12928d4..604584ccae623021680f9506d817a1dc5c4cbcff 100644 (file)
@@ -4,6 +4,13 @@
 // Originally by David Raingeard
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Extensive cleanups/rewrites by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
 //
 
 #include "dsp.h"
@@ -16,7 +23,7 @@
 #include "jerry.h"
 #include "log.h"
 #include "m68k.h"
-#include "memory.h"
+//#include "memory.h"
 
 //#define DSP_DEBUG
 //#define DSP_DEBUG_IRQ
@@ -441,7 +448,7 @@ void dsp_build_branch_condition_table(void)
 {
        // Allocate the mirror table
        if (!mirror_table)
-               mirror_table = (uint16 *)memory_malloc(65536 * sizeof(uint16), "DSP mirror table");
+               mirror_table = (uint16 *)malloc(65536 * sizeof(uint16));
 
        // Fill in the mirror table
        if (mirror_table)
@@ -457,7 +464,7 @@ void dsp_build_branch_condition_table(void)
 
        if (!dsp_branch_condition_table)
        {
-               dsp_branch_condition_table = (uint8 *)memory_malloc(32 * 8 * sizeof(uint8), "DSP branch condition table");
+               dsp_branch_condition_table = (uint8 *)malloc(32 * 8 * sizeof(uint8));
 
                // Fill in the condition table
                if (dsp_branch_condition_table)
@@ -1358,6 +1365,11 @@ void DSPDone(void)
 //     memory_free(dsp_ram_8);
 //     memory_free(dsp_reg_bank_0);
 //     memory_free(dsp_reg_bank_1);
+       if (dsp_branch_condition_table)
+               free(dsp_branch_condition_table);
+
+       if (mirror_table)
+               free(mirror_table);
 }
 
 
index 7e09e5903a22e570f5e7d98112d87919bab93be7..44e8b70712f9d1288fe39bf6a401eca130bba570 100644 (file)
--- a/src/dsp.h
+++ b/src/dsp.h
@@ -5,7 +5,8 @@
 #ifndef __DSP_H__
 #define __DSP_H__
 
-#include "types.h"
+//#include "types.h"
+#include "memory.h"
 
 #define DSP_CONTROL_RAM_BASE    0x00F1A100
 #define DSP_WORK_RAM_BASE              0x00F1B000
index fe3b1d082de914c161ff81e8d6b2559504c408e2..4b8dda8981ef31e0b77d68c64b2993a5d059f1ed 100644 (file)
@@ -4,6 +4,13 @@
 // by Cal2
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Cleanups/enhancements by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
 //
 
 #include "eeprom.h"
@@ -193,6 +200,7 @@ static void eeprom_set_di(uint32 data)
                if (jerry_writes_enabled)
                        for(int i=0; i<64; i++)
                                eeprom_ram[i] = jerry_ee_data;
+
                EEPROMSave();                                                           // Save it NOW!
                //else
                //      WriteLog("eeprom: not writing because read only\n");
@@ -231,6 +239,7 @@ static void eeprom_set_di(uint32 data)
                //WriteLog("eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data);
                if (jerry_writes_enabled)
                        eeprom_ram[jerry_ee_address_data] = jerry_ee_data;
+
                EEPROMSave();                                                           // Save it NOW!
                jerry_ee_state = EE_STATE_BUSY;
                break;
@@ -253,6 +262,7 @@ static void eeprom_set_di(uint32 data)
                //WriteLog("eeprom: erasing 0x%.2x\n",jerry_ee_address_data);
                if (jerry_writes_enabled)
                        eeprom_ram[jerry_ee_address_data] = 0xFFFF;
+
                jerry_ee_state = EE_STATE_BUSY;
                break;
        case EE_READ_DATA:
@@ -260,9 +270,11 @@ static void eeprom_set_di(uint32 data)
                jerry_ee_data <<= 1;
                jerry_ee_data |= data;
                jerry_ee_data_cnt--;
+
                if (!jerry_ee_data_cnt)
                {
                        jerry_ee_state = jerry_ee_rstate;
+
                        if (jerry_ee_direct_jump)
                                eeprom_set_di(data);
                }
@@ -272,10 +284,12 @@ static void eeprom_set_di(uint32 data)
                jerry_ee_address_data |= data;
                jerry_ee_address_cnt--;
 //             WriteLog("eeprom:\t%i bits remaining\n",jerry_ee_address_cnt);
+
                if (!jerry_ee_address_cnt)
                {
                        jerry_ee_state = jerry_ee_rstate;
                        //WriteLog("eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data);
+
                        if (jerry_ee_direct_jump)
                                eeprom_set_di(data);
                }
@@ -314,6 +328,7 @@ static uint32 eeprom_get_do(void)
        case EE_STATE_2_0:
                jerry_ee_data_cnt--;
                data = (eeprom_ram[jerry_ee_address_data] & (1 << jerry_ee_data_cnt)) >> jerry_ee_data_cnt;
+
                if (!jerry_ee_data_cnt)
                {
                        //WriteLog("eeprom: read 0x%.4x at 0x%.2x cpu %i pc=0x%.8x\n",eeprom_ram[jerry_ee_address_data],jerry_ee_address_data,jaguar_cpu_in_exec,s68000readPC());
index 734ad87bdad92709038988cd0d3cb461a64e6c19..2fbfa33c11078f206e41ab90110747986623a620 100644 (file)
@@ -2,6 +2,15 @@
 // System time handlers
 //
 // by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
+//
+
 //
 // STILL TO DO:
 //
index 4fc852c8c430f309db0c2d64e716a63e830d1973..78b4233c6eb53cda59df23bdfabd8e06be021915 100644 (file)
@@ -3,6 +3,14 @@
 //
 // File support
 // by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
+// JLH  02/28/2010  Added functions to look inside .ZIP files and handle contents
 //
 
 #include "file.h"
 #include "eeprom.h"
 #include "jaguar.h"
 #include "log.h"
+#include "memory.h"
+#include "universalhdr.h"
 #include "unzip.h"
 #include "zlib.h"
 
 // Private function prototypes
 
 static int gzfilelength(gzFile gd);
+static bool CheckExtension(const char * filename, const char * ext);
+//static int ParseFileType(uint8 header1, uint8 header2, uint32 size);
+
+// Private variables/enums
+
 
 //
 // Generic ROM loading
@@ -27,90 +42,76 @@ uint32 JaguarLoadROM(uint8 * rom, char * path)
 {
 // We really should have some kind of sanity checking for the ROM size here to prevent
 // a buffer overflow... !!! FIX !!!
-#warning !!! FIX !!! Should have sanity checking for ROM size to prevent buffer overflow!
+#warning "!!! FIX !!! Should have sanity checking for ROM size to prevent buffer overflow!"
        uint32 romSize = 0;
 
-WriteLog("JaguarLoadROM: Attempting to load file '%s'...", path);
+       WriteLog("JaguarLoadROM: Attempting to load file '%s'...", path);
        char * ext = strrchr(path, '.');
-if (ext == NULL)
-       WriteLog("FAILED!\n");
-else
-       WriteLog("Succeeded in finding extension (%s)!\n", ext);
 
-       if (ext != NULL)
+       // No filename extension == YUO FAIL IT (it is loading the file).
+       // This is naive, but it works. But should probably come up with something a little
+       // more robust, to prevent problems with dopes trying to exploit this.
+       if (ext == NULL)
        {
-               WriteLog("VJ: Loading \"%s\"...", path);
-
-               if (strcasecmp(ext, ".zip") == 0)
-               {
-                       // Handle ZIP file loading here...
-                       WriteLog("(ZIPped)...");
+               WriteLog("FAILED!\n");
+               return 0;
+       }
 
-                       if (load_zipped_file(0, 0, path, NULL, &rom, &romSize) == -1)
-                       {
-                               WriteLog("Failed!\n");
-                               return 0;
-                       }
-               }
-               else
-               {
-/*                     FILE * fp = fopen(path, "rb");
+       WriteLog("Succeeded in finding extension (%s)!\n", ext);
+       WriteLog("VJ: Loading \"%s\"...", path);
 
-                       if (fp == NULL)
-                       {
-                               WriteLog("Failed!\n");
-                               return 0;
-                       }
+       if (strcasecmp(ext, ".zip") == 0)
+       {
+               // Handle ZIP file loading here...
+               WriteLog("(ZIPped)...");
 
-                       fseek(fp, 0, SEEK_END);
-                       romSize = ftell(fp);
-                       fseek(fp, 0, SEEK_SET);
-                       fread(rom, 1, romSize, fp);
-                       fclose(fp);*/
+               uint8_t * buffer = NULL;
+               romSize = GetFileFromZIP(path, FT_SOFTWARE, buffer);
 
-                       // Handle gzipped files transparently [Adam Green]...
+               if (romSize == 0)
+               {
+                       WriteLog("Failed!\n");
+                       return 0;
+               }
 
-                       gzFile fp = gzopen(path, "rb");
+               memcpy(rom, buffer, romSize);
+               delete[] buffer;
+       }
+       else
+       {
+               // Handle gzipped files transparently [Adam Green]...
 
-                       if (fp == NULL)
-                       {
-                               WriteLog("Failed!\n");
-                               return 0;
-                       }
+               gzFile fp = gzopen(path, "rb");
 
-                       romSize = gzfilelength(fp);
-                       gzseek(fp, 0, SEEK_SET);
-                       gzread(fp, rom, romSize);
-                       gzclose(fp);
+               if (fp == NULL)
+               {
+                       WriteLog("Failed!\n");
+                       return 0;
                }
 
-               WriteLog("OK (%i bytes)\n", romSize);
+               romSize = gzfilelength(fp);
+               gzseek(fp, 0, SEEK_SET);
+               gzread(fp, rom, romSize);
+               gzclose(fp);
        }
 
+       WriteLog("OK (%i bytes)\n", romSize);
+
        return romSize;
 }
 
 //
 // Jaguar file loading
 //
-bool JaguarLoadFile(char * path)
+bool JaguarLoadFileOld(char * path)
 {
-//     jaguarRomSize = JaguarLoadROM(mem, path);
        jaguarROMSize = JaguarLoadROM(jaguarMainROM, path);
 
-/*//This is not *nix friendly for some reason...
-//             if (!UserSelectFile(path, newPath))
-       if (!UserSelectFile((strlen(path) == 0 ? (char *)"." : path), newPath))
-       {
-               WriteLog("VJ: Could not find valid ROM in directory \"%s\"...\nAborting!\n", path);
-               log_done();
-               exit(0);
-       }*/
-
        if (jaguarROMSize == 0)
        {
 //                     WriteLog("VJ: Could not load ROM from file \"%s\"...\nAborting!\n", newPath);
                WriteLog("GUI: Could not load ROM from file \"%s\"...\nAborting load!\n", path);
+#warning "!!! Need error dialog here !!!"
 // Need to do something else here, like throw up an error dialog instead of aborting. !!! FIX !!!
 //             log_done();
 //             exit(0);
@@ -126,6 +127,7 @@ bool JaguarLoadFile(char * path)
        char * ext = strrchr(path, '.');                                // Get the file's extension for non-cartridge checking
 
 //NOTE: Should fix JaguarLoadROM() to replace .zip with what's *in* the zip (.abs, .j64, etc.)
+#warning "!!! Need more robust file type checking in JaguarLoadROM() !!!"
        if (strcasecmp(ext, ".rom") == 0)
        {
                // File extension ".ROM": Alpine image that loads/runs at $802000
@@ -279,7 +281,7 @@ Start of Data Segment = 0x00803dd0
                }
                else
                {
-                       WriteLog("GUI: Couldn't find correct ABS format: %02X %02X\n", jaguarMainROM[0], jaguarMainROM[1]);
+                       WriteLog("GUI: Couldn't find correct ABS/COF format: %02X %02X\n", jaguarMainROM[0], jaguarMainROM[1]);
                        return false;
                }
        }
@@ -312,6 +314,101 @@ Start of Data Segment = 0x00803dd0
        return true;
 }
 
+//
+// Jaguar file loading (second stab at it...)
+// We do a more intelligent file analysis here instead of relying on (possible false)
+// file extensions which people don't seem to give two shits about anyway. :-(
+//
+bool JaguarLoadFile(char * path)
+{
+// NOTE: We can further clean this up by fixing JaguarLoadROM to load to a buffer
+//       instead of assuming it goes into our ROM space.
+       jaguarROMSize = JaguarLoadROM(jaguarMainROM, path);
+
+       if (jaguarROMSize == 0)
+       {
+//                     WriteLog("VJ: Could not load ROM from file \"%s\"...\nAborting!\n", newPath);
+               WriteLog("GUI: Could not load ROM from file \"%s\"...\nAborting load!\n", path);
+#warning "!!! Need error dialog here !!!"
+// Need to do something else here, like throw up an error dialog instead of aborting. !!! FIX !!!
+               return false;                                                           // This is a start...
+       }
+
+       jaguarMainROMCRC32 = crc32_calcCheckSum(jaguarMainROM, jaguarROMSize);
+       WriteLog("CRC: %08X\n", (unsigned int)jaguarMainROMCRC32);
+// TODO: Check for EEPROM file in ZIP file. If there is no EEPROM in the user's EEPROM
+//       directory, copy the one from the ZIP file, if it exists.
+       EepromInit();
+       jaguarRunAddress = 0x802000;                                    // For non-BIOS runs, this is true
+       int fileType = ParseFileType(jaguarMainROM[0], jaguarMainROM[1], jaguarROMSize);
+
+       if (fileType == JST_ROM)
+               return true;
+       else if (fileType == JST_ALPINE)
+       {
+               // File extension ".ROM": Alpine image that loads/runs at $802000
+               WriteLog("GUI: Setting up Alpine ROM... Run address: 00802000, length: %08X\n", jaguarROMSize);
+
+               for(int i=jaguarROMSize-1; i>=0; i--)
+                       jaguarMainROM[0x2000 + i] = jaguarMainROM[i];
+
+               memset(jaguarMainROM, 0xFF, 0x2000);
+
+// Maybe instead of this, we could try requiring the STUBULATOR ROM? Just a thought...
+               // Try setting the vector to say, $1000 and putting an instruction there that loops forever:
+               // This kludge works! Yeah!
+               SET32(jaguarMainRAM, 0x10, 0x00001000);
+               SET16(jaguarMainRAM, 0x1000, 0x60FE);           // Here: bra Here
+               return true;
+       }
+       else if (fileType == JST_ABS_TYPE1)
+       {
+               uint32 loadAddress = GET32(jaguarMainROM, 0x16),
+                       codeSize = GET32(jaguarMainROM, 0x02) + GET32(jaguarMainROM, 0x06);
+               WriteLog("GUI: Setting up homebrew (ABS-1)... Run address: %08X, length: %08X\n", loadAddress, codeSize);
+
+               if (loadAddress < 0x800000)
+                       memcpy(jaguarMainRAM + loadAddress, jaguarMainROM + 0x24, codeSize);
+               else
+               {
+                       for(int i=codeSize-1; i>=0; i--)
+                               jaguarMainROM[(loadAddress - 0x800000) + i] = jaguarMainROM[i + 0x24];
+               }
+
+               jaguarRunAddress = loadAddress;
+               return true;
+       }
+       else if (fileType == JST_ABS_TYPE2)
+       {
+               uint32 loadAddress = GET32(jaguarMainROM, 0x28), runAddress = GET32(jaguarMainROM, 0x24),
+                       codeSize = GET32(jaguarMainROM, 0x18) + GET32(jaguarMainROM, 0x1C);
+               WriteLog("GUI: Setting up homebrew (ABS-2)... Run address: %08X, length: %08X\n", runAddress, codeSize);
+
+               if (loadAddress < 0x800000)
+                       memcpy(jaguarMainRAM + loadAddress, jaguarMainROM + 0xA8, codeSize);
+               else
+               {
+                       for(int i=codeSize-1; i>=0; i--)
+                               jaguarMainROM[(loadAddress - 0x800000) + i] = jaguarMainROM[i + 0xA8];
+               }
+
+               jaguarRunAddress = runAddress;
+               return true;
+       }
+       else if (fileType == JST_JAGSERVER)
+       {
+               uint32 loadAddress = GET32(jaguarMainROM, 0x22), runAddress = GET32(jaguarMainROM, 0x2A);
+               WriteLog("GUI: Setting up homebrew (Jag Server)... Run address: %08X, length: %08X\n", runAddress, jaguarROMSize - 0x2E);
+               memcpy(jaguarMainRAM + loadAddress, jaguarMainROM + 0x2E, jaguarROMSize - 0x2E);
+               jaguarRunAddress = runAddress;
+               return true;
+       }
+
+       // We can assume we have JST_NONE at this point. :-P
+       // TODO: Add a dialog box that tells the user that they're trying to feed VJ a bogus file.
+       return false;
+}
+
 //
 // Get the length of a (possibly) gzipped file
 //
@@ -337,3 +434,234 @@ static int gzfilelength(gzFile gd)
    gzrewind(gd);
    return length;
 }
+
+//
+// Compare extension to passed in filename. If equal, return true; otherwise false.
+//
+static bool CheckExtension(const char * filename, const char * ext)
+{
+       const char * filenameExt = strrchr(filename, '.');      // Get the file's extension (if any)
+       return (strcasecmp(filenameExt, ext) == 0 ? true : false);
+}
+
+//
+// Get file from .ZIP
+// Returns the size of the file inside the .ZIP file that we're looking at
+// NOTE: If the thing we're looking for is found, it allocates it in the passed in buffer.
+//       Which means we have to deallocate it later.
+//
+uint32 GetFileFromZIP(const char * zipFile, FileType type, uint8 * &buffer)
+{
+// NOTE: We could easily check for this by discarding anything that's larger than the RAM/ROM
+//       size of the Jaguar console.
+#warning "!!! FIX !!! Should have sanity checking for ROM size to prevent buffer overflow!"
+       const char ftStrings[5][32] = { "Software", "EEPROM", "Label", "Box Art", "Controller Overlay" };
+       ZIP * zip = openzip(0, 0, zipFile);
+
+       if (zip == NULL)
+       {
+               WriteLog("FILE: Could not open file '%s'!\n", zipFile);
+               return 0;
+       }
+
+       zipent * ze;
+       bool found = false;
+
+       // The order is here is important: If the file is found, we need to short-circuit the
+       // readzip() call because otherwise, 'ze' will be pointing to the wrong file!
+       while (!found && readzip(zip))
+       {
+               ze = &zip->ent;
+
+               // Here we simply rely on the file extension to tell the truth, but we know
+               // that extensions lie like sons-a-bitches. So this is naive, we need to do
+               // something a little more robust to keep bad things from happening here.
+#warning "!!! Checking for image by extension can be fooled !!!"
+               if ((type == FT_LABEL) && (CheckExtension(ze->name, ".png") || CheckExtension(ze->name, ".jpg") || CheckExtension(ze->name, ".gif")))
+               {
+                       found = true;
+                       WriteLog("FILE: Found image file '%s'.\n", ze->name);
+               }
+
+               if ((type == FT_SOFTWARE) && (CheckExtension(ze->name, ".j64") || CheckExtension(ze->name, ".rom") || CheckExtension(ze->name, ".abs") || CheckExtension(ze->name, ".cof")))
+               {
+                       found = true;
+                       WriteLog("FILE: Found software file '%s'.\n", ze->name);
+               }
+
+               if ((type == FT_EEPROM) && (CheckExtension(ze->name, ".eep") || CheckExtension(ze->name, ".eeprom")))
+               {
+                       found = true;
+                       WriteLog("FILE: Found EEPROM file '%s'.\n", ze->name);
+               }
+       }
+
+       uint32 fileSize = 0;
+
+       if (found)
+       {
+               WriteLog("FILE: Uncompressing...");
+// Insert file size sanity check here...
+               buffer = new uint8[ze->uncompressed_size];
+
+               if (readuncompresszip(zip, ze, (char *)buffer) == 0)
+               {
+                       fileSize = ze->uncompressed_size;
+                       WriteLog("success! (%u bytes)\n", fileSize);
+               }
+               else
+               {
+                       delete[] buffer;
+                       buffer = NULL;
+                       WriteLog("FAILED!\n");
+               }
+       }
+       else
+               // Didn't find what we're looking for...
+               WriteLog("FILE: Failed to find file of type %s...\n", ftStrings[type]);
+
+       closezip(zip);
+       return fileSize;
+}
+
+//
+// Parse the file type based upon file size and/or headers.
+//
+uint32 ParseFileType(uint8 header1, uint8 header2, uint32 size)
+{
+       // If the file size is divisible by 1M, we probably have an regular ROM.
+       // We can also check our CRC32 against the internal ROM database to be sure.
+       if ((size % 1048576) == 0)
+               return JST_ROM;
+
+       // If the file size + 8192 bytes is divisible by 1M, we probably have an
+       // Alpine format ROM.
+       if (((size + 8192) % 1048576) == 0)
+               return JST_ALPINE;
+
+       // So much for low hanging fruit. Now try some other types.
+
+       // ABS/COFF type 1
+       if (header1 == 0x60 && header2 == 0x1B)
+               return JST_ABS_TYPE1;
+
+       // ABS/COFF type 2
+       if (header1 == 0x01 && header2 == 0x50)
+               return JST_ABS_TYPE2;
+
+       // Jag Server
+       if (header1 == 0x60 && header2 == 0x1A)
+               return JST_JAGSERVER;
+
+       // Headerless crap
+       return JST_NONE;
+}
+
+//
+// Check for universal header
+//
+bool HasUniversalHeader(uint8 * rom, uint32 romSize)
+{
+       // Sanity check
+       if (romSize < 8192)
+               return false;
+
+       for(int i=0; i<8192; i++)
+               if (rom[i] != universalCartHeader[i])
+                       return false;
+
+       return true;
+}
+
+#if 0
+// Misc. doco
+
+/*
+Stubulator ROM vectors...
+handler 001 at $00E00008
+handler 002 at $00E008DE
+handler 003 at $00E008E2
+handler 004 at $00E008E6
+handler 005 at $00E008EA
+handler 006 at $00E008EE
+handler 007 at $00E008F2
+handler 008 at $00E0054A
+handler 009 at $00E008FA
+handler 010 at $00000000
+handler 011 at $00000000
+handler 012 at $00E008FE
+handler 013 at $00E00902
+handler 014 at $00E00906
+handler 015 at $00E0090A
+handler 016 at $00E0090E
+handler 017 at $00E00912
+handler 018 at $00E00916
+handler 019 at $00E0091A
+handler 020 at $00E0091E
+handler 021 at $00E00922
+handler 022 at $00E00926
+handler 023 at $00E0092A
+handler 024 at $00E0092E
+handler 025 at $00E0107A
+handler 026 at $00E0107A
+handler 027 at $00E0107A
+handler 028 at $00E008DA
+handler 029 at $00E0107A
+handler 030 at $00E0107A
+handler 031 at $00E0107A
+handler 032 at $00000000
+
+Let's try setting up the illegal instruction vector for a stubulated jaguar...
+
+               SET32(jaguar_mainRam, 0x08, 0x00E008DE);
+               SET32(jaguar_mainRam, 0x0C, 0x00E008E2);
+               SET32(jaguar_mainRam, 0x10, 0x00E008E6);        // <-- Should be here (it is)...
+               SET32(jaguar_mainRam, 0x14, 0x00E008EA);//*/
+
+/*
+ABS Format sleuthing (LBUGDEMO.ABS):
+
+000000  60 1B 00 00 05 0C 00 04 62 C0 00 00 04 28 00 00
+000010  12 A6 00 00 00 00 00 80 20 00 FF FF 00 80 25 0C
+000020  00 00 40 00
+
+DRI-format file detected...
+Text segment size = 0x0000050c bytes
+Data segment size = 0x000462c0 bytes
+BSS Segment size = 0x00000428 bytes
+Symbol Table size = 0x000012a6 bytes
+Absolute Address for text segment = 0x00802000
+Absolute Address for data segment = 0x0080250c
+Absolute Address for BSS segment = 0x00004000
+
+(CRZDEMO.ABS):
+000000  01 50 00 03 00 00 00 00 00 03 83 10 00 00 05 3b
+000010  00 1c 00 03 00 00 01 07 00 00 1d d0 00 03 64 98
+000020  00 06 8b 80 00 80 20 00 00 80 20 00 00 80 3d d0
+
+000030  2e 74 78 74 00 00 00 00 00 80 20 00 00 80 20 00 .txt (+36 bytes)
+000040  00 00 1d d0 00 00 00 a8 00 00 00 00 00 00 00 00
+000050  00 00 00 00 00 00 00 20
+000058  2e 64 74 61 00 00 00 00 00 80 3d d0 00 80 3d d0 .dta (+36 bytes)
+000068  00 03 64 98 00 00 1e 78 00 00 00 00 00 00 00 00
+000078  00 00 00 00 00 00 00 40
+000080  2e 62 73 73 00 00 00 00 00 00 50 00 00 00 50 00 .bss (+36 bytes)
+000090  00 06 8b 80 00 03 83 10 00 00 00 00 00 00 00 00
+0000a0  00 00 00 00 00 00 00 80
+
+Header size is $A8 bytes...
+
+BSD/COFF format file detected...
+3 sections specified
+Symbol Table offset = 230160                           ($00038310)
+Symbol Table contains 1339 symbol entries      ($0000053B)
+The additional header size is 28 bytes         ($001C)
+Magic Number for RUN_HDR = 0x00000107
+Text Segment Size = 7632                                       ($00001DD0)
+Data Segment Size = 222360                                     ($00036498)
+BSS Segment Size = 428928                                      ($00068B80)
+Starting Address for executable = 0x00802000
+Start of Text Segment = 0x00802000
+Start of Data Segment = 0x00803dd0
+*/
+#endif
index 7fa3daf4907687a08d6d9d420df4de9300e2aa0a..23a3d6b2be8076cb5f1217a5bf329707fa6c7904 100644 (file)
 extern "C" {
 #endif
 
+enum FileType { FT_SOFTWARE=0, FT_EEPROM, FT_LABEL, FT_BOXART, FT_OVERLAY };
+// JST = Jaguar Software Type
+enum { JST_NONE = 0, JST_ROM, JST_ALPINE, JST_ABS_TYPE1, JST_ABS_TYPE2, JST_JAGSERVER };
+
 uint32 JaguarLoadROM(uint8 * rom, char * path);
 bool JaguarLoadFile(char * path);
+uint32 GetFileFromZIP(const char * zipFile, FileType type, uint8 * &buffer);
+uint32 ParseFileType(uint8 header1, uint8 header2, uint32 size);
+bool HasUniversalHeader(uint8 * rom, uint32 romSize);
 
 #ifdef __cplusplus
 }
diff --git a/src/filedb.cpp b/src/filedb.cpp
new file mode 100644 (file)
index 0000000..47c31ef
--- /dev/null
@@ -0,0 +1,132 @@
+//
+// filedb.cpp - File database
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  02/15/2010  Created this file
+//
+
+#include "filedb.h"
+
+
+#if 0
+struct RomIdentifier
+{
+       const uint32 crc32;
+       const char name[128];
+//     const uint8 compatibility;
+       const uint32 flags;
+};
+
+enum FileFlags { FF_ROM=1, FF_ALPINE=2, FF_BIOS=4, FF_REQ_DSP=8, FF_REQ_BIOS=16, FF_NON_WORKING=32, FF_BAD_DUMP=64, FF_VERIFIED=128 };
+#endif
+
+// Should have another flag for whether or not it requires DSP, BIOS,
+// whether it's a .rom, it's a BIOS, etc...
+// ... And now we do! :-D
+
+// How the CRCs work:
+// If the cart has an RSA signature, we do a CRC on the whole file.
+// If the cart has a universal header, we do a CRC on the file minus the UH.
+// This is to ensure that we can detect something properly (like an Alpine ROM)
+// that somebody slapped a universal header on.
+
+RomIdentifier romList[] = {
+       { 0x0509C85E, "Raiden (World) (alt)", FF_ROM },
+       { 0x08849D0F, "Hyper Force (World)", FF_ALPINE | FF_VERIFIED },
+       { 0x08F15576, "Iron Soldier (World) (v1.04)", FF_ROM | FF_VERIFIED },
+       { 0x0957A072, "Kasumi Ninja (World)", FF_ROM | FF_VERIFIED },
+       { 0x0AC83D77, "NBA Jam T.E. (World)", FF_ROM | FF_VERIFIED },
+       { 0x0EC5369D, "Evolution - Dino Dudes (World)", FF_ROM | FF_VERIFIED },
+       { 0x0F6A1C2C, "Ultra Vortek (World)", FF_ROM | FF_VERIFIED },
+       { 0x14915F20, "White Men Can't Jump (World)", FF_ROM | FF_VERIFIED },
+       { 0x1660F070, "Power Drive Rally (World)", FF_ROM | FF_VERIFIED },
+       { 0x1A20C5C4, "Protector (World)", FF_ROM | FF_VERIFIED | FF_REQ_DSP },
+       { 0x1E451446, "Trevor McFur in the Crescent Galaxy (World)", FF_ROM | FF_VERIFIED },
+       { 0x20936557, "Space War 2000", FF_ALPINE | FF_VERIFIED },
+       { 0x27594C6A, "Defender 2000 (World)", FF_ROM | FF_VERIFIED },
+       { 0x2BAA92A1, "Space War 2000 (World) (OVERDUMP)", FF_ALPINE },
+       { 0x2E17D5DA, "Bubsy in Fractured Furry Tales (World)", FF_ROM | FF_VERIFIED },
+       { 0x31812799, "Raiden (World)", FF_ROM | FF_VERIFIED },
+       { 0x3241AB6A, "Towers II", FF_ALPINE },
+       { 0x348E6449, "Double Dragon V - The Shadow Falls (World)", FF_ROM | FF_VERIFIED },
+       { 0x3615AF6A, "Fever Pitch Soccer (World) (En,Fr,De,Es,It)", FF_ROM | FF_VERIFIED },
+       { 0x38A130ED, "Troy Aikman NFL Football (World)", FF_ROM | FF_VERIFIED },
+       { 0x40E1A1D0, "Air Cars (World)", FF_ROM | FF_VERIFIED },
+       { 0x4471BFA0, "Skyhammer (World)", FF_ALPINE | FF_VERIFIED },
+       { 0x47EBC158, "Theme Park (World)", FF_ROM | FF_VERIFIED },
+       { 0x4899628F, "Hover Strike (World)", FF_ROM | FF_VERIFIED },
+       { 0x55A0669C, "[BIOS] Atari Jaguar Developer CD (World)", FF_BIOS },
+       { 0x58272540, "Syndicate (World)", FF_ROM | FF_VERIFIED },
+       { 0x5A101212, "Sensible Soccer - International Edition (World)", FF_ROM | FF_VERIFIED },
+       { 0x5B6BB205, "Ruiner Pinball (World)", FF_ROM | FF_VERIFIED },
+       { 0x5CFF14AB, "Pinball Fantasies (World)", FF_ROM | FF_VERIFIED },
+       { 0x5DDF9724, "Protector - Special Edition (World)", FF_ALPINE | FF_VERIFIED },
+       { 0x5E2CDBC0, "Doom (World)", FF_ROM | FF_VERIFIED | FF_REQ_DSP },
+       { 0x5F2C2774, "Battlesphere (World)", FF_ROM | FF_VERIFIED },
+       { 0x61C7EEC0, "Zero 5 (World)", FF_ROM | FF_VERIFIED },
+       { 0x61EE6B62, "Arena Football '95", FF_ALPINE | FF_VERIFIED },
+       { 0x67F9AB3A, "Battle Sphere Gold (World)", FF_ROM },
+       { 0x687068D5, "[BIOS] Atari Jaguar CD (World)", FF_BIOS },
+       { 0x6B2B95AD, "Tempest 2000 (World)", FF_ROM | FF_VERIFIED },
+       { 0x6EB774EB, "Worms (World)", FF_ROM | FF_VERIFIED },
+       { 0x6F8B2547, "Super Burnout (World)", FF_ROM | FF_VERIFIED },
+       { 0x732FFAB6, "Soccer Kid (World)", FF_ROM | FF_VERIFIED },
+       { 0x817A2273, "Pitfall - The Mayan Adventure (World)", FF_ROM | FF_VERIFIED },
+       { 0x83A3FB5D, "Towers II", FF_ROM | FF_VERIFIED },
+       { 0x892BC67C, "Flip Out! (World)", FF_ROM | FF_VERIFIED },
+       { 0x8975F48B, "Zool 2 (World)", FF_ROM | FF_VERIFIED },
+       { 0x89DA21FF, "Phase Zero", FF_ALPINE | FF_VERIFIED },
+       { 0x8D15DBC6, "[BIOS] Atari Jaguar Stubulator '94 (World)", FF_BIOS },
+       { 0x8FEA5AB0, "Dragon - The Bruce Lee Story (World)", FF_ROM | FF_VERIFIED },
+       { 0x91095DD3, "Brett Hull Hockey", FF_ROM | FF_VERIFIED },
+       { 0x95143668, "Trevor McFur in the Crescent Galaxy (World) (alt)", FF_ROM | FF_VERIFIED },
+       { 0x97EB4651, "I-War (World)", FF_ROM | FF_VERIFIED },
+       { 0xA0A25A67, "Missile Command VR", FF_ALPINE },
+       { 0xA27823D8, "Ultra Vortek (World) (v0.94) (Beta)", FF_ROM },
+       { 0xA7E01FEF, "Mad Bodies (2008)", FF_ROM | FF_NON_WORKING },
+       { 0xA9F8A00E, "Rayman (World)", FF_ROM | FF_VERIFIED },
+       { 0xAEA9D831, "Barkley Shut Up & Jam", FF_ROM | FF_VERIFIED },
+       { 0xB14C4753, "Fight for Life (World)", FF_ROM | FF_VERIFIED },
+       { 0xB5604D40, "Breakout 2000", FF_ROM | FF_VERIFIED },
+       { 0xBA13AE79, "Soccer Kid (World) (alt)", FF_ALPINE },
+       { 0xBCB1A4BF, "Brutal Sports Football (World)", FF_ROM | FF_VERIFIED },
+       { 0xBD18D606, "Space War 2000 (World) (alt)", FF_ALPINE },
+       { 0xBDA405C6, "Cannon Fodder (World)", FF_ROM | FF_VERIFIED },
+       { 0xBDE67498, "Cybermorph (World) (Rev 1)", FF_ROM | FF_VERIFIED },
+       { 0xC2898F6E, "Barkley Shut Up & Jam (alt)", FF_ALPINE },
+       { 0xC36E935E, "Beebris (World)", FF_ALPINE | FF_VERIFIED },
+       { 0xC5562581, "Zoop! (World)", FF_ROM | FF_VERIFIED },
+       { 0xC654681B, "Total Carnage (World)", FF_ROM | FF_VERIFIED },
+       { 0xC6C7BA62, "Fight for Life (World) (alt)", FF_ROM | FF_BAD_DUMP },
+       { 0xC9608717, "Val d'Isere Skiing and Snowboarding (World)", FF_ROM | FF_VERIFIED },
+       { 0xCBFD822A, "Air Cars (World) (alt)", FF_ROM | FF_BAD_DUMP },
+       { 0xCD5BF827, "Attack of the Mutant Penguins (World)", FF_ROM | FF_VERIFIED | FF_REQ_DSP },
+       { 0xD6C19E34, "Iron Soldier 2 (World)", FF_ROM | FF_VERIFIED },
+       { 0xD8696F23, "Breakout 2000 (alt)", FF_ALPINE },
+       { 0xDA9C4162, "Missile Command 3D (World)", FF_ROM | FF_VERIFIED },
+       { 0xDC187F82, "Alien vs Predator (World)", FF_ROM | FF_VERIFIED },
+       { 0xDCCDEF05, "Brett Hull Hockey", FF_ALPINE },
+       { 0xDDFF49F5, "Rayman (Prototype)", FF_ALPINE },
+       { 0xDE55DCC7, "Flashback - The Quest for Identity (World) (En,Fr)", FF_ROM | FF_VERIFIED },
+       { 0xE28756DE, "Atari Karts (World)", FF_ROM | FF_VERIFIED },
+       { 0xE60277BB, "[BIOS] Atari Jaguar Stubulator '93 (World)", FF_BIOS },
+       { 0xE91BD644, "Wolfenstein 3D (World)", FF_ROM | FF_VERIFIED },
+       { 0xEA9B3FA7, "Phase Zero", FF_ROM },
+       { 0xEC22F572, "SuperCross 3D (World)", FF_ROM | FF_VERIFIED },
+       { 0xECF854E7, "Cybermorph (World) (Rev 2)", FF_ROM },
+       { 0xEEE8D61D, "Club Drive (World)", FF_ROM | FF_VERIFIED },
+       { 0xF4ACBB04, "Tiny Toon Adventures (World)", FF_ROM | FF_VERIFIED },
+       { 0xFA7775AE, "Checkered Flag (World)", FF_ROM | FF_VERIFIED },
+       { 0xFAE31DD0, "Flip Out! (World) (alt)", FF_ROM },
+       { 0xFB731AAA, "[BIOS] Atari Jaguar (World)", FF_BIOS },
+// is this really a BIOS???
+// No, it's really a cart, complete with RSA header. So need to fix so it can load.
+       { 0xFDF37F47, "Memory Track Cartridge (World)", FF_ROM | FF_VERIFIED },
+       { 0xFFFFFFFF, "***END***", 0 }
+};
diff --git a/src/filedb.h b/src/filedb.h
new file mode 100644 (file)
index 0000000..d6630aa
--- /dev/null
@@ -0,0 +1,28 @@
+//
+// filedb.h: File database definition
+//
+
+#ifndef __FILEDB_H__
+#define __FILEDB_H__
+
+#include "types.h"
+
+// Useful enumerations
+
+enum FileFlags { FF_ROM=0x01, FF_ALPINE=0x02, FF_BIOS=0x04, FF_REQ_DSP=0x08, FF_REQ_BIOS=0x10, FF_NON_WORKING=0x20, FF_BAD_DUMP=0x40, FF_VERIFIED=0x80 };
+
+// Useful structs
+
+struct RomIdentifier
+{
+       const uint32 crc32;
+       const char name[128];
+//     const uint8 compatibility;
+       const uint32 flags;
+};
+
+// So other stuff can pull this in...
+
+extern RomIdentifier romList[];
+
+#endif // __FILEDB_H__
index aec51a18e3be9bc0ffe0fb2b4579cd1981285898..4892b7aa536d4bee7d790435bacfd929b621fa28 100644 (file)
@@ -6,6 +6,15 @@
 // Originally by David Raingeard (Cal2)
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Cleanups, endian wrongness, and bad ASM amelioration by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
+
+//
 // Note: Endian wrongness probably stems from the MAME origins of this emu and
 //       the braindead way in which MAME handles memory. :-)
 //
@@ -23,7 +32,7 @@
 #include "jaguar.h"
 #include "log.h"
 #include "m68k.h"
-#include "memory.h"
+//#include "memory.h"
 #include "tom.h"
 
 //#define GPU_DEBUG
index 65485447107ea1cf9fd191bbe6c350861263ebc7..97ba4b33a3a7fdf804d27d3751bee3e864f75a5a 100644 (file)
--- a/src/gpu.h
+++ b/src/gpu.h
@@ -5,7 +5,8 @@
 #ifndef __GPU_H__
 #define __GPU_H__
 
-#include "types.h"
+//#include "types.h"
+#include "memory.h"
 
 #define GPU_CONTROL_RAM_BASE    0x00F02100
 #define GPU_WORK_RAM_BASE              0x00F03000
diff --git a/src/gui/about.cpp b/src/gui/about.cpp
new file mode 100644 (file)
index 0000000..d964ed5
--- /dev/null
@@ -0,0 +1,62 @@
+//
+// about.cpp - Credits
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/21/2010  Created this file
+// JLH  01/22/2010  Fleshed out the credits a bit more
+// JLH  01/22/2010  Fixed centering and decorating of window
+//
+
+// STILL TO DO:
+//
+
+#include "about.h"
+#include "version.h"
+
+AboutWindow::AboutWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog)
+{
+       setWindowTitle(tr("About Virtual Jaguar..."));
+
+       layout = new QVBoxLayout();
+       layout->setSizeConstraint(QLayout::SetFixedSize);
+       setLayout(layout);
+
+       image = new QLabel();
+       image->setAlignment(Qt::AlignRight);
+       image->setPixmap(QPixmap(":/res/vj_title_small.png"));
+       layout->addWidget(image);
+
+//     QString s = QString(tr("SVN %1<br>")).arg(__DATE__);
+       QString s;// = QString("");
+       s.append(tr(
+               "<table>"
+               "<tr><td align='right'><b>Version: </b></td><td>"
+               VJ_RELEASE_VERSION " (" VJ_RELEASE_SUBVERSION ")"
+               "</td></tr>"
+               "<tr><td align='right'><b>Coders: </b></td><td>James L. Hammons (shamus)<br>Niels Wagenaar (nwagenaar)<br>Carwin Jones (Caz)<br>Adam Green</td></tr>"
+               "<tr><td align='right'><b>Testers: </b></td><td>Guruma</td></tr>"
+               "<tr><td align='right'><b>Homepage: </b></td><td>http://icculus.org/virtualjaguar/</td></tr>"
+               "</table>"
+               "<br><br>"
+               "<i>The Virtual Jaguar team would like to express their gratitude to:</i>"
+               "<br><br>"
+               "<b>Aaron Giles</b> for the original CoJag sources<br>"
+               "<b>David Raingeard</b> for the original Virtual Jaguar sources<br>"
+               "<b>Karl Stenerud</b> for his Musashi 68K emulator<br>"
+               "<b>Sam Lantinga</b> for his amazing SDL libraries<br>"
+               "<b>Ryan C. Gordon</b> for Virtual Jaguar's web presence<br>"
+               "<b>Curt Vendel</b> for various Jaguar & other goodies (you <i>rock!</i>)<br>"
+               "<b>Reboot</b> for reasons too numerous to mention<br>"
+               "<b>The Free Jaguar Project</b> (you know why) ;-)<br>"
+               "The guys over at <b>Atari Age</b> :-)<br>"
+               "<b>byuu</b> for BSNES and showing us what was possible"
+       ));
+       text = new QLabel(s);
+       layout->addWidget(text);
+}
diff --git a/src/gui/about.h b/src/gui/about.h
new file mode 100644 (file)
index 0000000..7397e3b
--- /dev/null
@@ -0,0 +1,42 @@
+//
+// about.h: Credits where credits are due ;-)
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+
+#ifndef __ABOUT_H__
+#define __ABOUT_H__
+
+#include <QtGui>
+
+class AboutWindow: public QWidget
+{
+       public:
+               AboutWindow(QWidget * parent = 0);
+
+       private:
+               QVBoxLayout * layout;
+               QLabel * text;
+               QLabel * image;
+};
+
+#endif // __ABOUT_H__
+
+
+#if 0
+class AboutWindow : public QbWindow {
+  Q_OBJECT
+
+public:
+  QVBoxLayout *layout;
+  struct Logo : public QWidget {
+    void paintEvent(QPaintEvent*);
+  } *logo;
+  QLabel *info;
+
+  AboutWindow();
+};
+
+extern AboutWindow *aboutWindow;
+#endif
diff --git a/src/gui/app.cpp b/src/gui/app.cpp
new file mode 100644 (file)
index 0000000..b313f66
--- /dev/null
@@ -0,0 +1,73 @@
+//
+// app.cpp - Qt-based GUI for Virtual Jaguar
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  12/23/2009  Created this file
+// JLH  01/21/2011  Added SDL initialization
+// JLH  06/26/2011  Added fix to keep SDL from hijacking main() on win32
+//
+
+#include "app.h"
+
+#include <SDL.h>
+#include <QApplication>
+#include "log.h"
+#include "mainwin.h"
+#include "types.h"
+
+#ifdef __GCCWIN32__
+// Apparently on win32, SDL is hijacking main from Qt. So let's do this:
+#undef main
+#endif
+
+// Here's the main application loop--short and simple...
+int main(int argc, char * argv[])
+{
+       if (argc > 1)
+       {
+               if (strcmp(argv[1], "--help") == 0)
+               {
+                       printf("Virtual Jaguar 2.0.0 help\n");
+                       printf("\n");
+                       printf("This is an experimental branch of Virtual Jaguar, how did you get it?\n");
+                       return 0;
+               }
+       }
+
+       Q_INIT_RESOURCE(virtualjaguar); // This must the same name as the exe filename
+//or is it the .qrc filename???
+       // This is so we can pass this stuff using signal/slot mechanism...
+//ick  int id = qRegisterMetaType<uint32>();
+
+       LogInit("virtualjaguar.log");                           // Init logfile
+       int retVal = -1;                                                        // Default is failure
+
+       // Set up SDL library
+       if (SDL_Init(SDL_INIT_JOYSTICK | SDL_INIT_AUDIO) < 0)
+       {
+               WriteLog("VJ: Could not initialize the SDL library: %s\n", SDL_GetError());
+       }
+       else
+       {
+               WriteLog("VJ: SDL (joystick, audio) successfully initialized.\n");
+               App app(argc, argv);                                    // Declare an instance of the application
+               retVal = app.exec();                                    // And run it!
+       }
+
+       LogDone();                                                                      // Close logfile
+       return retVal;
+}
+
+// Main app constructor--we stick globally accessible stuff here...
+
+App::App(int argc, char * argv[]): QApplication(argc, argv)
+{
+       mainWindow = new MainWin();
+       mainWindow->show();
+}
diff --git a/src/gui/app.h b/src/gui/app.h
new file mode 100644 (file)
index 0000000..2b57845
--- /dev/null
@@ -0,0 +1,30 @@
+//
+// app.h: Header file
+//
+// by James L. Hammons
+// (C) 2009 Underground Software
+//
+
+#ifndef __APP_H__
+#define __APP_H__
+
+//Hrm. uh??? I thought this wasn't the way to do this stuff...???
+#include <QtGui>
+
+// Forward declarations
+class MainWin;
+
+class App: public QApplication
+{
+       public:
+               App(int argc, char * argv[]);
+
+       private:
+               MainWin * mainWindow;
+
+       // Globally accessible stuff goes here...
+       // Although... Globally accessible stuff should go into settings.cpp...
+//     public:
+};
+
+#endif // __APP_H__
diff --git a/src/gui/button.cpp b/src/gui/button.cpp
deleted file mode 100644 (file)
index 052d19c..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-//
-// Button class
-//
-// by James L. Hammons
-//
-
-#include "button.h"
-
-//#include "font14pt.h"
-#include "guimisc.h"
-
-// Various constructors
-
-Button::Button(uint32 x/*= 0*/, uint32 y/*= 0*/, uint32 w/*= 0*/, uint32 h/*= 0*/):
-       Element(x, y, w, h), activated(false), clicked(false), inside(false),
-       fgColor(0xFFFFFFFF), bgColor(0xFF00FF00), pic(NULL), elementToTell(NULL)
-{
-}
-
-Button::Button(uint32 x, uint32 y, uint32 w, uint32 h, uint32 * p):
-       Element(x, y, w, h), activated(false), clicked(false), inside(false),
-       fgColor(0xFFFFFFFF), bgColor(0xFF00FF00), pic(p), elementToTell(NULL)
-{
-}
-
-// Button::Button(uint32 x, uint32 y, uint32 * p): Element(x, y, 0, 0),
-
-Button::Button(uint32 x, uint32 y, uint32 * p, uint32 * pH/*= NULL*/, uint32 * pD/*= NULL*/):
-       Element(x, y, 0, 0), activated(false), clicked(false), inside(false),
-       fgColor(0xFFFFFFFF), bgColor(0xFF00FF00), pic(p), picHover(pH), picDown(pD),
-       elementToTell(NULL)
-{
-       if (pic)
-               extents.w = pic[0], extents.h = pic[1];
-}
-
-Button::Button(uint32 x, uint32 y, uint32 w, uint32 h, std::string s):
-       Element(x, y, w, h), activated(false), clicked(false), inside(false),
-       fgColor(0xFFFFFFFF), bgColor(0xFF00FF00), pic(NULL), text(s), elementToTell(NULL)
-{
-}
-
-Button::Button(uint32 x, uint32 y, std::string s):
-       Element(x, y, 0, FONT_HEIGHT), activated(false), clicked(false), inside(false),
-       fgColor(0xFFFFFFFF), bgColor(0xFF00FF00), pic(NULL), text(s), elementToTell(NULL)
-{
-       extents.w = s.length() * FONT_WIDTH;
-}
-
-// Implementation
-
-void Button::HandleMouseMove(uint32 x, uint32 y)
-{
-       inside = Inside(x, y);
-}
-
-void Button::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
-{
-       if (inside)
-       {
-               if (mouseDown)
-                       clicked = true;
-
-               if (clicked && !mouseDown)
-               {
-                       clicked = false, activated = true;
-
-                       // Send a message that we're activated (if there's someone to tell, that is)
-                       if (elementToTell)
-                               elementToTell->Notify(this);
-               }
-       }
-       else
-               clicked = activated = false;
-}
-
-void Button::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       uint32 addr = (extents.x + offsetX) + ((extents.y + offsetY) * pitch);
-
-       if (text.length() > 0)                                                  // Simple text button
-//     if (pic == NULL)
-       {
-               for(uint32 y=0; y<extents.h; y++)
-               {
-                       for(uint32 x=0; x<extents.w; x++)
-                       {
-                               // Doesn't clip in y axis! !!! FIX !!!
-                               if (extents.x + x < pitch)
-                                       screenBuffer[addr + x + (y * pitch)]
-//                                     = (clicked && inside ? fgColor : (inside ? 0x43F0 : bgColor));
-//43F0 -> 010000 11111 10000 -> 0100 0001 1111 1111 1000 0100 -> 41 FF 84
-                                               = (clicked && inside ? fgColor : (inside ? 0xFF84FF41 : bgColor));
-                       }
-               }
-
-               DrawString(screenBuffer, extents.x + offsetX, extents.y + offsetY, false, "%s", text.c_str());
-       }
-       else                                                                                    // Graphical button
-       {
-               uint32 * picToShow = pic;
-
-               if (picHover != NULL && inside && !clicked)
-                       picToShow = picHover;
-
-               if (picDown != NULL && inside && clicked)
-                       picToShow = picDown;
-
-               DrawTransparentBitmapDeprecated(screenBuffer, extents.x + offsetX, extents.y + offsetY, picToShow);
-       }
-}
-
-bool Button::ButtonClicked(void)
-{
-       return activated;
-}
-
-void Button::SetNotificationElement(Element * e)
-{
-       elementToTell = e;
-}
diff --git a/src/gui/button.h b/src/gui/button.h
deleted file mode 100644 (file)
index c024e39..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-//
-// Button class
-//
-// by James L. Hammons
-//
-
-#ifndef __BUTTON_H__
-#define __BUTTON_H__
-
-#include <string>
-#include "element.h"
-
-class Button: public Element
-{
-       public:
-               Button(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0);
-               Button(uint32 x, uint32 y, uint32 w, uint32 h, uint32 * p);
-               Button(uint32 x, uint32 y, uint32 * p, uint32 * pH = NULL, uint32 * pD = NULL);
-               Button(uint32 x, uint32 y, uint32 w, uint32 h, std::string s);
-               Button(uint32 x, uint32 y, std::string s);
-               virtual void HandleKey(SDLKey key) {}
-               virtual void HandleMouseMove(uint32 x, uint32 y);
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element *) {}
-               bool ButtonClicked(void);
-               void SetNotificationElement(Element * e);
-
-       protected:
-               bool activated, clicked, inside;
-               uint32 fgColor, bgColor;
-               uint32 * pic, * picHover, * picDown;
-               std::string text;
-               Element * elementToTell;
-};
-
-#endif // __BUTTON_H__
diff --git a/src/gui/configdialog.cpp b/src/gui/configdialog.cpp
new file mode 100644 (file)
index 0000000..886cb05
--- /dev/null
@@ -0,0 +1,69 @@
+//
+// configdialog.cpp - Configuration dialog
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/29/2010  Created this file
+// JLH  06/23/2011  Added initial implementation
+//
+
+#include "configdialog.h"
+
+#include "generaltab.h"
+#include "controllertab.h"
+#include "settings.h"
+
+
+ConfigDialog::ConfigDialog(QWidget * parent/*= 0*/): QDialog(parent)
+{
+       tabWidget = new QTabWidget;
+       generalTab = new GeneralTab(this);
+       controllerTab = new ControllerTab(this);
+       tabWidget->addTab(generalTab, tr("General"));
+       tabWidget->addTab(controllerTab, tr("Controller"));
+
+       buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
+
+       connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
+       connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
+
+       QVBoxLayout * mainLayout = new QVBoxLayout;
+       mainLayout->addWidget(tabWidget);
+       mainLayout->addWidget(buttonBox);
+       setLayout(mainLayout);
+
+       setWindowTitle(tr("Virtual Jaguar Settings"));
+
+       LoadDialogFromSettings();
+}
+
+ConfigDialog::~ConfigDialog()
+{
+}
+
+void ConfigDialog::LoadDialogFromSettings(void)
+{
+       generalTab->edit1->setText(vjs.jagBootPath);
+       generalTab->edit2->setText(vjs.CDBootPath);
+       generalTab->edit3->setText(vjs.EEPROMPath);
+       generalTab->edit4->setText(vjs.ROMPath);
+
+       generalTab->useBIOS->setChecked(vjs.useJaguarBIOS);
+       generalTab->useDSP->setChecked(vjs.DSPEnabled);
+}
+
+void ConfigDialog::UpdateVJSettings(void)
+{
+       strcpy(vjs.jagBootPath, generalTab->edit1->text().toAscii().data());
+       strcpy(vjs.CDBootPath,  generalTab->edit2->text().toAscii().data());
+       strcpy(vjs.EEPROMPath,  generalTab->edit3->text().toAscii().data());
+       strcpy(vjs.ROMPath,     generalTab->edit4->text().toAscii().data());
+
+       vjs.useJaguarBIOS = generalTab->useBIOS->isChecked();
+       vjs.DSPEnabled    = generalTab->useDSP->isChecked();
+}
diff --git a/src/gui/configdialog.h b/src/gui/configdialog.h
new file mode 100644 (file)
index 0000000..99d4e16
--- /dev/null
@@ -0,0 +1,37 @@
+//
+// configdialog.h - Configuration dialog
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+
+#ifndef __CONFIGDIALOG_H__
+#define __CONFIGDIALOG_H__
+
+#include <QtGui>
+
+class GeneralTab;
+class ControllerTab;
+
+class ConfigDialog: public QDialog
+{
+       Q_OBJECT
+
+       public:
+               ConfigDialog(QWidget * parent = 0);
+               ~ConfigDialog();
+               void UpdateVJSettings(void);
+
+       private:
+               void LoadDialogFromSettings(void);
+
+       private:
+               QTabWidget * tabWidget;
+               QDialogButtonBox * buttonBox;
+
+       public:
+               GeneralTab * generalTab;
+               ControllerTab * controllerTab;
+};
+
+#endif // __CONFIGDIALOG_H__
diff --git a/src/gui/controllertab.cpp b/src/gui/controllertab.cpp
new file mode 100644 (file)
index 0000000..036855f
--- /dev/null
@@ -0,0 +1,76 @@
+//
+// controllertab.cpp: "Controller" tab on the config dialog
+//
+// Part of the Virtual Jaguar Project
+// (C) 2011 Underground Software
+// See the README and GPLv3 files for licensing and warranty information
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// WHO  WHEN        WHAT
+// ---  ----------  ------------------------------------------------------------
+// JLH  06/23/2011  Created this file
+
+#include "controllertab.h"
+
+
+ControllerTab::ControllerTab(QWidget * parent/*= 0*/): QWidget(parent)
+{
+       QLabel * img = new QLabel;
+       img->setPixmap(QPixmap(":/res/controller.png"));
+
+       QVBoxLayout * layout = new QVBoxLayout;
+       layout->addWidget(img);
+       setLayout(layout);
+}
+
+ControllerTab::~ControllerTab()
+{
+}
+
+#if 0
+       // Keybindings in order of U, D, L, R, C, B, A, Op, Pa, 0-9, #, *
+       vjs.p1KeyBindings[BUTTON_U] = settings.value("p1k_up", Qt::Key_Up).toInt();
+       vjs.p1KeyBindings[BUTTON_D] = settings.value("p1k_down", Qt::Key_Down).toInt();
+       vjs.p1KeyBindings[BUTTON_L] = settings.value("p1k_left", Qt::Key_Left).toInt();
+       vjs.p1KeyBindings[BUTTON_R] = settings.value("p1k_right", Qt::Key_Right).toInt();
+       vjs.p1KeyBindings[BUTTON_C] = settings.value("p1k_c", Qt::Key_Z).toInt();
+       vjs.p1KeyBindings[BUTTON_B] = settings.value("p1k_b", Qt::Key_X).toInt();
+       vjs.p1KeyBindings[BUTTON_A] = settings.value("p1k_a", Qt::Key_C).toInt();
+       vjs.p1KeyBindings[BUTTON_OPTION] = settings.value("p1k_option", Qt::Key_Apostrophe).toInt();
+       vjs.p1KeyBindings[BUTTON_PAUSE] = settings.value("p1k_pause", Qt::Key_Return).toInt();
+       vjs.p1KeyBindings[BUTTON_0] = settings.value("p1k_0", Qt::Key_0).toInt();
+       vjs.p1KeyBindings[BUTTON_1] = settings.value("p1k_1", Qt::Key_1).toInt();
+       vjs.p1KeyBindings[BUTTON_2] = settings.value("p1k_2", Qt::Key_2).toInt();
+       vjs.p1KeyBindings[BUTTON_3] = settings.value("p1k_3", Qt::Key_3).toInt();
+       vjs.p1KeyBindings[BUTTON_4] = settings.value("p1k_4", Qt::Key_4).toInt();
+       vjs.p1KeyBindings[BUTTON_5] = settings.value("p1k_5", Qt::Key_5).toInt();
+       vjs.p1KeyBindings[BUTTON_6] = settings.value("p1k_6", Qt::Key_6).toInt();
+       vjs.p1KeyBindings[BUTTON_7] = settings.value("p1k_7", Qt::Key_7).toInt();
+       vjs.p1KeyBindings[BUTTON_8] = settings.value("p1k_8", Qt::Key_8).toInt();
+       vjs.p1KeyBindings[BUTTON_9] = settings.value("p1k_9", Qt::Key_9).toInt();
+       vjs.p1KeyBindings[BUTTON_d] = settings.value("p1k_pound", Qt::Key_Slash).toInt();
+       vjs.p1KeyBindings[BUTTON_s] = settings.value("p1k_star", Qt::Key_Asterisk).toInt();
+
+       vjs.p2KeyBindings[BUTTON_U] = settings.value("p2k_up", Qt::Key_Up).toInt();
+       vjs.p2KeyBindings[BUTTON_D] = settings.value("p2k_down", Qt::Key_Down).toInt();
+       vjs.p2KeyBindings[BUTTON_L] = settings.value("p2k_left", Qt::Key_Left).toInt();
+       vjs.p2KeyBindings[BUTTON_R] = settings.value("p2k_right", Qt::Key_Right).toInt();
+       vjs.p2KeyBindings[BUTTON_C] = settings.value("p2k_c", Qt::Key_Z).toInt();
+       vjs.p2KeyBindings[BUTTON_B] = settings.value("p2k_b", Qt::Key_X).toInt();
+       vjs.p2KeyBindings[BUTTON_A] = settings.value("p2k_a", Qt::Key_C).toInt();
+       vjs.p2KeyBindings[BUTTON_OPTION] = settings.value("p2k_option", Qt::Key_Apostrophe).toInt();
+       vjs.p2KeyBindings[BUTTON_PAUSE] = settings.value("p2k_pause", Qt::Key_Return).toInt();
+       vjs.p2KeyBindings[BUTTON_0] = settings.value("p2k_0", Qt::Key_0).toInt();
+       vjs.p2KeyBindings[BUTTON_1] = settings.value("p2k_1", Qt::Key_1).toInt();
+       vjs.p2KeyBindings[BUTTON_2] = settings.value("p2k_2", Qt::Key_2).toInt();
+       vjs.p2KeyBindings[BUTTON_3] = settings.value("p2k_3", Qt::Key_3).toInt();
+       vjs.p2KeyBindings[BUTTON_4] = settings.value("p2k_4", Qt::Key_4).toInt();
+       vjs.p2KeyBindings[BUTTON_5] = settings.value("p2k_5", Qt::Key_5).toInt();
+       vjs.p2KeyBindings[BUTTON_6] = settings.value("p2k_6", Qt::Key_6).toInt();
+       vjs.p2KeyBindings[BUTTON_7] = settings.value("p2k_7", Qt::Key_7).toInt();
+       vjs.p2KeyBindings[BUTTON_8] = settings.value("p2k_8", Qt::Key_8).toInt();
+       vjs.p2KeyBindings[BUTTON_9] = settings.value("p2k_9", Qt::Key_9).toInt();
+       vjs.p2KeyBindings[BUTTON_d] = settings.value("p2k_pound", Qt::Key_Slash).toInt();
+       vjs.p2KeyBindings[BUTTON_s] = settings.value("p2k_star", Qt::Key_Asterisk).toInt();
+#endif
diff --git a/src/gui/controllertab.h b/src/gui/controllertab.h
new file mode 100644 (file)
index 0000000..ceff5bf
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef __CONTROLLERTAB_H__
+#define __CONTROLLERTAB_H__
+
+#include <QtGui>
+
+class ControllerTab: public QWidget
+{
+       Q_OBJECT
+
+       public:
+               ControllerTab(QWidget * parent = 0);
+               ~ControllerTab();
+
+       public:
+               QCheckBox * antialiasChk;
+};
+
+#endif // __CONTROLLERTAB_H__
diff --git a/src/gui/element.cpp b/src/gui/element.cpp
deleted file mode 100644 (file)
index 1aa63f7..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-//
-// GUI element base class
-//
-// by James L. Hammons
-//
-
-#include "element.h"
-
-// Initialize class variables (Element)
-
-uint32 * Element::screenBuffer = NULL;
-uint32 Element::pitch = 0;
-
-bool Element::Inside(uint32 x, uint32 y)
-{
-       return (x >= (uint32)extents.x && x < (uint32)(extents.x + extents.w)
-               && y >= (uint32)extents.y && y < (uint32)(extents.y + extents.h) ? true : false);
-}
diff --git a/src/gui/element.h b/src/gui/element.h
deleted file mode 100644 (file)
index b54fc7c..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-//
-// GUI element base class
-//
-// by James L. Hammons
-//
-
-#ifndef __ELEMENT_H__
-#define __ELEMENT_H__
-
-#include "SDL.h"
-#include "types.h"
-
-class Element
-{
-       public:
-               Element(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0)
-                       { extents.x = x, extents.y = y, extents.w = w, extents.h = h; }
-               // These are "pure" virtual functions...
-               virtual void HandleKey(SDLKey key) = 0;
-               virtual void HandleMouseMove(uint32 x, uint32 y) = 0;
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown) = 0;
-               virtual void Draw(uint32, uint32) = 0;
-               virtual void Notify(Element *) = 0;
-//Needed?              virtual ~Element() = 0;
-//We're not allocating anything in the base class, so the answer would be NO.
-               bool Inside(uint32 x, uint32 y);
-
-               // Class method
-               static void SetScreenAndPitch(uint32 * s, uint32 p) { screenBuffer = s, pitch = p; }
-
-       protected:
-               SDL_Rect extents;
-               uint32 state;
-
-               // Class variables...
-               static uint32 * screenBuffer;
-               static uint32 pitch;
-};
-
-#endif // __ELEMENT_H__
diff --git a/src/gui/filelist.cpp b/src/gui/filelist.cpp
deleted file mode 100644 (file)
index e2bcb75..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-//
-// FileList class
-//
-// by James L. Hammons
-//
-
-#include "filelist.h"
-
-#include <sys/types.h>                                                         // For MacOS <dirent.h> dependency
-#include <dirent.h>
-#include "settings.h"
-#include "file.h"
-#include "guimisc.h"
-
-//Need 4 buttons, one scrollbar...
-FileList::FileList(uint32 x, uint32 y, uint32 w, uint32 h): Window(x, y, w, h)
-{
-       files = new ListBox(8, 8, w - 16, h - 32);
-       AddElement(files);
-       load = new Button(8, h - 16, " Load ");
-       AddElement(load);
-       load->SetNotificationElement(this);
-
-#warning !!! FIX !!! Directory might not exist--this shouldn't cause VJ to crash!
-       DIR * dp = opendir(vjs.ROMPath);
-       dirent * de;
-
-       if (dp != NULL)
-       {
-               while ((de = readdir(dp)) != NULL)
-               {
-                       char * ext = strrchr(de->d_name, '.');
-
-                       if (ext != NULL)
-                               if (strcasecmp(ext, ".zip") == 0 || strcasecmp(ext, ".j64") == 0
-                                       || strcasecmp(ext, ".abs") == 0 || strcasecmp(ext, ".jag") == 0
-                                       || strcasecmp(ext, ".rom") == 0)
-                                       files->AddItem(std::string(de->d_name));
-               }
-
-               closedir(dp);
-       }
-       else
-       {
-//Give a diagnostic message here so that the (l)user can figure out what went wrong. !!! FIX !!!
-       }
-}
-
-void FileList::HandleKey(SDLKey key)
-{
-       if (key == SDLK_RETURN)
-               Notify(load);
-       else
-               Window::HandleKey(key);
-}
-
-void FileList::HandleMouseMove(uint32 x, uint32 y)
-{
-       Window::HandleMouseMove(x, y);
-}
-
-void FileList::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
-{
-       Window::HandleMouseButton(x, y, mouseDown);
-}
-
-void FileList::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       Window::Draw(offsetX, offsetY);
-}
-
-extern Window * ResetJaguar(void);
-#warning ICKY KLUDGE--FIX THIS MESS!!!
-void FileList::Notify(Element * e)
-{
-       if (e == load)
-       {
-               char filename[MAX_PATH];
-               strcpy(filename, vjs.ROMPath);
-
-               if (strlen(filename) > 0)
-                       if (filename[strlen(filename) - 1] != '/')
-                               strcat(filename, "/");
-
-               strcat(filename, files->GetSelectedItem().c_str());
-
-//             uint32 romSize = JaguarLoadROM(jaguar_mainRom, filename);
-//             JaguarLoadCart(jaguar_mainRom, filename);
-               if (JaguarLoadFile(filename))
-               {
-                       SDL_Event event;
-                       event.type = SDL_USEREVENT, event.user.code = WINDOW_CLOSE;
-                       SDL_PushEvent(&event);
-
-                       event.type = SDL_USEREVENT, event.user.code = MENU_ITEM_CHOSEN;
-                       event.user.data1 = (void *)ResetJaguar;
-               SDL_PushEvent(&event);
-               }
-               else
-               {
-                       SDL_Event event;
-                       event.type = SDL_USEREVENT, event.user.code = WINDOW_CLOSE;
-                       SDL_PushEvent(&event);
-
-                       // Handle the error, but don't run...
-                       // Tell the user that we couldn't run their file for some reason... !!! FIX !!!
-//how to kludge: Make a function like ResetJaguar which creates the dialog window
-               }
-       }
-       else
-               Window::Notify(e);
-}
diff --git a/src/gui/filelist.h b/src/gui/filelist.h
deleted file mode 100644 (file)
index 943cbd7..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// FileList class
-//
-// by James L. Hammons
-//
-
-#ifndef __FILELIST_H__
-#define __FILELIST_H__
-
-#include "window.h"
-#include "listbox.h"
-
-class FileList: public Window
-{
-       public:
-               FileList(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0);
-               virtual ~FileList() {}
-               virtual void HandleKey(SDLKey key);
-               virtual void HandleMouseMove(uint32 x, uint32 y);
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element * e);
-
-       protected:
-               ListBox * files;
-               Button * load;
-};
-
-#endif // __FILELIST_H__
diff --git a/src/gui/filelistmodel.cpp b/src/gui/filelistmodel.cpp
new file mode 100644 (file)
index 0000000..626b296
--- /dev/null
@@ -0,0 +1,215 @@
+//
+// filepicker.cpp - A ROM chooser
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  02/01/2010  Created this file
+//
+
+// Note that we have to put in convenience functions to the model for adding data
+// and calling reset() to tell the view(s) that the model has changed. So that much
+// should be simple. According to the docs, we have to reimplement flags() in the
+// QAbstractListModel subclass, but in the example given below they don't. Not sure
+// if it's necessary or not.
+
+#include "filelistmodel.h"
+
+
+FileListModel::FileListModel(QObject * parent/*= 0*/): QAbstractListModel(parent)
+{
+}
+
+int FileListModel::rowCount(const QModelIndex & parent/*= QModelIndex()*/) const
+{
+//     return pixList.size();
+//     return dbIndex.size();
+       return list.size();
+}
+
+QVariant FileListModel::data(const QModelIndex & index, int role) const
+{
+//     return QVariant();
+//     return pixList.at(index.row());
+//     return (uint)dbIndex.at(index.row());
+//It could be that this is fucking things up...
+#if 0
+       if (role == Qt::DecorationRole)
+               return list.at(index.row()).label;
+       else if (role == Qt::DisplayRole)
+               return (uint)list.at(index.row()).dbIndex;
+       else if (role == Qt::EditRole)
+               return list.at(index.row()).filename;
+       else if (role == Qt::WhatsThisRole)
+               return (uint)list.at(index.row()).fileSize;
+       else
+               return QVariant();
+#else
+       if (role == FLM_LABEL)
+               return list.at(index.row()).label;
+       else if (role == FLM_INDEX)
+               return (uint)list.at(index.row()).dbIndex;
+       else if (role == FLM_FILENAME)
+               return list.at(index.row()).filename;
+       else if (role == FLM_FILESIZE)
+               return (uint)list.at(index.row()).fileSize;
+       else if (role == FLM_UNIVERSALHDR)
+               return (uint)list.at(index.row()).hasUniversalHeader;
+       else if (role == FLM_FILETYPE)
+               return (uint)list.at(index.row()).fileType;
+       else if (role == FLM_CRC)
+               return (uint)list.at(index.row()).crc;
+
+       return QVariant();
+#endif
+}
+
+QVariant FileListModel::headerData(int/* section*/, Qt::Orientation/* orientation*/, int role/*= Qt::DisplayRole*/) const
+{
+#if 0
+       // Not sure that this is necessary for our purposes...
+       // Especially since this model would never make use of this info...
+       if (role != Qt::DisplayRole)
+               return QVariant();
+
+       if (orientation == Qt::Horizontal)
+               return QString("Column %1").arg(section);
+       else
+               return QString("Row %1").arg(section);
+#else
+       // This seems more like what we want...
+       if (role == Qt::SizeHintRole)
+               return QSize(1, 1);
+
+       return QVariant();
+#endif
+}
+
+/*
+void FileListModel::AddData(QIcon pix)
+{
+       pixList.push_back(pix);
+       reset();
+}
+
+void FileListModel::AddData(unsigned long index)
+{
+       dbIndex.push_back(index);
+       reset();
+}
+*/
+
+void FileListModel::AddData(unsigned long index, QString str, QImage img, unsigned long size)
+{
+       // Assuming that both QString and QImage have copy constructors, this should work.
+       FileListData data;
+
+       data.dbIndex = index;
+       data.fileSize = size;
+       data.filename = str;
+       data.label = img;
+
+       list.push_back(data);
+       reset();
+}
+
+void FileListModel::AddData(unsigned long index, QString str, QImage img, unsigned long size, bool univHdr, uint32_t type, uint32_t fileCrc)
+{
+       // Assuming that both QString and QImage have copy constructors, this should work.
+       FileListData data;
+
+       data.dbIndex = index;
+       data.fileSize = size;
+       data.filename = str;
+       data.label = img;
+       data.hasUniversalHeader = univHdr;
+       data.fileType = type;
+       data.crc = fileCrc;
+
+       list.push_back(data);
+//This is probably not the best way to do this, it prevents the user from using the
+//list while it populates.
+#warning "!!! AddData calls reset() for every addition, this is bad !!!"
+       reset();
+}
+
+void FileListModel::ClearData(void)
+{
+       if (list.size() == 0)
+               return;
+
+       beginResetModel();
+       list.clear();
+       endResetModel();
+}
+
+//FileListData FileListModel::GetData(const QModelIndex & index) const
+//{
+//     return list.at(index.row());
+//}
+
+#if 0
+
+class StringListModel : public QAbstractListModel
+{
+       Q_OBJECT
+
+       public:
+               StringListModel(const QStringList &strings, QObject *parent = 0)
+                       : QAbstractListModel(parent), stringList(strings) {}
+
+               int rowCount(const QModelIndex &parent = QModelIndex()) const;
+               QVariant data(const QModelIndex &index, int role) const;
+               QVariant headerData(int section, Qt::Orientation orientation,
+                                                       int role = Qt::DisplayRole) const;
+
+       private:
+               QStringList stringList;
+};
+
+int StringListModel::rowCount(const QModelIndex &parent) const
+{
+       return stringList.count();
+}
+
+QVariant StringListModel::data(const QModelIndex &index, int role) const
+{
+       if (!index.isValid())
+               return QVariant();
+
+       if (index.row() >= stringList.size())
+               return QVariant();
+
+       if (role == Qt::DisplayRole)
+               return stringList.at(index.row());
+       else
+               return QVariant();
+}
+
+
+QVariant StringListModel::headerData(int section, Qt::Orientation orientation, int role) const
+{
+       if (role != Qt::DisplayRole)
+               return QVariant();
+
+       if (orientation == Qt::Horizontal)
+               return QString("Column %1").arg(section);
+       else
+               return QString("Row %1").arg(section);
+}
+
+
+
+ void ImageModel::setImage(const QImage &image)
+ {
+     modelImage = image;
+     reset();
+ }
+
+The QAbstractItemModel::reset() call tells the view(s) that the model has changed.
+
+#endif
diff --git a/src/gui/filelistmodel.h b/src/gui/filelistmodel.h
new file mode 100644 (file)
index 0000000..a3ab660
--- /dev/null
@@ -0,0 +1,59 @@
+//
+// filelistmodel.h: Class definition
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+
+#ifndef __FILELISTMODEL_H__
+#define __FILELISTMODEL_H__
+
+#include <QtGui>
+#include <vector>
+#include <stdint.h>
+
+struct FileListData
+{
+//     FileListData(unsigned long ul=0, QString str="", QImage img=QImage()): dbIndex(ul), filename(str), label(img) {}
+//     FileListData(unsigned long ul=0, QString str, QImage img): dbIndex(ul), filename(str), label(img) {}
+
+       unsigned long dbIndex;
+       unsigned long fileSize;
+       QString filename;
+       QImage label;
+       bool hasUniversalHeader;
+       uint32_t fileType;
+       uint32_t crc;
+};
+
+//hm.
+#define FLM_INDEX                      (Qt::UserRole + 1)
+#define FLM_FILESIZE           (Qt::UserRole + 2)
+#define FLM_FILENAME           (Qt::UserRole + 3)
+#define FLM_LABEL                      (Qt::UserRole + 4)
+#define FLM_UNIVERSALHDR       (Qt::UserRole + 5)
+#define FLM_FILETYPE           (Qt::UserRole + 6)
+#define FLM_CRC                                (Qt::UserRole + 7)
+
+class FileListModel: public QAbstractListModel
+{
+       public:
+               FileListModel(QObject * parent = 0);
+
+               int rowCount(const QModelIndex & parent = QModelIndex()) const;
+               QVariant data(const QModelIndex & index, int role) const;
+               QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
+
+//             void AddData(QIcon pix);
+//             void AddData(unsigned long);
+               void AddData(unsigned long, QString, QImage, unsigned long);
+               void AddData(unsigned long, QString, QImage, unsigned long, bool, uint32_t, uint32_t);
+               void ClearData(void);
+
+//             FileListData GetData(const QModelIndex & index) const;
+
+       private:
+               std::vector<FileListData> list;
+};
+
+#endif // __FILELISTMODEL_H__
diff --git a/src/gui/filepicker.cpp b/src/gui/filepicker.cpp
new file mode 100644 (file)
index 0000000..06e517d
--- /dev/null
@@ -0,0 +1,428 @@
+//
+// filepicker.cpp - A ROM chooser
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/22/2010  Created this file
+// JLH  02/06/2010  Modified to use Qt model/view framework
+// JLH  03/08/2010  Added large cart view and info text
+//
+
+#include "filepicker.h"
+
+#include "file.h"
+#include "filedb.h"
+#include "filelistmodel.h"
+#include "filethread.h"
+#include "imagedelegate.h"
+//#include "settings.h"
+//#include "types.h"
+
+/*
+Our strategy here is like so:
+Look at the files in the directory pointed to by ROMPath.
+For each file in the directory, take the CRC32 of it and compare it to the CRC
+in the romList[]. If there's a match, put it in a list and note it's index value
+in romList for future reference.
+
+When constructing the list, use the index to pull up an image of the cart and
+put that in the list. User picks from a graphical image of the cart.
+
+Ideally, the label will go into the archive along with the ROM image, but that's
+for the future...
+Maybe box art, screenshots will go as well...
+
+I'm thinking compatibility info should be displayed as well... Just to stop the
+inevitable stupid questions from people too lazy to do basic research for themselves.
+
+
+Data strategy:
+
+- Should keep a QImage of the blank cart with blank label
+- Should keep a QImage of the blank cart? (For overpainting the ROMs label)
+- Should we have a special Alpine image? Floppy image (for COF/ABS)?
+
+- Need some way of keeping track of cart size and compatibility info
+  [compat info needs to be BAD DUMP or % of what works]
+- Need to properly scale the thumbnails images in the list
+*/
+
+//could use Window as well...
+//FilePickerWindow::FilePickerWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog)
+FilePickerWindow::FilePickerWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Window),
+       currentFile("")
+{
+       setWindowTitle(tr("Insert Cartridge..."));
+
+//is there any reason why this must be cast as a QAbstractListModel? No
+//Also, need to think about data structure for the model...
+       model = new FileListModel;
+       fileList = new QListView;
+       fileList->setModel(model);
+//     fileList->setItemDelegate(new ImageDelegate(this));
+       fileList->setItemDelegate(new ImageDelegate());
+#if 0
+       //nope.
+//     fileList->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+//     fileList->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+//small problem with this is that it doesn't take scrollbar into account...
+QSize sbSize = fileList->verticalScrollBar()->minimumSizeHint();
+printf("VSB minimumSizeHint: %u, %u\n", sbSize.width(), sbSize.height());
+QSize sbSize2 = fileList->verticalScrollBar()->sizeHint();
+printf("VSB sizeHint: %u, %u\n", sbSize2.width(), sbSize2.height());
+QRect sbRect = fileList->verticalScrollBar()->normalGeometry();
+printf("VSB normalGeometry: %u, %u\n", sbRect.width(), sbRect.height());
+QSize sbSize3 = fileList->verticalScrollBar()->size();
+printf("VSB size: %u, %u\n", sbSize3.width(), sbSize3.height());
+//     int sbWidth = fileList->verticalScrollBar()->width();
+       int sbWidth = fileList->verticalScrollBar()->size().width();
+       fileList->setFixedWidth((488/4) + 4 + sbWidth);//ick
+#else
+       // This sets it to the "too large size" as the minimum!
+       QScrollBar * vsb = new QScrollBar(Qt::Vertical, this);
+       int sbWidth = vsb->size().width();
+       printf("VSB size width: %u\n", sbWidth);
+       int sbWidth2 = vsb->sizeHint().width();
+       printf("VSB sizeHint width: %u\n", sbWidth2);
+       delete vsb;
+
+//     fileList->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
+//     fileList->verticalScrollBar()->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
+       fileList->setFixedWidth((488/4) + 4 + sbWidth);//ick
+#endif
+
+//     QVBoxLayout * layout = new QVBoxLayout;
+       QHBoxLayout * layout = new QHBoxLayout;
+       setLayout(layout);
+       layout->addWidget(fileList);
+
+       // Weird note: This layout has to be added *before* putting anything into it...
+       QVBoxLayout * vLayout = new QVBoxLayout;
+       layout->addLayout(vLayout);
+
+       cartImage = new QLabel;
+       QImage cartImg(":/res/cart-blank.png");
+       QPainter painter(&cartImg);
+       painter.drawPixmap(23, 87, QPixmap(":/res/label-blank.png"));
+       painter.end();
+       cartImage->setPixmap(QPixmap::fromImage(cartImg));
+       cartImage->setMargin(4);
+       vLayout->addWidget(cartImage);
+
+       title = new QLabel(QString(tr("<h2>...</h2>")));
+       title->setMargin(6);
+       title->setAlignment(Qt::AlignCenter);
+       vLayout->addWidget(title);
+
+#if 1
+       QHBoxLayout * dataLayout = new QHBoxLayout;
+       vLayout->addLayout(dataLayout);
+
+       QLabel * labels = new QLabel(QString(tr(
+               "<b>Type: </b><br>"
+               "<b>CRC32: </b><br>"
+               "<b>Compatibility: </b><br>"
+               "<b>Notes:</b>"
+       )));
+       labels->setAlignment(Qt::AlignRight);
+       labels->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
+       dataLayout->addWidget(labels);
+       data = new QLabel(QString(tr(
+               "?MB Cartridge<br>"
+               "????????<br>"
+               "???<br>"
+               "???"
+       )));
+       data->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+       dataLayout->addWidget(data);
+
+//#warning "!!! Icon size for pushbutton is tiny !!!"
+       insertCart = new QPushButton(this);
+       insertCart->setIconSize(QSize(40, 40));
+       insertCart->setIcon(QIcon(":/res/insert.png"));
+       insertCart->setDefault(true);                           // We want this button to be the default
+       insertCart->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
+       dataLayout->addWidget(insertCart);
+#else
+       QLabel * text2 = new QLabel(QString(tr(
+               "<table>"
+               "<tr><td align='right'><b>Type: </b></td><td>4MB Cartridge</td></tr>"
+               "<tr><td align='right'><b>CRC32: </b></td><td>FEDCBA98</td></tr>"
+               "<tr><td align='right'><b>Compatibility: </b></td><td>DOES NOT WORK</td></tr>"
+               "<tr><td align='right'><b>Notes: </b></td><td>Universal Header detected; Requires DSP</td></tr>"
+               "</table>"
+       )));
+       vLayout->addWidget(text2);
+#endif
+
+       fileThread = new FileThread(this);
+//     connect(fileThread, SIGNAL(FoundAFile(unsigned long)), this, SLOT(AddFileToList(unsigned long)));
+//     connect(fileThread, SIGNAL(FoundAFile2(unsigned long, QString, QImage *, unsigned long)), this, SLOT(AddFileToList2(unsigned long, QString, QImage *, unsigned long)));
+       connect(fileThread, SIGNAL(FoundAFile3(unsigned long, QString, QImage *,
+               unsigned long, bool, unsigned long, unsigned long)), this,
+               SLOT(AddFileToList3(unsigned long, QString, QImage *, unsigned long,
+               bool, unsigned long, unsigned long)));
+
+// Let's defer this to the main window, so we can have some control over when this is done.
+//     fileThread->Go();
+/*
+New sizes: 373x172 (label), 420x340 (cart)
+*/
+
+//     QItemSelectionModel * ism = fileList->selectionModel();
+//     connect(ism, SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(UpdateSelection(const QModelIndex &, const QModelIndex &)));
+       connect(fileList->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(UpdateSelection(const QModelIndex &, const QModelIndex &)));
+
+       connect(insertCart, SIGNAL(clicked()), this, SLOT(LoadButtonPressed()));
+}
+
+QString FilePickerWindow::GetSelectedPrettyName(void)
+{
+       return prettyFilename;
+}
+
+void FilePickerWindow::ScanSoftwareFolder(bool allow/*= false*/)
+{
+       // "allow" is whether or not to allow scanning for unknown software.
+       model->ClearData();
+       fileThread->Go(allow);
+}
+
+//
+// This slot gets called by the FileThread's run() function when it finds a
+// match in the filesystem to a ROM on our CRC list.
+//
+void FilePickerWindow::AddFileToList(unsigned long index)
+{
+printf("FilePickerWindow: Found match [%s]...\n", romList[index].name);
+       // NOTE: The model *ignores* what you send it, so this is crap. !!! FIX !!! [DONE, somewhat]
+//     model->AddData(QIcon(":/res/generic.png"));
+//     model->AddData(index);
+}
+
+void FilePickerWindow::AddFileToList2(unsigned long index, QString str, QImage * img, unsigned long size)
+{
+if (index != 0xFFFFFFFF)
+       printf("FilePickerWindow(2): Found match [%s]...\n", romList[index].name);
+
+       if (img)
+       {
+               model->AddData(index, str, *img, size);
+//It would be better to pass the pointer into the model though...
+               delete img;
+       }
+       else
+               model->AddData(index, str, QImage(), size);
+}
+
+void FilePickerWindow::AddFileToList3(unsigned long index, QString str, QImage * img, unsigned long size, bool haveUniversalHeader, unsigned long fileType, unsigned long crc)
+{
+if (index != 0xFFFFFFFF)
+       printf("FilePickerWindow(3): Found match [%s]...\n", romList[index].name);
+
+       if (img)
+       {
+               model->AddData(index, str, *img, size, haveUniversalHeader, fileType, crc);
+//It would be better to pass the pointer into the model though...
+               delete img;
+       }
+       else
+               model->AddData(index, str, QImage(), size, haveUniversalHeader, fileType, crc);
+}
+
+void FilePickerWindow::LoadButtonPressed(void)
+{
+       // TODO: Get the text of the current selection, call the MainWin slot for loading
+       emit(RequestLoad(currentFile));
+       this->hide();
+}
+
+//
+// This slot gets called when the QListView gets clicked on. Updates
+// the cart graphic and accompanying text.
+//
+void FilePickerWindow::UpdateSelection(const QModelIndex & current, const QModelIndex &/*previous*/)
+{
+#if 0
+       QString s = current.model()->data(current, Qt::EditRole).toString();
+       unsigned long i = current.model()->data(current, Qt::DisplayRole).toUInt();
+       QImage label = current.model()->data(current, Qt::DecorationRole).value<QImage>();
+//     printf("FPW: %s\n", s.toAscii().data());
+       unsigned long fileSize = current.model()->data(current, Qt::WhatsThisRole).toUInt();
+#else
+//     QString s = current.model()->data(current, FLM_FILENAME).toString();
+       currentFile = current.model()->data(current, FLM_FILENAME).toString();
+       unsigned long i = current.model()->data(current, FLM_INDEX).toUInt();
+       QImage label = current.model()->data(current, FLM_LABEL).value<QImage>();
+       unsigned long fileSize = current.model()->data(current, FLM_FILESIZE).toUInt();
+       bool haveUniversalHeader = current.model()->data(current, FLM_UNIVERSALHDR).toBool();
+       unsigned long fileType = current.model()->data(current, FLM_FILETYPE).toUInt();
+       uint32 crc = (uint32)current.model()->data(current, FLM_CRC).toUInt();
+//     printf("FPW: %s\n", s.toAscii().data());
+       bool haveUnknown = (i == 0xFFFFFFFF ? true : false);
+#endif
+
+       // Disallow loading completely unknown files, but allow all others.
+       insertCart->setEnabled(haveUnknown && (fileType == JST_NONE) ? false : true);
+//hm.
+//currentFile = s;
+
+//373x172 is label size...
+//365x168 now...
+       if (!label.isNull())
+       {
+/*
+       QImage cartImg(":/res/cart-blank.png");
+       QPainter painter(&cartImg);
+       painter.drawPixmap(23, 87, QPixmap(":/res/label-blank.png"));
+       painter.end();
+       cartSmall = cartImg.scaled(488/4, 395/4, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+*/
+               QImage cart(":/res/cart-blank.png");
+               QPainter painter(&cart);
+//Though this should probably be done when this is loaded, instead of every time here...
+//QImage scaledImg = label.scaled(373, 172, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+//painter.drawPixmap(23, 87, QPixmap::fromImage(scaledImg));
+               // Now, looks like it is...
+//             painter.drawPixmap(23, 87, QPixmap::fromImage(label));
+               painter.drawPixmap(27, 89, QPixmap::fromImage(label));
+//             painter.drawPixmap(23, 87, 373, 172, QPixmap::fromImage(label));
+
+// Well, heck. This should be done to the label *before* we get here.
+               painter.drawPixmap(27, 89, QPixmap::fromImage(QImage(":/res/upper-left.png")));
+               painter.drawPixmap(27+355, 89, QPixmap::fromImage(QImage(":/res/upper-right.png")));
+
+               painter.end();
+               cartImage->setPixmap(QPixmap::fromImage(cart));
+       }
+       else
+       {
+               // We should try to be intelligent with our updates here, and only redraw when
+               // we're going from a selection with a label to a selection without. Now, we
+               // redraw regardless.
+               QImage cart;
+
+// We now have to sources of data for the passed in files:
+// - The file DB
+// - The file type detection
+// This means we have to be mindful of what's passed back by that stuff.
+// We can assume that if it wasn't found in the DB, then the fileType
+// should be valid.
+// The DB takes precedence over the fileType.
+               if ((!haveUnknown && (romList[i].flags & FF_ROM))
+                       || (haveUnknown && (fileType == JST_ROM)))
+               {
+                       cart = QImage(":/res/cart-blank.png");
+                       QPainter painter(&cart);
+                       painter.drawPixmap(27, 89, QPixmap::fromImage(QImage(":/res/label-blank.png")));
+                       painter.end();
+               }
+               else if ((!haveUnknown && (romList[i].flags & FF_ALPINE))
+                       || (haveUnknown && (fileType == JST_ALPINE)))
+               {
+                       cart = QImage(":/res/alpine-file.png");
+               }
+               else if (haveUnknown && (fileType == JST_ABS_TYPE1 || fileType == JST_ABS_TYPE2 || fileType == JST_JAGSERVER))
+               {
+                       cart = QImage(":/res/homebrew-file.png");
+               }
+               else
+                       cart = QImage(":/res/unknown-file.png");
+
+               cartImage->setPixmap(QPixmap::fromImage(cart));
+       }
+
+//1048576
+//2097152
+//4194304
+       if (!haveUnknown)
+               prettyFilename = romList[i].name;
+       else
+       {
+               int lastSlashPos = currentFile.lastIndexOf('/');
+               prettyFilename = "\"" + currentFile.mid(lastSlashPos + 1) + "\"";
+       }
+
+       title->setText(QString("<h2>%1</h2>").arg(prettyFilename));
+
+//Kludge for now, we'll have to fix this later...
+// So let's fix it now!
+       QString fileTypeString, crcString, notes, compatibility;
+
+#if 0
+       if (!haveUnknown)
+       {
+               if (romList[i].flags & FF_ROM)
+                       fileTypeString = QString(tr("%1MB Cartridge")).arg(fileSize / 1048576);
+               else if (romList[i].flags & FF_ALPINE)
+                       fileTypeString = QString(tr("%1MB Alpine ROM")).arg(fileSize / 1048576);
+               else
+                       fileTypeString = QString(tr("*** UNKNOWN *** (%1 bytes)")).arg(fileSize);
+       }
+#else
+       if ((!haveUnknown && (romList[i].flags & FF_ROM)) || (haveUnknown && (fileType == JST_ROM)))
+               fileTypeString = QString(tr("%1MB Cartridge")).arg(fileSize / 1048576);
+       else if ((!haveUnknown && (romList[i].flags & FF_ALPINE)) || (haveUnknown && (fileType == JST_ALPINE)))
+               fileTypeString = QString(tr("%1MB Alpine ROM")).arg(fileSize / 1048576);
+       else if (haveUnknown && (fileType == JST_ABS_TYPE1 || fileType == JST_ABS_TYPE2))
+               fileTypeString = QString(tr("ABS/COF Executable (%1 bytes)")).arg(fileSize);
+       else if (haveUnknown && (fileType == JST_JAGSERVER))
+               fileTypeString = QString(tr("Jaguar Server Executable (%1 bytes)")).arg(fileSize);
+       else
+               fileTypeString = QString(tr("*** UNKNOWN *** (%1 bytes)")).arg(fileSize);
+#endif
+
+//     crcString = QString("%1").arg(romList[i].crc32, 8, 16, QChar('0')).toUpper();
+       crcString = QString("%1").arg(crc, 8, 16, QChar('0')).toUpper();
+
+       if (!haveUnknown && (romList[i].flags & FF_NON_WORKING))
+               compatibility = "DOES NOT WORK";
+       else
+               compatibility = "Unknown";
+
+       // This is going to need some formatting love before long...
+       if (!haveUnknown && (romList[i].flags & FF_BAD_DUMP))
+               notes = "<b>BAD DUMP</b>";
+
+       if (haveUniversalHeader)
+               notes += " Universal Header detected";
+
+       if (!haveUnknown && (romList[i].flags & FF_REQ_DSP))
+               notes += " Requires DSP";
+
+       if (!haveUnknown && (romList[i].flags & FF_VERIFIED))
+               notes += " <i>(Verified)</i>";
+
+       data->setText(QString("%1<br>%2<br>%3<br>%4")
+               .arg(fileTypeString).arg(crcString).arg(compatibility).arg(notes));
+}
+
+/*
+    Super Duper Awesome Guy (World)
+
+         Type: 4MB Cartridge
+        CRC32: FEDCBA98
+Compatibility: DOES NOT WORK
+        Notes: Universal Header detected; Requires DSP
+
+
+    Stupid Homebrew Game That Sux
+
+         Type: ABS/COF Executable (43853 bytes)
+        CRC32: 76543210
+Compatibility: Unknown
+        Notes: $4000 Load, $4000 Run
+
+
+    Action Hopscotch Plus (Prototype)
+
+         Type: 2MB Alpine ROM
+        CRC32: 44889921
+Compatibility: 80% (or ****)
+        Notes: EEPROM available
+*/
diff --git a/src/gui/filepicker.h b/src/gui/filepicker.h
new file mode 100644 (file)
index 0000000..64a9e23
--- /dev/null
@@ -0,0 +1,48 @@
+//
+// filepicker.h - A ROM chooser
+//
+
+#include <QtGui>
+#include "types.h"
+
+// Forward declarations
+class QListWidget;
+class FileThread;
+class FileListModel;
+class QListView;
+
+class FilePickerWindow: public QWidget
+{
+       // Once we have signals/slots, we need this...
+       Q_OBJECT
+
+       public:
+               FilePickerWindow(QWidget * parent = 0);
+               QString GetSelectedPrettyName(void);
+               void ScanSoftwareFolder(bool allow = false);
+
+       public slots:
+               void AddFileToList(unsigned long index);
+               void AddFileToList2(unsigned long index, QString, QImage *, unsigned long size);
+               void AddFileToList3(unsigned long index, QString, QImage *, unsigned long size, bool, unsigned long, unsigned long);
+               void UpdateSelection(const QModelIndex &, const QModelIndex &);
+               void LoadButtonPressed(void);
+
+       signals:
+               void RequestLoad(QString);
+
+       protected:
+//             void PopulateList(void);
+
+       private:
+               QString currentFile;
+               QString prettyFilename;
+               QListWidget * fileList2;
+               FileThread * fileThread;
+               FileListModel * model;
+               QListView * fileList;
+               QLabel * cartImage;
+               QLabel * title;
+               QLabel * data;
+               QPushButton * insertCart;
+};
diff --git a/src/gui/filethread.cpp b/src/gui/filethread.cpp
new file mode 100644 (file)
index 0000000..28d7389
--- /dev/null
@@ -0,0 +1,197 @@
+//
+// filethread.cpp - File discovery thread
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/28/2010  Created this file
+// JLH  02/16/2010  Moved RomIdentifier stuff to its own file
+// JLH  03/02/2010  Added .ZIP file fishing
+// JLH  06/28/2011  Cleanup in the file parsing/fishing code, to make it easier
+//                  to follow the flow of the logic
+//
+
+#include "filethread.h"
+
+#include <QtGui>
+#include "crc32.h"
+#include "file.h"
+#include "filedb.h"
+#include "settings.h"
+
+#define VERBOSE_LOGGING
+
+FileThread::FileThread(QObject * parent/*= 0*/): QThread(parent), abort(false)
+{
+}
+
+FileThread::~FileThread()
+{
+       mutex.lock();
+       abort = true;
+       condition.wakeOne();
+       mutex.unlock();
+
+       wait();
+}
+
+void FileThread::Go(bool allowUnknown/*= false*/)
+{
+       allowUnknownSoftware = allowUnknown;
+       QMutexLocker locker(&mutex);
+       start();
+}
+
+/*
+Our strategy here is like so:
+Look at the files in the directory pointed to by ROMPath.
+For each file in the directory, take the CRC32 of it and compare it to the CRC
+in the romList[]. If there's a match, put it in a list and note it's index value
+in romList for future reference.
+
+When constructing the list, use the index to pull up an image of the cart and
+put that in the list. User picks from a graphical image of the cart.
+
+Ideally, the label will go into the archive along with the ROM image, but that's
+for the future...
+Maybe box art, screenshots will go as well...
+The future is NOW! :-)
+*/
+
+//
+// Here's the thread's actual execution path...
+//
+void FileThread::run(void)
+{
+       QDir romDir(vjs.ROMPath);
+       QFileInfoList list = romDir.entryInfoList();
+
+       for(int i=0; i<list.size(); i++)
+       {
+               if (abort)
+#ifdef VERBOSE_LOGGING
+{
+printf("FileThread: Aborting!!!\n");
+#endif
+                       return;
+#ifdef VERBOSE_LOGGING
+}
+#endif
+
+               HandleFile(list.at(i));
+       }
+}
+
+//
+// This handles file identification and ZIP extraction.
+//
+void FileThread::HandleFile(QFileInfo fileInfo)
+{
+       bool haveZIPFile = (fileInfo.suffix().compare("zip", Qt::CaseInsensitive) == 0
+               ? true : false);
+       uint32_t fileSize = 0;
+       uint8 * buffer = NULL;
+
+       if (haveZIPFile)
+       {
+               // ZIP files are special: They contain more than just the software now... ;-)
+               // So now we fish around inside them to pull out the stuff we want.
+               // Probably also need more stringent error checking as well... :-O
+               fileSize = GetFileFromZIP(fileInfo.filePath().toAscii(), FT_SOFTWARE, buffer);
+
+               if (fileSize == 0)
+                       return;
+       }
+       else
+       {
+               QFile file(fileInfo.filePath());
+
+               if (!file.open(QIODevice::ReadOnly))
+                       return;
+
+               fileSize = fileInfo.size();
+
+               if (fileSize == 0)
+                       return;
+
+               buffer = new uint8[fileSize];
+               file.read((char *)buffer, fileSize);
+               file.close();
+       }
+
+       // Try to divine the file type by size & header
+       int fileType = ParseFileType(buffer[0], buffer[1], fileSize);
+
+       // Check for Alpine ROM w/Universal Header
+       bool foundUniversalHeader = HasUniversalHeader(buffer, fileSize);
+       uint32 crc;
+
+//printf("FileThread: About to calc checksum on file with size %u... (buffer=%08X)\n", size, buffer);
+       if (foundUniversalHeader)
+               crc = crc32_calcCheckSum(buffer + 8192, fileSize - 8192);
+       else
+               crc = crc32_calcCheckSum(buffer, fileSize);
+
+       uint32 index = FindCRCIndexInFileList(crc);
+       delete[] buffer;
+
+       // Here we filter out files *not* in the DB (if configured that way) and
+       // BIOS files.
+       if (index == 0xFFFFFFFF)
+       {
+               // If we allow unknown software, we pass the (-1) index on, otherwise...
+               if (!allowUnknownSoftware)
+                       return;                                                         // CRC wasn't found, so bail...
+       }
+       else if (romList[index].flags & FF_BIOS)
+               return;
+
+//Here's a little problem. When we create the image here and pass it off to FilePicker,
+//we can clobber this image before we have a chance to copy it out in the FilePicker function
+//because we can be back here before FilePicker can respond.
+// So now we create the image on the heap, problem solved. :-)
+       QImage * img = NULL;
+
+       // See if we can fish out a label. :-)
+       if (haveZIPFile)
+       {
+               uint32 size = GetFileFromZIP(fileInfo.filePath().toAscii(), FT_LABEL, buffer);
+//printf("FT: Label size = %u bytes.\n", size);
+
+               if (size > 0)
+               {
+                       QImage label;
+                       bool successful = label.loadFromData(buffer, size);
+                       img = new QImage;
+                       *img = label.scaled(365, 168, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+//printf("FT: Label %s: %ux%u.\n", (successful ? "succeeded" : "did not succeed"), img->width(), img->height());
+                       delete[] buffer;
+               }
+//printf("FileThread: Attempted to load image. Size: %u x %u...\n", img.width(), img.height());
+       }
+
+//     emit FoundAFile2(index, fileInfo.canonicalFilePath(), img, fileSize);
+       emit FoundAFile3(index, fileInfo.canonicalFilePath(), img, fileSize, foundUniversalHeader, fileType, crc);
+}
+
+//
+// Find a CRC in the ROM list (simple brute force algorithm).
+// If it's there, return the index, otherwise return $FFFFFFFF
+//
+uint32 FileThread::FindCRCIndexInFileList(uint32 crc)
+{
+       // Instead of a simple brute-force search, we should probably do a binary
+       // partition search instead, since the CRCs are sorted numerically.
+#warning "!!! Should do binary partition search here !!!"
+       for(int i=0; romList[i].crc32!=0xFFFFFFFF; i++)
+       {
+               if (romList[i].crc32 == crc)
+                       return i;
+       }
+
+       return 0xFFFFFFFF;
+}
diff --git a/src/gui/filethread.h b/src/gui/filethread.h
new file mode 100644 (file)
index 0000000..92b773d
--- /dev/null
@@ -0,0 +1,37 @@
+//
+// filethread.h: File discovery thread class definition
+//
+
+#ifndef __FILETHREAD_H__
+#define __FILETHREAD_H__
+
+#include <QtCore>
+#include "types.h"
+
+class FileThread: public QThread
+{
+       Q_OBJECT
+
+       public:
+               FileThread(QObject * parent = 0);
+               ~FileThread();
+               void Go(bool allowUnknown = false);
+
+       signals:
+               void FoundAFile(unsigned long index);
+               void FoundAFile2(unsigned long index, QString filename, QImage * label, unsigned long);
+               void FoundAFile3(unsigned long index, QString filename, QImage * label, unsigned long, bool, unsigned long, unsigned long);
+
+       protected:
+               void run(void);
+               void HandleFile(QFileInfo);
+               uint32 FindCRCIndexInFileList(uint32);
+
+       private:
+               QMutex mutex;
+               QWaitCondition condition;
+               bool abort;
+               bool allowUnknownSoftware;
+};
+
+#endif // __FILETHREAD_H__
diff --git a/src/gui/font1.h b/src/gui/font1.h
deleted file mode 100644 (file)
index 3f4f75d..0000000
+++ /dev/null
@@ -1,262 +0,0 @@
-//
-// This file was automagically generated by bin2c (by James L. Hammons)
-//
-
-char font1[0x4000] = {
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 
-       0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
-       0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
-};
diff --git a/src/gui/font14pt.h b/src/gui/font14pt.h
deleted file mode 100644 (file)
index 3fcb6a0..0000000
+++ /dev/null
@@ -1,1640 +0,0 @@
-//#define FONT_WIDTH           8
-//#define FONT_HEIGHT          16
-
-//
-// This file was automagically generated by rawfont2c (by James L. Hammons)
-//
-
-char font2[] = {
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x05, 0x10, 0x02, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x45, 0xFF, 0x55, 0x00, 0xE5, 0xB5, 0x00,
-       0x00, 0x2F, 0xFF, 0x3F, 0x00, 0xCF, 0x9F, 0x00,
-       0x00, 0x19, 0xFF, 0x29, 0x00, 0xB9, 0x89, 0x00,
-       0x00, 0x04, 0xFE, 0x13, 0x00, 0xA3, 0x73, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x0F, 0x1E, 0x00, 0x1F, 0x0E,
-       0x00, 0x00, 0x00, 0x7D, 0x8F, 0x00, 0xDC, 0x2F,
-       0x00, 0x00, 0x00, 0xB9, 0x52, 0x17, 0xEF, 0x02,
-       0x00, 0x00, 0x03, 0xF2, 0x16, 0x52, 0xB6, 0x00,
-       0x00, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-       0x00, 0x10, 0x71, 0xA9, 0x10, 0xCB, 0x4C, 0x0F,
-       0x00, 0x00, 0x90, 0x7A, 0x00, 0xF0, 0x18, 0x00,
-       0x00, 0x00, 0xB9, 0x4F, 0x1C, 0xEE, 0x00, 0x00,
-       0x80, 0xF0, 0xFC, 0xF3, 0xF3, 0xFD, 0xF0, 0x6F,
-       0x14, 0x4B, 0xDB, 0x20, 0x9F, 0x88, 0x20, 0x0B,
-       0x00, 0x72, 0x97, 0x00, 0xD0, 0x39, 0x00, 0x00,
-       0x00, 0xB6, 0x55, 0x14, 0xF2, 0x04, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x45, 0xE9, 0xFF, 0xF2, 0xB8, 0x12,
-       0x00, 0x13, 0xF3, 0xAE, 0xFF, 0x3C, 0x6F, 0x31,
-       0x00, 0x48, 0xFF, 0x75, 0xFF, 0x20, 0x00, 0x4B,
-       0x10, 0x27, 0xFF, 0x9A, 0xFF, 0x20, 0x00, 0x2A,
-       0x00, 0x00, 0x9F, 0xF5, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x04, 0xAA, 0xFF, 0xA5, 0x07, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0xEF, 0x99, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x92, 0xFB, 0x0B,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x75, 0xFF, 0x14,
-       0x00, 0x3B, 0x6E, 0x66, 0xFF, 0xB1, 0xC0, 0x00,
-       0x00, 0x26, 0xBA, 0xF8, 0xFF, 0xC9, 0x18, 0x13,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x60, 0xDF, 0xD5, 0x3F, 0x00, 0x00, 0xA5, 0xCB,
-       0xFC, 0x75, 0xA0, 0xE6, 0x02, 0x48, 0xFB, 0x30,
-       0xFF, 0x25, 0x56, 0xFF, 0x26, 0xDF, 0x88, 0x00,
-       0xFF, 0x50, 0x82, 0xF3, 0x94, 0xDC, 0x09, 0x00,
-       0x8C, 0xFB, 0xF8, 0x96, 0xFB, 0x43, 0x00, 0x00,
-       0x00, 0x11, 0x10, 0xCE, 0x9F, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x75, 0xE9, 0x36, 0xCA, 0xDE, 0x6E,
-       0x00, 0x21, 0xF5, 0x59, 0xB0, 0xC6, 0x90, 0xFF,
-       0x00, 0xB9, 0xB6, 0x00, 0xDB, 0x94, 0x54, 0xFF,
-       0x5C, 0xF4, 0x1F, 0x00, 0xB7, 0xBF, 0x85, 0xF1,
-       0xEB, 0x71, 0x00, 0x00, 0x2D, 0xDC, 0xEF, 0x5B,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x03, 0x00, 0x6D, 0xE0, 0xDD, 0x5C, 0x00, 0x00,
-       0x00, 0x2A, 0xFF, 0x6D, 0x91, 0xFA, 0x0D, 0x00,
-       0x00, 0x47, 0xFF, 0x2D, 0x62, 0xFB, 0x0E, 0x00,
-       0x00, 0x11, 0xF8, 0x90, 0xDC, 0x7E, 0x00, 0x00,
-       0x00, 0x3D, 0xE0, 0xFD, 0x5B, 0x00, 0x00, 0x00,
-       0x85, 0xF2, 0x75, 0xFB, 0x55, 0x00, 0x51, 0xFF,
-       0xFE, 0x59, 0x00, 0x9A, 0xE4, 0x0F, 0x5D, 0xF5,
-       0xFF, 0x26, 0x00, 0x17, 0xEF, 0xA7, 0x87, 0xB1,
-       0xFF, 0x61, 0x00, 0x00, 0x61, 0xFF, 0xEE, 0x32,
-       0xC7, 0xEC, 0x48, 0x17, 0x5D, 0xF9, 0xE8, 0x1A,
-       0x12, 0xA2, 0xF1, 0xF7, 0xC4, 0x5D, 0xE9, 0xC8,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0xBB, 0xFF, 0x2B, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x9A, 0xFF, 0x0B, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x79, 0xE9, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x58, 0xC8, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x34,
-       0x00, 0x00, 0x00, 0x00, 0x05, 0x8A, 0xF0, 0x7E,
-       0x00, 0x00, 0x00, 0x00, 0xA6, 0xCF, 0x1E, 0x00,
-       0x00, 0x00, 0x00, 0x58, 0xF4, 0x1C, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0xCF, 0x95, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x19, 0xFF, 0x4E, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x41, 0xFF, 0x2B, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x4B, 0xFF, 0x22, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x3B, 0xFF, 0x30, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x0E, 0xFD, 0x5B, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0xB7, 0xAC, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x37, 0xFB, 0x3A, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x71, 0xED, 0x53, 0x01,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xD1, 0xA5,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x1B, 0x34, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x34, 0xDA, 0xD8, 0x42, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x01, 0x5E, 0xF3, 0x53, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x5E, 0xF2, 0x1E, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0xD3, 0x92, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x85, 0xE2, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x5E, 0xFF, 0x0E, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x54, 0xFF, 0x1A, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x64, 0xFE, 0x09, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x94, 0xD5, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x09, 0xE7, 0x79, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x8E, 0xDE, 0x0C, 0x00, 0x00,
-       0x00, 0x1A, 0x9E, 0xEA, 0x2C, 0x00, 0x00, 0x00,
-       0x47, 0xF1, 0x9D, 0x19, 0x00, 0x00, 0x00, 0x00,
-       0x07, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0xB6, 0xB5, 0x00, 0x00, 0x00,
-       0x01, 0x87, 0x23, 0x94, 0x93, 0x25, 0x87, 0x00,
-       0x17, 0xBE, 0xF1, 0x1F, 0x20, 0xF1, 0xBE, 0x16,
-       0x00, 0x00, 0x2F, 0x5D, 0x5D, 0x2E, 0x00, 0x00,
-       0x00, 0x19, 0xE1, 0x76, 0x77, 0xE1, 0x19, 0x00,
-       0x00, 0x1C, 0xA3, 0x05, 0x06, 0xA3, 0x1C, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0xF0, 0xF0, 0xF5, 0xFF, 0xF2, 0xF0, 0xF0,
-       0x00, 0x20, 0x20, 0x66, 0xFF, 0x3C, 0x20, 0x20,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x0A, 0x20, 0x04, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x1D, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0xC0, 0x09, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x27, 0xAF, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x12, 0x0B, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00,
-       0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x0A, 0x20, 0x04, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xB2,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE5, 0x36,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xBA, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x04, 0xE0, 0x3E, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x61, 0xC2, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x02, 0xD9, 0x46, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x58, 0xC9, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x01, 0xD2, 0x4E, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xD1, 0x01, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0xCB, 0x56, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x47, 0xD7, 0x02, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xC2, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x3E, 0xDE, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x75, 0xDF, 0xD4, 0x53, 0x00, 0x00,
-       0x00, 0x60, 0xEB, 0x3F, 0x58, 0xF8, 0x34, 0x00,
-       0x00, 0xDA, 0x7D, 0x00, 0x00, 0xAE, 0xAA, 0x00,
-       0x1F, 0xFF, 0x42, 0x00, 0x00, 0x73, 0xEE, 0x00,
-       0x42, 0xFF, 0x28, 0x00, 0x00, 0x5A, 0xFF, 0x11,
-       0x4D, 0xFF, 0x21, 0x00, 0x00, 0x52, 0xFF, 0x1C,
-       0x43, 0xFF, 0x28, 0x00, 0x00, 0x59, 0xFF, 0x13,
-       0x22, 0xFF, 0x40, 0x00, 0x00, 0x71, 0xF1, 0x00,
-       0x00, 0xDF, 0x78, 0x00, 0x00, 0xA9, 0xAF, 0x00,
-       0x00, 0x6A, 0xE5, 0x2E, 0x47, 0xF8, 0x3B, 0x00,
-       0x00, 0x01, 0x86, 0xF0, 0xE6, 0x61, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x16, 0x65, 0xB8, 0x1C, 0x00, 0x00,
-       0x00, 0xC1, 0xE8, 0xCF, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x29, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x10, 0x10, 0x5B, 0xFF, 0x2E, 0x10, 0x10,
-       0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x2F, 0xB2, 0xE4, 0xE4, 0x9F, 0x12, 0x00,
-       0x00, 0x51, 0x75, 0x2E, 0x3E, 0xE0, 0xBA, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0x11,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0x10,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xC3, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x57, 0xF3, 0x2D, 0x00,
-       0x00, 0x00, 0x00, 0x40, 0xEF, 0x44, 0x00, 0x00,
-       0x00, 0x00, 0x2A, 0xED, 0x4F, 0x00, 0x00, 0x00,
-       0x00, 0x0F, 0xDE, 0x91, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xAC, 0xFE, 0x28, 0x10, 0x10, 0x10, 0x02,
-       0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x24, 0xB9, 0xE2, 0xE9, 0xBD, 0x3B, 0x00,
-       0x00, 0x23, 0x61, 0x30, 0x31, 0xBE, 0xF1, 0x09,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFE, 0x10,
-       0x00, 0x00, 0x00, 0x00, 0x19, 0xC4, 0x92, 0x00,
-       0x00, 0x00, 0x4B, 0xF3, 0xFF, 0xA7, 0x01, 0x00,
-       0x00, 0x00, 0x0A, 0x24, 0x5C, 0xF1, 0x7B, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xF2, 0x03,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFF, 0x19,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFA, 0x08,
-       0x00, 0x23, 0x57, 0x1A, 0x3B, 0xE8, 0x9E, 0x00,
-       0x00, 0x2D, 0xDB, 0xF9, 0xEB, 0x94, 0x09, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x3B, 0xFE, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x04, 0xD2, 0xB2, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x73, 0xC4, 0x51, 0xFF, 0x20, 0x00,
-       0x00, 0x1B, 0xEF, 0x2E, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0xAB, 0x8F, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x46, 0xE5, 0x0D, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x88, 0xFA, 0xF0, 0xF0, 0xF5, 0xFF, 0xF2, 0xA5,
-       0x11, 0x20, 0x20, 0x20, 0x66, 0xFF, 0x3C, 0x16,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x4B, 0xF0, 0xF0, 0xF0, 0xF0, 0xB0, 0x00,
-       0x00, 0x50, 0xFF, 0x3C, 0x20, 0x20, 0x17, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0xEB, 0xC3, 0x5A, 0x00, 0x00,
-       0x00, 0x0A, 0x21, 0x35, 0x84, 0xFC, 0x75, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0xF0, 0x04,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xFF, 0x19,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xF7, 0x07,
-       0x00, 0x27, 0x46, 0x16, 0x49, 0xF0, 0x8D, 0x00,
-       0x00, 0x38, 0xDB, 0xF9, 0xE4, 0x80, 0x03, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x32, 0xBA, 0xE8, 0xD3, 0x6D, 0x00,
-       0x00, 0x2A, 0xF2, 0x7E, 0x27, 0x47, 0x5E, 0x00,
-       0x00, 0xB4, 0xA9, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x0F, 0xFC, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x3A, 0xFF, 0x53, 0xC0, 0xE7, 0x9D, 0x0A, 0x00,
-       0x4C, 0xFF, 0xBB, 0x33, 0x4A, 0xF0, 0xA0, 0x00,
-       0x48, 0xFF, 0x45, 0x00, 0x00, 0x7F, 0xFB, 0x09,
-       0x2D, 0xFF, 0x25, 0x00, 0x00, 0x55, 0xFF, 0x1A,
-       0x04, 0xF0, 0x4D, 0x00, 0x00, 0x74, 0xF3, 0x04,
-       0x00, 0x87, 0xD4, 0x2D, 0x2D, 0xE1, 0x8D, 0x00,
-       0x00, 0x05, 0x93, 0xEF, 0xF0, 0x93, 0x05, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0x00,
-       0x00, 0x20, 0x20, 0x20, 0x20, 0x8C, 0xBA, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x0A, 0xE9, 0x36, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x75, 0xB6, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x0B, 0xEA, 0x3D, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x75, 0xCB, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x09, 0xE9, 0x62, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x6A, 0xF5, 0x0C, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0xD9, 0xAC, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x2E, 0xFF, 0x66, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x64, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x28, 0xAC, 0xE4, 0xE8, 0xB8, 0x33, 0x00,
-       0x10, 0xEB, 0xA9, 0x2E, 0x3B, 0xCC, 0xEB, 0x06,
-       0x48, 0xFF, 0x2D, 0x00, 0x00, 0x5C, 0xFF, 0x17,
-       0x21, 0xFD, 0x9F, 0x03, 0x01, 0xAB, 0xC2, 0x00,
-       0x00, 0x6A, 0xFC, 0xCE, 0xB7, 0xB7, 0x14, 0x00,
-       0x00, 0x3E, 0xEE, 0xD8, 0xFF, 0xAF, 0x0F, 0x00,
-       0x06, 0xE6, 0x83, 0x04, 0x7E, 0xFE, 0xB4, 0x00,
-       0x3D, 0xFF, 0x2E, 0x00, 0x00, 0x90, 0xFF, 0x0F,
-       0x45, 0xFF, 0x35, 0x00, 0x00, 0x5C, 0xFE, 0x11,
-       0x0B, 0xE8, 0xBD, 0x23, 0x2F, 0xD0, 0xB5, 0x00,
-       0x00, 0x2D, 0xC0, 0xF8, 0xED, 0x9A, 0x0D, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x0C, 0x9A, 0xE6, 0xD5, 0x61, 0x00, 0x00,
-       0x00, 0xAD, 0xCE, 0x31, 0x54, 0xF4, 0x4A, 0x00,
-       0x20, 0xFF, 0x4B, 0x00, 0x00, 0x89, 0xBD, 0x00,
-       0x49, 0xFF, 0x27, 0x00, 0x00, 0x56, 0xF7, 0x02,
-       0x3C, 0xFF, 0x45, 0x00, 0x00, 0x6B, 0xFF, 0x16,
-       0x05, 0xE1, 0xBE, 0x0C, 0x16, 0xCF, 0xFF, 0x1C,
-       0x00, 0x35, 0xE2, 0xFA, 0xD5, 0x7F, 0xFF, 0x0D,
-       0x00, 0x00, 0x03, 0x18, 0x02, 0x7D, 0xE4, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0x97, 0x00,
-       0x00, 0x26, 0x39, 0x1B, 0x8E, 0xF2, 0x20, 0x00,
-       0x00, 0x3B, 0xDC, 0xF8, 0xD2, 0x3D, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x0B, 0x24, 0x04, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x0A, 0x20, 0x04, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x0B, 0x24, 0x24, 0x04, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x0A, 0x20, 0x20, 0x04, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0x1B, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x60, 0xF1, 0x03, 0x00,
-       0x00, 0x00, 0x00, 0x24, 0xD5, 0x71, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x13, 0x1F, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x60,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xD5, 0xCE,
-       0x00, 0x00, 0x00, 0x43, 0xCA, 0xD9, 0x57, 0x01,
-       0x00, 0x36, 0xBC, 0xE3, 0x65, 0x04, 0x00, 0x00,
-       0x08, 0x94, 0xFA, 0x95, 0x14, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x21, 0xA3, 0xF0, 0x81, 0x0E, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x2B, 0xB0, 0xEC, 0x76,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xBD,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
-       0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
-       0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xCE, 0xD5, 0x51, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x01, 0x58, 0xDA, 0xC9, 0x43, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x04, 0x67, 0xE5, 0xBC, 0x35,
-       0x00, 0x00, 0x00, 0x00, 0x15, 0x98, 0xFA, 0x94,
-       0x00, 0x00, 0x0F, 0x83, 0xF0, 0xA2, 0x21, 0x00,
-       0x00, 0x77, 0xED, 0xAF, 0x2B, 0x00, 0x00, 0x00,
-       0x00, 0xBD, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x2B, 0xB1, 0xDB, 0xEB, 0xDD, 0xA0, 0x1F, 0x00,
-       0x50, 0xFF, 0x5F, 0x25, 0x43, 0xD6, 0xDA, 0x02,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x5D, 0xFF, 0x18,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE4, 0x02,
-       0x00, 0x00, 0x00, 0x00, 0x4F, 0xF1, 0x49, 0x00,
-       0x00, 0x00, 0x00, 0x63, 0xEC, 0x3F, 0x00, 0x00,
-       0x00, 0x00, 0x14, 0xF7, 0x59, 0x00, 0x00, 0x00,
-       0x08, 0x00, 0x45, 0xF8, 0x21, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x05, 0x10, 0x02, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x0A, 0x83, 0xD6, 0xE9, 0xB6, 0x23,
-       0x00, 0x09, 0xC8, 0xCD, 0x3F, 0x32, 0xC5, 0xC9,
-       0x00, 0x86, 0xED, 0x1B, 0x8F, 0xE5, 0xDE, 0xFF,
-       0x04, 0xEE, 0x84, 0x8E, 0xDE, 0x38, 0x7D, 0xFF,
-       0x30, 0xFF, 0x50, 0xF8, 0x5F, 0x00, 0x53, 0xFF,
-       0x49, 0xFF, 0x65, 0xFF, 0x2A, 0x00, 0x95, 0xFF,
-       0x46, 0xFF, 0x71, 0xFF, 0x23, 0x0D, 0xE4, 0xFF,
-       0x21, 0xFF, 0x74, 0xFF, 0x4D, 0x8E, 0x9D, 0xFF,
-       0x00, 0xD1, 0xB2, 0xA6, 0xFD, 0xA5, 0x50, 0xFF,
-       0x00, 0x42, 0xFC, 0x85, 0x31, 0x25, 0x41, 0x20,
-       0x00, 0x00, 0x4A, 0xD0, 0xFA, 0xD8, 0x5F, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x0F, 0x00, 0x00, 0xA5, 0xFB, 0x18, 0x00, 0x00,
-       0x1F, 0x00, 0x10, 0xF3, 0xEC, 0x77, 0x00, 0x00,
-       0x20, 0x00, 0x6B, 0xBA, 0x92, 0xD8, 0x00, 0x00,
-       0x20, 0x00, 0xCD, 0x60, 0x38, 0xFF, 0x3B, 0x00,
-       0x20, 0x30, 0xF8, 0x0F, 0x00, 0xDC, 0x9D, 0x00,
-       0x20, 0x93, 0xAE, 0x00, 0x00, 0x83, 0xF3, 0x0C,
-       0xF1, 0xED, 0xF7, 0xF0, 0xF0, 0xF5, 0xFF, 0x62,
-       0x77, 0xE4, 0x21, 0x20, 0x20, 0x20, 0xC0, 0xC4,
-       0xBB, 0x78, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0xFF, 0xFF, 0xF4, 0xC6, 0x43,
-       0x00, 0x50, 0xFF, 0x2E, 0x15, 0x30, 0xB6, 0xF3,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x59, 0xFE,
-       0x00, 0x50, 0xFF, 0x20, 0x01, 0x30, 0xCB, 0x81,
-       0x00, 0x50, 0xFF, 0xF2, 0xFA, 0xFF, 0x82, 0x00,
-       0x00, 0x50, 0xFF, 0x3C, 0x30, 0x70, 0xEE, 0x96,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x64, 0xFF,
-       0x00, 0x50, 0xFF, 0x2E, 0x11, 0x24, 0xA5, 0xFA,
-       0x27, 0x50, 0xFF, 0xFF, 0xFF, 0xF8, 0xD5, 0x64,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x33, 0xB2, 0xEE, 0xF8, 0xDB, 0x74,
-       0x08, 0x43, 0xF8, 0x9C, 0x2A, 0x16, 0x41, 0x5D,
-       0x14, 0xDE, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x32, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x4A, 0xFF, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x36, 0xFF, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x17, 0xE6, 0xBA, 0x02, 0x00, 0x00, 0x00, 0x00,
-       0x0A, 0x4F, 0xFC, 0xB6, 0x3A, 0x16, 0x30, 0x4B,
-       0x00, 0x00, 0x3B, 0xB7, 0xF1, 0xF8, 0xD8, 0x6E,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0xFF, 0xFD, 0xEB, 0xB3, 0x3E, 0x00,
-       0x50, 0xFF, 0x2E, 0x14, 0x32, 0x9B, 0xFD, 0x4C,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xB6, 0xD2,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x67, 0xFF,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x54, 0xFF,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x67, 0xFA,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0xBA, 0xB5,
-       0x50, 0xFF, 0x2E, 0x18, 0x3E, 0xA7, 0xEF, 0x2A,
-       0x50, 0xFF, 0xFF, 0xFD, 0xE8, 0xAA, 0x29, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4,
-       0x00, 0x50, 0xFF, 0x2E, 0x10, 0x10, 0x10, 0x0B,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x0E, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x1A, 0x50, 0xFF, 0xF2, 0xF0, 0xF0, 0xF0, 0x00,
-       0x06, 0x50, 0xFF, 0x3C, 0x20, 0x20, 0x20, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x2E, 0x10, 0x10, 0x10, 0x10,
-       0x00, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-       0x00, 0x50, 0xFF, 0x2E, 0x10, 0x10, 0x10, 0x10,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0xF2, 0xF0, 0xF0, 0xF0, 0x4B,
-       0x00, 0x50, 0xFF, 0x3C, 0x20, 0x20, 0x20, 0x0A,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x04, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x08, 0x00, 0x25, 0xA2, 0xE5, 0xFA, 0xE9, 0xB9,
-       0x00, 0x38, 0xF3, 0xA8, 0x30, 0x14, 0x2C, 0x66,
-       0x01, 0xD9, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x30, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x4A, 0xFF, 0x25, 0x00, 0x00, 0xE8, 0xF0, 0xF0,
-       0x34, 0xFF, 0x47, 0x00, 0x00, 0x1F, 0x66, 0xFF,
-       0x03, 0xDF, 0xC0, 0x04, 0x00, 0x00, 0x50, 0xFF,
-       0x00, 0x40, 0xF6, 0xC0, 0x43, 0x15, 0x63, 0xFF,
-       0x00, 0x00, 0x2C, 0xA8, 0xEA, 0xFB, 0xE8, 0xB9,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x62, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x61, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x6E, 0xFF, 0xF2, 0xF0, 0xF0, 0xF5, 0xFF, 0x20,
-       0x70, 0xFF, 0x3C, 0x20, 0x20, 0x66, 0xFF, 0x20,
-       0x70, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x70, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x63, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
-       0x00, 0x10, 0x10, 0x5B, 0xFF, 0x2E, 0x10, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x10, 0x10, 0x5B, 0xFF, 0x2E, 0x10, 0x00,
-       0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0x20,
-       0x00, 0x00, 0x05, 0x10, 0x10, 0x5B, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x1F,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x1C,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xFD, 0x09,
-       0x00, 0x26, 0x53, 0x1E, 0x22, 0xC5, 0xB3, 0x00,
-       0x00, 0x37, 0xD5, 0xF9, 0xF2, 0xA8, 0x13, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x9E, 0xB9, 0x03,
-       0x50, 0xFF, 0x20, 0x00, 0x74, 0xD7, 0x0F, 0x00,
-       0x50, 0xFF, 0x20, 0x4B, 0xEA, 0x24, 0x00, 0x00,
-       0x50, 0xFF, 0x4C, 0xED, 0x41, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0xC6, 0xD7, 0x0A, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0x31, 0xD5, 0xB3, 0x03, 0x00, 0x00,
-       0x50, 0xFF, 0x20, 0x1E, 0xE5, 0x9A, 0x00, 0x00,
-       0x50, 0xFF, 0x20, 0x00, 0x2E, 0xF0, 0x7E, 0x00,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x41, 0xF8, 0x62,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x2E, 0x10, 0x10, 0x10, 0x0D,
-       0x00, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0xE5, 0x02, 0x00, 0x0C, 0xF6, 0xFF,
-       0x50, 0xFF, 0xD7, 0x40, 0x00, 0x5A, 0xD6, 0xFF,
-       0x50, 0xFF, 0x8C, 0x98, 0x00, 0xB0, 0x8A, 0xFF,
-       0x50, 0xFF, 0x41, 0xEB, 0x12, 0xE5, 0x52, 0xFF,
-       0x50, 0xFF, 0x20, 0xD7, 0xA5, 0xA4, 0x50, 0xFF,
-       0x50, 0xFF, 0x20, 0x8C, 0xFF, 0x58, 0x50, 0xFF,
-       0x50, 0xFF, 0x20, 0x41, 0xFC, 0x11, 0x50, 0xFF,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x50, 0xFF,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x50, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x70, 0xFF, 0x90, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x70, 0xFF, 0xFA, 0x25, 0x00, 0x50, 0xFF, 0x20,
-       0x70, 0xFF, 0xBD, 0xB1, 0x00, 0x50, 0xFF, 0x20,
-       0x70, 0xFF, 0x44, 0xFC, 0x42, 0x50, 0xFF, 0x20,
-       0x70, 0xFF, 0x20, 0xA3, 0xCF, 0x52, 0xFF, 0x20,
-       0x70, 0xFF, 0x20, 0x28, 0xFD, 0xB3, 0xFF, 0x20,
-       0x70, 0xFF, 0x20, 0x00, 0xA9, 0xFF, 0xFF, 0x20,
-       0x70, 0xFF, 0x20, 0x00, 0x2D, 0xFE, 0xFF, 0x20,
-       0x70, 0xFF, 0x20, 0x00, 0x00, 0xAF, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x73, 0xDF, 0xF9, 0xD2, 0x50, 0x00,
-       0x00, 0x79, 0xEF, 0x4A, 0x17, 0x68, 0xFB, 0x48,
-       0x09, 0xF2, 0x73, 0x00, 0x00, 0x00, 0xA7, 0xCA,
-       0x3A, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x64, 0xFE,
-       0x4C, 0xFF, 0x22, 0x00, 0x00, 0x00, 0x53, 0xFF,
-       0x3A, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x64, 0xFE,
-       0x0A, 0xF3, 0x74, 0x00, 0x00, 0x00, 0xA7, 0xCB,
-       0x00, 0x7D, 0xEE, 0x4A, 0x16, 0x68, 0xFB, 0x4B,
-       0x00, 0x01, 0x75, 0xE0, 0xFA, 0xD3, 0x53, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0xFF, 0xFF, 0xF7, 0xD0, 0x44,
-       0x00, 0x50, 0xFF, 0x2E, 0x11, 0x29, 0xB3, 0xF0,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x59, 0xFF,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x27, 0xC8, 0xCF,
-       0x00, 0x50, 0xFF, 0xF2, 0xF6, 0xF8, 0xAB, 0x1B,
-       0x00, 0x50, 0xFF, 0x3C, 0x1B, 0x04, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x73, 0xDF, 0xF9, 0xD2, 0x50, 0x00,
-       0x06, 0x79, 0xEF, 0x4A, 0x17, 0x68, 0xFB, 0x48,
-       0x20, 0xF2, 0x73, 0x00, 0x00, 0x00, 0xA7, 0xCA,
-       0x3A, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x64, 0xFE,
-       0x4C, 0xFF, 0x22, 0x00, 0x00, 0x00, 0x53, 0xFF,
-       0x3A, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x64, 0xFE,
-       0x09, 0xF2, 0x74, 0x00, 0x00, 0x00, 0xA7, 0xCA,
-       0x00, 0x79, 0xEE, 0x4A, 0x16, 0x68, 0xFB, 0x47,
-       0x00, 0x00, 0x77, 0xE3, 0xFE, 0xFF, 0x64, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x05, 0xA4, 0xEF, 0x82,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xE4,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0xFF, 0xF9, 0xD5, 0x4C, 0x00,
-       0x00, 0x50, 0xFF, 0x2E, 0x1D, 0xA5, 0xF5, 0x09,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x59, 0xFF, 0x11,
-       0x0A, 0x50, 0xFF, 0x20, 0x17, 0xC0, 0xB1, 0x00,
-       0x1C, 0x50, 0xFF, 0xF3, 0xFF, 0xA5, 0x0A, 0x00,
-       0x0B, 0x50, 0xFF, 0x3C, 0xA2, 0xBB, 0x01, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x12, 0xE9, 0x74, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x59, 0xF9, 0x30,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0xB5, 0xD6,
-       0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x4F, 0xCF, 0xF9, 0xF1, 0xCE, 0x5F, 0x00,
-       0x20, 0xFB, 0x83, 0x19, 0x1F, 0x4E, 0x4F, 0x00,
-       0x4A, 0xFF, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x12, 0xE6, 0xE3, 0x6F, 0x14, 0x00, 0x00, 0x00,
-       0x00, 0x15, 0x88, 0xE7, 0xFB, 0xAD, 0x22, 0x00,
-       0x00, 0x00, 0x00, 0x03, 0x50, 0xDC, 0xDE, 0x02,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0x17,
-       0x3D, 0x86, 0x3B, 0x15, 0x32, 0xC3, 0xD1, 0x00,
-       0x33, 0xB2, 0xE5, 0xFC, 0xEB, 0xA3, 0x19, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-       0x10, 0x10, 0x10, 0x5B, 0xFF, 0x2E, 0x10, 0x10,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x4C, 0xFF, 0x22, 0x00, 0x00, 0x52, 0xFF, 0x1C,
-       0x33, 0xFF, 0x3E, 0x00, 0x00, 0x71, 0xFC, 0x07,
-       0x03, 0xDE, 0xB7, 0x1F, 0x2F, 0xDC, 0xAE, 0x00,
-       0x00, 0x2C, 0xBF, 0xF7, 0xF0, 0xA3, 0x10, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0xB8, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xF3,
-       0x57, 0xFD, 0x1D, 0x00, 0x00, 0x00, 0x6A, 0xBF,
-       0x07, 0xEE, 0x7F, 0x00, 0x00, 0x00, 0xCF, 0x5D,
-       0x00, 0x95, 0xE0, 0x02, 0x00, 0x36, 0xF0, 0x09,
-       0x00, 0x34, 0xFF, 0x48, 0x00, 0x9D, 0x97, 0x00,
-       0x00, 0x00, 0xD3, 0xAD, 0x0E, 0xF4, 0x35, 0x00,
-       0x00, 0x00, 0x72, 0xFA, 0x80, 0xD2, 0x00, 0x00,
-       0x00, 0x00, 0x16, 0xFB, 0xFD, 0x6F, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0xB0, 0xF9, 0x13, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0xF4, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC9,
-       0xAC, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF1,
-       0x87, 0xA4, 0x00, 0x84, 0xFB, 0x0C, 0x1B, 0xE9,
-       0x61, 0xCB, 0x00, 0xC5, 0xFF, 0x48, 0x44, 0xC0,
-       0x3C, 0xF2, 0x0C, 0xF9, 0xBF, 0x88, 0x6D, 0x97,
-       0x17, 0xFF, 0x61, 0xD2, 0x6F, 0xC8, 0x96, 0x6E,
-       0x00, 0xF1, 0xC8, 0x93, 0x30, 0xFB, 0xCC, 0x45,
-       0x00, 0xCC, 0xFF, 0x55, 0x02, 0xEF, 0xFF, 0x1C,
-       0x00, 0xA7, 0xFF, 0x17, 0x00, 0xB3, 0xF3, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x81, 0xFE, 0x52, 0x00, 0x00, 0x00, 0x89, 0xC2,
-       0x12, 0x90, 0xEC, 0x1A, 0x00, 0x4B, 0xE9, 0x1B,
-       0x00, 0x07, 0xD2, 0xBB, 0x20, 0xEB, 0x46, 0x00,
-       0x00, 0x00, 0x2C, 0xF7, 0xEB, 0x82, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0xAC, 0xFF, 0x33, 0x00, 0x00,
-       0x00, 0x00, 0x4C, 0xE9, 0xC4, 0xD5, 0x08, 0x00,
-       0x00, 0x1E, 0xEB, 0x46, 0x1C, 0xEE, 0x92, 0x00,
-       0x04, 0xC6, 0x84, 0x00, 0x00, 0x55, 0xFE, 0x46,
-       0x8C, 0xC0, 0x03, 0x00, 0x00, 0x00, 0x9F, 0xE6,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x58, 0xFE, 0x39, 0x00, 0x00, 0x00, 0x15, 0xE9,
-       0x00, 0xB4, 0xD3, 0x05, 0x00, 0x00, 0xAD, 0xA2,
-       0x00, 0x1F, 0xF4, 0x79, 0x00, 0x5C, 0xE7, 0x12,
-       0x00, 0x00, 0x73, 0xF6, 0x3D, 0xEE, 0x51, 0x00,
-       0x00, 0x00, 0x03, 0xCF, 0xFB, 0xA8, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x57, 0xFF, 0x28, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x13, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x4B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-       0x00, 0x10, 0x10, 0x10, 0x10, 0x21, 0xE4, 0xA1,
-       0x00, 0x00, 0x00, 0x00, 0x02, 0xB7, 0xC4, 0x07,
-       0x00, 0x00, 0x00, 0x00, 0x83, 0xE0, 0x16, 0x00,
-       0x00, 0x00, 0x00, 0x4D, 0xF1, 0x2D, 0x00, 0x00,
-       0x00, 0x00, 0x24, 0xED, 0x4B, 0x00, 0x00, 0x00,
-       0x00, 0x0B, 0xD3, 0x73, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xA7, 0xA9, 0x10, 0x10, 0x10, 0x10, 0x10,
-       0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0xFF, 0xFF, 0xFF, 0x28,
-       0x00, 0x00, 0x50, 0xFF, 0x2E, 0x10, 0x10, 0x02,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0xF2, 0xF0, 0xF0, 0x25,
-       0x00, 0x00, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x05,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x42, 0xDD, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xC6, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x4A, 0xD6, 0x02, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0xCD, 0x54, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x52, 0xCF, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x01, 0xD4, 0x4C, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x5A, 0xC7, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x03, 0xDA, 0x43, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x62, 0xBF, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x05, 0xE0, 0x3A, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xB6, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE5, 0x32,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xAE,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00,
-       0x00, 0x05, 0x10, 0x10, 0x5B, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x52, 0xF0, 0xF0, 0xF5, 0xFF, 0x20, 0x00,
-       0x00, 0x0B, 0x20, 0x20, 0x20, 0x20, 0x04, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x38, 0xA7, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0xA5, 0xFA, 0x19, 0x00,
-       0x00, 0x00, 0x00, 0x18, 0xF2, 0xB4, 0x81, 0x00,
-       0x00, 0x00, 0x00, 0x7F, 0xA1, 0x34, 0xE7, 0x05,
-       0x00, 0x00, 0x05, 0xE6, 0x34, 0x00, 0xC7, 0x5A,
-       0x00, 0x00, 0x58, 0xC7, 0x00, 0x00, 0x5B, 0xC7,
-       0x00, 0x00, 0xC5, 0x5A, 0x00, 0x00, 0x06, 0xE8,
-       0x00, 0x31, 0xE8, 0x06, 0x00, 0x00, 0x00, 0x82,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
-       0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x18, 0xCD, 0xBE, 0x03, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x0C, 0xB6, 0x86, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x1E, 0xB1, 0xE9, 0xFC, 0xE3, 0x60, 0x00,
-       0x00, 0x25, 0x55, 0x1A, 0x1D, 0xAE, 0xF6, 0x07,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFF, 0x1E,
-       0x00, 0x12, 0x89, 0xD2, 0xEB, 0xF5, 0xFF, 0x20,
-       0x08, 0xD7, 0xCA, 0x51, 0x29, 0x66, 0xFF, 0x20,
-       0x44, 0xFF, 0x2E, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x2C, 0xFF, 0x87, 0x18, 0x47, 0xCF, 0xFF, 0x4B,
-       0x00, 0x6B, 0xE7, 0xF6, 0xB7, 0x30, 0xAD, 0xF4,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0x40, 0xC1, 0xF7, 0xBD, 0x16, 0x00,
-       0x50, 0xFF, 0xCB, 0x42, 0x25, 0xD8, 0xA9, 0x00,
-       0x50, 0xFF, 0x3C, 0x00, 0x00, 0x72, 0xF9, 0x05,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x53, 0xFF, 0x1B,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x5A, 0xFF, 0x11,
-       0x50, 0xFF, 0x21, 0x00, 0x00, 0x8A, 0xE1, 0x00,
-       0x56, 0xFF, 0xBA, 0x28, 0x3C, 0xEF, 0x76, 0x00,
-       0x8F, 0xEB, 0x58, 0xE4, 0xF2, 0x8E, 0x02, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x07, 0x89, 0xE4, 0xFA, 0xE4, 0x7C, 0x00,
-       0x00, 0xA2, 0xEF, 0x52, 0x16, 0x33, 0x4D, 0x00,
-       0x1A, 0xFE, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x47, 0xFF, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x47, 0xFF, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x1B, 0xFE, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xA5, 0xF0, 0x5A, 0x17, 0x2A, 0x47, 0x00,
-       0x00, 0x08, 0x8C, 0xE5, 0xFA, 0xE1, 0x74, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x00, 0x10, 0xAB, 0xF6, 0xD4, 0x84, 0xFF, 0x20,
-       0x00, 0xAA, 0xD8, 0x2A, 0x37, 0xD6, 0xFF, 0x20,
-       0x16, 0xFD, 0x5A, 0x00, 0x00, 0x51, 0xFF, 0x20,
-       0x43, 0xFF, 0x29, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x4B, 0xFF, 0x23, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x30, 0xFF, 0x41, 0x00, 0x00, 0x6E, 0xFF, 0x20,
-       0x02, 0xDC, 0xB6, 0x1C, 0x5A, 0xDD, 0xFF, 0x20,
-       0x00, 0x32, 0xD4, 0xF6, 0xA8, 0x5D, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x04, 0x87, 0xE9, 0xF7, 0xBB, 0x1E, 0x00,
-       0x00, 0x92, 0xC7, 0x28, 0x28, 0xC9, 0xB9, 0x00,
-       0x13, 0xFB, 0x3B, 0x00, 0x00, 0x5D, 0xFC, 0x08,
-       0x44, 0xFF, 0xF1, 0xF0, 0xF0, 0xF5, 0xFF, 0x1C,
-       0x48, 0xFF, 0x42, 0x20, 0x20, 0x20, 0x20, 0x04,
-       0x1E, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xA9, 0xE8, 0x4F, 0x16, 0x22, 0x65, 0x13,
-       0x00, 0x08, 0x89, 0xE1, 0xFB, 0xE8, 0xB0, 0x11,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x59, 0xD4, 0xFA, 0xF4, 0xCD,
-       0x00, 0x00, 0x21, 0xFC, 0x85, 0x1B, 0x16, 0x34,
-       0x00, 0x00, 0x4E, 0xFF, 0x22, 0x00, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-       0x00, 0x10, 0x5B, 0xFF, 0x2E, 0x10, 0x10, 0x10,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x0D, 0xA9, 0xF6, 0xCF, 0x7F, 0xFF, 0x20,
-       0x00, 0xA4, 0xD8, 0x29, 0x38, 0xD9, 0xFF, 0x20,
-       0x15, 0xFC, 0x5B, 0x00, 0x00, 0x53, 0xFF, 0x20,
-       0x43, 0xFF, 0x2A, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x4B, 0xFF, 0x23, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x2E, 0xFF, 0x46, 0x00, 0x00, 0x72, 0xFF, 0x20,
-       0x01, 0xD8, 0xBF, 0x1D, 0x56, 0xE3, 0xFF, 0x1E,
-       0x00, 0x2E, 0xD1, 0xF7, 0xB7, 0x66, 0xFF, 0x14,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0xEF, 0x01,
-       0x00, 0x4A, 0x3A, 0x14, 0x36, 0xDB, 0x8D, 0x00,
-       0x00, 0x75, 0xDF, 0xFA, 0xE9, 0x92, 0x07, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x42, 0xB5, 0xF5, 0xE8, 0x5A,
-       0x00, 0x50, 0xFF, 0xE4, 0x5F, 0x1B, 0xAA, 0xF1,
-       0x00, 0x50, 0xFF, 0x4E, 0x00, 0x00, 0x55, 0xFF,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x43, 0xD8, 0x1B, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00,
-       0x04, 0x10, 0x10, 0x5B, 0xFF, 0x20, 0x00, 0x00,
-       0x1C, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x20, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x20, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x20, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x20, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x20, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x43, 0xD8, 0x1B, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x58, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00,
-       0x00, 0x05, 0x10, 0x10, 0x5B, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x1D, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x5D, 0xFE, 0x0A, 0x00,
-       0x2A, 0x54, 0x1F, 0x1A, 0xB6, 0xBF, 0x00, 0x00,
-       0x35, 0xD1, 0xF5, 0xF5, 0xB8, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x32, 0xF4, 0x4D,
-       0x00, 0x50, 0xFF, 0x20, 0x17, 0xE2, 0x7B, 0x00,
-       0x00, 0x50, 0xFF, 0x26, 0xC5, 0xA9, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0xB7, 0xEE, 0x0B, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x6F, 0xFD, 0x82, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x77, 0xFF, 0x5A, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0xA0, 0xF7, 0x38,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x06, 0xC4, 0xE8,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0x20, 0x00, 0x00,
-       0x02, 0x10, 0x10, 0x5B, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x1F, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0x45, 0xE8, 0x7A, 0x2E, 0xEB, 0xAA,
-       0x50, 0xFF, 0x9E, 0x7C, 0xEF, 0x83, 0x79, 0xFF,
-       0x50, 0xFF, 0x5F, 0x53, 0xFF, 0x5D, 0x51, 0xFF,
-       0x50, 0xFF, 0x22, 0x50, 0xFF, 0x22, 0x50, 0xFF,
-       0x50, 0xFF, 0x20, 0x50, 0xFF, 0x20, 0x50, 0xFF,
-       0x50, 0xFF, 0x20, 0x50, 0xFF, 0x20, 0x50, 0xFF,
-       0x50, 0xFF, 0x20, 0x50, 0xFF, 0x20, 0x50, 0xFF,
-       0x50, 0xFF, 0x20, 0x50, 0xFF, 0x20, 0x50, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x42, 0xB5, 0xF5, 0xE8, 0x5A,
-       0x10, 0x50, 0xFF, 0xE4, 0x5F, 0x1B, 0xAA, 0xF1,
-       0x1F, 0x50, 0xFF, 0x4E, 0x00, 0x00, 0x55, 0xFF,
-       0x20, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x20, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x20, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x20, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x20, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x05, 0x85, 0xE3, 0xFA, 0xD9, 0x6A, 0x00,
-       0x04, 0x9C, 0xE8, 0x45, 0x16, 0x61, 0xFA, 0x6F,
-       0x35, 0xFD, 0x62, 0x00, 0x00, 0x00, 0x94, 0xE6,
-       0x66, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x59, 0xFF,
-       0x67, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x59, 0xFF,
-       0x3A, 0xFE, 0x61, 0x00, 0x00, 0x00, 0x93, 0xE6,
-       0x20, 0xA2, 0xE6, 0x44, 0x16, 0x5E, 0xF9, 0x71,
-       0x20, 0x07, 0x8A, 0xE5, 0xFA, 0xDA, 0x6D, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x40, 0xC1, 0xF7, 0xBD, 0x16,
-       0x00, 0x50, 0xFF, 0xCB, 0x42, 0x25, 0xD8, 0xA9,
-       0x00, 0x50, 0xFF, 0x3C, 0x00, 0x00, 0x72, 0xF9,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x53, 0xFF,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x5A, 0xFF,
-       0x00, 0x50, 0xFF, 0x21, 0x00, 0x00, 0x8A, 0xE1,
-       0x00, 0x50, 0xFF, 0xBA, 0x27, 0x3C, 0xEF, 0x76,
-       0x00, 0x50, 0xFF, 0x74, 0xE5, 0xF1, 0x8E, 0x02,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x10, 0xAB, 0xF6, 0xD4, 0x5A, 0xFF, 0x20,
-       0x00, 0xAA, 0xD8, 0x2A, 0x37, 0xD5, 0xFF, 0x20,
-       0x1B, 0xFD, 0x5A, 0x00, 0x00, 0x51, 0xFF, 0x20,
-       0x5E, 0xFF, 0x29, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x5C, 0xFF, 0x23, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x30, 0xFF, 0x41, 0x00, 0x00, 0x6E, 0xFF, 0x20,
-       0x02, 0xDC, 0xB6, 0x1C, 0x5A, 0xDD, 0xFF, 0x20,
-       0x00, 0x32, 0xD4, 0xF6, 0xA8, 0x5D, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x44, 0xBE, 0xF8, 0xFF, 0x20,
-       0x00, 0x50, 0xFF, 0xD3, 0x42, 0x5F, 0xFF, 0x20,
-       0x00, 0x50, 0xFF, 0x4B, 0x00, 0x11, 0x38, 0x07,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x66, 0xDA, 0xFB, 0xF0, 0xC9, 0x1D,
-       0x00, 0x2D, 0xFF, 0x82, 0x1C, 0x1C, 0x45, 0x13,
-       0x00, 0x3F, 0xFF, 0x70, 0x03, 0x00, 0x00, 0x00,
-       0x00, 0x01, 0xA1, 0xFE, 0xEB, 0x9D, 0x47, 0x01,
-       0x00, 0x00, 0x00, 0x22, 0x71, 0xC1, 0xFF, 0xAD,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0xFF,
-       0x00, 0x36, 0x70, 0x2C, 0x14, 0x33, 0xBD, 0xE0,
-       0x00, 0x2B, 0xB8, 0xE8, 0xFD, 0xEF, 0xAE, 0x25,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-       0x00, 0x10, 0x5B, 0xFF, 0x2E, 0x10, 0x10, 0x10,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00, 0x00,
-       0x15, 0x00, 0x48, 0xFF, 0x24, 0x00, 0x00, 0x00,
-       0x03, 0x00, 0x1D, 0xFE, 0x95, 0x26, 0x18, 0x31,
-       0x00, 0x00, 0x00, 0x6F, 0xDE, 0xFB, 0xF8, 0xE0,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x50, 0xFF, 0x20, 0x00, 0x00, 0x50, 0xFF, 0x20,
-       0x4C, 0xFF, 0x27, 0x00, 0x00, 0x8E, 0xFF, 0x20,
-       0x26, 0xFF, 0x93, 0x37, 0x99, 0xE6, 0xFF, 0x20,
-       0x00, 0x82, 0xF2, 0xEF, 0x97, 0x5A, 0xFF, 0x20,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x63, 0xF4, 0x0C, 0x00, 0x00, 0x00, 0x63, 0xD1,
-       0x0C, 0xF3, 0x63, 0x00, 0x00, 0x00, 0xC9, 0x6C,
-       0x00, 0x9E, 0xC5, 0x00, 0x00, 0x2E, 0xF6, 0x10,
-       0x00, 0x3B, 0xFF, 0x27, 0x00, 0x95, 0xA2, 0x00,
-       0x00, 0x00, 0xD8, 0x89, 0x0A, 0xF0, 0x3D, 0x00,
-       0x00, 0x00, 0x76, 0xE6, 0x63, 0xD7, 0x00, 0x00,
-       0x00, 0x00, 0x18, 0xFB, 0xEF, 0x73, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0xB1, 0xF9, 0x14, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0xD6, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4,
-       0xAB, 0x93, 0x00, 0x7E, 0xFE, 0x0F, 0x00, 0xEB,
-       0x7F, 0xBD, 0x00, 0xC1, 0xC1, 0x43, 0x14, 0xE1,
-       0x54, 0xE7, 0x0A, 0xD5, 0x71, 0x79, 0x3C, 0xB1,
-       0x28, 0xFF, 0x58, 0x9E, 0x3A, 0xAE, 0x64, 0x82,
-       0x04, 0xF8, 0xC5, 0x61, 0x08, 0xDD, 0x8C, 0x52,
-       0x00, 0xD1, 0xFF, 0x23, 0x00, 0xCB, 0xCC, 0x23,
-       0x00, 0xA6, 0xE6, 0x00, 0x00, 0x94, 0xF2, 0x01,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x56, 0xE9, 0xB0, 0x00, 0x00, 0x1B, 0xF1, 0x7A,
-       0x11, 0x4E, 0xFF, 0x61, 0x00, 0xB0, 0xA6, 0x00,
-       0x00, 0x00, 0x9D, 0xF2, 0x73, 0xEC, 0x15, 0x00,
-       0x00, 0x00, 0x0D, 0xDF, 0xFF, 0x5E, 0x00, 0x00,
-       0x00, 0x00, 0x13, 0xE8, 0xFF, 0x75, 0x00, 0x00,
-       0x00, 0x00, 0xA9, 0xB2, 0x88, 0xF8, 0x2E, 0x00,
-       0x00, 0x58, 0xEC, 0x17, 0x06, 0xD0, 0xD1, 0x06,
-       0x18, 0xED, 0x56, 0x00, 0x00, 0x2C, 0xF8, 0x8B,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x53, 0xE0,
-       0x00, 0xC9, 0x99, 0x00, 0x00, 0x00, 0xBA, 0x79,
-       0x00, 0x62, 0xF3, 0x0D, 0x00, 0x23, 0xF8, 0x16,
-       0x00, 0x0A, 0xF0, 0x67, 0x00, 0x88, 0xA7, 0x00,
-       0x00, 0x00, 0x93, 0xCE, 0x05, 0xE9, 0x3E, 0x00,
-       0x00, 0x00, 0x2B, 0xFF, 0x8C, 0xD5, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0xC4, 0xFF, 0x6C, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x63, 0xF4, 0x0E, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x9B, 0x99, 0x00, 0x00, 0x00,
-       0x00, 0x12, 0x4D, 0xF7, 0x2B, 0x00, 0x00, 0x00,
-       0x00, 0xFF, 0xE4, 0x62, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
-       0x00, 0x10, 0x10, 0x10, 0x17, 0xD3, 0xA9, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x97, 0xD7, 0x0C, 0x00,
-       0x00, 0x00, 0x00, 0x5C, 0xF4, 0x2A, 0x00, 0x00,
-       0x00, 0x00, 0x2B, 0xF4, 0x59, 0x00, 0x00, 0x00,
-       0x00, 0x0D, 0xD8, 0x93, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xA9, 0xD1, 0x16, 0x10, 0x10, 0x10, 0x00,
-       0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x7A, 0xDF, 0xFC, 0x84,
-       0x00, 0x00, 0x00, 0x37, 0xFF, 0x6B, 0x15, 0x08,
-       0x00, 0x00, 0x00, 0x4F, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x02, 0x53, 0xFF, 0x1D, 0x00, 0x00,
-       0x00, 0x00, 0x01, 0x90, 0xE8, 0x04, 0x00, 0x00,
-       0x00, 0x70, 0xF7, 0xF4, 0x3B, 0x00, 0x00, 0x00,
-       0x00, 0x0F, 0x29, 0xAF, 0xCF, 0x01, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x53, 0xFF, 0x1A, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x3F, 0xFF, 0x4D, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x01, 0x96, 0xF8, 0xF4, 0x7B,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1D, 0x10,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0xB4, 0xF9, 0xD1, 0x50, 0x00, 0x00, 0x00,
-       0x00, 0x0B, 0x19, 0x96, 0xF8, 0x0C, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x1F, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x4D, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x21, 0xFB, 0x62, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x61, 0xFE, 0xF4, 0x47,
-       0x00, 0x00, 0x00, 0x14, 0xEE, 0x8A, 0x25, 0x09,
-       0x00, 0x00, 0x00, 0x4B, 0xFF, 0x22, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x50, 0xFF, 0x20, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x7E, 0xFE, 0x11, 0x00, 0x00,
-       0x00, 0xA8, 0xF7, 0xF2, 0x76, 0x00, 0x00, 0x00,
-       0x00, 0x16, 0x1A, 0x03, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x5D, 0xE2, 0x8F, 0x00, 0x00, 0x00, 0x00,
-       0x10, 0xF6, 0x72, 0xA8, 0xE2, 0x4C, 0x5C, 0xDF,
-       0x44, 0xFF, 0x26, 0x09, 0xA8, 0xFC, 0xFC, 0x8D,
-       0x09, 0x20, 0x04, 0x00, 0x00, 0x0E, 0x12, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
diff --git a/src/gui/generaltab.cpp b/src/gui/generaltab.cpp
new file mode 100644 (file)
index 0000000..1a3414f
--- /dev/null
@@ -0,0 +1,85 @@
+//
+// generaltab.cpp: "General" tab on the settings dialog
+//
+// Part of the Virtual Jaguar Project
+// (C) 2011 Underground Software
+// See the README and GPLv3 files for licensing and warranty information
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// WHO  WHEN        WHAT
+// ---  ----------  ------------------------------------------------------------
+// JLH  06/23/2011  Created this file
+
+#include "generaltab.h"
+
+
+GeneralTab::GeneralTab(QWidget * parent/*= 0*/): QWidget(parent)
+{
+//     antialiasChk = new QCheckBox(tr("Use Qt's built-in antialiasing"));
+
+// I'm thinking we should scan the bios folder for the 5 known BIOSes, and
+// just present a radio button to choose between them...
+       QLabel * label1 = new QLabel("Boot ROM:");
+       QLabel * label2 = new QLabel("CD Boot ROM:");
+       QLabel * label3 = new QLabel("EEPROMs:");
+       QLabel * label4 = new QLabel("Software:");
+
+       edit1 = new QLineEdit("");
+       edit2 = new QLineEdit("");
+       edit3 = new QLineEdit("");
+       edit4 = new QLineEdit("");
+       edit1->setPlaceholderText("Boot ROM location");
+       edit2->setPlaceholderText("CD Boot ROM location");
+       edit3->setPlaceholderText("EEPROM path");
+       edit4->setPlaceholderText("Software path");
+
+       QVBoxLayout * layout1 = new QVBoxLayout;
+       layout1->addWidget(label1);
+       layout1->addWidget(label2);
+       layout1->addWidget(label3);
+       layout1->addWidget(label4);
+
+       QVBoxLayout * layout2 = new QVBoxLayout;
+       layout2->addWidget(edit1);
+       layout2->addWidget(edit2);
+       layout2->addWidget(edit3);
+       layout2->addWidget(edit4);
+
+       QHBoxLayout * layout3 = new QHBoxLayout;
+       layout3->addLayout(layout1);
+       layout3->addLayout(layout2);
+
+       QVBoxLayout * layout4 = new QVBoxLayout;
+       layout4->addLayout(layout3);
+
+       // Checkboxes...
+       useBIOS            = new QCheckBox(tr("Enable Jaguar BIOS"));
+       useDSP             = new QCheckBox(tr("Enable DSP"));
+       useUnknownSoftware = new QCheckBox(tr("Allow unknown software in file chooser"));
+
+       layout4->addWidget(useBIOS);
+       layout4->addWidget(useDSP);
+       layout4->addWidget(useUnknownSoftware);
+
+       setLayout(layout4);
+}
+
+GeneralTab::~GeneralTab()
+{
+}
+
+#if 0
+       vjs.useJoystick      = settings.value("useJoystick", false).toBool();
+       vjs.joyport          = settings.value("joyport", 0).toInt();
+       vjs.frameSkip        = settings.value("frameSkip", 0).toInt();
+       vjs.useJaguarBIOS    = settings.value("useJaguarBIOS", false).toBool();
+       vjs.DSPEnabled       = settings.value("DSPEnabled", false).toBool();
+       vjs.usePipelinedDSP  = settings.value("usePipelinedDSP", false).toBool();
+       vjs.fullscreen       = settings.value("fullscreen", false).toBool();
+       vjs.renderType       = settings.value("renderType", 0).toInt();
+       strcpy(vjs.jagBootPath, settings.value("JagBootROM", "./bios/[BIOS] Atari Jaguar (USA, Europe).zip").toString().toAscii().data());
+       strcpy(vjs.CDBootPath, settings.value("CDBootROM", "./bios/jagcd.rom").toString().toAscii().data());
+       strcpy(vjs.EEPROMPath, settings.value("EEPROMs", "./eeproms").toString().toAscii().data());
+       strcpy(vjs.ROMPath, settings.value("ROMs", "./software").toString().toAscii().data());
+#endif
diff --git a/src/gui/generaltab.h b/src/gui/generaltab.h
new file mode 100644 (file)
index 0000000..d10b10e
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef __GENERALTAB_H__
+#define __GENERALTAB_H__
+
+#include <QtGui>
+
+class GeneralTab: public QWidget
+{
+       Q_OBJECT
+
+       public:
+               GeneralTab(QWidget * parent = 0);
+               ~GeneralTab();
+
+       public:
+               QLineEdit * edit1;
+               QLineEdit * edit2;
+               QLineEdit * edit3;
+               QLineEdit * edit4;
+
+               QCheckBox * useBIOS;
+               QCheckBox * useDSP;
+               QCheckBox * useUnknownSoftware;
+};
+
+#endif // __GENERALTAB_H__
diff --git a/src/gui/glwidget.cpp b/src/gui/glwidget.cpp
new file mode 100644 (file)
index 0000000..2501ad8
--- /dev/null
@@ -0,0 +1,154 @@
+// OpenGL implementation in Qt
+// Parts of this are blantantly ripped off from BSNES (thanks Byuu!)
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/14/2010  Created this file
+//
+
+#include "glwidget.h"
+
+#include "jaguar.h"
+#include "settings.h"
+#include "tom.h"
+
+#ifdef __GCCWIN32__
+// Apparently on win32, various OpenGL constants aren't pulled in.
+#include <GL/glext.h>
+#endif
+
+GLWidget::GLWidget(QWidget * parent/*= 0*/): QGLWidget(parent), texture(0),
+       textureWidth(0), textureHeight(0), buffer(0), rasterWidth(320), rasterHeight(240)
+{
+//     tomDeviceWidth = rasterWidth;
+       tomDeviceWidth = 1024;  // It has to be the texture width...
+
+       // Set up the backbuffer
+       // To be safe, this should be 1280 * 625 * 2...
+       backbuffer = (uint32_t *)malloc(1280 * 625 * sizeof(uint32_t));
+//     memset(backbuffer, 0x44, rasterWidth *
+       memset(backbuffer, 0xFF, 1024 *
+               (vjs.hardwareTypeNTSC ? rasterHeight : VIRTUAL_SCREEN_HEIGHT_PAL)
+               * sizeof(uint32_t));
+}
+
+GLWidget::~GLWidget()
+{
+       free(backbuffer);
+}
+
+void GLWidget::initializeGL()
+{
+       format().setDoubleBuffer(true);
+       resizeGL(rasterWidth, rasterHeight);
+
+       glDisable(GL_ALPHA_TEST);
+       glDisable(GL_BLEND);
+       glDisable(GL_DEPTH_TEST);
+       glDisable(GL_POLYGON_SMOOTH);
+       glDisable(GL_STENCIL_TEST);
+       glEnable(GL_DITHER);
+       glEnable(GL_TEXTURE_2D);
+       glClearColor(0.0, 0.0, 0.0, 0.0);
+}
+
+void GLWidget::paintGL()
+{
+//kludge
+rasterHeight = (vjs.hardwareTypeNTSC ? 240 : 256);
+
+       unsigned outputWidth  = width();
+       unsigned outputHeight = height();
+
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glOrtho(0, outputWidth, 0, outputHeight, -1.0, 1.0);
+       glViewport(0, 0, outputWidth, outputHeight);
+
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, (vjs.glFilter ? GL_LINEAR : GL_NEAREST));
+       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (vjs.glFilter ? GL_LINEAR : GL_NEAREST));
+//     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rasterWidth, rasterHeight, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buffer);
+//more kludge
+       glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TOMGetVideoModeWidth(), rasterHeight, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, buffer);
+//     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, rasterWidth, rasterHeight, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, buffer);
+
+       double w = (double)TOMGetVideoModeWidth()  / (double)textureWidth;
+//     double w = (double)rasterWidth  / (double)textureWidth;
+       double h = (double)rasterHeight / (double)textureHeight;
+       unsigned u = outputWidth;
+       unsigned v = outputHeight;
+
+       glBegin(GL_TRIANGLE_STRIP);
+       glTexCoord2f(0, 0); glVertex3i(0, v, 0);
+       glTexCoord2f(w, 0); glVertex3i(u, v, 0);
+       glTexCoord2f(0, h); glVertex3i(0, 0, 0);
+       glTexCoord2f(w, h); glVertex3i(u, 0, 0);
+       glEnd();
+}
+
+void GLWidget::resizeGL(int width, int height)
+{
+       if (width > textureWidth || height > textureHeight)
+       {
+//             textureWidth  = max(width,  textureWidth);
+//             textureHeight = max(height, textureHeight);
+// Seems that power of 2 sizes are still mandatory...
+               textureWidth  = 1024;//(width > textureWidth ? width : textureWidth);
+               textureHeight = 512;//(height > textureHeight ? height : textureHeight);
+//             textureWidth  = (width > textureWidth ? width : textureWidth);
+//             textureHeight = (height > textureHeight ? height : textureHeight);
+#if 0
+printf("Resizing: new texture width/height = %i x %i\n", textureWidth, textureHeight);
+printf("Resizing: new raster width/height = %i x %i\n", rasterWidth, rasterHeight);
+#endif
+
+               if (buffer)
+               {
+                       delete[] buffer;
+                       glDeleteTextures(1, &texture);
+               }
+
+               buffer = new uint32_t[textureWidth * textureHeight];
+//???
+memset(buffer, 0x00, textureWidth * textureHeight * sizeof(uint32_t));
+               glGenTextures(1, &texture);
+               glBindTexture(GL_TEXTURE_2D, texture);
+               glPixelStorei(GL_UNPACK_ROW_LENGTH, textureWidth);
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+//             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureWidth, textureHeight, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
+               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureWidth, textureHeight, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, NULL);
+       }
+}
+
+#if 0
+class RubyGLWidget: public QGLWidget
+{
+  public:
+    GLuint texture;
+    unsigned textureWidth, textureHeight;
+
+    uint32_t * buffer;
+    unsigned rasterWidth, rasterHeight;
+
+    bool synchronize;
+    unsigned filter;
+
+    void updateSynchronization() {
+      #ifdef __APPLE__
+      makeCurrent();
+      CGLContextObj context = CGLGetCurrentContext();
+      GLint value = synchronize;  //0 = draw immediately (no vsync), 1 = draw once per frame (vsync)
+      CGLSetParameter(context, kCGLCPSwapInterval, &value);
+      #endif
+    }
+} * widget;
+#endif
diff --git a/src/gui/glwidget.h b/src/gui/glwidget.h
new file mode 100644 (file)
index 0000000..7c8f995
--- /dev/null
@@ -0,0 +1,43 @@
+// Implementation of OpenGL widget using Qt
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+
+#ifndef __GLWIDGET_H__
+#define __GLWIDGET_H__
+
+#include <QtGui>
+#include <QGLWidget>
+
+class GLWidget: public QGLWidget
+{
+       Q_OBJECT
+
+       public:
+               GLWidget(QWidget * parent = 0);
+               ~GLWidget();
+
+//             QSize minimumSizeHint() const;
+//             QSize sizeHint() const;
+
+//     signals:
+//             void clicked();
+
+       protected:
+               void initializeGL();
+               void paintGL();
+               void resizeGL(int width, int height);
+
+//     private:
+       public:
+               GLuint texture;
+               int textureWidth, textureHeight;
+
+               uint32_t * buffer;
+               unsigned rasterWidth, rasterHeight;
+
+               bool synchronize;
+               unsigned filter;
+};
+
+#endif // __GLWIDGET_H__
diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp
deleted file mode 100644 (file)
index 2cdd58d..0000000
+++ /dev/null
@@ -1,699 +0,0 @@
-//
-// GUI.CPP
-//
-// Graphical User Interface support
-// by James L. Hammons
-//
-
-#include "gui.h"
-
-#include <SDL.h>
-#include "crc32.h"
-#include "file.h"
-#include "jaguar.h"
-#include "log.h"
-#include "sdlemu_opengl.h"
-#include "settings.h"
-#include "tom.h"
-#include "video.h"
-
-// Once these are split off, these may not be needed anymore...
-#include "button.h"
-#include "element.h"
-#include "filelist.h"
-#include "guimisc.h"
-#include "image.h"
-#include "listbox.h"
-#include "menu.h"
-#include "pushbutton.h"
-#include "slideswitch.h"
-#include "text.h"
-#include "textedit.h"
-#include "window.h"
-
-// Private function prototypes
-
-Window * LoadROM(void);
-Window * ResetJaguar(void);
-Window * ResetJaguarCD(void);
-Window * RunEmu(void);
-Window * Quit(void);
-Window * About(void);
-Window * MiscOptions(void);
-
-// Local global variables
-
-bool showGUI = false;
-bool exitGUI = false;                                                          // GUI (emulator) done variable
-int mouseX = 0, mouseY = 0;
-uint32 background[1280 * 256];                                         // GUI background buffer
-bool showMessage = false;
-//uint32 showMessageTimeout;
-//char messageBuffer[200];
-bool finished = false;
-
-//
-// GUI stuff--it's not crunchy, it's GUI! ;-)
-//
-
-void GUIInit(void)
-{
-       SDL_ShowCursor(SDL_DISABLE);
-       SDL_GetMouseState(&mouseX, &mouseY);
-}
-
-void GUIDone(void)
-{
-}
-
-//
-// GUI main loop
-//
-//bool GUIMain(void)
-bool GUIMain(char * filename)
-{
-WriteLog("GUI: Inside GUIMain...\n");
-
-       uint32 pointerBGSave[6 * 8 + 2];
-       pointerBGSave[0] = 6;
-       pointerBGSave[1] = 8;
-
-// Need to set things up so that it loads and runs a file if given on the command line. !!! FIX !!! [DONE]
-//     extern uint32 * backbuffer;
-//     bool done = false;
-       SDL_Event event;
-       Window * mainWindow = NULL;
-
-       // Set up the GUI classes...
-//     Element::SetScreenAndPitch(backbuffer, GetSDLScreenWidthInPixels());
-       Element::SetScreenAndPitch((uint32 *)sdlemuGetOverlayPixels(), sdlemuGetOverlayWidthInPixels());
-       sdlemuEnableOverlay();
-
-       Menu mainMenu;
-       MenuItems mi;
-       mi.title = "Jaguar";
-       mi.item.push_back(NameAction("Load...", LoadROM, SDLK_l));
-       mi.item.push_back(NameAction("Reset", ResetJaguar, SDLK_r));
-       if (CDBIOSLoaded)
-               mi.item.push_back(NameAction("Reset CD", ResetJaguarCD, SDLK_c));
-       mi.item.push_back(NameAction("Run", RunEmu, SDLK_ESCAPE));
-       mi.item.push_back(NameAction(""));
-       mi.item.push_back(NameAction("Quit", Quit, SDLK_q));
-       mainMenu.Add(mi);
-       mi.title = "Settings";
-       mi.item.clear();
-       mi.item.push_back(NameAction("Video..."));
-       mi.item.push_back(NameAction("Audio..."));
-       mi.item.push_back(NameAction("Misc...", MiscOptions, SDLK_m));
-       mainMenu.Add(mi);
-       mi.title = "Info";
-       mi.item.clear();
-       mi.item.push_back(NameAction("About...", About));
-       mainMenu.Add(mi);
-
-       bool showMouse = true;
-
-       // Grab the BG where the mouse will be painted (prime the backstore)
-
-/*
-DISNOWOK
-Bitmap ptr = { 6, 8, 4,
-""//"000011112222333344445555"
-//"000011112222333344445555"
-//"000011112222333344445555"
-//"000011112222333344445555"
-//"000011112222333344445555"
-//"000011112222333344445555"
-//"000011112222333344445555"
-//"000011112222333344445555"
-};//*/
-       uint32 * overlayPixels = (uint32 *)sdlemuGetOverlayPixels();
-       uint32 count = 2;
-
-       for(uint32 y=0; y<pointerBGSave[1]; y++)
-               for(uint32 x=0; x<pointerBGSave[0]; x++)
-                       pointerBGSave[count++] = overlayPixels[((mouseY + y) * sdlemuGetOverlayWidthInPixels()) + (mouseX + x)];
-
-       uint32 oldMouseX = mouseX, oldMouseY = mouseY;
-
-//This is crappy!!! !!! FIX !!!
-//Is this even needed any more? Hmm. Maybe. Dunno.
-WriteLog("GUI: Resetting Jaguar...\n");
-       JaguarReset();
-
-WriteLog("GUI: Clearing BG save...\n");
-       // Set up our background save...
-//     memset(background, 0x11, tom_getVideoModeWidth() * 240 * 2);
-//1111 -> 000100 01000 10001 -> 0001 0000 0100 0010 1000 1100 -> 10 42 8C
-       for(uint32 i=0; i<TOMGetVideoModeWidth()*240; i++)
-//             background[i] = 0xFF8C4210;
-               backbuffer[i] = 0xFF8C4210;
-
-/*     uint32 * overlayPix = (uint32 *)sdlemuGetOverlayPixels();
-       for(uint32 i=0; i<sdlemuGetOverlayWidthInPixels()*480; i++)
-               overlayPix[i] = 0x00000000;*/
-
-       // Handle loading file passed in on the command line...! [DONE]
-
-       if (filename)
-       {
-               if (JaguarLoadFile(filename))
-               {
-//                     event.type = SDL_USEREVENT, event.user.code = MENU_ITEM_CHOSEN;
-//                     event.user.data1 = (void *)ResetJaguar;
-//             SDL_PushEvent(&event);
-                       // Make it so that if passed in on the command line, we quit right
-                       // away when pressing ESC
-WriteLog("GUI: Bypassing GUI since ROM passed in on command line...\n");
-                       ResetJaguar();
-                       return true;
-               }
-               else
-               {
-                       // Create error dialog...
-                       char errText[1024];
-                       sprintf(errText, "The file %40s could not be loaded.", filename);
-
-                       mainWindow = new Window(8, 16, 304, 160);
-                       mainWindow->AddElement(new Text(8, 8, "Error!"));
-                       mainWindow->AddElement(new Text(8, 24, errText));
-               }
-       }
-
-WriteLog("GUI: Entering main loop...\n");
-       while (!exitGUI)
-       {
-               if (SDL_PollEvent(&event))
-               {
-                       if (event.type == SDL_USEREVENT)
-                       {
-                               if (event.user.code == WINDOW_CLOSE)
-                               {
-                                       delete mainWindow;
-                                       mainWindow = NULL;
-                               }
-                               else if (event.user.code == MENU_ITEM_CHOSEN)
-                               {
-                                       // Confused? Let me enlighten... What we're doing here is casting
-                                       // data1 as a pointer to a function which returns a Window pointer and
-                                       // which takes no parameters (the "(Window *(*)(void))" part), then
-                                       // derefencing it (the "*" in front of that) in order to call the
-                                       // function that it points to. Clear as mud? Yeah, I hate function
-                                       // pointers too, but what else are you gonna do?
-                                       mainWindow = (*(Window *(*)(void))event.user.data1)();
-
-                                       while (SDL_PollEvent(&event));  // Flush the event queue...
-                                       event.type = SDL_MOUSEMOTION;
-                                       int mx, my;
-                                       SDL_GetMouseState(&mx, &my);
-                                       event.motion.x = mx, event.motion.y = my;
-                                   SDL_PushEvent(&event);                      // & update mouse position...!
-
-                                       oldMouseX = mouseX, oldMouseY = mouseY;
-                                       mouseX = mx, mouseY = my;               // This prevents "mouse flash"...
-                               }
-                       }
-                       else if (event.type == SDL_ACTIVEEVENT)
-                       {
-                               if (event.active.state == SDL_APPMOUSEFOCUS)
-                                       showMouse = (event.active.gain ? true : false);
-                       }
-                       else if (event.type == SDL_KEYDOWN)
-                       {
-// Ugly kludge for windowed<-->fullscreen switching...
-uint8 * keystate = SDL_GetKeyState(NULL);
-
-if ((keystate[SDLK_LALT] || keystate[SDLK_RALT]) & keystate[SDLK_RETURN])
-       ToggleFullscreen();
-
-                               if (mainWindow)
-                                       mainWindow->HandleKey(event.key.keysym.sym);
-                               else
-                                       mainMenu.HandleKey(event.key.keysym.sym);
-                       }
-                       else if (event.type == SDL_MOUSEMOTION)
-                       {
-                               oldMouseX = mouseX, oldMouseY = mouseY;
-                               mouseX = event.motion.x, mouseY = event.motion.y;
-
-                               if (mainWindow)
-                                       mainWindow->HandleMouseMove(mouseX, mouseY);
-                               else
-                                       mainMenu.HandleMouseMove(mouseX, mouseY);
-                       }
-                       else if (event.type == SDL_MOUSEBUTTONDOWN)
-                       {
-                               uint32 mx = event.button.x, my = event.button.y;
-
-                               if (mainWindow)
-                                       mainWindow->HandleMouseButton(mx, my, true);
-                               else
-                                       mainMenu.HandleMouseButton(mx, my, true);
-                       }
-                       else if (event.type == SDL_MOUSEBUTTONUP)
-                       {
-                               uint32 mx = event.button.x, my = event.button.y;
-
-                               if (mainWindow)
-                                       mainWindow->HandleMouseButton(mx, my, false);
-                               else
-                                       mainMenu.HandleMouseButton(mx, my, false);
-                       }
-
-//PROBLEM: In order to use the dirty rectangle approach here, we need some way of
-//         handling it in mainMenu.Draw() and mainWindow->Draw(). !!! FIX !!!
-//POSSIBLE SOLUTION:
-// When mouse is moving and not on menu or window, can do straight dirty rect.
-// When mouse is on menu, need to update screen. Same for buttons on windows...
-// What the menu & windows should do is only redraw on a state change. IOW, they
-// should call their own/child window's Draw() function instead of doing it top
-// level.
-//#define NEW_BACKSTORE_METHOD
-
-                       // Draw the GUI...
-// The way we do things here is kinda stupid (redrawing the screen every frame), but
-// it's simple. Perhaps there may be a reason down the road to be more selective with
-// our clearing, but for now, this will suffice.
-//                     memset(backbuffer, 0x11, tom_getVideoModeWidth() * 240 * 2);
-//                     memcpy(backbuffer, background, tom_getVideoModeWidth() * 256 * 2);
-//                     memcpy(backbuffer, background, tom_getVideoModeWidth() * 256 * 4);
-#ifndef NEW_BACKSTORE_METHOD
-                       memset(sdlemuGetOverlayPixels(), 0, sdlemuGetOverlayWidthInPixels() * 480 * 4);
-
-                       mainMenu.Draw();
-//Could do multiple windows here by using a vector + priority info...
-//Though the way ZSNES does it seems to be by a bool (i.e., they're always active, just not shown)
-                       if (mainWindow)
-                               mainWindow->Draw();
-#endif
-
-/*uint32 pBGS[6 * 8 + 3] = { 6, 8, 4,
-       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
-};*/
-//This isn't working... Why????
-//It's because DrawTransparentBitmap does alpha blending if it detects zero in the alpha channel.
-//So why do it that way? Hm.
-                       overlayPixels = (uint32 *)sdlemuGetOverlayPixels();
-
-#ifdef NEW_BACKSTORE_METHOD
-//                     DrawTransparentBitmapDeprecated(overlayPixels, oldMouseX, oldMouseY, pointerBGSave);
-//                     DrawTransparentBitmap(overlayPixels, oldMouseX, oldMouseY, pBGS);
-                       for(uint32 y=0; y<pointerBGSave[1]; y++)
-                               for(uint32 x=0; x<pointerBGSave[0]; x++)
-                                       overlayPixels[((oldMouseY + y) * sdlemuGetOverlayWidthInPixels()) + (oldMouseX + x)] = 0x00000000;
-
-                       count = 2;
-
-                       for(uint32 y=0; y<pointerBGSave[1]; y++)
-                               for(uint32 x=0; x<pointerBGSave[0]; x++)
-                                       pointerBGSave[count++] = overlayPixels[((mouseY + y) * sdlemuGetOverlayWidthInPixels()) + (mouseX + x)];
-#endif
-
-                       if (showMouse)
-//                             DrawTransparentBitmapDeprecated(backbuffer, mouseX, mouseY, mousePic);
-                               DrawTransparentBitmapDeprecated(overlayPixels, mouseX, mouseY, mousePic);
-
-                       RenderBackbuffer();
-               }
-       }
-
-       return true;
-}
-
-//
-// GUI "action" functions
-//
-
-Window * LoadROM(void)
-{
-       FileList * fileList = new FileList(20, 20, 600, 440);
-
-       return (Window *)fileList;
-}
-
-Window * ResetJaguar(void)
-{
-       JaguarReset();
-
-       return RunEmu();
-}
-
-Window * ResetJaguarCD(void)
-{
-       memcpy(jaguarMainROM, jaguarCDBootROM, 0x40000);
-       jaguarRunAddress = 0x802000;
-       jaguarMainROMCRC32 = crc32_calcCheckSum(jaguarMainROM, 0x40000);
-       JaguarReset();
-//This is a quick kludge to get the CDBIOS to boot properly...
-//Wild speculation: It could be that this memory location is wired into the CD unit
-//somehow, which lets it know whether or not a cart is present in the unit...
-       jaguarMainROM[0x0040B] = 0x03;
-
-       return RunEmu();
-}
-
-
-#if 0
-
-bool debounceRunKey = true;
-Window * RunEmu(void)
-{
-       extern uint32 * backbuffer;
-//Temporary, to test the new timer based code...
-sdlemuDisableOverlay();
-JaguarExecuteNew();
-sdlemuEnableOverlay();
-       // Save the background for the GUI...
-       // In this case, we squash the color to monochrome, then force it to blue + green...
-       for(uint32 i=0; i<tom_getVideoModeWidth() * 256; i++)
-       {
-               uint32 pixel = backbuffer[i];
-               uint8 b = (pixel >> 16) & 0xFF, g = (pixel >> 8) & 0xFF, r = pixel & 0xFF;
-               pixel = ((r + g + b) / 3) & 0x00FF;
-               backbuffer[i] = 0xFF000000 | (pixel << 16) | (pixel << 8);
-       }
-return NULL;//*/
-
-//This is crappy... !!! FIX !!!
-       extern bool finished, showGUI;
-
-//     uint32 nFrame = 0, nFrameskip = 0;
-       uint32 totalFrames = 0;
-       finished = false;
-       bool showMessage = true;
-       uint32 showMsgFrames = 120;
-       uint8 transparency = 0;
-       // Pass a message to the "joystick" code to debounce the ESC key...
-       debounceRunKey = true;
-
-       uint32 cartType = 4;
-       if (jaguarRomSize == 0x200000)
-               cartType = 0;
-       else if (jaguarRomSize == 0x400000)
-               cartType = 1;
-       else if (jaguar_mainRom_crc32 == 0x687068D5)
-               cartType = 2;
-       else if (jaguar_mainRom_crc32 == 0x55A0669C)
-               cartType = 3;
-
-       char * cartTypeName[5] = { "2M Cartridge", "4M Cartridge", "CD BIOS", "CD Dev BIOS", "Homebrew" };
-       uint32 elapsedTicks = SDL_GetTicks(), frameCount = 0, framesPerSecond = 0;
-
-       while (true)
-       {
-               // Set up new backbuffer with new pixels and data
-               JaguarExecute(backbuffer, true);
-//             JaguarExecuteNew();
-               totalFrames++;
-//WriteLog("Frame #%u...\n", totalFrames);
-//extern bool doDSPDis;
-//if (totalFrames == 373)
-//     doDSPDis = true;
-
-//This sucks... !!! FIX !!!
-               joystick_exec();
-//This is done here so that the crud below doesn't get on our GUI background...
-               if (finished)
-                       break;
-
-               // Some QnD GUI stuff here...
-               if (showGUI)
-               {
-                       extern uint32 gpu_pc, dsp_pc;
-                       DrawString(backbuffer, 8, 8, false, "GPU PC: %08X", gpu_pc);
-                       DrawString(backbuffer, 8, 16, false, "DSP PC: %08X", dsp_pc);
-                       DrawString(backbuffer, 8, 32, false, "%u FPS", framesPerSecond);
-               }
-
-               if (showMessage)
-               {
-// FF0F -> 1111 11 11  000 0 1111 -> 3F 18 0F
-// 3FE3 -> 0011 11 11  111 0 0011 -> 0F 3F 03
-/*                     DrawStringTrans((uint32 *)backbuffer, 8, 24*8, 0xFF0F, transparency, "Running...");
-                       DrawStringTrans((uint32 *)backbuffer, 8, 26*8, 0x3FE3, transparency, "%s, run address: %06X", cartTypeName[cartType], jaguarRunAddress);
-                       DrawStringTrans((uint32 *)backbuffer, 8, 27*8, 0x3FE3, transparency, "CRC: %08X", jaguar_mainRom_crc32);//*/
-//first has wrong color. !!! FIX !!!
-                       DrawStringTrans(backbuffer, 8, 24*8, 0xFF7F63FF, transparency, "Running...");
-                       DrawStringTrans(backbuffer, 8, 26*8, 0xFF1FFF3F, transparency, "%s, run address: %06X", cartTypeName[cartType], jaguarRunAddress);
-                       DrawStringTrans(backbuffer, 8, 27*8, 0xFF1FFF3F, transparency, "CRC: %08X", jaguar_mainRom_crc32);
-
-                       if (showMsgFrames == 0)
-                       {
-                               transparency++;
-
-                               if (transparency == 33)
-{
-                                       showMessage = false;
-/*extern bool doGPUDis;
-doGPUDis = true;//*/
-}
-
-                       }
-                       else
-                               showMsgFrames--;
-               }
-
-               RenderBackbuffer();
-               frameCount++;
-
-               if (SDL_GetTicks() - elapsedTicks > 250)
-                       elapsedTicks += 250, framesPerSecond = frameCount * 4, frameCount = 0;
-       }
-
-       // Reset the pitch, since it may have been changed in-game...
-       Element::SetScreenAndPitch((uint32 *)backbuffer, GetSDLScreenWidthInPixels());
-
-       // Save the background for the GUI...
-//     memcpy(background, backbuffer, tom_getVideoModeWidth() * 240 * 2);
-       // In this case, we squash the color to monochrome, then force it to blue + green...
-       for(uint32 i=0; i<tom_getVideoModeWidth() * 256; i++)
-       {
-               uint32 pixel = backbuffer[i];
-               uint8 b = (pixel >> 16) & 0xFF, g = (pixel >> 8) & 0xFF, r = pixel & 0xFF;
-               pixel = ((r + g + b) / 3) & 0x00FF;
-               background[i] = 0xFF000000 | (pixel << 16) | (pixel << 8);
-       }
-
-       return NULL;
-}
-
-#else
-
-bool debounceRunKey = true;
-Window * RunEmu(void)
-{
-//     extern uint32 * backbuffer;
-       uint32 * overlayPixels = (uint32 *)sdlemuGetOverlayPixels();
-       memset(overlayPixels, 0x00, 640 * 480 * 4);                     // Clear out overlay...
-
-//This is crappy... !!! FIX !!!
-//     extern bool finished, showGUI;
-
-       sdlemuDisableOverlay();
-
-//     uint32 nFrame = 0, nFrameskip = 0;
-       uint32 totalFrames = 0;
-       finished = false;
-       bool showMessage = true;
-       uint32 showMsgFrames = 120;
-       uint8 transparency = 0xFF;
-       // Pass a message to the "joystick" code to debounce the ESC key...
-       debounceRunKey = true;
-
-       uint32 cartType = 4;
-       if (jaguarROMSize == 0x200000)
-               cartType = 0;
-       else if (jaguarROMSize == 0x400000)
-               cartType = 1;
-       else if (jaguarMainROMCRC32 == 0x687068D5)
-               cartType = 2;
-       else if (jaguarMainROMCRC32 == 0x55A0669C)
-               cartType = 3;
-
-       const char * cartTypeName[5] = { "2M Cartridge", "4M Cartridge", "CD BIOS", "CD Dev BIOS", "Homebrew" };
-       uint32 elapsedTicks = SDL_GetTicks(), frameCount = 0, framesPerSecond = 0;
-
-       while (!finished)
-       {
-               // Set up new backbuffer with new pixels and data
-               JaguarExecuteNew();
-               totalFrames++;
-//WriteLog("Frame #%u...\n", totalFrames);
-//extern bool doDSPDis;
-//if (totalFrames == 373)
-//     doDSPDis = true;
-
-//Problem: Need to do this *only* when the state changes from visible to not...
-//Also, need to clear out the GUI when not on (when showMessage is active...)
-if (showGUI || showMessage)
-       sdlemuEnableOverlay();
-else
-       sdlemuDisableOverlay();
-
-//Add in a new function for clearing patches of screen (ClearOverlayRect)
-
-// Also: Take frame rate into account when calculating fade time...
-
-               // Some QnD GUI stuff here...
-               if (showGUI)
-               {
-                       FillScreenRectangle(overlayPixels, 8, 1*FONT_HEIGHT, 128, 4*FONT_HEIGHT, 0x00000000);
-                       extern uint32 gpu_pc, dsp_pc;
-                       DrawString(overlayPixels, 8, 1*FONT_HEIGHT, false, "GPU PC: %08X", gpu_pc);
-                       DrawString(overlayPixels, 8, 2*FONT_HEIGHT, false, "DSP PC: %08X", dsp_pc);
-                       DrawString(overlayPixels, 8, 4*FONT_HEIGHT, false, "%u FPS", framesPerSecond);
-               }
-
-               if (showMessage)
-               {
-                       DrawString2(overlayPixels, 8, 24*FONT_HEIGHT, 0x007F63FF, transparency, "Running...");
-                       DrawString2(overlayPixels, 8, 26*FONT_HEIGHT, 0x001FFF3F, transparency, "%s, run address: %06X", cartTypeName[cartType], jaguarRunAddress);
-                       DrawString2(overlayPixels, 8, 27*FONT_HEIGHT, 0x001FFF3F, transparency, "CRC: %08X", jaguarMainROMCRC32);
-
-                       if (showMsgFrames == 0)
-                       {
-                               transparency--;
-
-                               if (transparency == 0)
-{
-                                       showMessage = false;
-/*extern bool doGPUDis;
-doGPUDis = true;//*/
-}
-
-                       }
-                       else
-                               showMsgFrames--;
-               }
-
-               frameCount++;
-
-               if (SDL_GetTicks() - elapsedTicks > 250)
-                       elapsedTicks += 250, framesPerSecond = frameCount * 4, frameCount = 0;
-       }
-
-       // Save the background for the GUI...
-       // In this case, we squash the color to monochrome, then force it to blue + green...
-       for(uint32 i=0; i<TOMGetVideoModeWidth() * 256; i++)
-       {
-               uint32 pixel = backbuffer[i];
-               uint8 b = (pixel >> 16) & 0xFF, g = (pixel >> 8) & 0xFF, r = pixel & 0xFF;
-               pixel = ((r + g + b) / 3) & 0x00FF;
-               backbuffer[i] = 0xFF000000 | (pixel << 16) | (pixel << 8);
-       }
-
-       sdlemuEnableOverlay();
-
-       return NULL;
-}
-
-#endif
-
-
-Window * Quit(void)
-{
-       WriteLog("GUI: Quitting due to user request.\n");
-       exitGUI = true;
-
-       return NULL;
-}
-
-Window * About(void)
-{
-       char buf[512];
-       sprintf(buf, "SVN %s", __DATE__);
-//fprintf(fp, "VirtualJaguar v1.0.8 (Last full build was on %s %s)\n", __DATE__, __TIME__);
-//VirtualJaguar v1.0.8 (Last full build was on Dec 30 2004 20:01:31)
-//Hardwired, bleh... !!! FIX !!!
-uint32 width = 55 * FONT_WIDTH, height = 18 * FONT_HEIGHT;
-uint32 xpos = (640 - width) / 2, ypos = (480 - height) / 2;
-//     Window * window = new Window(8, 16, 50 * FONT_WIDTH, 21 * FONT_HEIGHT);
-       Window * window = new Window(xpos, ypos, width, height);
-//     window->AddElement(new Text(8, 8, "Virtual Jaguar 1.0.8"));
-//     window->AddElement(new Text(8, 8, "Virtual Jaguar CVS 20050110", 0xFF3030FF, 0xFF000000));
-//     window->AddElement(new Text(208, 8+0*FONT_HEIGHT, buf, 0xFF3030FF, 0xFF000000));
-       window->AddElement(new Text(248, 8+4*FONT_HEIGHT+5, buf, 0xFF3030FF, 0xFF000000));
-       window->AddElement(new Text(8, 8+0*FONT_HEIGHT, "Coders:"));
-       window->AddElement(new Text(16, 8+1*FONT_HEIGHT, "James L. Hammons (shamus)"));
-       window->AddElement(new Text(16, 8+2*FONT_HEIGHT, "Niels Wagenaar (nwagenaar)"));
-       window->AddElement(new Text(16, 8+3*FONT_HEIGHT, "Carwin Jones (Caz)"));
-       window->AddElement(new Text(16, 8+4*FONT_HEIGHT, "Adam Green"));
-       window->AddElement(new Text(8, 8+6*FONT_HEIGHT, "Testers:"));
-       window->AddElement(new Text(16, 8+7*FONT_HEIGHT, "Guruma"));
-       window->AddElement(new Text(8, 8+9*FONT_HEIGHT, "Thanks go out to:"));
-       window->AddElement(new Text(16, 8+10*FONT_HEIGHT, "Aaron Giles for the original CoJag"));
-       window->AddElement(new Text(16, 8+11*FONT_HEIGHT, "David Raingeard for the original VJ"));
-       window->AddElement(new Text(16, 8+12*FONT_HEIGHT, "Karl Stenerud for his Musashi 68K emu"));
-       window->AddElement(new Text(16, 8+13*FONT_HEIGHT, "Sam Lantinga for his amazing SDL libs"));
-       window->AddElement(new Text(16, 8+14*FONT_HEIGHT, "Ryan C. Gordon for VJ's web presence"));
-       window->AddElement(new Text(16, 8+15*FONT_HEIGHT, "Curt Vendel for various Jaguar goodies"));
-       window->AddElement(new Text(16, 8+16*FONT_HEIGHT, "The guys over at Atari Age ;-)"));
-//     window->AddElement(new Image(8, 8, &vj_title_small));
-//     window->AddElement(new Image(width - (vj_title_small.width + 8), 8, &vj_title_small));
-       window->AddElement(new Image(width - (((Bitmap *)vj_title_small)->width + 8), 8, &vj_title_small));
-
-       return window;
-}
-
-Window * MiscOptions(void)
-{
-       Window * window = new Window(8, 16, 304, 192);
-       window->AddElement(new PushButton(8, 8, &vjs.useJaguarBIOS, "BIOS"));
-       window->AddElement(new SlideSwitch(8, 32, &vjs.hardwareTypeNTSC, "PAL", "NTSC"));
-       window->AddElement(new PushButton(8, 64, &vjs.DSPEnabled, "DSP"));
-       window->AddElement(new SlideSwitch(24, 88, &vjs.usePipelinedDSP, "Original", "Pipelined"));
-       window->AddElement(new SlideSwitch(8, 120, (bool *)&vjs.glFilter, "Sharp", "Blurry"));
-       window->AddElement(new SlideSwitch(8, 152, (bool *)&vjs.renderType, "Normal render", "TV style"));
-
-       window->AddElement(new TextEdit(88, 8, vjs.ROMPath, 20, 0xFF8484FF, 0xFF000000));
-
-/*TextEdit(uint32 x, uint32 y, string s, uint32 mss = 10, uint32 fg = 0xFF8484FF,
-       uint32 bg = 0xFF84FF4D): Element(x, y, 0, 0), fgColor(fg), bgColor(bg), text(s),
-       caretPos(0), maxScreenSize(mss) {}*/
-// Missing:
-// * BIOS path
-// * ROM path
-// * EEPROM path
-// * joystick
-// * joystick port
-// * OpenGL?
-// * GL Filter type
-// * Window/fullscreen
-// * Key definitions
-
-       return window;
-}
-
-// Function prototype
-Window * CrashGracefullyCallback(void);
-
-//NOTE: Probably should set a flag as well telling it to do a full reset
-//      of the Jaguar hardware if this happens...
-void GUICrashGracefully(const char * reason)
-{
-       finished = true;                                                        // We're finished for now!
-
-       // Since this is used in the menu code as well, we could create another
-       // internal function called "PushWindowOnQueue" or somesuch
-       SDL_Event event;
-       event.type = SDL_USEREVENT;
-       event.user.code = MENU_ITEM_CHOSEN;
-       event.user.data1 = (void *)CrashGracefullyCallback;
-       SDL_PushEvent(&event);
-}
-
-Window * CrashGracefullyCallback(void)
-{
-       Window * window = new Window(8, 16, 304, 192);
-
-       window->AddElement(new Text(8, 8+0*FONT_HEIGHT, "We CRASHED!!!"));
-
-       return window;
-}
diff --git a/src/gui/gui.h b/src/gui/gui.h
deleted file mode 100644 (file)
index 6520f53..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// GUI.H
-//
-// Graphical User Interface support
-//
-
-#ifndef __GUI_H__
-#define __GUI_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void GUIInit(void);
-void GUIDone(void);
-bool GUIMain(char *);
-void GUICrashGracefully(const char *);
-
-// Exported vars
-
-extern bool showGUI;
-extern bool exitGUI;                                                   // Hmm.
-extern bool finished;                                                  // Current emulator loop is finished
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __GUI_H__
diff --git a/src/gui/guielements.h b/src/gui/guielements.h
deleted file mode 100644 (file)
index 3dece2f..0000000
+++ /dev/null
@@ -1,348 +0,0 @@
-//
-// GUIELEMENTS.H
-//
-// Graphical User Interface bitmaps and such
-//
-
-#ifndef __GUIELEMENTS_H__
-#define __GUIELEMENTS_H__
-
-#include "types.h"
-
-#if 0
-// Okay, this is ugly but works and I can't think of any better way to handle this. So what
-// we do when we pass the GIMP bitmaps into a function is pass them as a (void *) and then
-// cast them as type (Bitmap *) in order to use them. Yes, it's ugly. Come up with something
-// better!
-
-struct Bitmap {
-       unsigned int width;
-       unsigned int height;
-       unsigned int bytesPerPixel;                                     // 3:RGB, 4:RGBA
-       unsigned char pixelData[];
-};
-#endif
-
-//NOTE: 32-bit pixels are in the format of ABGR...
-//      This may not be endian safe... Mac users?
-//Using the GIMP C style bitmap is portable in that it's specified in bytes
-//but we can cast it in uint32s and thus it will display correctly regardless of
-//the underlying endianess. At least, in theory. ;-)
-
-uint32 mousePic[] = {
-       6, 8,
-
-       0xFF00FF00,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,              // +
-       0xFF00C600,0xFF00FF00,0x00000000,0x00000000,0x00000000,0x00000000,              // @+
-       0xFF00C600,0xFF00FF00,0xFF00FF00,0x00000000,0x00000000,0x00000000,              // @++
-       0xFF00C600,0xFF00C600,0xFF00FF00,0xFF00FF00,0x00000000,0x00000000,              // @@++
-       0xFF00C600,0xFF00C600,0xFF00FF00,0xFF00FF00,0xFF00FF00,0x00000000,              // @@+++
-       0xFF00C600,0xFF00C600,0xFF00C600,0xFF00FF00,0xFF00FF00,0xFF00FF00,              // @@@+++
-       0xFF00C600,0xFF00C600,0xFF00C600,0x00000000,0x00000000,0x00000000,              // @@@
-       0xFF00C600,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000               // @
-/*
-       0x03E0,0x0000,0x0000,0x0000,0x0000,0x0000,              // +
-       0x0300,0x03E0,0x0000,0x0000,0x0000,0x0000,              // @+
-       0x0300,0x03E0,0x03E0,0x0000,0x0000,0x0000,              // @++
-       0x0300,0x0300,0x03E0,0x03E0,0x0000,0x0000,              // @@++
-       0x0300,0x0300,0x03E0,0x03E0,0x03E0,0x0000,              // @@+++
-       0x0300,0x0300,0x0300,0x03E0,0x03E0,0x03E0,              // @@@+++
-       0x0300,0x0300,0x0300,0x0000,0x0000,0x0000,              // @@@
-       0x0300,0x0000,0x0000,0x0000,0x0000,0x0000               // @
-
-       0xFFFF,0x0000,0x0000,0x0000,0x0000,0x0000,              // +
-       0xE318,0xFFFF,0x0000,0x0000,0x0000,0x0000,              // @+
-       0xE318,0xFFFF,0xFFFF,0x0000,0x0000,0x0000,              // @++
-       0xE318,0xE318,0xFFFF,0xFFFF,0x0000,0x0000,              // @@++
-       0xE318,0xE318,0xFFFF,0xFFFF,0xFFFF,0x0000,              // @@+++
-       0xE318,0xE318,0xE318,0xFFFF,0xFFFF,0xFFFF,              // @@@+++
-       0xE318,0xE318,0xE318,0x0000,0x0000,0x0000,              // @@@
-       0xE318,0x0000,0x0000,0x0000,0x0000,0x0000               // @
-*/
-};
-
-uint32 upArrowBox[] = {
-       8, 8,
-
-       0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,                // ++++++++
-       0xFFF7D649,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFBD8400,                // +  @@  .
-       0xFFF7D649,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0xFFBD8400,                // + @@@@ .
-       0xFFF7D649,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFBD8400,                // +@@@@@@.
-       0xFFF7D649,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFBD8400,                // +  @@  .
-       0xFFF7D649,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFBD8400,                // +  @@  .
-       0xFFF7D649,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFBD8400,                // +  @@  .
-       0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400                 // ........
-};
-
-uint32 downArrowBox[] = {
-       8, 8,
-
-       0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,                // ++++++++
-       0xFFF7D649,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFBD8400,                // +  @@  .
-       0xFFF7D649,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFBD8400,                // +  @@  .
-       0xFFF7D649,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFBD8400,                // +  @@  .
-       0xFFF7D649,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFBD8400,                // +@@@@@@.
-       0xFFF7D649,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0xFFBD8400,                // + @@@@ .
-       0xFFF7D649,0x00000000,0x00000000,0xFFFFFFFF,0xFFFFFFFF,0x00000000,0x00000000,0xFFBD8400,                // +  @@  .
-       0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400                 // ........
-};
-
-/* GIMP RGBA C-Source image dump (unlit button (16x16).png.c) */
-#if 0
-const struct {
-  unsigned int          width;
-  unsigned int          height;
-  unsigned int          bytes_per_pixel; /* 3:RGB, 4:RGBA */
-  unsigned char         pixel_data[16 * 16 * 4 + 1];
-}
-#endif
-#warning Nonportable--!!! FIX !!!
-uint8 pbUp[] = {
-//  16, 16, 4,
-//nonportable--!!! FIX !!!
-       "\020\0\0\0"
-       "\020\0\0\0"
-       "\4\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\26\26\26\40`__\203\205rr\305\216mm\344\205"
-  "cc\345kWW\306@??\202\16\16\16\37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\2\2\2\4nll\205\277\217\217\372\251LL\377\23588\377\23155\377\227"
-  "22\377\22600\377\22477\377\204UU\371>;;\203\1\1\1\3\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\2\2\2\4\225\215\215\260\271hh\377\234==\377\22499\377\22366\377\22233"
-  "\377\22111\377\221//\377\220--\377\221,,\377\213==\377SJJ\254\1\1\1\4\0\0"
-  "\0\0\0\0\0\0omm\205\271hh\377\231==\377\224::\377\22377\377\22344\377\223"
-  "22\377\22100\377\220..\377\220--\377\220,,\377\220++\377\213<<\377=;;\204"
-  "\0\0\0\0\27\27\27\"\301\220\220\372\234==\377\224::\377\22388\377\22555\377"
-  "\22533\377\22411\377\223//\377\222--\377\220,,\377\220++\377\221**\377\222"
-  "**\377\204RR\372\16\16\16\37baa\205\252MM\377\224::\377\22377\377\22655\377"
-  "\22433\377\22111\377\216//\377\214..\377\214,,\377\217++\377\221++\377\221"
-  "**\377\224**\377\22422\377=<<\203\207tt\307\23599\377\22366\377\22355\377"
-  "\22533\377\22111\377\215//\377\213..\377\213--\377\212,,\377\212++\377\221"
-  "**\377\222**\377\226**\377\227**\377dNN\306\222oo\344\23155\377\22244\377"
-  "\22322\377\22411\377\216//\377\213..\377\213--\377\212,,\377\212++\377\212"
-  "**\377\220**\377\223**\377\230))\377\231**\377xTT\345\210ff\345\23033\377"
-  "\22111\377\22100\377\223//\377\215..\377\213--\377\212,,\377\212++\377\212"
-  "**\377\212**\377\221**\377\224))\377\232))\377\233))\377yTT\344lYY\304\230"
-  "11\377\221//\377\220..\377\222--\377\215,,\377\212,,\377\212++\377\212**"
-  "\377\212**\377\211**\377\224))\377\226))\377\235))\377\235**\377dNN\305?"
-  ">>\177\230;;\377\220..\377\220--\377\220,,\377\217++\377\212++\377\212**"
-  "\377\212**\377\212**\377\222))\377\225))\377\234))\377\237))\377\23455\377"
-  ";;;\200\15\15\15\34\207YY\367\222--\377\220,,\377\220++\377\221++\377\222"
-  "**\377\220**\377\221**\377\224))\377\224))\377\232))\377\237))\377\237**"
-  "\377\211UU\367\14\14\14\34\0\0\0\0:88{\221CC\377\220++\377\221++\377\221"
-  "**\377\222**\377\223**\377\224))\377\226))\377\234))\377\237))\377\237))"
-  "\377\232AA\377988{\0\0\0\0\0\0\0\0\1\1\1\2NGG\243\221CC\377\223++\377\224"
-  "**\377\226**\377\227))\377\232))\377\235))\377\236))\377\237**\377\232BB"
-  "\377OGG\244\1\1\1\2\0\0\0\0\0\0\0\0\0\0\0\0\1\1\1\2""766w\204WW\365\2279"
-  "9\377\231,,\377\231**\377\233**\377\236++\377\23388\377\207VV\365766w\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\12\12\12\30""777w]M"
-  "M\272rSS\330sSS\330]MM\270777w\12\12\12\30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0"
-};
-
-uint32 pushButtonUp[] = {
-       8, 8,
-
-       0x00000000, 0xFF1B1B1B, 0xFF545477, 0xFF525292, 0xFF474787, 0xFF363659, 0xFF0F0F0F, 0x00000000,
-       0xFF1B1B1C, 0xFF6666A7, 0xFF393995, 0xFF343492, 0xFF2F2F90, 0xFF2C2C90, 0xFF3B3B7E, 0xFF0F0F0F,
-       0xFF555578, 0xFF3A3A95, 0xFF353594, 0xFF303091, 0xFF2D2D8F, 0xFF2B2B90, 0xFF2A2A92, 0xFF333358,
-       0xFF545493, 0xFF343492, 0xFF303092, 0xFF2D2D8B, 0xFF2B2B8A, 0xFF2A2A8D, 0xFF292994, 0xFF3D3D83,
-       0xFF484889, 0xFF2F2F90, 0xFF2D2D8F, 0xFF2B2B8A, 0xFF2A2A89, 0xFF29298E, 0xFF292998, 0xFF3D3D84,
-       0xFF37375A, 0xFF2C2C90, 0xFF2B2B90, 0xFF2A2A8D, 0xFF29298E, 0xFF292995, 0xFF29299D, 0xFF34345B,
-       0xFF0E0E0E, 0xFF3E3E7F, 0xFF2A2A92, 0xFF292994, 0xFF292998, 0xFF29299D, 0xFF3C3C88, 0xFF0E0E0E,
-       0x00000000, 0xFF0D0D0D, 0xFF343456, 0xFF3D3D80, 0xFF3D3D82, 0xFF333358, 0xFF0D0D0D, 0x00000000
-};
-
-uint8 pbuAlpha[] = {
-       0xFF, 0xE4, 0xA0, 0x99, 0xA4, 0xBE, 0xF0, 0xFF,
-       0xE3, 0x85, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xF0,
-       0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
-       0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD,
-       0xA3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAC,
-       0xBD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF,
-       0xF1, 0xAD, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xF1,
-       0xFF, 0xF2, 0xC0, 0xAD, 0xAD, 0xC0, 0xF2, 0xFF
-};
-
-/* GIMP RGBA C-Source image dump (Lit Button (16x16).png.c) */
-#if 0
-const struct {
-  unsigned int          width;
-  unsigned int          height;
-  unsigned int          bytes_per_pixel; /* 3:RGB, 4:RGBA */
-  unsigned char         pixel_data[16 * 16 * 4 + 1];
-}
-#endif
-uint8 pbDown[] = {
-//  16, 16, 4,
-//nonportable--!!! FIX !!!
-       "\020\0\0\0"
-       "\020\0\0\0"
-       "\4\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\261\261\261\36\276\276\276\200\272\272\272"
-  "\302\255\255\255\343\236\236\236\343\214\214\214\302~~~\177uuu\35\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\223\223\223\3\332\332\332\200\353"
-  "\353\353\371\347\323\323\377\321\224\224\377\303rr\377\274jj\377\263uu\377"
-  "\237\212\212\377\205\205\205\370xxx\177ccc\3\0\0\0\0\0\0\0\0\0\0\0\0\236"
-  "\236\236\3\345\345\345\252\371\362\362\377\326\203\203\377\325BB\377\353"
-  "DD\377\365DD\377\365CC\377\351>>\377\31777\377\251TT\377\210\200\200\377"
-  "yyy\250```\3\0\0\0\0\0\0\0\0\333\333\333\200\371\362\362\377\320cc\377\356"
-  "GG\377\371HH\377\366FF\377\363CC\377\363BB\377\365AA\377\367@@\377\351<<"
-  "\377\257@@\377\203{{\377www\177\0\0\0\0\261\261\261\36\354\354\354\370\326"
-  "\204\204\377\356GG\377\370HH\377\362EE\377\351BB\377\340>>\377\337==\377"
-  "\347>>\377\357??\377\366??\377\352;;\377\242LL\377{{{\370sss\35\300\300\300"
-  "\200\350\324\324\377\326BB\377\371HH\377\362EE\377\341@@\377\324<<\377\326"
-  "<<\377\325;;\377\32199\377\335;;\377\360>>\377\370??\377\32033\377\205pp"
-  "\377xxx\177\274\274\274\302\322\225\225\377\353DD\377\366FF\377\351BB\377"
-  "\324<<\377\331==\377\335>>\377\335==\377\330;;\377\32088\377\347<<\377\365"
-  ">>\377\353::\377\225UU\377xxx\303\260\260\260\343\305tt\377\366EE\377\363"
-  "DD\377\340>>\377\326<<\377\335>>\377\342??\377\342>>\377\334<<\377\32388"
-  "\377\33599\377\363>>\377\371==\377\237II\377yyy\343\237\237\237\343\275l"
-  "l\377\365CC\377\363BB\377\337==\377\325;;\377\335==\377\342>>\377\342>>\377"
-  "\334<<\377\32388\377\33699\377\364>>\377\372==\377\240II\377yyy\343\216\216"
-  "\216\303\264vv\377\352??\377\365AA\377\347>>\377\32199\377\330;;\377\334"
-  "<<\377\334<<\377\327::\377\31777\377\350;;\377\371>>\377\357;;\377\227UU"
-  "\377xxx\302~~~\200\240\214\214\377\32188\377\367@@\377\357??\377\335;;\377"
-  "\32088\377\32388\377\32388\377\31777\377\33799\377\362==\377\376>>\377\326"
-  "55\377\204nn\377www\177vvv\34\205\205\205\370\253UU\377\353==\377\366??\377"
-  "\360>>\377\347<<\377\33599\377\33699\377\350;;\377\362==\377\375>>\377\362"
-  ";;\377\246HH\377zzz\370rrr\36\0\0\0\0xxx\177\210\200\200\377\261AA\377\353"
-  "==\377\370??\377\365>>\377\363>>\377\364>>\377\370>>\377\376>>\377\362<<"
-  "\377\266<<\377~uu\377www\177\0\0\0\0\0\0\0\0ddd\3yyy\250\203{{\377\243MM"
-  "\377\32155\377\354<<\377\371>>\377\372>>\377\357;;\377\32755\377\246HH\377"
-  "~uu\377xxx\250___\3\0\0\0\0\0\0\0\0\0\0\0\0hhh\3www\177{{{\370\205pp\377"
-  "\225UU\377\237JJ\377\240JJ\377\227UU\377\204nn\377zzz\370www\177```\3\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ttt\35www\200xxx\303yyy\343y"
-  "yy\343xxx\303xxx\177sss\35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",
-};
-
-uint32 pushButtonDown[] = {
-       8, 8,
-
-       0x00000000, 0xFF1B1B1B, 0xFF8B8B90, 0xFF8C8CAF, 0xFF767699, 0xFF56565B, 0xFF0F0F0F, 0x00000000,
-       0xFF1B1B1B, 0xFFB8B8D6, 0xFF5555E4, 0xFF4444F2, 0xFF4040F1, 0xFF4141D5, 0xFF626282, 0xFF0F0F0F,
-       0xFF8C8C91, 0xFF5555E4, 0xFF4444EF, 0xFF3E3EDC, 0xFF3B3BDB, 0xFF3D3DEC, 0xFF3E3ED4, 0xFF4B4B51,
-       0xFF8D8DB1, 0xFF4444F2, 0xFF3E3EDC, 0xFF3E3EDD, 0xFF3C3CDC, 0xFF3939D9, 0xFF3C3CF3, 0xFF59597E,
-       0xFF77779B, 0xFF4141F1, 0xFF3B3BDB, 0xFF3C3CDC, 0xFF3B3BDC, 0xFF3838D9, 0xFF3C3CF5, 0xFF595980,
-       0xFF57575D, 0xFF4242D8, 0xFF3D3DEC, 0xFF3939D9, 0xFF3838D9, 0xFF3C3CEF, 0xFF3D3DDC, 0xFF4C4C52,
-       0xFF101010, 0xFF636385, 0xFF3E3ED8, 0xFF3D3DF4, 0xFF3D3DF6, 0xFF3D3DDD, 0xFF5D5D83, 0xFF101010,
-       0x00000000, 0xFF101010, 0xFF4E4E55, 0xFF5B5B83, 0xFF5B5B84, 0xFF4D4D54, 0xFF101010, 0x00000000
-};
-
-uint8 pbdAlpha[] = {
-       0xFF, 0xE4, 0x72, 0x68, 0x7E, 0xA7, 0xF0, 0xFF,
-       0xE4, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x93, 0xF0,
-       0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2,
-       0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A,
-       0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A,
-       0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1,
-       0xEF, 0x91, 0x00, 0x00, 0x00, 0x00, 0x96, 0xEF,
-       0xFF, 0xEF, 0xAE, 0x98, 0x97, 0xAF, 0xEF, 0xFF
-};
-
-uint32 slideSwitchUp[] = {
-       8, 16,
-
-//0C7F -> 000011 00011 11111 -> 0000 1100 0001 1000 1111 1111 -> 0C 18 FF
-       0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,                // ++++++++
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400                 // ........
-};
-
-uint32 slideSwitchDown[] = {
-       8, 16,
-
-       0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,0xFFF7D649,                // ++++++++
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0xFFBD8400,                // +.......
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFF7D649,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFFF180C,0xFFBD8400,                // +      .
-       0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400,0xFFBD8400                 // ........
-};
-
-#define CLOSEBOX_WIDTH         15
-#define CLOSEBOX_HEIGHT                15
-
-uint32 closeBox[] = {
-       15, 15,
-
-       0x00000000, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0x00000000,
-       0xFF3838ED, 0xFF5858E7, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF5858E7, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF3838ED, 0xFF3838ED, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF3838ED, 0xFF3838ED, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF3838ED, 0xFF3838ED, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF3838ED, 0xFF3838ED, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF000000, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF5858E7, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF5858E7, 0xFF3838ED,
-       0x00000000, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0x00000000
-};
-
-uint32 closeBoxHover[] = {
-       15, 15,
-
-       0x00000000, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0x00000000,
-       0xFF3838ED, 0xFF5858E7, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF5858E7, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF3838ED, 0xFF3838ED, 0xFF40AFFF, 0xFF40AFFF, 0xFF40AFFF, 0xFF40AFFF, 0xFF40AFFF, 0xFF3838ED, 0xFF3838ED, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF52B7FF, 0xFF52B7FF, 0xFF52B7FF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF40AFFF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF63BEFF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF40AFFF, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF40AFFF, 0xFF52B7FF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF52B7FF, 0xFF40AFFF, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF40AFFF, 0xFF52B7FF, 0xFF63BEFF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF63BEFF, 0xFF52B7FF, 0xFF40AFFF, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF40AFFF, 0xFF52B7FF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF52B7FF, 0xFF40AFFF, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF40AFFF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF63BEFF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF40AFFF, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF52B7FF, 0xFF52B7FF, 0xFF52B7FF, 0xFF3838ED, 0xFF6B6BFB, 0xFF3838ED, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF3838ED, 0xFF3838ED, 0xFF40AFFF, 0xFF40AFFF, 0xFF40AFFF, 0xFF40AFFF, 0xFF40AFFF, 0xFF3838ED, 0xFF3838ED, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF6B6BFB, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF20A2FF, 0xFF6B6BFB, 0xFF3838ED,
-       0xFF3838ED, 0xFF5858E7, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF6B6BFB, 0xFF5858E7, 0xFF3838ED,
-       0x00000000, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0x00000000
-};
-
-uint32 closeBoxDown[] = {
-       15, 15,
-
-       0x00000000, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0x00000000,
-       0xFF3838ED, 0xFF1D1DE2, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF1D1DE2, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF3838ED, 0xFF3838ED, 0xFF0786E2, 0xFF0786E2, 0xFF0786E2, 0xFF0786E2, 0xFF0786E2, 0xFF3838ED, 0xFF3838ED, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF0077CC, 0xFF0077CC, 0xFF0077CC, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF0786E2, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF006EBD, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF0786E2, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF0786E2, 0xFF0077CC, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF0077CC, 0xFF0786E2, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF0786E2, 0xFF0077CC, 0xFF006EBD, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF006EBD, 0xFF0077CC, 0xFF0786E2, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF0786E2, 0xFF0077CC, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF0077CC, 0xFF0786E2, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF0786E2, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF006EBD, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF0786E2, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF0077CC, 0xFF0077CC, 0xFF0077CC, 0xFF3838ED, 0xFF2B2BC0, 0xFF3838ED, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF3838ED, 0xFF3838ED, 0xFF0786E2, 0xFF0786E2, 0xFF0786E2, 0xFF0786E2, 0xFF0786E2, 0xFF3838ED, 0xFF3838ED, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF2B2BC0, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF1F9DF7, 0xFF2B2BC0, 0xFF3838ED,
-       0xFF3838ED, 0xFF1D1DE2, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF2B2BC0, 0xFF1D1DE2, 0xFF3838ED,
-       0x00000000, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0xFF3838ED, 0x00000000
-};
-
-#endif // __GUIELEMENTS_H__
diff --git a/src/gui/guimisc.cpp b/src/gui/guimisc.cpp
deleted file mode 100644 (file)
index dcd0e9c..0000000
+++ /dev/null
@@ -1,397 +0,0 @@
-//
-// Miscellaneous GUI utility functions
-//
-// by James L. Hammons
-//
-
-#include "guimisc.h"
-
-#include <stdarg.h>
-#include "font1.h"
-#include "font14pt.h"
-#include "guielements.h"       // Make this go away...
-#include "sdlemu_opengl.h"
-#include "vj_title_small.c"
-//#include "video.h"
-
-//
-// Case insensitive string compare function
-// Taken straight out of Thinking In C++ by Bruce Eckel. Thanks Bruce!
-//
-
-int stringCmpi(const std::string &s1, const std::string &s2)
-{
-       // Select the first element of each string:
-       std::string::const_iterator p1 = s1.begin(), p2 = s2.begin();
-
-       while (p1 != s1.end() && p2 != s2.end())                // Don�t run past the end
-       {
-               if (toupper(*p1) != toupper(*p2))                       // Compare upper-cased chars
-                       return (toupper(*p1) < toupper(*p2) ? -1 : 1);// Report which was lexically greater
-
-               p1++;
-               p2++;
-       }
-
-       // If they match up to the detected eos, say which was longer. Return 0 if the same.
-       return s2.size() - s1.size();
-}
-
-//
-// Draw text at the given x/y coordinates. Can invert text as well.
-//
-void DrawString(uint32 * screen, uint32 x, uint32 y, bool invert, const char * text, ...)
-{
-       char string[4096];
-       va_list arg;
-
-       va_start(arg, text);
-       vsprintf(string, text, arg);
-       va_end(arg);
-
-       uint32 pitch = sdlemuGetOverlayWidthInPixels();//GetSDLScreenWidthInPixels();
-       uint32 length = strlen(string), address = x + (y * pitch);
-
-       uint32 color1 = 0x0080FF;
-       uint8 nBlue = (color1 >> 16) & 0xFF, nGreen = (color1 >> 8) & 0xFF, nRed = color1 & 0xFF;
-       uint8 xorMask = (invert ? 0xFF : 0x00);
-
-       for(uint32 i=0; i<length; i++)
-       {
-               uint8 c = string[i];
-               uint32 fontAddr = (uint32)(c < 32 ? 0 : c - 32) * FONT_WIDTH * FONT_HEIGHT;
-
-               for(uint32 yy=0; yy<FONT_HEIGHT; yy++)
-               {
-                       for(uint32 xx=0; xx<FONT_WIDTH; xx++)
-                       {
-                               uint32 existingColor = *(screen + address + xx + (yy * pitch));
-
-                               uint8 eBlue = (existingColor >> 16) & 0xFF,
-                                       eGreen = (existingColor >> 8) & 0xFF,
-                                       eRed = existingColor & 0xFF;
-
-                               uint8 trans = font2[fontAddr] ^ xorMask;
-                               uint8 invTrans = trans ^ 0xFF;
-
-                               uint32 bRed = (eRed * invTrans + nRed * trans) / 255,
-                                       bGreen = (eGreen * invTrans + nGreen * trans) / 255,
-                                       bBlue = (eBlue * invTrans + nBlue * trans) / 255;
-
-                               *(screen + address + xx + (yy * pitch)) = 0xFF000000 | (bBlue << 16) | (bGreen << 8) | bRed;
-                               fontAddr++;
-                       }
-               }
-
-               address += FONT_WIDTH;
-       }
-}
-
-//
-// Draw text at the given x/y coordinates, using FG/BG colors.
-//
-void DrawStringOpaque(uint32 * screen, uint32 x, uint32 y, uint32 color1, uint32 color2, const char * text, ...)
-{
-       char string[4096];
-       va_list arg;
-
-       va_start(arg, text);
-       vsprintf(string, text, arg);
-       va_end(arg);
-
-       uint32 pitch = sdlemuGetOverlayWidthInPixels();
-       uint32 length = strlen(string), address = x + (y * pitch);
-
-       uint8 eBlue = (color2 >> 16) & 0xFF, eGreen = (color2 >> 8) & 0xFF, eRed = color2 & 0xFF,
-               nBlue = (color1 >> 16) & 0xFF, nGreen = (color1 >> 8) & 0xFF, nRed = color1 & 0xFF;
-
-       for(uint32 i=0; i<length; i++)
-       {
-               uint8 c = string[i];
-               c = (c < 32 ? 0 : c - 32);
-               uint32 fontAddr = (uint32)c * FONT_WIDTH * FONT_HEIGHT;
-
-               for(uint32 yy=0; yy<FONT_HEIGHT; yy++)
-               {
-                       for(uint32 xx=0; xx<FONT_WIDTH; xx++)
-                       {
-                               uint8 trans = font2[fontAddr++];
-                               uint8 invTrans = trans ^ 0xFF;
-
-                               uint32 bRed   = (eRed   * invTrans + nRed   * trans) / 255;
-                               uint32 bGreen = (eGreen * invTrans + nGreen * trans) / 255;
-                               uint32 bBlue  = (eBlue  * invTrans + nBlue  * trans) / 255;
-
-                               *(screen + address + xx + (yy * pitch)) = 0xFF000000 | (bBlue << 16) | (bGreen << 8) | bRed;
-                       }
-               }
-
-               address += FONT_WIDTH;
-       }
-}
-
-//
-// Draw text at the given x/y coordinates with transparency (0 is fully opaque, 32 is fully transparent).
-//
-void DrawStringTrans(uint32 * screen, uint32 x, uint32 y, uint32 color, uint8 trans, const char * text, ...)
-{
-       char string[4096];
-       va_list arg;
-
-       va_start(arg, text);
-       vsprintf(string, text, arg);
-       va_end(arg);
-
-       uint32 pitch = sdlemuGetOverlayWidthInPixels();//GetSDLScreenWidthInPixels();
-       uint32 length = strlen(string), address = x + (y * pitch);
-
-       for(uint32 i=0; i<length; i++)
-       {
-               uint32 fontAddr = (uint32)string[i] * 64;
-
-               for(uint32 yy=0; yy<8; yy++)
-               {
-                       for(uint32 xx=0; xx<8; xx++)
-                       {
-                               if (font1[fontAddr])
-                               {
-                                       uint32 existingColor = *(screen + address + xx + (yy * pitch));
-
-                                       uint8 eBlue = (existingColor >> 16) & 0xFF,
-                                               eGreen = (existingColor >> 8) & 0xFF,
-                                               eRed = existingColor & 0xFF,
-//This could be done ahead of time, instead of on each pixel...
-                                               nBlue = (color >> 16) & 0xFF,
-                                               nGreen = (color >> 8) & 0xFF,
-                                               nRed = color & 0xFF;
-
-//This could be sped up by using a table of 5 + 5 + 5 bits (32 levels transparency -> 32768 entries)
-//Here we've modified it to have 33 levels of transparency (could have any # we want!)
-//because dividing by 32 is faster than dividing by 31...!
-                                       uint8 invTrans = 32 - trans;
-
-                                       uint32 bRed = (eRed * trans + nRed * invTrans) / 32;
-                                       uint32 bGreen = (eGreen * trans + nGreen * invTrans) / 32;
-                                       uint32 bBlue = (eBlue * trans + nBlue * invTrans) / 32;
-
-                                       *(screen + address + xx + (yy * pitch)) = 0xFF000000 | (bBlue << 16) | (bGreen << 8) | bRed;
-                               }
-
-                               fontAddr++;
-                       }
-               }
-
-               address += 8;
-       }
-}
-
-//
-// Draw text at the given x/y coordinates, using FG color and overlay alpha blending.
-//
-void DrawString2(uint32 * screen, uint32 x, uint32 y, uint32 color, uint8 transparency, const char * text, ...)
-{
-       char string[4096];
-       va_list arg;
-
-       va_start(arg, text);
-       vsprintf(string, text, arg);
-       va_end(arg);
-
-       uint32 pitch = sdlemuGetOverlayWidthInPixels();
-       uint32 length = strlen(string), address = x + (y * pitch);
-
-       color &= 0x00FFFFFF;                                            // Just in case alpha was passed in...
-
-       for(uint32 i=0; i<length; i++)
-       {
-               uint8 c = string[i];
-               c = (c < 32 ? 0 : c - 32);
-               uint32 fontAddr = (uint32)c * FONT_WIDTH * FONT_HEIGHT;
-
-               for(uint32 yy=0; yy<FONT_HEIGHT; yy++)
-               {
-                       for(uint32 xx=0; xx<FONT_WIDTH; xx++)
-                       {
-                               uint8 fontTrans = font2[fontAddr++];
-                               uint32 newTrans = (fontTrans * transparency / 255) << 24;
-                               uint32 pixel = newTrans | color;
-
-                               *(screen + address + xx + (yy * pitch)) = pixel;
-                       }
-               }
-
-               address += FONT_WIDTH;
-       }
-}
-
-//
-// Draw "picture"
-// Uses zero as transparent color
-// Can also use an optional alpha channel
-// Alpha channel is now mandatory! ;-)
-//
-//void DrawTransparentBitmap(int16 * screen, uint32 x, uint32 y, uint16 * bitmap, uint8 * alpha/*=NULL*/)
-/*void DrawTransparentBitmap(uint32 * screen, uint32 x, uint32 y, uint32 * bitmap, uint8 * alpha)
-{
-       uint32 width = bitmap[0], height = bitmap[1];
-       bitmap += 2;
-
-//     uint32 pitch = GetSDLScreenPitch() / 2;                 // Returns pitch in bytes but we need words...
-       uint32 pitch = sdlemuGetOverlayWidthInPixels();//GetSDLScreenWidthInPixels();
-       uint32 address = x + (y * pitch);
-
-       for(uint32 yy=0; yy<height; yy++)
-       {
-               for(uint32 xx=0; xx<width; xx++)
-               {
-                       if (alpha == NULL)
-                       {
-                               if (*bitmap && x + xx < pitch)                  // NOTE: Still doesn't clip the Y val...
-                                       *(screen + address + xx + (yy * pitch)) = *bitmap;
-                       }
-                       else
-                       {
-                               uint8 trans = *alpha;
-                               uint32 color = *bitmap;
-                               uint32 existingColor = *(screen + address + xx + (yy * pitch));
-
-                               uint8 eRed = existingColor & 0xFF,
-                                       eGreen = (existingColor >> 8) & 0xFF,
-                                       eBlue = (existingColor >> 16) & 0xFF,
-
-                                       nRed = color & 0xFF,
-                                       nGreen = (color >> 8) & 0xFF,
-                                       nBlue = (color >> 16) & 0xFF;
-
-                               uint8 invTrans = 255 - trans;
-                               uint32 bRed = (eRed * trans + nRed * invTrans) / 255;
-                               uint32 bGreen = (eGreen * trans + nGreen * invTrans) / 255;
-                               uint32 bBlue = (eBlue * trans + nBlue * invTrans) / 255;
-
-                               uint32 blendedColor = 0xFF000000 | bRed | (bGreen << 8) | (bBlue << 16);
-
-                               *(screen + address + xx + (yy * pitch)) = blendedColor;
-
-                               alpha++;
-                       }
-
-                       bitmap++;
-               }
-       }
-}*/
-void DrawTransparentBitmapDeprecated(uint32 * screen, uint32 x, uint32 y, uint32 * bitmap)
-{
-       uint32 width = bitmap[0], height = bitmap[1];
-       bitmap += 2;
-
-       uint32 pitch = sdlemuGetOverlayWidthInPixels();//GetSDLScreenWidthInPixels();
-       uint32 address = x + (y * pitch);
-
-       for(uint32 yy=0; yy<height; yy++)
-       {
-               for(uint32 xx=0; xx<width; xx++)
-               {
-                       uint32 color = *bitmap;
-                       uint32 blendedColor = color;
-                       uint32 existingColor = *(screen + address + xx + (yy * pitch));
-
-                       if (existingColor >> 24 != 0x00)                // Pixel needs blending
-                       {
-                               uint8 trans = color >> 24;
-                               uint8 invTrans = trans ^ 0xFF;//255 - trans;
-
-                               uint8 eRed = existingColor & 0xFF,
-                                       eGreen = (existingColor >> 8) & 0xFF,
-                                       eBlue = (existingColor >> 16) & 0xFF,
-
-                                       nRed = color & 0xFF,
-                                       nGreen = (color >> 8) & 0xFF,
-                                       nBlue = (color >> 16) & 0xFF;
-
-                               uint32 bRed = (eRed * invTrans + nRed * trans) / 255;
-                               uint32 bGreen = (eGreen * invTrans + nGreen * trans) / 255;
-                               uint32 bBlue = (eBlue * invTrans + nBlue * trans) / 255;
-
-                               blendedColor = 0xFF000000 | bRed | (bGreen << 8) | (bBlue << 16);
-                       }
-
-                       *(screen + address + xx + (yy * pitch)) = blendedColor;
-                       bitmap++;
-               }
-       }
-}
-
-void DrawTransparentBitmap(uint32 * screen, uint32 x, uint32 y, const void * bitmap)
-{
-       uint32 pitch = sdlemuGetOverlayWidthInPixels();
-       uint32 address = x + (y * pitch);
-       uint32 count = 0;
-
-       for(uint32 yy=0; yy<((Bitmap *)bitmap)->height; yy++)
-       {
-               for(uint32 xx=0; xx<((Bitmap *)bitmap)->width; xx++)
-               {
-                       uint32 color = ((uint32 *)((Bitmap *)bitmap)->pixelData)[count];
-                       uint32 blendedColor = color;
-                       uint32 existingColor = *(screen + address + xx + (yy * pitch));
-
-                       if (existingColor >> 24 != 0x00)        // Pixel needs blending
-                       {
-                               uint8 trans = color >> 24;
-                               uint8 invTrans = trans ^ 0xFF;
-
-                               uint8 eRed = existingColor & 0xFF,
-                                       eGreen = (existingColor >> 8) & 0xFF,
-                                       eBlue = (existingColor >> 16) & 0xFF,
-
-                                       nRed = color & 0xFF,
-                                       nGreen = (color >> 8) & 0xFF,
-                                       nBlue = (color >> 16) & 0xFF;
-
-                               uint32 bRed = (eRed * invTrans + nRed * trans) / 255;
-                               uint32 bGreen = (eGreen * invTrans + nGreen * trans) / 255;
-                               uint32 bBlue = (eBlue * invTrans + nBlue * trans) / 255;
-
-// Instead of $FF, should use the alpha from the destination pixel as the final alpha value...
-                               blendedColor = 0xFF000000 | bRed | (bGreen << 8) | (bBlue << 16);
-                       }
-
-                       *(screen + address + xx + (yy * pitch)) = blendedColor;
-                       count++;
-               }
-       }
-}
-
-//
-// Draw a bitmap without using blending
-//
-void DrawBitmap(uint32 * screen, uint32 x, uint32 y, const void * bitmap)
-{
-       uint32 pitch = sdlemuGetOverlayWidthInPixels();
-       uint32 address = x + (y * pitch);
-       uint32 count = 0;
-
-       for(uint32 yy=0; yy<((Bitmap *)bitmap)->height; yy++)
-       {
-               for(uint32 xx=0; xx<((Bitmap *)bitmap)->width; xx++)
-               {
-                       *(screen + address + xx + (yy * pitch)) = ((uint32 *)((Bitmap *)bitmap)->pixelData)[count];
-                       count++;
-               }
-       }
-}
-
-//
-// Fill a portion of the screen with the passed in color
-//
-void FillScreenRectangle(uint32 * screen, uint32 x, uint32 y, uint32 w, uint32 h, uint32 color)
-//void ClearScreenRectangle(uint32 * screen, uint32 x, uint32 y, uint32 w, uint32 h)
-{
-       uint32 pitch = sdlemuGetOverlayWidthInPixels();
-       uint32 address = x + (y * pitch);
-
-       for(uint32 yy=0; yy<h; yy++)
-               for(uint32 xx=0; xx<w; xx++)
-                       *(screen + address + xx + (yy * pitch)) = color;
-}
-
diff --git a/src/gui/guimisc.h b/src/gui/guimisc.h
deleted file mode 100644 (file)
index 498e561..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-//
-// Miscellaneous GUI utility functions
-//
-// by James L. Hammons
-//
-
-#ifndef __GUIMISC_H__
-#define __GUIMISC_H__
-
-#include <string>
-#include "types.h"
-
-int stringCmpi(const std::string &, const std::string &);
-//void DrawTransparentBitmap(uint32 * screen, uint32 x, uint32 y, uint32 * bitmap, uint8 * alpha = NULL);
-void DrawTransparentBitmapDeprecated(uint32 * screen, uint32 x, uint32 y, uint32 * bitmap);
-void DrawTransparentBitmap(uint32 * screen, uint32 x, uint32 y, const void * bitmap);
-void DrawBitmap(uint32 * screen, uint32 x, uint32 y, const void * bitmap);
-//Should call this FillScreenRectangle with a number representing the RGBA value to fill. !!! FIX !!!
-//void ClearScreenRectangle(uint32 * screen, uint32 x, uint32 y, uint32 w, uint32 h);
-void FillScreenRectangle(uint32 * screen, uint32 x, uint32 y, uint32 w, uint32 h, uint32 color);
-void DrawStringTrans(uint32 * screen, uint32 x, uint32 y, uint32 color, uint8 opacity, const char * text, ...);
-void DrawStringOpaque(uint32 * screen, uint32 x, uint32 y, uint32 color1, uint32 color2, const char * text, ...);
-void DrawString(uint32 * screen, uint32 x, uint32 y, bool invert, const char * text, ...);
-void DrawString2(uint32 * screen, uint32 x, uint32 y, uint32 color, uint8 transparency, const char * text, ...);
-
-// Useful enumerations
-
-enum { WINDOW_CLOSE, MENU_ITEM_CHOSEN };
-
-// This is for font2 (crappy--fix!!!)
-
-#define FONT_WIDTH             8
-#define FONT_HEIGHT            16
-
-// And this is for the various closeBox stuff--crappy--fix!!!
-
-#define CLOSEBOX_WIDTH         15
-#define CLOSEBOX_HEIGHT                15
-
-// Okay, this is ugly but works and I can't think of any better way to handle this. So what
-// we do when we pass the GIMP bitmaps into a function is pass them as a (void *) and then
-// cast them as type (Bitmap *) in order to use them. Yes, it's ugly. Come up with something
-// better!
-
-struct Bitmap {
-       unsigned int width;
-       unsigned int height;
-       unsigned int bytesPerPixel;                                     // 3:RGB, 4:RGBA
-       unsigned char pixelData[];
-};
-
-// GUI bitmaps/fonts (exported)
-
-extern char font1[];
-extern char font2[];
-
-extern uint32 mousePic[];
-extern uint32 upArrowBox[];
-extern uint32 downArrowBox[];
-extern uint32 pushButtonUp[];
-extern uint8 pbuAlpha[];
-extern uint32 pushButtonDown[];
-extern uint8 pbdAlpha[];
-extern uint32 slideSwitchUp[];
-extern uint32 slideSwitchDown[];
-extern uint32 closeBox[];
-extern uint32 closeBoxHover[];
-extern uint32 closeBoxDown[];
-
-extern uint8 pbUp[];
-extern uint8 pbDown[];
-extern uint8 vj_title_small[];
-
-#endif // __GUIMISC_H__
diff --git a/src/gui/image.cpp b/src/gui/image.cpp
deleted file mode 100644 (file)
index c48a6ff..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-//
-// Static image class
-//
-// by James L. Hammons
-//
-
-#include "image.h"
-
-#include "guimisc.h"
-
-Image::Image(uint32 x, uint32 y, const void * img):
-       Element(x, y, 0, 0), image(img)
-{
-}
-
-void Image::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       if (image != NULL)
-               DrawTransparentBitmap(screenBuffer, extents.x + offsetX, extents.y + offsetY, image);
-}
diff --git a/src/gui/image.h b/src/gui/image.h
deleted file mode 100644 (file)
index 05de59c..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Static image class
-//
-// by James L. Hammons
-//
-
-#ifndef __IMAGE_H__
-#define __IMAGE_H__
-
-#include "element.h"
-
-class Image: public Element
-{
-       public:
-               Image(uint32 x, uint32 y, const void * img);
-               virtual void HandleKey(SDLKey key) {}
-               virtual void HandleMouseMove(uint32 x, uint32 y) {}
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown) {}
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element *) {}
-
-       protected:
-               uint32 fgColor, bgColor;
-               const void * image;
-};
-
-#endif // __IMAGE_H__
diff --git a/src/gui/imagedelegate.cpp b/src/gui/imagedelegate.cpp
new file mode 100644 (file)
index 0000000..875f1f7
--- /dev/null
@@ -0,0 +1,177 @@
+//
+// imagedelegate.cpp - Qt Model/View rendering class
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  02/04/2010  Created this file
+//
+
+// This class takes care of rendering items in our custom model in the ListView
+// class utilized in FilePicker.
+
+#include "imagedelegate.h"
+
+#include "filedb.h"
+#include "filelistmodel.h"
+
+//ImageDelegate::ImageDelegate(QObject * parent): QAbstractItemDelegate(parent)//, pixelSize(12)
+//{
+//}
+
+ImageDelegate::ImageDelegate()
+{
+       QImage cartImg(":/res/cart-blank.png");
+       QPainter painter(&cartImg);
+       painter.drawPixmap(23, 87, QPixmap(":/res/label-blank.png"));
+       painter.end();
+       cartSmall = cartImg.scaled(488/4, 395/4, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+}
+
+/*
+Each item is rendered by the delegate's paint() function. The view calls this function with a ready-to-use QPainter object, style information that the delegate should use to correctly draw the item, and an index to the item in the model:
+*/
+
+void ImageDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
+{
+       if (option.state & QStyle::State_Selected)
+               painter->fillRect(option.rect, option.palette.highlight());
+
+/*
+The first task the delegate has to perform is to draw the item's background correctly. Usually, selected items appear differently to non-selected items, so we begin by testing the state passed in the style option and filling the background if necessary.
+
+The radius of each circle is calculated in the following lines of code:
+*/
+
+#if 0
+       int size = qMin(option.rect.width(), option.rect.height());
+       int brightness = index.model()->data(index, Qt::DisplayRole).toInt();
+       double radius = (size/2.0) - (brightness/255.0 * size/2.0);
+       if (radius == 0.0)
+               return;
+#endif
+
+/*
+First, the largest possible radius of the circle is determined by taking the smallest dimension of the style option's rect attribute. Using the model index supplied, we obtain a value for the brightness of the relevant pixel in the image. The radius of the circle is calculated by scaling the brightness to fit within the item and subtracting it from the largest possible radius.
+*/
+
+       painter->save();
+#if 0
+       painter->setRenderHint(QPainter::Antialiasing, true);
+       painter->setPen(Qt::NoPen);
+
+/*
+We save the painter's state, turn on antialiasing (to obtain smoother curves), and turn off the pen.
+*/
+
+       if (option.state & QStyle::State_Selected)
+               painter->setBrush(option.palette.highlightedText());
+       else
+               painter->setBrush(QBrush(Qt::black));
+
+/*
+The foreground of the item (the circle representing a pixel) must be rendered using an appropriate brush. For unselected items, we will use a solid black brush; selected items are drawn using a predefined brush from the style option's palette.
+*/
+
+       painter->drawEllipse(QRectF(option.rect.x() + option.rect.width()/2 - radius,
+               option.rect.y() + option.rect.height()/2 - radius, 2*radius, 2*radius));
+#else
+//     painter->drawPixmap(option.rect.x()+8, option.rect.y()+8, 200, 94, QPixmap(":/res/labels/rayman.jpg"));
+//     painter->drawPixmap(option.rect.x()+13, option.rect.y()+51, 433/2, 203/2, QPixmap(":/res/labels/rayman.jpg"));
+//     painter->drawPixmap(option.rect.x(), option.rect.y(), 488/2, 395/2, QPixmap(":/res/cart-blank.png"));
+
+
+       // This is crappy. We really should have a properly scaled image ready to go so we
+       // don't get Qt's default ugly looking fast scaling...
+#warning "!!! FIX !!! Need to create properly scaled down cart/label images!"
+//     unsigned long i = index.model()->data(index, Qt::DisplayRole).toUInt();
+#if 0
+       unsigned long i = index.model()->data(index, Qt::DisplayRole).toUInt();
+       QString filename = index.model()->data(index, Qt::EditRole).toString();
+       QImage label = index.model()->data(index, Qt::DecorationRole).value<QImage>();
+#else
+       unsigned long i = index.model()->data(index, FLM_INDEX).toUInt();
+       QString filename = index.model()->data(index, FLM_FILENAME).toString();
+       QImage label = index.model()->data(index, FLM_LABEL).value<QImage>();
+#endif
+       QString nameToDraw;
+
+       if (i == 0xFFFFFFFF)    // Not found...
+       {
+               int lastSlashPos = filename.lastIndexOf('/');
+               nameToDraw = "\"" + filename.mid(lastSlashPos + 1) + "\"";
+       }
+       else
+               nameToDraw = romList[i].name;
+#if 0
+       if (role == Qt::DecorationRole)
+               return list.at(index.row()).label;
+       else if (role == Qt::DisplayRole)
+               return (uint)list.at(index.row()).dbIndex;
+       else if (role == Qt::EditRole)
+               return list.at(index.row()).filename;
+#endif
+
+//     if (romList[i].file[0] == 0)
+       if (label.isNull())
+       {
+//     painter->drawPixmap(option.rect.x()+14, option.rect.y()+50, 433/2, 203/2, QPixmap(":/res/label-blank.png"));
+//             painter->drawPixmap(option.rect.x()+7, option.rect.y()+25, 433/4, 203/4, QPixmap(":/res/label-blank.png"));
+               painter->drawImage(option.rect.x() + 2, option.rect.y() + 2, cartSmall);
+//Need to query the model for the data we're supposed to draw here...
+//     painter->drawText(17, 73, QString(romList[i].name));
+//     painter->setPen(Qt::white);
+               painter->setPen(QColor(255, 128, 0, 255));
+//     painter->drawText(QRect(option.rect.x()+20, option.rect.y()+73, 196, 70), Qt::TextWordWrap | Qt::AlignHCenter, QString(romList[i].name));
+               painter->drawText(QRect(option.rect.x()+10, option.rect.y()+36, 196/2, 70/2),
+                       Qt::TextWordWrap | Qt::AlignHCenter, nameToDraw);
+       }
+       else
+       {
+#if 0
+               QString filename(romList[i].file);
+               filename.prepend("./label/");
+               QImage img(filename);
+               painter->drawImage(QRect(option.rect.x()+7, option.rect.y()+25, 433/4, 203/4), img);
+#else
+               painter->drawPixmap(option.rect.x() + 2, option.rect.y() + 2, 488/4, 395/4, QPixmap(":/res/cart-blank.png"));
+               painter->drawImage(QRect(option.rect.x()+2+7, option.rect.y()+2+25, 433/4, 203/4), label);
+#endif
+       }
+//26x100
+#endif
+       painter->restore();
+}
+
+/*
+Finally, we paint the circle within the rectangle specified by the style option and we call restore() on the painter.
+
+The paint() function does not have to be particularly complicated; it is only necessary to ensure that the state of the painter when the function returns is the same as it was when it was called. This usually means that any transformations applied to the painter must be preceded by a call to QPainter::save() and followed by a call to QPainter::restore().
+
+The delegate's sizeHint() function returns a size for the item based on the predefined pixel size, initially set up in the constructor:
+*/
+
+QSize ImageDelegate::sizeHint(const QStyleOptionViewItem & /* option */, const QModelIndex & /* index */) const
+{
+       // 488x395 --> blank cart (full size)
+       // 400x188 --> label (full size) 433x203 <-- (actually, it's this)
+
+       // 200x94 is shrunk dimension...
+//     return QSize(100, 47);
+//     return QSize(216, 110);
+//     return QSize(488/2, 395/2);
+       return QSize((488/4) + 4, (395/4) + 4);
+}
+
+/*
+The delegate's size is updated whenever the pixel size is changed. We provide a custom slot to do this:
+*/
+
+//void ImageDelegate::setPixelSize(int size)
+//{
+//     pixelSize = size;
+//}
diff --git a/src/gui/imagedelegate.h b/src/gui/imagedelegate.h
new file mode 100644 (file)
index 0000000..8ba69dc
--- /dev/null
@@ -0,0 +1,29 @@
+//
+// imagedelegate.h: Class definition
+//
+
+#ifndef __IMAGEDELEGATE_H__
+#define __IMAGEDELEGATE_H__
+
+#include <QtGui>
+
+class ImageDelegate: public QAbstractItemDelegate
+{
+//     Q_OBJECT
+
+       public:
+//             ImageDelegate(QObject * parent = 0);
+               ImageDelegate();
+
+               void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const;
+               QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const;
+
+//     public slots:
+//             void setPixelSize(int size);
+
+       private:
+//             int pixelSize;
+               QImage cartSmall;
+};
+
+#endif // __IMAGEDELEGATE_H__
diff --git a/src/gui/listbox.cpp b/src/gui/listbox.cpp
deleted file mode 100644 (file)
index 9b47ff9..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-//
-// ListBox class
-//
-// by James L. Hammons
-//
-
-#include "listbox.h"
-
-#include "guimisc.h"
-
-ListBox::ListBox(uint32 x, uint32 y, uint32 w, uint32 h): Element(x, y, w, h),
-       thumbClicked(false), windowPtr(0), cursor(0), limit(0), charWidth((w / FONT_WIDTH) - 1),
-       charHeight(h / FONT_HEIGHT), elementToTell(NULL), upArrow(w - 8, 0, upArrowBox),
-       downArrow(w - 8, h - 8, downArrowBox), upArrow2(w - 8, h - 16, upArrowBox)
-{
-       upArrow.SetNotificationElement(this);
-       downArrow.SetNotificationElement(this);
-       upArrow2.SetNotificationElement(this);
-       extents.w -= 8;                                                                 // Make room for scrollbar...
-}
-
-void ListBox::HandleKey(SDLKey key)
-{
-       if (key == SDLK_DOWN)
-       {
-               if (cursor != limit - 1)        // Cursor is within its window
-                       cursor++;
-               else                                            // Otherwise, scroll the window...
-               {
-                       if (cursor + windowPtr != item.size() - 1)
-                               windowPtr++;
-               }
-       }
-       else if (key == SDLK_UP)
-       {
-               if (cursor != 0)
-                       cursor--;
-               else
-               {
-                       if (windowPtr != 0)
-                               windowPtr--;
-               }
-       }
-       else if (key == SDLK_PAGEDOWN)
-       {
-               if (cursor != limit - 1)
-                       cursor = limit - 1;
-               else
-               {
-                       windowPtr += limit;
-                       if (windowPtr > item.size() - limit)
-                               windowPtr = item.size() - limit;
-               }
-       }
-       else if (key == SDLK_PAGEUP)
-       {
-               if (cursor != 0)
-                       cursor = 0;
-               else
-               {
-                       if (windowPtr < limit)
-                               windowPtr = 0;
-                       else
-                               windowPtr -= limit;
-               }
-       }
-       else if (key >= SDLK_a && key <= SDLK_z)
-       {
-               // Advance cursor to filename with first letter pressed...
-               uint8 which = (key - SDLK_a) + 65;      // Convert key to A-Z char
-
-               for(uint32 i=0; i<item.size(); i++)
-               {
-                       if ((item[i][0] & 0xDF) == which)
-                       {
-                               cursor = i - windowPtr;
-                               if (i > windowPtr + limit - 1)
-                                       windowPtr = i - limit + 1, cursor = limit - 1;
-                               if (i < windowPtr)
-                                       windowPtr = i, cursor = 0;
-                               break;
-                       }
-               }
-       }
-}
-
-void ListBox::HandleMouseMove(uint32 x, uint32 y)
-{
-       upArrow.HandleMouseMove(x - extents.x, y - extents.y);
-       downArrow.HandleMouseMove(x - extents.x, y - extents.y);
-       upArrow2.HandleMouseMove(x - extents.x, y - extents.y);
-
-       if (thumbClicked)
-       {
-               uint32 sbHeight = extents.h - 24,
-                       thumb = (uint32)(((float)limit / (float)item.size()) * (float)sbHeight);
-
-//yRelativePoint is the spot on the thumb where we clicked...
-               int32 newThumbStart = y - yRelativePoint;
-
-               if (newThumbStart < 0)
-                       newThumbStart = 0;
-
-               if ((uint32)newThumbStart > sbHeight - thumb)
-                       newThumbStart = sbHeight - thumb;
-
-               windowPtr = (uint32)(((float)newThumbStart / (float)sbHeight) * (float)item.size());
-//Check for cursor bounds as well... Or do we need to???
-//Actually, we don't...!
-       }
-}
-
-void ListBox::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
-{
-       if (Inside(x, y) && mouseDown)
-       {
-               // Why do we have to do this??? (- extents.y?)
-               // I guess it's because only the Window class has offsetting implemented... !!! FIX !!!
-//             cursor = (y - extents.y) / 8;
-               cursor = (y - extents.y) / FONT_HEIGHT;
-       }
-
-       // Check for a hit on the scrollbar...
-       if (x > (uint32)(extents.x + extents.w) && x <= (uint32)(extents.x + extents.w + 8)
-               && y > (uint32)(extents.y + 8) && y <= (uint32)(extents.y + extents.h - 16))
-       {
-               if (mouseDown)
-               {
-// This shiaut should be calculated in AddItem(), not here... (or in Draw() for that matter)
-                       uint32 sbHeight = extents.h - 24,
-                               thumb = (uint32)(((float)limit / (float)item.size()) * (float)sbHeight),
-                               thumbStart = (uint32)(((float)windowPtr / (float)item.size()) * (float)sbHeight);
-
-                       // Did we hit the thumb?
-                       if (y >= (extents.y + 8 + thumbStart) && y < (extents.y + 8 + thumbStart + thumb))
-                               thumbClicked = true, yRelativePoint = y - thumbStart;
-               }
-//Seems that this is useless--never reached except in rare cases and that the code outside is
-//more effective...
-//             else
-//                     thumbClicked = false;
-       }
-
-       if (!mouseDown)
-               thumbClicked = false;
-
-       upArrow.HandleMouseButton(x - extents.x, y - extents.y, mouseDown);
-       downArrow.HandleMouseButton(x - extents.x, y - extents.y, mouseDown);
-       upArrow2.HandleMouseButton(x - extents.x, y - extents.y, mouseDown);
-}
-
-void ListBox::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       for(uint32 i=0; i<limit; i++)
-       {
-               // Strip off the extension
-               // (extension stripping should be an option, not default!)
-               std::string s(item[windowPtr + i], 0, item[windowPtr + i].length() - 4);
-//             DrawString(screenBuffer, extents.x + offsetX, extents.y + offsetY + i*8,
-               DrawString(screenBuffer, extents.x + offsetX, extents.y + offsetY + i*FONT_HEIGHT,
-                       (cursor == i ? true : false), "%-*.*s", charWidth, charWidth, s.c_str());
-       }
-
-       upArrow.Draw(extents.x + offsetX, extents.y + offsetY);
-       downArrow.Draw(extents.x + offsetX, extents.y + offsetY);
-       upArrow2.Draw(extents.x + offsetX, extents.y + offsetY);
-
-       uint32 sbHeight = extents.h - 24,
-               thumb = (uint32)(((float)limit / (float)item.size()) * (float)sbHeight),
-               thumbStart = (uint32)(((float)windowPtr / (float)item.size()) * (float)sbHeight);
-
-       for(uint32 y=extents.y+offsetY+8; y<extents.y+offsetY+extents.h-16; y++)
-       {
-//             for(uint32 x=extents.x+offsetX+extents.w-8; x<extents.x+offsetX+extents.w; x++)
-               for(uint32 x=extents.x+offsetX+extents.w; x<extents.x+offsetX+extents.w+8; x++)
-               {
-                       if (y >= thumbStart + (extents.y+offsetY+8) && y < thumbStart + thumb + (extents.y+offsetY+8))
-//                             screenBuffer[x + (y * pitch)] = (thumbClicked ? 0x458E : 0xFFFF);
-//458E -> 01 0001  0 1100  0 1110 -> 0100 0101  0110 0011  0111 0011 -> 45 63 73
-                               screenBuffer[x + (y * pitch)] = (thumbClicked ? 0xFF736345 : 0xFFFFFFFF);
-                       else
-//                             screenBuffer[x + (y * pitch)] = 0x0200;
-//0200 -> 000000 10000 00000 -> 00 1000 0100 00
-                               screenBuffer[x + (y * pitch)] = 0xFF008400;
-               }
-       }
-}
-
-void ListBox::Notify(Element * e)
-{
-       if (e == &upArrow || e == &upArrow2)
-       {
-               if (windowPtr != 0)
-               {
-                       windowPtr--;
-
-                       if (cursor < limit - 1)
-                               cursor++;
-               }
-       }
-       else if (e == &downArrow)
-       {
-               if (windowPtr < item.size() - limit)
-               {
-                       windowPtr++;
-
-                       if (cursor != 0)
-                               cursor--;
-               }
-       }
-}
-
-void ListBox::SetNotificationElement(Element * e)
-{
-       elementToTell = e;
-}
-
-void ListBox::AddItem(std::string s)
-{
-       // Do a simple insertion sort
-       bool inserted = false;
-
-       for(std::vector<std::string>::iterator i=item.begin(); i<item.end(); i++)
-       {
-               if (stringCmpi(s, *i) == -1)
-               {
-                       item.insert(i, s);
-                       inserted = true;
-                       break;
-               }
-       }
-
-       if (!inserted)
-               item.push_back(s);
-
-       limit = (item.size() > charHeight ? charHeight : item.size());
-}
-
-std::string ListBox::GetSelectedItem(void)
-{
-       return item[windowPtr + cursor];
-}
diff --git a/src/gui/listbox.h b/src/gui/listbox.h
deleted file mode 100644 (file)
index 854a27f..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// ListBox class
-//
-// by James L. Hammons
-//
-
-#ifndef __LISTBOX_H__
-#define __LISTBOX_H__
-
-#include <string>
-#include <vector>
-#include "button.h"
-//#include "element.h"
-
-class ListBox: public Element
-//class ListBox: public Window
-{
-       public:
-//             ListBox(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0): Element(x, y, w, h),
-               ListBox(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0);//: Window(x, y, w, h),
-//             windowPtr(0), cursor(0), limit(0), charWidth((w / 8) - 1), charHeight(h / 8),
-//             elementToTell(NULL), upArrow(w - 8, 0, upArrowBox),
-//             downArrow(w - 8, h - 8, downArrowBox), upArrow2(w - 8, h - 16, upArrowBox) {}
-               virtual void HandleKey(SDLKey key);
-               virtual void HandleMouseMove(uint32 x, uint32 y);
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element * e);
-               void SetNotificationElement(Element * e);
-               void AddItem(std::string s);
-               std::string GetSelectedItem(void);
-
-       protected:
-               bool thumbClicked;
-               uint32 windowPtr, cursor, limit;
-               uint32 charWidth, charHeight;                           // Box width/height in characters
-               Element * elementToTell;
-               Button upArrow, downArrow, upArrow2;
-               std::vector<std::string> item;
-
-       private:
-               uint32 yRelativePoint;
-};
-
-#endif // __LISTBOX_H__
diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp
new file mode 100644 (file)
index 0000000..c73d670
--- /dev/null
@@ -0,0 +1,870 @@
+//
+// mainwin.cpp - Qt-based GUI for Virtual Jaguar: Main Application Window
+// by James L. Hammons
+// (C) 2009 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  12/23/2009  Created this file
+// JLH  12/20/2010  Added settings, menus & toolbars
+// JLH  07/05/2011  Added CD BIOS functionality to GUI
+//
+
+// FIXED:
+//
+//
+// STILL TO BE DONE:
+//
+// - Autoscan/autoload all available BIOS from 'software' folder
+// - Controller configuration
+// - Remove SDL dependencies (sound, mainly) from Jaguar core lib
+// - Add 1 key jumping in cartridge list (press 'R', jumps to carts starting with 'R', etc)
+// - Add dbl click/enter to select in cart list, ESC to dimiss
+//
+
+/*
+For BIOS autoscan, infrastructure is already there in filethread.cpp; just need to figure out
+if we want to scan every time, or stuff filenames found into the config file, or what.
+Should filethread emit signal that's intercepted here? Maybe...
+*/
+
+// Uncomment this for debugging...
+//#define DEBUG
+//#define DEBUGFOO                     // Various tool debugging...
+//#define DEBUGTP                              // Toolpalette debugging...
+
+#include "mainwin.h"
+
+#include "SDL.h"
+#include "glwidget.h"
+#include "about.h"
+#include "settings.h"
+#include "filepicker.h"
+#include "configdialog.h"
+#include "generaltab.h"
+#include "version.h"
+
+#include "jaguar.h"
+#include "tom.h"
+#include "log.h"
+#include "file.h"
+#include "joystick.h"
+
+#ifdef __GCCWIN32__
+// Apparently on win32, usleep() is not pulled in by the usual suspects.
+#include <unistd.h>
+#endif
+
+// Uncomment this to use built-in BIOS/CD-ROM BIOS
+// You'll need a copy of jagboot.h & jagcd.h for this to work...!
+// Creating those is left as an exercise for the reader. ;-)
+//#define USE_BUILT_IN_BIOS
+
+#ifdef USE_BUILT_IN_BIOS
+#include "jagboot.h"
+#include "jagcd.h"
+#endif
+
+// The way BSNES controls things is by setting a timer with a zero
+// timeout, sleeping if not emulating anything. Seems there has to be a
+// better way.
+
+// It has a novel approach to plugging-in/using different video/audio/input
+// methods, can we do something similar or should we just use the built-in
+// QOpenGL?
+
+// We're going to try to use the built-in OpenGL support and see how it goes.
+// We'll make the VJ core modular so that it doesn't matter what GUI is in
+// use, we can drop it in anywhere and use it as-is.
+
+MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit(true),
+       cartridgeLoaded(false), CDActive(false)
+{
+       videoWidget = new GLWidget(this);
+       setCentralWidget(videoWidget);
+       setWindowIcon(QIcon(":/res/vj-icon.png"));
+//     setWindowTitle("Virtual Jaguar v2.0.0");
+       setWindowTitle("Virtual Jaguar " VJ_RELEASE_VERSION );
+
+       aboutWin = new AboutWindow(this);
+       filePickWin = new FilePickerWindow(this);
+
+    videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+       setUnifiedTitleAndToolBarOnMac(true);
+
+       // Create actions
+
+       quitAppAct = new QAction(tr("E&xit"), this);
+       quitAppAct->setShortcuts(QKeySequence::Quit);
+       quitAppAct->setStatusTip(tr("Quit Virtual Jaguar"));
+       connect(quitAppAct, SIGNAL(triggered()), this, SLOT(close()));
+
+       powerAct = new QAction(QIcon(":/res/power.png"), tr("&Power"), this);
+       powerAct->setStatusTip(tr("Powers Jaguar on/off"));
+       powerAct->setCheckable(true);
+       powerAct->setChecked(false);
+       powerAct->setDisabled(true);
+       connect(powerAct, SIGNAL(triggered()), this, SLOT(TogglePowerState()));
+
+       pauseAct = new QAction(QIcon(":/res/pause.png"), tr("Pause"), this);
+       pauseAct->setStatusTip(tr("Toggles the running state"));
+       pauseAct->setCheckable(true);
+       pauseAct->setDisabled(true);
+       pauseAct->setShortcut(QKeySequence(tr("Esc")));
+       connect(pauseAct, SIGNAL(triggered()), this, SLOT(ToggleRunState()));
+
+       zoomActs = new QActionGroup(this);
+
+       x1Act = new QAction(QIcon(":/res/zoom100.png"), tr("Zoom 100%"), zoomActs);
+       x1Act->setStatusTip(tr("Set window zoom to 100%"));
+       x1Act->setCheckable(true);
+       connect(x1Act, SIGNAL(triggered()), this, SLOT(SetZoom100()));
+
+       x2Act = new QAction(QIcon(":/res/zoom200.png"), tr("Zoom 200%"), zoomActs);
+       x2Act->setStatusTip(tr("Set window zoom to 200%"));
+       x2Act->setCheckable(true);
+       connect(x2Act, SIGNAL(triggered()), this, SLOT(SetZoom200()));
+
+       x3Act = new QAction(QIcon(":/res/zoom300.png"), tr("Zoom 300%"), zoomActs);
+       x3Act->setStatusTip(tr("Set window zoom to 300%"));
+       x3Act->setCheckable(true);
+       connect(x3Act, SIGNAL(triggered()), this, SLOT(SetZoom300()));
+
+       tvTypeActs = new QActionGroup(this);
+
+       ntscAct = new QAction(QIcon(":/res/ntsc.png"), tr("NTSC"), tvTypeActs);
+       ntscAct->setStatusTip(tr("Sets Jaguar to NTSC mode"));
+       ntscAct->setCheckable(true);
+       connect(ntscAct, SIGNAL(triggered()), this, SLOT(SetNTSC()));
+
+       palAct = new QAction(QIcon(":/res/pal.png"), tr("PAL"), tvTypeActs);
+       palAct->setStatusTip(tr("Sets Jaguar to PAL mode"));
+       palAct->setCheckable(true);
+       connect(palAct, SIGNAL(triggered()), this, SLOT(SetPAL()));
+
+       blurAct = new QAction(QIcon(":/res/generic.png"), tr("Blur"), this);
+       blurAct->setStatusTip(tr("Sets OpenGL rendering to GL_NEAREST"));
+       blurAct->setCheckable(true);
+       connect(blurAct, SIGNAL(triggered()), this, SLOT(ToggleBlur()));
+
+       aboutAct = new QAction(QIcon(":/res/vj-icon.png"), tr("&About..."), this);
+       aboutAct->setStatusTip(tr("Blatant self-promotion"));
+       connect(aboutAct, SIGNAL(triggered()), this, SLOT(ShowAboutWin()));
+
+       filePickAct = new QAction(QIcon(":/res/software.png"), tr("&Insert Cartridge..."), this);
+       filePickAct->setStatusTip(tr("Insert a cartridge into Virtual Jaguar"));
+       filePickAct->setShortcut(QKeySequence(tr("Ctrl+i")));
+       connect(filePickAct, SIGNAL(triggered()), this, SLOT(InsertCart()));
+
+       configAct = new QAction(QIcon(":/res/generic.png"), tr("&Configure"), this);
+       configAct->setStatusTip(tr("Configure options for Virtual Jaguar"));
+       configAct->setShortcut(QKeySequence(tr("Ctrl+c")));
+       connect(configAct, SIGNAL(triggered()), this, SLOT(Configure()));
+
+       useCDAct = new QAction(QIcon(":/res/generic.png"), tr("&Use CD Unit"), this);
+       useCDAct->setStatusTip(tr("Use Jaguar Virtual CD unit"));
+//     useCDAct->setShortcut(QKeySequence(tr("Ctrl+c")));
+       useCDAct->setCheckable(true);
+       connect(useCDAct, SIGNAL(triggered()), this, SLOT(ToggleCDUsage()));
+
+       // Misc. connections...
+       connect(filePickWin, SIGNAL(RequestLoad(QString)), this, SLOT(LoadSoftware(QString)));
+
+       // Create menus & toolbars
+
+       fileMenu = menuBar()->addMenu(tr("&File"));
+       fileMenu->addAction(filePickAct);
+       fileMenu->addAction(useCDAct);
+       fileMenu->addAction(powerAct);
+       fileMenu->addAction(pauseAct);
+       fileMenu->addAction(configAct);
+       fileMenu->addAction(quitAppAct);
+
+       helpMenu = menuBar()->addMenu(tr("&Help"));
+       helpMenu->addAction(aboutAct);
+
+       toolbar = addToolBar(tr("Stuff"));
+       toolbar->addAction(powerAct);
+       toolbar->addAction(pauseAct);
+       toolbar->addAction(filePickAct);
+       toolbar->addAction(useCDAct);
+       toolbar->addSeparator();
+       toolbar->addAction(x1Act);
+       toolbar->addAction(x2Act);
+       toolbar->addAction(x3Act);
+       toolbar->addSeparator();
+       toolbar->addAction(ntscAct);
+       toolbar->addAction(palAct);
+       toolbar->addSeparator();
+       toolbar->addAction(blurAct);
+
+       //      Create status bar
+       statusBar()->showMessage(tr("Ready"));
+
+       ReadSettings();
+
+       // Set toolbar buttons/menus based on settings read in (sync the UI)...
+       blurAct->setChecked(vjs.glFilter);
+       x1Act->setChecked(zoomLevel == 1);
+       x2Act->setChecked(zoomLevel == 2);
+       x3Act->setChecked(zoomLevel == 3);
+       running = powerAct->isChecked();
+       ntscAct->setChecked(vjs.hardwareTypeNTSC);
+       palAct->setChecked(!vjs.hardwareTypeNTSC);
+
+       // Do this in case original size isn't correct (mostly for the first-run case)
+       ResizeMainWindow();
+
+       // Set up timer based loop for animation...
+       timer = new QTimer(this);
+       connect(timer, SIGNAL(timeout()), this, SLOT(Timer()));
+       timer->start(20);
+
+       WriteLog("Virtual Jaguar %s (Last full build was on %s %s)\n", VJ_RELEASE_VERSION, __DATE__, __TIME__);
+       WriteLog("VJ: Initializing jaguar subsystem...\n");
+       JaguarInit();
+
+       // Get the BIOS ROM
+#ifdef USE_BUILT_IN_BIOS
+       WriteLog("VJ: Using built in BIOS/CD BIOS...\n");
+       memcpy(jaguarBootROM, jagBootROM, 0x20000);
+       memcpy(jaguarCDBootROM, jagCDROM, 0x40000);
+       BIOSLoaded = CDBIOSLoaded = true;
+#else
+// What would be nice here would be a way to check if the BIOS was loaded so that we
+// could disable the pushbutton on the Misc Options menu... !!! FIX !!! [DONE here, but needs to be fixed in GUI as well!]
+       WriteLog("VJ: About to attempt to load BIOSes...\n");
+//This is short-circuiting the file finding thread... ??? WHY ???
+//Not anymore. Was related to a QImage object creation/corruption bug elsewhere.
+       BIOSLoaded = (JaguarLoadROM(jaguarBootROM, vjs.jagBootPath) == 0x20000 ? true : false);
+       WriteLog("VJ: BIOS is %savailable...\n", (BIOSLoaded ? "" : "not "));
+       CDBIOSLoaded = (JaguarLoadROM(jaguarCDBootROM, vjs.CDBootPath) == 0x40000 ? true : false);
+       WriteLog("VJ: CD BIOS is %savailable...\n", (CDBIOSLoaded ? "" : "not "));
+#endif
+
+       filePickWin->ScanSoftwareFolder(allowUnknownSoftware);
+}
+
+void MainWin::closeEvent(QCloseEvent * event)
+{
+       WriteSettings();
+       event->accept(); // ignore() if can't close for some reason
+}
+
+void MainWin::keyPressEvent(QKeyEvent * e)
+{
+       HandleKeys(e, true);
+}
+
+void MainWin::keyReleaseEvent(QKeyEvent * e)
+{
+       HandleKeys(e, false);
+}
+
+void MainWin::HandleKeys(QKeyEvent * e, bool state)
+{
+       // We kill bad key combos here, before they can get to the emulator...
+       // This also kills the illegal instruction problem that cropped up in Rayman!
+       // May want to do this by killing the old one instead of ignoring the new one...
+       // Seems to work better that way...
+#if 0
+       if ((e->key() == vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R])
+               || (e->key() == vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L])
+               || (e->key() == vjs.p1KeyBindings[BUTTON_U] && joypad_0_buttons[BUTTON_D])
+               || (e->key() == vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U]))
+               return;
+#else
+       if (e->key() == vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R])
+               joypad_0_buttons[BUTTON_R] = 0;
+       if (e->key() == vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L])
+               joypad_0_buttons[BUTTON_L] = 0;
+       if (e->key() == vjs.p1KeyBindings[BUTTON_U] && joypad_0_buttons[BUTTON_D])
+               joypad_0_buttons[BUTTON_D] = 0;
+       if (e->key() == vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U])
+               joypad_0_buttons[BUTTON_U] = 0;
+#endif
+
+       // No bad combos exist, let's stuff the emulator key buffers...!
+       for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++)
+       {
+               if (e->key() == vjs.p1KeyBindings[i])
+                       joypad_0_buttons[i] = (uint8)state;
+       }
+}
+
+void MainWin::Open(void)
+{
+}
+
+void MainWin::Configure(void)
+{
+       // Call the configuration dialog and update settings
+       ConfigDialog dlg(this);
+       //ick.
+       dlg.generalTab->useUnknownSoftware->setChecked(allowUnknownSoftware);
+
+       if (dlg.exec() == false)
+               return;
+
+       QString before = vjs.ROMPath;
+       dlg.UpdateVJSettings();
+       QString after = vjs.ROMPath;
+
+       bool allowOld = allowUnknownSoftware;
+       //ick.
+       allowUnknownSoftware = dlg.generalTab->useUnknownSoftware->isChecked();
+
+       // We rescan the "software" folder if the user either changed the path or
+       // checked/unchecked the "Allow unknown files" option in the config dialog.
+       if ((before != after) || (allowOld != allowUnknownSoftware))
+               filePickWin->ScanSoftwareFolder(allowUnknownSoftware);
+
+       // Just in case we crash before a clean exit...
+       WriteSettings();
+}
+
+//
+// Here's the main emulator loop
+//
+void MainWin::Timer(void)
+{
+       if (!running)
+               return;
+
+       if (showUntunedTankCircuit)
+       {
+               // Random hash & trash
+               // We try to simulate an untuned tank circuit here... :-)
+               for(uint32_t x=0; x<videoWidget->rasterWidth; x++)
+               {
+                       for(uint32_t y=0; y<videoWidget->rasterHeight; y++)
+                       {
+                               videoWidget->buffer[(y * videoWidget->textureWidth) + x] = (rand() & 0xFF) << 8 | (rand() & 0xFF) << 16 | (rand() & 0xFF) << 24;// | (rand() & 0xFF);//0x000000FF;
+       //                      buffer[(y * textureWidth) + x] = x*y;
+                       }
+               }
+       }
+       else
+       {
+               // Otherwise, run the Jaguar simulation
+               JaguarExecuteNew();
+//             memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->rasterWidth);
+               memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->textureWidth * sizeof(uint32_t));
+//             memcpy(surface->pixels, backbuffer, TOMGetVideoModeWidth() * TOMGetVideoModeHeight() * 4);
+       }
+
+       videoWidget->updateGL();
+}
+
+#if 0
+Window * RunEmu(void)
+{
+//     extern uint32 * backbuffer;
+       uint32 * overlayPixels = (uint32 *)sdlemuGetOverlayPixels();
+       memset(overlayPixels, 0x00, 640 * 480 * 4);                     // Clear out overlay...
+
+//This is crappy... !!! FIX !!!
+//     extern bool finished, showGUI;
+
+       sdlemuDisableOverlay();
+
+//     uint32 nFrame = 0, nFrameskip = 0;
+       uint32 totalFrames = 0;
+       finished = false;
+       bool showMessage = true;
+       uint32 showMsgFrames = 120;
+       uint8 transparency = 0xFF;
+       // Pass a message to the "joystick" code to debounce the ESC key...
+       debounceRunKey = true;
+
+       uint32 cartType = 4;
+       if (jaguarRomSize == 0x200000)
+               cartType = 0;
+       else if (jaguarRomSize == 0x400000)
+               cartType = 1;
+       else if (jaguarMainRomCRC32 == 0x687068D5)
+               cartType = 2;
+       else if (jaguarMainRomCRC32 == 0x55A0669C)
+               cartType = 3;
+
+       const char * cartTypeName[5] = { "2M Cartridge", "4M Cartridge", "CD BIOS", "CD Dev BIOS", "Homebrew" };
+       uint32 elapsedTicks = SDL_GetTicks(), frameCount = 0, framesPerSecond = 0;
+
+       while (!finished)
+       {
+               // Set up new backbuffer with new pixels and data
+               JaguarExecuteNew();
+               totalFrames++;
+//WriteLog("Frame #%u...\n", totalFrames);
+//extern bool doDSPDis;
+//if (totalFrames == 373)
+//     doDSPDis = true;
+
+//Problem: Need to do this *only* when the state changes from visible to not...
+//Also, need to clear out the GUI when not on (when showMessage is active...)
+if (showGUI || showMessage)
+       sdlemuEnableOverlay();
+else
+       sdlemuDisableOverlay();
+
+//Add in a new function for clearing patches of screen (ClearOverlayRect)
+
+// Also: Take frame rate into account when calculating fade time...
+
+               // Some QnD GUI stuff here...
+               if (showGUI)
+               {
+                       FillScreenRectangle(overlayPixels, 8, 1*FONT_HEIGHT, 128, 4*FONT_HEIGHT, 0x00000000);
+                       extern uint32 gpu_pc, dsp_pc;
+                       DrawString(overlayPixels, 8, 1*FONT_HEIGHT, false, "GPU PC: %08X", gpu_pc);
+                       DrawString(overlayPixels, 8, 2*FONT_HEIGHT, false, "DSP PC: %08X", dsp_pc);
+                       DrawString(overlayPixels, 8, 4*FONT_HEIGHT, false, "%u FPS", framesPerSecond);
+               }
+
+               if (showMessage)
+               {
+                       DrawString2(overlayPixels, 8, 24*FONT_HEIGHT, 0x007F63FF, transparency, "Running...");
+                       DrawString2(overlayPixels, 8, 26*FONT_HEIGHT, 0x001FFF3F, transparency, "%s, run address: %06X", cartTypeName[cartType], jaguarRunAddress);
+                       DrawString2(overlayPixels, 8, 27*FONT_HEIGHT, 0x001FFF3F, transparency, "CRC: %08X", jaguarMainRomCRC32);
+
+                       if (showMsgFrames == 0)
+                       {
+                               transparency--;
+
+                               if (transparency == 0)
+{
+                                       showMessage = false;
+/*extern bool doGPUDis;
+doGPUDis = true;//*/
+}
+
+                       }
+                       else
+                               showMsgFrames--;
+               }
+
+               frameCount++;
+
+               if (SDL_GetTicks() - elapsedTicks > 250)
+                       elapsedTicks += 250, framesPerSecond = frameCount * 4, frameCount = 0;
+       }
+
+       // Save the background for the GUI...
+       // In this case, we squash the color to monochrome, then force it to blue + green...
+       for(uint32 i=0; i<TOMGetVideoModeWidth() * 256; i++)
+       {
+               uint32 pixel = backbuffer[i];
+               uint8 b = (pixel >> 16) & 0xFF, g = (pixel >> 8) & 0xFF, r = pixel & 0xFF;
+               pixel = ((r + g + b) / 3) & 0x00FF;
+               backbuffer[i] = 0xFF000000 | (pixel << 16) | (pixel << 8);
+       }
+
+       sdlemuEnableOverlay();
+
+       return NULL;
+}
+#endif
+
+void MainWin::TogglePowerState(void)
+{
+       powerButtonOn = !powerButtonOn;
+
+       if (!powerButtonOn)
+       {
+               pauseAct->setChecked(false);
+               pauseAct->setDisabled(true);
+               showUntunedTankCircuit = true;
+               running = true;
+       }
+       else
+       {
+               if (!CDActive)
+               {
+                       showUntunedTankCircuit = (cartridgeLoaded ? false : true);
+                       pauseAct->setChecked(false);
+                       pauseAct->setDisabled(!cartridgeLoaded);
+               }
+               else
+               {
+// Should check for cartridgeLoaded here as well...!
+// We can clear it when toggling CDActive on, so that when we power cycle it does the
+// expected thing. Otherwise, if we use the file picker to insert a cart, we expect
+// to run the cart! Maybe have a RemoveCart function that only works if the CD unit
+// is active?
+                       showUntunedTankCircuit = false;
+                       pauseAct->setChecked(false);
+                       pauseAct->setDisabled(false);
+                       memcpy(jagMemSpace + 0x800000, jaguarCDBootROM, 0x40000);
+               }
+
+//(Err, what's so crappy about this? It seems to do what it's supposed to...)
+//This is crappy!!! !!! FIX !!!
+//Is this even needed any more? Hmm. Maybe. Dunno.
+//Seems like it is... But then again, maybe not. Have to test it to see.
+               WriteLog("GUI: Resetting Jaguar...\n");
+               JaguarReset();
+               running = true;
+       }
+}
+
+void MainWin::ToggleRunState(void)
+{
+       running = !running;
+
+       if (!running)
+       {
+#if 0
+               for(uint32_t x=0; x<videoWidget->rasterWidth; x++)
+                       for(uint32_t y=0; y<videoWidget->rasterHeight; y++)
+                               videoWidget->buffer[(y * videoWidget->textureWidth) + x] = 0x00000000;
+#else
+//             for(uint32_t i=0; i<TOMGetVideoModeWidth() * 256; i++)
+               for(uint32_t i=0; i<videoWidget->textureWidth * 256; i++)
+               {
+                       uint32_t pixel = backbuffer[i];
+//                     uint8_t b = (pixel >> 16) & 0xFF, g = (pixel >> 8) & 0xFF, r = pixel & 0xFF;
+                       uint8_t r = (pixel >> 24) & 0xFF, g = (pixel >> 16) & 0xFF, b = (pixel >> 8) & 0xFF;
+                       pixel = ((r + g + b) / 3) & 0x00FF;
+//                     backbuffer[i] = 0xFF000000 | (pixel << 16) | (pixel << 8);
+                       backbuffer[i] = 0x000000FF | (pixel << 16) | (pixel << 8);
+               }
+
+//             memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->rasterWidth);
+               memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->textureWidth * sizeof(uint32_t));
+#endif
+
+               videoWidget->updateGL();
+       }
+}
+
+void MainWin::SetZoom100(void)
+{
+       zoomLevel = 1;
+       ResizeMainWindow();
+}
+
+void MainWin::SetZoom200(void)
+{
+       zoomLevel = 2;
+       ResizeMainWindow();
+}
+
+void MainWin::SetZoom300(void)
+{
+       zoomLevel = 3;
+       ResizeMainWindow();
+}
+
+void MainWin::SetNTSC(void)
+{
+       vjs.hardwareTypeNTSC = true;
+       ResizeMainWindow();
+}
+
+void MainWin::SetPAL(void)
+{
+       vjs.hardwareTypeNTSC = false;
+       ResizeMainWindow();
+}
+
+void MainWin::ToggleBlur(void)
+{
+       vjs.glFilter = !vjs.glFilter;
+}
+
+void MainWin::ShowAboutWin(void)
+{
+       aboutWin->show();
+}
+
+void MainWin::InsertCart(void)
+{
+       filePickWin->show();
+}
+
+void MainWin::LoadSoftware(QString file)
+{
+       running = false;                                                        //  Prevent bad things(TM) from happening...
+       SET32(jaguarMainRAM, 0, 0x00200000);            // Set top of stack...
+       cartridgeLoaded = (JaguarLoadFile(file.toAscii().data()) ? true : false);
+
+       powerAct->setDisabled(false);
+       powerAct->setChecked(true);
+       powerButtonOn = false;
+       TogglePowerState();
+
+//     QString newTitle = QString("Virtual Jaguar v2.0.0 - Now playing: %1")
+       QString newTitle = QString("Virtual Jaguar " VJ_RELEASE_VERSION
+               " - Now playing: %1")
+               .arg(filePickWin->GetSelectedPrettyName());
+       setWindowTitle(newTitle);
+}
+
+void MainWin::ToggleCDUsage(void)
+{
+       CDActive = !CDActive;
+
+       if (CDActive)
+       {
+               powerAct->setDisabled(false);
+       }
+       else
+       {
+               powerAct->setDisabled(true);
+       }
+}
+
+void MainWin::ResizeMainWindow(void)
+{
+       videoWidget->setFixedSize(zoomLevel * 320, zoomLevel * (vjs.hardwareTypeNTSC ? 240 : 256));
+       show();
+
+       for(int i=0; i<2; i++)
+       {
+               resize(0, 0);
+               usleep(2000);
+               QApplication::processEvents();
+       }
+}
+
+void MainWin::ReadSettings(void)
+{
+       QSettings settings("Underground Software", "Virtual Jaguar");
+       QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
+       QSize size = settings.value("size", QSize(400, 400)).toSize();
+       resize(size);
+       move(pos);
+       pos = settings.value("cartLoadPos", QPoint(200, 200)).toPoint();
+       filePickWin->move(pos);
+
+       zoomLevel = settings.value("zoom", 1).toInt();
+       allowUnknownSoftware = settings.value("showUnknownSoftware", false).toBool();
+
+       vjs.useJoystick      = settings.value("useJoystick", false).toBool();
+       vjs.joyport          = settings.value("joyport", 0).toInt();
+       vjs.hardwareTypeNTSC = settings.value("hardwareTypeNTSC", true).toBool();
+       vjs.frameSkip        = settings.value("frameSkip", 0).toInt();
+       vjs.useJaguarBIOS    = settings.value("useJaguarBIOS", false).toBool();
+       vjs.DSPEnabled       = settings.value("DSPEnabled", false).toBool();
+       vjs.usePipelinedDSP  = settings.value("usePipelinedDSP", false).toBool();
+       vjs.fullscreen       = settings.value("fullscreen", false).toBool();
+       vjs.useOpenGL        = settings.value("useOpenGL", true).toBool();
+       vjs.glFilter         = settings.value("glFilterType", 0).toInt();
+       vjs.renderType       = settings.value("renderType", 0).toInt();
+       strcpy(vjs.jagBootPath, settings.value("JagBootROM", "./bios/[BIOS] Atari Jaguar (USA, Europe).zip").toString().toAscii().data());
+       strcpy(vjs.CDBootPath, settings.value("CDBootROM", "./bios/jagcd.rom").toString().toAscii().data());
+       strcpy(vjs.EEPROMPath, settings.value("EEPROMs", "./eeproms").toString().toAscii().data());
+       strcpy(vjs.ROMPath, settings.value("ROMs", "./software").toString().toAscii().data());
+WriteLog("MainWin: Paths\n");
+WriteLog("    jagBootPath = \"%s\"\n", vjs.jagBootPath);
+WriteLog("    CDBootPath  = \"%s\"\n", vjs.CDBootPath);
+WriteLog("    EEPROMPath  = \"%s\"\n", vjs.EEPROMPath);
+WriteLog("    ROMPath     = \"%s\"\n", vjs.ROMPath);
+
+       // Keybindings in order of U, D, L, R, C, B, A, Op, Pa, 0-9, #, *
+       vjs.p1KeyBindings[BUTTON_U] = settings.value("p1k_up", Qt::Key_Up).toInt();
+       vjs.p1KeyBindings[BUTTON_D] = settings.value("p1k_down", Qt::Key_Down).toInt();
+       vjs.p1KeyBindings[BUTTON_L] = settings.value("p1k_left", Qt::Key_Left).toInt();
+       vjs.p1KeyBindings[BUTTON_R] = settings.value("p1k_right", Qt::Key_Right).toInt();
+       vjs.p1KeyBindings[BUTTON_C] = settings.value("p1k_c", Qt::Key_Z).toInt();
+       vjs.p1KeyBindings[BUTTON_B] = settings.value("p1k_b", Qt::Key_X).toInt();
+       vjs.p1KeyBindings[BUTTON_A] = settings.value("p1k_a", Qt::Key_C).toInt();
+       vjs.p1KeyBindings[BUTTON_OPTION] = settings.value("p1k_option", Qt::Key_Apostrophe).toInt();
+       vjs.p1KeyBindings[BUTTON_PAUSE] = settings.value("p1k_pause", Qt::Key_Return).toInt();
+       vjs.p1KeyBindings[BUTTON_0] = settings.value("p1k_0", Qt::Key_0).toInt();
+       vjs.p1KeyBindings[BUTTON_1] = settings.value("p1k_1", Qt::Key_1).toInt();
+       vjs.p1KeyBindings[BUTTON_2] = settings.value("p1k_2", Qt::Key_2).toInt();
+       vjs.p1KeyBindings[BUTTON_3] = settings.value("p1k_3", Qt::Key_3).toInt();
+       vjs.p1KeyBindings[BUTTON_4] = settings.value("p1k_4", Qt::Key_4).toInt();
+       vjs.p1KeyBindings[BUTTON_5] = settings.value("p1k_5", Qt::Key_5).toInt();
+       vjs.p1KeyBindings[BUTTON_6] = settings.value("p1k_6", Qt::Key_6).toInt();
+       vjs.p1KeyBindings[BUTTON_7] = settings.value("p1k_7", Qt::Key_7).toInt();
+       vjs.p1KeyBindings[BUTTON_8] = settings.value("p1k_8", Qt::Key_8).toInt();
+       vjs.p1KeyBindings[BUTTON_9] = settings.value("p1k_9", Qt::Key_9).toInt();
+       vjs.p1KeyBindings[BUTTON_d] = settings.value("p1k_pound", Qt::Key_Slash).toInt();
+       vjs.p1KeyBindings[BUTTON_s] = settings.value("p1k_star", Qt::Key_Asterisk).toInt();
+
+       vjs.p2KeyBindings[BUTTON_U] = settings.value("p2k_up", Qt::Key_Up).toInt();
+       vjs.p2KeyBindings[BUTTON_D] = settings.value("p2k_down", Qt::Key_Down).toInt();
+       vjs.p2KeyBindings[BUTTON_L] = settings.value("p2k_left", Qt::Key_Left).toInt();
+       vjs.p2KeyBindings[BUTTON_R] = settings.value("p2k_right", Qt::Key_Right).toInt();
+       vjs.p2KeyBindings[BUTTON_C] = settings.value("p2k_c", Qt::Key_Z).toInt();
+       vjs.p2KeyBindings[BUTTON_B] = settings.value("p2k_b", Qt::Key_X).toInt();
+       vjs.p2KeyBindings[BUTTON_A] = settings.value("p2k_a", Qt::Key_C).toInt();
+       vjs.p2KeyBindings[BUTTON_OPTION] = settings.value("p2k_option", Qt::Key_Apostrophe).toInt();
+       vjs.p2KeyBindings[BUTTON_PAUSE] = settings.value("p2k_pause", Qt::Key_Return).toInt();
+       vjs.p2KeyBindings[BUTTON_0] = settings.value("p2k_0", Qt::Key_0).toInt();
+       vjs.p2KeyBindings[BUTTON_1] = settings.value("p2k_1", Qt::Key_1).toInt();
+       vjs.p2KeyBindings[BUTTON_2] = settings.value("p2k_2", Qt::Key_2).toInt();
+       vjs.p2KeyBindings[BUTTON_3] = settings.value("p2k_3", Qt::Key_3).toInt();
+       vjs.p2KeyBindings[BUTTON_4] = settings.value("p2k_4", Qt::Key_4).toInt();
+       vjs.p2KeyBindings[BUTTON_5] = settings.value("p2k_5", Qt::Key_5).toInt();
+       vjs.p2KeyBindings[BUTTON_6] = settings.value("p2k_6", Qt::Key_6).toInt();
+       vjs.p2KeyBindings[BUTTON_7] = settings.value("p2k_7", Qt::Key_7).toInt();
+       vjs.p2KeyBindings[BUTTON_8] = settings.value("p2k_8", Qt::Key_8).toInt();
+       vjs.p2KeyBindings[BUTTON_9] = settings.value("p2k_9", Qt::Key_9).toInt();
+       vjs.p2KeyBindings[BUTTON_d] = settings.value("p2k_pound", Qt::Key_Slash).toInt();
+       vjs.p2KeyBindings[BUTTON_s] = settings.value("p2k_star", Qt::Key_Asterisk).toInt();
+}
+
+void MainWin::WriteSettings(void)
+{
+       QSettings settings("Underground Software", "Virtual Jaguar");
+       settings.setValue("pos", pos());
+       settings.setValue("size", size());
+       settings.setValue("cartLoadPos", filePickWin->pos());
+
+       settings.setValue("zoom", zoomLevel);
+       settings.setValue("showUnknownSoftware", allowUnknownSoftware);
+
+       settings.setValue("useJoystick", vjs.useJoystick);
+       settings.setValue("joyport", vjs.joyport);
+       settings.setValue("hardwareTypeNTSC", vjs.hardwareTypeNTSC);
+       settings.setValue("frameSkip", vjs.frameSkip);
+       settings.setValue("useJaguarBIOS", vjs.useJaguarBIOS);
+       settings.setValue("DSPEnabled", vjs.DSPEnabled);
+       settings.setValue("usePipelinedDSP", vjs.usePipelinedDSP);
+       settings.setValue("fullscreen", vjs.fullscreen);
+       settings.setValue("useOpenGL", vjs.useOpenGL);
+       settings.setValue("glFilterType", vjs.glFilter);
+       settings.setValue("renderType", vjs.renderType);
+       settings.setValue("JagBootROM", vjs.jagBootPath);
+       settings.setValue("CDBootROM", vjs.CDBootPath);
+       settings.setValue("EEPROMs", vjs.EEPROMPath);
+       settings.setValue("ROMs", vjs.ROMPath);
+
+       settings.setValue("p1k_up", vjs.p1KeyBindings[BUTTON_U]);
+       settings.setValue("p1k_down", vjs.p1KeyBindings[BUTTON_D]);
+       settings.setValue("p1k_left", vjs.p1KeyBindings[BUTTON_L]);
+       settings.setValue("p1k_right", vjs.p1KeyBindings[BUTTON_R]);
+       settings.setValue("p1k_c", vjs.p1KeyBindings[BUTTON_C]);
+       settings.setValue("p1k_b", vjs.p1KeyBindings[BUTTON_B]);
+       settings.setValue("p1k_a", vjs.p1KeyBindings[BUTTON_A]);
+       settings.setValue("p1k_option", vjs.p1KeyBindings[BUTTON_OPTION]);
+       settings.setValue("p1k_pause", vjs.p1KeyBindings[BUTTON_PAUSE]);
+       settings.setValue("p1k_0", vjs.p1KeyBindings[BUTTON_0]);
+       settings.setValue("p1k_1", vjs.p1KeyBindings[BUTTON_1]);
+       settings.setValue("p1k_2", vjs.p1KeyBindings[BUTTON_2]);
+       settings.setValue("p1k_3", vjs.p1KeyBindings[BUTTON_3]);
+       settings.setValue("p1k_4", vjs.p1KeyBindings[BUTTON_4]);
+       settings.setValue("p1k_5", vjs.p1KeyBindings[BUTTON_5]);
+       settings.setValue("p1k_6", vjs.p1KeyBindings[BUTTON_6]);
+       settings.setValue("p1k_7", vjs.p1KeyBindings[BUTTON_7]);
+       settings.setValue("p1k_8", vjs.p1KeyBindings[BUTTON_8]);
+       settings.setValue("p1k_9", vjs.p1KeyBindings[BUTTON_9]);
+       settings.setValue("p1k_pound", vjs.p1KeyBindings[BUTTON_d]);
+       settings.setValue("p1k_star", vjs.p1KeyBindings[BUTTON_s]);
+
+       settings.setValue("p2k_up", vjs.p2KeyBindings[BUTTON_U]);
+       settings.setValue("p2k_down", vjs.p2KeyBindings[BUTTON_D]);
+       settings.setValue("p2k_left", vjs.p2KeyBindings[BUTTON_L]);
+       settings.setValue("p2k_right", vjs.p2KeyBindings[BUTTON_R]);
+       settings.setValue("p2k_c", vjs.p2KeyBindings[BUTTON_C]);
+       settings.setValue("p2k_b", vjs.p2KeyBindings[BUTTON_B]);
+       settings.setValue("p2k_a", vjs.p2KeyBindings[BUTTON_A]);
+       settings.setValue("p2k_option", vjs.p2KeyBindings[BUTTON_OPTION]);
+       settings.setValue("p2k_pause", vjs.p2KeyBindings[BUTTON_PAUSE]);
+       settings.setValue("p2k_0", vjs.p2KeyBindings[BUTTON_0]);
+       settings.setValue("p2k_1", vjs.p2KeyBindings[BUTTON_1]);
+       settings.setValue("p2k_2", vjs.p2KeyBindings[BUTTON_2]);
+       settings.setValue("p2k_3", vjs.p2KeyBindings[BUTTON_3]);
+       settings.setValue("p2k_4", vjs.p2KeyBindings[BUTTON_4]);
+       settings.setValue("p2k_5", vjs.p2KeyBindings[BUTTON_5]);
+       settings.setValue("p2k_6", vjs.p2KeyBindings[BUTTON_6]);
+       settings.setValue("p2k_7", vjs.p2KeyBindings[BUTTON_7]);
+       settings.setValue("p2k_8", vjs.p2KeyBindings[BUTTON_8]);
+       settings.setValue("p2k_9", vjs.p2KeyBindings[BUTTON_9]);
+       settings.setValue("p2k_pound", vjs.p2KeyBindings[BUTTON_d]);
+       settings.setValue("p2k_star", vjs.p2KeyBindings[BUTTON_s]);
+}
+
+// Here's how Byuu does it...
+// I think I have it working now... :-)
+#if 0
+void Utility::resizeMainWindow()
+{
+  unsigned region = config().video.context->region;
+  unsigned multiplier = config().video.context->multiplier;
+  unsigned width = 256 * multiplier;
+  unsigned height = (region == 0 ? 224 : 239) * multiplier;
+
+  if(config().video.context->correctAspectRatio)
+  {
+    if(region == 0)
+       {
+      width = (double)width * config().video.ntscAspectRatio + 0.5;  //NTSC adjust
+    }
+       else
+       {
+      width = (double)width * config().video.palAspectRatio  + 0.5;  //PAL adjust
+    }
+  }
+
+  if(config().video.isFullscreen == false)
+  {
+    //get effective desktop work area region (ignore Windows taskbar, OS X dock, etc.)
+    QRect deskRect = QApplication::desktop()->availableGeometry(mainWindow);
+
+    //ensure window size will not be larger than viewable desktop area
+    constrainSize(height, width, deskRect.height()); //- frameHeight);
+    constrainSize(width, height, deskRect.width());  //- frameWidth );
+
+    mainWindow->canvas->setFixedSize(width, height);
+    mainWindow->show();
+  }
+  else
+  {
+    for(unsigned i = 0; i < 2; i++)
+       {
+      unsigned iWidth = width, iHeight = height;
+
+      constrainSize(iHeight, iWidth, mainWindow->canvasContainer->size().height());
+      constrainSize(iWidth, iHeight, mainWindow->canvasContainer->size().width());
+
+      //center canvas onscreen; ensure it is not larger than viewable area
+      mainWindow->canvas->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+      mainWindow->canvas->setFixedSize(iWidth, iHeight);
+      mainWindow->canvas->setMinimumSize(0, 0);
+
+      usleep(2000);
+      QApplication::processEvents();
+    }
+  }
+
+  //workaround for Qt/Xlib bug:
+  //if window resize occurs with cursor over it, Qt shows Qt::Size*DiagCursor;
+  //so force it to show Qt::ArrowCursor, as expected
+  mainWindow->setCursor(Qt::ArrowCursor);
+  mainWindow->canvasContainer->setCursor(Qt::ArrowCursor);
+  mainWindow->canvas->setCursor(Qt::ArrowCursor);
+
+  //workaround for DirectSound(?) bug:
+  //window resizing sometimes breaks audio sync, this call re-initializes it
+  updateAvSync();
+}
+
+void Utility::setScale(unsigned scale)
+{
+  config().video.context->multiplier = scale;
+  resizeMainWindow();
+  mainWindow->shrink();
+  mainWindow->syncUi();
+}
+
+void QbWindow::shrink()
+{
+  if(config().video.isFullscreen == false)
+  {
+    for(unsigned i = 0; i < 2; i++)
+       {
+      resize(0, 0);
+      usleep(2000);
+      QApplication::processEvents();
+    }
+  }
+}
+#endif
diff --git a/src/gui/mainwin.h b/src/gui/mainwin.h
new file mode 100644 (file)
index 0000000..5576668
--- /dev/null
@@ -0,0 +1,90 @@
+//
+// mainwin.h: Header file
+//
+// by James L. Hammons
+// (C) 2010 Underground Software
+//
+
+#ifndef __MAINWIN_H__
+#define __MAINWIN_H__
+
+//Hrm. uh??? I thought this wasn't the way to do this stuff...???
+#include <QtGui>
+
+// Forward declarations
+class GLWidget;
+class AboutWindow;
+class FilePickerWindow;
+
+class MainWin: public QMainWindow
+{
+       // All Qt apps require this macro for signal/slot functionality to work
+       Q_OBJECT
+
+       public:
+               MainWin();
+
+       protected:
+               void closeEvent(QCloseEvent *);
+               void keyPressEvent(QKeyEvent *);
+               void keyReleaseEvent(QKeyEvent *);
+
+       private slots:
+               void Open(void);
+               void Configure(void);
+               void Timer(void);
+               void TogglePowerState(void);
+               void ToggleRunState(void);
+               void SetZoom100(void);
+               void SetZoom200(void);
+               void SetZoom300(void);
+               void SetNTSC(void);
+               void SetPAL(void);
+               void ToggleBlur(void);
+               void ShowAboutWin(void);
+               void InsertCart(void);
+               void LoadSoftware(QString);
+               void ToggleCDUsage(void);
+
+       private:
+               void HandleKeys(QKeyEvent *, bool);
+               void ResizeMainWindow(void);
+               void ReadSettings(void);
+               void WriteSettings(void);
+
+//     public:
+               GLWidget * videoWidget;
+               AboutWindow * aboutWin;
+               FilePickerWindow * filePickWin;
+               QTimer * timer;
+               bool running;
+               int zoomLevel;
+               bool powerButtonOn;
+               bool showUntunedTankCircuit;
+               bool cartridgeLoaded;
+               bool allowUnknownSoftware;
+               bool CDActive;
+
+               QMenu * fileMenu;
+               QMenu * helpMenu;
+               QToolBar * toolbar;
+
+               QActionGroup * zoomActs;
+               QActionGroup * tvTypeActs;
+
+               QAction * quitAppAct;
+               QAction * powerAct;
+               QAction * pauseAct;
+               QAction * x1Act;
+               QAction * x2Act;
+               QAction * x3Act;
+               QAction * ntscAct;
+               QAction * palAct;
+               QAction * blurAct;
+               QAction * aboutAct;
+               QAction * filePickAct;
+               QAction * configAct;
+               QAction * useCDAct;
+};
+
+#endif // __MAINWIN_H__
diff --git a/src/gui/menu.cpp b/src/gui/menu.cpp
deleted file mode 100644 (file)
index f033977..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-//
-// Menu class & supporting structs/classes
-//
-// by James L. Hammons
-//
-
-#include "menu.h"
-
-// Local variables
-static const char separator[] = "--------------------------------------------------------";
-
-// Implementation
-
-Menu::Menu(uint32 x/*= 0*/, uint32 y/*= 0*/, uint32 w/*= 0*/, uint32 h/*= FONT_HEIGHT*/,
-       uint32 fgc/*= 0xFF7F0000*/, uint32 bgc/*= 0xFFFF3F3F*/, uint32 fgch/*= 0xFFFF3F3F*/,
-       uint32 bgch/*= 0xFFFF8787*/):
-       Element(x, y, w, h), activated(false), clicked(false), inside(0), insidePopup(0),
-       fgColor(fgc), bgColor(bgc), fgColorHL(fgch), bgColorHL(bgch), menuChosen(-1),
-       menuItemChosen(-1)
-{
-}
-
-void Menu::HandleKey(SDLKey key)
-{
-       for(uint32 i=0; i<itemList.size(); i++)
-       {
-               for(uint32 j=0; j<itemList[i].item.size(); j++)
-               {
-                       if (itemList[i].item[j].hotKey == key)
-                       {
-                               SDL_Event event;
-                               event.type = SDL_USEREVENT;
-                               event.user.code = MENU_ITEM_CHOSEN;
-                               event.user.data1 = (void *)itemList[i].item[j].action;
-                       SDL_PushEvent(&event);
-
-                               clicked = false, menuChosen = menuItemChosen = -1;
-                               break;
-                       }
-               }
-       }
-}
-
-void Menu::HandleMouseMove(uint32 x, uint32 y)
-{
-       inside = insidePopup = 0;
-
-       if (Inside(x, y))
-       {
-               // Find out *where* we are inside the menu bar
-               uint32 xpos = extents.x;
-
-               for(uint32 i=0; i<itemList.size(); i++)
-               {
-                       uint32 width = (itemList[i].title.length() + 2) * FONT_WIDTH;
-
-                       if (x >= xpos && x < xpos + width)
-                       {
-                               inside = i + 1;
-                               menuChosen = i;
-                               break;
-                       }
-
-                       xpos += width;
-               }
-       }
-
-       if (!Inside(x, y) && !clicked)
-       {
-               menuChosen = -1;
-       }
-
-       if (itemList[menuChosen].Inside(x, y) && clicked)
-       {
-               insidePopup = ((y - itemList[menuChosen].extents.y) / FONT_HEIGHT) + 1;
-               menuItemChosen = insidePopup - 1;
-       }
-}
-
-void Menu::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
-{
-       if (!clicked)
-       {
-               if (mouseDown)
-               {
-                       if (inside)
-                               clicked = true;
-                       else
-                               menuChosen = -1;                                        // clicked is already false...!
-               }
-       }
-       else                                                                                    // clicked == true
-       {
-               if (insidePopup && !mouseDown)                          // I.e., mouse-button-up
-               {
-                       activated = true;
-                       if (itemList[menuChosen].item[menuItemChosen].action != NULL)
-                       {
-//                             itemList[menuChosen].item[menuItemChosen].action();
-                               SDL_Event event;
-                               event.type = SDL_USEREVENT;
-                               event.user.code = MENU_ITEM_CHOSEN;
-                               event.user.data1 = (void *)itemList[menuChosen].item[menuItemChosen].action;
-                           SDL_PushEvent(&event);
-
-                               clicked = false, menuChosen = menuItemChosen = -1;
-
-/*                             SDL_Event event;
-                               while (SDL_PollEvent(&event));          // Flush the event queue...
-                               event.type = SDL_MOUSEMOTION;
-                               int mx, my;
-                               SDL_GetMouseState(&mx, &my);
-                               event.motion.x = mx, event.motion.y = my;
-                           SDL_PushEvent(&event);                              // & update mouse position...!
-*/                     }
-               }
-
-               if (!inside && !insidePopup && mouseDown)
-                       clicked = false, menuChosen = menuItemChosen = -1;
-       }
-}
-
-void Menu::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       uint32 xpos = extents.x + offsetX;
-
-       for(uint32 i=0; i<itemList.size(); i++)
-       {
-//             uint16 color1 = fgColor, color2 = bgColor;
-               uint32 color1 = fgColor, color2 = bgColor;
-               if (inside == (i + 1) || (menuChosen != -1 && (uint32)menuChosen == i))
-                       color1 = fgColorHL, color2 = bgColorHL;
-
-               DrawStringOpaque(screenBuffer, xpos, extents.y + offsetY, color1, color2,
-                       " %s ", itemList[i].title.c_str());
-               xpos += (itemList[i].title.length() + 2) * FONT_WIDTH;
-       }
-
-       // Draw sub menu (but only if active)
-       if (clicked)
-       {
-               uint32 ypos = extents.y + FONT_HEIGHT + 1;
-
-               for(uint32 i=0; i<itemList[menuChosen].item.size(); i++)
-               {
-//                     uint16 color1 = fgColor, color2 = bgColor;
-                       uint32 color1 = fgColor, color2 = bgColor;
-
-                       if (insidePopup == i + 1)
-                               color1 = fgColorHL, color2 = bgColorHL, menuItemChosen = i;
-
-                       if (itemList[menuChosen].item[i].name.length() > 0)
-                               DrawStringOpaque(screenBuffer, itemList[menuChosen].extents.x, ypos,
-                                       color1, color2, " %-*.*s ", itemList[menuChosen].charLength,
-                                       itemList[menuChosen].charLength, itemList[menuChosen].item[i].name.c_str());
-                       else
-                               DrawStringOpaque(screenBuffer, itemList[menuChosen].extents.x, ypos,
-                                       fgColor, bgColor, "%.*s", itemList[menuChosen].charLength + 2, separator);
-
-                       ypos += FONT_HEIGHT;
-               }
-       }
-}
-
-void Menu::Add(MenuItems mi)
-{
-       for(uint32 i=0; i<mi.item.size(); i++)
-               if (mi.item[i].name.length() > mi.charLength)
-                       mi.charLength = mi.item[i].name.length();
-
-       // Set extents here as well...
-       mi.extents.x = extents.x + extents.w, mi.extents.y = extents.y + FONT_HEIGHT + 1;
-       mi.extents.w = (mi.charLength + 2) * FONT_WIDTH, mi.extents.h = mi.item.size() * FONT_HEIGHT;
-
-       itemList.push_back(mi);
-       extents.w += (mi.title.length() + 2) * FONT_WIDTH;
-}
diff --git a/src/gui/menu.h b/src/gui/menu.h
deleted file mode 100644 (file)
index 9847418..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-//
-// Menu class & supporting structs/classes
-//
-// by James L. Hammons
-//
-
-#ifndef __MENU_H__
-#define __MENU_H__
-
-#include <string>
-#include <vector>
-#include "element.h"
-#include "guimisc.h"                                                   // Ick.
-
-class Window;
-
-struct NameAction
-{
-       std::string name;
-       Window * (* action)(void);
-       SDLKey hotKey;
-
-       NameAction(std::string n, Window * (* a)(void) = NULL, SDLKey k = SDLK_UNKNOWN):
-               name(n), action(a), hotKey(k) {}
-};
-
-class MenuItems
-{
-       public:
-               MenuItems(): charLength(0) {}
-               // Normally, we avoid implementation in a header file but in this case
-               // we can make an exception. ;-)
-               bool Inside(uint32 x, uint32 y)
-               { return (x >= (uint32)extents.x && x < (uint32)(extents.x + extents.w)
-               && y >= (uint32)extents.y && y < (uint32)(extents.y + extents.h) ? true : false); }
-
-               std::string title;
-               std::vector<NameAction> item;
-               uint32 charLength;
-               SDL_Rect extents;
-};
-
-class Menu: public Element
-{
-       public:
-// 1CFF -> 0 001 11 00  111 1 1111
-// 421F -> 0 100 00 10  000 1 1111
-               Menu(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = FONT_HEIGHT,
-                       uint32 fgc = 0xFF7F0000, uint32 bgc = 0xFFFF3F3F, uint32 fgch = 0xFFFF3F3F,
-                       uint32 bgch = 0xFFFF8787);
-               virtual void HandleKey(SDLKey key);
-               virtual void HandleMouseMove(uint32 x, uint32 y);
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element *) {}
-               void Add(MenuItems mi);
-
-       protected:
-               bool activated, clicked;
-               uint32 inside, insidePopup;
-               uint32 fgColor, bgColor, fgColorHL, bgColorHL;
-               int menuChosen, menuItemChosen;
-
-       private:
-               std::vector<MenuItems> itemList;
-};
-
-#endif // __MENU_H__
diff --git a/src/gui/pushbutton.cpp b/src/gui/pushbutton.cpp
deleted file mode 100644 (file)
index 738b3ac..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// PushButton class
-//
-// by James L. Hammons
-//
-
-#include "pushbutton.h"
-
-#include "guimisc.h"
-
-PushButton::PushButton(uint32 x, uint32 y, bool * st, std::string s):
-       Element(x, y, 16, 16), state(st), inside(false), text(s)
-{
-       if (st == NULL)
-               state = &internalState;
-}
-
-void PushButton::HandleMouseMove(uint32 x, uint32 y)
-{
-       inside = Inside(x, y);
-}
-
-void PushButton::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
-{
-       if (inside && mouseDown)
-               *state = !(*state);
-}
-
-void PushButton::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       if (*state)
-               DrawTransparentBitmap(screenBuffer, extents.x + offsetX, extents.y + offsetY, &pbDown);
-       else
-               DrawTransparentBitmap(screenBuffer, extents.x + offsetX, extents.y + offsetY, &pbUp);
-
-       if (text.length() > 0)
-               DrawString(screenBuffer, extents.x + offsetX + 24, extents.y + offsetY, false, "%s", text.c_str());
-}
diff --git a/src/gui/pushbutton.h b/src/gui/pushbutton.h
deleted file mode 100644 (file)
index 2593b57..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// PushButton class
-//
-// by James L. Hammons
-//
-
-#ifndef __PUSHBUTTON_H__
-#define __PUSHBUTTON_H__
-
-#include <string>
-#include "element.h"
-
-// How to handle?
-// Save state externally?
-//We pass in a state variable if we want to track it externally, otherwise we use our own
-//internal state var. Still need to do some kind of callback for pushbuttons that do things
-//like change from fullscreen to windowed... !!! FIX !!!
-
-class PushButton: public Element
-{
-       public:
-               PushButton(uint32 x, uint32 y, bool * st, std::string s);
-               virtual void HandleKey(SDLKey key) {}
-               virtual void HandleMouseMove(uint32 x, uint32 y);
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element *) {}
-
-       protected:
-               bool * state;
-               bool inside;
-               std::string text;
-               bool internalState;
-};
-
-#endif // __PUSHBUTTON_H__
diff --git a/src/gui/slideswitch.cpp b/src/gui/slideswitch.cpp
deleted file mode 100644 (file)
index fcf0520..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// SlideSwitch class
-//
-// by James L. Hammons
-//
-
-#include "slideswitch.h"
-
-#include "guimisc.h"
-
-SlideSwitch::SlideSwitch(uint32 x, uint32 y, bool * st, std::string s1, std::string s2):
-       Element(x, y, 16, 32), state(st), inside(false), text1(s1), text2(s2)
-{
-}
-
-void SlideSwitch::HandleMouseMove(uint32 x, uint32 y)
-{
-       inside = Inside(x, y);
-}
-
-void SlideSwitch::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
-{
-       if (inside && mouseDown)
-       {
-               *state = !(*state);
-       }
-}
-
-void SlideSwitch::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       DrawTransparentBitmapDeprecated(screenBuffer, extents.x + offsetX, extents.y + offsetY, (*state ? slideSwitchDown : slideSwitchUp));
-
-       if (text1.length() > 0)
-               DrawString(screenBuffer, extents.x + offsetX + 24, extents.y + offsetY, false, "%s", text1.c_str());
-
-       if (text2.length() > 0)
-               DrawString(screenBuffer, extents.x + offsetX + 24, extents.y + offsetY + 16, false, "%s", text2.c_str());
-}
diff --git a/src/gui/slideswitch.h b/src/gui/slideswitch.h
deleted file mode 100644 (file)
index b23fe3d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-//
-// SlideSwitch class
-//
-// by James L. Hammons
-//
-
-#ifndef __SLIDESWITCH_H__
-#define __SLIDESWITCH_H__
-
-#include <string>
-#include "element.h"
-
-// How to handle?
-// Save state externally?
-#warning Seems to be handled the same as PushButton, but without sanity checks. !!! FIX !!!
-
-class SlideSwitch: public Element
-{
-       public:
-               SlideSwitch(uint32 x, uint32 y, bool * st, std::string s1, std::string s2);
-               virtual void HandleKey(SDLKey key) {}
-               virtual void HandleMouseMove(uint32 x, uint32 y);
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element *) {}
-
-       protected:
-               bool * state;
-               bool inside;
-               std::string text1, text2;
-};
-
-#endif // __SLIDESWITCH_H__
diff --git a/src/gui/text.cpp b/src/gui/text.cpp
deleted file mode 100644 (file)
index 2d35242..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Static text class
-//
-// by James L. Hammons
-//
-
-#include "text.h"
-
-#include "guimisc.h"
-
-Text::Text(uint32 x/*= 0*/, uint32 y/*= 0*/, uint32 w/*= 0*/, uint32 h/*= 0*/):
-       Element(x, y, w, h), fgColor(0xFF8484FF), bgColor(0xFF84FF4D)
-{
-}
-
-Text::Text(uint32 x, uint32 y, std::string s, uint32 fg/*= 0xFF8484FF*/, uint32 bg/*= 0xFF84FF4D*/):
-       Element(x, y, 0, 0), fgColor(fg), bgColor(bg), text(s)
-{
-}
-
-void Text::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       if (text.length() > 0)
-//             DrawString(screenBuffer, extents.x + offsetX, extents.y + offsetY, false, "%s", text.c_str());
-               DrawStringOpaque(screenBuffer, extents.x + offsetX, extents.y + offsetY, fgColor, bgColor, "%s", text.c_str());
-}
diff --git a/src/gui/text.h b/src/gui/text.h
deleted file mode 100644 (file)
index 9651efd..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-//
-// Static text class
-//
-// by James L. Hammons
-//
-
-#ifndef __TEXT_H__
-#define __TEXT_H__
-
-#include <string>
-#include "element.h"
-
-class Text: public Element
-{
-       public:
-               Text(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0);
-               Text(uint32 x, uint32 y, std::string s, uint32 fg = 0xFF8484FF, uint32 bg = 0xFF84FF4D);
-               virtual void HandleKey(SDLKey key) {}
-               virtual void HandleMouseMove(uint32 x, uint32 y) {}
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown) {}
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element *) {}
-
-       protected:
-               uint32 fgColor, bgColor;
-               std::string text;
-};
-
-#endif // __TEXT_H__
diff --git a/src/gui/textedit.cpp b/src/gui/textedit.cpp
deleted file mode 100644 (file)
index 301dd3e..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-//
-// TextEdit class
-//
-// by James L. Hammons
-//
-
-#include "textedit.h"
-
-#include "guimisc.h"
-
-TextEdit::TextEdit(uint32 x/*= 0*/, uint32 y/*= 0*/, uint32 w/*= 0*/, uint32 h/*= 0*/):
-       Element(x, y, w, h), fgColor(0xFF8484FF), bgColor(0xFF84FF4D), text(""),
-       caretPos(0), maxScreenSize(10)
-{
-}
-
-TextEdit::TextEdit(uint32 x, uint32 y, std::string s, uint32 mss/*= 10*/, uint32 fg/*= 0xFF8484FF*/, uint32 bg/*= 0xFF84FF4D*/):
-       Element(x, y, 0, 0), fgColor(fg), bgColor(bg), text(s), caretPos(0), maxScreenSize(mss)
-{
-}
-
-//Set different filters depending on type passed in on construction, e.g., filename, amount, etc...?
-void TextEdit::HandleKey(SDLKey key)
-{
-       if ((key >= SDLK_a && key <= SDLK_z) || (key >= SDLK_0 && key <= SDLK_9) || key == SDLK_PERIOD
-               || key == SDLK_SLASH)
-       {
-               //Need to handle shift key as well...
-               text[caretPos++] = key;
-               Draw();
-       }
-       else if (key == SDLK_BACKSPACE)
-       {
-
-       }
-       else if (key == SDLK_DELETE)
-       {
-       }
-//left, right arrow
-}
-
-void TextEdit::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       if (text.length() > 0)
-       {
-               FillScreenRectangle(screenBuffer, extents.x + offsetX, extents.y + offsetY, FONT_WIDTH * maxScreenSize, FONT_HEIGHT, bgColor);
-//             DrawString(screenBuffer, extents.x + offsetX, extents.y + offsetY, false, "%s", text.c_str());
-               DrawStringOpaque(screenBuffer, extents.x + offsetX, extents.y + offsetY, fgColor, bgColor, "%s", text.c_str());
-       }
-
-       // Draw the caret (underscore? or vertical line?)
-}
diff --git a/src/gui/textedit.h b/src/gui/textedit.h
deleted file mode 100644 (file)
index 17f9101..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//
-// TextEdit class
-//
-// by James L. Hammons
-//
-
-#ifndef __TEXTEDIT_H__
-#define __TEXTEDIT_H__
-
-#include <string>
-#include "element.h"
-
-class TextEdit: public Element
-{
-       public:
-               TextEdit(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0);
-               TextEdit(uint32 x, uint32 y, std::string s, uint32 mss = 10, uint32 fg = 0xFF8484FF,
-                       uint32 bg = 0xFF84FF4D);
-               virtual void HandleKey(SDLKey key);
-               virtual void HandleMouseMove(uint32 x, uint32 y) {}
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown) {}
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element *) {}
-
-       protected:
-               uint32 fgColor, bgColor;
-               std::string text;
-               uint32 caretPos;
-               uint32 maxScreenSize;
-};
-
-#endif // __TEXTEDIT_H__
diff --git a/src/gui/virtualjaguar.qrc b/src/gui/virtualjaguar.qrc
new file mode 100644 (file)
index 0000000..6215a22
--- /dev/null
@@ -0,0 +1,24 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+       <file>../../res/vj-icon.png</file>
+       <file>../../res/power.png</file>
+       <file>../../res/pause.png</file>
+       <file>../../res/zoom100.png</file>
+       <file>../../res/zoom200.png</file>
+       <file>../../res/zoom300.png</file>
+       <file>../../res/generic.png</file>
+       <file>../../res/cart-blank.png</file>
+       <file>../../res/label-blank.png</file>
+       <file>../../res/vj_title_small.png</file>
+       <file>../../res/controller.png</file>
+       <file>../../res/insert.png</file>
+       <file>../../res/software.png</file>
+       <file>../../res/ntsc.png</file>
+       <file>../../res/pal.png</file>
+       <file>../../res/upper-left.png</file>
+       <file>../../res/upper-right.png</file>
+       <file>../../res/alpine-file.png</file>
+       <file>../../res/homebrew-file.png</file>
+       <file>../../res/unknown-file.png</file>
+</qresource>
+</RCC>
diff --git a/src/gui/vj_title_small.c b/src/gui/vj_title_small.c
deleted file mode 100644 (file)
index 66c0519..0000000
+++ /dev/null
@@ -1,2208 +0,0 @@
-/* GIMP RGBA C-Source image dump (vj-title-small.c) */
-
-#if 0
-static const struct {
-  unsigned int          width;
-  unsigned int          height;
-  unsigned int          bytes_per_pixel; /* 3:RGB, 4:RGBA */
-  unsigned char         pixel_data[197 * 89 * 4 + 1];
-}
-#endif
-#warning Nonportable!--!!! FIX !!!
-uint8 vj_title_small[] = {
-//  197, 89, 4,
-       "\305\0\0\0"
-       "\131\0\0\0"
-       "\4\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\21\0\231\372K\0\231\372`\0\231\372C\0"
-  "\231\372\6\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\231\3721\0\231\372w\0\231\3724\0\0\0\0\0\0\0\0\0\231\372\23\0\231\372"
-  "l\0\231\372X\0\231\372\6\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\3\0\231"
-  "\3729\0\231\372\\\0\231\372b\0\231\372b\0\231\372b\0\231\372b\0\231\372b"
-  "\0\231\372b\0\231\372b\0\231\372b\0\231\372b\0\231\372\\\0\231\372'\0\231"
-  "\372\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\2\0\231\3723\0\231\372\\\0\231\372"
-  "a\0\231\372a\0\231\372a\0\231\372a\0\231\372a\0\231\372a\0\231\372a\0\231"
-  "\372a\0\231\372a\0\231\372a\0\231\372a\0\231\372a\0\231\372W\0\231\372%\0"
-  "\231\372\0\0\231\372\0\0\231\372,\0\231\372y\0\231\372=\0\231\372\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\231"
-  "\372\13\0\231\372d\0\231\372e\0\231\372\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\231\372\1\0\231\372+\0\231\372[\0\231\372a\0\231\372a\0\231\372a\0\231"
-  "\372a\0\231\372a\0\231\372a\0\231\372a\0\231\372U\0\231\372'\0\231\372\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\27\0\231\372n\0\231\372M\0\231"
-  "\372\4\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\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\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\231\372K\0\231\372\346\0\231\372\334\0\231\372\314\0\231"
-  "\372\353\0\231\372\270\0\231\372\7\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\231\3727\0\231\372\357\0\231\372\310\0\231\372\354\0\231\372"
-  "(\0\231\372\2\0\231\372\277\0\231\372\323\0\231\372\343\0\231\372\207\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\231\372\12\0\231\372\262\0\231\372\353\0\231\372\313"
-  "\0\231\372\307\0\231\372\307\0\231\372\307\0\231\372\307\0\231\372\307\0"
-  "\231\372\307\0\231\372\307\0\231\372\307\0\231\372\307\0\231\372\331\0\231"
-  "\372\364\0\231\372y\0\231\372\1\0\0\0\0\0\0\0\0\0\231\372m\0\231\372\355"
-  "\0\231\372\307\0\231\372\304\0\231\372\304\0\231\372\304\0\231\372\304\0"
-  "\231\372\304\0\231\372\304\0\231\372\304\0\231\372\304\0\231\372\304\0\231"
-  "\372\304\0\231\372\304\0\231\372\304\0\231\372\315\0\231\372\357\0\231\372"
-  "C\0\231\372)\0\231\372\357\0\231\372\303\0\231\372\360\0\231\372:\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\231\372\1\0\231"
-  "\372\260\0\231\372\330\0\231\372\336\0\231\372\237\0\231\372\0\0\0\0\0\0"
-  "\0\0\0\0\231\372\0\0\231\372w\0\231\372\356\0\231\372\323\0\231\372\304\0"
-  "\231\372\304\0\231\372\304\0\231\372\304\0\231\372\304\0\231\372\304\0\231"
-  "\372\305\0\231\372\325\0\231\372\356\0\231\372f\0\231\372\0\0\0\0\0\0\0\0"
-  "\0\0\231\372\12\0\231\372\321\0\231\372\317\0\231\372\353\0\231\372}\0\231"
-  "\372\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\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\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"
-  "\231\372\0\0\231\372\304\0\231\372\217\0\231\372\11\0\231\372\1\0\231\372"
-  "%\0\231\372\357\0\231\3728\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\231\372n\0\231\372\305\0\231\372\6\0\231\372\313\0\231\372p\0\231\372"
-  "\26\0\231\372\362\0\231\3723\0\231\372u\0\231\372\304\0\231\372\2\0\0\0\0"
-  "\0\0\0\0\0\231\372Q\0\231\372\355\0\231\372$\0\231\372\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\231\372\4\0\231"
-  "\372Y\0\231\372\357\0\231\372\25\0\0\0\0\0\0\0\0\0\231\372\313\0\231\372"
-  "x\0\231\372\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\231\372\2\0\231\372\260\0\231\372"
-  "\224\0\231\372d\0\231\372\320\0\231\372\5\0\231\372\302\0\231\372z\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\231\372\16\0"
-  "\231\372\345\0\231\372F\0\231\372X\0\231\372\336\0\231\372\7\0\0\0\0\0\0"
-  "\0\0\0\231\372\22\0\231\372\360\0\231\372R\0\231\372\3\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\231\372\0\0\231\372\3\0\231\372j\0\231\372"
-  "\337\0\231\372\17\0\0\0\0\0\0\0\0\0\231\372)\0\231\372\362\0\231\372\36\0"
-  "\231\372\205\0\231\372\271\0\231\372\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\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\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\231\372\3\0\231\372\342\0\231\372Q\0\0\0"
-  "\0\0\0\0\0\0\231\372\0\0\231\372\330\0\231\372`\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\231\372y\0\231\372\275\0\0\0\0\0\231\372\264\0\231"
-  "\372\202\0\231\372\32\0\231\372\363\0\231\372*\0\231\372a\0\231\372\321\0"
-  "\231\372\5\0\0\0\0\0\0\0\0\0\231\372}\0\231\372\277\0\231\372\1\0\231\372"
-  "\5\0\231\372]\0\231\372\223\0\231\372\227\0\231\372\227\0\231\372\227\0\231"
-  "\372\227\0\231\372\227\0\231\372\207\0\231\3725\0\231\372\0\0\231\372\30"
-  "\0\231\372\366\0\231\3720\0\0\0\0\0\0\0\0\0\231\372\215\0\231\372\342\0\231"
-  "\372\236\0\231\372\227\0\231\372\227\0\231\372\224\0\231\372h\0\231\372\11"
-  "\0\0\0\0\0\231\372\1\0\231\372B\0\231\372\207\0\231\372\227\0\231\372\227"
-  "\0\231\372\227\0\231\372\251\0\231\372\351\0\231\372^\0\231\372k\0\231\372"
-  "\311\0\231\372\2\0\231\372\266\0\231\372\201\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\231\372\21\0\231\372\351\0\231\372"
-  ";\0\231\372K\0\231\372\343\0\231\372\11\0\0\0\0\0\0\0\0\0\231\3721\0\231"
-  "\372\355\0\231\372\27\0\231\372\0\0\231\372>\0\231\372\202\0\231\372\227"
-  "\0\231\372\227\0\231\372\227\0\231\372\202\0\231\3722\0\231\372\0\0\231\372"
-  "&\0\231\372\363\0\231\372\36\0\0\0\0\0\0\0\0\0\231\372/\0\231\372\360\0\231"
-  "\372\25\0\231\372z\0\231\372\275\0\231\372\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\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\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\231\372\12\0\231\372\354\0\231\372"
-  "A\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\313\0\231\372k\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\231\372y\0\231\372\275\0\0\0\0\0\231\372\264"
-  "\0\231\372\202\0\231\372\32\0\231\372\363\0\231\372*\0\231\372a\0\231\372"
-  "\321\0\231\372\5\0\0\0\0\0\0\0\0\0\231\372\177\0\231\372\271\0\231\372\1"
-  "\0\231\372g\0\231\372\351\0\231\372\230\0\231\372\215\0\231\372\215\0\231"
-  "\372\215\0\231\372\215\0\231\372\220\0\231\372\264\0\231\372\351\0\231\372"
-  "\37\0\231\372\25\0\231\372\364\0\231\3721\0\0\0\0\0\0\0\0\0\231\372\13\0"
-  "\231\372d\0\231\372\215\0\231\372\215\0\231\372\215\0\231\372\225\0\231\372"
-  "\337\0\231\372\214\0\231\372\0\0\231\372A\0\231\372\353\0\231\372\247\0\231"
-  "\372\215\0\231\372\215\0\231\372\215\0\231\372\204\0\231\372O\0\231\372\3"
-  "\0\231\372k\0\231\372\311\0\231\372\2\0\231\372\266\0\231\372\201\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\231\372\21\0\231"
-  "\372\351\0\231\372<\0\231\372K\0\231\372\343\0\231\372\11\0\0\0\0\0\0\0\0"
-  "\0\231\372A\0\231\372\346\0\231\372\17\0\231\372*\0\231\372\353\0\231\372"
-  "\257\0\231\372\217\0\231\372\215\0\231\372\217\0\231\372\266\0\231\372\341"
-  "\0\231\372\30\0\231\372\27\0\231\372\365\0\231\372*\0\0\0\0\0\0\0\0\0\231"
-  "\372/\0\231\372\361\0\231\372\25\0\231\372z\0\231\372\275\0\231\372\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\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\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\231\372\13"
-  "\0\231\372\354\0\231\372@\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\313\0\231\372"
-  "k\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\231\372y\0\231\372\275"
-  "\0\0\0\0\0\231\372\264\0\231\372\202\0\231\372\32\0\231\372\363\0\231\372"
-  "*\0\231\372a\0\231\372\321\0\231\372\5\0\0\0\0\0\0\0\0\0\231\372\177\0\231"
-  "\372\272\0\231\372\2\0\231\372\262\0\231\372\215\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\231\372\3\0\231\372\333\0\231\372]\0\231\372\25"
-  "\0\231\372\364\0\231\3721\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\231\372j\0\231\372\321\0\231\372\3\0\231\372\207\0\231"
-  "\372\264\0\231\372\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\231"
-  "\372k\0\231\372\311\0\231\372\2\0\231\372\266\0\231\372\201\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\231\372\21\0\231\372"
-  "\351\0\231\372<\0\231\372K\0\231\372\343\0\231\372\11\0\0\0\0\0\0\0\0\0\231"
-  "\372A\0\231\372\346\0\231\372\17\0\231\372d\0\231\372\320\0\231\372\6\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\231\372\12\0\231\372\351\0\231\372J\0\231\372\26\0"
-  "\231\372\366\0\231\372+\0\0\0\0\0\0\0\0\0\231\372/\0\231\372\361\0\231\372"
-  "\25\0\231\372z\0\231\372\275\0\231\372\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\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\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\231\372\13\0\231\372\354\0\231\372@\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\231\372\313\0\231\372k\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\231\372y\0\231\372\275\0\0\0\0\0\231\372\264\0\231"
-  "\372\202\0\231\372\32\0\231\372\363\0\231\372*\0\231\372a\0\231\372\321\0"
-  "\231\372\5\0\0\0\0\0\0\0\0\0\231\372\177\0\231\372\272\0\231\372\3\0\231"
-  "\372\306\0\231\372o\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\231"
-  "\372\0\0\231\372\312\0\231\372g\0\231\372\25\0\231\372\364\0\231\3721\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\231\372Q\0"
-  "\231\372\337\0\231\372\10\0\231\372\231\0\231\372\235\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\231\372k\0\231\372\311\0\231\372\2"
-  "\0\231\372\266\0\231\372\201\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\231\372\21\0\231\372\351\0\231\372<\0\231\372K\0\231"
-  "\372\343\0\231\372\11\0\0\0\0\0\0\0\0\0\231\372A\0\231\372\346\0\231\372"
-  "\17\0\231\372{\0\231\372\273\0\231\372\1\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372"
-  "\1\0\231\372\331\0\231\372]\0\231\372\26\0\231\372\366\0\231\372+\0\0\0\0"
-  "\0\0\0\0\0\231\372/\0\231\372\361\0\231\372\25\0\231\372z\0\231\372\275\0"
-  "\231\372\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\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\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\231\372\13\0\231\372\354\0\231\372@\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372"
-  "\313\0\231\372k\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\231\372"
-  "y\0\231\372\275\0\0\0\0\0\231\372\264\0\231\372\202\0\231\372\32\0\231\372"
-  "\363\0\231\372*\0\231\372^\0\231\372\321\0\231\372\5\0\0\0\0\0\0\0\0\0\231"
-  "\372\177\0\231\372\272\0\231\372\3\0\231\372\306\0\231\372p\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\231\372\0\0\231\372\314\0\231\372g\0"
-  "\231\372\21\0\231\372\360\0\231\3728\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\231\372Q\0\231\372\337\0\231\372\10\0\231"
-  "\372\220\0\231\372\247\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\231\372k\0\231\372\311\0\231\372\2\0\231\372\266\0\231\372\201\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\231\372"
-  "\21\0\231\372\351\0\231\372<\0\231\372K\0\231\372\343\0\231\372\11\0\0\0"
-  "\0\0\0\0\0\0\231\372A\0\231\372\346\0\231\372\17\0\231\372z\0\231\372\273"
-  "\0\231\372\1\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\0\0\231\372\326\0\231\372"
-  "W\0\231\372\26\0\231\372\366\0\231\372+\0\0\0\0\0\0\0\0\0\231\372/\0\231"
-  "\372\361\0\231\372\25\0\231\372l\0\231\372\312\0\231\372\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\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\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\231\372\13\0\231\372"
-  "\354\0\231\372@\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\313\0\231\372k\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\231\372y\0\231\372\275\0\0\0\0"
-  "\0\231\372\264\0\231\372\202\0\231\372\32\0\231\372\363\0\231\372*\0\231"
-  "\372G\0\231\372\341\0\231\372\27\0\0\0\0\0\0\0\0\0\231\372\177\0\231\372"
-  "\272\0\231\372\1\0\231\372\250\0\231\372\234\0\231\372\11\0\231\372\4\0\231"
-  "\372\4\0\231\372\4\0\231\372\4\0\231\372\5\0\231\372\22\0\231\372\343\0\231"
-  "\372Z\0\231\372\13\0\231\372\345\0\231\372Y\0\231\372\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\231\372Q\0\231\372\337\0\231\372"
-  "\10\0\231\372\200\0\231\372\302\0\231\372\10\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\231\372k\0\231\372\311\0\231\372\2\0\231\372\230\0"
-  "\231\372\252\0\231\372\11\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\231\372\21\0\231\372\351\0\231\372<\0\231\372K\0\231\372\343\0"
-  "\231\372\11\0\0\0\0\0\231\372\1\0\231\372b\0\231\372\334\0\231\372\11\0\231"
-  "\372d\0\231\372\327\0\231\372\21\0\231\372\5\0\231\372\4\0\231\372\6\0\231"
-  "\372\31\0\231\372\354\0\231\372E\0\231\372\20\0\231\372\360\0\231\372D\0"
-  "\231\372\0\0\0\0\0\0\231\372/\0\231\372\361\0\231\372\25\0\231\372a\0\231"
-  "\372\332\0\231\372\16\0\231\372\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\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\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\231\372\13\0\231\372\354\0\231\372@\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\231\372\313\0\231\372k\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\231\372\177\0\231\372\270\0\0\0\0\0\231\372\264\0\231\372\202\0"
-  "\231\372\32\0\231\372\363\0\231\372*\0\231\372\22\0\231\372\317\0\231\372"
-  "\332\0\231\372K\0\231\372\0\0\231\372\177\0\231\372\272\0\231\372\1\0\231"
-  "\372A\0\231\372\356\0\231\372\333\0\231\372\315\0\231\372\315\0\231\372\315"
-  "\0\231\372\315\0\231\372\320\0\231\372\347\0\231\372\316\0\231\372\23\0\231"
-  "\372\1\0\231\372\213\0\231\372\361\0\231\372\217\0\231\372\14\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\231\372Q\0\231\372\337\0\231\372\10"
-  "\0\231\372,\0\231\372\340\0\231\372\306\0\231\372+\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\231\372k\0\231\372\311\0\231\372\2\0\231\3728\0\231"
-  "\372\342\0\231\372\312\0\231\372,\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\231\372\21\0\231\372\351\0\231\372<\0\231\372K\0\231\372\343\0"
-  "\231\372\11\0\231\372\17\0\231\372\231\0\231\372\354\0\231\372\177\0\231"
-  "\372\0\0\231\372!\0\231\372\334\0\231\372\342\0\231\372\321\0\231\372\315"
-  "\0\231\372\323\0\231\372\345\0\231\372\304\0\231\372\15\0\231\372\2\0\231"
-  "\372\235\0\231\372\352\0\231\372\204\0\231\372\5\0\231\372/\0\231\372\361"
-  "\0\231\372\25\0\231\372\36\0\231\372\325\0\231\372\326\0\231\372A\0\231\372"
-  "\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\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\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\231\372\13\0\231\372"
-  "\354\0\231\372@\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\313\0\231\372k\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\2\0\231\372\236\0\231\372\231"
-  "\0\0\0\0\0\231\372\264\0\231\372\202\0\231\372\32\0\231\372\363\0\231\372"
-  "*\0\0\0\0\0\231\372\20\0\231\372|\0\231\372\350\0\231\372\27\0\231\372\177"
-  "\0\231\372\272\0\231\372\1\0\231\372\1\0\231\372!\0\231\372L\0\231\372S\0"
-  "\231\372S\0\231\372S\0\231\372S\0\231\372S\0\231\372C\0\231\372\23\0\0\0"
-  "\0\0\0\0\0\0\231\372\4\0\231\372C\0\231\372\346\0\231\372h\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\231\372Q\0\231\372\337\0\231\372\10"
-  "\0\231\372\0\0\231\372\37\0\231\372\247\0\231\372\304\0\231\372\3\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372k\0\231\372\311\0\231\372\2\0\231\372\0"
-  "\0\231\372\32\0\231\372\262\0\231\372\253\0\231\372\1\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\231\372\21\0\231\372\351\0\231\372<\0\231\372K\0\231"
-  "\372\343\0\231\372\11\0\231\372r\0\231\372\331\0\231\3726\0\231\372\2\0\0"
-  "\0\0\0\231\372\0\0\231\372\23\0\231\372?\0\231\372M\0\231\372S\0\231\372"
-  "J\0\231\372<\0\231\372\17\0\0\0\0\0\0\0\0\0\231\372\5\0\231\372L\0\231\372"
-  "\360\0\231\372D\0\231\372/\0\231\372\361\0\231\372\25\0\0\0\0\0\231\372\22"
-  "\0\231\372\220\0\231\372\334\0\231\372\10\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\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\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\231\372\13\0\231\372\354\0\231\372@\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\231\372\313\0\231\372k\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372"
-  "\26\0\231\372\245\0\231\372\356\0\231\372D\0\0\0\0\0\231\372\264\0\231\372"
-  "\202\0\231\372\32\0\231\372\363\0\231\372*\0\0\0\0\0\0\0\0\0\231\372\22\0"
-  "\231\372\366\0\231\3720\0\231\372\177\0\231\372\272\0\231\372\1\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\231\372\2\0\231\372\22\0\231\372!\0\231\372$\0\231\372$"
-  "\0\231\372$\0\231\372$\0\231\372\34\0\231\372\10\0\0\0\0\0\231\372\0\0\231"
-  "\372\246\0\231\372\214\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"
-  "\231\372Q\0\231\372\337\0\231\372\10\0\0\0\0\0\0\0\0\0\231\372E\0\231\372"
-  "\342\0\231\372\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372k\0\231\372\311"
-  "\0\231\372\2\0\0\0\0\0\0\0\0\0\231\372d\0\231\372\320\0\231\372\5\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\21\0\231\372\351\0\231\372<\0"
-  "\231\372K\0\231\372\343\0\231\372\11\0\231\372\237\0\231\372\232\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\6\0\231\372\34\0\231\372+\0\231\3724\0"
-  "\231\3724\0\231\3724\0\231\3720\0\231\372!\0\231\372\12\0\0\0\0\0\0\0\0\0"
-  "\231\372\317\0\231\372i\0\231\372/\0\231\372\361\0\231\372\25\0\0\0\0\0\0"
-  "\0\0\0\231\372%\0\231\372\364\0\231\372\35\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\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\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\231\372\7\0\231\372\350\0\231\372H\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\231\372\313\0\231\372k\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\0\0\231"
-  "\372\250\0\231\372\304\0\231\3725\0\231\372\1\0\0\0\0\0\231\372\265\0\231"
-  "\372\202\0\231\372\32\0\231\372\363\0\231\372*\0\0\0\0\0\0\0\0\0\231\372"
-  "\20\0\231\372\366\0\231\3721\0\231\372\177\0\231\372\272\0\231\372\1\0\0"
-  "\0\0\0\0\0\0\0\231\372\6\0\231\372\233\0\231\372\354\0\231\372\366\0\231"
-  "\372\370\0\231\372\370\0\231\372\370\0\231\372\370\0\231\372\364\0\231\372"
-  "\322\0\231\372\"\0\0\0\0\0\231\372\242\0\231\372\227\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\231\372Q\0\231\372\337\0\231\372\10\0\0\0"
-  "\0\0\0\0\0\0\231\3726\0\231\372\353\0\231\372\24\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\231\372k\0\231\372\311\0\231\372\2\0\0\0\0\0\0\0\0\0\231\372]"
-  "\0\231\372\323\0\231\372\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231"
-  "\372\21\0\231\372\351\0\231\372<\0\231\372K\0\231\372\343\0\231\372\11\0"
-  "\231\372\251\0\231\372\217\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\14\0\231\372"
-  "\265\0\231\372\356\0\231\372\361\0\231\372\354\0\231\372\354\0\231\372\354"
-  "\0\231\372\357\0\231\372\360\0\231\372\323\0\231\372\36\0\0\0\0\0\231\372"
-  "\315\0\231\372i\0\231\372/\0\231\372\361\0\231\372\25\0\0\0\0\0\0\0\0\0\231"
-  "\372\33\0\231\372\363\0\231\372)\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"
-  "\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\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\231\372\0\0\231\372\313\0\231\372\200\0\231\372\6\0\0\0\0\0\0"
-  "\0\0\0\231\372\313\0\231\372k\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\3\0\231\372"
-  "\321\0\231\372d\0\0\0\0\0\231\372\0\0\231\372\33\0\231\372\337\0\231\372"
-  "]\0\231\372\32\0\231\372\363\0\231\372*\0\0\0\0\0\0\0\0\0\231\372\20\0\231"
-  "\372\366\0\231\3721\0\231\372\177\0\231\372\272\0\231\372\1\0\0\0\0\0\0\0"
-  "\0\0\231\372C\0\231\372\363\0\231\372E\0\231\372\33\0\231\372\16\0\231\372"
-  "\16\0\231\372\16\0\231\372\20\0\231\372!\0\231\372\261\0\231\372\250\0\231"
-  "\372\0\0\231\372\242\0\231\372\227\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\231\372Q\0\231\372\337\0\231\372\10\0\0\0\0\0\0\0\0\0\231\372"
-  "5\0\231\372\354\0\231\372\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372k\0"
-  "\231\372\311\0\231\372\2\0\0\0\0\0\0\0\0\0\231\372N\0\231\372\336\0\231\372"
-  "\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\21\0\231\372\351\0"
-  "\231\372<\0\231\372K\0\231\372\343\0\231\372\11\0\231\372\251\0\231\372\217"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372X\0\231\372\341\0\231\372%\0\231\372\14"
-  "\0\231\372\4\0\231\372\4\0\231\372\4\0\231\372\11\0\231\372\27\0\231\372"
-  "\300\0\231\372\216\0\0\0\0\0\231\372\315\0\231\372i\0\231\372/\0\231\372"
-  "\361\0\231\372\25\0\0\0\0\0\0\0\0\0\231\372\33\0\231\372\363\0\231\372)\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\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\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\231\372N\0\231\372"
-  "\350\0\231\372\274\0\231\372\37\0\0\0\0\0\231\372\313\0\231\372k\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\231\372\7\0\231\372\332\0\231\372W\0\231\372\0\0\231\372"
-  "U\0\231\372\340\0\231\372\277\0\231\372\14\0\231\372\32\0\231\372\363\0\231"
-  "\372*\0\0\0\0\0\0\0\0\0\231\372\20\0\231\372\366\0\231\3721\0\231\372\177"
-  "\0\231\372\272\0\231\372\1\0\0\0\0\0\0\0\0\0\231\372`\0\231\372\330\0\231"
-  "\372\4\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\231\372r\0\231\372"
-  "\314\0\231\372\3\0\231\372\242\0\231\372\227\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\231\372Q\0\231\372\337\0\231\372\10\0\0\0\0\0\0\0"
-  "\0\0\231\3725\0\231\372\354\0\231\372\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\231\372k\0\231\372\311\0\231\372\2\0\0\0\0\0\0\0\0\0\231\372N\0\231\372"
-  "\336\0\231\372\12\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\21\0"
-  "\231\372\351\0\231\372<\0\231\372K\0\231\372\343\0\231\372\11\0\231\372\251"
-  "\0\231\372\217\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372x\0\231\372\276\0\231\372"
-  "\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\231\372\206\0\231\372"
-  "\262\0\0\0\0\0\231\372\315\0\231\372i\0\231\372/\0\231\372\361\0\231\372"
-  "\25\0\0\0\0\0\0\0\0\0\231\372\33\0\231\372\363\0\231\372)\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\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\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\231\372\0\0\231\372$\0\231\372"
-  "\312\0\231\372\214\0\0\0\0\0\231\372\313\0\231\372k\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\231\372\7\0\231\372\332\0\231\372W\0\231\372\11\0\231\372\345\0\231"
-  "\372}\0\231\372\11\0\0\0\0\0\231\372\32\0\231\372\363\0\231\372*\0\0\0\0"
-  "\0\0\0\0\0\231\372\20\0\231\372\366\0\231\3721\0\231\372\177\0\231\372\272"
-  "\0\231\372\1\0\0\0\0\0\0\0\0\0\231\372a\0\231\372\326\0\231\372\3\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\231\372m\0\231\372\323\0\231\372"
-  "\4\0\231\372\242\0\231\372\227\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\231\372Q\0\231\372\337\0\231\372\10\0\0\0\0\0\0\0\0\0\231\3725\0"
-  "\231\372\354\0\231\372\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372k\0\231"
-  "\372\311\0\231\372\2\0\0\0\0\0\0\0\0\0\231\372N\0\231\372\336\0\231\372\12"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\21\0\231\372\351\0\231"
-  "\372<\0\231\372K\0\231\372\343\0\231\372\11\0\231\372\251\0\231\372\217\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\231\372{\0\231\372\272\0\231\372\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\231\372\200\0\231\372\265\0\0\0\0\0"
-  "\231\372\315\0\231\372i\0\231\372/\0\231\372\361\0\231\372\25\0\0\0\0\0\0"
-  "\0\0\0\231\372\33\0\231\372\363\0\231\372)\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\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\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\231\372\220\0\231\372\246\0"
-  "\0\0\0\0\231\372\313\0\231\372k\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\7\0\231"
-  "\372\332\0\231\372W\0\231\372\34\0\231\372\357\0\231\372/\0\0\0\0\0\0\0\0"
-  "\0\231\372\32\0\231\372\363\0\231\372*\0\0\0\0\0\0\0\0\0\231\372\20\0\231"
-  "\372\366\0\231\3721\0\231\372\177\0\231\372\272\0\231\372\1\0\0\0\0\0\0\0"
-  "\0\0\231\372a\0\231\372\326\0\231\372\3\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\231\372m\0\231\372\323\0\231\372\4\0\231\372\242\0\231\372"
-  "\227\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\231\372Q\0\231\372"
-  "\337\0\231\372\10\0\0\0\0\0\0\0\0\0\231\3725\0\231\372\354\0\231\372\25\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372k\0\231\372\311\0\231\372\2\0\0\0"
-  "\0\0\0\0\0\0\231\372N\0\231\372\331\0\231\372\10\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\231\372\21\0\231\372\351\0\231\372<\0\231\372K\0\231\372"
-  "\343\0\231\372\11\0\231\372\251\0\231\372\217\0\0\0\0\0\0\0\0\0\0\0\0\0\231"
-  "\372{\0\231\372\272\0\231\372\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\231\372\200\0\231\372\265\0\0\0\0\0\231\372\315\0\231\372i\0\231"
-  "\372/\0\231\372\361\0\231\372\25\0\0\0\0\0\0\0\0\0\231\372\33\0\231\372\363"
-  "\0\231\372)\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\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\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\231\372\220\0\231\372\246\0\0\0\0\0\231\372\313\0\231\372k\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\231\372\7\0\231\372\332\0\231\372W\0\231\372$\0"
-  "\231\372\357\0\231\372#\0\0\0\0\0\0\0\0\0\231\372\32\0\231\372\363\0\231"
-  "\372*\0\0\0\0\0\0\0\0\0\231\372\20\0\231\372\366\0\231\3721\0\231\372\177"
-  "\0\231\372\272\0\231\372\1\0\0\0\0\0\0\0\0\0\231\372a\0\231\372\326\0\231"
-  "\372\3\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\231\372m\0\231\372"
-  "\323\0\231\372\4\0\231\372\242\0\231\372\227\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\231\372Q\0\231\372\337\0\231\372\10\0\231\372\0\0"
-  "\231\372\0\0\231\3725\0\231\372\354\0\231\372\25\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\231\372k\0\231\372\311\0\231\372\2\0\0\0\0\0\0\0\0\0\231\372N"
-  "\0\231\372\332\0\231\372\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231"
-  "\372\22\0\231\372\351\0\231\3729\0\231\372K\0\231\372\343\0\231\372\11\0"
-  "\231\372\251\0\231\372\217\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372{\0\231\372\272"
-  "\0\231\372\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\231\372\200"
-  "\0\231\372\265\0\0\0\0\0\231\372\315\0\231\372i\0\231\372/\0\231\372\361"
-  "\0\231\372\25\0\0\0\0\0\0\0\0\0\231\372\33\0\231\372\363\0\231\372)\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\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\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\231"
-  "\372\220\0\231\372\246\0\0\0\0\0\231\372\306\0\231\372u\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\231\372\11\0\231\372\335\0\231\372T\0\231\372$\0\231\372\357\0\231"
-  "\372#\0\0\0\0\0\0\0\0\0\231\372\32\0\231\372\363\0\231\372*\0\0\0\0\0\0\0"
-  "\0\0\231\372\20\0\231\372\366\0\231\3721\0\231\372\177\0\231\372\272\0\231"
-  "\372\1\0\0\0\0\0\0\0\0\0\231\372a\0\231\372\326\0\231\372\3\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\231\372m\0\231\372\323\0\231\372\4\0"
-  "\231\372\242\0\231\372\227\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\231\372Q\0\231\372\337\0\231\372\11\0\231\372\6\0\231\372\2\0\231\372"
-  "5\0\231\372\354\0\231\372\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372k\0"
-  "\231\372\311\0\231\372\2\0\0\0\0\0\0\0\0\0\231\372C\0\231\372\342\0\231\372"
-  "\14\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372!\0\231\372\361\0\231"
-  "\372&\0\231\372K\0\231\372\343\0\231\372\11\0\231\372\251\0\231\372\217\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\231\372{\0\231\372\272\0\231\372\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\231\372\200\0\231\372\265\0\0\0\0\0"
-  "\231\372\315\0\231\372i\0\231\372/\0\231\372\361\0\231\372\25\0\0\0\0\0\0"
-  "\0\0\0\231\372\27\0\231\372\357\0\231\3724\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\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\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\231\372\220\0\231\372\246\0"
-  "\0\0\0\0\231\372\225\0\231\372\311\0\231\372V\0\231\372M\0\231\372M\0\231"
-  "\372s\0\231\372\363\0\231\372/\0\231\372$\0\231\372\357\0\231\372#\0\0\0"
-  "\0\0\0\0\0\0\231\372\32\0\231\372\363\0\231\372*\0\0\0\0\0\0\0\0\0\231\372"
-  "\20\0\231\372\366\0\231\3721\0\231\372\177\0\231\372\272\0\231\372\1\0\0"
-  "\0\0\0\0\0\0\0\231\372a\0\231\372\326\0\231\372\3\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\231\372m\0\231\372\323\0\231\372\4\0\231\372\242"
-  "\0\231\372\227\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\1\25\0\0\3\3\210\337"
-  "T\0\226\365\340$\24\40\24C\4\7\33/\3\5\12\0\230\3715\0\231\372\354\0\231"
-  "\372\25\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372k\0\231\372\310\0\231\372"
-  "\1\0\0\0\0\0\0\0\0\0\231\372\40\0\231\372\361\0\231\372\214\0\231\372_\0"
-  "\231\372_\0\231\372_\0\231\372_\0\231\372`\0\231\372\233\0\231\372\347\0"
-  "\231\372\14\0\231\372K\0\231\372\343\0\231\372\11\0\231\372\251\0\231\372"
-  "\217\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372{\0\231\372\272\0\231\372\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\231\372\200\0\231\372\265\0\0"
-  "\0\0\0\231\372\315\0\231\372i\0\231\372/\0\231\372\361\0\231\372\25\0\0\0"
-  "\0\0\0\0\0\0\231\372\10\0\231\372\317\0\231\372\247\0\231\372W\0\231\372"
-  "M\0\231\372M\0\231\372M\0\231\372L\0\231\3727\0\231\372\13\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\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\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\231\372\212\0\231\372\256\0\0\0\0\0\231\372\26\0\231\372\252\0\231\372"
-  "\317\0\231\372\325\0\231\372\325\0\231\372\310\0\231\372m\0\231\372\1\0\231"
-  "\372(\0\231\372\357\0\231\372\40\0\0\0\0\0\0\0\0\0\231\372\32\0\231\372\362"
-  "\0\231\372(\0\0\0\0\0\0\0\0\0\231\372\21\0\231\372\366\0\231\3721\0\231\372"
-  "~\0\231\372\270\0\231\372\1\0\0\0\0\0\0\0\0\0\231\372e\0\231\372\324\0\231"
-  "\372\3\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\231\372m\0\231\372"
-  "\323\0\231\372\4\0\231\372\242\0\231\372\232$\0\0\10""0\0\0\14O\0\0\35Z\0"
-  "\0,`\0\0Ea\0\0m;Bl\263\11\216\347\362y\4\7\327\216\0\0\351i\0\0q\1\225\364"
-  "@\0\231\372\346\0\231\372\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372k\0"
-  "\231\372\310\0\231\372\2\0\0\0\0\0\0\0\0\0\231\372\1\0\231\372P\0\231\372"
-  "\265\0\231\372\306\0\231\372\306\0\231\372\306\0\231\372\306\0\231\372\306"
-  "\0\231\372\272\0\231\372B\0\0\0\0\0\231\372L\0\231\372\343\0\231\372\11\0"
-  "\231\372\240\0\231\372\231\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\200\0\231\372"
-  "\266\0\231\372\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\231\372"
-  "\200\0\231\372\265\0\0\0\0\0\231\372\315\0\231\372i\0\231\372.\0\231\372"
-  "\357\0\231\372\25\0\0\0\0\0\0\0\0\0\231\372\0\0\231\372:\0\231\372\265\0"
-  "\231\372\325\0\231\372\325\0\231\372\325\0\231\372\325\0\231\372\325\0\231"
-  "\372\343\0\231\372\320\0\231\372\16\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\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\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\231\372k\0\231\372\314\0\231"
-  "\372\6\0\0\0\0\0\0\0\0\0\231\372\1\0\231\372\2\0\231\372\2\0\231\372\1\0"
-  "\0\0\0\0\0\0\0\0\231\372K\0\231\372\352\0\231\372\16\0\0\0\0\0\0\0\0\0\231"
-  "\372\20\0\231\372\357\0\231\372C\0\0\0\0\0\0\0\0\0\231\372/\0\231\372\363"
-  "\0\231\372%\0\231\372h\0\231\372\332\0\231\372\11\0\0\0\0\0\231\372\0\0\231"
-  "\372\231\0\231\372\266\0\231\372\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\231\372j\1\224\362\330?\15\26&\13\205\332\272$j\256\316|\0\0"
-  "\261\204\0\0\310\211\0\0\345\177\0\0\314}\0\0\303o\0\0\2332Gu\204\1\226\365"
-  "\3560;`AR\2\3(:\0\0\14\0\231\372k\0\231\372\320\0\231\372\5\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\231\372Q\0\231\372\340\0\231\372\17\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\231\372\0\0\231\372m\0\231\372\314\0\231\372\2\0\231\372\204\0"
-  "\231\372\274\0\231\372\3\0\0\0\0\0\231\372\1\0\231\372\250\0\231\372\234"
-  "\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\231\372x\0\231"
-  "\372\276\0\231\372\1\0\231\372\316\0\231\372i\0\231\372\31\0\231\372\362"
-  "\0\231\3723\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\0\0\231\372\2\0\231"
-  "\372\2\0\231\372\2\0\231\372\2\0\231\372\2\0\231\372\22\0\231\372\345\0\231"
-  "\372T\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\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\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\231\372\36\0\231\372\344\0\231\372\307\0\231\372\234\0\231"
-  "\372\213\0\231\372\204\0\231\372\204\0\231\372\204\0\231\372\204\0\231\372"
-  "\215\0\231\372\233\0\231\372\340\0\231\372\231\0\231\372\0\0\0\0\0\0\0\0"
-  "\0\0\231\372\0\0\231\372\231\0\231\372\341\0\231\372\241\0\231\372\234\0"
-  "\231\372\333\0\231\372\256\0\231\372\3\0\231\372\40\0\231\372\347\0\231\372"
-  "\307\0\231\372\225\0\231\372\254\0\231\372\362\0\231\372U\0\0\0\0\23\0\0"
-  "\1\24\0\0\3#\0\0\11A\0\0\32Z\0\0:g\0\0\\M1P\250\4\224\362\370CKz\354\17\211"
-  "\340\376[Cn\377\243\0\0\377\243\0\0\377{\0\0\3119\0\0#(\0\0\10)\0\0\3\3\211"
-  "\341\11\0\231\372\307\0\231\372\323\0\231\372\224\0\231\372\244\0\231\372"
-  "\346\0\231\372y\0\231\372\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\231\372\20"
-  "\0\231\372\331\0\231\372\322\0\231\372\242\0\231\372\217\0\231\372\204\0"
-  "\231\372\204\0\231\372\204\0\231\372\204\0\231\372\204\0\231\372\204\0\231"
-  "\372\204\0\231\372\204\0\231\372\212\0\231\372\230\0\231\372\267\0\231\372"
-  "\354\0\231\372u\0\0\0\0\0\231\372,\0\231\372\346\0\231\372\275\0\231\372"
-  "\221\0\231\372\265\0\231\372\354\0\231\372;\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\231\372M\0\231\372\347\0\231\372n\0\231\372"
-  "\357\0\231\372O\0\231\372\3\0\231\372\254\0\231\372\335\0\231\372\241\0\231"
-  "\372\207\0\231\372\204\0\231\372\204\0\231\372\204\0\231\372\204\0\231\372"
-  "\204\0\231\372\204\0\231\372\204\0\231\372\206\0\231\372\244\0\231\372\355"
-  "\0\231\372*\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\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\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\231\372\0\0\231\372%\0\231\372v\0\231\372\217\0\231"
-  "\372\230\0\231\372\241\0\231\372\241\0\231\372\241\0\231\372\241\0\231\372"
-  "\224\0\231\372\212\0\231\372\\\0\231\372\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\224\362\12\0\226\365^\0\231\371\216\0\231\372\220\0\231\372j\0\231\372"
-  "\15\0\0\0\0\0\0\0\0\0\231\372)\0\222\357\201\0\214\345\230\2\212\341\225"
-  "\5\202\325T:\13\22\40Z\0\0;q\0\0rx\0\0\227\177\0\0\270\207\0\0\343\230\0"
-  "\0\375\240\0\0\377\236\3\4\377MM\177\377\36z\307\377=[\224\377\210\13\21"
-  "\377\222\0\0\377\227\0\0\377\214\0\0\365c\0\0~\36\0\0\11\0\0\0\0\0\0\0\0"
-  "\0\231\372\24\0\231\372t\0\231\372\221\0\231\372\214\0\231\372[\0\231\372"
-  "\6\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\215\347\32\0\215\346"
-  "j\0\216\350\215\0\227\367\222\0\231\372\241\0\231\372\241\0\231\372\241\0"
-  "\231\372\241\0\231\372\241\0\231\372\241\0\231\372\241\0\231\372\241\0\231"
-  "\372\226\0\231\372\217\0\231\372\177\0\231\372G\0\231\372\3\0\0\0\0\0\231"
-  "\372\0\0\231\372+\0\231\372\200\0\231\372\221\0\231\372\205\0\231\372/\0"
-  "\231\372\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\2\0\0\0\0\231"
-  "\372\7\0\231\372\207\0\227\366\307\0\231\371\214\0\231\372\11\0\0\0\0\0\231"
-  "\372\16\0\231\372c\0\231\372\215\0\231\372\235\0\231\372\241\0\231\372\241"
-  "\0\231\372\241\0\231\372\241\0\231\372\241\0\231\372\241\0\231\372\241\0"
-  "\231\372\236\0\231\372\215\0\231\372I\0\231\372\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\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\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\0\0\0\0\0\0\0\0\0\3\0\0\0\13\0\0\0\17\0\0\0\32\0\0"
-  "\0\23\0\0\0\23\0\0\3\24\0\0\3\31\0\0\4""3\0\0\23>\0\0!d\0\0Vz\0\0\217\177"
-  "\0\0\261\202\0\0\305\213\0\0\342\221\0\0\370\241\0\0\377\241\0\0\377\240"
-  "\0\0\377\233\0\0\377\230\0\0\377\226\0\0\377\222\0\0\377\222\0\0\377\221"
-  "\2\3\377\222\0\0\377\223\0\0\377\234\0\0\377\251\0\0\377\224\0\0\336T\0\0"
-  """1\22\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\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\0\0\0\0\0\25\0\0\0$\0\0\3]\0\0"
-  "?`\0\0G\32\0\0\2\0\0\0\0\0\7\13\0\0\21\33\2\0\5\10\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\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\7\0\0\0\26\0\0\0\24\0\0\0\34\0\0\0\37\0\0\0\37\0\0\0\34\0\0"
-  "\0\17\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\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\21\0\0"
-  "\1""3\0\0\7""8\0\0\13.\0\0\11/\0\0\11.\0\0\11""7\0\0\16K\0\0)S\0\0""6e\0"
-  "\0`k\0\0pw\0\0\230\203\0\0\256\204\0\0\265\213\0\0\342\222\0\0\363\231\0"
-  "\0\376\242\0\0\377\236\0\0\377\235\0\0\377\234\0\0\377\230\0\0\377\226\0"
-  "\0\377\224\0\0\377\222\0\0\377\223\0\0\377\223\0\0\377\223\0\0\377\223\0"
-  "\0\377\223\0\0\377\224\0\0\377\232\0\0\377\233\0\0\374\203\0\0\323w\0\0\232"
-  "W\0\0""1\5\0\0\0\0\0\0\0\3\0\0\0\3\0\0\0\3\0\0\0!\0\0\3""8\0\0\14%\0\0\5"
-  "\12\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\0\0\0\2\0\0\0\32\0\0\0U\0\0(\177"
-  "\0\0\241\232\0\0\367\216\0\0\3245\0\0\13\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\7\0\0\0(\0\0\4.\0\0\10\25\0\0\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\3\0\0\0"
-  "\13\0\0\1\16\0\0\1\17\0\0\1\32\0\0\2""5\0\0\11]\0\0JZ\0\0Fg\0\0ek\0\0pk\0"
-  "\0pe\0\0aN\0\0+6\0\0\13\32\0\0\2\3\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\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\15{\0\0\247\223\0\0\324\213\0\0\307\214\0\0\310\213\0\0\310\214\0\0"
-  "\317\223\0\0\356\230\0\0\367\234\0\0\377\231\0\0\377\233\0\0\377\240\0\0"
-  "\377\240\0\0\377\236\0\0\377\232\0\0\377\227\0\0\377\225\0\0\377\223\0\0"
-  "\377\223\0\0\377\223\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0"
-  "\377\224\0\0\377\223\0\0\377\226\0\0\377\234\0\0\377\237\0\0\377\234\0\0"
-  "\374\227\0\0\354u\0\0\202<\0\0\22\30\0\0\5\5\0\0\0\7\0\0\1\15\0\0\0""4\0"
-  "\0\21@\0\0\35=\0\0\26o\0\0v\224\0\0\321q\0\0q\26\0\0\2\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\5\0\0\0\20\0\0\2\36\0\0\5*\0\0\7$\0\0\5\16\0\0\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\24\0\0\0_\0\0.\217\0\0\330\243\0\0\377\234\0\0\377"
-  "\226\0\0\363V\0\0""9\15\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\6y\0\0\210\213\0\0\303W\0\0""3\34\0\0\4\22\0\0\3\15\0\0"
-  "\2\10\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\11\0\0\0\27\0\0\3'\0\0\7>\0\0\24S\0\0;[\0\0I\\"
-  "\0\0Nn\0\0y\200\0\0\262\230\0\0\371\231\0\0\372\235\0\0\377\236\0\0\377\236"
-  "\0\0\377\234\0\0\376\223\0\0\354\213\0\0\310l\0\0c6\0\0\13\11\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\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\7\0\0\1\31\0\0\10^\0\0\\\222\0\0\365\241\0\0\377\236\0\0\377\236"
-  "\0\0\377\234\0\0\377\227\0\0\377\227\0\0\377\226\0\0\377\225\0\0\377\224"
-  "\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377\224"
-  "\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223"
-  "\0\0\377\223\0\0\377\223\0\0\377\227\0\0\377\232\0\0\376\215\0\0\331}\0\0"
-  "\247_\0\0PJ\0\0\36&\0\0\5\0\0\0\0\0\0\0\0""9\0\0\17X\0\0C2\0\0\22{\0\0\227"
-  "\223\0\0\351\222\0\0\345\231\0\0\374\247\0\0\377{\0\0\226\31\0\0\2\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\12\0\0\0\37\0\0\5O\0\0'i\0\0j{\0\0\243\210\0\0\316\200\0\0\262"
-  "^\0\0E\"\0\0\6\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""9\0\0\17\206\0\0\303\241\0\0\377"
-  "\224\0\0\377\224\0\0\377\231\0\0\377t\0\0\2205\0\0\10\2\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\0\0\6;\0\0\16\31\0\0\5\27\0\0\4\15\0\0\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\11\204\0\0\277\244\0\0\377\212"
-  "\0\0\346~\0\0\253k\0\0sf\0\0_7\0\0\13\3\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\7\0\0\0\21\0\0\2L\0\0\37p\0\0\200\204"
-  "\0\0\277\222\0\0\344\230\0\0\367\235\0\0\375\235\0\0\375\240\0\0\377\235"
-  "\0\0\377\227\0\0\377\227\0\0\377\226\0\0\377\226\0\0\377\226\0\0\377\226"
-  "\0\0\377\227\0\0\377\236\0\0\377\235\0\0\373\201\0\0\262P\0\0&\30\0\0\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\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\12p\0\0vw\0\0\233\212\0\0\360\230\0\0\377\223\0\0\377\224\0\0"
-  "\377\223\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\224\0\0"
-  "\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0"
-  "\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\224\0\0"
-  "\377\231\0\0\377\234\0\0\377\240\0\0\377\201\0\0\253C\0\0\24\40\0\0\4\17"
-  "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0l\0\0T\234\0\0\367u\0\0\251\214\0\0"
-  "\346\236\0\0\377\233\0\0\377\226\0\0\377\237\0\0\377{\0\0\2535\0\0\14\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\10]\0\0Au\0\0\224\222\0\0\352\241\0\0\377\241\0\0\377\234\0\0\377"
-  "\240\0\0\377\231\0\0\362b\0\0J\14\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?\232\0\0\375"
-  "\227\0\0\377\223\0\0\377\223\0\0\377\226\0\0\377\230\0\0\371d\0\0V\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0$\0\0\7u\0\0\203\212\0\0\323o\0\0\213q"
-  "\0\0\213g\0\0W'\0\0\6\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\0A\0\0\24\212\0\0\332"
-  "\233\0\0\377\226\0\0\377\237\0\0\377\241\0\0\377\243\0\0\374_\0\0I\7\0\0"
-  "\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\33\0\0\5E\0\0\35^\0\0"
-  "El\0\0u\215\0\0\331\241\0\0\377\234\0\0\377\232\0\0\377\225\0\0\377\225\0"
-  "\0\377\225\0\0\377\225\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377\224\0"
-  "\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\226\0"
-  "\0\377\237\0\0\377\220\0\0\333`\0\0A\30\0\0\3\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\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\12~\0\0\235\234\0\0\364"
-  "\231\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377"
-  "\224\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377\223\0\0\377\222\0\0\377"
-  "\222\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377"
-  "\224\0\0\377\224\0\0\377\224\0\0\377\234\0\0\377\231\0\0\373\211\0\0\327"
-  "}\0\0\222J\0\0\26\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\33\0\0"
-  "\5w\0\0\236\242\0\0\377\230\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377\223"
-  "\0\0\377\226\0\0\377\235\0\0\375n\0\0q\14\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\22\0\0\1P\0\0$|\0\0\240\233\0\0\370\241\0"
-  "\0\377\232\0\0\377\225\0\0\377\223\0\0\377\223\0\0\377\225\0\0\377\237\0"
-  "\0\377\201\0\0\304?\0\0\27\20\0\0\4\10\0\0\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\30\0\0\4v\0\0\224\241\0\0\377\222\0"
-  "\0\377\224\0\0\377\223\0\0\377\232\0\0\377\227\0\0\365V\0\0""8\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\25\0\0\3i\0\0d\233\0\0\370\237\0\0\377\233\0\0\377"
-  "\244\0\0\377\230\0\0\353G\0\0\33\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\2\0\0\0\22\0\0\0=\0\0\16x\0\0\226"
-  "\231\0\0\373\230\0\0\377\223\0\0\377\223\0\0\377\226\0\0\377\236\0\0\371"
-  "X\0\0""8\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0/\0\0\12X\0\0""5r\0\0\217"
-  "\215\0\0\346\237\0\0\372\241\0\0\376\235\0\0\377\224\0\0\377\223\0\0\377"
-  "\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377"
-  "\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377"
-  "\224\0\0\377\224\0\0\377\223\0\0\377\224\0\0\377\240\0\0\377\230\0\0\360"
-  "`\0\0O\15\0\0\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\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\2"
-  "\0\0\0\2\0\0\0\26\0\0\2v\0\0\213\242\0\0\377\225\0\0\377\222\0\0\377\223"
-  "\0\0\377\222\0\0\377\222\0\0\377\222\0\0\377\223\0\0\377\226\0\0\377\230"
-  "\0\0\377\232\0\0\377\240\0\0\377\241\0\0\377\240\0\0\377\227\0\0\377\222"
-  "\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\222\0\0\377\234\0\0\377\215"
-  "\0\0\347b\0\0U2\0\0\20\24\0\0\2\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\35\0\0\2f\0\0U\225\0\0\366\226\0\0\377\223\0\0\377\224\0\0\377\224"
-  "\0\0\377\224\0\0\377\224\0\0\377\222\0\0\377\242\0\0\377\200\0\0\272\36\0"
-  "\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\0\0\0N\0\0&\216"
-  "\0\0\333\243\0\0\377\226\0\0\377\222\0\0\377\223\0\0\377\223\0\0\377\224"
-  "\0\0\377\224\0\0\377\223\0\0\377\225\0\0\377\226\0\0\376\206\0\0\314U\0\0"
-  "C\16\0\0\3\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\2\0\0"
-  "\0K\0\0#\222\0\0\352\235\0\0\377\222\0\0\377\224\0\0\377\224\0\0\377\236"
-  "\0\0\376y\0\0\225*\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\5\0\0\0I\0\0\34\221\0\0"
-  "\340\237\0\0\377\221\0\0\377\222\0\0\377\233\0\0\377\211\0\0\341<\0\0\26"
-  "\3\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\0R\0\0\33\201\0\0\254\240\0\0\376\230\0\0\377\223\0\0\377"
-  "\224\0\0\377\223\0\0\377\233\0\0\377\223\0\0\351F\0\0\27\0\0\0\0\0\0\0\0"
-  "\17\0\0\0@\0\0\22k\0\0]\202\0\0\272\227\0\0\372\237\0\0\377\232\0\0\377\226"
-  "\0\0\377\222\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\224"
-  "\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224"
-  "\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224"
-  "\0\0\377\224\0\0\377\224\0\0\377\221\0\0\377\237\0\0\377\217\0\0\333E\0\0"
-  "\32\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\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\27{\0\0\310\234\0\0\377\233\0\0\377\231\0\0\377\234\0\0\377\242\0"
-  "\0\377\243\0\0\377\241\0\0\377\237\0\0\377\237\0\0\377\230\0\0\377\224\0"
-  "\0\371\205\0\0\323\201\0\0\303z\0\0\252\207\0\0\341\232\0\0\377\224\0\0\377"
-  "\224\0\0\377\223\0\0\377\225\0\0\377\244\0\0\377v\0\0\226\22\0\0\3\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\10\0\0\0R\0\0+\224\0\0"
-  "\346\237\0\0\377\222\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0"
-  "\377\224\0\0\377\223\0\0\377\240\0\0\377w\0\0\237\25\0\0\5\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0:\0\0\16\177\0\0\255\241\0\0\377\223\0"
-  "\0\377\223\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223\0"
-  "\0\377\224\0\0\377\230\0\0\377\237\0\0\377\267\0\0\377t\0\0y\10\0\0\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\7z\0\0\236\236"
-  "\0\0\376\225\0\0\377\223\0\0\377\223\0\0\377\231\0\0\377\230\0\0\361Q\0\0"
-  ",\13\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\0\0\2m\0\0q\241\0\0\376\225\0\0\377"
-  "\223\0\0\377\223\0\0\377\226\0\0\377\223\0\0\371{\0\0\222)\0\0\10\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\0C\0\0\24"
-  "\205\0\0\301\246\0\0\377\230\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377"
-  "\223\0\0\377\233\0\0\377\203\0\0\3103\0\0\13\0\0\0\0\15\0\0\1^\0\0=\211\0"
-  "\0\313\237\0\0\375\241\0\0\377\231\0\0\377\223\0\0\377\223\0\0\377\223\0"
-  "\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0"
-  "\0\377\224\0\0\377\223\0\0\377\223\0\0\377\222\0\0\377\222\0\0\377\222\0"
-  "\0\377\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0"
-  "\0\377\224\0\0\377\224\0\0\377\223\0\0\377\224\0\0\377\244\0\0\376j\0\0g"
-  "\21\0\0\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\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\2\0\0\0"
-  ".\0\0\11R\0\0:\211\0\0\323\230\0\0\363\220\0\0\357\202\0\0\317x\0\0\247x"
-  "\0\0\243o\0\0\206h\0\0oc\0\0bR\0\0""4L\0\0)-\0\0\17\"\0\0\12\33\0\0\4v\0"
-  "\0\211\237\0\0\377\225\0\0\377\223\0\0\377\223\0\0\377\230\0\0\377\233\0"
-  "\0\376c\0\0Y\11\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\6~\0\0\252\237\0\0\377\224\0\0\377\223\0\0\377\224\0\0\377\224"
-  "\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\237\0\0\377p\0\0"
-  "\203\7\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\0\0\0?\0\0\16|\0\0\235\234"
-  "\0\0\375\226\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223"
-  "\0\0\377\224\0\0\377\233\0\0\377\237\0\0\374\234\0\0\371\213\0\0\341{\0\0"
-  "\241C\0\0\"\3\0\0\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\14\0"
-  "\0\1_\0\0;\235\0\0\367\226\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\240"
-  "\0\0\376x\0\0\220%\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0\17\0\0\0G\0\0\32\214\0\0"
-  "\330\236\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\235\0\0"
-  "\377\221\0\0\3223\0\0\12\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\20\0\0\0P\0\0\40\200\0\0\272\235\0\0\377\227\0\0\377\223\0\0\377"
-  "\223\0\0\377\224\0\0\377\224\0\0\377\222\0\0\377\241\0\0\377r\0\0\214\31"
-  "\0\0\5\0\0\0\0""1\0\0\15\205\0\0\311\250\0\0\377\227\0\0\377\223\0\0\377"
-  "\223\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377"
-  "\224\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377\227\0\0\377"
-  "\233\0\0\377\241\0\0\377\242\0\0\377\241\0\0\377\231\0\0\377\223\0\0\377"
-  "\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377"
-  "\224\0\0\377\222\0\0\377\235\0\0\377\204\0\0\3105\0\0\14\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\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\2\0\0\0\2\0\0\0\12\0\0\1J\0\0\36"
-  "Q\0\0'I\0\0%4\0\0\20\34\0\0\7\32\0\0\7\20\0\0\3\7\0\0\2\6\0\0\1\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0&\0\0\11\201\0\0\271\234\0\0\377\224\0\0\377\223\0"
-  "\0\377\223\0\0\377\232\0\0\377\210\0\0\345E\0\0\40\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\10\0\0\0H\0\0\37\227\0\0\360\233\0\0\377"
-  "\223\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377"
-  "\224\0\0\377\223\0\0\377\237\0\0\377p\0\0{\5\0\0\1\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0""2\0\0\12\177\0\0\235\240\0\0\377\227\0\0\377\223\0\0\377\224"
-  "\0\0\377\224\0\0\377\223\0\0\377\224\0\0\377\232\0\0\377\237\0\0\374\200"
-  "\0\0\270d\0\0_Z\0\0?@\0\0\32\34\0\0\6\6\0\0\1\2\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0%\0\0\5\200\0\0\257\236\0\0\377\223\0\0\377\224"
-  "\0\0\377\223\0\0\377\232\0\0\377\215\0\0\327H\0\0\26\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0""2\0\0\7|\0\0\236\233\0\0\377\225\0\0\377\223\0\0\377\224\0"
-  "\0\377\224\0\0\377\224\0\0\377\237\0\0\375q\0\0z\31\0\0\3\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\21\203\0\0\300\243\0\0\377"
-  "\234\0\0\377\232\0\0\377\224\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377"
-  "\223\0\0\377\237\0\0\375e\0\0a\12\0\0\2C\0\0\24q\0\0\204\231\0\0\375\231"
-  "\0\0\377\222\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224"
-  "\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\225"
-  "\0\0\377\236\0\0\377\240\0\0\375\205\0\0\313r\0\0\213q\0\0\211|\0\0\254\220"
-  "\0\0\345\237\0\0\375\233\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\224"
-  "\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\232\0\0\377\216\0\0\346C\0\0"
-  "\25\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\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\37\216\0\0\347\234\0\0\377"
-  "\223\0\0\377\224\0\0\377\223\0\0\377\237\0\0\377\204\0\0\313/\0\0\17\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\32\0\0\2o\0\0y\240\0"
-  "\0\377\224\0\0\377\230\0\0\377\234\0\0\377\231\0\0\377\225\0\0\377\223\0"
-  "\0\377\224\0\0\377\223\0\0\377\227\0\0\377\230\0\0\377`\0\0S\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\33\0\0\1h\0\0S\235\0\0\372\233\0\0\377\223\0\0\377\223"
-  "\0\0\377\223\0\0\377\223\0\0\377\232\0\0\377\233\0\0\376\214\0\0\324o\0\0"
-  "k9\0\0\14\13\0\0\1\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\2\0\0\0>\0\0\23\223\0\0\344\233\0\0\377\223\0"
-  "\0\377\223\0\0\377\230\0\0\377\231\0\0\371c\0\0U\22\0\0\1\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\17\0\0\1b\0\0I\224\0\0\361\227\0\0\377\223\0\0\377\224\0\0\377\224"
-  "\0\0\377\223\0\0\377\234\0\0\377\210\0\0\321E\0\0\31\3\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""8\0\0\13w\0\0\222\235\0\0\376\242\0"
-  "\0\377\207\0\0\325\203\0\0\321\222\0\0\376\224\0\0\377\224\0\0\377\224\0"
-  "\0\377\223\0\0\377\242\0\0\373b\0\0MN\0\0\36\221\0\0\314\240\0\0\375\230"
-  "\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\223"
-  "\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\226"
-  "\0\0\377\230\0\0\377z\0\0\261`\0\0K;\0\0\20\27\0\0\4\26\0\0\4#\0\0\7F\0\0"
-  "\26q\0\0v\221\0\0\344\230\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\224"
-  "\0\0\377\224\0\0\377\223\0\0\377\232\0\0\377\230\0\0\361Q\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\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\5\0\0\0[\0\0E\223\0\0\373\230\0\0\377\223\0\0\377"
-  "\224\0\0\377\224\0\0\377\237\0\0\377z\0\0\232\33\0\0\4\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\16\0\0\0F\0\0\30\207\0\0\316\232\0\0\377\227"
-  "\0\0\377\230\0\0\373}\0\0\250w\0\0\267\230\0\0\377\226\0\0\377\223\0\0\377"
-  "\223\0\0\377\230\0\0\377\230\0\0\377_\0\0E\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0"
-  "\0Z\0\0""1\215\0\0\340\232\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\226"
-  "\0\0\377\235\0\0\377\225\0\0\363v\0\0\211>\0\0\21\22\0\0\2\2\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\27\0\0\1g\0\0]\235\0\0\373\225\0\0\377\223\0\0\377\222\0\0\377"
-  "\233\0\0\377\215\0\0\341A\0\0\26\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\31\0\0\5"
-  "\203\0\0\267\241\0\0\377\224\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377"
-  "\224\0\0\377\241\0\0\374i\0\0Y\24\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\31\0\0\3p\0\0p\244\0\0\375\241\0\0\377\223\0\0\353U\0\0%\\"
-  "\0\0F\227\0\0\373\225\0\0\377\224\0\0\377\223\0\0\377\231\0\0\377\232\0\0"
-  "\365Q\0\0,d\0\0U\250\0\0\375\233\0\0\377\223\0\0\377\223\0\0\377\223\0\0"
-  "\377\224\0\0\377\223\0\0\377\225\0\0\377\225\0\0\377\223\0\0\377\224\0\0"
-  "\377\224\0\0\377\224\0\0\377\223\0\0\377\237\0\0\377\221\0\0\354?\0\0\33"
-  "\13\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\25\0\0\2X\0\0/\211\0\0"
-  "\331\231\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\223\0\0"
-  "\377\232\0\0\377\233\0\0\365T\0\0""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\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\26\0"
-  "\0\1o\0\0}\234\0\0\377\225\0\0\377\223\0\0\377\223\0\0\377\226\0\0\377\240"
-  "\0\0\377q\0\0q\16\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\12|\0\0\245\232\0\0\376\224\0\0\377\237\0\0\377\201\0\0\2607\0\0\11"
-  "a\0\0Q\234\0\0\377\230\0\0\377\223\0\0\377\223\0\0\377\230\0\0\377\231\0"
-  "\0\377`\0\0O\0\0\0\0\0\0\0\0\0\0\0\0,\0\0\13\205\0\0\301\241\0\0\377\222"
-  "\0\0\377\224\0\0\377\223\0\0\377\230\0\0\377\240\0\0\377\212\0\0\323`\0\0"
-  "G(\0\0\4\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\12\0\0\0G\0\0\31\212\0\0\323\232"
-  "\0\0\377\223\0\0\377\223\0\0\377\223\0\0\377\244\0\0\377~\0\0\261&\0\0\11"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\37\0\0\6|\0\0\261\233\0\0\377\224\0\0\377"
-  "\223\0\0\377\224\0\0\377\223\0\0\377\234\0\0\377\206\0\0\313?\0\0\21\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\13\0\0\0X\0\0""1\220\0\0\350"
-  "\237\0\0\377\222\0\0\362`\0\0K\34\0\0\2q\0\0z\236\0\0\377\225\0\0\377\224"
-  "\0\0\377\223\0\0\377\231\0\0\377\230\0\0\363N\0\0\"=\0\0\23m\0\0i\206\0\0"
-  "\330\246\0\0\377\231\0\0\377\223\0\0\377\222\0\0\377\231\0\0\377\240\0\0"
-  "\377\230\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\231\0\0"
-  "\377\243\0\0\376~\0\0\237\33\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\2\0\0\0\30\0\0\0o\0\0q\233\0\0\377\226\0\0\377\223\0\0\377\224"
-  "\0\0\377\224\0\0\377\223\0\0\377\232\0\0\377\214\0\0\333?\0\0\22\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\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\40\0\0\7\200\0\0\264\237\0\0\377\222\0\0\377\224"
-  "\0\0\377\223\0\0\377\232\0\0\377\223\0\0\366W\0\0""7\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\0\0\0j\0\0Z\236\0\0\374\227\0\0\377\233\0"
-  "\0\377\232\0\0\366_\0\0@\0\0\0\0`\0\0T\234\0\0\377\230\0\0\377\223\0\0\377"
-  "\223\0\0\377\231\0\0\377\220\0\0\365V\0\0""1\0\0\0\0\0\0\0\0\25\0\0\1_\0"
-  "\0G\233\0\0\373\226\0\0\377\223\0\0\377\223\0\0\377\230\0\0\377\241\0\0\376"
-  "~\0\0\256@\0\0\24\17\0\0\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\22\0\0"
-  "\1n\0\0w\236\0\0\377\225\0\0\377\223\0\0\377\222\0\0\377\233\0\0\377\233"
-  "\0\0\373Z\0\0A\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\23\0\0\1h\0\0_\230\0\0\373"
-  "\227\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\225\0\0\377\237\0\0\377"
-  "c\0\0W\15\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0""8\0\0\16"
-  "\202\0\0\274\244\0\0\377\234\0\0\376q\0\0\200\36\0\0\3:\0\0\13\210\0\0\306"
-  "\232\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\232\0\0\377\220\0\0\347"
-  "I\0\0\35\0\0\0\0\11\0\0\1]\0\0G\205\0\0\274\217\0\0\351\243\0\0\377\237\0"
-  "\0\377\217\0\0\356w\0\0\225v\0\0\263\232\0\0\377\223\0\0\377\223\0\0\377"
-  "\227\0\0\377\221\0\0\356l\0\0g:\0\0\21\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\24\0\0\1y\0\0\222\237\0\0\377\225\0\0\377"
-  "\223\0\0\377\224\0\0\377\224\0\0\377\222\0\0\377\240\0\0\377x\0\0\241$\0"
-  "\0\7\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\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\0L\0\0\"\214\0\0\346\234\0\0\377\223\0"
-  "\0\377\224\0\0\377\223\0\0\377\235\0\0\377\206\0\0\317,\0\0\16\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0C\0\0\25\213\0\0\325\237\0\0\377\224"
-  "\0\0\377\240\0\0\377{\0\0\227)\0\0\5\0\0\0\0a\0\0R\234\0\0\377\230\0\0\377"
-  "\223\0\0\377\223\0\0\377\235\0\0\377\205\0\0\3247\0\0\24\0\0\0\0\2\0\0\0"
-  "F\0\0\32\210\0\0\317\234\0\0\377\222\0\0\377\223\0\0\377\227\0\0\377\233"
-  "\0\0\374z\0\0\226G\0\0\24\22\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\15\207\0\0\315\234\0\0\377\224\0\0\377\223\0\0\377\225\0"
-  "\0\377\236\0\0\377w\0\0\227!\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0/\0\0\16"
-  "\211\0\0\315\242\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377"
-  "\235\0\0\377\206\0\0\320:\0\0\21\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\22{\0\0\233\233\0\0\374\241\0\0\377\207\0\0\314<\0\0\17\0\0"
-  "\0\0I\0\0&\220\0\0\357\227\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\240"
-  "\0\0\377w\0\0\246\35\0\0\7\0\0\0\0\4\0\0\0\21\0\0\4\40\0\0\5^\0\0E\202\0"
-  "\0\275{\0\0\237]\0\0""9\"\0\0\10s\0\0\223\236\0\0\377\223\0\0\377\223\0\0"
-  "\377\233\0\0\377u\0\0\220\27\0\0\3\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\0C\0\0\33\213\0\0\341\235\0\0\377\224\0"
-  "\0\377\223\0\0\377\224\0\0\377\223\0\0\377\225\0\0\377\235\0\0\373`\0\0J"
-  "\12\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\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\0k\0\0\\\242\0\0\377\226\0\0\377\223"
-  "\0\0\377\224\0\0\377\224\0\0\377\240\0\0\377~\0\0\241\30\0\0\3\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\31\0\0\2p\0\0w\240\0\0\377\227\0\0\377\232"
-  "\0\0\377\224\0\0\342N\0\0\35\15\0\0\0\0\0\0\0a\0\0R\234\0\0\377\230\0\0\377"
-  "\223\0\0\377\223\0\0\377\237\0\0\377\206\0\0\3201\0\0\21\0\0\0\0\21\0\0\2"
-  "j\0\0i\242\0\0\377\225\0\0\377\223\0\0\377\223\0\0\377\235\0\0\376}\0\0\252"
-  "2\0\0\13\10\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\7\0\0\0"
-  "V\0\0A\225\0\0\374\230\0\0\377\223\0\0\377\223\0\0\377\236\0\0\377\212\0"
-  "\0\324F\0\0\30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""3\0\0\23\205\0\0"
-  "\325\234\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\226\0\0\377\232\0\0"
-  "\374i\0\0X\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40\0\0\2q\0\0"
-  "|\243\0\0\377\241\0\0\377\221\0\0\344[\0\0/-\0\0\6C\0\0\26\\\0\0Z\222\0\0"
-  "\370\226\0\0\377\223\0\0\377\224\0\0\377\222\0\0\377\243\0\0\377y\0\0\246"
-  "\32\0\0\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\0\0\1\"\0\0\12\34\0\0\6\17\0"
-  "\0\0P\0\0%\225\0\0\356\231\0\0\377\222\0\0\377\230\0\0\377\231\0\0\364U\0"
-  "\0""0\10\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\6w\0\0\221\233\0\0\377\224\0\0\377\223\0\0\377\224\0\0\377\223"
-  "\0\0\377\225\0\0\377\245\0\0\377\203\0\0\3001\0\0\16\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\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\22\0\0\3w\0\0\222\244\0\0\377\223\0\0\377\223\0\0\377\224\0"
-  "\0\377\226\0\0\377\235\0\0\377q\0\0t\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0S\0\0%\212\0\0\337\233\0\0\377\224\0\0\377\237\0\0\377q\0\0u"
-  "\35\0\0\2\0\0\0\0\0\0\0\0`\0\0R\234\0\0\377\230\0\0\377\223\0\0\377\223\0"
-  "\0\377\237\0\0\377\206\0\0\3212\0\0\21\0\0\0\0""1\0\0\15\205\0\0\311\235"
-  "\0\0\377\223\0\0\377\222\0\0\377\236\0\0\377\213\0\0\326K\0\0\35\6\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\22\0\0\1""9\0\0\22)\0\0\5\5\0\0\0\6\0\0\1\2\0\0\0\34\0\0\4w\0\0"
-  "\227\237\0\0\377\225\0\0\377\223\0\0\377\226\0\0\377\233\0\0\376p\0\0i\20"
-  "\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\0\0\1c\0\0P\224\0\0\367\230\0\0"
-  "\377\223\0\0\377\224\0\0\377\223\0\0\377\236\0\0\377\212\0\0\330B\0\0\27"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\31\0\0\2h\0\0V\223\0\0\362\233\0"
-  "\0\377\230\0\0\373k\0\0b@\0\0\22~\0\0\237\220\0\0\343\214\0\0\363\223\0\0"
-  "\377\224\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\237\0\0\377p\0\0\211"
-  "\24\0\0\4\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\24\0\0"
-  "\2e\0\0[\236\0\0\373\224\0\0\377\222\0\0\377\241\0\0\377\210\0\0\3137\0\0"
-  "\15\0\0\0\0\0\0\0\0\4\0\0\0\6\0\0\1\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\33\0"
-  "\0\4o\0\0q\231\0\0\371\231\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\225"
-  "\0\0\377\237\0\0\377\216\0\0\337X\0\0""0\4\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\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\15\204\0\0\321\240\0\0\377\222\0\0\377\224\0\0\377\223\0\0"
-  "\377\232\0\0\377\222\0\0\361K\0\0'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0;\0\0\20\206\0\0\301\237\0\0\377\222\0\0\377\233\0\0\377\224\0\0\342E\0"
-  "\0\30\3\0\0\0\0\0\0\0\22\0\0\1c\0\0^\227\0\0\377\227\0\0\377\223\0\0\377"
-  "\223\0\0\377\237\0\0\377\206\0\0\3212\0\0\21\10\0\0\0Q\0\0""1\234\0\0\371"
-  "\225\0\0\377\223\0\0\377\230\0\0\377\236\0\0\375g\0\0\\\20\0\0\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\4Y\0\0""6\213\0\0\320l\0\0gS\0\0""6.\0\0\23\14\0\0\0=\0\0\31\213\0"
-  "\0\336\236\0\0\377\223\0\0\377\223\0\0\377\235\0\0\377\215\0\0\326:\0\0\21"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0!\0\0\10\177\0\0\262\241\0\0\377"
-  "\223\0\0\377\223\0\0\377\223\0\0\377\226\0\0\377\234\0\0\377p\0\0z\27\0\0"
-  "\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\10\0\0\0Y\0\0.\222\0\0\347\235\0\0\377"
-  "\231\0\0\377\217\0\0\356]\0\0g~\0\0\266\237\0\0\376\233\0\0\377\225\0\0\377"
-  "\223\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\227\0\0\377\240\0\0\377"
-  "a\0\0Q\3\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\0D\0"
-  "\0\27\213\0\0\325\232\0\0\377\223\0\0\377\224\0\0\377\232\0\0\366p\0\0u\30"
-  "\0\0\4\0\0\0\0\0\0\0\0""9\0\0\20d\0\0KD\0\0\20\0\0\0\0\0\0\0\0\11\0\0\0Z"
-  "\0\0:\230\0\0\363\236\0\0\377\223\0\0\377\223\0\0\377\223\0\0\377\224\0\0"
-  "\377\235\0\0\377\223\0\0\353^\0\0=\33\0\0\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\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\0J\0\0%\223\0\0\364\232\0\0\377\223\0\0\377\224\0\0\377\224\0\0"
-  "\377\240\0\0\377\213\0\0\311-\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0Y\0\0;\237\0\0\374\231\0\0\377\223\0\0\377\242\0\0\377p\0\0x\31\0\0\2"
-  "\16\0\0\1D\0\0\26c\0\0N\206\0\0\325\235\0\0\377\224\0\0\377\223\0\0\377\223"
-  "\0\0\377\236\0\0\377\205\0\0\3201\0\0\21\21\0\0\2b\0\0]\237\0\0\376\224\0"
-  "\0\377\223\0\0\377\241\0\0\377\204\0\0\3023\0\0\15\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\11\0\0\0\36\0\0\7D\0\0\27l\0\0"
-  "k\225\0\0\360\240\0\0\377\230\0\0\371\233\0\0\367]\0\0O\23\0\0\1X\0\0""7"
-  "\226\0\0\370\233\0\0\377\222\0\0\377\225\0\0\377\241\0\0\377~\0\0\233\22"
-  "\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""7\0\0\24\206\0\0\325\237"
-  "\0\0\377\222\0\0\377\224\0\0\377\223\0\0\377\234\0\0\377\222\0\0\354P\0\0"
-  ")\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0.\0\0\10}\0\0\245\242\0\0\377\225"
-  "\0\0\377\223\0\0\377\224\0\0\377\230\0\0\376\231\0\0\377\223\0\0\377\224"
-  "\0\0\377\226\0\0\377\225\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\227"
-  "\0\0\377\240\0\0\377_\0\0O\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\14\0\0\1`\0\0N\240\0\0\375\224\0\0\377\223\0\0\377\240\0\0\377"
-  "p\0\0\204&\0\0\6\2\0\0\0\0\0\0\0\0\0\0\0Z\0\0""7\246\0\0\370\210\0\0\236"
-  "7\0\0\20'\0\0\12A\0\0\32\204\0\0\307\241\0\0\377\223\0\0\377\223\0\0\377"
-  "\223\0\0\377\227\0\0\377\242\0\0\377\216\0\0\342a\0\0D\35\0\0\2\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\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\0a\0\0N\241\0\0\375\226\0\0\377\223"
-  "\0\0\377\224\0\0\377\224\0\0\377\240\0\0\377\177\0\0\243!\0\0\3\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\24\0\0\3e\0\0_\236\0\0\375\225\0\0\377\233\0\0\377"
-  "\216\0\0\340N\0\0'0\0\0\20[\0\0B\215\0\0\332\236\0\0\373\232\0\0\377\225"
-  "\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\234\0\0\377}\0\0\272&\0\0\13"
-  "\37\0\0\4s\0\0\214\237\0\0\377\224\0\0\377\231\0\0\377\235\0\0\375g\0\0P"
-  "\6\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\2\0\0\0,\0\0\12"
-  "a\0\0Kx\0\0\244\215\0\0\340\235\0\0\374\227\0\0\377\223\0\0\377\233\0\0\377"
-  "\233\0\0\371Y\0\0A\32\0\0\2n\0\0t\233\0\0\376\226\0\0\377\223\0\0\377\233"
-  "\0\0\377\231\0\0\366]\0\0:\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0[\0\0C\232\0\0\375\230\0\0\377\223\0\0\377\224\0\0\377\225\0\0\377\241"
-  "\0\0\377}\0\0\233\32\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\7\0\0\1f\0\0Z"
-  "\234\0\0\374\227\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377"
-  "\223\0\0\377\227\0\0\377\240\0\0\377\240\0\0\377\235\0\0\377\223\0\0\377"
-  "\223\0\0\377\223\0\0\377\227\0\0\377\241\0\0\377b\0\0Q\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\36\0\0\4v\0\0\230\240\0\0\377\223"
-  "\0\0\377\230\0\0\377\234\0\0\377]\0\0E\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""4"
-  "\0\0\7x\0\0e\220\0\0\352\204\0\0\320\200\0\0\306\177\0\0\313\232\0\0\376"
-  "\227\0\0\377\222\0\0\377\225\0\0\377\234\0\0\377\235\0\0\377\214\0\0\315"
-  "`\0\0:\33\0\0\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\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\34\0\0\5t"
-  "\0\0\226\241\0\0\377\222\0\0\377\224\0\0\377\223\0\0\377\231\0\0\377\226"
-  "\0\0\364X\0\0:\22\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\4\0\0\0T\0\0""0\222\0\0\352"
-  "\227\0\0\377\225\0\0\377\231\0\0\374]\0\0T_\0\0O\211\0\0\335\226\0\0\372"
-  "\240\0\0\377\232\0\0\377\230\0\0\377\224\0\0\377\223\0\0\377\224\0\0\377"
-  "\223\0\0\377\236\0\0\377z\0\0\242\32\0\0\4-\0\0\11\202\0\0\304\233\0\0\377"
-  "\223\0\0\377\236\0\0\377\206\0\0\322:\0\0\23\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\16i\0\0V|\0\0\265\236\0\0\374\241\0\0\377\232\0"
-  "\0\377\226\0\0\377\223\0\0\377\223\0\0\377\230\0\0\377\222\0\0\341A\0\0\27"
-  "U\0\0/\223\0\0\362\231\0\0\377\223\0\0\377\224\0\0\377\234\0\0\373x\0\0}"
-  "&\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\24\0\0\2j\0\0p\237\0\0\377"
-  "\225\0\0\377\223\0\0\377\223\0\0\377\232\0\0\377\230\0\0\365[\0\0?\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0A\0\0\24\213\0\0\323\237\0\0\377\222\0"
-  "\0\377\224\0\0\377\224\0\0\377\223\0\0\377\230\0\0\377\241\0\0\377\231\0"
-  "\0\372\203\0\0\314s\0\0\200{\0\0\264\227\0\0\377\224\0\0\377\223\0\0\377"
-  "\230\0\0\377\233\0\0\376Z\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\12\0\0\0G\0\0\36\217\0\0\343\231\0\0\377\223\0\0\377\234\0\0\377\201"
-  "\0\0\3166\0\0\21\0\0\0\0\0\0\0\0\0\0\0\0\22\0\0\1.\0\0\15""1\0\0\15s\0\0"
-  "\224\243\0\0\377\242\0\0\377\234\0\0\377\227\0\0\377\222\0\0\377\225\0\0"
-  "\377\240\0\0\377\221\0\0\347s\0\0\1779\0\0\20\12\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\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\0H\0\0\33\216\0\0\343\232\0\0\377\223"
-  "\0\0\377\224\0\0\377\224\0\0\377\234\0\0\377\206\0\0\3000\0\0\11\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\21\0\0\2m\0\0x\240\0\0\377\222\0\0\377\226\0\0\377"
-  "\222\0\0\375n\0\0\224\215\0\0\340\237\0\0\377\237\0\0\377\240\0\0\377\231"
-  "\0\0\375\220\0\0\372\225\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377\236"
-  "\0\0\377z\0\0\244\30\0\0\5+\0\0\11\200\0\0\301\234\0\0\377\223\0\0\377\235"
-  "\0\0\377z\0\0\246\32\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\17\0\0\0=\0\0"
-  "\20w\0\0\232\244\0\0\376\254\0\0\377\245\0\0\377\241\0\0\377\231\0\0\377"
-  "\222\0\0\377\223\0\0\377\223\0\0\377\234\0\0\377\210\0\0\303)\0\0\7i\0\0"
-  "d\245\0\0\377\227\0\0\377\223\0\0\377\231\0\0\377\215\0\0\317:\0\0\15\4\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""5\0\0\20\206\0\0\324\236\0"
-  "\0\377\222\0\0\377\224\0\0\377\224\0\0\377\236\0\0\377\207\0\0\2714\0\0\10"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0(\0\0\5q\0\0~\237\0\0\376\225\0\0\377\223"
-  "\0\0\377\222\0\0\377\222\0\0\377\232\0\0\377\236\0\0\377\213\0\0\327j\0\0"
-  "b5\0\0\21\17\0\0\1^\0\0J\235\0\0\374\225\0\0\377\222\0\0\377\234\0\0\377"
-  "\217\0\0\362E\0\0\36\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\27\0"
-  "\0\1h\0\0f\240\0\0\376\225\0\0\377\222\0\0\377\237\0\0\377w\0\0\223\23\0"
-  "\0\3\0\0\0\0\0\0\0\0\21\0\0\2`\0\0K\212\0\0\314\206\0\0\317\210\0\0\354\230"
-  "\0\0\377\231\0\0\377\227\0\0\377\222\0\0\377\226\0\0\377\225\0\0\375|\0\0"
-  "\257U\0\0,\33\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\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\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\7\0\0\0]\0\0B\235\0\0\371\225\0\0\377\223\0\0\377\224\0\0\377"
-  "\224\0\0\377\237\0\0\377s\0\0\213\34\0\0\3\0\0\0\0\0\0\0\0\2\0\0\0\23\0\0"
-  "\1I\0\0\35\216\0\0\336\233\0\0\377\223\0\0\377\222\0\0\377\227\0\0\377\240"
-  "\0\0\377\246\0\0\377\235\0\0\374\222\0\0\356|\0\0\256\\\0\0?g\0\0z\232\0"
-  "\0\377\227\0\0\377\223\0\0\377\223\0\0\377\236\0\0\377z\0\0\244\30\0\0\5"
-  "+\0\0\11\200\0\0\301\233\0\0\377\225\0\0\377\242\0\0\377z\0\0\233\30\0\0"
-  "\3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0J\0\0\25\212\0\0\277\252\0\0\375\230\0"
-  "\0\356~\0\0\270~\0\0\300v\0\0\234z\0\0\306\227\0\0\377\224\0\0\377\224\0"
-  "\0\377\237\0\0\377|\0\0\240\31\0\0\4n\0\0~\241\0\0\377\224\0\0\377\224\0"
-  "\0\377\233\0\0\373j\0\0h\25\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\7\0\0\0U\0\0.\233\0\0\366\233\0\0\377\223\0\0\377\224\0\0\377\225\0\0\377"
-  "\233\0\0\372c\0\0Q\24\0\0\1\0\0\0\0\0\0\0\0\35\0\0\1M\0\0\33\200\0\0\243"
-  "\224\0\0\371\226\0\0\377\222\0\0\377\227\0\0\377\240\0\0\377\243\0\0\377"
-  "\222\0\0\350g\0\0a@\0\0\26\23\0\0\1\0\0\0\0\22\0\0\1^\0\0Q\234\0\0\374\225"
-  "\0\0\377\222\0\0\377\236\0\0\377\215\0\0\355?\0\0\31\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\5\204\0\0\256\237\0\0\377\224\0\0\377\225"
-  "\0\0\377\234\0\0\377m\0\0o\22\0\0\1'\0\0\11;\0\0\22\"\0\0\13w\0\0\240\252"
-  "\0\0\376\243\0\0\377\230\0\0\377y\0\0\334\214\0\0\346\234\0\0\373\227\0\0"
-  "\377\232\0\0\377\211\0\0\353E\0\0\37\5\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\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\25\0\0\3n\0\0y\240\0\0\377\222"
-  "\0\0\377\224\0\0\377\223\0\0\377\232\0\0\377\226\0\0\362P\0\0/\14\0\0\1\2"
-  "\0\0\0\37\0\0\3A\0\0\22V\0\0:}\0\0\265\235\0\0\377\225\0\0\377\223\0\0\377"
-  "\231\0\0\377\232\0\0\373\220\0\0\335}\0\0\257e\0\0XG\0\0\37%\0\0\11\3\0\0"
-  "\0N\0\0""0\225\0\0\366\231\0\0\377\223\0\0\377\223\0\0\377\236\0\0\377z\0"
-  "\0\244\30\0\0\5+\0\0\11\200\0\0\301\234\0\0\377\224\0\0\377\240\0\0\377z"
-  "\0\0\227\33\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0;\0\0\15{\0\0\256\227\0\0\344w\0"
-  "\0zL\0\0#\"\0\0\11#\0\0\12\24\0\0\7n\0\0\203\236\0\0\377\223\0\0\377\224"
-  "\0\0\377\240\0\0\377i\0\0g\32\0\0\6z\0\0\252\241\0\0\377\222\0\0\377\232"
-  "\0\0\377\213\0\0\327>\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0""7\0\0\10|\0\0\235\241\0\0\376\223\0\0\377\223\0\0\377\223\0\0\377\233"
-  "\0\0\377\223\0\0\335=\0\0\21\0\0\0\0\5\0\0\0+\0\0\5h\0\0R\214\0\0\322\240"
-  "\0\0\377\227\0\0\377\222\0\0\377\230\0\0\377\223\0\0\367\206\0\0\311}\0\0"
-  "\256Z\0\0""5\25\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\21\0\0\1^\0\0P\234\0\0\374"
-  "\225\0\0\377\222\0\0\377\236\0\0\377\216\0\0\357@\0\0\33\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0J\0\0%\217\0\0\346\231\0\0\377\222\0\0\377"
-  "\234\0\0\377\221\0\0\360Q\0\0.\33\0\0\2l\0\0e\220\0\0\327v\0\0\217M\0\0K"
-  "p\0\0\247\230\0\0\364\244\0\0\377\206\0\0\314@\0\0\40p\0\0l\240\0\0\367\232"
-  "\0\0\377\226\0\0\375|\0\0\240O\0\0\34\17\0\0\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\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\6\0\0\0>\0\0\23\211\0\0\326\233\0\0\377\223"
-  "\0\0\377\224\0\0\377\223\0\0\377\234\0\0\377\210\0\0\3300\0\0\16\0\0\0\0"
-  "\0\0\0\0d\0\0F\227\0\0\340\227\0\0\367\232\0\0\377\224\0\0\377\225\0\0\377"
-  "\237\0\0\377\224\0\0\346k\0\0gA\0\0\23&\0\0\10\17\0\0\1\0\0\0\0\0\0\0\0\0"
-  "\0\0\0@\0\0\40\221\0\0\360\232\0\0\377\223\0\0\377\223\0\0\377\236\0\0\377"
-  "z\0\0\244\31\0\0\5+\0\0\11\201\0\0\301\234\0\0\377\223\0\0\377\236\0\0\377"
-  "{\0\0\244\32\0\0\5\0\0\0\0\0\0\0\0\16\0\0\3Q\0\0Ci\0\0}M\0\0\30\27\0\0\3"
-  "\0\0\0\0\0\0\0\0\0\0\0\0,\0\0\14\202\0\0\305\240\0\0\377\222\0\0\377\232"
-  "\0\0\377\225\0\0\354J\0\0\35G\0\0\33\217\0\0\347\233\0\0\377\222\0\0\377"
-  "\241\0\0\377t\0\0\213\30\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0%\0"
-  "\0\4n\0\0d\236\0\0\372\225\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\240"
-  "\0\0\377u\0\0\215\35\0\0\4\26\0\0\3@\0\0\23|\0\0\223\236\0\0\372\240\0\0"
-  "\377\225\0\0\377\223\0\0\377\230\0\0\377\230\0\0\372m\0\0h1\0\0\14%\0\0\10"
-  "\14\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21\0\0\1^\0\0O\234\0\0\374\225"
-  "\0\0\377\222\0\0\377\236\0\0\377\216\0\0\356?\0\0\32\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0f\0\0_\234\0\0\376\227\0\0\377\222\0\0\377\237"
-  "\0\0\377\206\0\0\306)\0\0\13$\0\0\2{\0\0\222\246\0\0\374\240\0\0\372\236"
-  "\0\0\354u\0\0\244M\0\0""6\177\0\0\244\235\0\0\367\177\0\0\2103\0\0\13w\0"
-  "\0u\231\0\0\365\233\0\0\377\241\0\0\377\216\0\0\314K\0\0\26\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\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\20\0\0\2d\0\0\\\237\0\0\375\224"
-  "\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\242\0\0\377|\0\0\253\36\0\0"
-  "\5\0\0\0\0\0\0\0\0\\\0\0""4\211\0\0\312\226\0\0\376\225\0\0\377\225\0\0\377"
-  "\236\0\0\377\200\0\0\273M\0\0\37\23\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0@\0\0\37\221\0\0\357\232\0\0\377\223\0\0\377\223\0\0\377"
-  "\236\0\0\377z\0\0\244\31\0\0\5+\0\0\10\201\0\0\277\233\0\0\377\223\0\0\377"
-  "\236\0\0\377z\0\0\243\31\0\0\5\0\0\0\0\0\0\0\0\10\0\0\0\35\0\0\4\36\0\0\4"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0M\0\0&\225\0\0\363\231\0\0\377\222"
-  "\0\0\377\235\0\0\377}\0\0\261$\0\0\6e\0\0V\242\0\0\375\226\0\0\377\232\0"
-  "\0\377\230\0\0\363Y\0\0:\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""7\0\0"
-  "\10q\0\0o\225\0\0\362\233\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\225"
-  "\0\0\377\237\0\0\373[\0\0B\11\0\0\0B\0\0#\210\0\0\327\236\0\0\375\230\0\0"
-  "\377\224\0\0\377\223\0\0\377\227\0\0\377\237\0\0\376x\0\0\213+\0\0\6\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\25\0\0\1c\0\0\\\234"
-  "\0\0\375\225\0\0\377\222\0\0\377\237\0\0\377\211\0\0\3437\0\0\24\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11\0\0\0u\0\0\205\235\0\0\377\225\0\0\377"
-  "\225\0\0\377\244\0\0\377~\0\0\245\32\0\0\4\26\0\0\1T\0\0/w\0\0\210\222\0"
-  "\0\325\226\0\0\343\223\0\0\362{\0\0\237@\0\0\37x\0\0l\243\0\0\366\201\0\0"
-  "\220G\0\0\16_\0\0""9\213\0\0\302\227\0\0\362\237\0\0\375~\0\0\2377\0\0\12"
-  "\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\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\6~\0\0\250\240\0\0"
-  "\377\224\0\0\377\224\0\0\377\224\0\0\377\224\0\0\377\236\0\0\373e\0\0Y\16"
-  "\0\0\1\0\0\0\0\2\0\0\0\25\0\0\1T\0\0<\221\0\0\370\227\0\0\377\232\0\0\377"
-  "\224\0\0\365U\0\0""1\16\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\37\222\0\0\357\232\0\0\377\223\0\0\377\223\0\0\377\236"
-  "\0\0\377z\0\0\244\31\0\0\5#\0\0\3z\0\0\236\235\0\0\377\223\0\0\377\236\0"
-  "\0\377}\0\0\257\35\0\0\6\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\17\0\0\2e\0\0a\236\0\0\375\227\0\0\377\222\0\0\377"
-  "\240\0\0\377n\0\0y\36\0\0\6x\0\0\236\241\0\0\377\221\0\0\377\242\0\0\377"
-  "z\0\0\247)\0\0\10\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0&\0\0\5u\0\0\207\240\0\0"
-  "\372\234\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377\235\0\0"
-  "\377\221\0\0\341C\0\0\25\0\0\0\0P\0\0/\214\0\0\364\226\0\0\376\225\0\0\377"
-  "\224\0\0\377\225\0\0\377\241\0\0\377\204\0\0\305A\0\0\22\3\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\35\0\0\2n\0\0}\233\0\0\377"
-  "\224\0\0\377\222\0\0\377\240\0\0\377\201\0\0\302%\0\0\13\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0""0\0\0\16\212\0\0\320\240\0\0\377\223\0\0\377\225"
-  "\0\0\377\237\0\0\377t\0\0\201\20\0\0\1!\0\0\6T\0\0.<\0\0\22?\0\0\21N\0\0"
-  "$\203\0\0\301\257\0\0\376\210\0\0\267<\0\0\23u\0\0]\227\0\0\353\212\0\0\273"
-  "A\0\0\23""8\0\0\12T\0\0""3\221\0\0\337\251\0\0\374v\0\0\2030\0\0\10\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\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\17\0\0\0T\0\0""1\225\0\0\357\231\0\0\377\223\0"
-  "\0\377\224\0\0\377\222\0\0\377\237\0\0\377\206\0\0\316<\0\0\22\0\0\0\0\0"
-  "\0\0\0\0\0\0\0#\0\0\6~\0\0\255\236\0\0\377\225\0\0\377\240\0\0\377}\0\0\243"
-  "'\0\0\5\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\37\222\0\0\357\232\0\0\377\223\0\0\377\223\0\0\377\236\0\0\377z\0\0"
-  "\244\31\0\0\5\26\0\0\2h\0\0m\240\0\0\377\224\0\0\377\234\0\0\377\215\0\0"
-  "\350L\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\30\0\0\5t\0\0\222\243\0\0\377\222\0\0\377\223\0\0\377\235\0\0"
-  "\373b\0\0R>\0\0\20\215\0\0\336\232\0\0\377\224\0\0\377\235\0\0\376^\0\0O"
-  "\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""8\0\0\7s\0\0\207\242\0\0\376\240\0\0\377"
-  "\223\0\0\377\223\0\0\377\224\0\0\377\224\0\0\377\222\0\0\377\241\0\0\377"
-  "t\0\0\216\34\0\0\4\11\0\0\2J\0\0""2b\0\0]{\0\0\260\241\0\0\377\225\0\0\377"
-  "\227\0\0\377\231\0\0\370^\0\0F\17\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\15\0\0\1V\0\0;\231\0\0\366\225\0\0\377\222"
-  "\0\0\377\241\0\0\377\200\0\0\271\36\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\10\0\0\0h\0\0]\235\0\0\376\230\0\0\377\222\0\0\377\231\0\0\377\222\0\0"
-  "\371P\0\0""6\4\0\0\0?\0\0\31\211\0\0\327\216\0\0\316_\0\0:7\0\0\12U\0\0+"
-  "\215\0\0\334\254\0\0\375\211\0\0\266F\0\0\21d\0\0?\237\0\0\361\220\0\0\314"
-  "O\0\0\34\35\0\0\2b\0\0@\226\0\0\344\244\0\0\374q\0\0s\31\0\0\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\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\2t\0\0\210\236\0\0\377\224\0\0\377\223\0\0\377\223\0"
-  "\0\377\226\0\0\377\233\0\0\372e\0\0]\24\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0U\0"
-  "\0""2\223\0\0\364\232\0\0\377\231\0\0\377\232\0\0\363[\0\0""8\22\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\37\222"
-  "\0\0\357\232\0\0\377\223\0\0\377\223\0\0\377\236\0\0\377{\0\0\250\32\0\0"
-  "\5\15\0\0\1X\0\0E\234\0\0\374\224\0\0\377\224\0\0\377\236\0\0\377w\0\0\227"
-  "!\0\0\5\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\26"
-  "\0\0\5r\0\0\215\242\0\0\377\222\0\0\377\227\0\0\377\226\0\0\365T\0\0""3A"
-  "\0\0\22\216\0\0\344\231\0\0\377\234\0\0\377\215\0\0\355@\0\0\36\0\0\0\0\0"
-  "\0\0\0\0\0\0\0""2\0\0\6p\0\0\201\237\0\0\373\231\0\0\371w\0\0\302\220\0\0"
-  "\370\224\0\0\377\224\0\0\377\223\0\0\377\226\0\0\377\230\0\0\367Z\0\0A\12"
-  "\0\0\0\6\0\0\1\15\0\0\2^\0\0,\216\0\0\334\235\0\0\377\224\0\0\377\232\0\0"
-  "\377\207\0\0\3008\0\0\13\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\14\0\0\1T\0\0""9\230\0\0\365\225\0\0\377\222\0\0"
-  "\377\241\0\0\377\200\0\0\272\36\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\35"
-  "\0\0\4\177\0\0\246\242\0\0\377\224\0\0\377\223\0\0\377\233\0\0\377\214\0"
-  "\0\341+\0\0\20\0\0\0\0\31\0\0\5W\0\0""0\177\0\0\237\232\0\0\365\206\0\0\275"
-  "b\0\0KS\0\0/\203\0\0\261\250\0\0\374\211\0\0\255I\0\0\27s\0\0r\254\0\0\377"
-  "\212\0\0\307X\0\0,\25\0\0\2e\0\0>\230\0\0\345\227\0\0\357W\0\0""4\20\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\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\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\0G\0\0\35\215\0\0\335\232\0\0\377\223\0\0\377\224\0\0\377"
-  "\222\0\0\377\240\0\0\377~\0\0\265-\0\0\12\0\0\0\0\0\0\0\0\0\0\0\0,\0\0\7"
-  "}\0\0\236\236\0\0\377\224\0\0\377\234\0\0\377\200\0\0\254.\0\0\6\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\0A\0\0\37"
-  "\222\0\0\360\232\0\0\377\223\0\0\377\225\0\0\377\233\0\0\377p\0\0\201\27"
-  "\0\0\2\5\0\0\0""8\0\0\20\215\0\0\332\231\0\0\377\222\0\0\377\233\0\0\377"
-  "\230\0\0\367\\\0\0F\31\0\0\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\33\0\0\6v\0\0\231\243\0\0\377\222\0\0\377\232\0\0\377\217\0"
-  "\0\354F\0\0\34B\0\0\23\215\0\0\345\232\0\0\377\236\0\0\377z\0\0\253\31\0"
-  "\0\7\0\0\0\0\21\0\0\0I\0\0\25|\0\0\235\232\0\0\372\235\0\0\375i\0\0|^\0\0"
-  "g\224\0\0\371\224\0\0\377\224\0\0\377\222\0\0\377\240\0\0\377\202\0\0\302"
-  "3\0\0\17\0\0\0\0\0\0\0\0C\0\0\16\210\0\0\304\243\0\0\377\223\0\0\377\224"
-  "\0\0\377\231\0\0\370e\0\0T\25\0\0\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\22\0\0\1`\0\0S\235\0\0\374\225\0\0\377"
-  "\222\0\0\377\241\0\0\377\201\0\0\274!\0\0\11\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0+\0\0\16\207\0\0\315\237\0\0\377\222\0\0\377\224\0\0\377\234\0\0\377"
-  "~\0\0\244\27\0\0\3\0\0\0\0\0\0\0\0\0\0\0\0?\0\0\16\216\0\0\303\254\0\0\374"
-  "\236\0\0\363|\0\0\212A\0\0\"\200\0\0\234\253\0\0\372\210\0\0\262C\0\0!\177"
-  "\0\0\243\257\0\0\376\222\0\0\340_\0\0B&\0\0\3h\0\0R\235\0\0\361\217\0\0\331"
-  "]\0\0""0\34\0\0\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\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\5\0\0\0l\0\0g\240\0\0\377\227\0\0\377\223\0\0\377\223\0"
-  "\0\377\226\0\0\377\242\0\0\377l\0\0a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0[\0\0"
-  """6\226\0\0\367\232\0\0\377\231\0\0\377\225\0\0\357N\0\0&\10\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\0A\0\0!"
-  "\222\0\0\360\232\0\0\377\223\0\0\377\227\0\0\377\233\0\0\377i\0\0b\5\0\0"
-  "\0\0\0\0\0\20\0\0\2n\0\0l\241\0\0\375\223\0\0\377\223\0\0\377\234\0\0\377"
-  "\221\0\0\340\\\0\0""8\24\0\0\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\15\0\0\1]\0\0E\226\0\0\367\227\0\0\377\231\0\0\377\220\0\0\355G\0"
-  "\0\32B\0\0\23\216\0\0\345\232\0\0\377\236\0\0\377r\0\0\177\3\0\0\0\32\0\0"
-  "\2T\0\0$\204\0\0\276\240\0\0\376\243\0\0\375z\0\0\227(\0\0\14\206\0\0\267"
-  "\235\0\0\377\224\0\0\377\223\0\0\377\226\0\0\377\240\0\0\377e\0\0g\11\0\0"
-  "\1\0\0\0\0*\0\0\6u\0\0\204\241\0\0\377\225\0\0\377\223\0\0\377\240\0\0\377"
-  "\211\0\0\3032\0\0\11\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\21\0\0\1_\0\0Q\235\0\0\374\225\0\0\377\225\0"
-  "\0\377\241\0\0\377s\0\0\177\23\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\"\0"
-  "\0\10\177\0\0\266\236\0\0\377\223\0\0\377\226\0\0\377\236\0\0\377m\0\0q\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\12\0\0\1""9\0\0\21e\0\0U\221\0\0\331\247\0"
-  "\0\377\210\0\0\264;\0\0\31\203\0\0\242\250\0\0\375\205\0\0\254>\0\0\40v\0"
-  "\0\211\237\0\0\365\236\0\0\357t\0\0l\32\0\0\4q\0\0g\256\0\0\373\237\0\0\351"
-  "m\0\0R%\0\0\4\6\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\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\16\201\0\0\271\240\0\0\377\225\0\0\377\223\0\0\377\223\0\0\377"
-  "\236\0\0\377\215\0\0\343J\0\0\37\0\0\0\0\0\0\0\0\0\0\0\0\35\0\0\4u\0\0\214"
-  "\237\0\0\377\222\0\0\377\241\0\0\377\201\0\0\262\"\0\0\6\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""1\0\0\14"
-  "\205\0\0\311\236\0\0\377\224\0\0\377\227\0\0\377\234\0\0\377l\0\0d\13\0\0"
-  "\0\0\0\0\0\0\0\0\0C\0\0\27\203\0\0\273\234\0\0\376\223\0\0\377\224\0\0\377"
-  "\235\0\0\377\210\0\0\324X\0\0""4'\0\0\5\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\10\0\0\0""9\0\0\26\204\0\0\333\233\0\0\377\231\0\0\377\220\0\0\355"
-  "G\0\0\32B\0\0\23\215\0\0\342\232\0\0\377\234\0\0\377y\0\0\255?\0\0\30e\0"
-  "\0V\216\0\0\335\237\0\0\377\240\0\0\376\177\0\0\234@\0\0\14C\0\0\26\220\0"
-  "\0\335\230\0\0\377\223\0\0\377\223\0\0\377\227\0\0\377\237\0\0\377c\0\0_"
-  "\22\0\0\1#\0\0\4o\0\0m\230\0\0\364\232\0\0\377\222\0\0\377\232\0\0\377\234"
-  "\0\0\365c\0\0G\16\0\0\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\15\0\0\1J\0\0)\202\0\0\313\224\0\0\377\226"
-  "\0\0\377\241\0\0\377o\0\0l\17\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\15\0\0\1c\0\0"
-  "M\222\0\0\360\230\0\0\377\223\0\0\377\227\0\0\377\234\0\0\375d\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\13\0\0\1Q\0\0'\216\0\0\332\253"
-  "\0\0\373d\0\0SO\0\0\36\222\0\0\317\251\0\0\374\202\0\0\2346\0\0\14t\0\0g"
-  "\252\0\0\364\220\0\0\326L\0\0\35\36\0\0\5l\0\0R\225\0\0\331\240\0\0\364{"
-  "\0\0\223F\0\0\31\14\0\0\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\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\40\0\0\2"
-  "z\0\0\210\240\0\0\376\225\0\0\377\223\0\0\377\223\0\0\377\226\0\0\377\244"
-  "\0\0\377x\0\0\213\31\0\0\3\0\0\0\0\0\0\0\0\6\0\0\0X\0\0""8\223\0\0\360\231"
-  "\0\0\377\224\0\0\377\233\0\0\367`\0\0E\13\0\0\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\32\0\0\1n\0\0y\231"
-  "\0\0\377\225\0\0\377\225\0\0\377\243\0\0\377{\0\0\232\31\0\0\3\0\0\0\0\0"
-  "\0\0\0\2\0\0\0N\0\0\37\221\0\0\340\241\0\0\377\223\0\0\377\223\0\0\377\233"
-  "\0\0\377\231\0\0\362y\0\0\224D\0\0\30\33\0\0\5\7\0\0\1\10\0\0\1\31\0\0\4"
-  "T\0\0,\203\0\0\272\234\0\0\375\232\0\0\377\232\0\0\377\220\0\0\355G\0\0\32"
-  "/\0\0\12\200\0\0\277\234\0\0\377\222\0\0\377\223\0\0\374\223\0\0\355\227"
-  "\0\0\372\237\0\0\377\240\0\0\377\177\0\0\2425\0\0\13\2\0\0\0A\0\0\32\217"
-  "\0\0\340\227\0\0\377\224\0\0\377\224\0\0\377\223\0\0\377\231\0\0\377\217"
-  "\0\0\340R\0\0'S\0\0)\230\0\0\354\232\0\0\377\223\0\0\377\223\0\0\377\242"
-  "\0\0\377z\0\0\235)\0\0\7\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\26\0\0\2[\0\0I\230\0\0\371"
-  "\230\0\0\377\241\0\0\377p\0\0p\21\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0""8\0\0\24"
-  "\210\0\0\332\237\0\0\377\222\0\0\377\223\0\0\377\230\0\0\377\220\0\0\343"
-  "H\0\0\40\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\32\0\0\1"
-  "t\0\0t\250\0\0\375\207\0\0\2749\0\0\14X\0\0)\221\0\0\324\250\0\0\373~\0\0"
-  "\215-\0\0\10]\0\0""0\202\0\0\270\214\0\0\340p\0\0[(\0\0\4M\0\0\40\213\0\0"
-  "\317\251\0\0\377\212\0\0\307E\0\0\27\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\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\0U\0\0-\223\0\0\355\235\0\0\377\222\0\0\377\224\0\0\377\223\0\0\377\235"
-  "\0\0\377\216\0\0\337R\0\0$\6\0\0\0\0\0\0\0\0\0\0\0""6\0\0\16\201\0\0\264"
-  "\241\0\0\377\221\0\0\377\236\0\0\377\207\0\0\317<\0\0\17\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"
-  "\36\0\0\2{\0\0\231\234\0\0\377\224\0\0\377\222\0\0\377\240\0\0\377\177\0"
-  "\0\255\32\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\17\0\0\1h\0\0J\224\0\0\355\237\0"
-  "\0\377\227\0\0\377\223\0\0\377\233\0\0\377\236\0\0\376\212\0\0\333s\0\0\225"
-  "d\0\0^e\0\0ar\0\0\215\215\0\0\341\241\0\0\377\211\0\0\326\217\0\0\356\244"
-  "\0\0\377\220\0\0\353E\0\0\30\27\0\0\2n\0\0w\250\0\0\376\232\0\0\377\235\0"
-  "\0\377\242\0\0\377\240\0\0\377\234\0\0\376\200\0\0\253H\0\0\25\2\0\0\0\12"
-  "\0\0\0H\0\0#\221\0\0\351\227\0\0\377\223\0\0\377\224\0\0\377\223\0\0\377"
-  "\222\0\0\377\232\0\0\376\202\0\0\316{\0\0\300\230\0\0\377\224\0\0\377\222"
-  "\0\0\377\234\0\0\377\225\0\0\354W\0\0""3\11\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"
-  "\2\0\0\0M\0\0'\226\0\0\362\235\0\0\377\236\0\0\377m\0\0e\16\0\0\0\0\0\0\0"
-  "\0\0\0\0\2\0\0\0\\\0\0I\232\0\0\375\227\0\0\377\223\0\0\377\224\0\0\377\235"
-  "\0\0\377\211\0\0\3021\0\0\7\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""9\0\0\14\200\0\0\235\244\0\0\371}\0\0~\37\0\0\4X\0\0"
-  ",\212\0\0\276\234\0\0\366\177\0\0\234A\0\0\25:\0\0\20x\0\0\216\217\0\0\354"
-  "w\0\0|)\0\0\4f\0\0>\226\0\0\347\252\0\0\377}\0\0\236?\0\0\14\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\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\12{\0\0\253\237\0\0\377\225\0\0\377\223\0\0\377\223\0"
-  "\0\377\231\0\0\377\227\0\0\371e\0\0U\25\0\0\1\0\0\0\0\0\0\0\0\17\0\0\1g\0"
-  "\0]\237\0\0\374\226\0\0\377\224\0\0\377\237\0\0\375i\0\0i\23\0\0\2\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0!\0\0\3\204\0\0\260\243\0\0\377\230\0\0\377\223\0\0\377\240\0\0"
-  "\377z\0\0\241\31\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\33\0\0\2^\0\0;\210"
-  "\0\0\317\240\0\0\376\233\0\0\377\225\0\0\377\223\0\0\377\234\0\0\377\240"
-  "\0\0\377\236\0\0\376\236\0\0\376\245\0\0\377\243\0\0\376{\0\0\243@\0\0\25"
-  "d\0\0L\226\0\0\354\231\0\0\361Q\0\0(\2\0\0\0M\0\0\36\210\0\0\312\226\0\0"
-  "\370\223\0\0\371\225\0\0\371\215\0\0\340s\0\0};\0\0\16\15\0\0\0\0\0\0\0\13"
-  "\0\0\0F\0\0!\212\0\0\337\230\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377"
-  "\227\0\0\377\224\0\0\377\232\0\0\377\233\0\0\377\223\0\0\377\223\0\0\377"
-  "\224\0\0\377\242\0\0\377p\0\0\177\34\0\0\3\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\0G\0\0\32\221\0\0\354\240\0\0\377\224\0\0\371[\0\0;\5\0\0\0\0\0"
-  "\0\0\0\0\0\0\35\0\0\6y\0\0\237\244\0\0\377\222\0\0\377\223\0\0\377\224\0"
-  "\0\377\236\0\0\377}\0\0\237%\0\0\3\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\10\0\0\0>\0\0\15\201\0\0\225\241\0\0\364t\0\0"
-  "d-\0\0\3F\0\0\17\203\0\0\261\262\0\0\375\210\0\0\301K\0\0!)\0\0\5_\0\0K\213"
-  "\0\0\342~\0\0\221H\0\0\16f\0\0<\217\0\0\323\246\0\0\376\201\0\0\256S\0\0"
-  "\40\21\0\0\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\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\4r\0\0\200\235\0\0\374\225\0\0\377\223\0\0\377\223\0\0"
-  "\377\224\0\0\377\243\0\0\377\200\0\0\252*\0\0\6\0\0\0\0\0\0\0\0\0\0\0\0""0"
-  "\0\0\12\207\0\0\312\237\0\0\377\221\0\0\377\235\0\0\377\214\0\0\347@\0\0"
-  "\33\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\1n\0\0\202\207\0\0\347\224\0\0\374\233\0"
-  "\0\377\247\0\0\377}\0\0\252\32\0\0\5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\17\0\0\0@\0\0\25o\0\0l\214\0\0\336\247\0\0\377\242\0\0\377\235\0\0\377"
-  "\227\0\0\377\230\0\0\377\237\0\0\377\247\0\0\377\215\0\0\315I\0\0\26\16\0"
-  "\0\0\30\0\0\2]\0\0?\231\0\0\364n\0\0a\10\0\0\1\17\0\0\1""4\0\0\21S\0\0""6"
-  "W\0\0=X\0\0<@\0\0\33\30\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0*\0\0\5\204"
-  "\0\0\271\244\0\0\377\231\0\0\377\233\0\0\377\242\0\0\377\241\0\0\377\225"
-  "\0\0\377\222\0\0\377\223\0\0\377\223\0\0\377\224\0\0\377\240\0\0\377\206"
-  "\0\0\316@\0\0\26\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\23"
-  "\214\0\0\337\250\0\0\377\224\0\0\367T\0\0""4\0\0\0\0\0\0\0\0\0\0\0\0:\0\0"
-  "\22\212\0\0\333\235\0\0\377\223\0\0\377\223\0\0\377\231\0\0\377\241\0\0\376"
-  "j\0\0o\31\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\6\0\0\0""0\0\0\10r\0\0m\226\0\0\355x\0\0t#\0\0\4U\0\0\37\206"
-  "\0\0\302\252\0\0\374\210\0\0\270A\0\0\25\40\0\0\4b\0\0H\227\0\0\351\221\0"
-  "\0\275K\0\0\21P\0\0\34\177\0\0\236\246\0\0\374\223\0\0\335`\0\0:\24\0\0\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\2\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\25\0\0\1`\0\0E\231"
-  "\0\0\364\235\0\0\377\222\0\0\377\223\0\0\377\223\0\0\377\237\0\0\377\220"
-  "\0\0\335T\0\0'\21\0\0\0\0\0\0\0\0\0\0\0\22\0\0\1\\\0\0@\235\0\0\373\226\0"
-  "\0\377\224\0\0\377\244\0\0\377z\0\0\236\30\0\0\5\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"
-  "\22\0\0\0""6\0\0\30B\0\0\40o\0\0\226\200\0\0\321\206\0\0\270\201\0\0\240"
-  "\30\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\30\0\0"
-  "\1T\0\0%t\0\0\177}\0\0\261\207\0\0\336\231\0\0\371\230\0\0\367\202\0\0\312"
-  "w\0\0\213S\0\0#\23\0\0\0\0\0\0\0\0\0\0\0\33\0\0\1b\0\0FM\0\0&\10\0\0\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\31\0\0\1f\0\0P\216\0\0\335\234\0\0\373\200\0\0\307o\0\0yj"
-  "\0\0~\214\0\0\365\227\0\0\377\223\0\0\377\223\0\0\377\232\0\0\377\234\0\0"
-  "\373e\0\0P\14\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\5"
-  "m\0\0|\235\0\0\372\216\0\0\351E\0\0!\0\0\0\0\0\0\0\0\7\0\0\0D\0\0\34\214"
-  "\0\0\344\232\0\0\377\222\0\0\377\231\0\0\376y\0\0\277\214\0\0\353[\0\0L\21"
-  "\0\0\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\4\201\0\0\211\253\0\0\373v\0\0\204<\0\0\14H\0"
-  "\0\31v\0\0\202\232\0\0\352\210\0\0\273X\0\0""9\30\0\0\5b\0\0C\230\0\0\344"
-  "\214\0\0\272W\0\0\"4\0\0\10o\0\0n\235\0\0\361\235\0\0\354e\0\0H\33\0\0\2"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\22\0\0\3\32\0\0\7""1\0\0"
-  "\13\"\0\0\3\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\20\0\0\0Q\0\0\37\216\0\0\330\236"
-  "\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377\232\0\0\377\232\0\0\360f\0\0"
-  "R\25\0\0\1\0\0\0\0\0\0\0\0\0\0\0\0""2\0\0\11\207\0\0\276\236\0\0\377\223"
-  "\0\0\377\235\0\0\377\222\0\0\354T\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\13\0\0\1T\0\0Jc\0\0~E\0\0\27N\0\0'\5\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\13\0\0\1\34\0\0"
-  "\7""3\0\0\21S\0\0""3S\0\0""0)\0\0\14\16\0\0\3\0\0\0\0\2\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\4\0\0\1\3\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\17\0\0\2D\0"
-  "\0\32V\0\0""93\0\0\17\23\0\0\2g\0\0_\227\0\0\374\227\0\0\377\223\0\0\377"
-  "\225\0\0\377\243\0\0\377\206\0\0\2662\0\0\14\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\0S\0\0""0\241\0\0\366\210\0\0\323.\0\0"
-  "\21\0\0\0\0\0\0\0\0\23\0\0\3j\0\0m\234\0\0\374\224\0\0\377\230\0\0\377\226"
-  "\0\0\363O\0\0""1E\0\0--\0\0\21\12\0\0\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""8\0\0\15"
-  "\204\0\0\236\251\0\0\374\177\0\0\232;\0\0\13\30\0\0\3^\0\0""8\220\0\0\307"
-  "\220\0\0\334_\0\0""8)\0\0\2P\0\0""1\214\0\0\314\225\0\0\335g\0\0?#\0\0\3"
-  "W\0\0""0\220\0\0\302\233\0\0\362s\0\0h6\0\0\6\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\16""8\0\0%\202\0\0\267u\0\0a\25\0\0\2\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\21"
-  "\0\0\0Q\0\0\36\214\0\0\304\235\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377"
-  "\232\0\0\377\231\0\0\366g\0\0R\37\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\20\0\0\0"
-  "O\0\0)\225\0\0\352\235\0\0\377\231\0\0\377\240\0\0\377x\0\0\227\37\0\0\4"
-  "\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\14\0\0\2O\0\0=[\0\0d\"\0"
-  "\0\1\3\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\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\11\0\0\0Q\0\0$\216\0\0\336\235"
-  "\0\0\377\223\0\0\377\227\0\0\377\232\0\0\374r\0\0\212J\0\0\32\15\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\0I\0\0#\227"
-  "\0\0\346\212\0\0\325/\0\0\21\0\0\0\0\0\0\0\0\31\0\0\5t\0\0\216\243\0\0\377"
-  "\221\0\0\377\241\0\0\377{\0\0\262?\0\0,<\0\0$\20\0\0\2\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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""4\0\0\14\201\0\0\233\244\0\0\373s\0\0n\24\0\0\2\12"
-  "\0\0\0O\0\0\31\213\0\0\264\230\0\0\337S\0\0""1\"\0\0\2U\0\0""1\233\0\0\344"
-  "\233\0\0\354t\0\0u9\0\0\16C\0\0\17\202\0\0\240\247\0\0\372y\0\0q!\0\0\3\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\25\0\0\4\35\0\0\7\205\0\0\245\230\0\0\345"
-  "d\0\0<%\0\0\5\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\13\0\0\0R\0\0\40\214\0\0\307\236\0\0\377\225\0\0\377\223\0\0"
-  "\377\223\0\0\377\225\0\0\377\240\0\0\376}\0\0\2330\0\0\10\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0""0\0\0\7|\0\0\241\235\0\0\377\216\0\0\354v\0\0\270\224\0"
-  "\0\370c\0\0I\6\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\3\0"
-  "\0\0\33\0\0\5!\0\0\11\16\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\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\36"
-  "\0\0\5z\0\0\230\243\0\0\377\226\0\0\377\223\0\0\377\237\0\0\377\210\0\0\277"
-  ">\0\0\20\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\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\37\0\0\10\211\0\0\262\227\0\0\3415\0\0\24\0\0\0\0\11\0\0"
-  "\0N\0\0\"\212\0\0\332\231\0\0\377\227\0\0\377\245\0\0\377a\0\0Vz\0\0\250"
-  "j\0\0}\30\0\0\3\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""8\0\0\14"
-  "\206\0\0\245\233\0\0\351a\0\0""0\10\0\0\0\0\0\0\0N\0\0\33\220\0\0\314\203"
-  "\0\0\266S\0\0-0\0\0\7c\0\0I\214\0\0\307\246\0\0\376\205\0\0\251F\0\0\17A"
-  "\0\0\17|\0\0\202\225\0\0\360o\0\0Y*\0\0\4\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\0T\0\0\40\221\0\0\326\242\0\0\361w\0\0\207I\0\0\32\12\0\0\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\34\0\0\6]\0\0=\215\0\0\322\236"
-  "\0\0\377\225\0\0\377\223\0\0\377\222\0\0\377\226\0\0\377\243\0\0\377\202"
-  "\0\0\271A\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\3\0\0\0[\0\0?\233\0\0\366"
-  "\240\0\0\377t\0\0\216_\0\0V{\0\0\261-\0\0\7\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\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\0Q\0\0)\223\0\0\354\235\0\0\377\222\0\0\377\227"
-  "\0\0\377\230\0\0\356\\\0\0""4\26\0\0\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\23\220\0\0\334\202\0"
-  "\0\264$\0\0\7\0\0\0\0#\0\0\5\177\0\0\241\240\0\0\377\223\0\0\377\237\0\0"
-  "\377\217\0\0\343D\0\0\37|\0\0\271]\0\0""4\14\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\10\0\0\0A\0\0\16\206\0\0\256\212\0\0\315g\0\0"
-  "GI\0\0\35\26\0\0\2V\0\0'|\0\0\243x\0\0\314q\0\0\205T\0\0\"N\0\0\32\210\0"
-  "\0\264\253\0\0\376\207\0\0\250<\0\0\15""0\0\0\4p\0\0a\210\0\0\337y\0\0\204"
-  "A\0\0\24\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\34\0\0\1`\0\0""6\220\0\0\317\257"
-  "\0\0\376\222\0\0\336j\0\0]:\0\0\13\14\0\0\0\20\0\0\1\21\0\0\1""1\0\0\12d"
-  "\0\0F{\0\0\247\225\0\0\365\240\0\0\377\224\0\0\377\223\0\0\377\223\0\0\377"
-  "\227\0\0\377\234\0\0\376\205\0\0\304O\0\0!\7\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\"\0\0\6~\0\0\253\242\0\0\377\224\0\0\354<\0\0\34F\0\0""2L\0\0"
-  """5\7\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\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\7{\0\0\245"
-  "\241\0\0\377\227\0\0\377\230\0\0\377\241\0\0\377y\0\0\220\"\0\0\4\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\35\0\0\3c\0\0`b\0\0p\17\0\0\1\17\0\0\0T\0\0+\226\0\0\354\232\0\0"
-  "\377\236\0\0\377\236\0\0\375k\0\0[d\0\0Gc\0\0\2044\0\0\12\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\7\0\0\0B\0\0\16y\0\0\211"
-  "\224\0\0\356\237\0\0\351t\0\0f\32\0\0\2/\0\0\3V\0\0""1\203\0\0\274\226\0"
-  "\0\350~\0\0zC\0\0\36\201\0\0\224\250\0\0\371\215\0\0\254>\0\0\16!\0\0\1a"
-  "\0\0""5\224\0\0\334\207\0\0\273J\0\0\23\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\16"
-  "\0\0\0P\0\0\37\207\0\0\274\250\0\0\375\252\0\0\375\200\0\0\256r\0\0ps\0\0"
-  "ws\0\0x~\0\0\264\232\0\0\372\242\0\0\377\226\0\0\377\222\0\0\377\223\0\0"
-  "\377\222\0\0\377\234\0\0\377\243\0\0\377x\0\0\236A\0\0\22\17\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0H\0\0(\224\0\0\362\201\0\0\316l\0\0\232"
-  "%\0\0\10\26\0\0\13\27\0\0\12\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\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\30\0\0\1`\0\0J\233\0\0\367\235\0\0\377\234\0\0\377\232\0\0\377\221\0"
-  "\0\347O\0\0!\7\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\0F\0\0$W\0\0b\21\0\0\1\35\0\0"
-  "\2p\0\0|\241\0\0\377\225\0\0\375\217\0\0\362\206\0\0\341K\0\0\35m\0\0e^\0"
-  "\0?\7\0\0\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\34\0\0\2]\0\0""6\210\0\0\237\217\0\0\350g\0\0F\0\0\0\0"
-  "\5\0\0\0""9\0\0\13\206\0\0\235\256\0\0\374~\0\0\222B\0\0\23x\0\0l\245\0\0"
-  "\362\216\0\0\265H\0\0\22\3\0\0\0R\0\0\35\210\0\0\277\210\0\0\274Z\0\0\"\4"
-  "\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\14\0\0\0;\0\0\16i\0\0T\206\0\0\303\243\0\0"
-  "\373\254\0\0\377\245\0\0\377\240\0\0\377\234\0\0\377\226\0\0\377\221\0\0"
-  "\377\222\0\0\377\222\0\0\377\230\0\0\377\241\0\0\377\223\0\0\356s\0\0{?\0"
-  "\0\14\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\0R\0\0:\201\0"
-  "\0\340W\0\0B,\0\0\25\14\0\0\2\13\0\0\3\7\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\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\0K\0\0\40\223\0\0\335\232\0\0\373\213\0\0\354~\0\0\301"
-  "c\0\0hT\0\0""9\31\0\0\3\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\11""8\0\0\25"
-  "\13\0\0\0\37\0\0\2r\0\0\204\243\0\0\377\220\0\0\326O\0\0""8O\0\0=\35\0\0"
-  "\7\27\0\0\3\21\0\0\3\3\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\4}\0\0\212\216"
-  "\0\0\322G\0\0\22\27\0\0\0\10\0\0\0""9\0\0\14{\0\0\207\250\0\0\373\216\0\0"
-  "\305U\0\0'i\0\0<\214\0\0\307\206\0\0\302Y\0\0+\37\0\0\1K\0\0\21\203\0\0\241"
-  "\217\0\0\335_\0\0""6\40\0\0\1\3\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"
-  "\13[\0\0>s\0\0\214\214\0\0\337\243\0\0\375\241\0\0\377\241\0\0\377\241\0"
-  "\0\377\241\0\0\377\242\0\0\377\235\0\0\367\202\0\0\271V\0\0""2\31\0\0\3\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\22@\0"
-  "\0(\33\0\0\6\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\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\0F\0\0\37\222\0\0\332\211\0\0\305A\0\0!5\0\0\22\5\0\0"
-  "\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\35\0\0\2v\0\0\201\253\0\0\377|\0\0\215\40\0\0\2\5\0\0\1\3\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""5\0\0\14o\0\0\204\200"
-  "\0\0\311d\0\0@!\0\0\3\0\0\0\0)\0\0\6~\0\0\205\256\0\0\374\217\0\0\323^\0"
-  "\0*G\0\0\17x\0\0\202\213\0\0\345k\0\0K(\0\0\2/\0\0\6r\0\0p\202\0\0\331w\0"
-  "\0zD\0\0\15\12\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\2\0\0\0\30\0\0\4J\0"
-  "\0\36o\0\0|\177\0\0\264\200\0\0\263\200\0\0\262\201\0\0\267u\0\0\221\\\0"
-  "\0:5\0\0\14\6\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\7\0\0\1\6\0\0\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\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\0\0\0\0%\0\0\10c\0\0n\\\0\0A\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\2z\0\0\226\225\0\0\353^\0\0I\20\0\0\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"
-  """6\0\0\10p\0\0p\215\0\0\345n\0\0b)\0\0\5\0\0\0\0*\0\0\10t\0\0}\245\0\0\362"
-  "\221\0\0\314\\\0\0)+\0\0\6u\0\0n\216\0\0\352m\0\0j%\0\0\5$\0\0\3j\0\0L\223"
-  "\0\0\345\202\0\0\250C\0\0\17\12\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\3\0\0\0\27\0\0\3$\0\0\7$\0\0\7#\0\0\7%\0\0\7\32\0\0\4\6\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\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\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\13\0\0\1\31\0\0\4\17\0\0\2\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\32\0\0\1M\0\0""6M\0\0*\40\0\0\10\6\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\37\0\0\3c\0\0C\202\0\0\320r\0\0|G\0\0\16\0\0\0\0\32\0\0\3d\0\0>\221"
-  "\0\0\327\232\0\0\350g\0\0<\36\0\0\3a\0\0""9|\0\0\314i\0\0o)\0\0\6\30\0\0"
-  "\1Y\0\0$\202\0\0\306z\0\0\244;\0\0\13\0\0\0\0\2\0\0\0\2\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\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\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\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\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\6\0\0\0\16\0\0\2\12\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\0\0\0\32\0\0\1S\0\0!\200\0\0\267z\0\0\245\\\0\0&\17\0\0\0\26\0\0"
-  "\1M\0\0\32y\0\0\205}\0\0\321c\0\0G\30\0\0\1Q\0\0\40g\0\0\222`\0\0o6\0\0\12"
-  "\11\0\0\0V\0\0\"u\0\0\232F\0\0-0\0\0\16#\0\0\5\2\0\0\0\0\0\0\0\0\0\0\0\0"
-  "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\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\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\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\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\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\23\0\0\0A\0\0\15{\0\0\227\212\0\0\330p\0\0[1\0\0\11\13\0\0"
-  "\0)\0\0\2\\\0\0;o\0\0\252Y\0\0=\30\0\0\2.\0\0\11d\0\0vV\0\0Z1\0\0\15\22\0"
-  "\0\0)\0\0\2\32\0\0\5c\0\0ye\0\0c)\0\0\5\10\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\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\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\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\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\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\4m\0\0Z\221\0\0\337\202\0\0\247E\0\0\17\0\0\0\0\10"
-  "\0\0\0K\0\0\36d\0\0\216L\0\0""5\23\0\0\2\36\0\0\4P\0\0BT\0\0g1\0\0\20\15"
-  "\0\0\0\12\0\0\0H\0\0\36j\0\0\226\207\0\0\257a\0\0,\15\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\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\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\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\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\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\16\0\0\0]\0\0""1\213\0\0\313y\0\0\2318\0\0\14"
-  "\40\0\0\0\11\0\0\0""8\0\0\17O\0\0TG\0\0""5\30\0\0\3\32\0\0\2E\0\0'G\0\0E"
-  "(\0\0\15\15\0\0\0\6\0\0\0M\0\0\23\211\0\0\255\200\0\0\302A\0\0\32\15\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\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\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\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\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\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\2\0\0\0D\0\0\26s\0\0\233\201\0"
-  "\0\311c\0\0E*\0\0\3\0\0\0\0.\0\0\12F\0\0<I\0\0G.\0\0\17\33\0\0\2+\0\0\16"
-  "\"\0\0\22)\0\0\26\35\0\0\7\13\0\0\0*\0\0\7X\0\0DT\0\0j/\0\0\27(\0\0\6\25"
-  "\0\0\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\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\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\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\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\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\13k\0\0Y\204\0\0\330"
-  "t\0\0r;\0\0\10\7\0\0\0\37\0\0\5:\0\0\33S\0\0cU\0\0ND\0\0\23\24\0\0\3""2\0"
-  "\0\34;\0\0.&\0\0\14\13\0\0\1\21\0\0\1""0\0\0\15""6\0\0\33j\0\0\227Y\0\0""4"
-  "\31\0\0\2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\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\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\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\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\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\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\35\0\0\2a\0\0""7\213\0\0"
-  "\330u\0\0\2256\0\0\12\0\0\0\0\16\0\0\1;\0\0\21m\0\0\213\202\0\0\310^\0\0"
-  """2\"\0\0\4,\0\0\21<\0\0/\37\0\0\11\15\0\0\2\12\0\0\1\32\0\0\2c\0\0P|\0\0"
-  "\314\\\0\0[4\0\0\14\17\0\0\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\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\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\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\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\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\25\0\0\1T\0"
-  "\0\36j\0\0\206Z\0\0iI\0\0\34\22\0\0\1\6\0\0\0""5\0\0\7i\0\0\\\204\0\0\330"
-  "w\0\0xA\0\0\14\32\0\0\3\13\0\0\2*\0\0\25K\0\0""41\0\0\11\32\0\0\2B\0\0\26"
-  "V\0\0ZR\0\0aJ\0\0/2\0\0\15\15\0\0\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\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\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\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\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\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\10\0\0\0&\0\0"
-  "\4Z\0\0Rk\0\0\252W\0\0@!\0\0\4\0\0\0\0!\0\0\2^\0\0""4\212\0\0\321v\0\0\234"
-  ">\0\0\15\7\0\0\0.\0\0\20^\0\0{a\0\0yN\0\0$\22\0\0\1\36\0\0\2""7\0\0\24[\0"
-  "\0mM\0\0N\37\0\0\13\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\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\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\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\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\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\21\0\0\1K\0\0"
-  "+m\0\0\255k\0\0\177A\0\0\24\12\0\0\0\0\0\0\0>\0\0\20r\0\0\227r\0\0\233B\0"
-  "\0\24\5\0\0\0%\0\0\6c\0\0[i\0\0\242J\0\0""2\23\0\0\2\2\0\0\0\25\0\0\3$\0"
-  "\0\17\30\0\0\10\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\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\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\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\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\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\17\0\0\0G"
-  "\0\0\32i\0\0\201s\0\0\263Z\0\0""9\30\0\0\1\0\0\0\0;\0\0\13i\0\0{s\0\0\256"
-  "K\0\0\40\6\0\0\0\24\0\0\1A\0\0\34C\0\0""0\40\0\0\17\4\0\0\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\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\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\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\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\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\12\0\0"
-  "\0'\0\0\5a\0\0Jm\0\0\255^\0\0S,\0\0\4\10\0\0\0&\0\0\5Z\0\0BU\0\0f\"\0\0\12"
-  "\3\0\0\0\0\0\0\0\23\0\0\3\24\0\0\6\4\0\0\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\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\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\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\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\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\15\0\0"
-  "\1M\0\0!j\0\0\231f\0\0{1\0\0\14\23\0\0\0\22\0\0\1""0\0\0\15\23\0\0\4!\0\0"
-  "\12#\0\0\7\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\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\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\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\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\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\14\0\0"
-  "\0>\0\0\20^\0\0j^\0\0\202H\0\0\36\22\0\0\1\0\0\0\0\14\0\0\3H\0\0""9M\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\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\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\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\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\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"
-  "\37\0\0\4R\0\0<b\0\0\223T\0\0""8'\0\0\4\4\0\0\0\40\0\0\5\"\0\0\7\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\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"
-  "\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\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\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\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"
-  "\30\0\0\1B\0\0\31j\0\0\237e\0\0j)\0\0\7\7\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\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\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\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\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\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\0\0\0\12"
-  "\0\0\0:\0\0\17d\0\0uV\0\0`.\0\0\15\11\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\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\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\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\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\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\0\0\0\0\0\0"
-  "\0!\0\0\4K\0\0/,\0\0\16\12\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",
-};
-
diff --git a/src/gui/window.cpp b/src/gui/window.cpp
deleted file mode 100644 (file)
index 9b2358b..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// Window class
-//
-// by James L. Hammons
-//
-
-#include "window.h"
-
-#include "guimisc.h"
-
-Window::Window(uint32 x/*= 0*/, uint32 y/*= 0*/, uint32 w/*= 0*/, uint32 h/*= 0*/,
-       void (* f)(Element *)/*= NULL*/): Element(x, y, w, h),
-//                     /*clicked(false), inside(false),*/ fgColor(0x4FF0), bgColor(0x1E10),
-//4FF0 -> 010011 11111 10000 -> 0100 1101 1111 1111 1000 0100 -> 4D FF 84
-//1E10 -> 000111 10000 10000 -> 0001 1111 1000 0100 1000 0100 -> 1F 84 84
-       /*clicked(false), inside(false),*/ fgColor(0xFF84FF4D), bgColor(0xFF84841F),
-       handler(f)
-{
-       close = new Button(w - (CLOSEBOX_WIDTH + 1), 1, closeBox, closeBoxHover, closeBoxDown);
-       list.push_back(close);
-       close->SetNotificationElement(this);
-}
-
-Window::~Window()
-{
-       for(uint32 i=0; i<list.size(); i++)
-               if (list[i])
-                       delete list[i];
-}
-
-void Window::HandleKey(SDLKey key)
-{
-       if (key == SDLK_ESCAPE)
-       {
-               SDL_Event event;
-               event.type = SDL_USEREVENT, event.user.code = WINDOW_CLOSE;
-               SDL_PushEvent(&event);
-       }
-
-       // Handle the items this window contains...
-       for(uint32 i=0; i<list.size(); i++)
-               // Make coords relative to upper right corner of this window...
-               list[i]->HandleKey(key);
-}
-
-void Window::HandleMouseMove(uint32 x, uint32 y)
-{
-       // Handle the items this window contains...
-       for(uint32 i=0; i<list.size(); i++)
-               // Make coords relative to upper right corner of this window...
-               list[i]->HandleMouseMove(x - extents.x, y - extents.y);
-}
-
-void Window::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
-{
-       // Handle the items this window contains...
-       for(uint32 i=0; i<list.size(); i++)
-               // Make coords relative to upper right corner of this window...
-               list[i]->HandleMouseButton(x - extents.x, y - extents.y, mouseDown);
-}
-
-void Window::Draw(uint32 offsetX/*= 0*/, uint32 offsetY/*= 0*/)
-{
-       uint32 addr = (extents.x + offsetX) + ((extents.y + offsetY) * pitch);
-
-       for(uint32 y=0; y<extents.h; y++)
-       {
-               for(uint32 x=0; x<extents.w; x++)
-               {
-                       // Doesn't clip in y axis! !!! FIX !!!
-                       if (extents.x + x < pitch)
-                               screenBuffer[addr + x + (y * pitch)] = bgColor;
-               }
-       }
-
-       // Handle the items this window contains...
-       for(uint32 i=0; i<list.size(); i++)
-               list[i]->Draw(extents.x, extents.y);
-}
-
-void Window::AddElement(Element * e)
-{
-       list.push_back(e);
-}
-
-void Window::Notify(Element * e)
-{
-       if (e == close)
-       {
-               SDL_Event event;
-               event.type = SDL_USEREVENT, event.user.code = WINDOW_CLOSE;
-               SDL_PushEvent(&event);
-       }
-}
diff --git a/src/gui/window.h b/src/gui/window.h
deleted file mode 100644 (file)
index 2686ff7..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-//
-// Window class
-//
-// by James L. Hammons
-
-#ifndef __WINDOW_H__
-#define __WINDOW_H__
-
-#include <vector>
-#include "button.h"
-#include "element.h"
-
-class Window: public Element
-{
-       public:
-               Window(uint32 x = 0, uint32 y = 0, uint32 w = 0, uint32 h = 0,
-                       void (* f)(Element *) = NULL);
-               virtual ~Window();
-               virtual void HandleKey(SDLKey key);
-               virtual void HandleMouseMove(uint32 x, uint32 y);
-               virtual void HandleMouseButton(uint32 x, uint32 y, bool mouseDown);
-               virtual void Draw(uint32 offsetX = 0, uint32 offsetY = 0);
-               virtual void Notify(Element * e);
-               void AddElement(Element * e);
-
-       protected:
-               uint32 fgColor, bgColor;
-               void (* handler)(Element *);
-               Button * close;
-               // We have to use a list of Element *pointers* because we can't make a
-               // list that will hold all the different object types in the same list...
-               std::vector<Element *> list;
-};
-
-#endif // __WINDOW_H__
index facaa12577ceedd4fef7af5f7b6e40552e688cbd..f893964f6e730ebe98ce772337ae5e7132613b5f 100644 (file)
@@ -5,7 +5,7 @@
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Carwin Jones (BeOS)
 // Cleanups and endian wrongness amelioration by James L. Hammons
 // Note: Endian wrongness probably stems from the MAME origins of this emu and
-//       the braindead way in which MAME handles memory. :-)
+//       the braindead way in which MAME handled memory when this was written. :-)
 //
 // JLH = James L. Hammons
 //
 #include "eeprom.h"
 #include "event.h"
 #include "gpu.h"
-#include "gui.h"
 #include "jerry.h"
 #include "joystick.h"
 #include "log.h"
 #include "m68k.h"
-#include "memory.h"
+//#include "memory.h"
 #include "mmu.h"
 #include "settings.h"
 #include "tom.h"
-#include "video.h"
 
 #define CPU_DEBUG
 //Do this in makefile??? Yes! Could, but it's easier to define here...
@@ -60,26 +58,14 @@ extern int effect_start;
 extern int effect_start2, effect_start3, effect_start4, effect_start5, effect_start6;
 #endif
 
-// Memory debugging identifiers
-
-const char * whoName[9] =
-       { "Unknown", "Jaguar", "DSP", "GPU", "TOM", "JERRY", "M68K", "Blitter", "OP" };
-
 uint32 jaguar_active_memory_dumps = 0;
 
 uint32 jaguarMainROMCRC32, jaguarROMSize, jaguarRunAddress;
 
-uint8 jaguarMainRAM[0x400000];                                         // 68K CPU RAM
-uint8 jaguarMainROM[0x600000];                                         // 68K CPU ROM
-uint8 jaguarBootROM[0x040000];                                         // 68K CPU BIOS ROM--uses only half of this!
-uint8 jaguarCDBootROM[0x040000];                                       // 68K CPU CD BIOS ROM
 bool BIOSLoaded = false;
 bool CDBIOSLoaded = false;
 
-//uint8 cdRAM[0x100];
-uint8 * cdRAM = &jaguarMainROM[0x5FFF00];
-uint8 tomRAM[0x4000];
-uint8 jerryRAM[0x10000];
+uint32 * backbuffer;
 
 #ifdef CPU_DEBUG_MEMORY
 uint8 writeMemMax[0x400000], writeMemMin[0x400000];
@@ -805,7 +791,7 @@ int irq_ack_handler(int level)
        return vector;
 }
 
-#define USE_NEW_MMU
+//#define USE_NEW_MMU
 
 unsigned int m68k_read_memory_8(unsigned int address)
 {
@@ -1065,8 +1051,8 @@ if (address == 0xF02110)
                WriteLog("\tA0=%08X, A1=%08X, D0=%08X, D1=%08X\n",
                        m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1),
                        m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1));
-       }
 #endif
+       }
 #else
        MMUWrite16(address, value, M68K);
 #endif
@@ -1905,7 +1891,8 @@ void ScanlineCallback(void)
 //     if (vc == vbb)
        {
                JoystickExec();
-               RenderBackbuffer();
+//We comment this out so that the GUI can manage this instead. Which is how it should be anyway.
+//             RenderBackbuffer();
                TOMResetBackbuffer(backbuffer);
                frameDone = true;
        }//*/
@@ -1922,7 +1909,7 @@ void ScanlineCallback(void)
 // This isn't currently used, but maybe it should be...
 void RenderCallback(void)
 {
-       RenderBackbuffer();
+//     RenderBackbuffer();
        TOMResetBackbuffer(backbuffer);
 //     SetCallbackTime(RenderCallback, 33303.082);     // # Scanlines * scanline time
        SetCallbackTime(RenderCallback, 16651.541);     // # Scanlines * scanline time
index 96d7b4c78a70c173bbcb2e4323d53b16b64c2f02..6342d455caf92f0ea22f2d266125d1b908770171 100644 (file)
@@ -2,6 +2,7 @@
 #define __JAGUAR_H__
 
 #include "types.h"
+#include "memory.h"                                                    // For "UNKNOWN" enum
 
 void JaguarInit(void);
 void JaguarReset(void);
@@ -23,33 +24,12 @@ void JaguarExecuteNew(void);
 
 // Exports from JAGUAR.CPP
 
-extern uint8 jaguarMainRAM[];
-extern uint8 jaguarMainROM[];
-extern uint8 jaguarBootROM[];
-extern uint8 jaguarCDBootROM[];
 extern bool BIOSLoaded;
 extern bool CDBIOSLoaded;
 extern int32 jaguarCPUInExec;
 extern uint32 jaguarMainROMCRC32, jaguarROMSize, jaguarRunAddress;
 extern char * jaguarEepromsPath;
-extern const char * whoName[9];
-
-// Some handy macros to help converting native endian to big endian (jaguar native)
-// & vice versa
-
-#define SET64(r, a, v)         r[(a)] = ((v) & 0xFF00000000000000) >> 56, r[(a)+1] = ((v) & 0x00FF000000000000) >> 48, \
-                                               r[(a)+2] = ((v) & 0x0000FF0000000000) >> 40, r[(a)+3] = ((v) & 0x000000FF00000000) >> 32, \
-                                               r[(a)+4] = ((v) & 0xFF000000) >> 24, r[(a)+5] = ((v) & 0x00FF0000) >> 16, \
-                                               r[(a)+6] = ((v) & 0x0000FF00) >> 8, r[(a)+7] = (v) & 0x000000FF
-#define GET64(r, a)            (((uint64)r[(a)] << 56) | ((uint64)r[(a)+1] << 48) | \
-                                               ((uint64)r[(a)+2] << 40) | ((uint64)r[(a)+3] << 32) | \
-                                               ((uint64)r[(a)+4] << 24) | ((uint64)r[(a)+5] << 16) | \
-                                               ((uint64)r[(a)+6] << 8) | (uint64)r[(a)+7])
-#define SET32(r, a, v) r[(a)] = ((v) & 0xFF000000) >> 24, r[(a)+1] = ((v) & 0x00FF0000) >> 16, \
-                                               r[(a)+2] = ((v) & 0x0000FF00) >> 8, r[(a)+3] = (v) & 0x000000FF
-#define GET32(r, a)            ((r[(a)] << 24) | (r[(a)+1] << 16) | (r[(a)+2] << 8) | r[(a)+3])
-#define SET16(r, a, v) r[(a)] = ((v) & 0xFF00) >> 8, r[(a)+1] = (v) & 0xFF
-#define GET16(r, a)            ((r[(a)] << 8) | r[(a)+1])
+extern uint32 * backbuffer;
 
 // Various clock rates
 
@@ -63,6 +43,12 @@ extern const char * whoName[9];
 #define ASSERT_LINE            1
 #define CLEAR_LINE             0
 
+// Video stuff (should go in tom.h?)
+
+#define VIRTUAL_SCREEN_WIDTH            320
+#define VIRTUAL_SCREEN_HEIGHT_NTSC      240
+#define VIRTUAL_SCREEN_HEIGHT_PAL       256
+
 //Temp debug stuff (will go away soon, so don't depend on these)
 
 void DumpMainMemory(void);
index 8603b90101756e660e48392c8e88b53e729df66c..671b08afdf2741458bf359dec086d345fc45ac3b 100644 (file)
 #include "jaguar.h"
 #include "joystick.h"
 #include "log.h"
+//#include "memory.h"
 #include "wavetable.h"
 
 //Note that 44100 Hz requires samples every 22.675737 usec.
@@ -428,7 +429,7 @@ void JERRYInit(void)
 //This should be handled with the cart initialization...
 //     eeprom_init();
 //     memory_malloc_secure((void **)&jerry_ram_8, 0x10000, "JERRY RAM/ROM");
-       memcpy(&jerry_ram_8[0xD000], wave_table, 0x1000);
+       memcpy(&jerry_ram_8[0xD000], waveTableROM, 0x1000);
 
        JERRYPIT1Prescaler = 0xFFFF;
        JERRYPIT2Prescaler = 0xFFFF;
index 684b55f23f3ec812057b0a602185e827a2e9523b..fd008d9355581c4f9a9cf12b522f98f2021ffd15 100644 (file)
@@ -5,7 +5,8 @@
 #ifndef __JERRY_H__
 #define __JERRY_H__
 
-#include "types.h"
+//#include "types.h"
+#include "memory.h"
 
 void JERRYInit(void);
 void JERRYReset(void);
index 9fe2197a276dbf14e5caebc7ac03e44239bed4d8..dc498d02134d87aeaeca92acb5d01185e8ef3203 100644 (file)
@@ -4,6 +4,13 @@
 // by cal2
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Cleanups/fixes by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
 //
 
 #include "joystick.h"
 #include <SDL.h>
 #include <time.h>
 #include "gpu.h"
-#include "gui.h"
 #include "jaguar.h"
 #include "log.h"
 #include "settings.h"
-#include "video.h"
-
-#define BUTTON_U               0
-#define BUTTON_D               1
-#define BUTTON_L               2
-#define BUTTON_R               3
-#define BUTTON_s               4
-#define BUTTON_7               5
-#define BUTTON_4               6
-#define BUTTON_1               7
-#define BUTTON_0               8
-#define BUTTON_8               9
-#define BUTTON_5               10
-#define BUTTON_2               11
-#define BUTTON_d               12
-#define BUTTON_9               13
-#define BUTTON_6               14
-#define BUTTON_3               15
-
-#define BUTTON_A               16
-#define BUTTON_B               17
-#define BUTTON_C               18
-#define BUTTON_OPTION  19
-#define BUTTON_PAUSE   20
 
 // Global vars
 
 static uint8 joystick_ram[4];
-static uint8 joypad_0_buttons[21];
-static uint8 joypad_1_buttons[21];
+uint8 joypad_0_buttons[21];
+uint8 joypad_1_buttons[21];
+
+bool keyBuffer[21];
+
+SDL_Joystick * joystick1;
+
 //extern bool finished;
 ////extern bool showGUI;
 bool GUIKeyHeld = false;
@@ -72,22 +59,24 @@ void JoystickInit(void)
 
 void JoystickExec(void)
 {
-       uint8 * keystate = SDL_GetKeyState(NULL);
+//     uint8 * keystate = SDL_GetKeyState(NULL);
 
-       memset(joypad_0_buttons, 0, 21);
-       memset(joypad_1_buttons, 0, 21);
+//     memset(joypad_0_buttons, 0, 21);
+//     memset(joypad_1_buttons, 0, 21);
        gpu_start_log = 0;                                                      // Only log while key down!
        effect_start = 0;
        effect_start2 = effect_start3 = effect_start4 = effect_start5 = effect_start6 = 0;
        blit_start_log = 0;
        iLeft = iRight = false;
 
+#if 0
        if ((keystate[SDLK_LALT] || keystate[SDLK_RALT]) & keystate[SDLK_RETURN])
                ToggleFullscreen();
 
        // Keybindings in order of U, D, L, R, C, B, A, Op, Pa, 0-9, #, *
 //     vjs.p1KeyBindings[0] = sdlemu_getval_int("p1k_up", SDLK_UP);
 
+#if 0
        if (keystate[vjs.p1KeyBindings[0]])
                joypad_0_buttons[BUTTON_U] = 0x01;
        if (keystate[vjs.p1KeyBindings[1]])
@@ -133,12 +122,62 @@ void JoystickExec(void)
                joypad_0_buttons[BUTTON_s] = 0x01;
        if (keystate[vjs.p1KeyBindings[20]])
                joypad_0_buttons[BUTTON_d] = 0x01;
+#else
+       if (keyBuffer[0])
+               joypad_0_buttons[BUTTON_U] = 0x01;
+       if (keyBuffer[1])
+               joypad_0_buttons[BUTTON_D] = 0x01;
+       if (keyBuffer[2])
+               joypad_0_buttons[BUTTON_L] = 0x01;
+       if (keyBuffer[3])
+               joypad_0_buttons[BUTTON_R] = 0x01;
+       // The buttons are labelled C,B,A on the controller (going from left to right)
+       if (keyBuffer[4])
+               joypad_0_buttons[BUTTON_C] = 0x01;
+       if (keyBuffer[5])
+               joypad_0_buttons[BUTTON_B] = 0x01;
+       if (keyBuffer[6])
+               joypad_0_buttons[BUTTON_A] = 0x01;
+//I may yet move these to O and P...
+       if (keyBuffer[7])
+               joypad_0_buttons[BUTTON_OPTION] = 0x01;
+       if (keyBuffer[8])
+               joypad_0_buttons[BUTTON_PAUSE] = 0x01;
+
+       if (keyBuffer[9])
+               joypad_0_buttons[BUTTON_0] = 0x01;
+       if (keyBuffer[10])
+               joypad_0_buttons[BUTTON_1] = 0x01;
+       if (keyBuffer[11])
+               joypad_0_buttons[BUTTON_2] = 0x01;
+       if (keyBuffer[12])
+               joypad_0_buttons[BUTTON_3] = 0x01;
+       if (keyBuffer[13])
+               joypad_0_buttons[BUTTON_4] = 0x01;
+       if (keyBuffer[14])
+               joypad_0_buttons[BUTTON_5] = 0x01;
+       if (keyBuffer[15])
+               joypad_0_buttons[BUTTON_6] = 0x01;
+       if (keyBuffer[16])
+               joypad_0_buttons[BUTTON_7] = 0x01;
+       if (keyBuffer[17])
+               joypad_0_buttons[BUTTON_8] = 0x01;
+       if (keyBuffer[18])
+               joypad_0_buttons[BUTTON_9] = 0x01;
+       if (keyBuffer[19])
+               joypad_0_buttons[BUTTON_s] = 0x01;
+       if (keyBuffer[20])
+               joypad_0_buttons[BUTTON_d] = 0x01;
+#endif
 
-       extern bool debounceRunKey;
+#warning "!!! FIX !!! (debounceRunKey)"
+//     extern bool debounceRunKey;
+       bool debounceRunKey;
     if (keystate[SDLK_ESCAPE])
     {
                if (!debounceRunKey)
-               finished = true;
+#warning "!!! FIX !!! (finished = true)"
+;//            finished = true;
     }
     else
                debounceRunKey = false;
@@ -146,7 +185,8 @@ void JoystickExec(void)
        if (keystate[SDLK_TAB])
        {
                if (!GUIKeyHeld)
-                       showGUI = !showGUI, GUIKeyHeld = true;
+#warning "!!! FIX !!! (showGUI = !showGUI, ...)"
+;//                    showGUI = !showGUI, GUIKeyHeld = true;
        }
        else
                GUIKeyHeld = false;
@@ -228,14 +268,28 @@ void JoystickExec(void)
        }
        else
                bssHeld = false;
+#endif
+       // We need to ensure that illegal combinations are not possible.
+       // So, we do a simple minded way here...
+       // It would be better to check to see which one was pressed last
+       // and discard that one, but for now...
+//This didn't work... Was still able to do bad combination.
+//It's because the GUI is changing this *after* we fix it here.
+#if 0
+       if (joypad_0_buttons[BUTTON_R] && joypad_0_buttons[BUTTON_L])
+               joypad_0_buttons[BUTTON_L] = 0;
+
+       if (joypad_0_buttons[BUTTON_U] && joypad_0_buttons[BUTTON_D])
+               joypad_0_buttons[BUTTON_D] = 0;
+#endif
 
        // Joystick support [nwagenaar]
 
     if (vjs.useJoystick)
     {
-               extern SDL_Joystick * joystick;
-               int16 x = SDL_JoystickGetAxis(joystick, 0),
-                       y = SDL_JoystickGetAxis(joystick, 1);
+               extern SDL_Joystick * joystick1;
+               int16 x = SDL_JoystickGetAxis(joystick1, 0),
+                       y = SDL_JoystickGetAxis(joystick1, 1);
 
                if (x > 16384)
                        joypad_0_buttons[BUTTON_R] = 0x01;
@@ -246,11 +300,11 @@ void JoystickExec(void)
                if (y < -16384)
                        joypad_0_buttons[BUTTON_U] = 0x01;
 
-               if (SDL_JoystickGetButton(joystick, 0) == SDL_PRESSED)
+               if (SDL_JoystickGetButton(joystick1, 0) == SDL_PRESSED)
                        joypad_0_buttons[BUTTON_A] = 0x01;
-               if (SDL_JoystickGetButton(joystick, 1) == SDL_PRESSED)
+               if (SDL_JoystickGetButton(joystick1, 1) == SDL_PRESSED)
                        joypad_0_buttons[BUTTON_B] = 0x01;
-               if (SDL_JoystickGetButton(joystick, 2) == SDL_PRESSED)
+               if (SDL_JoystickGetButton(joystick1, 2) == SDL_PRESSED)
                        joypad_0_buttons[BUTTON_C] = 0x01;
        }
 
index d56c080387668fcdabba62743fd3a85ee0b04b65..98eb9775eaa2eed9ae53817d706fe718313da6ea 100644 (file)
@@ -7,6 +7,30 @@
 
 #include "types.h"
 
+enum { BUTTON_FIRST = 0, BUTTON_U = 0,
+BUTTON_D = 1,
+BUTTON_L = 2,
+BUTTON_R = 3,
+
+BUTTON_s = 4,
+BUTTON_7 = 5,
+BUTTON_4 = 6,
+BUTTON_1 = 7,
+BUTTON_0 = 8,
+BUTTON_8 = 9,
+BUTTON_5 = 10,
+BUTTON_2 = 11,
+BUTTON_d = 12,
+BUTTON_9 = 13,
+BUTTON_6 = 14,
+BUTTON_3 = 15,
+
+BUTTON_A = 16,
+BUTTON_B = 17,
+BUTTON_C = 18,
+BUTTON_OPTION = 19,
+BUTTON_PAUSE = 20, BUTTON_LAST = 20 };
+
 void JoystickInit(void);
 void JoystickReset(void);
 void JoystickDone(void);
@@ -16,4 +40,7 @@ uint8 JoystickReadByte(uint32);
 uint16 JoystickReadWord(uint32);
 void JoystickExec(void);
 
+extern bool keyBuffer[];
+extern uint8 joypad_0_buttons[];
+extern uint8 joypad_1_buttons[];
 #endif
index 5b2f76317f49b08b1d5433fe37a6a739dc143912..76c0aa98cd83ca5d900d0113a0e8a83e2d1c3165 100644 (file)
@@ -4,6 +4,13 @@
 // Originally by David Raingeard (Cal2)
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Cleanups/new stuff by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
 //
 
 #include "log.h"
index 9cff768f35c6436c403fb92a9343ee39062c5b12..f37168ba9db9cb04bdecc06cbc8fb0a9079aeef8 100644 (file)
 //
-// Memory handler
+// Jaguar memory and I/O physical (hosted!) memory
 //
-// by David Raingeard (Cal2)
-// GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
-// Cleanups by James L. Hammons
+// by James L. Hammons
+//
+// JLH = James L. Hammons
+//
+// WHO  WHEN        WHAT
+// ---  ----------  -----------------------------------------------------------
+// JLH  12/10/2009  Repurposed this file. :-)
 //
 
-#include "memory.h"
-
-#include <malloc.h>
-#include <stdlib.h>
-#include "log.h"
-
-#warning This module needs some serious cleanup. !!! FIX !!!
-
-// Useful structs (for doubly linked list in this case)
-
-typedef struct sMemBlockInfo
-{
-       void * ptr;
-       const char * info;
-       uint32 size;
-       sMemBlockInfo * next;
-       sMemBlockInfo * prev;
-} sMemBlockInfo;
-
-// Private global variables
-
-static sMemBlockInfo memoryInfo;
-//static uint32 memoryMaxAllocated;
-static uint32 currentAllocatedMemory;
-static uint32 maximumAllocatedMemory;
-
-
-void memory_addMemInfo(void * ptr, uint32 size, const char * info)
-{
-       sMemBlockInfo * alias = &memoryInfo;
+/*
+$FFFFFF => 16,777,215
+$A00000 => 10,485,760
+
+Really, just six megabytes short of using the entire address space...
+Why not? We could just allocate the entire space and then use the MMU code to do
+things like call functions and whatnot...
+In other words, read/write would just tuck the value into the host RAM space and
+the I/O function would take care of any weird stuff...
+
+Actually: writes would tuck in the value, but reads would have to be handled
+correctly since some registers do not fall on the same address as far as reading
+goes... Still completely doable though. :-)
+*/
 
-       while (alias->next)
-               alias = alias->next;
+#include "memory.h"
 
-       alias->next = (sMemBlockInfo *)malloc(sizeof(sMemBlockInfo));
+uint8 jagMemSpace[0xF20000];                                   // The entire memory space of the Jaguar...!
 
-       if (alias->next == NULL)
-       {
-               exit(0);
-               return;
-       }
-
-       alias->next->prev = alias;
-       alias = alias->next;
-       alias->next = NULL;
-       alias->size = size;
-       alias->ptr = ptr;
-       alias->info = info;
-}
+uint8 * jaguarMainRAM = &jagMemSpace[0x000000];
+uint8 * jaguarMainROM = &jagMemSpace[0x800000];
+uint8 * cdRAM         = &jagMemSpace[0xDFFF00];
+uint8 * gpuRAM        = &jagMemSpace[0xF03000];
+uint8 * dspRAM        = &jagMemSpace[0xF1B000];
 
-void MemoryInit(void)
-{
-       memoryInfo.next = memoryInfo.prev = NULL;
-       currentAllocatedMemory = maximumAllocatedMemory = 0;
-}
+uint8 jaguarBootROM[0x040000];                                 // 68K CPU BIOS ROM--uses only half of this!
+uint8 jaguarCDBootROM[0x040000];                               // 68K CPU CD BIOS ROM (256K)
+uint8 jaguarDevBootROM1[0x040000];                             // 68K CPU Stubulator 1 ROM--uses only half of this!
+uint8 jaguarDevBootROM2[0x040000];                             // 68K CPU Stubulator 2 ROM--uses only half of this!
+uint8 jaguarDevCDBootROM[0x040000];                            // 68K CPU Dev CD BIOS ROM (256K)
 
-void MemoryDone(void)
-{
-}
 
-void * memory_malloc(uint32 size, const char * info)
+#if 0
+union Word
 {
-       void * ptr = (void *)malloc(size);
-
-       if (ptr == NULL)
-               return NULL;
-
-       memory_addMemInfo(ptr, size, info);
-       currentAllocatedMemory += size;
-
-       if (currentAllocatedMemory > maximumAllocatedMemory)
-               maximumAllocatedMemory = currentAllocatedMemory;
-
-       return ptr;
-}
-
-// OK, this sux, causes the compiler to complain about type punned pointers.
-// The only difference between this and the previous is that this one ABORTS
-// if it can't allocate the memory. BAD BAD BAD
-
-void memory_malloc_secure(void ** new_ptr, uint32 size, const char * info)
+       uint16 word;
+       struct {
+               // This changes depending on endianness...
+#ifdef __BIG_ENDIAN__
+               uint8 hi, lo;                                                   // Big endian
+#else
+               uint8 lo, hi;                                                   // Little endian
+#endif
+       };
+};
+#endif
+
+#if 0
+union DWord
 {
-       WriteLog("Memory: Allocating %i bytes of memory for <%s>...", size, (info == NULL ? "unknown" : info));
-
-       void * ptr = malloc(size);
-
-       if (ptr == NULL)
+       uint32 dword;
+       struct
        {
-               WriteLog("Failed!\n");
-               LogDone();
-
-#warning BAD, BAD, BAD! Need to do better than this!!!
-#warning And since we ARE keeping track of all memory allocations, we should unwind the stack here as well...!
-#warning !!! FIX !!!
-
-               exit(0);
-       }
-
-       memory_addMemInfo(ptr, size, info);
-       currentAllocatedMemory += size;
-
-       if (currentAllocatedMemory > maximumAllocatedMemory)
-               maximumAllocatedMemory = currentAllocatedMemory;
-
-       *new_ptr = ptr;
-       WriteLog("OK\n");
-}
-
-/*
-void * memory_malloc_secure2(uint32 size, const char * info)
+#ifdef __BIG_ENDIAN__
+               uint16 hiw, low;
+#else
+               uint16 low, hiw;
+#endif
+       };
+};
+#endif
+
+#if 0
+static void test(void)
 {
-       WriteLog("Memory: Allocating %i bytes of memory for <%s>...", size, (info == NULL ? "unknown" : info));
-
-       void * ptr = malloc(size);
-
-       if (ptr == NULL)
-       {
-               WriteLog("Failed!\n");
-               log_done();
-
-//BAD, BAD, BAD! Need to do better than this!!!
-//And since we ARE keeping track of all memory allocations, we should unwind the stack here as well...!
-// !!! FIX !!!
-
-               exit(0);
-       }
-
-       memory_addMemInfo(ptr, size, info);
-       currentAllocatedMemory += size;
-
-       if (currentAllocatedMemory > maximumAllocatedMemory)
-               maximumAllocatedMemory = currentAllocatedMemory;
-
-       new_ptr = ptr;
-       WriteLog("OK\n");
+       Word reg;
+       reg.word = 0x1234;
+       reg.lo = 0xFF;
+       reg.hi = 0xEE;
+
+       DWord reg2;
+       reg2.hiw = 0xFFFE;
+       reg2.low = 0x3322;
+       reg2.low.lo = 0x11;
 }
-*/
-
-void memory_free(void * ptr)
+#endif
+
+// OR, we could do like so:
+#if 0
+#ifdef __BIG_ENDIAN__
+#define DWORD_BYTE_HWORD_H 1
+#define DWORD_BYTE_HWORD_L 2
+#define DWORD_BYTE_LWORD_H 3
+#define DWORD_BYTE_LWORD_L 4
+#else
+#define DWORD_BYTE_HWORD_H 4
+#define DWORD_BYTE_HWORD_L 3
+#define DWORD_BYTE_LWORD_H 2
+#define DWORD_BYTE_LWORD_L 1
+#endif
+// But this starts to get cumbersome after a while... Is union really better?
+
+//More union stuff...
+unsigned long ByteSwap1 (unsigned long nLongNumber)
 {
-//     sMemBlockInfo * alias= &memoryInfo;
-//     alias = alias->next;
-       sMemBlockInfo * alias= memoryInfo.next;
-
-       while (alias->ptr != ptr)
-               alias = alias->next;
-
-       WriteLog("Memory: Freeing %i bytes from <%s>...\n", (int)alias->size, alias->info);
-
-       free(ptr);
-       currentAllocatedMemory -= alias->size;
-       alias->prev->next = alias->next;
-
-       if (alias->next != NULL)
-               alias->next->prev = alias->prev;
-
-       free(alias);
+   union u {unsigned long vi; unsigned char c[sizeof(unsigned long)];};
+   union v {unsigned long ni; unsigned char d[sizeof(unsigned long)];};
+   union u un;
+   union v vn;
+   un.vi = nLongNumber;
+   vn.d[0]=un.c[3];
+   vn.d[1]=un.c[2];
+   vn.d[2]=un.c[1];
+   vn.d[3]=un.c[0];
+   return (vn.ni);
 }
+#endif
+
+//Not sure if this is a good approach yet...
+//should be if we use proper aliasing, and htonl and friends...
+#if 1
+uint32 & butch     = *((uint32 *)&jagMemSpace[0xDFFF00]);      // base of Butch == interrupt control register, R/W
+uint32 & dscntrl   = *((uint32 *)&jagMemSpace[0xDFFF04]);      // DSA control register, R/W
+uint16 & ds_data   = *((uint16 *)&jagMemSpace[0xDFFF0A]);      // DSA TX/RX data, R/W
+uint32 & i2cntrl   = *((uint32 *)&jagMemSpace[0xDFFF10]);      // i2s bus control register, R/W
+uint32 & sbcntrl   = *((uint32 *)&jagMemSpace[0xDFFF14]);      // CD subcode control register, R/W
+uint32 & subdata   = *((uint32 *)&jagMemSpace[0xDFFF18]);      // Subcode data register A
+uint32 & subdatb   = *((uint32 *)&jagMemSpace[0xDFFF1C]);      // Subcode data register B
+uint32 & sb_time   = *((uint32 *)&jagMemSpace[0xDFFF20]);      // Subcode time and compare enable (D24)
+uint32 & fifo_data = *((uint32 *)&jagMemSpace[0xDFFF24]);      // i2s FIFO data
+uint32 & i2sdat2   = *((uint32 *)&jagMemSpace[0xDFFF28]);      // i2s FIFO data (old)
+uint32 & unknown   = *((uint32 *)&jagMemSpace[0xDFFF2C]);      // Seems to be some sort of I2S interface
+#else
+uint32 butch, dscntrl, ds_data, i2cntrl, sbcntrl, subdata, subdatb, sb_time, fifo_data, i2sdat2, unknown;
+#endif
+
+#warning "Need to separate out this stuff (or do we???)"
+//if we use a contiguous memory space, we don't need this shit...
+//err, maybe we do, let's not be so hasty now... :-)
+
+//#define ENDIANSAFE(x) htonl(x)
+
+// The nice thing about doing it this way is that on big endian machines, htons/l
+// compile to nothing and on Intel machines, it compiles down to a single bswap instruction.
+// So endianness issues go away nicely without a lot of drama. :-D
+
+#define BSWAP16(x) (htons(x))
+#define BSWAP32(x) (htonl(x))
+//this isn't endian safe...
+#define BSWAP64(x) ((htonl(x & 0xFFFFFFFF) << 32) | htonl(x >> 32))
+// Actually, we use ESAFExx() macros instead of this, and we use GCC to check the endianness...
+// Actually, considering that "byteswap.h" doesn't exist elsewhere, the above
+// is probably our best bet here. Just need to rename them to ESAFExx().
+
+uint16 & memcon1   = *((uint16 *)&jagMemSpace[0xF00000]);
+uint16 & memcon2   = *((uint16 *)&jagMemSpace[0xF00002]);
+uint16 & hc        = *((uint16 *)&jagMemSpace[0xF00004]);
+uint16 & vc        = *((uint16 *)&jagMemSpace[0xF00006]);
+uint16 & lph       = *((uint16 *)&jagMemSpace[0xF00008]);
+uint16 & lpv       = *((uint16 *)&jagMemSpace[0xF0000A]);
+uint64 & obData    = *((uint64 *)&jagMemSpace[0xF00010]);
+uint32 & olp       = *((uint32 *)&jagMemSpace[0xF00020]);
+uint16 & obf       = *((uint16 *)&jagMemSpace[0xF00026]);
+uint16 & vmode     = *((uint16 *)&jagMemSpace[0xF00028]);
+uint16 & bord1     = *((uint16 *)&jagMemSpace[0xF0002A]);
+uint16 & bord2     = *((uint16 *)&jagMemSpace[0xF0002C]);
+uint16 & hp        = *((uint16 *)&jagMemSpace[0xF0002E]);
+uint16 & hbb       = *((uint16 *)&jagMemSpace[0xF00030]);
+uint16 & hbe       = *((uint16 *)&jagMemSpace[0xF00032]);
+uint16 & hs        = *((uint16 *)&jagMemSpace[0xF00034]);
+uint16 & hvs       = *((uint16 *)&jagMemSpace[0xF00036]);
+uint16 & hdb1      = *((uint16 *)&jagMemSpace[0xF00038]);
+uint16 & hdb2      = *((uint16 *)&jagMemSpace[0xF0003A]);
+uint16 & hde       = *((uint16 *)&jagMemSpace[0xF0003C]);
+uint16 & vp        = *((uint16 *)&jagMemSpace[0xF0003E]);
+uint16 & vbb       = *((uint16 *)&jagMemSpace[0xF00040]);
+uint16 & vbe       = *((uint16 *)&jagMemSpace[0xF00042]);
+uint16 & vs        = *((uint16 *)&jagMemSpace[0xF00044]);
+uint16 & vdb       = *((uint16 *)&jagMemSpace[0xF00046]);
+uint16 & vde       = *((uint16 *)&jagMemSpace[0xF00048]);
+uint16 & veb       = *((uint16 *)&jagMemSpace[0xF0004A]);
+uint16 & vee       = *((uint16 *)&jagMemSpace[0xF0004C]);
+uint16 & vi        = *((uint16 *)&jagMemSpace[0xF0004E]);
+uint16 & pit0      = *((uint16 *)&jagMemSpace[0xF00050]);
+uint16 & pit1      = *((uint16 *)&jagMemSpace[0xF00052]);
+uint16 & heq       = *((uint16 *)&jagMemSpace[0xF00054]);
+uint32 & bg        = *((uint32 *)&jagMemSpace[0xF00058]);
+uint16 & int1      = *((uint16 *)&jagMemSpace[0xF000E0]);
+uint16 & int2      = *((uint16 *)&jagMemSpace[0xF000E2]);
+uint8  * clut      =   (uint8 *) &jagMemSpace[0xF00400];
+uint8  * lbuf      =   (uint8 *) &jagMemSpace[0xF00800];
+uint32 & g_flags   = *((uint32 *)&jagMemSpace[0xF02100]);
+uint32 & g_mtxc    = *((uint32 *)&jagMemSpace[0xF02104]);
+uint32 & g_mtxa    = *((uint32 *)&jagMemSpace[0xF02108]);
+uint32 & g_end     = *((uint32 *)&jagMemSpace[0xF0210C]);
+uint32 & g_pc      = *((uint32 *)&jagMemSpace[0xF02110]);
+uint32 & g_ctrl    = *((uint32 *)&jagMemSpace[0xF02114]);
+uint32 & g_hidata  = *((uint32 *)&jagMemSpace[0xF02118]);
+uint32 & g_divctrl = *((uint32 *)&jagMemSpace[0xF0211C]);
+uint32 g_remain;                                                               // Dual register with $F0211C
+uint32 & a1_base   = *((uint32 *)&jagMemSpace[0xF02200]);
+uint32 & a1_flags  = *((uint32 *)&jagMemSpace[0xF02204]);
+uint32 & a1_clip   = *((uint32 *)&jagMemSpace[0xF02208]);
+uint32 & a1_pixel  = *((uint32 *)&jagMemSpace[0xF0220C]);
+uint32 & a1_step   = *((uint32 *)&jagMemSpace[0xF02210]);
+uint32 & a1_fstep  = *((uint32 *)&jagMemSpace[0xF02214]);
+uint32 & a1_fpixel = *((uint32 *)&jagMemSpace[0xF02218]);
+uint32 & a1_inc    = *((uint32 *)&jagMemSpace[0xF0221C]);
+uint32 & a1_finc   = *((uint32 *)&jagMemSpace[0xF02220]);
+uint32 & a2_base   = *((uint32 *)&jagMemSpace[0xF02224]);
+uint32 & a2_flags  = *((uint32 *)&jagMemSpace[0xF02228]);
+uint32 & a2_mask   = *((uint32 *)&jagMemSpace[0xF0222C]);
+uint32 & a2_pixel  = *((uint32 *)&jagMemSpace[0xF02230]);
+uint32 & a2_step   = *((uint32 *)&jagMemSpace[0xF02234]);
+uint32 & b_cmd     = *((uint32 *)&jagMemSpace[0xF02238]);
+uint32 & b_count   = *((uint32 *)&jagMemSpace[0xF0223C]);
+uint64 & b_srcd    = *((uint64 *)&jagMemSpace[0xF02240]);
+uint64 & b_dstd    = *((uint64 *)&jagMemSpace[0xF02248]);
+uint64 & b_dstz    = *((uint64 *)&jagMemSpace[0xF02250]);
+uint64 & b_srcz1   = *((uint64 *)&jagMemSpace[0xF02258]);
+uint64 & b_srcz2   = *((uint64 *)&jagMemSpace[0xF02260]);
+uint64 & b_patd    = *((uint64 *)&jagMemSpace[0xF02268]);
+uint32 & b_iinc    = *((uint32 *)&jagMemSpace[0xF02270]);
+uint32 & b_zinc    = *((uint32 *)&jagMemSpace[0xF02274]);
+uint32 & b_stop    = *((uint32 *)&jagMemSpace[0xF02278]);
+uint32 & b_i3      = *((uint32 *)&jagMemSpace[0xF0227C]);
+uint32 & b_i2      = *((uint32 *)&jagMemSpace[0xF02280]);
+uint32 & b_i1      = *((uint32 *)&jagMemSpace[0xF02284]);
+uint32 & b_i0      = *((uint32 *)&jagMemSpace[0xF02288]);
+uint32 & b_z3      = *((uint32 *)&jagMemSpace[0xF0228C]);
+uint32 & b_z2      = *((uint32 *)&jagMemSpace[0xF02290]);
+uint32 & b_z1      = *((uint32 *)&jagMemSpace[0xF02294]);
+uint32 & b_z0      = *((uint32 *)&jagMemSpace[0xF02298]);
+uint16 & jpit1     = *((uint16 *)&jagMemSpace[0xF10000]);
+uint16 & jpit2     = *((uint16 *)&jagMemSpace[0xF10002]);
+uint16 & jpit3     = *((uint16 *)&jagMemSpace[0xF10004]);
+uint16 & jpit4     = *((uint16 *)&jagMemSpace[0xF10006]);
+uint16 & clk1      = *((uint16 *)&jagMemSpace[0xF10010]);
+uint16 & clk2      = *((uint16 *)&jagMemSpace[0xF10012]);
+uint16 & clk3      = *((uint16 *)&jagMemSpace[0xF10014]);
+uint16 & j_int     = *((uint16 *)&jagMemSpace[0xF10020]);
+uint16 & asidata   = *((uint16 *)&jagMemSpace[0xF10030]);
+uint16 & asictrl   = *((uint16 *)&jagMemSpace[0xF10032]);
+uint16 asistat;                                                                        // Dual register with $F10032
+uint16 & asiclk    = *((uint16 *)&jagMemSpace[0xF10034]);
+uint16 & joystick  = *((uint16 *)&jagMemSpace[0xF14000]);
+uint16 & joybuts   = *((uint16 *)&jagMemSpace[0xF14002]);
+uint32 & d_flags   = *((uint32 *)&jagMemSpace[0xF1A100]);
+uint32 & d_mtxc    = *((uint32 *)&jagMemSpace[0xF1A104]);
+uint32 & d_mtxa    = *((uint32 *)&jagMemSpace[0xF1A108]);
+uint32 & d_end     = *((uint32 *)&jagMemSpace[0xF1A10C]);
+uint32 & d_pc      = *((uint32 *)&jagMemSpace[0xF1A110]);
+uint32 & d_ctrl    = *((uint32 *)&jagMemSpace[0xF1A114]);
+uint32 & d_mod     = *((uint32 *)&jagMemSpace[0xF1A118]);
+uint32 & d_divctrl = *((uint32 *)&jagMemSpace[0xF1A11C]);
+uint32 d_remain;                                                               // Dual register with $F0211C
+uint32 & d_machi   = *((uint32 *)&jagMemSpace[0xF1A120]);
+uint16 & ltxd      = *((uint16 *)&jagMemSpace[0xF1A148]);
+uint16 lrxd;                                                                   // Dual register with $F1A148
+uint16 & rtxd      = *((uint16 *)&jagMemSpace[0xF1A14C]);
+uint16 rrxd;                                                                   // Dual register with $F1A14C
+uint8  & sclk      = *((uint8 *) &jagMemSpace[0xF1A150]);
+uint8 sstat;                                                                   // Dual register with $F1A150
+uint32 & smode     = *((uint32 *)&jagMemSpace[0xF1A154]);
+
+// Memory debugging identifiers
+
+const char * whoName[9] =
+       { "Unknown", "Jaguar", "DSP", "GPU", "TOM", "JERRY", "M68K", "Blitter", "OP" };
 
-void memory_memoryUsage(FILE * fp)
-{
-       uint32 total = 0;
-
-       fprintf(fp, "Memory usage:\n");
-
-//     sMemBlockInfo * alias = &memoryInfo;
-//     alias = alias->next;
-       sMemBlockInfo * alias= memoryInfo.next;
-
-       while (alias)
-       {
-//             fprintf(fp, "\t%16i bytes: <%s> (@ %08X)\n", (int)alias->size, alias->info, (unsigned int)alias->ptr);
-               fprintf(fp, "\t%16i bytes: <%s> (@ %08X)\n", (int)alias->size, alias->info, alias->ptr);
-               total += alias->size;
-               alias = alias->next;
-       }
-
-       fprintf(fp, "\n\t%16i bytes total(%i Mb)\n", (int)total, (int)(total >> 20));
-       fprintf(fp, "\n\t%16i bytes memory peak(%i Mb)\n", (int)maximumAllocatedMemory, (int)(maximumAllocatedMemory >> 20));
-}
index 5ea70d938630a74ff2e5f2b967995535897ae7d6..75a9e18de7b228a86f1818fabb119f08e59b597d 100644 (file)
 //
 // MEMORY.H: Header file
 //
+// All Jaguar related memory and I/O locations are contained in this file
+//
 
 #ifndef __MEMORY_H__
 #define __MEMORY_H__
 
-#include <stdio.h>                                                             // For FILE struct
 #include "types.h"
 
-void MemoryInit(void);
-void MemoryDone(void);
-void memory_malloc_secure(void ** new_ptr, uint32 size, const char * info);
-//void * memory_malloc_secure2(uint32 size, const char * info);
-void * memory_malloc(uint32 size, const char * info);
-void memory_free(void * ptr);
-void memory_memoryUsage(FILE * fp);
+extern uint8 jagMemSpace[];
+
+extern uint8 * jaguarMainRAM;
+extern uint8 * jaguarMainROM;
+extern uint8 jaguarBootROM[];
+extern uint8 jaguarCDBootROM[];
+extern uint8 jaguarDevBootROM1[];
+extern uint8 jaguarDevBootROM2[];
+extern uint8 jaguarDevCDBootROM[];
+extern uint8 * gpuRAM;
+extern uint8 * dspRAM;
 
+#if 1
+extern uint32 & butch, & dscntrl;
+extern uint16 & ds_data;
+extern uint32 & i2cntrl, & sbcntrl, & subdata, & subdatb, & sb_time, & fifo_data, & i2sdat2, & unknown;
+#else
+extern uint32 butch, dscntrl, ds_data, i2cntrl, sbcntrl, subdata, subdatb, sb_time, fifo_data, i2sdat2, unknown;
 #endif
+
+extern uint16 & memcon1, & memcon2, & hc, & vc, & lph, & lpv;
+extern uint64 & obData;
+extern uint32 & olp;
+extern uint16 & obf, & vmode, & bord1, & bord2, & hp, & hbb, & hbe, & hs,
+       & hvs, & hdb1, & hdb2, & hde, & vp, & vbb, & vbe, & vs, & vdb, & vde,
+       & veb, & vee, & vi, & pit0, & pit1, & heq;
+extern uint32 & bg;
+extern uint16 & int1, & int2;
+extern uint8 * clut, * lbuf;
+extern uint32 & g_flags, & g_mtxc, & g_mtxa, & g_end, & g_pc, & g_ctrl,
+       & g_hidata, & g_divctrl;
+extern uint32 g_remain;
+extern uint32 & a1_base, & a1_flags, & a1_clip, & a1_pixel, & a1_step,
+       & a1_fstep, & a1_fpixel, & a1_inc, & a1_finc, & a2_base, & a2_flags,
+       & a2_mask, & a2_pixel, & a2_step, & b_cmd, & b_count;
+extern uint64 & b_srcd, & b_dstd, & b_dstz, & b_srcz1, & b_srcz2, & b_patd;
+extern uint32 & b_iinc, & b_zinc, & b_stop, & b_i3, & b_i2, & b_i1, & b_i0, & b_z3,
+       & b_z2, & b_z1, & b_z0;
+extern uint16 & jpit1, & jpit2, & jpit3, & jpit4, & clk1, & clk2, & clk3, & j_int,
+       & asidata, & asictrl;
+extern uint16 asistat;
+extern uint16 & asiclk, & joystick, & joybuts;
+extern uint32 & d_flags, & d_mtxc, & d_mtxa, & d_end, & d_pc, & d_ctrl,
+       & d_mod, & d_divctrl;
+extern uint32 d_remain;
+extern uint32 & d_machi;
+extern uint16 & ltxd, lrxd, & rtxd, rrxd;
+extern uint8 & sclk, sstat;
+extern uint32 & smode;
+/*
+uint16 & ltxd      = *((uint16 *)&jagMemSpace[0xF1A148]);
+uint16 lrxd;                                                                   // Dual register with $F1A148
+uint16 & rtxd      = *((uint16 *)&jagMemSpace[0xF1A14C]);
+uint16 rrxd;                                                                   // Dual register with $F1A14C
+uint8  & sclk      = *((uint8 *) &jagMemSpace[0xF1A150]);
+uint8 sstat;                                                                   // Dual register with $F1A150
+uint32 & smode     = *((uint32 *)&jagMemSpace[0xF1A154]);
+*/
+
+// Read/write tracing enumeration
+
+enum { UNKNOWN, JAGUAR, DSP, GPU, TOM, JERRY, M68K, BLITTER, OP };
+extern const char * whoName[9];
+
+// Some handy macros to help converting native endian to big endian (jaguar native)
+// & vice versa
+
+#define SET64(r, a, v)         r[(a)] = ((v) & 0xFF00000000000000) >> 56, r[(a)+1] = ((v) & 0x00FF000000000000) >> 48, \
+                                               r[(a)+2] = ((v) & 0x0000FF0000000000) >> 40, r[(a)+3] = ((v) & 0x000000FF00000000) >> 32, \
+                                               r[(a)+4] = ((v) & 0xFF000000) >> 24, r[(a)+5] = ((v) & 0x00FF0000) >> 16, \
+                                               r[(a)+6] = ((v) & 0x0000FF00) >> 8, r[(a)+7] = (v) & 0x000000FF
+#define GET64(r, a)            (((uint64)r[(a)] << 56) | ((uint64)r[(a)+1] << 48) | \
+                                               ((uint64)r[(a)+2] << 40) | ((uint64)r[(a)+3] << 32) | \
+                                               ((uint64)r[(a)+4] << 24) | ((uint64)r[(a)+5] << 16) | \
+                                               ((uint64)r[(a)+6] << 8) | (uint64)r[(a)+7])
+#define SET32(r, a, v) r[(a)] = ((v) & 0xFF000000) >> 24, r[(a)+1] = ((v) & 0x00FF0000) >> 16, \
+                                               r[(a)+2] = ((v) & 0x0000FF00) >> 8, r[(a)+3] = (v) & 0x000000FF
+#define GET32(r, a)            ((r[(a)] << 24) | (r[(a)+1] << 16) | (r[(a)+2] << 8) | r[(a)+3])
+#define SET16(r, a, v) r[(a)] = ((v) & 0xFF00) >> 8, r[(a)+1] = (v) & 0xFF
+#define GET16(r, a)            ((r[(a)] << 8) | r[(a)+1])
+
+//This doesn't seem to work on OSX. So have to figure something else out. :-(
+//byteswap.h doesn't exist on OSX.
+#if 0
+// This is GCC specific, but we can fix that if we need to...
+// Big plus of this approach is that these compile down to single instructions on little
+// endian machines while one big endian machines we don't have any overhead. :-)
+
+#include <byteswap.h>
+#include <endian.h>
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+       #define ESAFE16(x)      bswap_16(x)
+       #define ESAFE32(x)      bswap_32(x)
+       #define ESAFE64(x)      bswap_64(x)
+#else
+       #define ESAFE16(x)      (x)
+       #define ESAFE32(x)      (x)
+       #define ESAFE64(x)      (x)
+#endif
+#endif
+
+#endif // __MEMORY_H__
index 669a79ee50610a8183d26ef437d3b0c568f1fbbb..65656b1b1036535d26372557f4aa2f9559b65bcd 100644 (file)
 
 #include "mmu.h"
 
+#include <stdlib.h>                                                            // For NULL definition
+#include "dac.h"
+//#include "jaguar.h"
+//#include "memory.h"
+#include "wavetable.h"
+
 /*
 Addresses to be handled:
 
@@ -154,15 +160,220 @@ The approach here is to have a list of addresses and who handles them. Could be
 a one-to-one memory location up to a range for each function. Will look
 something like this:
 
-       { 0xF14000, 0xF14001, MM_IO, JoystickReadHanlder, JoystickWriteHandler },
+       { 0xF14000, 0xF14001, MM_IO, JoystickReadHandler, JoystickWriteHandler },
 
 Would be nice to have a way of either calling a handler function or reading/writing
 directly to/from a variable or array...
 */
 
-enum MemType { MM_NOP = 0, MM_RAM, MM_ROM, MM_IO };
+enum MemType { MM_NOP = 0, MM_RAM = 1, MM_ROM = 2, MM_IO_R = 4, MM_IO_W = 8, MM_IO = 12 };
+
+/*
+Would be nice to have different structs tailored to different memory access types,
+but if we don't do that, we can encode things as follows:
+
+MM_NOP: readFunc = writeFunc = NULL
+MM_RAM: readFunc = byte array pointer, writeFunc = NULL
+MM_ROM: readFunc = byte array pointer, writeFunc = NULL
+MM_IO_R: readFunc = function pointer to read function, writeFunc = NULL
+MM_IO_W: readFunc = NULL, writeFunc = function pointer to write function
+MM_IO: readFunc = function pointer to read function, writeFunc = function pointer to write function
+
+There may be a need to have readFunc do both read & write functions (makes sense? perhaps)
+
+Should we have a read mask as well, for the purposes of reading?
+*/
+
+struct MemDesc {
+       uint32 startAddr;
+       uint32 endAddr;
+       MemType type;
+//     (void (* ioFunc)(uint32, uint32)); // <-- could also be a pointer to RAM...
+       void * readFunc;                                        // This is read & write with MM_IO
+       void * writeFunc;
+       uint32 mask;
+};
+
+
+MemDesc memoryMap[] = {
+       { 0x000000, 0x3FFFFF, MM_RAM,  jaguarMainRAM },
+       { 0x800000, 0xDFFEFF, MM_ROM,  jaguarMainROM },
+
+       { 0xDFFF00, 0xDFFF03, MM_IO,   &butch }, // base of Butch == interrupt control register, R/W
+       { 0xDFFF04, 0xDFFF07, MM_IO,   &dscntrl }, // DSA control register, R/W
+       { 0xDFFF0A, 0xDFFF0B, MM_IO,   &ds_data }, // DSA TX/RX data, R/W
+       { 0xDFFF10, 0xDFFF13, MM_IO,   &i2cntrl }, // i2s bus control register, R/W
+       { 0xDFFF14, 0xDFFF17, MM_IO,   &sbcntrl }, // CD subcode control register, R/W
+       { 0xDFFF18, 0xDFFF1B, MM_IO,   &subdata }, // Subcode data register A
+       { 0xDFFF1C, 0xDFFF1F, MM_IO,   &subdatb }, // Subcode data register B
+       { 0xDFFF20, 0xDFFF23, MM_IO,   &sb_time }, // Subcode time and compare enable (D24)
+       { 0xDFFF24, 0xDFFF27, MM_IO,   &fifo_data }, // i2s FIFO data
+       { 0xDFFF28, 0xDFFF2B, MM_IO,   &i2sdat2 }, // i2s FIFO data (old)
+       { 0xDFFF2C, 0xDFFF2F, MM_IO,   &unknown }, // Seems to be some sort of I2S interface
+
+       { 0xE00000, 0xE3FFFF, MM_ROM,  jaguarBootROM },
+
+       // TOM REGISTERS
+
+       { 0xF00000, 0xF00001, MM_IO,   &memcon1 }, // *MEMCON1  Memory Control Register 1                       F00000          RW
+       { 0xF00002, 0xF00003, MM_IO,   &memcon2 }, // *MEMCON2  Memory Control Register 2                       F00002          RW
+       { 0xF00004, 0xF00005, MM_IO,   &hc }, // HC                     Horizontal Count                                        F00004          RW
+       { 0xF00006, 0xF00007, MM_IO,   &vc }, // VC                     Vertical Count                                          F00006          RW
+       { 0xF00008, 0xF00009, MM_IO_R, &lph }, // LPH                   Light Pen Horizontal                            F00008          RO
+       { 0xF0000A, 0xF0000B, MM_IO_R, &lpv }, // LPV                   Light Pen Vertical                                      F0000A          RO
+       { 0xF00010, 0xF00017, MM_IO_R, &obData }, // OB[0-3]            Object Data Field                                       F00010-16       RO
+       { 0xF00020, 0xF00023, MM_IO_W, &olp }, // OLP                   Object List Pointer                                     F00020-23       WO
+       { 0xF00026, 0xF00027, MM_IO_W, &obf }, // OBF                   Object Flag                                                     F00026          WO
+       { 0xF00028, 0xF00029, MM_IO_W, &vmode }, // VMODE               Video Mode                                                      F00028          WO
+       { 0xF0002A, 0xF0002B, MM_IO_W, &bord1 }, // BORD1               Border Colour (Red & Green)                     F0002A          WO
+       { 0xF0002C, 0xF0002D, MM_IO_W, &bord2 }, // BORD2               Border Colour (Blue)                            F0002C          WO
+       { 0xF0002E, 0xF0002F, MM_IO_W, &hp }, // *HP                    Horizontal Period                                       F0002E          WO
+       { 0xF00030, 0xF00031, MM_IO_W, &hbb }, // *HBB          Horizontal Blank Begin                          F00030          WO
+       { 0xF00032, 0xF00033, MM_IO_W, &hbe }, // *HBE          Horizontal Blank End                            F00032          WO
+       { 0xF00034, 0xF00035, MM_IO_W, &hs }, // *HS                    Horizontal Sync                                         F00034          WO
+       { 0xF00036, 0xF00037, MM_IO_W, &hvs }, // *HVS          Horizontal Vertical Sync                        F00036          WO
+       { 0xF00038, 0xF00039, MM_IO_W, &hdb1 }, // HDB1         Horizontal Display Begin 1                      F00038          WO
+       { 0xF0003A, 0xF0003B, MM_IO_W, &hdb2 }, // HDB2         Horizontal Display Begin 2                      F0003A          WO
+       { 0xF0003C, 0xF0003D, MM_IO_W, &hde }, // HDE                   Horizontal Display End                          F0003C          WO
+       { 0xF0003E, 0xF0003F, MM_IO_W, &vp }, // *VP                    Vertical Period                                         F0003E          WO
+       { 0xF00040, 0xF00041, MM_IO_W, &vbb }, // *VBB          Vertical Blank Begin                            F00040          WO
+       { 0xF00042, 0xF00043, MM_IO_W, &vbe }, // *VBE          Vertical Blank End                                      F00042          WO
+       { 0xF00044, 0xF00045, MM_IO_W, &vs }, // *VS                    Vertical Sync                                           F00044          WO
+       { 0xF00046, 0xF00047, MM_IO_W, &vdb }, // VDB                   Vertical Display Begin                          F00046          WO
+       { 0xF00048, 0xF00049, MM_IO_W, &vde }, // VDE                   Vertical Display End                            F00048          WO
+       { 0xF0004A, 0xF0004B, MM_IO_W, &veb }, // *VEB          Vertical Equalization Begin                     F0004A          WO
+       { 0xF0004C, 0xF0004D, MM_IO_W, &vee }, // *VEE          Vertical Equalization End                       F0004C          WO
+       { 0xF0004E, 0xF0004F, MM_IO_W, &vi }, // VI                     Vertical Interrupt                                      F0004E          WO
+       { 0xF00050, 0xF00051, MM_IO_W, &pit0 }, // PIT[0-1]     Programmable Interrupt Timer            F00050-52       WO
+       { 0xF00052, 0xF00053, MM_IO_W, &pit1 },
+       { 0xF00054, 0xF00055, MM_IO_W, &heq }, // *HEQ          Horizontal Equalization End                     F00054          WO
+       { 0xF00058, 0xF0005B, MM_IO_W, &bg }, // BG                     Background Colour                                       F00058          WO
+       { 0xF000E0, 0xF000E1, MM_IO,   &int1 }, // INT1         CPU Interrupt Control Register          F000E0          RW
+       { 0xF000E2, 0xF000E3, MM_IO_W, &int2 }, // INT2         CPU Interrupt Resume Register           F000E2          WO
+//Some of these RAM spaces may be 16- or 32-bit only... in which case, we need
+//to cast appropriately (in memory.cpp, that is)...
+       { 0xF00400, 0xF005FF, MM_RAM,  clut }, // CLUT          Colour Look-Up Table                            F00400-7FE      RW
+       { 0xF00600, 0xF007FF, MM_RAM,  clut },
+       { 0xF00800, 0xF01D9F, MM_RAM,  lbuf }, // LBUF          Line Buffer                                                     F00800-1D9E     RW
+//Need high speed RAM interface for GPU & DSP (we have it now...)
+
+       // GPU REGISTERS
+
+       { 0xF02100, 0xF02103, MM_IO,   &g_flags }, // G_FLAGS           GPU Flags Register                                      F02100          RW
+       { 0xF02104, 0xF02107, MM_IO_W, &g_mtxc }, // G_MTXC             Matrix Control Register                         F02104          WO
+       { 0xF02108, 0xF0210B, MM_IO_W, &g_mtxa }, // G_MTXA             Matrix Address Register                         F02108          WO
+       { 0xF0210C, 0xF0210F, MM_IO_W, &g_end }, // G_END               Data Organization Register                      F0210C          WO
+       { 0xF02110, 0xF02113, MM_IO,   &g_pc }, // G_PC         GPU Program Counter                                     F02110          RW
+       { 0xF02114, 0xF02117, MM_IO,   &g_ctrl }, // G_CTRL             GPU Control/Status Register                     F02114          RW
+       { 0xF02118, 0xF0211B, MM_IO,   &g_hidata }, // G_HIDATA High Data Register                                      F02118          RW
+       { 0xF0211C, 0xF0211F, MM_IO,   &g_remain, &g_divctrl }, // G_REMAIN     Divide Unit Remainder                           F0211C          RO
+                                                                                       // G_DIVCTRL    Divide Unit Control                                     F0211C          WO
+       { 0xF03000, 0xF03FFF, MM_RAM,  gpuRAM },
+
+       // BLITTER REGISTERS
+
+       { 0xF02200, 0xF02203, MM_IO_W, &a1_base }, // A1_BASE           A1 Base Register                                        F02200          WO
+       { 0xF02204, 0xF02207, MM_IO,   &a1_pixel, &a1_flags }, // A1_FLAGS      Flags Register                                          F02204          WO
+       { 0xF02208, 0xF0220B, MM_IO_W, &a1_clip }, // A1_CLIP           A1 Clipping Size                                        F02208          WO
+       { 0xF0220C, 0xF0220F, MM_IO_W, &a1_pixel }, // A1_PIXEL A1 Pixel Pointer                                        F0220C          WO
+//                                                                                             F02204          RO
+       { 0xF02210, 0xF02213, MM_IO_W, &a1_step }, // A1_STEP           A1 Step Value                                           F02210          WO
+       { 0xF02214, 0xF02217, MM_IO_W, &a1_fstep }, // A1_FSTEP A1 Step Fraction Value                          F02214          WO
+       { 0xF02218, 0xF0221B, MM_IO,   &a1_fpixel }, // A1_FPIXEL       A1 Pixel Pointer Fraction                       F02218          RW
+       { 0xF0221C, 0xF0221F, MM_IO_W, &a1_inc }, // A1_INC             A1 Increment                                            F0221C          WO
+       { 0xF02220, 0xF02223, MM_IO_W, &a1_finc }, // A1_FINC           A1 Increment Fraction                           F02220          WO
+       { 0xF02224, 0xF02227, MM_IO_W, &a2_base }, // A2_BASE           A2 Base Register                                        F02224          WO
+       { 0xF02228, 0xF0222B, MM_IO_W, &a2_flags }, // A2_FLAGS A2 Flags Register                                       F02228          WO
+       { 0xF0222C, 0xF0222F, MM_IO,   &a2_pixel, &a2_mask }, // A2_MASK                A2 Window Mask                                          F0222C          WO
+       { 0xF02230, 0xF02233, MM_IO_W, &a2_pixel }, // A2_PIXEL A2 Pixel Pointer                                        F02230          WO
+//                                                                                             F0222C          RO
+       { 0xF02234, 0xF02237, MM_IO_W, &a2_step }, // A2_STEP           A2 Step Value                                           F02234          WO
+       { 0xF02238, 0xF0223B, MM_IO,   &b_cmd }, // B_CMD               Command/Status Register                         F02238          RW
+       { 0xF0223C, 0xF0223F, MM_IO_W, &b_count }, // B_COUNT           Counters Register                                       F0223C          WO
+       { 0xF02240, 0xF02247, MM_IO_W, &b_srcd }, // B_SRCD             Source Data Register                            F02240          WO
+       { 0xF02248, 0xF0224F, MM_IO_W, &b_dstd }, // B_DSTD             Destination Data Register                       F02248          WO
+       { 0xF02250, 0xF02258, MM_IO_W, &b_dstz }, // B_DSTZ             Destination Z Register                          F02250          WO
+       { 0xF02258, 0xF0225F, MM_IO_W, &b_srcz1 }, // B_SRCZ1           Source Z Register 1                                     F02258          WO
+       { 0xF02260, 0xF02267, MM_IO_W, &b_srcz2 }, // B_SRCZ2           Source Z Register 2                                     F02260          WO
+       { 0xF02268, 0xF0226F, MM_IO_W, &b_patd }, // B_PATD             Pattern Data Register                           F02268          WO
+       { 0xF02270, 0xF02273, MM_IO_W, &b_iinc }, // B_IINC             Intensity Increment                                     F02270          WO
+       { 0xF02274, 0xF02277, MM_IO_W, &b_zinc }, // B_ZINC             Z Increment                                                     F02274          WO
+       { 0xF02278, 0xF0227B, MM_IO_W, &b_stop }, // B_STOP             Collision Control                                       F02278          WO
+       { 0xF0227C, 0xF0227F, MM_IO_W, &b_i3 }, // B_I3         Intensity 3                                                     F0227C          WO
+       { 0xF02280, 0xF02283, MM_IO_W, &b_i2 }, // B_I2         Intensity 2                                                     F02280          WO
+       { 0xF02284, 0xF02287, MM_IO_W, &b_i1 }, // B_I1         Intensity 1                                                     F02284          WO
+       { 0xF02288, 0xF0228B, MM_IO_W, &b_i0 }, // B_I0         Intensity 0                                                     F02288          WO
+       { 0xF0228C, 0xF0228F, MM_IO_W, &b_z3 }, // B_Z3         Z 3                                                                     F0228C          WO
+       { 0xF02290, 0xF02293, MM_IO_W, &b_z2 }, // B_Z2         Z 2                                                                     F02290          WO
+       { 0xF02294, 0xF02297, MM_IO_W, &b_z1 }, // B_Z1         Z 1                                                                     F02294          WO
+       { 0xF02298, 0xF0229B, MM_IO_W, &b_z0 }, // B_Z0         Z 0                                                                     F02298          WO
+
+// JTRM sez ALL GPU address space is accessible from $8000 offset as "fast" 32-bit WO access
+// Dunno if anything actually USED it tho... :-P
+       { 0xF0A100, 0xF0A103, MM_IO_W, &g_flags }, // G_FLAGS           GPU Flags Register                                      F02100          RW
+       { 0xF0A104, 0xF0A107, MM_IO_W, &g_mtxc }, // G_MTXC             Matrix Control Register                         F02104          WO
+       { 0xF0A108, 0xF0A10B, MM_IO_W, &g_mtxa }, // G_MTXA             Matrix Address Register                         F02108          WO
+       { 0xF0A10C, 0xF0A10F, MM_IO_W, &g_end }, // G_END               Data Organization Register                      F0210C          WO
+       { 0xF0A110, 0xF0A113, MM_IO_W, &g_pc }, // G_PC         GPU Program Counter                                     F02110          RW
+       { 0xF0A114, 0xF0A117, MM_IO_W, &g_ctrl }, // G_CTRL             GPU Control/Status Register                     F02114          RW
+       { 0xF0A118, 0xF0A11B, MM_IO_W, &g_hidata }, // G_HIDATA High Data Register                                      F02118          RW
+       { 0xF0A11C, 0xF0A11F, MM_IO_W, &g_divctrl }, // G_REMAIN        Divide Unit Remainder                           F0211C          RO
+       { 0xF0B000, 0xF0BFFF, MM_IO_W, gpuRAM }, // "Fast" interface to GPU RAM
+
+       // JERRY REGISTERS
+
+       { 0xF10000, 0xF10001, MM_IO_W, &jpit1 }, // JPIT1               Timer 1 Pre-scaler                                      F10000          WO
+       { 0xF10002, 0xF10003, MM_IO_W, &jpit2 }, // JPIT2               Timer 1 Divider                                         F10002          WO
+       { 0xF10004, 0xF10005, MM_IO_W, &jpit3 }, // JPIT3               Timer 2 Pre-scaler                                      F10004          WO
+       { 0xF10006, 0xF10007, MM_IO_W, &jpit4 }, // JPIT4               Timer 2 Divider                                         F10006          WO
+       { 0xF10010, 0xF10011, MM_IO_W, &clk1 }, // *CLK1                Processor Clock Divider                         F10010          WO
+       { 0xF10012, 0xF10013, MM_IO_W, &clk2 }, // *CLK2                Video Clock Divider                                     F10012          WO
+       { 0xF10014, 0xF10015, MM_IO_W, &clk3 }, // *CLK3                Chroma Clock Divider                            F10014          WO
+       { 0xF10020, 0xF10021, MM_IO,   &j_int }, // J_INT               Interrup Control Register                       F10020          RW
+       { 0xF10030, 0xF10031, MM_IO,   &asidata }, // ASIDATA           Asynchronous Serial Data                        F10030          RW
+       { 0xF10032, 0xF10033, MM_IO,   &asistat, &asictrl }, // ASICTRL         Asynchronous Serial Control                     F10032          WO
+                                                                                       // ASISTAT              Asynchronous Serial Status                      F10032          RO
+       { 0xF10034, 0xF10035, MM_IO,   &asiclk }, // ASICLK             Asynchronous Serial Interface Clock     F10034          RW
+       { 0xF10036, 0xF10037, MM_IO_R, &jpit1 }, // JPIT1               Timer 1 Pre-scaler                                      F10036          RO
+       { 0xF10038, 0xF10039, MM_IO_R, &jpit2 }, // JPIT2               Timer 1 Divider                                         F10038          RO
+       { 0xF1003A, 0xF1003B, MM_IO_R, &jpit3 }, // JPIT3               Timer 2 Pre-scaler                                      F1003A          RO
+       { 0xF1003C, 0xF1003D, MM_IO_R, &jpit4 }, // JPIT4               Timer 2 Divider                                         F1003C          RO
+
+       { 0xF14000, 0xF14001, MM_IO,   &joystick }, // JOYSTICK Joystick Register                                       F14000          RW
+       { 0xF14002, 0xF14003, MM_IO,   &joybuts }, // JOYBUTS           Button Register                                         F14002          RW
+
+       // DSP REGISTERS
+
+       { 0xF1A100, 0xF1A103, MM_IO,   &d_flags }, // D_FLAGS           DSP Flags Register                                      F1A100          RW
+       { 0xF1A104, 0xF1A107, MM_IO_W, &d_mtxc }, // D_MTXC             DSP Matrix Control Register                     F1A104          WO
+       { 0xF1A108, 0xF1A10B, MM_IO_W, &d_mtxa }, // D_MTXA             DSP Matrix Address Register                     F1A108          WO
+       { 0xF1A10C, 0xF1A10F, MM_IO_W, &d_end }, // D_END               DSP Data Organization Register          F1A10C          WO
+       { 0xF1A110, 0xF1A113, MM_IO,   &d_pc }, // D_PC         DSP Program Counter                                     F1A110          RW
+       { 0xF1A114, 0xF1A117, MM_IO,   &d_ctrl }, // D_CTRL             DSP Control/Status Register                     F1A114          RW
+       { 0xF1A118, 0xF1A11B, MM_IO_W, &d_mod }, // D_MOD               Modulo Instruction Mask                         F1A118          WO
+       { 0xF1A11C, 0xF1A11F, MM_IO_W, &d_remain, &d_divctrl }, // D_REMAIN     Divide Unit Remainder                           F1A11C          RO
+                                                                                       // D_DIVCTRL    Divide Unit Control                                     F1A11C          WO
+       { 0xF1A120, 0xF1A123, MM_IO_R, &d_machi }, // D_MACHI           MAC High Result Bits                            F1A120          RO
+
+
+       { 0xF1A148, 0xF1A149, MM_IO,   &lrxd, &ltxd }, // LTXD          Left Transmit Data                                      F1A148          WO
+       // LRXD         Left Receive Data                                       F1A148          RO
+       // L_I2S                Left I2S Serial Interface                       F1A148          RW
+       { 0xF1A14C, 0xF1A14D, MM_IO,   &rrxd, &rtxd }, // RTXD          Right Transmit Data                                     F1A14C          WO
+       // RRXD         Right Receive Data                                      F1A14C          RO
+       // R_I2S                Right I2S Serial Interface                      F1A14C          RW
+       { 0xF1A150, 0xF1A150, MM_IO,   &sstat, &sclk }, // SCLK         Serial Clock Frequency                          F1A150          WO
+       // SSTAT                Serial Status                                           F1A150          RO
+       { 0xF1A154, 0xF1A157, MM_IO_W, &smode }, // SMODE               Serial Mode                                                     F1A154          WO
+
+       { 0xF1B000, 0xF1CFFF, MM_RAM,  dspRAM }, // F1B000-F1CFFF   R/W   xxxxxxxx xxxxxxxx   Local DSP RAM
+       { 0xF1D000, 0xF1DFFF, MM_ROM,  waveTableROM },
+// hi-speed interface for DSP??? Ain't no such thang...
+       { 0xFFFFFF, 0xFFFFFF, MM_NOP } // End of memory address sentinel
+};
 
 #if 0
+
 // Jaguar Memory map/handlers
 uint32 memoryMap[] = {
        { 0x000000, 0x3FFFFF, MM_RAM, jaguarMainRAM },
@@ -273,7 +484,107 @@ void MMUWrite64(uint32 address, uint64 data, uint32 who/*= UNKNOWN*/)
 
 uint8 MMURead8(uint32 address, uint32 who/*= UNKNOWN*/)
 {
-       return 0;
+       // Search for address in the memory map
+       // NOTE: This assumes that all entries are linear and sorted in ascending order!
+
+       MemDesc memory;
+       uint8 byte = 0xFE;
+
+       uint32 i = 0;
+       while (true)
+       {
+               if (address <= memoryMap[i].endAddr)
+               {
+                       if (address >= memoryMap[i].startAddr)
+                       {
+                               memory = memoryMap[i];
+                               break;
+                       }
+                       else
+                               return 0xFF;    // Wasn't found...
+               }
+
+               i++;
+
+               if (memoryMap[i].startAddr == 0xFFFFFF)
+                       return 0xFF;            // Exhausted the list, so bail!
+       }
+
+       uint32 offset = address - memory.startAddr;
+       uint32 size = memory.endAddr - memory.startAddr + 1;
+       uint8 byteShift[8] = { 0, 8, 16, 24, 32, 40, 48, 56 };
+
+       if (memory.type == MM_RAM || memory.type == MM_ROM)
+       {
+               byte = ((uint8 *)memory.readFunc)[offset];
+       }
+       else if (memory.type == MM_IO_R || memory.type == MM_IO)
+       {
+               // Problem here: We don't know yet how wide the function is, so we don't know
+               // how to properly cast it. We COULD ignore the problem by passing in/receiving
+               // 64-bits of data and letting the function make heads or tails of it, but we
+               // still have the problem of, say, taking a byte from a 32-bit value.
+/*
+We can do like so:
+       uint8 byteShift[8] = { 0, 8, 16, 24, 32, 40, 48, 56 };
+       size = memory.endAddr - memory.startAddr + 1;
+       byte = (returnValFromFunc >> byteShift[offset]) & 0xFF;
+
+Let's see, will this work depending on the endianess?
+uint32 dword
+accessing it like so:
+((uint8 *)dword &)[0] --> should give us high byte
+but if we assign it directly...
+dword = 0x12345678 --> becomes 78 56 34 12 in memory, ptr[0] will be 78 in LE!
+dword = 0x12345678 --> becomes 12 34 56 78 in memory, ptr[0] will be 12 in BE!
+
+So we're in danger if we use the variables directly! We'd need something like
+#define ENDIAN_SAFE_16(x)  swap lo & hi bytes on LE systems
+#define ENDIAN_SAFE_16(x)  do nothing on BE systems
+
+Then, if we want to use a jaguar variable, we need to cast it like so:
+uint16 my_vbb = ENDIAN_SAFE_16(vbb);
+
+We have something like this already in jaguar.h, since we treat I/O spaces like
+contiguous memory anyway... For reference:
+
+// Some handy macros to help converting native endian to big endian (jaguar native)
+// & vice versa
+
+#define SET64(r, a, v)         r[(a)] = ((v) & 0xFF00000000000000) >> 56, r[(a)+1] = ((v) & 0x00FF000000000000) >> 48, \
+                                               r[(a)+2] = ((v) & 0x0000FF0000000000) >> 40, r[(a)+3] = ((v) & 0x000000FF00000000) >> 32, \
+                                               r[(a)+4] = ((v) & 0xFF000000) >> 24, r[(a)+5] = ((v) & 0x00FF0000) >> 16, \
+                                               r[(a)+6] = ((v) & 0x0000FF00) >> 8, r[(a)+7] = (v) & 0x000000FF
+#define GET64(r, a)            (((uint64)r[(a)] << 56) | ((uint64)r[(a)+1] << 48) | \
+                                               ((uint64)r[(a)+2] << 40) | ((uint64)r[(a)+3] << 32) | \
+                                               ((uint64)r[(a)+4] << 24) | ((uint64)r[(a)+5] << 16) | \
+                                               ((uint64)r[(a)+6] << 8) | (uint64)r[(a)+7])
+#define SET32(r, a, v) r[(a)] = ((v) & 0xFF000000) >> 24, r[(a)+1] = ((v) & 0x00FF0000) >> 16, \
+                                               r[(a)+2] = ((v) & 0x0000FF00) >> 8, r[(a)+3] = (v) & 0x000000FF
+#define GET32(r, a)            ((r[(a)] << 24) | (r[(a)+1] << 16) | (r[(a)+2] << 8) | r[(a)+3])
+#define SET16(r, a, v) r[(a)] = ((v) & 0xFF00) >> 8, r[(a)+1] = (v) & 0xFF
+#define GET16(r, a)            ((r[(a)] << 8) | r[(a)+1])
+*/
+               // Confused? Let me enlighten... What we're doing here is casting
+               // data1 as a pointer to a function which returns a Window pointer and
+               // which takes no parameters (the "(Window *(*)(void))" part), then
+               // derefencing it (the "*" in front of that) in order to call the
+               // function that it points to. Clear as mud? Yeah, I hate function
+               // pointers too, but what else are you gonna do?
+//             mainWindow = (*(Window *(*)(void))event.user.data1)();
+//             uint32 retVal = (*(uint32(*)(uint32))memory.readFunc)(offset);
+//#define FUNC_CAST(x) (*(uint32(*)(uint32))x)
+//             uint32 retVal = FUNC_CAST(memory.readFunc)(offset);
+#define FUNC_CAST(retVal, function, params) (*(retVal(*)(params))function)
+               uint64 retVal = FUNC_CAST(uint64, memory.readFunc, uint32)(offset);
+               byte = (retVal >> byteShift[offset]) & 0xFF;
+       }
+       else if (memory.type == MM_IO_W)
+       {
+               byte = 0xFF;            // Write only, what do we return? A fixed value?
+       }
+
+       return byte;
 }
 
 uint16 MMURead16(uint32 address, uint32 who/*= UNKNOWN*/)
index 6a4cce9aa8beff6a9df620e71e8eccd99d145156..9a04e9fb4c3659bf5e032a39d6af17e5abdc9ec0 100644 (file)
--- a/src/mmu.h
+++ b/src/mmu.h
@@ -6,7 +6,11 @@
 // by James L. Hammons
 //
 
-#include "types.h"
+#ifndef __MMU_H__
+#define __MMU_H__
+
+//#include "types.h"
+#include "memory.h"
 
 void MMUWrite8(uint32 address, uint8 data, uint32 who = UNKNOWN);
 void MMUWrite16(uint32 address, uint16 data, uint32 who = UNKNOWN);
@@ -17,3 +21,4 @@ uint16 MMURead16(uint32 address, uint32 who = UNKNOWN);
 uint32 MMURead32(uint32 address, uint32 who = UNKNOWN);
 uint64 MMURead64(uint32 address, uint32 who = UNKNOWN);
 
+#endif // __MMU_H__
index 856b233ca3e6e6563246ce65c6fd160b2189b166..38631648d250d048c38384bc175e46b39c184d8a 100644 (file)
@@ -4,6 +4,13 @@
 // Original source by David Raingeard (Cal2)
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Extensive cleanups/fixes/rewrites by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
 //
 
 #include "objectp.h"
@@ -14,6 +21,7 @@
 #include "jaguar.h"
 #include "log.h"
 #include "m68k.h"
+#include "memory.h"
 #include "tom.h"
 
 //#define OP_DEBUG
@@ -312,7 +320,7 @@ void DumpFixedObject(uint64 p0, uint64 p1)
 //
 //Need to fix this so that when an GPU object IRQ happens, we can pick up OP processing
 //where we left off. !!! FIX !!!
-#warning Need to fix this so that when an GPU object IRQ happens, we can pick up OP processing where we left off. !!! FIX !!!
+#warning "Need to fix this so that when an GPU object IRQ happens, we can pick up OP processing where we left off. !!! FIX !!!"
 void OPProcessList(int scanline, bool render)
 {
 extern int op_start_log;
@@ -617,6 +625,7 @@ OP: Scaled bitmap 4x? 4bpp at 34,? hscale=80 fpix=0 data=000756E8 pitch 1 hflipp
                case OBJECT_TYPE_GPU:
                {
 //WriteLog("OP: Asserting GPU IRQ #3...\n");
+#warning "Need to fix OP GPU IRQ handling! !!! FIX !!!"
                        OPSetCurrentObject(p0);
                        GPUSetIRQLine(3, ASSERT_LINE);
 //Also, OP processing is suspended from this point until OBF (F00026) is written to...
@@ -656,8 +665,8 @@ OP: Scaled bitmap 4x? 4bpp at 34,? hscale=80 fpix=0 data=000756E8 pitch 1 hflipp
                                break;
                        case CONDITION_SECOND_HALF_LINE:
                                // This basically means branch if bit 10 of HC is set
+#warning "Unhandled condition code causes emulator to crash... !!! FIX !!!"
                                WriteLog("OP: Unexpected CONDITION_SECOND_HALF_LINE in BRANCH object\nOP: shuting down\n");
-//                             fclose(log_get());
                                LogDone();
                                exit(0);
                                break;
@@ -693,6 +702,7 @@ OP: Scaled bitmap 4x? 4bpp at 34,? hscale=80 fpix=0 data=000756E8 pitch 1 hflipp
                // Here is a little sanity check to keep the OP from locking up the machine
                // when fed bad data. Better would be to count how many actual cycles it used
                // and bail out/reenter to properly simulate an overloaded OP... !!! FIX !!!
+#warning "Better would be to count how many actual cycles it used and bail out/reenter to properly simulate an overloaded OP... !!! FIX !!!"
                opCyclesToRun--;
                if (!opCyclesToRun)
                        return;
diff --git a/src/sdlemu_config.cpp b/src/sdlemu_config.cpp
deleted file mode 100644 (file)
index 0b2dc7f..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * SDLEMU library - Free sdl related functions library
- * Copyrigh(c) 1999-2002 sdlemu development crew
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#include "sdlemu_config.h"
-
-#include <stdlib.h>                                                            // For atoi()
-#include <cstring>                                                             // For strcmp()
-#include <stdio.h>                                                             // For file functions
-#include <string>
-#include <list>
-
-using namespace std;
-
-class token_list
-{
-public:
-       token_list(const string &name) : m_name(name), m_value(""), m_token("") {}
-       void add_token_variable(const string &var) { m_token = var; }
-       void add_token_value(const string &value) { m_value = value; }
-       const string &LineName() const { return m_name; }
-       const string &Token() const { return m_token; }
-       const string &Value() const { return m_value; }
-private:
-       std::string m_name;
-       std::string m_value;
-       std::string m_token;
-};
-
-std::list<token_list> vec;
-
-void string_tokenize_variable()
-{
-       list<token_list>::iterator p;
-       const string delim = " ";
-       for(p = vec.begin(); p != vec.end(); p++) {
-               string::size_type lastPos = (*p).LineName().find_first_not_of(delim, 0);
-               string::size_type pos     = (*p).LineName().find_first_of(delim, lastPos);
-
-               if(string::npos != pos && string::npos != lastPos) {
-                       string s = (*p).LineName().substr(lastPos, pos - lastPos);
-                       (*p).add_token_variable(s);
-               }
-       }
-}
-
-void string_tokenize_value()
-{
-       list<token_list>::iterator p;
-       const string delim = " =\n\t\r";                // "\r" needed for Win32 compatibility...
-
-       for(p = vec.begin(); p != vec.end(); p++) {
-               string::size_type lastPos = (*p).LineName().find_first_of(delim, 0);
-               string::size_type pos     = (*p).LineName().find_first_not_of(delim, lastPos);
-
-               if(string::npos != pos && string::npos != lastPos) {
-                       string s = (*p).LineName().substr(pos);
-                       (*p).add_token_value(s);
-               }
-       }
-}
-
-int sdlemu_init_config(const char *filename)
-{
-       FILE *f = fopen(filename, "r");
-       if(!f) return 0;
-       
-       fseek(f, 0, SEEK_END);
-       int len = ftell(f);
-       fseek(f, 0, SEEK_SET);
-       
-       char *s = new char[len];
-       fread(s, 1, len, f);
-       string str(s);
-
-       const string delim = "\n\r";            // "\r" needed for Win32 compatibility...
-       string::size_type lastPos = str.find_first_not_of(delim, 0);
-       string::size_type pos     = str.find_first_of(delim, lastPos);
-
-       while (string::npos != pos || string::npos != lastPos) {
-               string string = str.substr(lastPos, pos - lastPos);
-               if(string[0] == '#')
-               {
-               }
-               else if(string[0] == '[')
-               {
-               }
-               else
-               {
-                       vec.push_back(string);
-               }
-               lastPos = str.find_first_not_of(delim, pos);
-               pos = str.find_first_of(delim, lastPos);
-       }
-       string_tokenize_variable();
-       string_tokenize_value();
-       delete [] s;
-       fclose(f);
-       return 1;
-}
-
-const char *sdlemu_getval_string(const char *key_string, const char *default_string)
-{
-       list<token_list>::iterator p;
-       for(p = vec.begin(); p != vec.end(); p++) {
-               
-               if(strcmp((*p).Token().c_str(), key_string) == 0)
-                       return (*p).Value().c_str();
-       }
-       return default_string;
-}
-
-int sdlemu_getval_int(const char *key_string, int default_int)
-{
-       list<token_list>::iterator p;
-       for(p = vec.begin(); p != vec.end(); p++) {
-               
-               if(strcmp((*p).Token().c_str(), key_string) == 0) {
-                       const char *ret = (*p).Value().c_str();
-                       if(ret) return atoi(ret);
-               }
-       }
-       return default_int;
-}
-
-int sdlemu_getval_bool(const char *key_string, int default_int)
-{
-       list<token_list>::iterator p;
-       for(p = vec.begin(); p != vec.end(); p++) {
-               
-               if(strcmp((*p).Token().c_str(), key_string) == 0) {
-                       const char *ret = (*p).Value().c_str();
-                       if(ret) return atoi(ret)>0;
-               }
-       }
-       return default_int;
-}
diff --git a/src/sdlemu_config.h b/src/sdlemu_config.h
deleted file mode 100644 (file)
index 2c2e6d5..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef __SDL_CONFIG_H__
-#define __SDL_CONFIG_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int sdlemu_init_config(const char * filename);
-const char * sdlemu_getval_string(const char * key_string, const char * default_string);
-int sdlemu_getval_int(const char * key_string, int default_int);
-int sdlemu_getval_bool(const char * key_string, int default_int);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/sdlemu_opengl.c b/src/sdlemu_opengl.c
deleted file mode 100644 (file)
index 7b4e01e..0000000
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- * SDLEMU library - Free sdl related functions library
- * Copyrigh(c) 1999-2004 sdlemu development crew
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-/*  SDLEMU_OPENGL.C
-    SDLEMU related sources for using OpenGL with SDL.
-    By Niels Wagenaar | http://sdlemu.ngemu.com | shalafi@xs4all.nl
-
-    Version 1.0.001 - 4-10-2004
-
-    - Added support for 16, 24 and 32 bit textures;
-    - Added support for 16, 24 and 32 bit texture rendering;
-
-    Version 1.0.002 - 6-10-2004
-
-    - Cleaned up a lot of code and removed non functional and obsolete code;
-    - Removed sdlemu_resize_texture function because of double code;
-    - Removed the texture creation from the sdlemu_init_opengl;
-    - Added sdlemu_create_texture function to replace the sdlemu_resize_texture function
-      and the texture creation in sdlemu_init_opengl;
-    - Added the usage of OPENGL_16BPP_CORRECT_RGBA for activating the correct 16bpp RGBA masks;
-    - Added the usage of WANT_OPENGL_ALPHA for using ALPHA blending with 32bpp textures;
-    - Added automatic and override texture bpp depth setting (based upon the src surface);
-
-*/
-
-#include "sdlemu_opengl.h"
-
-#include "log.h"
-
-// We want alpha on our OpenGL contexts...!
-// Or do we? Seems to kill performance on X...
-// Or does it? Could it be bad blitter performance?
-#define WANT_OPENGL_ALPHA
-
-static SDL_Surface *texture      = 0;
-static GLuint       texid        = 0;
-static GLfloat      texcoord[4];
-static unsigned int glFilter;
-static unsigned int texturebpp  = 0; // 16, 24 or 32 bpp
-
-static SDL_Surface * overlay = 0;
-static GLuint overlayID = 0;
-static GLfloat overlayCoord[4];
-void sdlemu_create_overlay(SDL_Surface * dst, int src_bpp);
-
-static int showOverlay = 0;
-
-static inline int power_of_two(int input)
-{
-       int value = 1;
-
-       while (value < input)
-               value <<= 1;
-
-       return value;
-}
-
-void sdlemu_init_opengl(SDL_Surface * src, SDL_Surface * dst, int texturetype, int filter, int src_bpp)
-{
-       WriteLog("\nOpenGL driver information :\n");
-       WriteLog("\n");
-       WriteLog("Vendor:             %s\n", glGetString(GL_VENDOR));
-       WriteLog("Renderer:           %s\n", glGetString(GL_RENDERER));
-       WriteLog("Version:            %s\n", glGetString(GL_VERSION));
-       WriteLog("OpenGL drawmethod: ");
-
-       switch (texturetype)
-       {
-       case 1:
-               WriteLog("GL_QUAD rendering\n\n");
-               break;
-       default:
-               WriteLog("GL_TRIANGLE rendering\n\n");
-               break;
-       }
-
-       glFilter = filter;
-
-       // Let us create the texture information :
-       sdlemu_create_texture(src, dst, filter, src_bpp);
-       sdlemu_create_overlay(dst, src_bpp);
-}
-
-void sdlemu_draw_texture(SDL_Surface * dst, SDL_Surface * src, int texturetype)
-{
-/*
-       This is needed when we want to render OpenGL textures with the Alpha mask set.
-       Be warned! This only works with the bpp of texture en *src set to 32.
-*/
-#ifdef WANT_OPENGL_ALPHA
-       Uint32 saved_flags;
-       Uint8  saved_alpha;
-
-       /* Save the alpha blending attributes */
-       saved_flags = src->flags&(SDL_SRCALPHA|SDL_RLEACCELOK);
-       saved_alpha = src->format->alpha;
-       if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
-               SDL_SetAlpha(src, 0, 0);
-       }
-
-       // Blit the src display to the texture.
-       SDL_BlitSurface(src, NULL, texture, NULL);
-
-       /* Restore the alpha blending attributes */
-       if ( (saved_flags & SDL_SRCALPHA) == SDL_SRCALPHA ) {
-               SDL_SetAlpha(src, saved_flags, saved_alpha);
-       }
-#else
-       SDL_BlitSurface(src, NULL, texture, NULL);
-#endif
-//     SDL_BlitSurface(src, NULL, overlay, NULL);
-/*Uint32 * pix = (Uint32 *)overlay->pixels;
-Uint32 y,x;
-for(y=10; y<200; y++)
-for(x=30; x<250; x++)
-pix[x+(y*1024)] = 0x800000FF;//*/
-
-glBlendFunc(GL_ONE, GL_ZERO);
-glBindTexture(GL_TEXTURE_2D, texid);
-       // Texturemap complete texture to surface so we have free scaling
-       // and antialiasing
-       switch (texturebpp)
-       {
-       case 16:
-               glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texture->w, texture->h,
-                       GL_RGB, GL_UNSIGNED_SHORT_5_6_5, texture->pixels);
-               break;
-       case 24:
-               glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texture->w, texture->h,
-                       GL_RGB, GL_UNSIGNED_BYTE, texture->pixels);
-               break;
-       case 32:
-       default:
-               glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, texture->w, texture->h,
-                       GL_RGBA, GL_UNSIGNED_BYTE, texture->pixels);
-               break;
-       }
-
-       // Render the texture to the screen using OpenGL!
-       switch (texturetype)
-       {
-       case 1:
-               glBegin(GL_QUADS);
-                       glTexCoord2f(texcoord[0], texcoord[1]);
-                       glVertex2f(0, 0);
-                       glTexCoord2f(texcoord[2], texcoord[1]);
-                       glVertex2f(dst->w, 0);
-                       glTexCoord2f(texcoord[2], texcoord[3]);
-                       glVertex2f(dst->w, dst->h);
-                       glTexCoord2f(texcoord[0], texcoord[3]);
-                       glVertex2f(0, dst->h);
-               glEnd();
-
-       default:
-               glBegin(GL_TRIANGLE_STRIP);
-                       glTexCoord2f(texcoord[0], texcoord[1]); glVertex3i(0, 0, 0);
-                       glTexCoord2f(texcoord[2], texcoord[1]); glVertex3i(dst->w, 0, 0);
-                       glTexCoord2f(texcoord[0], texcoord[3]); glVertex3i(0, dst->h, 0);
-                       glTexCoord2f(texcoord[2], texcoord[3]); glVertex3i(dst->w, dst->h, 0);
-               glEnd();
-       }//*/
-
-       if (showOverlay)
-       {
-               glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-               glBindTexture(GL_TEXTURE_2D, overlayID);
-               glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, overlay->w, overlay->h, GL_RGBA, GL_UNSIGNED_BYTE, overlay->pixels);
-               glBegin(GL_QUADS);
-                       glTexCoord2f(overlayCoord[0], overlayCoord[1]);
-                       glVertex2f(0, 0);
-                       glTexCoord2f(overlayCoord[2], overlayCoord[1]);
-                       glVertex2f(dst->w, 0);
-                       glTexCoord2f(overlayCoord[2], overlayCoord[3]);
-                       glVertex2f(dst->w, dst->h);
-                       glTexCoord2f(overlayCoord[0], overlayCoord[3]);
-                       glVertex2f(0, dst->h);
-               glEnd();
-       }
-
-//Do some OpenGL stuff here...
-//Doesn't work...
-/*unsigned long int map[25] = {
-       0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
-       0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
-       0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
-       0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
-       0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF
-};
-glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-glRasterPos2i(10, 10);
-glDrawPixels(5, 5, GL_RGBA, GL_UNSIGNED_INT, map);//*/
-
-//  glFlush();
-       SDL_GL_SwapBuffers();
-//     glFinish();
-}
-
-void sdlemu_close_opengl(void)
-{
-       if (texture)
-               SDL_FreeSurface(texture);
-
-       if (overlay)
-               SDL_FreeSurface(overlay);
-}
-
-void sdlemu_create_texture(SDL_Surface * src, SDL_Surface * dst, int filter, int src_bpp)
-{
-    // Local variables.
-       int w , h;                         // w and h contain the width and height of the OpenGL texture.
-       Uint32 rmask, gmask, bmask, amask; // Needed for creating RGBA masks.
-       int bpp;
-
-       // Delete old texture (if allocated). Useful when there is a screen resize.
-       if (texture)
-               SDL_FreeSurface(texture);
-
-       // Texture width/height should be power of 2 of the SDL_Surface *src when using OpenGL.
-       // So, find the largest power of two that will contain both the width and height
-       w = power_of_two(src->w);
-       h = power_of_two(src->h);
-
-       WriteLog("OpenGL - Texture size : %d x %d\n", w, h);
-
-       // Setting bpp based upon src_bpp.
-       bpp = src_bpp;
-
-       // We allow the developer to set its own texture bpp. But if the value is NULL or
-       // not equal to 16, 24 or 32, we make the texturebpp the same as the BPP from src.
-       if (bpp == 16 || bpp == 24 || bpp == 32)
-               texturebpp = bpp;
-       else
-               texturebpp = src->format->BitsPerPixel;
-
-       WriteLog("OpenGL - Texture depth : %d bpp\n", texturebpp);
-
-       // Now were are going to create a SDL_Surface named texture. This will be our surface
-       // which will function as a buffer between the SDL_Surface *src and SDL_Surface *dst.
-       // This buffer is needed because we need to convert the SDL_Surface *src to an OpenGL
-       // texture with a depth of 16, 24 or 32 bpp, before we can blit the pixels to *dst
-       // using OpenGL.
-       //
-       // NOTE: Seems the byte order here *is* important!
-       switch (texturebpp)
-       {
-       case 16: // *src has depth of 16 bpp
-/*
-       According to information on the SDL mailinglist and on internet, the following
-       rgba masks should be the ones to use. But somehow the screen gets f*cked up and
-       the RGB colours are incorrect (at least in Virtual Jaguar/SDL).
-
-       Compile with -DOPENGL_16BPP_CORRECT_RGBA to use this RGBA values.
-*/
-#ifdef OPENGL_16BPP_CORRECT_RGBA
-               rmask = 0x7C00;
-               gmask = 0x03E0;
-               bmask = 0x001F;
-               amask = 0x0000;
-#else
-               rmask = 0x0000;
-               gmask = 0x0000;
-               bmask = 0x0000;
-               amask = 0x0000;
-#endif
-               break;
-       case 24: // *src has depth of 24 bpp
-       #if SDL_BYTEORDER == SDL_BIG_ENDIAN
-               rmask = 0x00FF0000;
-               gmask = 0x0000FF00;
-               bmask = 0x000000FF;
-               amask = 0x00000000; // IMPORTANT! 24 bpp doesn't use Alpha (at least in our case).
-       #else
-               rmask = 0x000000FF;
-               gmask = 0x0000FF00;
-               bmask = 0x00FF0000;
-               amask = 0x00000000; // IMPORTANT! 24 bpp doesn't use Alpha (at least in our case).
-       #endif
-               break;
-       case 32: //*src has depth of 32 bpp
-       default: //which is also the default.
-       #if SDL_BYTEORDER == SDL_BIG_ENDIAN
-               rmask = 0xFF000000;
-               gmask = 0x00FF0000;
-               bmask = 0x0000FF00;
-               amask = 0x000000FF;
-       #else
-               rmask = 0x000000FF;
-               gmask = 0x0000FF00;
-               bmask = 0x00FF0000;
-               amask = 0xFF000000;
-       #endif
-               break;
-       }
-
-       // Creating SDL_Surface texture based upon the above settings.
-       texture = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, texturebpp, rmask, gmask, bmask, amask);
-
-       if (texture == NULL)
-       {
-               WriteLog("sdlemu_opengl: Could not create texture surface! (SDL: %s)\n", SDL_GetError());
-       }
-
-       // Setting up OpenGL
-       glDisable(GL_FOG);
-       glDisable(GL_LIGHTING);
-       glDisable(GL_CULL_FACE);
-       glDisable(GL_DEPTH_TEST);
-//     glDisable(GL_BLEND);
-       glEnable(GL_BLEND);
-       glDisable(GL_NORMALIZE);
-       glDisable(GL_ALPHA_TEST);
-       glEnable(GL_TEXTURE_2D);
-//     glBlendFunc(GL_SRC_ALPHA, GL_ONE);
-//     glBlendFunc(GL_ONE, GL_SRC_ALPHA);
-//This works, but in a wrong way...
-//     glBlendFunc(GL_ONE, GL_ONE);
-
-       // Definitely needed for screen resolution larger then the *src.
-       // This way we can have automatic scaling functionality.
-       glViewport(0, 0, dst->w, dst->h);
-       glMatrixMode(GL_PROJECTION);
-       glPushMatrix();
-       glLoadIdentity();
-       glOrtho(0.0, (GLdouble)dst->w, (GLdouble)dst->h, 0.0, 0.0, 1.0);
-       glMatrixMode(GL_MODELVIEW);
-       glPushMatrix();
-       glLoadIdentity();
-
-       // Setting up the texture coordinates.
-       texcoord[0] = 0.0f;
-       texcoord[1] = 0.0f;
-       texcoord[2] = (GLfloat)(src->w) / texture->w;
-       texcoord[3] = (GLfloat)(src->h) / texture->h;
-
-       // create a RGB(A) texture for the texture surface
-       glGenTextures(1, &texid);
-       glBindTexture(GL_TEXTURE_2D, texid);
-
-       // Setting up the OpenGL Filters. These filters are important when we/you
-       // want to scale the texture.
-       if (filter)
-       {
-               // Textures are rendered in best quality.
-               WriteLog("OpenGL filters: enabled\n");
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-       }
-       else
-       {
-               // Textures are rendered in normal quality.
-               WriteLog("OpenGL filters: disabled\n");
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-       }
-
-       // Setting texture mode.
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-
-       // Generate the texture using the above information.
-       switch (texturebpp)
-       {
-       case 16:
-               // Normal 16bpp depth based textures consist out of GL_RGB5 and doesn't have support for Alpha channels.
-               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
-               break;
-       case 24:
-               // The 24bpp depth based textures consist out of GL_RGB8 and doesn't have support for Alpha channels.
-               //
-               // IMPORTANT : If you don't use Alpha. Use textures with a depth of 16bpp.
-               //             If you use Alpha. Use textures with a depth of 32bpp.
-               //             24bpp textures are SLOW and avoid them at all costs!
-               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
-               break;
-       case 32:
-       default:
-               // The 32bpp depth based textures consist out of GL_RGBA8 and has support for Alpha channels.
-               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-               break;
-       }
-}
-
-void sdlemu_create_overlay(SDL_Surface * dst, int src_bpp)
-{
-    // Local variables.
-       Uint32 rmask, gmask, bmask, amask; // Needed for creating RGBA masks.
-
-       // Delete old texture (if allocated). Useful when there is a screen resize.
-       if (overlay)
-               SDL_FreeSurface(overlay);
-
-       // Texture width/height should be power of 2 of the SDL_Surface *src when using OpenGL.
-       // So, find the largest power of two that will contain both the width and height
-       int w = power_of_two(dst->w);
-       int h = power_of_two(dst->h);
-
-       WriteLog("OpenGL - Overlay size : %d x %d\n", w, h);
-
-       // Setting bpp based upon src_bpp.
-       int bpp = src_bpp;
-
-       // We allow the developer to set its own texture bpp. But if the value is NULL or
-       // not equal to 16, 24 or 32, we make the texturebpp the same as the BPP from src.
-       if (bpp == 16 || bpp == 24 || bpp == 32)
-               texturebpp = bpp;
-       else
-               texturebpp = dst->format->BitsPerPixel;
-
-       WriteLog("OpenGL - Overlay depth : %d bpp\n", texturebpp);
-
-       // Now were are going to create a SDL_Surface named texture. This will be our surface
-       // which will function as a buffer between the SDL_Surface *src and SDL_Surface *dst.
-       // This buffer is needed because we need to convert the SDL_Surface *src to an OpenGL
-       // texture with a depth of 16, 24 or 32 bpp, before we can blit the pixels to *dst
-       // using OpenGL.
-       //
-       // NOTE: Seems the byte order here *is* important!
-       switch (texturebpp)
-       {
-       case 16: // *src has depth of 16 bpp
-/*
-       According to information on the SDL mailinglist and on internet, the following
-       rgba masks should be the ones to use. But somehow the screen gets f*cked up and
-       the RGB colours are incorrect (at least in Virtual Jaguar/SDL).
-
-       Compile with -DOPENGL_16BPP_CORRECT_RGBA to use this RGBA values.
-*/
-#ifdef OPENGL_16BPP_CORRECT_RGBA
-               rmask = 0x7C00;
-               gmask = 0x03E0;
-               bmask = 0x001F;
-               amask = 0x0000;
-#else
-               rmask = 0x0000;
-               gmask = 0x0000;
-               bmask = 0x0000;
-               amask = 0x0000;
-#endif
-               break;
-       case 24: // *src has depth of 24 bpp
-       #if SDL_BYTEORDER == SDL_BIG_ENDIAN
-               rmask = 0x00FF0000;
-               gmask = 0x0000FF00;
-               bmask = 0x000000FF;
-               amask = 0x00000000; // IMPORTANT! 24 bpp doesn't use Alpha (at least in our case).
-       #else
-               rmask = 0x000000FF;
-               gmask = 0x0000FF00;
-               bmask = 0x00FF0000;
-               amask = 0x00000000; // IMPORTANT! 24 bpp doesn't use Alpha (at least in our case).
-       #endif
-               break;
-       case 32: //*src has depth of 32 bpp
-       default: //which is also the default.
-       #if SDL_BYTEORDER == SDL_BIG_ENDIAN
-               rmask = 0xFF000000;
-               gmask = 0x00FF0000;
-               bmask = 0x0000FF00;
-               amask = 0x000000FF;
-       #else
-               rmask = 0x000000FF;
-               gmask = 0x0000FF00;
-               bmask = 0x00FF0000;
-               amask = 0xFF000000;
-       #endif
-               break;
-       }
-
-       // Creating SDL_Surface texture based upon the above settings.
-       overlay = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, texturebpp, rmask, gmask, bmask, amask);
-
-       if (overlay == NULL)
-       {
-               WriteLog("sdlemu_opengl: Could not create overlay surface! (SDL: %s)\n", SDL_GetError());
-       }
-
-       // Setting up the texture coordinates.
-       overlayCoord[0] = 0.0f;
-       overlayCoord[1] = 0.0f;
-       overlayCoord[2] = (GLfloat)(dst->w) / overlay->w;
-       overlayCoord[3] = (GLfloat)(dst->h) / overlay->h;
-
-       // create a RGB(A) texture for the texture surface
-       glGenTextures(1, &overlayID);
-       glBindTexture(GL_TEXTURE_2D, overlayID);
-
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-
-       // Setting texture mode.
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-
-       // Generate the texture using the above information.
-       switch (texturebpp)
-       {
-       case 16:
-               // Normal 16bpp depth based textures consist out of GL_RGB5 and doesn't have support for Alpha channels.
-               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, overlay->w, overlay->h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
-               break;
-       case 24:
-               // The 24bpp depth based textures consist out of GL_RGB8 and doesn't have support for Alpha channels.
-               //
-               // IMPORTANT : If you don't use Alpha. Use textures with a depth of 16bpp.
-               //             If you use Alpha. Use textures with a depth of 32bpp.
-               //             24bpp textures are SLOW and avoid them at all costs!
-               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, overlay->w, overlay->h, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
-               break;
-       case 32:
-       default:
-               // The 32bpp depth based textures consist out of GL_RGBA8 and has support for Alpha channels.
-               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, overlay->w, overlay->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
-               break;
-       }
-}
-
-void * sdlemuGetOverlayPixels(void)
-{
-       return overlay->pixels;
-}
-
-Uint32 sdlemuGetOverlayWidthInPixels(void)
-{
-       return overlay->pitch / 4;
-}
-
-void sdlemuEnableOverlay(void)
-{
-       showOverlay = 1;
-}
-
-void sdlemuDisableOverlay(void)
-{
-       showOverlay = 0;
-}
diff --git a/src/sdlemu_opengl.h b/src/sdlemu_opengl.h
deleted file mode 100644 (file)
index 22e0f9a..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * SDLEMU library - Free sdl related functions library
- * Copyrigh(c) 1999-2002 sdlemu development crew
- *
- *  This program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  This program is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-#ifndef __SDLEMU_OPENGL_H__
-#define __SDLEMU_OPENGL_H__
-
-#include "SDL.h"
-#include "SDL_opengl.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void sdlemu_init_opengl(SDL_Surface * src, SDL_Surface * dst, int texturetype, int filter, int src_bpp);
-void sdlemu_draw_texture(SDL_Surface * dst, SDL_Surface * src, int texturetype);
-void sdlemu_close_opengl(void);
-void sdlemu_create_texture(SDL_Surface * src, SDL_Surface * dst, int filter, int src_bpp);
-void * sdlemuGetOverlayPixels(void);
-Uint32 sdlemuGetOverlayWidthInPixels(void);
-void sdlemuEnableOverlay(void);
-void sdlemuDisableOverlay(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
index 40d417e3a7d276d4a66efb7127eb4ac4fec0e4a3..b647d5eb123230e34b826ced52cf6f6f30f2f33b 100644 (file)
@@ -2,15 +2,22 @@
 // SETTINGS.CPP: Virtual Jaguar configuration loading/saving support
 //
 // by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log
 //
 
 #include "settings.h"
 
-#include <stdlib.h>
-#include <string>
-#include "SDL.h"
-#include "sdlemu_config.h"
-#include "log.h"
+//#include <stdlib.h>
+//#include <string>
+//#include "SDL.h"
+//#include "sdlemu_config.h"
+//#include "log.h"
 
 using namespace std;
 
@@ -18,6 +25,7 @@ using namespace std;
 
 VJSettings vjs;
 
+#if 0
 // Private function prototypes
 
 void CheckForTrailingSlash(char * path);
@@ -116,3 +124,4 @@ void CheckForTrailingSlash(char * path)
                if (path[strlen(path) - 1] != '/')
                        strcat(path, "/");      // NOTE: Possible buffer overflow
 }
+#endif
\ No newline at end of file
index e527040803df63731e5c1cde94128c9bf916c56a..ccb9e2f1f22655d7b35c907909ca3248105ebcee 100644 (file)
@@ -30,11 +30,11 @@ struct VJSettings
        bool hardwareTypeAlpine;
        uint32 frameSkip;
        uint32 renderType;
-       
+
        // Keybindings in order of U, D, L, R, C, B, A, Op, Pa, 0-9, #, *
 
-       uint16 p1KeyBindings[21];
-       uint16 p2KeyBindings[21];
+       uint32 p1KeyBindings[21];
+       uint32 p2KeyBindings[21];
 
        // Paths
 
@@ -50,8 +50,8 @@ enum { RT_NORMAL = 0, RT_TV = 1 };
 
 // Exported functions
 
-void LoadVJSettings(void);
-void SaveVJSettings(void);
+//void LoadVJSettings(void);
+//void SaveVJSettings(void);
 
 // Exported variables
 
index 7b6f3d477c0133c776316d4a43e1d56ae632c0ce..1e0552013c83e502b29762759254f18c49b53e8b 100644 (file)
@@ -2,15 +2,24 @@
 // state.cpp: VJ machine state save/load support
 //
 // by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
 //
 
 #include "state.h"
 
 bool SaveState(void)
 {
+       return false;
 }
 
 bool LoadState(void)
 {
+       return false;
 }
 
index 7ff759791947aa2dd0ff7e54878cf83830e05329..54e3730121e0e003ccb690ee2e5b596c7aa0d4cc 100644 (file)
@@ -7,21 +7,6 @@
 #ifndef __STATE_H__
 #define __STATE_H__
 
-//#include <stdio.h>
-
-//#ifdef __cplusplus
-//extern "C" {
-//#endif
-
-//int LogInit(const char *);
-//FILE * LogGet(void);
-//void LogDone(void);
-//void WriteLog(const char * text, ...);
-
-//#ifdef __cplusplus
-//}
-//#endif
-
 bool SaveState(void);
 bool LoadState(void);
 
index f1a7ed8be3af6446efdddbc6e159ac511228a6df..cdf47979451ec617e799fb5f372a121d056eeb83 100644 (file)
@@ -4,8 +4,17 @@
 // Originally by David Raingeard (cal2)
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)
 // Cleanups and endian wrongness amelioration by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
+// JLH  01/20/2011  Change rendering to RGBA, removed unnecessary code
+//
 // Note: Endian wrongness probably stems from the MAME origins of this emu and
-//       the braindead way in which MAME handles memory. :-)
+//       the braindead way in which MAME used to handle memory. :-}
 //
 // Note: TOM has only a 16K memory space
 //
 #include "jaguar.h"
 #include "log.h"
 #include "m68k.h"
+//#include "memory.h"
 #include "objectp.h"
 #include "settings.h"
-#include "video.h"
 
 #define NEW_TIMER_SYSTEM
 
@@ -319,12 +328,8 @@ uint32 tomWidth, tomHeight;
 uint32 tomTimerPrescaler;
 uint32 tomTimerDivider;
 int32 tomTimerCounter;
-//uint32 tom_scanline;
-//uint32 hblankWidthInPixels = 0;
 uint16 tom_jerry_int_pending, tom_timer_int_pending, tom_object_int_pending,
        tom_gpu_int_pending, tom_video_int_pending;
-//uint16 * tom_cry_rgb_mix_lut;
-//int16 * TOMBackbuffer;
 uint32 * TOMBackbuffer;
 
 static const char * videoMode_to_str[8] =
@@ -341,13 +346,8 @@ void tom_render_16bpp_direct_scanline(uint32 * backbuffer);
 void tom_render_16bpp_rgb_scanline(uint32 * backbuffer);
 void tom_render_16bpp_cry_rgb_mix_scanline(uint32 * backbuffer);
 
-void tom_render_16bpp_cry_stretch_scanline(uint32 * backbuffer);
-void tom_render_24bpp_stretch_scanline(uint32 * backbuffer);
-void tom_render_16bpp_direct_stretch_scanline(uint32 * backbuffer);
-void tom_render_16bpp_rgb_stretch_scanline(uint32 * backbuffer);
-void tom_render_16bpp_cry_rgb_mix_stretch_scanline(uint32 * backbuffer);
-
-render_xxx_scanline_fn * scanline_render_normal[] =
+//render_xxx_scanline_fn * scanline_render_normal[] =
+render_xxx_scanline_fn * scanline_render[] =
 {
        tom_render_16bpp_cry_scanline,
        tom_render_24bpp_scanline,
@@ -359,21 +359,6 @@ render_xxx_scanline_fn * scanline_render_normal[] =
        tom_render_16bpp_rgb_scanline
 };
 
-render_xxx_scanline_fn * scanline_render_stretch[] =
-{
-       tom_render_16bpp_cry_stretch_scanline,
-       tom_render_24bpp_stretch_scanline,
-       tom_render_16bpp_direct_stretch_scanline,
-       tom_render_16bpp_rgb_stretch_scanline,
-       tom_render_16bpp_cry_rgb_mix_stretch_scanline,
-       tom_render_24bpp_stretch_scanline,
-       tom_render_16bpp_direct_stretch_scanline,
-       tom_render_16bpp_rgb_stretch_scanline,
-};
-
-render_xxx_scanline_fn * scanline_render[8];
-
-
 // Screen info for various games [PAL]...
 /*
 BIOS
@@ -548,32 +533,35 @@ uint32 RGB16ToRGB32[0x10000];
 uint32 CRY16ToRGB32[0x10000];
 uint32 MIX16ToRGB32[0x10000];
 
+#warning "This is not endian-safe. !!! FIX !!!"
 void TOMFillLookupTables(void)
 {
+       // NOTE: Jaguar 16-bit (non-CRY) color is RBG 556 like so:
+       //       RRRR RBBB BBGG GGGG
        for(uint32 i=0; i<0x10000; i++)
-               RGB16ToRGB32[i] = 0xFF000000
-                       | ((i & 0xF100) >> 8)  | ((i & 0xE000) >> 13)
-                       | ((i & 0x07C0) << 13) | ((i & 0x0700) << 8)
-                       | ((i & 0x003F) << 10) | ((i & 0x0030) << 4);
-
+//hm.          RGB16ToRGB32[i] = 0xFF000000
+//                     | ((i & 0xF100) >> 8)  | ((i & 0xE000) >> 13)
+//                     | ((i & 0x07C0) << 13) | ((i & 0x0700) << 8)
+//                     | ((i & 0x003F) << 10) | ((i & 0x0030) << 4);
+               RGB16ToRGB32[i] = 0x000000FF
+                       | ((i & 0xF100) << 16)                                  // Red
+                       | ((i & 0x003F) << 18)                                  // Green
+                       | ((i & 0x07C0) << 5);                                  // Blue
 
        for(uint32 i=0; i<0x10000; i++)
        {
-               uint32 chrm = (i & 0xF000) >> 12,
-                       chrl = (i & 0x0F00) >> 8,
-                       y = (i & 0x00FF);
+               uint32 cyan = (i & 0xF000) >> 12,
+                       red = (i & 0x0F00) >> 8,
+                       intensity = (i & 0x00FF);
 
-               uint32 r = (((uint32)redcv[chrm][chrl]) * y) >> 8,
-                       g = (((uint32)greencv[chrm][chrl]) * y) >> 8,
-                       b = (((uint32)bluecv[chrm][chrl]) * y) >> 8;
+               uint32 r = (((uint32)redcv[cyan][red]) * intensity) >> 8,
+                       g = (((uint32)greencv[cyan][red]) * intensity) >> 8,
+                       b = (((uint32)bluecv[cyan][red]) * intensity) >> 8;
 
-               CRY16ToRGB32[i] = 0xFF000000 | (b << 16) | (g << 8) | r;
-               MIX16ToRGB32[i] = CRY16ToRGB32[i];
+//hm.          CRY16ToRGB32[i] = 0xFF000000 | (b << 16) | (g << 8) | r;
+               CRY16ToRGB32[i] = 0x000000FF | (r << 24) | (g << 16) | (b << 8);
+               MIX16ToRGB32[i] = (i & 0x01 ? RGB16ToRGB32[i] : CRY16ToRGB32[i]);
        }
-
-       for(uint32 i=0; i<0x10000; i++)
-               if (i & 0x01)
-                       MIX16ToRGB32[i] = RGB16ToRGB32[i];
 }
 
 void TOMSetPendingJERRYInt(void)
@@ -613,10 +601,9 @@ uint8 TOMGetVideoMode(void)
 }
 
 //Used in only one place (and for debug purposes): OBJECTP.CPP
+#warning "Used in only one place (and for debug purposes): OBJECTP.CPP !!! FIX !!!"
 uint16 TOMGetVDB(void)
 {
-// This in NOT VDB!!!
-//     return GET16(tomRam8, VBE);
        return GET16(tomRam8, VDB);
 }
 
@@ -708,7 +695,8 @@ void tom_render_24bpp_scanline(uint32 * backbuffer)
                uint32 r = *current_line_buffer++;
                current_line_buffer++;
                uint32 b = *current_line_buffer++;
-               *backbuffer++ = 0xFF000000 | (b << 16) | (g << 8) | r;
+//hm.          *backbuffer++ = 0xFF000000 | (b << 16) | (g << 8) | r;
+               *backbuffer++ = 0x000000FF | (r << 24) | (g << 16) | (r << 8);
                width--;
        }
 }
@@ -764,132 +752,6 @@ void tom_render_16bpp_rgb_scanline(uint32 * backbuffer)
        }
 }
 
-/////////////////////////////////////////////////////////////////////
-// This stuff may just go away by itself, especially if we do some //
-// good old OpenGL goodness...                                     //
-/////////////////////////////////////////////////////////////////////
-
-void tom_render_16bpp_cry_rgb_mix_stretch_scanline(uint32 *backbuffer)
-{
-       uint16 width=tomWidth;
-       uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800];
-
-       while (width)
-       {
-               uint16 color = *current_line_buffer++;
-               color <<= 8;
-               color |= *current_line_buffer++;
-               *backbuffer++ = MIX16ToRGB32[color];
-               current_line_buffer += 2;
-               width--;
-       }
-}
-
-void tom_render_16bpp_cry_stretch_scanline(uint32 *backbuffer)
-{
-       uint32 chrm, chrl, y;
-
-       uint16 width=tomWidth;
-       uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800];
-
-       while (width)
-       {
-               uint16 color;
-               color=*current_line_buffer++;
-               color<<=8;
-               color|=*current_line_buffer++;
-
-               chrm = (color & 0xF000) >> 12;
-               chrl = (color & 0x0F00) >> 8;
-               y    = (color & 0x00FF);
-
-               uint16 red   =  ((((uint32)redcv[chrm][chrl])*y)>>11);
-               uint16 green =  ((((uint32)greencv[chrm][chrl])*y)>>11);
-               uint16 blue  =  ((((uint32)bluecv[chrm][chrl])*y)>>11);
-
-               uint16 color2;
-               color2=*current_line_buffer++;
-               color2<<=8;
-               color2|=*current_line_buffer++;
-
-               chrm = (color2 & 0xF000) >> 12;
-               chrl = (color2 & 0x0F00) >> 8;
-               y    = (color2 & 0x00FF);
-
-               uint16 red2   = ((((uint32)redcv[chrm][chrl])*y)>>11);
-               uint16 green2 = ((((uint32)greencv[chrm][chrl])*y)>>11);
-               uint16 blue2  = ((((uint32)bluecv[chrm][chrl])*y)>>11);
-
-               red=(red+red2)>>1;
-               green=(green+green2)>>1;
-               blue=(blue+blue2)>>1;
-
-               *backbuffer++=(red<<10)|(green<<5)|blue;
-               width--;
-       }
-}
-
-void tom_render_24bpp_stretch_scanline(uint32 *backbuffer)
-{
-       uint16 width=tomWidth;
-       uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800];
-
-       while (width)
-       {
-               uint16 green=*current_line_buffer++;
-               uint16 red=*current_line_buffer++;
-               /*uint16 nc=*/current_line_buffer++;
-               uint16 blue=*current_line_buffer++;
-               red>>=3;
-               green>>=3;
-               blue>>=3;
-               *backbuffer++=(red<<10)|(green<<5)|blue;
-               current_line_buffer+=4;
-               width--;
-       }
-}
-
-void tom_render_16bpp_direct_stretch_scanline(uint32 *backbuffer)
-{
-       uint16 width=tomWidth;
-       uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800];
-
-       while (width)
-       {
-               uint16 color=*current_line_buffer++;
-               color<<=8;
-               color|=*current_line_buffer++;
-               color>>=1;
-               *backbuffer++=color;
-               current_line_buffer+=2;
-               width--;
-       }
-}
-
-void tom_render_16bpp_rgb_stretch_scanline(uint32 *backbuffer)
-{
-       uint16 width=tomWidth;
-       uint8 *current_line_buffer=(uint8*)&tomRam8[0x1800];
-
-       while (width)
-       {
-               uint16 color1=*current_line_buffer++;
-               color1<<=8;
-               color1|=*current_line_buffer++;
-               color1>>=1;
-               uint16 color2=*current_line_buffer++;
-               color2<<=8;
-               color2|=*current_line_buffer++;
-               color2>>=1;
-               uint16 red=(((color1&0x7c00)>>10)+((color2&0x7c00)>>10))>>1;
-               uint16 green=(((color1&0x00003e0)>>5)+((color2&0x00003e0)>>5))>>1;
-               uint16 blue=(((color1&0x0000001f))+((color2&0x0000001f)))>>1;
-
-               color1=(red<<10)|(blue<<5)|green;
-               *backbuffer++=color1;
-               width--;
-       }
-}
 
 void TOMResetBackbuffer(uint32 * backbuffer)
 {
@@ -899,6 +761,7 @@ void TOMResetBackbuffer(uint32 * backbuffer)
 //
 // Process a single scanline
 //
+uint32 tomDeviceWidth;//kludge
 void TOMExecScanline(uint16 scanline, bool render)
 {
        bool inActiveDisplayArea = true;
@@ -1005,13 +868,16 @@ void tom_render_24bpp_scanline(uint32 * backbuffer)
                        // If outside of VDB & VDE, then display the border color
                        uint32 * currentLineBuffer = TOMBackbuffer;
                        uint8 g = tomRam8[BORD1], r = tomRam8[BORD1 + 1], b = tomRam8[BORD2 + 1];
-                       uint32 pixel = 0xFF000000 | (b << 16) | (g << 8) | r;
+//Hm.                  uint32 pixel = 0xFF000000 | (b << 16) | (g << 8) | r;
+                       uint32 pixel = 0x000000FF | (r << 24) | (g << 16) | (b << 8);
 
                        for(uint32 i=0; i<tomWidth; i++)
                                *currentLineBuffer++ = pixel;
                }
 
-               TOMBackbuffer += GetSDLScreenWidthInPixels();
+#warning "!!! Need to move this to an interface file !!! FIX !!!"
+//             TOMBackbuffer += GetSDLScreenWidthInPixels();
+               TOMBackbuffer += tomDeviceWidth;
        }
 }
 
@@ -1020,12 +886,10 @@ void tom_render_24bpp_scanline(uint32 * backbuffer)
 //
 void TOMInit(void)
 {
+       TOMFillLookupTables();
        OPInit();
        BlitterInit();
        TOMReset();
-       // Setup the non-stretchy scanline rendering...
-       memcpy(scanline_render, scanline_render_normal, sizeof(scanline_render));
-       TOMFillLookupTables();
 }
 
 void TOMDone(void)
@@ -1043,11 +907,6 @@ void TOMDone(void)
 //     memory_free(tom_cry_rgb_mix_lut);
 }
 
-/*uint32 tom_getHBlankWidthInPixels(void)
-{
-       return hblankWidthInPixels;
-}*/
-
 uint32 TOMGetVideoModeWidth(void)
 {
        //These widths are pretty bogus. Should use HDB1/2 & HDE/HBB & PWIDTH to calc the width...
@@ -1198,7 +1057,6 @@ void TOMReset(void)
        tomTimerPrescaler = 0;                                  // TOM PIT is disabled
        tomTimerDivider = 0;
        tomTimerCounter = 0;
-       memcpy(scanline_render, scanline_render_normal, sizeof(scanline_render));
 }
 
 //
@@ -1490,8 +1348,10 @@ if (offset == VMODE)
                {
                        tomWidth = width, tomHeight = height;
 
-                       if (vjs.renderType == RT_NORMAL)
-                               ResizeScreen(tomWidth, tomHeight);
+#warning "!!! TOM: ResizeScreen commented out !!!"
+// No need to resize anything, since we're prepared for this...
+//                     if (vjs.renderType == RT_NORMAL)
+//                             ResizeScreen(tomWidth, tomHeight);
                }
        }
 }
@@ -1503,18 +1363,6 @@ int TOMIRQEnabled(int irq)
        return tomRam8[INT1 + 1/*0xE1*/] & (1 << irq);
 }
 
-//unused
-/*void tom_set_irq_latch(int irq, int enabled)
-{
-       tomRam8[0xE0] = (tomRam8[0xE0] & (~(1<<irq))) | (enabled ? (1<<irq) : 0);
-}*/
-
-//unused
-/*uint16 tom_irq_control_reg(void)
-{
-       return (tomRam8[0xE0] << 8) | tomRam8[0xE1];
-}*/
-
 // NEW:
 // TOM Programmable Interrupt Timer handler
 // NOTE: TOM's PIT is only enabled if the prescaler is != 0
@@ -1569,16 +1417,15 @@ void TOMExecPIT(uint32 cycles)
        }
 }
 
-
 void TOMPITCallback(void)
 {
-//     INT1_RREG |= 0x08;                         // Set TOM PIT interrupt pending
+//     INT1_RREG |= 0x08;                                                      // Set TOM PIT interrupt pending
        TOMSetPendingTimerInt();
-    GPUSetIRQLine(GPUIRQ_TIMER, ASSERT_LINE);  // It does the 'IRQ enabled' checking
+    GPUSetIRQLine(GPUIRQ_TIMER, ASSERT_LINE);  // It does the 'IRQ enabled' checking
 
 //     if (INT1_WREG & 0x08)
        if (TOMIRQEnabled(IRQ_TIMER))
-               m68k_set_irq(7);                       // Generate 68K NMI
+               m68k_set_irq(7);                                                // Generate 68K NMI
 
        TOMResetPIT();
 }
index ea7ce35124de3ddd5d0112f19ae01de22a678bfc..a484d78775ab9e3dc1306e2c89effbcd67e533de 100644 (file)
--- a/src/tom.h
+++ b/src/tom.h
@@ -6,7 +6,8 @@
 #define __TOM_H__
 
 //#include "jaguar.h"
-#include "types.h"
+//#include "types.h"
+#include "memory.h"
 
 #define VIDEO_MODE_16BPP_CRY   0
 #define VIDEO_MODE_24BPP_RGB   1
@@ -60,4 +61,6 @@ extern uint32 tomTimerPrescaler;
 extern uint32 tomTimerDivider;
 extern int32 tomTimerCounter;
 
+extern uint32 tomDeviceWidth;
+
 #endif // __TOM_H__
index e001c992e9bcf7e635ae560f5a974c502b0f15dc..7b2a694d7c48cfe78f44ad6964becf0d5e74d536 100644 (file)
@@ -19,8 +19,4 @@ typedef int32_t               int32;
 typedef uint64_t       uint64;
 typedef int64_t                int64;
 
-// Read/write tracing enumeration
-
-enum { UNKNOWN, JAGUAR, DSP, GPU, TOM, JERRY, M68K, BLITTER, OP };
-
 #endif // __TYPES_H__
diff --git a/src/universalhdr.cpp b/src/universalhdr.cpp
new file mode 100644 (file)
index 0000000..a622d13
--- /dev/null
@@ -0,0 +1,274 @@
+//
+// Universal Header for Jaguar carts
+//
+// (C) 2011 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  06/28/2011  Created this file ;-)
+//
+
+//
+// This file was automagically generated by bin2c (by James L. Hammons)
+//
+
+unsigned char universalCartHeader[0x2000] = {
+       0xF6, 0x42, 0x23, 0x3C, 0x0D, 0xAC, 0x1D, 0x8D, 0xB0, 0x23, 0x71, 0x53, 0xBE, 0x87, 0x11, 0x17, 0x98, 0x27, 0x04, 0x26, 0x22, 0xC1, 0xBE, 0x1F, 0x79, 0x30, 0xDB, 0x90, 0xC6, 0xC8, 0x13, 0xF8,
+       0x09, 0x41, 0x99, 0x78, 0x51, 0xCB, 0xFF, 0x8C, 0xF9, 0x7F, 0x75, 0xF0, 0x6B, 0x0E, 0xFE, 0x13, 0x2D, 0x84, 0xD8, 0x21, 0xE5, 0x91, 0xD4, 0x01, 0x3F, 0x23, 0x5E, 0x13, 0xAE, 0xF2, 0x2F, 0xEF,
+       0x6C, 0x09, 0xD8, 0x06, 0x9F, 0x39, 0x27, 0x8F, 0x6D, 0x4F, 0x03, 0xD3, 0xD9, 0x84, 0x3D, 0xEA, 0xAB, 0xB7, 0x48, 0xF1, 0xE6, 0x98, 0x51, 0x27, 0xF0, 0x6E, 0x94, 0x0E, 0x90, 0x92, 0xC8, 0xF4,
+       0x50, 0x3B, 0x46, 0x58, 0x08, 0x23, 0xE0, 0x4B, 0xD2, 0x3C, 0x1C, 0xC5, 0x30, 0x6B, 0x11, 0x24, 0xFA, 0xC6, 0x78, 0x29, 0xD1, 0x53, 0x5A, 0x64, 0xE0, 0x91, 0x5A, 0x16, 0xEC, 0xD9, 0x87, 0xC4,
+       0xD8, 0x2D, 0x16, 0x98, 0x6A, 0x85, 0x29, 0x01, 0xF7, 0x25, 0xFB, 0xF6, 0xF9, 0xC1, 0x0F, 0x38, 0xA7, 0xB3, 0x9B, 0x1E, 0xC6, 0x19, 0x69, 0x1E, 0x6B, 0x05, 0x01, 0x77, 0xD0, 0xCD, 0x09, 0xF0,
+       0xA7, 0x0F, 0xAA, 0x76, 0x24, 0x92, 0x26, 0x28, 0xEF, 0x72, 0xE4, 0x86, 0x41, 0x3B, 0x83, 0x22, 0x3C, 0x07, 0x4F, 0x67, 0x0B, 0xB6, 0x27, 0x5F, 0x7C, 0xD7, 0xEC, 0x52, 0xF6, 0xBF, 0x44, 0xEE,
+       0x9C, 0x6B, 0x33, 0x0A, 0x36, 0xBE, 0x4C, 0xEB, 0x3E, 0x34, 0xE4, 0x3A, 0xFD, 0xF6, 0x75, 0x87, 0xB1, 0xED, 0xF6, 0x51, 0x72, 0x06, 0x99, 0x28, 0x10, 0x71, 0xD7, 0x44, 0x7E, 0xDE, 0x0F, 0x96,
+       0xF3, 0x84, 0x01, 0xFF, 0x59, 0x71, 0x33, 0xB2, 0x18, 0x55, 0x4E, 0x56, 0x43, 0x4C, 0xA6, 0xE9, 0x72, 0xE2, 0x4A, 0x9F, 0x04, 0x9A, 0x87, 0xF1, 0x73, 0x92, 0x86, 0x3E, 0x80, 0x07, 0x55, 0x1C,
+       0xCE, 0x57, 0x76, 0xD3, 0x1C, 0xC9, 0x43, 0x82, 0x7D, 0xCF, 0x19, 0x49, 0x6E, 0xFB, 0x19, 0x60, 0x74, 0x72, 0xD6, 0x90, 0x37, 0x81, 0x78, 0xFB, 0x10, 0x01, 0x7E, 0xE5, 0x5C, 0xB7, 0x81, 0x88,
+       0xE2, 0xEB, 0x07, 0xA2, 0x75, 0x10, 0x35, 0x11, 0xCB, 0xE9, 0x2E, 0x75, 0x39, 0x79, 0x3E, 0x76, 0xB8, 0xF8, 0x5A, 0x88, 0xFF, 0x6C, 0x77, 0x07, 0xBD, 0xCE, 0x05, 0xF6, 0xD2, 0x29, 0x03, 0x5F,
+       0xBE, 0x04, 0x51, 0xD8, 0xF7, 0x15, 0x07, 0xF9, 0xBE, 0xD9, 0x12, 0x27, 0x3D, 0xE0, 0xF2, 0xC0, 0x20, 0x2F, 0xBF, 0xA6, 0xBA, 0x76, 0x6B, 0x69, 0x8F, 0x05, 0x41, 0x01, 0x4D, 0x9E, 0xF0, 0x79,
+       0x87, 0xAF, 0x8C, 0xDB, 0xFB, 0x30, 0xE3, 0xC9, 0x51, 0x29, 0x2A, 0x3E, 0x91, 0x3A, 0xE0, 0x52, 0xEE, 0x45, 0xE6, 0x79, 0x5A, 0x3D, 0x92, 0x12, 0x12, 0x1F, 0x6C, 0x62, 0xA2, 0x9B, 0x99, 0xAC,
+       0xD8, 0x32, 0xF3, 0xF4, 0xCF, 0x4A, 0x09, 0x56, 0x5A, 0x0D, 0x76, 0x84, 0xE1, 0x5A, 0xFF, 0x23, 0x69, 0xD2, 0x03, 0xE6, 0x2E, 0x47, 0xC6, 0x54, 0x09, 0xA3, 0x47, 0x6E, 0x5B, 0x5A, 0xA1, 0xE8,
+       0x25, 0xC5, 0xA5, 0x61, 0x64, 0xB8, 0x82, 0xC8, 0x17, 0x1A, 0x8A, 0xC8, 0x1D, 0xEC, 0x49, 0x94, 0x1E, 0x00, 0xA0, 0x23, 0x39, 0x35, 0xF3, 0xB2, 0xA7, 0x54, 0x47, 0x90, 0xCB, 0x52, 0x40, 0x78,
+       0xA3, 0x33, 0x88, 0xEB, 0x23, 0x0A, 0x29, 0x1B, 0xC7, 0xB7, 0xE2, 0x10, 0x75, 0x9F, 0x27, 0x5B, 0xE3, 0x00, 0x63, 0x6F, 0x12, 0x55, 0x20, 0x0B, 0x44, 0xB2, 0x67, 0xEF, 0x74, 0x15, 0x17, 0xBB,
+       0x7B, 0xB7, 0x95, 0x78, 0xC0, 0xFE, 0x2C, 0x99, 0xDD, 0xFF, 0xDC, 0xFC, 0x43, 0xAF, 0x42, 0xC2, 0x27, 0x8A, 0x53, 0x9E, 0x62, 0x0B, 0x12, 0x8E, 0xD3, 0x5E, 0x76, 0x0F, 0x2B, 0x9D, 0x6D, 0x8D,
+       0x28, 0x44, 0xA0, 0xB4, 0xB1, 0x22, 0xA8, 0x9D, 0x2C, 0x01, 0x90, 0x04, 0xAB, 0x0D, 0x60, 0x29, 0x60, 0xD7, 0x49, 0x02, 0x24, 0x9E, 0x10, 0x1D, 0xE6, 0x1C, 0x58, 0xC9, 0xFC, 0x14, 0x97, 0x92,
+       0x23, 0x1E, 0x74, 0xDE, 0x23, 0xAF, 0xA7, 0xB6, 0xDB, 0x52, 0x78, 0xDA, 0x5E, 0x6C, 0x16, 0x6B, 0x36, 0x17, 0xBC, 0x01, 0x7F, 0x6A, 0x55, 0xA7, 0x7D, 0xC0, 0x60, 0xFD, 0x50, 0x72, 0x78, 0x62,
+       0x14, 0xFD, 0x06, 0xF7, 0x0F, 0x1E, 0x82, 0xCC, 0xFB, 0x0B, 0x62, 0x06, 0x78, 0x1D, 0x80, 0x0B, 0x55, 0xAE, 0xC9, 0x25, 0x61, 0x65, 0x88, 0xDB, 0x23, 0x0E, 0x0D, 0xFB, 0xD9, 0x3B, 0x41, 0x33,
+       0x85, 0xC8, 0x9F, 0x61, 0xBC, 0xC9, 0x17, 0x22, 0x29, 0x4E, 0x41, 0xCA, 0xA5, 0x4F, 0xDF, 0x7B, 0xF0, 0xB7, 0xC3, 0xA4, 0x93, 0xB2, 0xF2, 0xE7, 0x4D, 0x3B, 0x46, 0x21, 0x22, 0xD9, 0x50, 0x9F,
+       0x2E, 0x7F, 0x2B, 0xA3, 0xD2, 0xA1, 0x24, 0x68, 0xE4, 0xBF, 0x28, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0x04, 0x04, 0x04, 0x04, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+       0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
+};
diff --git a/src/universalhdr.h b/src/universalhdr.h
new file mode 100644 (file)
index 0000000..6f0ce53
--- /dev/null
@@ -0,0 +1,10 @@
+//
+// Universal Header for Jaguar carts
+//
+
+#ifndef __UNIVERSALHDR_H__
+#define __UNIVERSALHDR_H__
+
+extern unsigned char universalCartHeader[];
+
+#endif // __UNIVERSALHDR_H__
index 67a494c9d1d32a40eb747fd8f3c699354cb6285c..0aa231f0128ef92a5f0beb3c18cde1a7b044bab2 100644 (file)
@@ -1,24 +1,33 @@
 //
-// ZIP file support (mostly ripped from MAME)
+// ZIP file support (mostly ripped from MAME--thx MAME team!)
+// Mostly this is here to simplify interfacing to zlib...
 //
 // Added by James L. Hammons
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
+// JLH  02/28/2010  Removed unnecessary cruft
 //
 
+#include "unzip.h"
+
 #include <stdlib.h>
 #include <string.h>
 #include <ctype.h>
 #include <assert.h>
 #include <zlib.h>
-
-#include "unzip.h"
 #include "log.h"
 
 /* public globals */
 int    gUnzipQuiet = 0;                /* flag controls error messages */
 
 
-#define ERROR_CORRUPT "The zipfile seems to be corrupt, please check it"
-#define ERROR_FILESYSTEM "Your filesystem seems to be corrupt, please check it"
+#define ERROR_CORRUPT     "The zipfile seems to be corrupt, please check it"
+#define ERROR_FILESYSTEM  "Your filesystem seems to be corrupt, please check it"
 #define ERROR_UNSUPPORTED "The format of this zipfile is not supported, please recompress it"
 
 #define INFLATE_INPUT_BUFFER_MAX 16384
@@ -33,7 +42,7 @@ void errormsg(const char * extmsg, const char * usermsg, const char * zipname)
        if (!gUnzipQuiet)
                printf("Error in zipfile %s\n%s\n", zipname, usermsg);
        /* Output to log file with all informations */
-       WriteLog("Error in zipfile %s: %s\n", zipname, extmsg);
+//     WriteLog("Error in zipfile %s: %s\n", zipname, extmsg);
 }
 
 /* -------------------------------------------------------------------------
@@ -41,15 +50,17 @@ void errormsg(const char * extmsg, const char * usermsg, const char * zipname)
  ------------------------------------------------------------------------- */
 
 /* Use these to avoid structure padding and byte-ordering problems */
-static uint16_t read_word (char *buf) {
-   unsigned char *ubuf = (unsigned char *) buf;
+static uint16_t read_word(char * buf)
+{
+   unsigned char * ubuf = (unsigned char *)buf;
 
    return ((uint16_t)ubuf[1] << 8) | (uint16_t)ubuf[0];
 }
 
 /* Use these to avoid structure padding and byte-ordering problems */
-static uint32_t read_dword (char *buf) {
-   unsigned char *ubuf = (unsigned char *) buf;
+static uint32_t read_dword(char * buf)
+{
+   unsigned char * ubuf = (unsigned char *)buf;
 
    return ((uint32_t)ubuf[3] << 24) | ((uint32_t)ubuf[2] << 16) | ((uint32_t)ubuf[1] << 8) | (uint32_t)ubuf[0];
 }
@@ -61,16 +72,20 @@ static uint32_t read_dword (char *buf) {
        ==0 not found
        !=0 found, *offset valid
 */
-static int ecd_find_sig (char *buffer, int buflen, int *offset)
+static int ecd_find_sig(char * buffer, int buflen, int * offset)
 {
        static char ecdsig[] = { 'P', 'K', 0x05, 0x06 };
        int i;
-       for (i=buflen-22; i>=0; i--) {
-               if (memcmp(buffer+i, ecdsig, 4) == 0) {
+
+       for(i=buflen-22; i>=0; i--)
+       {
+               if (memcmp(buffer+i, ecdsig, 4) == 0)
+               {
                        *offset = i;
                        return 1;
                }
        }
+
        return 0;
 }
 
@@ -99,43 +114,46 @@ static int ecd_read(ZIP * zip)
 
                /* allocate buffer */
                buf = (char *)malloc(buf_length);
+
                if (!buf)
                {
                        return -1;
                }
 
-               if (fread(buf, 1, buf_length, zip->fp) != buf_length)
+               if (fread(buf, 1, buf_length, zip->fp) != (unsigned int)buf_length)
                {
                        free(buf);
                        return -1;
                }
 
-               if (ecd_find_sig(buf, buf_length, &offset)) {
+               if (ecd_find_sig(buf, buf_length, &offset))
+               {
                        zip->ecd_length = buf_length - offset;
 
-                       zip->ecd = (char*)malloc( zip->ecd_length );
-                       if (!zip->ecd) {
+                       zip->ecd = (char *)malloc(zip->ecd_length);
+
+                       if (!zip->ecd)
+                       {
                                free(buf);
                                return -1;
                        }
 
                        memcpy(zip->ecd, buf + offset, zip->ecd_length);
-
                        free(buf);
                        return 0;
                }
 
                free(buf);
 
-               if (buf_length < zip->length) {
+               if (buf_length < zip->length)
+               {
                        /* double buffer */
-                       buf_length = 2*buf_length;
-
+                       buf_length = 2 * buf_length;
                        WriteLog("Retry reading of zip ecd for %d bytes\n",buf_length);
 
-               } else {
-                       return -1;
                }
+               else
+                       return -1;
        }
 }
 
@@ -197,9 +215,7 @@ ZIP * openzip(int pathtype, int pathindex, const char * zipfile)
        /* allocate */
        ZIP * zip = (ZIP *)malloc(sizeof(ZIP));
        if (!zip)
-       {
                return 0;
-       }
 
        /* open */
        zip->fp = fopen(zipfile, "rb");
@@ -257,9 +273,9 @@ ZIP * openzip(int pathtype, int pathindex, const char * zipfile)
        zip->zipfile_comment = zip->ecd+ZIPECOM;
 
        /* verify that we can work with this zipfile (no disk spanning allowed) */
-       if ((zip->number_of_this_disk != zip->number_of_disk_start_cent_dir) ||
-               (zip->total_entries_cent_dir_this_disk != zip->total_entries_cent_dir) ||
-               (zip->total_entries_cent_dir < 1))
+       if ((zip->number_of_this_disk != zip->number_of_disk_start_cent_dir)
+               || (zip->total_entries_cent_dir_this_disk != zip->total_entries_cent_dir)
+               || (zip->total_entries_cent_dir < 1))
        {
                errormsg("Cannot span disks", ERROR_UNSUPPORTED, zipfile);
                free(zip->ecd);
@@ -327,7 +343,8 @@ ZIP * openzip(int pathtype, int pathindex, const char * zipfile)
      !=0 success
      ==0 error
 */
-struct zipent* readzip(ZIP* zip) {
+struct zipent * readzip(ZIP * zip)
+{
 
        /* end of directory */
        if (zip->cd_pos >= zip->size_of_cent_dir)
@@ -381,9 +398,11 @@ void closezip(ZIP * zip)
        free(zip->ent.name);
        free(zip->cd);
        free(zip->ecd);
+
        /* only if not suspended */
        if (zip->fp)
                fclose(zip->fp);
+
        free(zip->zip);
        free(zip);
 }
@@ -658,137 +677,6 @@ int readuncompresszip(ZIP * zip, struct zipent * ent, char * data)
        }
 }
 
-/* -------------------------------------------------------------------------
-   Zip cache support
- ------------------------------------------------------------------------- */
-
-/* Use the zip cache */
-// No, don't
-//#define ZIP_CACHE
-
-#ifdef ZIP_CACHE
-
-/* ZIP cache entries */
-#define ZIP_CACHE_MAX 5
-
-/* ZIP cache buffer LRU ( Last Recently Used )
-     zip_cache_map[0] is the newer
-     zip_cache_map[ZIP_CACHE_MAX-1] is the older
-*/
-static ZIP* zip_cache_map[ZIP_CACHE_MAX];
-
-static ZIP* cache_openzip(int pathtype, int pathindex, const char* zipfile) {
-       ZIP* zip;
-       unsigned i;
-
-       /* search in the cache buffer */
-       for(i=0;i<ZIP_CACHE_MAX;++i) {
-               if (zip_cache_map[i] && zip_cache_map[i]->pathtype == pathtype && zip_cache_map[i]->pathindex == pathindex && strcmp(zip_cache_map[i]->zip,zipfile)==0) {
-                       /* found */
-                       unsigned j;
-
-/*
-                       WriteLog("Zip cache HIT  for %s\n", zipfile);
-*/
-
-                       /* reset the zip directory */
-                       rewindzip( zip_cache_map[i] );
-
-                       /* store */
-                       zip = zip_cache_map[i];
-
-                       /* shift */
-                       for(j=i;j>0;--j)
-                               zip_cache_map[j] = zip_cache_map[j-1];
-
-                       /* set the first entry */
-                       zip_cache_map[0] = zip;
-
-                       return zip_cache_map[0];
-               }
-       }
-       /* not found */
-
-/*
-       WriteLog("Zip cache FAIL for %s\n", zipfile);
-*/
-
-       /* open the zip */
-       zip = openzip( pathtype, pathindex, zipfile );
-       if (!zip)
-               return 0;
-
-       /* close the oldest entry */
-       if (zip_cache_map[ZIP_CACHE_MAX-1]) {
-               /* close last zip */
-               closezip(zip_cache_map[ZIP_CACHE_MAX-1]);
-               /* reset the entry */
-               zip_cache_map[ZIP_CACHE_MAX-1] = 0;
-       }
-
-       /* shift */
-       for(i=ZIP_CACHE_MAX-1;i>0;--i)
-               zip_cache_map[i] = zip_cache_map[i-1];
-
-       /* set the first entry */
-       zip_cache_map[0] = zip;
-
-       return zip_cache_map[0];
-}
-
-static void cache_closezip(ZIP* zip) {
-       unsigned i;
-
-       /* search in the cache buffer */
-       for(i=0;i<ZIP_CACHE_MAX;++i) {
-               if (zip_cache_map[i]==zip) {
-                       /* close zip */
-                       closezip(zip);
-
-                       /* reset cache entry */
-                       zip_cache_map[i] = 0;
-                       return;
-
-               }
-       }
-       /* not found */
-
-       /* close zip */
-       closezip(zip);
-}
-
-/* CK980415 added to allow osd code to clear zip cache for auditing--each time
-   the user opens up an audit for a game we should reread the zip */
-void unzip_cache_clear()
-{
-       unsigned i;
-
-       /* search in the cache buffer for any zip info and clear it */
-       for(i=0;i<ZIP_CACHE_MAX;++i) {
-               if (zip_cache_map[i] != NULL) {
-                       /* close zip */
-                       closezip(zip_cache_map[i]);
-
-                       /* reset cache entry */
-                       zip_cache_map[i] = 0;
-/*                     return; */
-
-               }
-       }
-}
-
-#define cache_suspendzip(a) suspendzip(a)
-
-#else
-
-#define cache_openzip(a,b,c) openzip(a,b,c)
-#define cache_closezip(a) closezip(a)
-#define cache_suspendzip(a) closezip(a)
-
-#define unzip_cache_clear()
-
-#endif
-
 /* -------------------------------------------------------------------------
    Backward MAME compatibility
  ------------------------------------------------------------------------- */
@@ -826,15 +714,13 @@ static int equal_filename(const char * zipfile, const char * file)
 
 //
 // Pass the path to the zipfile and the name of the file within the zipfile.
-// buf will be set to point to the uncompressed image of that zipped file.
+// buf is set to point to the uncompressed image of that zipped file (preallocated by user!).
 // length will be set to the length of the uncompressed data.
 //
 int load_zipped_file(int pathtype, int pathindex, const char * zipfile, const char * filename, unsigned char ** buf, uint32_t * length)
 {
-       ZIP * zip;
-       struct zipent * ent;
+       ZIP * zip = openzip(pathtype, pathindex, zipfile);
 
-       zip = cache_openzip(pathtype, pathindex, zipfile);
        if (!zip)
                return -1;
 
@@ -843,7 +729,7 @@ int load_zipped_file(int pathtype, int pathindex, const char * zipfile, const ch
                /* NS981003: support for "load by CRC" */
                char crc[9];
 
-               ent = &(zip->ent);
+               struct zipent * ent = &(zip->ent);
                sprintf(crc, "%08x", (unsigned int)ent->crc32);
 
                if (filename == NULL || equal_filename(ent->name, filename)
@@ -853,15 +739,15 @@ int load_zipped_file(int pathtype, int pathindex, const char * zipfile, const ch
 
                        if (readuncompresszip(zip, ent, (char *)*buf) != 0)
                        {
-                               cache_closezip(zip);
+                               closezip(zip);
                                return -1;
                        }
 
-                       cache_suspendzip(zip);
+                       suspendzip(zip);
                        return 0;
                }
        }
 
-       cache_suspendzip(zip);
+       suspendzip(zip);
        return -1;
 }
diff --git a/src/video.cpp b/src/video.cpp
deleted file mode 100644 (file)
index 4f33d66..0000000
+++ /dev/null
@@ -1,332 +0,0 @@
-//
-// VIDEO.CPP: SDL/local hardware specific video routines
-//
-// by James L. Hammons
-//
-
-#include "video.h"
-
-#include "gui.h"                                                               // For "finished"
-#include "log.h"
-#include "tom.h"
-#include "sdlemu_opengl.h"
-#include "settings.h"
-
-// External global variables
-
-//shouldn't these exist here??? Prolly.
-//And now, they do! :-)
-SDL_Surface * surface, * mainSurface;
-SDL_Joystick * joystick;
-Uint32 mainSurfaceFlags;
-//int16 * backbuffer;
-uint32 * backbuffer;
-
-#if SDL_BYTEORDER == SDL_BIG_ENDIAN
-       #define RMASK 0xFF000000
-       #define GMASK 0x00FF0000
-       #define BMASK 0x0000FF00
-       #define AMASK 0x000000FF
-#else
-       #define RMASK 0x000000FF
-       #define GMASK 0x0000FF00
-       #define BMASK 0x00FF0000
-       #define AMASK 0xFF000000
-#endif
-
-
-// One of the reasons why OpenGL is slower then normal SDL rendering, is because
-// the data is being pumped into the buffer every frame with a overflow as result.
-// So, we going tot render every 1 frame instead of every 0 frame.
-
-// [Shamus] This isn't the case. OpenGL is slower because 60 frames a second is a
-//          lot of data to pump through the system. In any case, frameskip is probably
-//          a good idea for now, since most systems are probably too slow to run at
-//          60 FPS. But doing so will have some nasty side effects in some games.
-//          You have been warned!
-
-int frame_ticker = 0;
-
-//
-// Create SDL/OpenGL surfaces
-//
-bool VideoInit(void)
-{
-       // Get proper info about the platform we're running on...
-       const SDL_VideoInfo * info = SDL_GetVideoInfo();
-
-       if (!info)
-       {
-               WriteLog("VJ: SDL is unable to get the video info: %s\n", SDL_GetError());
-               return false;
-       }
-
-       if (vjs.useOpenGL)
-       {
-               // Initializing SDL attributes with OpenGL
-               SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 0);
-               SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
-               mainSurfaceFlags = SDL_OPENGL;
-       }
-       else
-       {
-               if (info->hw_available)
-                       mainSurfaceFlags = SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF;
-
-               if (info->blit_hw)
-                       mainSurfaceFlags |= SDL_HWACCEL;
-       }
-
-       if (vjs.fullscreen)
-               mainSurfaceFlags |= SDL_FULLSCREEN;
-
-/*     if (!vjs.useOpenGL)
-//             mainSurface = SDL_SetVideoMode(VIRTUAL_SCREEN_WIDTH, VIRTUAL_SCREEN_HEIGHT_NTSC, 16, mainSurfaceFlags);
-               mainSurface = SDL_SetVideoMode(VIRTUAL_SCREEN_WIDTH,
-                       (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL),
-                       16, mainSurfaceFlags);
-       else
-               // When OpenGL is used, we're going to use a standard resolution of 640x480.
-               // This way we have good scaling functionality and when the screen is resized
-               // because of the NTSC <-> PAL resize, we only have to re-create the texture
-               // instead of initializing the entire OpenGL texture en screens.
-               mainSurface = SDL_SetVideoMode(640, 480, 16, mainSurfaceFlags);//*/
-//24BPP
-       if (!vjs.useOpenGL)
-//             mainSurface = SDL_SetVideoMode(VIRTUAL_SCREEN_WIDTH, VIRTUAL_SCREEN_HEIGHT_NTSC, 16, mainSurfaceFlags);
-               mainSurface = SDL_SetVideoMode(VIRTUAL_SCREEN_WIDTH,
-                       (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL),
-                       32, mainSurfaceFlags);
-       else
-               // When OpenGL is used, we're going to use a standard resolution of 640x480.
-               // This way we have good scaling functionality and when the screen is resized
-               // because of the NTSC <-> PAL resize, we only have to re-create the texture
-               // instead of initializing the entire OpenGL texture en screens.
-               mainSurface = SDL_SetVideoMode(640, 480, 32, mainSurfaceFlags);//*/
-
-       if (mainSurface == NULL)
-       {
-               WriteLog("VJ: SDL is unable to set the video mode: %s\n", SDL_GetError());
-               return false;
-       }
-
-       SDL_WM_SetCaption("Virtual Jaguar", "Virtual Jaguar");
-
-       // Create the primary SDL display (16 BPP, 5/5/5 RGB format)
-/*     surface = SDL_CreateRGBSurface(SDL_SWSURFACE, VIRTUAL_SCREEN_WIDTH,
-               (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL),
-               16, 0x7C00, 0x03E0, 0x001F, 0);//*/
-
-       uint32 vsWidth = (vjs.renderType == RT_TV ? 1280 : VIRTUAL_SCREEN_WIDTH),
-               vsHeight = (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL);
-
-//     if (vjs.renderType == RT_TV)
-//             vsWidth = 1280;
-//24BPP
-//     surface = SDL_CreateRGBSurface(SDL_SWSURFACE, VIRTUAL_SCREEN_WIDTH,
-       surface = SDL_CreateRGBSurface(SDL_SWSURFACE, vsWidth, vsHeight, 32, RMASK, GMASK, BMASK, AMASK);
-
-       if (surface == NULL)
-       {
-               WriteLog("VJ: Could not create primary SDL surface: %s\n", SDL_GetError());
-               return false;
-       }
-
-       if (vjs.useOpenGL)
-               // Let us setup OpenGL and our rendering texture. We give the src (surface) and the
-               // dst (mainSurface) display as well as the automatic bpp selection as options so that
-               // our texture is automatically created :)
-               sdlemu_init_opengl(surface, mainSurface, 1 /*method*/,
-                       vjs.glFilter /*texture type (linear, nearest)*/,
-                       0 /* Automatic bpp selection based upon src */);
-
-       // Initialize Joystick support under SDL
-
-       if (vjs.useJoystick)
-       {
-               if (SDL_NumJoysticks() <= 0)
-               {
-                       vjs.useJoystick = false;
-                       printf("VJ: No joystick(s) or joypad(s) detected on your system. Using keyboard...\n");
-               }
-               else
-               {
-                       if ((joystick = SDL_JoystickOpen(vjs.joyport)) == 0)
-                       {
-                               vjs.useJoystick = false;
-                               printf("VJ: Unable to open a Joystick on port: %d\n", (int)vjs.joyport);
-                       }
-                       else
-                               printf("VJ: Using: %s\n", SDL_JoystickName(vjs.joyport));
-               }
-       }
-
-       // Set up the backbuffer
-       // To be safe, this should be 1280 * 625 * 2...
-       backbuffer = (uint32 *)malloc(1280 * 625 * sizeof(uint32));
-       memset(backbuffer, 0x44, VIRTUAL_SCREEN_WIDTH *
-               (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL)
-               * sizeof(uint32));
-
-       return true;
-}
-
-//
-// Free various SDL components
-//
-void VideoDone(void)
-{
-       if (vjs.useOpenGL)
-               sdlemu_close_opengl();
-
-       SDL_JoystickClose(joystick);
-       SDL_FreeSurface(surface);
-       free(backbuffer);
-}
-
-//
-// Render the backbuffer to the primary screen surface
-//
-void RenderBackbuffer(void)
-{
-       // Handle frameskip *before* we do any heavy lifting here...
-
-       if (frame_ticker > 0)
-       {
-               frame_ticker--;
-               return;
-       }
-
-       frame_ticker = vjs.frameSkip;                           // Reset frame_ticker
-
-       if (SDL_MUSTLOCK(surface))
-               while (SDL_LockSurface(surface) < 0)
-                       SDL_Delay(10);
-
-//     memcpy(surface->pixels, backbuffer, tom_getVideoModeWidth() * tom_getVideoModeHeight() * 2);
-// This memcpy is expensive--do some profiling to see what the impact is!
-       if (vjs.renderType == RT_NORMAL)
-               memcpy(surface->pixels, backbuffer, TOMGetVideoModeWidth() * TOMGetVideoModeHeight() * 4);
-       else if (vjs.renderType == RT_TV)
-               memcpy(surface->pixels, backbuffer, 1280 * TOMGetVideoModeHeight() * 4);
-
-       if (SDL_MUSTLOCK(surface))
-               SDL_UnlockSurface(surface);
-
-       if (vjs.useOpenGL)
-               // One of the reasons why OpenGL is slower then normal SDL rendering, is because
-               // the data is being pumped into the buffer every frame with a overflow as result.
-               // So, we going to render every 1 fps instead of every 0 fps.
-               // [Shamus] This is isn't why it's slower--see top of file for explanation... ;-)
-//The problem lies in this function...
-               sdlemu_draw_texture(mainSurface, surface, 1/*1=GL_QUADS*/);
-       else
-       {
-               SDL_Rect rect = { 0, 0, surface->w, surface->h };
-               SDL_BlitSurface(surface, &rect, mainSurface, &rect);
-               SDL_Flip(mainSurface);
-    }
-}
-
-//
-// Resize the main SDL screen & backbuffer
-//
-void ResizeScreen(uint32 width, uint32 height)
-{
-       SDL_FreeSurface(surface);
-       surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, RMASK, GMASK, BMASK, AMASK);
-
-       if (surface == NULL)
-       {
-               WriteLog("Video: Could not create primary SDL surface: %s", SDL_GetError());
-//This is just crappy. We shouldn't exit this way--it leaves all kinds of memory leaks
-//as well as screwing up SDL... !!! FIX !!!
-//             exit(1);
-               // OK, this is cleaner. We can't continue if there is no surface created!
-               finished = true;
-       }
-
-       if (vjs.useOpenGL)
-       {
-               // Recreate the texture because of the NTSC <-> PAL screen resize.
-//Not sure why this is here...
-//Is it because of the resized surface up above?
-               sdlemu_create_texture(surface, mainSurface, vjs.glFilter, 0);
-       }
-       else
-       {
-               mainSurface = SDL_SetVideoMode(width, height, 32, mainSurfaceFlags);
-
-               if (mainSurface == NULL)
-               {
-                       WriteLog("Video: SDL is unable to set the video mode: %s\n", SDL_GetError());
-// Don't exit because we can't resize!
-//                     exit(1);
-               }
-       }
-
-       char window_title[64];
-
-       sprintf(window_title, "Virtual Jaguar (%i x %i)", (int)width, (int)height);
-       SDL_WM_SetCaption((vjs.useOpenGL ? "Virtual Jaguar (OpenGL)" : window_title), "Virtual Jaguar");
-}
-
-//
-// Return the screen's width in pixels
-//
-uint32 GetSDLScreenWidthInPixels(void)
-{
-       return surface->pitch / 4;                                              // Pitch / 4 since we're in 32BPP mode
-}
-
-//
-// Fullscreen <-> window switching
-//
-void ToggleFullscreen(void)
-{
-       // Set our internal variable, then toggle the SDL flag
-       vjs.fullscreen = !vjs.fullscreen;
-       mainSurfaceFlags ^= SDL_FULLSCREEN;
-//     mainSurfaceFlags = (vjs.fullscreen ? mainSurfaceFlags | SDL_FULLSCREEN :
-//             mainSurfaceFlags & ~SDL_FULLSCREEN);
-
-//     mainSurfaceFlags &= ~SDL_FULLSCREEN;
-
-//     if (vjs.fullscreen)
-//             mainSurfaceFlags |= SDL_FULLSCREEN;
-
-       if (vjs.useOpenGL)
-       {
-               // When OpenGL is used, we're going to use a standard resolution of 640x480.
-               // This way we have good scaling functionality and when the screen is resized
-               // because of the NTSC <-> PAL resize, we only have to re-create the texture
-               // instead of initializing the entire OpenGL texture en screens.
-               mainSurface = SDL_SetVideoMode(640, 480, 32, mainSurfaceFlags);
-
-               // Reset viewport, etc.
-               glViewport(0, 0, mainSurface->w, mainSurface->h);
-               glMatrixMode(GL_PROJECTION);
-               glPushMatrix();
-               glLoadIdentity();
-               glOrtho(0.0, (GLdouble)mainSurface->w, (GLdouble)mainSurface->h, 0.0, 0.0, 1.0);
-               glMatrixMode(GL_MODELVIEW);
-               glPushMatrix();
-               glLoadIdentity();
-       }
-       else
-               mainSurface = SDL_SetVideoMode(VIRTUAL_SCREEN_WIDTH,
-                       (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL),
-                       32, mainSurfaceFlags);
-
-       if (mainSurface == NULL)
-       {
-               WriteLog("Video: SDL was unable to switch the video to %s: %s\n", (vjs.fullscreen ? "fullscreen" : "windowed"), SDL_GetError());
-// Shouldn't exit because we can't switch! BAD!!!
-//             exit(1);
-               return;
-       }
-
-       SDL_WM_SetCaption((vjs.useOpenGL ? "Virtual Jaguar (OpenGL)" : "Virtual Jaguar"), "Virtual Jaguar");
-
-       return;
-}
diff --git a/src/video.h b/src/video.h
deleted file mode 100644 (file)
index 8dd3364..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-//
-// VIDEO.H: Header file
-//
-
-#ifndef __VIDEO_H__
-#define __VIDEO_H__
-
-#include "types.h"
-
-#define VIRTUAL_SCREEN_WIDTH           320
-#define VIRTUAL_SCREEN_HEIGHT_NTSC     240
-#define VIRTUAL_SCREEN_HEIGHT_PAL      256
-
-bool VideoInit(void);
-void VideoDone(void);
-void RenderBackbuffer(void);
-void ResizeScreen(uint32 width, uint32 height);
-uint32 GetSDLScreenWidthInPixels(void);
-void ToggleFullscreen(void);
-
-// Exported vars
-
-extern uint32 * backbuffer;
-
-#endif // __VIDEO_H__
similarity index 96%
rename from src/vj.cpp
rename to src/virtualjaguar.cpp
index 123a0f56d0cce77b6cc5de48ebb2d7c9f3ef23c1..e29f65b3a47200aa58c7c231818d7483df06761c 100644 (file)
@@ -9,7 +9,7 @@
 #include <SDL.h>
 #include <time.h>
 #include "file.h"
-#include "gui.h"
+//#include "gui.h"
 #include "jaguar.h"
 #include "log.h"
 #include "memory.h"
@@ -39,7 +39,7 @@
 //Maybe we should move the video stuff to TOM? Makes more sense to put it there...
 //Actually, it would probably be better served in VIDEO.CPP... !!! FIX !!! [DONE]
 //uint32 totalFrames;//temp, so we can grab this from elsewhere...
-int main(int argc, char * argv[])
+int main_old(int argc, char * argv[])
 {
 //NOTE: This isn't actually used anywhere... !!! FIX !!!
        int32 nFrameskip = 0;                                                   // Default: Show every frame
@@ -75,6 +75,7 @@ int main(int argc, char * argv[])
                if (!strcmp(argv[i], "-joyport"))
                {
                        vjs.joyport = atoi(argv[++i]) + 1;
+
                        if (vjs.joyport > 3)
                                vjs.joyport = 3;
                }
@@ -82,6 +83,7 @@ int main(int argc, char * argv[])
                if (!strcmp(argv[i], "-frameskip"))
                {
                        nFrameskip = atoi(argv[++i]) + 1;
+
                        if (nFrameskip > 10)
                                nFrameskip = 10;
                }
@@ -157,8 +159,8 @@ int main(int argc, char * argv[])
 
        WriteLog("VJ: SDL successfully initialized.\n");
 
-       WriteLog("Initializing memory subsystem...\n");
-       MemoryInit();
+//     WriteLog("Initializing memory subsystem...\n");
+//     MemoryInit();
 #ifdef VJ_RELEASE_VERSION
        WriteLog("Virtual Jaguar %s (Last full build was on %s %s)\n", VJ_RELEASE_VERSION, __DATE__, __TIME__);
 #else
@@ -188,11 +190,13 @@ WriteLog("About to attempt to load BIOSes...\n");
 WriteLog("Initializing video subsystem...\n");
        VideoInit();
 WriteLog("Initializing GUI subsystem...\n");
-       GUIInit();
+#warning "!!! FIX !!! (GUIInit())"
+//     GUIInit();
 
        // Now with crunchy GUI goodness!
 WriteLog("About to start GUI...\n");
-       GUIMain(haveCart ? argv[1] : NULL);
+#warning "!!! FIX !!! (GUIMain(...))"
+//     GUIMain(haveCart ? argv[1] : NULL);
 
 //This is no longer accurate...!
 //     int elapsedTime = clock() - startTime;
@@ -201,12 +205,12 @@ WriteLog("About to start GUI...\n");
 
        JaguarDone();
        VideoDone();
-       MemoryDone();
+//     MemoryDone();
        LogDone();
 
        // Free SDL components last...!
        SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO | SDL_INIT_TIMER);
        SDL_Quit();
 
-    return 0;
+       return 0;
 }
diff --git a/src/wavetable.cpp b/src/wavetable.cpp
new file mode 100644 (file)
index 0000000..c9998cd
--- /dev/null
@@ -0,0 +1,278 @@
+//
+// Jaguar Wavetable ROM
+//
+// (C) 2010 Underground Software
+//
+// JLH = James L. Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/16/2010  Created this log ;-)
+//
+
+//
+// In a real Jaguar, these are 16-bit values that are sign-extended to 32 bits.
+// Each entry has 128 values (e.g., SINE goes from F1D200-F1D3FF)
+//
+// NOTE: This can probably be converted to 32-bit table, since I don't think
+//       that unaligned access is allowed...
+
+/*const*/ unsigned char waveTableROM[4096] =
+{
+    0xFF, 0xFF, 0xC2, 0x01, 0xFF, 0xFF, 0xC4, 0x01, 0xFF, 0xFF, 0xC6, 0x01, 0xFF, 0xFF, 0xC8, 0x01,
+    0xFF, 0xFF, 0xCA, 0x01, 0xFF, 0xFF, 0xCC, 0x01, 0xFF, 0xFF, 0xCE, 0x01, 0xFF, 0xFF, 0xD0, 0x01,
+    0xFF, 0xFF, 0xD2, 0x01, 0xFF, 0xFF, 0xD4, 0x01, 0xFF, 0xFF, 0xD6, 0x01, 0xFF, 0xFF, 0xD8, 0x01,
+    0xFF, 0xFF, 0xDA, 0x01, 0xFF, 0xFF, 0xDC, 0x01, 0xFF, 0xFF, 0xDE, 0x01, 0xFF, 0xFF, 0xE0, 0x01,
+    0xFF, 0xFF, 0xE2, 0x01, 0xFF, 0xFF, 0xE4, 0x01, 0xFF, 0xFF, 0xE6, 0x01, 0xFF, 0xFF, 0xE8, 0x01,
+    0xFF, 0xFF, 0xEA, 0x01, 0xFF, 0xFF, 0xEC, 0x01, 0xFF, 0xFF, 0xEE, 0x01, 0xFF, 0xFF, 0xF0, 0x01,
+    0xFF, 0xFF, 0xF2, 0x01, 0xFF, 0xFF, 0xF4, 0x01, 0xFF, 0xFF, 0xF6, 0x01, 0xFF, 0xFF, 0xF8, 0x01,
+    0xFF, 0xFF, 0xFA, 0x01, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x00, 0x07, 0xFF,
+    0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x0D, 0xFF, 0x00, 0x00, 0x0F, 0xFF,
+    0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x00, 0x17, 0xFF,
+    0x00, 0x00, 0x19, 0xFF, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x00, 0x1F, 0xFF,
+    0x00, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x00, 0x27, 0xFF,
+    0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x00, 0x2D, 0xFF, 0x00, 0x00, 0x2F, 0xFF,
+    0x00, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x00, 0x35, 0xFF, 0x00, 0x00, 0x37, 0xFF,
+    0x00, 0x00, 0x39, 0xFF, 0x00, 0x00, 0x3B, 0xFF, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x00, 0x3F, 0xFF,
+    0x00, 0x00, 0x3D, 0xFF, 0x00, 0x00, 0x3B, 0xFF, 0x00, 0x00, 0x39, 0xFF, 0x00, 0x00, 0x37, 0xFF,
+    0x00, 0x00, 0x35, 0xFF, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x2F, 0xFF,
+    0x00, 0x00, 0x2D, 0xFF, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x27, 0xFF,
+    0x00, 0x00, 0x25, 0xFF, 0x00, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x1F, 0xFF,
+    0x00, 0x00, 0x1D, 0xFF, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x00, 0x17, 0xFF,
+    0x00, 0x00, 0x15, 0xFF, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x0F, 0xFF,
+    0x00, 0x00, 0x0D, 0xFF, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x07, 0xFF,
+    0x00, 0x00, 0x05, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFA, 0x01, 0xFF, 0xFF, 0xF8, 0x01,
+    0xFF, 0xFF, 0xF6, 0x01, 0xFF, 0xFF, 0xF4, 0x01, 0xFF, 0xFF, 0xF2, 0x01, 0xFF, 0xFF, 0xF0, 0x01,
+    0xFF, 0xFF, 0xEE, 0x01, 0xFF, 0xFF, 0xEC, 0x01, 0xFF, 0xFF, 0xEA, 0x01, 0xFF, 0xFF, 0xE8, 0x01,
+    0xFF, 0xFF, 0xE6, 0x01, 0xFF, 0xFF, 0xE4, 0x01, 0xFF, 0xFF, 0xE2, 0x01, 0xFF, 0xFF, 0xE0, 0x01,
+    0xFF, 0xFF, 0xDE, 0x01, 0xFF, 0xFF, 0xDC, 0x01, 0xFF, 0xFF, 0xDA, 0x01, 0xFF, 0xFF, 0xD8, 0x01,
+    0xFF, 0xFF, 0xD6, 0x01, 0xFF, 0xFF, 0xD4, 0x01, 0xFF, 0xFF, 0xD2, 0x01, 0xFF, 0xFF, 0xD0, 0x01,
+    0xFF, 0xFF, 0xCE, 0x01, 0xFF, 0xFF, 0xCC, 0x01, 0xFF, 0xFF, 0xCA, 0x01, 0xFF, 0xFF, 0xC8, 0x01,
+    0xFF, 0xFF, 0xC6, 0x01, 0xFF, 0xFF, 0xC4, 0x01, 0xFF, 0xFF, 0xC2, 0x01, 0xFF, 0xFF, 0xC0, 0x01,
+    0x00, 0x00, 0x06, 0x47, 0x00, 0x00, 0x0C, 0x8B, 0x00, 0x00, 0x12, 0xC7, 0x00, 0x00, 0x18, 0xF8,
+    0x00, 0x00, 0x1F, 0x19, 0x00, 0x00, 0x25, 0x27, 0x00, 0x00, 0x2B, 0x1E, 0x00, 0x00, 0x30, 0xFB,
+    0x00, 0x00, 0x36, 0xB9, 0x00, 0x00, 0x3C, 0x56, 0x00, 0x00, 0x41, 0xCD, 0x00, 0x00, 0x47, 0x1C,
+    0x00, 0x00, 0x4C, 0x3F, 0x00, 0x00, 0x51, 0x33, 0x00, 0x00, 0x55, 0xF4, 0x00, 0x00, 0x5A, 0x81,
+    0x00, 0x00, 0x5E, 0xD6, 0x00, 0x00, 0x62, 0xF1, 0x00, 0x00, 0x66, 0xCE, 0x00, 0x00, 0x6A, 0x6C,
+    0x00, 0x00, 0x6D, 0xC9, 0x00, 0x00, 0x70, 0xE1, 0x00, 0x00, 0x73, 0xB5, 0x00, 0x00, 0x76, 0x40,
+    0x00, 0x00, 0x78, 0x83, 0x00, 0x00, 0x7A, 0x7C, 0x00, 0x00, 0x7C, 0x29, 0x00, 0x00, 0x7D, 0x89,
+    0x00, 0x00, 0x7E, 0x9C, 0x00, 0x00, 0x7F, 0x61, 0x00, 0x00, 0x7F, 0xD7, 0x00, 0x00, 0x7F, 0xFF,
+    0x00, 0x00, 0x7F, 0xD7, 0x00, 0x00, 0x7F, 0x61, 0x00, 0x00, 0x7E, 0x9C, 0x00, 0x00, 0x7D, 0x89,
+    0x00, 0x00, 0x7C, 0x29, 0x00, 0x00, 0x7A, 0x7C, 0x00, 0x00, 0x78, 0x83, 0x00, 0x00, 0x76, 0x40,
+    0x00, 0x00, 0x73, 0xB5, 0x00, 0x00, 0x70, 0xE1, 0x00, 0x00, 0x6D, 0xC9, 0x00, 0x00, 0x6A, 0x6C,
+    0x00, 0x00, 0x66, 0xCE, 0x00, 0x00, 0x62, 0xF1, 0x00, 0x00, 0x5E, 0xD6, 0x00, 0x00, 0x5A, 0x81,
+    0x00, 0x00, 0x55, 0xF4, 0x00, 0x00, 0x51, 0x33, 0x00, 0x00, 0x4C, 0x3F, 0x00, 0x00, 0x47, 0x1C,
+    0x00, 0x00, 0x41, 0xCD, 0x00, 0x00, 0x3C, 0x56, 0x00, 0x00, 0x36, 0xB9, 0x00, 0x00, 0x30, 0xFB,
+    0x00, 0x00, 0x2B, 0x1E, 0x00, 0x00, 0x25, 0x27, 0x00, 0x00, 0x1F, 0x19, 0x00, 0x00, 0x18, 0xF8,
+    0x00, 0x00, 0x12, 0xC7, 0x00, 0x00, 0x0C, 0x8B, 0x00, 0x00, 0x06, 0x47, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xF9, 0xB9, 0xFF, 0xFF, 0xF3, 0x75, 0xFF, 0xFF, 0xED, 0x39, 0xFF, 0xFF, 0xE7, 0x08,
+    0xFF, 0xFF, 0xE0, 0xE7, 0xFF, 0xFF, 0xDA, 0xD9, 0xFF, 0xFF, 0xD4, 0xE2, 0xFF, 0xFF, 0xCF, 0x05,
+    0xFF, 0xFF, 0xC9, 0x47, 0xFF, 0xFF, 0xC3, 0xAA, 0xFF, 0xFF, 0xBE, 0x33, 0xFF, 0xFF, 0xB8, 0xE4,
+    0xFF, 0xFF, 0xB3, 0xC1, 0xFF, 0xFF, 0xAE, 0xCD, 0xFF, 0xFF, 0xAA, 0x0C, 0xFF, 0xFF, 0xA5, 0x7F,
+    0xFF, 0xFF, 0xA1, 0x2A, 0xFF, 0xFF, 0x9D, 0x0F, 0xFF, 0xFF, 0x99, 0x32, 0xFF, 0xFF, 0x95, 0x94,
+    0xFF, 0xFF, 0x92, 0x37, 0xFF, 0xFF, 0x8F, 0x1F, 0xFF, 0xFF, 0x8C, 0x4B, 0xFF, 0xFF, 0x89, 0xC0,
+    0xFF, 0xFF, 0x87, 0x7D, 0xFF, 0xFF, 0x85, 0x84, 0xFF, 0xFF, 0x83, 0xD7, 0xFF, 0xFF, 0x82, 0x77,
+    0xFF, 0xFF, 0x81, 0x64, 0xFF, 0xFF, 0x80, 0x9F, 0xFF, 0xFF, 0x80, 0x29, 0xFF, 0xFF, 0x80, 0x01,
+    0xFF, 0xFF, 0x80, 0x29, 0xFF, 0xFF, 0x80, 0x9F, 0xFF, 0xFF, 0x81, 0x64, 0xFF, 0xFF, 0x82, 0x77,
+    0xFF, 0xFF, 0x83, 0xD7, 0xFF, 0xFF, 0x85, 0x84, 0xFF, 0xFF, 0x87, 0x7D, 0xFF, 0xFF, 0x89, 0xC0,
+    0xFF, 0xFF, 0x8C, 0x4B, 0xFF, 0xFF, 0x8F, 0x1F, 0xFF, 0xFF, 0x92, 0x37, 0xFF, 0xFF, 0x95, 0x94,
+    0xFF, 0xFF, 0x99, 0x32, 0xFF, 0xFF, 0x9D, 0x0F, 0xFF, 0xFF, 0xA1, 0x2A, 0xFF, 0xFF, 0xA5, 0x7F,
+    0xFF, 0xFF, 0xAA, 0x0C, 0xFF, 0xFF, 0xAE, 0xCD, 0xFF, 0xFF, 0xB3, 0xC1, 0xFF, 0xFF, 0xB8, 0xE4,
+    0xFF, 0xFF, 0xBE, 0x33, 0xFF, 0xFF, 0xC3, 0xAA, 0xFF, 0xFF, 0xC9, 0x47, 0xFF, 0xFF, 0xCF, 0x05,
+    0xFF, 0xFF, 0xD4, 0xE2, 0xFF, 0xFF, 0xDA, 0xD9, 0xFF, 0xFF, 0xE0, 0xE7, 0xFF, 0xFF, 0xE7, 0x08,
+    0xFF, 0xFF, 0xED, 0x39, 0xFF, 0xFF, 0xF3, 0x75, 0xFF, 0xFF, 0xF9, 0xB9, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xFF,
+    0x00, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x02, 0x3A, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x03, 0xEB,
+    0x00, 0x00, 0x04, 0xEC, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x07, 0x3D, 0x00, 0x00, 0x08, 0x88,
+    0x00, 0x00, 0x09, 0xE9, 0x00, 0x00, 0x0B, 0x5E, 0x00, 0x00, 0x0C, 0xE4, 0x00, 0x00, 0x0E, 0x7B,
+    0x00, 0x00, 0x10, 0x1F, 0x00, 0x00, 0x11, 0xCF, 0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x15, 0x48,
+    0x00, 0x00, 0x17, 0x0E, 0x00, 0x00, 0x18, 0xD5, 0x00, 0x00, 0x1A, 0x9C, 0x00, 0x00, 0x1C, 0x61,
+    0x00, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x1F, 0xD8, 0x00, 0x00, 0x21, 0x85, 0x00, 0x00, 0x23, 0x26,
+    0x00, 0x00, 0x24, 0xB7, 0x00, 0x00, 0x26, 0x36, 0x00, 0x00, 0x27, 0xA1, 0x00, 0x00, 0x28, 0xF5,
+    0x00, 0x00, 0x2A, 0x30, 0x00, 0x00, 0x2B, 0x4F, 0x00, 0x00, 0x2C, 0x50, 0x00, 0x00, 0x2D, 0x31,
+    0x00, 0x00, 0x2D, 0xF0, 0x00, 0x00, 0x2E, 0x8B, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x2F, 0x4D,
+    0x00, 0x00, 0x2F, 0x70, 0x00, 0x00, 0x2F, 0x69, 0x00, 0x00, 0x2F, 0x35, 0x00, 0x00, 0x2E, 0xD3,
+    0x00, 0x00, 0x2E, 0x43, 0x00, 0x00, 0x2D, 0x83, 0x00, 0x00, 0x2C, 0x93, 0x00, 0x00, 0x2B, 0x71,
+    0x00, 0x00, 0x2A, 0x1E, 0x00, 0x00, 0x28, 0x99, 0x00, 0x00, 0x26, 0xE2, 0x00, 0x00, 0x24, 0xFA,
+    0x00, 0x00, 0x22, 0xE0, 0x00, 0x00, 0x20, 0x94, 0x00, 0x00, 0x1E, 0x19, 0x00, 0x00, 0x1B, 0x6E,
+    0x00, 0x00, 0x18, 0x94, 0x00, 0x00, 0x15, 0x8C, 0x00, 0x00, 0x12, 0x59, 0x00, 0x00, 0x0E, 0xFB,
+    0x00, 0x00, 0x0B, 0x74, 0x00, 0x00, 0x07, 0xC7, 0x00, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xFB, 0xEB, 0xFF, 0xFF, 0xF7, 0xB9, 0xFF, 0xFF, 0xF3, 0x6B, 0xFF, 0xFF, 0xEF, 0x06,
+    0xFF, 0xFF, 0xEA, 0x8B, 0xFF, 0xFF, 0xE5, 0xFE, 0xFF, 0xFF, 0xE1, 0x63, 0xFF, 0xFF, 0xDC, 0xBC,
+    0xFF, 0xFF, 0xD8, 0x0D, 0xFF, 0xFF, 0xD3, 0x5A, 0xFF, 0xFF, 0xCE, 0xA6, 0xFF, 0xFF, 0xC9, 0xF5,
+    0xFF, 0xFF, 0xC5, 0x4B, 0xFF, 0xFF, 0xC0, 0xAB, 0xFF, 0xFF, 0xBC, 0x19, 0xFF, 0xFF, 0xB7, 0x99,
+    0xFF, 0xFF, 0xB3, 0x2F, 0xFF, 0xFF, 0xAE, 0xDF, 0xFF, 0xFF, 0xAA, 0xAC, 0xFF, 0xFF, 0xA6, 0x9B,
+    0xFF, 0xFF, 0xA2, 0xAF, 0xFF, 0xFF, 0x9E, 0xEC, 0xFF, 0xFF, 0x9B, 0x56, 0xFF, 0xFF, 0x97, 0xF0,
+    0xFF, 0xFF, 0x94, 0xBF, 0xFF, 0xFF, 0x91, 0xC4, 0xFF, 0xFF, 0x8F, 0x04, 0xFF, 0xFF, 0x8C, 0x82,
+    0xFF, 0xFF, 0x8A, 0x41, 0xFF, 0xFF, 0x88, 0x44, 0xFF, 0xFF, 0x86, 0x8D, 0xFF, 0xFF, 0x85, 0x20,
+    0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFF, 0x83, 0x2B, 0xFF, 0xFF, 0x82, 0xA8, 0xFF, 0xFF, 0x82, 0x77,
+    0xFF, 0xFF, 0x82, 0x9A, 0xFF, 0xFF, 0x83, 0x11, 0xFF, 0xFF, 0x83, 0xDF, 0xFF, 0xFF, 0x85, 0x05,
+    0xFF, 0xFF, 0x86, 0x82, 0xFF, 0xFF, 0x88, 0x59, 0xFF, 0xFF, 0x8A, 0x88, 0xFF, 0xFF, 0x8D, 0x10,
+    0xFF, 0xFF, 0x8F, 0xF1, 0xFF, 0xFF, 0x93, 0x2A, 0xFF, 0xFF, 0x96, 0xBB, 0xFF, 0xFF, 0x9A, 0xA2,
+    0xFF, 0xFF, 0x9E, 0xDF, 0xFF, 0xFF, 0xA3, 0x6F, 0xFF, 0xFF, 0xA8, 0x51, 0xFF, 0xFF, 0xAD, 0x83,
+    0xFF, 0xFF, 0xB3, 0x03, 0xFF, 0xFF, 0xB8, 0xCE, 0xFF, 0xFF, 0xBE, 0xE1, 0xFF, 0xFF, 0xC5, 0x39,
+    0xFF, 0xFF, 0xCB, 0xD3, 0xFF, 0xFF, 0xD2, 0xAC, 0xFF, 0xFF, 0xD9, 0xC0, 0xFF, 0xFF, 0xE1, 0x0A,
+    0xFF, 0xFF, 0xE8, 0x87, 0xFF, 0xFF, 0xF0, 0x32, 0xFF, 0xFF, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x09, 0x69, 0x00, 0x00, 0x12, 0xC2, 0x00, 0x00, 0x1B, 0xF7, 0x00, 0x00, 0x24, 0xF9,
+    0x00, 0x00, 0x2D, 0xB7, 0x00, 0x00, 0x36, 0x22, 0x00, 0x00, 0x3E, 0x29, 0x00, 0x00, 0x45, 0xBE,
+    0x00, 0x00, 0x4C, 0xD5, 0x00, 0x00, 0x53, 0x61, 0x00, 0x00, 0x59, 0x57, 0x00, 0x00, 0x5E, 0xAE,
+    0x00, 0x00, 0x63, 0x5D, 0x00, 0x00, 0x67, 0x5E, 0x00, 0x00, 0x6A, 0xAB, 0x00, 0x00, 0x6D, 0x40,
+    0x00, 0x00, 0x6F, 0x1B, 0x00, 0x00, 0x70, 0x3D, 0x00, 0x00, 0x70, 0xA5, 0x00, 0x00, 0x70, 0x56,
+    0x00, 0x00, 0x6F, 0x55, 0x00, 0x00, 0x6D, 0xA7, 0x00, 0x00, 0x6B, 0x53, 0x00, 0x00, 0x68, 0x61,
+    0x00, 0x00, 0x64, 0xDB, 0x00, 0x00, 0x60, 0xCC, 0x00, 0x00, 0x5C, 0x3F, 0x00, 0x00, 0x57, 0x42,
+    0x00, 0x00, 0x51, 0xE2, 0x00, 0x00, 0x4C, 0x2C, 0x00, 0x00, 0x46, 0x31, 0x00, 0x00, 0x3F, 0xFF,
+    0x00, 0x00, 0x39, 0xA5, 0x00, 0x00, 0x33, 0x34, 0x00, 0x00, 0x2C, 0xBA, 0x00, 0x00, 0x26, 0x47,
+    0x00, 0x00, 0x1F, 0xE9, 0x00, 0x00, 0x19, 0xAF, 0x00, 0x00, 0x13, 0xA8, 0x00, 0x00, 0x0D, 0xDF,
+    0x00, 0x00, 0x08, 0x61, 0x00, 0x00, 0x03, 0x3A, 0xFF, 0xFF, 0xFE, 0x74, 0xFF, 0xFF, 0xFA, 0x17,
+    0xFF, 0xFF, 0xF6, 0x2A, 0xFF, 0xFF, 0xF2, 0xB4, 0xFF, 0xFF, 0xEF, 0xBB, 0xFF, 0xFF, 0xED, 0x42,
+    0xFF, 0xFF, 0xEB, 0x4A, 0xFF, 0xFF, 0xE9, 0xD5, 0xFF, 0xFF, 0xE8, 0xE2, 0xFF, 0xFF, 0xE8, 0x6E,
+    0xFF, 0xFF, 0xE8, 0x76, 0xFF, 0xFF, 0xE8, 0xF5, 0xFF, 0xFF, 0xE9, 0xE5, 0xFF, 0xFF, 0xEB, 0x3D,
+    0xFF, 0xFF, 0xEC, 0xF6, 0xFF, 0xFF, 0xEF, 0x06, 0xFF, 0xFF, 0xF1, 0x62, 0xFF, 0xFF, 0xF3, 0xFF,
+    0xFF, 0xFF, 0xF6, 0xD1, 0xFF, 0xFF, 0xF9, 0xCA, 0xFF, 0xFF, 0xFC, 0xDF, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x03, 0x21, 0x00, 0x00, 0x06, 0x36, 0x00, 0x00, 0x09, 0x2F, 0x00, 0x00, 0x0C, 0x01,
+    0x00, 0x00, 0x0E, 0x9E, 0x00, 0x00, 0x10, 0xFA, 0x00, 0x00, 0x13, 0x0A, 0x00, 0x00, 0x14, 0xC3,
+    0x00, 0x00, 0x16, 0x1B, 0x00, 0x00, 0x17, 0x0B, 0x00, 0x00, 0x17, 0x8A, 0x00, 0x00, 0x17, 0x92,
+    0x00, 0x00, 0x17, 0x1E, 0x00, 0x00, 0x16, 0x2B, 0x00, 0x00, 0x14, 0xB6, 0x00, 0x00, 0x12, 0xBE,
+    0x00, 0x00, 0x10, 0x45, 0x00, 0x00, 0x0D, 0x4C, 0x00, 0x00, 0x09, 0xD6, 0x00, 0x00, 0x05, 0xE9,
+    0x00, 0x00, 0x01, 0x8C, 0xFF, 0xFF, 0xFC, 0xC6, 0xFF, 0xFF, 0xF7, 0x9F, 0xFF, 0xFF, 0xF2, 0x21,
+    0xFF, 0xFF, 0xEC, 0x58, 0xFF, 0xFF, 0xE6, 0x51, 0xFF, 0xFF, 0xE0, 0x17, 0xFF, 0xFF, 0xD9, 0xB9,
+    0xFF, 0xFF, 0xD3, 0x46, 0xFF, 0xFF, 0xCC, 0xCC, 0xFF, 0xFF, 0xC6, 0x5B, 0xFF, 0xFF, 0xC0, 0x01,
+    0xFF, 0xFF, 0xB9, 0xCF, 0xFF, 0xFF, 0xB3, 0xD4, 0xFF, 0xFF, 0xAE, 0x1E, 0xFF, 0xFF, 0xA8, 0xBE,
+    0xFF, 0xFF, 0xA3, 0xC1, 0xFF, 0xFF, 0x9F, 0x34, 0xFF, 0xFF, 0x9B, 0x25, 0xFF, 0xFF, 0x97, 0x9F,
+    0xFF, 0xFF, 0x94, 0xAD, 0xFF, 0xFF, 0x92, 0x59, 0xFF, 0xFF, 0x90, 0xAB, 0xFF, 0xFF, 0x8F, 0xAA,
+    0xFF, 0xFF, 0x8F, 0x5B, 0xFF, 0xFF, 0x8F, 0xC3, 0xFF, 0xFF, 0x90, 0xE5, 0xFF, 0xFF, 0x92, 0xC0,
+    0xFF, 0xFF, 0x95, 0x55, 0xFF, 0xFF, 0x98, 0xA2, 0xFF, 0xFF, 0x9C, 0xA3, 0xFF, 0xFF, 0xA1, 0x52,
+    0xFF, 0xFF, 0xA6, 0xA9, 0xFF, 0xFF, 0xAC, 0x9F, 0xFF, 0xFF, 0xB3, 0x2B, 0xFF, 0xFF, 0xBA, 0x42,
+    0xFF, 0xFF, 0xC1, 0xD7, 0xFF, 0xFF, 0xC9, 0xDE, 0xFF, 0xFF, 0xD2, 0x49, 0xFF, 0xFF, 0xDB, 0x07,
+    0xFF, 0xFF, 0xE4, 0x09, 0xFF, 0xFF, 0xED, 0x3E, 0xFF, 0xFF, 0xF6, 0x97, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x0F, 0x79, 0x00, 0x00, 0x19, 0x4E, 0x00, 0x00, 0x24, 0x67,
+    0x00, 0x00, 0x30, 0x92, 0x00, 0x00, 0x3D, 0x8B, 0x00, 0x00, 0x4A, 0xF0, 0x00, 0x00, 0x58, 0x42,
+    0x00, 0x00, 0x64, 0xE0, 0x00, 0x00, 0x70, 0x09, 0x00, 0x00, 0x78, 0xE3, 0x00, 0x00, 0x7E, 0x7E,
+    0x00, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x7C, 0x35, 0x00, 0x00, 0x72, 0xB3, 0x00, 0x00, 0x62, 0xF1,
+    0x00, 0x00, 0x4C, 0xEA, 0x00, 0x00, 0x31, 0x29, 0x00, 0x00, 0x10, 0xE2, 0xFF, 0xFF, 0xEE, 0x00,
+    0xFF, 0xFF, 0xCB, 0x1A, 0xFF, 0xFF, 0xAB, 0x5D, 0xFF, 0xFF, 0x92, 0x3E, 0xFF, 0xFF, 0x83, 0x1E,
+    0xFF, 0xFF, 0x80, 0xC8, 0xFF, 0xFF, 0x8C, 0xE4, 0xFF, 0xFF, 0xA7, 0x6D, 0xFF, 0xFF, 0xCE, 0x4C,
+    0xFF, 0xFF, 0xFD, 0x34, 0x00, 0x00, 0x2D, 0xE1, 0x00, 0x00, 0x58, 0xCA, 0x00, 0x00, 0x76, 0x40,
+    0x00, 0x00, 0x7F, 0xEF, 0x00, 0x00, 0x72, 0x6A, 0x00, 0x00, 0x4E, 0x79, 0x00, 0x00, 0x19, 0xBD,
+    0xFF, 0xFF, 0xDE, 0x4A, 0xFF, 0xFF, 0xA9, 0x08, 0xFF, 0xFF, 0x86, 0xFC, 0xFF, 0xFF, 0x81, 0xE4,
+    0xFF, 0xFF, 0x9D, 0x07, 0xFF, 0xFF, 0xD3, 0x39, 0x00, 0x00, 0x16, 0xFE, 0x00, 0x00, 0x55, 0x5F,
+    0x00, 0x00, 0x7B, 0x06, 0x00, 0x00, 0x7A, 0x8A, 0x00, 0x00, 0x51, 0xD7, 0x00, 0x00, 0x0C, 0x8B,
+    0xFF, 0xFF, 0xC1, 0xA4, 0xFF, 0xFF, 0x8C, 0x61, 0xFF, 0xFF, 0x82, 0x3B, 0xFF, 0xFF, 0xA9, 0x77,
+    0xFF, 0xFF, 0xF4, 0x95, 0x00, 0x00, 0x45, 0xA2, 0x00, 0x00, 0x79, 0x85, 0x00, 0x00, 0x77, 0x6B,
+    0x00, 0x00, 0x3D, 0xC2, 0xFF, 0xFF, 0xE5, 0xAF, 0xFF, 0xFF, 0x99, 0x75, 0xFF, 0xFF, 0x80, 0x8C,
+    0xFF, 0xFF, 0xAA, 0x4D, 0x00, 0x00, 0x02, 0xF1, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x7F, 0xFF,
+    0x00, 0x00, 0x59, 0xFC, 0xFF, 0xFF, 0xFD, 0x0F, 0xFF, 0xFF, 0xA0, 0xEF, 0xFF, 0xFF, 0x80, 0x8C,
+    0xFF, 0xFF, 0xB3, 0x67, 0x00, 0x00, 0x1A, 0x51, 0x00, 0x00, 0x70, 0x1C, 0x00, 0x00, 0x77, 0x6B,
+    0x00, 0x00, 0x28, 0x32, 0xFF, 0xFF, 0xBA, 0x5E, 0xFF, 0xFF, 0x80, 0x84, 0xFF, 0xFF, 0xA9, 0x77,
+    0x00, 0x00, 0x17, 0xC4, 0x00, 0x00, 0x73, 0x9F, 0x00, 0x00, 0x6F, 0xC6, 0x00, 0x00, 0x0C, 0x8B,
+    0xFF, 0xFF, 0x9D, 0x97, 0xFF, 0xFF, 0x85, 0x76, 0xFF, 0xFF, 0xDC, 0xAF, 0x00, 0x00, 0x55, 0x5F,
+    0x00, 0x00, 0x7D, 0xE9, 0x00, 0x00, 0x2C, 0xC7, 0xFF, 0xFF, 0xAE, 0xD7, 0xFF, 0xFF, 0x81, 0xE4,
+    0xFF, 0xFF, 0xD6, 0x51, 0x00, 0x00, 0x56, 0xF8, 0x00, 0x00, 0x7B, 0x7A, 0x00, 0x00, 0x19, 0xBD,
+    0xFF, 0xFF, 0x9A, 0xE3, 0xFF, 0xFF, 0x8D, 0x96, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x76, 0x40,
+    0x00, 0x00, 0x5C, 0x31, 0xFF, 0xFF, 0xD2, 0x1F, 0xFF, 0xFF, 0x80, 0x09, 0xFF, 0xFF, 0xCE, 0x4C,
+    0x00, 0x00, 0x5C, 0x65, 0x00, 0x00, 0x73, 0x1C, 0xFF, 0xFF, 0xF1, 0xF1, 0xFF, 0xFF, 0x83, 0x1E,
+    0xFF, 0xFF, 0xBE, 0x28, 0x00, 0x00, 0x54, 0xA3, 0x00, 0x00, 0x74, 0x8D, 0xFF, 0xFF, 0xEE, 0x00,
+    0xFF, 0xFF, 0x81, 0x20, 0xFF, 0xFF, 0xCE, 0xD7, 0x00, 0x00, 0x66, 0x4E, 0x00, 0x00, 0x62, 0xF1,
+    0xFF, 0xFF, 0xC7, 0x33, 0xFF, 0xFF, 0x83, 0xCB, 0x00, 0x00, 0x05, 0x0D, 0x00, 0x00, 0x7E, 0x7E,
+    0x00, 0x00, 0x2A, 0x0E, 0xFF, 0xFF, 0x8F, 0xF7, 0xFF, 0xFF, 0xB1, 0x37, 0x00, 0x00, 0x58, 0x42,
+    0x00, 0x00, 0x67, 0xC3, 0xFF, 0xFF, 0xC2, 0x75, 0xFF, 0xFF, 0x89, 0x95, 0x00, 0x00, 0x24, 0x67,
+    0x00, 0x00, 0x7D, 0x78, 0xFF, 0xFF, 0xF0, 0x87, 0xFF, 0xFF, 0x80, 0x33, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xC6, 0x95, 0xFF, 0xFF, 0xCB, 0x25, 0xFF, 0xFF, 0xC9, 0xBC, 0xFF, 0xFF, 0xCD, 0x56,
+    0xFF, 0xFF, 0xCD, 0x2E, 0xFF, 0xFF, 0xCE, 0x03, 0xFF, 0xFF, 0xCE, 0xC0, 0xFF, 0xFF, 0xD1, 0xAC,
+    0xFF, 0xFF, 0xD6, 0x81, 0xFF, 0xFF, 0xD7, 0xD8, 0xFF, 0xFF, 0xD6, 0x23, 0xFF, 0xFF, 0xD9, 0xA3,
+    0xFF, 0xFF, 0xD9, 0x6F, 0xFF, 0xFF, 0xDE, 0x63, 0xFF, 0xFF, 0xE1, 0x8B, 0xFF, 0xFF, 0xE0, 0x2F,
+    0xFF, 0xFF, 0xDE, 0x31, 0xFF, 0xFF, 0xE6, 0xBA, 0xFF, 0xFF, 0xED, 0x65, 0xFF, 0xFF, 0xEA, 0x39,
+    0xFF, 0xFF, 0xEB, 0xAB, 0xFF, 0xFF, 0xED, 0x8B, 0xFF, 0xFF, 0xF0, 0xBA, 0xFF, 0xFF, 0xF4, 0xC5,
+    0xFF, 0xFF, 0xF5, 0x99, 0xFF, 0xFF, 0xF4, 0x3B, 0xFF, 0xFF, 0xF6, 0x89, 0xFF, 0xFF, 0xF8, 0xDF,
+    0xFF, 0xFF, 0xF8, 0xAE, 0xFF, 0xFF, 0xFE, 0x67, 0xFF, 0xFF, 0xFE, 0x69, 0x00, 0x00, 0x02, 0xF5,
+    0x00, 0x00, 0x01, 0x88, 0x00, 0x00, 0x06, 0xEF, 0x00, 0x00, 0x02, 0x17, 0x00, 0x00, 0x0B, 0x0F,
+    0x00, 0x00, 0x06, 0x9D, 0x00, 0x00, 0x09, 0x67, 0x00, 0x00, 0x0D, 0x64, 0x00, 0x00, 0x0C, 0x6F,
+    0x00, 0x00, 0x11, 0xFC, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x17, 0x68, 0x00, 0x00, 0x16, 0x07,
+    0x00, 0x00, 0x19, 0x7E, 0x00, 0x00, 0x1B, 0x11, 0x00, 0x00, 0x1D, 0xD6, 0x00, 0x00, 0x1F, 0x99,
+    0x00, 0x00, 0x1E, 0x69, 0x00, 0x00, 0x25, 0x8E, 0x00, 0x00, 0x23, 0x5F, 0x00, 0x00, 0x24, 0x44,
+    0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x2C, 0x11, 0x00, 0x00, 0x2B, 0x65, 0x00, 0x00, 0x32, 0xBC,
+    0x00, 0x00, 0x2F, 0x1F, 0x00, 0x00, 0x31, 0x21, 0x00, 0x00, 0x34, 0x14, 0x00, 0x00, 0x32, 0xF5,
+    0x00, 0x00, 0x36, 0x92, 0x00, 0x00, 0x35, 0xFE, 0x00, 0x00, 0x3C, 0xE4, 0x00, 0x00, 0x3D, 0x5F,
+    0x00, 0x00, 0x38, 0x91, 0x00, 0x00, 0x39, 0x21, 0x00, 0x00, 0x36, 0x58, 0x00, 0x00, 0x37, 0xD6,
+    0x00, 0x00, 0x35, 0xE4, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x30, 0x6E, 0x00, 0x00, 0x2F, 0x1E,
+    0x00, 0x00, 0x2A, 0x3D, 0x00, 0x00, 0x2A, 0x7D, 0x00, 0x00, 0x27, 0x24, 0x00, 0x00, 0x27, 0xA4,
+    0x00, 0x00, 0x23, 0xC2, 0x00, 0x00, 0x25, 0xC2, 0x00, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x20, 0xD0,
+    0x00, 0x00, 0x1C, 0x6E, 0x00, 0x00, 0x17, 0xBF, 0x00, 0x00, 0x19, 0x64, 0x00, 0x00, 0x16, 0x6B,
+    0x00, 0x00, 0x12, 0x42, 0x00, 0x00, 0x13, 0x6F, 0x00, 0x00, 0x11, 0x9D, 0x00, 0x00, 0x0E, 0x80,
+    0x00, 0x00, 0x0F, 0xEA, 0x00, 0x00, 0x09, 0xE2, 0x00, 0x00, 0x07, 0xB8, 0x00, 0x00, 0x07, 0x98,
+    0x00, 0x00, 0x06, 0x73, 0x00, 0x00, 0x02, 0xD5, 0x00, 0x00, 0x01, 0x63, 0xFF, 0xFF, 0xFD, 0xF2,
+    0x00, 0x00, 0x01, 0xED, 0xFF, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xF7, 0x69, 0xFF, 0xFF, 0xFC, 0x16,
+    0xFF, 0xFF, 0xF4, 0xCD, 0xFF, 0xFF, 0xF4, 0x06, 0xFF, 0xFF, 0xF3, 0xC2, 0xFF, 0xFF, 0xF0, 0x30,
+    0xFF, 0xFF, 0xF1, 0x72, 0xFF, 0xFF, 0xEF, 0x53, 0xFF, 0xFF, 0xE8, 0x12, 0xFF, 0xFF, 0xE7, 0x2D,
+    0xFF, 0xFF, 0xE5, 0xDC, 0xFF, 0xFF, 0xE6, 0x34, 0xFF, 0xFF, 0xE2, 0xAE, 0xFF, 0xFF, 0xE2, 0xF2,
+    0xFF, 0xFF, 0xE0, 0x23, 0xFF, 0xFF, 0xDB, 0xDF, 0xFF, 0xFF, 0xDC, 0x2B, 0xFF, 0xFF, 0xD8, 0x95,
+    0xFF, 0xFF, 0xD6, 0xE8, 0xFF, 0xFF, 0xD8, 0xDA, 0xFF, 0xFF, 0xD1, 0x2C, 0xFF, 0xFF, 0xCE, 0x93,
+    0xFF, 0xFF, 0xD1, 0x70, 0xFF, 0xFF, 0xCB, 0xA6, 0xFF, 0xFF, 0xCC, 0x70, 0xFF, 0xFF, 0xCB, 0x45,
+    0xFF, 0xFF, 0xC8, 0x65, 0xFF, 0xFF, 0xC5, 0xEC, 0xFF, 0xFF, 0xC4, 0xBF, 0xFF, 0xFF, 0xC5, 0x80,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x5F, 0xFF, 0x00, 0x00, 0x7F, 0xFF,
+    0x00, 0x00, 0x5F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0xFF, 0xFF, 0xEF, 0xA6, 0x00, 0x00, 0x0F, 0x80, 0xFF, 0xFF, 0xF0, 0x04, 0x00, 0x00, 0x0E, 0xA6,
+    0xFF, 0xFF, 0xED, 0x75, 0x00, 0x00, 0x1E, 0x84, 0x00, 0x00, 0x04, 0xC7, 0x00, 0x00, 0x28, 0xD4,
+    0x00, 0x00, 0x08, 0x39, 0x00, 0x00, 0x16, 0x30, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x0B, 0x1E,
+    0xFF, 0xFF, 0xF6, 0x1E, 0xFF, 0xFF, 0xFD, 0x1F, 0xFF, 0xFF, 0xE7, 0x51, 0xFF, 0xFF, 0xCB, 0x57,
+    0x00, 0x00, 0x03, 0xD6, 0x00, 0x00, 0x0D, 0xE0, 0x00, 0x00, 0x06, 0x83, 0xFF, 0xFF, 0xF8, 0x23,
+    0xFF, 0xFF, 0xF5, 0x53, 0x00, 0x00, 0x1D, 0x19, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x29, 0x17,
+    0x00, 0x00, 0x15, 0x24, 0x00, 0x00, 0x25, 0xA4, 0xFF, 0xFF, 0xDC, 0xB4, 0xFF, 0xFF, 0xF9, 0x57,
+    0x00, 0x00, 0x19, 0x77, 0x00, 0x00, 0x2E, 0xF3, 0xFF, 0xFF, 0xD4, 0x13, 0x00, 0x00, 0x02, 0x39,
+    0x00, 0x00, 0x32, 0x10, 0x00, 0x00, 0x04, 0x22, 0xFF, 0xFF, 0xEF, 0xE8, 0xFF, 0xFF, 0xDB, 0x2B,
+    0xFF, 0xFF, 0xFE, 0x4C, 0x00, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x05, 0x90, 0xFF, 0xFF, 0xFB, 0x68,
+    0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x10, 0x6F, 0x00, 0x00, 0x17, 0xA1, 0xFF, 0xFF, 0xD8, 0x31,
+    0x00, 0x00, 0x10, 0xFC, 0xFF, 0xFF, 0xF0, 0x66, 0x00, 0x00, 0x0E, 0x78, 0xFF, 0xFF, 0xF0, 0x5E,
+    0x00, 0x00, 0x1F, 0x83, 0x00, 0x00, 0x19, 0x74, 0xFF, 0xFF, 0xEB, 0x6F, 0xFF, 0xFF, 0xF0, 0xDE,
+    0x00, 0x00, 0x2B, 0x4D, 0x00, 0x00, 0x18, 0x67, 0xFF, 0xFF, 0xCE, 0x98, 0x00, 0x00, 0x0D, 0x20,
+    0x00, 0x00, 0x0A, 0x13, 0xFF, 0xFF, 0xE8, 0xD3, 0xFF, 0xFF, 0xDF, 0x60, 0x00, 0x00, 0x08, 0xDF,
+    0xFF, 0xFF, 0xE1, 0x68, 0x00, 0x00, 0x11, 0x14, 0xFF, 0xFF, 0xFE, 0x44, 0xFF, 0xFF, 0xD3, 0x92,
+    0x00, 0x00, 0x14, 0xA4, 0xFF, 0xFF, 0xE8, 0x95, 0xFF, 0xFF, 0xF2, 0xD8, 0x00, 0x00, 0x30, 0x8A,
+    0xFF, 0xFF, 0xF9, 0x85, 0xFF, 0xFF, 0xFB, 0x89, 0x00, 0x00, 0x19, 0x0E, 0x00, 0x00, 0x21, 0x02,
+    0xFF, 0xFF, 0xF2, 0x6B, 0xFF, 0xFF, 0xEE, 0x43, 0xFF, 0xFF, 0xE9, 0xFE, 0x00, 0x00, 0x0D, 0x8A,
+    0xFF, 0xFF, 0xFA, 0x2B, 0x00, 0x00, 0x09, 0xA5, 0x00, 0x00, 0x1F, 0x45, 0x00, 0x00, 0x1C, 0x1D,
+    0xFF, 0xFF, 0xEA, 0x2A, 0xFF, 0xFF, 0xE8, 0xDB, 0x00, 0x00, 0x11, 0xE2, 0x00, 0x00, 0x0C, 0x5A,
+    0x00, 0x00, 0x14, 0xC7, 0x00, 0x00, 0x08, 0x64, 0xFF, 0xFF, 0xD7, 0x61, 0xFF, 0xFF, 0xE8, 0x6E,
+    0xFF, 0xFF, 0xF0, 0x47, 0xFF, 0xFF, 0xF7, 0x6F, 0x00, 0x00, 0x02, 0x0E, 0xFF, 0xFF, 0xFE, 0xC9,
+    0xFF, 0xFF, 0xF0, 0x44, 0x00, 0x00, 0x06, 0x27, 0x00, 0x00, 0x03, 0x33, 0xFF, 0xFF, 0xFA, 0x47,
+    0xFF, 0xFF, 0xF5, 0xFE, 0xFF, 0xFF, 0xDC, 0x9F, 0x00, 0x00, 0x1B, 0x8D, 0x00, 0x00, 0x20, 0x7F,
+    0x00, 0x00, 0x0C, 0x79, 0xFF, 0xFF, 0xE7, 0x85, 0x00, 0x00, 0x0B, 0x90, 0xFF, 0xFF, 0xDF, 0xE8,
+    0x00, 0x00, 0x06, 0x90, 0x00, 0x00, 0x0A, 0xC8, 0x00, 0x00, 0x1A, 0xAF, 0x00, 0x00, 0x1E, 0xF3,
+    0x00, 0x00, 0x13, 0xFD, 0xFF, 0xFF, 0xE1, 0xCC, 0x00, 0x00, 0x19, 0xA2, 0xFF, 0xFF, 0xE5, 0xC4,
+    0xFF, 0xFF, 0xE4, 0xF3, 0x00, 0x00, 0x49, 0xEC, 0xFF, 0xFF, 0xF9, 0x26, 0xFF, 0xFF, 0xF3, 0x7F,
+    0x00, 0x00, 0x0A, 0xBC, 0xFF, 0xFF, 0xEC, 0xFD, 0x00, 0x00, 0x0E, 0xAA, 0xFF, 0xFF, 0xFC, 0x53,
+    0xFF, 0xFF, 0xFB, 0xFD, 0xFF, 0xFF, 0xF0, 0x58, 0x00, 0x00, 0x02, 0x91, 0xFF, 0xFF, 0xE3, 0x83,
+    0x00, 0x00, 0x18, 0x80, 0xFF, 0xFF, 0xF1, 0x35, 0xFF, 0xFF, 0xF3, 0x0C, 0xFF, 0xFF, 0xE6, 0xD6,
+};
index 085a158ea1371fa64a5e964ecf3f57fa9e4fed06..cfd905c108da624277e95c6f52ae2d36da9f190f 100644 (file)
 // NOTE: This can probably be converted to 32-bit table, since I don't think
 //       that unaligned access is allowed...
 
-const unsigned char wave_table[4096] =
-{
-    0xFF, 0xFF, 0xC2, 0x01, 0xFF, 0xFF, 0xC4, 0x01, 0xFF, 0xFF, 0xC6, 0x01, 0xFF, 0xFF, 0xC8, 0x01, 
-    0xFF, 0xFF, 0xCA, 0x01, 0xFF, 0xFF, 0xCC, 0x01, 0xFF, 0xFF, 0xCE, 0x01, 0xFF, 0xFF, 0xD0, 0x01, 
-    0xFF, 0xFF, 0xD2, 0x01, 0xFF, 0xFF, 0xD4, 0x01, 0xFF, 0xFF, 0xD6, 0x01, 0xFF, 0xFF, 0xD8, 0x01, 
-    0xFF, 0xFF, 0xDA, 0x01, 0xFF, 0xFF, 0xDC, 0x01, 0xFF, 0xFF, 0xDE, 0x01, 0xFF, 0xFF, 0xE0, 0x01, 
-    0xFF, 0xFF, 0xE2, 0x01, 0xFF, 0xFF, 0xE4, 0x01, 0xFF, 0xFF, 0xE6, 0x01, 0xFF, 0xFF, 0xE8, 0x01, 
-    0xFF, 0xFF, 0xEA, 0x01, 0xFF, 0xFF, 0xEC, 0x01, 0xFF, 0xFF, 0xEE, 0x01, 0xFF, 0xFF, 0xF0, 0x01, 
-    0xFF, 0xFF, 0xF2, 0x01, 0xFF, 0xFF, 0xF4, 0x01, 0xFF, 0xFF, 0xF6, 0x01, 0xFF, 0xFF, 0xF8, 0x01, 
-    0xFF, 0xFF, 0xFA, 0x01, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x00, 0x07, 0xFF, 
-    0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x0D, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 
-    0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x00, 0x17, 0xFF, 
-    0x00, 0x00, 0x19, 0xFF, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 
-    0x00, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x00, 0x27, 0xFF, 
-    0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x00, 0x2D, 0xFF, 0x00, 0x00, 0x2F, 0xFF, 
-    0x00, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x00, 0x35, 0xFF, 0x00, 0x00, 0x37, 0xFF, 
-    0x00, 0x00, 0x39, 0xFF, 0x00, 0x00, 0x3B, 0xFF, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 
-    0x00, 0x00, 0x3D, 0xFF, 0x00, 0x00, 0x3B, 0xFF, 0x00, 0x00, 0x39, 0xFF, 0x00, 0x00, 0x37, 0xFF, 
-    0x00, 0x00, 0x35, 0xFF, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x2F, 0xFF, 
-    0x00, 0x00, 0x2D, 0xFF, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x27, 0xFF, 
-    0x00, 0x00, 0x25, 0xFF, 0x00, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 
-    0x00, 0x00, 0x1D, 0xFF, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x00, 0x17, 0xFF, 
-    0x00, 0x00, 0x15, 0xFF, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 
-    0x00, 0x00, 0x0D, 0xFF, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x07, 0xFF, 
-    0x00, 0x00, 0x05, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 
-    0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFA, 0x01, 0xFF, 0xFF, 0xF8, 0x01, 
-    0xFF, 0xFF, 0xF6, 0x01, 0xFF, 0xFF, 0xF4, 0x01, 0xFF, 0xFF, 0xF2, 0x01, 0xFF, 0xFF, 0xF0, 0x01, 
-    0xFF, 0xFF, 0xEE, 0x01, 0xFF, 0xFF, 0xEC, 0x01, 0xFF, 0xFF, 0xEA, 0x01, 0xFF, 0xFF, 0xE8, 0x01, 
-    0xFF, 0xFF, 0xE6, 0x01, 0xFF, 0xFF, 0xE4, 0x01, 0xFF, 0xFF, 0xE2, 0x01, 0xFF, 0xFF, 0xE0, 0x01, 
-    0xFF, 0xFF, 0xDE, 0x01, 0xFF, 0xFF, 0xDC, 0x01, 0xFF, 0xFF, 0xDA, 0x01, 0xFF, 0xFF, 0xD8, 0x01, 
-    0xFF, 0xFF, 0xD6, 0x01, 0xFF, 0xFF, 0xD4, 0x01, 0xFF, 0xFF, 0xD2, 0x01, 0xFF, 0xFF, 0xD0, 0x01, 
-    0xFF, 0xFF, 0xCE, 0x01, 0xFF, 0xFF, 0xCC, 0x01, 0xFF, 0xFF, 0xCA, 0x01, 0xFF, 0xFF, 0xC8, 0x01, 
-    0xFF, 0xFF, 0xC6, 0x01, 0xFF, 0xFF, 0xC4, 0x01, 0xFF, 0xFF, 0xC2, 0x01, 0xFF, 0xFF, 0xC0, 0x01, 
-    0x00, 0x00, 0x06, 0x47, 0x00, 0x00, 0x0C, 0x8B, 0x00, 0x00, 0x12, 0xC7, 0x00, 0x00, 0x18, 0xF8, 
-    0x00, 0x00, 0x1F, 0x19, 0x00, 0x00, 0x25, 0x27, 0x00, 0x00, 0x2B, 0x1E, 0x00, 0x00, 0x30, 0xFB, 
-    0x00, 0x00, 0x36, 0xB9, 0x00, 0x00, 0x3C, 0x56, 0x00, 0x00, 0x41, 0xCD, 0x00, 0x00, 0x47, 0x1C, 
-    0x00, 0x00, 0x4C, 0x3F, 0x00, 0x00, 0x51, 0x33, 0x00, 0x00, 0x55, 0xF4, 0x00, 0x00, 0x5A, 0x81, 
-    0x00, 0x00, 0x5E, 0xD6, 0x00, 0x00, 0x62, 0xF1, 0x00, 0x00, 0x66, 0xCE, 0x00, 0x00, 0x6A, 0x6C, 
-    0x00, 0x00, 0x6D, 0xC9, 0x00, 0x00, 0x70, 0xE1, 0x00, 0x00, 0x73, 0xB5, 0x00, 0x00, 0x76, 0x40, 
-    0x00, 0x00, 0x78, 0x83, 0x00, 0x00, 0x7A, 0x7C, 0x00, 0x00, 0x7C, 0x29, 0x00, 0x00, 0x7D, 0x89, 
-    0x00, 0x00, 0x7E, 0x9C, 0x00, 0x00, 0x7F, 0x61, 0x00, 0x00, 0x7F, 0xD7, 0x00, 0x00, 0x7F, 0xFF, 
-    0x00, 0x00, 0x7F, 0xD7, 0x00, 0x00, 0x7F, 0x61, 0x00, 0x00, 0x7E, 0x9C, 0x00, 0x00, 0x7D, 0x89, 
-    0x00, 0x00, 0x7C, 0x29, 0x00, 0x00, 0x7A, 0x7C, 0x00, 0x00, 0x78, 0x83, 0x00, 0x00, 0x76, 0x40, 
-    0x00, 0x00, 0x73, 0xB5, 0x00, 0x00, 0x70, 0xE1, 0x00, 0x00, 0x6D, 0xC9, 0x00, 0x00, 0x6A, 0x6C, 
-    0x00, 0x00, 0x66, 0xCE, 0x00, 0x00, 0x62, 0xF1, 0x00, 0x00, 0x5E, 0xD6, 0x00, 0x00, 0x5A, 0x81, 
-    0x00, 0x00, 0x55, 0xF4, 0x00, 0x00, 0x51, 0x33, 0x00, 0x00, 0x4C, 0x3F, 0x00, 0x00, 0x47, 0x1C, 
-    0x00, 0x00, 0x41, 0xCD, 0x00, 0x00, 0x3C, 0x56, 0x00, 0x00, 0x36, 0xB9, 0x00, 0x00, 0x30, 0xFB, 
-    0x00, 0x00, 0x2B, 0x1E, 0x00, 0x00, 0x25, 0x27, 0x00, 0x00, 0x1F, 0x19, 0x00, 0x00, 0x18, 0xF8, 
-    0x00, 0x00, 0x12, 0xC7, 0x00, 0x00, 0x0C, 0x8B, 0x00, 0x00, 0x06, 0x47, 0x00, 0x00, 0x00, 0x00, 
-    0xFF, 0xFF, 0xF9, 0xB9, 0xFF, 0xFF, 0xF3, 0x75, 0xFF, 0xFF, 0xED, 0x39, 0xFF, 0xFF, 0xE7, 0x08, 
-    0xFF, 0xFF, 0xE0, 0xE7, 0xFF, 0xFF, 0xDA, 0xD9, 0xFF, 0xFF, 0xD4, 0xE2, 0xFF, 0xFF, 0xCF, 0x05, 
-    0xFF, 0xFF, 0xC9, 0x47, 0xFF, 0xFF, 0xC3, 0xAA, 0xFF, 0xFF, 0xBE, 0x33, 0xFF, 0xFF, 0xB8, 0xE4, 
-    0xFF, 0xFF, 0xB3, 0xC1, 0xFF, 0xFF, 0xAE, 0xCD, 0xFF, 0xFF, 0xAA, 0x0C, 0xFF, 0xFF, 0xA5, 0x7F, 
-    0xFF, 0xFF, 0xA1, 0x2A, 0xFF, 0xFF, 0x9D, 0x0F, 0xFF, 0xFF, 0x99, 0x32, 0xFF, 0xFF, 0x95, 0x94, 
-    0xFF, 0xFF, 0x92, 0x37, 0xFF, 0xFF, 0x8F, 0x1F, 0xFF, 0xFF, 0x8C, 0x4B, 0xFF, 0xFF, 0x89, 0xC0, 
-    0xFF, 0xFF, 0x87, 0x7D, 0xFF, 0xFF, 0x85, 0x84, 0xFF, 0xFF, 0x83, 0xD7, 0xFF, 0xFF, 0x82, 0x77, 
-    0xFF, 0xFF, 0x81, 0x64, 0xFF, 0xFF, 0x80, 0x9F, 0xFF, 0xFF, 0x80, 0x29, 0xFF, 0xFF, 0x80, 0x01, 
-    0xFF, 0xFF, 0x80, 0x29, 0xFF, 0xFF, 0x80, 0x9F, 0xFF, 0xFF, 0x81, 0x64, 0xFF, 0xFF, 0x82, 0x77, 
-    0xFF, 0xFF, 0x83, 0xD7, 0xFF, 0xFF, 0x85, 0x84, 0xFF, 0xFF, 0x87, 0x7D, 0xFF, 0xFF, 0x89, 0xC0, 
-    0xFF, 0xFF, 0x8C, 0x4B, 0xFF, 0xFF, 0x8F, 0x1F, 0xFF, 0xFF, 0x92, 0x37, 0xFF, 0xFF, 0x95, 0x94, 
-    0xFF, 0xFF, 0x99, 0x32, 0xFF, 0xFF, 0x9D, 0x0F, 0xFF, 0xFF, 0xA1, 0x2A, 0xFF, 0xFF, 0xA5, 0x7F, 
-    0xFF, 0xFF, 0xAA, 0x0C, 0xFF, 0xFF, 0xAE, 0xCD, 0xFF, 0xFF, 0xB3, 0xC1, 0xFF, 0xFF, 0xB8, 0xE4, 
-    0xFF, 0xFF, 0xBE, 0x33, 0xFF, 0xFF, 0xC3, 0xAA, 0xFF, 0xFF, 0xC9, 0x47, 0xFF, 0xFF, 0xCF, 0x05, 
-    0xFF, 0xFF, 0xD4, 0xE2, 0xFF, 0xFF, 0xDA, 0xD9, 0xFF, 0xFF, 0xE0, 0xE7, 0xFF, 0xFF, 0xE7, 0x08, 
-    0xFF, 0xFF, 0xED, 0x39, 0xFF, 0xFF, 0xF3, 0x75, 0xFF, 0xFF, 0xF9, 0xB9, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xFF, 
-    0x00, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x02, 0x3A, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x03, 0xEB, 
-    0x00, 0x00, 0x04, 0xEC, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x07, 0x3D, 0x00, 0x00, 0x08, 0x88, 
-    0x00, 0x00, 0x09, 0xE9, 0x00, 0x00, 0x0B, 0x5E, 0x00, 0x00, 0x0C, 0xE4, 0x00, 0x00, 0x0E, 0x7B, 
-    0x00, 0x00, 0x10, 0x1F, 0x00, 0x00, 0x11, 0xCF, 0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x15, 0x48, 
-    0x00, 0x00, 0x17, 0x0E, 0x00, 0x00, 0x18, 0xD5, 0x00, 0x00, 0x1A, 0x9C, 0x00, 0x00, 0x1C, 0x61, 
-    0x00, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x1F, 0xD8, 0x00, 0x00, 0x21, 0x85, 0x00, 0x00, 0x23, 0x26, 
-    0x00, 0x00, 0x24, 0xB7, 0x00, 0x00, 0x26, 0x36, 0x00, 0x00, 0x27, 0xA1, 0x00, 0x00, 0x28, 0xF5, 
-    0x00, 0x00, 0x2A, 0x30, 0x00, 0x00, 0x2B, 0x4F, 0x00, 0x00, 0x2C, 0x50, 0x00, 0x00, 0x2D, 0x31, 
-    0x00, 0x00, 0x2D, 0xF0, 0x00, 0x00, 0x2E, 0x8B, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x2F, 0x4D, 
-    0x00, 0x00, 0x2F, 0x70, 0x00, 0x00, 0x2F, 0x69, 0x00, 0x00, 0x2F, 0x35, 0x00, 0x00, 0x2E, 0xD3, 
-    0x00, 0x00, 0x2E, 0x43, 0x00, 0x00, 0x2D, 0x83, 0x00, 0x00, 0x2C, 0x93, 0x00, 0x00, 0x2B, 0x71, 
-    0x00, 0x00, 0x2A, 0x1E, 0x00, 0x00, 0x28, 0x99, 0x00, 0x00, 0x26, 0xE2, 0x00, 0x00, 0x24, 0xFA, 
-    0x00, 0x00, 0x22, 0xE0, 0x00, 0x00, 0x20, 0x94, 0x00, 0x00, 0x1E, 0x19, 0x00, 0x00, 0x1B, 0x6E, 
-    0x00, 0x00, 0x18, 0x94, 0x00, 0x00, 0x15, 0x8C, 0x00, 0x00, 0x12, 0x59, 0x00, 0x00, 0x0E, 0xFB, 
-    0x00, 0x00, 0x0B, 0x74, 0x00, 0x00, 0x07, 0xC7, 0x00, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x00, 0x00, 
-    0xFF, 0xFF, 0xFB, 0xEB, 0xFF, 0xFF, 0xF7, 0xB9, 0xFF, 0xFF, 0xF3, 0x6B, 0xFF, 0xFF, 0xEF, 0x06, 
-    0xFF, 0xFF, 0xEA, 0x8B, 0xFF, 0xFF, 0xE5, 0xFE, 0xFF, 0xFF, 0xE1, 0x63, 0xFF, 0xFF, 0xDC, 0xBC, 
-    0xFF, 0xFF, 0xD8, 0x0D, 0xFF, 0xFF, 0xD3, 0x5A, 0xFF, 0xFF, 0xCE, 0xA6, 0xFF, 0xFF, 0xC9, 0xF5, 
-    0xFF, 0xFF, 0xC5, 0x4B, 0xFF, 0xFF, 0xC0, 0xAB, 0xFF, 0xFF, 0xBC, 0x19, 0xFF, 0xFF, 0xB7, 0x99, 
-    0xFF, 0xFF, 0xB3, 0x2F, 0xFF, 0xFF, 0xAE, 0xDF, 0xFF, 0xFF, 0xAA, 0xAC, 0xFF, 0xFF, 0xA6, 0x9B, 
-    0xFF, 0xFF, 0xA2, 0xAF, 0xFF, 0xFF, 0x9E, 0xEC, 0xFF, 0xFF, 0x9B, 0x56, 0xFF, 0xFF, 0x97, 0xF0, 
-    0xFF, 0xFF, 0x94, 0xBF, 0xFF, 0xFF, 0x91, 0xC4, 0xFF, 0xFF, 0x8F, 0x04, 0xFF, 0xFF, 0x8C, 0x82, 
-    0xFF, 0xFF, 0x8A, 0x41, 0xFF, 0xFF, 0x88, 0x44, 0xFF, 0xFF, 0x86, 0x8D, 0xFF, 0xFF, 0x85, 0x20, 
-    0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFF, 0x83, 0x2B, 0xFF, 0xFF, 0x82, 0xA8, 0xFF, 0xFF, 0x82, 0x77, 
-    0xFF, 0xFF, 0x82, 0x9A, 0xFF, 0xFF, 0x83, 0x11, 0xFF, 0xFF, 0x83, 0xDF, 0xFF, 0xFF, 0x85, 0x05, 
-    0xFF, 0xFF, 0x86, 0x82, 0xFF, 0xFF, 0x88, 0x59, 0xFF, 0xFF, 0x8A, 0x88, 0xFF, 0xFF, 0x8D, 0x10, 
-    0xFF, 0xFF, 0x8F, 0xF1, 0xFF, 0xFF, 0x93, 0x2A, 0xFF, 0xFF, 0x96, 0xBB, 0xFF, 0xFF, 0x9A, 0xA2, 
-    0xFF, 0xFF, 0x9E, 0xDF, 0xFF, 0xFF, 0xA3, 0x6F, 0xFF, 0xFF, 0xA8, 0x51, 0xFF, 0xFF, 0xAD, 0x83, 
-    0xFF, 0xFF, 0xB3, 0x03, 0xFF, 0xFF, 0xB8, 0xCE, 0xFF, 0xFF, 0xBE, 0xE1, 0xFF, 0xFF, 0xC5, 0x39, 
-    0xFF, 0xFF, 0xCB, 0xD3, 0xFF, 0xFF, 0xD2, 0xAC, 0xFF, 0xFF, 0xD9, 0xC0, 0xFF, 0xFF, 0xE1, 0x0A, 
-    0xFF, 0xFF, 0xE8, 0x87, 0xFF, 0xFF, 0xF0, 0x32, 0xFF, 0xFF, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x09, 0x69, 0x00, 0x00, 0x12, 0xC2, 0x00, 0x00, 0x1B, 0xF7, 0x00, 0x00, 0x24, 0xF9, 
-    0x00, 0x00, 0x2D, 0xB7, 0x00, 0x00, 0x36, 0x22, 0x00, 0x00, 0x3E, 0x29, 0x00, 0x00, 0x45, 0xBE, 
-    0x00, 0x00, 0x4C, 0xD5, 0x00, 0x00, 0x53, 0x61, 0x00, 0x00, 0x59, 0x57, 0x00, 0x00, 0x5E, 0xAE, 
-    0x00, 0x00, 0x63, 0x5D, 0x00, 0x00, 0x67, 0x5E, 0x00, 0x00, 0x6A, 0xAB, 0x00, 0x00, 0x6D, 0x40, 
-    0x00, 0x00, 0x6F, 0x1B, 0x00, 0x00, 0x70, 0x3D, 0x00, 0x00, 0x70, 0xA5, 0x00, 0x00, 0x70, 0x56, 
-    0x00, 0x00, 0x6F, 0x55, 0x00, 0x00, 0x6D, 0xA7, 0x00, 0x00, 0x6B, 0x53, 0x00, 0x00, 0x68, 0x61, 
-    0x00, 0x00, 0x64, 0xDB, 0x00, 0x00, 0x60, 0xCC, 0x00, 0x00, 0x5C, 0x3F, 0x00, 0x00, 0x57, 0x42, 
-    0x00, 0x00, 0x51, 0xE2, 0x00, 0x00, 0x4C, 0x2C, 0x00, 0x00, 0x46, 0x31, 0x00, 0x00, 0x3F, 0xFF, 
-    0x00, 0x00, 0x39, 0xA5, 0x00, 0x00, 0x33, 0x34, 0x00, 0x00, 0x2C, 0xBA, 0x00, 0x00, 0x26, 0x47, 
-    0x00, 0x00, 0x1F, 0xE9, 0x00, 0x00, 0x19, 0xAF, 0x00, 0x00, 0x13, 0xA8, 0x00, 0x00, 0x0D, 0xDF, 
-    0x00, 0x00, 0x08, 0x61, 0x00, 0x00, 0x03, 0x3A, 0xFF, 0xFF, 0xFE, 0x74, 0xFF, 0xFF, 0xFA, 0x17, 
-    0xFF, 0xFF, 0xF6, 0x2A, 0xFF, 0xFF, 0xF2, 0xB4, 0xFF, 0xFF, 0xEF, 0xBB, 0xFF, 0xFF, 0xED, 0x42, 
-    0xFF, 0xFF, 0xEB, 0x4A, 0xFF, 0xFF, 0xE9, 0xD5, 0xFF, 0xFF, 0xE8, 0xE2, 0xFF, 0xFF, 0xE8, 0x6E, 
-    0xFF, 0xFF, 0xE8, 0x76, 0xFF, 0xFF, 0xE8, 0xF5, 0xFF, 0xFF, 0xE9, 0xE5, 0xFF, 0xFF, 0xEB, 0x3D, 
-    0xFF, 0xFF, 0xEC, 0xF6, 0xFF, 0xFF, 0xEF, 0x06, 0xFF, 0xFF, 0xF1, 0x62, 0xFF, 0xFF, 0xF3, 0xFF, 
-    0xFF, 0xFF, 0xF6, 0xD1, 0xFF, 0xFF, 0xF9, 0xCA, 0xFF, 0xFF, 0xFC, 0xDF, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x03, 0x21, 0x00, 0x00, 0x06, 0x36, 0x00, 0x00, 0x09, 0x2F, 0x00, 0x00, 0x0C, 0x01, 
-    0x00, 0x00, 0x0E, 0x9E, 0x00, 0x00, 0x10, 0xFA, 0x00, 0x00, 0x13, 0x0A, 0x00, 0x00, 0x14, 0xC3, 
-    0x00, 0x00, 0x16, 0x1B, 0x00, 0x00, 0x17, 0x0B, 0x00, 0x00, 0x17, 0x8A, 0x00, 0x00, 0x17, 0x92, 
-    0x00, 0x00, 0x17, 0x1E, 0x00, 0x00, 0x16, 0x2B, 0x00, 0x00, 0x14, 0xB6, 0x00, 0x00, 0x12, 0xBE, 
-    0x00, 0x00, 0x10, 0x45, 0x00, 0x00, 0x0D, 0x4C, 0x00, 0x00, 0x09, 0xD6, 0x00, 0x00, 0x05, 0xE9, 
-    0x00, 0x00, 0x01, 0x8C, 0xFF, 0xFF, 0xFC, 0xC6, 0xFF, 0xFF, 0xF7, 0x9F, 0xFF, 0xFF, 0xF2, 0x21, 
-    0xFF, 0xFF, 0xEC, 0x58, 0xFF, 0xFF, 0xE6, 0x51, 0xFF, 0xFF, 0xE0, 0x17, 0xFF, 0xFF, 0xD9, 0xB9, 
-    0xFF, 0xFF, 0xD3, 0x46, 0xFF, 0xFF, 0xCC, 0xCC, 0xFF, 0xFF, 0xC6, 0x5B, 0xFF, 0xFF, 0xC0, 0x01, 
-    0xFF, 0xFF, 0xB9, 0xCF, 0xFF, 0xFF, 0xB3, 0xD4, 0xFF, 0xFF, 0xAE, 0x1E, 0xFF, 0xFF, 0xA8, 0xBE, 
-    0xFF, 0xFF, 0xA3, 0xC1, 0xFF, 0xFF, 0x9F, 0x34, 0xFF, 0xFF, 0x9B, 0x25, 0xFF, 0xFF, 0x97, 0x9F, 
-    0xFF, 0xFF, 0x94, 0xAD, 0xFF, 0xFF, 0x92, 0x59, 0xFF, 0xFF, 0x90, 0xAB, 0xFF, 0xFF, 0x8F, 0xAA, 
-    0xFF, 0xFF, 0x8F, 0x5B, 0xFF, 0xFF, 0x8F, 0xC3, 0xFF, 0xFF, 0x90, 0xE5, 0xFF, 0xFF, 0x92, 0xC0, 
-    0xFF, 0xFF, 0x95, 0x55, 0xFF, 0xFF, 0x98, 0xA2, 0xFF, 0xFF, 0x9C, 0xA3, 0xFF, 0xFF, 0xA1, 0x52, 
-    0xFF, 0xFF, 0xA6, 0xA9, 0xFF, 0xFF, 0xAC, 0x9F, 0xFF, 0xFF, 0xB3, 0x2B, 0xFF, 0xFF, 0xBA, 0x42, 
-    0xFF, 0xFF, 0xC1, 0xD7, 0xFF, 0xFF, 0xC9, 0xDE, 0xFF, 0xFF, 0xD2, 0x49, 0xFF, 0xFF, 0xDB, 0x07, 
-    0xFF, 0xFF, 0xE4, 0x09, 0xFF, 0xFF, 0xED, 0x3E, 0xFF, 0xFF, 0xF6, 0x97, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x0F, 0x79, 0x00, 0x00, 0x19, 0x4E, 0x00, 0x00, 0x24, 0x67, 
-    0x00, 0x00, 0x30, 0x92, 0x00, 0x00, 0x3D, 0x8B, 0x00, 0x00, 0x4A, 0xF0, 0x00, 0x00, 0x58, 0x42, 
-    0x00, 0x00, 0x64, 0xE0, 0x00, 0x00, 0x70, 0x09, 0x00, 0x00, 0x78, 0xE3, 0x00, 0x00, 0x7E, 0x7E, 
-    0x00, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x7C, 0x35, 0x00, 0x00, 0x72, 0xB3, 0x00, 0x00, 0x62, 0xF1, 
-    0x00, 0x00, 0x4C, 0xEA, 0x00, 0x00, 0x31, 0x29, 0x00, 0x00, 0x10, 0xE2, 0xFF, 0xFF, 0xEE, 0x00, 
-    0xFF, 0xFF, 0xCB, 0x1A, 0xFF, 0xFF, 0xAB, 0x5D, 0xFF, 0xFF, 0x92, 0x3E, 0xFF, 0xFF, 0x83, 0x1E, 
-    0xFF, 0xFF, 0x80, 0xC8, 0xFF, 0xFF, 0x8C, 0xE4, 0xFF, 0xFF, 0xA7, 0x6D, 0xFF, 0xFF, 0xCE, 0x4C, 
-    0xFF, 0xFF, 0xFD, 0x34, 0x00, 0x00, 0x2D, 0xE1, 0x00, 0x00, 0x58, 0xCA, 0x00, 0x00, 0x76, 0x40, 
-    0x00, 0x00, 0x7F, 0xEF, 0x00, 0x00, 0x72, 0x6A, 0x00, 0x00, 0x4E, 0x79, 0x00, 0x00, 0x19, 0xBD, 
-    0xFF, 0xFF, 0xDE, 0x4A, 0xFF, 0xFF, 0xA9, 0x08, 0xFF, 0xFF, 0x86, 0xFC, 0xFF, 0xFF, 0x81, 0xE4, 
-    0xFF, 0xFF, 0x9D, 0x07, 0xFF, 0xFF, 0xD3, 0x39, 0x00, 0x00, 0x16, 0xFE, 0x00, 0x00, 0x55, 0x5F, 
-    0x00, 0x00, 0x7B, 0x06, 0x00, 0x00, 0x7A, 0x8A, 0x00, 0x00, 0x51, 0xD7, 0x00, 0x00, 0x0C, 0x8B, 
-    0xFF, 0xFF, 0xC1, 0xA4, 0xFF, 0xFF, 0x8C, 0x61, 0xFF, 0xFF, 0x82, 0x3B, 0xFF, 0xFF, 0xA9, 0x77, 
-    0xFF, 0xFF, 0xF4, 0x95, 0x00, 0x00, 0x45, 0xA2, 0x00, 0x00, 0x79, 0x85, 0x00, 0x00, 0x77, 0x6B, 
-    0x00, 0x00, 0x3D, 0xC2, 0xFF, 0xFF, 0xE5, 0xAF, 0xFF, 0xFF, 0x99, 0x75, 0xFF, 0xFF, 0x80, 0x8C, 
-    0xFF, 0xFF, 0xAA, 0x4D, 0x00, 0x00, 0x02, 0xF1, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x7F, 0xFF, 
-    0x00, 0x00, 0x59, 0xFC, 0xFF, 0xFF, 0xFD, 0x0F, 0xFF, 0xFF, 0xA0, 0xEF, 0xFF, 0xFF, 0x80, 0x8C, 
-    0xFF, 0xFF, 0xB3, 0x67, 0x00, 0x00, 0x1A, 0x51, 0x00, 0x00, 0x70, 0x1C, 0x00, 0x00, 0x77, 0x6B, 
-    0x00, 0x00, 0x28, 0x32, 0xFF, 0xFF, 0xBA, 0x5E, 0xFF, 0xFF, 0x80, 0x84, 0xFF, 0xFF, 0xA9, 0x77, 
-    0x00, 0x00, 0x17, 0xC4, 0x00, 0x00, 0x73, 0x9F, 0x00, 0x00, 0x6F, 0xC6, 0x00, 0x00, 0x0C, 0x8B, 
-    0xFF, 0xFF, 0x9D, 0x97, 0xFF, 0xFF, 0x85, 0x76, 0xFF, 0xFF, 0xDC, 0xAF, 0x00, 0x00, 0x55, 0x5F, 
-    0x00, 0x00, 0x7D, 0xE9, 0x00, 0x00, 0x2C, 0xC7, 0xFF, 0xFF, 0xAE, 0xD7, 0xFF, 0xFF, 0x81, 0xE4, 
-    0xFF, 0xFF, 0xD6, 0x51, 0x00, 0x00, 0x56, 0xF8, 0x00, 0x00, 0x7B, 0x7A, 0x00, 0x00, 0x19, 0xBD, 
-    0xFF, 0xFF, 0x9A, 0xE3, 0xFF, 0xFF, 0x8D, 0x96, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x76, 0x40, 
-    0x00, 0x00, 0x5C, 0x31, 0xFF, 0xFF, 0xD2, 0x1F, 0xFF, 0xFF, 0x80, 0x09, 0xFF, 0xFF, 0xCE, 0x4C, 
-    0x00, 0x00, 0x5C, 0x65, 0x00, 0x00, 0x73, 0x1C, 0xFF, 0xFF, 0xF1, 0xF1, 0xFF, 0xFF, 0x83, 0x1E, 
-    0xFF, 0xFF, 0xBE, 0x28, 0x00, 0x00, 0x54, 0xA3, 0x00, 0x00, 0x74, 0x8D, 0xFF, 0xFF, 0xEE, 0x00, 
-    0xFF, 0xFF, 0x81, 0x20, 0xFF, 0xFF, 0xCE, 0xD7, 0x00, 0x00, 0x66, 0x4E, 0x00, 0x00, 0x62, 0xF1, 
-    0xFF, 0xFF, 0xC7, 0x33, 0xFF, 0xFF, 0x83, 0xCB, 0x00, 0x00, 0x05, 0x0D, 0x00, 0x00, 0x7E, 0x7E, 
-    0x00, 0x00, 0x2A, 0x0E, 0xFF, 0xFF, 0x8F, 0xF7, 0xFF, 0xFF, 0xB1, 0x37, 0x00, 0x00, 0x58, 0x42, 
-    0x00, 0x00, 0x67, 0xC3, 0xFF, 0xFF, 0xC2, 0x75, 0xFF, 0xFF, 0x89, 0x95, 0x00, 0x00, 0x24, 0x67, 
-    0x00, 0x00, 0x7D, 0x78, 0xFF, 0xFF, 0xF0, 0x87, 0xFF, 0xFF, 0x80, 0x33, 0x00, 0x00, 0x00, 0x00, 
-    0xFF, 0xFF, 0xC6, 0x95, 0xFF, 0xFF, 0xCB, 0x25, 0xFF, 0xFF, 0xC9, 0xBC, 0xFF, 0xFF, 0xCD, 0x56, 
-    0xFF, 0xFF, 0xCD, 0x2E, 0xFF, 0xFF, 0xCE, 0x03, 0xFF, 0xFF, 0xCE, 0xC0, 0xFF, 0xFF, 0xD1, 0xAC, 
-    0xFF, 0xFF, 0xD6, 0x81, 0xFF, 0xFF, 0xD7, 0xD8, 0xFF, 0xFF, 0xD6, 0x23, 0xFF, 0xFF, 0xD9, 0xA3, 
-    0xFF, 0xFF, 0xD9, 0x6F, 0xFF, 0xFF, 0xDE, 0x63, 0xFF, 0xFF, 0xE1, 0x8B, 0xFF, 0xFF, 0xE0, 0x2F, 
-    0xFF, 0xFF, 0xDE, 0x31, 0xFF, 0xFF, 0xE6, 0xBA, 0xFF, 0xFF, 0xED, 0x65, 0xFF, 0xFF, 0xEA, 0x39, 
-    0xFF, 0xFF, 0xEB, 0xAB, 0xFF, 0xFF, 0xED, 0x8B, 0xFF, 0xFF, 0xF0, 0xBA, 0xFF, 0xFF, 0xF4, 0xC5, 
-    0xFF, 0xFF, 0xF5, 0x99, 0xFF, 0xFF, 0xF4, 0x3B, 0xFF, 0xFF, 0xF6, 0x89, 0xFF, 0xFF, 0xF8, 0xDF, 
-    0xFF, 0xFF, 0xF8, 0xAE, 0xFF, 0xFF, 0xFE, 0x67, 0xFF, 0xFF, 0xFE, 0x69, 0x00, 0x00, 0x02, 0xF5, 
-    0x00, 0x00, 0x01, 0x88, 0x00, 0x00, 0x06, 0xEF, 0x00, 0x00, 0x02, 0x17, 0x00, 0x00, 0x0B, 0x0F, 
-    0x00, 0x00, 0x06, 0x9D, 0x00, 0x00, 0x09, 0x67, 0x00, 0x00, 0x0D, 0x64, 0x00, 0x00, 0x0C, 0x6F, 
-    0x00, 0x00, 0x11, 0xFC, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x17, 0x68, 0x00, 0x00, 0x16, 0x07, 
-    0x00, 0x00, 0x19, 0x7E, 0x00, 0x00, 0x1B, 0x11, 0x00, 0x00, 0x1D, 0xD6, 0x00, 0x00, 0x1F, 0x99, 
-    0x00, 0x00, 0x1E, 0x69, 0x00, 0x00, 0x25, 0x8E, 0x00, 0x00, 0x23, 0x5F, 0x00, 0x00, 0x24, 0x44, 
-    0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x2C, 0x11, 0x00, 0x00, 0x2B, 0x65, 0x00, 0x00, 0x32, 0xBC, 
-    0x00, 0x00, 0x2F, 0x1F, 0x00, 0x00, 0x31, 0x21, 0x00, 0x00, 0x34, 0x14, 0x00, 0x00, 0x32, 0xF5, 
-    0x00, 0x00, 0x36, 0x92, 0x00, 0x00, 0x35, 0xFE, 0x00, 0x00, 0x3C, 0xE4, 0x00, 0x00, 0x3D, 0x5F, 
-    0x00, 0x00, 0x38, 0x91, 0x00, 0x00, 0x39, 0x21, 0x00, 0x00, 0x36, 0x58, 0x00, 0x00, 0x37, 0xD6, 
-    0x00, 0x00, 0x35, 0xE4, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x30, 0x6E, 0x00, 0x00, 0x2F, 0x1E, 
-    0x00, 0x00, 0x2A, 0x3D, 0x00, 0x00, 0x2A, 0x7D, 0x00, 0x00, 0x27, 0x24, 0x00, 0x00, 0x27, 0xA4, 
-    0x00, 0x00, 0x23, 0xC2, 0x00, 0x00, 0x25, 0xC2, 0x00, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x20, 0xD0, 
-    0x00, 0x00, 0x1C, 0x6E, 0x00, 0x00, 0x17, 0xBF, 0x00, 0x00, 0x19, 0x64, 0x00, 0x00, 0x16, 0x6B, 
-    0x00, 0x00, 0x12, 0x42, 0x00, 0x00, 0x13, 0x6F, 0x00, 0x00, 0x11, 0x9D, 0x00, 0x00, 0x0E, 0x80, 
-    0x00, 0x00, 0x0F, 0xEA, 0x00, 0x00, 0x09, 0xE2, 0x00, 0x00, 0x07, 0xB8, 0x00, 0x00, 0x07, 0x98, 
-    0x00, 0x00, 0x06, 0x73, 0x00, 0x00, 0x02, 0xD5, 0x00, 0x00, 0x01, 0x63, 0xFF, 0xFF, 0xFD, 0xF2, 
-    0x00, 0x00, 0x01, 0xED, 0xFF, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xF7, 0x69, 0xFF, 0xFF, 0xFC, 0x16, 
-    0xFF, 0xFF, 0xF4, 0xCD, 0xFF, 0xFF, 0xF4, 0x06, 0xFF, 0xFF, 0xF3, 0xC2, 0xFF, 0xFF, 0xF0, 0x30, 
-    0xFF, 0xFF, 0xF1, 0x72, 0xFF, 0xFF, 0xEF, 0x53, 0xFF, 0xFF, 0xE8, 0x12, 0xFF, 0xFF, 0xE7, 0x2D, 
-    0xFF, 0xFF, 0xE5, 0xDC, 0xFF, 0xFF, 0xE6, 0x34, 0xFF, 0xFF, 0xE2, 0xAE, 0xFF, 0xFF, 0xE2, 0xF2, 
-    0xFF, 0xFF, 0xE0, 0x23, 0xFF, 0xFF, 0xDB, 0xDF, 0xFF, 0xFF, 0xDC, 0x2B, 0xFF, 0xFF, 0xD8, 0x95, 
-    0xFF, 0xFF, 0xD6, 0xE8, 0xFF, 0xFF, 0xD8, 0xDA, 0xFF, 0xFF, 0xD1, 0x2C, 0xFF, 0xFF, 0xCE, 0x93, 
-    0xFF, 0xFF, 0xD1, 0x70, 0xFF, 0xFF, 0xCB, 0xA6, 0xFF, 0xFF, 0xCC, 0x70, 0xFF, 0xFF, 0xCB, 0x45, 
-    0xFF, 0xFF, 0xC8, 0x65, 0xFF, 0xFF, 0xC5, 0xEC, 0xFF, 0xFF, 0xC4, 0xBF, 0xFF, 0xFF, 0xC5, 0x80, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x5F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 
-    0x00, 0x00, 0x5F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0xFF, 0xFF, 0xEF, 0xA6, 0x00, 0x00, 0x0F, 0x80, 0xFF, 0xFF, 0xF0, 0x04, 0x00, 0x00, 0x0E, 0xA6, 
-    0xFF, 0xFF, 0xED, 0x75, 0x00, 0x00, 0x1E, 0x84, 0x00, 0x00, 0x04, 0xC7, 0x00, 0x00, 0x28, 0xD4, 
-    0x00, 0x00, 0x08, 0x39, 0x00, 0x00, 0x16, 0x30, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x0B, 0x1E, 
-    0xFF, 0xFF, 0xF6, 0x1E, 0xFF, 0xFF, 0xFD, 0x1F, 0xFF, 0xFF, 0xE7, 0x51, 0xFF, 0xFF, 0xCB, 0x57, 
-    0x00, 0x00, 0x03, 0xD6, 0x00, 0x00, 0x0D, 0xE0, 0x00, 0x00, 0x06, 0x83, 0xFF, 0xFF, 0xF8, 0x23, 
-    0xFF, 0xFF, 0xF5, 0x53, 0x00, 0x00, 0x1D, 0x19, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x29, 0x17, 
-    0x00, 0x00, 0x15, 0x24, 0x00, 0x00, 0x25, 0xA4, 0xFF, 0xFF, 0xDC, 0xB4, 0xFF, 0xFF, 0xF9, 0x57, 
-    0x00, 0x00, 0x19, 0x77, 0x00, 0x00, 0x2E, 0xF3, 0xFF, 0xFF, 0xD4, 0x13, 0x00, 0x00, 0x02, 0x39, 
-    0x00, 0x00, 0x32, 0x10, 0x00, 0x00, 0x04, 0x22, 0xFF, 0xFF, 0xEF, 0xE8, 0xFF, 0xFF, 0xDB, 0x2B, 
-    0xFF, 0xFF, 0xFE, 0x4C, 0x00, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x05, 0x90, 0xFF, 0xFF, 0xFB, 0x68, 
-    0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x10, 0x6F, 0x00, 0x00, 0x17, 0xA1, 0xFF, 0xFF, 0xD8, 0x31, 
-    0x00, 0x00, 0x10, 0xFC, 0xFF, 0xFF, 0xF0, 0x66, 0x00, 0x00, 0x0E, 0x78, 0xFF, 0xFF, 0xF0, 0x5E, 
-    0x00, 0x00, 0x1F, 0x83, 0x00, 0x00, 0x19, 0x74, 0xFF, 0xFF, 0xEB, 0x6F, 0xFF, 0xFF, 0xF0, 0xDE, 
-    0x00, 0x00, 0x2B, 0x4D, 0x00, 0x00, 0x18, 0x67, 0xFF, 0xFF, 0xCE, 0x98, 0x00, 0x00, 0x0D, 0x20, 
-    0x00, 0x00, 0x0A, 0x13, 0xFF, 0xFF, 0xE8, 0xD3, 0xFF, 0xFF, 0xDF, 0x60, 0x00, 0x00, 0x08, 0xDF, 
-    0xFF, 0xFF, 0xE1, 0x68, 0x00, 0x00, 0x11, 0x14, 0xFF, 0xFF, 0xFE, 0x44, 0xFF, 0xFF, 0xD3, 0x92, 
-    0x00, 0x00, 0x14, 0xA4, 0xFF, 0xFF, 0xE8, 0x95, 0xFF, 0xFF, 0xF2, 0xD8, 0x00, 0x00, 0x30, 0x8A, 
-    0xFF, 0xFF, 0xF9, 0x85, 0xFF, 0xFF, 0xFB, 0x89, 0x00, 0x00, 0x19, 0x0E, 0x00, 0x00, 0x21, 0x02, 
-    0xFF, 0xFF, 0xF2, 0x6B, 0xFF, 0xFF, 0xEE, 0x43, 0xFF, 0xFF, 0xE9, 0xFE, 0x00, 0x00, 0x0D, 0x8A, 
-    0xFF, 0xFF, 0xFA, 0x2B, 0x00, 0x00, 0x09, 0xA5, 0x00, 0x00, 0x1F, 0x45, 0x00, 0x00, 0x1C, 0x1D, 
-    0xFF, 0xFF, 0xEA, 0x2A, 0xFF, 0xFF, 0xE8, 0xDB, 0x00, 0x00, 0x11, 0xE2, 0x00, 0x00, 0x0C, 0x5A, 
-    0x00, 0x00, 0x14, 0xC7, 0x00, 0x00, 0x08, 0x64, 0xFF, 0xFF, 0xD7, 0x61, 0xFF, 0xFF, 0xE8, 0x6E, 
-    0xFF, 0xFF, 0xF0, 0x47, 0xFF, 0xFF, 0xF7, 0x6F, 0x00, 0x00, 0x02, 0x0E, 0xFF, 0xFF, 0xFE, 0xC9, 
-    0xFF, 0xFF, 0xF0, 0x44, 0x00, 0x00, 0x06, 0x27, 0x00, 0x00, 0x03, 0x33, 0xFF, 0xFF, 0xFA, 0x47, 
-    0xFF, 0xFF, 0xF5, 0xFE, 0xFF, 0xFF, 0xDC, 0x9F, 0x00, 0x00, 0x1B, 0x8D, 0x00, 0x00, 0x20, 0x7F, 
-    0x00, 0x00, 0x0C, 0x79, 0xFF, 0xFF, 0xE7, 0x85, 0x00, 0x00, 0x0B, 0x90, 0xFF, 0xFF, 0xDF, 0xE8, 
-    0x00, 0x00, 0x06, 0x90, 0x00, 0x00, 0x0A, 0xC8, 0x00, 0x00, 0x1A, 0xAF, 0x00, 0x00, 0x1E, 0xF3, 
-    0x00, 0x00, 0x13, 0xFD, 0xFF, 0xFF, 0xE1, 0xCC, 0x00, 0x00, 0x19, 0xA2, 0xFF, 0xFF, 0xE5, 0xC4, 
-    0xFF, 0xFF, 0xE4, 0xF3, 0x00, 0x00, 0x49, 0xEC, 0xFF, 0xFF, 0xF9, 0x26, 0xFF, 0xFF, 0xF3, 0x7F, 
-    0x00, 0x00, 0x0A, 0xBC, 0xFF, 0xFF, 0xEC, 0xFD, 0x00, 0x00, 0x0E, 0xAA, 0xFF, 0xFF, 0xFC, 0x53, 
-    0xFF, 0xFF, 0xFB, 0xFD, 0xFF, 0xFF, 0xF0, 0x58, 0x00, 0x00, 0x02, 0x91, 0xFF, 0xFF, 0xE3, 0x83, 
-    0x00, 0x00, 0x18, 0x80, 0xFF, 0xFF, 0xF1, 0x35, 0xFF, 0xFF, 0xF3, 0x0C, 0xFF, 0xFF, 0xE6, 0xD6, 
-};
+#ifndef __WAVETABLE_H__
+#define __WAVETABLE_H__
+
+// How to preserve const-ness of this stuff without introducing tons of hairiness?
+extern /*const*/ unsigned char waveTableROM[];
+
+#endif // __WAVETABLE_H__
diff --git a/virtualjaguar.pro b/virtualjaguar.pro
new file mode 100644 (file)
index 0000000..0478be2
--- /dev/null
@@ -0,0 +1,78 @@
+#
+# Virtual Jaguar Qt project file
+#
+# by James L. Hammons
+# Copyright (C) 2011 Underground Software
+#
+# See the README and GPLv3 files for licensing and warranty information
+#
+# NOTE: Musashi is built and linked in as a library, so there should be no more
+#       problems with using the qmake build system as-is. :-)
+#       Other than on the Mac, where it stupidly defaults to making XCode binaries. >:-(
+#       Well, we fixed it in the Makefile, by doing platfrom detection there. :-/
+#
+
+TARGET     = virtualjaguar
+CONFIG    += qt warn_on release debug
+RESOURCES += virtualjaguar.qrc
+LIBS      += -lz -Lobj -ljaguarcore -lmusashi
+QT        += opengl
+
+# We stuff all the intermediate crap into obj/ so it won't confuse us mere mortals ;-)
+OBJECTS_DIR = obj
+MOC_DIR     = obj
+RCC_DIR     = obj
+UI_DIR      = obj
+
+# Platform specific defines
+win32     { DEFINES += __GCCWIN32__ }
+else:macx { DEFINES += __GCCUNIX__ _OSX_ }
+else:unix { DEFINES += __GCCUNIX__ }
+
+# SDL (to link statically on Mac)
+macx { LIBS += `sdl-config --static-libs` }
+else { LIBS += `sdl-config --libs` }
+
+# C/C++ flags...
+# NOTE: May have to put -Wall back in, but only on non-release cycles. It can
+#       cause problems if you're not careful. (Can do this via command line in qmake)
+QMAKE_CFLAGS += `sdl-config --cflags` -O2 -ffast-math -fomit-frame-pointer
+QMAKE_CXXFLAGS += `sdl-config --cflags` -O2 -ffast-math -fomit-frame-pointer
+
+# Need to add libcdio stuffola (checking/including)...
+
+INCLUDEPATH += \
+       src \
+       src/gui
+
+DEPENDPATH = \
+       src \
+       src/gui
+
+# The GUI
+
+HEADERS = \
+       src/gui/about.h \
+       src/gui/app.h \
+       src/gui/configdialog.h \
+       src/gui/controllertab.h \
+       src/gui/filelistmodel.h \
+       src/gui/filepicker.h \
+       src/gui/filethread.h \
+       src/gui/generaltab.h \
+       src/gui/glwidget.h \
+       src/gui/imagedelegate.h \
+       src/gui/mainwin.h
+
+SOURCES = \
+       src/gui/about.cpp \
+       src/gui/app.cpp \
+       src/gui/configdialog.cpp \
+       src/gui/controllertab.cpp \
+       src/gui/filelistmodel.cpp \
+       src/gui/filepicker.cpp \
+       src/gui/filethread.cpp \
+       src/gui/generaltab.cpp \
+       src/gui/glwidget.cpp \
+       src/gui/imagedelegate.cpp \
+       src/gui/mainwin.cpp
diff --git a/vj.cfg b/vj.cfg
deleted file mode 100644 (file)
index 68deaf2..0000000
--- a/vj.cfg
+++ /dev/null
@@ -1,98 +0,0 @@
-#
-# Virtual Jaguar configuration file
-#
-
-# Jaguar BIOS options: 1 - use, 0 - don't use
-
-useJaguarBIOS = 0
-
-# Jaguar ROM paths
-
-JagBootROM = ./bios/jagboot.rom
-CDBootROM = ./bios/jagcd.rom
-EEPROMs = ./eeproms
-ROMs = ./roms
-
-# OpenGL options: 1 - use OpenGL rendering, 0 - use old style rendering
-
-useOpenGL = 1
-
-# OpenGL filtering type: 1 - blurry, 0 - sharp
-
-glFilterType = 1
-
-# Display options: 1 - fullscreen, 0 - windowed
-
-fullscreen = 0
-
-# NTSC/PAL options: 1 - NTSC, 0 - PAL
-
-hardwareTypeNTSC = 1
-
-# Render type (experimental): 0 - regular/OpenGL, 1 - TV style
-
-renderType = 0
-
-# DSP options: 1 - use, 0 - don't use
-
-DSPEnabled = 0
-
-# If DSP enabled, set whether or not to use the pipelined core: 1 - use, 0 - don't use
-
-usePipelinedDSP = 0
-
-# Joystick options: 1 - use joystick, 0 - don't use
-
-useJoystick = 0
-
-# Joyport option: If joystick is enabled above, set the port (0 - 3) here
-
-joyport = 0
-
-# Jaguar joypad key assignments
-# Note: It would be nicer to be able to have a single left side to store all this in...
-# E.g. p1keys = 34, 32, 22, etc. instead of what we have here...
-
-p1k_up = 273           # SDLK_UP
-p1k_down = 274         # SDLK_DOWN
-p1k_left = 276         # SDLK_LEFT
-p1k_right = 275                # SDLK_RIGHT
-p1k_c = 122                    # SDLK_z
-p1k_b = 120                    # SDLK_x
-p1k_a = 99                     # SDLK_c
-p1k_option = 39                # SDLK_QUOTE
-p1k_pause = 13         # SDLK_RETURN
-p1k_0 = 256                    # SDLK_KP0
-p1k_1 = 257                    # SDLK_KP1
-p1k_2 = 258                    # SDLK_KP2
-p1k_3 = 259                    # SDLK_KP3
-p1k_4 = 260                    # SDLK_KP4
-p1k_5 = 261                    # SDLK_KP5
-p1k_6 = 262                    # SDLK_KP6
-p1k_7 = 263                    # SDLK_KP7
-p1k_8 = 264                    # SDLK_KP8
-p1k_9 = 265                    # SDLK_KP9
-p1k_pound = 267                # SDLK_KP_DIVIDE
-p1k_star = 268         # SDLK_KP_MULTIPLY
-
-p2k_up = 273           # SDLK_UP
-p2k_down = 274         # SDLK_DOWN
-p2k_left = 276         # SDLK_LEFT
-p2k_right = 275                # SDLK_RIGHT
-p2k_c = 122                    # SDLK_z
-p2k_b = 120                    # SDLK_x
-p2k_a = 99                     # SDLK_c
-p2k_option = 39                # SDLK_QUOTE
-p2k_pause = 13         # SDLK_RETURN
-p2k_0 = 256                    # SDLK_KP0
-p2k_1 = 257                    # SDLK_KP1
-p2k_2 = 258                    # SDLK_KP2
-p2k_3 = 259                    # SDLK_KP3
-p2k_4 = 260                    # SDLK_KP4
-p2k_5 = 261                    # SDLK_KP5
-p2k_6 = 262                    # SDLK_KP6
-p2k_7 = 263                    # SDLK_KP7
-p2k_8 = 264                    # SDLK_KP8
-p2k_9 = 265                    # SDLK_KP9
-p2k_pound = 267                # SDLK_KP_DIVIDE
-p2k_star = 268         # SDLK_KP_MULTIPLY