v10i098: hpgl -- HPGL for X11, Part02/02

Andrew Gerber gerber at sushi.Solbourne.COM
Wed Dec 19 13:43:16 AEST 1990


Submitted-by: gerber at sushi.Solbourne.COM (Andrew Gerber)
Posting-number: Volume 10, Issue 98
Archive-name: xhpgl/part02


---- Cut Here and unpack ----
#!/bin/sh
# shar:	Shell Archiver  (v1.22)
#
#	Run the following text with /bin/sh to create:
#	  parse.c
#	  pc.xw
#	  shuttle.uuencoded
#	  xhpgl.1
#
if test -f parse.c; then echo "File parse.c exists"; else
echo "x - extracting parse.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > parse.c &&
X/*
X * parse.c -- This is a hand-coded HPGL parser, to see if I can get
X *            somewhat better performance than the YACC parser gives
X *            me.
X *
X * Author  : Dieter Muller
X * Ported to X11 & Line Type fixes: Andy Gerber            
X * Created : Wed Oct 31 21:13:38 1990
X */
X
X/* Header Files */
X
X#include <stdio.h>
X#include <math.h>
X#include <varargs.h>
X#include <sys/param.h>
X#include <X11/X.h>
X#include <X11/Xlib.h>
X#include <math.h>
X# include "y.tab.h"		/* as generated by the original grammar */
X
X/*   X windows variables. */
Xextern XColor pen[];
Xextern Window main_window;
Xextern Font text_font;
Xextern XFontStruct *font_info;
Xextern short font_offset;
Xextern GC gc;
Xextern Display *dpy;
Xextern int span_count;
Xextern initialize_plotter();
Xextern int dont_scale;      /* should we scale coordinates? Not done if zooming */
Xextern int minWidth,minHeight;  /* size of X window for plotting */
X/* Macro Definitions */
X
X/* Variable Definitions */
X
XYYSTYPE yylval;
Xdouble xScale = 1.0;
Xdouble yScale = 1.0;
Xstatic int pushed_token = -1;
X
X/* Function Declarations */
X
Xvoid unget_token ();
Xint next_token ();
Xvoid eat_to_semi ();
Xvoid ignored ();
Xvoid error ();
Xint yywrap ();
Xvoid draw_line ();
Xvoid draw_rectangle();
Xvoid draw_text ();
Xvoid scale_coord ();
Xint get_coord_pair ();
Xvoid coord_list ();
Xvoid yyparse ();
Xvoid line_type_change();
X
X/* pattern definitions for drawing dashed lines */
X/* default |________|  */
X/* line 0  |        |  */
X/* line 1  |_       |  */
X/* line 2  |____    |  */
X/* line 3  |______  |  */
X/* line 4  |______ _|  */
X/* line 5  |_____ __|  */
X/* line 6  |____ _ _|  */
X
Xstatic unsigned char line_types[][6] = {
X  {1, 15},
X  {1, 15},
X  {8, 8},
X  {12, 4},
X  {13, 1, 1, 1},
X  {12, 1, 2, 1},
X  {9, 1, 2, 1, 2, 1}
X};
X
Xstatic int line_type_elements[] = {2, 2, 2, 2, 4, 4, 6};
X
X
X/**********************************************************************
X *     yyparse () --- Read HPGL statements, drawing the results as we
X *                    go.
X */
X
Xvoid yyparse ()
X{
X    extern FILE    * yyin;
X    extern YYSTYPE   yylval;
X    extern char      yytext [];
X    extern int       absolute;
X    extern int       pen_down;
X    extern int       is_color;
X    extern int       cur_pen;
X    extern int       rectangle;
X
X    int token;
X    
X    while ((token = next_token ()) > 0)
X      {
X/* 	getc(stdin);
X	printf("%s", yytext);
X*/
X	switch (token)
X	{
X	  case LT:
X	    line_type_change();
X	    break;
X	  case LB:
X	    draw_text (yylval.sb);
X	    break;
X	  case PA:
X	    absolute = 1;
X	    coord_list ();
X	    break;
X	  case PR:
X	    absolute = 0;
X	    coord_list ();
X	    break;
X	  case PU:
X	    pen_down = 0;
X	    coord_list ();
X	    break;
X	  case PD:
X	    pen_down = 1;
X	    coord_list ();
X	    break;
X	  case EA:
X	    /* draw a rectangle */
X	    rectangle = 1;
X	    coord_list();
X	    rectangle = 0;
X	    break;
X	  case RA:
X	    /* This is a filled rectangle, not supported */
X	    rectangle = 1;
X	    coord_list();
X	    rectangle = 0;
X	    break;
X	  case SP:
X	    if (is_color)
X	      {
X		cur_pen = pen[yylval.i].pixel; 
X		XSetForeground(dpy, gc, cur_pen); 
X	      }
X	    break;
X	  case SC:
X		scale_coord ();
X	    break;
X	  case RESET:
X	    initialize_plotter ();
X	    break;
X	  case SEMICOLON:
X	    break;
X	  case EAT_TO_SEMI:
X	    eat_to_semi();
X	    break;
X	  default:
X	    error ("Unexpected token %d, symbol `%s'\n", token, yytext);
X	    /*NOTREACHED*/
X	}
X    }
X
X    return;
X}    /* end of yyparse () */
X
X/**********************************************************************
X *     line_type_change() --- change line type
X *
X *
X * Handle getting a LT changes, sees if line type was specified
X */
X
Xvoid line_type_change()
X{
X  int token;
X  int new_lt;
X  int result;
X  XGCValues gc_vals;
X  new_lt = -1;
X  result = 0;
X  token = next_token ();
X  if (token == DIGIT)
X    {
X      new_lt = yylval.i;
X      token = next_token (token);
X      
X      if (token != SEMICOLON)
X	{
X	  error ("Unexpected token %d, symbol `%s'\n", token, yytext);
X	  eat_to_semi();
X	}	
X      result = 1;
X    }
X  else if (token == SEMICOLON)
X    {
X      new_lt = -99;
X      result = 1;
X    }
X
X  if (new_lt == -99)
X    {
X      gc_vals.line_style = LineSolid;
X      XChangeGC(dpy, gc, GCLineStyle, &gc_vals);
X    }
X  else if (new_lt >= 0 && new_lt <= 6)
X    {
X      gc_vals.line_style = LineOnOffDash;
X      XChangeGC(dpy, gc, GCLineStyle, &gc_vals);
X      XSetDashes(dpy, gc, 0, line_types[new_lt], line_type_elements[new_lt]);
X    }
X
X  if (!result)
X    {
X	unget_token (token);
X	eat_to_semi ();
X    }
X      
X}
X
X/**********************************************************************
X *     coord_list () --- Handle parsing an optional list of
X *                       coordinates.
X *
X * A list of coordinates looks like INT, INT [, INT, INT].  Basically,
X * coordinate pairs separated by commas.
X */
X
Xvoid coord_list ()
X{
X    int token;
X
X    while (get_coord_pair ())
X    {
X	token = next_token ();
X	if (token != COMMA)
X	{
X	    unget_token (token);
X	    break;
X	}
X    }
X
X    return;
X}    /* end of coord_list () */
X
X/**********************************************************************
X *     get_coord_pair () --- Reads a pair of coordinates of the form
X *                           INTEGER COMMA INTEGER
X * 
X * Returns:
X * 
X *     SUCCESS           --- True, if we got a valid pair
X *     FAILURE           --- False, if something's wrong.  We also eat
X *                           through to the next semi-colon, if any.
X */
X
Xint get_coord_pair ()
X{
X    extern int last_x;
X    extern int last_y;
X    extern int x;
X    extern int y;
X    extern YYSTYPE yylval;
X    extern int absolute;
X    extern int pen_down;
X    extern double xMin;
X    extern double xMax;
X    extern double yMin;
X    extern double yMax;
X    extern double xScale;
X    extern double yScale;
X    extern int minWidth;
X    extern int minHeight;
X    extern int rectangle;
X
X    int token;
X    int result;
X    double scratch_x;
X    double scratch_y;
X    
X    result = 0;
X    token = next_token ();
X    if (token == DIGIT || token == NUMBER)
X    {
X	if (token == DIGIT) scratch_x = yylval.i;
X	else scratch_x = yylval.f;
X
X	token = next_token (token);
X	if (token == COMMA)
X	{
X	    token = next_token ();
X	    if (token == DIGIT || token == NUMBER)
X	    {
X	      if (token == DIGIT) scratch_y = yylval.i;
X	      else scratch_y = yylval.f;
X
X	      last_x = x;
X	      last_y = y;
X
X		if (absolute)
X		{
X		  x = (scratch_x - xMin) * xScale;
X		  y = (scratch_y - yMin) * yScale;
X		}
X		else
X		{
X		  x = x + (scratch_x - xMin) * xScale;
X		  y = minHeight - y  + (scratch_y - yMin) * yScale;
X		}
X
X 		y = minHeight - y; 
X
X		if (pen_down && !rectangle)
X		  draw_line ();
X		else if (rectangle)
X		  draw_rectangle();
X		
X		result = 1;
X	    }
X	}
X    }
X
X    if (!result)
X    {
X	unget_token (token);
X	eat_to_semi ();
X    }
X
X    return (result);
X}    /* end of get_coord_pair () */
X
X/**********************************************************************
X *     scale_coord () --- set up new user coordinate boundaries
X *
X * We need two pairs of comma-separated coordinates, a total of four
X * INTEGERs and three COMMAs.
X */
X
Xvoid scale_coord ()
X{
X    extern double xMin;
X    extern double xMax;
X    extern double yMin;
X    extern double yMax;
X    extern double xScale;
X    extern double yScale;
X    extern int minWidth;
X    extern int minHeight;
X
X    double scratch [4];
X    int count;
X    int token;
X    int done;
X    int result;
X
X    result = 0;
X    done = 0;
X    count = 0;
X    while (!done)
X    {
X	token = next_token ();
X	if (token == DIGIT || token == NUMBER)
X	{
X	    if (token == DIGIT) scratch [count++] = yylval.i;
X	    else scratch [count++] = yylval.f;
X
X	    if (count < 4)
X	    {
X		token = next_token ();
X		if (token != COMMA) /* die with !result */
X		    done = 1;
X	    }
X	    else
X	    {
X	     if (!dont_scale)
X	       {
X		 xMin = scratch [0];
X		 xMax = scratch [1];
X		 yMin = scratch [2];
X		 yMax = scratch [3];
X
X		 xScale = minWidth / (xMax - xMin);
X		 yScale = minHeight / (yMax - yMin);
X
X		 /* Make sure x is in proportion to y */
X
X 		 if (yScale < xScale)
X		   {
X		     xMax = xMin + minWidth/yScale;
X		     xScale = minWidth / (xMax - xMin);
X		     yScale = minHeight / (yMax - yMin);
X		   }
X		 else
X		   {
X		     yMax = yMin + minHeight/xScale;
X		     xScale = minWidth / (xMax - xMin);
X		     yScale = minHeight / (yMax - yMin);
X		   }
X	       }
X
X	      result = 1;
X	      done = 1;
X	    }
X	}
X    }
X
X    if (!result)
X    {
X	unget_token (token);
X	eat_to_semi ();
X    }
X
X    return;
X}    /* end of scale_coord () */
X
X/**********************************************************************
X *     draw_text () --- Display some text at the current point
X * 
X * Arguments:
X * 
X *     text         -i- What to draw.
X */
X
Xvoid draw_text (txt)
Xchar * txt;
X{
X    extern int x;
X    extern int y;
X    XTextItem text;
X
X    text.nchars = strlen(txt);
X    text.delta = 0;
X    text.font = text_font;
X    text.chars = txt;
X
X    XDrawText(dpy, main_window, gc, x,y-font_offset, &text, 1);
X    x += XTextWidth(font_info, txt, text.nchars);
X    return;
X}    /* end of draw_text () */
X
X/**********************************************************************
X *     draw_line () --- Draw a vector between the last coordinate pair
X *                      and the current one
X */
X
Xvoid draw_line ()
X{
X    extern int last_x;
X    extern int last_y;
X    extern int x;
X    extern int y;
X
X/*     printf("Draw line %d %d %d %d\n", last_x, last_y, x, y); */
X    XDrawLine(dpy, main_window, gc, last_x, last_y, x, y);
X    ++span_count;
X    return;
X}    /* end of draw_line () */
X
X/**********************************************************************
X *     draw_line () --- Draw a rectangle between the last coordinate pair
X *                      and the current one
X */
X
Xvoid draw_rectangle()
X{
X    extern int last_x;
X    extern int last_y;
X    extern int x;
X    extern int y;
X
X    XDrawLine(dpy, main_window, gc, last_x, last_y, last_x, y);
X    XDrawLine(dpy, main_window, gc, last_x, last_y, x, last_y);
X    XDrawLine(dpy, main_window, gc, last_x, y, x, y);
X    XDrawLine(dpy, main_window, gc, x, last_y, x, y);
X
X    span_count = span_count + 4;
X    return;
X}    /* end of draw_line () */
X
X/**********************************************************************
X *     yywrap () --- Pacify yylex()
X * 
X * Returns:
X * 
X *     SUCCESS   --- Always true, to indicate EOF
X */
X
Xint yywrap ()
X{
X    return (1);
X}    /* end of yywrap () */
X
X/**********************************************************************
X *     error () --- Handles reporting syntax errors in a reasonably
X *                  nice way.
X * Arguments:
X *
X *     va_alist  --- A printf-like set of arguments.
X */
X
Xvoid error (va_alist)
Xva_dcl
X{
X    va_list args;
X    char  * fmt;
X    char    err_buf [MAXPATHLEN * 2];
X    
X    va_start (args);
X
X    fmt = va_arg (args, char *);
X    strcpy (err_buf, "\nSyntax error: ");
X    (void) vsprintf (err_buf + strlen (err_buf), fmt, args);
X
X    va_end (args);
X
X    fflush (stdout);
X    fputs (err_buf, stderr);
X
X    return;
X}    /* end of error () */
X
X/**********************************************************************
X *     ignored () --- Handles reporting that we're ignoring something
X *                    nicely.
X *
X * Arguments:
X *
X *     va_alist  --- A printf-like set of arguments.
X */
X
Xvoid ignored (va_alist)
Xva_dcl
X{
X    va_list args;
X    char  * fmt;
X    char    err_buf [MAXPATHLEN * 2];
X    
X    va_start (args);
X
X    fmt = va_arg (args, char *);
X    strcpy (err_buf, "\nUnsupported command ignored: ");
X    (void) vsprintf (err_buf + strlen (err_buf), fmt, args);
X    va_end (args);
X
X    fflush (stdout);
X    fputs (err_buf, stderr);
X
X    return;
X}    /* end of ignored () */
X
X/**********************************************************************
X *     eat_to_semi () --- Throw away input until we hit EOF or a
X *                        semi-colon
X */
X
Xvoid eat_to_semi ()
X{
X    int token;
X
X    while (1)
X    {
X	token = next_token ();
X	if (   token < 0
X	    || token == SEMICOLON)
X	{
X	    break;
X	}
X    }
X
X    return;
X}    /* end of eat_to_semi () */
X
X/**********************************************************************
X *     next_token () --- Returns the next token
X */
X
Xint next_token ()
X{
X    extern pushed_token;
X
X    int token;
X    
X    if (pushed_token != -1)
X    {
X	token = pushed_token;
X	pushed_token = -1;
X    }
X    else
X    {
X	token = yylex ();
X    }
X
X    return (token);
X}    /* end of next_token () */
X
X/**********************************************************************
X *     unget_token () --- Push a token back for later examination
X * 
X * Arguments:
X * 
X *     token          -i- The token to push back.
X */
X
Xvoid unget_token (token)
Xint token;
X{
X    extern int pushed_token;
X
X    if (pushed_token != -1)
X    {
X	error ("Two pushes in a row");
X	exit (1);
X    }
X
X    pushed_token = token;
X
X    return;
X}    /* end of unget_token () */
X
X
X
X
X
X
X
X
SHAR_EOF
chmod 0644 parse.c || echo "restore of parse.c fails"
set `wc -c parse.c`;Sum=$1
if test "$Sum" != "12859"
then echo original size 12859, current size $Sum;fi
fi
if test -f pc.xw; then echo "File pc.xw exists"; else
echo "x - extracting pc.xw (Text)"
sed 's/^X//' << 'SHAR_EOF' > pc.xw &&
X.(.@;0:.I40;;17:.N;19:DF;SC0,1999,0,1439;.(
XSR0.733333,1.354167;DI1,0;PU;SP7;SL0;LT;.).(
XPU;SP1;PU;PA820,604;PD;PA1112,604;
XPD;PA1108,650;
XPD;PA1098,694;
XPD;PA1080,737;
XPD;PA1056,776;
XPD;PA820,604;
XPU;SP2;PD;PA1056,776;
XPD;PA1026,810;
XPD;PA992,840;
XPD;PA953,864;
XPD;PA910,882;
XPD;PA866,892;
XPD;PA820,896;
XPD;PA774,892;
XPD;PA730,882;
XPD;PA820,604;
XPU;PA731,877;PD;PA738,884;
XPU;PA736,862;PD;PA765,891;
XPU;PA741,847;PD;PA788,894;
XPU;PA746,832;PD;PA810,896;
XPU;PA751,817;PD;PA830,896;
XPU;PA756,802;PD;PA849,895;
XPU;PA761,787;PD;PA866,892;
XPU;PA766,772;PD;PA883,889;
XPU;PA771,757;PD;PA899,885;
XPU;PA775,741;PD;PA914,880;
XPU;PA780,726;PD;PA929,875;
XPU;PA785,711;PD;PA943,869;
XPU;PA790,696;PD;PA956,862;
XPU;PA795,681;PD;PA969,855;
XPU;PA800,666;PD;PA981,847;
XPU;PA805,651;PD;PA993,839;
XPU;PA810,636;PD;PA1004,830;
XPU;PA815,621;PD;PA1015,821;
XPU;PA820,606;PD;PA1025,811;
XPU;PA886,652;PD;PA1035,801;
XPU;PA960,706;PD;PA1045,791;
XPU;PA1034,760;PD;PA1053,779;
XPU;SP3;PU;PA820,604;PD;PA730,882;
XPD;PA687,864;
XPD;PA648,840;
XPD;PA614,810;
XPD;PA584,776;
XPD;PA560,737;
XPD;PA542,694;
XPD;PA532,650;
XPD;PA528,604;
XPD;PA532,558;
XPD;PA542,514;
XPD;PA560,471;
XPD;PA584,432;
XPD;PA820,604;
XPU;PA577,442;PD;PA586,433;
XPU;PA553,486;PD;PA597,442;
XPU;PA541,518;PD;PA609,450;
XPU;PA534,545;PD;PA620,459;
XPU;PA530,569;PD;PA632,467;
XPU;PA528,591;PD;PA644,475;
XPU;PA528,611;PD;PA655,484;
XPU;PA529,630;PD;PA667,492;
XPU;PA531,648;PD;PA678,501;
XPU;PA534,665;PD;PA690,509;
XPU;PA538,681;PD;PA701,518;
XPU;PA543,696;PD;PA713,526;
XPU;PA548,711;PD;PA725,534;
XPU;PA554,725;PD;PA736,543;
XPU;PA561,738;PD;PA748,551;
XPU;PA568,751;PD;PA759,560;
XPU;PA575,764;PD;PA771,568;
XPU;PA584,775;PD;PA782,577;
XPU;PA592,787;PD;PA794,585;
XPU;PA601,798;PD;PA806,593;
XPU;PA611,808;PD;PA817,602;
XPU;PA621,818;PD;PA813,626;
XPU;PA632,827;PD;PA803,656;
XPU;PA643,836;PD;PA794,685;
XPU;PA654,845;PD;PA784,715;
XPU;PA667,852;PD;PA775,744;
XPU;PA679,860;PD;PA765,774;
XPU;PA692,867;PD;PA755,804;
XPU;PA706,873;PD;PA746,833;
XPU;PA720,879;PD;PA736,863;
XPU;SP4;PU;PA820,604;PD;PA584,432;
XPD;PA614,398;
XPD;PA648,368;
XPD;PA687,344;
XPD;PA730,326;
XPD;PA774,316;
XPD;PA820,312;
XPD;PA866,316;
XPD;PA910,326;
XPD;PA953,344;
XPD;PA992,368;
XPD;PA1026,398;
XPD;PA1056,432;
XPD;PA1080,471;
XPD;PA1098,514;
XPD;PA1108,558;
XPD;PA1112,604;
XPD;PA820,604;
XPU;PA600,444;PD;PA600,412;
XPU;PA620,458;PD;PA620,391;
XPU;PA640,473;PD;PA640,374;
XPU;PA660,487;PD;PA660,360;
XPU;PA680,502;PD;PA680,348;
XPU;PA700,517;PD;PA700,338;
XPU;PA720,531;PD;PA720,330;
XPU;PA740,546;PD;PA740,323;
XPU;PA760,560;PD;PA760,318;
XPU;PA780,575;PD;PA780,315;
XPU;PA800,589;PD;PA800,313;
XPU;PA820,604;PD;PA820,312;
XPU;PA840,604;PD;PA840,313;
XPU;PA860,604;PD;PA860,315;
XPU;PA880,604;PD;PA880,318;
XPU;PA900,604;PD;PA900,323;
XPU;PA920,604;PD;PA920,330;
XPU;PA940,604;PD;PA940,338;
XPU;PA960,604;PD;PA960,348;
XPU;PA980,604;PD;PA980,360;
XPU;PA1000,604;PD;PA1000,374;
XPU;PA1020,604;PD;PA1020,391;
XPU;PA1040,604;PD;PA1040,412;
XPU;PA1060,604;PD;PA1060,438;
XPU;PA1080,604;PD;PA1080,471;
XPU;PA1100,604;PD;PA1100,521;
XPU;SP7;PU;PA644,1311;
XPU;LBDATA FROM @PIEME
XPU;PA748,1233;
XPU;LBPIE 1
XPU;SP1;PU;PA1706,740;PD;PA1823,740;
XPD;PA1823,778;
XPD;PA1706,778;
XPD;PA1706,740;
XPU;SP7;PU;PA1846,747;
XPU;LBSLICE 1
XPU;SP2;PU;PA1706,662;PD;PA1823,662;
XPD;PA1823,700;
XPD;PA1706,700;
XPD;PA1706,662;
XPU;PA1706,685;PD;PA1721,700;
XPU;PA1706,665;PD;PA1741,700;
XPU;PA1723,662;PD;PA1761,700;
XPU;PA1743,662;PD;PA1781,700;
XPU;PA1763,662;PD;PA1801,700;
XPU;PA1783,662;PD;PA1821,700;
XPU;PA1803,662;PD;PA1823,682;
XPU;PA1823,662;PD;PA1823,662;
XPU;SP7;PU;PA1846,669;
XPU;LBSLICE 2
XPU;SP3;PU;PA1706,584;PD;PA1823,584;
XPD;PA1823,622;
XPD;PA1706,622;
XPD;PA1706,584;
XPU;PA1706,593;PD;PA1715,584;
XPU;PA1706,613;PD;PA1735,584;
XPU;PA1717,622;PD;PA1755,584;
XPU;PA1737,622;PD;PA1775,584;
XPU;PA1757,622;PD;PA1795,584;
XPU;PA1777,622;PD;PA1815,584;
XPU;PA1797,622;PD;PA1823,597;
XPU;PA1817,622;PD;PA1823,616;
XPU;SP7;PU;PA1846,591;
XPU;LBSLICE 3
XPU;SP4;PU;PA1706,506;PD;PA1823,506;
XPD;PA1823,544;
XPD;PA1706,544;
XPD;PA1706,506;
XPU;PA1720,506;PD;PA1720,544;
XPU;PA1740,506;PD;PA1740,544;
XPU;PA1760,506;PD;PA1760,544;
XPU;PA1780,506;PD;PA1780,544;
XPU;PA1800,506;PD;PA1800,544;
XPU;PA1820,506;PD;PA1820,544;
XPU;SP7;PU;PA1846,513;
XPU;LBSLICE 4
XPU;PA0,1389;
XPU;LBPC                                                                 11-JUL-89 12:06 Page 1 
XPU;SP0;.).(PU;PA0,1439;DF;SP0;.)
SHAR_EOF
chmod 0644 pc.xw || echo "restore of pc.xw fails"
set `wc -c pc.xw`;Sum=$1
if test "$Sum" != "4280"
then echo original size 4280, current size $Sum;fi
fi
if test -f shuttle.uuencoded; then echo "File shuttle.uuencoded exists"; else
echo "x - extracting shuttle.uuencoded (Text)"
sed 's/^X//' << 'SHAR_EOF' > shuttle.uuencoded &&
Xbegin 666 shuttle.Z
XM'YV04X: @,$"1 P8" D.+'@PX0X%4Z#(> BE"L4 at -6;8J,&"1HX:-B at 2N5A#
XM1 at V.-'#8F*@ "L88,W!TM#%CALB+'G/(8%$CADZ*%EL&\7B#8$D8.&X*K0%#
XMQ at R>)F$ )8E09LD:25N.%.H1QM.>-VC at Q'$C!T^8-<;>B,$31EFJ,,S2.!EC
XM*M>/;.?&$*MU; P;;6W4Y8IC!MN>,OBZ3)G#J$^I=W&8+6DCQU@<5F7$2$M8
XMQLZ>6''>V!C8)N$<@&FDA%R1JN297I4NSD'CQMG:.&E/CC$Z=U&H2.VZ[!GC
XM\PS<?9<6MYTQIO @-W#XY%GSAFSH.-Q2WWOQ1MG),B0_CSZ]N?7D+J/7I%[#
XMLM#H/:E'[T[V\(R/]'-\I1&W>P[>/-'@DW\T?%9 at 2.^A9E6![J67 VT!AG=1
XM=N45J%@0V:D6X%\3PF##@C!PYE)VKV7TGW!;C7C09#/<8)J*)K'W(H8PL6C8
XMA'NQZ!:.($&% TLJVF"420BJV!Y4,[!&XTG B4AC;6=EAZ-&9X&$HV=GS>"D
XM=##0<-9F'>+@)5,Y9#6BAY\AM:575KEU(85?>7A>:^A!5R9S'EY8EF"!*184
XM%"G:2253'_H7PV%N%8D=66V1]5QX3.YY77A-L> =D'\&*D-89MU0$HH7R5"9
XMERX6F6FH-,ET0V*A8L766G,&85)BEL(4*@TV +;6C(G%5:N9LFKYU*JQ>I:#
XM;6$IZ5F!EM90; RO>?=LBRQD!Z2L2-E6F+)=$J02II-Z!9A*BOKT8[7'7N23
XMJ"SHY"2T'[;+%*A"0>OKL8.YQ)M'[8I7[X>V-33C7S$>9&N](#UE<(-!;(80
XM"P=IIBX-U$;,VI\-']CN?'7N%5:_P&[F5+NTJ>LL6P^6NQ)!#XIXZK^5D:PD
XM;P"6>?%UO-G@)6JQ0GN0O#=WC$,-.R>IKF2V-68JSOK)1!;#/HU6K4>APE!<
XMM6 *)4.7''G'\-:>6BH at O2YI9K6E"(5:'$<;/3L7"X)=JQF?("FJV<<]?0WM
XM3K7EB[%G,_ MW:3\C=EBJ[0ZR^O0G89(4IDR.87:<T)NS<*FA5TW%\405P;L
XM?=K!1'5+&,?D(L0UY1OH7$)V7N9%0JYZ>5BQKJ3EY6*^B/%*1./>7YV">3B[
XMA%Q]2!#-L<Z%5.<4A\JXI>F2'JI3 at JM>=>NJO5N8;=D?S6SW]5K;T5SJCL;W
XMO/6N>G[('SY5V\PZIS:TNL&W=>%FWD%5+M$<G73M9@#"RLP\PA;!Y"MC\=+9
XM_50C$^.1+6.!JU7/"D003[U+0*_"3[WX,RXM34P[A3G at 7FAU+#-A;"]_:9?5
XM<(8KP#3F?ST9UX-,EBMT_4\P',&,"'/U%'*5[V=B"ID%JR6J\CVH6BL,'W\L
XMM:JCE45L,_M/UQQ7+]HTT 8].Y995E(LA  &*T[:F at PFPY^J\<LC%]I:#54S
XMI[]9#27DZ]B#W/>3*F)1/NK2SV2D5$7MK,R).]D(U KCI5$9D52;*E])FE6N
XMHB K<S!C2W94!A,B[D]G4X/A7JI%M(G1I%HKF=BA0-G&QV'F<O<I4J"R4ZF:
XMI$TH0QLC"X[S(W4="BNSI,W_'.8E 8G)EH))37CNMY>A=>0X2ZL7+SL"+<4$
XMZE :Z>6F!G:0UPA(-;;<C$SN4Z#G' HI<MF+,R>4),"T*#2P+(E9: DN6.IL
XM)UIJRG5BN<[HF)"<PCNGF0+EHNC,DC\,&PV5#'.?\?S(G)ZQWGN$Y*7CE$QZ
XM[RD+6[2DLWDB!)Y)"MJ($M/0F+QHE5YIZ$:2F9X6;1. at UUG)1V:W$=C9ZW*5
XM\9M+<;FI at Z2T)CLQ"?KHY!*: &A3O0%>3F!J$LIAD2";DJ=0WP8I/\$.*[89
XMH]& )R:V8$ZF[VF*6<)3*."Y:)M-<1GL)-/00^VS.\:ZW$=TUQT+S;)+JNP.
XM4N!I+,IM;:MD$5&@*H=4]3P'JG at -7$JU.3N;0G0XJB%(2 at 1;IY(DZ2QA(8E&
XMP*.2ORZ'.LZI4TX^LZ[G>*1$HFI0H$#3OQ:1%"->84YB at +2Z,H&G,G_5:4>^
XM=9V,8*DV.]T=TGCBK+-F]3B\[>9[-M4_'*)5>,X*Y7N>QD1/&919WL'B=4:3
XMD6;AJJUEJI60QGHLWG*,IT&H#+M \JDZK:I2)SG18:%CM3$1S;?I*0JIB'9:
XMZ at Z+OM/-SGV1 U[OK,=%8S-O;RVE);&^ARE=X\V<^'E4[6H4.@:$V['B^AX&
XM2=BYZRT5V[(CVN[0%V[1'4]* @G5Z8XQD$*ZYW KJ;/@F%= ;(N)4]]S'-L(
XM9G[F'2'< #<>MSQ%2 4U[S#AYI ,+XLGTODH[%*&Y""#ERSGBHG$ZB09X!:X
XMG2[128PTTJ7K*&V;*F&K4/2SEEQ2$5 7T<U3--*3YQR+6I,=YYACETL/KA=R
XM!+E/4-%<+X1$L$7"!>]!#&/.LNA5759[(G^R)FBXRB5$A^ZSLS at BXP=7$T(Q
XMF5S'D (M9GK(F\7YF8!FV#&8G Z at 08O(FVIB%FO)>435L=2/2 at G+XWBK*:_&
XMD&&<UA1 at 10>ZU#7HN:05Z?2015?1P3*&XE+!%\[S(%V3S&FETR/!%.79LKOQ
XM :7SFAL#ZT?+$XQZ-[HIN$&+83]ZVXUG=- "[FM"Q#6W8.!].AQ^F]#F_F6M
XM^;0R18DIW)[9TES8UJL),:60LS)X[U8R;W=V:<<M=>?"1>5O^4+\39Y".#I'
XMI-\=IV1"L=SQ<4!^Q)7P9D*-*>#=#,ZH]CSTR>_=<7OFZ90?A^C;/BGD06@]
XMHI3O^.14I at W!8[->LMI8(PKM>8QHTN:BT^;H#>=SSW]#DZ[V7#]P:]$!4W[T
XM:X^Y6UF/>)8]]&,MQ:HQA<GZ=<<<L:S?B.W3\>F%_A-!E1HX/7]IX(FGZ[&L
XMOQ+O[*))E]\S:+\[J2C2\?N,BM(ZE<9*O at 19"6;DJID=[QEC1:E[>#HLE%$!
XM9B6LZGR8S6VESB>;R)4U_<.%5!S829XG^G'21GH$1D7-_HM#DWU[C$*6"^5J
XMO)AA6*X^N?MK'?4P_SD@%N\#>Z#S=*_>L<I_A"\=YOP'6!^B/=VY.Z;&^%X_
XMGZGRDN,%55]?%,DSS[#5I*]IJ8>W3)^WFO(_$LBFS"BF-O:*DCZ4>"#[7DQL
XM$U)C]3- MG_>$8"> 3MA44!68X"^XG*RAT72YQVNQQ2P=Q*NESCZ\6"S]Q5#
XM0V$]11E(-D9/A5[?\4 ZDQT\,1JU at RN?X2+WQT8\X3FP0S'%%77A52#,83LU
XM.#(G at 6,]52"?030MF#A, at 7T48Q3O0SEN!1+0DE)S,1DT(7P>\46S]U2W4S?8
XM-VDSN&?AA4,SR$<]-5)=*'R5886197J#DBNRYQUCLA'&)QV'01,SUE/9T3_1
XML6 *2!K.HD$]M2IC<H*=]R%CPDJNIR%]:'L,M8+^$H)\Z#5/56[)Y7M=L8)K
XM%X2TMRIW%UYWR(AZ*'J<XRQ>R'^',1KS%T!A87QXL8)3UE_K!WOMQT]=,ADE
XMU&-0DF))QUX$"$Y+EFUQ\7W )21^R(G=)8SW]SPI5CL_4G_?%5YY2&1BYXR+
XMQ%#"MQ9;I'^4,S0_MA=*)GII9V]+ED+!)'RZ86ZC6";;^!99!2#69G[Q86V+
XMAQ0Z5U&$MQFDAU5X=S6VDXN(%WE.H2CRI7<:(5?L6'-+IA([EDB=]Q$$YWSO
XM5VXK<W^-$7GP,E9A$TSUU27Y-SCFA10V!UL9=BB!Y!3\R(T)*6: %WGQ-%U>
XM,9*-B'F<AEF<UU-6))/9."C1E%(N8A0:H6)VB)/TZ'X?@B5$4T09%A-*.) O
XM5GE$TSP5MA(!<HG0<7!1J2?\$R!.-I7&1#13E1XK,28"\GB_%R!_!V'9E1'J
XM&%\1E!$8&%'$%SB^5A:?,4:^5GWZ<WB% 1Y=B1VXE#>+1Q9?L1EX*29?@I?_
XMT19I:&P0PA0UD1]T-&Z8EQW<@R_3)2UM4501]39,X87>\8#% 9"YLALNTAU<
XM!!5/>&#G<A4!E1%C0I=M19C-L7 at 48QS1V$_,<1\H"6'\XBQ;,UUGR(J/%Q:!
XMN)=>\X(DN%S,QYM_B9 GHR?@MX)E6192 Q*U!$M6(X7;99U'DC!K<I9"XF\P
XM\16*@R-\F!$^N4HYQUMEN8Q*F)T;Q2Q$XY 'Q9.C"4N;8C@*N5&P22GP!EJ-
XM:9^'V1- B"'A816F]AR%<4<_"(*Z-EZ"AZ#1MX*Q:'"5$CL- at C&2 at 74KDVL9
XM^F-;4X=!H#0C649U(J(>]V!TIW(46*(PH:(\%Z(M2F08YGXI*J.;.'U;)))>
XMYA,YVGIW)BH-]!>?F&5 *F\O2AXJ"E_046/YMHFK4G)=PEJD>2X&I&S4)7W2
XM)62:"9CCD5"LJ*0 9A2I2#FKJ)PI)8<S.'*#>#HGT8P;@5Z.A8*J,1D]$8,I
XM$2#U"5[Q\T5H H6=1B@@NJ>!(:5+88/'A$WKQ3_N8QBLL5<I,9DOEX,U1"C*
XMEH*0FFL;L1XIT4E+ at 6#,1&K@!1);]B!#^H4QT1%K4:E',1/YN5<\U!'JU&/"
XMPSH,&CN4AG:40QP=<7U\)VH<-AY),IE1YZA7TQ-)I*=,,9>',EVVA9CX"!UA
XM(1.KT8W#02ZSE#=_)1T-Y2RY)E#R\VD1U2.K at 67\9$^H.CI/AC^FJ:0_4B('
XMZG3:@5NYJ!N($D?@]1%>83^$FF7B-%L9X6:'(A=#4ZJW5$FJP6 at G%!>6HQIV
XMYG[5%$$ZF)LKHJGA0; *JU at VZ$T>HA/CXW4.ZQ7,1T&G%3&:^A at X<YTHD20#
XM8S5062!*V6CRV!&:0:T-XT6*]1<7BFB'TDLY<[(Q6R '<Z\,R4P<2:-DP3T:
XM0:YIIA+A5+084R:=YDOS^FLR.VXA2K6CEK-S5K*-X64FUQ'9XF8 at H5ANT:AI
XMQI7,9)19)H+\X;%/JR6]5+9>IK(RNU,A6J0"LB-WQJ.>5JK7AQ)"FF9_ at 1*\
XM>&=(0;;ZX65- 4^HL8E&ETO_&G2C6K08\A]Y1AO3]HQZ-I,8XBEY(3(34A03
XMI44(FBNV<1_1XW[?0K8T\4 J<39ZEIM#4TFH2[-B$B^FX[@ -4LJP:ZHFTO<
XM473JQ+N.0F5UFDN)6W09PDS*I;J%(:V:L6V R;S*)AFT(B#-NTKH>$R_,W:B
XM)DYN=KA at F[PT"FVYE)9/&Q>IP:@[ZBL40[XP>J>SZ9,P>D<%(H:!HF7<4QO7
XMHA/&1#&&=:\<=$P)6*):5[<@2ANS&CC[&J)SP3W_*+8/=[\TNU9RX4MG2QHN
XMF\ TX3XF6Z( XVFGA1J?E%CSFBO2:JP/A"]P=*Q/.QJIL6A>QF&PP3!ELD@,
XM2[\-,3*JT;HE^B"*Q68:VR5Y(<2;9G_CX\.-]DW')';/]$;GTY;/I[.*)L/K
XM%3&*UI,GFQA(2SR-AF_SN\59;'4)VY,$K*0',7"PZF+ZTB540C&7F+ EP3?(
XM=+(I ;V0B6AS?*@,"FT?$[$:FV)5FXL'41GNTS>(-BIG++:<,Z<5S)@SL7$.
XM?)AL=*/\ 4?.,K?L,A=9"7X8.Z-O6VZ<S+D9FAJ5 at W+QZKD(VAC<DQ%FRW::
XMNA:*\A\:["PHNBXSF+KYBR9(EJ<A&FM\Y69.T7U.C'*T$DRQ0A8C8SO?EEX0
XM]V"]1W#II[K)*J-:NU'K(20;QT]B\H)..R%Y&X8,"H!6&&!/IC.3X2FDW!Y6
XM(1TCS+=]R+DXBGX)+%5(5LQC-LRP)W9/JQEZMV?Y&Z,JY6^ZM&.#]V0Z44A:
XMDHN8(3Q?>:2$!#?@XWXN4G(U45^; S=,\<K&MG"V/!Y0!3<Z4VS0484B?9S]
XM]6%8!-"DN71R"=(7Z4/FY7T2=IK]I1^Z at D*^V3JIFINCT7\/TL"F:&-W,AX6
XMIXE"_1'(4J#CH45B<SCFY2G#<A_T&QW:X2E!R4\/TBE84;WR9RFF6YG;J1//
XMZJU(%FA:S3D"Y=/2!M9Z2]&X at H?_V5^&,8=03='=W"R0U%\TC-4D32+(4A2.
XM:[[1,:$)$AY$EI^8IV6PU[ @M:5LC*&;X8%I"5)GP\XO2FWNEJ6J&S at _QI8(
XM"D!&:F)AXX1..MG4H<MCA5SWFXU025]*2HA6<81D:A@;4JJC8A6LUF.P.7"^
XMF5T>H=BDV<B84:H+2$=J2M?B"L0F=I:;8J6U04:76*ZI^:0&U5TGPX]8 99O
XMUU_62!WXK"+V^(/73*"(W90D_6NM6<!\W1B-8KOA\17A4;UC-"3=R\T<BV!L
XMO9C727/NFI at 8FBOX:;O:G-K0+-@!LE.K1%W4\<VPU-"\55ZJ2W\!4D?WZB:\
XME=6H7%S%>Z\QFE[&C=6SI53>?4JU@:ZCA1EK-M$8TUMYEGDII7_$JR3M 6<)
XM_5>TX3YP55L=)R#LC1&\([.^?!)\0C%BV.(E(:VXPM$8 <F<K&SQ*1<>Y:=M
XM$I0YF*\]@:Z[$])UBMLG(=_\M3N5P2(*OH=XDL>=UQS^BJFI at JH^:H>BS'1D
XM"B!ST8BR.*MUTQW%T4NQ&I++HQ<E^>=D0J9,<K -C$5%'MW9&".S2;._)^6I
XMAZS3D<,WE7B<O'^2,Q.<'5Z\(1>%33DP(:U<"CPKLJM.J:=CE!<VDU*B at B?N
XMN3N!TTN84:LMXNFE%X(+RT6Y6BFX<NI[91+<(X&@'K*G##Q:$L7E31._ <>'
XM[AG[FUD]E2VP"I+13N?M@^/G4AM6-UH4GA*GWN+MBJJ9W%AB(A>(GJV*UAZY
XMV!Y0PD#[%Q>+FI_A19)UFYM5QS<^0=)M<[.(*NGK>]#0-\%.\:)'):UOE%+)
XM=ZT=#AVBTE!&;HOF=!SZKL[_5)TA6%V at LXE36$^&/88A,DLM$H>X,DO ;E2/
XM16B.KCPDCX-?N4V&M%YQ(U(!_.LK91C3G(-;YB9VE4)TZ>A[_E;F/)46R!_)
XMO6RV'<;I9.E at Y+JL+.[;]E5M\7(8ZBG&D:>[?/1)!K :LJFV.V%0@=+I>T3J
XM),^!HUC'HFP*W#]5L:/YO=#"C$DF0K/1 at 4E16-7F>N*D_-4 [*3'@A)295&6
XM_HM-'38,4L&7#+9%K\ &SUAMC-H#-[)<P^=O_<2)1KUN5MS,U.^K5%/C ^T8
XM:A*]]/!4YMDR^[*?+ZX4(_?'TDLZ45]DM:L=OOGN>M>G;Q1A:[Q+1*L("A)\
XM#H2K1!-TO-<8ZBJPZOMZ+#LN^Z*%G.T)MVG7U_D2J[YRD>HSS"C7-'>< K:-
XMV*!K-C1*8HK;U![&QQN10\*@3BM)8L[<;F4CAN.GTR*,/UJCT5 4\E<1>DT-
XM_.5YH1F;J(7<N^X3"8'A.. "M&*;CV$FGL^E*)JYPNJ6'=> '3$A+QP\F#<K
XM<@EF$DHPP9S@*]C!)I#7BZIQTL2FR;__U2)B!6]2<N2KQ56&5I:81DN#B6L/
XMIDU)*YW Y%P9HFA>&(%N$0H:YZDH at Z*@"X>!XI"$+W<6I-X0#%""J;8$N2,$
XMY=1=H\A_3I"T_)4>^*[<#Q#4'^7-//6/85);KHEIRDU<J7_DG"Y89HA#%APU
XM7X)SA<$B"*+8DF-H at 9)E*W'!1)48= 3-*@F_ 2W9GD/Q1?A3HMIJP"'_U4'J
XM0'1"55*1#PR*M"#"V)(_2L*R:BQ)PD )MZ4 at 6^H42>-6;<+TD83VT18D'+=#
XM+OSOK\04)*$&2T66^( K[0DJP0 E.3;A*2D)]BH':K"/\ -C at JB;9BTNGLP6
XM7R=99N&MRX5;J2F4*K9DH()6#EP/!^>TJ!/%(AG6'9=!59>')'B[767A1LL1
XM:A0_T$3LJB:2J$+(^ !70LDMT#$M]SA6BEY@<BMC?XT[/17.:L.,<E6W!<!0
XMCK6 at 6(922FD/KB[9N2'[@0XQ'ZY8"SVF9<44OG,V.%E]$15\@W>8&(,E'<H;
XMK)!6+^W%"(AS55^80E[P'Y4I7L&$!R,M;A:U6W (Z3YX,0RE$AJ*'IEA[DL8
XM23#WL1'8U33A78R/0)49CW) I!K?2#3=01>JACBFY\SA<>!'I at 5XE35\$Q.V
XMG7^P,H@'I-$N_-*1"%.+8&.<*%Y at D".UN&26VN(G@(-W!:W(5.26A6\J=%<H
XMPTBF7<79\!OKZW"2[;Q9#=O5MM:8[,(B"3'^@;-LIQMV'U%*#+:KL,T$--=S
XM4EG3<5C%)&5)I9V%D.!8N0 @H0]A91.(9<4^%FJ8?GRQ9H4EF:7A^HRA EKE
XM33>D"7L5T&P;B$LS90_V=*]?MG"*29HY?#?&2<0>C6/#($5"ZE]SP_*<G08T
XMVF!)0=M0".HE at J.HEIRJ3T[T)URI)IJ4U :B2D4?#%JN2C,9!H(W>NB+<2-B
XMT) CXK*NP.08#U at Z,YBG.*BD,K=B?@Q_J&HZI+G8+EN#1$+/DZDJ$8)!T4#!
XM :J"0D18/(\QZPP(*A,7 EL PU#'81XUL,*0S4QCK5DZ,.%:% ;+84!63=Q1
XM7^2D\L2.>P.1/,2VN6A$)A82D@;2DL@)5*H<SRJ(7"/N."*( C3R-]4LQ; ;
XM2!8\MHU%-#?SL4.N%,'PLC!$2O@\H N6G#AYXV^6G#E*9CNQ28&SP//!.F2X
XM\0D/TKW=&'0#__(-NS$[YFC5:(A at 4KUB".E99YN$1:(;)QDW-,HJV6,ETN#8
XMMA3S)IH2-)J21T*;@4BIP5"267L(0$%/)41)KX!NZ%"$W#9P*$(FLP8C)B=$
XM]OF2=K(8R:/0Y4<,1NC21]K1=:T%G>-D7L:(2%5/DD_:&/*7)Q?E,.I=#<E*
XMVDFJXQD$9)RT'98R& T\.QDE6V$Z69&;,IV02>JA<+9(I30X2])LN*Z,X&[\
XMD*'$$%B241Z6*RF.-D-Y&Y"?S;%U"-+0P916 at F 2/B6SO9 +-,XP0_>!=AB"
XM:36?9#8TVID1I#+>KY<I"6/)' "0ZQ(3U3)%ODK,L$CZT)MX72O(8R5+V8$)
XM0<XK7!7?1FFLH !6N231&4(Y%H at Z;8G5UX6 Q40R"EA$-8:5+J0OXZ4#^3IX
XMXT/8,/4%G;8.'UR79R<\K: 6^1^@Q*1Y40VS^XA P?58:IP-$TD7:#8&J+.7
XM9C86[-EK(:I+=!^KE7)HT:-\$"-S7L8,EX./M)=F0D=,CRA1IEF)RCX#+11F
XMKU!+*"F;81]:T23;C'<G?Q$0^_$N?$;HNWEF991DCY[Q%U+(_0)1MT13Q3J<
XMP1MP"1N16+;R(@8OP,A QH?:.B&(<7PPFF>2-6'5U at 2;0 at A6;3-;4M_&QR^T
XM)05F?'!&6Y(V!XX.VX at 7<?*4FN*@Y/2-H E8A\SJP<V"B!7N9H"<"5WIB74[
XM;'7%#$8K.S-D\W#BBJX$-O4>#SE9_!%6D:A&H^)@5>*T)993B26LH[47:58A
XMBQD/S-+XF(LXK! -Z<05*1#1#$I4==>>&%5:<LHFC4&L8'*R% <T_!]:Q=R9
XMLX3%M^(:&F,3* '<Z*RC=U2&V*G"%7KS8ZT6?Z4::4->D"^7[VWP+].)$,Z(
XM]TDSZH%VHKT7*-6\3 !$(UNGP&D[B(D84%6DRU]K 244M3'S'4?<",,ILV5B
XMCAG>=YG.CJAP'P.2D>&)[I:_* 1U:$4):W;6AMIY_'J?DQ)QXXK'19DJ9/^Z
XM"]+A1YYC5TW"^)*O at AL&17ZU:*%0"\9DE<3>[4L//RA+^)HL%R4 TC]$$C5Q
XM,N)!/<%FML/BJ6O4 5TQO-YAGJZ%-?HB&$3/#0J*\7C<0O^(0 at 3)0+BIFD0T
XMX!?_<2^%D!.5!Q5F>GAHG7(]KQ Q9"#Q]-;"2PIMHDAH,;W(&N0982<$7)ES
XMZHR");O%.W1;8L((8X2,6)V7P"3T(".D3XG0H00(T2E90I$6:RQW+,'1.(KQ
XM173F7VDA,J*VL#NLQ#!.0E_*CZ(P<=2$2[B (L2%  E8Q[;0K^3R%0+'NGM]
XM\8G&A3M6"0:'I2O3=Y"&.)J2/O at LHUW%K&^#107U4+OR2.$@)5PC at _*OZ$2/
XMX.B"B'JB7Q_BM4'/VA(3,!DJQ#HY at 9*JQ4<X'!A<LIH1 B1.=#>,@!X9DY, 
XM+&VA86&$Y\>8:-S02E8'A&6V!:A8.5)#4.. 1X(HE+7,HT'YD8O("[0E7"5/
XM%Y8@<^5?BS7))IE)N\[DN-:BA+F JX3TK<#3$DW628C at 7 LMI\"?BU 3_ at S(
XM8JBL8Y94$X::@MX*+H2H/X. at -##/=KIP%D,]F$FB_02!P#$3#RI$]14$1<Q$
XMA .R-6H&2M,4#E*%I)%J4BU )O_+(5;.,SP<[S<]>L?S"A7IKUI0SDD1-P_*
XMK1 >/R*,/# B4BPVDU!-(VUJ:O *.O.!4 63&'7 at Q3.\AH<U*9P"1RADS^*)
XM0!N[41P41I< %FH$,*2Q,((0S,):S2.+!-K,C+8&;0;)$MDY_^,[0 RWT#,\
XMA4RH)HT$0*P(J"&!(,8MH1\3$9J\B^]D6"49_M@)9F5 at Q">(H1DTB<+ B]ZD
XMFHU5%O(;-NL&B:LA8F1IUM"*,\S37HU<^D(8[=6 at 1S, at Z_HY&N6F9>01>S0S
XMRT;ETP_/"H,H#&ND.=8&Q*"'#T1 G"K><-"& FHCKM<">_U5[+E>=.MO39&K
XM(XW]UKT$4)9KOQL*<>&K^E6<4!]_:Y["&+XDIRB8WJJ"-(-(#4M>(J$X">S%
XM$0!'<A49ER,Q* KA&E5, K# (%M%"'*%AA!? 2)7B$G.+KGR,L] QAX']B"M
XMC85><A!O:N(\Q+OC=0BVVA$N'5HY"!>R!#(Z3FV%E]0"MM[<AK5QKP/FI=*\
XMA=OD!#-AIAM6!6$0Y:.P/ WV*3QY:_Q=#8#B>P*6]KL_915L<4,]%1>D%;09
XM+&OD+^S!,H.]<*RX(JXN)62]F\Y3'/#=&PT>@$M<"B./6*EH!O/R>?]KLKD4
XMU)#Y,-T$6QNP8VOX6')Z5\;74-PR]M"\+,=9 at L)R(NW*5&X6GB@[-TMI0$].
XMQ!)<QM<TU&LE4@&,.2DQ-(9/Z$PKI1$*#<#+B?'A*7Z_6#-9;BB:M7B8I]#.
XM$N9*T:3,I"VN%>UT%06.R$)-2K<J2I-V^WF*WU#KOA\["[6^AN&$VIH8)TO@
XM]TN%YP0T'1'X%U"^F]:)2[=CLAR>[*<1Q.4!<GG]#O/8#C9[WTC3FTV1$ 9V
XMZ3K4Y/)BXJ at 5*44/J^69#N9A1E[26DU6QLX>F)&!='PH:""V-9%,*+P5JAW,
XMCE4JM^G%PV14IDC7:@C<2F^ YEHYI*]":8(;L'*W_&.Z)*UKY<M*Q41A/3F1
XM-%S;W[AF1DI.=(IIMJ3,6L;35@!$R/,U1F[2\I>2!I5,BVQB%"40('7:7P/2
XM+&CN\4W<UEHN%&L;0!<*[J(V4ZK0#*/.-%$NQ7 at P9+G$;S(8?Z)G4JW 51 O
XM%^M0M6Y%#V-N<&(75&W7, at NJ]OU$G)[QH3\ME[RZ[G" QI?<\ZOC*SA-Q.K*
XM=*^7X(LH?^Z$FJ6XQ9DX(0?QH?D2;$DE%G0341J$07Y6PTHU78#R="F9FJ /
XM$TSG99A5Q$W2&]W%K?ZA=]R'>8L:+A>FC8^9!CX^$5M8A[0:QS(=]$L.K9/O
XM264V(N^*G8UWZ,XZ'D%I= B.(+50!D<XQ8:&([(+X84WHR339,B9A;PXU-;0
XM<6>&1KBW1<-N<D:'Q3E%KK_!DKV0&G#B[(58\N=*D*UC12-"KVO!$1]/SP1-
XMX+MF^J[KXJ^I9%H>BM/5&(9O1,&SZ<:H05\."6$P;G$C30/E^E88**%/7F[^
XM."<\%\\:FJH+3WAJAG$1MPJZ^@?$=LE\*&JXB8K1O* ID6CW7H-(3&]YK9AR
XM1/]B 9^NN)J 7HG(IEW2A/&T;W\A0WN7R7&)R[5T%PJW58GFQ:?PV2/U\^;"
XM2Y4K]NOE]1<;NT#E7HX]<7JB F,U/5=YM)VOV5G0\ 1_O-HPH(H"A&#! 66N
XMH*JNE56([-R3*S9XX>V*Y.D4QL-? *!;DY^@8!8L':T)TC QO"[EH!5[U!5:
XM)EIAOY+!UV0ZQE 3!^$=J\*%CFFA%:M958<+%_YV.5%[0BU]B]UD;WKP)>.4
XMAA+9OM=6.NA'T!/9 _;)IA+V&!LN<BN._@,K@:D/0U\6#]IZ+RLT%%W1 W.G
XMOMP*I3VBRL,HJ*6'FC[#=_(P8D\A+I3RT&*&&[Y$K1 &[EW.A5(B0A/3W20@
XM8<>^2O\BA?QK?-'$N8+IOL*V01]&">\#2-XP8=3$:.F$_E)Y at E]Y:+:9XD7!
XM'-Z+8^(M/7BYK!0P^HN)D _%# MBXMH3)60>L0/Y:8Q\J9-2+O506I08=@#%
XM-8;IMCUM&EUTV]=DNH3/+;C3$N8A !+5 UOK$%HULAT749ZG &K'M;<WM6.#
XM!P[5<?'%Q>>8JB'=3Z)G]$33326UUO[R#+A;?*G=-=: ;S39:$"+AQUR[1RA
XM#[G/BT#DLOO]_ at WBTQ.%8<+"XDT6(AZ/.P-;J7BY=%!QK(H?3;]=NR2YZ,"+
XM\T7*%(S2Q3FRXSY(,1I!:G7)Y65<7HPF,U\.,7M#8O/MO.;D"-LGE-H,X4W(
XMI<'8+"A;K72S3H3R1CD2&0_>X"Y:1F^*;TZ>-;<JT,C$XCN3#\HVP;GV"2J3
XM+OO$+ZA:,OM'R$M 9D74]2;*+.H2D#YA(2>SE;RY1,S)"S$O)J-&Q))R2I#2
XMX:FA$9"&3D0I(QQ3B)19/*F.=_VX5>%N?>-PD;RC47V\N!";'K;&BQ-^?"?Q
XMF!:2(H3=;5C at S'I.[P(B/:<AGJ(3)CS,I]<"I S(9O\B= AU;%;##LJ"2^)>
XM\R(Q.R>8'Q,Y/4=S,\)JYK(+30H;9L:$5DZ50ZG"%;?]#9>0J.W<[$3!+3EQ
XMH+C#@/N<(6U;X;[;]<7<Y6BX?:_G=$.TS#!U15HQ7+2$L!&FS*_Y=HR8Q7-N
XM[.<6%G6GKJ09+/T ARD9>1 Q\SFY\1.)!_O*FE>=+>2K,P/AXMB>5P.#2E77
XM,R:NC$>S_6*>CGUWQIE4N92,:E1%;,RH=4K*Y3"NH+0[.B#J&H;H<M)RY^&@
XMR(IBANYV(<+XC-B=PP&M"<' P)XN>L*D[M(WNM5FX'.YA0,"MQ\+/"I?X2!X
XM7 at 3D!6&J,!$UP^8TKC&#N((H@*)67:YFZ3LM]8"$U\O1LYKK@ 52A..3%(=(
XM)5^]Q)9.(QG%L')I<V%8<2"/8 at LBZ5WX')$D0CQ7F;XAMBU at 00U6B3JZJ,@(
XM&"%U>M00T&<W4H)5&5B/PL?-#OZB*2Q,36&IAAJX:HUG:!) 5;!H':V.5PCJ
XM^_2B5LM6"8ON)S$DGD;]-28U8[@5HZ0.LM3  1AF19^6):)"BOV-SW(YFM*D
XM",67 XZUB at BB58N%GXZO"X^CE&I$IC58->@#416K5->ZZY#^(@>78:@>HKV2
XM2JTQ%LUK&!%Q 4=9'!M4 at KX^*G#Y1TRNH6Z582T4:L(2&7@,(S\^!??Z4>,#
XMN>[6H at .5-&"7<!S8!5[,-0XEO48%BLHOP#5#31BQ>OM1E/1ZQR"JNY;5Z\4T
XM0XQ?52<DQU?EFT 50H at DM&K/N.IZ<:\RE6F,C)3Q0P)&B! A+_2;;*(1LC.^
XMRS/!@W6ZO G9K^I5PX6OV%F\(KM25JMU5]0J]4L?\2$#W@\V1%D;U at FAESB+
XMI!%8M:IMRT:LX0W35(PTZ847-;QT9=A$\E5A'*Q)D:D at 1N$,%5!OLBV.T+&T
XMM8:0.!ZT!%6<#='1J;5TU<ZJ-X:RRN-,K1/P=*0;J<G:L/I-61&UQ06JZ#1-
XM]L&(BDY#&^!UDB#9D:K&X&D=6FC5JD-AJ$V/:S\'TZ$P4@>Q'CXK^T(<.[=*
XM7!@JZ"O38:1IUX=' 7K:A>8#JC&#\98-ZA&Q [;7\QA*2F#;B_*F9]0J"ZXM
XM1I1*2[*X<;J(&*CS)V,D)%M!YA+?*E64(GE7D2K0%&UB%R+">BTG,"5ZKHXU
XMV^JDM"N!*>G8,,(4J41(TVNJP D>!:;,M:% ]*3WC% -6.)_;J(DU%X%IN8P
XM"58E6N$$9S<[O%#6\AU* GOA%9\I7$MU7L();0=27.]RC#MP(-%#*KT+<&,=
XMKG+- H5,=M^RNW3@"]\!KQ78[!#/@'OD;8KP-E*?'W%Y4=RD5 >;.E&ZRW?Z
XM1 at CMU3M(::^0P0TR!TFO H6[[N_RN5\MQWV2TGLA at U] )!TY&.Y^?0U ZD)0
XMD*B2*Z1TI93>VWN,..^7-;RS=_" WHO$OM[78MJJ/3@%:=6<:C%$U%_M6?0"
XM*BG/.$';/?$'DSVL2 at 34'#KHB<_7PH%*AI&1&]=M"WICDM627)D41S'>U]H%
XM>18@&:OGYGX]'5PL>8BVJ"#'RXU)T*8 9:N,+>X:,^RK@#U5HJ(L\8>',[>=
XM!$ F*K$"-^44.=>MV]K__!S/XY$/[@%.*7+-(,\IDHF[K@=*<5_SA.]8K[_H
XM at -_7GX<Y1GEU 2KS]:4L\/2]-3)XT!-"4>6\C.\[%5KFZR"LY>/[-U <&:[#
XMI?=I27U;Y3-_[R="*6PXS]-&\-M<*^'_2IAT>/)H+VI%7^>XMR+O3$>>Z5/=
XMVM"\E;R]%K9)DZ77$X7VWNN**V0A:MK9-=?"UL"3?,=0&1C)BZ*Q+L^(V7*]
XM3NX*LJ:Y:B14D"J)2IE?9:KKJ+EZ>TA44:R_;]6A_:_N5HK [PC]XX#6Y5KA
XM]PLGRW!A ;P8!O9.OU+:I&6:^UHWB%=R93J\RWZS4X]R7T=#4T:QBZ6A6+6Q
XM8$&%^5W )4\16%A$E[?I-I-(^7&(89U,&I+P4H[=-4TK->9:X,%ZZY!FZ#^Q
XM:<<PXJ5>$T%I:(8N33O9XQ).TH[U [G*^(A4CB4U##KE\+^. D_75'C0-5S$
XM:9JLY *K] VM;"1&<>83K;'X3RDX7(&;Q->B1T21"DF"W at K<(,7UD0$XAOC#
XM6!;WE5+$5_<T%!!B?[7E>=V+ZS.29,O==4T([+1BF+'RGV):QK?P2 PHG8US
XM%,>E4T6.2V067VG;-+P3U9\(CC;=%I_'V25(A,-H=,U$7!D9,G 0'-4&H/Q1
XMZB)0P'+O%!W9OF-H.ZQI/&-D2\AUR?-MLC at 7*>[ W<J5.W_T<8J.AV0Z?RVN
XMA9TW <#"#I$L1EK'0I8=@\P?59)R'R-'YVW6&N;S3DA9"91H6KFJ?!X+#,ZJ
XM39T#9UPV?DQ+WRS1)-G 6N\2#D. (07B*T=$TR[O=K+;^+C0=<SV;NBJ-KTV
XM="$D.C0MDXQ\E)0/[E0=]U6VS-P>M(SO4^[!\<H@&N$#"1$-7<4(B<(2BJ<S
XMFI$RBSQH),!''@1C)\G[(!X1^%"CR2='*N-!)(O1HC(RVQP<<%9W[&VMT5#-
XMN=:X]W2<D?$[NFG/0Q)!/?<",T^&%QT:D8T'+K&<!L*^W(D]4BG3LL5 G&EC
XMNHB,%%MP; HUR*YN+AI)V?2JDR/^B;#(IZ?F R2G1$#3DLSOGLSHSL7?O-*%
XMZDY)D)EJ.8P4V&$X6J?1!W7A+,.PFLR,$#I[I(L^'6^FYT?,"G+-5L0JK(JM
XM4XDP*:5?Q3C(BGP%GW(: V9MQER'@5N=QI%W$IJ[ "M6O,_+H,'THAI=U at S2
XML+IDTTLRZRF%D+(#<\6R?,S\KDFCYV5,N+27DE: S)W\.(* O>78;O:REV.%
XM )YF7".W8G*M+Q#=O(0FID!9L]]*R6)N8;EN#AHI<:32#YZQS>KZY*0SM at ZQ
XMK\4K#)GP%B#T*NFS>+IUOVR$)CG0*(F2E3!C4U241LTWWL+XVGW%BG"JL4!Y
XMEV3/G(H=D7HBHBK at K\SXT>QIS_!I]DN$.AUZ+X5)D_W#L&69T5:F*7EF91.^
XMX$H\8\M>0HM>3#+9>)OJ7[C,D1[Z]OSEYDXSX2T\^5Z9USW:P.A/+Q9#(8IH
XMX,NMF?-W4PHZ6SR4$ ']+Y+KUU9UF32SC ]+E!7&ED:0:G2$Z,=>0K+":<,<
XMO;JSETN5W<V=)+3/SLZB^9C /F9<;=4((5D/_;*>0Z at R$OK+QIKNO7B:><V>
XM;GSJ?*:9>+4AQ*5#VFIC7+> 5IMVDOAQFV=<HTM_+<$G;E%LKU4%<$-JF09>
XMN$E?Z7 at CM2V&%K2:UU)U&!%%;X6>6FW8M;B8]M[_+G^#]5#S!G;'%>JFT]1_
XM>AVN:D;!54K5-(D<E*%5U.N9]2B at GJDFU@-+>I/N_Q#+D[C_KG7+^VM :Y<S
XMJY'*S0S83G77.,.AQTOMW]OHOIH%0E+J*.[#6Z2+B\U9$#/ $PJJ698J$^<*
XM:?-__O+.KKTUA[>.U<T+O,Y(>TWNSCF+>QP8[\-W_V\]KYLK:V[EEGSY7HZ4
XMO!@(IIB5X0?073&_T7)Q at 46'Q)@-!P3JLE44@(#;QR   F[FVI[4K6T@^]\N
XMMG=9%2&"XB89M%<<'$.E_>U_/)_I %D]" F at M1*7)7(E$<1 at DS5R-020A +*
XM#N?&C& +059D at 9*0:7Q5Y0[@-DI "WL);G(\9#T38,QFB$R 'T.GDP "0N0/
XM*#<RD#\#X'(UH+0MNY75PJ0-;(*<_N<S7&^L&0^8OL%7S81%-[@,;.)26((#
XMPB^^Q/' ^\%OYT+.\5ZI("<@_!8VG&GP&VG04LEP\-7IM5[=?QF at 9U&VJ(!*
XMS.K at 8*F ODSA\%>-9?W?[6 N"%B51]1@ )YL;X;^YE:)>?K;".B:H2YFX%W3
XMP'$LZX+BA at 0F']P5(UB;\0>)X :HR8V!3># YL7]@8^!@-59<8+_5?Z0"7)7
XM8A69 0L&#'@!+&@&\E$0 10 D+0,X=*!!K4\>H?' *<XN%^/"%2T)SAB:]N>
XM(.L%% I"FA(,-D(&A']0(NP>'<+'TZ9,2TB,RM<A"&)'VB3Q1?0Y9X)[XS_ 
XM9: 8XZ0B)"=>W>P%]\!"FE<O%A-Q&]_@],8XM#,QGWYWV3AF_ITKEOA9>=62
XM[*;?E0?6"Z=D?<@G]0.[8RE=?.9/TO-%S$\PGMB'$)A)_$+E,"(U2"V2]V-S
XM2$@LF)<W+5E at 7IZ 9-S-(N!,A1*ED!/^!)#Q(#D+1(9\$C>Q'KO@,(:7/1F5
XM58!@YW1>S '_HGD=4?E=]0%$35/5QV& 4JB#+,+"4WWP),I=U91#P66PB2<%
XME!%"HMW/D.2T99)(: %OD'HECWVBH&AJ_0EXD-X9!G-)-SC5P4(GH6HAE6P/
XMF4$2IVLX-_Y at 5;$%X7SJG8_0X(F#Z=:# Q<2=I(!VP<RU8522!?5##EB[^!_
XMX(@1>4T/=2(@92C0B;\QZWPI($<>)+X].-W2!,=Q5$R0R(.C'?06Z$;XE(@<
XM>,Q!6?!MN @OB$A5 V:&ME[O$HA0+KW+5[#2V2>RQ$D012TC=$IQ]2,4*W,?
X,>$$00 81P4.@ "@ 
X 
Xend
SHAR_EOF
chmod 0666 shuttle.uuencoded || echo "restore of shuttle.uuencoded fails"
set `wc -c shuttle.uuencoded`;Sum=$1
if test "$Sum" != "17714"
then echo original size 17714, current size $Sum;fi
fi
if test -f xhpgl.1; then echo "File xhpgl.1 exists"; else
echo "x - extracting xhpgl.1 (Text)"
sed 's/^X//' << 'SHAR_EOF' > xhpgl.1 &&
X.TH XHPGL 1 "Dec 1990" "Version 2.0"
X.SH NAME
Xxhpgl \- HPGL version 7470a Xwindow display program
X.SH SYNOPSIS
X.B xhpgl
X-cf [color_file] -fn [font] -geom [window geometry] file 
X.SH DESCRIPTION
X.I xhpgl
Xis an Xwindow display program that will read a file in HPGL syntax and
Xdisplay it on a X server DISPLAY.  
X.I xhpgl
Xis compatible with X11.  The HPGL Syntax is restricted to that
Xdescribed in the 7470A manual.  Most of the commands are supported,
Xbut some are not (see supported commands).
X
X.I Xhpgl 
Xalso has some added features.
X.I Xhpgl
Xsupports up to 8 different pens where the 7470A routine only supports 2.
XThe color/pen assignments are user definable.  All pen colors are read from
Xa file called $HOME/.hpcolors.  The colors supported are: black, red, green,
Xblue, yellow, cyan, magenta, gold, maroon, turquoise, violet, orange and white.
XThe .hpcolors file is of the form "pen# color".  Only pens 1 to 8 are used.
Xan error will occur if a pen number larger than 8 is given.  If no color
Xfile is found the program will display a message and use internal values.
XThe -cf color_file option may be used to over-ride the default color file
Xon a case by case bases.
X
XThe text used in
X.I xhpgl
Xis of fixed size.  That means that there is no scaling or slanting of text
Xallowed.  To help make text more usable 
X.I xhpgl
Xwill select a font based on the window size.  Also, the -fn
Xoption may be used to specify any user font instead of the default selection.
X
X.I Xhpgl
Xhas simple commands built into it for controlling the display window.  'z' allows
Xthe user to zoom into a portion of the xhpgl display.  'u'
Xunzooms, effectivly quadrupling the area shown.  'o' returns to the
Xoriginal display, 'r' redraws the screen, and 'q' quits the program.
XAll other keys and mouse activity are ignored.
X.SH OPTIONS
X.I xhpgl 
Xwill take any font supplied by the user.  The -fn parameter is used for this
Xpurpose.
X.I xhpgl
Xwill take only one file in HPGL syntax at a time and display it.
XThe -cf color_file option is used to instruct
X.I xhpgl
Xto use a different color file other than $HOME/.hpcolors.
X
X.SH SUPPORTED COMMANDS
X.I xhpgl 
Xwill recognize and execute the following HPGL commands:
XLT, LB, PA, PR, PU, PD, IN, DF, SP, and SC.  
XAll others are read and accepted however no action will be taken.
X
X.SH AUTHOR
XOriginal xhpgl program: Randy L. Yach 
X.br
XPort to X11: Andrew Gerber (gerber at solbourne.com)
X.br
XParser: Dieter Muller (dworkin at solbourne.com)
SHAR_EOF
chmod 0644 xhpgl.1 || echo "restore of xhpgl.1 fails"
set `wc -c xhpgl.1`;Sum=$1
if test "$Sum" != "2448"
then echo original size 2448, current size $Sum;fi
fi
exit 0

--
dan
----------------------------------------------------
O'Reilly && Associates   argv at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.



More information about the Comp.sources.x mailing list