diff --git a/CHANGES b/CHANGES index f1b8982..2b5d91e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,11 @@ 0.2 + added rfbLoadConsoleFont + fixed font colour handling. + added rfbSelectBox + added rfbDrawCharWithClip to allow for clipping and a background colour. + fixed font colours + added rfbFillRect + added IO function to check password. rfbNewClient now sets the socket in the fd_set (for the select() call) when compiling the library with HAVE_PTHREADS and an application which includes "rfb.h" without, the structures got mixed up. diff --git a/Makefile b/Makefile index ecfb2db..64fe312 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,8 @@ INCLUDES=-I. VNCSERVERLIB=-L. -lvncserver -L/usr/local/lib -lz -ljpeg # Uncomment these two lines to enable use of PThreads -PTHREADDEF = -DHAVE_PTHREADS -PTHREADLIB = -lpthread +#PTHREADDEF = -DHAVE_PTHREADS +#PTHREADLIB = -lpthread # Comment the following line to disable the use of 3 Bytes/Pixel. # The code for 3 Bytes/Pixel is not very efficient! @@ -23,11 +23,11 @@ OSX_LIBS = -framework ApplicationServices -framework Carbon SOURCES=main.c rfbserver.c sraRegion.c auth.c sockets.c \ stats.c corre.c hextile.c rre.c translate.c cutpaste.c \ zlib.c tight.c httpd.c cursor.c font.c \ - d3des.c vncauth.c + draw.c selbox.c d3des.c vncauth.c OBJS=main.o rfbserver.o sraRegion.o auth.o sockets.o \ stats.o corre.o hextile.o rre.o translate.o cutpaste.o \ zlib.o tight.o httpd.o cursor.o font.o \ - d3des.o vncauth.o + draw.o selbox.o d3des.o vncauth.o INSTALLHEADER=rfb.h rfbproto.h sraRegion.h keysym.h all: example pnmshow storepasswd @@ -73,6 +73,9 @@ blooptest.o: example.c rfb.h pnmshow24: pnmshow24.o libvncserver.a $(CC) -o pnmshow24 pnmshow24.o $(LIBS) +fontsel: fontsel.o libvncserver.a + $(CC) -o fontsel fontsel.o -L. -lvncserver -lz -ljpeg + clean: rm -f $(OBJS) *~ core "#"* *.bak *.orig storepasswd.o \ mac.o example.o pnmshow.o pnmshow24.o sratest.o \ diff --git a/README b/README index 2874f21..78df927 100644 --- a/README +++ b/README @@ -322,6 +322,33 @@ http://www.gimp.org/win32/extralibs-dev-20001007.zip Thanks go to all the GIMP team! +What are those other targets in the Makefile? +--------------------------------------------- + +OSXvnc-server is the original OSXvnc adapted to use the library, which was in +turn adapted from OSXvnc. As you easily can see, the OSX dependend part is +minimal. + +storepasswd is the original program to save a vnc style password in a file. +Unfortunately, authentication as every vncviewer speaks it means the server +has to know the plain password. You really should tunnel via ssh or use +your own PasswordCheck to build a PIN/TAN system. + +sratest is a test unit. Run it to assert correct behaviour of sraRegion. I +wrote this to test my iterator implementation. + +blooptest is a test of pthreads. It is just the example, but with a background +loop to hunt down thread lockups. + +pnmshow24 is like pnmshow, but it uses 3 bytes/pixel internally, which is not +as efficient as 4 bytes/pixel for translation, because there is no native data +type of that size, so you have to memcpy pixels and be real cautious with +endianness. Anyway, it works. + +fontsel is a test for rfbSelectBox and rfbLoadConsoleFont. If you have Linux +console fonts, you can browse them via VNC. Directory browsing not implemented +yet :-( + Why I don't feel bad about GPL ------------------------------ diff --git a/TODO b/TODO index 53b3fa1..328c54a 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,6 @@ immediate: ---------- -authentification schemes (secure vnc) -udp (need an rfbClientPtr udpClient in rfbScreen) documentation hint that to mark very tiny regions as modified is possibly inefficient for the encodings. @@ -11,14 +9,23 @@ documentation later: ------ +authentification schemes (secure vnc) + IO function ptr exists; now explain how to tunnel and implement a + client address restriction scheme. autoconf? at least Sun Solaris and Windows compilation - (maybe Michael makes that) + (maybe Michael makes a small autconf) using Hermes library for fast colour translations. CORBA +internal HTTP tunnelling feature (needs a special GET target and a few + changes to java applet). done: ----- +.empty cursor sending doesn't work. +.udp (need an rfbClientPtr udpClient in rfbScreen) + input only; nearly untested (don't have the clients). +.font handling: bpp>1 .test copyRect and pthreads. .optionally dont draw rich cursors as xcursors .cursor smears on IRIX with pthreads, then has bus error. has to be a mutex diff --git a/auth.c b/auth.c index 4244cd6..e7bd74f 100644 --- a/auth.c +++ b/auth.c @@ -73,8 +73,7 @@ void rfbAuthProcessClientMessage(cl) rfbClientPtr cl; { - char passwd[1024]; - int i, n; + int n; CARD8 response[CHALLENGESIZE]; CARD32 authResult; @@ -85,8 +84,8 @@ rfbAuthProcessClientMessage(cl) return; } - if(!cl->screen->getPassword(cl,passwd,MAXPWLEN)) { - rfbLog("rfbAuthProcessClientMessage: could not get password\n"); + if(!cl->screen->passwordCheck(cl,response,CHALLENGESIZE)) { + rfbLog("rfbAuthProcessClientMessage: password check failed\n"); authResult = Swap32IfLE(rfbVncAuthFailed); if (WriteExact(cl, (char *)&authResult, 4) < 0) { rfbLogPerror("rfbAuthProcessClientMessage: write"); @@ -95,28 +94,6 @@ rfbAuthProcessClientMessage(cl) return; } - vncEncryptBytes(cl->authChallenge, passwd); - - /* Lose the password from memory */ - for (i = strlen(passwd); i >= 0; i--) { - passwd[i] = '\0'; - } - - free((char *)passwd); - - if (memcmp(cl->authChallenge, response, CHALLENGESIZE) != 0) { - rfbLog("rfbAuthProcessClientMessage: authentication failed from %s\n", - cl->host); - - authResult = Swap32IfLE(rfbVncAuthFailed); - - if (WriteExact(cl, (char *)&authResult, 4) < 0) { - rfbLogPerror("rfbAuthProcessClientMessage: write"); - } - rfbCloseClient(cl); - return; - } - authResult = Swap32IfLE(rfbVncAuthOK); if (WriteExact(cl, (char *)&authResult, 4) < 0) { diff --git a/bdf2c.pl b/bdf2c.pl index e92b465..fc43712 100644 --- a/bdf2c.pl +++ b/bdf2c.pl @@ -20,9 +20,17 @@ while(<>) { } elsif(/^ENCODING (.*)$/) { $glyphindex=$1; $searchfor="BBX"; + $dwidth=0; + } elsif(/^DWIDTH (.*) (.*)/) { + $dwidth=$1; } elsif(/^BBX (.*) (.*) (.*) (.*)$/) { ($width,$height,$x,$y)=($1,$2,$3,$4); @encodings[$glyphindex*5..($glyphindex*5+4)]=($counter,$width,$height,$x,$y); + if($dwidth != 0) { + $encodings[$glyphindex*5+1]=$dwidth; + } else { + $dwidth=$width; + } $searchfor="BITMAP"; } elsif(/^BITMAP/) { $i=1; @@ -31,8 +39,11 @@ while(<>) { $i=0; $out.=" /* $glyphindex */\n"; } else { - $_=substr($_,0,length($_)-1); - $counter+=length($_)/2; + if(int(($dwidth+7)/8) > int(($width+7)/8)) { + $_ .= "00"x(int(($dwidth+7)/8)-int(($width+7)/8)); + } + $_=substr($_,0,(int(($dwidth+7)/8)*2)); + $counter+=(int(($dwidth+7)/8)); s/(..)/$nullx$1,/g; $out.=$_; $i++; diff --git a/consolefont2c.pl b/consolefont2c.pl new file mode 100644 index 0000000..9196649 --- /dev/null +++ b/consolefont2c.pl @@ -0,0 +1,38 @@ +#!/usr/bin/perl + +# convert a linux console font (8x16 format) to a font definition +# suitable for processing with LibVNCServer + +#if($#ARGV == 0) { exit; } + +foreach $i (@ARGV) { + $fontname = $i; + $fontname =~ s/\.fnt$//; + $fontname =~ s/^.*\///g; + $fontname =~ y/+/_/; + + print STDERR "$i -> $fontname\n"; + + open IN, "<$i"; + print STDERR read(IN,$x,4096); + close(IN); + + open OUT, ">$fontname.h"; + print OUT "unsigned char ".$fontname."FontData[4096+1]={"; + for($i=0;$i<4096;$i++) { + if(($i%16)==0) { + print OUT "\n"; + } + printf OUT "0x%02x,", ord(substr($x,$i)); + } + + print OUT "\n};\nint ".$fontname."FontMetaData[256*5+1]={\n"; + for($i=0;$i<256;$i++) { + print OUT ($i*16).",8,16,0,0,"; + } + + print OUT "};\nrfbFontData ".$fontname."Font = { ".$fontname."FontData, " + .$fontname."FontMetaData };\n"; + + close OUT; +} diff --git a/cursor.c b/cursor.c index 5663e85..5e86de1 100644 --- a/cursor.c +++ b/cursor.c @@ -42,21 +42,21 @@ rfbSendCursorShape(cl) CARD8 bitmapByte; pCursor = cl->screen->getCursorPtr(cl); - if(!pCursor) return TRUE; + //if(!pCursor) return TRUE; if (cl->useRichCursorEncoding) { - if(!pCursor->richSource) - MakeRichCursorFromXCursor(cl->screen,pCursor); - rect.encoding = Swap32IfLE(rfbEncodingRichCursor); + if(pCursor && !pCursor->richSource) + MakeRichCursorFromXCursor(cl->screen,pCursor); + rect.encoding = Swap32IfLE(rfbEncodingRichCursor); } else { - if(!pCursor->source) + if(pCursor && !pCursor->source) MakeXCursorFromRichCursor(cl->screen,pCursor); rect.encoding = Swap32IfLE(rfbEncodingXCursor); } /* If there is no cursor, send update with empty cursor data. */ - if ( pCursor->width == 1 && + if ( pCursor && pCursor->width == 1 && pCursor->height == 1 && pCursor->mask[0] == 0 ) { pCursor = NULL; diff --git a/default8x16.h b/default8x16.h new file mode 100644 index 0000000..d557d47 --- /dev/null +++ b/default8x16.h @@ -0,0 +1,261 @@ +unsigned char default8x16FontData[4096+1]={ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x7e,0x81,0xa5,0x81,0x81,0xbd,0x99,0x81,0x81,0x7e,0x00,0x00,0x00,0x00, +0x00,0x00,0x7e,0xff,0xdb,0xff,0xff,0xc3,0xe7,0xff,0xff,0x7e,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x6c,0xfe,0xfe,0xfe,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x18,0x3c,0x3c,0xe7,0xe7,0xe7,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x18,0x3c,0x7e,0xff,0xff,0x7e,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xc3,0xc3,0xe7,0xff,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x42,0x42,0x66,0x3c,0x00,0x00,0x00,0x00,0x00, +0xff,0xff,0xff,0xff,0xff,0xc3,0x99,0xbd,0xbd,0x99,0xc3,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x1e,0x0e,0x1a,0x32,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0x3c,0x66,0x66,0x66,0x66,0x3c,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x3f,0x33,0x3f,0x30,0x30,0x30,0x30,0x70,0xf0,0xe0,0x00,0x00,0x00,0x00, +0x00,0x00,0x7f,0x63,0x7f,0x63,0x63,0x63,0x63,0x67,0xe7,0xe6,0xc0,0x00,0x00,0x00, +0x00,0x00,0x00,0x18,0x18,0xdb,0x3c,0xe7,0x3c,0xdb,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfe,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00, +0x00,0x02,0x06,0x0e,0x1e,0x3e,0xfe,0x3e,0x1e,0x0e,0x06,0x02,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x7f,0xdb,0xdb,0xdb,0x7b,0x1b,0x1b,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00, +0x00,0x7c,0xc6,0x60,0x38,0x6c,0xc6,0xc6,0x6c,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0xfe,0xfe,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x0c,0xfe,0x0c,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xfe,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0xc0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xff,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x10,0x38,0x38,0x7c,0x7c,0xfe,0xfe,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xfe,0xfe,0x7c,0x7c,0x38,0x38,0x10,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x3c,0x3c,0x3c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x6c,0x6c,0xfe,0x6c,0x6c,0x6c,0xfe,0x6c,0x6c,0x00,0x00,0x00,0x00, +0x18,0x18,0x7c,0xc6,0xc2,0xc0,0x7c,0x06,0x06,0x86,0xc6,0x7c,0x18,0x18,0x00,0x00, +0x00,0x00,0x00,0x00,0xc2,0xc6,0x0c,0x18,0x30,0x60,0xc6,0x86,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6c,0x6c,0x38,0x76,0xdc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00,0x00,0x00, +0x00,0x00,0x30,0x18,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0xc6,0xce,0xde,0xf6,0xe6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0x06,0x0c,0x18,0x30,0x60,0xc0,0xc6,0xfe,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0x06,0x06,0x3c,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x0c,0x1c,0x3c,0x6c,0xcc,0xfe,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, +0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xfc,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x60,0xc0,0xc0,0xfc,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0xfe,0xc6,0x06,0x06,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7c,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7e,0x06,0x06,0x06,0x0c,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x60,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x60,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0xc6,0x0c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xde,0xde,0xde,0xdc,0xc0,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, +0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x66,0x66,0x66,0x66,0xfc,0x00,0x00,0x00,0x00, +0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0xf8,0x6c,0x66,0x66,0x66,0x66,0x66,0x66,0x6c,0xf8,0x00,0x00,0x00,0x00, +0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00, +0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, +0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xde,0xc6,0xc6,0x66,0x3a,0x00,0x00,0x00,0x00, +0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, +0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0xe6,0x66,0x66,0x6c,0x78,0x78,0x6c,0x66,0x66,0xe6,0x00,0x00,0x00,0x00, +0x00,0x00,0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00, +0x00,0x00,0xc3,0xe7,0xff,0xff,0xdb,0xc3,0xc3,0xc3,0xc3,0xc3,0x00,0x00,0x00,0x00, +0x00,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd6,0xde,0x7c,0x0c,0x0e,0x00,0x00, +0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x6c,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00, +0x00,0x00,0x7c,0xc6,0xc6,0x60,0x38,0x0c,0x06,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0xff,0xdb,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0xc3,0xc3,0xc3,0xc3,0xc3,0xdb,0xdb,0xff,0x66,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0xc3,0xc3,0x66,0x3c,0x18,0x18,0x3c,0x66,0xc3,0xc3,0x00,0x00,0x00,0x00, +0x00,0x00,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0xff,0xc3,0x86,0x0c,0x18,0x30,0x60,0xc1,0xc3,0xff,0x00,0x00,0x00,0x00, +0x00,0x00,0x3c,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x06,0x02,0x00,0x00,0x00,0x00, +0x00,0x00,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3c,0x00,0x00,0x00,0x00, +0x10,0x38,0x6c,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00, +0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0xe0,0x60,0x60,0x78,0x6c,0x66,0x66,0x66,0x66,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc0,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x1c,0x0c,0x0c,0x3c,0x6c,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0xcc,0x78,0x00, +0x00,0x00,0xe0,0x60,0x60,0x6c,0x76,0x66,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00, +0x00,0x00,0xe0,0x60,0x60,0x66,0x6c,0x78,0x78,0x6c,0x66,0xe6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xe6,0xff,0xdb,0xdb,0xdb,0xdb,0xdb,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xf0,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x1e,0x00, +0x00,0x00,0x00,0x00,0x00,0xdc,0x76,0x66,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0x60,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x30,0x30,0xfc,0x30,0x30,0x30,0x30,0x36,0x1c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0xc3,0xdb,0xdb,0xff,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xc3,0x66,0x3c,0x18,0x3c,0x66,0xc3,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0xf8,0x00, +0x00,0x00,0x00,0x00,0x00,0xfe,0xcc,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00, +0x00,0x00,0x0e,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0e,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x70,0x18,0x18,0x18,0x0e,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, +0x00,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xc6,0xfe,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x0c,0x06,0x7c,0x00,0x00, +0x00,0x00,0xcc,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x0c,0x18,0x30,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x10,0x38,0x6c,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0xcc,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x60,0x30,0x18,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x38,0x6c,0x38,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x3c,0x66,0x60,0x60,0x66,0x3c,0x0c,0x06,0x3c,0x00,0x00,0x00, +0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x66,0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x18,0x3c,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0xc6,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, +0x38,0x6c,0x38,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, +0x18,0x30,0x60,0x00,0xfe,0x66,0x60,0x7c,0x60,0x60,0x66,0xfe,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x6e,0x3b,0x1b,0x7e,0xd8,0xdc,0x77,0x00,0x00,0x00,0x00, +0x00,0x00,0x3e,0x6c,0xcc,0xcc,0xfe,0xcc,0xcc,0xcc,0xcc,0xce,0x00,0x00,0x00,0x00, +0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x30,0x78,0xcc,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x60,0x30,0x18,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0xc6,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0x78,0x00, +0x00,0xc6,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0xc6,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x18,0x18,0x7e,0xc3,0xc0,0xc0,0xc0,0xc3,0x7e,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xe6,0xfc,0x00,0x00,0x00,0x00, +0x00,0x00,0xc3,0x66,0x3c,0x18,0xff,0x18,0xff,0x18,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0xfc,0x66,0x66,0x7c,0x62,0x66,0x6f,0x66,0x66,0x66,0xf3,0x00,0x00,0x00,0x00, +0x00,0x0e,0x1b,0x18,0x18,0x18,0x7e,0x18,0x18,0x18,0x18,0x18,0xd8,0x70,0x00,0x00, +0x00,0x18,0x30,0x60,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x0c,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, +0x00,0x18,0x30,0x60,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x18,0x30,0x60,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x76,0xdc,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, +0x76,0xdc,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, +0x00,0x3c,0x6c,0x6c,0x3e,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x38,0x6c,0x6c,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xc0,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00, +0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x60,0xce,0x9b,0x06,0x0c,0x1f,0x00,0x00, +0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x66,0xce,0x96,0x3e,0x06,0x06,0x00,0x00, +0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x3c,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x36,0x6c,0xd8,0x6c,0x36,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xd8,0x6c,0x36,0x6c,0xd8,0x00,0x00,0x00,0x00,0x00,0x00, +0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44, +0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa, +0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x3f,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x18,0x18,0x18,0x18,0x18,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, +0x18,0x18,0x18,0x18,0x18,0xff,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, +0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0xd8,0xd8,0xd8,0xdc,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x78,0xcc,0xcc,0xcc,0xd8,0xcc,0xc6,0xc6,0xc6,0xcc,0x00,0x00,0x00,0x00, +0x00,0x00,0xfe,0xc6,0xc6,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xfe,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0xfe,0xc6,0x60,0x30,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7e,0xd8,0xd8,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xc0,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x76,0xdc,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x7e,0x18,0x3c,0x66,0x66,0x66,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6c,0xc6,0xc6,0xc6,0x6c,0x6c,0x6c,0x6c,0xee,0x00,0x00,0x00,0x00, +0x00,0x00,0x1e,0x30,0x18,0x0c,0x3e,0x66,0x66,0x66,0x66,0x3c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7e,0xdb,0xdb,0xdb,0x7e,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x03,0x06,0x7e,0xdb,0xdb,0xf3,0x7e,0x60,0xc0,0x00,0x00,0x00,0x00, +0x00,0x00,0x1c,0x30,0x60,0x60,0x7c,0x60,0x60,0x60,0x30,0x1c,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0xff,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x00,0x7e,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00,0x7e,0x00,0x00,0x00,0x00, +0x00,0x00,0x0e,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x7e,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x38,0x6c,0x6c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0xec,0x6c,0x6c,0x3c,0x1c,0x00,0x00,0x00,0x00, +0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x70,0xd8,0x30,0x60,0xc8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; +int default8x16FontMetaData[256*5+1]={ +0,8,16,0,0,16,8,16,0,0,32,8,16,0,0,48,8,16,0,0,64,8,16,0,0,80,8,16,0,0,96,8,16,0,0,112,8,16,0,0,128,8,16,0,0,144,8,16,0,0,160,8,16,0,0,176,8,16,0,0,192,8,16,0,0,208,8,16,0,0,224,8,16,0,0,240,8,16,0,0,256,8,16,0,0,272,8,16,0,0,288,8,16,0,0,304,8,16,0,0,320,8,16,0,0,336,8,16,0,0,352,8,16,0,0,368,8,16,0,0,384,8,16,0,0,400,8,16,0,0,416,8,16,0,0,432,8,16,0,0,448,8,16,0,0,464,8,16,0,0,480,8,16,0,0,496,8,16,0,0,512,8,16,0,0,528,8,16,0,0,544,8,16,0,0,560,8,16,0,0,576,8,16,0,0,592,8,16,0,0,608,8,16,0,0,624,8,16,0,0,640,8,16,0,0,656,8,16,0,0,672,8,16,0,0,688,8,16,0,0,704,8,16,0,0,720,8,16,0,0,736,8,16,0,0,752,8,16,0,0,768,8,16,0,0,784,8,16,0,0,800,8,16,0,0,816,8,16,0,0,832,8,16,0,0,848,8,16,0,0,864,8,16,0,0,880,8,16,0,0,896,8,16,0,0,912,8,16,0,0,928,8,16,0,0,944,8,16,0,0,960,8,16,0,0,976,8,16,0,0,992,8,16,0,0,1008,8,16,0,0,1024,8,16,0,0,1040,8,16,0,0,1056,8,16,0,0,1072,8,16,0,0,1088,8,16,0,0,1104,8,16,0,0,1120,8,16,0,0,1136,8,16,0,0,1152,8,16,0,0,1168,8,16,0,0,1184,8,16,0,0,1200,8,16,0,0,1216,8,16,0,0,1232,8,16,0,0,1248,8,16,0,0,1264,8,16,0,0,1280,8,16,0,0,1296,8,16,0,0,1312,8,16,0,0,1328,8,16,0,0,1344,8,16,0,0,1360,8,16,0,0,1376,8,16,0,0,1392,8,16,0,0,1408,8,16,0,0,1424,8,16,0,0,1440,8,16,0,0,1456,8,16,0,0,1472,8,16,0,0,1488,8,16,0,0,1504,8,16,0,0,1520,8,16,0,0,1536,8,16,0,0,1552,8,16,0,0,1568,8,16,0,0,1584,8,16,0,0,1600,8,16,0,0,1616,8,16,0,0,1632,8,16,0,0,1648,8,16,0,0,1664,8,16,0,0,1680,8,16,0,0,1696,8,16,0,0,1712,8,16,0,0,1728,8,16,0,0,1744,8,16,0,0,1760,8,16,0,0,1776,8,16,0,0,1792,8,16,0,0,1808,8,16,0,0,1824,8,16,0,0,1840,8,16,0,0,1856,8,16,0,0,1872,8,16,0,0,1888,8,16,0,0,1904,8,16,0,0,1920,8,16,0,0,1936,8,16,0,0,1952,8,16,0,0,1968,8,16,0,0,1984,8,16,0,0,2000,8,16,0,0,2016,8,16,0,0,2032,8,16,0,0,2048,8,16,0,0,2064,8,16,0,0,2080,8,16,0,0,2096,8,16,0,0,2112,8,16,0,0,2128,8,16,0,0,2144,8,16,0,0,2160,8,16,0,0,2176,8,16,0,0,2192,8,16,0,0,2208,8,16,0,0,2224,8,16,0,0,2240,8,16,0,0,2256,8,16,0,0,2272,8,16,0,0,2288,8,16,0,0,2304,8,16,0,0,2320,8,16,0,0,2336,8,16,0,0,2352,8,16,0,0,2368,8,16,0,0,2384,8,16,0,0,2400,8,16,0,0,2416,8,16,0,0,2432,8,16,0,0,2448,8,16,0,0,2464,8,16,0,0,2480,8,16,0,0,2496,8,16,0,0,2512,8,16,0,0,2528,8,16,0,0,2544,8,16,0,0,2560,8,16,0,0,2576,8,16,0,0,2592,8,16,0,0,2608,8,16,0,0,2624,8,16,0,0,2640,8,16,0,0,2656,8,16,0,0,2672,8,16,0,0,2688,8,16,0,0,2704,8,16,0,0,2720,8,16,0,0,2736,8,16,0,0,2752,8,16,0,0,2768,8,16,0,0,2784,8,16,0,0,2800,8,16,0,0,2816,8,16,0,0,2832,8,16,0,0,2848,8,16,0,0,2864,8,16,0,0,2880,8,16,0,0,2896,8,16,0,0,2912,8,16,0,0,2928,8,16,0,0,2944,8,16,0,0,2960,8,16,0,0,2976,8,16,0,0,2992,8,16,0,0,3008,8,16,0,0,3024,8,16,0,0,3040,8,16,0,0,3056,8,16,0,0,3072,8,16,0,0,3088,8,16,0,0,3104,8,16,0,0,3120,8,16,0,0,3136,8,16,0,0,3152,8,16,0,0,3168,8,16,0,0,3184,8,16,0,0,3200,8,16,0,0,3216,8,16,0,0,3232,8,16,0,0,3248,8,16,0,0,3264,8,16,0,0,3280,8,16,0,0,3296,8,16,0,0,3312,8,16,0,0,3328,8,16,0,0,3344,8,16,0,0,3360,8,16,0,0,3376,8,16,0,0,3392,8,16,0,0,3408,8,16,0,0,3424,8,16,0,0,3440,8,16,0,0,3456,8,16,0,0,3472,8,16,0,0,3488,8,16,0,0,3504,8,16,0,0,3520,8,16,0,0,3536,8,16,0,0,3552,8,16,0,0,3568,8,16,0,0,3584,8,16,0,0,3600,8,16,0,0,3616,8,16,0,0,3632,8,16,0,0,3648,8,16,0,0,3664,8,16,0,0,3680,8,16,0,0,3696,8,16,0,0,3712,8,16,0,0,3728,8,16,0,0,3744,8,16,0,0,3760,8,16,0,0,3776,8,16,0,0,3792,8,16,0,0,3808,8,16,0,0,3824,8,16,0,0,3840,8,16,0,0,3856,8,16,0,0,3872,8,16,0,0,3888,8,16,0,0,3904,8,16,0,0,3920,8,16,0,0,3936,8,16,0,0,3952,8,16,0,0,3968,8,16,0,0,3984,8,16,0,0,4000,8,16,0,0,4016,8,16,0,0,4032,8,16,0,0,4048,8,16,0,0,4064,8,16,0,0,4080,8,16,0,0,}; +rfbFontData default8x16Font = { default8x16FontData, default8x16FontMetaData }; diff --git a/draw.c b/draw.c new file mode 100644 index 0000000..df30d5d --- /dev/null +++ b/draw.c @@ -0,0 +1,16 @@ +#include "rfb.h" + +void rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,Pixel col) +{ + int rowstride = s->paddedWidthInBytes, bpp = s->bitsPerPixel>>3; + int i,j; + char* colour=(char*)&col; + + if(!rfbEndianTest) + colour += 4-bpp; + for(j=y1;jframeBuffer+j*rowstride+i*bpp,colour,bpp); + rfbMarkRectAsModified(s,x1,y1,x2,y2); +} + diff --git a/font.c b/font.c index 9356793..53055b4 100644 --- a/font.c +++ b/font.c @@ -1,13 +1,17 @@ #include "rfb.h" int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, - int x,int y,unsigned char c,CARD32 colour) + int x,int y,unsigned char c,Pixel col) { - int i,j,k,width,height; + int i,j,width,height; unsigned char d; unsigned char* data=font->data+font->metaData[c*5]; int rowstride=rfbScreen->paddedWidthInBytes; int bpp=rfbScreen->rfbServerFormat.bitsPerPixel/8; + char *colour=(char*)&col; + + if(!rfbEndianTest) + colour += 4-bpp; width=font->metaData[c*5+1]; height=font->metaData[c*5+2]; @@ -20,21 +24,17 @@ int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, d=*data; data++; } - if(d&0x80) { - for(k=0;kframeBuffer[(y+j)*rowstride+(x+i)*bpp+k]= - ((colour>>(8*k))&0xff); - } + if(d&0x80) + memcpy(rfbScreen->frameBuffer+(y+j)*rowstride+(x+i)*bpp,colour,bpp); d<<=1; } - if((i&7)==0) - data++; + if((i&7)!=0) data++; } return(width); } void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, - int x,int y,unsigned char* string,CARD32 colour) + int x,int y,const unsigned char* string,Pixel colour) { while(*string) { x+=rfbDrawChar(rfbScreen,font,x,y,*string,colour); @@ -42,7 +42,73 @@ void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, } } -int rfbWidth(rfbFontDataPtr font,unsigned char* string) +/* TODO: these two functions need to be more efficient */ +int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, + int x,int y,unsigned char c, + int x1,int y1,int x2,int y2, + Pixel col,Pixel bcol) +{ + int i,j,width,height; + unsigned char d; + unsigned char* data=font->data+font->metaData[c*5]; + int rowstride=rfbScreen->paddedWidthInBytes; + int bpp=rfbScreen->rfbServerFormat.bitsPerPixel/8,extra_bytes=0; + char* colour=(char*)&col; + char* bcolour=(char*)&bcol; + + if(!rfbEndianTest) { + colour+=4-bpp; + bcolour+=4-bpp; + } + + width=font->metaData[c*5+1]; + height=font->metaData[c*5+2]; + x+=font->metaData[c*5+3]; + y+=-font->metaData[c*5+4]-height+1; + + /* after clipping, x2 will be count of bytes between rows, + * x1 start of i, y1 start of j, width and height will be adjusted. */ + if(y1>y) { y1-=y; d+=(width+7)/8; height-=y1; y+=y1; } else y1=0; + if(x1>x) { x1-=x; d+=x1; width-=x1; x+=x1; extra_bytes+=x1/8; } else x1=0; + if(y2=x1 && x+i=y1 && y+jframeBuffer+(y+j)*rowstride+(x+i)*bpp, + colour,bpp); + } else if(bcol!=col) { + memcpy(rfbScreen->frameBuffer+(y+j)*rowstride+(x+i)*bpp, + bcolour,bpp); + } + } + d<<=1; + } + //if((i&7)==0) data++; + data += extra_bytes; + } + return(width); +} + +void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, + int x,int y,const unsigned char* string, + int x1,int y1,int x2,int y2, + Pixel colour,Pixel backColour) +{ + while(*string) { + x+=rfbDrawCharWithClip(rfbScreen,font,x,y,*string,x1,y1,x2,y2, + colour,backColour); + string++; + } +} + +int rfbWidthOfString(rfbFontDataPtr font,const unsigned char* string) { int i=0; while(*string) { @@ -65,3 +131,55 @@ void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int *y2=*y1+font->metaData[c*5+2]; } +void rfbWholeFontBBox(rfbFontDataPtr font, + int *x1, int *y1, int *x2, int *y2) +{ + int i; + int* m=font->metaData; + + (*x1)=(*y1)=INT_MAX; (*x2)=(*y2)=-INT_MAX+1; + for(i=0;i<256;i++) { + if(m[i*5+1]-m[i*5+3]>(*x2)) + (*x2)=m[i*5+1]-m[i*5+3]; + if(-m[i*5+2]+m[i*5+4]<(*y1)) + (*y1)=-m[i*5+2]+m[i*5+4]; + if(m[i*5+3]<(*x1)) + (*x1)=m[i*5+3]; + if(-m[i*5+4]>(*y2)) + (*y2)=-m[i*5+4]; + } +} + +rfbFontDataPtr rfbLoadConsoleFont(char *filename) +{ + FILE *f=fopen(filename,"rb"); + rfbFontDataPtr p; + int i; + + if(!f) return(0); + + p=(rfbFontDataPtr)malloc(sizeof(rfbFontData)); + p->data=(char*)malloc(4096); + if(1!=fread(p->data,4096,1,f)) { + free(p->data); + free(p); + return(0); + } + fclose(f); + p->metaData=(int*)malloc(256*5*sizeof(int)); + for(i=0;i<256;i++) { + p->metaData[i*5+0]=i*16; /* offset */ + p->metaData[i*5+1]=8; /* width */ + p->metaData[i*5+2]=16; /* height */ + p->metaData[i*5+3]=0; /* xhot */ + p->metaData[i*5+4]=0; /* yhot */ + } + return(p); +} + +void rfbFreeFont(rfbFontDataPtr f) +{ + free(f->data); + free(f->metaData); + free(f); +} diff --git a/fontsel.c b/fontsel.c new file mode 100644 index 0000000..81d4699 --- /dev/null +++ b/fontsel.c @@ -0,0 +1,71 @@ +#include "rfb.h" + +#define FONTDIR "/usr/lib/kbd/consolefonts/" +#define DEFAULTFONT FONTDIR "default8x16" + +char *fontlist[50]={ +"8x16alt", "b.fnt", "c.fnt", "default8x16", "m.fnt", "ml.fnt", "mod_d.fnt", +"mod_s.fnt", "mr.fnt", "mu.fnt", "r.fnt", "rl.fnt", "ro.fnt", "s.fnt", +"sc.fnt", "scrawl_s.fnt", "scrawl_w.fnt", "sd.fnt", "t.fnt", + 0 +}; + +rfbScreenInfoPtr rfbScreen = 0; +rfbFontDataPtr curFont = 0; +void showFont(int index) +{ + char buffer[1024]; + + if(!rfbScreen) return; + + if(curFont) + rfbFreeFont(curFont); + + strcpy(buffer,FONTDIR); + strcat(buffer,fontlist[index]); + curFont = rfbLoadConsoleFont(buffer); + + rfbFillRect(rfbScreen,210,30-20,210+10*16,30-20+256*20/16,0xb77797); + if(curFont) { + int i,j; + for(j=0;j<256;j+=16) + for(i=0;i<16;i++) + rfbDrawCharWithClip(rfbScreen,curFont,210+10*i,30+j*20/16,j+i, + 0,0,640,480,0xffffff,0x000000); + } +} + +int main(int argc,char** argv) +{ + rfbFontDataPtr font; + rfbScreenInfoPtr s=rfbGetScreen(argc,argv,640,480,8,3,3); + int i,j; + + s->frameBuffer=(char*)malloc(640*480*3); + rfbInitServer(s); + + for(j=0;j<480;j++) + for(i=0;i<640;i++) { + s->frameBuffer[(j*640+i)*3+0]=j*256/480; + s->frameBuffer[(j*640+i)*3+1]=i*256/640; + s->frameBuffer[(j*640+i)*3+2]=(i+j)*256/(480+640); + } + + rfbScreen = s; + font=rfbLoadConsoleFont(DEFAULTFONT); + if(!font) { + fprintf(stderr,"Couldn't find %s\n",DEFAULTFONT); + exit(1); + } + + for(j=0;j<0;j++) + rfbProcessEvents(s,900000); + + i = rfbSelectBox(s,font,fontlist,10,20,200,300,0xffdfdf,0x602040,2,showFont); + fprintf(stderr,"Selection: %d: %s\n",i,(i>=0)?fontlist[i]:"cancelled"); + + rfbFreeFont(font); + + return(0); +} + diff --git a/keysym.h b/keysym.h index b08d81b..f500e03 100755 --- a/keysym.h +++ b/keysym.h @@ -1629,3 +1629,6 @@ SOFTWARE. #define XK_Korean_Won 0xeff #endif /* XK_KOREAN */ + +/* Euro currency symbol */ +#define XK_EuroSign 0x20ac diff --git a/main.c b/main.c index 7191a9f..96f335e 100644 --- a/main.c +++ b/main.c @@ -176,14 +176,14 @@ void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y int i; if(x1>x2) { i=x1; x1=x2; x2=i; } - x2++; - if(x1<0) { x1=0; if(x2==x1) x2++; } - if(x2>=rfbScreen->width) { x2=rfbScreen->width-1; if(x1==x2) x1--; } + if(x1<0) x1=0; + if(x2>=rfbScreen->width) x2=rfbScreen->width-1; + if(x1==x2) return; if(y1>y2) { i=y1; y1=y2; y2=i; } - y2++; - if(y1<0) { y1=0; if(y2==y1) y2++; } - if(y2>=rfbScreen->height) { y2=rfbScreen->height-1; if(y1==y2) y1--; } + if(y1<0) y1=0; + if(y2>=rfbScreen->height) y2=rfbScreen->height-1; + if(y1==y2) return; region = sraRgnCreateRect(x1,y1,x2,y2); rfbMarkRegionAsModified(rfbScreen,region); @@ -400,12 +400,32 @@ rfbCursorPtr defaultGetCursorPtr(rfbClientPtr cl) return(cl->screen->cursor); } -Bool defaultGetPassword(rfbClientPtr cl,char* passwd,int len) +/* response is cl->authChallenge vncEncrypted with passwd */ +Bool defaultPasswordCheck(rfbClientPtr cl,char* response,int len) { - char *pwd=vncDecryptPasswdFromFile(cl->screen->rfbAuthPasswdData); - if(!pwd) + int i; + char *passwd=vncDecryptPasswdFromFile(cl->screen->rfbAuthPasswdData); + + if(!passwd) { + rfbLog("Couldn't read password file: %s\n",cl->screen->rfbAuthPasswdData); + return(FALSE); + } + + vncEncryptBytes(cl->authChallenge, passwd); + + /* Lose the password from memory */ + for (i = strlen(passwd); i >= 0; i--) { + passwd[i] = '\0'; + } + + free(passwd); + + if (memcmp(cl->authChallenge, response, len) != 0) { + rfbLog("rfbAuthProcessClientMessage: authentication failed from %s\n", + cl->host); return(FALSE); - strncpy(passwd,pwd,MAXPWLEN); + } + return(TRUE); } @@ -520,7 +540,7 @@ rfbScreenInfoPtr rfbGetScreen(int argc,char** argv, rfbScreen->setXCutText = defaultSetXCutText; rfbScreen->getCursorPtr = defaultGetCursorPtr; rfbScreen->setTranslateFunction = rfbSetTranslateFunction; - rfbScreen->getPassword = defaultGetPassword; + rfbScreen->passwordCheck = defaultPasswordCheck; rfbScreen->newClientHook = doNothingWithClient; rfbScreen->displayHook = 0; diff --git a/radon.h b/radon.h index 19ac9ee..6aa5242 100644 --- a/radon.h +++ b/radon.h @@ -1,195 +1,195 @@ -unsigned char radonFontData[4560]={ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32 */ -0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 33 */ -0x00,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 34 */ -0x00,0x00,0x44,0x00,0x44,0x00,0xba,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0xba,0x00,0x44,0x00,0x44,0x00,0x00,0x00,0x00,0x00, /* 35 */ -0x10,0x00,0x7e,0x00,0x80,0x00,0x90,0x00,0x80,0x00,0x7c,0x00,0x02,0x00,0x12,0x00,0x02,0x00,0xfc,0x00,0x10,0x00,0x00,0x00, /* 36 */ -0x00,0x00,0x62,0x00,0x92,0x00,0x94,0x00,0x68,0x00,0x10,0x00,0x2c,0x00,0x52,0x00,0x92,0x00,0x8c,0x00,0x00,0x00,0x00,0x00, /* 37 */ -0x00,0x00,0x60,0x00,0x90,0x00,0x90,0x00,0x40,0x00,0x20,0x00,0x90,0x00,0x8a,0x00,0x84,0x00,0x7a,0x00,0x00,0x00,0x00,0x00, /* 38 */ -0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 39 */ -0x00,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 40 */ -0x00,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 41 */ -0x00,0x00,0x10,0x00,0x92,0x00,0x54,0x00,0x10,0x00,0x10,0x00,0x54,0x00,0x92,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 42 */ -0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0xd6,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 43 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x30,0x00,0x00,0x00, /* 44 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 45 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 46 */ -0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 47 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 48 */ -0x00,0x00,0x08,0x00,0x28,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 49 */ -0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, /* 50 */ -0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3c,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, /* 51 */ -0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7a,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00, /* 52 */ -0x00,0x00,0xfe,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, /* 53 */ -0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 54 */ -0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00, /* 55 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 56 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7a,0x00,0x02,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, /* 57 */ -0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 58 */ -0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x60,0x00,0x00,0x00,0x00,0x00, /* 59 */ -0x00,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 60 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 61 */ -0x00,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 62 */ -0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x1c,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00, /* 63 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x8a,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x8c,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 64 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 65 */ -0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 66 */ -0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 67 */ -0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 68 */ -0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 69 */ -0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 70 */ -0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x9a,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 71 */ -0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 72 */ -0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 73 */ -0x00,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x84,0x00,0x78,0x00,0x00,0x00,0x00,0x00, /* 74 */ -0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 75 */ -0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, /* 76 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 77 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 78 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 79 */ -0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 80 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x8a,0x00,0x8a,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 81 */ -0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 82 */ -0x00,0x00,0x7e,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0xfc,0x00,0x00,0x00,0x00,0x00, /* 83 */ -0x00,0x00,0xfe,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 84 */ -0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 85 */ -0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x84,0x00,0x88,0x00,0x90,0x00,0xa0,0x00,0x00,0x00,0x00,0x00, /* 86 */ -0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 87 */ -0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 88 */ -0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 89 */ -0x00,0x00,0xfc,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, /* 90 */ -0x00,0x00,0x1c,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1c,0x00,0x00,0x00,0x00,0x00, /* 91 */ -0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00,0x00,0x00,0x00, /* 92 */ -0x00,0x00,0x38,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x38,0x00,0x00,0x00,0x00,0x00, /* 93 */ -0x00,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 94 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00, /* 95 */ -0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 96 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 97 */ -0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x5c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 98 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 99 */ -0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 100 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 101 */ -0x00,0x00,0x00,0x00,0x0c,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x54,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 102 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3a,0x00,0x02,0x00,0x3c,0x00, /* 103 */ -0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x5c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 104 */ -0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 105 */ -0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x30,0x00, /* 106 */ -0x00,0x00,0x00,0x00,0x40,0x00,0x40,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 107 */ -0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 108 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x00,0x00,0x00,0x00, /* 109 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 110 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 111 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x40,0x00, /* 112 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3a,0x00,0x02,0x00,0x02,0x00, /* 113 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 114 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x40,0x00,0x3c,0x00,0x02,0x00,0x02,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 115 */ -0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x54,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x0c,0x00,0x00,0x00,0x00,0x00, /* 116 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 117 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x00,0x00,0x00,0x00, /* 118 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x92,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 119 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 120 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3a,0x00,0x02,0x00,0x3c,0x00, /* 121 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x02,0x00,0x0c,0x00,0x30,0x00,0x40,0x00,0x3e,0x00,0x00,0x00,0x00,0x00, /* 122 */ -0x00,0x00,0x1c,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x1c,0x00,0x00,0x00,0x00,0x00, /* 123 */ -0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 124 */ -0x00,0x00,0x38,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x38,0x00,0x00,0x00,0x00,0x00, /* 125 */ -0x00,0x00,0x04,0x00,0x38,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 126 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160 */ -0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 161 */ -0x00,0x00,0x00,0x00,0x08,0x00,0x3e,0x00,0x40,0x00,0x48,0x00,0x48,0x00,0x40,0x00,0x3e,0x00,0x08,0x00,0x00,0x00,0x00,0x00, /* 162 */ -0x00,0x00,0x1c,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xa8,0x00,0x20,0x00,0x20,0x00,0x42,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 163 */ -0x00,0x00,0x00,0x00,0x82,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x00,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 164 */ -0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x54,0x00,0x10,0x00,0x54,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 165 */ -0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 166 */ -0x00,0x00,0x38,0x00,0x40,0x00,0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x00,0x04,0x00,0x38,0x00,0x00,0x00, /* 167 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x9a,0x00,0xa2,0x00,0xa2,0x00,0xa2,0x00,0x9a,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 169 */ -0x38,0x00,0x04,0x00,0x34,0x00,0x44,0x00,0x38,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 170 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 171 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 172 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 173 */ -0x00,0x00,0x7c,0x00,0x82,0x00,0x92,0x00,0xaa,0x00,0xb2,0x00,0xaa,0x00,0xaa,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 174 */ -0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 175 */ -0x38,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176 */ -0x00,0x00,0x10,0x00,0x10,0x00,0xd6,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 177 */ -0x38,0x00,0x04,0x00,0x18,0x00,0x20,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 178 */ -0x38,0x00,0x04,0x00,0x38,0x00,0x04,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 179 */ -0x18,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 180 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x58,0x00,0x40,0x00,0x40,0x00, /* 181 */ -0x00,0x00,0x79,0x00,0xfa,0x00,0xfa,0x00,0xfa,0x00,0x7a,0x00,0x02,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,0x0a,0x00,0x00,0x00, /* 182 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 183 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00,0x00,0x00, /* 184 */ -0x08,0x00,0x18,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 185 */ -0x38,0x00,0x44,0x00,0x44,0x00,0x38,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 186 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 187 */ -0x20,0x00,0xa2,0x00,0x22,0x00,0x22,0x00,0x24,0x00,0x08,0x00,0x10,0x00,0x29,0x00,0x49,0x00,0x85,0x00,0x01,0x00,0x01,0x00, /* 188 */ -0x20,0x00,0xa2,0x00,0x22,0x00,0x22,0x00,0x24,0x00,0x08,0x00,0x10,0x00,0x2e,0x00,0x41,0x00,0x86,0x00,0x08,0x00,0x0f,0x00, /* 189 */ -0xe0,0x00,0x12,0x00,0xe2,0x00,0x12,0x00,0xe4,0x00,0x08,0x00,0x10,0x00,0x29,0x00,0x49,0x00,0x85,0x00,0x01,0x00,0x01,0x00, /* 190 */ -0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x70,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, /* 191 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 192 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 193 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 194 */ -0x32,0x00,0x4c,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 195 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 196 */ -0x38,0x00,0x44,0x00,0x38,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xba,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 197 */ -0x00,0x00,0x77,0x00,0x88,0x00,0x88,0x00,0x88,0x00,0x8b,0x00,0xa8,0x00,0x88,0x00,0x88,0x00,0x8b,0x00,0x00,0x00,0x00,0x00, /* 198 */ -0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x6c,0x00,0x10,0x00,0x20,0x00, /* 199 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 200 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 201 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 202 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x80,0x00,0x80,0x00,0xb8,0x00,0x80,0x00,0x80,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 203 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 204 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 205 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 206 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 207 */ -0x00,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xb2,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 208 */ -0x32,0x00,0x4c,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x00,0x00,0x00,0x00, /* 209 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 210 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 211 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 212 */ -0x32,0x00,0x4c,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 213 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 214 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x00,0x28,0x00,0x00,0x00,0x28,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 215 */ -0x00,0x00,0x7a,0x00,0x84,0x00,0x82,0x00,0x8a,0x00,0x92,0x00,0xa2,0x00,0x82,0x00,0x42,0x00,0xbc,0x00,0x00,0x00,0x00,0x00, /* 216 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 217 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 218 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 219 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 220 */ -0x08,0x00,0xb2,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0x7c,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 221 */ -0x00,0x00,0x80,0x00,0x80,0x00,0xbc,0x00,0x82,0x00,0x82,0x00,0x82,0x00,0xbc,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 222 */ -0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x9c,0x00,0x00,0x00,0x00,0x00, /* 223 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 224 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 225 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 226 */ -0x32,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 227 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 228 */ -0x18,0x00,0x24,0x00,0x18,0x00,0x00,0x00,0x3c,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 229 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6c,0x00,0x12,0x00,0x52,0x00,0x94,0x00,0x90,0x00,0x6e,0x00,0x00,0x00,0x00,0x00, /* 230 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x34,0x00,0x08,0x00,0x10,0x00, /* 231 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 232 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 233 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 234 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x5c,0x00,0x40,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 235 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 236 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 237 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 238 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 239 */ -0x00,0x00,0x14,0x00,0x08,0x00,0x14,0x00,0x02,0x00,0x3a,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 240 */ -0x00,0x00,0x32,0x00,0x4c,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x00,0x00,0x00,0x00, /* 241 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 242 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 243 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 244 */ -0x32,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 245 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 246 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 247 */ -0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x44,0x00,0x4a,0x00,0x52,0x00,0x22,0x00,0x5c,0x00,0x00,0x00,0x00,0x00, /* 248 */ -0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 249 */ -0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 250 */ -0x38,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 251 */ -0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x00, /* 252 */ -0x04,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x3a,0x00,0x02,0x00,0x3c,0x00, /* 253 */ -0x00,0x00,0x80,0x00,0x80,0x00,0x9c,0x00,0xa2,0x00,0x82,0x00,0xa2,0x00,0x9c,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00, /* 254 */ +unsigned char radonFontData[2280]={ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 32 */ +0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x00,0x00, /* 33 */ +0x00,0x28,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 34 */ +0x00,0x44,0x44,0xba,0x44,0x44,0x44,0xba,0x44,0x44,0x00,0x00, /* 35 */ +0x10,0x7e,0x80,0x90,0x80,0x7c,0x02,0x12,0x02,0xfc,0x10,0x00, /* 36 */ +0x00,0x62,0x92,0x94,0x68,0x10,0x2c,0x52,0x92,0x8c,0x00,0x00, /* 37 */ +0x00,0x60,0x90,0x90,0x40,0x20,0x90,0x8a,0x84,0x7a,0x00,0x00, /* 38 */ +0x00,0x10,0x10,0x10,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 39 */ +0x00,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x00,0x00, /* 40 */ +0x00,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x00,0x00, /* 41 */ +0x00,0x10,0x92,0x54,0x10,0x10,0x54,0x92,0x10,0x00,0x00,0x00, /* 42 */ +0x00,0x00,0x10,0x10,0x10,0xd6,0x10,0x10,0x10,0x00,0x00,0x00, /* 43 */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x30,0x00, /* 44 */ +0x00,0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00,0x00, /* 45 */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x00,0x00, /* 46 */ +0x00,0x02,0x02,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0x00, /* 47 */ +0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x82,0x7c,0x00,0x00, /* 48 */ +0x00,0x08,0x28,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /* 49 */ +0x00,0xfc,0x02,0x02,0x02,0x7c,0x80,0x80,0x00,0xfe,0x00,0x00, /* 50 */ +0x00,0xfc,0x02,0x02,0x02,0x3c,0x02,0x02,0x02,0xfc,0x00,0x00, /* 51 */ +0x00,0x82,0x82,0x82,0x82,0x7a,0x02,0x02,0x02,0x02,0x00,0x00, /* 52 */ +0x00,0xfe,0x00,0x80,0x80,0x7c,0x02,0x02,0x02,0xfc,0x00,0x00, /* 53 */ +0x00,0x7c,0x80,0x80,0xbc,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 54 */ +0x00,0xfc,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00, /* 55 */ +0x00,0x7c,0x82,0x82,0x82,0x7c,0x82,0x82,0x82,0x7c,0x00,0x00, /* 56 */ +0x00,0x7c,0x82,0x82,0x82,0x82,0x7a,0x02,0x02,0xfc,0x00,0x00, /* 57 */ +0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x00,0x00,0x00, /* 58 */ +0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x60,0x00,0x00, /* 59 */ +0x00,0x08,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x08,0x00,0x00, /* 60 */ +0x00,0x00,0x00,0x00,0xfe,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, /* 61 */ +0x00,0x10,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x10,0x00,0x00, /* 62 */ +0x00,0xfc,0x02,0x02,0x02,0x1c,0x20,0x20,0x00,0x20,0x00,0x00, /* 63 */ +0x00,0x7c,0x82,0x8a,0x92,0x92,0x92,0x8c,0x80,0x7c,0x00,0x00, /* 64 */ +0x00,0x7c,0x82,0x82,0x82,0x82,0xba,0x82,0x82,0x82,0x00,0x00, /* 65 */ +0x00,0xbc,0x82,0x82,0x82,0xbc,0x82,0x82,0x82,0xbc,0x00,0x00, /* 66 */ +0x00,0x7c,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7c,0x00,0x00, /* 67 */ +0x00,0xbc,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xbc,0x00,0x00, /* 68 */ +0x00,0x7c,0x80,0x80,0x80,0xb8,0x80,0x80,0x80,0x7c,0x00,0x00, /* 69 */ +0x00,0x7c,0x80,0x80,0x80,0xb8,0x80,0x80,0x80,0x80,0x00,0x00, /* 70 */ +0x00,0x7c,0x80,0x80,0x80,0x80,0x9a,0x82,0x82,0x7c,0x00,0x00, /* 71 */ +0x00,0x82,0x82,0x82,0x82,0xba,0x82,0x82,0x82,0x82,0x00,0x00, /* 72 */ +0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 73 */ +0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x84,0x78,0x00,0x00, /* 74 */ +0x00,0x82,0x82,0x82,0x82,0xbc,0x82,0x82,0x82,0x82,0x00,0x00, /* 75 */ +0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x7e,0x00,0x00, /* 76 */ +0x00,0x7c,0x82,0x92,0x92,0x92,0x92,0x82,0x82,0x82,0x00,0x00, /* 77 */ +0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x00,0x00, /* 78 */ +0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 79 */ +0x00,0xbc,0x82,0x82,0x82,0xbc,0x80,0x80,0x80,0x80,0x00,0x00, /* 80 */ +0x00,0x7c,0x82,0x82,0x82,0x82,0x8a,0x8a,0x82,0x7c,0x00,0x00, /* 81 */ +0x00,0xbc,0x82,0x82,0x82,0xbc,0x82,0x82,0x82,0x82,0x00,0x00, /* 82 */ +0x00,0x7e,0x80,0x80,0x80,0x7c,0x02,0x02,0x02,0xfc,0x00,0x00, /* 83 */ +0x00,0xfe,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 84 */ +0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 85 */ +0x00,0x82,0x82,0x82,0x82,0x82,0x84,0x88,0x90,0xa0,0x00,0x00, /* 86 */ +0x00,0x82,0x82,0x82,0x82,0x92,0x92,0x92,0x82,0x7c,0x00,0x00, /* 87 */ +0x00,0x82,0x82,0x82,0x82,0x7c,0x82,0x82,0x82,0x82,0x00,0x00, /* 88 */ +0x00,0x82,0x82,0x82,0x82,0x7c,0x00,0x10,0x10,0x10,0x00,0x00, /* 89 */ +0x00,0xfc,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x7e,0x00,0x00, /* 90 */ +0x00,0x1c,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x1c,0x00,0x00, /* 91 */ +0x00,0x80,0x80,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00, /* 92 */ +0x00,0x38,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x38,0x00,0x00, /* 93 */ +0x00,0x38,0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 94 */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00, /* 95 */ +0x00,0x08,0x08,0x08,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 96 */ +0x00,0x00,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 97 */ +0x00,0x00,0x40,0x40,0x5c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 98 */ +0x00,0x00,0x00,0x00,0x3c,0x40,0x40,0x40,0x40,0x3c,0x00,0x00, /* 99 */ +0x00,0x00,0x02,0x02,0x3a,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 100 */ +0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 101 */ +0x00,0x00,0x0c,0x10,0x10,0x10,0x54,0x10,0x10,0x10,0x00,0x00, /* 102 */ +0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3a,0x02,0x3c, /* 103 */ +0x00,0x00,0x40,0x40,0x5c,0x42,0x42,0x42,0x42,0x42,0x00,0x00, /* 104 */ +0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /* 105 */ +0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x30, /* 106 */ +0x00,0x00,0x40,0x40,0x42,0x42,0x5c,0x42,0x42,0x42,0x00,0x00, /* 107 */ +0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, /* 108 */ +0x00,0x00,0x00,0x00,0x7c,0x82,0x92,0x92,0x92,0x92,0x00,0x00, /* 109 */ +0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x00,0x00, /* 110 */ +0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 111 */ +0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x5c,0x40,0x40, /* 112 */ +0x00,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3a,0x02,0x02, /* 113 */ +0x00,0x00,0x00,0x00,0x0c,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 114 */ +0x00,0x00,0x00,0x00,0x3e,0x40,0x3c,0x02,0x02,0x7c,0x00,0x00, /* 115 */ +0x00,0x00,0x10,0x10,0x10,0x54,0x10,0x10,0x10,0x0c,0x00,0x00, /* 116 */ +0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 117 */ +0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x44,0x48,0x50,0x00,0x00, /* 118 */ +0x00,0x00,0x00,0x00,0x92,0x92,0x92,0x92,0x82,0x7c,0x00,0x00, /* 119 */ +0x00,0x00,0x00,0x00,0x42,0x42,0x3c,0x42,0x42,0x42,0x00,0x00, /* 120 */ +0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3a,0x02,0x3c, /* 121 */ +0x00,0x00,0x00,0x00,0x7c,0x02,0x0c,0x30,0x40,0x3e,0x00,0x00, /* 122 */ +0x00,0x1c,0x20,0x20,0x20,0x40,0x20,0x20,0x20,0x1c,0x00,0x00, /* 123 */ +0x00,0x10,0x10,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x00,0x00, /* 124 */ +0x00,0x38,0x04,0x04,0x04,0x02,0x04,0x04,0x04,0x38,0x00,0x00, /* 125 */ +0x00,0x04,0x38,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 126 */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160 */ +0x00,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 161 */ +0x00,0x00,0x08,0x3e,0x40,0x48,0x48,0x40,0x3e,0x08,0x00,0x00, /* 162 */ +0x00,0x1c,0x20,0x20,0x20,0xa8,0x20,0x20,0x42,0xbc,0x00,0x00, /* 163 */ +0x00,0x00,0x82,0x38,0x44,0x44,0x44,0x38,0x82,0x00,0x00,0x00, /* 164 */ +0x00,0x82,0x82,0x82,0x7c,0x00,0x54,0x10,0x54,0x10,0x00,0x00, /* 165 */ +0x00,0x10,0x10,0x10,0x00,0x00,0x00,0x10,0x10,0x10,0x00,0x00, /* 166 */ +0x00,0x38,0x40,0x38,0x44,0x44,0x44,0x44,0x38,0x04,0x38,0x00, /* 167 */ +0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168 */ +0x00,0x7c,0x82,0x9a,0xa2,0xa2,0xa2,0x9a,0x82,0x7c,0x00,0x00, /* 169 */ +0x38,0x04,0x34,0x44,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00, /* 170 */ +0x00,0x00,0x00,0x24,0x48,0x00,0x48,0x24,0x00,0x00,0x00,0x00, /* 171 */ +0x00,0x00,0x00,0x00,0x00,0xfc,0x02,0x02,0x02,0x00,0x00,0x00, /* 172 */ +0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, /* 173 */ +0x00,0x7c,0x82,0x92,0xaa,0xb2,0xaa,0xaa,0x82,0x7c,0x00,0x00, /* 174 */ +0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 175 */ +0x38,0x44,0x44,0x44,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176 */ +0x00,0x10,0x10,0xd6,0x10,0x10,0x00,0xfe,0x00,0x00,0x00,0x00, /* 177 */ +0x38,0x04,0x18,0x20,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 178 */ +0x38,0x04,0x38,0x04,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 179 */ +0x18,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 180 */ +0x00,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x58,0x40,0x40, /* 181 */ +0x00,0x79,0xfa,0xfa,0xfa,0x7a,0x02,0x0a,0x0a,0x0a,0x0a,0x00, /* 182 */ +0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00, /* 183 */ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x10,0x00, /* 184 */ +0x08,0x18,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 185 */ +0x38,0x44,0x44,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, /* 186 */ +0x00,0x00,0x00,0x48,0x24,0x00,0x24,0x48,0x00,0x00,0x00,0x00, /* 187 */ +0x20,0xa2,0x22,0x22,0x24,0x08,0x10,0x29,0x49,0x85,0x01,0x01, /* 188 */ +0x20,0xa2,0x22,0x22,0x24,0x08,0x10,0x2e,0x41,0x86,0x08,0x0f, /* 189 */ +0xe0,0x12,0xe2,0x12,0xe4,0x08,0x10,0x29,0x49,0x85,0x01,0x01, /* 190 */ +0x00,0x08,0x00,0x08,0x08,0x70,0x80,0x80,0x80,0x7e,0x00,0x00, /* 191 */ +0x20,0x18,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 192 */ +0x08,0x30,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 193 */ +0x38,0x44,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 194 */ +0x32,0x4c,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 195 */ +0x6c,0x00,0x00,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 196 */ +0x38,0x44,0x38,0x7c,0x82,0x82,0x82,0xba,0x82,0x82,0x00,0x00, /* 197 */ +0x00,0x77,0x88,0x88,0x88,0x8b,0xa8,0x88,0x88,0x8b,0x00,0x00, /* 198 */ +0x00,0x7c,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x6c,0x10,0x20, /* 199 */ +0x20,0x18,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 200 */ +0x08,0x30,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 201 */ +0x38,0x44,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 202 */ +0x6c,0x00,0x00,0x7c,0x80,0x80,0xb8,0x80,0x80,0x7c,0x00,0x00, /* 203 */ +0x20,0x18,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 204 */ +0x08,0x30,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 205 */ +0x38,0x44,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 206 */ +0x6c,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 207 */ +0x00,0xbc,0x82,0x82,0x82,0xb2,0x82,0x82,0x82,0xbc,0x00,0x00, /* 208 */ +0x32,0x4c,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x82,0x00,0x00, /* 209 */ +0x20,0x18,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 210 */ +0x08,0x30,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 211 */ +0x38,0x44,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 212 */ +0x32,0x4c,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 213 */ +0x6c,0x00,0x00,0x7c,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 214 */ +0x00,0x00,0x00,0x00,0x44,0x28,0x00,0x28,0x44,0x00,0x00,0x00, /* 215 */ +0x00,0x7a,0x84,0x82,0x8a,0x92,0xa2,0x82,0x42,0xbc,0x00,0x00, /* 216 */ +0x20,0x18,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 217 */ +0x08,0x30,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 218 */ +0x38,0x44,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 219 */ +0x6c,0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x7c,0x00,0x00, /* 220 */ +0x08,0xb2,0x82,0x82,0x82,0x7c,0x00,0x10,0x10,0x10,0x00,0x00, /* 221 */ +0x00,0x80,0x80,0xbc,0x82,0x82,0x82,0xbc,0x80,0x80,0x00,0x00, /* 222 */ +0x00,0x3c,0x42,0x42,0x42,0x5c,0x42,0x42,0x42,0x9c,0x00,0x00, /* 223 */ +0x20,0x18,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 224 */ +0x08,0x30,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 225 */ +0x38,0x44,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 226 */ +0x32,0x4c,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 227 */ +0x6c,0x00,0x00,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 228 */ +0x18,0x24,0x18,0x00,0x3c,0x02,0x3a,0x42,0x42,0x3c,0x00,0x00, /* 229 */ +0x00,0x00,0x00,0x00,0x6c,0x12,0x52,0x94,0x90,0x6e,0x00,0x00, /* 230 */ +0x00,0x00,0x00,0x00,0x3c,0x40,0x40,0x40,0x40,0x34,0x08,0x10, /* 231 */ +0x20,0x18,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 232 */ +0x08,0x30,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 233 */ +0x38,0x44,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 234 */ +0x6c,0x00,0x00,0x00,0x3c,0x42,0x42,0x5c,0x40,0x3c,0x00,0x00, /* 235 */ +0x20,0x18,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 236 */ +0x08,0x30,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 237 */ +0x38,0x44,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 238 */ +0x6c,0x00,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x10,0x00,0x00, /* 239 */ +0x00,0x14,0x08,0x14,0x02,0x3a,0x42,0x42,0x42,0x3c,0x00,0x00, /* 240 */ +0x00,0x32,0x4c,0x00,0x3c,0x42,0x42,0x42,0x42,0x42,0x00,0x00, /* 241 */ +0x20,0x18,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 242 */ +0x08,0x30,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 243 */ +0x38,0x44,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 244 */ +0x32,0x4c,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 245 */ +0x6c,0x00,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 246 */ +0x00,0x00,0x00,0x00,0x38,0x00,0xfe,0x00,0x38,0x00,0x00,0x00, /* 247 */ +0x00,0x00,0x00,0x00,0x3a,0x44,0x4a,0x52,0x22,0x5c,0x00,0x00, /* 248 */ +0x20,0x18,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 249 */ +0x08,0x30,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 250 */ +0x38,0x44,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 251 */ +0x6c,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,0x00, /* 252 */ +0x04,0x18,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3a,0x02,0x3c, /* 253 */ +0x00,0x80,0x80,0x9c,0xa2,0x82,0xa2,0x9c,0x80,0x80,0x00,0x00, /* 254 */ }; int radonFontMetaData[256*5]={ -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,0,-2,24,8,12,0,-2,48,8,12,0,-2,72,8,12,0,-2,96,8,12,0,-2,120,8,12,0,-2,144,8,12,0,-2,168,8,12,0,-2,192,8,12,0,-2,216,8,12,0,-2,240,8,12,0,-2,264,8,12,0,-2,288,8,12,0,-2,312,8,12,0,-2,336,8,12,0,-2,360,8,12,0,-2,384,8,12,0,-2,408,8,12,0,-2,432,8,12,0,-2,456,8,12,0,-2,480,8,12,0,-2,504,8,12,0,-2,528,8,12,0,-2,552,8,12,0,-2,576,8,12,0,-2,600,8,12,0,-2,624,8,12,0,-2,648,8,12,0,-2,672,8,12,0,-2,696,8,12,0,-2,720,8,12,0,-2,744,8,12,0,-2,768,8,12,0,-2,792,8,12,0,-2,816,8,12,0,-2,840,8,12,0,-2,864,8,12,0,-2,888,8,12,0,-2,912,8,12,0,-2,936,8,12,0,-2,960,8,12,0,-2,984,8,12,0,-2,1008,8,12,0,-2,1032,8,12,0,-2,1056,8,12,0,-2,1080,8,12,0,-2,1104,8,12,0,-2,1128,8,12,0,-2,1152,8,12,0,-2,1176,8,12,0,-2,1200,8,12,0,-2,1224,8,12,0,-2,1248,8,12,0,-2,1272,8,12,0,-2,1296,8,12,0,-2,1320,8,12,0,-2,1344,8,12,0,-2,1368,8,12,0,-2,1392,8,12,0,-2,1416,8,12,0,-2,1440,8,12,0,-2,1464,8,12,0,-2,1488,8,12,0,-2,1512,8,12,0,-2,1536,8,12,0,-2,1560,8,12,0,-2,1584,8,12,0,-2,1608,8,12,0,-2,1632,8,12,0,-2,1656,8,12,0,-2,1680,8,12,0,-2,1704,8,12,0,-2,1728,8,12,0,-2,1752,8,12,0,-2,1776,8,12,0,-2,1800,8,12,0,-2,1824,8,12,0,-2,1848,8,12,0,-2,1872,8,12,0,-2,1896,8,12,0,-2,1920,8,12,0,-2,1944,8,12,0,-2,1968,8,12,0,-2,1992,8,12,0,-2,2016,8,12,0,-2,2040,8,12,0,-2,2064,8,12,0,-2,2088,8,12,0,-2,2112,8,12,0,-2,2136,8,12,0,-2,2160,8,12,0,-2,2184,8,12,0,-2,2208,8,12,0,-2,2232,8,12,0,-2,2256,8,12,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2280,8,12,0,-2,2304,8,12,0,-2,2328,8,12,0,-2,2352,8,12,0,-2,2376,8,12,0,-2,2400,8,12,0,-2,2424,8,12,0,-2,2448,8,12,0,-2,2472,8,12,0,-2,2496,8,12,0,-2,2520,8,12,0,-2,2544,8,12,0,-2,2568,8,12,0,-2,2592,8,12,0,-2,2616,8,12,0,-2,2640,8,12,0,-2,2664,8,12,0,-2,2688,8,12,0,-2,2712,8,12,0,-2,2736,8,12,0,-2,2760,8,12,0,-2,2784,8,12,0,-2,2808,8,12,0,-2,2832,8,12,0,-2,2856,8,12,0,-2,2880,8,12,0,-2,2904,8,12,0,-2,2928,8,12,0,-2,2952,8,12,0,-2,2976,8,12,0,-2,3000,8,12,0,-2,3024,8,12,0,-2,3048,8,12,0,-2,3072,8,12,0,-2,3096,8,12,0,-2,3120,8,12,0,-2,3144,8,12,0,-2,3168,8,12,0,-2,3192,8,12,0,-2,3216,8,12,0,-2,3240,8,12,0,-2,3264,8,12,0,-2,3288,8,12,0,-2,3312,8,12,0,-2,3336,8,12,0,-2,3360,8,12,0,-2,3384,8,12,0,-2,3408,8,12,0,-2,3432,8,12,0,-2,3456,8,12,0,-2,3480,8,12,0,-2,3504,8,12,0,-2,3528,8,12,0,-2,3552,8,12,0,-2,3576,8,12,0,-2,3600,8,12,0,-2,3624,8,12,0,-2,3648,8,12,0,-2,3672,8,12,0,-2,3696,8,12,0,-2,3720,8,12,0,-2,3744,8,12,0,-2,3768,8,12,0,-2,3792,8,12,0,-2,3816,8,12,0,-2,3840,8,12,0,-2,3864,8,12,0,-2,3888,8,12,0,-2,3912,8,12,0,-2,3936,8,12,0,-2,3960,8,12,0,-2,3984,8,12,0,-2,4008,8,12,0,-2,4032,8,12,0,-2,4056,8,12,0,-2,4080,8,12,0,-2,4104,8,12,0,-2,4128,8,12,0,-2,4152,8,12,0,-2,4176,8,12,0,-2,4200,8,12,0,-2,4224,8,12,0,-2,4248,8,12,0,-2,4272,8,12,0,-2,4296,8,12,0,-2,4320,8,12,0,-2,4344,8,12,0,-2,4368,8,12,0,-2,4392,8,12,0,-2,4416,8,12,0,-2,4440,8,12,0,-2,4464,8,12,0,-2,4488,8,12,0,-2,4512,8,12,0,-2,4536,8,12,0,-2,0,0,0,0,0,}; -rfbFontData radonFont = { radonFontData, radonFontMetaData }; +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,0,-2,12,8,12,0,-2,24,8,12,0,-2,36,8,12,0,-2,48,8,12,0,-2,60,8,12,0,-2,72,8,12,0,-2,84,8,12,0,-2,96,8,12,0,-2,108,8,12,0,-2,120,8,12,0,-2,132,8,12,0,-2,144,8,12,0,-2,156,8,12,0,-2,168,8,12,0,-2,180,8,12,0,-2,192,8,12,0,-2,204,8,12,0,-2,216,8,12,0,-2,228,8,12,0,-2,240,8,12,0,-2,252,8,12,0,-2,264,8,12,0,-2,276,8,12,0,-2,288,8,12,0,-2,300,8,12,0,-2,312,8,12,0,-2,324,8,12,0,-2,336,8,12,0,-2,348,8,12,0,-2,360,8,12,0,-2,372,8,12,0,-2,384,8,12,0,-2,396,8,12,0,-2,408,8,12,0,-2,420,8,12,0,-2,432,8,12,0,-2,444,8,12,0,-2,456,8,12,0,-2,468,8,12,0,-2,480,8,12,0,-2,492,8,12,0,-2,504,8,12,0,-2,516,8,12,0,-2,528,8,12,0,-2,540,8,12,0,-2,552,8,12,0,-2,564,8,12,0,-2,576,8,12,0,-2,588,8,12,0,-2,600,8,12,0,-2,612,8,12,0,-2,624,8,12,0,-2,636,8,12,0,-2,648,8,12,0,-2,660,8,12,0,-2,672,8,12,0,-2,684,8,12,0,-2,696,8,12,0,-2,708,8,12,0,-2,720,8,12,0,-2,732,8,12,0,-2,744,8,12,0,-2,756,8,12,0,-2,768,8,12,0,-2,780,8,12,0,-2,792,8,12,0,-2,804,8,12,0,-2,816,8,12,0,-2,828,8,12,0,-2,840,8,12,0,-2,852,8,12,0,-2,864,8,12,0,-2,876,8,12,0,-2,888,8,12,0,-2,900,8,12,0,-2,912,8,12,0,-2,924,8,12,0,-2,936,8,12,0,-2,948,8,12,0,-2,960,8,12,0,-2,972,8,12,0,-2,984,8,12,0,-2,996,8,12,0,-2,1008,8,12,0,-2,1020,8,12,0,-2,1032,8,12,0,-2,1044,8,12,0,-2,1056,8,12,0,-2,1068,8,12,0,-2,1080,8,12,0,-2,1092,8,12,0,-2,1104,8,12,0,-2,1116,8,12,0,-2,1128,8,12,0,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1140,8,12,0,-2,1152,8,12,0,-2,1164,8,12,0,-2,1176,8,12,0,-2,1188,8,12,0,-2,1200,8,12,0,-2,1212,8,12,0,-2,1224,8,12,0,-2,1236,8,12,0,-2,1248,8,12,0,-2,1260,8,12,0,-2,1272,8,12,0,-2,1284,8,12,0,-2,1296,8,12,0,-2,1308,8,12,0,-2,1320,8,12,0,-2,1332,8,12,0,-2,1344,8,12,0,-2,1356,8,12,0,-2,1368,8,12,0,-2,1380,8,12,0,-2,1392,8,12,0,-2,1404,8,12,0,-2,1416,8,12,0,-2,1428,8,12,0,-2,1440,8,12,0,-2,1452,8,12,0,-2,1464,8,12,0,-2,1476,8,12,0,-2,1488,8,12,0,-2,1500,8,12,0,-2,1512,8,12,0,-2,1524,8,12,0,-2,1536,8,12,0,-2,1548,8,12,0,-2,1560,8,12,0,-2,1572,8,12,0,-2,1584,8,12,0,-2,1596,8,12,0,-2,1608,8,12,0,-2,1620,8,12,0,-2,1632,8,12,0,-2,1644,8,12,0,-2,1656,8,12,0,-2,1668,8,12,0,-2,1680,8,12,0,-2,1692,8,12,0,-2,1704,8,12,0,-2,1716,8,12,0,-2,1728,8,12,0,-2,1740,8,12,0,-2,1752,8,12,0,-2,1764,8,12,0,-2,1776,8,12,0,-2,1788,8,12,0,-2,1800,8,12,0,-2,1812,8,12,0,-2,1824,8,12,0,-2,1836,8,12,0,-2,1848,8,12,0,-2,1860,8,12,0,-2,1872,8,12,0,-2,1884,8,12,0,-2,1896,8,12,0,-2,1908,8,12,0,-2,1920,8,12,0,-2,1932,8,12,0,-2,1944,8,12,0,-2,1956,8,12,0,-2,1968,8,12,0,-2,1980,8,12,0,-2,1992,8,12,0,-2,2004,8,12,0,-2,2016,8,12,0,-2,2028,8,12,0,-2,2040,8,12,0,-2,2052,8,12,0,-2,2064,8,12,0,-2,2076,8,12,0,-2,2088,8,12,0,-2,2100,8,12,0,-2,2112,8,12,0,-2,2124,8,12,0,-2,2136,8,12,0,-2,2148,8,12,0,-2,2160,8,12,0,-2,2172,8,12,0,-2,2184,8,12,0,-2,2196,8,12,0,-2,2208,8,12,0,-2,2220,8,12,0,-2,2232,8,12,0,-2,2244,8,12,0,-2,2256,8,12,0,-2,2268,8,12,0,-2,0,0,0,0,0,}; +rfbFontData radonFont={radonFontData, radonFontMetaData}; diff --git a/rfb.h b/rfb.h index 57ab62f..ad78490 100644 --- a/rfb.h +++ b/rfb.h @@ -155,7 +155,7 @@ typedef void (*PtrAddEventProcPtr) (int buttonMask, int x, int y, struct rfbClie typedef void (*SetXCutTextProcPtr) (char* str,int len, struct rfbClientRec* cl); typedef struct rfbCursor* (*GetCursorProcPtr) (struct rfbClientRec* pScreen); typedef Bool (*SetTranslateFunctionProcPtr)(struct rfbClientRec* cl); -typedef Bool (*GetPasswordProcPtr)(struct rfbClientRec* cl,char* passWord,int len); +typedef Bool (*PasswordCheckProcPtr)(struct rfbClientRec* cl,char* encryptedPassWord,int len); typedef void (*NewClientHookPtr)(struct rfbClientRec* cl); typedef void (*DisplayHookPtr)(struct rfbClientRec* cl); @@ -266,7 +266,7 @@ typedef struct SOCKET httpSock; FILE* httpFP; - GetPasswordProcPtr getPassword; + PasswordCheckProcPtr passwordCheck; char* rfbAuthPasswdData; int rfbDeferUpdateTime; @@ -680,11 +680,38 @@ typedef struct rfbFontData { int* metaData; } rfbFontData,* rfbFontDataPtr; -int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,CARD32 colour); -void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char* string,CARD32 colour); -int rfbWidth(rfbFontDataPtr font,unsigned char* string); +int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,Pixel colour); +void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const unsigned char* string,Pixel colour); +/* if colour==backColour, background is transparent */ +int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,int x1,int y1,int x2,int y2,Pixel colour,Pixel backColour); +void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const unsigned char* string,int x1,int y1,int x2,int y2,Pixel colour,Pixel backColour); +int rfbWidthOfString(rfbFontDataPtr font,const unsigned char* string); int rfbWidthOfChar(rfbFontDataPtr font,unsigned char c); void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int* y2); +/* this returns the smallest box enclosing any character of font. */ +void rfbWholeFontBBox(rfbFontDataPtr font,int *x1, int *y1, int *x2, int *y2); + +/* dynamically load a linux console font (4096 bytes, 256 glyphs a 8x16 */ +rfbFontDataPtr rfbLoadConsoleFont(char *filename); +/* free a dynamically loaded font */ +void rfbFreeFont(rfbFontDataPtr font); + +/* draw.c */ + +void rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,Pixel col); + +/* selbox.c */ + +/* this opens a modal select box. list is an array of strings, the end marked + with a NULL. + It returns the index in the list or -1 if cancelled or something else + wasn't kosher. */ +typedef void (*SelectionChangedHookPtr)(int index); +extern int rfbSelectBox(rfbScreenInfoPtr rfbScreen, + rfbFontDataPtr font, char** list, + int x1, int y1, int x2, int y2, + Pixel foreColour, Pixel backColour, + int border,SelectionChangedHookPtr selChangedHook); /* main.c */ diff --git a/selbox.c b/selbox.c new file mode 100644 index 0000000..63ff89e --- /dev/null +++ b/selbox.c @@ -0,0 +1,301 @@ +#include +#include "rfb.h" +#include "keysym.h" + +typedef struct { + rfbScreenInfoPtr screen; + rfbFontDataPtr font; + char** list; + int listSize; + int selected; + int displayStart; + int x1,y1,x2,y2,textH,pageH; + int xhot,yhot; + int buttonWidth,okBX,cancelBX,okX,cancelX,okY; + Bool okInverted,cancelInverted; + int lastButtons; + Pixel colour,backColour; + SelectionChangedHookPtr selChangedHook; + enum { SELECTING, OK, CANCEL } state; +} rfbSelectData; + +static const char* okStr="OK"; +static const char* cancelStr="Cancel"; + +static void selPaintButtons(rfbSelectData* m,Bool invertOk,Bool invertCancel) +{ + rfbScreenInfoPtr s = m->screen; + Pixel bcolour = m->backColour; + Pixel colour = m->colour; + + rfbFillRect(s,m->x1,m->okY-m->textH,m->x2,m->okY,bcolour); + + if(invertOk) { + rfbFillRect(s,m->okBX,m->okY-m->textH,m->okBX+m->buttonWidth,m->okY,colour); + rfbDrawStringWithClip(s,m->font,m->okX+m->xhot,m->okY-1+m->yhot,okStr, + m->x1,m->okY-m->textH,m->x2,m->okY, + bcolour,colour); + } else + rfbDrawString(s,m->font,m->okX+m->xhot,m->okY-1+m->yhot,okStr,colour); + + if(invertCancel) { + rfbFillRect(s,m->cancelBX,m->okY-m->textH, + m->cancelBX+m->buttonWidth,m->okY,colour); + rfbDrawStringWithClip(s,m->font,m->cancelX+m->xhot,m->okY-1+m->yhot, + cancelStr,m->x1,m->okY-m->textH,m->x2,m->okY, + bcolour,colour); + } else + rfbDrawString(s,m->font,m->cancelX+m->xhot,m->okY-1+m->yhot,cancelStr,colour); + + m->okInverted = invertOk; + m->cancelInverted = invertCancel; +} + +/* line is relative to displayStart */ +static void selPaintLine(rfbSelectData* m,int line,Bool invert) +{ + int y1 = m->y1+line*m->textH, y2 = y1+m->textH; + if(y2>m->y2) + y2=m->y2; + rfbFillRect(m->screen,m->x1,y1,m->x2,y2,invert?m->colour:m->backColour); + if(m->displayStart+linelistSize) + rfbDrawStringWithClip(m->screen,m->font,m->x1+m->xhot,y2-1+m->yhot, + m->list[m->displayStart+line], + m->x1,y1,m->x2,y2, + invert?m->backColour:m->colour, + invert?m->backColour:m->colour); +} + +static void selSelect(rfbSelectData* m,int index) +{ + int delta; + + if(index==m->selected || index<0 || index>=m->listSize) + return; + + if(m->selected>=0) + selPaintLine(m,m->selected-m->displayStart,FALSE); + + if(indexdisplayStart || index>=m->displayStart+m->pageH) { + /* targetLine is the screen line in which the selected line will + be displayed. + targetLine = m->pageH/2 doesn't look so nice */ + int targetLine = m->selected-m->displayStart; + int lineStart,lineEnd; + + /* scroll */ + if(indexpageH-targetLine>=m->listSize) + targetLine = index+m->pageH-m->listSize; + delta = index-(m->displayStart+targetLine); + + if(delta>-m->pageH && deltapageH) { + if(delta>0) { + lineStart = m->pageH-delta; + lineEnd = m->pageH; + rfbDoCopyRect(m->screen,m->x1,m->y1,m->x2,m->y1+lineStart*m->textH, + 0,-delta*m->textH); + } else { + lineStart = 0; + lineEnd = -delta; + rfbDoCopyRect(m->screen, + m->x1,m->y1+lineEnd*m->textH,m->x2,m->y2, + 0,-delta*m->textH); + } + } else { + lineStart = 0; + lineEnd = m->pageH; + } + m->displayStart += delta; + for(delta=lineStart;deltaselected = index; + selPaintLine(m,m->selected-m->displayStart,TRUE); + + if(m->selChangedHook) + m->selChangedHook(index); + + /* todo: scrollbars */ +} + +static void selKbdAddEvent(Bool down,KeySym keySym,rfbClientPtr cl) +{ + if(down) { + if(keySym>' ' && keySym<0xff) { + int i; + rfbSelectData* m = (rfbSelectData*)cl->screen->screenData; + char c = tolower(keySym); + + for(i=m->selected+1;m->list[i] && tolower(m->list[i][0])!=c;i++); + if(!m->list[i]) + for(i=0;iselected && tolower(m->list[i][0])!=c;i++); + selSelect(m,i); + } else if(keySym==XK_Escape) { + rfbSelectData* m = (rfbSelectData*)cl->screen->screenData; + m->state = CANCEL; + } else if(keySym==XK_Return) { + rfbSelectData* m = (rfbSelectData*)cl->screen->screenData; + m->state = OK; + } else { + rfbSelectData* m = (rfbSelectData*)cl->screen->screenData; + int curSel=m->selected; + if(keySym==XK_Up) { + if(curSel>0) + selSelect(m,curSel-1); + } else if(keySym==XK_Down) { + if(curSel+1listSize) + selSelect(m,curSel+1); + } else { + if(keySym==XK_Page_Down) { + if(curSel+m->pageHlistSize) + selSelect(m,curSel+m->pageH); + else + selSelect(m,m->listSize-1); + } else if(keySym==XK_Page_Up) { + if(curSel-m->pageH>=0) + selSelect(m,curSel-m->pageH); + else + selSelect(m,0); + } + } + } + } +} + +static void selPtrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl) +{ + rfbSelectData* m = (rfbSelectData*)cl->screen->screenData; + if(yokY && y>=m->okY-m->textH) { + if(x>=m->okBX && xokBX+m->buttonWidth) { + if(!m->okInverted) + selPaintButtons(m,TRUE,FALSE); + if(buttonMask) + m->state = OK; + } else if(x>=m->cancelBX && xcancelBX+m->buttonWidth) { + if(!m->cancelInverted) + selPaintButtons(m,FALSE,TRUE); + if(buttonMask) + m->state = CANCEL; + } else if(m->okInverted || m->cancelInverted) + selPaintButtons(m,FALSE,FALSE); + } else { + if(m->okInverted || m->cancelInverted) + selPaintButtons(m,FALSE,FALSE); + if(!m->lastButtons && buttonMask) { + if(x>=m->x1 && xx2 && y>=m->y1 && yy2) + selSelect(m,m->displayStart+(y-m->y1)/m->textH); + } + } + m->lastButtons = buttonMask; + + /* todo: scrollbars */ +} + +static rfbCursorPtr selGetCursorPtr(rfbClientPtr cl) +{ + return(0); +} + +int rfbSelectBox(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font, + char** list, + int x1,int y1,int x2,int y2, + Pixel colour,Pixel backColour, + int border,SelectionChangedHookPtr selChangedHook) +{ + int bpp = rfbScreen->bitsPerPixel/8; + char* frameBufferBackup; + void* screenDataBackup = rfbScreen->screenData; + KbdAddEventProcPtr kbdAddEventBackup = rfbScreen->kbdAddEvent; + PtrAddEventProcPtr ptrAddEventBackup = rfbScreen->ptrAddEvent; + GetCursorProcPtr getCursorPtrBackup = rfbScreen->getCursorPtr; + DisplayHookPtr displayHookBackup = rfbScreen->displayHook; + rfbSelectData selData; + int i,j,k; + int fx1,fy1,fx2,fy2; /* for font bbox */ + + if(list==0 || *list==0) + return(-1); + + rfbWholeFontBBox(font, &fx1, &fy1, &fx2, &fy2); + selData.textH = fy2-fy1; + /* I need at least one line for the choice and one for the buttons */ + if(y2-y1screenData = &selData; + rfbScreen->kbdAddEvent = selKbdAddEvent; + rfbScreen->ptrAddEvent = selPtrAddEvent; + rfbScreen->getCursorPtr = selGetCursorPtr; + rfbScreen->displayHook = 0; + + /* backup screen */ + for(j=0;jframeBuffer+j*rfbScreen->paddedWidthInBytes+x1*bpp, + (x2-x1)*bpp); + + /* paint list and buttons */ + rfbFillRect(rfbScreen,x1,y1,x2,y2,colour); + selPaintButtons(&selData,FALSE,FALSE); + selSelect(&selData,0); + + /* modal loop */ + while(selData.state == SELECTING) + rfbProcessEvents(rfbScreen,20000); + + /* copy back screen data */ + for(j=0;jframeBuffer+j*rfbScreen->paddedWidthInBytes+x1*bpp, + frameBufferBackup+j*(x2-x1)*bpp, + (x2-x1)*bpp); + free(frameBufferBackup); + rfbMarkRectAsModified(rfbScreen,x1,y1,x2,y2); + rfbScreen->screenData = screenDataBackup; + rfbScreen->kbdAddEvent = kbdAddEventBackup; + rfbScreen->ptrAddEvent = ptrAddEventBackup; + rfbScreen->getCursorPtr = getCursorPtrBackup; + rfbScreen->displayHook = displayHookBackup; + + if(selData.state==CANCEL) + selData.selected=-1; + return(selData.selected); +} +