summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Wenger <domonoky@googlemail.com>2007-02-21 20:27:14 +0000
committerDominik Wenger <domonoky@googlemail.com>2007-02-21 20:27:14 +0000
commite863d595b50867c550d53cd9d92032fcbb82ef3c (patch)
tree2f21dc466248a72c897305fc6c6f182eb692ca2c
parenta5e0380d9045c3a075ad633fef981f4a4ae82f14 (diff)
downloadrockbox-e863d595b50867c550d53cd9d92032fcbb82ef3c.tar.gz
rockbox-e863d595b50867c550d53cd9d92032fcbb82ef3c.zip
Implementation of Bootloader installation/uninstallation for all Targets in rbUtil. Needs testing. FS#6643
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12439 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--rbutil/Makefile5
-rwxr-xr-xrbutil/Makefile.macosx216
-rwxr-xr-xrbutil/bootloaders.cpp452
-rwxr-xr-xrbutil/bootloaders.h41
-rw-r--r--rbutil/credits.h1
-rwxr-xr-xrbutil/h100sums.h23
-rwxr-xr-xrbutil/h120sums.h23
-rwxr-xr-xrbutil/h300sums.h17
-rwxr-xr-xrbutil/irivertools.cpp613
-rwxr-xr-xrbutil/irivertools.h65
-rwxr-xr-xrbutil/md5sum.cpp300
-rwxr-xr-xrbutil/md5sum.h51
-rwxr-xr-xrbutil/mksums.pl69
-rw-r--r--rbutil/rbutil.cbp212
-rw-r--r--rbutil/rbutil.cpp38
-rw-r--r--rbutil/rbutil.h13
-rw-r--r--rbutil/rbutil.ini190
-rwxr-xr-xrbutil/rbutil.r2675
-rw-r--r--rbutil/rbutilApp.cpp58
-rw-r--r--rbutil/rbutilFrm.cpp250
-rw-r--r--rbutil/rbutilFrm.h7
-rw-r--r--rbutil/wizard_pages.cpp362
-rw-r--r--rbutil/wizard_pages.h97
23 files changed, 5566 insertions, 212 deletions
diff --git a/rbutil/Makefile b/rbutil/Makefile
index a7f9102fed..40091fd4a3 100644
--- a/rbutil/Makefile
+++ b/rbutil/Makefile
@@ -9,10 +9,9 @@
9 9
10# Unix-style Makefile for rbutil 10# Unix-style Makefile for rbutil
11 11
12
13CXX=$(shell $(PREFIX)wx-config --cxx) 12CXX=$(shell $(PREFIX)wx-config --cxx)
14INC = 13INC =
15OBJS=rbutil.o rbutilApp.o rbutilFrm.o wizard_pages.o bootloaders.o installlog.o ipodpatcher/ipodpatcher.o ipodpatcher/ipodio-posix.o fwpatcher/md5.o fwpatcher/iriver.o 14OBJS=rbutil.o rbutilApp.o rbutilFrm.o wizard_pages.o bootloaders.o installlog.o ipodpatcher/ipodpatcher.o ipodpatcher/ipodio-posix.o irivertools.o md5sum.o
16 15
17# Install into /usr/local by default 16# Install into /usr/local by default
18ifndef DESTDIR 17ifndef DESTDIR
diff --git a/rbutil/Makefile.macosx b/rbutil/Makefile.macosx
new file mode 100755
index 0000000000..daeb7215bc
--- /dev/null
+++ b/rbutil/Makefile.macosx
@@ -0,0 +1,216 @@
1# =========================================================================
2# This makefile was generated by
3# Bakefile 0.2.1 (http://bakefile.sourceforge.net)
4# Do not modify, all changes will be overwritten!
5# =========================================================================
6
7
8
9
10srcdir = /Users/dave/rockbox/rockbox-devel/rbutil
11top_srcdir = /Users/dave/src/wxMac-2.8.0/
12BK_DEPS = /Users/dave/src/wxMac-2.8.0/osx_build/bk-deps
13wx_top_builddir = /Users/dave/src/wxMac-2.8.0/osx_build
14
15prefix = /usr/local
16exec_prefix = ${prefix}
17INSTALL = /usr/bin/install -c
18EXEEXT =
19WINDRES =
20REZ = /Developer/Tools/Rez
21SETFILE = /Developer/Tools/SetFile
22NM = nm
23LIBS = -lz -lpthread -liconv
24LDFLAGS_GUI =
25CXX = g++
26CXXFLAGS = -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 -Wall -Wundef -Wno-ctor-dtor-privacy -O2 -fno-strict-aliasing -fno-common
27CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -I${wx_top_builddir}/lib/wx/include/mac-ansi-release-static-2.8 -I${top_srcdir}/include -fpascal-strings -I${top_srcdir}/src/mac/carbon/morefilex -I/Developer/Headers/FlatCarbon
28RBUTIL_CFLAGS = $(CXXFLAGS) -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -I${wx_top_builddir}/lib/wx/include/mac-ansi-release-static-2.8 -I${top_srcdir}/include -fpascal-strings -I${top_srcdir}/src/mac/carbon/morefilex -I/Developer/Headers/FlatCarbon
29LDFLAGS = -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 -framework QuickTime -framework IOKit -framework Carbon -framework Cocoa -framework System
30WX_LIB_FLAVOUR =
31TOOLKIT = MAC
32TOOLKIT_LOWERCASE = mac
33TOOLKIT_VERSION =
34TOOLCHAIN_FULLNAME = mac-ansi-release-static-2.8
35EXTRALIBS = -framework QuickTime -framework IOKit -framework Carbon -framework Cocoa -framework System -lz -lpthread -liconv
36EXTRALIBS_GUI = -framework WebKit
37HOST_SUFFIX =
38SAMPLES_RPATH_FLAG =
39SAMPLES_RPATH_POSTLINK =
40
41### Variables: ###
42
43DESTDIR =
44WX_RELEASE = 2.8
45WX_VERSION = $(WX_RELEASE).0
46LIBDIRNAME = $(wx_top_builddir)/lib
47RBUTIL_CXXFLAGS = -D__WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p) \
48 $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) \
49 -I$(srcdir) $(__DLLFLAG_p) $(CPPFLAGS) $(CXXFLAGS)
50RBUTIL_OBJECTS = \
51 $(__rbutil_os2_lib_res) \
52 rbutil.o rbutilApp.o rbutilFrm.o wizard_pages.o bootloaders.o installlog.o \
53 ipodpatcher/ipodpatcher.o ipodpatcher/ipodio-posix.o \
54 md5sum.o irivertools.o \
55 $(__rbutil___win32rc)
56
57### Conditionally set variables: ###
58
59#CXXC = $(CXX)
60CXXC = $(BK_DEPS) $(CXX)
61#PORTNAME = base
62PORTNAME = $(TOOLKIT_LOWERCASE)$(TOOLKIT_VERSION)
63WXBASEPORT = _carbon
64#WXDEBUGFLAG = d
65#WXDEBUGFLAG = d
66#WXUNICODEFLAG = u
67#WXUNIVNAME = univ
68EXTRALIBS_FOR_BASE = $(EXTRALIBS)
69#EXTRALIBS_FOR_BASE = $(EXTRALIBS) $(EXTRALIBS_GUI)
70EXTRALIBS_FOR_GUI = $(EXTRALIBS_GUI)
71#EXTRALIBS_FOR_GUI =
72__rbutil___mac_setfilecmd = \
73 $(SETFILE) -a C rbutil$(EXEEXT)
74__rbutil___mac_rezcmd = $(__MACOSX_RESOURCES_p_1)
75#__WXUNIV_DEFINE_p = -D__WXUNIVERSAL__
76#__WXUNIV_DEFINE_p_1 = -d __WXUNIVERSAL__
77#__WXUNIV_DEFINE_p_2 = --define __WXUNIVERSAL__
78#__EXCEPTIONS_DEFINE_p = -DwxNO_EXCEPTIONS
79#__EXCEPTIONS_DEFINE_p_1 = -d wxNO_EXCEPTIONS
80#__EXCEPTIONS_DEFINE_p_2 = --define wxNO_EXCEPTIONS
81#__RTTI_DEFINE_p = -DwxNO_RTTI
82#__RTTI_DEFINE_p_1 = -d wxNO_RTTI
83#__RTTI_DEFINE_p_2 = --define wxNO_RTTI
84#__THREAD_DEFINE_p = -DwxNO_THREADS
85#__THREAD_DEFINE_p_1 = -d wxNO_THREADS
86#__THREAD_DEFINE_p_2 = --define wxNO_THREADS
87#__DLLFLAG_p = -DWXUSINGDLL
88#__DLLFLAG_p_1 = -d WXUSINGDLL
89#__DLLFLAG_p_2 = --define WXUSINGDLL
90COND_PLATFORM_OS2_1___rbutil___os2_emxbindcmd = $(NM) rbutil$(EXEEXT) | if \
91 grep -q pmwin.763 ; then emxbind -ep rbutil$(EXEEXT) ; fi
92#__rbutil___os2_emxbindcmd = $(COND_PLATFORM_OS2_1___rbutil___os2_emxbindcmd)
93#__RCDEFDIR_p = -i \
94# $(LIBDIRNAME)/wx/include/$(TOOLCHAIN_FULLNAME)
95#__RCDEFDIR_p_1 = --include-dir \
96# $(LIBDIRNAME)/wx/include/$(TOOLCHAIN_FULLNAME)
97#__rbutil_os2_lib_res = \
98# $(top_srcdir)/include/wx/os2/wx.res
99__rbutil_bundle___depname = rbutil_bundle
100#____rbutil_BUNDLE_TGT_REF_DEP = \
101# rbutil.app/Contents/PkgInfo
102____rbutil_BUNDLE_TGT_REF_DEP = \
103 rbutil.app/Contents/PkgInfo
104COND_MONOLITHIC_0___WXLIB_CORE_p = \
105 -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core-$(WX_RELEASE)$(HOST_SUFFIX)
106__WXLIB_CORE_p = $(COND_MONOLITHIC_0___WXLIB_CORE_p)
107COND_MONOLITHIC_0___WXLIB_BASE_p = \
108 -lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
109__WXLIB_BASE_p = $(COND_MONOLITHIC_0___WXLIB_BASE_p)
110
111__WXLIB_ADV_p = -lwx_mac_adv$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
112__WXLIB_NET_p = -lwx_base_carbon_net-$(WX_RELEASE)$(HOST_SUFFIX)
113
114#__rbutil___win32rc = rbutil_rc.o
115COND_MONOLITHIC_1___WXLIB_MONO_p = \
116 -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
117#__WXLIB_MONO_p = $(COND_MONOLITHIC_1___WXLIB_MONO_p)
118__LIB_TIFF_p \
119 = \
120 -lwxtiff$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
121__LIB_JPEG_p \
122 = \
123 -lwxjpeg$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
124__LIB_PNG_p \
125 = \
126 -lwxpng$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
127#__LIB_ZLIB_p = \
128# -lwxzlib$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
129#__LIB_ODBC_p = \
130# -lwxodbc$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
131COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p = \
132 -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
133#__LIB_REGEX_p = $(COND_WXUSE_REGEX_BUILTIN___LIB_REGEX_p)
134__LIB_EXPAT_p = \
135 -lwxexpat$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX)
136COND_TOOLKIT_MAC___MACOSX_RESOURCES_p_1 = $(REZ) -d __DARWIN__ -t APPL -d \
137 __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) \
138 $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) -i $(srcdir) $(__DLLFLAG_p_1) -i \
139 $(srcdir)/../../samples $(__RCDEFDIR_p) -i $(top_srcdir)/include -o \
140 rbutil$(EXEEXT) Carbon.r rbutil.r
141__MACOSX_RESOURCES_p_1 = $(COND_TOOLKIT_MAC___MACOSX_RESOURCES_p_1)
142
143### Targets: ###
144
145all: rbutil$(EXEEXT) $(__rbutil_bundle___depname) data
146
147install: all
148
149uninstall:
150
151install-strip: install
152
153clean:
154 rm -rf ./.deps ./.pch
155 rm -f $(RBUTIL_OBJECTS)
156 rm -f rbutil$(EXEEXT)
157 rm -rf rbutil.app
158
159distclean: clean
160 rm -f config.cache config.log config.status bk-deps bk-make-pch shared-ld-sh Makefile
161
162rbutil$(EXEEXT): $(RBUTIL_OBJECTS) $(__rbutil___win32rc)
163 $(CXX) -o $@ $(RBUTIL_OBJECTS) $(LDFLAGS) -L$(LIBDIRNAME) $(LDFLAGS_GUI) $(SAMPLES_RPATH_FLAG) $(LIBS) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__WXLIB_ADV_p) $(__WXLIB_NET_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) $(EXTRALIBS_FOR_GUI) $(__LIB_ZLIB_p) $(__LIB_ODBC_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE)
164 $(__rbutil___mac_rezcmd)
165 $(__rbutil___mac_setfilecmd)
166 $(__rbutil___os2_emxbindcmd)
167 $(SAMPLES_RPATH_POSTLINK)
168
169rbutil.app/Contents/PkgInfo: rbutil$(EXEEXT) $(top_srcdir)/src/mac/carbon/Info.plist.in $(top_srcdir)/src/mac/carbon/wxmac.icns
170 mkdir -p rbutil.app/Contents
171 mkdir -p rbutil.app/Contents/MacOS
172 mkdir -p rbutil.app/Contents/Resources
173
174
175 sed -e "s/IDENTIFIER/`echo $(srcdir) | sed -e 's,\.\./,,g' | sed -e 's,/,.,g'`/" \
176 -e "s/EXECUTABLE/rbutil/" \
177 -e "s/VERSION/$(WX_VERSION)/" \
178 $(top_srcdir)/src/mac/carbon/Info.plist.in >rbutil.app/Contents/Info.plist
179
180
181 echo -n "APPL????" >rbutil.app/Contents/PkgInfo
182
183
184 ln -f rbutil$(EXEEXT) rbutil.app/Contents/MacOS/rbutil
185
186
187 cp -f $(top_srcdir)/src/mac/carbon/wxmac.icns rbutil.app/Contents/Resources/wxmac.icns
188
189rbutil_bundle: $(____rbutil_BUNDLE_TGT_REF_DEP)
190
191data:
192 @mkdir -p .
193 @for f in rbutil.ini; do \
194 if test ! -f ./$$f -a ! -d ./$$f ; \
195 then x=yep ; \
196 else x=`find $(srcdir)/$$f -newer ./$$f -print` ; \
197 fi; \
198 case "$$x" in ?*) \
199 cp -pRf $(srcdir)/$$f . ;; \
200 esac; \
201 done
202
203.cpp.o :
204 $(CXXC) $(RBUTIL_CXXFLAGS) -c -o $@ $<
205
206.c.o :
207 $(CC) $(RBUTIL_CFLAGS) -c -o $@ $<
208
209rbutil_rc.o: $(srcdir)/rbutil.rc
210 $(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_2) $(__EXCEPTIONS_DEFINE_p_2) $(__RTTI_DEFINE_p_2) $(__THREAD_DEFINE_p_2) --include-dir $(srcdir) $(__DLLFLAG_p_2) --include-dir $(srcdir)/../../samples $(__RCDEFDIR_p_1) --include-dir $(top_srcdir)/include
211
212
213# Include dependency info, if present:
214-include .deps/*.d
215
216.PHONY: all install uninstall clean distclean rbutil_bundle data
diff --git a/rbutil/bootloaders.cpp b/rbutil/bootloaders.cpp
new file mode 100755
index 0000000000..a2a52be209
--- /dev/null
+++ b/rbutil/bootloaders.cpp
@@ -0,0 +1,452 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * Module: rbutil
9 * File: bootloaders.cpp
10 *
11 * Copyright (C) 2007 Dominik Wenger
12 *
13 * All files in this archive are subject to the GNU General Public License.
14 * See the file COPYING in the source tree root for full license agreement.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21#include "bootloaders.h"
22#include "irivertools.h"
23#include "md5sum.h"
24
25#include "rbutil.h"
26#include "installlog.h"
27
28
29// for ipodpatcher
30int verbose = 0;
31// reserves memory for ipodpatcher
32bool initIpodpatcher()
33{
34 if (ipod_alloc_buffer(&sectorbuf,BUFFER_SIZE) < 0) return true;
35 else return false;
36}
37// uses ipodpatcher for add and rem of bootloader
38bool ipodpatcher(int mode)
39{
40 wxString src,dest,buf;
41
42 // downloading files
43 if(mode == BOOTLOADER_ADD)
44 {
45 src.Printf("%s/ipod/%s.ipod", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
46 dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
47 gv->stdpaths->GetUserDataDir().c_str(),gv->curbootloader.c_str());
48 if ( DownloadURL(src, dest) )
49 {
50 wxRemoveFile(dest);
51 buf.Printf(_("Unable to download %s"), src.c_str() );
52 ERR_DIALOG(buf, _("Install"));
53 return false;
54 }
55 }
56
57 struct ipod_t ipod;
58
59 int n = ipod_scan(&ipod);
60 if (n == 0)
61 {
62 ERR_DIALOG("[ERR] No ipods found.", _("Scanning for Ipods"));
63 return false;
64 }
65 if (n > 1)
66 {
67 ERR_DIALOG("[ERR] to many ipods found.", _("Scanning for Ipods"));
68 return false;
69 }
70
71 if (ipod_open(&ipod, 0) < 0)
72 {
73 ERR_DIALOG("[ERR] could not open ipod", _("open Ipod"));
74 return false;
75 }
76
77 if (read_partinfo(&ipod,0) < 0)
78 {
79 ERR_DIALOG("[ERR] could not read partitiontable", _("reading partitiontable"));
80 return false;
81 }
82
83 if (ipod.pinfo[0].start==0)
84 {
85 ERR_DIALOG("[ERR] No partition 0 on disk", _("reading partitiontable"));
86 int i;
87 double sectors_per_MB = (1024.0*1024.0)/ipod.sector_size;
88
89 buf.Printf("[INFO] Part Start Sector End Sector Size (MB) Type\n");
90 ERR_DIALOG(buf, _("reading partitiontable"));
91 for ( i = 0; i < 4; i++ ) {
92 if (ipod.pinfo[i].start != 0) {
93 buf.Printf("[INFO] %d %10ld %10ld %10.1f %s (0x%02x)\n",
94 i,
95 ipod.pinfo[i].start,
96 ipod.pinfo[i].start+ipod.pinfo[i].size-1,
97 ipod.pinfo[i].size/sectors_per_MB,
98 get_parttype(ipod.pinfo[i].type),
99 ipod.pinfo[i].type);
100 ERR_DIALOG(buf, _("reading partitiontable"));
101 }
102 }
103 return false;
104 }
105
106 read_directory(&ipod);
107
108 if (ipod.nimages <= 0)
109 {
110 ERR_DIALOG("[ERR] Failed to read firmware directory", _("reading directory"));
111 return false;
112 }
113 if (getmodel(&ipod,(ipod.ipod_directory[0].vers>>8)) < 0)
114 {
115 buf.Printf(_("[ERR] Unknown version number in firmware (%08x)\n"),
116 ipod.ipod_directory[0].vers );
117 ERR_DIALOG(buf, _("reading directory"));
118 return false;
119 }
120
121 if (ipod.macpod)
122 {
123 WARN_DIALOG("Warning this is a MacPod, Rockbox doesnt work on this. Convert it to WinPod",_("MacPod"));
124 }
125
126
127 if(mode == BOOTLOADER_ADD)
128 {
129 if (ipod_reopen_rw(&ipod) < 0) {
130 ERR_DIALOG("[ERR] Could not open Ipod in RW mode", _("Bootloader add"));
131 return false;
132 }
133
134 if (add_bootloader(&ipod, (char*)dest.c_str(), FILETYPE_DOT_IPOD)==0) {
135
136 } else {
137 ERR_DIALOG("[ERR] failed to add Bootloader", _("Bootloader add"));
138 return false;
139 }
140 }
141 else if(mode == BOOTLOADER_REM)
142 {
143 if (ipod_reopen_rw(&ipod) < 0) {
144 ERR_DIALOG("[ERR] Could not open Ipod in RW mode", _("Bootloader add"));
145 return false;
146 }
147
148 if (ipod.ipod_directory[0].entryOffset==0) {
149 ERR_DIALOG("[ERR] No bootloader detected.\n", _("Bootloader del"));
150 return false;
151 } else {
152 if (delete_bootloader(&ipod)==0) {
153
154 } else {
155 ERR_DIALOG("[ERR] --delete-bootloader failed.\n", _("Bootloader del"));
156 return false;
157 }
158 }
159 }
160
161 ipod_close(&ipod);
162 return true;
163}
164
165// gigabeatinstallation
166bool gigabeatf(int mode)
167{
168 wxString path1,path2;
169 wxString err;
170 wxString src,dest;
171
172 path1.Printf("%s" PATH_SEP "GBSYSTEM" PATH_SEP "FWIMG" PATH_SEP "FWIMG01.DAT",gv->curdestdir.c_str());
173
174 if(mode == BOOTLOADER_ADD)
175 {
176 //Files downloaden
177 src.Printf("%s/gigabeat/%s", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
178 dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
179 gv->stdpaths->GetUserDataDir().c_str(),gv->curbootloader.c_str());
180 if( DownloadURL(src, dest) )
181 {
182 wxRemoveFile(dest);
183 err.Printf(_("Unable to download %s"), src.c_str() );
184 ERR_DIALOG(err, _("Install"));
185 return false;
186 }
187
188
189 if(!wxFileExists(path1))
190 {
191 err.Printf("[ERR] Coud not find %s",path1.c_str());
192 ERR_DIALOG(err, _("Bootloader add"));
193 return false;
194 }
195 path2 = path1;
196 path2.Append(".ORIG");
197 if(wxFileExists(path2))
198 {
199 err = "Its seems there is already a Bootloader install, if not, delete the *.IMG.ORIG file";
200 ERR_DIALOG(err, _("Bootloader add"));
201 return false;
202 }
203
204 if(!wxRenameFile(path1,path2,false))
205 {
206 err.Printf("[ERR] Coud not rename %s to %s",path1.c_str(),path2.c_str());
207 ERR_DIALOG(err, _("Bootloader add"));
208 return false;
209 }
210 if(!wxCopyFile(dest,path1))
211 {
212 err.Printf("[ERR] Coud not copy %s to %s",dest.c_str(),path2.c_str());
213 ERR_DIALOG(err, _("Bootloader add"));
214 return false;
215 }
216 }
217 else if(mode == BOOTLOADER_REM)
218 {
219 path2 = path1;
220 path2.Append(".ORIG");
221 if(!wxFileExists(path2))
222 {
223 err.Printf("[ERR] Coud not find %s",path1.c_str());
224 ERR_DIALOG(err, _("Bootloader del"));
225 return false;
226 }
227 if(!wxRenameFile(path2,path1,true))
228 {
229 err.Printf("[ERR] Coud not rename %s to %s",path1.c_str(),path2.c_str());
230 ERR_DIALOG(err, _("Bootloader del"));
231 return false;
232 }
233 }
234 return true;
235}
236
237// iaudio bootloader install
238bool iaudiox5(int mode)
239{
240 wxString path1,path2;
241 wxString err;
242 wxString src,dest;
243
244 path1.Printf("%s" PATH_SEP "FIRMWARE" PATH_SEP "%s",gv->curdestdir.c_str(),gv->curbootloader.c_str());
245
246 if(mode == BOOTLOADER_ADD)
247 {
248 //Files downloaden
249 src.Printf("%s/iaudio/%s", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
250 dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
251 gv->stdpaths->GetUserDataDir().c_str(),gv->curbootloader.c_str());
252 if( DownloadURL(src, dest) )
253 {
254 wxRemoveFile(dest);
255 err.Printf(_("Unable to download %s"), src.c_str() );
256 ERR_DIALOG(err, _("Install"));
257 return false;
258 }
259
260 // copy file
261 if(!wxCopyFile(dest,path1))
262 {
263 err.Printf("[ERR] Coud not copy %s to %s",dest.c_str(),path2.c_str());
264 ERR_DIALOG(err, _("Bootloader add"));
265 return false;
266 }
267
268 return true; // install ready
269 }
270 else
271 return false; //no uninstallation possible
272}
273
274// H10 install
275bool h10(int mode)
276{
277 wxString err,src,dest,path1,path2;
278
279 int pos = gv->curbootloader.Find('/');
280 wxString firmwarename = gv->curbootloader.SubString(pos,gv->curbootloader.Length());
281 wxString firmDir = gv->curbootloader.SubString(0,pos);
282
283 if(mode == BOOTLOADER_ADD)
284 {
285 //Files downloaden
286 src.Printf("%s/iriver/%s", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
287 dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
288 gv->stdpaths->GetUserDataDir().c_str(),firmwarename.c_str());
289 if( DownloadURL(src, dest) )
290 {
291 wxRemoveFile(dest);
292 err.Printf(_("Unable to download %s"), src.c_str() );
293 ERR_DIALOG(err, _("Install"));
294 return false;
295 }
296
297 path1.Printf("%s" PATH_SEP "SYSTEM" PATH_SEP "%s",gv->curdestdir.c_str(),firmwarename.c_str());
298 path2.Printf("%s" PATH_SEP "SYSTEM" PATH_SEP "Original.mi4",gv->curdestdir.c_str());
299
300 if(!wxFileExists(path1)) //Firmware dosent exists on player
301 {
302 path1.Printf("%s" PATH_SEP "SYSTEM" PATH_SEP "H10EMP.mi4"); //attempt other firmwarename
303 if(!wxFileExists(path1)) //Firmware dosent exists on player
304 {
305 err.Printf("[ERR] File %s does not Exist",path1.c_str());
306 ERR_DIALOG(err, _("Bootloader add"));
307 return false;
308 }
309 }
310 if(!wxFileExists(path2)) //there is already a original firmware
311 {
312 err.Printf("[ERR] File %s does not Exist",path1.c_str());
313 ERR_DIALOG(err, _("Bootloader add"));
314 return false;
315 }
316 if(!wxRenameFile(path1,path2,false)) //rename Firmware to Original
317 {
318 err.Printf("[ERR] Coud not rename %s to %s",path1.c_str(),path2.c_str());
319 ERR_DIALOG(err, _("Bootloader add"));
320 return false;
321 }
322 if(!wxCopyFile(dest,path1)) // copy file
323 {
324 err.Printf("[ERR] Coud not copy %s to %s",dest.c_str(),path1.c_str());
325 ERR_DIALOG(err, _("Bootloader add"));
326 return false;
327 }
328
329 return true; //install ready
330
331 }
332 else if(mode == BOOTLOADER_REM)
333 {
334 path1.Printf("%s" PATH_SEP "SYSTEM" PATH_SEP "%s",gv->curdestdir.c_str(),firmwarename.c_str());
335 path2.Printf("%s" PATH_SEP "SYSTEM" PATH_SEP "Original.mi4",gv->curdestdir.c_str());
336 if(!wxFileExists(path1)) //Firmware dosent exists on player
337 {
338 path1.Printf("%s" PATH_SEP "SYSTEM" PATH_SEP "H10EMP.mi4"); //attempt other firmwarename
339 if(!wxFileExists(path1)) //Firmware dosent exists on player
340 {
341 err.Printf("[ERR] File %s does not Exist",path1.c_str());
342 ERR_DIALOG(err, _("Bootloader rem"));
343 return false;
344 }
345 }
346
347 if(!wxFileExists(path2)) //Original Firmware dosent exists on player
348 {
349 err.Printf("[ERR] File %s does not Exist",path2.c_str());
350 ERR_DIALOG(err, _("Bootloader rem"));
351 return false;
352 }
353
354 if(!wxRenameFile(path2,path1,true)) //rename Firmware to Original
355 {
356 err.Printf("[ERR] Coud not rename %s to %s",path2.c_str(),path1.c_str());
357 ERR_DIALOG(err, _("Bootloader add"));
358 return false;
359 }
360
361 }
362
363}
364
365// FWPatcher
366bool fwpatcher(int mode)
367{
368 if(mode == BOOTLOADER_ADD)
369 {
370 wxString md5sum_str,src,dest,err;
371 int series,table_entry;
372
373 if (!FileMD5(gv->curfirmware, &md5sum_str)) {
374 ERR_DIALOG("Could not open firmware", _("Open Firmware"));
375 return false;
376 }
377 else {
378 /* Check firmware against md5sums in h120sums and h100sums */
379 series = 0;
380 table_entry = intable(md5sum_str, &h120pairs[0],
381 sizeof(h120pairs)/sizeof(struct sumpairs));
382 if (table_entry >= 0) {
383 series = 120;
384 }
385 else {
386 table_entry = intable(md5sum_str, &h100pairs[0],
387 sizeof(h100pairs)/sizeof(struct sumpairs));
388 if (table_entry >= 0) {
389 series = 100;
390 }
391 else {
392 table_entry =
393 intable(md5sum_str, &h300pairs[0],
394 sizeof(h300pairs)/sizeof(struct sumpairs));
395 if (table_entry >= 0)
396 series = 300;
397 }
398 }
399 if (series == 0) {
400 ERR_DIALOG("Could not detect firmware type", _("Detect Player out of Firmware"));
401 return false;
402 }
403 else
404 {
405 //Download bootloader
406 src.Printf("%s/iriver/%s", gv->bootloader_url.c_str(),gv->curbootloader.c_str());
407 dest.Printf("%s" PATH_SEP "download" PATH_SEP "%s",
408 gv->stdpaths->GetUserDataDir().c_str(),gv->curbootloader.c_str());
409 if( DownloadURL(src, dest) )
410 {
411 wxRemoveFile(dest);
412 err.Printf(_("Unable to download %s"), src.c_str() );
413 ERR_DIALOG(err, _("Install"));
414 return false;
415 }
416
417 if(!PatchFirmware(gv->curfirmware,dest,series, table_entry)) // Patch firmware
418 {
419 ERR_DIALOG("Patching Firmware failed", _("Patching Firmware"));
420 return false;
421 }
422 }
423
424 // Load patched Firmware to player
425 src.Printf("%s" PATH_SEP "download" PATH_SEP "new.hex",
426 gv->stdpaths->GetUserDataDir().c_str());
427
428 if(gv->curplat == "h100")
429 dest.Printf("%s" PATH_SEP "ihp_100.hex",gv->curdestdir.c_str());
430 else if(gv->curplat == "h120")
431 dest.Printf("%s" PATH_SEP "ihp_120.hex",gv->curdestdir.c_str());
432 else if(gv->curplat == "h300")
433 dest.Printf("%s" PATH_SEP "H300.hex",gv->curdestdir.c_str());
434
435 if(!wxRenameFile(src,dest))
436 {
437 ERR_DIALOG("Copying Firmware to Device failed", _("Copying Firmware"));
438 return false;
439 }
440 else
441 {
442 return true;
443 }
444
445 }
446
447 }
448 else
449 {
450 return false; //no uninstall possible
451 }
452}
diff --git a/rbutil/bootloaders.h b/rbutil/bootloaders.h
new file mode 100755
index 0000000000..53569e34da
--- /dev/null
+++ b/rbutil/bootloaders.h
@@ -0,0 +1,41 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * Module: rbutil
9 * File: bootloaders.h
10 *
11 * Copyright (C) 2007 Dominik Wenger
12 *
13 * All files in this archive are subject to the GNU General Public License.
14 * See the file COPYING in the source tree root for full license agreement.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21
22
23#ifndef BOOTLOADERS_H_INCLUDED
24#define BOOTLOADERS_H_INCLUDED
25
26
27extern "C" {
28 // Ipodpatcher
29 #include "ipodpatcher/ipodpatcher.h"
30};
31
32
33bool initIpodpatcher();
34bool ipodpatcher(int mode);
35bool gigabeatf(int mode);
36bool iaudiox5(int mode);
37bool fwpatcher(int mode);
38bool h10(int mode);
39
40
41#endif // BOOTLOADERS_H_INCLUDED
diff --git a/rbutil/credits.h b/rbutil/credits.h
index 867661b067..39f8389621 100644
--- a/rbutil/credits.h
+++ b/rbutil/credits.h
@@ -27,6 +27,7 @@
27static const char* rbutil_developers[] = { 27static const char* rbutil_developers[] = {
28 "Christi Alice Scarborough", 28 "Christi Alice Scarborough",
29 "Dave Chapman", 29 "Dave Chapman",
30 "Dominik Wenger",
30 "" 31 ""
31}; 32};
32 33
diff --git a/rbutil/h100sums.h b/rbutil/h100sums.h
new file mode 100755
index 0000000000..ebbdcc28db
--- /dev/null
+++ b/rbutil/h100sums.h
@@ -0,0 +1,23 @@
1/* Checksums of firmwares for ihp_100 */
2/* order: unpatched, patched */
3
4/* 1.63eu */
5{"86103cb05658970b43ce1f40f93d53a8", "4938420d83aa6da3764d33e5a008c8d4"},
6/* 1.63k */
7{"70127fa9ee69afab7645297fbb61636d", "044b737ddb74436353e290d3fbcc3333"},
8/* 1.63us */
9{"7a504a450c76a0dda757fdb6b5531b22", "e51883ed89d49f5677b0a976aef7b154"},
10/* 1.65eu */
11{"478dc657b97e77d1b4944ef26c3dcb8e", "528917d9e5b34a3e5bcac8fe1f4bd7a9"},
12/* 1.65k */
13{"97ba82fb8099bb23ca0c78fc119f8cce", "ef24f69a679e5eba2216045cb24d8b15"},
14/* 1.65us */
15{"d3725865e0948cd5f604b00db2ec89aa", "76d83812b9e1856f768ba913eeba44e1"},
16/* 1.66eu */
17{"fc59f742fe383da3e4d17a660c46afb9", "2aa9d16d3e166a7575fc652db8588daa"},
18/* 1.66k */
19{"22d214401994c276ec6878288caa0dba", "a87dbe604ea98d035450a34b6e184a08"},
20/* 1.66us */
21{"0ae247f567aeafcafecf823a50cbf33e", "f7668e8949f1a78e8ecd685db78b6824"},
22/* 1.66jp */
23{"8bfc8ae5805c270597232efeafade5fd", "72613b75c5196f63e99e41b7a88d7241"},
diff --git a/rbutil/h120sums.h b/rbutil/h120sums.h
new file mode 100755
index 0000000000..09da891ae1
--- /dev/null
+++ b/rbutil/h120sums.h
@@ -0,0 +1,23 @@
1/* Checksums of firmwares for ihp_120 */
2/* order: unpatched, patched */
3
4/* 1.63eu */
5{"14488347a171480c63c94bc7b885225d", "15f09130a1aa02c25f820e8cc68259a4"},
6/* 1.63k */
7{"3401fe8845e569156abfaddf05ca7771", "55e4cb20e36f4da06ad80b31aaaa3054"},
8/* 1.63us */
9{"d9078209105c186cee5246055fdb99c9", "dbdd012a3d821d26f907879cca71e9f4"},
10/* 1.65eu */
11{"c9e71aac4a498f1e2f0e684c2d554ea1", "43454df30c176e55d0df7e3c48e67785"},
12/* 1.65k */
13{"360c0c565266f84e9bca610c596f3207", "d8cb7d9f586186bf9780ee761fc8a677"},
14/* 1.65us */
15{"b9e516d4b8a0265605f46f254897bfb0", "99c5666e990dc782b9daefcb1a087ec0"},
16/* 1.66eu */
17{"a094999b41781f4322a57b9be7fa4534", "e26d2574f39cee0adcdd54fb9f316293"},
18/* 1.66k */
19{"79daba973bb31b60b4b87c2ef497587d", "e76121ba9efe72ecfbb6392eaefe6d96"},
20/* 1.66us */
21{"7fa020a3104c76fbbfcb8313e287dbe2", "12194678a2fdd0814d2e0bb57c8e8e6e"},
22/* 1.66jp */
23{"271d151eb6586929da24b3458ea965fe", "51716393ea0605d225e70a6be29dfdbd"},
diff --git a/rbutil/h300sums.h b/rbutil/h300sums.h
new file mode 100755
index 0000000000..1c6581a6d1
--- /dev/null
+++ b/rbutil/h300sums.h
@@ -0,0 +1,17 @@
1/* Checksums of firmwares for ihp_300 */
2/* order: unpatched, patched */
3
4/* 1.28eu */
5{"0b2083d37f24899b82d21a14d2b38060", "9cd7e291a66f55335c619d63f3a7634b"},
6/* 1.28k */
7{"c6f854ae3d8f48e8982819a4b5302fb0", "90967247ba3f1bcb257432a4d78553bf"},
8/* 1.28jp */
9{"7fcd7bca6b98a34134e2518a616f4e85", "cfd22c20e473727148f11f83d0028fb3"},
10/* 1.29eu */
11{"27d90fc316709c096979ab24c914ee31", "5982302507d57c2a96e9480c242b5de0"},
12/* 1.29k */
13{"44416d97737fc47cd417a64d44064768", "1303e22ef5b1af866aa4def03d6c5f5a"},
14/* 1.29jp */
15{"1ac242c645572a0a5de99ae2b23453b8", "ce433c404ff7531f5852ce3cb61143ee"},
16/* 1.30eu */
17{"8d2d775b018f0532235d38f5317ae10c", "7fb49041294b3e6aea3894218d6d64cf"},
diff --git a/rbutil/irivertools.cpp b/rbutil/irivertools.cpp
new file mode 100755
index 0000000000..f04db6417a
--- /dev/null
+++ b/rbutil/irivertools.cpp
@@ -0,0 +1,613 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * Module: rbutil
9 * File: irivertools.cpp
10 *
11 * Copyright (C) 2007 Dominik Wenger
12 *
13 * All files in this archive are subject to the GNU General Public License.
14 * See the file COPYING in the source tree root for full license agreement.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21#include "irivertools.h"
22#include "md5sum.h"
23
24
25const unsigned char munge[] = {
26 0x7a, 0x36, 0xc4, 0x43, 0x49, 0x6b, 0x35, 0x4e, 0xa3, 0x46, 0x25, 0x84,
27 0x4d, 0x73, 0x74, 0x61
28};
29
30const unsigned char header_modify[] = "* IHPFIRM-DECODED ";
31
32const char * const models[] = { "iHP-100", "iHP-120/iHP-140", "H300 series",
33 NULL };
34
35/* aligns with models array; expected min firmware size */
36const unsigned int firmware_minsize[] = { 0x100000, 0x100000, 0x200000 };
37/* aligns with models array; expected max firmware size */
38const unsigned int firmware_maxsize[] = { 0x200000, 0x200000, 0x400000 };
39
40const unsigned char header[][16] = {
41 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },
42 { 0x20, 0x03, 0x08, 0x27, 0x24, 0x00, 0x02, 0x30, 0x19, 0x17, 0x65, 0x73,
43 0x85, 0x32, 0x83, 0x22 },
44 { 0x20, 0x04, 0x03, 0x27, 0x20, 0x50, 0x01, 0x70, 0x80, 0x30, 0x80, 0x06,
45 0x30, 0x19, 0x17, 0x65 }
46};
47
48/* begin mkboot.c excerpt */
49unsigned char image[0x400000 + 0x220 + 0x400000/0x200];
50
51bool mkboot(wxString infile, wxString outfile,wxString bootloader,int origin)
52{
53 wxString err;
54 int i;
55 int len,bllen;
56 int actual_length, total_length, binary_length, num_chksums;
57
58 memset(image, 0xff, sizeof(image));
59
60 /* First, read the iriver original firmware into the image */
61 wxFile f;
62 if(!f.Open(infile))
63 {
64 err.Printf("Could not open: %s",infile.c_str());
65 ERR_DIALOG(err, _("mkboot"));
66 return false;
67 }
68 i = f.Read(image,16);
69 if(i < 16) {
70 ERR_DIALOG("reading header failed", _("mkboot"));
71 return false;
72 }
73
74 /* This is the length of the binary image without the scrambling
75 overhead (but including the ESTFBINR header) */
76 binary_length = image[4] + (image[5] << 8) +
77 (image[6] << 16) + (image[7] << 24);
78
79 /* Read the rest of the binary data, but not the checksum block */
80 len = binary_length+0x200-16;
81 i = f.Read(image+16, len);
82 if(i < len) {
83 ERR_DIALOG("reading firmware failed", _("mkboot"));
84 return false;
85 }
86
87 f.Close();
88 /* Now, read the boot loader into the image */
89 if(!f.Open(bootloader))
90 {
91 err.Printf("Could not open: %s",bootloader.c_str());
92 ERR_DIALOG(err, _("mkboot"));
93 return false;
94 }
95
96 bllen = f.Length();
97
98 i = f.Read(image+0x220 + origin, bllen);
99 if(i < bllen) {
100 ERR_DIALOG("reading bootloader failed", _("mkboot"));
101 return false;
102 }
103
104 f.Close();
105
106 if(!f.Open(outfile,wxFile::write))
107 {
108 err.Printf("Could not open: %s",outfile.c_str());
109 ERR_DIALOG(err, _("mkboot"));
110 return false;
111 }
112
113 /* Patch the reset vector to start the boot loader */
114 image[0x220 + 4] = image[origin + 0x220 + 4];
115 image[0x220 + 5] = image[origin + 0x220 + 5];
116 image[0x220 + 6] = image[origin + 0x220 + 6];
117 image[0x220 + 7] = image[origin + 0x220 + 7];
118
119 /* This is the actual length of the binary, excluding all headers */
120 actual_length = origin + bllen;
121
122 /* Patch the ESTFBINR header */
123 image[0x20c] = (actual_length >> 24) & 0xff;
124 image[0x20d] = (actual_length >> 16) & 0xff;
125 image[0x20e] = (actual_length >> 8) & 0xff;
126 image[0x20f] = actual_length & 0xff;
127
128 image[0x21c] = (actual_length >> 24) & 0xff;
129 image[0x21d] = (actual_length >> 16) & 0xff;
130 image[0x21e] = (actual_length >> 8) & 0xff;
131 image[0x21f] = actual_length & 0xff;
132
133 /* This is the length of the binary, including the ESTFBINR header and
134 rounded up to the nearest 0x200 boundary */
135 binary_length = (actual_length + 0x20 + 0x1ff) & 0xfffffe00;
136
137 /* The number of checksums, i.e number of 0x200 byte blocks */
138 num_chksums = binary_length / 0x200;
139
140 /* The total file length, including all headers and checksums */
141 total_length = binary_length + num_chksums + 0x200;
142
143 /* Patch the scrambler header with the new length info */
144 image[0] = total_length & 0xff;
145 image[1] = (total_length >> 8) & 0xff;
146 image[2] = (total_length >> 16) & 0xff;
147 image[3] = (total_length >> 24) & 0xff;
148
149 image[4] = binary_length & 0xff;
150 image[5] = (binary_length >> 8) & 0xff;
151 image[6] = (binary_length >> 16) & 0xff;
152 image[7] = (binary_length >> 24) & 0xff;
153
154 image[8] = num_chksums & 0xff;
155 image[9] = (num_chksums >> 8) & 0xff;
156 image[10] = (num_chksums >> 16) & 0xff;
157 image[11] = (num_chksums >> 24) & 0xff;
158
159 i = f.Write(image,total_length);
160 if(i < total_length) {
161 ERR_DIALOG("writing bootloader failed", _("mkboot"));
162 return false;
163 }
164
165 f.Close();
166
167 return true;
168}
169
170/* end mkboot.c excerpt */
171
172
173int intable(wxString md5, struct sumpairs *table, int len)
174{
175 int i;
176 for (i = 0; i < len; i++) {
177 if (md5.Cmp(table[i].unpatched) == 0) {
178 return i;
179 }
180 }
181 return -1;
182}
183
184
185
186
187static int testheader( const unsigned char * const data )
188{
189 const unsigned char * const d = data+16;
190 const char * const * m = models;
191 int index = 0;
192 while( *m )
193 {
194 if( memcmp( header[ index ], d, 16 ) == 0 )
195 return index;
196 index++;
197 m++;
198 };
199 return -1;
200};
201
202static void modifyheader( unsigned char * data )
203{
204 const unsigned char * h = header_modify;
205 int i;
206 for( i=0; i<512; i++ )
207 {
208 if( *h == '\0' )
209 h = header_modify;
210 *data++ ^= *h++;
211 };
212};
213
214int iriver_decode(wxString infile_name, wxString outfile_name, unsigned int modify,
215 enum striptype stripmode )
216{
217 wxString err;
218 wxFile infile;
219 wxFile outfile;
220 int i = -1;
221 unsigned char headerdata[512];
222 unsigned long dwLength1, dwLength2, dwLength3, fp = 0;
223 unsigned char blockdata[16+16];
224 unsigned char out[16];
225 unsigned char newmunge;
226 signed long lenread;
227 int s = 0;
228 unsigned char * pChecksums, * ppChecksums = 0;
229 unsigned char ck;
230
231 if(!infile.Open(infile_name))
232 {
233 err.Printf("Could not open: %s",infile_name.c_str());
234 ERR_DIALOG(err, _("iriver_decode"));
235 return -1;
236 }
237 if(!outfile.Open(outfile_name,wxFile::write))
238 {
239 err.Printf("Could not open: %s",outfile_name.c_str());
240 ERR_DIALOG(err, _("iriver_decode"));
241 return -1;
242 }
243 lenread = infile.Read( headerdata, 512);
244 if( lenread != 512 )
245 {
246 ERR_DIALOG(_("This doesn't look like a valid encrypted iHP "
247 "firmware - reason: header length\n"),_("iriver_decode"));
248
249 infile.Close();
250 outfile.Close();
251 return -1;
252 };
253
254 i = testheader( headerdata );
255 if( i == -1 )
256 {
257 ERR_DIALOG( _( "This firmware is for an unknown model, or is not"
258 " a valid encrypted iHP firmware\n" ),_("iriver_decode"));
259 infile.Close();
260 outfile.Close();
261 return -1;
262 };
263 fprintf( stderr, "Model %s\n", models[ i ] );
264
265 dwLength1 = headerdata[0] | (headerdata[1]<<8) |
266 (headerdata[2]<<16) | (headerdata[3]<<24);
267 dwLength2 = headerdata[4] | (headerdata[5]<<8) |
268 (headerdata[6]<<16) | (headerdata[7]<<24);
269 dwLength3 = headerdata[8] | (headerdata[9]<<8) |
270 (headerdata[10]<<16) | (headerdata[11]<<24);
271
272 if( dwLength1 < firmware_minsize[ i ] ||
273 dwLength1 > firmware_maxsize[ i ] ||
274 dwLength2 < firmware_minsize[ i ] ||
275 dwLength2 > dwLength1 ||
276 dwLength3 > dwLength1 ||
277 dwLength2>>9 != dwLength3 ||
278 dwLength2+dwLength3+512 != dwLength1 )
279 {
280 ERR_DIALOG( _( "This doesn't look like a valid encrypted "
281 "iHP firmware - reason: file 'length' data\n" ),_("iriver_decode"));
282 infile.Close();
283 outfile.Close();
284 return -1;
285 };
286
287 pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );
288
289 if( modify )
290 {
291 modifyheader( headerdata );
292 };
293
294 if( stripmode == STRIP_NONE )
295 outfile.Write( headerdata, 512);
296
297 memset( blockdata, 0, 16 );
298
299 ck = 0;
300 while( ( fp < dwLength2 ) &&
301 ( lenread = infile.Read( blockdata+16, 16) == 16) )
302 {
303 fp += 16;
304
305 for( i=0; i<16; ++i )
306 {
307 newmunge = blockdata[16+i] ^ munge[i];
308 out[i] = newmunge ^ blockdata[i];
309 blockdata[i] = newmunge;
310 ck += out[i];
311 }
312
313 if( fp > ESTF_SIZE || stripmode != STRIP_HEADER_CHECKSUM_ESTF )
314 {
315 outfile.Write( out+4, 12);
316 outfile.Write( out, 4);
317 }
318 else
319 {
320 if( ESTF_SIZE - fp < 16 )
321 {
322 memcpy( out+4, blockdata+16, 12 );
323 memcpy( out, blockdata+28, 4 );
324 outfile.Write( blockdata+16+ESTF_SIZE-fp, ESTF_SIZE-fp);
325 }
326 }
327
328
329 if( s == 496 )
330 {
331 s = 0;
332 memset( blockdata, 0, 16 );
333 *ppChecksums++ = ck;
334 ck = 0;
335 }
336 else
337 s+=16;
338 };
339
340 if( fp != dwLength2 )
341 {
342 ERR_DIALOG( _( "This doesn't look like a valid encrypted "
343 "iHP firmware - reason: 'length2' mismatch\n" ),_("iriver_decode"));
344 infile.Close();
345 outfile.Close();
346 return -1;
347 };
348
349 fp = 0;
350 ppChecksums = pChecksums;
351 while( ( fp < dwLength3 ) &&
352 ( lenread = infile.Read( blockdata, 32 ) ) > 0 )
353 {
354 fp += lenread;
355 if( stripmode == STRIP_NONE )
356 outfile.Write( blockdata, lenread );
357 if( memcmp( ppChecksums, blockdata, lenread ) != 0 )
358 {
359 ERR_DIALOG( _( "This doesn't look like a valid encrypted "
360 "iHP firmware - reason: Checksum mismatch!" ),_("iriver_decode"));
361 infile.Close();
362 outfile.Close();
363 return -1;
364 };
365 ppChecksums += lenread;
366 };
367
368 if( fp != dwLength3 )
369 {
370 ERR_DIALOG(_( "This doesn't look like a valid encrypted "
371 "iHP firmware - reason: 'length3' mismatch\n" ),_("iriver_decode"));
372 infile.Close();
373 outfile.Close();
374 return -1;
375 };
376
377
378 fprintf( stderr, "File decoded correctly and all checksums matched!\n" );
379 switch( stripmode )
380 {
381 default:
382 case STRIP_NONE:
383 fprintf(stderr, "Output file contains all headers and "
384 "checksums\n");
385 break;
386 case STRIP_HEADER_CHECKSUM:
387 fprintf( stderr, "NB: output file contains only ESTFBINR header"
388 " and decoded firmware code\n" );
389 break;
390 case STRIP_HEADER_CHECKSUM_ESTF:
391 fprintf( stderr, "NB: output file contains only raw decoded "
392 "firmware code\n" );
393 break;
394 };
395
396 infile.Close();
397 outfile.Close();
398 return 0;
399
400};
401
402int iriver_encode(wxString infile_name, wxString outfile_name, unsigned int modify )
403{
404 wxString err;
405 wxFile infile;
406 wxFile outfile;
407 int i = -1;
408 unsigned char headerdata[512];
409 unsigned long dwLength1, dwLength2, dwLength3, fp = 0;
410 unsigned char blockdata[16+16];
411 unsigned char out[16];
412 unsigned char newmunge;
413 signed long lenread;
414 int s = 0;
415 unsigned char * pChecksums, * ppChecksums;
416 unsigned char ck;
417
418 enum striptype stripmode = STRIP_NONE;
419
420 if(!infile.Open(infile_name,wxFile::read))
421 {
422 err.Printf("Could not open: %s",infile_name.c_str());
423 ERR_DIALOG(err, _("iriver_decode"));
424 return -1;
425 }
426 if(!outfile.Open(outfile_name,wxFile::write))
427 {
428 err.Printf("Could not open: %s",outfile_name.c_str());
429 ERR_DIALOG(err, _("iriver_decode"));
430 return -1;
431 }
432
433 lenread = infile.Read( headerdata, 512 );
434 if( lenread != 512 )
435 {
436 ERR_DIALOG("This doesn't look like a valid decoded "
437 "iHP firmware - reason: header length\n", _("iriver_decode"));
438 infile.Close();
439 outfile.Close();
440 };
441
442 if( modify )
443 {
444 modifyheader( headerdata ); /* reversible */
445 };
446
447 i = testheader( headerdata );
448 if( i == -1 )
449 {
450 ERR_DIALOG("This firmware is for an unknown model, or is not"
451 " a valid decoded iHP firmware\n", _("iriver_decode"));
452 infile.Close();
453 outfile.Close();
454 };
455 fprintf( stderr, "Model %s\n", models[ i ] );
456
457 dwLength1 = headerdata[0] | (headerdata[1]<<8) |
458 (headerdata[2]<<16) | (headerdata[3]<<24);
459 dwLength2 = headerdata[4] | (headerdata[5]<<8) |
460 (headerdata[6]<<16) | (headerdata[7]<<24);
461 dwLength3 = headerdata[8] | (headerdata[9]<<8) |
462 (headerdata[10]<<16) | (headerdata[11]<<24);
463
464 if( dwLength1 < firmware_minsize[i] ||
465 dwLength1 > firmware_maxsize[i] ||
466 dwLength2 < firmware_minsize[i] ||
467 dwLength2 > dwLength1 ||
468 dwLength3 > dwLength1 ||
469 dwLength2+dwLength3+512 != dwLength1 )
470 {
471 ERR_DIALOG("This doesn't look like a valid decoded iHP"
472 " firmware - reason: file 'length' data\n", _("iriver_decode"));
473 infile.Close();
474 outfile.Close();
475 };
476
477 pChecksums = ppChecksums = (unsigned char *)( malloc( dwLength3 ) );
478
479 outfile.Write( headerdata, 512);
480
481 memset( blockdata, 0, 16 );
482 ck = 0;
483 while( ( fp < dwLength2 ) &&
484 ( lenread = infile.Read( blockdata+16, 16) ) == 16 )
485 {
486 fp += 16;
487 for( i=0; i<16; ++i )
488 {
489 newmunge = blockdata[16+((12+i)&0xf)] ^ blockdata[i];
490 out[i] = newmunge ^ munge[i];
491 ck += blockdata[16+i];
492 blockdata[i] = newmunge;
493 };
494 outfile.Write( out, 16);
495
496 if( s == 496 )
497 {
498 s = 0;
499 memset( blockdata, 0, 16 );
500 *ppChecksums++ = ck;
501 ck = 0;
502 }
503 else
504 s+=16;
505 };
506
507 if( fp != dwLength2 )
508 {
509 ERR_DIALOG("This doesn't look like a valid decoded "
510 "iHP firmware - reason: 'length1' mismatch\n", _("iriver_decode"));
511 infile.Close();
512 outfile.Close();
513 };
514
515 /* write out remainder w/out applying descrambler */
516 fp = 0;
517 lenread = dwLength3;
518 ppChecksums = pChecksums;
519 while( ( fp < dwLength3) &&
520 ( lenread = outfile.Write( ppChecksums, lenread) ) > 0 )
521 {
522 fp += lenread;
523 ppChecksums += lenread;
524 lenread = dwLength3 - fp;
525 };
526
527 if( fp != dwLength3 )
528 {
529 ERR_DIALOG("This doesn't look like a valid decoded "
530 "iHP firmware - reason: 'length2' mismatch\n", _("iriver_decode"));
531 infile.Close();
532 outfile.Close();
533 };
534
535 fprintf( stderr, "File encoded successfully and checksum table built!\n" );
536
537 infile.Close();
538 outfile.Close();
539 return 0;
540
541};
542
543bool PatchFirmware(wxString firmware,wxString bootloader,int series, int table_entry)
544{
545 wxString name1, name2, name3;
546
547 wxString md5sum_str;
548 int i;
549 struct sumpairs *sums;
550 int origin;
551
552 /* get pointer to the correct bootloader.bin */
553 switch(series) {
554 case 100:
555 sums = &h100pairs[0];
556 origin = 0x1f0000;
557 break;
558 case 120:
559 sums = &h120pairs[0];
560 origin = 0x1f0000;
561 break;
562 case 300:
563 sums = &h300pairs[0];
564 origin = 0x3f0000;
565 break;
566 }
567
568 name1.Printf("%s" PATH_SEP "download" PATH_SEP "firmware.bin",
569 gv->stdpaths->GetUserDataDir().c_str());
570 /* descrambled file */
571 name2.Printf("%s" PATH_SEP "download" PATH_SEP "new.bin",
572 gv->stdpaths->GetUserDataDir().c_str());
573 /* patched file */
574 name3.Printf("%s" PATH_SEP "download" PATH_SEP "new.hex",
575 gv->stdpaths->GetUserDataDir().c_str());
576 if (iriver_decode(firmware, name1, FALSE, STRIP_NONE) == -1) {
577 ERR_DIALOG("Error in descramble", _("Descramble Firmware"));
578 wxRemoveFile(name1);
579 wxRemoveFile(name2);
580 wxRemoveFile(name3);
581 return false;
582 }
583 if (!mkboot(name1, name2, bootloader, origin)) {
584 ERR_DIALOG("Error in patching",_("Patching Firmware"));
585 wxRemoveFile(name1);
586 wxRemoveFile(name2);
587 wxRemoveFile(name3);
588 return false;
589 }
590 if (iriver_encode(name2, name3, FALSE) == -1) {
591 ERR_DIALOG("Error in scramble",_("Scramble Firmware"));
592 wxRemoveFile(name1);
593 wxRemoveFile(name2);
594 wxRemoveFile(name3);
595 return false;
596 }
597 /* now md5sum it */
598 if (!FileMD5(name3, &md5sum_str)) {
599 ERR_DIALOG("Error in checksumming",_("Checksumming Firmware"));
600 wxRemoveFile(name1);
601 wxRemoveFile(name2);
602 wxRemoveFile(name3);
603 return false;
604 }
605 if (strncmp(sums[table_entry].patched, md5sum_str.c_str(), 32) == 0) {
606 /* delete temp files */
607 wxRemoveFile(name1);
608 wxRemoveFile(name2);
609 }
610
611 return true;
612}
613
diff --git a/rbutil/irivertools.h b/rbutil/irivertools.h
new file mode 100755
index 0000000000..deae3f4006
--- /dev/null
+++ b/rbutil/irivertools.h
@@ -0,0 +1,65 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * Module: rbutil
9 * File: irivertools.h
10 *
11 * Copyright (C) 2007 Dominik Wenger
12 *
13 * All files in this archive are subject to the GNU General Public License.
14 * See the file COPYING in the source tree root for full license agreement.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21
22#ifndef IRIVERTOOLS_H_INCLUDED
23#define IRIVERTOOLS_H_INCLUDED
24
25#include "rbutil.h"
26#include "installlog.h"
27
28#define ESTF_SIZE 32
29
30struct sumpairs {
31 char *unpatched;
32 char *patched;
33};
34
35/* precalculated checksums for H110/H115 */
36static struct sumpairs h100pairs[] = {
37#include "h100sums.h"
38};
39
40/* precalculated checksums for H120/H140 */
41static struct sumpairs h120pairs[] = {
42#include "h120sums.h"
43};
44
45/* precalculated checksums for H320/H340 */
46static struct sumpairs h300pairs[] = {
47#include "h300sums.h"
48};
49
50
51enum striptype
52{
53 STRIP_NONE,
54 STRIP_HEADER_CHECKSUM,
55 STRIP_HEADER_CHECKSUM_ESTF
56};
57
58/* protos for iriver.c */
59
60int intable(wxString md5, struct sumpairs *table, int len);
61
62bool PatchFirmware(wxString firmware,wxString bootloader,int series, int table_entry);
63
64
65#endif // IRIVERTOOLS_H_INCLUDED
diff --git a/rbutil/md5sum.cpp b/rbutil/md5sum.cpp
new file mode 100755
index 0000000000..9c253beed2
--- /dev/null
+++ b/rbutil/md5sum.cpp
@@ -0,0 +1,300 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * Module: rbutil
9 * File: md5sum.cpp
10 *
11 * Copyright (C) 2007 Dominik Wenger
12 *
13 * All files in this archive are subject to the GNU General Public License.
14 * See the file COPYING in the source tree root for full license agreement.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21
22/*
23 * RFC 1321 compliant MD5 implementation
24 *
25 * Copyright (C) 2001-2003 Christophe Devine
26 *
27 * This program is free software; you can redistribute it and/or modify
28 * it under the terms of the GNU General Public License as published by
29 * the Free Software Foundation; either version 2 of the License, or
30 * (at your option) any later version.
31 *
32 * This program is distributed in the hope that it will be useful,
33 * but WITHOUT ANY WARRANTY; without even the implied warranty of
34 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35 * GNU General Public License for more details.
36 *
37 * You should have received a copy of the GNU General Public License
38 * along with this program; if not, write to the Free Software
39 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
40 */
41
42
43#include "md5sum.h"
44
45
46#define GET_UINT32(n,b,i) \
47{ \
48 (n) = ( (uint32) (b)[(i) ] ) \
49 | ( (uint32) (b)[(i) + 1] << 8 ) \
50 | ( (uint32) (b)[(i) + 2] << 16 ) \
51 | ( (uint32) (b)[(i) + 3] << 24 ); \
52}
53
54#define PUT_UINT32(n,b,i) \
55{ \
56 (b)[(i) ] = (uint8) ( (n) ); \
57 (b)[(i) + 1] = (uint8) ( (n) >> 8 ); \
58 (b)[(i) + 2] = (uint8) ( (n) >> 16 ); \
59 (b)[(i) + 3] = (uint8) ( (n) >> 24 ); \
60}
61
62void md5_starts( md5_context *ctx )
63{
64 ctx->total[0] = 0;
65 ctx->total[1] = 0;
66
67 ctx->state[0] = 0x67452301;
68 ctx->state[1] = 0xEFCDAB89;
69 ctx->state[2] = 0x98BADCFE;
70 ctx->state[3] = 0x10325476;
71}
72
73void md5_process( md5_context *ctx, uint8 data[64] )
74{
75 uint32 X[16], A, B, C, D;
76
77 GET_UINT32( X[0], data, 0 );
78 GET_UINT32( X[1], data, 4 );
79 GET_UINT32( X[2], data, 8 );
80 GET_UINT32( X[3], data, 12 );
81 GET_UINT32( X[4], data, 16 );
82 GET_UINT32( X[5], data, 20 );
83 GET_UINT32( X[6], data, 24 );
84 GET_UINT32( X[7], data, 28 );
85 GET_UINT32( X[8], data, 32 );
86 GET_UINT32( X[9], data, 36 );
87 GET_UINT32( X[10], data, 40 );
88 GET_UINT32( X[11], data, 44 );
89 GET_UINT32( X[12], data, 48 );
90 GET_UINT32( X[13], data, 52 );
91 GET_UINT32( X[14], data, 56 );
92 GET_UINT32( X[15], data, 60 );
93
94#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
95
96#define P(a,b,c,d,k,s,t) \
97{ \
98 a += F(b,c,d) + X[k] + t; a = S(a,s) + b; \
99}
100
101 A = ctx->state[0];
102 B = ctx->state[1];
103 C = ctx->state[2];
104 D = ctx->state[3];
105
106#define F(x,y,z) (z ^ (x & (y ^ z)))
107
108 P( A, B, C, D, 0, 7, 0xD76AA478 );
109 P( D, A, B, C, 1, 12, 0xE8C7B756 );
110 P( C, D, A, B, 2, 17, 0x242070DB );
111 P( B, C, D, A, 3, 22, 0xC1BDCEEE );
112 P( A, B, C, D, 4, 7, 0xF57C0FAF );
113 P( D, A, B, C, 5, 12, 0x4787C62A );
114 P( C, D, A, B, 6, 17, 0xA8304613 );
115 P( B, C, D, A, 7, 22, 0xFD469501 );
116 P( A, B, C, D, 8, 7, 0x698098D8 );
117 P( D, A, B, C, 9, 12, 0x8B44F7AF );
118 P( C, D, A, B, 10, 17, 0xFFFF5BB1 );
119 P( B, C, D, A, 11, 22, 0x895CD7BE );
120 P( A, B, C, D, 12, 7, 0x6B901122 );
121 P( D, A, B, C, 13, 12, 0xFD987193 );
122 P( C, D, A, B, 14, 17, 0xA679438E );
123 P( B, C, D, A, 15, 22, 0x49B40821 );
124
125#undef F
126
127#define F(x,y,z) (y ^ (z & (x ^ y)))
128
129 P( A, B, C, D, 1, 5, 0xF61E2562 );
130 P( D, A, B, C, 6, 9, 0xC040B340 );
131 P( C, D, A, B, 11, 14, 0x265E5A51 );
132 P( B, C, D, A, 0, 20, 0xE9B6C7AA );
133 P( A, B, C, D, 5, 5, 0xD62F105D );
134 P( D, A, B, C, 10, 9, 0x02441453 );
135 P( C, D, A, B, 15, 14, 0xD8A1E681 );
136 P( B, C, D, A, 4, 20, 0xE7D3FBC8 );
137 P( A, B, C, D, 9, 5, 0x21E1CDE6 );
138 P( D, A, B, C, 14, 9, 0xC33707D6 );
139 P( C, D, A, B, 3, 14, 0xF4D50D87 );
140 P( B, C, D, A, 8, 20, 0x455A14ED );
141 P( A, B, C, D, 13, 5, 0xA9E3E905 );
142 P( D, A, B, C, 2, 9, 0xFCEFA3F8 );
143 P( C, D, A, B, 7, 14, 0x676F02D9 );
144 P( B, C, D, A, 12, 20, 0x8D2A4C8A );
145
146#undef F
147
148#define F(x,y,z) (x ^ y ^ z)
149
150 P( A, B, C, D, 5, 4, 0xFFFA3942 );
151 P( D, A, B, C, 8, 11, 0x8771F681 );
152 P( C, D, A, B, 11, 16, 0x6D9D6122 );
153 P( B, C, D, A, 14, 23, 0xFDE5380C );
154 P( A, B, C, D, 1, 4, 0xA4BEEA44 );
155 P( D, A, B, C, 4, 11, 0x4BDECFA9 );
156 P( C, D, A, B, 7, 16, 0xF6BB4B60 );
157 P( B, C, D, A, 10, 23, 0xBEBFBC70 );
158 P( A, B, C, D, 13, 4, 0x289B7EC6 );
159 P( D, A, B, C, 0, 11, 0xEAA127FA );
160 P( C, D, A, B, 3, 16, 0xD4EF3085 );
161 P( B, C, D, A, 6, 23, 0x04881D05 );
162 P( A, B, C, D, 9, 4, 0xD9D4D039 );
163 P( D, A, B, C, 12, 11, 0xE6DB99E5 );
164 P( C, D, A, B, 15, 16, 0x1FA27CF8 );
165 P( B, C, D, A, 2, 23, 0xC4AC5665 );
166
167#undef F
168
169#define F(x,y,z) (y ^ (x | ~z))
170
171 P( A, B, C, D, 0, 6, 0xF4292244 );
172 P( D, A, B, C, 7, 10, 0x432AFF97 );
173 P( C, D, A, B, 14, 15, 0xAB9423A7 );
174 P( B, C, D, A, 5, 21, 0xFC93A039 );
175 P( A, B, C, D, 12, 6, 0x655B59C3 );
176 P( D, A, B, C, 3, 10, 0x8F0CCC92 );
177 P( C, D, A, B, 10, 15, 0xFFEFF47D );
178 P( B, C, D, A, 1, 21, 0x85845DD1 );
179 P( A, B, C, D, 8, 6, 0x6FA87E4F );
180 P( D, A, B, C, 15, 10, 0xFE2CE6E0 );
181 P( C, D, A, B, 6, 15, 0xA3014314 );
182 P( B, C, D, A, 13, 21, 0x4E0811A1 );
183 P( A, B, C, D, 4, 6, 0xF7537E82 );
184 P( D, A, B, C, 11, 10, 0xBD3AF235 );
185 P( C, D, A, B, 2, 15, 0x2AD7D2BB );
186 P( B, C, D, A, 9, 21, 0xEB86D391 );
187
188#undef F
189#undef S
190#undef P
191
192
193 ctx->state[0] += A;
194 ctx->state[1] += B;
195 ctx->state[2] += C;
196 ctx->state[3] += D;
197}
198
199void md5_update( md5_context *ctx, uint8 *input, uint32 length )
200{
201 uint32 left, fill;
202
203 if( ! length ) return;
204
205 left = ctx->total[0] & 0x3F;
206 fill = 64 - left;
207
208 ctx->total[0] += length;
209 ctx->total[0] &= 0xFFFFFFFF;
210
211 if( ctx->total[0] < length )
212 ctx->total[1]++;
213
214 if( left && length >= fill )
215 {
216 memcpy( (void *) (ctx->buffer + left),
217 (void *) input, fill );
218 md5_process( ctx, ctx->buffer );
219 length -= fill;
220 input += fill;
221 left = 0;
222 }
223
224 while( length >= 64 )
225 {
226 md5_process( ctx, input );
227 length -= 64;
228 input += 64;
229 }
230
231 if( length )
232 {
233 memcpy( (void *) (ctx->buffer + left),
234 (void *) input, length );
235 }
236}
237
238static uint8 md5_padding[64] =
239{
240 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
241 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
242 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
243 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
244};
245
246void md5_finish( md5_context *ctx, uint8 digest[16] )
247{
248 uint32 last, padn;
249 uint32 high, low;
250 uint8 msglen[8];
251
252 high = ( ctx->total[0] >> 29 )
253 | ( ctx->total[1] << 3 );
254 low = ( ctx->total[0] << 3 );
255
256 PUT_UINT32( low, msglen, 0 );
257 PUT_UINT32( high, msglen, 4 );
258
259 last = ctx->total[0] & 0x3F;
260 padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
261
262 md5_update( ctx, md5_padding, padn );
263 md5_update( ctx, msglen, 8 );
264
265 PUT_UINT32( ctx->state[0], digest, 0 );
266 PUT_UINT32( ctx->state[1], digest, 4 );
267 PUT_UINT32( ctx->state[2], digest, 8 );
268 PUT_UINT32( ctx->state[3], digest, 12 );
269}
270
271int FileMD5(wxString name,wxString *md5)
272{
273 int i, read;
274 md5_context ctx;
275 unsigned char md5sum[16];
276 unsigned char block[32768];
277
278 char temp[255];
279 wxFile file;
280
281 file.Open(name);
282
283 if (!file.IsOpened()) {
284 ERR_DIALOG("Could not open patched firmware for checksum check", _("Open Firmware"));
285 return 0;
286 }
287 md5_starts(&ctx);
288 while ( !file.Eof() ) {
289 read = file.Read(block, sizeof(block));
290 md5_update(&ctx, block, read);
291 }
292 file.Close();
293 md5_finish(&ctx, md5sum);
294 for (i = 0; i < 16; ++i)
295 {
296 sprintf(temp + 2*i, "%02x", md5sum[i]);
297 }
298 md5->Append(temp);
299 return 1;
300}
diff --git a/rbutil/md5sum.h b/rbutil/md5sum.h
new file mode 100755
index 0000000000..5cc894c0ea
--- /dev/null
+++ b/rbutil/md5sum.h
@@ -0,0 +1,51 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * Module: rbutil
9 * File: md5sum.h
10 *
11 * Copyright (C) 2007 Dominik Wenger
12 *
13 * All files in this archive are subject to the GNU General Public License.
14 * See the file COPYING in the source tree root for full license agreement.
15 *
16 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
17 * KIND, either express or implied.
18 *
19 ****************************************************************************/
20
21
22#ifndef MD5SUM_H_INCLUDED
23#define MD5SUM_H_INCLUDED
24
25#ifndef uint8
26#define uint8 unsigned char
27#endif
28
29
30#ifndef uint32
31#define uint32 unsigned long int
32#endif
33
34#include "rbutil.h"
35
36
37typedef struct
38{
39 uint32 total[2];
40 uint32 state[4];
41 uint8 buffer[64];
42}
43md5_context;
44
45void md5_starts( md5_context *ctx );
46void md5_update( md5_context *ctx, uint8 *input, uint32 length );
47void md5_finish( md5_context *ctx, uint8 digest[16] );
48
49int FileMD5(wxString name,wxString *md5);
50
51#endif // MD5SUM_H_INCLUDED
diff --git a/rbutil/mksums.pl b/rbutil/mksums.pl
new file mode 100755
index 0000000000..99786fe161
--- /dev/null
+++ b/rbutil/mksums.pl
@@ -0,0 +1,69 @@
1#!/usr/bin/perl
2
3# This script creates the h100sums.h and h300sums.h files for fwpatcher.
4#
5# It expects a file tree with scrambled and descrambled
6# firmwares like this:
7# orig-firmware/
8# h1xx/
9# 1.66jp/
10# ihp_100.bin
11# ihp_100.hex
12# ihp_120.bin
13# ihp_120.hex
14# h3xx/
15# 1.29jp/
16# H300.bin
17# H300.hex
18# etc.
19#
20# It also expects the bootloader binaries in the current directory:
21# bootloader-h100.bin
22# bootloader-h120.bin
23# bootloader-h300.bin
24
25$orig_path = "~/orig-firmware";
26
27mksumfile("100");
28mksumfile("120");
29mksumfile("300");
30
31sub mksumfile {
32 ($model) = @_;
33
34 open FILE, ">h${model}sums.h" or die "Can't open h${model}sums.h";
35
36 print FILE "/* Checksums of firmwares for ihp_$model */\n";
37 print FILE "/* order: unpatched, patched */\n\n";
38
39 if($model < 300) {
40 foreach("1.63eu","1.63k", "1.63us", "1.65eu","1.65k", "1.65us",
41 "1.66eu", "1.66k", "1.66us", "1.66jp") {
42 `../mkboot $orig_path/h1xx/$_/ihp_$model.bin bootloader-h$model.bin ihp_$model.bin`;
43 `../scramble -iriver ihp_$model.bin ihp_$model.hex`;
44 $origsum = `md5sum $orig_path/h1xx/$_/ihp_$model.hex`;
45 chomp $origsum;
46 ($os, $or) = split / /, $origsum;
47 $sum = `md5sum ihp_$model.hex`;
48 chomp $sum;
49 ($s, $r) = split / /, $sum;
50 print FILE "/* $_ */\n";
51 print FILE "{\"$os\", \"$s\"},\n";
52 }
53 } else {
54 foreach("1.28eu", "1.28k", "1.28jp", "1.29eu", "1.29k", "1.29jp",
55 "1.30eu") {
56 `../mkboot -h300 $orig_path/h3xx/$_/H$model.bin bootloader-h$model.bin H$model.bin`;
57 `../scramble -iriver H$model.bin H$model.hex`;
58 $origsum = `md5sum $orig_path/h3xx/$_/H$model.hex`;
59 chomp $origsum;
60 ($os, $or) = split / /, $origsum;
61 $sum = `md5sum H$model.hex`;
62 chomp $sum;
63 ($s, $r) = split / /, $sum;
64 print FILE "/* $_ */\n";
65 print FILE "{\"$os\", \"$s\"},\n";
66 }
67 }
68 close FILE;
69}
diff --git a/rbutil/rbutil.cbp b/rbutil/rbutil.cbp
index ae6fc4a15a..2ee3f2316d 100644
--- a/rbutil/rbutil.cbp
+++ b/rbutil/rbutil.cbp
@@ -1,18 +1,45 @@
1<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 1<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
2<CodeBlocks_project_file> 2<CodeBlocks_project_file>
3 <FileVersion major="1" minor="5" /> 3 <FileVersion major="1" minor="6" />
4 <Project> 4 <Project>
5 <Option title="rbutil" /> 5 <Option title="rbutil" />
6 <Option pch_mode="0" /> 6 <Option pch_mode="0" />
7 <Option default_target="" />
8 <Option compiler="gcc" /> 7 <Option compiler="gcc" />
9 <Option virtualFolders="" /> 8 <MakeCommands>
9 <Build command="$make -f $makefile all" />
10 <CompileFile command="$make -f $makefile $file" />
11 <Clean command="$make -f $makefile clean" />
12 <DistClean command="$make -f $makefile distclean" />
13 </MakeCommands>
10 <Build> 14 <Build>
11 <Target title="default"> 15 <Target title="Release">
12 <Option output="rbutil.exe" prefix_auto="0" extension_auto="0" /> 16 <Option output="rbutil.exe" prefix_auto="0" extension_auto="0" />
13 <Option type="0" /> 17 <Option type="0" />
14 <Option compiler="gcc" /> 18 <Option compiler="gcc" />
15 <Option projectResourceIncludeDirsRelation="0" /> 19 <Option projectResourceIncludeDirsRelation="0" />
20 <ExtraCommands>
21 <Add after="upx --best --compress-icons=0 rbutil.exe" />
22 </ExtraCommands>
23 <MakeCommands>
24 <Build command="$make -f $makefile all" />
25 <CompileFile command="$make -f $makefile $file" />
26 <Clean command="$make -f $makefile clean" />
27 <DistClean command="$make -f $makefile distclean" />
28 </MakeCommands>
29 </Target>
30 <Target title="Debug">
31 <Option output="rbutil.exe" prefix_auto="0" extension_auto="0" />
32 <Option type="0" />
33 <Option compiler="gcc" />
34 <Compiler>
35 <Add option="-g" />
36 </Compiler>
37 <MakeCommands>
38 <Build command="$make -f $makefile all" />
39 <CompileFile command="$make -f $makefile all" />
40 <Clean command="$make -f $makefile clean" />
41 <DistClean command="$make -f $makefile distclean" />
42 </MakeCommands>
16 </Target> 43 </Target>
17 <Environment> 44 <Environment>
18 <Variable name="WX_CFG" value="" /> 45 <Variable name="WX_CFG" value="" />
@@ -34,12 +61,13 @@
34 <Add directory="$(#WX.include)" /> 61 <Add directory="$(#WX.include)" />
35 <Add directory="$(#WX.lib)\gcc_lib$(WX_CFG)\msw" /> 62 <Add directory="$(#WX.lib)\gcc_lib$(WX_CFG)\msw" />
36 <Add directory="$(#WX)\contrib\include" /> 63 <Add directory="$(#WX)\contrib\include" />
64 <Add directory=".\" />
37 </Compiler> 65 </Compiler>
38 <ResourceCompiler> 66 <ResourceCompiler>
39 <Add directory="$(#WX.include)" /> 67 <Add directory="$(#WX.include)" />
40 </ResourceCompiler> 68 </ResourceCompiler>
41 <Linker> 69 <Linker>
42 <Add library="wxmsw27" /> 70 <Add library="wxmsw28" />
43 <Add library="winspool" /> 71 <Add library="winspool" />
44 <Add library="winmm" /> 72 <Add library="winmm" />
45 <Add library="shell32" /> 73 <Add library="shell32" />
@@ -56,133 +84,57 @@
56 <Add library="libwxzlib" /> 84 <Add library="libwxzlib" />
57 <Add directory="$(#WX.lib)\gcc_lib$(WX_CFG)" /> 85 <Add directory="$(#WX.lib)\gcc_lib$(WX_CFG)" />
58 <Add directory="$(#WX.lib)" /> 86 <Add directory="$(#WX.lib)" />
87 <Add directory=".\" />
59 </Linker> 88 </Linker>
60 <ExtraCommands> 89 <Unit filename="Makefile" />
61 <Add after="upx --best --compress-icons=0 rbutil.exe" /> 90 <Unit filename="archos.ico" />
62 </ExtraCommands> 91 <Unit filename="bootloaders.cpp" />
63 <Unit filename="archos.ico"> 92 <Unit filename="bootloaders.h" />
64 <Option compilerVar="CPP" /> 93 <Unit filename="copying.txt" />
65 <Option compile="0" /> 94 <Unit filename="credits.h" />
66 <Option link="0" /> 95 <Unit filename="fonts_3d.xpm" />
67 <Option target="default" /> 96 <Unit filename="h100sums.h" />
68 </Unit> 97 <Unit filename="h120sums.h" />
69 <Unit filename="copying.txt"> 98 <Unit filename="h300sums.h" />
70 <Option compilerVar="CPP" /> 99 <Unit filename="install_3d.xpm" />
71 <Option compile="0" /> 100 <Unit filename="installlog.cpp" />
72 <Option link="0" /> 101 <Unit filename="installlog.h" />
73 <Option target="default" /> 102 <Unit filename="ipodpatcher\ipodio-win32.c">
74 </Unit> 103 <Option compilerVar="CC" />
75 <Unit filename="credits.h"> 104 <Option compiler="gcc" use="1" buildCommand="mingw32-gcc.exe -W -g -pipe -mthreads -Winvalid-pch -D__GNUWIN32__ -D__WXMSW__ -DUSE_PCH -g -I.\ -IC:\Dev-Cpp\include -c $file -o .objs\ipodpatcher\ipodio-win32.o" />
76 <Option compilerVar="CPP" /> 105 </Unit>
77 <Option compile="0" /> 106 <Unit filename="ipodpatcher\ipodio.h" />
78 <Option link="0" /> 107 <Unit filename="ipodpatcher\ipodpatcher.c">
79 <Option target="default" /> 108 <Option compilerVar="CC" />
80 </Unit> 109 <Option compiler="gcc" use="1" buildCommand="mingw32-gcc.exe -W -g -pipe -mthreads -Winvalid-pch -D__GNUWIN32__ -D__WXMSW__ -DUSE_PCH -g -I.\ -IC:\Dev-Cpp\include -c $file -o .objs\ipodpatcher\ipodpatcher.o\n" />
81 <Unit filename="fonts_3d.xpm"> 110 </Unit>
82 <Option compilerVar="CPP" /> 111 <Unit filename="ipodpatcher\ipodpatcher.h" />
83 <Option compile="0" /> 112 <Unit filename="ipodpatcher\parttypes.h" />
84 <Option link="0" /> 113 <Unit filename="irivertools.cpp" />
85 <Option target="default" /> 114 <Unit filename="irivertools.h" />
86 </Unit> 115 <Unit filename="md5sum.cpp" />
87 <Unit filename="install_3d.xpm"> 116 <Unit filename="md5sum.h" />
88 <Option compilerVar="CPP" /> 117 <Unit filename="rblogo.xpm" />
89 <Option compile="0" />
90 <Option link="0" />
91 <Option target="default" />
92 </Unit>
93 <Unit filename="rblogo.xpm">
94 <Option compilerVar="CPP" />
95 <Option compile="0" />
96 <Option link="0" />
97 <Option target="default" />
98 </Unit>
99 <Unit filename="rbutil-rc.rc"> 118 <Unit filename="rbutil-rc.rc">
100 <Option compilerVar="WINDRES" /> 119 <Option compilerVar="WINDRES" />
101 <Option objectName="rbutil-rc.res" />
102 <Option target="default" />
103 </Unit>
104 <Unit filename="rbutil.cpp">
105 <Option compilerVar="CPP" />
106 <Option target="default" />
107 </Unit>
108 <Unit filename="rbutil.h">
109 <Option compilerVar="CPP" />
110 <Option compile="0" />
111 <Option link="0" />
112 <Option target="default" />
113 </Unit>
114 <Unit filename="rbutil.ini">
115 <Option compilerVar="CPP" />
116 <Option compile="0" />
117 <Option link="0" />
118 <Option target="default" />
119 </Unit>
120 <Unit filename="rbutil.iss">
121 <Option compilerVar="CPP" />
122 <Option compile="0" />
123 <Option link="0" />
124 <Option target="default" />
125 </Unit>
126 <Unit filename="rbutilApp.cpp">
127 <Option compilerVar="CPP" />
128 <Option target="default" />
129 </Unit>
130 <Unit filename="rbutilApp.h">
131 <Option compilerVar="CPP" />
132 <Option compile="0" />
133 <Option link="0" />
134 <Option target="default" />
135 </Unit>
136 <Unit filename="rbutilFrm.cpp">
137 <Option compilerVar="CPP" />
138 <Option target="default" />
139 </Unit>
140 <Unit filename="rbutilFrm.h">
141 <Option compilerVar="CPP" />
142 <Option compile="0" />
143 <Option link="0" />
144 <Option target="default" />
145 </Unit>
146 <Unit filename="rbutilFrm_XPM.xpm">
147 <Option compilerVar="CPP" />
148 <Option compile="0" />
149 <Option link="0" />
150 <Option target="default" />
151 </Unit>
152 <Unit filename="tools2_3d.xpm">
153 <Option compilerVar="CPP" />
154 <Option compile="0" />
155 <Option link="0" />
156 <Option target="default" />
157 </Unit>
158 <Unit filename="uninstall_3d.xpm">
159 <Option compilerVar="CPP" />
160 <Option compile="0" />
161 <Option link="0" />
162 <Option target="default" />
163 </Unit>
164 <Unit filename="wizard.xpm">
165 <Option compilerVar="CPP" />
166 <Option compile="0" />
167 <Option link="0" />
168 <Option target="default" />
169 </Unit>
170 <Unit filename="wizard_pages.cpp">
171 <Option compilerVar="CPP" />
172 <Option target="default" />
173 </Unit>
174 <Unit filename="wizard_pages.h">
175 <Option compilerVar="CPP" />
176 <Option compile="0" />
177 <Option link="0" />
178 <Option target="default" />
179 </Unit>
180 <Unit filename="wx_pch.h">
181 <Option compilerVar="CPP" />
182 <Option compile="0" />
183 <Option link="0" />
184 <Option target="default" />
185 </Unit> 120 </Unit>
186 <Extensions /> 121 <Unit filename="rbutil.cpp" />
122 <Unit filename="rbutil.h" />
123 <Unit filename="rbutil.ini" />
124 <Unit filename="rbutil.iss" />
125 <Unit filename="rbutilApp.cpp" />
126 <Unit filename="rbutilApp.h" />
127 <Unit filename="rbutilFrm.cpp" />
128 <Unit filename="rbutilFrm.h" />
129 <Unit filename="rbutilFrm_XPM.xpm" />
130 <Unit filename="tools2_3d.xpm" />
131 <Unit filename="uninstall_3d.xpm" />
132 <Unit filename="wizard.xpm" />
133 <Unit filename="wizard_pages.cpp" />
134 <Unit filename="wizard_pages.h" />
135 <Unit filename="wx_pch.h" />
136 <Extensions>
137 <code_completion />
138 </Extensions>
187 </Project> 139 </Project>
188</CodeBlocks_project_file> \ No newline at end of file 140</CodeBlocks_project_file>
diff --git a/rbutil/rbutil.cpp b/rbutil/rbutil.cpp
index b7a1fa6a73..9ffe9a6c58 100644
--- a/rbutil/rbutil.cpp
+++ b/rbutil/rbutil.cpp
@@ -21,28 +21,29 @@
21#include "rbutil.h" 21#include "rbutil.h"
22#include "installlog.h" 22#include "installlog.h"
23 23
24
24// This class allows us to return directories as well as files to 25// This class allows us to return directories as well as files to
25// wxDir::Traverse 26// wxDir::Traverse
26class wxDirTraverserIncludeDirs : public wxDirTraverser 27class wxDirTraverserIncludeDirs : public wxDirTraverser
27 { 28{
28 public: 29public:
29 wxDirTraverserIncludeDirs(wxArrayString& files) : m_files(files) { } 30 wxDirTraverserIncludeDirs(wxArrayString& files) : m_files(files) { }
30 31
31 virtual wxDirTraverseResult OnFile(const wxString& filename) 32 virtual wxDirTraverseResult OnFile(const wxString& filename)
32 { 33 {
33 m_files.Add(filename); 34 m_files.Add(filename);
34 return wxDIR_CONTINUE; 35 return wxDIR_CONTINUE;
35 } 36 }
36 37
37 virtual wxDirTraverseResult OnDir(const wxString& dirname) 38 virtual wxDirTraverseResult OnDir(const wxString& dirname)
38 { 39 {
39 m_files.Add(dirname); 40 m_files.Add(dirname);
40 return wxDIR_CONTINUE; 41 return wxDIR_CONTINUE;
41 } 42 }
42 43
43 private: 44private:
44 wxArrayString& m_files; 45 wxArrayString& m_files;
45 }; 46};
46 47
47wxDEFINE_SCOPED_PTR_TYPE(wxZipEntry); 48wxDEFINE_SCOPED_PTR_TYPE(wxZipEntry);
48 49
@@ -272,18 +273,15 @@ int UnzipFile(wxString src, wxString destdir, bool isInstall)
272 in_str.Printf(wxT("%s" PATH_SEP "%s"), destdir.c_str(), name.c_str()); 273 in_str.Printf(wxT("%s" PATH_SEP "%s"), destdir.c_str(), name.c_str());
273 274
274 if (entry->IsDir() ) { 275 if (entry->IsDir() ) {
275 wxDir* dirname = new wxDir(in_str); 276 if (!wxDirExists(in_str) ) {
276 if (! dirname->Exists(in_str) ) {
277 if (! wxMkdir(in_str, 0777) ) { 277 if (! wxMkdir(in_str, 0777) ) {
278 buf.Printf(_("Unable to create directory %s"), 278 buf.Printf(_("Unable to create directory %s"),
279 in_str.c_str() ); 279 in_str.c_str() );
280 errnum = 100; 280 errnum = 100;
281 delete dirname;
282 break; 281 break;
283 } 282 }
284 } 283 }
285 log->WriteFile(name, true); // Directory 284 log->WriteFile(name, true); // Directory
286 delete dirname;
287 continue; 285 continue;
288 } 286 }
289 287
diff --git a/rbutil/rbutil.h b/rbutil/rbutil.h
index c1816d5d0b..b499f44e18 100644
--- a/rbutil/rbutil.h
+++ b/rbutil/rbutil.h
@@ -85,6 +85,11 @@ public:
85 wxArrayString plat_id; 85 wxArrayString plat_id;
86 wxArrayString plat_name; 86 wxArrayString plat_name;
87 wxArrayInt plat_released; 87 wxArrayInt plat_released;
88 wxArrayInt plat_needsbootloader;
89 wxArrayString plat_bootloadermethod;
90 wxArrayString plat_bootloadername;
91 wxArrayInt plat_autodetect;
92 wxArrayString plat_combinedname;
88 wxString download_url; 93 wxString download_url;
89 wxString daily_url; 94 wxString daily_url;
90 wxString bleeding_url; 95 wxString bleeding_url;
@@ -92,6 +97,7 @@ public:
92 wxString font_url; 97 wxString font_url;
93 wxString last_release; 98 wxString last_release;
94 wxString prog_name; 99 wxString prog_name;
100 wxString bootloader_url;
95 101
96 // User configuration data. 102 // User configuration data.
97 wxString curplat; 103 wxString curplat;
@@ -101,6 +107,9 @@ public:
101 bool curisfull; 107 bool curisfull;
102 bool nocache; 108 bool nocache;
103 bool portable; 109 bool portable;
110 wxString curbootloadermethod;
111 wxString curbootloader;
112 wxString curfirmware;
104 113
105 // Global system variables 114 // Global system variables
106 wxFFile* logfile; 115 wxFFile* logfile;
@@ -120,6 +129,7 @@ bool InstallRbutil(wxString dest);
120wxString stream_err_str(int errnum); 129wxString stream_err_str(int errnum);
121bool rm_rf(wxString file); 130bool rm_rf(wxString file);
122 131
132
123#define ERR_DIALOG(msg, title) \ 133#define ERR_DIALOG(msg, title) \
124 wxLogError("%s: %s", ((wxString) title).c_str(), ((wxString) msg).c_str()) 134 wxLogError("%s: %s", ((wxString) title).c_str(), ((wxString) msg).c_str())
125 135
@@ -136,4 +146,7 @@ bool rm_rf(wxString file);
136#define BUILD_DAILY 1 146#define BUILD_DAILY 1
137#define BUILD_BLEEDING 2 147#define BUILD_BLEEDING 2
138 148
149#define BOOTLOADER_ADD 0
150#define BOOTLOADER_REM 1
151
139#endif 152#endif
diff --git a/rbutil/rbutil.ini b/rbutil/rbutil.ini
index f8d42d6c8b..56f5baf3ac 100644
--- a/rbutil/rbutil.ini
+++ b/rbutil/rbutil.ini
@@ -1,11 +1,12 @@
1[general] 1[general]
2download_url=http://www.rockbox.org/download/ 2download_url=http://www.rockbox.org/download/
3daily_url=http://www.rockbox.org/daily/ 3daily_url=http://download.rockbox.org/daily/
4bleeding_url=http://www.rockbox.org/dist/build- 4bleeding_url=http://build.rockbox.org/dist/build-
5server_conf_url=http://www.rockbox.org/daily/build-info 5server_conf_url=http://www.rockbox.org/daily/build-info
6font_url=http://www.rockbox.org/daily/fonts/rockbox-fonts- 6font_url=http://www.rockbox.org/daily/fonts/rockbox-fonts-
7last_release=2.5 7last_release=2.5
8prog_name=rockbox 8prog_name=rockbox
9bootloader_url=http://download.rockbox.org/bootloader
9 10
10[platforms] 11[platforms]
11platform1=player 12platform1=player
@@ -19,96 +20,255 @@ platform8=ondiofm
19platform9=h100 20platform9=h100
20platform10=h120 21platform10=h120
21platform11=h300 22platform11=h300
22platform12=h10_5gb 23platform12=h10_5gbums
23platform13=h10 24platform13=h10_5gbmtp
24platform14=ipod3g 25platform14=h10
25platform15=ipod4gray 26platform15=ipod3g
26platform16=ipodcolor 27platform16=ipod4gray
27platform17=ipodvideo 28platform17=ipodcolor
28platform18=ipodmini1g 29platform18=ipodvideo
29platform19=ipodmini2g 30platform19=ipodmini1g
30platform20=ipodnano 31platform20=ipodmini2g
31platform21=iaudiox5 32platform21=ipodnano
33platform22=iaudiox5
34platform23=iaudiox5v
35platform24=gigabeatf
32 36
33[player] 37[player]
34name=Archos Jukebox Player 6000, Jukebox Studio 5/10/20 38name=Archos Jukebox Player 6000, Jukebox Studio 5/10/20
39platform=player
35released=yes 40released=yes
41needsbootloader=no
42bootloadermethod=
43bootloadername=
44autodetect=no
45combinedname=
36 46
37[recorder] 47[recorder]
38name=Archos Jukebox Recorder 10, 20 48name=Archos Jukebox Recorder 10, 20
49platform=recorder
39released=yes 50released=yes
51needsbootloader=no
52bootloadermethod=
53bootloadername=
54autodetect=no
55combinedname=
40 56
41[recorder8mb] 57[recorder8mb]
42name=Archos Jukebox Recorder 10, 20 (with 8mb memory) 58name=Archos Jukebox Recorder 10, 20 (with 8mb memory)
59platform=recorder8mb
43released=no 60released=no
61needsbootloader=no
62bootloadermethod=
63bootloadername=
64autodetect=no
65combinedname=
44 66
45[recorderv2] 67[recorderv2]
46name=Archos Jukebox Recorder v2 (20GB) 68name=Archos Jukebox Recorder v2 (20GB)
69platform=recorderv2
47released=yes 70released=yes
71needsbootloader=no
72bootloadermethod=
73bootloadername=
74autodetect=no
75combinedname=
48 76
49[fmrecorder] 77[fmrecorder]
50name=Archos Jukebox Recorder FM 78name=Archos Jukebox Recorder FM
79platform=fmrecorder
51released=yes 80released=yes
81needsbootloader=no
82bootloadermethod=
83bootloadername=
84autodetect=no
85combinedname=
52 86
53[fmrecorder8mb] 87[fmrecorder8mb]
54name=Archos Jukebox Recorder FM (with 8mb memory) 88name=Archos Jukebox Recorder FM (with 8mb memory)
89platform=fmrecorder8mb
55released=no 90released=no
91needsbootloader=no
92bootloadermethod=
93bootloadername=
94autodetect=no
95combinedname=
56 96
57[ondiosp] 97[ondiosp]
58name=Archos Ondio SP 98name=Archos Ondio SP
99platform=ondiosp
59released=yes 100released=yes
101needsbootloader=no
102bootloadermethod=
103bootloadername=
104autodetect=no
105combinedname=
60 106
61[ondiofm] 107[ondiofm]
62name=Archos Ondio FM 108name=Archos Ondio FM
109platform=ondiofm
63released=yes 110released=yes
111needsbootloader=no
112bootloadermethod=
113bootloadername=
114autodetect=no
115combinedname=
64 116
65[h100] 117[h100]
66name=Iriver iHP100, iHP110 118name=Iriver iHP100, iHP110
119platform=h100
67released=no 120released=no
121needsbootloader=yes
122bootloadermethod=fwpatcher
123bootloadername=bootloader-h100.bin
124autodetect=no
125combinedname=
68 126
69[h120] 127[h120]
70name=Iriver iHP120, iHP140, H120, H140 128name=Iriver iHP120, iHP140, H120, H140
129platform=h120
71released=no 130released=no
131needsbootloader=yes
132bootloadermethod=fwpatcher
133bootloadername=bootloader-h120.bin
134autodetect=no
135combinedname=
72 136
73[h300] 137[h300]
74name=Iriver H320, H340 138name=Iriver H320, H340
139platform=h300
75released=no 140released=no
141needsbootloader=yes
142bootloadermethod=fwpatcher
143bootloadername=bootloader-h300.bin
144autodetect=no
145combinedname=
76 146
77[h10_5gb] 147[h10_5gbums]
78name=Iriver H10 (5GB) 148name=Iriver H10 (5GB) UMS
149platform=h10_5gb
79released=no 150released=no
151needsbootloader=yes
152bootloadermethod=h10
153bootloadername=H10.mi4
154autodetect=no
155combinedname=
156
157[h10_5gbmtp]
158name=Iriver H10 (5GB) MTP
159platform=h10_5gb
160released=no
161needsbootloader=yes
162bootloadermethod=h10
163bootloadername=H10_5GB-MTP/H10.mi4
164autodetect=no
165combinedname=
80 166
81[h10] 167[h10]
82name=Iriver H10 (20GB) 168name=Iriver H10 (20GB)
169platform=h10
170released=no
171needsbootloader=yes
172bootloadermethod=h10
173bootloadername=H10_20GC.mi4
174autodetect=no
175combinedname=
83 176
84[ipodcolor] 177[ipodcolor]
85name=Apple Ipod Colour/Photo/U2 (4th gen) 178name=Apple Ipod Colour/Photo/U2 (4th gen)
179platform=ipodcolor
86released=no 180released=no
181needsbootloader=yes
182bootloadermethod=ipodpatcher
183bootloadername=none
184autodetect=yes
185combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
87 186
88[ipodnano] 187[ipodnano]
89name=Apple Ipod Nano (1st gen) 188name=Apple Ipod Nano (1st gen)
189platform=ipodnano
90released=no 190released=no
191needsbootloader=yes
192bootloadermethod=ipodpatcher
193bootloadername=none
194autodetect=yes
195combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
91 196
92[ipod4gray] 197[ipod4gray]
93name=Apple Ipod (4th gen, greyscale) 198name=Apple Ipod (4th gen, greyscale)
199platform=ipod4gray
94released=no 200released=no
201needsbootloader=yes
202bootloadermethod=ipodpatcher
203bootloadername=none
204autodetect=yes
205combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
95 206
96[ipodvideo] 207[ipodvideo]
97name=Apple Ipod Video (5th gen) 208name=Apple Ipod Video (5th gen)
209platform=ipodvideo
98released=no 210released=no
211needsbootloader=yes
212bootloadermethod=ipodpatcher
213bootloadername=none
214autodetect=yes
215combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
99 216
100[ipod3g] 217[ipod3g]
101name=Apple Ipod (3rd gen) 218name=Apple Ipod (3rd gen)
219platform=ipod3g
102released=no 220released=no
221needsbootloader=yes
222bootloadermethod=ipodpatcher
223bootloadername=none
224autodetect=yes
225combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
103 226
104[ipodmini1g] 227[ipodmini1g]
105name=Apple Ipod Mini (1st gen) 228name=Apple Ipod Mini (1st gen)
229platform=ipodmini1g
106released=no 230released=no
231needsbootloader=yes
232bootloadermethod=ipodpatcher
233bootloadername=none
234autodetect=yes
235combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
107 236
108[ipodmini2g] 237[ipodmini2g]
109name=Apple Ipod Mini (2nd gen) 238name=Apple Ipod Mini (2nd gen)
239platform=ipodmini2g
110released=no 240released=no
241needsbootloader=yes
242bootloadermethod=ipodpatcher
243bootloadername=none
244autodetect=yes
245combinedname=Ipod mini 1g, mini 2g, 3g, 4g, color, video, nano 1g
111 246
112[iaudiox5] 247[iaudiox5]
113name=Cowan iAudio X5 248name=Cowan iAudio X5 , X5L
249platform=iaudiox5
114released=no 250released=no
251needsbootloader=yes
252bootloadermethod=iaudio
253bootloadername=x5_fw.bin
254autodetect=no
255combinedname=
256
257[iaudiox5v]
258name=Cowan iAudio X5V
259platform=iaudiox5
260released=no
261needsbootloader=yes
262bootloadermethod=iaudio
263bootloadername=x5v_fw.bin
264autodetect=no
265combinedname=
266
267[gigabeatf]
268name=Toshiba Gigabeat F , X
269platform=gigabeatf
270needsbootloader=yes
271bootloadermethod=gigabeatf
272bootloadername=FWIMG01.DAT
273autodetect=no
274combinedname=
diff --git a/rbutil/rbutil.r b/rbutil/rbutil.r
new file mode 100755
index 0000000000..e7c39a882c
--- /dev/null
+++ b/rbutil/rbutil.r
@@ -0,0 +1,2675 @@
1data 'vers' (2) {
2$"0100 2000 0000 0531 2E30 6430 0531 2E30"
3$"6430"} ;
4
5data 'vers' (1) {
6$"0100 2000 0000 0531 2E30 6430 0531 2E30"
7$"6430"} ;
8
9data 'ICN#' (-16455, "Item Icon") {
10 $"FFFF FFFF F700 001D BB00 002B D700 0057"
11 $"ED00 009D BB00 0539 DD00 1261 F700 A4E1"
12 $"FFFE 539F 8100 A52F 8102 AED7 8105 4BAB"
13 $"8103 BD12 810E 4A65 8105 2492 8102 F926"
14 $"810B 5FA9 8114 0B7E 8108 05AC 8100 0021"
15 $"8100 0027 8100 0021 8100 0021 8100 0021"
16 $"81FF FFE1 8100 0FE1 8122 0AE1 8108 2FA1"
17 $"8141 0DE1 8104 0B61 8100 9DA1 FFFF FFFF"
18 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
19 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
20 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
21 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
22 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
23 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
24 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
25 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
26};
27
28data 'icl4' (-16455, "Item Icon") {
29 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
30 $"F333 333F 0000 0000 0000 0000 0003 3E0F"
31 $"F333 333F 0000 0000 0000 0000 00A4 3AEF"
32 $"F333 333F 0000 0000 0000 0000 0DCA 3EEF"
33 $"F333 333F 0000 0000 0000 0000 E1C5 FE0F"
34 $"F333 333F 0000 0000 000C CDCB 1DEA E00F"
35 $"F333 333F 0000 0000 0CCC 1CB1 C3FD 000F"
36 $"F333 333F 0000 0000 D02C CB1D A9E0 000F"
37 $"FFFF FFFF FFFF FFFC C2C3 BCD3 EDDF FFFF"
38 $"F000 000F 0000 00CC 2DAB 02BF 2DDD 666F"
39 $"F000 000F 0000 0C1D BBB1 BEAB BDCB D66F"
40 $"F000 000F 0000 CCD4 E2CB BAEE B42C CD6F"
41 $"F000 000F 0000 C2BA BD2E FF3B DCC2 DCDD"
42 $"F000 000F 0000 D3BD D2CC 2DCD 02D0 DCEB"
43 $"F000 000F 0000 0EAC CDB2 CCCC 20D2 CDDB"
44 $"F000 000F 0000 CBBB 3AAE E2D2 CC2C C2DC"
45 $"F000 000F 0000 BC2E DD4A EEAE EBBB BBCD"
46 $"F000 000F 000C DEDD 00CD DAEA AAEF 35DC"
47 $"F000 000F 000B D000 0000 CCD4 DEBE EADC"
48 $"F000 000F 0000 0000 0000 0000 00F0 0BCD"
49 $"F000 000F 0000 0000 0000 0000 00F0 0FEE"
50 $"F000 000F 0000 0000 0000 0000 00F0 000F"
51 $"F000 000F 0000 0000 0000 0000 00F0 000F"
52 $"F000 000F 0000 0000 0000 0000 00F0 000F"
53 $"F000 000F FFFF FFFF FFFF FFFF FFF0 000F"
54 $"F000 000F 1111 1111 1111 F999 99F0 000F"
55 $"F000 000F 1111 1111 1111 F898 99F0 000F"
56 $"F000 000F 1111 1111 1111 F999 98F0 000F"
57 $"F000 000F 1111 1111 1111 F989 99F0 000F"
58 $"F000 000F 1111 1111 1111 F899 89F0 000F"
59 $"F000 000F 1111 1111 1111 F989 98F0 000F"
60 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
61};
62
63data 'icl8' (-16455, "Item Icon") {
64 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
65 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
66 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
67 $"0000 0000 0000 0000 0000 00DB 22FC 00FF"
68 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
69 $"0000 0000 0000 0000 0000 DB21 6BDB FCFF"
70 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
71 $"0000 0000 0000 0000 0081 2BDA 6BB2 FCFF"
72 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
73 $"0000 0000 0000 0000 FB03 5581 FDFB 00FF"
74 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
75 $"0000 0007 2C32 325E 0358 88DE FC00 00FF"
76 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
77 $"002B 0832 0832 5803 3988 ADFB 0000 00FF"
78 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
79 $"3208 3208 5658 0934 88AD FC00 0000 00FF"
80 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FF32"
81 $"0833 3964 5809 3388 AD32 FBFF FFFF FFFF"
82 $"FF00 0000 0000 00FF 0000 0000 0000 3208"
83 $"3339 8858 0934 82DF 3933 3281 D2D2 D2FF"
84 $"FF00 0000 0000 00FF 0000 0000 002C 0833"
85 $"6488 5E09 3388 B35E 6433 3233 81D2 D2FF"
86 $"FF00 0000 0000 00FF 0000 0000 F608 395D"
87 $"8858 0934 82E0 8888 5E39 332C 3281 D2FF"
88 $"FF00 0000 0000 00FF 0000 0000 F739 5E8E"
89 $"820F 5788 FFFD 645E 3357 0E32 3332 81F9"
90 $"FF00 0000 0000 00FF 0000 0000 3965 8833"
91 $"3933 3332 3357 320E 2C0E 322C 0E2D 815D"
92 $"FF00 0000 0000 00FF 0000 0000 F5FC 8808"
93 $"325D 5D34 320E 082C 0E2C 3233 3232 FA58"
94 $"FF00 0000 0000 00FF 0000 0000 2B58 3464"
95 $"88DE 8988 885E 5D33 3232 3332 335E F954"
96 $"FF00 0000 0000 00FF 0000 0000 5D33 5D82"
97 $"FA5D 8789 8EAC 89AC 885E 645E 5D64 5654"
98 $"FF00 0000 0000 00FF 0000 002C 8187 5756"
99 $"0000 F632 8189 B2DE 89B2 88AC 8888 F9F8"
100 $"FF00 0000 0000 00FF 0000 0081 562B 0000"
101 $"0000 0000 F6F7 325D 815E FB88 88FC 5656"
102 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
103 $"0000 0000 0000 0000 0000 FF00 005D 57F8"
104 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
105 $"0000 0000 0000 0000 0000 FF00 00FD AB88"
106 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
107 $"0000 0000 0000 0000 0000 FF00 0000 00FF"
108 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
109 $"0000 0000 0000 0000 0000 FF00 0000 00FF"
110 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
111 $"0000 0000 0000 0000 0000 FF00 0000 00FF"
112 $"FF00 0000 0000 00FF FFFF FFFF FFFF FFFF"
113 $"FFFF FFFF FFFF FFFF FFFF FF00 0000 00FF"
114 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
115 $"0505 0505 FFE6 E6E6 E6E6 FF00 0000 00FF"
116 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
117 $"0505 0505 FFE5 E6E5 E6E6 FF00 0000 00FF"
118 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
119 $"0505 0505 FFE6 E6E6 E6E5 FF00 0000 00FF"
120 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
121 $"0505 0505 FFE6 E5E6 E6E6 FF00 0000 00FF"
122 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
123 $"0505 0505 FFE6 E6E6 E5E6 FF00 0000 00FF"
124 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
125 $"0505 0505 FFE5 E6E6 E6E6 FF00 0000 00FF"
126 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
127 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
128};
129
130data 'icm#' (-16455, "Item Icon") {
131 $"F24B D007 B028 5557 81B1 124A 8236 1005"
132 $"8000 1ABD 8030 557D FFFF FFFF FFFF FFFF"
133 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
134};
135
136data 'icm4' (-16455, "Item Icon") {
137 $"A33F CDCC DCCD CAAE A333 0000 0000 CDEE"
138 $"333A 0000 CCCB 2E0D EDCE CDCD DB2B DB6F"
139 $"D00D 00C2 BBEA BCD5 D00D 00BD 2D2D CC2D"
140 $"D00D 0CDC CCDB BADC D00D 0000 0000 0DCE"
141 $"D00D 0000 0000 0D0D D00D B1BB 1BF9 FD0D"
142 $"D00D 1111 1199 8D0D ECDB BB1B B1F9 FECE"
143};
144
145data 'icm8' (-16455, "Item Icon") {
146 $"DDDA DADD F8F8 F8F8 F8F8 F8F8 F864 8EAC"
147 $"DB23 23DC 0000 0000 0000 0000 F85C 89FB"
148 $"DC23 23DB 0000 0000 F608 3234 5E82 2AFA"
149 $"FBF8 F8FB F8F8 5633 335D 3488 575D EFF1"
150 $"F900 00FA 0000 2C63 5E34 FD64 5D2C 33AA"
151 $"FA00 00F9 0000 395E 5D5D 5733 0832 33F9"
152 $"F900 00FA 00F6 F92C 2B32 5D88 8888 88F8"
153 $"FA00 00F9 0000 0000 0000 0000 00FA F781"
154 $"F900 00FA 0000 0000 0000 0000 00F9 00F9"
155 $"FA00 00F9 3559 5335 5959 E9E7 E7FA 00FA"
156 $"F900 00FA 0505 0505 0505 E8E6 E6F9 00F9"
157 $"FBF8 F8FB 592F 5959 2F59 E9E7 E7FB F8FB"
158};
159
160data 'icns' (-16455, "Item Icon") {
161 $"6963 6E73 0000 9AB8 4943 4E23 0000 0108"
162 $"FFFF FFFF F700 001D BB00 002B D700 0057"
163 $"ED00 009D BB00 0539 DD00 1261 F700 A4E1"
164 $"FFFE 539F 8100 A52F 8102 AED7 8105 4BAB"
165 $"8103 BD12 810E 4A65 8105 2492 8102 F926"
166 $"810B 5FA9 8114 0B7E 8108 05AC 8100 0021"
167 $"8100 0027 8100 0021 8100 0021 8100 0021"
168 $"81FF FFE1 8100 0FE1 8122 0AE1 8108 2FA1"
169 $"8141 0DE1 8104 0B61 8100 9DA1 FFFF FFFF"
170 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
171 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
172 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
173 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
174 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
175 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
176 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
177 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
178 $"6963 6C34 0000 0208 FFFF FFFF FFFF FFFF"
179 $"FFFF FFFF FFFF FFFF F333 333F 0000 0000"
180 $"0000 0000 0003 3E0F F333 333F 0000 0000"
181 $"0000 0000 00A4 3AEF F333 333F 0000 0000"
182 $"0000 0000 0DCA 3EEF F333 333F 0000 0000"
183 $"0000 0000 E1C5 FE0F F333 333F 0000 0000"
184 $"000C CDCB 1DEA E00F F333 333F 0000 0000"
185 $"0CCC 1CB1 C3FD 000F F333 333F 0000 0000"
186 $"D02C CB1D A9E0 000F FFFF FFFF FFFF FFFC"
187 $"C2C3 BCD3 EDDF FFFF F000 000F 0000 00CC"
188 $"2DAB 02BF 2DDD 666F F000 000F 0000 0C1D"
189 $"BBB1 BEAB BDCB D66F F000 000F 0000 CCD4"
190 $"E2CB BAEE B42C CD6F F000 000F 0000 C2BA"
191 $"BD2E FF3B DCC2 DCDD F000 000F 0000 D3BD"
192 $"D2CC 2DCD 02D0 DCEB F000 000F 0000 0EAC"
193 $"CDB2 CCCC 20D2 CDDB F000 000F 0000 CBBB"
194 $"3AAE E2D2 CC2C C2DC F000 000F 0000 BC2E"
195 $"DD4A EEAE EBBB BBCD F000 000F 000C DEDD"
196 $"00CD DAEA AAEF 35DC F000 000F 000B D000"
197 $"0000 CCD4 DEBE EADC F000 000F 0000 0000"
198 $"0000 0000 00F0 0BCD F000 000F 0000 0000"
199 $"0000 0000 00F0 0FEE F000 000F 0000 0000"
200 $"0000 0000 00F0 000F F000 000F 0000 0000"
201 $"0000 0000 00F0 000F F000 000F 0000 0000"
202 $"0000 0000 00F0 000F F000 000F FFFF FFFF"
203 $"FFFF FFFF FFF0 000F F000 000F 1111 1111"
204 $"1111 F999 99F0 000F F000 000F 1111 1111"
205 $"1111 F898 99F0 000F F000 000F 1111 1111"
206 $"1111 F999 98F0 000F F000 000F 1111 1111"
207 $"1111 F989 99F0 000F F000 000F 1111 1111"
208 $"1111 F899 89F0 000F F000 000F 1111 1111"
209 $"1111 F989 98F0 000F FFFF FFFF FFFF FFFF"
210 $"FFFF FFFF FFFF FFFF 6963 6C38 0000 0408"
211 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
212 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
213 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
214 $"0000 0000 0000 0000 0000 00DB 22FC 00FF"
215 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
216 $"0000 0000 0000 0000 0000 DB21 6BDB FCFF"
217 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
218 $"0000 0000 0000 0000 0081 2BDA 6BB2 FCFF"
219 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
220 $"0000 0000 0000 0000 FB03 5581 FDFB 00FF"
221 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
222 $"0000 0007 2C32 325E 0358 88DE FC00 00FF"
223 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
224 $"002B 0832 0832 5803 3988 ADFB 0000 00FF"
225 $"FF23 2323 2323 23FF 0000 0000 0000 0000"
226 $"3208 3208 5658 0934 88AD FC00 0000 00FF"
227 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FF32"
228 $"0833 3964 5809 3388 AD32 FBFF FFFF FFFF"
229 $"FF00 0000 0000 00FF 0000 0000 0000 3208"
230 $"3339 8858 0934 82DF 3933 3281 D2D2 D2FF"
231 $"FF00 0000 0000 00FF 0000 0000 002C 0833"
232 $"6488 5E09 3388 B35E 6433 3233 81D2 D2FF"
233 $"FF00 0000 0000 00FF 0000 0000 F608 395D"
234 $"8858 0934 82E0 8888 5E39 332C 3281 D2FF"
235 $"FF00 0000 0000 00FF 0000 0000 F739 5E8E"
236 $"820F 5788 FFFD 645E 3357 0E32 3332 81F9"
237 $"FF00 0000 0000 00FF 0000 0000 3965 8833"
238 $"3933 3332 3357 320E 2C0E 322C 0E2D 815D"
239 $"FF00 0000 0000 00FF 0000 0000 F5FC 8808"
240 $"325D 5D34 320E 082C 0E2C 3233 3232 FA58"
241 $"FF00 0000 0000 00FF 0000 0000 2B58 3464"
242 $"88DE 8988 885E 5D33 3232 3332 335E F954"
243 $"FF00 0000 0000 00FF 0000 0000 5D33 5D82"
244 $"FA5D 8789 8EAC 89AC 885E 645E 5D64 5654"
245 $"FF00 0000 0000 00FF 0000 002C 8187 5756"
246 $"0000 F632 8189 B2DE 89B2 88AC 8888 F9F8"
247 $"FF00 0000 0000 00FF 0000 0081 562B 0000"
248 $"0000 0000 F6F7 325D 815E FB88 88FC 5656"
249 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
250 $"0000 0000 0000 0000 0000 FF00 005D 57F8"
251 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
252 $"0000 0000 0000 0000 0000 FF00 00FD AB88"
253 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
254 $"0000 0000 0000 0000 0000 FF00 0000 00FF"
255 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
256 $"0000 0000 0000 0000 0000 FF00 0000 00FF"
257 $"FF00 0000 0000 00FF 0000 0000 0000 0000"
258 $"0000 0000 0000 0000 0000 FF00 0000 00FF"
259 $"FF00 0000 0000 00FF FFFF FFFF FFFF FFFF"
260 $"FFFF FFFF FFFF FFFF FFFF FF00 0000 00FF"
261 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
262 $"0505 0505 FFE6 E6E6 E6E6 FF00 0000 00FF"
263 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
264 $"0505 0505 FFE5 E6E5 E6E6 FF00 0000 00FF"
265 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
266 $"0505 0505 FFE6 E6E6 E6E5 FF00 0000 00FF"
267 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
268 $"0505 0505 FFE6 E5E6 E6E6 FF00 0000 00FF"
269 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
270 $"0505 0505 FFE6 E6E6 E5E6 FF00 0000 00FF"
271 $"FF00 0000 0000 00FF 0505 0505 0505 0505"
272 $"0505 0505 FFE5 E6E6 E6E6 FF00 0000 00FF"
273 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
274 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
275 $"696C 3332 0000 0670 9E00 83FF 0000 90FF"
276 $"058E EA44 FF00 0083 FF00 008F FF06 8FEA"
277 $"AB8E 4400 0083 FF00 008E FF07 5ABE AB8E"
278 $"4544 0000 83FF 0000 8DFF 0864 FE91 6945"
279 $"44FF 0000 83FF 0000 88FF 0DE2 E1CB B8A1"
280 $"FEB1 6245 44FF FF00 0083 FF00 0086 FF0A"
281 $"E2E6 E9EF B89F FEC1 6245 4480 FF01 0000"
282 $"83FF 0000 85FF 0AD9 E4E9 EBB8 9FFE C362"
283 $"4544 81FF 8D00 0BD7 E3DE BA8F A2FE C662"
284 $"45D0 6183 0083 FF00 0083 FF0D DAE5 D4B3"
285 $"679A FEC8 6245 A5C9 D361 8200 83FF 0000"
286 $"82FF 0FDC E2D4 A469 9EF2 C962 4579 9BC2"
287 $"D2D0 6181 0083 FF00 0081 FF11 E8DD D2B3"
288 $"6AA0 F3C7 5C1B 5D89 9CB5 CDD5 D361 8000"
289 $"83FF 0000 81FF 14DF C29C 657A DEB3 6A0D"
290 $"2082 ADBD C3D1 D5D7 D069 8800 83FF 0000"
291 $"81FF 14AE 8170 B9C5 C1CE C7B2 AFDA E7EA"
292 $"E1D9 D8D9 D469 8600 83FF 0000 81FF 14EE"
293 $"5C75 EBD4 9FB3 C4DE E7EC EBE3 E4DD D6CE"
294 $"C672 9C00 83FF 0000 81FF 14C6 A2C7 886F"
295 $"4D61 6F7F 9094 C1DB CCC1 C0B7 AB82 A200"
296 $"83FF 0000 81FF 1499 BFAE 5C8A 856D 504E"
297 $"5A5B 556C 8F8B 8C95 888F A400 83FF 0000"
298 $"80FF 15CA 667C 8C9F FFFF DCB5 8251 4A43"
299 $"3F4B 535E 6860 8FA6 0083 FF00 0080 FF02"
300 $"669F C283 FF0C DCC3 A88D 847B 686D 5A5E"
301 $"8FAF 0083 FF00 008F FF06 00FF FF81 8FB5"
302 $"0083 FF00 008F FF06 00FF FF22 4444 0083"
303 $"FF00 008F FF00 0081 FF01 0000 83FF 0000"
304 $"8FFF 0000 81FF 0100 0083 FF00 008F FF00"
305 $"0081 FF01 0000 83FF 9100 81FF 0100 0083"
306 $"FF00 0089 FF84 0081 FF01 0000 83FF 0000"
307 $"89FF 8400 81FF 0100 0083 FF00 0089 FF84"
308 $"0081 FF01 0000 83FF 0000 89FF 8400 81FF"
309 $"0100 0083 FF00 0089 FF84 0081 FF01 0000"
310 $"83FF 0000 89FF 8400 81FF 9E00 A500 90FF"
311 $"0301 0044 FF86 008F FF04 0900 0001 4486"
312 $"008E FF05 67BC 0001 1944 8600 8DFF 0666"
313 $"E49D 7119 44FF 8600 88FF 0BC9 BEA7 9B82"
314 $"E489 4419 44FF FF86 0086 FF0A CFB6 B9BB"
315 $"9B79 E493 4419 4480 FF86 0085 FF0A B2AC"
316 $"B6B5 9B7D E497 4419 4481 FF8D 000B AFAF"
317 $"A06E 5180 E49A 4419 9B62 8300 83FF 0000"
318 $"83FF 0DB2 B397 682E 76E4 9D44 1963 96A1"
319 $"6282 0083 FF00 0082 FF0F BEB0 9953 307E"
320 $"CF9C 4619 3459 8BA6 9C62 8100 83FF 0000"
321 $"81FF 11E0 B191 672E 7ED0 9A44 0E2A 3C55"
322 $"7BA0 A8A2 6280 0083 FF00 0081 FF14 C576"
323 $"4B2D 51B5 864F 040E 3461 818A 9FA8 A7A1"
324 $"687C 0083 FF00 0081 FF14 722D 3A7D 8683"
325 $"9998 8C85 A0B3 B9AE A9AA AAA5 687E 0083"
326 $"FF00 0081 FF14 E844 38B3 A962 6F7D 9DB2"
327 $"BEBC B5B7 AFA5 9B95 7392 0083 FF00 0081"
328 $"FF14 C283 9A44 3D1E 2934 4455 5C8E AC9A"
329 $"8B89 7D75 829A 0083 FF00 0081 FF14 6E8B"
330 $"8044 746B 4522 222F 302E 425C 5558 6055"
331 $"8E9E 0083 FF00 0080 FF15 B466 5A81 9FFF"
332 $"FFD6 9F5B 231B 1310 202B 333C 378E A000"
333 $"83FF 0000 80FF 0266 9FC2 83FF 0CD6 B692"
334 $"6F66 5B47 4931 3B8E A600 83FF 0000 8FFF"
335 $"0600 FFFF 728E AB00 83FF 0000 8FFF 0600"
336 $"FFFF 2244 4400 83FF 0000 8FFF 0000 81FF"
337 $"0100 0083 FF00 008F FF00 0081 FF01 0000"
338 $"83FF 0000 8FFF 0000 81FF 0100 0083 FF91"
339 $"0081 FF01 0000 83FF 0000 89FF 0000 827B"
340 $"0000 81FF 0100 0083 FF00 0089 FF00 0082"
341 $"7B00 0081 FF01 0000 83FF 0000 89FF 0000"
342 $"827B 0000 81FF 0100 0083 FF00 0089 FF00"
343 $"0082 7B00 0081 FF01 0000 83FF 0000 89FF"
344 $"0000 827B 0000 81FF 0100 0083 FF00 0089"
345 $"FF00 0082 7B00 0081 FF9E 00A5 0090 FF03"
346 $"0F43 44FF 8600 8FFF 0417 4316 0F44 8600"
347 $"8EFF 0565 C416 0F1A 4486 008D FF06 5567"
348 $"A76C 1A44 FF86 0088 FF0B BCA9 9293 3E67"
349 $"4D23 1A44 FFFF 8600 86FF 0AC6 9A98 9893"
350 $"3167 4A23 1A44 80FF 8600 85FF 0A9C 8E99"
351 $"9593 3767 4F23 1A44 81FF 8D00 0B92 8F86"
352 $"5747 3967 5223 1A7A 6183 0083 FF00 0083"
353 $"FF0D 9591 7C51 2A32 6753 231A 4B78 8361"
354 $"80FF 0100 0083 FF00 0082 FF13 A98B 7D41"
355 $"2C37 6353 241A 2C44 6D8A 8061 FFFF 0000"
356 $"83FF 0000 81FF 14DA 9278 5427 3761 5122"
357 $"1124 323F 6084 8D86 61FF 0000 83FF 0000"
358 $"81FF 14B7 5B3C 2730 5956 2A0A 0C2C 4F65"
359 $"6C85 8D89 8869 8800 83FF 0000 81FF 1461"
360 $"202F 6A76 7683 8378 748C 9A9D 918E 8E8C"
361 $"8869 5500 83FF 0000 81FF 14E7 2230 9694"
362 $"5354 5F80 95A2 9E9A 9D94 8881 7A73 4400"
363 $"83FF 0000 81FF 14C6 4651 3538 191F 2A36"
364 $"444A 7591 8173 7268 6081 FF00 83FF 0000"
365 $"81FF 0859 6A49 2277 683C 1A1D 8028 0838"
366 $"4D47 484F 478E FF00 83FF 0000 80FF 15A8"
367 $"654A 7F9F FFFF D39A 551C 140E 0B1B 262B"
368 $"3330 8E9A 0083 FF00 0080 FF02 659F C283"
369 $"FF0C D3B2 8E69 5F56 4243 2B35 8E9F 0083"
370 $"FF00 008F FF06 00FF FF6B 8EA7 0083 FF00"
371 $"008F FF06 00FF FF22 4444 0083 FF00 008F"
372 $"FF00 0081 FF01 0000 83FF 0000 8FFF 0000"
373 $"81FF 0100 0083 FF00 008F FF00 0081 FF01"
374 $"0000 83FF 9100 81FF 0100 0083 FF91 0081"
375 $"FF01 0000 83FF 9100 81FF 0100 0083 FF91"
376 $"0081 FF01 0000 83FF 9100 81FF 0100 0083"
377 $"FF91 0081 FF01 0000 83FF 9100 81FF 9E00"
378 $"6C38 6D6B 0000 0408 FFFF FFFF FFFF FFFF"
379 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
380 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
381 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
382 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
383 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
384 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
385 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
386 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
387 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
388 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
389 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
390 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
391 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
392 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
393 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
394 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
395 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
396 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
397 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
398 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
399 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
400 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
401 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
402 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
403 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
404 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
405 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
406 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
407 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
408 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
409 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
410 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
411 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
412 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
413 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
414 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
415 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
416 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
417 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
418 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
419 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
420 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
421 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
422 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
423 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
424 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
425 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
426 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
427 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
428 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
429 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
430 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
431 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
432 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
433 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
434 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
435 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
436 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
437 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
438 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
439 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
440 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
441 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
442 $"FFFF FFFF FFFF FFFF 6963 6823 0000 0248"
443 $"FFFF FFFF FFFF FFFF FFFF FFFF F770 0000"
444 $"0001 EEB0 0000 0001 F5D0 0000 0001 EF70"
445 $"0000 0001 DBB0 0000 0001 F570 0000 0001"
446 $"FED0 0000 0001 D5B0 0000 0001 EF70 0000"
447 $"0001 FAD0 0000 0001 FFFF FFFF FFFF FFFF"
448 $"FFFF FFFF C010 0000 01FF C010 0000 01FF"
449 $"C010 0000 01EF C010 0000 01FF C010 0000"
450 $"01FB C010 0000 01DF C010 0000 01FF C010"
451 $"0000 01FF C010 0000 01FF C010 0000 0181"
452 $"C010 0000 0181 C010 0000 0181 C010 0000"
453 $"0181 C010 0000 0181 C010 0000 0181 C010"
454 $"0000 0181 C010 0000 0181 C010 0000 0181"
455 $"C010 0000 0181 C010 0000 0181 C010 0000"
456 $"0181 C010 0000 0181 C01F FFFF FF81 C01F"
457 $"FFFF FF81 C010 0003 FF81 C011 1113 D581"
458 $"C010 4443 6F81 C012 000B BB81 C010 8883"
459 $"DD81 C014 2203 6B81 C011 004B BD81 C010"
460 $"1103 F781 C014 0423 5B81 FFFF FFFF FFFF"
461 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
462 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
463 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
464 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
465 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
466 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
467 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
468 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
469 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
470 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
471 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
472 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
473 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
474 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
475 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
476 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
477 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
478 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
479 $"6963 6834 0000 0488 FFFF FFFF FFFF FFFF"
480 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
481 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
482 $"FFFF FFFF FFFF FFFF FF33 3333 333F 0000"
483 $"0000 0000 0000 0000 0000 0000 0000 000F"
484 $"FF33 3333 333F 0000 0000 0000 0000 0000"
485 $"0000 0000 0000 000F FF33 3333 333F 0000"
486 $"0000 0000 0000 0000 0000 0000 0000 000F"
487 $"FF33 3333 333F 0000 0000 0000 0000 0000"
488 $"0000 0000 0000 000F FF33 3333 333F 0000"
489 $"0000 0000 0000 0000 0000 0000 0000 000F"
490 $"FF33 3333 333F 0000 0000 0000 0000 0000"
491 $"0000 0000 0000 000F FF33 3333 333F 0000"
492 $"0000 0000 0000 0000 0000 0000 0000 000F"
493 $"FF33 3333 333F 0000 0000 0000 0000 0000"
494 $"0000 0000 0000 000F FF33 3333 333F 0000"
495 $"0000 0000 0000 0000 0000 0000 0000 000F"
496 $"FF33 3333 333F 0000 0000 0000 0000 0000"
497 $"0000 0000 0000 000F FFFF FFFF FFFF FFFF"
498 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
499 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
500 $"FFFF FFFF FFFF FFFF FF00 0000 000F 0000"
501 $"0000 0000 0000 0000 0000 000F F666 666F"
502 $"FF00 0000 000F 0000 0000 0000 0000 0000"
503 $"0000 000F F666 666F FF00 0000 000F 0000"
504 $"0000 0000 0000 0000 0000 000F F666 666F"
505 $"FF00 0000 000F 0000 0000 0000 0000 0000"
506 $"0000 000F F666 666F FF00 0000 000F 0000"
507 $"0000 0000 0000 0000 0000 000F F666 666F"
508 $"FF00 0000 000F 0000 0000 0000 0000 0000"
509 $"0000 000F F666 666F FF00 0000 000F 0000"
510 $"0000 0000 0000 0000 0000 000F F666 666F"
511 $"FF00 0000 000F 0000 0000 0000 0000 0000"
512 $"0000 000F FFFF FFFF FF00 0000 000F 0000"
513 $"0000 0000 0000 0000 0000 000F FFFF FFFF"
514 $"FF00 0000 000F 0000 0000 0000 0000 0000"
515 $"0000 000F F000 000F FF00 0000 000F 0000"
516 $"0000 0000 0000 0000 0000 000F F000 000F"
517 $"FF00 0000 000F 0000 0000 0000 0000 0000"
518 $"0000 000F F000 000F FF00 0000 000F 0000"
519 $"0000 0000 0000 0000 0000 000F F000 000F"
520 $"FF00 0000 000F 0000 0000 0000 0000 0000"
521 $"0000 000F F000 000F FF00 0000 000F 0000"
522 $"0000 0000 0000 0000 0000 000F F000 000F"
523 $"FF00 0000 000F 0000 0000 0000 0000 0000"
524 $"0000 000F F000 000F FF00 0000 000F 0000"
525 $"0000 0000 0000 0000 0000 000F F000 000F"
526 $"FF00 0000 000F 0000 0000 0000 0000 0000"
527 $"0000 000F F000 000F FF00 0000 000F 0000"
528 $"0000 0000 0000 0000 0000 000F F000 000F"
529 $"FF00 0000 000F 0000 0000 0000 0000 0000"
530 $"0000 000F F000 000F FF00 0000 000F 0000"
531 $"0000 0000 0000 0000 0000 000F F000 000F"
532 $"FF00 0000 000F 0000 0000 0000 0000 0000"
533 $"0000 000F F000 000F FF00 0000 000F FFFF"
534 $"FFFF FFFF FFFF FFFF FFFF FFFF F000 000F"
535 $"FF00 0000 000F FFFF FFFF FFFF FFFF FFFF"
536 $"FFFF FFFF F000 000F FF00 0000 000F 1111"
537 $"1111 1111 1111 11FF 9999 999F F000 000F"
538 $"FF00 0000 000F 1111 1111 1111 1111 11FF"
539 $"9989 898F F000 000F FF00 0000 000F 1111"
540 $"1111 1111 1111 11FF 8998 999F F000 000F"
541 $"FF00 0000 000F 1111 1111 1111 1111 11FF"
542 $"9899 989F F000 000F FF00 0000 000F 1111"
543 $"1111 1111 1111 11FF 9989 998F F000 000F"
544 $"FF00 0000 000F 1111 1111 1111 1111 11FF"
545 $"8999 899F F000 000F FF00 0000 000F 1111"
546 $"1111 1111 1111 11FF 9899 989F F000 000F"
547 $"FF00 0000 000F 1111 1111 1111 1111 11FF"
548 $"9999 899F F000 000F FF00 0000 000F 1111"
549 $"1111 1111 1111 11FF 8989 989F F000 000F"
550 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
551 $"FFFF FFFF FFFF FFFF 6963 6838 0000 0908"
552 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
553 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
554 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
555 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
556 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
557 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
558 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
559 $"0000 0000 0000 0000 0000 0000 0000 0000"
560 $"0000 0000 0000 0000 0000 0000 0000 00FF"
561 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
562 $"0000 0000 0000 0000 0000 0000 0000 0000"
563 $"0000 0000 0000 0000 0000 0000 0000 00FF"
564 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
565 $"0000 0000 0000 0000 0000 0000 0000 0000"
566 $"0000 0000 0000 0000 0000 0000 0000 00FF"
567 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
568 $"0000 0000 0000 0000 0000 0000 0000 0000"
569 $"0000 0000 0000 0000 0000 0000 0000 00FF"
570 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
571 $"0000 0000 0000 0000 0000 0000 0000 0000"
572 $"0000 0000 0000 0000 0000 0000 0000 00FF"
573 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
574 $"0000 0000 0000 0000 0000 0000 0000 0000"
575 $"0000 0000 0000 0000 0000 0000 0000 00FF"
576 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
577 $"0000 0000 0000 0000 0000 0000 0000 0000"
578 $"0000 0000 0000 0000 0000 0000 0000 00FF"
579 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
580 $"0000 0000 0000 0000 0000 0000 0000 0000"
581 $"0000 0000 0000 0000 0000 0000 0000 00FF"
582 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
583 $"0000 0000 0000 0000 0000 0000 0000 0000"
584 $"0000 0000 0000 0000 0000 0000 0000 00FF"
585 $"FFFF 2323 2323 2323 2323 23FF 0000 0000"
586 $"0000 0000 0000 0000 0000 0000 0000 0000"
587 $"0000 0000 0000 0000 0000 0000 0000 00FF"
588 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
589 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
590 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
591 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
592 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
593 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
594 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
595 $"0000 0000 0000 0000 0000 0000 0000 0000"
596 $"0000 0000 0000 00FF FFD2 D2D2 D2D2 D2FF"
597 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
598 $"0000 0000 0000 0000 0000 0000 0000 0000"
599 $"0000 0000 0000 00FF FFD2 D2D2 D2D2 D2FF"
600 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
601 $"0000 0000 0000 0000 0000 0000 0000 0000"
602 $"0000 0000 0000 00FF FFD2 D2D2 D2D2 D2FF"
603 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
604 $"0000 0000 0000 0000 0000 0000 0000 0000"
605 $"0000 0000 0000 00FF FFD2 D2D2 D2D2 D2FF"
606 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
607 $"0000 0000 0000 0000 0000 0000 0000 0000"
608 $"0000 0000 0000 00FF FFD2 D2D2 D2D2 D2FF"
609 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
610 $"0000 0000 0000 0000 0000 0000 0000 0000"
611 $"0000 0000 0000 00FF FFD2 D2D2 D2D2 D2FF"
612 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
613 $"0000 0000 0000 0000 0000 0000 0000 0000"
614 $"0000 0000 0000 00FF FFD2 D2D2 D2D2 D2FF"
615 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
616 $"0000 0000 0000 0000 0000 0000 0000 0000"
617 $"0000 0000 0000 00FF FFFF FFFF FFFF FFFF"
618 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
619 $"0000 0000 0000 0000 0000 0000 0000 0000"
620 $"0000 0000 0000 00FF FFFF FFFF FFFF FFFF"
621 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
622 $"0000 0000 0000 0000 0000 0000 0000 0000"
623 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
624 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
625 $"0000 0000 0000 0000 0000 0000 0000 0000"
626 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
627 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
628 $"0000 0000 0000 0000 0000 0000 0000 0000"
629 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
630 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
631 $"0000 0000 0000 0000 0000 0000 0000 0000"
632 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
633 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
634 $"0000 0000 0000 0000 0000 0000 0000 0000"
635 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
636 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
637 $"0000 0000 0000 0000 0000 0000 0000 0000"
638 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
639 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
640 $"0000 0000 0000 0000 0000 0000 0000 0000"
641 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
642 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
643 $"0000 0000 0000 0000 0000 0000 0000 0000"
644 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
645 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
646 $"0000 0000 0000 0000 0000 0000 0000 0000"
647 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
648 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
649 $"0000 0000 0000 0000 0000 0000 0000 0000"
650 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
651 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
652 $"0000 0000 0000 0000 0000 0000 0000 0000"
653 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
654 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
655 $"0000 0000 0000 0000 0000 0000 0000 0000"
656 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
657 $"FFFF 0000 0000 0000 0000 00FF 0000 0000"
658 $"0000 0000 0000 0000 0000 0000 0000 0000"
659 $"0000 0000 0000 00FF FF00 0000 0000 00FF"
660 $"FFFF 0000 0000 0000 0000 00FF FFFF FFFF"
661 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
662 $"FFFF FFFF FFFF FFFF FF00 0000 0000 00FF"
663 $"FFFF 0000 0000 0000 0000 00FF FFFF FFFF"
664 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
665 $"FFFF FFFF FFFF FFFF FF00 0000 0000 00FF"
666 $"FFFF 0000 0000 0000 0000 00FF 0505 0505"
667 $"0505 0505 0505 0505 0505 0505 0505 FFFF"
668 $"E6E6 E6E6 E6E6 E6FF FF00 0000 0000 00FF"
669 $"FFFF 0000 0000 0000 0000 00FF 0505 0505"
670 $"0505 0505 0505 0505 0505 0505 0505 FFFF"
671 $"E6E6 E5E6 E5E6 E5FF FF00 0000 0000 00FF"
672 $"FFFF 0000 0000 0000 0000 00FF 0505 0505"
673 $"0505 0505 0505 0505 0505 0505 0505 FFFF"
674 $"E5E6 E6E6 E6E6 E6FF FF00 0000 0000 00FF"
675 $"FFFF 0000 0000 0000 0000 00FF 0505 0505"
676 $"0505 0505 0505 0505 0505 0505 0505 FFFF"
677 $"E6E6 E6E5 E6E5 E6FF FF00 0000 0000 00FF"
678 $"FFFF 0000 0000 0000 0000 00FF 0505 0505"
679 $"0505 0505 0505 0505 0505 0505 0505 FFFF"
680 $"E6E5 E6E6 E6E6 E5FF FF00 0000 0000 00FF"
681 $"FFFF 0000 0000 0000 0000 00FF 0505 0505"
682 $"0505 0505 0505 0505 0505 0505 0505 FFFF"
683 $"E6E6 E6E6 E5E6 E6FF FF00 0000 0000 00FF"
684 $"FFFF 0000 0000 0000 0000 00FF 0505 0505"
685 $"0505 0505 0505 0505 0505 0505 0505 FFFF"
686 $"E5E6 E6E6 E6E5 E6FF FF00 0000 0000 00FF"
687 $"FFFF 0000 0000 0000 0000 00FF 0505 0505"
688 $"0505 0505 0505 0505 0505 0505 0505 FFFF"
689 $"E6E6 E6E5 E6E6 E6FF FF00 0000 0000 00FF"
690 $"FFFF 0000 0000 0000 0000 00FF 0505 0505"
691 $"0505 0505 0505 0505 0505 0505 0505 FFFF"
692 $"E6E5 E6E6 E5E6 E6FF FF00 0000 0000 00FF"
693 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
694 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
695 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
696 $"6968 3332 0000 052A DF00 86FF 0000 A0FF"
697 $"8000 86FF 0000 A0FF 8000 86FF 0000 A0FF"
698 $"8000 86FF 0000 A0FF 8000 86FF 0000 A0FF"
699 $"8000 86FF 0000 A0FF 8000 86FF 0000 A0FF"
700 $"8000 86FF 0000 A0FF 8000 86FF 0000 A0FF"
701 $"8000 86FF 0000 A0FF E000 86FF 0000 98FF"
702 $"8800 86FF 0000 98FF 8800 86FF 0000 98FF"
703 $"8800 86FF 0000 98FF 8800 86FF 0000 98FF"
704 $"8800 86FF 0000 98FF 8800 86FF 0000 98FF"
705 $"8800 86FF 0000 98FF 8800 86FF 0000 98FF"
706 $"8800 86FF 0000 98FF 0100 0083 FF80 0086"
707 $"FF00 0098 FF01 0000 83FF 8000 86FF 0000"
708 $"98FF 0100 0083 FF80 0086 FF00 0098 FF01"
709 $"0000 83FF 8000 86FF 0000 98FF 0100 0083"
710 $"FF80 0086 FF00 0098 FF01 0000 83FF 8000"
711 $"86FF 0000 98FF 0100 0083 FF80 0086 FF00"
712 $"0098 FF01 0000 83FF 8000 86FF 0000 98FF"
713 $"0100 0083 FF80 0086 FF00 0098 FF01 0000"
714 $"83FF 8000 86FF 0000 98FF 0100 0083 FF80"
715 $"0086 FF00 0098 FF01 0000 83FF 8000 86FF"
716 $"0000 98FF 0100 0083 FF80 0086 FF9B 0083"
717 $"FF80 0086 FF9B 0083 FF80 0086 FF00 008F"
718 $"FF88 0083 FF80 0086 FF00 008F FF88 0083"
719 $"FF80 0086 FF00 008F FF88 0083 FF80 0086"
720 $"FF00 008F FF88 0083 FF80 0086 FF00 008F"
721 $"FF88 0083 FF80 0086 FF00 008F FF88 0083"
722 $"FF80 0086 FF00 008F FF88 0083 FF80 0086"
723 $"FF00 008F FF88 0083 FF80 0086 FF00 008F"
724 $"FF88 0083 FFAE 00E9 00A0 FF8A 00A0 FF8A"
725 $"00A0 FF8A 00A0 FF8A 00A0 FF8A 00A0 FF8A"
726 $"00A0 FF8A 00A0 FF8A 00A0 FF8A 00A0 FFE0"
727 $"0086 FF00 0098 FF88 0086 FF00 0098 FF88"
728 $"0086 FF00 0098 FF88 0086 FF00 0098 FF88"
729 $"0086 FF00 0098 FF88 0086 FF00 0098 FF88"
730 $"0086 FF00 0098 FF88 0086 FF00 0098 FF88"
731 $"0086 FF00 0098 FF88 0086 FF00 0098 FF01"
732 $"0000 83FF 8000 86FF 0000 98FF 0100 0083"
733 $"FF80 0086 FF00 0098 FF01 0000 83FF 8000"
734 $"86FF 0000 98FF 0100 0083 FF80 0086 FF00"
735 $"0098 FF01 0000 83FF 8000 86FF 0000 98FF"
736 $"0100 0083 FF80 0086 FF00 0098 FF01 0000"
737 $"83FF 8000 86FF 0000 98FF 0100 0083 FF80"
738 $"0086 FF00 0098 FF01 0000 83FF 8000 86FF"
739 $"0000 98FF 0100 0083 FF80 0086 FF00 0098"
740 $"FF01 0000 83FF 8000 86FF 0000 98FF 0100"
741 $"0083 FF80 0086 FF00 0098 FF01 0000 83FF"
742 $"8000 86FF 9B00 83FF 8000 86FF 9B00 83FF"
743 $"8000 86FF 0000 8FFF 0100 0084 7B01 0000"
744 $"83FF 8000 86FF 0000 8FFF 0100 0084 7B01"
745 $"0000 83FF 8000 86FF 0000 8FFF 0100 0084"
746 $"7B01 0000 83FF 8000 86FF 0000 8FFF 0100"
747 $"0084 7B01 0000 83FF 8000 86FF 0000 8FFF"
748 $"0100 0084 7B01 0000 83FF 8000 86FF 0000"
749 $"8FFF 0100 0084 7B01 0000 83FF 8000 86FF"
750 $"0000 8FFF 0100 0084 7B01 0000 83FF 8000"
751 $"86FF 0000 8FFF 0100 0084 7B01 0000 83FF"
752 $"8000 86FF 0000 8FFF 0100 0084 7B01 0000"
753 $"83FF AE00 E900 A0FF 8A00 A0FF 8A00 A0FF"
754 $"8A00 A0FF 8A00 A0FF 8A00 A0FF 8A00 A0FF"
755 $"8A00 A0FF 8A00 A0FF 8A00 A0FF E000 86FF"
756 $"0000 98FF 0100 0083 FF80 0086 FF00 0098"
757 $"FF01 0000 83FF 8000 86FF 0000 98FF 0100"
758 $"0083 FF80 0086 FF00 0098 FF01 0000 83FF"
759 $"8000 86FF 0000 98FF 0100 0083 FF80 0086"
760 $"FF00 0098 FF01 0000 83FF 8000 86FF 0000"
761 $"98FF 0100 0083 FF80 0086 FF00 0098 FF88"
762 $"0086 FF00 0098 FF88 0086 FF00 0098 FF01"
763 $"0000 83FF 8000 86FF 0000 98FF 0100 0083"
764 $"FF80 0086 FF00 0098 FF01 0000 83FF 8000"
765 $"86FF 0000 98FF 0100 0083 FF80 0086 FF00"
766 $"0098 FF01 0000 83FF 8000 86FF 0000 98FF"
767 $"0100 0083 FF80 0086 FF00 0098 FF01 0000"
768 $"83FF 8000 86FF 0000 98FF 0100 0083 FF80"
769 $"0086 FF00 0098 FF01 0000 83FF 8000 86FF"
770 $"0000 98FF 0100 0083 FF80 0086 FF00 0098"
771 $"FF01 0000 83FF 8000 86FF 0000 98FF 0100"
772 $"0083 FF80 0086 FF00 0098 FF01 0000 83FF"
773 $"8000 86FF 9B00 83FF 8000 86FF 9B00 83FF"
774 $"8000 86FF 9B00 83FF 8000 86FF 9B00 83FF"
775 $"8000 86FF 9B00 83FF 8000 86FF 9B00 83FF"
776 $"8000 86FF 9B00 83FF 8000 86FF 9B00 83FF"
777 $"8000 86FF 9B00 83FF 8000 86FF 9B00 83FF"
778 $"8000 86FF 9B00 83FF AE00 6838 6D6B 0000"
779 $"0908 FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
780 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
781 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
782 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
783 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
784 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
785 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
786 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
787 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
788 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
789 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
790 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
791 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
792 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
793 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
794 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
795 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
796 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
797 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
798 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
799 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
800 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
801 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
802 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
803 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
804 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
805 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
806 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
807 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
808 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
809 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
810 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
811 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
812 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
813 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
814 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
815 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
816 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
817 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
818 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
819 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
820 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
821 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
822 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
823 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
824 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
825 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
826 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
827 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
828 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
829 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
830 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
831 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
832 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
833 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
834 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
835 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
836 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
837 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
838 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
839 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
840 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
841 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
842 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
843 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
844 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
845 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
846 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
847 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
848 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
849 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
850 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
851 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
852 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
853 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
854 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
855 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
856 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
857 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
858 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
859 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
860 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
861 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
862 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
863 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
864 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
865 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
866 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
867 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
868 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
869 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
870 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
871 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
872 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
873 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
874 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
875 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
876 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
877 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
878 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
879 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
880 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
881 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
882 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
883 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
884 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
885 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
886 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
887 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
888 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
889 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
890 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
891 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
892 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
893 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
894 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
895 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
896 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
897 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
898 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
899 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
900 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
901 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
902 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
903 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
904 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
905 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
906 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
907 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
908 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
909 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
910 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
911 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
912 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
913 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
914 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
915 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
916 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
917 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
918 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
919 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
920 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
921 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
922 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
923 $"FFFF 6963 7323 0000 0048 F557 D001 700E"
924 $"E024 9A9B 0175 9299 0162 923E 0001 9004"
925 $"0000 9BBC 102C 8434 5AFD FFFF FFFF FFFF"
926 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
927 $"FFFF FFFF FFFF FFFF FFFF 6963 7334 0000"
928 $"0088 AA3F DDDD DDDD DDAE A333 0000 0000"
929 $"0C3E 333A 0000 000C DBEC A333 0000 0CBC"
930 $"2A00 EDDF DDDB D2CB ECFF D00D 00CD BBBA"
931 $"B2D6 D00D 00B2 DDBB DCCB D00D 00D4 D2D2"
932 $"CC2D D00D 00BD CCE5 3EEC D00D 0C00 0000"
933 $"CBCB D00D 0000 0000 0D0D D00D 0000 0000"
934 $"0D00 D00D ABAB ABAF 9F00 D00D 1111 11B8"
935 $"9900 D00D 1111 1189 9F00 EDDA 8291 ABAF"
936 $"9FDD 6963 7338 0000 0108 DEDC DBB3 F9FA"
937 $"F9FA F9FA F9FA F9FA 8FFB DC23 23DB 0000"
938 $"0000 0000 0000 0032 6A88 DB23 23DC 0000"
939 $"0000 0000 F52B 3357 882B DC23 23DB 0000"
940 $"0000 F608 3234 33AD F600 FCFA F9AC F9FA"
941 $"F95D 0E5D 3457 8833 F1F2 FA00 00F9 0000"
942 $"0733 825E 33AD 6432 33EF F900 00FA 0000"
943 $"5D5E 5D33 825D 3332 2C57 FA00 00F9 0000"
944 $"5739 5D64 5D33 3232 335C F900 00FA 00F5"
945 $"5D57 F732 828E 8988 88F9 FA00 00F9 00F6"
946 $"F600 0000 F5F6 4F5D F85D F900 00FA 0000"
947 $"0000 0000 0000 00FA 0056 FA00 00FA 0000"
948 $"0000 0000 0000 00F9 0000 F900 00F9 8359"
949 $"8359 8359 ADD1 E8EA 0000 FA00 00FA 0505"
950 $"0505 0505 5FE5 E6E8 0000 F900 00F9 0505"
951 $"0505 0505 7DE6 E6D1 0000 ACF9 FAFC 8359"
952 $"8359 8359 ADD1 E8E9 FAF9 6973 3332 0000"
953 $"026C 0340 8080 4087 8005 5E51 80FF FF80"
954 $"86FF 06AA B457 80FF FF80 83FF 09F1 E1C1"
955 $"A94E D180 FFFF 8081 FF0B ECE6 DFBE BA4D"
956 $"D1FF 4080 8040 8080 4FA6 DCAD B3BC 65B4"
957 $"1900 80FF FF80 FFFF E9CF 87A7 B848 8FC6"
958 $"B719 80FF FF80 FFFF B58B A0C9 7D8B CFD4"
959 $"D89E 80FF FF80 FFFF ADAC A280 A5BE DBD4"
960 $"C79A 80FF FF80 FFF2 8F8E C5B4 7655 516E"
961 $"7A82 80FF FF80 FFD9 D880 FF09 F7DB C479"
962 $"B280 80FF FF80 86FF 0680 FF9A 80FF FF80"
963 $"86FF 0580 FFFF 80FF FF84 8000 4080 0005"
964 $"FFFF 80FF FF80 83FF 0080 8000 05FF FF80"
965 $"FFFF 8083 FF00 8080 0005 FFFF 4080 8040"
966 $"8380 0040 8000 0180 8081 0087 8001 0151"
967 $"8100 86FF 028B 0129 8100 83FF 05E2 D0B3"
968 $"943A D181 0081 FF0B D9BA B19E 952F D1FF"
969 $"4080 8040 8080 4F85 A369 8B98 378E 1900"
970 $"80FF FF80 FFFF D491 417F 9326 4893 9219"
971 $"80FF FF80 FFFF 774C 6C96 5E5A 94A0 A986"
972 $"80FF FF80 FFFF 9D73 7346 6589 ABA3 9280"
973 $"80FF FF80 FFED 6F7A BAA2 5028 253F 4A6A"
974 $"80FF FF80 FFD9 D880 FF09 F5D2 B569 9E73"
975 $"80FF FF80 86FF 0680 FF9A 80FF FF80 86FF"
976 $"0580 FFFF 80FF FF84 8009 403E 3E1F FFFF"
977 $"80FF FF80 83FF 0980 7B7B 3EFF FF80 FFFF"
978 $"8083 FF09 807B 7B3E FFFF 4080 8040 8380"
979 $"0540 3E3E 1F80 8081 0087 8001 1551 8100"
980 $"86FF 0290 202D 8100 83FF 05D9 C97F 6039"
981 $"D181 0081 FF0B CEA2 9759 4927 D1FF 4080"
982 $"8040 8080 4F6F 8657 474C 2976 5980 80FF"
983 $"FF80 FFFF C676 343F 4B1D 3977 7ED8 80FF"
984 $"FF80 FFFF 6540 536B 4C4E 7B85 8D79 80FF"
985 $"FF80 FFFF 8654 6638 5072 908A 7974 80FF"
986 $"FF80 FFEA 5D63 BB9E 4A20 1F36 3E65 80FF"
987 $"FF80 FFD9 D880 FF09 F4D0 B266 9B6F 80FF"
988 $"FF80 86FF 0680 FF9A 80FF FF80 86FF 0680"
989 $"FFFF 80FF FF80 8700 05FF FF80 FFFF 8087"
990 $"0005 FFFF 80FF FF80 8700 05FF FF40 8080"
991 $"4087 0001 8080 7338 6D6B 0000 0108 FFFF"
992 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
993 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
994 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
995 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
996 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
997 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
998 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
999 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1000 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1001 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1002 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1003 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1004 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1005 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1006 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1007 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF 6963"
1008 $"6D23 0000 0038 F24B D007 B028 5557 81B1"
1009 $"124A 8236 1005 8000 1ABD 8030 557D FFFF"
1010 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1011 $"FFFF FFFF FFFF 6963 6D34 0000 0068 A33F"
1012 $"CDCC DCCD CAAE A333 0000 0000 CDEE 333A"
1013 $"0000 CCCB 2E0D EDCE CDCD DB2B DB6F D00D"
1014 $"00C2 BBEA BCD5 D00D 00BD 2D2D CC2D D00D"
1015 $"0CDC CCDB BADC D00D 0000 0000 0DCE D00D"
1016 $"0000 0000 0D0D D00D B1BB 1BF9 FD0D D00D"
1017 $"1111 1199 8D0D ECDB BB1B B1F9 FECE 6963"
1018 $"6D38 0000 00C8 DDDA DADD F8F8 F8F8 F8F8"
1019 $"F8F8 F864 8EAC DB23 23DC 0000 0000 0000"
1020 $"0000 F85C 89FB DC23 23DB 0000 0000 F608"
1021 $"3234 5E82 2AFA FBF8 F8FB F8F8 5633 335D"
1022 $"3488 575D EFF1 F900 00FA 0000 2C63 5E34"
1023 $"FD64 5D2C 33AA FA00 00F9 0000 395E 5D5D"
1024 $"5733 0832 33F9 F900 00FA 00F6 F92C 2B32"
1025 $"5D88 8888 88F8 FA00 00F9 0000 0000 0000"
1026 $"0000 00FA F781 F900 00FA 0000 0000 0000"
1027 $"0000 00F9 00F9 FA00 00F9 3559 5335 5959"
1028 $"E9E7 E7FA 00FA F900 00FA 0505 0505 0505"
1029 $"E8E6 E6F9 00F9 FBF8 F8FB 592F 5959 2F59"
1030 $"E9E7 E7FB F8FB 6974 3332 0000 245A 0000"
1031 $"0000 FF00 FF00 FF00 FB00 95FF 8100 C9FF"
1032 $"818E 81EA 8144 81FF 8500 95FF 8100 C9FF"
1033 $"818E 81EA 8144 81FF 8500 95FF 8100 C9FF"
1034 $"818E 81EA 8144 81FF 8500 95FF 8100 C9FF"
1035 $"818E 81EA 8144 81FF 8500 95FF 8100 C5FF"
1036 $"818F 81EA 81AB 818E 8144 8500 95FF 8100"
1037 $"C5FF 818F 81EA 81AB 818E 8144 8500 95FF"
1038 $"8100 C5FF 818F 81EA 81AB 818E 8144 8500"
1039 $"95FF 8100 C5FF 818F 81EA 81AB 818E 8144"
1040 $"8500 95FF 8100 C1FF 815A 81BE 81AB 818E"
1041 $"8145 8144 8500 95FF 8100 C1FF 815A 81BE"
1042 $"81AB 818E 8145 8144 8500 95FF 8100 C1FF"
1043 $"815A 81BE 81AB 818E 8145 8144 8500 95FF"
1044 $"8100 C1FF 815A 81BE 81AB 818E 8145 8144"
1045 $"8500 95FF 8100 BDFF 8164 81FE 8191 8169"
1046 $"8145 8144 81FF 8500 95FF 8100 BDFF 8164"
1047 $"81FE 8191 8169 8145 8144 81FF 8500 95FF"
1048 $"8100 BDFF 8164 81FE 8191 8169 8145 8144"
1049 $"81FF 8500 95FF 8100 BDFF 8164 81FE 8191"
1050 $"8169 8145 8144 81FF 8500 95FF 8100 A9FF"
1051 $"81E2 81E1 81CB 81B8 81A1 81FE 81B1 8162"
1052 $"8145 8144 85FF 8500 95FF 8100 A9FF 81E2"
1053 $"81E1 81CB 81B8 81A1 81FE 81B1 8162 8145"
1054 $"8144 85FF 8500 95FF 8100 A9FF 81E2 81E1"
1055 $"81CB 81B8 81A1 81FE 81B1 8162 8145 8144"
1056 $"85FF 8500 95FF 8100 A9FF 81E2 81E1 81CB"
1057 $"81B8 81A1 81FE 81B1 8162 8145 8144 85FF"
1058 $"8500 95FF 8100 A1FF 81E2 81E6 81E9 81EF"
1059 $"81B8 819F 81FE 81C1 8162 8145 8144 89FF"
1060 $"8500 95FF 8100 A1FF 81E2 81E6 81E9 81EF"
1061 $"81B8 819F 81FE 81C1 8162 8145 8144 89FF"
1062 $"8500 95FF 8100 A1FF 81E2 81E6 81E9 81EF"
1063 $"81B8 819F 81FE 81C1 8162 8145 8144 89FF"
1064 $"8500 95FF 8100 A1FF 81E2 81E6 81E9 81EF"
1065 $"81B8 819F 81FE 81C1 8162 8145 8144 89FF"
1066 $"8500 95FF 8100 9DFF 81D9 81E4 81E9 81EB"
1067 $"81B8 819F 81FE 81C3 8162 8145 8144 8DFF"
1068 $"8500 95FF 8100 9DFF 81D9 81E4 81E9 81EB"
1069 $"81B8 819F 81FE 81C3 8162 8145 8144 8DFF"
1070 $"8500 95FF 8100 9DFF 81D9 81E4 81E9 81EB"
1071 $"81B8 819F 81FE 81C3 8162 8145 8144 8DFF"
1072 $"8500 95FF 8100 9DFF 81D9 81E4 81E9 81EB"
1073 $"81B8 819F 81FE 81C3 8162 8145 8144 8DFF"
1074 $"BD00 81D7 81E3 81DE 81BA 818F 81A2 81FE"
1075 $"81C6 8162 8145 81D0 8161 CD00 81D7 81E3"
1076 $"81DE 81BA 818F 81A2 81FE 81C6 8162 8145"
1077 $"81D0 8161 CD00 81D7 81E3 81DE 81BA 818F"
1078 $"81A2 81FE 81C6 8162 8145 81D0 8161 CD00"
1079 $"81D7 81E3 81DE 81BA 818F 81A2 81FE 81C6"
1080 $"8162 8145 81D0 8161 9500 95FF 8100 95FF"
1081 $"81DA 81E5 81D4 81B3 8167 819A 81FE 81C8"
1082 $"8162 8145 81A5 81C9 81D3 8161 9100 95FF"
1083 $"8100 95FF 81DA 81E5 81D4 81B3 8167 819A"
1084 $"81FE 81C8 8162 8145 81A5 81C9 81D3 8161"
1085 $"9100 95FF 8100 95FF 81DA 81E5 81D4 81B3"
1086 $"8167 819A 81FE 81C8 8162 8145 81A5 81C9"
1087 $"81D3 8161 9100 95FF 8100 95FF 81DA 81E5"
1088 $"81D4 81B3 8167 819A 81FE 81C8 8162 8145"
1089 $"81A5 81C9 81D3 8161 9100 95FF 8100 91FF"
1090 $"81DC 81E2 81D4 81A4 8169 819E 81F2 81C9"
1091 $"8162 8145 8179 819B 81C2 81D2 81D0 8161"
1092 $"8D00 95FF 8100 91FF 81DC 81E2 81D4 81A4"
1093 $"8169 819E 81F2 81C9 8162 8145 8179 819B"
1094 $"81C2 81D2 81D0 8161 8D00 95FF 8100 91FF"
1095 $"81DC 81E2 81D4 81A4 8169 819E 81F2 81C9"
1096 $"8162 8145 8179 819B 81C2 81D2 81D0 8161"
1097 $"8D00 95FF 8100 91FF 81DC 81E2 81D4 81A4"
1098 $"8169 819E 81F2 81C9 8162 8145 8179 819B"
1099 $"81C2 81D2 81D0 8161 8D00 95FF 8100 8DFF"
1100 $"81E8 81DD 81D2 81B3 816A 81A0 81F3 81C7"
1101 $"815C 811B 815D 8189 819C 81B5 81CD 81D5"
1102 $"81D3 8161 8900 95FF 8100 8DFF 81E8 81DD"
1103 $"81D2 81B3 816A 81A0 81F3 81C7 815C 811B"
1104 $"815D 8189 819C 81B5 81CD 81D5 81D3 8161"
1105 $"8900 95FF 8100 8DFF 81E8 81DD 81D2 81B3"
1106 $"816A 81A0 81F3 81C7 815C 811B 815D 8189"
1107 $"819C 81B5 81CD 81D5 81D3 8161 8900 95FF"
1108 $"8100 8DFF 81E8 81DD 81D2 81B3 816A 81A0"
1109 $"81F3 81C7 815C 811B 815D 8189 819C 81B5"
1110 $"81CD 81D5 81D3 8161 8900 95FF 8100 8DFF"
1111 $"81DF 81C2 819C 8165 817A 81DE 81B3 816A"
1112 $"810D 8120 8182 81AD 81BD 81C3 81D1 81D5"
1113 $"81D7 81D0 8169 8188 8100 95FF 8100 8DFF"
1114 $"81DF 81C2 819C 8165 817A 81DE 81B3 816A"
1115 $"810D 8120 8182 81AD 81BD 81C3 81D1 81D5"
1116 $"81D7 81D0 8169 8188 8100 95FF 8100 8DFF"
1117 $"81DF 81C2 819C 8165 817A 81DE 81B3 816A"
1118 $"810D 8120 8182 81AD 81BD 81C3 81D1 81D5"
1119 $"81D7 81D0 8169 8188 8100 95FF 8100 8DFF"
1120 $"81DF 81C2 819C 8165 817A 81DE 81B3 816A"
1121 $"810D 8120 8182 81AD 81BD 81C3 81D1 81D5"
1122 $"81D7 81D0 8169 8188 8100 95FF 8100 8DFF"
1123 $"81AE 8181 8170 81B9 81C5 81C1 81CE 81C7"
1124 $"81B2 81AF 81DA 81E7 81EA 81E1 81D9 81D8"
1125 $"81D9 81D4 8169 8186 8100 95FF 8100 8DFF"
1126 $"81AE 8181 8170 81B9 81C5 81C1 81CE 81C7"
1127 $"81B2 81AF 81DA 81E7 81EA 81E1 81D9 81D8"
1128 $"81D9 81D4 8169 8186 8100 95FF 8100 8DFF"
1129 $"81AE 8181 8170 81B9 81C5 81C1 81CE 81C7"
1130 $"81B2 81AF 81DA 81E7 81EA 81E1 81D9 81D8"
1131 $"81D9 81D4 8169 8186 8100 95FF 8100 8DFF"
1132 $"81AE 8181 8170 81B9 81C5 81C1 81CE 81C7"
1133 $"81B2 81AF 81DA 81E7 81EA 81E1 81D9 81D8"
1134 $"81D9 81D4 8169 8186 8100 95FF 8100 8DFF"
1135 $"81EE 815C 8175 81EB 81D4 819F 81B3 81C4"
1136 $"81DE 81E7 81EC 81EB 81E3 81E4 81DD 81D6"
1137 $"81CE 81C6 8172 819C 8100 95FF 8100 8DFF"
1138 $"81EE 815C 8175 81EB 81D4 819F 81B3 81C4"
1139 $"81DE 81E7 81EC 81EB 81E3 81E4 81DD 81D6"
1140 $"81CE 81C6 8172 819C 8100 95FF 8100 8DFF"
1141 $"81EE 815C 8175 81EB 81D4 819F 81B3 81C4"
1142 $"81DE 81E7 81EC 81EB 81E3 81E4 81DD 81D6"
1143 $"81CE 81C6 8172 819C 8100 95FF 8100 8DFF"
1144 $"81EE 815C 8175 81EB 81D4 819F 81B3 81C4"
1145 $"81DE 81E7 81EC 81EB 81E3 81E4 81DD 81D6"
1146 $"81CE 81C6 8172 819C 8100 95FF 8100 8DFF"
1147 $"81C6 81A2 81C7 8188 816F 814D 8161 816F"
1148 $"817F 8190 8194 81C1 81DB 81CC 81C1 81C0"
1149 $"81B7 81AB 8182 81A2 8100 95FF 8100 8DFF"
1150 $"81C6 81A2 81C7 8188 816F 814D 8161 816F"
1151 $"817F 8190 8194 81C1 81DB 81CC 81C1 81C0"
1152 $"81B7 81AB 8182 81A2 8100 95FF 8100 8DFF"
1153 $"81C6 81A2 81C7 8188 816F 814D 8161 816F"
1154 $"817F 8190 8194 81C1 81DB 81CC 81C1 81C0"
1155 $"81B7 81AB 8182 81A2 8100 95FF 8100 8DFF"
1156 $"81C6 81A2 81C7 8188 816F 814D 8161 816F"
1157 $"817F 8190 8194 81C1 81DB 81CC 81C1 81C0"
1158 $"81B7 81AB 8182 81A2 8100 95FF 8100 8DFF"
1159 $"8199 81BF 81AE 815C 818A 8185 816D 8150"
1160 $"814E 815A 815B 8155 816C 818F 818B 818C"
1161 $"8195 8188 818F 81A4 8100 95FF 8100 8DFF"
1162 $"8199 81BF 81AE 815C 818A 8185 816D 8150"
1163 $"814E 815A 815B 8155 816C 818F 818B 818C"
1164 $"8195 8188 818F 81A4 8100 95FF 8100 8DFF"
1165 $"8199 81BF 81AE 815C 818A 8185 816D 8150"
1166 $"814E 815A 815B 8155 816C 818F 818B 818C"
1167 $"8195 8188 818F 81A4 8100 95FF 8100 8DFF"
1168 $"8199 81BF 81AE 815C 818A 8185 816D 8150"
1169 $"814E 815A 815B 8155 816C 818F 818B 818C"
1170 $"8195 8188 818F 81A4 8100 95FF 8100 89FF"
1171 $"81CA 8166 817C 818C 819F 85FF 81DC 81B5"
1172 $"8182 8151 814A 8143 813F 814B 8153 815E"
1173 $"8168 8160 818F 81A6 8100 95FF 8100 89FF"
1174 $"81CA 8166 817C 818C 819F 85FF 81DC 81B5"
1175 $"8182 8151 814A 8143 813F 814B 8153 815E"
1176 $"8168 8160 818F 81A6 8100 95FF 8100 89FF"
1177 $"81CA 8166 817C 818C 819F 85FF 81DC 81B5"
1178 $"8182 8151 814A 8143 813F 814B 8153 815E"
1179 $"8168 8160 818F 81A6 8100 95FF 8100 89FF"
1180 $"81CA 8166 817C 818C 819F 85FF 81DC 81B5"
1181 $"8182 8151 814A 8143 813F 814B 8153 815E"
1182 $"8168 8160 818F 81A6 8100 95FF 8100 89FF"
1183 $"8166 819F 81C2 95FF 81DC 81C3 81A8 818D"
1184 $"8184 817B 8168 816D 815A 815E 818F 81AF"
1185 $"8100 95FF 8100 89FF 8166 819F 81C2 95FF"
1186 $"81DC 81C3 81A8 818D 8184 817B 8168 816D"
1187 $"815A 815E 818F 81AF 8100 95FF 8100 89FF"
1188 $"8166 819F 81C2 95FF 81DC 81C3 81A8 818D"
1189 $"8184 817B 8168 816D 815A 815E 818F 81AF"
1190 $"8100 95FF 8100 89FF 8166 819F 81C2 95FF"
1191 $"81DC 81C3 81A8 818D 8184 817B 8168 816D"
1192 $"815A 815E 818F 81AF 8100 95FF 8100 C5FF"
1193 $"8100 85FF 8181 818F 81B5 8100 95FF 8100"
1194 $"C5FF 8100 85FF 8181 818F 81B5 8100 95FF"
1195 $"8100 C5FF 8100 85FF 8181 818F 81B5 8100"
1196 $"95FF 8100 C5FF 8100 85FF 8181 818F 81B5"
1197 $"8100 95FF 8100 C5FF 8100 85FF 8122 8544"
1198 $"8100 95FF 8100 C5FF 8100 85FF 8122 8544"
1199 $"8100 95FF 8100 C5FF 8100 85FF 8122 8544"
1200 $"8100 95FF 8100 C5FF 8100 85FF 8122 8544"
1201 $"8100 95FF 8100 C5FF 8100 8DFF 8500 95FF"
1202 $"8100 C5FF 8100 8DFF 8500 95FF 8100 C5FF"
1203 $"8100 8DFF 8500 95FF 8100 C5FF 8100 8DFF"
1204 $"8500 95FF 8100 C5FF 8100 8DFF 8500 95FF"
1205 $"8100 C5FF 8100 8DFF 8500 95FF 8100 C5FF"
1206 $"8100 8DFF 8500 95FF 8100 C5FF 8100 8DFF"
1207 $"8500 95FF 8100 C5FF 8100 8DFF 8500 95FF"
1208 $"8100 C5FF 8100 8DFF 8500 95FF 8100 C5FF"
1209 $"8100 8DFF 8500 95FF 8100 C5FF 8100 8DFF"
1210 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1211 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1212 $"8500 95FF 8100 ADFF 9900 8DFF 8500 95FF"
1213 $"8100 ADFF 9900 8DFF 8500 95FF 8100 ADFF"
1214 $"9900 8DFF 8500 95FF 8100 ADFF 9900 8DFF"
1215 $"8500 95FF 8100 ADFF 9900 8DFF 8500 95FF"
1216 $"8100 ADFF 9900 8DFF 8500 95FF 8100 ADFF"
1217 $"9900 8DFF 8500 95FF 8100 ADFF 9900 8DFF"
1218 $"8500 95FF 8100 ADFF 9900 8DFF 8500 95FF"
1219 $"8100 ADFF 9900 8DFF 8500 95FF 8100 ADFF"
1220 $"9900 8DFF 8500 95FF 8100 ADFF 9900 8DFF"
1221 $"8500 95FF 8100 ADFF 9900 8DFF 8500 95FF"
1222 $"8100 ADFF 9900 8DFF 8500 95FF 8100 ADFF"
1223 $"9900 8DFF 8500 95FF 8100 ADFF 9900 8DFF"
1224 $"8500 95FF 8100 ADFF 9900 8DFF 8500 95FF"
1225 $"8100 ADFF 9900 8DFF 8500 95FF 8100 ADFF"
1226 $"9900 8DFF 8500 95FF 8100 ADFF 9900 8DFF"
1227 $"8500 95FF 8100 ADFF 9900 8DFF 8500 95FF"
1228 $"8100 ADFF 9900 8DFF 8500 95FF 8100 ADFF"
1229 $"9900 8DFF 8500 95FF 8100 ADFF 9900 8DFF"
1230 $"FF00 FF00 FF00 FB00 FF00 FF00 FF00 FF00"
1231 $"9500 C9FF 8101 8100 8144 81FF A100 C9FF"
1232 $"8101 8100 8144 81FF A100 C9FF 8101 8100"
1233 $"8144 81FF A100 C9FF 8101 8100 8144 81FF"
1234 $"A100 C5FF 8109 8500 8101 8144 A100 C5FF"
1235 $"8109 8500 8101 8144 A100 C5FF 8109 8500"
1236 $"8101 8144 A100 C5FF 8109 8500 8101 8144"
1237 $"A100 C1FF 8167 81BC 8100 8101 8119 8144"
1238 $"A100 C1FF 8167 81BC 8100 8101 8119 8144"
1239 $"A100 C1FF 8167 81BC 8100 8101 8119 8144"
1240 $"A100 C1FF 8167 81BC 8100 8101 8119 8144"
1241 $"A100 BDFF 8166 81E4 819D 8171 8119 8144"
1242 $"81FF A100 BDFF 8166 81E4 819D 8171 8119"
1243 $"8144 81FF A100 BDFF 8166 81E4 819D 8171"
1244 $"8119 8144 81FF A100 BDFF 8166 81E4 819D"
1245 $"8171 8119 8144 81FF A100 A9FF 81C9 81BE"
1246 $"81A7 819B 8182 81E4 8189 8144 8119 8144"
1247 $"85FF A100 A9FF 81C9 81BE 81A7 819B 8182"
1248 $"81E4 8189 8144 8119 8144 85FF A100 A9FF"
1249 $"81C9 81BE 81A7 819B 8182 81E4 8189 8144"
1250 $"8119 8144 85FF A100 A9FF 81C9 81BE 81A7"
1251 $"819B 8182 81E4 8189 8144 8119 8144 85FF"
1252 $"A100 A1FF 81CF 81B6 81B9 81BB 819B 8179"
1253 $"81E4 8193 8144 8119 8144 89FF A100 A1FF"
1254 $"81CF 81B6 81B9 81BB 819B 8179 81E4 8193"
1255 $"8144 8119 8144 89FF A100 A1FF 81CF 81B6"
1256 $"81B9 81BB 819B 8179 81E4 8193 8144 8119"
1257 $"8144 89FF A100 A1FF 81CF 81B6 81B9 81BB"
1258 $"819B 8179 81E4 8193 8144 8119 8144 89FF"
1259 $"A100 9DFF 81B2 81AC 81B6 81B5 819B 817D"
1260 $"81E4 8197 8144 8119 8144 8DFF A100 9DFF"
1261 $"81B2 81AC 81B6 81B5 819B 817D 81E4 8197"
1262 $"8144 8119 8144 8DFF A100 9DFF 81B2 81AC"
1263 $"81B6 81B5 819B 817D 81E4 8197 8144 8119"
1264 $"8144 8DFF A100 9DFF 81B2 81AC 81B6 81B5"
1265 $"819B 817D 81E4 8197 8144 8119 8144 8DFF"
1266 $"BD00 85AF 81A0 816E 8151 8180 81E4 819A"
1267 $"8144 8119 819B 8162 CD00 85AF 81A0 816E"
1268 $"8151 8180 81E4 819A 8144 8119 819B 8162"
1269 $"CD00 85AF 81A0 816E 8151 8180 81E4 819A"
1270 $"8144 8119 819B 8162 CD00 85AF 81A0 816E"
1271 $"8151 8180 81E4 819A 8144 8119 819B 8162"
1272 $"9500 95FF 8100 95FF 81B2 81B3 8197 8168"
1273 $"812E 8176 81E4 819D 8144 8119 8163 8196"
1274 $"81A1 8162 9100 95FF 8100 95FF 81B2 81B3"
1275 $"8197 8168 812E 8176 81E4 819D 8144 8119"
1276 $"8163 8196 81A1 8162 9100 95FF 8100 95FF"
1277 $"81B2 81B3 8197 8168 812E 8176 81E4 819D"
1278 $"8144 8119 8163 8196 81A1 8162 9100 95FF"
1279 $"8100 95FF 81B2 81B3 8197 8168 812E 8176"
1280 $"81E4 819D 8144 8119 8163 8196 81A1 8162"
1281 $"9100 95FF 8100 91FF 81BE 81B0 8199 8153"
1282 $"8130 817E 81CF 819C 8146 8119 8134 8159"
1283 $"818B 81A6 819C 8162 8D00 95FF 8100 91FF"
1284 $"81BE 81B0 8199 8153 8130 817E 81CF 819C"
1285 $"8146 8119 8134 8159 818B 81A6 819C 8162"
1286 $"8D00 95FF 8100 91FF 81BE 81B0 8199 8153"
1287 $"8130 817E 81CF 819C 8146 8119 8134 8159"
1288 $"818B 81A6 819C 8162 8D00 95FF 8100 91FF"
1289 $"81BE 81B0 8199 8153 8130 817E 81CF 819C"
1290 $"8146 8119 8134 8159 818B 81A6 819C 8162"
1291 $"8D00 95FF 8100 8DFF 81E0 81B1 8191 8167"
1292 $"812E 817E 81D0 819A 8144 810E 812A 813C"
1293 $"8155 817B 81A0 81A8 81A2 8162 8900 95FF"
1294 $"8100 8DFF 81E0 81B1 8191 8167 812E 817E"
1295 $"81D0 819A 8144 810E 812A 813C 8155 817B"
1296 $"81A0 81A8 81A2 8162 8900 95FF 8100 8DFF"
1297 $"81E0 81B1 8191 8167 812E 817E 81D0 819A"
1298 $"8144 810E 812A 813C 8155 817B 81A0 81A8"
1299 $"81A2 8162 8900 95FF 8100 8DFF 81E0 81B1"
1300 $"8191 8167 812E 817E 81D0 819A 8144 810E"
1301 $"812A 813C 8155 817B 81A0 81A8 81A2 8162"
1302 $"8900 95FF 8100 8DFF 81C5 8176 814B 812D"
1303 $"8151 81B5 8186 814F 8104 810E 8134 8161"
1304 $"8181 818A 819F 81A8 81A7 81A1 8168 817C"
1305 $"8100 95FF 8100 8DFF 81C5 8176 814B 812D"
1306 $"8151 81B5 8186 814F 8104 810E 8134 8161"
1307 $"8181 818A 819F 81A8 81A7 81A1 8168 817C"
1308 $"8100 95FF 8100 8DFF 81C5 8176 814B 812D"
1309 $"8151 81B5 8186 814F 8104 810E 8134 8161"
1310 $"8181 818A 819F 81A8 81A7 81A1 8168 817C"
1311 $"8100 95FF 8100 8DFF 81C5 8176 814B 812D"
1312 $"8151 81B5 8186 814F 8104 810E 8134 8161"
1313 $"8181 818A 819F 81A8 81A7 81A1 8168 817C"
1314 $"8100 95FF 8100 8DFF 8172 812D 813A 817D"
1315 $"8186 8183 8199 8198 818C 8185 81A0 81B3"
1316 $"81B9 81AE 81A9 85AA 81A5 8168 817E 8100"
1317 $"95FF 8100 8DFF 8172 812D 813A 817D 8186"
1318 $"8183 8199 8198 818C 8185 81A0 81B3 81B9"
1319 $"81AE 81A9 85AA 81A5 8168 817E 8100 95FF"
1320 $"8100 8DFF 8172 812D 813A 817D 8186 8183"
1321 $"8199 8198 818C 8185 81A0 81B3 81B9 81AE"
1322 $"81A9 85AA 81A5 8168 817E 8100 95FF 8100"
1323 $"8DFF 8172 812D 813A 817D 8186 8183 8199"
1324 $"8198 818C 8185 81A0 81B3 81B9 81AE 81A9"
1325 $"85AA 81A5 8168 817E 8100 95FF 8100 8DFF"
1326 $"81E8 8144 8138 81B3 81A9 8162 816F 817D"
1327 $"819D 81B2 81BE 81BC 81B5 81B7 81AF 81A5"
1328 $"819B 8195 8173 8192 8100 95FF 8100 8DFF"
1329 $"81E8 8144 8138 81B3 81A9 8162 816F 817D"
1330 $"819D 81B2 81BE 81BC 81B5 81B7 81AF 81A5"
1331 $"819B 8195 8173 8192 8100 95FF 8100 8DFF"
1332 $"81E8 8144 8138 81B3 81A9 8162 816F 817D"
1333 $"819D 81B2 81BE 81BC 81B5 81B7 81AF 81A5"
1334 $"819B 8195 8173 8192 8100 95FF 8100 8DFF"
1335 $"81E8 8144 8138 81B3 81A9 8162 816F 817D"
1336 $"819D 81B2 81BE 81BC 81B5 81B7 81AF 81A5"
1337 $"819B 8195 8173 8192 8100 95FF 8100 8DFF"
1338 $"81C2 8183 819A 8144 813D 811E 8129 8134"
1339 $"8144 8155 815C 818E 81AC 819A 818B 8189"
1340 $"817D 8175 8182 819A 8100 95FF 8100 8DFF"
1341 $"81C2 8183 819A 8144 813D 811E 8129 8134"
1342 $"8144 8155 815C 818E 81AC 819A 818B 8189"
1343 $"817D 8175 8182 819A 8100 95FF 8100 8DFF"
1344 $"81C2 8183 819A 8144 813D 811E 8129 8134"
1345 $"8144 8155 815C 818E 81AC 819A 818B 8189"
1346 $"817D 8175 8182 819A 8100 95FF 8100 8DFF"
1347 $"81C2 8183 819A 8144 813D 811E 8129 8134"
1348 $"8144 8155 815C 818E 81AC 819A 818B 8189"
1349 $"817D 8175 8182 819A 8100 95FF 8100 8DFF"
1350 $"816E 818B 8180 8144 8174 816B 8145 8522"
1351 $"812F 8130 812E 8142 815C 8155 8158 8160"
1352 $"8155 818E 819E 8100 95FF 8100 8DFF 816E"
1353 $"818B 8180 8144 8174 816B 8145 8522 812F"
1354 $"8130 812E 8142 815C 8155 8158 8160 8155"
1355 $"818E 819E 8100 95FF 8100 8DFF 816E 818B"
1356 $"8180 8144 8174 816B 8145 8522 812F 8130"
1357 $"812E 8142 815C 8155 8158 8160 8155 818E"
1358 $"819E 8100 95FF 8100 8DFF 816E 818B 8180"
1359 $"8144 8174 816B 8145 8522 812F 8130 812E"
1360 $"8142 815C 8155 8158 8160 8155 818E 819E"
1361 $"8100 95FF 8100 89FF 81B4 8166 815A 8181"
1362 $"819F 85FF 81D6 819F 815B 8123 811B 8113"
1363 $"8110 8120 812B 8133 813C 8137 818E 81A0"
1364 $"8100 95FF 8100 89FF 81B4 8166 815A 8181"
1365 $"819F 85FF 81D6 819F 815B 8123 811B 8113"
1366 $"8110 8120 812B 8133 813C 8137 818E 81A0"
1367 $"8100 95FF 8100 89FF 81B4 8166 815A 8181"
1368 $"819F 85FF 81D6 819F 815B 8123 811B 8113"
1369 $"8110 8120 812B 8133 813C 8137 818E 81A0"
1370 $"8100 95FF 8100 89FF 81B4 8166 815A 8181"
1371 $"819F 85FF 81D6 819F 815B 8123 811B 8113"
1372 $"8110 8120 812B 8133 813C 8137 818E 81A0"
1373 $"8100 95FF 8100 89FF 8166 819F 81C2 95FF"
1374 $"81D6 81B6 8192 816F 8166 815B 8147 8149"
1375 $"8131 813B 818E 81A6 8100 95FF 8100 89FF"
1376 $"8166 819F 81C2 95FF 81D6 81B6 8192 816F"
1377 $"8166 815B 8147 8149 8131 813B 818E 81A6"
1378 $"8100 95FF 8100 89FF 8166 819F 81C2 95FF"
1379 $"81D6 81B6 8192 816F 8166 815B 8147 8149"
1380 $"8131 813B 818E 81A6 8100 95FF 8100 89FF"
1381 $"8166 819F 81C2 95FF 81D6 81B6 8192 816F"
1382 $"8166 815B 8147 8149 8131 813B 818E 81A6"
1383 $"8100 95FF 8100 C5FF 8100 85FF 8172 818E"
1384 $"81AB 8100 95FF 8100 C5FF 8100 85FF 8172"
1385 $"818E 81AB 8100 95FF 8100 C5FF 8100 85FF"
1386 $"8172 818E 81AB 8100 95FF 8100 C5FF 8100"
1387 $"85FF 8172 818E 81AB 8100 95FF 8100 C5FF"
1388 $"8100 85FF 8122 8544 8100 95FF 8100 C5FF"
1389 $"8100 85FF 8122 8544 8100 95FF 8100 C5FF"
1390 $"8100 85FF 8122 8544 8100 95FF 8100 C5FF"
1391 $"8100 85FF 8122 8544 8100 95FF 8100 C5FF"
1392 $"8100 8DFF 8500 95FF 8100 C5FF 8100 8DFF"
1393 $"8500 95FF 8100 C5FF 8100 8DFF 8500 95FF"
1394 $"8100 C5FF 8100 8DFF 8500 95FF 8100 C5FF"
1395 $"8100 8DFF 8500 95FF 8100 C5FF 8100 8DFF"
1396 $"8500 95FF 8100 C5FF 8100 8DFF 8500 95FF"
1397 $"8100 C5FF 8100 8DFF 8500 95FF 8100 C5FF"
1398 $"8100 8DFF 8500 95FF 8100 C5FF 8100 8DFF"
1399 $"8500 95FF 8100 C5FF 8100 8DFF 8500 95FF"
1400 $"8100 C5FF 8100 8DFF 8500 95FF CD00 8DFF"
1401 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1402 $"8500 95FF CD00 8DFF 8500 95FF 8100 ADFF"
1403 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1404 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1405 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1406 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1407 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1408 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1409 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1410 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1411 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1412 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1413 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1414 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1415 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1416 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1417 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1418 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1419 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1420 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1421 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1422 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1423 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1424 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1425 $"8100 917B 8100 8DFF 8500 95FF 8100 ADFF"
1426 $"8100 917B 8100 8DFF FF00 FF00 FF00 FB00"
1427 $"FF00 FF00 FF00 FF00 9500 C9FF 810F 8143"
1428 $"8144 81FF A100 C9FF 810F 8143 8144 81FF"
1429 $"A100 C9FF 810F 8143 8144 81FF A100 C9FF"
1430 $"810F 8143 8144 81FF A100 C5FF 8117 8143"
1431 $"8116 810F 8144 A100 C5FF 8117 8143 8116"
1432 $"810F 8144 A100 C5FF 8117 8143 8116 810F"
1433 $"8144 A100 C5FF 8117 8143 8116 810F 8144"
1434 $"A100 C1FF 8165 81C4 8116 810F 811A 8144"
1435 $"A100 C1FF 8165 81C4 8116 810F 811A 8144"
1436 $"A100 C1FF 8165 81C4 8116 810F 811A 8144"
1437 $"A100 C1FF 8165 81C4 8116 810F 811A 8144"
1438 $"A100 BDFF 8155 8167 81A7 816C 811A 8144"
1439 $"81FF A100 BDFF 8155 8167 81A7 816C 811A"
1440 $"8144 81FF A100 BDFF 8155 8167 81A7 816C"
1441 $"811A 8144 81FF A100 BDFF 8155 8167 81A7"
1442 $"816C 811A 8144 81FF A100 A9FF 81BC 81A9"
1443 $"8192 8193 813E 8167 814D 8123 811A 8144"
1444 $"85FF A100 A9FF 81BC 81A9 8192 8193 813E"
1445 $"8167 814D 8123 811A 8144 85FF A100 A9FF"
1446 $"81BC 81A9 8192 8193 813E 8167 814D 8123"
1447 $"811A 8144 85FF A100 A9FF 81BC 81A9 8192"
1448 $"8193 813E 8167 814D 8123 811A 8144 85FF"
1449 $"A100 A1FF 81C6 819A 8598 8193 8131 8167"
1450 $"814A 8123 811A 8144 89FF A100 A1FF 81C6"
1451 $"819A 8598 8193 8131 8167 814A 8123 811A"
1452 $"8144 89FF A100 A1FF 81C6 819A 8598 8193"
1453 $"8131 8167 814A 8123 811A 8144 89FF A100"
1454 $"A1FF 81C6 819A 8598 8193 8131 8167 814A"
1455 $"8123 811A 8144 89FF A100 9DFF 819C 818E"
1456 $"8199 8195 8193 8137 8167 814F 8123 811A"
1457 $"8144 8DFF A100 9DFF 819C 818E 8199 8195"
1458 $"8193 8137 8167 814F 8123 811A 8144 8DFF"
1459 $"A100 9DFF 819C 818E 8199 8195 8193 8137"
1460 $"8167 814F 8123 811A 8144 8DFF A100 9DFF"
1461 $"819C 818E 8199 8195 8193 8137 8167 814F"
1462 $"8123 811A 8144 8DFF BD00 8192 818F 8186"
1463 $"8157 8147 8139 8167 8152 8123 811A 817A"
1464 $"8161 CD00 8192 818F 8186 8157 8147 8139"
1465 $"8167 8152 8123 811A 817A 8161 CD00 8192"
1466 $"818F 8186 8157 8147 8139 8167 8152 8123"
1467 $"811A 817A 8161 CD00 8192 818F 8186 8157"
1468 $"8147 8139 8167 8152 8123 811A 817A 8161"
1469 $"9500 95FF 8100 95FF 8195 8191 817C 8151"
1470 $"812A 8132 8167 8153 8123 811A 814B 8178"
1471 $"8183 8161 89FF 8500 95FF 8100 95FF 8195"
1472 $"8191 817C 8151 812A 8132 8167 8153 8123"
1473 $"811A 814B 8178 8183 8161 89FF 8500 95FF"
1474 $"8100 95FF 8195 8191 817C 8151 812A 8132"
1475 $"8167 8153 8123 811A 814B 8178 8183 8161"
1476 $"89FF 8500 95FF 8100 95FF 8195 8191 817C"
1477 $"8151 812A 8132 8167 8153 8123 811A 814B"
1478 $"8178 8183 8161 89FF 8500 95FF 8100 91FF"
1479 $"81A9 818B 817D 8141 812C 8137 8163 8153"
1480 $"8124 811A 812C 8144 816D 818A 8180 8161"
1481 $"85FF 8500 95FF 8100 91FF 81A9 818B 817D"
1482 $"8141 812C 8137 8163 8153 8124 811A 812C"
1483 $"8144 816D 818A 8180 8161 85FF 8500 95FF"
1484 $"8100 91FF 81A9 818B 817D 8141 812C 8137"
1485 $"8163 8153 8124 811A 812C 8144 816D 818A"
1486 $"8180 8161 85FF 8500 95FF 8100 91FF 81A9"
1487 $"818B 817D 8141 812C 8137 8163 8153 8124"
1488 $"811A 812C 8144 816D 818A 8180 8161 85FF"
1489 $"8500 95FF 8100 8DFF 81DA 8192 8178 8154"
1490 $"8127 8137 8161 8151 8122 8111 8124 8132"
1491 $"813F 8160 8184 818D 8186 8161 81FF 8500"
1492 $"95FF 8100 8DFF 81DA 8192 8178 8154 8127"
1493 $"8137 8161 8151 8122 8111 8124 8132 813F"
1494 $"8160 8184 818D 8186 8161 81FF 8500 95FF"
1495 $"8100 8DFF 81DA 8192 8178 8154 8127 8137"
1496 $"8161 8151 8122 8111 8124 8132 813F 8160"
1497 $"8184 818D 8186 8161 81FF 8500 95FF 8100"
1498 $"8DFF 81DA 8192 8178 8154 8127 8137 8161"
1499 $"8151 8122 8111 8124 8132 813F 8160 8184"
1500 $"818D 8186 8161 81FF 8500 95FF 8100 8DFF"
1501 $"81B7 815B 813C 8127 8130 8159 8156 812A"
1502 $"810A 810C 812C 814F 8165 816C 8185 818D"
1503 $"8189 8188 8169 8188 8100 95FF 8100 8DFF"
1504 $"81B7 815B 813C 8127 8130 8159 8156 812A"
1505 $"810A 810C 812C 814F 8165 816C 8185 818D"
1506 $"8189 8188 8169 8188 8100 95FF 8100 8DFF"
1507 $"81B7 815B 813C 8127 8130 8159 8156 812A"
1508 $"810A 810C 812C 814F 8165 816C 8185 818D"
1509 $"8189 8188 8169 8188 8100 95FF 8100 8DFF"
1510 $"81B7 815B 813C 8127 8130 8159 8156 812A"
1511 $"810A 810C 812C 814F 8165 816C 8185 818D"
1512 $"8189 8188 8169 8188 8100 95FF 8100 8DFF"
1513 $"8161 8120 812F 816A 8576 8583 8178 8174"
1514 $"818C 819A 819D 8191 858E 818C 8188 8169"
1515 $"8155 8100 95FF 8100 8DFF 8161 8120 812F"
1516 $"816A 8576 8583 8178 8174 818C 819A 819D"
1517 $"8191 858E 818C 8188 8169 8155 8100 95FF"
1518 $"8100 8DFF 8161 8120 812F 816A 8576 8583"
1519 $"8178 8174 818C 819A 819D 8191 858E 818C"
1520 $"8188 8169 8155 8100 95FF 8100 8DFF 8161"
1521 $"8120 812F 816A 8576 8583 8178 8174 818C"
1522 $"819A 819D 8191 858E 818C 8188 8169 8155"
1523 $"8100 95FF 8100 8DFF 81E7 8122 8130 8196"
1524 $"8194 8153 8154 815F 8180 8195 81A2 819E"
1525 $"819A 819D 8194 8188 8181 817A 8173 8144"
1526 $"8100 95FF 8100 8DFF 81E7 8122 8130 8196"
1527 $"8194 8153 8154 815F 8180 8195 81A2 819E"
1528 $"819A 819D 8194 8188 8181 817A 8173 8144"
1529 $"8100 95FF 8100 8DFF 81E7 8122 8130 8196"
1530 $"8194 8153 8154 815F 8180 8195 81A2 819E"
1531 $"819A 819D 8194 8188 8181 817A 8173 8144"
1532 $"8100 95FF 8100 8DFF 81E7 8122 8130 8196"
1533 $"8194 8153 8154 815F 8180 8195 81A2 819E"
1534 $"819A 819D 8194 8188 8181 817A 8173 8144"
1535 $"8100 95FF 8100 8DFF 81C6 8146 8151 8135"
1536 $"8138 8119 811F 812A 8136 8144 814A 8175"
1537 $"8191 8181 8173 8172 8168 8160 8181 81FF"
1538 $"8100 95FF 8100 8DFF 81C6 8146 8151 8135"
1539 $"8138 8119 811F 812A 8136 8144 814A 8175"
1540 $"8191 8181 8173 8172 8168 8160 8181 81FF"
1541 $"8100 95FF 8100 8DFF 81C6 8146 8151 8135"
1542 $"8138 8119 811F 812A 8136 8144 814A 8175"
1543 $"8191 8181 8173 8172 8168 8160 8181 81FF"
1544 $"8100 95FF 8100 8DFF 81C6 8146 8151 8135"
1545 $"8138 8119 811F 812A 8136 8144 814A 8175"
1546 $"8191 8181 8173 8172 8168 8160 8181 81FF"
1547 $"8100 95FF 8100 8DFF 8159 816A 8149 8122"
1548 $"8177 8168 813C 811A 811D 8928 8138 814D"
1549 $"8147 8148 814F 8147 818E 81FF 8100 95FF"
1550 $"8100 8DFF 8159 816A 8149 8122 8177 8168"
1551 $"813C 811A 811D 8928 8138 814D 8147 8148"
1552 $"814F 8147 818E 81FF 8100 95FF 8100 8DFF"
1553 $"8159 816A 8149 8122 8177 8168 813C 811A"
1554 $"811D 8928 8138 814D 8147 8148 814F 8147"
1555 $"818E 81FF 8100 95FF 8100 8DFF 8159 816A"
1556 $"8149 8122 8177 8168 813C 811A 811D 8928"
1557 $"8138 814D 8147 8148 814F 8147 818E 81FF"
1558 $"8100 95FF 8100 89FF 81A8 8165 814A 817F"
1559 $"819F 85FF 81D3 819A 8155 811C 8114 810E"
1560 $"810B 811B 8126 812B 8133 8130 818E 819A"
1561 $"8100 95FF 8100 89FF 81A8 8165 814A 817F"
1562 $"819F 85FF 81D3 819A 8155 811C 8114 810E"
1563 $"810B 811B 8126 812B 8133 8130 818E 819A"
1564 $"8100 95FF 8100 89FF 81A8 8165 814A 817F"
1565 $"819F 85FF 81D3 819A 8155 811C 8114 810E"
1566 $"810B 811B 8126 812B 8133 8130 818E 819A"
1567 $"8100 95FF 8100 89FF 81A8 8165 814A 817F"
1568 $"819F 85FF 81D3 819A 8155 811C 8114 810E"
1569 $"810B 811B 8126 812B 8133 8130 818E 819A"
1570 $"8100 95FF 8100 89FF 8165 819F 81C2 95FF"
1571 $"81D3 81B2 818E 8169 815F 8156 8142 8143"
1572 $"812B 8135 818E 819F 8100 95FF 8100 89FF"
1573 $"8165 819F 81C2 95FF 81D3 81B2 818E 8169"
1574 $"815F 8156 8142 8143 812B 8135 818E 819F"
1575 $"8100 95FF 8100 89FF 8165 819F 81C2 95FF"
1576 $"81D3 81B2 818E 8169 815F 8156 8142 8143"
1577 $"812B 8135 818E 819F 8100 95FF 8100 89FF"
1578 $"8165 819F 81C2 95FF 81D3 81B2 818E 8169"
1579 $"815F 8156 8142 8143 812B 8135 818E 819F"
1580 $"8100 95FF 8100 C5FF 8100 85FF 816B 818E"
1581 $"81A7 8100 95FF 8100 C5FF 8100 85FF 816B"
1582 $"818E 81A7 8100 95FF 8100 C5FF 8100 85FF"
1583 $"816B 818E 81A7 8100 95FF 8100 C5FF 8100"
1584 $"85FF 816B 818E 81A7 8100 95FF 8100 C5FF"
1585 $"8100 85FF 8122 8544 8100 95FF 8100 C5FF"
1586 $"8100 85FF 8122 8544 8100 95FF 8100 C5FF"
1587 $"8100 85FF 8122 8544 8100 95FF 8100 C5FF"
1588 $"8100 85FF 8122 8544 8100 95FF 8100 C5FF"
1589 $"8100 8DFF 8500 95FF 8100 C5FF 8100 8DFF"
1590 $"8500 95FF 8100 C5FF 8100 8DFF 8500 95FF"
1591 $"8100 C5FF 8100 8DFF 8500 95FF 8100 C5FF"
1592 $"8100 8DFF 8500 95FF 8100 C5FF 8100 8DFF"
1593 $"8500 95FF 8100 C5FF 8100 8DFF 8500 95FF"
1594 $"8100 C5FF 8100 8DFF 8500 95FF 8100 C5FF"
1595 $"8100 8DFF 8500 95FF 8100 C5FF 8100 8DFF"
1596 $"8500 95FF 8100 C5FF 8100 8DFF 8500 95FF"
1597 $"8100 C5FF 8100 8DFF 8500 95FF CD00 8DFF"
1598 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1599 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1600 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1601 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1602 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1603 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1604 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1605 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1606 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1607 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1608 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1609 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1610 $"8500 95FF CD00 8DFF 8500 95FF CD00 8DFF"
1611 $"8500 95FF CD00 8DFF FF00 FF00 FF00 FB00"
1612 $"7438 6D6B 0000 4008 FFFF FFFF FFFF FFFF"
1613 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1614 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1615 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1616 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1617 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1618 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1619 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1620 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1621 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1622 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1623 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1624 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1625 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1626 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1627 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1628 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1629 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1630 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1631 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1632 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1633 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1634 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1635 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1636 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1637 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1638 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1639 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1640 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1641 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1642 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1643 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1644 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1645 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1646 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1647 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1648 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1649 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1650 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1651 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1652 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1653 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1654 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1655 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1656 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1657 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1658 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1659 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1660 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1661 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1662 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1663 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1664 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1665 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1666 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1667 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1668 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1669 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1670 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1671 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1672 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1673 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1674 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1675 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1676 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1677 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1678 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1679 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1680 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1681 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1682 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1683 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1684 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1685 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1686 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1687 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1688 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1689 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1690 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1691 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1692 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1693 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1694 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1695 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1696 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1697 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1698 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1699 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1700 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1701 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1702 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1703 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1704 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1705 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1706 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1707 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1708 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1709 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1710 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1711 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1712 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1713 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1714 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1715 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1716 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1717 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1718 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1719 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1720 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1721 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1722 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1723 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1724 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1725 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1726 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1727 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1728 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1729 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1730 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1731 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1732 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1733 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1734 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1735 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1736 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1737 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1738 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1739 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1740 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1741 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1742 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1743 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1744 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1745 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1746 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1747 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1748 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1749 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1750 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1751 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1752 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1753 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1754 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1755 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1756 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1757 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1758 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1759 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1760 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1761 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1762 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1763 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1764 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1765 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1766 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1767 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1768 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1769 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1770 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1771 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1772 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1773 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1774 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1775 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1776 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1777 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1778 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1779 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1780 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1781 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1782 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1783 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1784 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1785 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1786 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1787 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1788 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1789 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1790 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1791 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1792 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1793 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1794 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1795 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1796 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1797 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1798 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1799 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1800 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1801 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1802 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1803 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1804 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1805 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1806 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1807 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1808 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1809 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1810 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1811 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1812 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1813 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1814 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1815 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1816 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1817 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1818 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1819 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1820 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1821 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1822 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1823 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1824 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1825 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1826 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1827 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1828 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1829 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1830 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1831 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1832 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1833 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1834 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1835 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1836 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1837 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1838 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1839 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1840 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1841 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1842 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1843 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1844 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1845 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1846 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1847 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1848 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1849 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1850 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1851 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1852 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1853 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1854 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1855 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1856 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1857 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1858 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1859 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1860 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1861 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1862 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1863 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1864 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1865 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1866 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1867 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1868 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1869 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1870 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1871 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1872 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1873 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1874 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1875 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1876 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1877 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1878 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1879 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1880 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1881 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1882 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1883 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1884 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1885 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1886 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1887 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1888 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1889 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1890 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1891 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1892 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1893 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1894 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1895 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1896 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1897 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1898 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1899 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1900 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1901 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1902 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1903 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1904 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1905 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1906 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1907 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1908 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1909 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1910 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1911 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1912 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1913 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1914 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1915 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1916 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1917 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1918 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1919 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1920 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1921 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1922 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1923 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1924 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1925 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1926 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1927 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1928 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1929 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1930 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1931 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1932 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1933 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1934 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1935 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1936 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1937 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1938 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1939 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1940 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1941 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1942 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1943 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1944 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1945 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1946 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1947 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1948 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1949 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1950 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1951 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1952 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1953 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1954 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1955 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1956 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1957 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1958 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1959 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1960 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1961 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1962 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1963 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1964 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1965 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1966 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1967 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1968 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1969 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1970 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1971 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1972 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1973 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1974 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1975 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1976 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1977 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1978 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1979 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1980 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1981 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1982 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1983 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1984 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1985 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1986 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1987 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1988 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1989 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1990 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1991 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1992 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1993 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1994 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1995 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1996 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1997 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1998 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
1999 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2000 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2001 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2002 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2003 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2004 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2005 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2006 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2007 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2008 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2009 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2010 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2011 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2012 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2013 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2014 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2015 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2016 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2017 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2018 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2019 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2020 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2021 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2022 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2023 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2024 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2025 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2026 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2027 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2028 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2029 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2030 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2031 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2032 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2033 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2034 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2035 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2036 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2037 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2038 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2039 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2040 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2041 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2042 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2043 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2044 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2045 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2046 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2047 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2048 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2049 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2050 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2051 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2052 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2053 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2054 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2055 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2056 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2057 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2058 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2059 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2060 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2061 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2062 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2063 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2064 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2065 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2066 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2067 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2068 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2069 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2070 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2071 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2072 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2073 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2074 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2075 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2076 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2077 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2078 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2079 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2080 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2081 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2082 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2083 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2084 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2085 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2086 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2087 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2088 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2089 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2090 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2091 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2092 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2093 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2094 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2095 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2096 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2097 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2098 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2099 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2100 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2101 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2102 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2103 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2104 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2105 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2106 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2107 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2108 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2109 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2110 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2111 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2112 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2113 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2114 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2115 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2116 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2117 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2118 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2119 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2120 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2121 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2122 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2123 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2124 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2125 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2126 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2127 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2128 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2129 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2130 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2131 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2132 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2133 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2134 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2135 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2136 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2137 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2138 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2139 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2140 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2141 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2142 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2143 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2144 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2145 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2146 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2147 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2148 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2149 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2150 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2151 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2152 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2153 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2154 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2155 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2156 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2157 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2158 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2159 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2160 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2161 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2162 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2163 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2164 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2165 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2166 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2167 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2168 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2169 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2170 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2171 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2172 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2173 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2174 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2175 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2176 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2177 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2178 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2179 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2180 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2181 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2182 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2183 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2184 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2185 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2186 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2187 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2188 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2189 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2190 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2191 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2192 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2193 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2194 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2195 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2196 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2197 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2198 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2199 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2200 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2201 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2202 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2203 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2204 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2205 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2206 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2207 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2208 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2209 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2210 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2211 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2212 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2213 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2214 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2215 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2216 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2217 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2218 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2219 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2220 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2221 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2222 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2223 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2224 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2225 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2226 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2227 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2228 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2229 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2230 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2231 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2232 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2233 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2234 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2235 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2236 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2237 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2238 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2239 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2240 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2241 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2242 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2243 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2244 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2245 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2246 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2247 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2248 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2249 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2250 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2251 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2252 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2253 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2254 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2255 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2256 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2257 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2258 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2259 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2260 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2261 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2262 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2263 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2264 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2265 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2266 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2267 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2268 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2269 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2270 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2271 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2272 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2273 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2274 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2275 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2276 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2277 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2278 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2279 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2280 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2281 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2282 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2283 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2284 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2285 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2286 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2287 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2288 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2289 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2290 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2291 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2292 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2293 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2294 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2295 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2296 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2297 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2298 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2299 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2300 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2301 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2302 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2303 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2304 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2305 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2306 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2307 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2308 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2309 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2310 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2311 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2312 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2313 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2314 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2315 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2316 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2317 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2318 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2319 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2320 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2321 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2322 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2323 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2324 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2325 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2326 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2327 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2328 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2329 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2330 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2331 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2332 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2333 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2334 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2335 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2336 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2337 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2338 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2339 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2340 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2341 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2342 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2343 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2344 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2345 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2346 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2347 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2348 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2349 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2350 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2351 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2352 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2353 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2354 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2355 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2356 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2357 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2358 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2359 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2360 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2361 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2362 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2363 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2364 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2365 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2366 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2367 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2368 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2369 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2370 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2371 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2372 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2373 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2374 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2375 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2376 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2377 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2378 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2379 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2380 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2381 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2382 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2383 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2384 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2385 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2386 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2387 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2388 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2389 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2390 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2391 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2392 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2393 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2394 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2395 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2396 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2397 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2398 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2399 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2400 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2401 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2402 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2403 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2404 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2405 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2406 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2407 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2408 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2409 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2410 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2411 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2412 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2413 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2414 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2415 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2416 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2417 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2418 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2419 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2420 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2421 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2422 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2423 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2424 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2425 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2426 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2427 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2428 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2429 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2430 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2431 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2432 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2433 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2434 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2435 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2436 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2437 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2438 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2439 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2440 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2441 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2442 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2443 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2444 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2445 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2446 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2447 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2448 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2449 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2450 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2451 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2452 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2453 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2454 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2455 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2456 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2457 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2458 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2459 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2460 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2461 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2462 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2463 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2464 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2465 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2466 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2467 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2468 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2469 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2470 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2471 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2472 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2473 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2474 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2475 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2476 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2477 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2478 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2479 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2480 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2481 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2482 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2483 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2484 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2485 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2486 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2487 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2488 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2489 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2490 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2491 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2492 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2493 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2494 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2495 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2496 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2497 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2498 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2499 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2500 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2501 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2502 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2503 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2504 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2505 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2506 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2507 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2508 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2509 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2510 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2511 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2512 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2513 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2514 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2515 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2516 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2517 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2518 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2519 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2520 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2521 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2522 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2523 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2524 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2525 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2526 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2527 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2528 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2529 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2530 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2531 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2532 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2533 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2534 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2535 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2536 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2537 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2538 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2539 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2540 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2541 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2542 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2543 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2544 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2545 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2546 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2547 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2548 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2549 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2550 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2551 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2552 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2553 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2554 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2555 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2556 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2557 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2558 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2559 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2560 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2561 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2562 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2563 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2564 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2565 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2566 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2567 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2568 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2569 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2570 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2571 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2572 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2573 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2574 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2575 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2576 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2577 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2578 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2579 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2580 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2581 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2582 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2583 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2584 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2585 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2586 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2587 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2588 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2589 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2590 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2591 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2592 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2593 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2594 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2595 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2596 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2597 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2598 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2599 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2600 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2601 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2602 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2603 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2604 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2605 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2606 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2607 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2608 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2609 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2610 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2611 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2612 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2613 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2614 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2615 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2616 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2617 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2618 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2619 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2620 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2621 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2622 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2623 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2624 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2625 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2626 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2627 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2628 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2629 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2630 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2631 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2632 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2633 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2634 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2635 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2636 $"FFFF FFFF FFFF FFFF"
2637};
2638
2639data 'ics#' (-16455, "Item Icon") {
2640 $"F557 D001 700E E024 9A9B 0175 9299 0162"
2641 $"923E 0001 9004 0000 9BBC 102C 8434 5AFD"
2642 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2643 $"FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF"
2644};
2645
2646data 'ics4' (-16455, "Item Icon") {
2647 $"AA3F DDDD DDDD DDAE A333 0000 0000 0C3E"
2648 $"333A 0000 000C DBEC A333 0000 0CBC 2A00"
2649 $"EDDF DDDB D2CB ECFF D00D 00CD BBBA B2D6"
2650 $"D00D 00B2 DDBB DCCB D00D 00D4 D2D2 CC2D"
2651 $"D00D 00BD CCE5 3EEC D00D 0C00 0000 CBCB"
2652 $"D00D 0000 0000 0D0D D00D 0000 0000 0D00"
2653 $"D00D ABAB ABAF 9F00 D00D 1111 11B8 9900"
2654 $"D00D 1111 1189 9F00 EDDA 8291 ABAF 9FDD"
2655};
2656
2657data 'ics8' (-16455, "Item Icon") {
2658 $"DEDC DBB3 F9FA F9FA F9FA F9FA F9FA 8FFB"
2659 $"DC23 23DB 0000 0000 0000 0000 0032 6A88"
2660 $"DB23 23DC 0000 0000 0000 F52B 3357 882B"
2661 $"DC23 23DB 0000 0000 F608 3234 33AD F600"
2662 $"FCFA F9AC F9FA F95D 0E5D 3457 8833 F1F2"
2663 $"FA00 00F9 0000 0733 825E 33AD 6432 33EF"
2664 $"F900 00FA 0000 5D5E 5D33 825D 3332 2C57"
2665 $"FA00 00F9 0000 5739 5D64 5D33 3232 335C"
2666 $"F900 00FA 00F5 5D57 F732 828E 8988 88F9"
2667 $"FA00 00F9 00F6 F600 0000 F5F6 4F5D F85D"
2668 $"F900 00FA 0000 0000 0000 0000 00FA 0056"
2669 $"FA00 00FA 0000 0000 0000 0000 00F9 0000"
2670 $"F900 00F9 8359 8359 8359 ADD1 E8EA 0000"
2671 $"FA00 00FA 0505 0505 0505 5FE5 E6E8 0000"
2672 $"F900 00F9 0505 0505 0505 7DE6 E6D1 0000"
2673 $"ACF9 FAFC 8359 8359 8359 ADD1 E8E9 FAF9"
2674};
2675
diff --git a/rbutil/rbutilApp.cpp b/rbutil/rbutilApp.cpp
index 215e9ebc8e..c30e5b4aaa 100644
--- a/rbutil/rbutilApp.cpp
+++ b/rbutil/rbutilApp.cpp
@@ -19,6 +19,7 @@
19 ****************************************************************************/ 19 ****************************************************************************/
20 20
21#include "rbutilApp.h" 21#include "rbutilApp.h"
22#include "bootloaders.h"
22 23
23GlobalVars* gv = new GlobalVars(); 24GlobalVars* gv = new GlobalVars();
24 25
@@ -30,15 +31,16 @@ bool rbutilFrmApp::OnInit()
30 31
31 wxLogVerbose(wxT("=== begin rbutilFrmApp::Oninit()")); 32 wxLogVerbose(wxT("=== begin rbutilFrmApp::Oninit()"));
32 33
34
33 gv->stdpaths = new wxStandardPaths(); 35 gv->stdpaths = new wxStandardPaths();
34 36
35 // Get application directory 37 // Get application directory
36 // DANGER! GetDataDir() doesn't portably return the application directory 38 // DANGER! GetDataDir() doesn't portably return the application directory
37 // We want to use the form below instead, but not until wxWidgets 2.8 is 39 // We want to use the form below instead, but not until wxWidgets 2.8 is
38 // released. 40 // released. *Datadir gives the wrong dir for this on Linux/Mac even on Wx2.8 *
39 gv->AppDir = gv->stdpaths->GetExecutablePath().BeforeLast(PATH_SEP_CHR); 41 gv->AppDir = gv->stdpaths->GetExecutablePath().BeforeLast(PATH_SEP_CHR);
40// buf = gv->stdpaths->GetDataDir(); buf.Append(PATH_SEP); 42 // buf = gv->stdpaths->GetDataDir(); buf.Append(PATH_SEP);
41// gv->AppDir = buf.BeforeLast(PATH_SEP_CHR).c_str(); 43 // gv->AppDir = buf.BeforeLast(PATH_SEP_CHR).c_str();
42 44
43 buf = gv->stdpaths->GetUserDataDir(); 45 buf = gv->stdpaths->GetUserDataDir();
44 if (! wxDirExists(buf) ) 46 if (! wxDirExists(buf) )
@@ -80,6 +82,7 @@ bool rbutilFrmApp::OnInit()
80 SetTopWindow(myFrame); 82 SetTopWindow(myFrame);
81 myFrame->Show(TRUE); 83 myFrame->Show(TRUE);
82 84
85 initIpodpatcher(); // reserve mem for ipodpatcher
83 wxLogVerbose(wxT("=== end rbUtilFrmApp::OnInit()")); 86 wxLogVerbose(wxT("=== end rbUtilFrmApp::OnInit()"));
84 return TRUE; 87 return TRUE;
85} 88}
@@ -92,7 +95,7 @@ int rbutilFrmApp::OnExit()
92 95
93 gv->logfile->Close(); 96 gv->logfile->Close();
94 /* Enabling this code causes the program to crash. I 97 /* Enabling this code causes the program to crash. I
95 * have no idea why. 98 * have no idea why. (possibly because deleting non existing objects ? :-) )
96 wxLog::DontCreateOnDemand(); 99 wxLog::DontCreateOnDemand();
97 // Free a bunch of structures. 100 // Free a bunch of structures.
98 delete gv->GlobalConfig; 101 delete gv->GlobalConfig;
@@ -120,15 +123,15 @@ bool rbutilFrmApp::ReadGlobalConfig(rbutilFrm* myFrame)
120 // are of course the same directory. 123 // are of course the same directory.
121 buf.Printf(wxT("%s" PATH_SEP "rbutil.ini"), gv->AppDir.c_str() ); 124 buf.Printf(wxT("%s" PATH_SEP "rbutil.ini"), gv->AppDir.c_str() );
122 125
123 if (! wxFileExists(buf) ) 126// if (! wxFileExists(buf) )
124 { 127// {
125 gv->ResourceDir = gv->stdpaths->GetResourcesDir(); 128// gv->ResourceDir = gv->stdpaths->GetResourcesDir();
126 buf.Printf(wxT("%s" PATH_SEP "rbutil.ini"), 129// buf.Printf(wxT("%s" PATH_SEP "rbutil.ini"),
127 gv->ResourceDir.c_str() ); 130// gv->ResourceDir.c_str() );
128 } else 131// } else
129 { 132// {
130 gv->ResourceDir = gv->AppDir; 133// gv->ResourceDir = gv->AppDir;
131 } 134// }
132 135
133 wxFileInputStream* cfgis = new wxFileInputStream(buf); 136 wxFileInputStream* cfgis = new wxFileInputStream(buf);
134 137
@@ -146,13 +149,33 @@ bool rbutilFrmApp::ReadGlobalConfig(rbutilFrm* myFrame)
146 gv->GlobalConfig->SetPath(wxT("/platforms")); 149 gv->GlobalConfig->SetPath(wxT("/platforms"));
147 while(gv->GlobalConfig->Read(buf.Format(wxT("platform%d"), i + 1), 150 while(gv->GlobalConfig->Read(buf.Format(wxT("platform%d"), i + 1),
148 &tmpstr)) { 151 &tmpstr)) {
149 gv->plat_id.Add(tmpstr); 152 wxString cur = tmpstr;
153 //gv->plat_id.Add(tmpstr);
150 gv->GlobalConfig->Read(buf.Format(wxT("/%s/name"), 154 gv->GlobalConfig->Read(buf.Format(wxT("/%s/name"),
151 gv->plat_id[i].c_str()), &tmpstr); 155 cur.c_str()), &tmpstr);
152 gv->plat_name.Add(tmpstr); 156 gv->plat_name.Add(tmpstr);
157 gv->GlobalConfig->Read(buf.Format(wxT("/%s/platform"),
158 cur.c_str()), &tmpstr);
159 gv->plat_id.Add(tmpstr);
153 gv->GlobalConfig->Read(buf.Format(wxT("/%s/released"), 160 gv->GlobalConfig->Read(buf.Format(wxT("/%s/released"),
154 gv->plat_id[i].c_str()), &tmpstr); 161 cur.c_str()), &tmpstr);
155 gv->plat_released.Add( (tmpstr == wxT("yes")) ? true : false ) ; 162 gv->plat_released.Add( (tmpstr == wxT("yes")) ? true : false ) ;
163 gv->GlobalConfig->Read(buf.Format(wxT("/%s/needsbootloader"),
164 cur.c_str()), &tmpstr);
165 gv->plat_needsbootloader.Add( (tmpstr == wxT("yes")) ? true : false ) ;
166 gv->GlobalConfig->Read(buf.Format(wxT("/%s/bootloadermethod"),
167 cur.c_str()), &tmpstr);
168 gv->plat_bootloadermethod.Add(tmpstr);
169 gv->GlobalConfig->Read(buf.Format(wxT("/%s/bootloadername"),
170 cur.c_str()), &tmpstr);
171 gv->plat_bootloadername.Add(tmpstr);
172 gv->GlobalConfig->Read(buf.Format(wxT("/%s/autodetect"),
173 cur.c_str()), &tmpstr);
174 gv->plat_autodetect.Add( (tmpstr == wxT("yes")) ? true : false ) ;
175 gv->GlobalConfig->Read(buf.Format(wxT("/%s/combinedname"),
176 cur.c_str()), &tmpstr);
177 gv->plat_combinedname.Add(tmpstr);
178
156 i++; 179 i++;
157 } 180 }
158 181
@@ -184,6 +207,9 @@ bool rbutilFrmApp::ReadGlobalConfig(rbutilFrm* myFrame)
184 gv->GlobalConfig->Read(wxT("prog_name"), &tmpstr); 207 gv->GlobalConfig->Read(wxT("prog_name"), &tmpstr);
185 gv->prog_name = tmpstr; 208 gv->prog_name = tmpstr;
186 209
210 gv->GlobalConfig->Read(wxT("bootloader_url"), &tmpstr);
211 gv->bootloader_url = tmpstr;
212
187#ifdef __WXMSW__ 213#ifdef __WXMSW__
188 gv->curdestdir = wxT("D:\\"); 214 gv->curdestdir = wxT("D:\\");
189#else 215#else
diff --git a/rbutil/rbutilFrm.cpp b/rbutil/rbutilFrm.cpp
index 0d56e9c5b1..738da27f2a 100644
--- a/rbutil/rbutilFrm.cpp
+++ b/rbutil/rbutilFrm.cpp
@@ -28,6 +28,8 @@
28#include "tools2_3d.xpm" 28#include "tools2_3d.xpm"
29#include "rblogo.xpm" 29#include "rblogo.xpm"
30 30
31#include "bootloaders.h"
32
31#include "wizard.xpm" 33#include "wizard.xpm"
32 34
33//---------------------------------------------------------------------------- 35//----------------------------------------------------------------------------
@@ -39,6 +41,7 @@ BEGIN_EVENT_TABLE(rbutilFrm,wxFrame)
39 EVT_BUTTON (ID_REMOVE_BTN, rbutilFrm::OnRemoveBtn) 41 EVT_BUTTON (ID_REMOVE_BTN, rbutilFrm::OnRemoveBtn)
40 EVT_BUTTON (ID_FONT_BTN, rbutilFrm::OnFontBtn) 42 EVT_BUTTON (ID_FONT_BTN, rbutilFrm::OnFontBtn)
41 EVT_BUTTON (ID_BOOTLOADER_BTN, rbutilFrm::OnBootloaderBtn) 43 EVT_BUTTON (ID_BOOTLOADER_BTN, rbutilFrm::OnBootloaderBtn)
44 EVT_BUTTON (ID_BOOTLOADERREMOVE_BTN, rbutilFrm::OnBootloaderRemoveBtn)
42 45
43 EVT_CLOSE(rbutilFrm::rbutilFrmClose) 46 EVT_CLOSE(rbutilFrm::rbutilFrmClose)
44 EVT_MENU(ID_FILE_EXIT, rbutilFrm::OnFileExit) 47 EVT_MENU(ID_FILE_EXIT, rbutilFrm::OnFileExit)
@@ -116,8 +119,7 @@ void rbutilFrm::CreateGUIControls(void)
116 wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5); 119 wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5);
117 120
118 WxStaticText2 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT2, 121 WxStaticText2 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT2,
119 _("Install Rockbox on your audio player"), wxPoint(70,16), 122 _("Install Rockbox on your audio player"));
120 wxSize(175,17), 0, wxT("WxStaticText2"));
121 WxFlexGridSizer1->Add(WxStaticText2,0, 123 WxFlexGridSizer1->Add(WxStaticText2,0,
122 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5); 124 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5);
123 125
@@ -149,11 +151,24 @@ void rbutilFrm::CreateGUIControls(void)
149 wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5); 151 wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5);
150 152
151 WxStaticText3 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT3, 153 WxStaticText3 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT3,
152 _("Remove Rockbox from your audio player"), wxPoint(60,66), 154 _("Remove Rockbox from your audio player"));
153 wxSize(196,17), 0, wxT("WxStaticText3"));
154 WxFlexGridSizer1->Add(WxStaticText3,0, 155 WxFlexGridSizer1->Add(WxStaticText3,0,
155 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5); 156 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5);
156 157
158 wxBitmap WxBitmapButton4_BITMAP (uninstall_3d_xpm);
159 WxBitmapButton4 = new wxBitmapButton(WxPanel1, ID_BOOTLOADERREMOVE_BTN,
160 WxBitmapButton4_BITMAP, wxPoint(0,0), wxSize(64,54),
161 wxRAISED_BORDER | wxBU_AUTODRAW, wxDefaultValidator,
162 wxT("WxBitmapButton4"));
163 WxBitmapButton4->SetToolTip(_("Uninstall Bootloader"));
164 WxFlexGridSizer1->Add(WxBitmapButton4,0,
165 wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxALL,5);
166
167 WxStaticText4 = new wxStaticText(WxPanel1, ID_WXSTATICTEXT4,
168 _("Remove Rockbox Bootloader from your audio player"));
169 WxFlexGridSizer1->Add(WxStaticText4,0,
170 wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL | wxALL,5);
171
157 WxMenuBar1 = new wxMenuBar(); 172 WxMenuBar1 = new wxMenuBar();
158 wxMenu *ID_FILE_MENU_Mnu_Obj = new wxMenu(0); 173 wxMenu *ID_FILE_MENU_Mnu_Obj = new wxMenu(0);
159 WxMenuBar1->Append(ID_FILE_MENU_Mnu_Obj, _("&File")); 174 WxMenuBar1->Append(ID_FILE_MENU_Mnu_Obj, _("&File"));
@@ -251,7 +266,10 @@ void rbutilFrm::OnFileWipeCache(wxCommandEvent& event)
251 266
252 if (! rm_rf(cacheloc) ) 267 if (! rm_rf(cacheloc) )
253 { 268 {
254 MESG_DIALOG(_("Local download cache has been deleted.")); 269 wxMessageDialog* msg = new wxMessageDialog(this, _("Local download cache has been deleted.")
270 ,"Cache deletion", wxOK |wxICON_INFORMATION);
271 msg->ShowModal();
272 delete msg;
255 } 273 }
256 else { 274 else {
257 MESG_DIALOG(_("Errors occured deleting the local download cache.")); 275 MESG_DIALOG(_("Errors occured deleting the local download cache."));
@@ -260,16 +278,207 @@ void rbutilFrm::OnFileWipeCache(wxCommandEvent& event)
260 wxMkdir(cacheloc, 0777); 278 wxMkdir(cacheloc, 0777);
261} 279}
262 280
281void rbutilFrm::OnBootloaderRemoveBtn(wxCommandEvent& event)
282{
283 wxLogVerbose("=== begin rbutilFrm::OnBootloaderRemoveBtn(event)");
284
285 wxWizard *wizard = new wxWizard(this, wxID_ANY,
286 _("Rockbox Bootloader Uninstallation Wizard"),
287 wxBitmap(wizard_xpm),
288 wxDefaultPosition,
289 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
290 wxBootPlatformPage* page1 = new wxBootPlatformPage(wizard);
291 wxBootLocationPage* page2 = new wxBootLocationPage(wizard); // Only one of these pages are shown
292 wxIpodLocationPage* page3 = new wxIpodLocationPage(wizard); // depending on Device selected
293
294 page1->SetNext(page2);
295 page2->SetPrev(page1);
296 page2->SetNext(page3);
297 page3->SetPrev(page2);
298
299 wizard->GetPageAreaSizer()->Add(page1);
300
301
302 if (wizard->RunWizard(page1) )
303 {
304 // uninstall the bootloader
305 if(gv->curbootloadermethod == "ipodpatcher")
306 {
307
308 if(ipodpatcher(BOOTLOADER_REM))
309 {
310 wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been uninstalled.")
311 ,"Uninstallation", wxOK |wxICON_INFORMATION);
312 msg->ShowModal();
313 delete msg;
314 }
315 else
316 {
317 MESG_DIALOG(_("The Uninstallation has failed.") );
318 }
319 }
320 else if(gv->curbootloadermethod == "gigabeatf")
321 {
322
323 if(gigabeatf(BOOTLOADER_REM))
324 {
325 wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been uninstalled.")
326 ,"Uninstallation", wxOK |wxICON_INFORMATION);
327 msg->ShowModal();
328 delete msg;
329 }
330 else
331 MESG_DIALOG(_("The Uninstallation has failed.") );
332 }
333 else if(gv->curbootloadermethod == "h10")
334 {
335 if(h10(BOOTLOADER_REM))
336 {
337 wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been uninstalled.")
338 ,"Uninstallation", wxOK |wxICON_INFORMATION);
339 msg->ShowModal();
340 delete msg;
341 }
342 else
343 MESG_DIALOG(_("The Uninstallation has failed.") );
344
345 }
346 else if(gv->curbootloadermethod == "iaudio" )
347 {
348 wxMessageDialog* msg = new wxMessageDialog(this, _("To uninstall the Bootloader on this Device,\n"
349 "you need to download and install an Original Firmware from the Manufacturer.")
350 ,"Uninstallation", wxOK |wxICON_INFORMATION);
351 msg->ShowModal();
352 delete msg;
353 }
354 else if(gv->curbootloadermethod == "fwpatcher" )
355 {
356 wxMessageDialog* msg = new wxMessageDialog(this, _("To uninstall the Bootloader on this Device,\n"
357 "you need to download and install an original Firmware from the Manufacturer.\n"
358 "To do this, you need to boot into the original Firmware.")
359 ,"Uninstallation", wxOK |wxICON_INFORMATION);
360 msg->ShowModal();
361 delete msg;
362 }
363 else
364 {
365 MESG_DIALOG(_("Unsupported Bootloader Method") );
366 }
367 }
368 else
369 {
370 MESG_DIALOG(_("The bootloader Uninstallation wizard was cancelled") );
371 }
372
373 wxLogVerbose("=== end rbutilFrm::OnBootloaderRemoveBtn");
374}
263 375
264void rbutilFrm::OnBootloaderBtn(wxCommandEvent& event) 376void rbutilFrm::OnBootloaderBtn(wxCommandEvent& event)
265{ 377{
266 if (!wxLaunchDefaultBrowser(wxT( 378 wxLogVerbose("=== begin rbutilFrm::OnBootloaderBtn(event)");
267 "http://www.rockbox.org/twiki/bin/view/Main/" 379
268 "DocsIndex#Rockbox_Installation_Instruction") ) ) 380 wxWizard *wizard = new wxWizard(this, wxID_ANY,
381 _("Rockbox Installation Wizard"),
382 wxBitmap(wizard_xpm),
383 wxDefaultPosition,
384 wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
385 wxBootPlatformPage* page1 = new wxBootPlatformPage(wizard);
386 wxFirmwareLocationPage* page2 = new wxFirmwareLocationPage(wizard); //this page is optional
387 wxBootLocationPage* page3 = new wxBootLocationPage(wizard); // Only one of these pages are shown
388 wxIpodLocationPage* page4 = new wxIpodLocationPage(wizard); // depending on Device selected
389
390 page1->SetNext(page2);
391 page2->SetPrev(page1);
392 page2->SetNext(page3);
393 page3->SetPrev(page2);
394 page3->SetNext(page4);
395 page4->SetPrev(page3);
396
397 wizard->GetPageAreaSizer()->Add(page1);
398
399 if (wizard->RunWizard(page1) )
400 {
401 // start installation depending on player
402 if(gv->curbootloadermethod == "ipodpatcher")
403 {
404
405 if(ipodpatcher(BOOTLOADER_ADD))
406 {
407 wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been installed on your device.")
408 ,"Installation", wxOK |wxICON_INFORMATION);
409 msg->ShowModal();
410 delete msg;
411 }
412 else
413 {
414 MESG_DIALOG(_("The installation has failed.") );
415 }
416 }
417 else if(gv->curbootloadermethod == "gigabeatf")
418 {
419
420 if(gigabeatf(BOOTLOADER_ADD))
421 {
422 wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been installed on your device.")
423 ,"Installation", wxOK |wxICON_INFORMATION);
424 msg->ShowModal();
425 delete msg;
426 }
427 else
428 MESG_DIALOG(_("The installation has failed.") );
429 }
430 else if(gv->curbootloadermethod == "iaudio" )
431 {
432 if(iaudiox5(BOOTLOADER_ADD))
433 {
434 wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been installed on your device.\n"
435 "Now turn OFF your Device, unplug USB,and insert Charger\n"
436 "Your Device will automatically upgrade the flash with the Rockbox bootloader")
437 ,"Installation", wxOK |wxICON_INFORMATION);
438 msg->ShowModal();
439 delete msg;
440 }
441 else
442 MESG_DIALOG(_("The installation has failed.") );
443 }
444 else if(gv->curbootloadermethod == "fwpatcher")
445 {
446 if(fwpatcher(BOOTLOADER_ADD))
447 {
448 wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been patched and copied on your device.\n"
449 "Now use the Firmware upgrade option of your Device\n")
450 ,"Installation", wxOK |wxICON_INFORMATION);
451 msg->ShowModal();
452 delete msg;
453 }
454 else
455 MESG_DIALOG(_("The installation has failed.") );
456 }
457 else if(gv->curbootloadermethod == "h10")
458 {
459 if(h10(BOOTLOADER_ADD))
460 {
461 wxMessageDialog* msg = new wxMessageDialog(this, _("The Bootloader has been patched and copied on your device.\n"
462 "Now use the Firmware upgrade option of your Device\n")
463 ,"Installation", wxOK |wxICON_INFORMATION);
464 msg->ShowModal();
465 delete msg;
466 }
467 else
468 MESG_DIALOG(_("The installation has failed.") );
469 }
470 else
471 {
472 MESG_DIALOG(_("Unsupported Bootloader Method") );
473 }
474 }
475 else
269 { 476 {
270 ERR_DIALOG(_("Unable to launch external browser"), 477 MESG_DIALOG(_("The bootloader installation wizard was cancelled") );
271 _("Boot loader install instructions."));
272 } 478 }
479
480 wxLogVerbose("=== end rbutilFrm::OnBootloaderBtn");
481
273} 482}
274 483
275void rbutilFrm::OnInstallBtn(wxCommandEvent& event) 484void rbutilFrm::OnInstallBtn(wxCommandEvent& event)
@@ -378,7 +587,10 @@ void rbutilFrm::OnInstallBtn(wxCommandEvent& event)
378 587
379 if ( !UnzipFile(dest, gv->curdestdir, true) ) 588 if ( !UnzipFile(dest, gv->curdestdir, true) )
380 { 589 {
381 MESG_DIALOG(_("Rockbox has been installed on your device.") ); 590 wxMessageDialog* msg = new wxMessageDialog(this, _("Rockbox has been installed on your device.")
591 ,"Installation", wxOK |wxICON_INFORMATION);
592 msg->ShowModal();
593 delete msg;
382 } else 594 } else
383 { 595 {
384 wxRemoveFile(dest); 596 wxRemoveFile(dest);
@@ -472,7 +684,10 @@ void rbutilFrm::OnFontBtn(wxCommandEvent& event)
472 684
473 if ( !UnzipFile(dest, gv->curdestdir, true) ) 685 if ( !UnzipFile(dest, gv->curdestdir, true) )
474 { 686 {
475 MESG_DIALOG(_("The Rockbox fonts have been installed on your device.") ); 687 wxMessageDialog* msg = new wxMessageDialog(this, _("The Rockbox fonts have been installed on your device.")
688 ,"Installation", wxOK |wxICON_INFORMATION);
689 msg->ShowModal();
690 delete msg;
476 } else 691 } else
477 { 692 {
478 wxRemoveFile(dest); 693 wxRemoveFile(dest);
@@ -511,7 +726,11 @@ void rbutilFrm::OnRemoveBtn(wxCommandEvent& event)
511 _("The uninstallation wizard was cancelled or completed with " 726 _("The uninstallation wizard was cancelled or completed with "
512 "some errors.") ); 727 "some errors.") );
513 } else { 728 } else {
514 MESG_DIALOG(_("The uninstall wizard completed successfully") ); 729 wxMessageDialog* msg = new wxMessageDialog(this, _("The uninstall wizard completed successfully\n"
730 "Depending on which Device you own, you also have to uninstall the Bootloader")
731 ,"Uninstallation", wxOK |wxICON_INFORMATION);
732 msg->ShowModal();
733 delete msg;
515 } 734 }
516 } else 735 } else
517 { 736 {
@@ -542,7 +761,10 @@ void rbutilFrm::OnPortableInstall(wxCommandEvent& event)
542 { 761 {
543 if ( InstallRbutil(gv->curdestdir) ) 762 if ( InstallRbutil(gv->curdestdir) )
544 { 763 {
545 MESG_DIALOG(_("The Rockbox Utility has been installed on your device.") ); 764 wxMessageDialog* msg = new wxMessageDialog(this, _("The Rockbox Utility has been installed on your device.")
765 ,"Installation", wxOK |wxICON_INFORMATION);
766 msg->ShowModal();
767 delete msg;
546 } else 768 } else
547 { 769 {
548 ERR_DIALOG(_("Installation failed"), _("Portable Install")); 770 ERR_DIALOG(_("Installation failed"), _("Portable Install"));
diff --git a/rbutil/rbutilFrm.h b/rbutil/rbutilFrm.h
index b0332d0c74..9e75be3851 100644
--- a/rbutil/rbutilFrm.h
+++ b/rbutil/rbutilFrm.h
@@ -58,11 +58,13 @@ public:
58public: 58public:
59 wxMenuBar *WxMenuBar1; 59 wxMenuBar *WxMenuBar1;
60 wxStaticText *WxStaticText3; 60 wxStaticText *WxStaticText3;
61 wxStaticText *WxStaticText4;
61 wxBitmapButton *WxBitmapButton2; 62 wxBitmapButton *WxBitmapButton2;
62 wxStaticText *WxStaticText2; 63 wxStaticText *WxStaticText2;
63 wxBitmapButton *WxBitmapButton1; 64 wxBitmapButton *WxBitmapButton1;
64 wxBitmapButton *WxBitmapButton3; 65 wxBitmapButton *WxBitmapButton3;
65 wxBitmapButton *WxBitmapButton4; 66 wxBitmapButton *WxBitmapButton4;
67 wxBitmapButton *WxBitmapButton5;
66 wxFlexGridSizer *WxFlexGridSizer1; 68 wxFlexGridSizer *WxFlexGridSizer1;
67 wxStaticBoxSizer *WxStaticBoxSizer3; 69 wxStaticBoxSizer *WxStaticBoxSizer3;
68 wxStaticBitmap *WxStaticBitmap1; 70 wxStaticBitmap *WxStaticBitmap1;
@@ -78,7 +80,9 @@ public:
78 ID_PORTABLE_INSTALL = 1037, 80 ID_PORTABLE_INSTALL = 1037,
79 81
80 ID_WXSTATICTEXT3 = 1032, 82 ID_WXSTATICTEXT3 = 1032,
81 ID_REMOVE_BTN = 1031, 83 ID_WXSTATICTEXT4 = 1032,
84 ID_REMOVE_BTN = 1039,
85 ID_BOOTLOADERREMOVE_BTN = 1038,
82 ID_WXSTATICTEXT2 = 1029, 86 ID_WXSTATICTEXT2 = 1029,
83 ID_INSTALL_BTN = 1028, 87 ID_INSTALL_BTN = 1028,
84 ID_WXSTATICBITMAP1 = 1053, 88 ID_WXSTATICBITMAP1 = 1053,
@@ -100,6 +104,7 @@ public:
100 void OnFontBtn(wxCommandEvent& event); 104 void OnFontBtn(wxCommandEvent& event);
101 void OnBootloaderBtn(wxCommandEvent& event); 105 void OnBootloaderBtn(wxCommandEvent& event);
102 void OnPortableInstall(wxCommandEvent& event); 106 void OnPortableInstall(wxCommandEvent& event);
107 void OnBootloaderRemoveBtn(wxCommandEvent& event);
103 108
104}; 109};
105 110
diff --git a/rbutil/wizard_pages.cpp b/rbutil/wizard_pages.cpp
index 7cd38cf004..2c4c609271 100644
--- a/rbutil/wizard_pages.cpp
+++ b/rbutil/wizard_pages.cpp
@@ -19,6 +19,85 @@
19 ****************************************************************************/ 19 ****************************************************************************/
20 20
21#include "wizard_pages.h" 21#include "wizard_pages.h"
22#include "bootloaders.h"
23
24wxBootPlatformPage::wxBootPlatformPage(wxWizard *parent) : wxWizardPageSimple(parent)
25{
26 wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
27
28 wxStaticText* WxStaticText1 = new wxStaticText(this, wxID_ANY,
29 _("Please select the model of audio device that you would like to"
30 "\ninstall the Rockbox Bootloader on from the list below:"));
31 WxBoxSizer1->Add(WxStaticText1,0,wxGROW | wxALL,5);
32
33 wxArrayString arrayStringFor_WxListBox1;
34 for (unsigned int i=0; i< gv->plat_name.GetCount(); i++) {
35 if (gv->plat_needsbootloader[i])
36 {
37 if(gv->plat_autodetect[i])
38 {
39 if(arrayStringFor_WxListBox1.Index(gv->plat_combinedname[i]) == wxNOT_FOUND)
40 arrayStringFor_WxListBox1.Add(gv->plat_combinedname[i]);
41 }
42 else
43 {
44 arrayStringFor_WxListBox1.Add(gv->plat_name[i]);
45 }
46 }
47 }
48
49 BootPlatformListBox = new wxListBox(this, wxID_ANY, wxDefaultPosition,
50 wxDefaultSize, arrayStringFor_WxListBox1, wxLB_SINGLE);
51 WxBoxSizer1->Add(BootPlatformListBox,0,wxGROW | wxALL,5);
52
53 SetSizer(WxBoxSizer1);
54 WxBoxSizer1->Fit(this);
55
56 for (unsigned int i=0; i< gv->plat_id.GetCount(); i++) {
57 if (gv->plat_id[i] == gv->curplat) BootPlatformListBox->SetSelection(i);
58 }
59
60}
61
62wxWizardPage * wxBootPlatformPage::GetNext() const
63{
64 if(gv->curbootloadermethod != "fwpatcher"&& gv->curbootloadermethod != "ipodpatcher")
65 {
66 if(wxWizardPageSimple::GetNext()->GetNext() != NULL) // not iriver hx0 and ipod, skip one page
67 return wxWizardPageSimple::GetNext()->GetNext();
68 }
69 else if(gv->curbootloadermethod == "ipodpatcher")
70 {
71 if(wxWizardPageSimple::GetNext()->GetNext() != NULL)
72 if(wxWizardPageSimple::GetNext()->GetNext()->GetNext() != NULL)
73 return wxWizardPageSimple::GetNext()->GetNext()->GetNext(); //ipod, skip 2 pages
74 else
75 return wxWizardPageSimple::GetNext()->GetNext(); //ipod, skip 1 page (for uninstallation)
76 }
77
78 // all others , no skip
79 return wxWizardPageSimple::GetNext();
80}
81
82bool wxBootPlatformPage::TransferDataFromWindow()
83{
84 if (BootPlatformListBox->GetSelection() == wxNOT_FOUND )
85 {
86 WARN_DIALOG(_("You must select an audio device type before proceeding"),
87 _("Select Platform"));
88 return false;
89 } else
90 {
91 int idx = gv->plat_name.Index(BootPlatformListBox->GetStringSelection());
92 if(idx == wxNOT_FOUND) idx =gv->plat_combinedname.Index(BootPlatformListBox->GetStringSelection());
93 gv->curplatnum = idx;
94 gv->curplat = gv->plat_id[gv->curplatnum];
95 gv->curbootloadermethod = gv->plat_bootloadermethod[gv->curplatnum];
96 gv->curbootloader = gv->plat_bootloadername[gv->curplatnum];
97
98 return true;
99 }
100}
22 101
23wxPlatformPage::wxPlatformPage(wxWizard *parent) : wxWizardPageSimple(parent) 102wxPlatformPage::wxPlatformPage(wxWizard *parent) : wxWizardPageSimple(parent)
24{ 103{
@@ -56,8 +135,265 @@ bool wxPlatformPage::TransferDataFromWindow()
56 } 135 }
57} 136}
58 137
138BEGIN_EVENT_TABLE(wxIpodLocationPage,wxWizardPageSimple)
139 EVT_BUTTON (ID_IPODLOCATION_BTN, wxIpodLocationPage::OnIpodLocationBtn)
140 EVT_WIZARD_PAGE_CHANGING(wxID_ANY, wxIpodLocationPage::OnWizardPageChanging)
141END_EVENT_TABLE();
142
143wxIpodLocationPage::wxIpodLocationPage(wxWizard* parent) : wxWizardPageSimple(parent)
144{
145
146 wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
147
148 // Header text
149 IpodLocationLabel = new wxStaticText(this, wxID_ANY,
150 wxT("Rockbox utility needs to know the device where your ipod\n"
151 "device is located on your computer. Rockbox utility\n"
152 "has detected the following location:"));
153 WxBoxSizer1->Add(IpodLocationLabel,0,wxGROW | wxALL, 5);
154
155 // device location
156 wxBoxSizer* WxBoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
157 WxBoxSizer1->Add(WxBoxSizer3,0,
158 wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5);
159
160 IpodLocationText = new wxStaticText(this, wxID_ANY, "",
161 wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
162 WxBoxSizer3->Add(IpodLocationText,1,
163 wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5);
164
165 IpodLocationBtn = new wxButton(this, ID_IPODLOCATION_BTN, wxT("Scan"),
166 wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator,
167 wxT("IpodLocationBtn"));
168 IpodLocationBtn->SetToolTip(wxT("Scan for your Ipod"));
169 WxBoxSizer3->Add(IpodLocationBtn,0,wxALIGN_CENTER_VERTICAL | wxALL, 5);
170
171 // Extra text
172 IpodLocationExtraText = new wxStaticText(this,wxID_ANY, wxT(""));
173 WxBoxSizer1->Add(IpodLocationExtraText,0,wxGROW | wxALL, 5);
174
175 SetSizer(WxBoxSizer1);
176 WxBoxSizer1->Fit(this);
177}
178
179wxWizardPage* wxIpodLocationPage::GetPrev() const
180{
181 if(gv->curbootloadermethod == "ipodpatcher") //if ipod, skip previous
182 {
183 if(wxWizardPageSimple::GetPrev()->GetPrev() != NULL)
184 return wxWizardPageSimple::GetPrev()->GetPrev();
185
186 }
187}
188
189void wxIpodLocationPage::OnWizardPageChanging(wxWizardEvent& event)
190{
191 if(event.GetDirection()) // going forwards in the Wizard
192 {
193 if(gv->curbootloadermethod=="ipodpatcher")
194 {
195 if(IpodLocationText->GetLabel() == "no Ipod found" ||
196 IpodLocationText->GetLabel() =="More than 1 Ipod found" ||
197 IpodLocationText->GetLabel() =="")
198 {
199 WARN_DIALOG(_("No valid ipod found!"), _("Select Location"));
200 event.Veto(); //stop pagechanging
201 }
202 }
203 }
204}
205
206void wxIpodLocationPage::OnIpodLocationBtn(wxCommandEvent& event)
207{
208 wxLogVerbose("=== begin wxIpodLocationPage::OnIpodLocationBtn");
209 struct ipod_t ipod;
210 int n = ipod_scan(&ipod);
211
212 gv->curbootloader="bootloader-";
213 gv->curbootloader.Append(ipod.targetname);
214 if(n == 0)
215 IpodLocationText->SetLabel("no Ipod found");
216 else if( n==1)
217 IpodLocationText->SetLabel(ipod.modelstr);
218 else
219 IpodLocationText->SetLabel("More than 1 Ipod found");
220
221 if(ipod.macpod)
222 IpodLocationExtraText->SetLabel("This Ipod is a Mac formated Ipod\n"
223 "Rockbox will not work on this.\n"
224 "You have to convert it first to Fat32");
225 wxLogVerbose("=== end wxIpodLocationPage::OnIpodLocationBtn");
226
227}
228
229BEGIN_EVENT_TABLE(wxBootLocationPage,wxWizardPageSimple)
230 EVT_BUTTON (ID_BOOTLOCATION_BTN, wxBootLocationPage::OnBootLocationBtn)
231 EVT_WIZARD_PAGE_CHANGING(wxID_ANY, wxBootLocationPage::OnWizardPageChanging)
232END_EVENT_TABLE();
233
234wxBootLocationPage::wxBootLocationPage(wxWizard* parent) : wxWizardPageSimple(parent)
235 {
236
237 wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
238
239 // Header text
240 BootLocationLabel = new wxStaticText(this, wxID_ANY,
241 wxT("Rockbox utility needs to know the folder where your audio\n"
242 "device is located on your computer. Currently Rockbox utility\n"
243 "is configured to use the following location:"));
244 WxBoxSizer1->Add(BootLocationLabel,0,wxGROW | wxALL, 5);
245
246 // device location
247 wxBoxSizer* WxBoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
248 WxBoxSizer1->Add(WxBoxSizer3,0,
249 wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5);
250
251 if (gv->curdestdir == wxT("")) gv->curdestdir = _("<none>");
252 BootLocationText = new wxStaticText(this, wxID_ANY, gv->curdestdir,
253 wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
254 WxBoxSizer3->Add(BootLocationText,1,
255 wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5);
256
257 BootLocationBtn = new wxButton(this, ID_BOOTLOCATION_BTN, wxT("Change"),
258 wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator,
259 wxT("BootLocationBtn"));
260 BootLocationBtn->SetToolTip(wxT("Select the location of your audio device"));
261 WxBoxSizer3->Add(BootLocationBtn,0,wxALIGN_CENTER_VERTICAL | wxALL, 5);
262
263 SetSizer(WxBoxSizer1);
264 WxBoxSizer1->Fit(this);
265}
266
267wxWizardPage* wxBootLocationPage::GetPrev() const
268{
269 if(gv->curbootloadermethod != "fwpatcher")
270 {
271 if(wxWizardPageSimple::GetPrev()->GetPrev() != NULL)
272 return wxWizardPageSimple::GetPrev()->GetPrev();
273
274 }
275
276 return wxWizardPageSimple::GetPrev();
277}
278
279wxWizardPage* wxBootLocationPage::GetNext() const
280{
281 if(gv->curbootloadermethod == "ipodpatcher")
282 {
283 return wxWizardPageSimple::GetNext(); // if ipod then this is not the last page
284 }
285 else return NULL; // else this is the last page
286}
287
288void wxBootLocationPage::OnWizardPageChanging(wxWizardEvent& event)
289{
290 if(event.GetDirection()) // going forwards in the Wizard
291 {
292 if(!wxDirExists(BootLocationText->GetLabel()))
293 {
294 WARN_DIALOG(_("You have not selected a valid location for your audio "
295 "device"), _("Select Location"));
296 event.Veto();
297 }
298
299 }
300}
301
302bool wxBootLocationPage::TransferDataFromWindow()
303{
304 gv->curdestdir = BootLocationText->GetLabel();
305 return true;
306
307}
308
309
310void wxBootLocationPage::OnBootLocationBtn(wxCommandEvent& event)
311{
312 const wxString& temp = wxDirSelector(
313 _("Please select the location of your audio device"), gv->curdestdir);
314 wxLogVerbose("=== begin wxBootLocationPage::OnBootLocationBtn(event)");
315 if (!temp.empty())
316 {
317 BootLocationText->SetLabel(temp);
318 }
319 wxLogVerbose("=== end wxBootLocationPage::OnBootLocationBtn");
320
321}
322
323
324BEGIN_EVENT_TABLE(wxFirmwareLocationPage,wxWizardPageSimple)
325 EVT_BUTTON (ID_FIRMWARELOCATION_BTN, wxFirmwareLocationPage::OnFirmwareFilenameBtn)
326 EVT_WIZARD_PAGE_CHANGING(wxID_ANY, wxFirmwareLocationPage::OnWizardPageChanging)
327END_EVENT_TABLE();
328
329wxFirmwareLocationPage::wxFirmwareLocationPage(wxWizard* parent) : wxWizardPageSimple(parent)
330{
331
332 wxBoxSizer* WxBoxSizer1 = new wxBoxSizer(wxVERTICAL);
333
334 // Header text
335 FirmwareLocationText = new wxStaticText(this, wxID_ANY,
336 wxT("For this step Rockbox Utility needs an original Firmware.\n"
337 "You can download this from the Manufacturers Website."));
338 WxBoxSizer1->Add(FirmwareLocationText,0,wxGROW | wxALL, 5);
339
340 // Filename text
341 wxBoxSizer* WxBoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
342 WxBoxSizer1->Add(WxBoxSizer4,0,
343 wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5);
344
345 FirmwareLocationFilename = new wxStaticText(this, wxID_ANY, gv->curfirmware,
346 wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
347 WxBoxSizer4->Add(FirmwareLocationFilename,1,
348 wxGROW | wxALIGN_CENTER_VERTICAL | wxALL, 5);
349
350 // Button
351 FirmwareLocationBtn = new wxButton(this, ID_FIRMWARELOCATION_BTN, wxT("Explore"),
352 wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator,
353 wxT("FirmwareLocationBtn"));
354 FirmwareLocationBtn->SetToolTip(wxT("Select the location of the downloaded Firmware"));
355 WxBoxSizer4->Add(FirmwareLocationBtn,0,wxALIGN_CENTER_VERTICAL | wxALL, 5);
356
357
358 SetSizer(WxBoxSizer1);
359 WxBoxSizer1->Fit(this);
360}
361
362void wxFirmwareLocationPage::OnWizardPageChanging(wxWizardEvent& event)
363{
364 if(event.GetDirection()) // going forwards in the Wizard
365 {
366 if( !wxFileExists(gv->curfirmware))
367 {
368 WARN_DIALOG(_("You have not selected a valid location for the firmware "
369 "file"), _("Select File"));
370 event.Veto();
371 }
372 }
373
374}
375
376void wxFirmwareLocationPage::OnFirmwareFilenameBtn(wxCommandEvent& event)
377{
378 wxString temp = wxFileSelector(
379 _("Please select the location of the original Firmware"), gv->curdestdir,"","","*.hex");
380 wxLogVerbose("=== begin wxFirmwareLocationPage::OnFirmwareFilenameBtn(event)");
381 if (!temp.empty())
382 {
383 gv->curfirmware=temp;
384 if(temp.Length() > 30)
385 {
386 temp.Remove(0, temp.Length()-30);
387 temp.Prepend("...");
388 }
389 FirmwareLocationFilename->SetLabel(temp);
390 }
391 wxLogVerbose("=== end wxFirmwareLocationPage::OnFirmwareFilenameBtn");
392}
393
59BEGIN_EVENT_TABLE(wxLocationPage,wxWizardPageSimple) 394BEGIN_EVENT_TABLE(wxLocationPage,wxWizardPageSimple)
60 EVT_BUTTON (ID_LOCATION_BTN, wxLocationPage::OnLocationBtn) 395 EVT_BUTTON (ID_LOCATION_BTN, wxLocationPage::OnLocationBtn)
396 EVT_WIZARD_PAGE_CHANGING(wxID_ANY, wxLocationPage::OnWizardPageChanging)
61END_EVENT_TABLE(); 397END_EVENT_TABLE();
62 398
63wxLocationPage::wxLocationPage(wxWizard* parent) : wxWizardPageSimple(parent) 399wxLocationPage::wxLocationPage(wxWizard* parent) : wxWizardPageSimple(parent)
@@ -90,18 +426,24 @@ wxLocationPage::wxLocationPage(wxWizard* parent) : wxWizardPageSimple(parent)
90 WxBoxSizer1->Fit(this); 426 WxBoxSizer1->Fit(this);
91} 427}
92 428
93bool wxLocationPage::TransferDataFromWindow() 429
430void wxLocationPage::OnWizardPageChanging(wxWizardEvent& event)
94{ 431{
95 if ( wxDirExists(LocationText->GetLabel() ) ) 432 if(event.GetDirection()) // going forwards in the Wizard
96 { 433 {
97 gv->curdestdir = LocationText->GetLabel(); 434 if(!wxDirExists(LocationText->GetLabel()))
98 return true; 435 {
99 } else 436 WARN_DIALOG(_("You have not selected a valid location for your audio "
100 {
101 WARN_DIALOG(_("You have not selected a valid location for your audio "
102 "device"), _("Select Location")); 437 "device"), _("Select Location"));
103 return false; 438 event.Veto();
104 } 439 }
440 }
441}
442
443bool wxLocationPage::TransferDataFromWindow()
444{
445 gv->curdestdir = LocationText->GetLabel();
446 return true;
105} 447}
106 448
107void wxLocationPage::OnLocationBtn(wxCommandEvent& event) 449void wxLocationPage::OnLocationBtn(wxCommandEvent& event)
diff --git a/rbutil/wizard_pages.h b/rbutil/wizard_pages.h
index d0fd4459e0..1b6dc5be78 100644
--- a/rbutil/wizard_pages.h
+++ b/rbutil/wizard_pages.h
@@ -24,6 +24,96 @@
24 24
25#include "rbutil.h" 25#include "rbutil.h"
26 26
27class wxBootPlatformPage : public wxWizardPageSimple
28{
29public:
30 wxBootPlatformPage(wxWizard *parent);
31 virtual bool TransferDataFromWindow(void);
32 virtual wxWizardPage *GetNext() const;
33 void SetNext(wxWizardPage * next) {wxWizardPageSimple::SetNext(next); my_next = next;}
34
35public:
36 wxListBox* BootPlatformListBox;
37 wxWizardPage *my_next;
38};
39
40class wxIpodLocationPage : public wxWizardPageSimple
41{
42private:
43 DECLARE_EVENT_TABLE()
44
45public:
46 enum {
47 ID_IPODLOCATION_BTN = 1000,
48 };
49public:
50 wxIpodLocationPage(wxWizard* parent);
51 void OnIpodLocationBtn(wxCommandEvent& event);
52 void OnWizardPageChanging(wxWizardEvent& event);
53 virtual wxWizardPage *GetPrev() const;
54 void SetPrev(wxWizardPage * prev) {wxWizardPageSimple::SetPrev(prev); my_prev = prev;}
55
56private:
57 wxStaticText* IpodLocationText;
58 wxStaticText* IpodLocationLabel;
59 wxStaticText* IpodLocationExtraText;
60 wxButton* IpodLocationBtn;
61 wxWizardPage *my_prev;
62};
63
64
65
66class wxBootLocationPage : public wxWizardPageSimple
67{
68private:
69 DECLARE_EVENT_TABLE()
70
71public:
72 enum {
73 ID_BOOTLOCATION_BTN = 1000,
74 };
75
76public:
77 wxBootLocationPage(wxWizard* parent);
78 virtual bool TransferDataFromWindow(void);
79 void OnBootLocationBtn(wxCommandEvent& event);
80 void OnPageShown(wxWizardEvent& event);
81 void OnWizardPageChanging(wxWizardEvent& event);
82 virtual wxWizardPage *GetPrev() const;
83 virtual wxWizardPage *GetNext() const;
84 void SetPrev(wxWizardPage * prev) {wxWizardPageSimple::SetPrev(prev); my_prev = prev;}
85
86private:
87 wxStaticText* BootLocationText;
88 wxStaticText* BootLocationLabel;
89 wxButton* BootLocationBtn;
90 wxWizardPage *my_prev;
91
92};
93
94class wxFirmwareLocationPage : public wxWizardPageSimple
95{
96 private:
97 DECLARE_EVENT_TABLE()
98
99public:
100 enum {
101 ID_FIRMWARELOCATION_BTN = 1000,
102 };
103
104public:
105 wxFirmwareLocationPage(wxWizard* parent);
106 void OnFirmwareFilenameBtn(wxCommandEvent& event);
107 void OnWizardPageChanging(wxWizardEvent& event);
108
109private:
110 wxStaticText* FirmwareLocationText;
111 wxStaticText* FirmwareLocationFilename;
112 wxButton* FirmwareLocationBtn;
113
114};
115
116
27class wxPlatformPage : public wxWizardPageSimple 117class wxPlatformPage : public wxWizardPageSimple
28{ 118{
29public: 119public:
@@ -47,9 +137,10 @@ public:
47public: 137public:
48 wxLocationPage(wxWizard* parent); 138 wxLocationPage(wxWizard* parent);
49 virtual bool TransferDataFromWindow(void); 139 virtual bool TransferDataFromWindow(void);
140 void OnWizardPageChanging(wxWizardEvent& event);
50 void OnLocationBtn(wxCommandEvent& event); 141 void OnLocationBtn(wxCommandEvent& event);
51 142
52public: 143private:
53 wxStaticText* LocationText; 144 wxStaticText* LocationText;
54}; 145};
55 146
@@ -69,7 +160,7 @@ public:
69 void OnBuildBox(wxCommandEvent& event); 160 void OnBuildBox(wxCommandEvent& event);
70 void OnPageShown(wxWizardEvent& event); 161 void OnPageShown(wxWizardEvent& event);
71 162
72public: 163private:
73 wxRadioBox* BuildRadioBox; 164 wxRadioBox* BuildRadioBox;
74 wxStaticText* DetailText; 165 wxStaticText* DetailText;
75 wxCheckBox* NoCacheCheckBox; 166 wxCheckBox* NoCacheCheckBox;
@@ -81,7 +172,7 @@ public:
81 wxFullUninstallPage(wxWizard *parent); 172 wxFullUninstallPage(wxWizard *parent);
82 virtual bool TransferDataFromWindow(void); 173 virtual bool TransferDataFromWindow(void);
83 174
84public: 175private:
85 wxCheckBox* FullCheckBox; 176 wxCheckBox* FullCheckBox;
86}; 177};
87 178