amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (05/08/91)
Submitted-by: RWALLACE%vax1.tcd.ie@pucc.PRINCETON.EDU Posting-number: Volume 91, Issue 097 Archive-name: applications/mandset-1.2/part01 [ includes uuencoded executable and icons ...tad ] The program in this drawer will display the Mandelbrot and Julia sets and save them to disk as IFF files. Each image takes several hours to generate, though programs which allow multitasking can be used while this is going on. #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 1)." # Contents: Mandelbrot_Set.c Mandelbrot_Set.doc console.c input.c # makefile mandelbrot0.uu mandelbrot1.uu mandelbrot_.uu saveilbm.c # scanfloat.c # Wrapped by tadguy@ab20 on Tue May 7 20:15:39 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Mandelbrot_Set.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Mandelbrot_Set.c'\" else echo shar: Extracting \"'Mandelbrot_Set.c'\" \(8069 characters\) sed "s/^X//" >'Mandelbrot_Set.c' <<'END_OF_FILE' X/* Mandelbrot and Julia set program by Russell Wallace 1987. Requires linkage X with files saveilbm.o input.o console.o. If using Aztec C, X also link with m.lib and use +L compile option. X X Original version developed with Aztec C 3.2a. Version 1.1 recompiled with X Lattice C 4.0 1 October 1988, not because I think Lattice C is better than X Aztec overall but because I can get Lattice to do double-precision floating X point (though not using the standard Amiga libraries) whereas the Aztec X version only used single precision which severely restricted the detail X which could be plotted. Use the enclosed makefile with Aztec C's make X utility to compile under Lattice (if you have both compilers...) X X Version 1.2 24 October 1988 with Lattice C 4.0, uses NTSC/PAL vertical X resolution depending on the system it's running on. Also correctly displays X the region far from the Mandelbrot set as color 0. */ X X#include <exec/exec.h> X#include <exec/execbase.h> X#include <hardware/blit.h> X#include <graphics/copper.h> X#include <graphics/regions.h> X#include <graphics/gfxbase.h> X#include <graphics/gfxmacros.h> X#include <graphics/gels.h> X#include <intuition/intuition.h> X Xstruct IntuitionBase *IntuitionBase=NULL; Xstruct GfxBase *GfxBase=NULL; X X#define MAXX 320 Xint maxy; X#define NUMITEMS 5 /* 5 items in menu */ X#define BUFLEN 50 /* Length of input buffer */ X Xshort input (); Xlong saveilbm (),start (); X Xchar inbuf[BUFLEN]; X Xstruct NewScreen MyScreen= X{ X 0,0, X MAXX,0, X 5,0,31, X 0, X CUSTOMSCREEN, X 0, X "Mandelbrot Set v1.2", X 0,0 X}; X Xstruct NewWindow DrawWindow= X{ X 0,0, X MAXX,0, X 0,31, X MENUPICK, X BORDERLESS|BACKDROP|ACTIVATE, X 0, X 0, X 0, X 0, X 0, X 0, X 0, X 0, X 0, X CUSTOMSCREEN X}; X Xstruct Screen *Screen=NULL; Xstruct Window *Backdrop=NULL; Xstruct RastPort *DrawRP; Xstruct ViewPort *DrawVP; Xstruct IntuiMessage *message; X Xstruct MenuItem MenuItems[NUMITEMS]; Xstruct IntuiText MenuText[NUMITEMS]; Xstruct Menu Menu[1]; X XBYTE titlebar=TRUE; XUSHORT palette[]={0x000,0xF00,0xF20,0xF40, X 0xF60,0xF80,0xFA0,0xFC0, X 0xFE0,0xFF0,0xEF0,0xCF0, X 0xAF0,0x8F0,0x6F0,0x4F0, X 0x2F0,0x0F0,0x0E2,0x0C4, X 0x0A6,0x088,0x06A,0x04C, X 0x02E,0x00F,0x10F,0x40F, X 0x80F,0xB0F,0xF0F,0xAAA}; /* Color palette in hex */ X Xmain () X{ X ULONG class; X USHORT code,ItemNum; X IntuitionBase=(struct IntuitionBase *)OpenLibrary ("intuition.library",0); X /* Come on, when is intuition.library not going to be available? */ X GfxBase=(struct GfxBase *)OpenLibrary ("graphics.library",0); X /* Ditto graphics.library */ X MyScreen.Height=DrawWindow.Height=maxy=GfxBase->NormalDisplayRows; X /* Fetch PAL/NTSC screen height values */ X if (!(Screen=(struct Screen *)OpenScreen (&MyScreen))) X { X cleanup (); X exit (3); X } X DrawWindow.Screen=Screen; X if (!(Backdrop=(struct Window *)OpenWindow (&DrawWindow))) X { X cleanup (); X exit (4); X } X DrawRP=Backdrop->RPort; X DrawVP=&Screen->ViewPort; X setcols (); X initmenuitems (); X initmenu (); X SetMenuStrip (Backdrop,&Menu[0]); X SetRast (DrawRP,0); X X FOREVER X { X WaitPort (Backdrop->UserPort); X while (message=(struct IntuiMessage *)GetMsg (Backdrop->UserPort)) X { X class=message->Class; X code=message->Code; X ReplyMsg (message); X if (class==MENUPICK && code!=MENUNULL) X { X ItemNum=ITEMNUM (code); X switch (ItemNum) X { X case 0: /* Show/hide title bar */ X ClearMenuStrip (Backdrop); X if (titlebar==TRUE) X { X titlebar=FALSE; X ShowTitle (Screen,0); X MenuText[0].IText=(UBYTE *)"Show Title Bar"; X } X else X { X titlebar=TRUE; X ShowTitle (Screen,1); X MenuText[0].IText=(UBYTE *)"Hide Title Bar"; X } X SetMenuStrip (Backdrop,Menu); X break; X case 1: /* Do Mandelbrot Set */ X doset (0); X break; X case 2: /* Do Julia Set */ X doset (1); X break; X case 3: /* Save screen */ X if (titlebar) X ShowTitle (Screen,0); X savescreen (); X if (titlebar) X ShowTitle (Screen,1); X break; X case 4: /* Exit */ X ClearMenuStrip (Backdrop); X cleanup (); X exit (0); X } X } X } X } X} X Xsavescreen () X{ X if (!(start (Screen,"Save screen"))) X { X DisplayBeep (Screen); X return; X } X print ("Enter filename:\n"); X inbuf[0]='\0'; X if (input (inbuf,BUFLEN)==-1000) X { X finish (); X return; X } X finish (); X if (saveilbm (DrawRP->BitMap,palette,inbuf)) X DisplayBeep (Screen); X} X Xdoset (type) Xint type; X{ X register short n,i,j; X double x,y,xx,a,b,xgap,ygap,xsquared,ysquared; X double x1,y1,x2,y2,cx,cy,scanfloat (); X if (!(start (Screen,"Enter Parameters"))) X { X DisplayBeep (Screen); X return; X } X if (type) X { X print ("Enter X component of C:\n"); X inbuf[0]='\0'; X if (input (inbuf,BUFLEN)==-1000) X { X finish (); X return; X } X cx=scanfloat (inbuf); X print ("Enter Y component of C:\n"); X inbuf[0]='\0'; X if (input (inbuf,BUFLEN)==-1000) X { X finish (); X return; X } X cy=scanfloat (inbuf); X } XENTERAGAIN: X print ("Enter bottom left X co-ord:\n"); X inbuf[0]='\0'; X if (input (inbuf,BUFLEN)==-1000) X { X finish (); X return; X } X x1=scanfloat (inbuf); X print ("Enter bottom left Y co-ord:\n"); X inbuf[0]='\0'; X if (input (inbuf,BUFLEN)==-1000) X { X finish (); X return; X } X y1=scanfloat (inbuf); X print ("Enter top right X co-ord:\n"); X inbuf[0]='\0'; X if (input (inbuf,BUFLEN)==-1000) X { X finish (); X return; X } X x2=scanfloat (inbuf); X print ("Enter top right Y co-ord:\n"); X inbuf[0]='\0'; X if (input (inbuf,BUFLEN)==-1000) X { X finish (); X return; X } X y2=scanfloat (inbuf); X if (y2<=y1 || x2<=x1) X { X print ("Invalid co-ordinates!\n"); X goto ENTERAGAIN; X } X finish (); X SetRast (DrawRP,0); X xgap=(x2-x1)/MAXX; X ygap=(y2-y1)/maxy; X b=y1; /* Y co-ord */ X for (j=maxy-1;j>=0;j--) /* Run up screen */ X { X a=x1; X for (i=0;i<MAXX;i++) /* Run across row on screen */ X { X n=0; X x=a; /* x,y contain temporary co-ords of current point */ X y=b; /* which will be used in calculations */ X xsquared=x*x; X ysquared=y*y; X /* calculate squares for initial check in loop */ X if (type==0) /* Mandelbrot set */ X while (n<511 && xsquared+ysquared<4) X { X xsquared=x*x; X ysquared=y*y; X xx=xsquared-ysquared+a; X y*=x; X y+=y; X y+=b; X x=xx; X n++; X } X else /* Julia set */ X while (n<511 && xsquared+ysquared<4) X { X xsquared=x*x; X ysquared=y*y; X xx=xsquared-ysquared+cx; X y=2*x*y+cy; X x=xx; X n++; X } X SetAPen (DrawRP,(long)(n&31)); /* Color point depending on n */ X WritePixel (DrawRP,(long)i,(long)j); X a+=xgap; /* Increment logical X co-ord */ X } X b+=ygap; /* Increment logical Y co-ord */ X } X} X Xsetcols () X{ X short i; X for (i=0;i<32;i++) X SetRGB4 (DrawVP,(long)i,(long)((palette[i] & 0xF00)>>8),(long)((palette[i] & 0xF0)>>4),(long)(palette[i] & 0xF)); X} X Xinitmenuitems () X{ X register short n; X for (n=0;n<NUMITEMS;n++) X { X MenuItems[n].LeftEdge=0; X MenuItems[n].TopEdge=10*n; X MenuItems[n].Width=144; /* 8 times no. of chars */ X MenuItems[n].Height=10; X MenuItems[n].Flags=ITEMTEXT|ITEMENABLED|HIGHCOMP; X MenuItems[n].MutualExclude=0; X MenuItems[n].ItemFill=(APTR)&MenuText[n]; X MenuItems[n].SelectFill=NULL; X MenuItems[n].Command=0; X MenuItems[n].SubItem=NULL; X MenuItems[n].NextSelect=0; X MenuItems[n].NextItem=&MenuItems[n+1]; X MenuText[n].FrontPen=0; X MenuText[n].BackPen=31; X MenuText[n].DrawMode=JAM2; X MenuText[n].LeftEdge=0; X MenuText[n].TopEdge=1; X MenuText[n].ITextFont=0; X MenuText[n].NextText=0; X } X MenuItems[NUMITEMS-1].NextItem=NULL; X MenuText[0].IText=(UBYTE *)"Hide Title Bar"; X MenuText[1].IText=(UBYTE *)"Do Mandelbrot Set"; X MenuText[2].IText=(UBYTE *)"Do Julia Set"; X MenuText[3].IText=(UBYTE *)"Save Screen"; X MenuText[4].IText=(UBYTE *)"Exit"; X} X Xinitmenu () X{ X Menu[0].NextMenu=0; X Menu[0].LeftEdge=0; X Menu[0].TopEdge=0; X Menu[0].Width=85; X Menu[0].Height=10; X Menu[0].Flags=MENUENABLED; X Menu[0].MenuName="Options"; X Menu[0].FirstItem=&MenuItems[0]; X} X Xcleanup () X{ X if (Backdrop) X CloseWindow (Backdrop); X if (Screen) X CloseScreen (Screen); X CloseLibrary (GfxBase); X CloseLibrary (IntuitionBase); X} END_OF_FILE if test 8069 -ne `wc -c <'Mandelbrot_Set.c'`; then echo shar: \"'Mandelbrot_Set.c'\" unpacked with wrong size! fi # end of 'Mandelbrot_Set.c' fi if test -f 'Mandelbrot_Set.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Mandelbrot_Set.doc'\" else echo shar: Extracting \"'Mandelbrot_Set.doc'\" \(4263 characters\) sed "s/^X//" >'Mandelbrot_Set.doc' <<'END_OF_FILE' X THE MANDELBROT SET X XA complex number is of the form a+bi, where i represents the square root Xof minus one. Two complex numbers are added by simply adding their Xcomponents. Two complex numbers are multiplied as follows: X X (a+bi)(c+di) = ac + cbi + adi - db X Xremembering that i squared = -1. Complex numbers can be thought of as Xpoints on a plane, with a representing the X co-ordinate and b the Y Xco-ordinate. Now take the operation: X X z = z*z + c X Xwhere z and c are complex numbers. If z is initially set to 0 and c is a Xpoint on the plane, iterating (repeating) this operation many times will Xcause the point represented by z to wander in an irregular pattern. Some Xinitial values of c will cause z to increase without limit, while other Xvalues will cause it to always stay within a certain range. In fact, if Xthe distance of z from the origin (i.e. sqrt (a*a + b*b)) ever exceeds 2, Xz is destined to wander to infinity. The Mandelbrot set is the set of all Xpoints Xwhich will always stay within a finite range, no matter how many times Xthe operation is applied. X Suppose that for every point within a rectangular area of the plane, Xwe use the point as an initial value for c and do z=z*z+c until either Xwe've done it 1000 times or the distance of z from the origin exceeds 2. XThe points for which we only had to do it a few times are far away from Xthe Mandelbrot set. Those which required a lot of iterations are close to Xit, and the ones which were still within 2 after 1000 calculations are, Xas far as we can tell, within it. (There will be a few points which would Xhave exceeded 2 after more than 1000 iterations; 1000 is a reasonable Xcompromise between processing time and accuracy.) If we now plot the Xpoints on a computer screen using different colors to represent varying Xdistances from the Mandelbrot set, a striking and colorful display can be Xcreated. X The Mandelbrot set is of finite size, and if a large region of the Xplane is plotted it looks like a small blob of color floating in a vast Xuniform sea. Co-ordinate ranges of X from -2 to .5 and Y from -1.25 to X1.25 more or less display the full set, you can input a narrower range of Xvalues to zoom in on a region near the edge of the set, then zoom in on a Xsmall part of this region, etc. The boundary of the set is a fractal - it Xshows similar but not identical detail at every scale, and is infinitely Xconvoluted. The limit of magnification is determined by the precision to Xwhich the calculations are done. The Amiga stores double precision Xnumbers to about 16 digits. This means that, if the Mandelbrot set were Xthe size of Western Europe, the smallest distinguishable elements of it Xwould be the size of atoms. X For the Mandelbrot set, we used the array of points to provide Xstarting values for c and always set z to 0. If we use different fixed Xstarting values of z, the result is simply a distorted version of the set X- as a writer in Scientific American magazine put it, "one prefers the Xcanonical object". What happens if we use a fixed value of c and obtain Xthe starting value of z from the array of points? In this case a Julia Xset is displayed - a different one for each value of c. Julia sets, like Xthe Mandelbrot set, are fractals, and their overall shape is related to Xthe position of c in the Mandelbrot set. X The program in this drawer will display the Mandelbrot and Julia Xsets and save them to disk as IFF files. Each image takes several hours Xto generate, though programs which allow multitasking can be used while Xthis is going on. When asked to enter the co-ordinate ranges, note that Xincreasing Y values are plotteed up the screen not down, and that the Xbottom left co-ordinates must be less than the top-right corner ones. Now Xfor the legal and financial stuff. This is a shareware program. You may Xfreely copy it, put it on bulletin boards etc. If you have not already Xpaid for this copy and wish to use it, please send a small Xcontribution to: Russell Wallace, 24 Lower Georges St, Dunlaoghaire, Co. XDublin, Ireland. Further programs and example images can be obtained by Xsending a blank disk (or better still, a disk with some interesting stuff Xon it) to the same source. END_OF_FILE if test 4263 -ne `wc -c <'Mandelbrot_Set.doc'`; then echo shar: \"'Mandelbrot_Set.doc'\" unpacked with wrong size! fi # end of 'Mandelbrot_Set.doc' fi if test -f 'console.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'console.c'\" else echo shar: Extracting \"'console.c'\" \(6098 characters\) sed "s/^X//" >'console.c' <<'END_OF_FILE' X X/* Console routines by Russell Wallace 1987, some obtained from other programs X * books etc. Feel free to copy them or use them in your own programs. Use X * +L option if compiling with Aztec C. */ X X#include "exec/exec.h" X#include "devices/console.h" X#include "devices/keymap.h" X#include "libraries/dos.h" X#include "intuition/intuition.h" X X#define INTUITION_MESSAGE (1<<intuitionMsgBit) X#define TYPED_CHARACTER (1<<consoleReadBit) X#define CloseConsole(x) CloseDevice(x) X#define XOFFSET 26 X#define YOFFSET 39 X Xextern struct Window *OpenWindow (); Xextern struct MsgPort *CreatePort (); Xextern struct IOStdReq *CreateStdIO (); X Xshort line,column; Xint class,code; Xstruct NewWindow mynewwindow= X{ X 20,20, /* x,y co-ords of top left corner */ X 280,100, /* start size */ X 0,31, /* detailpen,blockpen */ X MENUPICK|CLOSEWINDOW, /* want to know if these happen */ X ACTIVATE|GIMMEZEROZERO|WINDOWDRAG|WINDOWCLOSE, X 0,0,0,0,0, X 120,88, /* minimum size */ X 640,256, /* maximum size */ X CUSTOMSCREEN X}; Xstruct IOStdReq *consoleWriteMsg=0; Xstruct IOStdReq *consoleReadMsg=0; Xstruct MsgPort *consoleWritePort=0; Xstruct MsgPort *consoleReadPort=0; Xunsigned char letter; Xstruct Window *mywindow=0; Xstruct IntuiMessage *con_message; X X /* Start() must be called at beginning; returns window pointer - if 0, X * program has failed ... everything already cleaned up here, main () X * must do its own cleaning up then exit */ X Xstruct Window *start (screen,title) Xstruct Screen *screen; Xchar *title; X{ X int consoleReadBit,intuitionMsgBit; X line=column=0; X mynewwindow.Title=title; X mynewwindow.Screen=screen; X if (!(mywindow=OpenWindow (&mynewwindow))) X goto FAILED; X if (!(consoleWritePort=CreatePort ("my.con.write",0))) X goto FAILED; X if (!(consoleReadPort=CreatePort ("my.con.read",0))) X goto FAILED; X if (!(consoleWriteMsg=CreateStdIO (consoleWritePort))) X goto FAILED; X if (!(consoleReadMsg=CreateStdIO (consoleReadPort))) X goto FAILED; X if (OpenConsole (consoleWriteMsg,consoleReadMsg,mywindow)) X goto FAILED; X QueueRead (consoleReadMsg,&letter); X consoleReadBit=consoleReadPort->mp_SigBit; X intuitionMsgBit=mywindow->UserPort->mp_SigBit; X SetAPen (mywindow->RPort,2); X return (mywindow); XFAILED: X closeall (); X return (0L); X} X X /* Call finish() at the end IF start() was successful */ X Xfinish () X{ X AbortIO (consoleReadMsg); X CloseConsole (consoleWriteMsg); X closeall (); X} X Xcloseall () X{ X if (mywindow) X CloseWindow (mywindow); X if (consoleWritePort) X DeletePort (consoleWritePort); X if (consoleReadPort) X DeletePort (consoleReadPort); X if (consoleWriteMsg) X DeleteStdIO (consoleWriteMsg); X if (consoleReadMsg) X DeleteStdIO (consoleReadMsg); X} X Xint OpenConsole (writerequest,readrequest,window) Xstruct IOStdReq *writerequest,*readrequest; Xstruct Window *window; X{ X register int error; X writerequest->io_Data=(APTR)window; X writerequest->io_Length=sizeof(*window); X error=OpenDevice ("console.device",0,writerequest,0); X readrequest->io_Device=writerequest->io_Device; X readrequest->io_Unit =writerequest->io_Unit; X return (error); X} X XQueueRead (request,whereto) Xstruct IOStdReq *request; Xchar *whereto; X{ X request->io_Command=CMD_READ; X request->io_Data=(APTR)whereto; X request->io_Length=1; X SendIO (request); X} X X /* Call checkinput() every so often to find out what the user is doing: X * a -ve number -1,-2 ... means the user has selected menu item 1,2 ... X * a +ve number means the user has typed a character, 1000 means the X * closewindow gadget has been selected, so do your ARE YOU SURE routine X * then call finish() and wind up. 0 means nothing's happened. */ X Xshort checkinput () X{ X if (con_message=(struct IntuiMessage *)GetMsg (mywindow->UserPort)) X { X class=con_message->Class; X code=con_message->Code; X ReplyMsg (con_message); X if (class==CLOSEWINDOW) X return ((short)1000); X if (class==MENUPICK && code!=MENUNULL) X return ((short)(-1-ITEMNUM (code))); X } X if (GetMsg (consoleReadPort)) X { X code=letter; X QueueRead (consoleReadMsg,&letter); X return ((short)code); X } X return ((short)0); X} X X /* Writechar() writes a character to the window ... to get a response from X * typed input, call it immediately with any characters returned from X * checkinput(). */ X Xwritechar (c) /* NOTE - MUST BE CALLED WITH THE CHARACTER CAST TO TYPE LONG*/ Xchar c; /* Don't blame me, I don't know why, blame the Amiga */ X{ /* systems programmers. */ X consoleWriteMsg->io_Command=CMD_WRITE; X consoleWriteMsg->io_Data=(APTR)&c; X consoleWriteMsg->io_Length=1; X DoIO (consoleWriteMsg); X if (c=='\n') X { X column=0; X line++; X } X if (c!='\n') X column++; X if ((line<<3)+YOFFSET > mywindow->Height) X { X print ("MORE..."); X while (checkinput ()<1 || checkinput ()==1000) X ; X line=0; X print ("\r \r"); X X /* This is to prevent a large quantity of text from scrolling off the top X * of the window before the user has time to read it all e.g. in X * adventure games. Remove it if you don't need it. Note - don't let the X * user make the window too small vertically or an infinite loop occurs.*/ X X } X} X X /* Print() does a formatted (i.e. trying not to split up words on the ends X * of lines) print of a null-terminated string; very useful for text- X * oriented applications in a variable-sized window. */ X Xprint (string) Xchar *string; X{ X short x; X for (;;) X { X x=0; X while (string[x]!='\0' && string[x]!=' ' && string[x]!='\n') X x++; X if (((column+x)<<3)+XOFFSET > mywindow->Width && column) X { /* If word would go off end of line, */ X writechar ((long)'\n'); /* go on to next line before print */ X } X consoleWriteMsg->io_Command=CMD_WRITE; X consoleWriteMsg->io_Data=(APTR)string; X consoleWriteMsg->io_Length=x; X DoIO (consoleWriteMsg); X column+=x; X if (string[x]=='\n') X writechar ((long)'\n'); X if (string[x]==' ') X writechar ((long)' '); X if (string[x]=='\0') X break; X string+=x+1; X } X} X Xnprint (string) /* Non-formatted print */ Xchar *string; X{ X consoleWriteMsg->io_Command=CMD_WRITE; X consoleWriteMsg->io_Data=(APTR)string; X consoleWriteMsg->io_Length=-1; X DoIO (consoleWriteMsg); X} X Xresetscroll () /* Reset scroll pause feature */ X{ X line=0; X} END_OF_FILE if test 6098 -ne `wc -c <'console.c'`; then echo shar: \"'console.c'\" unpacked with wrong size! fi # end of 'console.c' fi if test -f 'input.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'input.c'\" else echo shar: Extracting \"'input.c'\" \(3067 characters\) sed "s/^X//" >'input.c' <<'END_OF_FILE' X X/* Text input routine by Russell Wallace 1987. Feel free to copy it and use it X * in your own programs. Requires linkage to my set of console routines, X * console.o. Backspace and cursor keys can be used. DEL key puts X * linefeed character in string, RETURN key ends input. Selection of menu X * item or closewindow gadget will break off input and return -ve number, X * otherwise length of typed-in string returned. Existing text is displayed X * for editing; if you don't want that, do a string[0]='\0' before calling. */ X Xshort input (string,length) Xunsigned char *string; /* Address of buffer to put text */ Xlong length; /* Length of buffer */ X{ X short c; /* Key pressed */ X short x; /* Position in buffer */ X short actlen=0; /* Actual length of typed-in string */ X register short i; X resetscroll (); X for (x=0;string[x]!='\0';x++) /* Convert all CRs in existing string to */ X if (string[x]=='\n') /* editable characters */ X string[x]=127; X nprint (string); /* Non-formatted print on screen for editing */ X for (;;) X { X do X c=checkinput (); X while (!c); X if (actlen<x) X actlen=x; X if (c==1000) /* Close window ... cancel edit */ X { X actlen=-1000; X goto ENDINPUT; X } X if (c<0) /* Menu select ... cancel edit */ X { X actlen=c; X goto ENDINPUT; X } X if (c=='\r') /* Pressed CR ... end edit */ X goto ENDINPUT; X if (c==8 && x) /* Backspace key */ X { X for (i=x-1;i<actlen;i++) /* Delete character in string buffer */ X string[i]=string[i+1]; X writechar ((long)8); X nprint ((long)(string+(--x))); /* Delete on screen */ X writechar ((long)' '); X for (i=x;i<actlen;i++) X writechar ((long)8); X actlen--; /* One fewer characters */ X } X if (c==155) /* Code indicating a cursor key etc. */ X { X do X c=checkinput (); /* Find out which one */ X while (!c); X if (c==67 && x<actlen) /* Move right */ X { X writechar ((long)155); X writechar ((long)67); X x++; X } X if (c==68 && x) /* Move left */ X { X writechar ((long)155); X writechar ((long)68); X x--; X } X if (c==65 && x>7) /* Up=back 8 spaces */ X { X x-=8; X for (i=0;i<8;i++) X { X writechar ((long)155); X writechar ((long)68); X } X } X if (c==66 && x<actlen-7) /* Down=forward 8 */ X { X x+=8; X for (i=0;i<8;i++) X { X writechar ((long)155); X writechar ((long)67); X } X } X c=0; X } X if (c>31 && c<128 && actlen<length-1) X { X for (i=actlen;i>x;i--) X string[i]=string[i-1]; X string[++actlen]='\0'; X string[x++]=c; X nprint ((long)(string+x-1)); X for (i=x;i<actlen;i++) X writechar ((long)8); X } X } XENDINPUT: X for (i=0;i<x;i++) X if (string[i]==127) /* Convert peculiar characters back into */ X string[i]='\n'; /* CRs for use */ X string[actlen]='\0'; /* Stick null on end of string */ X for (i=x;i<actlen;i++) X { X writechar ((long)155); /* Move cursor to end of string */ X writechar ((long)67); X } X writechar ((long)'\n'); /* Print out CR */ X resetscroll (); /* This has introduced a pause sufficient for any */ X return (actlen); /* preceding text to have been read */ X} END_OF_FILE if test 3067 -ne `wc -c <'input.c'`; then echo shar: \"'input.c'\" unpacked with wrong size! fi # end of 'input.c' fi if test -f 'makefile' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'makefile'\" else echo shar: Extracting \"'makefile'\" \(240 characters\) sed "s/^X//" >'makefile' <<'END_OF_FILE' X.c.o: X lc1 -cs -cw -b $* X lc2 -v $* Xmandelbrot_set: mandelbrot_set.o scanfloat.o saveilbm.o input.o console.o X blink from c.o+mandelbrot_set.o+scanfloat.o+saveilbm.o+input.o+console.o to mandelbrot_set lib lcm.lib+lc.lib+amiga.lib nd sc sd END_OF_FILE if test 240 -ne `wc -c <'makefile'`; then echo shar: \"'makefile'\" unpacked with wrong size! fi # end of 'makefile' fi if test -f 'mandelbrot0.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mandelbrot0.uu'\" else echo shar: Extracting \"'mandelbrot0.uu'\" \(565 characters\) sed "s/^X//" >'mandelbrot0.uu' <<'END_OF_FILE' Xbegin 644 mandelbrot_set.doc.info XMXQ```0``````N0`9`"@`%0`$``,``0##L]``````````````````````````1 XM````!`@`P>'P`````````+4````.```````````````````````H`!4``@`!A XM>Z@#```````````````____,```____/```____/P``X`__/\``____````XU XM`____``______``______``_A`#`?``______``Y`(``?``______``X``!`) XM?``______``______``___X`?``______``______`````````````````#_3 XM___\``#````S``#````PP`#````P,`#'_``P#`#````__P#'_````P#`````` XM`P#``````P#`>_\_@P#``````P#&_W__@P#``````P#'__^_@P#``````P#`8 XM`````P#```'_@P#``````P#``````P#______P`````````````+.DUO<W0O> X%36]S=`#`C X`` Xend Xsize 365 END_OF_FILE if test 565 -ne `wc -c <'mandelbrot0.uu'`; then echo shar: \"'mandelbrot0.uu'\" unpacked with wrong size! fi # end of 'mandelbrot0.uu' fi if test -f 'mandelbrot1.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mandelbrot1.uu'\" else echo shar: Extracting \"'mandelbrot1.uu'\" \(1223 characters\) sed "s/^X//" >'mandelbrot1.uu' <<'END_OF_FILE' Xbegin 644 mandelbrot_set.info XMXQ```0``````.0`2`$8`)@`%``,``0#%.[``````````````````````````D XM`````_P``````````````#4````'``````````````````````!&`"4``@`"J XMKM`#``````````````0````````````"````````````!P```````````!_@- XM```````````P<```````````(#```````````#E@```````````/P```````8 XM```#___`````````'@@&.````````&$``"8```````&````!@``````&````T XM`,````/@"`````!@```.'#``````Z```-@<@`````!``%F`1X``````8`%O@T XM"\``````&``>@`/```````P``,`&@``````$``!@'*``````(```'_"`````E XM`$@`````P``````P`````&`````#8``````R`````,``````#P````<`````# XM``/````,````````.0``<`````````?\`\``````````/_T``````````!'`+ XM```````````@0```````````*,```````````#^````````````.````````5 XM````"`````````````(````````````$`````````````@````````````<`7 XM```````````9H```````````+[```````````#_P```````````^X```````E XM````#\```````````^?_P````````!WW^?@```````!>___>```````!____U XM_X```````______````#X`______X```#_PO_____S@``#G_/______P`!9_R XM[Y______^`!;W_7______^@`'O_]O______\``"__O_______```?^S?____@ XM_]@``!_`______^X`````/______\`````!?_____.``````/?_____`````% XM``[____[```````#____^````````"[__Y`````````'^__``````````#_\V XM```````````>P```````````/\```````````#?````````````[@```````/ X<````#@````````````@``````````````````#?`- X`` Xend Xsize 838 END_OF_FILE if test 1223 -ne `wc -c <'mandelbrot1.uu'`; then echo shar: \"'mandelbrot1.uu'\" unpacked with wrong size! fi # end of 'mandelbrot1.uu' fi if test -f 'mandelbrot_.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mandelbrot_.uu'\" else echo shar: Extracting \"'mandelbrot_.uu'\" \(19935 characters\) sed "s/^X//" >'mandelbrot_.uu' <<'END_OF_FILE' Xbegin 644 mandelbrot_set XM```#\P`````````"``````````$```Q)```"`0```^D```Q)2.=^_DOO`#0D/ XM2"0`2?D`````+'@`!"E.`$`I3P!,0JP`2)/)3J[^VB9`*6L`F``X2JL`K&<`) XM`'`@#9"M``0&@````(`I0``$80`!>B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI0 XM20!4T(%2@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@( XM(`!3@A^Q(``@`%'*__@B3R\)8```;"EK`#H`!`:L````@``$80`!#F$``/@I& XM0`!(+P`D0"`J`"1G$BQL!%P@0"(H```I00`X3J[_@B(J`"!G&B0\```#[4ZN\ XM_^(I0`!09PKEB"!`)V@`"`"D(&P`2"\(2&P``"!H`"0I:``$`%1'^0``!&QR) XM`"`\````YF`")L%1R/_\3KHFH'``8`0@+P`$+P`@+``L9P0@0$Z03KHCXBQX5 XM``0B;`1<3J[^8DJL!&!G"")L!&!.KOYB2JP$9&<((FP$9$ZN_F)*K`!89P@BC XM;`!83J[^8DJL`$AG)"(L`#QG!$ZN_]PB+`!09P1.KO_<+'@`!$ZN_WPB;`!(* XM3J[^AB`?+FP`3$S??WY.=7!D8(!!ZP!<3J[^@$'K`%Q.KOZ,3G5#[`!<<`!.@ XMKOW8*4`$7&?:3G4``$Y5__A"ITAL`1Y.NBX44$\I0`!H0J=(;`$P3KHN!%!/' XM*4``;'``(&P`;#`H`-@I0`1L.4``JCE``(I(;`"$3KHNM%A/*4``U$J`9@YA1 XM``C,2'@``TZZ(3I83REL`-0`PDAL`*1.NBZB6$\I0`#82H!F#F$`"*9(>``$U XM3KHA%%A/(&P`V"EH`#($HB!L`-30_``L*4@$IF$`!LIA``<X80`(2$AL!;PO* XM+`#83KHN<%!/0J<O+`2B3KHM@%!/(&P`V"\H`%9.NBS"6$\@;`#8+R@`5DZZ. XM+(Q83RE`!*I*@&?<($`K:``4__P[:``8__HO`$ZZ+()83PRM```!`/_\9LHR< XM+?_Z#$'__V?`ZDD"00`_.T'_^`Q!``5DL.5!3OL0`F```!)@``!H8```<&``1 XM`'I@``"D+RP`V$ZZ+6I83Q`L`-Q3`&8:0BP`W$*G+RP`U$ZZ+>)03T'L`4(I3 XM2`5D8!P9?``!`-Q(>``!+RP`U$ZZ+<103T'L`5(I2`5D2&P%O"\L`-A.NBV6T XM4$]@`/\^0J=A``#06$]@`/\R2'@``6$``,)83V``_R1*+`#<9PQ"IR\L`-1.' XMNBU^4$]A-$HL`-QG`/\(2'@``2\L`-1.NBUF4$]@`/[V+RP`V$ZZ+,A83V$`. XM!SA"ITZZ'ZA83V``_MQ(;`%B+RP`U$ZZ$2I03TJ`9@PO+`#43KHLV%A/8%)(8 XM;`%N3KH4#EA/0BP$<$AX`#)(;`1P3KH.,E!/#$#\&&8&3KH1V&`J3KH1TDALU XM!'!(;`#>(&P$HB\H``1.N@C,3^\`#$J`9PHO+`#43KHLA%A/3G5.5?]R2.<W_ XM`$AL`8`O+`#43KH0L%!/2H!F#B\L`-1.NBQ>6$]@``322JT`"&=X2&P!DDZZ4 XM$XQ83T(L!'!(>``R2&P$<$ZZ#;!03PQ`_!AF"$ZZ$59@``2B2&P$<$ZZ!I!8' XM3TAL`:PK0/^**T'_CDZZ$U!83T(L!'!(>``R2&P$<$ZZ#7103PQ`_!AF"$ZZI XM$1I@``1F2&P$<$ZZ!E183RM`_X(K0?^&2&P!QDZZ$Q183T(L!'!(>``R2&P$@ XM<$ZZ#3A03PQ`_!AF"$ZZ$-Y@``0J2&P$<$ZZ!AA83TAL`>0K0/^J*T'_KDZZQ XM$MA83T(L!'!(>``R2&P$<$ZZ#/Q03PQ`_!AF"$ZZ$*)@``/N2&P$<$ZZ!=Q8^ XM3TAL`@(K0/^B*T'_IDZZ$IQ83T(L!'!(>``R2&P$<$ZZ#,!03PQ`_!AF"$ZZ& XM$&9@``.R2&P$<$ZZ!:!83TAL`AXK0/^:*T'_GDZZ$F!83T(L!'!(>``R2&P$5 XM<$ZZ#(103PQ`_!AF"$ZZ$"I@``-V2&P$<$ZZ!6183RM`_Y(K0?^6)"W_HB8M2 XM_Z9.NA9N;Q8@+?^:(BW_GB0M_ZHF+?^N3KH66&X.2&P".DZZ$@!83V``_N!.Q XMN@_>0J<O+`2B3KHJ`E!/("W_FB(M_YXD+?^J)BW_KDZZ$T8D/$!T``!V`$ZZC XM%IPK0/_*("W_DBM!_\XB+?^6)"W_HB8M_Z9.NA,>+T``%"`L!&PO00`83KH<O XM+"]``!P@+P`4+T$`("(O`!@D+P`<)B\`($ZZ%E0K;?^B_](K;?^F_]8D+`1L% XM4X(J`BM`_\(K0?_&2D5K``*8*VW_JO_:*VW_KO_>?``,1@%`;``"8'X`("W_5 XMVB(M_]XD+?_2)BW_UBM`__(K0?_V*T+_ZB0M__(K0__N)BW_]DZZ&$8K0/^Z2 XM("W_ZBM!_[XB+?_N)"W_ZB8M_^Y.NA@J*T#_LBM!_[9*K0`(9@``Y`Q'`?]LD XM``&N("W_NB(M_[XD+?^R)BW_MDZZ$C8D/$`0``!V`$ZZ%19L``&*("W_\B(MX XM__8D+?_R)BW_]DZZ%]HK0/^Z("W_ZBM!_[XB+?_N)"W_ZB8M_^Y.NA>^*T#_X XMLB`M_[HK0?^V(BW_OB0M_[(F+?^V3KH1Z"0M_]HF+?_>3KH1SBM`_^(@+?_JS XM*T'_YB(M_^XD+?_R)BW_]DZZ%WHK0/_J*T'_[B0M_^HF+?_N3KH1GBM`_^HK- XM0?_N)"W_TB8M_]9.NA&**VW_XO_R*VW_YO_V4D<K0/_J*T'_[F``_R`,1P'_/ XM;```S"`M_[HB+?^^)"W_LB8M_[9.NA%4)#Q`$```=@!.NA0T;```J"`M__(BK XM+?_V)"W_\B8M__9.NA;X*T#_NB`M_^HK0?^^(BW_[B0M_^HF+?_N3KH6W"M`@ XM_[(@+?^Z*T'_MB(M_[XD+?^R)BW_MDZZ$08D+?^*)BW_CDZZ$.PK0/_B("W_C XM\BM!_^8B+?_V)#Q`````=@!.NA:8)"W_ZB8M_^Y.NA:,)"W_@B8M_X9.NA"XQ XM*VW_XO_R*VW_YO_V4D<K0/_J*T'_[F``_S`@!TC``H`````?+P`O+`2B3KHG@ XMDE!/(`9(P"(%2,$O`2\`+RP$HDZZ)V!/[P`,("W_VB(M_]XD+?_*)BW_SDZZ< XM$%PK0/_:*T'_WE)&8`#]G"`M_](B+?_6)"W_PB8M_\9.NA`Z*T#_TBM!_]938 XM16``_69,WP#L3EU.=4Y5__Y(YS``0FW__C(M__X,00`@;%1(P3`M__Y(P-"`\ XM0>P`WB)(T\!T`#01`H(```\`X(HB2-/`=@`V$0*#````\.B+T<!P`#`0`H``C XM```/+P`O`R\"+P$O+`2F3KHFD$_O`!12;?_^8*),WP`,3EU.=4Y5__Y(YSTP% XM?@`,1P`%;```T"`'<B+!P4'L!*XB2-/`=``S0@`$(DC3P"8'>`K'Q#-#``8BM XM2-/`,WP`D``((DC3P#-$``HB2-/`,WP`4@`,(DC3P'8`(T,`#B)(T\`H!\G\" XM`!1%[`58)DK7Q"-+`!(B2-/`(T,`%B)(T\!Z`!-%`!HB2-/`(T,`'")(T\`S^ XM0@`@T<`@!\'!0^P$T-/`((D@2M'$$(4@2M'$$7P`'P`!($K1Q!%\``$``B!*4 XMT<0Q0@`$($K1Q#%\``$`!B!*T<0A0P`(U<0E0P`04D=@`/\L0JP%-D'L`5(IQ XM2`5D0>P"4BE(!7A![`)D*4@%C$'L`G(I2`6@0>P"?BE(!;1,WPR\3EU.=4*L2 XM!;QP`#E`!<`Y0`7".7P`507$.7P`"@7&.7P``07(0>P"A"E(!<I![`2N*4@%7 XMSDYU2JP`V&<*+RP`V$ZZ):983TJL`-1G"B\L`-1.NB6"6$\O+`!L3KHD7%A/S XM+RP`:$ZZ)%)83TYU3E7_ZDCG!P!Z`"X%(&T`"!`P<``,```P;08,```Y;QX0P XM,'``#```+6<4$#!P``P``"YG"DHP<`!G!%)'8,X@;0`($#!P``P``"UF)GH!0 XM4D<0,'``#```,&T&#```.6\2$#!P``P``"YG"'``<@!@``%0$#!P`$H`9@AP" XM`'(`8``!0-#'?@`K2``((&T`"!`P<``,```P;0H,```Y;@121V#H+`="K?_R& XM0JW_]BM\/_```/_J*WP`````_^Y31TI':U8@;0`($#!P`$B`2,`$@````#!.Z XMNA:*)"W_ZB8M_^Y.NA,:)"W_\B8M__9.N@U&*T#_\B`M_^HK0?_V(BW_[B0\] XM0"0``'8`3KH2\BM`_^HK0?_N4T=@IBM\/[F9F?_J*WR9F9F9_^X@;0`($#!@: XM``P``"YF;B`&(`920"X`(&T`"!`P<``,```P;5@,```Y;E(0,'``2(!(P`2`I XM````,$ZZ%?XD+?_J)BW_[DZZ$HXD+?_R)BW_]DZZ#+HK0/_R("W_ZBM!__8B: XM+?_N)#Q`)```=@!.NA`.*T#_ZBM!_^Y21V":2D5G#B`M__(B+?_V3KH3^F`*_ XM("W_\B(M__9.<4S?`.!.74YU3E7_LDCG/`!(>`/N+RT`$$ZZ(5903RM`_[9*> XM@&8&<`%@``1L<``@;0`(,!`B`.>!=``T*``"%B@`!7@`&"@`!1M#_\\"@P``_ XM`/]Z`>>E*T#_V"M`__0K0?_\(@).NAUF*T'_^"M!_]PB!$ZZ'5@&@```$`!"A XMIR\`*T'_X"M%_^1.NB$R4$\K0/_*2H!F$"\M_[9.NB#P6$]P`F```_(I;?_*8 XM!=Q(;`*,80`#[%A/6*P%W$AL`I)A``/>6$](;`*880`#U%A/2'@`%&$`!`18R XM3R\M__QA``1&6$\O+?_X80`$/%A/0J=A``0T6$]"IV$`!"Q83R!L!=P0K?_/5 XM4JP%W'``(&P%W!"`4JP%W"!L!=P0O``!4JP%W"!L!=P0@%*L!=Q"IV$``_98[ XM3W``(&P%W!"`4JP%W"!L!=P0@%*L!=PO+?_\80`#UEA/+RW_^&$``\Q83TAL- XM`IYA``,\6$\@+?_DY8B0K?_D+P!A``-D6$]"K?_P(BW_\+*M_^1L2"`!T(!RW XM`"!M``PR,`@`(`'@B.F`(&P%W!"`4JP%W"`!`H````#P(&P%W!"`4JP%W`*!# XM````#^F!(&P%W!"!4JP%W%*M__!@KB`M_^3EB)"M_^0(````9PH@;`7<0A!29 XMK`7<2&P"I&$``K!83R!L!=Q8K`7<0JW_\"M(_\8B+?_PLJW_^&P``=!"K?_LT XM<``0+?_/)"W_[+2`9``!M"`"Y8`O0``0("W_]"(M__!.NAN8(FT`""(O`!`@; XM<1@(T<!P`"M`_]0K0/_0*TC_PE*M_]0@+?_4L*W_]&TJ(@!$@20M_]#2@E*!% XM(&P%W!"!4JP%W"!M_\(B;`7<$K`H`%*L!=Q@``%`(&W_PA(P"``4,`C_L@)G" XMN"(`1($D+?_0TH)2@2)L!=P2@5*L!=PB;`7<$K`H`%*L!=PK0/_04JW_U"`M8 XM_]2PK?_T;3@B+?_0D(%3@"!L!=P0@%*L!=PK0?_H(BW_Z+*M_]1L``#:(&W_S XMPB)L!=P2L!@`4JP%W%*M_^A@WB!M_\(B+?_4$#`8`!0P&/^P`F:F4JW_U"`M. XM_]2PK?_T;3@B+?_0D(%3@"!L!=P0@%*L!=PK0?_H(BW_Z+*M_]1L``"`(&W_9 XMPB)L!=P2L!@`4JP%W%*M_^A@WB!M_\(B+?_4$#`8`!0P&/^P`F8`_TP@+?_0P XMDH`,@0````)O`/[.5X$@;`7<$(%2K`7<*T#_Z"`M_]15@"0M_^BT@&P6(&W_2 XMPB)L!=P2L"@`4JP%W%*M_^A@W"`M_]15@"M`_]!@`/Z,0JW_T%*M_^Q@`/Y`[ XM4JW_\&``_B@@+`7<D*W_Q@@```!G"B!L!=Q"$%*L!=P@+`7<D*W_QEF`*T#_L XMNB`L!=R0K?_*48`I;?_&!=PO+?^Z*T#_OF$``+Q83R!M_\I8B"E(!=PO+?^^< XM80``J%A/("W_OE"`+P`O+?_*+RW_MDZZ'5I/[P`,(BW_OE"!L(%G"'`#*T#_2 XM\&`$0JW_\"\M_[9.NATD6$\@+?_@(BW_W$ZZ&58B+?_83KH93@:````!]"\`_ XM+RW_RDZZ'4903R`M__!,WP`\3EU.=4Y5```@;0`((FP%W!*04JP%W")L!=P2I XMJ``!4JP%W")L!=P2J``"4JP%W")L!=P2J``#4JP%W$Y=3G5.50``2.<@`"`M* XM``@B`'08Y*D@;`7<$(%2K`7<(@!T$.2I(&P%W!"!4JP%W"(`X(D@;`7<$(%2+ XMK`7<(&P%W!"`4JP%W$S?``1.74YU3E4``"`M``@B`.")(&P%W!"!4JP%W"!LR XM!=P0@%*L!=Q.74YU3E7_^$CG(0!";?_Z3KH&XD)M__P@;0`(,BW__!`P$`!*S XM`&<6$#`0``P```IF!A&\`'\0`%)M__Q@VB\M``A.N@:`6$].N@1*.T#__DIM] XM__YG\C(M__PT+?_ZM$%L!#M!__HT+?_^#$(#Z&8*.WS\&/_Z8``O__F8``-I.N@.0\ XM.T#__DIM__YG\@QM`$/__F8B,BW__+)M__IL&$AX`)M.N@0`6$](>`!#3KH#8 XM]EA/4FW__`QM`$3__F8>2FW__&<82'@`FTZZ`]I83TAX`$1.N@/06$]3;?_\N XM#&T`0?_^9BXR+?_\#$$`!V\D46W__'X`#$<`"&P82'@`FTZZ`Z183TAX`$1.E XMN@.:6$]21V#B#&T`0O_^9C8P+?_Z2,!?@#(M__Q(P;*`;"10;?_\?@`,1P`(@ XM;!A(>`";3KH#9EA/2'@`0TZZ`UQ83U)'8.)P`#M`__XR+?_^#$$`'V\`_F0,P XM00"`;`#^7"`M``Q3@#(M__I(P;*`;`#^2CXM__J^;?_\;Q(@!TC`(&T`"!&P* XM"/]P`%-'8.A2;?_Z(&T`"#`M__I",```,"W__%)M__PR+?_^$8$``-#M__Q3Y XMB"`(+P!.N@1\6$\^+?_\OFW_^FP`_?)(>``(3KH"REA/4D=@ZGX`OFW__&P8! XM(&T`"!`P<``,``!_9@81O``*<`!21V#B(&T`"#`M__I",```/BW__+YM__ILQ XM&$AX`)M.N@*&6$](>`!#3KH"?%A/4D=@XDAX``I.N@)N6$].N@0T,"W_^DS?? XM`(1.74YU``!.5?_X2.<`('``.4`%XCE`!>`I;0`,`L8I;0`(`LI(;`*L3KH;B XMP%A/*4`"[$J`9P``J$*G2&P"\$ZZ%ZY03RE``N1*@&<``))"ITAL`OY.NA>8X XM4$\I0`+H2H!G?"\L`N1.NAAB6$\I0`+<2H!G:B\L`NA.NAA06$\I0`+@2H!G# XM6"\L`NPO`"\L`MQA``#$3^\`#$J`9D)(;`7L+RP"X&$``/Y03W``(&P"Z!`HH XM``\D;`+L(FH`5G(`$BD`#TAX``(O*@`R*T#__"M!__A.NAJ:4$\@+`+L8`9A= XM```D<`!,WP0`3EU.=2\L`N!.NAG\6$\O+`+<3KH9MEA/80).=4JL`NQG"B\L_ XM`NQ.NAJ>6$]*K`+D9PHO+`+D3KH79%A/2JP"Z&<*+RP"Z$ZZ%U183TJL`MQGX XM"B\L`MQ.NA>>6$]*K`+@9PHO+`+@3KH7CEA/3G5.5?_\2.<!`"!M``@A;0`0% XM`"@A?````(0`)'``+P`O""\`2&P#"DZZ&11/[P`0+@`@;0`((FT`#"-H`!0`S XM%"-H`!@`&"`'3-\`@$Y=3G5.50``(&T`"#%\``(`'"%M``P`*'`!(4``)"\(! XM3KH9&%A/3EU.=2!L`NPO*`!63KH8;EA/*4`%[DJ`9TX@0"EH`!0%Y'(`,B@`_ XM&"E!!>@O`$ZZ&&!83R(L!>0,@0```@!F!C`\`^A@4`R!```!`&8:(BP%Z`R!4 XM``#__V<.ZH$"@0```#]P_Y"!8"XO+`+H3KH8#EA/2H!G'G``$"P%["E`!>A(2 XM;`7L+RP"X&$`_U103R`L!>A@`G``3G5.50``2.<@`"!L`MPQ?``#`!Q![0`+< XM(FP"W"-(`"AP`2-``"0O+`+<3KH8/EA/$"T`"PP```IF$G(`.4$%XC(L!>`D% XM`5)".4(%X`P```IG"C`L!>)20#E`!>(P+`7@2,#G@`:`````)R!L`NPR*``*L XM2,&P@6\H2&P#&F$J6$]A`/[L#$```6WV80#^X@Q``^AG[$)L!>!(;`,B80I8) XM3TS?``1.74YU3E7__DCG(`!";?_^(&T`"#(M__X0,!``2@!G%@P``"!G$!`PR XM$``,```*9P92;?_^8-HP+`7B2,`R+?_^2,'0@>>`!H`````:(&P"[#(H``A(U XMP;"!;Q!*;`7B9PI(>``*80#^^%A/(&P"W#%\``,`'"!L`MPA;0`(`"@P+?_^_ XM2,`@;`+<(4``)"\(3KH7-EA/,"P%XC(M__[003E`!>(@;0`($#`0``P```IF; XM"DAX``IA`/ZH6$\@;0`(,BW__A`P$``,```@9@I(>``@80#^C%A/(&T`"#(M% XM__X0,!``2@!G#$C!4H'3K0`(8`#_'$S?``1.74YU3E4``"!L`MPQ?``#`!P@_ XM;`+<(6T`"``H</\@;`+<(4``)"\L`MQ.NA:D6$].74YU0FP%X$YU``!.50``O XM*6T`"``<2JP`(&<4,'P``2)L`""SR&<(2'@`"$Z16$].74YU````,```!2+_B XM___^2.<_0&$``!I,WP+\3G5(YS]`80``"$S?`OQ.=0A"`!](0$A"/#R``#X\! XM?_`X`,A&N4`Z`,I'NT#,0KU"SD*_0KI'9@``[`Q%?_!F```NL$)M```2+@".F XM@68```XN`HZ#9P``#"`"(@-.^0``(DZ\1&<``(1.^0``(BY*168``$9(0&8`2 XM`"I*@68``"1(0F8``!!*@V8```K(1D[Y```AX"`"(@-(0+U`OT!(0$YU2$)F8 XM```>2H-F```82$"Y0+M`2$!.=7X0FD>_0+]"2$!(0KQ$9P``*)*#9@``"I&"8 XM9@``!DYUD8)J```(1(%`@#@&3OD``"#@3OD``"(@TH/1@@R``"```&T``!3B^ XMB.*1?@#3A]&'!D4`$`Q%?^!E```(3OD``"(*2$#018!$2$!.=6X```K%0,=!' XMS43/10Q%?_!G```P2D=F``!"2$)F```02H-F```*N4"[0$A`3G76@]6"2D5F6 XM```J2$#2@=&`8```)DJ`9@``#DJ!9@``"$[Y```B($[Y```B3@I"`!!(0@I`# XM`!!(0)Y%1D?H1P1%`"`,1P`T;@``'M*!T8`,1P`@;P``("8"=``$1P`@[JMTM XM`&```#0&10`02$#018!$2$!.=0Q'`!!O```.-@)(0T)"2$($1P`0(D8L`NZJ5 XM[K[NJ[6&O8,L";Q$9@``/M*#T8(&10`0XHCBD0R``"```&T```H&10`0XHCB# XMD7X`TX?1ATA`T$4,17_P9```"(!$2$!.=4[Y```B"I^'DX.1@@R``"```&T`T XM_JI$A]*'?@#1A^*(XI$&10`02$#018!$2$!.=0``#(`"````;0``$.*(XI%*X XM16P``$Y@```*!$4`$&P``$)$1>A-6$4,10`Y;P``$$[Y```AZC(`0D!(0$A!K XM!$4`$&[R!D4`$"0`ZJCJNNJIL8*U@70`TX+1@DA`N4!(0$YU)`#HB.B:Z(FQ* XM@K6!=`#3@M&"2$#010Q`?_!E!D[Y```B"KE`2$!.=4J`:P``.$J":@``($J`; XM9@``:$J!9@``8DJ#9@``7`R"@````&8``%).=;""9@``#+:!90``1&8``#A.I XM=4J":P``'F8``"Q*@V8``"9*@68``"`,@(````!F```63G6T@&8```RR@V4`1 XM`!!F```$3G5*.0``',A.=4HY```<R4YU_P$``$CG/T!A```(3-\"_$YU/#R`- XM`#X\?_!(0$A".`#(1KE`S$*]0KU$L$=M``!ZL$)M```N#(```'_P9@``"$J!G XM9P``"$[Y```B3K1';0``(@R"``!_\&8```A*@V<```P@`B(#3OD``").3OD`@ XM`"(N2H)F```L2H-F```F2.?`P$AY`````TZY```9*%A/3-\#`R`\``!_\+E`> XM<@!(0$YU3OD``"(@M$=M```B#((``'_P9@``"$J#9P``#"`"(@-.^0``(DY.' XM^0``(>`Z`,I'9@``,$J`9@``($J!9@``&DJ"9@``#DJ#9@``"$[Y```B+D[Y/ XM```AX$ZY```A>&````B[0`I``!#.0F8``"A*@F8```Q*@V8```9@`/]@Q4#'^ XM0<]%3KD``"%XQ4#'0<]%8```"+]""D(`$`1'/^":1V@```A.^0``(@I(0"X!` XMZ8CIB>F?LT>_0$A"+@-\"^VJ[:OMO[='OT)(1#@%(D1(0H#".`!(03`!0D%(X XM0CH"RL1(0SP#S,1(0SX#SL1(1]Y&2$="1DA&W862AY&&9```"%-$TH/1@D)#> XM2$0L`$A"@,)H```80D0@!I*#2$*1@DA`2$$P`4)!8```*C@`2$$P`4)!2$(\L XM`LS$+@-(1\[$2$?<1TA&0D?=1TA&DH>1AF0``!)31-*#T8)E```(4T32@]&"P XM+`!(0H#":```%$)%(`9(0I!"2$!(03`!8```%#H`2$$P`4A"/`+,Q9"&9```Z XM#E-%T()E```&4T70@DA%2$*`PF@```1P_SH`(`0B!2@).@1(1$[Y```;P$CG2 XM/T!A```(3-\"_$YU/#R``#X\?_!(0$A".`#(1KE`S$*]0KU$L$=M``!6L$)MM XM```N#(```'_P9@``"$J!9P``"$[Y```B3K1';0``'`R"``!_\&8```A*@V<`K XM``P@`B(#3OD``").2H)F```.2H-F```(3OD``"(N3OD``"(@M$=M```T#((`/ XM`'_P9@``"$J#9P``#"`"(@-.^0``(DY*@&8```Y*@68```A.^0``(BY.^0``P XM(B`Z`,I'9@``'DJ`9@``#DJ!9@``"$[Y```AX$ZY```A>&````B[0`I``!#.[ XM0F8``"I*@F8```Y*@V8```A.^0``(>#%0,=!ST5.N0``(7C%0,=!ST5@```(? XMOT(`0@`0!$4_\-I':```"$[Y```B"DA`+@'AB.&)X9^S1[]`2$(N`^&*X8OA% XMG[='OT(N`$A'SL,L`DA&S,'>AD)'WT=(1TA!+`',PD)&2$;>ADA#+`/,P$)&C XM2$;>ADA`2$(L`,S"QL#>@W8`W8/"PMZ!W8,B`$A!)@)(0\##Q,'1@B0`0D#1N XM0$A`2$)"0MZ"T8;"P]*'=`#1@D[Y```;P"\`@Y]G!`A``!].=0R`````(&P`2 XM`#1(0$A!,`%"001%`0!LZ&```&8%!`,#`@("`@$!`0$!`0$!````````````\ XM`````````'8`#(```"``;```!N&(4$-(0$I`9@``!NF86$-T`!0[`,#EN-9"B XM2$`D`>>IY[JS0K5`Z4N:0VT```Q(0-!%@$1(0$YU1$7H320`ZJCJNNJIL8*U1 XM@4A`N4!(0$YU2$!(1'H0#(`````@;```%DA`2$$P`4)!!$4!``R`````(&WLM XM0D0,@```(`!L```&X8A01$A`2D!F```&Z9A81'P`0_D``"#\'#$``.VXV$9(H XM0"P!Z:GIOK-&O4#I3)I$2$!(1$YU``!P`"(`N4!(0$YU2.?`P$AY`````4ZY4 XM```9*%A/3-\#`W``<@"Y0$A`3G5(Y\#`2'D````"3KD``!DH6$],WP,#(#P`M XM`'_PN4!R`$A`3G5(Y\#`2'D````$3KD``!DH6$],WP,#(#Q_\0``<@!.=0@`" XM``-G```@2.?`P$AY````!$ZY```9*%A/3-\#`PB```,(P``!`$!_\$A`3G5(T XMYSQ`>`!R`&```!I(YSQ`>`!R`$J`9P``.&H```@X/(``1(`,@``@``!D```21 XM.CQ!($ZY```@X$S?`CQ.=3(`0D!(0$A!.CQ"($ZY```@X$S?`CQ.=0``2.<PY XM,BQY````:"!O`!@B;P`<)&\`("9O`"0@+P`H(B\`+"0O`#`F+P`T3J[^I$S?( XM3`Q.=4Y5__Q(YR``<``I0``82JT`"&LD)"T`"+2L`\AL&B("YX%![`;$(DC31 XMP4J19PHB`N>!T<$@"&`(<`DI0`,L<`!,WP`$3EU.=7(`2$!.=4CGP,!(>0``& XM``1.N0``&2A83TY5__1(YP`@1>P#-+3\``!G-@@J``(`&V8J""H``0`;9R(@C XM*@`$D*H`$"M`__A*@&<2+P`O*@`0+RH`'$ZZ`[)/[P`,)%)@Q"\M``A.N@<>< XM6$],WP0`3EU.=0``&2A83TS?<&%.5?_V+RT`"$ZZ_S)83RM`__9*@&8$</]@G XM*B\M`!`O+0`,(&W_]B\H``1.N@@D3^\`#"M`__I*K``89P1P_V`$("W_^DY=Z XM3G5.5?_X("T`"`:`````#"]````@+P``<@`L>``$3J[_.BM`__Q*K?_\9@1P# XM`&`T("T`"`:`````#"!M__PA0``(+PA(;`7T80`!"%!/2JP#M&8&*6W__`.TZ XM(&W__-#\``P@"$Y=3G5.5?_\+RT`"&&06$\K0/_\2H!F!C!\__\@"$Y=3G5.Z XM5?_X2.<!(&$``(!P`"E``!`I0``(*4``#"E``\`I0`/$*4`#N"E``[0I0`.\4 XM2JP#L&=,("P$:"(L`[#2@%.!(`$B+`1H3KH%$"(L!&A.N@7,4(`N`"`'(`=6H XM@.2`Y8`N`"\'80#_%EA/)$"T_```9@1P_V`,+P<O"DZZ`+Q03W``3-\$@$Y=_ XM3G5.5?_X*VP%]/_\2JW__&<D(&W__"M0__@B;?_\(&W__"`H``@L>``$3J[_D XM+BMM__C__D<@I2`7X*4@%]$Y=3G5.50``2.<`(")M``@@:0`$(FT`#"-(I XM``21R"*()&T`"$J29@(DB4JJ``1G!B!J``0@B25)``1,WP0`3EU.=0``4W5MQ XM``````````````1>.``$7E``!%R@``1>*``$7D1L:%]/<&5N0VYT<&%.5?_\5 XM("T`#"\`+RT`""M`__QA!E!/3EU.=4Y5_^A(YR$P+BT`#$J';@9P_V```/(,) XMAP````AL`GX((`<@!U:`Y(#E@"X`(&T`""M(__31Q]^L`\1#[`/`)%$K2/_P, XM*TG_^+3\``!G``"B($H@*@`$($K1P"M(_^PD+?_PM<)C%B)M__0BBB-'``0FG XM;?_X)HEP`&```(RUPF8>(E(F;?_T)HD@*@`$(@#2AR=!``0B;?_X(HMP`&!HS XM(FW_]+/(9`B?K`/$</]@6+/(9BY*DF<.(A*T@6,(GZP#Q'#_8$+?J@`$2I)G) XM$+229@P@0B`H``31J@`$))!P`&`F*TK_^"MM_^S_Z"128`#_6B!M__@@K?_TH XMD<@B;?_T(H@C1P`$(`A,WPR$3EU.=4Y5__A(YP$`(&T`#$H89OQ3B)'M``PN^ XM""!M``A*&&;\4XB1[0`((`@B;0`(T\`K2?_X(BT`$+Z!8P(N`2`'(&T`#&`"3 XM$MA3@&3Z(&W_^$(P>``@+0`(3-\`@$Y=3G4``$Y5__@O+0`(3KK[IEA/*T#_O XM^$J`9@1P_V!((&W_^`@H``,``V<22'@``D*G+RT`"$ZZ_$)/[P`,+RT`$"\M= XM``P@;?_X+R@`!$ZZ!"I/[P`,*T#__$JL`!AG!'#_8`0@+?_\3EU.=0``````3 XM@$YU<&%.5?_P2.<!,"1M``@,K````"`&`&P``)`2$@P!`"!G#`P!``EG!@P!- XM``IF!%**8.A*$F=R("P&`.6`4JP&`$'L!@C1P"M(__P,$@`B9BA2BB"*2A)G9 XM"@P2`")G!%**8/)*$F8,2'@``4ZZ`J)83V"<0A)2BF"6(&W__""*2A)G&!(28 XM#`$`(&<0#`$`"6<*#`$`"F<$4HI@Y$H29@)@"$(24HI@`/]H2JP&`&8&(&P`D XM2&`$0>P&""E(!@1*K`8`9@``AD'L`YPB2$?L!H@FV2;9)MDFV3:1)FP`2")KK XM`"1(>``H+RD`!$AL!HA.NOY$3^\`#$'L!H@B""0\```#[BQL!%Q.KO_B*4`&X XMR"`L!L@I0`;0<@0I00;,*4`&V"E!!M3E@"M`__"3R2QX``1.KO[:*T#_]"!M@ XM__`B;?_T(V@`"`"D?@!@,BQL!%Q.KO_**4`&R"QL!%Q.KO_$*4`&T$'L`ZXBB XM""0\```#[2QL!%Q.KO_B*4`&V'X$(`<@!P"```"``8&L!L0@!R`'`(```(`", XM@:P&S`"L``"``P;42JP#,&<$<`!@!B`\``"``"X`0JP#4"`'(`<`@`````$IU XM0`-,<`$I0`-R(`<@!P"``````BE``VYP`BE``Y0@!R`'`(````"`*4`#D$'Z_ XM`;XI2``P+RP&!"\L!@!.NM@64$]"ITZZ^9Y83TS?#(!.74YU``!F9F9F9F88+ XM9@````````````````````!*@&H``!Y$@$J!:@``#$2!80``($2!3G5A```8$ XM1(!$@4YU2H%J```,1(%A```&1(!.=2\"2$$T`68``")(0$A!2$(T`&<```:$W XMP3`"2$`T`(3!,`)(0C(")!].=2\#=A`,00"`9```!N&944,,00@`9```!NF9H XM64,,02``9```!N6954-*06L```;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(J XM0<3!D()D```(4T/0@63^<@`R`TA#Y[A(0,-`)A\D'TYU($(B0R0`)@%(0DA#; XMQ,'&P,#!U$-(0D)"T((F"20(3G5.5?_X2.<!('X`1>P&Q+ZL`\AL'DJ29Q0(B XM*@`"``-G`F`*+RH`!$ZZ`;183U*'4(I@W"\M``PO+0`(3KK6'E!/3-\$@$Y=S XM3G5.5?_\<``B/```,``L>``$3J[^S@*````P`"M`__Q*@&8$<`!@)$JL`#!G< XM&B!L`#!.D$J`9@1P`&`00J=(>``43KK_=E!/("W__$Y=3G5AL$YU``!*K`!H) XM9A)#[`1(<``L>``$3J[]V"E``&@I;`!4!`A(>``\2'@`^G``+P`O`$AL!#1(: XM;`0:2&P#_"\`3KKW*$_O`"!3@&<$</]@`G``3G4``$YU`````EI@```!`$Y56 XM__Q(YP$`2JP`,&<$3KK_0$*L`!@B+0`()"T`#"8M`!`L;`1<3J[_T"X`#(?_C XM____9A(L;`1<3J[_?"E``!AP!2E``RP@!TS?`(!.74YU3E7_^$CG,0)*K``P4 XM9P1.NO[P0JP`&"`M`!!3@"]``!`B+0`()"T`#"8O`!`L;`1<3J[_OBX`#(?_@ XM____9A(L;`1<3J[_?"E``!AP%BE``RP@+0`0#(`````"9QP,@`````%G"DJ`Y XM9B(@+0`,8!P@!R`'T*T`#&`2(BT`"'0`=@`L;`1<3J[_ODYQ3-]`C$Y=3G4`\ XM`$Y5``!*K``P9P1.NOY@(BT`""QL!%Q.KO_<<`!.74YU(&\`!""(6)!"J``$O XM(4@`"$YU``!(YSP@)B\`&!0O`!]Z_R\%3KD``"[H$@!P`!`!*`!R_[*`6(]F# XM!'``8&8O/``!``%(>``B3KD``"ZD)$`J"E"/9@XO!$ZY```N_'``6(]@0"5#0 XM``H50@`)%7P`!``(0BH`#A5$``]"ITZY```NU"5``!!*@UB/9PHO"DZY```OD XM$&`*2&H`%$ZY```LT%B/(`I,WP0\3G4O"B1O``A*J@`*9PHO"DZY```O)%B/_ XM%7P`_P`(</\E0``4<``0*@`/+P!.N0``+OQ(>``B+PI.N0``+KQ/[P`,)%].` XM=0``("\`!$AX`#`O`$ZY```MY%"/3G4@+P`$+P!.N0``+B98CTYU2.<X`"0OB XM`!`F+P`42H)F!'``8"@O/``!``$O`TZY```NI"!`*`A0CV8"8.01?``%``@Q% XM0P`2(4(`#B`(3-\`'$YU(&\`!"`(9@)@)!%\`/\`"'#_(4``%'#_(4``&'``O XM,"@`$B\`+PA.N0``+KQ0CTYU``!(YR`"+'D```1<3.\`!@`,3J[_XDS?0`1.@ XM=0``+PXL>0``!%PB+P`(3J[_W"Q?3G5(YS`"+'D```1<3.\`#@`03J[_T$S?J XM0`Q.=0``+PXL>0```$!,[P`#``A.KO\Z+%].=0``+PXL>0```$`B;P`(("\`$ XM#$ZN_RXL7TYU+PXL>0```$`B;P`(3J[^VBQ?3G4O#BQY````0"`O``A.KOZV) XM+%].=2\.+'D```!`("\`"$ZN_K`L7TYU+PXL>0```$`B;P`(3J[^GBQ?3G4O/ XM#BQY````0")O``A.KOZ8+%].=2\.+'D```!`(&\`"$ZN_HPL7TYU+PXL>0``; XM`$`B;P`(3J[^ABQ?3G4O#BQY````0"!O``A.KOZ`+%].=2\.+'D```!`(F\`; XM"$ZN_F(L7TYU+PXL>0```$`@;P`(3.\"`0`,(B\`%$ZN_D0L7TYU```O#BQY( XM````0")O``A.KOX^+%].=2\.+'D```!`(F\`"$ZN_C@L7TYU+PXL>0```$`B> XM;P`(3J[^,BQ?3G4O#BQY````0")O``A.KOX@+%].=2\.+'D```!`(F\`""`O> XM``Q.KOW8+%].=2\.+'D```!L(F\`""`O``Q.KO\6+%].=4CG,`(L>0```&P@> XM;P`03.\`#P`43J[^X$S?0`Q.=0``+PXL>0```&PB;P`(3.\``P`,3J[^O"Q?C XM3G4``"\.+'D```!L(F\`""`O``Q.KOZJ+%].=2\.+'D```!H(&\`"$ZN_\HL) XM7TYU+PXL>0```&@@;P`(3J[_OBQ?3G4O#BQY````:"!O``A.KO^X+%].=2\.I XM+'D```!H(&\`"$ZN_Z`L7TYU+PXL>0```&@@;P`(3J[_.BQ?3G4O#BQY````3 XM:"!O``A.KO\T+%].=2\.+'D```!H3.\#```(3J[^^"Q?3G4``"\.+'D```!H6 XM(&\`""`O``Q.KO[F+%].=0```^P````[````````+@(``"Y.```MS```+=P`X XM`"T:```L]@``+4X``"VF```M*@``+6```"UL```MB@``+;(``"+(```BL```& XM(F(``"(Z```B%@``(?8``"&\```@T```($8``"`F```?^```(!H``!_R```?I XMV```'Z```!_2```?F@``'\```!^(```?:```'R```!X0```=\```'<0``!V^$ XM```=D@``'6P``!U2```=N```'38``!V,```=,```'1```!S"```<N@``'#X`` XM`!OP```;D```&GX``!K<```:5```&DX``!GX```9T@``&N(``!G&````(P``4 XM``$``#$0```P^```,.0``##0```PO```,*@``#"4```P@```,&@``#!,```PZ XM+@``,!0``"_\```OZ```+]0``"_````OK```+XP``"]X```O9```+U```"\\@ XM```O*```+Q0``"\````N[```+M@``"[````NJ```+HX``"YX```N7@``(MH`7 XM``$2````#@````````/R```#Z@```1L`````````````````````````````? XM````````````````````````````````````````````````````````````` XM`````````````````````````````````&1O<RYL:6)R87)Y````````````I XM36%N9&5L8G)O="!3970@=C$N,@```````4`````%`!\````/`````````'``? XM```````````````!0````!\```$````9````````````````````````````Z XM````````````#P```````````0````\`#R`/0`]@#X`/H`_`#^`/\`[P#/`*+ XM\`CP!O`$\`+P`/``X@#$`*8`B`!J`$P`+@`/`0\$#P@/"P\/#PJJ:6YT=6ET^ XM:6]N+FQI8G)A<GD`9W)A<&AI8W,N;&EB<F%R>0``4VAO=R!4:71L92!"87(`5 XM`$AI9&4@5&ET;&4@0F%R``!3879E('-C<F5E;@!%;G1E<B!F:6QE;F%M93H*C XM``!%;G1E<B!087)A;65T97)S``!%;G1E<B!8(&-O;7!O;F5N="!O9B!#.@H`W XM`$5N=&5R(%D@8V]M<&]N96YT(&]F($,Z"@``16YT97(@8F]T=&]M(&QE9G0@D XM6"!C;RUO<F0Z"@``16YT97(@8F]T=&]M(&QE9G0@62!C;RUO<F0Z"@``16YT& XM97(@=&]P(')I9VAT(%@@8V\M;W)D.@H``$5N=&5R('1O<"!R:6=H="!9(&-O" XM+6]R9#H*``!);G9A;&ED(&-O+6]R9&EN871E<R$*``!$;R!-86YD96QB<F]TK XM(%-E=`!$;R!*=6QI82!3970``%-A=F4@4V-R965N`$5X:70``$]P=&EO;G,`U XM1D]230``24Q"30``0DU(1```0TU!4```0D]$60``````%``4`1@`9``?```#) XM````%`H```````````````````````````!X`%@"@`$```\`````````````` XM`````````````&UY+F-O;BYW<FET90``;7DN8V]N+G)E860`8V]N<V]L92YD0 XM979I8V4``$U/4D4N+BX`#2`@("`@("`-`````````(`````#5@``````````< XM`````````````````````````````````W@`````````````````````````[ XM````````````````````````````````````````````````````````````` XM``!C;VXZ,3`O,3`O,S(P+S@P+P`J````````````````````````````````? XM`````"@J*B!5<V5R($%B;W)T(%)E<75E<W1E9"`J*@``__\````.``X`````S XM```#S`````#__P````0`!``````````````#Z$-/3E1)3E5%``#__P````0`G XM!`````````00`````$%"3U)4`/__````!``$````````!"X`````:6YT=6ETE XM:6]N+FQI8G)A<GD```````````````````````0````#[`````<````!```$H XA0```!"8```0,```#]````U8```,T````F`````````/R. X`` Xend Xsize 14208 END_OF_FILE if test 19935 -ne `wc -c <'mandelbrot_.uu'`; then echo shar: \"'mandelbrot_.uu'\" unpacked with wrong size! fi # end of 'mandelbrot_.uu' fi if test -f 'saveilbm.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'saveilbm.c'\" else echo shar: Extracting \"'saveilbm.c'\" \(3407 characters\) sed "s/^X//" >'saveilbm.c' <<'END_OF_FILE' X X#include <libraries/dos.h> X#include <graphics/rastport.h> X X#define putbyte(x) {*d++=(x);} X Xlong Write (); Xunsigned char *AllocMem (); Xstruct FileHandle *Open (); Xunsigned char *d; /* temp buffer pointer */ X Xint saveilbm (bitmap,colormap,title) /* returns 0 if no error */ Xstruct BitMap *bitmap; Xunsigned short *colormap; Xchar *title; X{ X int width,height,rowlen,i,j,k; X int numcols,ldepth,lheight,lrowlen; X int p,q; /* temp bitmap pointers */ X unsigned char depth; X unsigned char *dest; /* where to put output before writing */ X unsigned char *e; /* temp buffer pointer */ X unsigned char *rowstart; /* addr of start of bitplane row */ X long totlen,bodlen; X struct FileInfoBlock *file; X if (!(file=Open (title,MODE_NEWFILE))) X return (1); X rowlen=bitmap->BytesPerRow; X width=rowlen*8; X height=bitmap->Rows; X depth=bitmap->Depth; X lrowlen=bitmap->BytesPerRow; X lheight=bitmap->Rows; X ldepth=bitmap->Depth; X numcols=1<<depth; X if (!(dest=AllocMem ((long)(lrowlen*lheight*ldepth+4096),0L))) X { X Close (file); /* we're going to store entire output file in */ X return (2); /* memory to work on before writing to disk */ X } X d=dest; X putword ("FORM"); X d+=4; /* Leave gap for size which we'll put in later */ X putword ("ILBM"); X putword ("BMHD"); X putlong (20L); X X /* Write BMHD block */ X X putshort (width); X putshort (height); X putshort (0); X putshort (0); X putbyte (depth); X putbyte (0); X putbyte (1); X putbyte (0); X putshort (0); X putbyte (0); X putbyte (0); X putshort (width); X putshort (height); X X putword ("CMAP"); X putlong (numcols*3); X X /* Write color map */ X X for (i=0;i<numcols;i++) X { X putbyte ((colormap[i]>>8)<<4); X putbyte (colormap[i]&0x00F0); X putbyte ((colormap[i]&0x000F)<<4); X } X if ((numcols*3)&1) /* if odd length, put pad byte */ X putbyte (0); X X putword ("BODY"); X e=d; X d+=4; /* leave space to put length in later */ X X /* Write bitplanes */ X X for (i=0;i<height;i++) X for (j=0;j<depth;j++) X { X rowstart=(bitmap->Planes[j])+rowlen*i; X p=q=0; XL0: X if (++p>=rowlen) X { X putbyte ((char)(-p+q+1)); X putbyte (rowstart[q]); X goto ER; X } X if (rowstart[p]==rowstart[p-1]) X goto L0; X putbyte ((char)(-p+q+1)); X putbyte (rowstart[q]); X q=p; XL1: X if (++p>=rowlen) X { X putbyte ((char)(p-q-1)); X for (k=q;k<p;k++) X putbyte (rowstart[k]); X goto ER; X } X if (rowstart[p]!=rowstart[p-1]) X goto L1; X if (++p>=rowlen) X { X putbyte ((char)(p-q-1)); X for (k=q;k<p;k++) X putbyte (rowstart[k]); X goto ER; X } X if (rowstart[p]!=rowstart[p-1]) X goto L1; X if (p-q>2) X { X putbyte ((char)(p-q-3)); X for (k=q;k<p-2;k++) X putbyte (rowstart[k]); X q=p-2; X } X goto L0; XER: X q=0; X } X if ((d-e)&1) X putbyte (0); /* If body odd length, put pad byte */ X bodlen=d-e-4; X totlen=d-dest-8; X d=e; X putlong (bodlen); X d=dest+4; X putlong (totlen); X if (Write (file,dest,totlen+8)!=totlen+8) X i=3; X else X i=0; X Close (file); X FreeMem (dest,(long)(ldepth*lheight*lrowlen+500)); X return (i); /* No error */ X} X Xputword (string) Xunsigned char *string; X{ X putbyte (string[0]); X putbyte (string[1]); X putbyte (string[2]); X putbyte (string[3]); X} X Xputlong (n) Xunsigned long n; X{ X putbyte ((unsigned char)(n>>24)); X putbyte ((unsigned char)(n>>16)); X putbyte ((unsigned char)(n>>8)); X putbyte ((unsigned char)n); X} X Xputshort (n) Xunsigned int n; X{ X putbyte ((unsigned char)(n>>8)); X putbyte ((unsigned char)n); X} END_OF_FILE if test 3407 -ne `wc -c <'saveilbm.c'`; then echo shar: \"'saveilbm.c'\" unpacked with wrong size! fi # end of 'saveilbm.c' fi if test -f 'scanfloat.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'scanfloat.c'\" else echo shar: Extracting \"'scanfloat.c'\" \(1475 characters\) sed "s/^X//" >'scanfloat.c' <<'END_OF_FILE' X X/* Routine to scan a floating point number from a null-terminated string. X * Written 1987 by Russell Wallace. May be freely copied and used in X * developing Amiga software. Requires linkage with m.lib if used with X * Aztec C. */ X Xtypedef double TYPE; /* Define this as float or double, whichever reqd. */ X XTYPE scanfloat (string) Xchar *string; X{ X register short i,j,minus; X TYPE number,column; X i=minus=0; X while ((string[i]<'0' || string[i]>'9')&& string[i]!='-' && string[i]!='.' && string[i]) X i++; /* Search for start of number or end of string */ X if (string[i]=='-') X { X minus=1; /* Is negative number */ X i++; X if ((string[i]<'0' || string[i]>'9')&& string[i]!='.') X return ((TYPE)0); X } X if (string[i]=='\0') X return ((TYPE)0); /* If end of string, return 0 */ X string+=i; /* Move along to start of string */ X i=0; X while (string[i]>='0' && string[i]<='9') X i++; /* Look for decimal point */ X j=i; X number=0; X column=1; X for (i--;i>=0;i--) /* Go back from point to start of number */ X { X number+=(string[i]-'0')*column; /* add digit value to number */ X column*=10; /* each column is 10 times value of one to right */ X } X column=.1; X if (string[j]=='.') /* If decimal point, get stuff after it */ X for (i=j+1;string[i]>='0' && string[i]<='9';i++) X { /* scan right to end of number */ X number+=(string[i]-'0')*column; X column/=10; /* each column 10 times less than one to left */ X } X if (minus) X return (-number); X else X return (number); X} END_OF_FILE if test 1475 -ne `wc -c <'scanfloat.c'`; then echo shar: \"'scanfloat.c'\" unpacked with wrong size! fi # end of 'scanfloat.c' fi echo shar: End of archive 1 \(of 1\). cp /dev/null ark1isdone MISSING="" for I in 1 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have the archive. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>. Mail comments to the moderator at <amiga-request@uunet.uu.net>. Post requests for sources, and general discussion to comp.sys.amiga.misc.