dfk@romeo.cs.duke.edu (David F. Kotz) (02/13/89)
#! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # patch5b # This archive created: Sun Feb 12 13:21:42 1989 export PATH; PATH=/bin:$PATH if test -f 'patch5b' then echo shar: will not over-write existing file "'patch5b'" else sed 's/^X//' << \SHAR_EOF > 'patch5b' Xdiff -cr ../gnutex.old/lasergnu ./lasergnu X*** ../gnutex.old/lasergnu Mon Dec 5 13:25:57 1988 X--- ./lasergnu Thu Feb 2 13:33:13 1989 X*************** X*** 9,15 **** X set print_banner = on # Print a banner page unless told otherwise. X unset input_file # the plot input command file X set output_file = () # the output file (used only by the old laserism) X! set plot_args = (-p) # arguments to the plotting program (if any) X unset plot_command # command line arguments may be plot commands X if !($?LASER) then X set LASER = "imagen018" X--- 9,15 ---- X set print_banner = on # Print a banner page unless told otherwise. X unset input_file # the plot input command file X set output_file = () # the output file (used only by the old laserism) X! set plot_args = () # arguments to the plotting program (if any) X unset plot_command # command line arguments may be plot commands X if !($?LASER) then X set LASER = "imagen018" X*************** X*** 16,25 **** X endif X set printer = (-P$LASER) # Default printer set by shell variable LASER. X X! # Plot-program-dependent stuff X set TMP=/tmp/gnu$$ X! echo "set term tek40xx" > $TMP X X # Loop through the command-line arguments. X X top: X--- 16,30 ---- X endif X set printer = (-P$LASER) # Default printer set by shell variable LASER. X X! # File for plot commands X set TMP=/tmp/gnu$$ X! onintr cleanup X X+ # default is tektronix mode for printer X+ set setterm="set terminal tek40xx" X+ set setsize="" X+ set LANG="-Ltektronix" X+ X # Loop through the command-line arguments. X X top: X*************** X*** 97,102 **** X--- 102,116 ---- X endif X goto top X X+ # use impress instead of tektronix language X+ case -I: X+ set setterm="set term imagen" X+ # set setsize="set size 4,3" X+ set setsize="set size 9,6.5" X+ set LANG="" X+ shift argv X+ goto top X+ X case -?*: X echo "I do not recognize option $argv[1]." X echo "usage: lasergnu [-Pprinter] [-b] [-l] [-t title] [-f file] ['plot command']...." X*************** X*** 121,136 **** X X set iflags = ($iflags $printer) X X! if ($?plot_command) then X! /usr/local/bin/gnutex $plot_args < $TMP | /usr/local/bin/ipr -Ltektronix \ X! $iflags -f gnutex \ X! -D"jobheader $print_banner" \ X! -D"program lasergnu" X! else X! # cat $TMP - | /usr/local/bin/gnutex $plot_args | /usr/local/bin/ipr -Ltektronix \ X! cat $TMP | /usr/local/bin/gnutex $plot_args | /usr/local/bin/ipr -Ltektronix \ X! $iflags -f gnutex \ X! -D"jobheader $print_banner" \ X! -D"program lasergnu" X! endif X rm $TMP X--- 135,147 ---- X X set iflags = ($iflags $printer) X X! if ($LANG == -Ltektronix) set plot_args=($plot_args -p) X! X! (echo $setterm; echo $setsize; cat $TMP) \ X! | gnutex $plot_args | /usr/local/bin/ipr $LANG \ X! $iflags -f gnutex \ X! -D"jobheader $print_banner" \ X! -D"program lasergnu" X! X! cleanup: X rm $TMP Xdiff -cr ../gnutex.old/maildfk ./maildfk X*** ../gnutex.old/maildfk Fri Feb 10 12:24:38 1989 X--- ./maildfk Wed Feb 1 18:05:42 1989 X*************** X*** 0 **** X--- 1,44 ---- X+ #!/bin/sh X+ # maildfk - send mail to GnuTeX author to register use of program X+ # X+ X+ # Don't do this more than once X+ if test ! -r FIRST X+ then exit X+ fi X+ X+ echo "" X+ echo The author of GnuTeX would like to hear that you have a X+ echo copy. Unless you object, mail will be sent to him now. X+ echo This mail will be used only to see how many copies exist. X+ echo You can also ask to have your name added to the mailing list, X+ echo to keep you informed of future patches. X+ echo "" X+ X+ echo -n Do you wish to have your name on the list '[y] ' X+ read yes X+ if test -s "$yes" -o "$yes" = yes -o "$yes" = YES -o "$yes" = y -o "$yes" = Y X+ then X+ echo Please enter your e-mail address from the ARPAnet: X+ read addr X+ name="Please put this name on the list: $addr" X+ else X+ name="Please do not put me on the list." X+ fi X+ X+ echo -n Do you wish to send the mail '[y] ' X+ read yes X+ if test -s "$yes" -o "$yes" = yes -o "$yes" = YES -o "$yes" = y -o "$yes" = Y X+ then X+ patch=`cat PATCHLEVEL` X+ dfk=dfk@cs.duke.edu X+ X+ echo GnuTeX was installed here. $name \ X+ | mail -s "GnuTeX 1.$patch installed" $dfk X+ echo mail sent to $dfk X+ else X+ echo No mail sent. X+ fi X+ X+ # Don't run this again X+ rm FIRST Xdiff -cr ../gnutex.old/plot.h ./plot.h X*** ../gnutex.old/plot.h Fri Feb 10 12:16:14 1989 X--- ./plot.h Wed Feb 1 17:35:59 1989 X*************** X*** 23,33 **** X #define PROGRAM "gnutex" X #define PROMPT "gnutex> " X #define SHELL "/bin/sh" X- #ifdef vms X- #define HELP "" X- #else /* vms */ X- #define HELP "echo Sorry, no help for gnutex" X- #endif X X #define TRUE 1 X #define FALSE 0 X--- 23,28 ---- Xdiff -cr ../gnutex.old/term.c ./term.c X*** ../gnutex.old/term.c Fri Feb 10 12:16:17 1989 X--- ./term.c Thu Feb 2 15:10:54 1989 X*************** X*** 19,24 **** X--- 19,31 ---- X */ X /* modified 1/14/89 for Microsoft C5.1 by JDM (mcdonald@uxe.cso.uiuc.edu) X */ X+ /* X+ * Modification for direct Imagen output (but retaining many of the X+ * LaTeX extensions) by Paul E. McKenney, 1989. X+ * Information Science and Technology Division, SRI International, X+ * 333 Ravenswood Ave, Menlo Park, CA 94025. X+ * Mail to mckenney@sri.com. X+ */ X X #include <stdio.h> X #include "plot.h" X*************** X*** 1103,1108 **** X--- 1110,1117 ---- X X #define LATEX_TICSIZ 101 /* no more than 100 chars in a tic label */ X X+ #define LATEX_FORMAT "$%g$" /* default format for tic marks */ X+ X static long LATEX_posx; X static long LATEX_posy; X static BOOLEAN LATEX_inplot; X*************** X*** 1138,1144 **** X LATEX_inplot = FALSE; X LATEX_style = NULL; X LATEX_type = -1; X! X fprintf(outfile, "\\setlength{\\unitlength}{%gpt}\n", LATEX_UNIT); X } X X--- 1147,1153 ---- X LATEX_inplot = FALSE; X LATEX_style = NULL; X LATEX_type = -1; X! X fprintf(outfile, "\\setlength{\\unitlength}{%gpt}\n", LATEX_UNIT); X } X X*************** X*** 1342,1351 **** X str); X } X X- #ifdef MSDOS X- # define index(s,c) strchr(s,c) X- #endif MSDOS X- X LATEX_xyput_text(x, y, str, pos, length, dx, dy) X unsigned int x,y; /* reference point of string */ X char str[]; /* the text */ X--- 1351,1356 ---- X*************** X*** 1367,1376 **** X /* optional arrow */ X if (length != 0 && pos != NULL && *pos != NULL) { X if (dx == 0 && dy == 0) { /* determine slope from pos */ X! if (index(pos, 'l') != NULL) dx = -1; X! if (index(pos, 'r') != NULL) dx = 1; X! if (index(pos, 't') != NULL) dy = 1; X! if (index(pos, 'b') != NULL) dy = -1; X } X fprintf(outfile, "\\vector(%d,%d){%u}\n", dx, dy, length); X } X--- 1372,1381 ---- X /* optional arrow */ X if (length != 0 && pos != NULL && *pos != NULL) { X if (dx == 0 && dy == 0) { /* determine slope from pos */ X! if (INDEX(pos, 'l') != NULL) dx = -1; X! if (INDEX(pos, 'r') != NULL) dx = 1; X! if (INDEX(pos, 't') != NULL) dy = 1; X! if (INDEX(pos, 'b') != NULL) dy = -1; X } X fprintf(outfile, "\\vector(%d,%d){%u}\n", dx, dy, length); X } X*************** X*** 1483,1488 **** X--- 1488,1495 ---- X { X char mark[LATEX_TICSIZ]; X X+ if (*format == '\0') X+ format = LATEX_FORMAT; X sprintf(mark, format, number); X fprintf(outfile, "\\put(%ld,%ld){\\makebox(0,0)[t]{%s}}\n", X (long)x, (long)(-LATEX_HTIC), mark); X*************** X*** 1495,1500 **** X--- 1502,1509 ---- X { X char mark[LATEX_TICSIZ]; X X+ if (*format == '\0') X+ format = LATEX_FORMAT; X sprintf(mark, format, number); X fprintf(outfile, "\\put(%ld,%ld){\\makebox(0,0)[r]{%s}}\n", X (long)(-LATEX_VTIC), (long)y, mark); X*************** X*** 1512,1518 **** X--- 1521,2066 ---- X X #endif /* LATEX */ X X+ #ifdef IMAGEN X X+ #include "imPcodes.h" X+ X+ #define IMAGEN_PTS_PER_INCH (300) X+ #define IMAGEN_UNIT (.01) /* points */ X+ X+ #define IMAGEN_HTIC 20 X+ #define IMAGEN_VTIC 20 X+ #define IMAGEN_HCHAR (4./IMAGEN_UNIT) X+ #define IMAGEN_VCHAR (12./IMAGEN_UNIT) X+ X+ #define IMAGEN_TICSIZ 101 /* no more than 100 chars in a tic label */ X+ X+ #define IMAGEN_FORMAT "%g" /* default tick mark format */ X+ X+ static int IMAGEN_orgx; /* absolute-pixel-ORIgin of graph. */ X+ static int IMAGEN_orgy; X+ static int IMAGEN_posx; /* current drawing position (lines). */ X+ static int IMAGEN_posy; X+ static int IMAGEN_inplot; X+ static int IMAGEN_xmax; /* width of graph in pixels. */ X+ static int IMAGEN_ymax; /* height of graph in pixels. */ X+ static int IMAGEN_hchar; /* Height of CHAR in current font. */ X+ static int IMAGEN_wchar; /* Width of CHAR in current font. */ X+ static int IMAGEN_blofs; /* BaseLine OFfSet from bounding box. */ X+ static int IMAGEN_rotated = -1; /* text printing is ROTATED (y-axis label) */ X+ X+ static int IMAGEN_titlefsz = 15; X+ static int IMAGEN_axisfsz = 12; X+ static int IMAGEN_labelfsz = 10; X+ static int IMAGEN_tickfsz = 9; X+ static int IMAGEN_cursize = -1; /* pointer to one of above. */ X+ X+ static IMAGEN_endplot(); X+ extern char *malloc(); X+ X+ #ifndef sign X+ #define sign(x) ((x) >= 0 ? 1 : -1) X+ #define abs(x) ((x) >= 0 ? (x) : -(x)) X+ #define max(a,b) ((a) > (b) ? (a) : (b)) X+ #define min(a,b) ((a) < (b) ? (a) : (b)) X+ #endif /* sign */ X+ X+ /* Default line-drawing character */ X+ #define IMAGEN_DOT_SPACING (2.0/IMAGEN_UNIT) X+ X+ static int IMAGEN_type; /* negative types use real lines */ X+ static struct st_entry *IMAGEN_style = NULL; /* NULL => use default styles */ X+ static IMAGEN_seq_pos; /* position in sequence */ X+ X+ IMAGEN_init() X+ { X+ IMAGEN_posx = IMAGEN_posy = 0; X+ IMAGEN_inplot = FALSE; X+ IMAGEN_style = NULL; X+ IMAGEN_type = -1; X+ X+ IMAGEN_rotated = -1; X+ X+ fputs("@document(language impress)", outfile); X+ putc(imP_SET_HV_SYSTEM, outfile); X+ putc((3<<3)|5, outfile); X+ putc(imP_SET_ADV_DIRS, outfile); /* up and to the right, landscape. */ X+ putc(7, outfile); X+ IMAGEN_createfamily("cour06", 6); X+ IMAGEN_createfamily("cour07", 7); X+ IMAGEN_createfamily("cour08", 8); X+ IMAGEN_createfamily("cour09", 9); X+ IMAGEN_createfamily("cour10", 10); X+ IMAGEN_createfamily("cour12", 12); X+ IMAGEN_createfamily("cour14", 14); X+ IMAGEN_createfamily("cour15", 15); X+ IMAGEN_setfont(IMAGEN_titlefsz); X+ IMAGEN_unrotate(); X+ putc(imP_SET_ABS_H, outfile); X+ IMAGEN_putwd(0); X+ putc(imP_SET_ABS_V, outfile); X+ IMAGEN_putwd(0); X+ } X+ IMAGEN_putwd(w) X+ { X+ putc(w>>8, outfile); X+ putc(w, outfile); X+ } X+ IMAGEN_createfamily(c, sz) X+ X+ char *c; X+ int sz; X+ X+ { X+ putc(imP_CREATE_FAMILY_TABLE, outfile); X+ putc(sz, outfile); X+ putc(1, outfile); X+ putc(0, outfile); X+ fputs(c, outfile); X+ putc(0, outfile); X+ } X+ IMAGEN_setfont(sz) int sz; X+ { X+ if (IMAGEN_cursize == sz) X+ return; X+ IMAGEN_hchar = sz * 5; X+ IMAGEN_wchar = IMAGEN_hchar / 2; X+ IMAGEN_blofs = IMAGEN_hchar / 3; X+ putc(imP_SET_FAMILY, outfile); X+ putc(sz, outfile); X+ putc(imP_SET_SP, outfile); X+ IMAGEN_putwd(IMAGEN_wchar); X+ putc(imP_SET_IL, outfile); X+ IMAGEN_putwd(IMAGEN_hchar); X+ IMAGEN_cursize = sz; X+ } X+ X+ X+ IMAGEN_graphics(xmax, ymax, t, xlabel, ylabel, yskip, title) X+ float xmax, ymax; /* in inches */ X+ struct termentry *t; X+ char *xlabel; /* x-axis label */ X+ char *ylabel; /* y-axis label */ X+ int yskip; /* y-axis label skip factor */ X+ char *title; /* plot title */ X+ { X+ int h, w; X+ char *s; X+ X+ if (IMAGEN_inplot) X+ IMAGEN_newpage(); X+ IMAGEN_inplot = TRUE; X+ X+ /* Convert inches to points to coordinates */ X+ IMAGEN_xmax = (int) (xmax * IMAGEN_PTS_PER_INCH); X+ IMAGEN_ymax = (int) (ymax * IMAGEN_PTS_PER_INCH); X+ IMAGEN_orgx = ((int) (11.0 - xmax)) * IMAGEN_PTS_PER_INCH / 2; X+ IMAGEN_orgy = ((int) (8.5 - ymax)) * IMAGEN_PTS_PER_INCH / 2; X+ X+ /* store these away for the use of plotting routines */ X+ t->xmax = IMAGEN_xmax; X+ t->ymax = IMAGEN_ymax; X+ X+ /* Construct the image from the labels and the plot, as a table */ X+ X+ if (title && *title != '\0') X+ { X+ IMAGEN_unrotate(); X+ IMAGEN_setfont(IMAGEN_titlefsz); X+ IMAGEN_xy_text(IMAGEN_xmax / 2, X+ IMAGEN_ymax + 2 * IMAGEN_hchar, X+ title, "b"); X+ } X+ if (ylabel && *ylabel != '\0') { X+ IMAGEN_rotate(); X+ IMAGEN_setfont(IMAGEN_axisfsz); X+ IMAGEN_xy_text((-yskip - 3) * IMAGEN_wchar, X+ IMAGEN_ymax / 2, X+ ylabel, "r"); X+ } X+ if (xlabel && *xlabel != '\0') { X+ IMAGEN_unrotate(); X+ IMAGEN_setfont(IMAGEN_axisfsz); X+ IMAGEN_xy_text(IMAGEN_xmax / 2, X+ -2 * IMAGEN_hchar, X+ xlabel, "t"); X+ } X+ X+ IMAGEN_move(0, 0); X+ X+ } X+ X+ X+ static X+ IMAGEN_newpage() X+ { X+ putc(imP_ENDPAGE, outfile); X+ } X+ X+ static X+ IMAGEN_endplot() X+ { X+ putc(imP_EOF, outfile); X+ } X+ X+ X+ IMAGEN_text() X+ { X+ } X+ X+ X+ IMAGEN_linetype(linetype) X+ int linetype; X+ { X+ static int lastlinetype = -1; X+ X+ IMAGEN_type = linetype; X+ if (linetype < 0) X+ linetype = -linetype; X+ else X+ linetype = 1; X+ if (lastlinetype == linetype) X+ return; X+ lastlinetype = linetype; X+ putc(imP_SET_PEN, outfile); X+ putc(linetype, outfile); X+ IMAGEN_style = NULL; X+ } X+ X+ X+ IMAGEN_plotstyle(stp) X+ struct st_entry *stp; X+ { X+ IMAGEN_style = stp; X+ IMAGEN_seq_pos = 0; X+ } X+ X+ X+ IMAGEN_move(x,y) X+ unsigned int x,y; X+ { X+ IMAGEN_posx = x; X+ IMAGEN_posy = y; X+ } X+ X+ IMAGEN_vector(ux,uy) X+ unsigned int ux,uy; X+ { X+ int x=ux, y=uy; X+ X+ /* Create path. */ X+ X+ putc(imP_CREATE_PATH, outfile); X+ IMAGEN_putwd(2); X+ IMAGEN_putwd(IMAGEN_posx + IMAGEN_orgx); X+ IMAGEN_putwd(IMAGEN_posy + IMAGEN_orgy); X+ IMAGEN_putwd(ux + IMAGEN_orgx); X+ IMAGEN_putwd(uy + IMAGEN_orgy); X+ X+ /* Draw path with black pen. */ X+ X+ putc(imP_DRAW_PATH, outfile); X+ putc(15, outfile); X+ X+ /* Set current position to end of line. */ X+ X+ IMAGEN_move(ux, uy); X+ } X+ X+ IMAGEN_setpos(ux, uy) X+ X+ int ux,uy; X+ { X+ /* Set x and y position, also set beginning-of-line. */ X+ X+ putc(imP_SET_ABS_H, outfile); X+ IMAGEN_putwd(ux + IMAGEN_orgx); X+ putc(imP_SET_ABS_V, outfile); X+ IMAGEN_putwd(uy + IMAGEN_orgy); X+ putc(imP_SET_BOL, outfile); X+ if (IMAGEN_rotated) X+ IMAGEN_putwd(uy + IMAGEN_orgx); X+ else X+ IMAGEN_putwd(ux + IMAGEN_orgx); X+ } X+ X+ IMAGEN_rotate() X+ X+ { X+ if (IMAGEN_rotated == 1) X+ return; X+ X+ /* Cause text to run from bottom to top. */ X+ X+ putc(imP_SET_ADV_DIRS, outfile); X+ putc(7, outfile); X+ IMAGEN_rotated = 1; X+ } X+ X+ IMAGEN_unrotate() X+ X+ { X+ if (IMAGEN_rotated == 0) X+ return; X+ X+ /* Cause text to run from left to right. */ X+ X+ putc(imP_SET_ADV_DIRS, outfile); X+ putc(0, outfile); X+ IMAGEN_rotated = 0; X+ } X+ X+ char * X+ IMAGEN_cvts(str, width, height) X+ X+ char *str; X+ int *width; X+ int *height; X+ X+ { X+ char *cp1; X+ char *cp2; X+ static char *buf = NULL; X+ int h; X+ int maxw; X+ int w; X+ X+ /* Free up old buffer, if there is one, get a new one. Since */ X+ /* all transformations shorten the string, get a buffer that is */ X+ /* the same size as the input string. */ X+ X+ if (buf != NULL) X+ (void)free(buf); X+ buf = (char *)malloc(strlen(str)); X+ X+ /* Do the transformations. */ X+ X+ cp1 = str; X+ cp2 = buf; X+ h = 1; X+ maxw = 0; X+ w = 0; X+ while (*cp1 != NULL) X+ { X+ switch (*cp1) X+ { X+ case ' ' : X+ X+ /* Space character. */ X+ X+ *cp2++ = imP_SP; X+ w++; X+ break; X+ X+ case '\\' : X+ X+ /* Escape sequence. */ X+ X+ if (*++cp1 == '\\') X+ { X+ X+ /* Begin new line. */ X+ X+ h++; X+ if (w > maxw) X+ maxw = w; X+ w = 0; X+ *cp2++ = imP_CRLF; X+ break; X+ } X+ X+ /* Fall through to just copy next char out. */ X+ X+ default : X+ *cp2++ = *cp1; X+ w++; X+ break; X+ } X+ cp1++; X+ } X+ X+ *cp2 = '\0'; X+ if (w > maxw) X+ maxw = w; X+ X+ if (height != NULL) X+ *height = IMAGEN_rotated ? X+ IMAGEN_wchar * maxw : X+ IMAGEN_hchar * h; X+ if (width != NULL) X+ *width = IMAGEN_rotated ? X+ IMAGEN_hchar * h : X+ IMAGEN_wchar * maxw; X+ return (buf); X+ } X+ X+ IMAGEN_puts(str) X+ X+ char *str; X+ X+ { X+ str = IMAGEN_cvts(str, NULL, NULL); X+ fputs(str, outfile); X+ } X+ X+ IMAGEN_lrput_text(row,str) X+ unsigned int row; X+ char str[]; X+ { X+ char *imstr; X+ int width; X+ X+ imstr = IMAGEN_cvts(str, &width, NULL); X+ IMAGEN_setpos((int)(IMAGEN_xmax - IMAGEN_HTIC - width), X+ (int)(IMAGEN_VTIC + 3 + IMAGEN_hchar*row)); X+ fputs(imstr, outfile); X+ } X+ X+ X+ IMAGEN_ulput_text(row,str) X+ unsigned int row; X+ char str[]; X+ { X+ IMAGEN_setpos((int)(IMAGEN_HTIC+3), X+ (int)(IMAGEN_ymax - X+ IMAGEN_VTIC - IMAGEN_hchar*(row+1))); X+ IMAGEN_puts(str); X+ } X+ X+ /* Invoked from gnutex, puts out optional arrow and forces font. */ X+ X+ IMAGEN_xyput_text(ref_x, ref_y, str, pos, length, dx, dy) X+ int ref_x,ref_y; /* reference point of string */ X+ char str[]; /* the text */ X+ char pos[]; /* for optional [pos] to \makebox */ X+ unsigned int length; /* optional arrow length */ X+ int dx, dy; /* optional slopes for arrow */ X+ X+ { X+ IMAGEN_unrotate(); X+ IMAGEN_setfont(IMAGEN_labelfsz); X+ IMAGEN_xy_text(ref_x, ref_y, str, pos); X+ if (length != 0 && pos != NULL && *pos != '\0') X+ { X+ if (dx == 0 && dy == 0) X+ { X+ if (index(pos, 'l')) X+ dx = -1; X+ if (index(pos, 'r')) X+ dx = 1; X+ if (index(pos, 't')) X+ dy = 1; X+ if (index(pos, 'b')) X+ dy = -1; X+ } X+ IMAGEN_move(ref_x, ref_y); X+ IMAGEN_vector(ref_x + dx * length, ref_y + dy * length); X+ } X+ } X+ X+ /* Called internally, just dumps string. */ X+ X+ IMAGEN_xy_text(ref_x, ref_y, str, pos) X+ X+ int ref_x,ref_y; /* reference point of string */ X+ char str[]; /* the text */ X+ char pos[]; /* for optional [pos] to \makebox */ X+ { X+ char *cvstr; X+ int dy = 0; X+ int height; X+ int width; X+ int x = ref_x; X+ int y = ref_y; X+ X+ if (!IMAGEN_inplot) X+ return; X+ X+ cvstr = IMAGEN_cvts(str, &width, &height); X+ x -= width / 2; X+ dy += height / 2; X+ if (pos != NULL) X+ { X+ if (index(pos, 'l')) X+ x += width / 2; X+ if (index(pos, 'r')) X+ x -= width / 2; X+ if (index(pos, 't')) X+ dy -= height / 2; X+ if (index(pos, 'b')) X+ dy += height / 2; X+ } X+ if (IMAGEN_rotated) X+ { X+ x += IMAGEN_hchar; X+ y -= dy; X+ } X+ else X+ y += dy - IMAGEN_hchar; X+ IMAGEN_setpos(x, y + IMAGEN_blofs); X+ fputs(cvstr, outfile); X+ } X+ X+ IMAGEN_key(x, y, style, names) X+ unsigned int x,y; X+ int style[]; X+ char *names[]; X+ { X+ /* @@@ maybe someday . . . */ X+ } X+ X+ static X+ char * /* pointer to static storage */ X+ IMAGEN_key_point(style, pcount) X+ int style; /* style number to describe */ X+ int *pcount; /* running counter of point-like styles */ X+ { X+ /* @@@ Maybe someday . . . */ X+ } X+ X+ IMAGEN_xtick_text(x, number, format) X+ unsigned int x; /* place to put on axis */ X+ double number; /* the number to be written at that tick */ X+ char *format; X+ { X+ char mark[IMAGEN_TICSIZ]; X+ X+ if (*format == '\0') X+ format = IMAGEN_FORMAT; X+ IMAGEN_unrotate(); X+ IMAGEN_setfont(IMAGEN_tickfsz); X+ sprintf(mark, format, number); X+ IMAGEN_xy_text(x, (int)(-IMAGEN_HTIC), mark, "t"); X+ } X+ X+ IMAGEN_ytick_text(y, number, format) X+ int y; /* place to put on axis */ X+ double number; /* the number to be written at that tick */ X+ char *format; X+ { X+ char mark[IMAGEN_TICSIZ]; X+ X+ if (*format == '\0') X+ format = IMAGEN_FORMAT; X+ IMAGEN_unrotate(); X+ IMAGEN_setfont(IMAGEN_tickfsz); X+ sprintf(mark, format, number); X+ IMAGEN_xy_text((int)(-IMAGEN_VTIC), y, mark, "r"); X+ } X+ X+ X+ IMAGEN_reset() X+ { X+ if (IMAGEN_inplot) { X+ IMAGEN_endplot(); X+ IMAGEN_inplot = FALSE; X+ } X+ IMAGEN_posx = IMAGEN_posy = 0; X+ } X+ X+ #endif /* IMAGEN */ X+ X+ X UNKNOWN_null() X { X int_error("you must set your terminal type before plotting!",NO_CARET); X*************** X*** 1620,1625 **** X--- 2168,2184 ---- X LATEX_vector, X LATEX_linetype, LATEX_lrput_text, LATEX_ulput_text, LATEX_point, X LATEX_xyput_text, LATEX_xtick_text, LATEX_ytick_text, LATEX_plotstyle} X+ #endif X+ X+ #ifdef IMAGEN X+ /* xmax and ymax are filled in by IMAGEN_graphics */ X+ /* We supply the absolute maximum here */ X+ ,{"imagen", 11*IMAGEN_PTS_PER_INCH, 8.5*IMAGEN_PTS_PER_INCH, X+ IMAGEN_VCHAR, IMAGEN_HCHAR, IMAGEN_VTIC, IMAGEN_HTIC, X+ IMAGEN_init, IMAGEN_reset, IMAGEN_text, IMAGEN_graphics, IMAGEN_move, X+ IMAGEN_vector, X+ IMAGEN_linetype, IMAGEN_lrput_text, IMAGEN_ulput_text, do_point, X+ IMAGEN_xyput_text, IMAGEN_xtick_text, IMAGEN_ytick_text, IMAGEN_plotstyle} X #endif X }; X Xdiff -cr ../gnutex.old/util.c ./util.c X*** ../gnutex.old/util.c Mon Dec 5 13:25:59 1988 X--- ./util.c Wed Feb 1 17:54:57 1989 X*************** X*** 326,331 **** X--- 326,345 ---- X return(a); X } X X+ /* Lower-case the given string (DFK) */ X+ /* Done in place. */ X+ void X+ lower_case(s) X+ char *s; X+ { X+ register char *p = s; X+ X+ while (*p != '\0') { X+ if (*p >= 'A' && *p <= 'Z') X+ *p = *p - 'A' + 'a'; X+ p++; X+ } X+ } X X X os_error(str,t_num) Xdiff -cr ../gnutex.old/version.c ./version.c X*** ../gnutex.old/version.c Mon Dec 5 13:25:59 1988 X--- ./version.c Thu Feb 2 15:12:17 1989 X*************** X*** 1,2 **** X! char version[] = "1.0.3 + latex mods 1.3"; X! char date[] = "Mon Dec 5 13:22:46 EST 1988"; X--- 1,2 ---- X! char version[] = "1.0.3 + latex mods 1.5"; X! char date[] = "Thu Feb 2 15:12:10 EST 1989"; XOnly in ../gnutex.old: vmshelp.csh Xdiff -cr ../gnutex.old/Help/Makefile ./Help/Makefile X*** ../gnutex.old/Help/Makefile Fri Feb 10 12:26:05 1989 X--- ./Help/Makefile Fri Feb 10 12:10:17 1989 X*************** X*** 0 **** X--- 1,7 ---- X+ CFLAGS = -g X+ X+ htest: help.o htest.o X+ cc $(CFLAGS) htest.o help.o -o htest X+ X+ clean: X+ rm -f *~ *.o core Xdiff -cr ../gnutex.old/Help/README ./Help/README X*** ../gnutex.old/Help/README Fri Feb 10 12:26:05 1989 X--- ./Help/README Wed Feb 1 13:50:49 1989 X*************** X*** 0 **** X--- 1,51 ---- X+ These are the files for the customizable help facility. X+ X+ Contents: X+ help.3 The man page for help(). X+ help.h Include file showing return status values. X+ help.c The source for help() itself. X+ X+ Makefile Makes `htest', the help testing program. X+ htest.c Source for htest. X+ helpfile Sample help file. X+ alt-helpfile Other help file; contains help info for "alternate" key X+ X+ Suggestion: format the man page (nroff -man help.3 | lp) and read it, X+ then read the comments in the prologue to the code. Help-file writers X+ might want to look at the helpfile, and run htest to see how it looks. X+ Run the help test by typing "make", then "htest". X+ X+ The basic idea for this routine is to provide a help interface like X+ Edit/1000: you ask for help, it prints out the help text for that X+ subject only. You can set up the help file so that several synonyms X+ will cause the same help text to appear. You can provide context- X+ sensitive help by setting up the calling routine to use a different X+ file depending on the context or desired verbosity level. X+ X+ Advantages to using this help code over using `more' on a help file: X+ X+ 1. No "skipping" messages or unsightly "(73%)" prompts from `more'. X+ You get the help text on only the subject you asked for, instead of X+ being left in the file and being forced to type "q". X+ X+ 2. Help keywords (the subject that the user asks about) can be made X+ case-insensitive if you provide keywords in both cases in your help X+ file. `more' insists on exact matches. X+ X+ 3. Various speed hacks. Faster than vfork()+exec(), much faster than X+ system(). Doesn't re-open your help file if the user asks for help X+ more than once on the same file. X+ X+ Disadvantage of this help code over `more': X+ X+ The code as written doesn't scroll, it just cats the text to your X+ screen. This means that you should try to fit everything on 23 lines X+ or less. (This is not considered a real problem, especially because X+ you can end an entry with "Get help on <whatever detail you mentioned> X+ for more information", and because a screenful is an awful lot of X+ material for a user to digest.) X+ X+ Future directions: X+ X+ The routine could be sped up even more by replacing the stdio calls X+ with open/read/write/close, but it runs quite swiftly even now. Xdiff -cr ../gnutex.old/Help/alt-helpfile ./Help/alt-helpfile X*** ../gnutex.old/Help/alt-helpfile Fri Feb 10 12:26:05 1989 X--- ./Help/alt-helpfile Wed Feb 1 13:50:51 1989 X*************** X*** 0 **** X--- 1,7 ---- X+ ?alternate X+ This is the alternate help file right here. It doesn't know about much X+ for the purposes of the test, but could be quite extensive. X+ X+ It could also contain auxiliary information (something more in-depth, or X+ just an interesting side point, or a tutorial). If the user never asks to X+ see its information, it's never opened and doesn't incur any costs. Xdiff -cr ../gnutex.old/Help/help.3 ./Help/help.3 X*** ../gnutex.old/Help/help.3 Fri Feb 10 12:26:05 1989 X--- ./Help/help.3 Wed Feb 1 13:50:54 1989 X*************** X*** 0 **** X--- 1,87 ---- X+ .TH HELP 3:LOCAL "January 1986" X+ .SH NAME X+ help \- provide help message about a topic X+ .SH SYNOPSIS X+ .nf X+ .ft B X+ #include "help.h" X+ X+ help(keyword, helpfile) X+ char *keyword; X+ char *helpfile; X+ .ft R X+ .fi X+ .SH DESCRIPTION X+ The X+ .I help X+ call looks up the X+ .I keyword X+ in the specified X+ .IR helpfile . X+ If an entry matching the desired X+ .I keyword X+ is found, its corresponding description is sent to the standard output. X+ Thus, you can customize a program's help information merely by editing the X+ .IR helpfile X+ instead of re-compiling the program sources. X+ If X+ .I helpfile X+ doesn't change from one call to the next, X+ .I help X+ avoids re-opening the file. X+ .PP X+ The X+ .I keyword X+ should have a trailing newline, and must end with a NULL character. X+ The format of the X+ .I helpfile X+ is (with question marks in column 1 on each line): X+ .PP X+ .nf X+ ?keyword X+ This line is printed when help on \fBkeyword\fP is requested. X+ ?Topic X+ ?topic X+ These lines are printed when help on \fBTopic\fP or \fBtopic\fP is X+ requested. No keywords are casefolded before processing, and each X+ help message may have more than one key that matches it. X+ ? X+ ?? X+ These lines are printed out when a null keyword (really just a newline) X+ or a keyword of \fB?\fP is requested. Typically, this help message is X+ a command summary or overview. X+ .fi X+ .SH EXAMPLE X+ .nf X+ /* `buf' contains the user's reply */ X+ switch (help(buf, "/usr/local/lib/helpfile")) { X+ case H_FOUND: X+ /* already printed the help info; do nothing */ X+ break; X+ case H_NOTFOUND: X+ printf("Sorry, no help for %s", buf); X+ break; X+ case H_ERROR: X+ perror("/usr/local/lib/helpfile"); X+ break; X+ default: X+ cannot_happen("help"); X+ break; X+ } X+ .fi X+ .SH DIAGNOSTICS X+ A return of H_FOUND, defined in ``help.h'', means help was given: X+ the keyword was found and a message was printed. X+ A return of H_NOTFOUND means no help was given because the X+ .I keyword X+ wasn't found in the X+ .I helpfile. X+ A return of H_ERROR means there was an error opening the X+ .IR helpfile . X+ H_ERROR returns can be handled by the caller: X+ write a message to standard error, typically using X+ .IR perror (), X+ or call X+ .IR help () X+ using a different pathname in X+ .IR helpfile . Xdiff -cr ../gnutex.old/Help/help.c ./Help/help.c X*** ../gnutex.old/Help/help.c Fri Feb 10 12:26:05 1989 X--- ./Help/help.c Wed Feb 1 13:50:56 1989 X*************** X*** 0 **** X--- 1,134 ---- X+ #include <stdio.h> X+ #include <errno.h> X+ #include <string.h> X+ #define SAME 0 /* for strcmp() */ X+ X+ #include "help.h" /* values passed back */ X+ X+ /* help -- help subsystem that understands defined keywords X+ ** X+ ** Looks for the desired keyword in the help file at runtime, so you X+ ** can give extra help or supply local customizations by merely editing X+ ** the help file. X+ ** X+ ** The original (single-file) idea and algorithm is by John D. Johnson, X+ ** Hewlett-Packard Company. Thanx and a tip of the Hatlo hat! X+ ** X+ ** The help file looks like (the question marks are really in column 1): X+ ** X+ ** ?topic X+ ** This line is printed when the user wants help on "topic". X+ ** ?keyword X+ ** ?Keyword X+ ** ?KEYWORD X+ ** These lines will be printed on the screen if the user wanted X+ ** help on "keyword", "Keyword", or "KEYWORD". No casefolding is X+ ** done on the keywords. X+ ** ?subject X+ ** ?alias X+ ** This line is printed for help on "subject" and "alias". X+ ** ? X+ ** ?? X+ ** Since there is a null keyword for this line, this section X+ ** is printed when the user wants general help (when a help X+ ** keyword isn't given). A command summary is usually here. X+ ** Notice that the null keyword is equivalent to a "?" keyword X+ ** here, because of the '?' and '??' topic lines above. X+ ** ?last-subject X+ ** Note that help sections are terminated by the start of the next X+ ** '?' entry or by EOF. So you can't have a leading '?' on a line X+ ** of any help section. You can re-define the magic character to X+ ** recognize in column 1, though, if '?' is too useful. (Try ^A.) X+ */ X+ X+ #define KEYFLAG '?' /* leading char in help file topic lines */ X+ X+ /* X+ ** Calling sequence: X+ ** int result; # 0 == success X+ ** char *keyword; # topic to give help on X+ ** char *pathname; # path of help file X+ ** result = help(keyword, pathname); X+ ** Sample: X+ ** cmd = "search\n"; X+ ** helpfile = "/usr/local/lib/program/program.help"; X+ ** if (help(cmd, helpfile) != H_FOUND) X+ ** printf("Sorry, no help for %s", cmd); X+ ** X+ ** X+ ** Speed this up by replacing the stdio calls with open/close/read/write. X+ */ X+ #ifdef WDLEN X+ # define PATHSIZE WDLEN X+ #else X+ # define PATHSIZE BUFSIZ X+ #endif X+ X+ help(keyword, path) /* print a help message */ X+ char *keyword; /* on this topic */ X+ char *path; /* from this file */ X+ { X+ static char oldpath[PATHSIZE] = '\0'; /* previous help file */ X+ char *oldpathp = oldpath; /* pointer to same */ X+ X+ static FILE *helpfp = NULL; X+ FILE *fopen(); X+ X+ char buf[BUFSIZ]; /* line from help file */ X+ char *bufp = buf; /* pointer to same */ X+ char *bufkeyp = bufp + 1; /* start of key in help line */ X+ X+ /* X+ ** Open the help file if necessary (say, first time we enter this routine, X+ ** or if the help file changes from the last time we were called). X+ */ X+ errno = 0; X+ if (strcmp(oldpathp, path) == SAME) X+ rewind(helpfp); /* start at the beginning each time */ X+ else X+ { /* first time the user asked for help using this file */ X+ if ((helpfp = fopen(path, "r")) == NULL) X+ { /* can't open help file, so error exit */ X+ return H_ERROR; X+ } X+ /* save the new path in oldpath */ X+ if (strlen(path) < sizeof oldpath) X+ strcpy(oldpathp, path); X+ else X+ { /* not enough room in oldpath, sigh */ X+ strncpy(oldpathp, path, sizeof oldpath); X+ oldpath[sizeof oldpath] = NULL; X+ } X+ } X+ X+ /* X+ ** The correct help file is open. Look in there for the keyword. X+ */ X+ while (fgets(buf, sizeof buf, helpfp) != NULL) X+ { /* X+ ** If we find the keyword: X+ ** skip to the first non-keyword line X+ ** print lines until you find another keyword line or EOF X+ ** return success X+ */ X+ if (buf[0] == KEYFLAG && strcmp(keyword, bufkeyp) == SAME) X+ { /* found the key */ X+ while (fgets(buf, sizeof buf, helpfp) != NULL X+ && buf[0] == KEYFLAG) X+ ; /* eat additional keyword lines */ X+ X+ fputs(bufp, stdout); /* print help */ X+ while (fgets(buf, sizeof buf, helpfp) != NULL X+ && buf[0] != KEYFLAG) X+ fputs(bufp, stdout); /* print help */ X+ return H_FOUND; X+ } X+ } X+ X+ /* X+ ** Didn't find anything in the help file for the poor user. Return failure. X+ ** Don't close the help file! The luser may want further help, and X+ ** re-opening an already-open help file is wasteful of time. X+ */ X+ return H_NOTFOUND; X+ } Xdiff -cr ../gnutex.old/Help/help.h ./Help/help.h X*** ../gnutex.old/Help/help.h Fri Feb 10 12:26:05 1989 X--- ./Help/help.h Wed Feb 1 13:50:57 1989 X*************** X*** 0 **** X--- 1,4 ---- X+ /* Exit status returned by help() */ X+ #define H_FOUND 0 /* found the keyword */ X+ #define H_NOTFOUND 1 /* didn't find the keyword */ X+ #define H_ERROR (-1) /* didn't find the help file */ Xdiff -cr ../gnutex.old/Help/helpfile ./Help/helpfile X*** ../gnutex.old/Help/helpfile Fri Feb 10 12:26:05 1989 X--- ./Help/helpfile Wed Feb 1 13:50:52 1989 X*************** X*** 0 **** X--- 1,47 ---- X+ ?topic X+ This line is printed when the user wants help on "topic". X+ ? X+ ?? X+ Help is available on: X+ X+ alias keyword subject topic last-subject X+ spaces work space X+ X+ Since there is a null keyword for this line, this section is printed when the X+ user wants general help (when a help keyword isn't given). A command summary X+ is usually here. Notice that the null keyword is equivalent to a "?" keyword X+ here, because of the '?' and '??' keyword lines above. X+ ?keyword X+ ?Keyword X+ ?KEYWORD X+ These lines will be printed on the screen if the user wanted help on X+ "keyword", "Keyword", or "KEYWORD". No casefolding is done on the keywords. X+ ?subject X+ ?alias X+ This line is printed for help on "subject" and "alias". X+ ?spaces work X+ ?spaces X+ ?work X+ Note that spaces are okay in keywords. This allows you to set up an X+ entry for, say, "open usage". Then when someone types an unrecognized X+ argument to the `open' command, you can make a call like: X+ X+ help("open usage", helpfilename); X+ X+ so it looks like you have a usage message in your program, whereas you X+ really are still using the help file. X+ ? X+ ? That previous line was just a space, like this line is a comment. X+ ?space X+ You can even get help on just a space, although keywording invisible X+ characters could prove confusing to your users. Note that "comments" X+ are really just very long keyword entries, above. It's unlikely that X+ anyone would ask for help on " That previous line was just a space, X+ like this line is a comment." X+ ?revision X+ @(#) 1.1 87/07/23 X+ ?last-subject X+ Note that help sections are terminated by the start of the next '?' entry or X+ by EOF. So you can't have a leading '?' on a line of any help section. You X+ can re-define the magic character to recognize in column 1, though, if '?' is X+ too useful. (I suggest ^A in such extreme cases.) Xdiff -cr ../gnutex.old/Help/htest.c ./Help/htest.c X*** ../gnutex.old/Help/htest.c Fri Feb 10 12:26:05 1989 X--- ./Help/htest.c Wed Feb 1 13:50:53 1989 X*************** X*** 0 **** X--- 1,32 ---- X+ #include <stdio.h> X+ #include "help.h" X+ X+ main() /* test out the help function */ X+ { X+ char buf[BUFSIZ]; X+ char *hfpn = "helpfile"; /* help file path name */ X+ char *ahfpn = "alt-helpfile"; /* alternate help file name */ X+ X+ printf("Type control-D to quit.\n"); X+ printf("Help on: "); X+ while (fgets(buf, sizeof buf, stdin) != NULL) X+ { X+ switch (help(buf, hfpn)) { X+ case H_FOUND: X+ /* already printed the help info; do nothing */ X+ break; X+ case H_NOTFOUND: X+ printf("Sorry, no help for %s", buf); X+ help(buf, ahfpn); /* try other help file */ X+ break; X+ case H_ERROR: X+ perror(hfpn); X+ break; X+ default: /* defensive programming */ X+ printf("Can't happen\n"); X+ break; X+ } X+ printf("Help on: "); X+ } X+ exit(0); X+ } XCommon subdirectories: ../gnutex.old/doc/example and ./doc/example Xdiff -cr ../gnutex.old/doc/lasergnu.1 ./doc/lasergnu.1 X*** ../gnutex.old/doc/lasergnu.1 Mon Dec 5 13:25:46 1988 X--- ./doc/lasergnu.1 Thu Feb 2 16:47:07 1989 X*************** X*** 26,31 **** X--- 26,35 ---- X .fi X The following switches are recognized: X .TP X+ .BI \-I X+ Use the impress language to make the plot, instead of Tektronix. Many X+ of the fancier features of gnutex are available in this mode. X+ .TP X .BI \-P\0 printer X The output of this program is intended for X .I printer. XCommon subdirectories: ../gnutex.old/doc/manual and ./doc/manual Xdiff -cr ../gnutex.old/doc/example/Makefile ./doc/example/Makefile X*** ../gnutex.old/doc/example/Makefile Mon Dec 12 14:36:45 1988 X--- ./doc/example/Makefile Wed Feb 1 13:39:29 1989 X*************** X*** 9,13 **** X--- 9,19 ---- X demo2: X lasergnu -l -f demo2.gnu X X+ demo2.latex: X+ (echo 'set terminal latex'; echo 'set output "plot.tex"'; cat demo2.gnu) | gnutex X+ latex pic X+ @echo ---------------------- X+ @echo Now print or view pic.dvi with some dvi output program X+ X clean: X rm -f *.aux *.log *.dvi *~ plot.tex Xdiff -cr ../gnutex.old/doc/manual/eg1.tex ./doc/manual/eg1.tex X*** ../gnutex.old/doc/manual/eg1.tex Fri Feb 10 12:16:18 1989 X--- ./doc/manual/eg1.tex Thu Feb 2 17:23:21 1989 X*************** X*** 66,75 **** X \put(361,9972){\circle*{1}} X \put(361,9972){\circle*{1}} X \put(421,9831){\circle*{1}} X! \put(482,9689){\circle*{1}} X! \put(542,9548){\circle*{1}} X! \put(542,9548){\circle*{1}} X! \put(602,9408){\circle*{1}} X \put(662,9267){\circle*{1}} X \put(722,9127){\circle*{1}} X \put(722,9127){\circle*{1}} X--- 66,75 ---- X \put(361,9972){\circle*{1}} X \put(361,9972){\circle*{1}} X \put(421,9831){\circle*{1}} X! \put(481,9689){\circle*{1}} X! \put(541,9548){\circle*{1}} X! \put(541,9548){\circle*{1}} X! \put(601,9408){\circle*{1}} X \put(662,9267){\circle*{1}} X \put(722,9127){\circle*{1}} X \put(722,9127){\circle*{1}} X*************** X*** 78,87 **** X \put(903,8708){\circle*{1}} X \put(903,8708){\circle*{1}} X \put(963,8570){\circle*{1}} X! \put(1024,8431){\circle*{1}} X! \put(1084,8293){\circle*{1}} X! \put(1084,8293){\circle*{1}} X! \put(1144,8156){\circle*{1}} X \put(1204,8019){\circle*{1}} X \put(1264,7882){\circle*{1}} X \put(1324,7746){\circle*{1}} X--- 78,87 ---- X \put(903,8708){\circle*{1}} X \put(903,8708){\circle*{1}} X \put(963,8570){\circle*{1}} X! \put(1023,8431){\circle*{1}} X! \put(1083,8293){\circle*{1}} X! \put(1083,8293){\circle*{1}} X! \put(1143,8156){\circle*{1}} X \put(1204,8019){\circle*{1}} X \put(1264,7882){\circle*{1}} X \put(1324,7746){\circle*{1}} X*************** X*** 89,201 **** X \put(1445,7475){\circle*{1}} X \put(1445,7475){\circle*{1}} X \put(1505,7341){\circle*{1}} X! \put(1566,7207){\circle*{1}} X! \put(1626,7073){\circle*{1}} X \put(1716,6875){\circle*{1}} X \put(1806,6677){\circle*{1}} X \put(1897,6482){\circle*{1}} X \put(1987,6287){\circle*{1}} X! \put(2078,6096){\circle*{1}} X! \put(2168,5905){\circle*{1}} X \put(2258,5718){\circle*{1}} X \put(2348,5530){\circle*{1}} X \put(2439,5347){\circle*{1}} X \put(2529,5163){\circle*{1}} X! \put(2620,4984){\circle*{1}} X! \put(2710,4805){\circle*{1}} X \put(2800,4631){\circle*{1}} X \put(2890,4457){\circle*{1}} X \put(2981,4288){\circle*{1}} X \put(3071,4118){\circle*{1}} X! \put(3162,3954){\circle*{1}} X! \put(3252,3789){\circle*{1}} X \put(3342,3630){\circle*{1}} X \put(3432,3471){\circle*{1}} X \put(3523,3318){\circle*{1}} X \put(3613,3165){\circle*{1}} X! \put(3704,3018){\circle*{1}} X! \put(3794,2871){\circle*{1}} X \put(3884,2730){\circle*{1}} X \put(3974,2588){\circle*{1}} X \put(4065,2454){\circle*{1}} X \put(4155,2319){\circle*{1}} X! \put(4246,2191){\circle*{1}} X! \put(4336,2063){\circle*{1}} X \put(4426,1942){\circle*{1}} X \put(4516,1820){\circle*{1}} X \put(4607,1706){\circle*{1}} X \put(4697,1591){\circle*{1}} X! \put(4788,1484){\circle*{1}} X! \put(4878,1376){\circle*{1}} X \put(4968,1276){\circle*{1}} X \put(5058,1176){\circle*{1}} X \put(5239,991){\circle*{1}} X! \put(5420,820){\circle*{1}} X \put(5600,666){\circle*{1}} X \put(5781,527){\circle*{1}} X! \put(5962,404){\circle*{1}} X \put(6142,297){\circle*{1}} X \put(6323,206){\circle*{1}} X! \put(6504,131){\circle*{1}} X \put(6684,74){\circle*{1}} X \put(6865,32){\circle*{1}} X! \put(7046,8){\circle*{1}} X \put(7226,0){\circle*{1}} X \put(7407,8){\circle*{1}} X! \put(7588,34){\circle*{1}} X \put(7768,76){\circle*{1}} X \put(7949,134){\circle*{1}} X! \put(8130,209){\circle*{1}} X \put(8310,301){\circle*{1}} X \put(8491,408){\circle*{1}} X! \put(8672,532){\circle*{1}} X \put(8852,672){\circle*{1}} X \put(9033,827){\circle*{1}} X! \put(9214,998){\circle*{1}} X \put(9394,1184){\circle*{1}} X \put(9485,1284){\circle*{1}} X \put(9575,1384){\circle*{1}} X! \put(9666,1492){\circle*{1}} X! \put(9756,1600){\circle*{1}} X \put(9846,1715){\circle*{1}} X \put(9936,1829){\circle*{1}} X \put(10027,1951){\circle*{1}} X \put(10117,2073){\circle*{1}} X! \put(10208,2202){\circle*{1}} X! \put(10298,2330){\circle*{1}} X \put(10388,2465){\circle*{1}} X \put(10478,2600){\circle*{1}} X \put(10569,2741){\circle*{1}} X \put(10659,2882){\circle*{1}} X! \put(10750,3030){\circle*{1}} X! \put(10840,3177){\circle*{1}} X \put(10930,3331){\circle*{1}} X \put(11020,3484){\circle*{1}} X \put(11111,3643){\circle*{1}} X \put(11201,3802){\circle*{1}} X! \put(11292,3967){\circle*{1}} X! \put(11382,4131){\circle*{1}} X \put(11472,4301){\circle*{1}} X \put(11562,4470){\circle*{1}} X \put(11653,4645){\circle*{1}} X \put(11743,4820){\circle*{1}} X! \put(11834,4999){\circle*{1}} X! \put(11924,5178){\circle*{1}} X \put(12014,5362){\circle*{1}} X \put(12104,5545){\circle*{1}} X \put(12195,5733){\circle*{1}} X \put(12285,5920){\circle*{1}} X! \put(12376,6112){\circle*{1}} X! \put(12466,6303){\circle*{1}} X \put(12556,6498){\circle*{1}} X \put(12646,6693){\circle*{1}} X \put(12737,6891){\circle*{1}} X \put(12827,7089){\circle*{1}} X \put(12887,7223){\circle*{1}} X! \put(12948,7357){\circle*{1}} X! \put(13008,7491){\circle*{1}} X! \put(13008,7491){\circle*{1}} X! \put(13068,7627){\circle*{1}} X \put(13128,7762){\circle*{1}} X \put(13188,7898){\circle*{1}} X \put(13188,7898){\circle*{1}} X--- 89,200 ---- X \put(1445,7475){\circle*{1}} X \put(1445,7475){\circle*{1}} X \put(1505,7341){\circle*{1}} X! \put(1565,7207){\circle*{1}} X! \put(1625,7073){\circle*{1}} X \put(1716,6875){\circle*{1}} X \put(1806,6677){\circle*{1}} X \put(1897,6482){\circle*{1}} X \put(1987,6287){\circle*{1}} X! \put(2077,6096){\circle*{1}} X! \put(2167,5905){\circle*{1}} X \put(2258,5718){\circle*{1}} X \put(2348,5530){\circle*{1}} X \put(2439,5347){\circle*{1}} X \put(2529,5163){\circle*{1}} X! \put(2619,4984){\circle*{1}} X! \put(2709,4805){\circle*{1}} X \put(2800,4631){\circle*{1}} X \put(2890,4457){\circle*{1}} X \put(2981,4288){\circle*{1}} X \put(3071,4118){\circle*{1}} X! \put(3161,3954){\circle*{1}} X! \put(3251,3789){\circle*{1}} X \put(3342,3630){\circle*{1}} X \put(3432,3471){\circle*{1}} X \put(3523,3318){\circle*{1}} X \put(3613,3165){\circle*{1}} X! \put(3703,3018){\circle*{1}} X! \put(3793,2871){\circle*{1}} X \put(3884,2730){\circle*{1}} X \put(3974,2588){\circle*{1}} X \put(4065,2454){\circle*{1}} X \put(4155,2319){\circle*{1}} X! \put(4245,2191){\circle*{1}} X! \put(4335,2063){\circle*{1}} X \put(4426,1942){\circle*{1}} X \put(4516,1820){\circle*{1}} X \put(4607,1706){\circle*{1}} X \put(4697,1591){\circle*{1}} X! \put(4787,1484){\circle*{1}} X! \put(4877,1376){\circle*{1}} X \put(4968,1276){\circle*{1}} X \put(5058,1176){\circle*{1}} X \put(5239,991){\circle*{1}} X! \put(5419,820){\circle*{1}} X \put(5600,666){\circle*{1}} X \put(5781,527){\circle*{1}} X! \put(5961,404){\circle*{1}} X \put(6142,297){\circle*{1}} X \put(6323,206){\circle*{1}} X! \put(6503,131){\circle*{1}} X \put(6684,74){\circle*{1}} X \put(6865,32){\circle*{1}} X! \put(7045,8){\circle*{1}} X \put(7226,0){\circle*{1}} X \put(7407,8){\circle*{1}} X! \put(7587,34){\circle*{1}} X \put(7768,76){\circle*{1}} X \put(7949,134){\circle*{1}} X! \put(8129,209){\circle*{1}} X \put(8310,301){\circle*{1}} X \put(8491,408){\circle*{1}} X! \put(8671,532){\circle*{1}} X \put(8852,672){\circle*{1}} X \put(9033,827){\circle*{1}} X! \put(9213,998){\circle*{1}} X \put(9394,1184){\circle*{1}} X \put(9485,1284){\circle*{1}} X \put(9575,1384){\circle*{1}} X! \put(9665,1492){\circle*{1}} X! \put(9755,1600){\circle*{1}} X \put(9846,1715){\circle*{1}} X \put(9936,1829){\circle*{1}} X \put(10027,1951){\circle*{1}} X \put(10117,2073){\circle*{1}} X! \put(10207,2202){\circle*{1}} X! \put(10297,2330){\circle*{1}} X \put(10388,2465){\circle*{1}} X \put(10478,2600){\circle*{1}} X \put(10569,2741){\circle*{1}} X \put(10659,2882){\circle*{1}} X! \put(10749,3030){\circle*{1}} X! \put(10839,3177){\circle*{1}} X \put(10930,3331){\circle*{1}} X \put(11020,3484){\circle*{1}} X \put(11111,3643){\circle*{1}} X \put(11201,3802){\circle*{1}} X! \put(11291,3967){\circle*{1}} X! \put(11381,4131){\circle*{1}} X \put(11472,4301){\circle*{1}} X \put(11562,4470){\circle*{1}} X \put(11653,4645){\circle*{1}} X \put(11743,4820){\circle*{1}} X! \put(11833,4999){\circle*{1}} X! \put(11923,5178){\circle*{1}} X \put(12014,5362){\circle*{1}} X \put(12104,5545){\circle*{1}} X \put(12195,5733){\circle*{1}} X \put(12285,5920){\circle*{1}} X! \put(12375,6112){\circle*{1}} X! \put(12465,6303){\circle*{1}} X \put(12556,6498){\circle*{1}} X \put(12646,6693){\circle*{1}} X \put(12737,6891){\circle*{1}} X \put(12827,7089){\circle*{1}} X \put(12887,7223){\circle*{1}} X! \put(12947,7357){\circle*{1}} X! \put(13007,7491){\circle*{1}} X! \put(13067,7627){\circle*{1}} X \put(13128,7762){\circle*{1}} X \put(13188,7898){\circle*{1}} X \put(13188,7898){\circle*{1}} X*************** X*** 204,393 **** X \put(13369,8310){\circle*{1}} X \put(13369,8310){\circle*{1}} X \put(13429,8448){\circle*{1}} X! \put(13490,8587){\circle*{1}} X! \put(13550,8725){\circle*{1}} X! \put(13550,8725){\circle*{1}} X! \put(13610,8865){\circle*{1}} X \put(13670,9004){\circle*{1}} X \put(13730,9144){\circle*{1}} X \put(13790,9285){\circle*{1}} X \put(13851,9425){\circle*{1}} X \put(13911,9566){\circle*{1}} X \put(13911,9566){\circle*{1}} X \put(13971,9707){\circle*{1}} X! \put(14032,9848){\circle*{1}} X! \put(14092,9989){\circle*{1}} X! \put(14092,9989){\circle*{1}} X! \put(14152,10131){\circle*{1}} X \put(14212,10272){\circle*{1}} X \put(14272,10414){\circle*{1}} X \put(14332,10556){\circle*{1}} X \put(14393,10697){\circle*{1}} X \put(14453,10839){\circle*{1}} X \put(14453,10839){\circle*{1}} X \put(14513,10981){\circle*{1}} X! \put(14574,11122){\circle*{1}} X! \put(14634,11264){\circle*{1}} X! \put(14634,11264){\circle*{1}} X! \put(14694,11406){\circle*{1}} X \put(14754,11547){\circle*{1}} X \put(14814,11689){\circle*{1}} X \put(14874,11830){\circle*{1}} X! \put(14935,11971){\circle*{1}} X! \put(14995,12112){\circle*{1}} X! \put(14995,12112){\circle*{1}} X! \put(15055,12253){\circle*{1}} X! \put(15116,12393){\circle*{1}} X! \put(15176,12534){\circle*{1}} X! \put(15176,12534){\circle*{1}} X! \put(15236,12674){\circle*{1}} X \put(15296,12813){\circle*{1}} X \put(15356,12953){\circle*{1}} X \put(15416,13091){\circle*{1}} X! \put(15477,13230){\circle*{1}} X! \put(15537,13368){\circle*{1}} X! \put(15537,13368){\circle*{1}} X! \put(15597,13505){\circle*{1}} X! \put(15658,13643){\circle*{1}} X! \put(15718,13780){\circle*{1}} X! \put(15718,13780){\circle*{1}} X! \put(15778,13916){\circle*{1}} X \put(15838,14051){\circle*{1}} X \put(15898,14187){\circle*{1}} X \put(15958,14321){\circle*{1}} X! \put(16019,14455){\circle*{1}} X! \put(16079,14589){\circle*{1}} X! \put(16079,14589){\circle*{1}} X! \put(16170,14787){\circle*{1}} X! \put(16260,14985){\circle*{1}} X \put(16350,15180){\circle*{1}} X \put(16440,15375){\circle*{1}} X! \put(16531,15567){\circle*{1}} X! \put(16621,15758){\circle*{1}} X! \put(16712,15946){\circle*{1}} X! \put(16802,16133){\circle*{1}} X \put(16892,16317){\circle*{1}} X \put(16982,16500){\circle*{1}} X! \put(17073,16679){\circle*{1}} X! \put(17163,16858){\circle*{1}} X! \put(17254,17033){\circle*{1}} X! \put(17344,17208){\circle*{1}} X \put(17434,17378){\circle*{1}} X \put(17524,17547){\circle*{1}} X! \put(17615,17712){\circle*{1}} X! \put(17705,17876){\circle*{1}} X! \put(17796,18035){\circle*{1}} X! \put(17886,18194){\circle*{1}} X \put(17976,18348){\circle*{1}} X \put(18066,18501){\circle*{1}} X! \put(18157,18649){\circle*{1}} X! \put(18247,18796){\circle*{1}} X! \put(18338,18937){\circle*{1}} X! \put(18428,19078){\circle*{1}} X \put(18518,19213){\circle*{1}} X \put(18608,19348){\circle*{1}} X! \put(18699,19477){\circle*{1}} X! \put(18789,19605){\circle*{1}} X! \put(18880,19727){\circle*{1}} X! \put(18970,19849){\circle*{1}} X \put(19060,19964){\circle*{1}} X \put(19150,20078){\circle*{1}} X! \put(19241,20186){\circle*{1}} X! \put(19331,20294){\circle*{1}} X! \put(19422,20394){\circle*{1}} X! \put(19512,20494){\circle*{1}} X \put(19692,20680){\circle*{1}} X! \put(19873,20851){\circle*{1}} X! \put(20054,21006){\circle*{1}} X \put(20234,21146){\circle*{1}} X! \put(20415,21270){\circle*{1}} X! \put(20596,21377){\circle*{1}} X \put(20776,21469){\circle*{1}} X! \put(20957,21544){\circle*{1}} X! \put(21138,21602){\circle*{1}} X \put(21318,21644){\circle*{1}} X! \put(21499,21670){\circle*{1}} X! \put(21680,21678){\circle*{1}} X \put(21860,21670){\circle*{1}} X! \put(22041,21646){\circle*{1}} X! \put(22222,21604){\circle*{1}} X \put(22402,21547){\circle*{1}} X! \put(22583,21472){\circle*{1}} X! \put(22764,21381){\circle*{1}} X \put(22944,21274){\circle*{1}} X! \put(23125,21151){\circle*{1}} X! \put(23306,21012){\circle*{1}} X \put(23486,20858){\circle*{1}} X! \put(23667,20687){\circle*{1}} X! \put(23848,20502){\circle*{1}} X \put(23938,20402){\circle*{1}} X \put(24028,20302){\circle*{1}} X! \put(24119,20195){\circle*{1}} X! \put(24209,20087){\circle*{1}} X! \put(24300,19973){\circle*{1}} X! \put(24390,19858){\circle*{1}} X \put(24480,19737){\circle*{1}} X \put(24570,19615){\circle*{1}} X! \put(24661,19487){\circle*{1}} X! \put(24751,19359){\circle*{1}} X! \put(24842,19225){\circle*{1}} X! \put(24932,19090){\circle*{1}} X \put(25022,18949){\circle*{1}} X \put(25112,18807){\circle*{1}} X! \put(25203,18660){\circle*{1}} X! \put(25293,18513){\circle*{1}} X! \put(25384,18360){\circle*{1}} X! \put(25474,18207){\circle*{1}} X \put(25564,18048){\circle*{1}} X \put(25654,17889){\circle*{1}} X! \put(25745,17725){\circle*{1}} X! \put(25835,17560){\circle*{1}} X! \put(25926,17391){\circle*{1}} X! \put(26016,17221){\circle*{1}} X \put(26106,17047){\circle*{1}} X \put(26196,16873){\circle*{1}} X! \put(26287,16694){\circle*{1}} X! \put(26377,16515){\circle*{1}} X! \put(26468,16332){\circle*{1}} X! \put(26558,16148){\circle*{1}} X \put(26648,15961){\circle*{1}} X \put(26738,15773){\circle*{1}} X! \put(26829,15582){\circle*{1}} X! \put(26919,15391){\circle*{1}} X! \put(27010,15196){\circle*{1}} X! \put(27100,15001){\circle*{1}} X \put(27190,14803){\circle*{1}} X \put(27280,14605){\circle*{1}} X \put(27340,14471){\circle*{1}} X! \put(27401,14337){\circle*{1}} X! \put(27461,14203){\circle*{1}} X! \put(27521,14067){\circle*{1}} X! \put(27582,13932){\circle*{1}} X! \put(27642,13796){\circle*{1}} X! \put(27702,13659){\circle*{1}} X \put(27762,13522){\circle*{1}} X \put(27822,13385){\circle*{1}} X \put(27882,13247){\circle*{1}} X! \put(27943,13108){\circle*{1}} X! \put(28003,12970){\circle*{1}} X! \put(28003,12970){\circle*{1}} X! \put(28063,12830){\circle*{1}} X! \put(28124,12691){\circle*{1}} X! \put(28184,12551){\circle*{1}} X! \put(28244,12411){\circle*{1}} X \put(28304,12270){\circle*{1}} X \put(28364,12130){\circle*{1}} X \put(28364,12130){\circle*{1}} X \put(28424,11989){\circle*{1}} X! \put(28485,11847){\circle*{1}} X! \put(28545,11706){\circle*{1}} X! \put(28545,11706){\circle*{1}} X! \put(28605,11565){\circle*{1}} X! \put(28666,11423){\circle*{1}} X! \put(28726,11282){\circle*{1}} X! \put(28726,11282){\circle*{1}} X! \put(28786,11140){\circle*{1}} X! \put(28847,10998){\circle*{1}} X \end{picture} X \end{tabular} X X--- 203,393 ---- X \put(13369,8310){\circle*{1}} X \put(13369,8310){\circle*{1}} X \put(13429,8448){\circle*{1}} X! \put(13489,8587){\circle*{1}} X! \put(13549,8725){\circle*{1}} X! \put(13549,8725){\circle*{1}} X! \put(13609,8865){\circle*{1}} X \put(13670,9004){\circle*{1}} X \put(13730,9144){\circle*{1}} X+ \put(13730,9144){\circle*{1}} X \put(13790,9285){\circle*{1}} X \put(13851,9425){\circle*{1}} X \put(13911,9566){\circle*{1}} X \put(13911,9566){\circle*{1}} X \put(13971,9707){\circle*{1}} X! \put(14031,9848){\circle*{1}} X! \put(14091,9989){\circle*{1}} X! \put(14151,10131){\circle*{1}} X \put(14212,10272){\circle*{1}} X \put(14272,10414){\circle*{1}} X+ \put(14272,10414){\circle*{1}} X \put(14332,10556){\circle*{1}} X \put(14393,10697){\circle*{1}} X \put(14453,10839){\circle*{1}} X \put(14453,10839){\circle*{1}} X \put(14513,10981){\circle*{1}} X! \put(14573,11122){\circle*{1}} X! \put(14633,11264){\circle*{1}} X! \put(14693,11406){\circle*{1}} X \put(14754,11547){\circle*{1}} X \put(14814,11689){\circle*{1}} X+ \put(14814,11689){\circle*{1}} X \put(14874,11830){\circle*{1}} X! \put(14934,11971){\circle*{1}} X! \put(14994,12112){\circle*{1}} X! \put(15054,12253){\circle*{1}} X! \put(15115,12393){\circle*{1}} X! \put(15175,12534){\circle*{1}} X! \put(15175,12534){\circle*{1}} X! \put(15235,12674){\circle*{1}} X \put(15296,12813){\circle*{1}} X \put(15356,12953){\circle*{1}} X+ \put(15356,12953){\circle*{1}} X \put(15416,13091){\circle*{1}} X! \put(15476,13230){\circle*{1}} X! \put(15536,13368){\circle*{1}} X! \put(15536,13368){\circle*{1}} X! \put(15596,13505){\circle*{1}} X! \put(15657,13643){\circle*{1}} X! \put(15717,13780){\circle*{1}} X! \put(15717,13780){\circle*{1}} X! \put(15777,13916){\circle*{1}} X \put(15838,14051){\circle*{1}} X \put(15898,14187){\circle*{1}} X+ \put(15898,14187){\circle*{1}} X \put(15958,14321){\circle*{1}} X! \put(16018,14455){\circle*{1}} X! \put(16078,14589){\circle*{1}} X! \put(16169,14787){\circle*{1}} X! \put(16259,14985){\circle*{1}} X \put(16350,15180){\circle*{1}} X \put(16440,15375){\circle*{1}} X! \put(16530,15567){\circle*{1}} X! \put(16620,15758){\circle*{1}} X! \put(16711,15946){\circle*{1}} X! \put(16801,16133){\circle*{1}} X \put(16892,16317){\circle*{1}} X \put(16982,16500){\circle*{1}} X! \put(17072,16679){\circle*{1}} X! \put(17162,16858){\circle*{1}} X! \put(17253,17033){\circle*{1}} X! \put(17343,17208){\circle*{1}} X \put(17434,17378){\circle*{1}} X \put(17524,17547){\circle*{1}} X! \put(17614,17712){\circle*{1}} X! \put(17704,17876){\circle*{1}} X! \put(17795,18035){\circle*{1}} X! \put(17885,18194){\circle*{1}} X \put(17976,18348){\circle*{1}} X \put(18066,18501){\circle*{1}} X! \put(18156,18649){\circle*{1}} X! \put(18246,18796){\circle*{1}} X! \put(18337,18937){\circle*{1}} X! \put(18427,19078){\circle*{1}} X \put(18518,19213){\circle*{1}} X \put(18608,19348){\circle*{1}} X! \put(18698,19477){\circle*{1}} X! \put(18788,19605){\circle*{1}} X! \put(18879,19727){\circle*{1}} X! \put(18969,19849){\circle*{1}} X \put(19060,19964){\circle*{1}} X \put(19150,20078){\circle*{1}} X! \put(19240,20186){\circle*{1}} X! \put(19330,20294){\circle*{1}} X! \put(19421,20394){\circle*{1}} X! \put(19511,20494){\circle*{1}} X \put(19692,20680){\circle*{1}} X! \put(19872,20851){\circle*{1}} X! \put(20053,21006){\circle*{1}} X \put(20234,21146){\circle*{1}} X! \put(20414,21270){\circle*{1}} X! \put(20595,21377){\circle*{1}} X \put(20776,21469){\circle*{1}} X! \put(20956,21544){\circle*{1}} X! \put(21137,21602){\circle*{1}} X \put(21318,21644){\circle*{1}} X! \put(21498,21670){\circle*{1}} X! \put(21679,21678){\circle*{1}} X \put(21860,21670){\circle*{1}} X! \put(22040,21646){\circle*{1}} X! \put(22221,21604){\circle*{1}} X \put(22402,21547){\circle*{1}} X! \put(22582,21472){\circle*{1}} X! \put(22763,21381){\circle*{1}} X \put(22944,21274){\circle*{1}} X! \put(23124,21151){\circle*{1}} X! \put(23305,21012){\circle*{1}} X \put(23486,20858){\circle*{1}} X! \put(23666,20687){\circle*{1}} X! \put(23847,20502){\circle*{1}} X \put(23938,20402){\circle*{1}} X \put(24028,20302){\circle*{1}} X! \put(24118,20195){\circle*{1}} X! \put(24208,20087){\circle*{1}} X! \put(24299,19973){\circle*{1}} X! \put(24389,19858){\circle*{1}} X \put(24480,19737){\circle*{1}} X \put(24570,19615){\circle*{1}} X! \put(24660,19487){\circle*{1}} X! \put(24750,19359){\circle*{1}} X! \put(24841,19225){\circle*{1}} X! \put(24931,19090){\circle*{1}} X \put(25022,18949){\circle*{1}} X \put(25112,18807){\circle*{1}} X! \put(25202,18660){\circle*{1}} X! \put(25292,18513){\circle*{1}} X! \put(25383,18360){\circle*{1}} X! \put(25473,18207){\circle*{1}} X \put(25564,18048){\circle*{1}} X \put(25654,17889){\circle*{1}} X! \put(25744,17725){\circle*{1}} X! \put(25834,17560){\circle*{1}} X! \put(25925,17391){\circle*{1}} X! \put(26015,17221){\circle*{1}} X \put(26106,17047){\circle*{1}} X \put(26196,16873){\circle*{1}} X! \put(26286,16694){\circle*{1}} X! \put(26376,16515){\circle*{1}} X! \put(26467,16332){\circle*{1}} X! \put(26557,16148){\circle*{1}} X \put(26648,15961){\circle*{1}} X \put(26738,15773){\circle*{1}} X! \put(26828,15582){\circle*{1}} X! \put(26918,15391){\circle*{1}} X! \put(27009,15196){\circle*{1}} X! \put(27099,15001){\circle*{1}} X \put(27190,14803){\circle*{1}} X \put(27280,14605){\circle*{1}} X \put(27340,14471){\circle*{1}} X! \put(27400,14337){\circle*{1}} X! \put(27460,14203){\circle*{1}} X! \put(27520,14067){\circle*{1}} X! \put(27581,13932){\circle*{1}} X! \put(27641,13796){\circle*{1}} X! \put(27701,13659){\circle*{1}} X \put(27762,13522){\circle*{1}} X \put(27822,13385){\circle*{1}} X \put(27882,13247){\circle*{1}} X! \put(27942,13108){\circle*{1}} X! \put(28002,12970){\circle*{1}} X! \put(28002,12970){\circle*{1}} X! \put(28062,12830){\circle*{1}} X! \put(28123,12691){\circle*{1}} X! \put(28183,12551){\circle*{1}} X! \put(28243,12411){\circle*{1}} X \put(28304,12270){\circle*{1}} X \put(28364,12130){\circle*{1}} X \put(28364,12130){\circle*{1}} X \put(28424,11989){\circle*{1}} X! \put(28484,11847){\circle*{1}} X! \put(28544,11706){\circle*{1}} X! \put(28544,11706){\circle*{1}} X! \put(28604,11565){\circle*{1}} X! \put(28665,11423){\circle*{1}} X! \put(28725,11282){\circle*{1}} X! \put(28725,11282){\circle*{1}} X! \put(28785,11140){\circle*{1}} X! \put(28846,10998){\circle*{1}} X \end{picture} X \end{tabular} X SHAR_EOF fi # end of overwriting check # End of shell archive exit 0 Department of Computer Science, Duke University, Durham, NC 27706 ARPA: dfk@cs.duke.edu CSNET: dfk@duke UUCP: decvax!duke!dfk